@magic-xpa/engine 4.801.0-dev481.239 → 4.801.0-dev481.243

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.
@@ -1,8 +1,7 @@
1
1
  import { __awaiter } from "tslib";
2
2
  import { Constants, ForceExit, InternalInterface, Logger, Logger_LogLevels, MgControlType, Misc, MsgInterface, Priority, RaiseAt, StorageAttribute, StrUtil, SubformType } from '@magic-xpa/utils';
3
- import { ApplicationException, Int32, List, NString, RefParam, Stack, StringBuilder, Thread } from '@magic-xpa/mscorelib';
3
+ import { ApplicationException, Int32, List, NString, RefParam, Stack, StringBuilder, Thread, isNullOrUndefined } from '@magic-xpa/mscorelib';
4
4
  import { Commands, CommandType, DataModificationTypes, ExpVal, FocusManager, GuiConstants, GuiEnvironment, KeyboardItem, Manager, Modifiers, PropInterface, RuntimeContextBase, Styles, TaskDefinitionId } from '@magic-xpa/gui';
5
- import { isNullOrUndefined } from 'util';
6
5
  import { EventSubType } from '../enums';
7
6
  import { RollbackEventCommand_RollbackType } from '../commands/ClientToServer/RollbackEventCommand';
8
7
  import { MgControl } from '../gui/MgControl';
@@ -3104,4 +3103,4 @@ EventsManager.clientInactivityTimerON = false;
3104
3103
  EventsManager.clientContextInactivityTimerAborted = false;
3105
3104
  EventsManager.Instance = new EventsManager();
3106
3105
  EventsManager.clientBusyTimeStart = 0;
3107
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRzTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VuZ2luZS9zcmMvZXZlbnQvRXZlbnRzTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLElBQUksRUFDSixZQUFZLEVBQ1osUUFBUSxFQUNSLE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLFdBQVcsRUFDWixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN4SCxPQUFPLEVBQ0wsUUFBUSxFQUNSLFdBQVcsRUFDWCxxQkFBcUIsRUFDckIsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEVBQ1osY0FBYyxFQUVkLFlBQVksRUFFWixPQUFPLEVBR1AsU0FBUyxFQUNULGFBQWEsRUFDYixrQkFBa0IsRUFDbEIsTUFBTSxFQUNOLGdCQUFnQixFQUNqQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ3RDLE9BQU8sRUFBQyxpQ0FBaUMsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBQ2xHLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUd4RSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHNUMsT0FBTyxFQUFDLGdC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Qyw4QkFBOEIsQ0FBQztZQUN6RSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxLQUFLLGtCQUFrQixDQUFDLFdBQVc7WUFDMUUsT0FBTyxLQUFLLENBQUM7UUFFZixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7O0FBam5KYyxvQ0FBc0IsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1Qix1QkFBUyxHQUFZLElBQUksQ0FBQztBQUMxQixzQkFBUSxHQUFXLElBQUksQ0FBQztBQUN4QiwyQ0FBNkIsR0FBRyxJQUFJLENBQUM7QUFvQnJDLHFDQUF1QixHQUFHLEtBQUssQ0FBQztBQUNoQyxpREFBbUMsR0FBRyxLQUFLLENBQUM7QUFtQnBELHNCQUFRLEdBQWtCLElBQUksYUFBYSxFQUFFLENBQUM7QUFROUMsaUNBQW1CLEdBQUcsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb25zdGFudHMsXHJcbiAgRm9yY2VFeGl0LFxyXG4gIEludGVybmFsSW50ZXJmYWNlLFxyXG4gIExvZ2dlcixcclxuICBMb2dnZXJfTG9nTGV2ZWxzLFxyXG4gIE1nQ29udHJvbFR5cGUsXHJcbiAgTWlzYyxcclxuICBNc2dJbnRlcmZhY2UsXHJcbiAgUHJpb3JpdHksXHJcbiAgUmFpc2VBdCxcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFN0clV0aWwsXHJcbiAgU3ViZm9ybVR5cGVcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgSW50MzIsIExpc3QsIE5TdHJpbmcsIFJlZlBhcmFtLCBTdGFjaywgU3RyaW5nQnVpbGRlciwgVGhyZWFkfSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7XHJcbiAgQ29tbWFuZHMsXHJcbiAgQ29tbWFuZFR5cGUsXHJcbiAgRGF0YU1vZGlmaWNhdGlvblR5cGVzLFxyXG4gIEV4cFZhbCxcclxuICBGb2N1c01hbmFnZXIsXHJcbiAgR3VpQ29uc3RhbnRzLFxyXG4gIEd1aUVudmlyb25tZW50LFxyXG4gIElUYXNrLFxyXG4gIEtleWJvYXJkSXRlbSxcclxuICBMYXN0Rm9jdXNlZFZhbCxcclxuICBNYW5hZ2VyLFxyXG4gIE1nQ29udHJvbEJhc2UsXHJcbiAgTWdGb3JtQmFzZSxcclxuICBNb2RpZmllcnMsXHJcbiAgUHJvcEludGVyZmFjZSxcclxuICBSdW50aW1lQ29udGV4dEJhc2UsXHJcbiAgU3R5bGVzLFxyXG4gIFRhc2tEZWZpbml0aW9uSWRcclxufSBmcm9tICdAbWFnaWMteHBhL2d1aSc7XHJcbmltcG9ydCB7aXNOdWxsT3JVbmRlZmluZWR9IGZyb20gJ3V0aWwnO1xyXG5pbXBvcnQge0V2ZW50U3ViVHlwZX0gZnJvbSAnLi4vZW51bXMnO1xyXG5pbXBvcnQge1JvbGxiYWNrRXZlbnRDb21tYW5kX1JvbGxiYWNrVHlwZX0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvUm9sbGJhY2tFdmVudENvbW1hbmQnO1xyXG5pbXBvcnQge01nQ29udHJvbH0gZnJvbSAnLi4vZ3VpL01nQ29udHJvbCc7XHJcbmltcG9ydCB7TWdQcmlvcml0eUJsb2NraW5nUXVldWV9IGZyb20gJy4uL3V0aWwvTWdQcmlvcml0eUJsb2NraW5nUXVldWUnO1xyXG5pbXBvcnQge0NvbXBNYWluUHJnVGFibGV9IGZyb20gJy4uL3J0L0NvbXBNYWluUHJnVGFibGUnO1xyXG5pbXBvcnQge0ZpZWxkfSBmcm9tICcuLi9kYXRhL0ZpZWxkJztcclxuaW1wb3J0IHtSdW5UaW1lRXZlbnR9IGZyb20gJy4vUnVuVGltZUV2ZW50JztcclxuaW1wb3J0IHtNZ0Zvcm19IGZyb20gJy4uL2d1aS9NZ0Zvcm0nO1xyXG5pbXBvcnQge0V2ZW50SGFuZGxlciwgUmV0VmFsc30gZnJvbSAnLi9FdmVudEhhbmRsZXInO1xyXG5pbXBvcnQge0Zsb3dNb25pdG9yUXVldWV9IGZyb20gJy4uL3V0aWwvRmxvd01vbml0b3JRdWV1ZSc7XHJcbmltcG9ydCB7R1VJTWFuYWdlcn0gZnJvbSAnLi4vR1VJTWFuYWdlcic7XHJcbmltcG9ydCB7VGFza30gZnJvbSAnLi4vdGFza3MvVGFzayc7XHJcbmltcG9ydCB7VGFza19TdWJmb3JtRXhlY01vZGVFbnVtLCBUYXNrQmFzZX0gZnJvbSAnLi4vdGFza3MvVGFza0Jhc2UnO1xyXG5pbXBvcnQge0FyZ3VtZW50c0xpc3R9IGZyb20gJy4uL3J0L0FyZ3VtZW50c0xpc3QnO1xyXG5pbXBvcnQge01HRGF0YX0gZnJvbSAnLi4vdGFza3MvTUdEYXRhJztcclxuaW1wb3J0IHtIYW5kbGVyc1RhYmxlfSBmcm9tICcuLi9ydC9IYW5kbGVyc1RhYmxlJztcclxuaW1wb3J0IHtNR0RhdGFDb2xsZWN0aW9ufSBmcm9tICcuLi90YXNrcy9NR0RhdGFDb2xsZWN0aW9uJztcclxuaW1wb3J0IHtSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9ufSBmcm9tICcuLi9kYXRhL1JlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24nO1xyXG5pbXBvcnQge0NvbW1hbmRzUHJvY2Vzc29yQmFzZSwgQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbn0gZnJvbSAnLi4vQ29tbWFuZHNQcm9jZXNzb3JCYXNlJztcclxuaW1wb3J0IHtDb21tYW5kc1RhYmxlfSBmcm9tICcuLi9Db21tYW5kc1RhYmxlJztcclxuaW1wb3J0IHtDb21tYW5kRmFjdG9yeX0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvQ29tbWFuZEZhY3RvcnknO1xyXG5pbXBvcnQge0lDbGllbnRDb21tYW5kfSBmcm9tICcuLi9jb21tYW5kcy9JQ2xpZW50Q29tbWFuZCc7XHJcbmltcG9ydCB7Q29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyfSBmcm9tICcuLi9Db21tYW5kc1Byb2Nlc3Nvck1hbmFnZXInO1xyXG5pbXBvcnQge09wZXJhdGlvbn0gZnJvbSAnLi4vcnQvT3BlcmF0aW9uJztcclxuaW1wb3J0IHtDbGllbnRSZWZyZXNoQ29tbWFuZH0gZnJvbSAnLi4vY29tbWFuZHMvU2VydmVyVG9DbGllbnQvQ2xpZW50UmVmcmVzaENvbW1hbmQnO1xyXG5pbXBvcnQge1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yfSBmcm9tICcuLi9yZW1vdGUvUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3InO1xyXG5pbXBvcnQge0V4ZWN1dGlvblN0YWNrfSBmcm9tICcuLi9ydC9FeGVjdXRpb25TdGFjayc7XHJcbmltcG9ydCB7RXhlY3V0aW9uU3RhY2tFbnRyeX0gZnJvbSAnLi4vcnQvRXhlY3V0aW9uU3RhY2tFbnRyeSc7XHJcbmltcG9ydCB7UmV0dXJuUmVzdWx0fSBmcm9tICcuLi91dGlsL1JldHVyblJlc3VsdCc7XHJcbmltcG9ydCB7RXZlbnRIYW5kbGVyUG9zaXRpb259IGZyb20gJy4vRXZlbnRIYW5kbGVyUG9zaXRpb24nO1xyXG5pbXBvcnQge0RhdGFWaWV3fSBmcm9tICcuLi9kYXRhL0RhdGFWaWV3JztcclxuaW1wb3J0IHtFdmVudH0gZnJvbSAnLi9FdmVudCc7XHJcbmltcG9ydCB7UmVjb3JkfSBmcm9tICcuLi9kYXRhL1JlY29yZCc7XHJcbmltcG9ydCB7Q29uc3RJbnRlcmZhY2V9IGZyb20gJy4uL0NvbnN0SW50ZXJmYWNlJztcclxuaW1wb3J0IHtGbG93TW9uaXRvckludGVyZmFjZX0gZnJvbSAnLi4vRmxvd01vbml0b3JJbnRlcmZhY2UnO1xyXG5pbXBvcnQge0RhdGFWaWV3Q29tbWFuZFR5cGV9IGZyb20gJy4uL2NvbW1hbmRzL0NsaWVudFRvU2VydmVyL0RhdGF2aWV3Q29tbWFuZCc7XHJcbmltcG9ydCB7U2VydmVyRXJyb3J9IGZyb20gJy4uL3JlbW90ZS9TZXJ2ZXJFcnJvcic7XHJcbmltcG9ydCB7RW52aXJvbm1lbnR9IGZyb20gJy4uL2Vudi9FbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7TGFzdEZvY3VzZWRNYW5hZ2VyfSBmcm9tICcuLi9ydC9MYXN0Rm9jdXNlZE1hbmFnZXInO1xyXG5pbXBvcnQge0V2ZW50c0FsbG93ZWRUeXBlLCBJRXZlbnRzTWFuYWdlcn0gZnJvbSAnLi9JRXZlbnRzTWFuYWdlcic7XHJcbmltcG9ydCB7TGFuZ3VhZ2VEYXRhfSBmcm9tICcuLi9lbnYvTGFuZ3VhZ2VEYXRhJztcclxuaW1wb3J0IHtTdWJqZWN0fSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge0NsaWVudE1hbmFnZXJ9IGZyb20gXCIuLi9DbGllbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCB7Q29udGV4dFRlcm1pbmF0aW9uRXZlbnRDb21tYW5kfSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Db250ZXh0VGVybWluYXRpb25FdmVudENvbW1hbmQnO1xyXG5cclxuXHJcbmVudW0gRXZlbnRTY29wZSB7XHJcbiAgTk9ORSA9ICcgJyxcclxuICBUUkFOUyA9ICdUJ1xyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIHRoaXMgY2xhc3MgbWFuYWdlIHRoZSBldmVudHMsIHB1dCB0aGVtIGluIGEgcXVldWUgYW5kIGhhbmRsZSB0aGVtXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBFdmVudHNNYW5hZ2VyIGltcGxlbWVudHMgSUV2ZW50c01hbmFnZXIge1xyXG4gIC8vIExPQ0FMIENPTlNUQU5UU1xyXG4gIHByaXZhdGUgc3RhdGljIFRpbWVyX1RpbWVvdXRfSW5maW5pdGUgPSAtMTtcclxuICBwcml2YXRlIHN0YXRpYyBSRUFMX09OTFk6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByaXZhdGUgc3RhdGljIE1BWF9PUEVSOiBudW1iZXIgPSA5OTk5O1xyXG4gIHByaXZhdGUgc3RhdGljIHVzZXJHcmFudGVkRm9yQ29udGV4dEFjdGl2aXR5ID0gdHJ1ZTtcclxuICBwcml2YXRlIF9ldmVudHNRdWV1ZTogTWdQcmlvcml0eUJsb2NraW5nUXVldWUgPSBudWxsOyAvLyB0aGUgcXVldWUgb2YgZXZlbnRzIHRvIGV4ZWN1dGVcclxuICBwcml2YXRlIF9leGVjU3RhY2s6IFN0YWNrPEV4ZWN1dGlvblN0YWNrPiA9IG51bGw7IC8vIEV4ZWN1dGlvbiBzdGFjayBvZiByYWlzZSBldmVudCBvcGVyYXRpb24gb3IgY2FsbHMgdG8gdXNlclxyXG4gIHByaXZhdGUgX3J0RXZlbnRzOiBTdGFjazxSdW5UaW1lRXZlbnQ+ID0gbnVsbDsgLy8gQSBzdGFjayBvZiBpbi1wcm9jZXNzIHJ1bi10aW1lIGV2ZW50cyAodGhlIGxhc3Qgb25lIGlzIGF0IHRoZSB0b3ApLlxyXG4gIHByaXZhdGUgX3NlcnZlckV4ZWNTdGFjazogU3RhY2s8RXhlY3V0aW9uU3RhY2s+ID0gbnVsbDsgLy8gRXhlY3V0aW9uIHN0YWNrIG9mIEV4ZWN1dGlvbiBzdGFja3Mgb2Ygb3BlcmF0aW9ucyB0aGF0XHJcbiAgcHJpdmF0ZSBfYWxsb3dFdmVudHM6IEV2ZW50c0FsbG93ZWRUeXBlID0gRXZlbnRzQWxsb3dlZFR5cGUuQUxMO1xyXG4gIHByaXZhdGUgX2NvbXBNYWluUHJnVGFiOiBDb21wTWFpblByZ1RhYmxlID0gbnVsbDsgLy8gdGhlIG9yZGVyIG9mIGhhbmRsaW5nIG1haW4gcHJvZ3JhbXMgb2YgY29tcG9uZW50c1xyXG4gIHByaXZhdGUgX2N1cnJDdHJsOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gIHByaXZhdGUgX2N1cnJGaWVsZDogRmllbGQgPSBudWxsOyAvLyBmb3IgZXZlcnkgZXZlbnQgZXhlY3V0ZWQgdGhpcyB2YXJpYWJsZSB3aWxsIGNvbnRhaW4gdGhlIGZpZWxkIGF0dGFjaGVkIHRvIHRoZSBjb250cm9sIG9uIHdoaWNoIHRoZSBldmVudCB3YXMgZmlyZWRcclxuICBwcml2YXRlIF9jdXJyS2JkSXRlbTogS2V5Ym9hcmRJdGVtID0gbnVsbDtcclxuICBwcml2YXRlIF9lbmRPZldvcms6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9ldmVudFNjb3BlOiBFdmVudFNjb3BlID0gRXZlbnRTY29wZS5OT05FOyAvLyBpbnN0cnVjdHMgaG93IHRvIHByb2Nlc3MgZXZlbnRzIHdoaWNoIGFyZSBwcm9wYWdhdGVkIHRvIHNsYXZlIHRhc2tzIGR1cmluZyBleGVjdXRpb24uXHJcbiAgcHJpdmF0ZSBfZm9yY2VFeGl0OiBGb3JjZUV4aXQgPSBGb3JjZUV4aXQuTm9uZTtcclxuICBwcml2YXRlIF9mb3JjZUV4aXRUYXNrOiBUYXNrID0gbnVsbDtcclxuICBwcml2YXRlIF9pZ25vcmVVbmtub3duQWJvcnQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gVFJVRSB3aGVuICdhYm9ydCcgY29tbWFuZHMgb24gdW5rbm93biB0YXNrcyBtYXkgYXJyaXZlXHJcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gdXNlZCB0byBkZXRlY3QgcmUtaW5pdGlhbGl6YXRpb25cclxuICBwcml2YXRlIF9pc0hhbmRsaW5nRm9yY2VFeGl0OiBib29sZWFuID0gZmFsc2U7IC8vIGluZGljYXRlIHdlIGFyZSBjdXJyZW50bHkgaGFuZGxpbmcgYSBmb3JjZUV4aXQgcmVsYXRlZCBoYW5kbGVyXHJcbiAgcHJpdmF0ZSBfaXNOb25SZXZlcnNpYmxlRXhpdDogYm9vbGVhbiA9IGZhbHNlOyAvLyBpcyB0aGUgY29tbWFuZCBub25yZXZlcnNpYmxlXHJcbiAgcHJpdmF0ZSBfaXNJblJlY29yZEZsdXNoRXZlbnQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gdHJ1ZSBpZiBjdXJyZW50IGFjdCBpcyBNR19BQ1RfUlRfUkVGUkVTSF9SRUNPUkRcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgY2xpZW50SW5hY3Rpdml0eVRpbWVyT04gPSBmYWxzZTtcclxuICBwcml2YXRlIHN0YXRpYyBjbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyQWJvcnRlZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbGFzdFNhdmVkUm91dGVFdmVudDogUnVuVGltZUV2ZW50ID0gbnVsbDtcclxuICAvLyB3YXMgc2VudCBmcm9tIHRoZSBzZXJ2ZXIuIHdlIG5lZWQgYSBzdGFjayBvZiBleGVjc3RhY2tzXHJcbiAgLy8gaGVyZSBiZWNhdXNlIHdlIG1pZ2h0IGNhbGwgYSBuZXcgcHJvZ3JhbSBiZWZvcmUgd2UgaGFuZGxlZFxyXG4gIC8vIHRoZSBwcmV2aW91cyBzZXJ2ZXIgZXhlYyBzdGFja1xyXG4gIHByaXZhdGUgX3N0b3BFeGVjdXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9wcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2s6IGJvb2xlYW4gPSBmYWxzZTsgLy8gaW5kaWNhdGlvbiB3aGV0aGVyIHdlIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZyBldmVudHMgZnJvbSB0aGVcclxuICBwcml2YXRlIF9zdG9wRXhlY3V0aW9uQ3RybDogTWdDb250cm9sID0gbnVsbDsgLy8gaG9sZHMgdGhlIGN0cmwgb24gd2hpY2ggd2UgZ2V0IHRoZSBmaXJzdCBzdG9wIGV4ZWN1dGlvblxyXG4gIHByaXZhdGUgX2lzU29ydGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX25leHRQYXJrZWRDdHJsOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gIHB1YmxpYyAgZ3VpUGVuZGluZ0V2ZW50OmFueSAgPSBudWxsO1xyXG4gIC8vIEtFWUJPQVJEIEVWRU5UUyBDT05TVEFOVFNcclxuICByZWFkb25seSBLQklfRE9XTjogS2V5Ym9hcmRJdGVtID0gbnVsbDtcclxuICByZWFkb25seSBLQklfVVA6IEtleWJvYXJkSXRlbSA9IG51bGw7XHJcblxyXG4gIC8vIENPTlRFWFQgVEVSTUlOQVRJT04gV0FSTklORyBDT05TVEFOVFNcclxuICByZWFkb25seSBjb25maXJtYXRpb25EaWFsb2dNc2c6IHN0cmluZyA9IFwiVGhlIHNlcnZlciBjb250ZXh0IHNlcnZpbmcgdGhpcyBhcHBsaWNhdGlvbiBpcyBhYm91dCB0byB0aW1lIG91dC4gRG8geW91IHdhbnQgdG8gY29udGludWUgeW91ciB3b3JrP1wiO1xyXG4gIHJlYWRvbmx5IGNvbmZpcm1hdGlvbkRpYWxvZ1RpdGxlOiBzdHJpbmcgPSBcIlNlc3Npb24gaXMgYWJvdXQgdG8gYmUgdGVybWluYXRlZCFcIjtcclxuXHJcbiAgc3RhdGljIEluc3RhbmNlOiBFdmVudHNNYW5hZ2VyID0gbmV3IEV2ZW50c01hbmFnZXIoKTtcclxuXHJcbiAgcHJpdmF0ZSBfbGFzdEZhaWxlZEZvY3VzZWRDb250cm9sOiBNZ0NvbnRyb2xCYXNlID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBpc1NwaW5uZXJTaG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBTcGlubmVyU3RvcHBlZDogU3ViamVjdDxudW1iZXI+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgc3RhdGljIGNsaWVudEJ1c3lUaW1lU3RhcnQgPSAwO1xyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwcml2YXRlIENUT1IgdG8gcHJldmVudCBpbnN0YW50aWF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5fcnRFdmVudHMgPSBuZXcgU3RhY2soKTtcclxuXHJcbiAgICB0aGlzLl9ldmVudHNRdWV1ZSA9IG5ldyBNZ1ByaW9yaXR5QmxvY2tpbmdRdWV1ZSgpO1xyXG5cclxuICAgIHRoaXMuX2V4ZWNTdGFjayA9IG5ldyBTdGFjaygpO1xyXG4gICAgdGhpcy5fZXhlY1N0YWNrLnB1c2gobmV3IEV4ZWN1dGlvblN0YWNrKCkpO1xyXG5cclxuICAgIHRoaXMuX3NlcnZlckV4ZWNTdGFjayA9IG5ldyBTdGFjaygpO1xyXG4gICAgdGhpcy5fc2VydmVyRXhlY1N0YWNrLnB1c2gobnVsbCk7XHJcblxyXG4gICAgdGhpcy5fbmV4dFBhcmtlZEN0cmwgPSBudWxsO1xyXG5cclxuICAgIHRoaXMuS0JJX0RPV04gPSBuZXcgS2V5Ym9hcmRJdGVtKEd1aUNvbnN0YW50cy5LRVlfRE9XTiwgTW9kaWZpZXJzLk1PRElGSUVSX05PTkUpO1xyXG4gICAgdGhpcy5LQklfVVAgPSBuZXcgS2V5Ym9hcmRJdGVtKEd1aUNvbnN0YW50cy5LRVlfVVAsIE1vZGlmaWVycy5NT0RJRklFUl9OT05FKTtcclxuXHJcbiAgfVxyXG5cclxuICBnZXRQZW5kaW5nR3VpRXZlbnQoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLmd1aVBlbmRpbmdFdmVudDtcclxuICB9XHJcblxyXG4gIHNldFBlbmRpbmdHdWlFdmVudChndWlFdmVudCA6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5ndWlQZW5kaW5nRXZlbnQgPSBndWlFdmVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgYW4gZXZlbnQgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXJ0RXZ0XCI+dGhlIGV2ZW50IHRvIGJlIGFkZGVkIDwvcGFyYW0+XHJcbiAgYWRkVG9UYWlsKHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIGlmIGN1cnJlbnQgZXZlbnQgaXMgbm90IGlkbGUgdGltZSBldmVudCBjaGVjayBpZiB0aGVyZSBpcyBjbGllbnRJbmFjdGl2aXR5VGltZXIgcnVubmluZz9cclxuICAgIC8vIGlmIHNvICwgc3RvcCB0aGlzIGNsaWVudCBDb250ZXh0IGluYWN0aXZpdHkgdGltZXJcclxuICAgIGlmICghcnRFdnQuaXNJZGxlVGltZXIoKSlcclxuICAgIHtcclxuICAgICAgaWYgKEV2ZW50c01hbmFnZXIuY2xpZW50SW5hY3Rpdml0eVRpbWVyT04pIHtcclxuICAgICAgICAgIEV2ZW50c01hbmFnZXIuY2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lckFib3J0ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuXHJcbiAgICAgICAgLy8gaWYgY2xpZW50IGlzIGlkbGUgYWZ0ZXIgcmVjcmVhdGluZyBjb250ZXh0ICwgdGhlbiBhZGQgbGFzdCBzYXZlZCByb3V0ZSBldmVudFxyXG4gICAgICBpZiAodGhpcy5nZXRMYXN0U2F2ZWRSb3V0ZUV2ZW50KCkhPSBudWxsKVxyXG4gICAgICB7XHJcbiAgICAgICAgdGhpcy5hZGRUb1RhaWwodGhpcy5nZXRMYXN0U2F2ZWRSb3V0ZUV2ZW50KCkpO1xyXG4gICAgICAgIHRoaXMuc2V0TGFzdFNhdmVkUm91dGVFdmVudChudWxsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2V2ZW50c1F1ZXVlLnB1dChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkIGFuIGtleWJvYXJkIGV2ZW50IHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nRm9ybVwiPmZvcm0gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nQ29udHJvbFwiPmNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1vZGlmaWVyXCI+bW9kaWZpZXIgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0YXJ0XCI+c3RhcnQgb2Ygc2VsZWN0ZWQgdGV4dCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZW5kXCI+ZW5kIG9mIHNlbGVjdGVkIHRleHQgIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0ZXh0XCI+dGV4dCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW1cIj5pbSA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNBY3RDaGFyXCI+aXMga2V5Ym9hcmQgY2hhciA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3VnZ2VzdGVkVmFsdWVcIj5zdWdnZXN0ZWQgdmFsdWUgZm9yIGNob2ljZSA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgdG8gYmUgYWRkZWQgaW4gdGhlIHF1ZXVlIDwvcGFyYW0+XHJcbiAgQWRkS2V5Ym9hcmRFdmVudChtZ0Zvcm06IE1nRm9ybUJhc2UsIG1nQ29udHJvbDogTWdDb250cm9sQmFzZSwgbW9kaWZpZXI6IE1vZGlmaWVycywga2V5Q29kZTogbnVtYmVyLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgdGV4dDogc3RyaW5nLCBpc0FjdENoYXI6IGJvb2xlYW4sIHN1Z2dlc3RlZFZhbHVlOiBzdHJpbmcsIGNvZGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSAobWdDb250cm9sICE9PSBudWxsKSA/IG5ldyBSdW5UaW1lRXZlbnQoPE1nQ29udHJvbD5tZ0NvbnRyb2wsIHRydWUsIGZhbHNlKSA6IG5ldyBSdW5UaW1lRXZlbnQoPFRhc2s+bWdGb3JtLmdldFRhc2soKSwgdHJ1ZSk7XHJcblxyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcblxyXG4gICAgbGV0IG5ld0tiSXRlbTogS2V5Ym9hcmRJdGVtID0gbmV3IEtleWJvYXJkSXRlbShrZXlDb2RlLCBtb2RpZmllcik7XHJcblxyXG4gICAgaWYgKGlzQWN0Q2hhciAmJiAobWdDb250cm9sICE9PSBudWxsICYmIChtZ0NvbnRyb2wuaXNUZXh0Q29udHJvbCgpKSkpXHJcbiAgICAgIG5ld0tiSXRlbS5zZXRBY3Rpb24oSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NIQVIpO1xyXG5cclxuICAgIHJ0RXZ0LnNldEtleWJvYXJkSXRlbShuZXdLYkl0ZW0pO1xyXG5cclxuICAgIGlmIChjb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9LRVlET1dOKSB7XHJcbiAgICAgIHJ0RXZ0LnNldEVkaXRQYXJtcyhzdGFydCwgZW5kLCB0ZXh0KTtcclxuICAgIH0gZWxzZVxyXG4gICAgICBydEV2dC5zZXRWYWx1ZShzdWdnZXN0ZWRWYWx1ZSk7XHJcblxyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFFDUiA3NjAzODEgaWYgYWZ0ZXIgaGFuZGxpbmcgdGhlIGV2ZW50IHRoZSBjdXJyZW50IGNvbnRyb2wgaXMgdW5wYXJrYWJsZSB0cnlcclxuICAvLy8gICBhbiBtb3ZlIHRvIHRoZSBuZXh0IHBhcmthYmxlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGNoZWNrUGFya2FiaWxpdHkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY3VycmVudDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG5cclxuICAgIC8qIFFDUiMgOTI1NDY0LiBUaGUgcHJvYmxlbSB3YXMgdGhhdCBvbiBkZWxldGluZyBhIHJlY29yZCwgQ1Mgb2YgdGhlIGNvbnRyb2wgZ2V0cyBleGVjdXRlZC5cclxuICAgICAqIFNvLCB0aGUgdGFzaydzIGxldmVsIGlzIHNldCB0byBUQVNLLiBUaGVuIHdlIGdvIHRvIHNlcnZlciBhbiBvbiByZXR1cm5pbmcgYmFjayBmcm9tIHRoZSBzZXJ2ZXIsXHJcbiAgICAgKiB3ZSByZWZyZXNoIHRoZSBmb3JtLiBIZXJlLCBzaW5jZSB0aGUgbGFzdCBwYXJrZWQgY29udHJvbCBpLmUuIFwiZnJvbVwiIChudW1lcmljKSBpcyBoaWRkZW4sXHJcbiAgICAgKiB3ZSB0cnkgdG8gcGFyayBvbiB0aGUgbmV4dCBwYXJrYWJsZSBjb250cm9sIGZyb20gUHJvcGVydHkuUmVmcmVzaERpc3BsYXkoKS4gVGhpcyBtYWtlcyB0aGVcclxuICAgICAqIHRhc2sncyBsZXZlbCBhcyBDT05UUk9MLiBOb3csIHdlIHRyeSB0byBleGVjdXRlIFJQLCBidXQgc2luY2UgdGhlIGxldmVsIGlzIENPTlRST0wsXHJcbiAgICAgKiB3ZSBkbyBub3QgZXhlY3V0ZSBpdC4gVGhlIHNvbHV0aW9uIGlzIHRoYXQgY2hlY2tQYXJrYWJpbGl0eSgpIHdoaWNoIGlzIGNhbGxlZCBmcm9tXHJcbiAgICAgKiBQcm9wZXJ0eS5SZWZyZXNoRGlzcGxheSgpLCBzaG91bGQgdHJ5IHRvIHBhcmsgb24gdGhlIGNvbnRyb2wgb25seSBpZiB0aGUgdGFzaydzIGxldmVsIGlzIENPTlRST0wuXHJcbiAgICAgKi9cclxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIChjdXJyZW50LmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wgJiYgIWF3YWl0IGN1cnJlbnQuSXNQYXJrYWJsZSgpKVxyXG4gICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoY3VycmVudC5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIEhhbmRsZVBhcmthYmlsaXR5T25Sb3dDaGFuZ2UoaXRhc2s6IElUYXNrKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoaXRhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGhhbmRsZSBzaXR1YXRpb24gd2l0aCBubyBwYXJrYWJsZSBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpdGFza1wiPjwvcGFyYW0+XHJcbiAgYXN5bmMgSGFuZGxlTm9uUGFya2FibGVDb250cm9scyhpdGFzazogSVRhc2spOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+aXRhc2s7XHJcbiAgICAvLyB3ZSBjYW4gbm90IHN0YXkgaW4gY3JlYXRlIG1vZGUgd2l0aCBubyBwYXJrYWJsZSBjb250cm9sc1xyXG4gICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJiB0YXNrLklzSW50ZXJhY3RpdmUpIHtcclxuICAgICAgYXdhaXQgdGFzay5lbmFibGVNb2RlcygpO1xyXG4gICAgICBsZXQgb2xkTW9kZTogc3RyaW5nID0gdGFzay5nZXRPcmlnaW5hbFRhc2tNb2RlKCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICBpZiAob2xkTW9kZSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAgIHRhc2suc2V0TW9kZShvbGRNb2RlKTtcclxuICAgICAgICAgIGF3YWl0ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuY3VyclJlY0NvbXB1dGUodHJ1ZSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICB0YXNrLnNldExhc3RQYXJrZWRDdHJsKG51bGwpO1xyXG4gICAgICAgICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKHRhc2ssIG51bGwsIC0xLCB0cnVlKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gd2UgY2FuIG5vdCBzdGF5IGluIGNyZWF0ZSBtb2RlIG9yIGluIHN0b3AgZXhlY3V0aW9uIHN0YXRlIHdpdGggbm8gcGFya2FibGUgY29udHJvbHNcclxuICAgICAgLy8gRG8gbm90IGdpdmUgcGFyayBlcnJvciwgaWYgdGFzayBpcyBvcGVuZWQgaW4gY3JlYXRlIG1vZGUuIFRoaXMgaXMgdGVtcG9yYXJ5IGNoYW5nZSBmb3IgY3VzdG9tZXIgcHJvYmxlbS5cclxuICAgICAgLy90aGlzLmV4aXRXaXRoRXJyb3IodGFzaywgTXNnSW50ZXJmYWNlLlJUX1NUUl9DUlNSX0NBTlRfUEFSSyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2hpbGUgaGFuZGxlIG5vbi1wYXJrYWJpbGl0eSBjb25kaXRpb24sIGVuc3VyZSBDUyBpcyBjYWxsZWQgZm9yIGNvbnRyb2wgaWYgaXQgaXMgaW4gQ29udHJvbCBsZXZlbCB0aGVuIHBhcmtpbmcgaXMgc2V0IG9uIGZvcm0uXHJcbiAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZSh0YXNrLmdldExhc3RQYXJrZWRDdHJsKCksIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcblxyXG4gICAgdGFzay5zZXRMYXN0UGFya2VkQ3RybChudWxsKTtcclxuICAgIE1nQ29udHJvbC5SZXR1cm5Ub0N0cmwgPSBudWxsO1xyXG4gICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKHRhc2ssIG51bGwsIC0xLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBoYW5kbGUgYSBzaW5nbGUgZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXJ0RXZ0XCI+dGhlIGV2ZW50IHRvIHByb2Nlc3MgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJldHVybmVkRnJvbVNlcnZlclwiPmluZGljYXRlcyB3aGV0aGVyIHdlIHJldHVybmVkIGZyb20gdGhlIHNlcnZlciAtIHRvIGJlIHBhc3NlZCB0byBoYW5kbGVyLmV4ZWN1dGUoKSA8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZUV2ZW50KHJ0RXZ0OiBSdW5UaW1lRXZlbnQsIHJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGhhbmRsZXI6IEV2ZW50SGFuZGxlciA9IG51bGw7XHJcbiAgICBsZXQgcG9zOiBFdmVudEhhbmRsZXJQb3NpdGlvbiA9IG5ldyBFdmVudEhhbmRsZXJQb3NpdGlvbigpO1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ydEV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICBsZXQgZm9yY2VFeGl0RG9uZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGVuZFRhc2tFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IG9sZFJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBudWxsO1xyXG4gICAgbGV0IG9sZEZvcmNlRXhpdDogRm9yY2VFeGl0ID0gdGhpcy5nZXRGb3JjZUV4aXQoKTtcclxuICAgIGxldCBvbGRGb3JjZUV4aXRUYXNrOiBUYXNrID0gdGhpcy5nZXRGb3JjZUV4aXRUYXNrKCk7XHJcbiAgICBsZXQgb2xkSXNIYW5kbGluZ0ZvcmNlRXhpdDogYm9vbGVhbiA9IHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQ7XHJcbiAgICBsZXQgcmVzdG9yZUlzRm9yY2VFeGl0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgcmVzdG9yZUN1cnJDdHJsOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gICAgbGV0IHJlc3RvcmVDdXJyRmllbGQ6IEZpZWxkID0gbnVsbDtcclxuXHJcbiAgICAvLyB0aGUgYWN0aW9uIG5lZWQgdG8gYmUgY2hlY2sgYWNjb3JkaW5nIHRvIHRoZSB0YXNrIG9uIHRoZSBldmVudC5cclxuICAgIC8vIElmIHRoZSBhY3Rpb24gaXMgaW50ZXJuYWwgKHVuZGVyIEFDVF9UT1QpLCBkbyBub3RoaW5nIGlmIGl0cyBkaXNhYmxlZCBvciBub3QgYWxsb3dlZC5cclxuICAgIGlmICgocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMKSkge1xyXG4gICAgICAvLyBkbyBub3RoaW5nIGlmIGFjdGlvbiBpcyAxLiBub3QgZW5hYmxlZCAyLiB3YWl0ID09IG5vIGFuZCBldmVudHMgYXJlIG5vdCBhbGxvd2VkXHJcbiAgICAgIGlmIChydEV2dC5JbnRlcm5hbEV2ZW50IDwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RPVF9DTlQgJiYgKCF0YXNrLkFjdGlvbk1hbmFnZXIuaXNFbmFibGVkKHJ0RXZ0LkludGVybmFsRXZlbnQpIHx8ICghcnRFdnQuaXNJbW1lZGlhdGUoKSAmJiB0aGlzLk5vRXZlbnRzQWxsb3dlZCgpKSkpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlXHJcbiAgICAvLyBkbyB0aGUgaGFuZGxlcnMgd2hlbiAxLiB3YWl0ID09IHllcyBvciAyLiBldmVudHMgYXJlIGFsbG93ZWRcclxuICAgIGlmICghcnRFdnQuaXNJbW1lZGlhdGUoKSAmJiB0aGlzLk5vRXZlbnRzQWxsb3dlZCgpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgcmVzdG9yZUN1cnJDdHJsID0gdGhpcy5fY3VyckN0cmw7XHJcbiAgICB0aGlzLl9jdXJyQ3RybCA9IGN0cmw7IC8vIHNhdmUgY3VycmVudCBjb250cm9sIGZvciBIQU5ETEVSX0NUUkwgZnVuY3Rpb25cclxuXHJcbiAgICBsZXQgcHJvcGFnYXRlOiBib29sZWFuID0gcnRFdnQuZ2V0VHlwZSgpICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMIHx8IHJ0RXZ0LmdldEludGVybmFsQ29kZSgpIDwgMTAwMDtcclxuXHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgdGhpcy5wdXNoUnRFdmVudChydEV2dCk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLkNoZWNrQW5kU2hvd1NwaW5uZXIodHJ1ZSk7XHJcblxyXG4gICAgICAvLyBkbyBzb21lIGNvbW1vbiBwcm9jZXNzaW5nIGFuZCBpZiB0aGUgcmVzdWx0IGlzIHRydWUgdGhlbiBjb250aW51ZVxyXG4gICAgICAvLyB3aXRoIHRoZSB1c2VyIGRlZmluZWQgaGFuZGxlcnNcclxuICAgICAgbGV0IGJSY0JlZm9yZTogYm9vbGVhbiA9IGF3YWl0IHRoaXMuY29tbW9uSGFuZGxlckJlZm9yZShydEV2dCk7XHJcblxyXG4gICAgICByZXN0b3JlQ3VyckZpZWxkID0gdGhpcy5fY3VyckZpZWxkO1xyXG4gICAgICB0aGlzLl9jdXJyRmllbGQgPSA8RmllbGQ+dGFzay5nZXRDdXJyRmllbGQoKTtcclxuXHJcbiAgICAgIGlmIChiUmNCZWZvcmUpIHtcclxuICAgICAgICBwb3MuaW5pdChydEV2dCk7XHJcbiAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCBoYW5kbGVyIGZvciB0aGUgY3VycmVudCBldmVudFxyXG4gICAgICAgIGhhbmRsZXIgPSBwb3MuZ2V0TmV4dCgpO1xyXG5cclxuICAgICAgICBpZiAoaGFuZGxlciAhPT0gbnVsbCAmJiBoYW5kbGVyLmdldEV2ZW50KCkgIT09IG51bGwgJiYgaGFuZGxlci5nZXRFdmVudCgpLlVzZXJFdnQgIT09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLnNldEZvcmNlRXhpdChoYW5kbGVyLmdldEV2ZW50KCkuVXNlckV2dC5Gb3JjZUV4aXQsIHRhc2spO1xyXG5cclxuICAgICAgICAvLyBleGVjdXRlIHRoZSBjaGFpbiBvZiBoYW5kbGVycyBmb3IgdGhlIGN1cnJlbnQgZXZlbnQuIHRoZSBleGVjdXRpb25cclxuICAgICAgICAvLyBjb250aW51ZXMgdGlsbCBhbiBldmVudCBoYW5kbGVyIHJldHVybnMgZmFsc2UuXHJcbiAgICAgICAgd2hpbGUgKGhhbmRsZXIgIT09IG51bGwpIHtcclxuICAgICAgICAgIGxldCBoYW5kbGVyQ29udGV4dFRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgICAgICAgbGV0IHJ0RXZ0Q2hhbmdlZDogYm9vbGVhbjtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBlbmFibGVkQ25kQ2hlY2tlZEFuZFRydWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgaGFuZGxlciBjaGFuZ2UgdGhlIGhhbmRsZXIncyBjb250ZXh0IHRhc2sgdG8gdGhlIGV2ZW50J3MgdGFza1xyXG4gICAgICAgICAgICBoYW5kbGVyQ29udGV4dFRhc2sgPSA8VGFzaz4gaGFuZGxlci5nZXRUYXNrKCkuR2V0Q29udGV4dFRhc2soKTtcclxuICAgICAgICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSA+PSAxMDAwICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVkFSSUFCTEUpXHJcbiAgICAgICAgICAgICAgaGFuZGxlci5nZXRUYXNrKCkuU2V0Q29udGV4dFRhc2soaGFuZGxlci5nZXRUYXNrKCkpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgaGFuZGxlci5nZXRUYXNrKCkuU2V0Q29udGV4dFRhc2socnRFdnQuZ2V0VGFzaygpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIG5lZWQgdG8gaGFuZGxlIEZvcmNlRXhpdCBmb3Igbm9uLXVzZXIgZXZlbnRzXHJcbiAgICAgICAgICAgIGlmIChoYW5kbGVyLmdldEV2ZW50KCkuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIgJiYgYXdhaXQgaGFuZGxlci5pc0VuYWJsZWQoKSkge1xyXG4gICAgICAgICAgICAgIGVuYWJsZWRDbmRDaGVja2VkQW5kVHJ1ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5faXNIYW5kbGluZ0ZvcmNlRXhpdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHJlc3RvcmVJc0ZvcmNlRXhpdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgLy8gaGFuZGxlIGZvcmNlRXhpdCBvbmx5IG9uY2VcclxuICAgICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5oYW5kbGVGb3JjZUV4aXRCZWZvcmUoaGFuZGxlci5nZXRFdmVudCgpLCBydEV2dCkpIHtcclxuICAgICAgICAgICAgICAgIGZvcmNlRXhpdERvbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGN1cnJlbnQgcnVuIHRpbWUgZXZlbnQgaXMgZGlmZmVyZW50IGZyb20gdGhlIGV2ZW50XHJcbiAgICAgICAgICAgIC8vIG9mIHRoZSBoYW5kbGVyXHJcbiAgICAgICAgICAgIGlmIChydEV2dCAhPT0gaGFuZGxlci5nZXRFdmVudCgpKSB7XHJcbiAgICAgICAgICAgICAgLy8gdGhlIG5ldyBydW50aW1lIGV2ZW50IGlzIHRoYXQgb2YgdGhlIGhhbmRsZXIgY29tYmluZWQgd2l0aCB0aGVcclxuICAgICAgICAgICAgICAvLyBkYXRhIG9mIHRoZSBjdXJyZW50IHJ1bnRpbWUgZXZlbnQuXHJcbiAgICAgICAgICAgICAgLy8gdGhlIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byBwcm9wYWdhdGUgdGhlIGV2ZW50IG9mIHRoZSBoYW5kbGVyXHJcbiAgICAgICAgICAgICAgLy8gaW4gcGxhY2Ugb2YgdGhlIG9yaWdpbmFsIGV2ZW50XHJcbiAgICAgICAgICAgICAgb2xkUnRFdnQgPSBydEV2dDtcclxuICAgICAgICAgICAgICBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoaGFuZGxlci5nZXRFdmVudCgpLCBydEV2dCk7XHJcbiAgICAgICAgICAgICAgcnRFdnRDaGFuZ2VkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYSBuZXcgcnVudGltZSBldmVudCB0byBoYW5kbGUgc28gcG9wIHRoZSBvbGQgb25lIGFuZCBwdXNoXHJcbiAgICAgICAgICAgICAgLy8gdGhlIG5ldyBvbmUgaW5zdGVhZC5cclxuICAgICAgICAgICAgICB0aGlzLnBvcFJ0RXZlbnQoKTtcclxuICAgICAgICAgICAgICB0aGlzLnB1c2hSdEV2ZW50KHJ0RXZ0KTtcclxuICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgcnRFdnRDaGFuZ2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWClcclxuICAgICAgICAgICAgICBydEV2dC5nZXRUYXNrKCkuc2V0SW5SZWNvcmRTdWZmaXgodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50QXJndW1lbnRzKHJ0RXZ0KTtcclxuICAgICAgICAgICAgbGV0IGhhbmRsZXJSZXRWYWxzOiBSZXRWYWxzID0gYXdhaXQgaGFuZGxlci5leGVjdXRlKHJ0RXZ0LCByZXR1cm5lZEZyb21TZXJ2ZXIsIGVuYWJsZWRDbmRDaGVja2VkQW5kVHJ1ZSk7XHJcbiAgICAgICAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKVxyXG4gICAgICAgICAgICAgIHJ0RXZ0LmdldFRhc2soKS5zZXRJblJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICAgIHByb3BhZ2F0ZSA9IGhhbmRsZXJSZXRWYWxzLlByb3BhZ2F0ZTtcclxuICAgICAgICAgICAgaWYgKCFoYW5kbGVyUmV0VmFscy5FbmFibGVkICYmIHJ0RXZ0Q2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgIHJ0RXZ0ID0gb2xkUnRFdnQ7XHJcbiAgICAgICAgICAgICAgb2xkUnRFdnQgPSBudWxsO1xyXG4gICAgICAgICAgICAgIHJ0RXZ0Q2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGEgbmV3IHJ1bnRpbWUgZXZlbnQgdG8gaGFuZGxlIHNvIHBvcCB0aGUgb2xkIG9uZSBhbmQgcHVzaFxyXG4gICAgICAgICAgICAgIC8vIHRoZSBuZXcgb25lIGluc3RlYWQuXHJcbiAgICAgICAgICAgICAgdGhpcy5wb3BSdEV2ZW50KCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5wdXNoUnRFdmVudChydEV2dCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIGhhdmUgZnVsZmlsbGVkIHRoZSBlbmQgY29uZGl0aW9uXHJcbiAgICAgICAgICAgIC8vIEFmdGVyIGV4ZWN1dGluZyBhIGhhbmRsZXIsIGJlZm9yZSBlbmRpbmcgYSB0YXNrIChpZiB0aGUgZW5kIGNvbmRpdGlvbiBpcyBUUlVFKSxcclxuICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGNoZWNrIGlmIHRoZSB0YXNrIGlzIG5vdCBhbHJlYWR5IGNsb3NlZC4gVGhpcyBjYW4gaGFwcGVuIGxpa2UgaW4gY2FzZVxyXG4gICAgICAgICAgICAvLyBvZiBRQ1IgIzc5NjQ3NiAtLS0gYSBub24taW50ZXJhY3RpdmUgdGFzayBoYXMgY2FsbGVkIGFuIGludGVyYWN0aXZlIHRhc2sgZnJvbVxyXG4gICAgICAgICAgICAvLyB0YXNrIHN1ZmZpeC4gTm93IGlmIHdlIHByZXNzIEFsdCtGNCwgd2UgZ2V0IEVYSVRfU1lTVEVNIGFjdC4gQW5kIHNvIHdlIGNsb3NlXHJcbiAgICAgICAgICAgIC8vIGFsbCB0YXNrcyBzdGFydGluZyBmcm9tIE1haW4gUHJvZ3JhbS4gU28sIHdoZW4gd2UgY29tZSBvdXQgb2YgdGhlIFRTIGhhbmRsZXJcclxuICAgICAgICAgICAgLy8gZXhlY3V0aW9uLCB0aGUgdGFzayBpcyBhbHJlYWR5IGNsb3NlZC5cclxuICAgICAgICAgICAgLy8gRm9yIE9mZmxpbmUgOiBUUCBpcyBleGVjdXRlZCBhdCBjbGllbnQgc2lkZS4gSWYgd2UgYXJlIGluIFRhc2sgUHJlZml4LCBkb250IGNoZWNrIGVuZFRhc2sgY29uZGl0aW9uIGhlcmUuXHJcbiAgICAgICAgICAgIGlmIChydEV2dC5nZXRJbnRlcm5hbENvZGUoKSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfUFJFRklYICYmIHRhc2suaXNTdGFydGVkKCkgJiYgdGFzay5nZXRFeGVjRW5kVGFzaygpKSB7XHJcbiAgICAgICAgICAgICAgZW5kVGFza0Vycm9yID0gYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgaWYgKGVuZFRhc2tFcnJvcilcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuaGFuZGxlU3RvcEV4ZWN1dGlvbihydEV2dCkpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgLy8gcmVzdG9yaW5nIHRoZSBjb250ZXh0XHJcbiAgICAgICAgICAgIGhhbmRsZXIuZ2V0VGFzaygpLlNldENvbnRleHRUYXNrKGhhbmRsZXJDb250ZXh0VGFzayk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKCFwcm9wYWdhdGUpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGlmIChydEV2dENoYW5nZWQpXHJcbiAgICAgICAgICAgIGhhbmRsZXIgPSBwb3MuZ2V0TmV4dChydEV2dCk7XHJcbiAgICAgICAgICAvLyBnZXQgdGhlIG5leHQgaGFuZGxlciBmb3IgdGhlIGN1cnJlbnQgZXZlbnRcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgaGFuZGxlciA9IHBvcy5nZXROZXh0KCk7XHJcbiAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gbnVsbClcclxuICAgICAgICAgICAgRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZS5hZGRUYXNrRXZlbnQocnRFdnQuZ2V0QnJrTGV2ZWwodHJ1ZSksIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9QUk9QQUdBVEUsIHRhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9wYWdhdGUgJiYgIWVuZFRhc2tFcnJvcilcclxuICAgICAgICAgIGF3YWl0IHRoaXMuY29tbW9uSGFuZGxlcihydEV2dCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFlbmRUYXNrRXJyb3IpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmNvbW1vbkhhbmRsZXJBZnRlcihydEV2dCwgYlJjQmVmb3JlKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZm9yY2VFeGl0RG9uZSAmJiB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0KSB7XHJcbiAgICAgICAgdGhpcy5faXNIYW5kbGluZ0ZvcmNlRXhpdCA9IGZhbHNlO1xyXG4gICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZvcmNlRXhpdEFmdGVyKHJ0RXZ0KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNldEZvcmNlRXhpdChvbGRGb3JjZUV4aXQsIG9sZEZvcmNlRXhpdFRhc2spO1xyXG4gICAgICBpZiAocmVzdG9yZUlzRm9yY2VFeGl0KVxyXG4gICAgICAgIHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQgPSBvbGRJc0hhbmRsaW5nRm9yY2VFeGl0O1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5fY3VyckN0cmwgPSByZXN0b3JlQ3VyckN0cmw7XHJcbiAgICAgIHRoaXMuX2N1cnJGaWVsZCA9IHJlc3RvcmVDdXJyRmllbGQ7XHJcbiAgICAgIHRoaXMucG9wUnRFdmVudCgpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLyB1cGRhdGUgdGhlIGRpc3BsYXlcclxuICAgIEdVSU1hbmFnZXIuSW5zdGFuY2UuZXhlY0d1aUNvbW1hbmRRdWV1ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgbWV0aG9kIHNpbXVsYXRlcyBhbGwgZXZlbnRzIHRoYXQgYXJlIGluIHNlbGVjdGlvbiBzZXF1ZW5jZSBzdGFydGluZyBmcm9tIGZvY3VzIGV2ZW50XHJcbiAgLy8vICAgSXQgaXMgdXNlZCBpbiA6XHJcbiAgLy8vICAgYWN0aW9ucyBDVFJMK1RBQiAmJiBDVFJMK1NISUZUK1RBQiB0aGF0IG1vdmUgdXMgdG8gdGhlIG5leHQvcHJldmlvdXMgaXRlbSBpbiBUYWIgY29udHJvbFxyXG4gIC8vLyAgIGNsaWNrIG9yIGFjY2VsZXJhdG9yIG9uIHB1c2ggYnV0dG9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5jdHJsIGxpbmU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvZHVjZUNsaWNrXCI+dHJ1ZSBzaG91bGQgcHJvZHVjZSBjbGljayBldmVudDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBzaW11bGF0ZVNlbGVjdGlvbihjdHJsOiBNZ0NvbnRyb2xCYXNlLCB2YWw6IGFueSwgbGluZTogbnVtYmVyLCBwcm9kdWNlQ2xpY2s6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBtZ0NvbnRyb2w6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+Y3RybDtcclxuICAgIGxldCBjdXJyVGFzazogVGFzayA9IDxUYXNrPm1nQ29udHJvbC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGNhbmNlbFdhc1JhaXNlZDogYm9vbGVhbiA9IGN1cnJUYXNrLmNhbmNlbFdhc1JhaXNlZCgpO1xyXG5cclxuICAgIC8vIGlmIChtZ0NvbnRyb2wuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCKSB7XHJcbiAgICAvLyAgIGlmICghbWdDb250cm9sLmlzTW9kaWZpYWJsZSgpIHx8ICFtZ0NvbnRyb2wuSXNQYXJrYWJsZSgpKSB7XHJcbiAgICAvLyAgICAgbWdDb250cm9sLnJlc3RvcmVPbGRWYWx1ZSgpO1xyXG4gICAgLy8gICAgIGxldCBsYXN0Rm9jdXNlZENvbnRyb2w6IE1nQ29udHJvbCA9IEdVSU1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcbiAgICAvLyAgICAgaWYgKGxhc3RGb2N1c2VkQ29udHJvbCAhPT0gbnVsbClcclxuICAgIC8vICAgICAgIE1hbmFnZXIuU2V0Rm9jdXMobGFzdEZvY3VzZWRDb250cm9sLCAtMSk7XHJcbiAgICAvLyAgICAgcmV0dXJuO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gd2hlbiBhIHB1c2ggYnV0dG9uIGlzIGFib3V0IHRvIHJhaXNlIGEgJ0NhbmNlbCcgb3IgYSAnUXVpdCcgZXZlbnQuIHdlIGRvIG5vdCB3YW50IHRvIHNldCB0aGUgbmV3IHZhbHVlIHRvIHRoZSBmaWVsZC5cclxuICAgIC8vIFRoYXQgc2V0dGluZyBtaWdodCBjYXVzZSBhIHJlYyBzdWZmaXggYW5kIGEgdmFyaWFibGUgY2hhbmdlLlxyXG4gICAgaWYgKG1nQ29udHJvbC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04pIHtcclxuICAgICAgbGV0IGFSdEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChtZ0NvbnRyb2wpO1xyXG4gICAgICBsZXQgcmFpc2VBdDogUmFpc2VBdCA9IDxSYWlzZUF0Pihhd2FpdCAobWdDb250cm9sLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkFJU0VfQVQpKS5nZXRWYWx1ZUludCgpKTtcclxuICAgICAgaWYgKGFSdEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgKGFSdEV2dC5JbnRlcm5hbEV2ZW50ID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMIHx8IGFSdEV2dC5JbnRlcm5hbEV2ZW50ID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUVVJVCkpIHtcclxuICAgICAgICBpZiAocmFpc2VBdCA9PT0gUmFpc2VBdC5UYXNrSW5Gb2N1cylcclxuICAgICAgICAgIGN1cnJUYXNrID0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG4gICAgICAgIGNhbmNlbFdhc1JhaXNlZCA9IGN1cnJUYXNrLmNhbmNlbFdhc1JhaXNlZCgpO1xyXG4gICAgICAgIGN1cnJUYXNrLnNldENhbmNlbFdhc1JhaXNlZCh0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJhaXNlQXQgPT09IFJhaXNlQXQuVGFza0luRm9jdXMpXHJcbiAgICAgICAgbWdDb250cm9sLnNldFJ0RXZ0VGFzayhMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZpcnN0IHdlIGhhbmRsZSBmb2N1c1xyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVGb2N1cyhtZ0NvbnRyb2wsIGxpbmUsIHByb2R1Y2VDbGljayk7XHJcblxyXG4gICAgY3VyclRhc2suc2V0Q2FuY2VsV2FzUmFpc2VkKGNhbmNlbFdhc1JhaXNlZCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICAvLyBRQ1IjIDk3NDA0NyA6IElmIHdlIGhhdmUgYSBQdXNoIEJ1dHRvbiB3aXRoIEFsbG93IFBhcmtpbmcgPSBObyBhbmQgZmllbGQgaXMgYXR0YWNoZWQgdG8gaXQsIGRvbid0IGhhbmRsZSB0aGUgZXZlbnQuXHJcbiAgICAvLyBUaGlzIGlzIHNhbWUgYXMgb25saW5lLiBJbiBvbmxpbmUsIGlmIGZpZWxkIGlzIG5vdCBhdHRhY2hlZCB0byBub24gcGFya2FibGUgcHVzaCBCdXR0b24sIHdlIGhhbmRsZSB0aGUgZXZlbnRcclxuICAgIC8vIEJ1dCBpZiBmaWVsZCBpcyBhdHRhY2hlZCB0byBpdCwgd2UgZG9uJ3QgaGFuZGxlIGV2ZW50LlxyXG4gICAgLy8gU28gaWYgY29udHJvbCBpcyBwdXNoIGJ1dHRvbiwgZXhlY3V0ZSBoYW5kbGVFdmVudCBvbmx5IHdoZW4gZmllbGQgaXMgbm90IGF0dGFjaGVkIG9yIFBhcmtvbkNMaWNrIGlzIE5vIG9yXHJcbiAgICAvLyBQYXJrb25DTGljayBhbmQgYWxsb3dwYXJraW5nIGlzIGJvdGggWWVzXHJcbiAgICBsZXQgY29udHJvbElzUGFya2FibGU6IGJvb2xlYW4gPSBhd2FpdCBtZ0NvbnRyb2wuSXNQYXJrYWJsZSgpO1xyXG4gICAgaWYgKG1nQ29udHJvbC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04gfHwgKG1nQ29udHJvbC5nZXRGaWVsZCgpID09PSBudWxsIHx8IGNvbnRyb2xJc1BhcmthYmxlKSkge1xyXG5cclxuICAgICAgLy8gUUNSICMzMDE2NTIuIEZvciBub24tcGFya2FibGUgYnV0dG9uIGNvbnRyb2wgd2l0aCBldmVudCByYWlzZWQgYXQgdGhlIGNvbnRhaW5lciB0YXNrIHdpbGwgYmUgY2hhbmdlZCBzb1xyXG4gICAgICAvLyB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZCB0aGVuIHRoZSB0YXNrIHdpbGwgZ2V0IGZvY3VzLiAoYXMgaW4gT25saW5lIGFuZCBhcyBpZiB0aGUgYnV0dG9uIHdhcyBwYXJrYWJsZSkuXHJcbiAgICAgIC8vIFRoZSBmb2N1cyB3aWxsIGJlIG9uIHRoZSBmaXJzdCBjb250cm9sLlxyXG4gICAgICBpZiAobWdDb250cm9sLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTiAmJiAhY29udHJvbElzUGFya2FibGUpIHtcclxuICAgICAgICBsZXQgc3ViZm9ybVRhc2s6IFRhc2sgPSA8VGFzaz5tZ0NvbnRyb2wuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgICAgICBpZiAoc3ViZm9ybVRhc2suSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgICBjdXJyVGFzayA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuICAgICAgICAgIC8vIERlZmVjdCAxMTU0NzQuIEZvciB0aGUgc2FtZSB0YXNrIGRvIG5vdCBtb3ZlIHRvIHRoZSBmaXJzdCBjb250cm9sLlxyXG4gICAgICAgICAgaWYgKHN1YmZvcm1UYXNrICE9PSBjdXJyVGFzayAmJiBzdWJmb3JtVGFzay5wYXRoQ29udGFpbnMoY3VyclRhc2spKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoc3ViZm9ybVRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSykgeyAvLyBUT0RPOiBDaGVjayBpZiB0aGlzIGNvZGUgY2FuIGJlIG1vdmVkIHRvIEhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoKVxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHN1YmZvcm1UYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHN1YmZvcm1UYXNrKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgICAvLyB0aGVuIEFDVF9ISVQgaXMgc2VudFxyXG4gICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQobWdDb250cm9sKTtcclxuICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkN1cnJlbnRDbGlja2VkQ3RybCA9IG1nQ29udHJvbDtcclxuICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfSElUKTtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYW5kIHNlbGVjdGlvbiBpcyBoYW5kbGVkIGluIHRoZSBlbmQgaWYgcHJldmlvdXMgYWN0aW9ucyBzdWNjZWVkZWRcclxuICAgIGlmIChtZ0NvbnRyb2wuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKVxyXG4gICAgLy8gZm9yIGJ1dHRvblxcY2hlY2sgd2UgZG8gbm90IGNhbGwgdGhpcyB0byBwcmV2ZW50IHJlY3Vyc2lvblxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZVNlbGVjdGlvbihtZ0NvbnRyb2wsIGxpbmUsIHZhbCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgIHJldHVybjtcclxuICAgIC8vIHRoZW4gbW91c2UgdXBcclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlTW91c2VVcChtZ0NvbnRyb2wsIGxpbmUsIHByb2R1Y2VDbGljayk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGFjdGl2YXRlIGhhbmRsZUludGVybmFsRXZlbnQgd2l0aCBpc1F1aXQgPSBmYWxzZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpdGFza1wiPmEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJldmVudENvZGVcIj50aGUgY29kZSBvZiB0aGUgZXZlbnQ8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhpdGFzazogSVRhc2ssIGV2ZW50Q29kZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZFN1YmZvcm1SZWZyZXNoKGl0YXNrLCBldmVudENvZGUsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhY3RpdmF0ZSBoYW5kbGVJbnRlcm5hbEV2ZW50IHdpdGggaXNRdWl0ID0gZmFsc2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXRhc2tcIj5hIHJlZmVyZW5jZSB0byB0aGUgdGFzayA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZlbnRDb2RlXCI+dGhlIGNvZGUgb2YgdGhlIGV2ZW50IDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3ViZm9ybVJlZnJlc2hcIj5pZGVudGlmaWVyIGlmIHRoZSBldmVudCBjYWxsZWQgYnkgc3ViZm9ybSByZWZyZXNoPC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRTdWJmb3JtUmVmcmVzaChpdGFzazogSVRhc2ssIGV2ZW50Q29kZTogbnVtYmVyLCBzdWJmb3JtUmVmcmVzaDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5pdGFzaztcclxuXHJcbiAgICAvLyBzZXQgU3ViZm9ybUV4ZWNNb2RlIChmb3IgU3ViZm9ybUV4ZWNNb2RlIGZ1bmN0aW9uKSBvbmx5IGluIHJlY29yZCBwcmVmaXguXHJcbiAgICAvLyBTdWJmb3JtRXhlY01vZGUgaXMgY2hhbmdlZCBpbiByZWNvcmQgcHJlZml4IGFuZCBpdCBpcyB0aGUgc2FtZSB1bnRpbCB0aGVcclxuICAgIC8vIG5leHQgcmVjb3JkIHByZWZpeCBleGVjdXRpb24sIGJlY2F1c2Ugd2UgZG8gbm90IG9wZW4gYSBzdWJmb3JtIHRhc2sgZWFjaCB0aW1lXHJcbiAgICAvLyBpbiBSQyBhcyBpdCBpcyBpbiBPbmxpbmUuIEJ1dCB3aGVuIHRoZSBzdWJmb3JtIGlzIHJlZnJlc2hlZCBmcm9tIHRoZSBwYXJlbnRcclxuICAgIC8vIGl0cyByZWNvcmQgcHJlZml4ICYgc3VmZml4IGFyZSBhbHNvIGV4ZWN1dGVkLlxyXG4gICAgaWYgKGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVggJiYgdGFzay5Jc1N1YkZvcm0gJiYgdGFzay5TdWJmb3JtRXhlY01vZGUgIT09IFRhc2tfU3ViZm9ybUV4ZWNNb2RlRW51bS5GSVJTVF9USU1FKS8vIEZJUlNUX1RJTUUgaXMgc2V0IG9ubHkgb25jZSBpblxyXG4gICAgLy8gZG9GaXJzdFJlY29yZEN5Y2xlLlxyXG4gICAge1xyXG4gICAgICB0YXNrLlN1YmZvcm1FeGVjTW9kZSA9IChzdWJmb3JtUmVmcmVzaCA/IFRhc2tfU3ViZm9ybUV4ZWNNb2RlRW51bS5SRUZSRVNIIDogVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLlNFVF9GT0NVUyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZm9yIHRoZSBzdWJmb3JtIHJlZnJlc2ggaXQgaXMgbmVlZGVkIHRvIGV4ZWN1dGUgTUdfQUNUX1BPU1RfUkVGUkVTSF9CWV9QQVJFTlQgaGFuZGxlciBiZWZvcmUgUkVDT1JEX1BSRUZJWCBoYW5kbGVyXHJcbiAgICBpZiAoc3ViZm9ybVJlZnJlc2gpXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKGl0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUE9TVF9SRUZSRVNIX0JZX1BBUkVOVCk7XHJcblxyXG4gICAgaWYgKHRhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpIHtcclxuICAgICAgaWYgKGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVggfHwgZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCkge1xyXG4gICAgICAgIGlmIChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKVxyXG4gICAgICAgICAgYXdhaXQgdGFzay5lbXB0eURhdGF2aWV3T3BlbihzdWJmb3JtUmVmcmVzaCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGFzay5lbXB0eURhdGF2aWV3Q2xvc2UoKTtcclxuXHJcbiAgICAgICAgaWYgKHRhc2suZ2V0Rm9ybSgpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWClcclxuICAgICAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgdGFzay5nZXRGb3JtKCkuU2VsZWN0Um93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2VcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZEV2ZW50U3VidHlwZSh0YXNrLCBldmVudENvZGUsIEV2ZW50U3ViVHlwZS5Ob3JtYWwpO1xyXG4gICAgfSBlbHNlXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kRXZlbnRTdWJ0eXBlKHRhc2ssIGV2ZW50Q29kZSwgRXZlbnRTdWJUeXBlLk5vcm1hbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWN0aXZhdGUgaGFuZGxlSW50ZXJuYWxFdmVudCB3aXRoIGlzUXVpdCA9IGZhbHNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5hIHJlZmVyZW5jZSB0byB0aGUgY29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZlbnRDb2RlXCI+dGhlIGNvZGUgb2YgdGhlIGV2ZW50IDwvcGFyYW0+XHJcbiAgYXN5bmMgaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGN0cmw6IE1nQ29udHJvbEJhc2UsIGV2ZW50Q29kZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sKDxNZ0NvbnRyb2w+Y3RybCwgZXZlbnRDb2RlLCBFdmVudFN1YlR5cGUuTm9ybWFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBcInN0b3AgZXhlY3V0aW9uXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RvcEV4ZWN1dGlvbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGN0cmwgb24gd2hpY2ggd2UgaGFkIGEgXCJzdG9wIGV4ZWN1dGlvblwiXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldFN0b3BFeGVjdXRpb25DdHJsKCk6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0b3BFeGVjdXRpb25DdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGluaXRpYWxpemVzIHRoZSBzdGF0aWMgc2VjdGlvbiBvZiB0aGUgZXZlbnRzIG1hbmFnZXIuIFVzdWFsbHkgZG9lcyBub3RoaW5nIGJ1dCBpbiB0aGVcclxuICAvLy8gICBldmVudCBvZiBhcHBsZXQgcmUtbG9hZCAoZm9yIGV4YW1wbGUsIGJlY2F1c2Ugb2YgYSBicm93c2VyIHJlZnJlc2gpIGl0IGluaXRpYWxpemVzIHRoZVxyXG4gIC8vLyAgIHN0YXRpYyBwYXJ0IG9mIHRoaXMgY2xhc3MuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBJbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSB7XHJcbiAgICAgIHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5fZm9yY2VFeGl0ID0gRm9yY2VFeGl0Lk5vbmU7XHJcbiAgICAgIHRoaXMuX2ZvcmNlRXhpdFRhc2sgPSBudWxsO1xyXG4gICAgICB0aGlzLl9jdXJyRmllbGQgPSBudWxsO1xyXG4gICAgICB0aGlzLnNldEVuZE9mV29yayh0cnVlKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBBZGQgaW50ZXJuYWwgZXZlbnQgdG8gdGhlIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIml0YXNrXCI+dGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+Y29kZSBvZiBpbnRlcm5hbCBldmVudDwvcGFyYW0+XHJcbiAgYWRkSW50ZXJuYWxFdmVudFdpdGhJdGFza0FuZENvZGUoaXRhc2s6IElUYXNrLCBjb2RlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoVGFza0FuZENvZGVBbmRPbk11bHRpTWFyayhpdGFzaywgY29kZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhZGRJbnRlcm5hbEV2ZW50V2l0aEN0cmxBbmRDb2RlKGN0cmw6IE1nQ29udHJvbEJhc2UsIGNvZGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KDxNZ0NvbnRyb2w+Y3RybCk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFkZEludGVybmFsRXZlbnRXaXRoQ3RybEFuZERpc3BsYXlMaW5lQW5kQ29kZShjdHJsOiBNZ0NvbnRyb2xCYXNlLCBEaXNwbGF5TGluZTogbnVtYmVyLCBjb2RlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCg8TWdDb250cm9sPmN0cmwsIERpc3BsYXlMaW5lLCBmYWxzZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInByaW9yaXR5XCI+PC9wYXJhbT5cclxuICBhZGRJbnRlcm5hbEV2ZW50V2l0aEN0cmxBbmRDb2RlQW5kUHJpb3JpdHkoY3RybDogTWdDb250cm9sQmFzZSwgY29kZTogbnVtYmVyLCBwcmlvcml0eTogUHJpb3JpdHkpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCg8TWdDb250cm9sPmN0cmwpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICBydEV2dC5zZXRQcmlvcml0eShwcmlvcml0eSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGFkZCBndWkgdHJpZ2dlcmVkIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpdGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib25NdWx0aU1hcmtcIj48L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aFRhc2tBbmRDb2RlQW5kT25NdWx0aU1hcmsoaXRhc2s6IElUYXNrLCBjb2RlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+aXRhc2s7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzayk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gd2lsbCBiZSB1c2VkIGZvciBtdWx0aW1hcmtpbmcgaW4gdGhlIGZ1dHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibW9kaWZpZXJzXCI+PC9wYXJhbT5cclxuICBhZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhDdHJsQW5kQ29kZUFuZExpbmVBbmRNb2RpZmllcihjdHJsOiBNZ0NvbnRyb2xCYXNlLCBjb2RlOiBudW1iZXIsIGxpbmU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KDxNZ0NvbnRyb2w+Y3RybCwgbGluZSwgZmFsc2UpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQWRkIGludGVybmFsIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSBHVUkgcXVldWUgKGluY2x1ZGVzIHRpbWVyIGV2ZW50cykgdG8gdGhlIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj5jb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+Y29kZSBvZiBpbnRlcm5hbCBldmVudCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPmxpbmUgaW4gYSB0YWJsZSBjb250cm9sIDwvcGFyYW0+XHJcbiAgYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoVGFza0FuZENvZGVBbmRMaW5lKHRhc2s6IFRhc2ssIGNvZGU6IG51bWJlciwgbGluZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgdHNrOiBUYXNrID0gbnVsbDtcclxuICAgIGlmICh0YXNrICE9PSBudWxsKVxyXG4gICAgICB0c2sgPSA8VGFzaz50YXNrO1xyXG5cclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCh0c2spO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICBydEV2dC5EaXNwbGF5TGluZSA9IGxpbmU7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGhhbmRsZSBDb2x1bW4gQ2xpY2sgZXZlbnQgb24gQ29sdW1uIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlDb2x1bW5DdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkaXJlY3Rpb25cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbHVtbkhlYWRlclwiPjwvcGFyYW0+XHJcbiAgQWRkQ29sdW1uQ2xpY2tFdmVudChjb2x1bW5DdHJsOiBNZ0NvbnRyb2xCYXNlLCBkaXJlY3Rpb246IG51bWJlciwgY29sdW1uSGVhZGVyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCg8TWdDb250cm9sPmNvbHVtbkN0cmwsIGRpcmVjdGlvbiwgMCk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ09MX0NMSUNLKTtcclxuXHJcbiAgICAvLyBQcmVwYXJlIGFuIGFyZ3VtZW50IGxpc3Qgd2l0aCBhcmd1bWVudCBhcyBjb2x1bW5IZWFkZXJTdHJpbmcuXHJcbiAgICBsZXQgYXJnc0xpc3QgPSBuZXcgQXJyYXk8RXhwVmFsPigpO1xyXG4gICAgYXJnc0xpc3RbMF0gPSBuZXcgRXhwVmFsKFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSwgZmFsc2UsIGNvbHVtbkhlYWRlcik7XHJcbiAgICBsZXQgYXJncyA9IG5ldyBBcmd1bWVudHNMaXN0KGFyZ3NMaXN0KTtcclxuICAgIHJ0RXZ0LnNldEFyZ0xpc3QoYXJncyk7XHJcblxyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgQWRkUm91dGVFdmVudCh0YXNrOiBJVGFzaywgY29kZTogbnVtYmVyLCByb3V0ZXJwYXRoOiBzdHJpbmcsIHJvdXRlck91dGxldE5hbWU6IHN0cmluZywgcm91dGVQYXJhbXM6IExpc3Q8YW55Pikge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KDxUYXNrPnRhc2ssIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcblxyXG4gICAgbGV0IGFyZ3NMaXN0OiBFeHBWYWxbXSA9IG5ldyBBcnJheTxFeHBWYWw+KDIpO1xyXG4gICAgYXJnc0xpc3RbMF0gPSBuZXcgRXhwVmFsKFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEsIGZhbHNlLCByb3V0ZXJwYXRoKTtcclxuICAgIGlmIChyb3V0ZXJPdXRsZXROYW1lID09PSBudWxsKVxyXG4gICAgICByb3V0ZXJPdXRsZXROYW1lID0gXCJcIjtcclxuICAgIGFyZ3NMaXN0WzFdID0gbmV3IEV4cFZhbChTdG9yYWdlQXR0cmlidXRlLkFMUEhBLCBmYWxzZSwgcm91dGVyT3V0bGV0TmFtZSk7XHJcblxyXG4gICAgbGV0IGFyZ3MgPSBuZXcgQXJndW1lbnRzTGlzdChhcmdzTGlzdCk7XHJcbiAgICBydEV2dC5zZXRBcmdMaXN0KGFyZ3MpO1xyXG4gICAgcnRFdnQuc2V0Um91dGVQYXJhbUxpc3Qocm91dGVQYXJhbXMpO1xyXG5cclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIEFkZFJvdXRlckNsb3NlZEV2ZW50KHRhc2s6IFRhc2spIHtcclxuICAgIGxldCBzdWJGb3JtQ29udHJvbDogTWdDb250cm9sQmFzZSA9IDxNZ0NvbnRyb2xCYXNlPnRhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCk7XHJcbiAgICBsZXQgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KDxUYXNrQmFzZT5zdWJGb3JtQ29udHJvbC5nZXRGb3JtKCkuZ2V0VGFzaygpLCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TVUJGT1JNX0NMT1NFKTtcclxuXHJcbiAgICBsZXQgYXJnc0xpc3Q6IEV4cFZhbFtdID0gbmV3IEFycmF5PEV4cFZhbD4oMSk7XHJcbiAgICBhcmdzTGlzdFswXSA9IG5ldyBFeHBWYWwoU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSwgZmFsc2UsIHN1YkZvcm1Db250cm9sLmdldE5hbWUoKSk7XHJcblxyXG4gICAgbGV0IGFyZ3MgPSBuZXcgQXJndW1lbnRzTGlzdChhcmdzTGlzdCk7XHJcbiAgICBydEV2dC5zZXRBcmdMaXN0KGFyZ3MpO1xyXG4gICAgRXZlbnRzTWFuYWdlci5JbnN0YW5jZS5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBhZGQgbGFzdCBzYXZlZCByb3V0ZSBldmVudCA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3JjVGFza1N0clwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYXJnTGlzdFN0clwiPjwvcGFyYW0+XHJcbiAgQWRkTGFzdFNhdmVkUm91dGVFdmVudCAoc3JjVGFzazogVGFzaywgYXJnczogQXJndW1lbnRzTGlzdCApIHtcclxuICAgIGxldCBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoPFRhc2tCYXNlPkxhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSwgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCQ0xJRU5UX1JPVVRFKTtcclxuXHJcbiAgICBpZiAoc3JjVGFzayAhPSBudWxsKSB7XHJcbiAgICAgIHJ0RXZ0LnNldFRhc2soc3JjVGFzayk7XHJcbiAgICAgIGlmIChhcmdzICE9IG51bGwpIHtcclxuICAgICAgICBydEV2dC5zZXRBcmdMaXN0KGFyZ3MpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2V0TGFzdFNhdmVkUm91dGVFdmVudChydEV2dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICBBZGQgaW50ZXJuYWwgZXZlbnQgcm8gc2V0IHRoZSB2YWx1ZSBvZiBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj4gY29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsdWVcIj4gdmFsdWUgb2YgY29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVmcmVzaERpc3BsYXlcIj4gcmVmcmVzaCBkaXNwbGF5IDwvcGFyYW0+XHJcbiAgQWRkRXh0ZXJuYWxWYWx1ZUV2ZW50KGN0cmw6IE1nQ29udHJvbCAsIHZhbHVlOiBhbnksIHJlZnJlc2hEaXNwbGF5OiBib29sZWFuKSB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCwgMCwgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VUX0VYVEVSTkFMX1ZBTFVFKTtcclxuICAgIHJ0RXZ0LnNldFZhbHVlKHZhbHVlKTtcclxuXHJcbiAgICBsZXQgYXJnc0xpc3Q6IEV4cFZhbFtdID0gbmV3IEFycmF5PEV4cFZhbD4oMSk7XHJcbiAgICBhcmdzTGlzdFswXSA9IG5ldyBFeHBWYWwoU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOLCBmYWxzZSwgcmVmcmVzaERpc3BsYXkgPyAnMScgOiAnMCcpO1xyXG4gICAgbGV0IGFyZ3MgPSBuZXcgQXJndW1lbnRzTGlzdChhcmdzTGlzdCk7XHJcbiAgICBydEV2dC5zZXRBcmdMaXN0KGFyZ3MpXHJcblxyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEFkZCBpbnRlcm5hbCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgR1VJIHF1ZXVlIChpbmNsdWRlcyB0aW1lciBldmVudHMpIHRvIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5saW5lIGluIGEgdGFibGUgY29udHJvbCA8L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aEN0cmxBbmRDb2RlQW5kTGluZShjdHJsOiBNZ0NvbnRyb2xCYXNlLCBjb2RlOiBudW1iZXIsIGxpbmU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwsIGxpbmUsIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQWRkIGludGVybmFsIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSBHVUkgcXVldWUgKGluY2x1ZGVzIHRpbWVyIGV2ZW50cykgdG8gdGhlIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+dGhlIGxpbmUgZm9yIG11bHRpbGluZSBjb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+Y29kZSBvZiBpbnRlcm5hbCBldmVudCA8L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aEN0cmxBbmRMaW5lQW5kQ29kZUFuZElzUHJvZHVjdENsaWNrKGN0cmw6IE1nQ29udHJvbEJhc2UsIGNvZGU6IG51bWJlciwgbGluZTogbnVtYmVyLCBpc1Byb2R1Y2VDbGljazogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwsIGxpbmUsIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICBydEV2dC5zZXRQcm9kdWNlQ2xpY2soaXNQcm9kdWNlQ2xpY2spO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEFkZCBpbnRlcm5hbCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgR1VJIHF1ZXVlIChpbmNsdWRlcyB0aW1lciBldmVudHMpIHRvIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpc3RcIj48L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aEN0cmxBbmRDb2RlQW5kTGlzdChjdHJsOiBNZ0NvbnRyb2xCYXNlLCBjb2RlOiBudW1iZXIsIGxpc3Q6IExpc3Q8TWdDb250cm9sQmFzZT4pOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsLCBsaXN0LCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBBZGQgaW50ZXJuYWwgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IEdVSSBxdWV1ZSB0byB0aGUgcXVldWUgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPnJlZmVyZW5jZSB0byB0aGUgdGFzayA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQgPC9wYXJhbT5cclxuICBhZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhUYXNrQW5kQ29kZSh0YXNrOiBJVGFzaywgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPFRhc2s+dGFzaywgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQWRkIGludGVybmFsIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSBHVUkgcXVldWUgdG8gdGhlIHF1ZXVlIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyYWlzZWRCeVwiPnJlbGV2YW50IG9ubHkgZm9yIG9ubGluZSAoZm9yIHdoaWNoIHN1YmZvcm0gYXJlIGhhbmRsZWQgYXMgb3JwaGFucyk8L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50VGFza0FuZENvZGVBbmRSYWlzZWRCeSh0YXNrOiBJVGFzaywgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aFRhc2tBbmRDb2RlKHRhc2ssIGNvZGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGZpcnN0IGV2ZW50IGZyb20gdGhlIHF1ZXVlIGFuZCByZW1vdmUgaXQgZnJvbSB0aGVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRFdmVudCgpOiBSdW5UaW1lRXZlbnQge1xyXG4gICAgcmV0dXJuIDxSdW5UaW1lRXZlbnQ+dGhpcy5fZXZlbnRzUXVldWUucG9sbCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9yY2VFeGl0KCk6IEZvcmNlRXhpdCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZm9yY2VFeGl0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRGb3JjZUV4aXQoZm9yY2VFeGl0OiBGb3JjZUV4aXQsIHRhc2s6IFRhc2spOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZvcmNlRXhpdCA9IGZvcmNlRXhpdDtcclxuICAgIHRoaXMuc2V0Rm9yY2VFeGl0VGFzayh0YXNrKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Rm9yY2VFeGl0VGFzaygpOiBUYXNrIHtcclxuICAgIHJldHVybiB0aGlzLl9mb3JjZUV4aXRUYXNrO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRGb3JjZUV4aXRUYXNrKHRhc2s6IFRhc2spOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZvcmNlRXhpdFRhc2sgPSB0YXNrO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogcmV0dXJucyB0cnVlIGlmIHRoZSBFdmVudHNNYW5hZ2VyIGlzIGN1cnJlbnRseSBoYW5kbGluZyBhIHVzZXIgZXZlbnQgd2l0aFxyXG4gICAqIEZvcmNlIEV4aXQgPSAnUHJlLVJlY29yZCBVcGRhdGUnXHJcbiAgICovXHJcbiAgaXNGb3JjZUV4aXRQcmVSZWNvcmRVcGRhdGUodGFzazogVGFza0Jhc2UpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ICYmIHRoaXMuZ2V0Rm9yY2VFeGl0KCkgPT09IEZvcmNlRXhpdC5QcmVSZWNvcmRVcGRhdGUgJiYgdGFzayA9PT0gdGhpcy5nZXRGb3JjZUV4aXRUYXNrKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEV4ZWN1dGUgQ2xpZW50Q29udGV4dEluYWN0aXZpdHkgVGltZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIEV4ZWN1dGVDbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHN0YXJ0VGltZSA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk7XHJcbiAgICBsZXQgY3VyclRpbWU7XHJcbiAgICAvLyBjb252ZXJ0IHRlbnRocyBvZiBzZWNvbmRzIHRvIG1pbGxpc2Vjb25kcy5cclxuICAgIGxldCBjbGllbnRDdHhJbmFjdGl2aXR5VGltZW91dCA9XHJcbiAgICAgIEVudmlyb25tZW50Lkluc3RhbmNlLmdldENsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZW91dCgpICogMTAwO1xyXG5cclxuICAgIEV2ZW50c01hbmFnZXIuY2xpZW50SW5hY3Rpdml0eVRpbWVyT04gPSB0cnVlO1xyXG4gICAgd2hpbGUgKEV2ZW50c01hbmFnZXIuY2xpZW50SW5hY3Rpdml0eVRpbWVyT04gKSB7XHJcbiAgICAgICAgIGF3YWl0IFRocmVhZC5TbGVlcCgxMDAwKTtcclxuICAgICAgICAgdmFyIHRpbWVMYXBzZWQgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpIC0gc3RhcnRUaW1lO1xyXG4gICAgICAgICBpZiAoRXZlbnRzTWFuYWdlci5jbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyQWJvcnRlZCB8fCB0aW1lTGFwc2VkID49IGNsaWVudEN0eEluYWN0aXZpdHlUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgIEV2ZW50c01hbmFnZXIuY2xpZW50SW5hY3Rpdml0eVRpbWVyT04gPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNob3cgb3IgaGlkZSB0aGUgc3Bpbm5lclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzaG93XCI+IDwvcGFyYW0+XHJcbiAgYXN5bmMgQ2hlY2tBbmRTaG93U3Bpbm5lcihzaG93OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPlxyXG4gIHtcclxuICAgIGxldCBzZW5kQ29tbWFuZCA9IGZhbHNlO1xyXG5cclxuICAgIC8vIElmIHRoZSBjdXJyZW50IGV2ZW50IGlzIG9mIGxvd2VzdCBwcmlvcml0eSwgaXQgaXMgYWN0dWFsbHkgc2FmZSB0byBvcGVuIHVzZXIgaW50ZXJhY3Rpb24uXHJcbiAgICAvLyBTbywgc3RvcCB0aGUgc3Bpbm5lci5cclxuICAgIGlmICh0aGlzLmdldExhc3RSdEV2ZW50KCkgIT09IG51bGwgJiYgdGhpcy5nZXRMYXN0UnRFdmVudCgpLmdldFByaW9yaXR5KCkgPT09IFByaW9yaXR5LkxPV0VTVClcclxuICAgICAgc2hvdyA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChzaG93ICE9IHRoaXMuaXNTcGlubmVyU2hvd24pIHtcclxuICAgICAgaWYgKHNob3cpIHtcclxuICAgICAgICAvLyBTaG93IHRoZSBzcGlubmVyIG9ubHkgaWYgdGhyZXNob2xkIGlzIHJlYWNoZWQuXHJcbiAgICAgICAgLy9Ub0RvOiBEZWZpbmUgYSBjb25zdCBmb3IgMTAwMC4gQWxzbyBtYWtlIGl0IGN1c3RvbWl6YWJsZSBmcm9tIGFuZ3VsYXIgYXBwXHJcbiAgICAgICAgaWYgKE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgLSB0aGlzLkdldEV2ZW50VGltZSgpID4gMTAwMCkge1xyXG4gICAgICAgICAgc2VuZENvbW1hbmQgPSB0cnVlO1xyXG4gICAgICAgICAgRXZlbnRzTWFuYWdlci5jbGllbnRCdXN5VGltZVN0YXJ0ID0gIE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBzZW5kQ29tbWFuZCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAoc2VuZENvbW1hbmQpIHtcclxuICAgICAgICBDb21tYW5kcy5hZGRTaG93U3Bpbm5lcihzaG93KTtcclxuICAgICAgICBDb21tYW5kcy5iZWdpbkludm9rZSgpO1xyXG4gICAgICAgIC8vIHJlbGVhc2UgdGhlIHRocmVhZCBzbyB0aGF0IGZyYW1ld29yayBjYW4gc2hvdy9oaWRlIHRoZSBzcGlubmVyXHJcbiAgICAgICAgYXdhaXQgVGhyZWFkLlNsZWVwKDUwKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc1NwaW5uZXJTaG93biA9IHNob3c7XHJcblxyXG4gICAgICAgIGlmKCF0aGlzLmlzU3Bpbm5lclNob3duKSB7XHJcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIHRpbWUgZm9yIHdoaWNoIGNsaWVudCB3YXMgYnVzeVxyXG4gICAgICAgICAgbGV0IHRvdGFsQ2xpZW50QnVzeVRpbWUgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpIC0gRXZlbnRzTWFuYWdlci5jbGllbnRCdXN5VGltZVN0YXJ0O1xyXG4gICAgICAgICAgdGhpcy5TcGlubmVyU3RvcHBlZC5uZXh0KHRvdGFsQ2xpZW50QnVzeVRpbWUpO1xyXG4gICAgICAgICAgRXZlbnRzTWFuYWdlci5jbGllbnRCdXN5VGltZVN0YXJ0ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBNYWluIGV2ZW50cyBsb29wLCBydW5zIGluIHdvcmtlciB0aHJlYWQgZm9yIG1haW4gd2luZG93IGFuZCBmb3IgZXZlcnlcclxuICAvLy8gICBtb2RhbCB3aW5kb3cgUmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIGV2ZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ0RhdGFcIj4gPC9wYXJhbT5cclxuICBhc3luYyBFdmVudHNMb29wKG1nRGF0YTogTUdEYXRhKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgc2F2ZWRBbGxvd0V2ZW50czogRXZlbnRzQWxsb3dlZFR5cGUgPSB0aGlzLmdldEFsbG93RXZlbnRzKCk7XHJcblxyXG4gICAgdGhpcy5zZXRBbGxvd0V2ZW50cyhFdmVudHNBbGxvd2VkVHlwZS5BTEwpO1xyXG5cclxuICAgIHRoaXMucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuXHJcbiAgICB3aGlsZSghbWdEYXRhLklzQWJvcnRpbmcpXHJcbiAgICB7XHJcbiAgICAgIC8vIEhpZGUgdGhlIHNwaW5uZXIgYmVmb3JlIG1vdmluZyB0byBpZGxlXHJcbiAgICAgIGF3YWl0IHRoaXMuQ2hlY2tBbmRTaG93U3Bpbm5lcihmYWxzZSk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLl9ldmVudHNRdWV1ZS53YWl0Rm9yRWxlbWVudCgpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50cyhtZ0RhdGEsIDApO1xyXG5cclxuICAgIGlmICghbWdEYXRhLklzQWJvcnRpbmcpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja1BhcmthYmlsaXR5KCk7XHJcblxyXG4gIH1cclxuXHJcbiAgICB0aGlzLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgIHRoaXMuc2V0QWxsb3dFdmVudHMoc2F2ZWRBbGxvd0V2ZW50cyk7XHJcbiAgICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBOb24gaW50ZXJhY3RpdmUgZXZlbnRzIGxvb3AsIHJ1bnMgaW4gd29ya2VyIHRocmVhZCBmb3Igbm9uIGludGVyYWN0aXZlIHRhc2tzXHJcbiAgLy8vICAgUmVzcG9uc2libGUgZm9yIGN5Y2xpbmcgZm9yd2FyZCBvbiByZWNvcmRzIGFuZCBoYW5kbGluZyBldmVudHMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nRGF0YVwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgTm9uSW50ZXJhY3RpdmVFdmVudHNMb29wKG1nRGF0YTogTUdEYXRhLCB0YXNrQmFzZTogVGFza0Jhc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+dGFza0Jhc2U7XHJcbiAgICBsZXQgc2F2ZWRBbGxvd0V2ZW50czogRXZlbnRzQWxsb3dlZFR5cGUgPSB0aGlzLmdldEFsbG93RXZlbnRzKCk7XHJcblxyXG4gICAgdGhpcy5zZXROb25JbnRlcmFjdGl2ZUFsbG93RXZlbnRzKGF3YWl0IHRhc2suaXNBbGxvd0V2ZW50cygpKTtcclxuXHJcbiAgICB0aGlzLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcblxyXG4gICAgd2hpbGUgKCFtZ0RhdGEuSXNBYm9ydGluZykge1xyXG4gICAgICBpZiAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DWUNMRV9ORVhUX0RFTEVURV9SRUMpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NZQ0xFX05FWFRfUkVDKTtcclxuXHJcbiAgICAgIGF3YWl0IFRocmVhZC5TbGVlcCgxMCk7XHJcblxyXG4gICAgICAvLyBwb2xsIG9ubHkgMSBldmVudC5cclxuICAgICAgaWYgKCFtZ0RhdGEuSXNBYm9ydGluZyAmJiBhd2FpdCB0YXNrLmlzQWxsb3dFdmVudHMoKSlcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50cyhtZ0RhdGEsIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucG9wTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgdGhpcy5zZXRBbGxvd0V2ZW50cyhzYXZlZEFsbG93RXZlbnRzKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGhhbmRsZUV2ZW50cyhiYXNlTWdEYXRhOiBNR0RhdGEsIGV2ZW50c1RvSGFuZGxlQ250OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IDtcclxuICBhc3luYyBoYW5kbGVFdmVudHMoaGFuZGxlcnNUYWI6IEhhbmRsZXJzVGFibGUsIHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IDtcclxuICBhc3luYyBoYW5kbGVFdmVudHMoYmFzZU1nRGF0YU9ySGFuZGxlcnNUYWI6IGFueSwgZXZlbnRzVG9IYW5kbGVDbnRPclJ0RXZ0OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICgoYmFzZU1nRGF0YU9ySGFuZGxlcnNUYWIgPT09IG51bGwgfHwgYmFzZU1nRGF0YU9ySGFuZGxlcnNUYWIgaW5zdGFuY2VvZiBNR0RhdGEpICYmIChldmVudHNUb0hhbmRsZUNudE9yUnRFdnQgPT09IG51bGwgfHwgZXZlbnRzVG9IYW5kbGVDbnRPclJ0RXZ0LmNvbnN0cnVjdG9yID09PSBOdW1iZXIpKSB7XHJcbiAgICAgYXdhaXQgIHRoaXMuaGFuZGxlRXZlbnRzXzAoYmFzZU1nRGF0YU9ySGFuZGxlcnNUYWIsIGV2ZW50c1RvSGFuZGxlQ250T3JSdEV2dCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnRzXzEoYmFzZU1nRGF0YU9ySGFuZGxlcnNUYWIsIGV2ZW50c1RvSGFuZGxlQ250T3JSdEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGFuZCByZW1vdmUgZXZlbnRzIGZyb20gdGhlIHF1ZXVlIGFuZCBoYW5kbGUgdGhlbSBvbmUgYnkgb25lIHRpbGwgdGhlIHF1ZXVlIGlzIGVtcHR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJhc2VNZ0RhdGFcIj4gbWdkYXRhIG9mIHRoZSB3aW5kb3cgdGhhdCBvcGVuZWRlZCB0aGF0IGhhYmRsZSBldmVudDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJFdmVudHNUb0hhbmRsZUNudFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVFdmVudHNfMChiYXNlTWdEYXRhOiBNR0RhdGEsIGV2ZW50c1RvSGFuZGxlQ250OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gbnVsbDtcclxuICAgIGxldCBkZWx0YTogbnVtYmVyID0gMDtcclxuICAgIGxldCBldmVudHNQb2xsZWRDbnQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuXHJcbiAgICAvLyBnZXQgYW5kIHJlbW92ZSBldmVudHMgZnJvbSB0aGUgcXVldWUgdGlsbCBpdHMgZW1wdHlcclxuICAgIHdoaWxlICghdGhpcy5fZXZlbnRzUXVldWUuaXNFbXB0eSgpICYmICF0aGlzLl9zdG9wRXhlY3V0aW9uICYmIChldmVudHNUb0hhbmRsZUNudCA9PT0gMCB8fCBldmVudHNQb2xsZWRDbnQgPCBldmVudHNUb0hhbmRsZUNudCkpIHtcclxuICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSB0aGlzLmdldEV2ZW50KCk7XHJcbiAgICAgIGlmIChydEV2dCAhPT0gbnVsbCAmJiBydEV2dC5pc0d1aVRyaWdnZXJlZEV2ZW50KCkpIHtcclxuICAgICAgICBkZWx0YSA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk7XHJcbiAgICAgICAgdGhpcy5fY3VycktiZEl0ZW0gPSBudWxsO1xyXG5cclxuICAgICAgICBsZXQgYmxvY2tlZEJ5TW9kYWxXaW5kb3c6IGJvb2xlYW4gPSBydEV2dC5pc0Jsb2NrZWRCeU1vZGFsV2luZG93KGJhc2VNZ0RhdGEpO1xyXG4gICAgICAgIGlmIChibG9ja2VkQnlNb2RhbFdpbmRvdyAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RJTUVSKSAvLyBRQ1IgIzcyNjE5OCwgZXZlbnRzIGZyb20gLk5FVCBvYmplY3RzIHdoaWNoIGFyZSBub3Qgb24gZm9ybVxyXG4gICAgICAgIC8vIHNob3VsZCBiZSBoYW5kbGVkIG9uIHBhcmVudCBvZiBtb2RhbCB3aW5kb3cgYWxzb1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWRsZSB0aW1lciwgdGltZXIgZXZlbnRzIGFuZCBlbmFibGUvZGlzYWJsZSBldmVudHMgc2hvdWxkIG5vdCBjaGFuZ2UgdGhlIGN1cnJlbnQgd2luZG93LlxyXG4gICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB0aGUgY3VycmVudCB3aW5kb3cgZGV0ZXJtaW5lcyB0aGUgY3VycmVudCB0YXNrIGFuZCBjaGFuZ2luZyB0aGUgdGFza1xyXG4gICAgICAgIC8vIGNhdXNlcyBzb21lIHRhc2stc2NvcGVkIGV2ZW50cyB0byBydW4gb24gc3ViLXRhc2tzIGFzIHdlbGwuXHJcbiAgICAgICAgaWYgKCFydEV2dC5pc0lkbGVUaW1lcigpICYmICFibG9ja2VkQnlNb2RhbFdpbmRvdyAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VOQUJMRV9FVkVOVFMgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ESVNBQkxFX0VWRU5UUyAmJiBydEV2dC5nZXRUYXNrKCkgIT09IG51bGwgJiYgIXJ0RXZ0LmdldFRhc2soKS5nZXRNR0RhdGEoKS5Jc0Fib3J0aW5nKSB7XHJcbiAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9IHJ0RXZ0LmdldFRhc2soKS5nZXRNR0RhdGEoKS5HZXRJZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgY3Vyck1nZDogTUdEYXRhID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRDdXJyTUdEYXRhKCk7XHJcbiAgICAgIGlmIChjdXJyTWdkICE9PSBudWxsKSB7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJNZ2QgIT09IG51bGwgJiYgY3Vyck1nZC5Jc0Fib3J0aW5nKSB7XHJcbiAgICAgICAgICBjdXJyTWdkID0gY3Vyck1nZC5nZXRQYXJlbnRNR2RhdGEoKTtcclxuICAgICAgICAgIGlmIChjdXJyTWdkICE9PSBudWxsKVxyXG4gICAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TWdEYXRhSWR4KGN1cnJNZ2QpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvKiBRQ1JzICM3NzcyMTcgJiAjOTQyOTY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgIC8qIEl0IG1pZ2h0IGhhcHBlbiB0aGF0IHdlIGhhdmUgcmVtb3ZlZCB0aGUgTUdEYXRhICAgICovXHJcbiAgICAgICAgLyogZnJvbSB0aGUgTUdUYWJsZSBpbiBNYW5hZ2VyLkNsb3NlRXZlbnQoKS4gICovXHJcbiAgICAgICAgLyogSXQgd2FzIGRvbmUgZm9yIGZpeGluZyBRQ1IjIDI5NjI3NyByZWxhdGluZyB0byBtZW0gKi9cclxuICAgICAgICAvKiBsZWFrcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgIC8qIEluIHRoYXQgY2FzZSwgbWdkIHdvdWxkIGJlIG51bGwgaGVyZS4gICAgICAgICAgICAgICovXHJcbiAgICAgICAgLyogSW4gc3VjaCBhIHNjZW5hcmlvLCB0YWtlIHRoZSBwYXJlbnQgbWdkIGZyb20gdGhlICAgKi9cclxuICAgICAgICAvKiByZWxhdGVkIHRhc2sgYW5kIGNvbnRpbnVlIHByb2Nlc3NpbmcgdGhlIGV2ZW50cy4gICAqL1xyXG4gICAgICAgIHRhc2sgPSA8VGFzaz5ydEV2dC5nZXRUYXNrKCk7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJNZ2QgPT09IG51bGwgJiYgdGFzayAhPT0gbnVsbCAmJiB0YXNrLmdldFBhcmVudCgpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICB0YXNrID0gPFRhc2s+dGFzay5nZXRQYXJlbnQoKTtcclxuICAgICAgICAgIGN1cnJNZ2QgPSB0YXNrLmdldE1HRGF0YSgpO1xyXG4gICAgICAgICAgaWYgKGN1cnJNZ2QuSXNBYm9ydGluZylcclxuICAgICAgICAgICAgY3Vyck1nZCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgaWYgKGN1cnJNZ2QgIT09IG51bGwpXHJcbiAgICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRNZ0RhdGFJZHgoY3Vyck1nZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChjdXJyTWdkID09PSBudWxsKVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgaWYgKHJ0RXZ0LmdldFRhc2soKSA9PT0gbnVsbCkge1xyXG4gICAgICAgIHRhc2sgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcbiAgICAgICAgd2hpbGUgKHRhc2sgIT09IG51bGwgJiYgKHRhc2suaXNBYm9ydGluZygpIHx8IHRhc2suSW5FbmRUYXNrKSlcclxuICAgICAgICAgIHRhc2sgPSA8VGFzaz50YXNrLmdldFBhcmVudCgpO1xyXG5cclxuICAgICAgICBpZiAodGFzayAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgcnRFdnQuc2V0Q3RybCg8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSk7XHJcbiAgICAgICAgICBydEV2dC5zZXRUYXNrKHRhc2spO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgdGFzayA9IDxUYXNrPnJ0RXZ0LmdldFRhc2soKTtcclxuXHJcbiAgICAgIGlmICh0YXNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBHVUlNYW5hZ2VyLkluc3RhbmNlLmV4ZWNHdWlDb21tYW5kUXVldWUoKTtcclxuICAgICAgdGhpcy5fY3VyckN0cmwgPSBudWxsOyAvLyBkZWxldGUgY3VycmVudCBwcm9jZXNzZWQgY29udHJvbFxyXG5cclxuICAgICAgaWYgKHRhc2sgIT09IG51bGwpXHJcbiAgICAgICAgYXdhaXQgVGFzay5Db21tYW5kc1Byb2Nlc3Nvci5TZW5kTW9uaXRvck9ubHkoKTtcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgbGV0IG1haW5Qcm9nOiBUYXNrID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KDApO1xyXG4gICAgICAgIGF3YWl0IFRhc2suQ29tbWFuZHNQcm9jZXNzb3IuU2VuZE1vbml0b3JPbmx5KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChydEV2dCAhPT0gbnVsbCAmJiBydEV2dC5pc0d1aVRyaWdnZXJlZEV2ZW50KCkpIHtcclxuICAgICAgICAvLyBsb2dnaW5nIGZvciBwZXJmb3JtYW5jZVxyXG4gICAgICAgIGlmIChkZWx0YSA+IDApIHtcclxuICAgICAgICAgIGRlbHRhID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKSAtIGRlbHRhO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gYWR2YW5jZSBFdmVudHNQb2xsZWQgb25seSBpZiB0aGUgZXZlbnQgaXMgaW50ZXJuYWwuIG90aGVyd2lzZSBpbnRlcm5hbHMgdG8gYmUgZXhlY3V0ZWQgd2lsbCBiZSBuZXZlciByZWFjaGVkIGJ5IG5vbiBpbnRlcmFjdGl2ZSB0YXNrcy5cclxuICAgICAgaWYgKGV2ZW50c1RvSGFuZGxlQ250ID4gMCAmJiBydEV2dCAhPT0gbnVsbCAmJiBydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgcnRFdnQuSW50ZXJuYWxFdmVudCA8IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UT1RfQ05UKVxyXG4gICAgICAgIGV2ZW50c1BvbGxlZENudCsrO1xyXG4gICAgfSAvLyB3aGlsZSAoIV9ldmVudHNRdWV1ZS5pc0VtcHR5KCkgLi4uXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZSBzdG9wIGV4ZWN1dGlvbiB3aGlsZSBleGVjdXRpbmcgYW55IGhhbmRsZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVTdG9wRXhlY3V0aW9uKHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBzdG9wOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgIHJldHVybiBzdG9wO1xyXG5cclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+cnRFdnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGN1cnJDdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnJ0RXZ0LkNvbnRyb2w7XHJcbiAgICBsZXQgbGFzdFBhcmtlZEN0cmw6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgIGxldCBlbmRUYXNrRHVlVG9WZXJpZnlFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCkge1xyXG4gICAgICBzd2l0Y2ggKHJ0RXZ0LmdldEludGVybmFsQ29kZSgpKSB7XHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVg6XHJcbiAgICAgICAgICBlbmRUYXNrRHVlVG9WZXJpZnlFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWDpcclxuICAgICAgICAgIC8vIEFuIGVycm9yIGluIHRoZSByZWNvcmQgcHJlZml4IHNlbmRzIHVzIHJpZ2h0IGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSByZWNvcmQgcHJlZml4LlxyXG4gICAgICAgICAgLy8gSXQgbWlnaHQgY3JlYXRlIGFuIGVuZGxlc3MgbG9vcCBidXQgaXQgaXMgT0sgdG8gZG8gc28uIEl0IGlzIGEgZGV2ZWxvcGVyIGJ1Zy5cclxuICAgICAgICAgIGVuZFRhc2tEdWVUb1ZlcmlmeUVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYOlxyXG4gICAgICAgICAgLy8gaXQgd2lsbCBiZSBoYW5kbGVkIGluIGNvbW1vbmhhbmRsZXJhZnRlclxyXG4gICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChudWxsKTtcclxuICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwoPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYOlxyXG4gICAgICAgICAgLy8gRXJyb3IgbWlnaHQgaGF2ZSBvY2N1cnJlZCBpbiBDUC5cclxuICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcbiAgICAgICAgICB0YXNrLkluQ3RybFByZWZpeCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIGlmIChsYXN0UGFya2VkQ3RybCA9PT0gbnVsbClcclxuICAgICAgICAgIC8vIG9ubHkgZm9yIHRoZSBmaXJzdCB0aW1lXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRhc2suc2V0Q3VyckZpZWxkKG51bGwpO1xyXG5cclxuICAgICAgICAgICAgLy8gcmVzZXQgdGhlIHN0b3AgZXhlY3V0aW9uIGN0cmxcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChudWxsKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChjdXJyQ3RybCk7XHJcblxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHModGFzayk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBDUCBnb3Qgc3RvcCBleGVjdXRpb24gd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb25zIGluIHRoaXMgaGFuZGxlciBhbmQgaXMgcGFya2FibGUuXHJcbiAgICAgICAgICAgIC8vIHdlIG1vdmUgdG8gdGhlIExhc3RQYXJrYWJsZSBjb250cm9sXHJcblxyXG4gICAgICAgICAgICB0YXNrLnNldEN1cnJGaWVsZChsYXN0UGFya2VkQ3RybC5nZXRGaWVsZCgpKTtcclxuXHJcbiAgICAgICAgICAgIGF3YWl0IEZvY3VzTWFuYWdlci5TZXRGb2N1cyhsYXN0UGFya2VkQ3RybCwgLTEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYOlxyXG4gICAgICAgICAgLy8gSXQgbXVzdCBiZSBzZXQgdG8gZmFsc2Ugc28gdGhhdCBuZXh0IHRpbWUgZm9yIGZhc3QgbW9kZSBDUyBtdXN0IGJlIGV4ZWN1dGVkLlxyXG4gICAgICAgICAgY3VyckN0cmwuc2V0SW5Db250cm9sU3VmZml4KGZhbHNlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgfVxyXG4gICAgICBpZiAoZW5kVGFza0R1ZVRvVmVyaWZ5RXJyb3IpIHtcclxuICAgICAgICBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIHN0b3AgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RvcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0YWtlIGNhcmUgb2YgXCJGb3JjZSBFeGl0XCIgYmVmb3JlIHRoZSBoYW5kbGVyIGV4ZWN1dGUgaXRzIG9wZXJhdGlvbnMgcmV0dXJucyB0cnVlXHJcbiAgLy8vICAgaWYgdGhlIGZvcmNlIGV4aXQgd2FzIGhhbmRsZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZlbnRcIj50aGUgZXZlbnQgb2YgdGhlIGhhbmRsZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+dGhlIHJ1bi10aW1lIGV2ZW50XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVGb3JjZUV4aXRCZWZvcmUoZXZ0OiBFdmVudCwgcnRFdnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGZvcmNlRXhpdDogRm9yY2VFeGl0ID0gZXZ0LlVzZXJFdnQuRm9yY2VFeGl0O1xyXG4gICAgbGV0IGlzTmV3UmVjOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgb2xkSWR4OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIFRPRE86IGNoZWNrIHRoZSBlZmZlY3Qgb2YgcmVtb3ZpbmcgZm9yY2VFeGl0ID09PSA8Rm9yY2VFeGl0PjBcclxuICAgIGlmIChmb3JjZUV4aXQgPT09IEZvcmNlRXhpdC5Ob25lIHx8IHJ0RXZ0LmlzSW1tZWRpYXRlKCkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQgPSB0cnVlO1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ydEV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgb2xkUmVjOiBSZWNvcmQgPSAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgIGlmIChvbGRSZWMgIT09IG51bGwgJiYgb2xkUmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydCAmJiBvbGRSZWMuaXNOZXdSZWMoKSkge1xyXG4gICAgICBpc05ld1JlYyA9IHRydWU7XHJcbiAgICAgIG9sZElkeCA9IG9sZFJlYy5nZXRJZCgpO1xyXG4gICAgfVxyXG4gICAgaWYgKGZvcmNlRXhpdCAhPT0gRm9yY2VFeGl0LkVkaXRpbmcgJiYgdGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKSB7XHJcbiAgICAgIGxldCBjdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgaWYgKGN0cmwgIT09IG51bGwpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTaG91bGQgd2UgZXhpdCB0aGUgcmVjb3JkP1xyXG4gICAgaWYgKChmb3JjZUV4aXQgPT09IEZvcmNlRXhpdC5QcmVSZWNvcmRVcGRhdGUgfHwgZm9yY2VFeGl0ID09PSBGb3JjZUV4aXQuUG9zdFJlY29yZFVwZGF0ZSkgJiYgdGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICBpZiAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmICF0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgIGxldCBjdXJyUmVjOiBSZWNvcmQgPSAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgICAgLy8gSWYgd2UgZmFpbGVkIGV4aXRpbmcgYSBuZXdseSBjcmVhdGVkIHJlY29yZCAtIHJlc3RvcmUgaW5zZXJ0IG1vZGUgb2YgdGhlIHJlY29yZFxyXG4gICAgICBpZiAoY3VyclJlYyAhPT0gbnVsbCAmJiB0aGlzLl9zdG9wRXhlY3V0aW9uICYmIGlzTmV3UmVjICYmIG9sZElkeCA9PT0gY3VyclJlYy5nZXRJZCgpICYmIHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICAgIC8vIHJlc3RvcmUgaW5zZXJ0IG1vZGUgb2YgdGhlIHJlY29yZFxyXG4gICAgICAgIGN1cnJSZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgY3VyclJlYy5yZXN0YXJ0KERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoZm9yY2VFeGl0ID09PSBGb3JjZUV4aXQuUG9zdFJlY29yZFVwZGF0ZSAmJiAhdGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBRQ1IgIzMwMzc2MiAtIGFkZGl0aW9uYWwgc3VwcG9ydCBmb3IgZm9yY2VFeGl0ID0gZWRpdGluZ1xyXG4gICAgaWYgKGZvcmNlRXhpdCA9PT0gRm9yY2VFeGl0LkVkaXRpbmcpIHtcclxuICAgICAgbGV0IGV2dEN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+cnRFdnQuQ29udHJvbDtcclxuXHJcbiAgICAgIGlmIChldnRDdHJsICE9PSBudWxsICYmIGV2dEN0cmwuZ2V0RmllbGQoKSAhPT0gbnVsbCkge1xyXG4gICAgICAgIGxldCBjdHJsVmFsOiBzdHJpbmcgPSBNYW5hZ2VyLkdldEN0cmxWYWwoZXZ0Q3RybCk7XHJcbiAgICAgICAgbGV0IGV2dEN0cmx2YWw6IHN0cmluZyA9IGV2dEN0cmwuVmFsdWU7XHJcbiAgICAgICAgLy8gdGVzdCB0aGUgbmV3IGNvbnRyb2wgdmFsdWVcclxuICAgICAgICBhd2FpdCBldnRDdHJsLnZhbGlkYXRlQW5kU2V0VmFsdWUoY3RybFZhbCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRha2UgY2FyZSBvZiBcIkZvcmNlIEV4aXRcIiBhZnRlciBoYW5kbGluZyB0aGUgZXZlbnQgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj50aGUgcnVuLXRpbWUgZXZlbnQgPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUZvcmNlRXhpdEFmdGVyKHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBmb3JjZUV4aXQ6IEZvcmNlRXhpdCA9IHJ0RXZ0LlVzZXJFdnQuRm9yY2VFeGl0O1xyXG5cclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+cnRFdnQuZ2V0VGFzaygpO1xyXG5cclxuICAgIC8vIFFDUiM3NzYyOTU6IGZvciBwcmUgcmVjb3JkIHVwZGF0ZSwgY29tbWl0IHRoZSByZWNvcmQgYWZ0ZXIgaGFuZGxlcidzIGV4ZWN1dGlvbi5cclxuICAgIGlmIChmb3JjZUV4aXQgPT09IEZvcmNlRXhpdC5QcmVSZWNvcmRVcGRhdGUpIHtcclxuICAgICAgYXdhaXQgdGhpcy5jb21taXRSZWNvcmQodGFzaywgdHJ1ZSk7XHJcbiAgICAgIGlmICghdGFzay50cmFuc2FjdGlvbkZhaWxlZChDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSAmJiAhdGFzay5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRvIGV2YWx1YXRlIHRoZSBlbmQgY29uZGl0aW9uIGFmdGVyIHRoZSByZWNvcmQgc3VmZml4XHJcbiAgICAgICAgaWYgKGF3YWl0IHRhc2suZXZhbEVuZENvbmQoQ29uc3RJbnRlcmZhY2UuRU5EX0NPTkRfRVZBTF9BRlRFUikpXHJcbiAgICAgICAgICBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEZvciBwb3N0LXJlY29yZCB0eXBlIHdlIGFscmVhZHkgZGlkIHJlYy1wcmVmaXggYW5kIGN0cmwgcHJlZml4IGluIHRoZSBoYW5kbGVGb3JjZUV4aXRCZWZvcmVcclxuICAgIGlmIChmb3JjZUV4aXQgIT09IEZvcmNlRXhpdC5Qb3N0UmVjb3JkVXBkYXRlKSB7XHJcbiAgICAgIHRhc2sgPSA8VGFzaz5ydEV2dC5nZXRUYXNrKCk7XHJcbiAgICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgfVxyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgIGlmIChjdHJsICE9PSBudWxsICYmIGZvcmNlRXhpdCAhPT0gRm9yY2VFeGl0LkVkaXRpbmcpIHtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBRQ1IgODAxODczIC0gdXBkYXRlIHRoZSBkaXNwbGF5IGFmdGVyIGhhbmRsZXIgb2YgZm9yY2UgZXhpdCBlZGl0aW5nXHJcbiAgICBpZiAoZm9yY2VFeGl0ID09PSBGb3JjZUV4aXQuRWRpdGluZykge1xyXG4gICAgICBsZXQgZXZ0Q3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5ydEV2dC5Db250cm9sO1xyXG4gICAgICAvLyBpZiB0aGVyZSBpcyBhIGNvbnRyb2wgdGhhdCBpcyBhdHRhY2hlZCB0byBhIGZpZWxkXHJcbiAgICAgIGlmIChldnRDdHJsICE9PSBudWxsICYmIGV2dEN0cmwuZ2V0RmllbGQoKSAhPT0gbnVsbClcclxuICAgICAgICBhd2FpdCAoPEZpZWxkPmV2dEN0cmwuZ2V0RmllbGQoKSkudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGEgc3BlY2lhbCByb3V0aW5lIHRvIGhhbmRsZSBkYXRhIGFuZCB0aW1lciBldmVudHNcclxuICAvLy8gICBpdCByZWNlaXZlcyBhIEhhbmRsZXJzVGFibGUgYW5kIGV4ZWN1dGUgdGhlbSBvbmUgYnkgb25lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImhhbmRsZXJzVGFiXCI+dGhlIGhhbmRsZXJzIHRhYmxlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+YSByZWZlcmVubmNlIHRvIHRoZSB0aW1lciBydW50aW1lIGV2ZW50IC0gZm9yIGV4cHJlc3Npb24gZXZlbnRzIGl0IG11c3QgYmUgbnVsbDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVFdmVudHNfMShoYW5kbGVyc1RhYjogSGFuZGxlcnNUYWJsZSwgcnRFdnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5wdXNoUnRFdmVudChydEV2dCk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBoYW5kbGVyc1RhYi5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICAgIGxldCBoYW5kbGVyOiBFdmVudEhhbmRsZXIgPSBoYW5kbGVyc1RhYi5nZXRIYW5kbGVyKGkpO1xyXG4gICAgICAgIC8vIHRoZSBydEV2dCBpcyB1c2VkIHRvIHBhc3MgdGhlIGN0cmwsIHRoZXJlZm9yIGl0IG11c3QgYmUgdmFsaWQgKG5vdCBudWxsKVxyXG4gICAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfRVhQUkVTU0lPTiB8fCBoYW5kbGVyLmlzU3BlY2lmaWNIYW5kbGVyT2YocnRFdnQpIHx8IGhhbmRsZXIuaXNOb25TcGVjaWZpY0hhbmRsZXJPZihydEV2dCkgfHwgaGFuZGxlci5pc0dsb2JhbEhhbmRsZXJPZihydEV2dCkpIHtcclxuICAgICAgICAgIGF3YWl0IGhhbmRsZXIuZXhlY3V0ZShydEV2dCwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMucG9wUnRFdmVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRha2VzIGNhcmUgb2Yga2V5ZG93biBFdmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+dGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbCBwcmVzc2VkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImtiZEl0ZW1cIj5rZXlib3JkIGl0ZW08L3BhcmFtPlxyXG4gcHJpdmF0ZSBhc3luYyBoYW5kbGVLZXlEb3duKHRhc2s6IFRhc2ssIGN0cmw6IE1nQ29udHJvbCwgZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBrYmRJdGVtOiBLZXlib2FyZEl0ZW0gPSBldnQuZ2V0S2JkSXRtQWx3YXlzKCk7XHJcbiAgICBsZXQga2V5Q29kZTogbnVtYmVyID0ga2JkSXRlbS5nZXRLZXlDb2RlKCk7XHJcbiAgICBsZXQgbW9kaWZpZXI6IE1vZGlmaWVycyA9IGtiZEl0ZW0uZ2V0TW9kaWZpZXIoKTtcclxuICAgIHRoaXMuX2N1cnJLYmRJdGVtID0ga2JkSXRlbTtcclxuXHJcbiAgICAvLyBJZiBrZXlib2FyZCBidWZmZXJpbmcgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgZXZlbnQsIHdlIG5lZWQgdG8gZmluZCB0aGUgcmlnaHQgY29udHJvbCB0byByZWNlaXZlXHJcbiAgICAvLyB0aGlzIGV2ZW50XHJcbiAgICBpZiAoZXZ0Lklnbm9yZVNwZWNpZmllZENvbnRyb2wpIHtcclxuICAgICAgY3RybCA9IHRoaXMuZ2V0Q3VyckN0cmwoKTtcclxuICAgICAgdGFzayA9ICgoKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSBpbnN0YW5jZW9mIFRhc2spID8gPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpIDogbnVsbCkpO1xyXG4gICAgICAvLyBUaGUgY29udHJvbCByZWNlaXZpbmcga2V5cyBmcm9tIGtleWJvYXJkIGJ1ZmZlcmluZyBtdXN0IGJlIGEgdGV4dGJveFxyXG4gICAgICBpZiAoY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9URVhUKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIlN0YXJ0IGhhbmRsaW5nIEtFWURPV04gZXZlbnQuIEtleSBjb2RlOiBcIiArIGtleUNvZGUpO1xyXG5cclxuICAgIHRyeSB7XHJcblxyXG4gICAgICAvLyBET1dOIG9yIFVQIGludm9rZWQgb24gYSBTRUxFQ1QvUkFESU8gY29udHJvbFxyXG4gICAgICBpZiAodGhpcy5fY3VycktiZEl0ZW0uZXF1YWxzKHRoaXMuS0JJX0RPV04pIHx8IHRoaXMuX2N1cnJLYmRJdGVtLmVxdWFscyh0aGlzLktCSV9VUCkpIHtcclxuICAgICAgICBpZiAoY3RybCAhPT0gbnVsbCAmJiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8pKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzaywgY3RybCk7XHJcbiAgICAgIHJ0RXZ0LnNldFN5c3RlbSh0aGlzLl9jdXJyS2JkSXRlbSk7XHJcbiAgICAgIHJ0RXZ0LnNldEVkaXRQYXJtcyhldnQuZ2V0U3RhcnRTZWxlY3Rpb24oKSwgZXZ0LmdldEVuZFNlbGVjdGlvbigpLCBldnQuZ2V0VmFsdWUoKSk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICBsZXQgcmV0dXJuVG9DdHJsOiBNZ0NvbnRyb2wgPSBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsO1xyXG4gICAgICAgICAgaWYgKHJldHVyblRvQ3RybCAhPT0gbnVsbCAmJiBNZ0NvbnRyb2wudmFsaWRSZXR1cm5Ub0N0cmwoKSlcclxuICAgICAgICAgICAgcmV0dXJuVG9DdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuc2V0TGFzdFBhcmtlZEN0cmwocmV0dXJuVG9DdHJsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbGV0IG1nZDogTUdEYXRhID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRDdXJyTUdEYXRhKCk7XHJcbiAgICAgIC8vIGNoZWNrIGlmIHRoZSBNR0RhdGEgaXMgc3RpbGwgYWxpdmUgYWZ0ZXIgaGFuZGxpbmcgdGhlIGV2ZW50cyBhYm92ZVxyXG4gICAgICBpZiAobWdkICE9PSBudWxsICYmICFtZ2QuSXNBYm9ydGluZylcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV4cHJlc3Npb25IYW5kbGVycygpO1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIkVuZCBoYW5kbGluZyBLRVlET1dOIGV2ZW50LiBLZXkgY29kZTogXCIgKyBrZXlDb2RlKTtcclxuICAgICAgLy8gaWYgYSBrZXkgd2FzIHByZXNzZWQgb24gdGFibGUgY2hpbGQsIG1ha2Ugc3VyZSB0aGF0IGlzIGlzIHZpc2libGVcclxuICAgICAgaWYgKGN0cmwgIT09IG51bGwgJiYgY3RybC5Jc1JlcGVhdGFibGUgJiYgY3RybCA9PT0gTWdDb250cm9sLlJldHVyblRvQ3RybCkge1xyXG4gICAgICAgIGF3YWl0ICg8TWdGb3JtPmN0cmwuZ2V0Rm9ybSgpKS5icmluZ1JlY29yZFRvUGFnZSgpO1xyXG4gICAgICB9XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkhhbmRsZSBTZWxlY3Rpb24gRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+bGluZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWx1ZVwiPnZhbHVlPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVNlbGVjdGlvbihjdHJsOiBNZ0NvbnRyb2wsIGxpbmU6IG51bWJlciwgdmFsOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQiB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT01CTyB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJU1QpIHtcclxuICAgICAgbGV0IGNoZWNrRm9jdXM6IGJvb2xlYW4gPSAoY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUIgJiYgY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWCk7XHJcbiAgICAgIGxldCBhbGxvd1NlbGVjdGlvbjogYm9vbGVhbiA9IChjaGVja0ZvY3VzID8gKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRMYXN0UGFya2VkQ3RybCgpID09PSBjdHJsKSA6IHRydWUpO1xyXG5cclxuICAgICAgaWYgKCFhbGxvd1NlbGVjdGlvbiB8fCAhY3RybC5pc01vZGlmaWFibGUoKSB8fCAhYXdhaXQgY3RybC5Jc1BhcmthYmxlKCkpXHJcbiAgICAgICAgYXdhaXQgY3RybC5yZXN0b3JlT2xkVmFsdWUoKTtcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKGN0cmwuaXNDaG9pY2VDb250cm9sKCkpXHJcbiAgICAgICAgICBDb21tYW5kcy5zZXRHZXRTdWdnZXN0ZWRWYWx1ZU9mQ2hvaWNlQ29udHJvbE9uVGFnRGF0YShjdHJsLCBjdHJsLklzUmVwZWF0YWJsZSA/IGxpbmUgOiAwLCB0cnVlKTtcclxuXHJcbiAgICAgICAgaWYgKGN0cmwuaXNEaWZmZXJlbnRWYWx1ZSh2YWwsIGN0cmwuSXNOdWxsLCB0cnVlKSkge1xyXG4gICAgICAgICAgLy8gIzkzMTU0NSAtIHZhciBjaGFuZ2UgbXVzdCBiZSBpbnZva2VkIGZpcnN0IGJlZm9yZSBjb250cm9sIHZlcmlmaWNhdGlvbi5cclxuICAgICAgICAgIGN0cmwuTW9kaWZpZWRCeVVzZXIgPSB0cnVlO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVDdHJsTW9kaWZ5KGN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1RJT04pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGN0cmwuaXNDaG9pY2VDb250cm9sKCkpXHJcbiAgICAgICAgICBDb21tYW5kcy5zZXRHZXRTdWdnZXN0ZWRWYWx1ZU9mQ2hvaWNlQ29udHJvbE9uVGFnRGF0YShjdHJsLCBjdHJsLklzUmVwZWF0YWJsZSA/IGxpbmUgOiAwLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8vIEZvciBtdWx0aXBsZSBzZWxlY3Rpb24gTGlzdEJveCB2YWx1ZSB0byBmaWVsZCBhbmQgY3RybCB3b3VsZCBiZSBzZXQgb24gbGVhdmluZ1xyXG4gICAgICAgIC8vIGNvbnRyb2wsIGJlZm9yZSBleGVjdXRpbmcgY29udHJvbCBzdWZmaXguIFNvIHZhcmlhYmxlIGNoYW5nZSBpbnRlcm5hbCBldmVudCB3b3VsZCBiZVxyXG4gICAgICAgIC8vIGhhbmRsZWQgYmVmb3JlIGV4ZWN1dGluZyBjb250cm9sIHN1ZmZpeC5cclxuICAgICAgICBpZiAoIWN0cmwuSXNNdWx0aXBsZVNlbGVjdGlvbkxpc3RCb3goKSlcclxuICAgICAgICAgIGF3YWl0IGN0cmwudmFsaWRhdGVBbmRTZXRWYWx1ZSh2YWwsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlIE1vdXNlIFVwIEV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250b2xcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5saW5lIG9mIG11bHRpbGluZSBjb250cm9sXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9kdWNlQ2xpY2tcIj5pZiB0cnVlLCBwcm9kdWNlIGNsaWNrIGV2ZW50XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVNb3VzZVVwKGN0cmw6IE1nQ29udHJvbCwgbGluZTogbnVtYmVyLCBwcm9kdWNlQ2xpY2s6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChjdHJsID09PSBudWxsKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgLy8gUUNSICMgNjE0NCBzZWUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIF9jdXJyQ2xpY2tlZFJhZGlvIG1lbWJlclxyXG4gICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8pXHJcbiAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5DdXJyZW50Q2xpY2tlZFJhZGlvID0gY3RybDtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChjdHJsLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQkxFKSB7XHJcbiAgICAgICAgaWYgKCEgYXdhaXQgY3RybC5jaGVja1Byb3BXaXRoTGluZShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkFCTEVELCB0cnVlLCBsaW5lKSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgY2FuR290b0N0cmw6IGJvb2xlYW4gPSB0aGlzLmNhbkdvVG9Db250cm9sKGN0cmwsIHRydWUpO1xyXG4gICAgICAgIGxldCBTdG9wRm9jdXM6IGJvb2xlYW4gPSBjdHJsLmlzRm9jdXNlZFN0b3BFeGVjdXRpb24oKTtcclxuXHJcbiAgICAgICAgbGV0IHJldHVyblRvQ3RybDogTWdDb250cm9sID0gTWdDb250cm9sLlJldHVyblRvQ3RybDtcclxuXHJcbiAgICAgICAgaWYgKCghY2FuR290b0N0cmwgfHwgKCh0aGlzLl9zdG9wRXhlY3V0aW9uIHx8IFN0b3BGb2N1cykgJiYgcmV0dXJuVG9DdHJsICE9PSBjdHJsKSkgJiYgcmV0dXJuVG9DdHJsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9ICg8VGFzaz5yZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSkuZ2V0TWdkSUQoKTtcclxuICAgICAgICAgIGlmIChyZXR1cm5Ub0N0cmwuSXNSZXBlYXRhYmxlKVxyXG4gICAgICAgICAgICBhd2FpdCAoPE1nRm9ybT5yZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpKS5icmluZ1JlY29yZFRvUGFnZSgpO1xyXG4gICAgICAgICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKHJldHVyblRvQ3RybCwgLTEpO1xyXG4gICAgICAgICAgcmV0dXJuVG9DdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuc2V0TGFzdFBhcmtlZEN0cmwocmV0dXJuVG9DdHJsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24gfHwgU3RvcEZvY3VzKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocHJvZHVjZUNsaWNrICYmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTiB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElTVCkpIHtcclxuICAgICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCk7XHJcbiAgICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1dFQl9DTElDSyk7XHJcbiAgICAgICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gICAgICB9XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRSYWRpbyA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICBDaGVjayBpZiBjdHggaXMgcmVtb3ZlZCBmcm9tIHNlcnZlciwgaWYgc28gYW5kIGN1cnJlbnQgZXZlbnQgaXMgcm91dGUgZXZlbnQgLCB0aGVuIHNhdmUgaXRcclxuICAvLyAgdG8gZXhlY3V0ZSBhZ2FpbiB3aGVuICBzZXJ2ZXIgY3R4IGlzIHJlY3JlYXRlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2hlY2tBbmRTYXZlUm91dGVFdmVudElmQ3R4UmVtb3ZlZEZyb21TcnZyKGFSdEV2dDphbnkpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAoYVJ0RXZ0LmdldFR5cGUoKSA9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIGFSdEV2dC5nZXRJbnRlcm5hbENvZGUoKSA9PVxyXG4gICAgICBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCQ0xJRU5UX1JPVVRFICYmIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5SZW1vdmVkQ29udGV4dEZyb21TZXJ2ZXIpIHtcclxuICAgICAgICB0aGlzLnNldExhc3RTYXZlZFJvdXRlRXZlbnQoYVJ0RXZ0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGUgRm9jdXMgRXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+bGluZSBvZiBtdWx0aWxpbmUgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvbkNsaWNrXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUZvY3VzKGN0cmw6IE1nQ29udHJvbCwgbGluZTogbnVtYmVyLCBvbkNsaWNrOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG5cclxuXHJcbiAgICAgIC8vIElmIHdlIGF0dGVtcHQgdG8gcGFyayBvbiBjb250cm9sIHdoZXJlIHdlIGRvIG5vdCB3YW50IHRvIGFsbG93IHRvIHBhcmsgbGlrZSBpZiBjb250cm9sIGhhcyBleHByZXNzaW9uIG9yIHBhcmVudCB0YXNrIGZpZWxkLCBkbyBub3QgYWxsb3cgdG8gZm9jdXMgb24gaXQuXHJcbiAgICAgIC8vIFNldCBGb2N1cyBiYWNrIHRvIGxhc3RGb2N1c2VkQ29udHJvbC4gV2UgbmVlZCBfbGFzdEZhaWxlZEZvY3VzZWRDb250cm9sIGFzIHdlIGdldCBmb2N1cyBldmVudCBvbiBhIGNvbnRyb2wgdHdpY2UuIFNvIHRvIGF2b2lkIHRvIHNob3cgZXJyb3IgbXVsdGlwbGUgdGltZXMsXHJcbiAgICAgIC8vIG1haW50YWluIF9sYXN0RmFpbGVkRm9jdXNlZENvbnRyb2wuXHJcbiAgICAgIGlmIChjdHJsICE9PSB0aGlzLl9sYXN0RmFpbGVkRm9jdXNlZENvbnRyb2wgJiYgY3RybC5IYXNFeHBPclBhcmVudFRhc2tGaWVsZCgpKSB7XHJcbiAgICAgICAgLy8gU2hvdyBlcnJvciBvbmx5IGZvciBjb250cm9scyBoYXZpbmcgRGF0YSBwcm9wZXJ0eSBhbmQgcGFya2FibGVcclxuICAgICAgICBpZihjdHJsLmlzTGlzdEJveCgpIHx8IGN0cmwuaXNDaGVja0JveCgpIHx8IGN0cmwuaXNDb21ib0JveCgpIHx8IGN0cmwuaXNUZXh0Q29udHJvbCgpIHx8IGN0cmwuaXNSYWRpbygpIHx8IGN0cmwuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUVycm9yVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJDb250cm9sIGVpdGhlciBoYXMgZXhwcmVzc2lvbiBvciBoYXMgcGFyZW50IHRhc2sgdmFyaWFibGUgYXR0YWNoZWQgdG8gaXQuIEZhaWxlZCB0byBwYXJrIG9uIGNvbnRyb2wgd2l0aCBuYW1lOiB7MH1cIiwgY3RybC5OYW1lKSk7XHJcbiAgICAgICAgICAvLyBEZWZlY3QgMTUyNzI4OiBVc2UgbGFzdCBmb2N1c2VkIHRhc2sgaW5zdGVhZCBjb250cm9sIHRhc2sgYXMgY29udHJvbCBjYW4gYmUgZnJvbSBzdWJmb3JtLlxyXG4gICAgICAgICAgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSwgTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpLCAwLFxyXG4gICAgICAgICAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCkgPT09IG51bGwgPyB0cnVlIDogZmFsc2UpO1xyXG4gICAgICAgICAgdGhpcy5fbGFzdEZhaWxlZEZvY3VzZWRDb250cm9sID0gY3RybDtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX2xhc3RGYWlsZWRGb2N1c2VkQ29udHJvbCA9IG51bGw7XHJcblxyXG4gICAgICBpZiAob25DbGljaylcclxuICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRDdHJsID0gY3RybDtcclxuXHJcbiAgICAgIGxldCBwcmV2Q3RybDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgICBpZiAoY3RybCA9PT0gcHJldkN0cmwgJiYgIWN0cmwuaXNSZXBlYXRhYmxlKCkpIHtcclxuICAgICAgICBhd2FpdCAoPE1nRm9ybT5jdHJsLmdldEZvcm0oKSkuYnJpbmdSZWNvcmRUb1BhZ2UoKTtcclxuICAgICAgICAvLyB3ZSByZWNlaXZlZCBmb2N1cyB0d2ljZVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy9jaGVjayBpZiBsYXN0IHRhc2sgaXMgb3BlbmVkIGluIE1vZGFsIFN1YmZvcm0sIGlmIHllcywgY2xvc2UgaXQgYmVmb3JlIGZvY3Vzc2luZyBvbiBwYXJlbnQgdGFzaydzIGN0cmxcclxuICAgICAgbGV0IHByZXZUYXNrOiBUYXNrID0gPFRhc2s+TGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG5cclxuXHJcbiAgICAgIHRoaXMuX25leHRQYXJrZWRDdHJsID0gY3RybDsgLy8gc2F2ZSB0aGUgTkVYVCBjb250cm9sICh1c2VkIHRvIGNoZWNrIHRoZSBkaXJlY3Rpb24pXHJcblxyXG4gICAgICBpZiAoY3RybCA9PT0gbnVsbCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQkxFKSB7XHJcbiAgICAgICAgaWYgKHByZXZDdHJsID09PSBudWxsKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgY3VyclRhc2s6IFRhc2s7XHJcbiAgICAgIGlmICgoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04pICYmICg8UmFpc2VBdD4oYXdhaXQgKGN0cmwuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SQUlTRV9BVCkpLmdldFZhbHVlSW50KCkpID09PSBSYWlzZUF0LlRhc2tJbkZvY3VzKSlcclxuICAgICAgICBjdXJyVGFzayA9IHByZXZUYXNrO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgY3VyclRhc2sgPSA8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcblxyXG4gICAgICBsZXQgY2FuR290b0N0cmw6IGJvb2xlYW4gPSB0aGlzLmNhbkdvVG9Db250cm9sKGN0cmwsIG9uQ2xpY2spO1xyXG5cclxuICAgICAgLy8gR28gdG8gdGhlIGNvbnRyb2wgLSBpbnNlcnQgcHJlZml4XHJcbiAgICAgIGlmIChjYW5Hb3RvQ3RybCkge1xyXG5cdCAgICAvLyBNb2RhbCBzdWJmb3JtIHRhc2sgY2xvc2luZyBoYXMgYWxyZWFkeSBiZWd1bi4gRG8gbm90IGhhbmRsZSBIYW5kbGVTdWJmb3JtTW9kYWxpdHkoKSBhZ2Fpbi5cclxuICAgICAgICBpZiAodGhpcy5ndWlQZW5kaW5nRXZlbnQgIT0gbnVsbClcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsZXQgaGFuZGxlZCA9IGF3YWl0IHRoaXMuSGFuZGxlU3ViZm9ybU1vZGFsaXR5KGN0cmwsIHByZXZUYXNrLCBjdXJyVGFzayk7XHJcbiAgICAgICAgaWYgKGhhbmRsZWQpXHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCBldmVudExpbmU6IG51bWJlciA9IChjdHJsLmlzUmVwZWF0YWJsZSgpIHx8IGN0cmwuaXNSYWRpbygpKSA/IGxpbmUgOiBJbnQzMi5NaW5WYWx1ZTtcclxuICAgICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCwgZXZlbnRMaW5lKTtcclxuICAgICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgICAgfSBlbHNlIGlmIChwcmV2Q3RybCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGlmICghcHJldkN0cmwuaXNNb2RpZmlhYmxlKCkpIHtcclxuICAgICAgICAgIGlmIChwcmV2Q3RybC5pc0Nob2ljZUNvbnRyb2woKSlcclxuICAgICAgICAgICAgYXdhaXQgcHJldkN0cmwucmVzdG9yZU9sZFZhbHVlKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICghY3VyclRhc2suY2FuY2VsV2FzUmFpc2VkKCkpIHtcclxuICAgICAgICAgIGxldCBuZXdWYWw6IHN0cmluZyA9IE1hbmFnZXIuR2V0Q3RybFZhbChwcmV2Q3RybCk7XHJcbiAgICAgICAgICBpZiAoISBhd2FpdCBwcmV2Q3RybC52YWxpZGF0ZUFuZFNldFZhbHVlKG5ld1ZhbCwgdHJ1ZSkpXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgTWdDb250cm9sLlJldHVyblRvQ3RybCA9IHByZXZDdHJsO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbiAmJiBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsID09PSBjdHJsKVxyXG4gICAgICAgIExhc3RGb2N1c2VkTWFuYWdlci5zZXRMYXN0Rm9jdXNlZENvbnRyb2woPFRhc2tCYXNlPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSwgY3RybCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGN0cmwuc2V0Rm9jdXNlZFN0b3BFeGVjdXRpb24odGhpcy5fc3RvcEV4ZWN1dGlvbik7XHJcbiAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGV0IHJldHVyblRvQ3RybDogTWdDb250cm9sID0gTWdDb250cm9sLlJldHVyblRvQ3RybDtcclxuXHJcbiAgICAgICAgICBpZiAocmV0dXJuVG9DdHJsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gKDxUYXNrPnJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNZ2RJRCgpO1xyXG4gICAgICAgICAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMocmV0dXJuVG9DdHJsLCAtMSk7XHJcbiAgICAgICAgICAgIHJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExhc3RQYXJrZWRDdHJsKHJldHVyblRvQ3RybCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGUgc3ViZm9ybSBtb2RhbGl0eSBiZWZvciBmb3Vjc3Npbmcgb24gcGFyZW50IGN0cmxcclxuICAvLy8gMS5pZiBjdXJzb3IgaXMgcGFya2VkIG9uIG1vZGFsIHN1YmZvcm0gdGFzayBhbmQgdXNlciBjbGlja3Mgb24gaXQncyBwYXJlbnQgOiBjbG9zZSB0aGUgc3ViZm9ybSB0YXNrLlxyXG4gIC8vLyAyLmlmIGN1cnNvciBpcyBwYXJrZWQgb24gbW9kYWwgc3ViZm9ybSAnUzInIHdoaWNoIGlzIG9wZW5lZCBpbiBhbm90aGVyIHN1YmZvcm0gbW9kYWwgJ1MxJywgdGhlbiBjbGlja2luZyBvbiAgcGFyZW50J1AxJ1xyXG4gIC8vLyB3aWxsIGNsb3NlIGJvdGggUzIgYW5kIFMxLlxyXG4gIC8vLyAzLmlmIGN1cnNvciBpcyBwYXJrZWQgb24gbm9uIG1vZGFsIHN1YmZvcm0gJ1MyJyB3aGljaCBpcyBvcGVuZWQgaW4gc3ViZm9ybSBtb2RhbCAnUzEnLCB0aGVuIGNsaWNraW5nIG9uIFMxLCB3aWxsIG5vdCBjbG9zZSBTMlxyXG4gIC8vLyBidXQgY2xpY2tpbmcgb24gUDEgd2lsbCBjbG9zZSBib3RoIFMyIGFuZCBTMS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmN0cmwgdG8gYmUgZm9jdXNzZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJldlRhc2tcIj5wcmV2aW91cyB0YXNrIHdoaWNoIHdhcyBpbiBmb2N1czwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdXJyVGFza1wiPmN1cnJlbnQgdGFzayB3aGljaCBpcyB0byBiZSBmb2N1c3NlZDwvcGFyYW0+XHJcblxyXG4gIHByaXZhdGUgIGFzeW5jIEhhbmRsZVN1YmZvcm1Nb2RhbGl0eShjdHJsOiBNZ0NvbnRyb2wsIHByZXZUYXNrOiBUYXNrLCBjdXJyVGFzazogVGFzayk6IFByb21pc2U8Ym9vbGVhbj5cclxuICB7XHJcbiAgICBsZXQgaGFuZGxlZFN1YmZvcm1Nb2RhbGl0eSA9IGZhbHNlO1xyXG5cclxuICAgIC8vIGV2YWx1YXRlIHRoZSBjb3JyZWN0IHByZXZUYXNrIHRvIGJlIGNsb3NlZCBpZiBpdCBpcyBNb2RhbC5cclxuICAgIC8vIGlmIG5ld2x5IHN1YmZvcm0gTW9kYWwgdGFzayBpcyBvcGVuZWQgYW5kIGl0IGlzIG5vdCB5ZXQgZm9jdXNzZWQsIGluIHRoYXQgY2FzZSBjdXJyIHRhc2sgaXMgc2FtZSBhcyBwcmV2dGFzay5cclxuICAgIC8vIG5vdyBjbGlja2luZyBvbiBpdCdzIHBhcmVudCB0YXNrLCBzaG91bGQgY2xvc2UgdGhlIE1vZGFsIHN1YmZvcm0gdGFza1xyXG4gICAgbGV0IGxlbmd0aCA9IHByZXZUYXNrLmdldE1HRGF0YSgpLmdldFRhc2tzQ291bnQoKTtcclxuICAgIGxldCB0b3BUYXNrOiBUYXNrID0gcHJldlRhc2suZ2V0TUdEYXRhKCkuZ2V0VGFzayhsZW5ndGgtMSk7XHJcbiAgICBpZiAoY3VyclRhc2sgPT0gcHJldlRhc2sgfHwgcHJldlRhc2sgIT0gdG9wVGFzayAvKiBuZXN0ZWQgc3ViZm9ybSAqLykge1xyXG4gICAgICAgIGlmKHRvcFRhc2sgIT0gbnVsbCAmJiBwcmV2VGFzayAhPSB0b3BUYXNrICYmIHRvcFRhc2suSXNTdWJGb3JtICkge1xyXG4gICAgICAgICAgbGV0IHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnRvcFRhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCk7XHJcbiAgICAgICAgICBpZiAoc3ViZm9ybUN0cmwuSXNNb2RhbCgpKVxyXG4gICAgICAgICAgICBwcmV2VGFzayA9IHRvcFRhc2s7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBjbG9zZSBzdWJmb3JtIHRhc2sgaXMgTW9kYWwgaWYgdG8gYmUgcGFya2VkIG9uIHBhcmVudC5cclxuICAgIGlmIChwcmV2VGFzayAhPSA8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkgJiYgcHJldlRhc2suZ2V0SXNEZXN0aW5hdGlvbkNhbGwoKSkge1xyXG5cclxuICAgICAgICBpZiAoIWN1cnJUYXNrLmlzRGVzY2VuZGVudE9mKHByZXZUYXNrKSkge1xyXG4gICAgICAgICAgbGV0IHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnByZXZUYXNrLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpO1xyXG4gICAgICAgICAgaWYgKCFzdWJmb3JtQ3RybC5Jc01vZGFsKCkgJiYgIWN1cnJUYXNrLmdldElzRGVzdGluYXRpb25DYWxsKCkpXHJcbiAgICAgICAgICAgIHN1YmZvcm1DdHJsID0gcHJldlRhc2suR2V0U3ViZm9ybU1vZGFsUGFyZW50VGFzaygpO1xyXG4gICAgICAgICAgaWYgKHN1YmZvcm1DdHJsICE9IG51bGwgJiYgKGN0cmwgIT0gc3ViZm9ybUN0cmwpICYmIHN1YmZvcm1DdHJsLklzTW9kYWwoKSkge1xyXG5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5wZXJmb3JtU3ViZm9ybUNsb3NlKDxNZ0NvbnRyb2w+c3ViZm9ybUN0cmwpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgICAgICAgdGhpcy5ndWlQZW5kaW5nRXZlbnQgPSB0aGlzLmdldExhc3RSdEV2ZW50KCk7XHJcbiAgICAgICAgICAgIGhhbmRsZWRTdWJmb3JtTW9kYWxpdHkgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaGFuZGxlZFN1YmZvcm1Nb2RhbGl0eTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gIENhbGxzIENvbnRyb2xzIFN1ZmZpeCB3aGVuIGZvY3VzIG9uIE5vbiBtYWdpYyBjb250cm9sIGkuZS4gY29udHJvbCB3aXRoIE1hZ2ljRHVtbXlDb250cm9sIGlzIHJlY2VpdmVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRm9jdXNPbk5vbk1hZ2ljQ29udHJvbChjdHJsOiBNZ0NvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IEV2ZW50c01hbmFnZXIuSW5zdGFuY2UuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICBjdHJsLnNldEZvY3VzZWRTdG9wRXhlY3V0aW9uKHRoaXMuX3N0b3BFeGVjdXRpb24pO1xyXG4gICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCByZXR1cm5Ub0N0cmw6IE1nQ29udHJvbCA9IE1nQ29udHJvbC5SZXR1cm5Ub0N0cmw7XHJcblxyXG4gICAgICAgICAgaWYgKHJldHVyblRvQ3RybCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9ICg8VGFzaz5yZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSkuZ2V0TWdkSUQoKTtcclxuICAgICAgICAgICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKHJldHVyblRvQ3RybCwgLTEpO1xyXG4gICAgICAgICAgICByZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5zZXRMYXN0UGFya2VkQ3RybChyZXR1cm5Ub0N0cmwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB3ZSBjYW4gZ28gdG8gdGhlIGNvbnRyb2wgYW5kIHRyeSB0byBwYXJrIG9uIGluXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5saW5lPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9uQ2xpY2tcIj5yZWFsIGNsaWNrIGlzIHBlcmZvcm1lZCwgdGhpcyBub3QgY2xpY2sgc2ltdWxhdGlvbjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGNhbkdvVG9Db250cm9sKGN0cmw6IE1nQ29udHJvbCwgb25DbGljazogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmIChvbkNsaWNrICYmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NVQkZPUk0gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CUk9XU0VSKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIFY5LjRTUDRkIGNoYW5nZSBvZiBiZWhhdmlvciAtIHdlIGRvIG5vdCBcImV4aXRcIiBmcm9tIHRoZSBjdXJyZW50IGN0cmxcclxuICAgIC8vIChpLmUuIG5vdCBwZXJmb3JtaW5nIGN0cmwgc3VmZml4IG9yIGN0cmwgdmVyaWZpY2F0aW9ucykgaWYgdGhlIHRhcmdldCBjdHJsXHJcbiAgICAvLyBpcyBJTUcgb3IgaHlwZXJ0ZXh0LlxyXG4gICAgbGV0IGNhbkdvdG9DdHJsOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCBjdXJyVGFzazogVGFzayA9IDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuXHJcbiAgICBpZiAoIWN1cnJUYXNrLklzSW50ZXJhY3RpdmUpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9JTUFHRSAmJiAhY3RybC5Jc1JlcGVhdGFibGUpXHJcbiAgICAgIGNhbkdvdG9DdHJsID0gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIGNhbkdvdG9DdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZSBUaW1lciBFdmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+dHVudGltZSB0aW1lciBldmVudDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVUaW1lcihldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgZXZ0LnNldFR5cGUoQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUik7XHJcbiAgICBpZiAoZXZ0LmlzSWRsZVRpbWVyKCkpIHtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFeHByZXNzaW9uSGFuZGxlcnMoKTtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVDb250ZXh0SW5hY3Rpdml0eUFsZXJ0KGV2dCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IG1nZDogTUdEYXRhID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRNR0RhdGEoZXZ0LmdldE1nZElEKCkpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50cyhtZ2QuZ2V0VGltZXJIYW5kbGVycygpLCBldnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBXaGVuIHRoZSBjb250ZXh0IGluYWN0aXZpdHkgdGltZW91dCBpcyBhYm91dCB0byBleHBpcmUsIHJhaXNlIGEgd2FybmluZyB0byB1c2VyXHJcbiAgLy8gICAgc28gdGhhdCB0aGUgc2Vzc2lvbiBjYW4gYmUgY29udGludWVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2dFwiPnR1bnRpbWUgdGltZXIgZXZlbnQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ29udGV4dEluYWN0aXZpdHlBbGVydChldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRpbWVOb3c6IG51bWJlciA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk7XHJcbiAgICBsZXQgbWdkOiBNR0RhdGEgPSBldnQuZ2V0VGFzaygpLmdldE1HRGF0YSgpO1xyXG4gICAgbGV0IGxhc3RSZXF1ZXN0VGltZTogbnVtYmVyID0gUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5HZXRMYXN0UmVxdWVzdFRpbWU7XHJcbiAgICBsZXQgY29udGV4dEluYWN0aXZpdHlUaW1lb3V0OiBudW1iZXIgPSBFbnZpcm9ubWVudC5JbnN0YW5jZS5nZXRDb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQoKS8xMDtcclxuICAgIGxldCBjb250ZXh0SW5hY3Rpdml0eVdhcm5pbmdUaW1lOiBudW1iZXIgPSBFbnZpcm9ubWVudC5JbnN0YW5jZS5nZXRDb250ZXh0SW5hY3Rpdml0eVdhcm5pbmdUaW1lKCkvMTA7XHJcblxyXG4gICAgbGV0IGlkbGVUaW1lID0gKHRpbWVOb3cgLSBsYXN0UmVxdWVzdFRpbWUpLzEwMDA7XHJcblxyXG4gICAgLy8gRGlzcGxheSB0aGUgY29uZmlybWF0aW9uIG9ubHkgZm9yIHZhbGlkIHRpbWVvdXRzXHJcbiAgICBpZihjb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQgPT0gMCB8fCBjb250ZXh0SW5hY3Rpdml0eVdhcm5pbmdUaW1lID09IDApXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZihFdmVudHNNYW5hZ2VyLnVzZXJHcmFudGVkRm9yQ29udGV4dEFjdGl2aXR5ICYmIGlkbGVUaW1lID49IChjb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQgLSBjb250ZXh0SW5hY3Rpdml0eVdhcm5pbmdUaW1lKSkge1xyXG4gICAgICAvLyByYWlzZSBhbiBhbGVydCB0byBub3RpZnkgdXNlciB3aGVuIHRoZSBjb250ZXh0IGlzIGFib3V0IHRvIGJlIHRlcm1pbmF0ZWRcclxuICAgICAgLy8gaWYgdXNlciBjbGlja3Mgb24gT0ssIHNlbmQgZHVtbXkgcmVxdWVzdCB0byBzZXJ2ZXIuIElmIENhbmNlbCBpcyBjbGlja2VkLCBkbyBub3RoaW5nLlxyXG4gICAgICBsZXQgdXNlckNvbmZpcm1hdGlvbjogbnVtYmVyID0gYXdhaXQgR1VJTWFuYWdlci5JbnN0YW5jZS5NZXNzYWdlQm94KHRoaXMuY29uZmlybWF0aW9uRGlhbG9nVGl0bGUsIHRoaXMuY29uZmlybWF0aW9uRGlhbG9nTXNnLCBTdHlsZXMuTVNHQk9YX0JVVFRPTl9ZRVNfTk8pO1xyXG4gICAgICBpZih1c2VyQ29uZmlybWF0aW9uID09IFN0eWxlcy5NU0dCT1hfUkVTVUxUX1lFUylcclxuICAgICAge1xyXG4gICAgICAgIC8vIHNlbmQgcmVxdWVzdCB0byBzZXJ2ZXIgdG8gbWFyayB0aGUgY29udGV4dCBpbmFjdGl2aXR5IHRpbWVvdXQgdG8gemVyb1xyXG4gICAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlQ29udGV4dFRpbWVvdXRSZXNldEV2ZW50Q29tbWFuZCgpO1xyXG4gICAgICAgIG1nZC5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICAgICAgYXdhaXQgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uT05MWV9DT01NQU5EUyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICB7XHJcbiAgICAgICAgRXZlbnRzTWFuYWdlci51c2VyR3JhbnRlZEZvckNvbnRleHRBY3Rpdml0eSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwcm9jZXNzIGV4cHJlc3Npb24gaGFuZGxlcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGhhbmRsZUV4cHJlc3Npb25IYW5kbGVycygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCksIExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKSk7XHJcbiAgICBydEV2dC5zZXRFeHByZXNzaW9uKG51bGwpO1xyXG4gICAgcnRFdnQuc2V0TWFpblByZ0NyZWF0b3IocnRFdnQuZ2V0VGFzaygpKTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGxldCBtZ2Q6IE1HRGF0YSA9IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TUdEYXRhKGkpO1xyXG4gICAgICBpZiAobWdkICE9PSBudWxsICYmICFtZ2QuSXNBYm9ydGluZylcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50cyhtZ2QuZ2V0RXhwSGFuZGxlcnMoKSwgcnRFdnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2l6ZSBvZiBwYWdlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj50YWJsZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyb3dzSW5QYWdlXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGhhbmRsZVJlc2l6ZShjdHJsOiBNZ0NvbnRyb2wsIHJvd3NJblBhZ2U6IG51bWJlcik6IHZvaWQge1xyXG4gICAgKDxNZ0Zvcm0+Y3RybC5nZXRGb3JtKCkpLnNldFJvd3NJblBhZ2Uocm93c0luUGFnZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGRhdGEgZm9yIFJvd1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzZW5kQWxsXCI+aWYgdHJ1ZSwgc2VuZCBhbGwgcmVjb3Jkc1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicm93XCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVSb3dEYXRhQ3VyUGFnZSh0YWJsZTogTWdDb250cm9sLCBkZXNpcmVkVG9wSW5kZXg6IG51bWJlciwgc2VuZEFsbDogYm9vbGVhbiwgbGFzdEZvY3VzZWRWYWw6IExhc3RGb2N1c2VkVmFsKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50YWJsZS5nZXRGb3JtKCk7XHJcbiAgICBhd2FpdCBmb3JtLnNldFJvd0RhdGEoZGVzaXJlZFRvcEluZGV4LCBzZW5kQWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cmFuc2ZlcnMgZGF0YSB0byBHVUkgdGhyZWFkIGluIGZyZWUgd29ya2VyIHRocmVhZCB0aW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlVHJhbnNmZXJEYXRhVG9HdWkoY3RybDogTWdDb250cm9sKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT5jdHJsLmdldEZvcm0oKTtcclxuICAgIGF3YWl0IGZvcm0udHJhbnNmZXJEYXRhVG9HdWkoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBGZXRjaGVzIHRoZSBjaHVuayBmcm9tIHNlcnZlcixcclxuICAvLy8gICBJZiB0aGUgbGFzdCByZWNvcmRzIGlzIG5vdCB5ZXQgZmV0Y2hlZCBpdCBmZXRjaGVzIHRoZSBuZXh0IGNodW5rLFxyXG4gIC8vLyAgIEVsc2UsIGZldGNoZXMgdGhlIHByZXZpb3VzIGNodW5rXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIGZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlcihjdHJsOiBNZ0NvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPmN0cmwuZ2V0Rm9ybSgpO1xyXG4gICAgYXdhaXQgZm9ybS5GZXRjaFJlY29yZHNBaGVhZEZyb21TZXJ2ZXIoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBXaGVuIGludGVybmFsIGFjdCBhc2tzIGZvciBlbmFibGUvZGlzYWJsZSBvZiBhbiBhY3QgbGlzdC5cclxuICAvLy8gICBjYWxsIGVuYWJsZUxpc3Qgd2l0aCBvbmx5SWZDaGFuZ2VkID0gdHJ1ZSB0byBtaW5pbWl6ZSBjYWxscyB0b3MgcmVmcmVzaC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZW5hYmxlXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGhhbmRsZUVuYWJsZUV2ZW50cyhldnQ6IFJ1blRpbWVFdmVudCwgZW5hYmxlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBldnQuZ2V0VGFzaygpLkFjdGlvbk1hbmFnZXIuZW5hYmxlTGlzdChldnQuZ2V0QWN0RW5hYmxlTGlzdCgpLCBlbmFibGUsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZXMgY29udHJvbCBQcmVmaXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ3RybFByZWZpeChldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ldnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGN1cnJDbGlja2VkQ3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5SdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRDdHJsO1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICBsZXQgZGlzcGxheUxpbmU6IG51bWJlciA9IGV2dC5nZXREaXNwbGF5TGluZSgpO1xyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2w7XHJcblxyXG4gICAgaWYgKGZvcm0uaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgIGlmIChkaXNwbGF5TGluZSA9PT0gSW50MzIuTWluVmFsdWUgfHwgY3RybC5pc1JhZGlvKCkpXHJcbiAgICAgICAgZGlzcGxheUxpbmUgPSBmb3JtLkRpc3BsYXlMaW5lO1xyXG4gICAgfSBlbHNlXHJcbiAgICAgIGRpc3BsYXlMaW5lID0gSW50MzIuTWluVmFsdWU7XHJcblxyXG4gICAgbGV0IGxhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcblxyXG4gICAgLy8gcHJldmVudCBkb3VibGUgcHJlZml4IG9uIHRoZSBzYW1lIGNvbnRyb2xcclxuICAgIC8vIEZvciBGYXN0IE1vZGUsIENTIGlzIGV4ZWN1dGVkIGZyb20gaGVyZSwgd2hlcmVhcyBmb3Igc3RlcCBtb2RlIGl0IGlzIGRvbmVcclxuICAgIC8vIGluIG1vdmVJblJvdy4gc28sIGZvciBzdGVwIG1vZGUgZG91YmxlIGV4ZWN1dGlvbiBvZiBDUyBtdXN0IGJlIHN0b3BwZWQuXHJcbiAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IG51bGwgJiYgKDxUYXNrPmxhc3RQYXJrZWRDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldE1HRGF0YSgpLkdldElkKCkgPT09ICg8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldE1HRGF0YSgpLkdldElkKCkgJiYgbGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKSB7XHJcbiAgICAgIGlmICgoY3RybCAhPT0gbGFzdFBhcmtlZEN0cmwgfHwgKGN0cmwuaXNSZXBlYXRhYmxlKCkgJiYgZGlzcGxheUxpbmUgIT09IGN0cmwuZ2V0RGlzcGxheUxpbmUodHJ1ZSkpKSAmJiAhbGFzdFBhcmtlZEN0cmwuaXNJbkNvbnRyb2xTdWZmaXgoKSlcclxuICAgICAgLy8gUUNSICM5NzA4MDZcclxuICAgICAge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGxhc3RQYXJrZWRDdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpO1xyXG4gICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWCB8fCBjdHJsLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICAgIGN0cmwucmVzZXRQcmV2VmFsKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGN0cmwuUmVmcmVzaERpc3BsYXkoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIFRPRE86IEZvY3VzICYgVGFiYmluZzogSGFuZGxlIFBhcmtpbmcgaW4gdGhpcyBjYXNlLiBTaG91bGQgbm90IHJldHVybiBmYWxzZSBpbiBzY3JlZW4gbW9kZVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRhc2suSW5DdHJsUHJlZml4KVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgdGFzay5JbkN0cmxQcmVmaXggPSB0cnVlO1xyXG5cclxuICAgIC8vIG1ha2Ugc3VyZSBpdCBoYXMgbm90IGNvbWUgYWdhaW4gdGhyb3VnaCBtb3ZlaW5yb3cuXHJcbiAgICAvLyBlZzogaWYgY2xpY2tlZCBjdHJsIG9uIHN1YmZvcm0gaXMgbm9uIHBhcmthYmxlLCBmaXJzdCB0aW1lIGl0IGV4ZWN1dGVzIFJQIENWIGZvciBzdWJmb3JtcyBhbmQgdGhlblxyXG4gICAgLy8gZW50ZXJzIG1vdmVpbnJvdyBmb3IgcGFya2FibGUgY3RybC4gd2Ugc2hvdWxkbm90IGV4ZWN1dGUgdGhpcyBibG9jayB3aGVuIHdlIGNvbWUgZm9yIENQIG9mIHBhcmthYmxlIGN0cmwuXHJcbiAgICAvLyBGb3IgdGFiLCB3ZSBjb21lIGhlcmUgZGlyZWN0bHkgZm9yIHBhcmthYmxlIGN0cmwsIGFuZCB0aGlzIGJsb2NrIG11c3QgYWx3YXlzIGV4ZWN1dGUgaWYgb24gZGlmZiBmb3Jtcy5cclxuICAgIC8vIGlzU29ydCA6IGlmIGNsaWNrZWQgb24gdGFibGUgaGVhZGVyLCB3ZSBwYXJrIG9uIGNvbG9tbiBjdHJsIGFmdGVyIHNvcnQsIGFuZCB3ZSBtdXN0IGluY2x1ZGUgc3ViZm9ybXNcclxuICAgIC8vIGluIGV4ZWN1dGluZyBDVnNcclxuXHJcbiAgICAvLyBUT0RPOiBUYWJiaW5nICYgRm9jdXNpbmc6IENoZWNrIGdldExhc3RNb3ZlSW5Sb3dEaXJlY3Rpb24gaXMgcmVsZXZhbnQuIFdoaWxlIG1vdmluZyBiZXR3ZWVuIGNvbnRyb2xzIGJ5IFRhYiBjb2RlIGluIGlmIGJsb2NrIHdhcyBub3QgY2FsbGVkLlxyXG4gICAgLy8gQnV0IGl0IHdhcyBjYWxsZWQgb24gY2xpY2sgdG8gYW5vdGhlciBjb250cm9sLlxyXG4gICAgLy9pZiAodGFzay5nZXRMYXN0TW92ZUluUm93RGlyZWN0aW9uKCkgPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9OT05FIHx8IHRoaXMuX2lzU29ydGluZykge1xyXG5cclxuICAgIC8vIElmIHRoZSBjdXJyZW50IGN0cmwgaXMgb24gYSBzdWJmb3JtLCB0aGVuIGV4ZWN1dGUgaW4gc2VxdWVuY2VcclxuICAgIC8vIDEuIFJTIG9mIG5lc3RlZCBzdWJmb3JtcyB1bnRpbCBzdWJmb3JtIHRhc2sgY29udGFpbmcgdGhlc2UgMiBzdWJmb3Jtcy4gd2UgbXVzdCBhbHNvIGV4ZWN1dGUgUlMgaWYgY2xpY2tlZFxyXG4gICAgLy8gICAgaW4gc3ViZm9ybSBhbmQgcGFya2VkIGJhY2sgb24gYSBjdHJsJ3MgdGFzay4gKCM3MjIxMTUtIGN1cnJDbGlja2VkQ3RybCBhbmQgY3RybCBzaG91bGQgbm90IGJlIG9uIGRpZmZlcmVudCB3aW5kb3cpXHJcbiAgICAvLyAyLiBDViBleGVjdXRpb24gb2YgTGFzdFBhcmtlZEN0cmwgdGlsbCBlbmRcclxuICAgIC8vIDMuIFJQLUNWcyBmb3IgYWxsIGludGVybWVkaWF0ZSBzdWJmb3Jtc1xyXG4gICAgbGV0IHByZXZDdHJsOiBNZ0NvbnRyb2wgPSBsYXN0UGFya2VkQ3RybDtcclxuICAgIGlmIChjdXJyQ2xpY2tlZEN0cmwgIT09IG51bGwgJiYgKDxUYXNrPmN1cnJDbGlja2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNZ2RJRCgpID09PSAoPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNZ2RJRCgpICYmIGN0cmwub25EaWZmRm9ybShjdXJyQ2xpY2tlZEN0cmwpKVxyXG4gICAgICBwcmV2Q3RybCA9IGN1cnJDbGlja2VkQ3RybDtcclxuXHJcbiAgICBpZiAocHJldkN0cmwgIT09IG51bGwgJiYgY3RybC5vbkRpZmZGb3JtKHByZXZDdHJsKSkge1xyXG4gICAgICAvLyBSUyBvZiBuZXN0ZWQgc3ViZm9ybXMgdW50aWwgc3ViZm9ybSB0YXNrIGNvbnRhbmluZyB0aGVzZSAyIHN1YmZvcm1zXHJcbiAgICAgIGxldCBwcmV2VGFzazogVGFzayA9IDxUYXNrPnByZXZDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICAgIGF3YWl0IHByZXZUYXNrLmV4ZWNTdWJmb3JtUmVjU3VmZml4KDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSk7XHJcbiAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElTVCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1ggfHwgY3RybC5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgICAgY3RybC5yZXNldFByZXZWYWwoKTtcclxuICAgICAgICAgIGF3YWl0IGN0cmwuUmVmcmVzaERpc3BsYXkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuaXNBYm9ydGluZygpKSB7XHJcbiAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IEV2ZW50c01hbmFnZXIuZG9TeW5jRm9yU3ViZm9ybVBhcmVudCh0YXNrKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBFeGVjdXRlIFJQIG9mIHRoZSBjdXJyZW50IHRhc2sgYmVmb3JlIGV4ZWN1dGluZyB0aGUgQ1ZzIGJlZm9yZSAnY3RybCdcclxuICAgIGlmICh0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGFzay5TdWJmb3JtRXhlY01vZGUgPSBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uU0VUX0ZPQ1VTO1xyXG4gICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCwgZGlzcGxheUxpbmUpO1xyXG4gICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy99XHJcblxyXG4gICAgLy8gUUNSIyA4MDYwMTU6IElmIHdlIGhhdmUgYSBzaW5nbGUgZmllbGQgd2l0aCBhbGxvdyBwYXJraW5nID0gWWVzIGFuZCBUYWIgSW50byA9IE5vLCB0aGVuIG9uIHByZXNzaW5nIHRhYiBpZiBjdXJzb3IgaXMgbm90IG1vdmVkLCB3ZSBjb21lIHRvXHJcbiAgICAvLyBwYXJrIG9uIGxhc3RQYXJrZWRDdHJsKHdoaWNoIGlzIHNhbWUgYXMgY3RybCkgc2luY2UgVGFiSW50byBpcyBub3QgYWxsb3dlZC5cclxuICAgIC8vIFNvIHRvIGF2YW9pZCBpbmZpbml0ZSByZWN1cnNpb24sIHdlIHNob3VsZCBub3QgYWdhaW4gdHJ5IHRvIHBhcmsgb24gaXQuXHJcbiAgICBpZiAoIWF3YWl0IGN0cmwuSXNQYXJrYWJsZSgpICYmIGN0cmwgIT09IGxhc3RQYXJrZWRDdHJsKSB7XHJcbiAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAobGFzdFBhcmtlZEN0cmwgPT09IG51bGwgfHwgISBhd2FpdCBsYXN0UGFya2VkQ3RybC5pbnZva2UoKSlcclxuICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTdXBwb3J0VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0gRW50ZXJpbmcgY29udHJvbDogY29udHJvbCB7MX0sIHJvdyB7Mn1cIiwgIHRhc2suR2V0VGFza0RldGFpbHMoKSwgY3RybC5OYW1lLCBkaXNwbGF5TGluZSA8IDAgPyAwIDogZGlzcGxheUxpbmUpLCB0cnVlKTtcclxuXHJcbiAgICAvLyBpZiB3ZSBoYXZlIGEgc3RvcCBleGVjdXRpb24gY3RybCwgd2UgbmVlZCB0byB1c2UgaXQgYXMgYSBzcmN0cmwsIG90aGVyd2lzZSB1c2VcclxuICAgIC8vIHRoZSBjdHJsIG9uIHdoaWNoIHdlIGV4ZWN1dGVkIGxhc3QgQ1MuXHJcblxyXG5cclxuICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCk7XHJcbiAgICBjdHJsLktleVN0cm9rZU9uID0gZmFsc2U7XHJcbiAgICBjdHJsLk1vZGlmaWVkQnlVc2VyID0gZmFsc2U7XHJcblxyXG4gICAgdGFzay5zZXRDdXJyRmllbGQoY3RybC5nZXRGaWVsZCgpKTtcclxuXHJcbiAgICBpZiAoY3RybC5Jc1JlcGVhdGFibGUpXHJcbiAgICAgIGF3YWl0IGZvcm0uYnJpbmdSZWNvcmRUb1BhZ2UoKTtcclxuXHJcbiAgICAvLyBlbmFibGUtZGlzYWJsZSBhY3Rpb25zIGZvciBTdWJmb3Jtc1xyXG4gICAgaWYgKGxhc3RQYXJrZWRDdHJsICE9PSBjdHJsKSB7XHJcbiAgICAgIGlmICgobGFzdFBhcmtlZEN0cmwgPT09IG51bGwgJiYgY3RybC5nZXRGb3JtKCkuaXNTdWJGb3JtKCkpIHx8IChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbCAmJiAoY3RybC5nZXRGb3JtKCkuaXNTdWJGb3JtKCkgfHwgbGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmlzU3ViRm9ybSgpKSkpIHtcclxuICAgICAgICBsZXQgbGFzdFBhcmtlZFRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgICAgIGlmIChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbClcclxuICAgICAgICAgIGxhc3RQYXJrZWRUYXNrID0gPFRhc2s+bGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuXHJcbiAgICAgICAgaWYgKGxhc3RQYXJrZWRUYXNrICE9PSB0YXNrKSB7XHJcbiAgICAgICAgICBsZXQgZmlyc3RUaW1lOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICAgIGxldCBpc1NvblN1YmZvcm06IGJvb2xlYW47XHJcbiAgICAgICAgICBsZXQgcGFyZW50VGFzazogVGFzaztcclxuXHJcbiAgICAgICAgICBpZiAobGFzdFBhcmtlZFRhc2sgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgaXNTb25TdWJmb3JtID0gbGFzdFBhcmtlZFRhc2suSXNTdWJGb3JtO1xyXG5cclxuICAgICAgICAgICAgZm9yIChwYXJlbnRUYXNrID0gbGFzdFBhcmtlZFRhc2s7IHBhcmVudFRhc2sgIT09IG51bGwgJiYgaXNTb25TdWJmb3JtOyBwYXJlbnRUYXNrID0gPFRhc2s+cGFyZW50VGFzay5nZXRQYXJlbnQoKSkge1xyXG4gICAgICAgICAgICAgIGlmICghZmlyc3RUaW1lKSB7XHJcbiAgICAgICAgICAgICAgICBpc1NvblN1YmZvcm0gPSBwYXJlbnRUYXNrLklzU3ViRm9ybTtcclxuICAgICAgICAgICAgICAgIHBhcmVudFRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudFRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RFTExJTkUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudFRhc2suZW5hYmxlQ3JlYXRlQWN0cyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICBmaXJzdFRpbWUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlzU29uU3ViZm9ybSA9IHRhc2suSXNTdWJGb3JtO1xyXG5cclxuICAgICAgICAgIGZvciAocGFyZW50VGFzayA9IDxUYXNrPnRhc2suZ2V0UGFyZW50KCk7IChwYXJlbnRUYXNrICE9PSBudWxsKSAmJiBpc1NvblN1YmZvcm07IHBhcmVudFRhc2sgPSA8VGFzaz5wYXJlbnRUYXNrLmdldFBhcmVudCgpKSB7XHJcbiAgICAgICAgICAgIGlzU29uU3ViZm9ybSA9IHBhcmVudFRhc2suSXNTdWJGb3JtO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50VGFzay5nZXRFbmFibGVab29tSGFuZGxlcigpKVxyXG4gICAgICAgICAgICAgIHBhcmVudFRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00sIHRydWUpO1xyXG4gICAgICAgICAgICBhd2FpdCBwYXJlbnRUYXNrLnNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIFdoZW5ldmVyIHdlIGFyZSBtb3ZpbmcgYmV0d2VlbiB0YXNrcywgcmUtZXZhbHVhdGUgQWxsb3dNb2Rlcy5cclxuICAgICAgICAgIGF3YWl0IHRhc2suZW5hYmxlTW9kZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBlbmFibGUgYWN0aW9ucyBhbmQgc3RhdGVzXHJcbiAgICBpZiAodGFzay5nZXRFbmFibGVab29tSGFuZGxlcigpIHx8IGN0cmwudXNlWm9vbUhhbmRsZXIoKSlcclxuICAgICAgdGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSwgdHJ1ZSk7XHJcblxyXG4gICAgaWYgKGN0cmwuaXNUZXh0Q29udHJvbCgpIHx8IGN0cmwuaXNDaG9pY2VDb250cm9sKCkpXHJcbiAgICAgIGN0cmwuU2V0S2V5Ym9hcmRMYW5ndWFnZSgpO1xyXG5cclxuICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTilcclxuICAgICAgdGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQlVUVE9OLCB0cnVlKTtcclxuICAgIGF3YWl0IHRhc2suc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcblxyXG4gICAgbGV0IGZpZWxkOiBGaWVsZCA9IDxGaWVsZD5jdHJsLmdldEZpZWxkKCk7XHJcbiAgICBpZiAoZmllbGQgIT09IG51bGwgJiYgZmllbGQuTnVsbEFsbG93ZWQgJiYgY3RybC5pc01vZGlmaWFibGUoKSAmJiBjdHJsLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTilcclxuICAgICAgdGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfRURUX05VTEwsIHRydWUpO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkbyBzb21lIGRlZmF1bHQgb3BlcmF0aW9ucyBmb3IgYW4gZXZlbnQgYW5kIHJldHVybiB0cnVlIHRvIHRlbGwgdGhlIGNhbGxlclxyXG4gIC8vLyAgIHRvIGNvbnRpbnVlIGhhbmRsaW5nIHRoZSBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldnRcIj50aGUgZXZlbnQgdG8gaGFuZGxlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRlbGxzIHRoZSBjYWxsZXIgd2hldGhlciB0byBjb250aW51ZSBoYW5kbGluZyB0aGUgZXZlbnQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21tb25IYW5kbGVyQmVmb3JlKGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZSA8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGV2dFNhdmU6IFJ1blRpbWVFdmVudCA9IGV2dDtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+ZXZ0LmdldFRhc2soKTtcclxuICAgIGxldCByZWM6IFJlY29yZCA9IG51bGw7XHJcbiAgICBsZXQgcHJldlJlYzogUmVjb3JkID0gbnVsbDtcclxuICAgIGxldCB2YWw6IHN0cmluZztcclxuICAgIGxldCBvbGREaXNwbGF5TGluZTogbnVtYmVyID0gSW50MzIuTWluVmFsdWU7XHJcblxyXG4gICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAodGFzay5pc0Fib3J0aW5nKCkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9TWVNURU0pIHtcclxuICAgICAgbGV0IGFjdElkOiBudW1iZXIgPSB0aGlzLmdldE1hdGNoaW5nQWN0aW9uKCBldnQuZ2V0S2JkSXRtKCkpO1xyXG4gICAgICBpZiAoYWN0SWQgIT09IDAgJiYgZXZ0LkNvbnRyb2wgIT09IG51bGwpXHJcbiAgICAgIC8vICYmIGFjdElkICE9IE1HX0FDVF9TRUxFQ1QpXHJcbiAgICAgIHtcclxuICAgICAgICBldnQgPSBuZXcgUnVuVGltZUV2ZW50KGV2dCwgZXZ0KTtcclxuICAgICAgICBldnQuc2V0SW50ZXJuYWwoYWN0SWQpO1xyXG4gICAgICAgIGV2dC5zZXRBcmdMaXN0KG51bGwpO1xyXG4gICAgICAgIGxldCBtZ0NvbnRyb2w6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2w7XHJcbiAgICAgICAgZXZ0U2F2ZS5zZXRDdHJsKG1nQ29udHJvbCk7XHJcbiAgICAgICAgaWYgKG1nQ29udHJvbCA9PT0gbnVsbClcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFFDUiMgOTM5MjUzIC0gd2UgaGF2ZSB0byBwcm9jZXNzIGNvbW1vbkhhbmRsZXJCZWZvcmUgZXZlbiBmb3IgaW50ZXJuYWwgZXZlbnQgY29udmVydGVkXHJcbiAgICAvLyBmcm9tIHN5c3RlbSBFdmVudFxyXG4gICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuICAgICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICAgIGxldCBkaXNwbGF5TGluZTogbnVtYmVyID0gZXZ0LmdldERpc3BsYXlMaW5lKCk7XHJcbiAgICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuICAgICAgcmVjID0gZHYuZ2V0Q3VyclJlYygpO1xyXG5cclxuICAgICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2w7XHJcbiAgICAgIGxldCBpbnRFdnRDb2RlOiBudW1iZXIgPSBldnQuZ2V0SW50ZXJuYWxDb2RlKCk7XHJcblxyXG4gICAgICBsZXQgbGFzdEZvY3VzZWRDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcblxyXG4gICAgICAvLyBmb3IgaW50ZXJuYWwgZXZlbnRzXHJcbiAgICAgIHN3aXRjaCAoaW50RXZ0Q29kZSkge1xyXG4gICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NOlxyXG4gICAgICAgICAgIGxldCBib29sdmFsID0gYXdhaXQgdGhpcy5zZWxlY3RQcm9nKGN0cmwpO1xyXG4gICAgICAgICAgIGlmKGJvb2x2YWwpXHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1dFQl9PTl9EQkxJQ0s6XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9GT0NVUzpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRm9jdXMoY3RybCwgZGlzcGxheUxpbmUsIGV2dC5pc1Byb2R1Y2VDbGljaygpKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9GT0NVU19PTl9OT05fTUFHSUNfQ09OVFJPTDpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRm9jdXNPbk5vbk1hZ2ljQ29udHJvbChjdHJsKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9LRVlET1dOOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVLZXlEb3duKHRhc2ssIGN0cmwsIGV2dCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfTU9VU0VVUDpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlTW91c2VVcChjdHJsLCBkaXNwbGF5TGluZSwgZXZ0LmlzUHJvZHVjZUNsaWNrKCkpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1RJT046XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLm9uQWN0U2VsZWN0aW9uKGN0cmwsIGZvcm0sIGV2dCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RJTUVSOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVUaW1lcihldnQpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRVNJWkU6XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZVJlc2l6ZShjdHJsLCBkaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JPV19EQVRBX0NVUlJfUEFHRTpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlUm93RGF0YUN1clBhZ2UoY3RybCwgZGlzcGxheUxpbmUsIGV2dC5pc1NlbmRBbGwoKSwgZXZ0Lkxhc3RGb2N1c2VkVmFsKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRFZfVE9fR1VJOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVUcmFuc2ZlckRhdGFUb0d1aShjdHJsKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRkVUQ0hfUkVDT1JEU19BSEVBRF9GUk9NX1NFUlZFUjpcclxuICAgICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyKGN0cmwpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VOQUJMRV9FVkVOVFM6XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZUVuYWJsZUV2ZW50cyhldnQsIHRydWUpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ESVNBQkxFX0VWRU5UUzpcclxuICAgICAgICAgIHRoaXMuaGFuZGxlRW5hYmxlRXZlbnRzKGV2dCwgZmFsc2UpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1BSRUZJWDpcclxuICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVg6XHJcbiAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVg6XHJcbiAgICAgICAgICAvLyBEZWZlY3QgMTE1OTAzLiBEbyBub3QgZXhlY3V0ZSBSUCBpZiB0aGUgc3ViZm9ybSBwYXJlbnQgdGFzayBkaWRuJ3QgZmluaXNoZWQgeWV0XHJcbiAgICAgICAgICAvLyBpdCdzIENvbW1vbkhhbmRsZXJCZWZvcmUgZm9yIFJQLlxyXG4gICAgICAgICAgaWYgKHRhc2suSXNTdWJGb3JtICYmICg8VGFzaz50YXNrLmdldFBhcmVudCgpKS5JbkNvbW1vbkhhbmRsZXJCZWZvcmVSUClcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgIC8vIFJlY292ZXJ5IGZyb20gdHJhbnNhY3Rpb24gcmVzdGFydCB3YXMgY29tcGxldGVkLiBXZSBtYXkgbm93IGNsZWFyIHRoZSBmbGFnXHJcbiAgICAgICAgICB0YXNrLnNldEFmdGVyUmV0cnkoQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfTk9ORSk7XHJcbiAgICAgICAgICB0YXNrLkRhdGFTeW5jZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAoIXRhc2suaXNTdGFydGVkKCkpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcblxyXG4gICAgICAgICAgLy8gaWYgdGhlIGZvcm0gY29udGFpbnMgYSB0YWJsZSBhbmQgdGhlIGNvbnRyb2wgd2FzIGluIHRoZSB0YWJsZVxyXG4gICAgICAgICAgLy8gbW92ZSB0byB0aGUgbmV3IHJvd1xyXG4gICAgICAgICAgaWYgKGZvcm0uZ2V0Um93c0luUGFnZSgpID4gSW50MzIuTWluVmFsdWUgJiYgZGlzcGxheUxpbmUgPiBJbnQzMi5NaW5WYWx1ZSkge1xyXG4gICAgICAgICAgICAvLyBlbnN1cmUgYSB2YWxpZCByb3dcclxuICAgICAgICAgICAgd2hpbGUgKCFkdi5yZWNFeGlzdHMoZGlzcGxheUxpbmUpICYmIGRpc3BsYXlMaW5lID4gMCkge1xyXG4gICAgICAgICAgICAgIGRpc3BsYXlMaW5lLS07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGRpc3BsYXlMaW5lID49IDApIHtcclxuICAgICAgICAgICAgICBwcmV2UmVjID0gZHYuZ2V0Q3VyclJlYygpO1xyXG4gICAgICAgICAgICAgIGxldCBvbGRUYXNrTW9kZTogc3RyaW5nID0gdGFzay5nZXRNb2RlKCk7XHJcbiAgICAgICAgICAgICAgbGV0IG9sZFJlY0lkOiBudW1iZXIgPSBwcmV2UmVjLmdldElkKCk7XHJcblxyXG4gICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBvbGREaXNwbGF5TGluZSA9IGZvcm0uRGlzcGxheUxpbmU7XHJcbiAgICAgICAgICAgICAgICAvLyBvbGREaXNwbGF5TGluZSA9IGZvcm0uZ2V0Q3VyclJvdygpXHJcbiAgICAgICAgICAgICAgICBmb3JtLlByZXZEaXNwbGF5TGluZSA9IG9sZERpc3BsYXlMaW5lO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5zZXRDdXJyUm93QnlEaXNwbGF5TGluZShkaXNwbGF5TGluZSwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB0aGUgZGlzcGxheSBpZiB0aGUgcHJldmlvdXMgcmVjb3JkIHdhcyBkZWxldGVkIG9yIGNhbmNlbGVkXHJcbiAgICAgICAgICAgICAgICBpZiAocHJldlJlYyAhPSBudWxsICYmICFkdi5yZWNFeGlzdHNCeUlkKHByZXZSZWMuZ2V0SWQoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX1RBQkxFKTtcclxuICAgICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyByZWZyZXNoIGlzIGVzc2VudGlhbC4gSWYgaXQgZmFpbHMgYmVjYXVzZSBvZiBhblxyXG4gICAgICAgICAgICAgICAgICAvLyBleGNlcHRpb24gdGhlbiB0aGUgb2xkIGN1cnIgcm93IGlzIHJlc3RvcmVkIChpbiB0aGUgY2F0Y2hcclxuICAgICAgICAgICAgICAgICAgLy8gc3RhdGVtZW50KS4gSXQgY2FuIGhhcHBlbiB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiBhIGxpbmUgd2hpY2hcclxuICAgICAgICAgICAgICAgICAgLy8gYmVjb21lcyBibGFuayBkdWUgdG8gdGhlIGRlbGV0aW9uIG9mIHRoZSBwcmV2aW91cyByZWNvcmQuXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZWMgPSBkdi5nZXRDdXJyUmVjKCk7XHJcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9sZFRhc2tNb2RlID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJiBvbGREaXNwbGF5TGluZSA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICFkdi5yZWNFeGlzdHNCeUlkKG9sZFJlY0lkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHByZXZMaW5lOiBudW1iZXIgPSBmb3JtLmdldFByZXZMaW5lKG9sZERpc3BsYXlMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0ucmVzdG9yZU9sZERpc3BsYXlMaW5lKHByZXZMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0ucmVzdG9yZU9sZERpc3BsYXlMaW5lKG9sZERpc3BsYXlMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfRk9STSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBsYXN0Rm9jdXNlZEN0cmwgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICAgICAgICAgICAgICB0YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RGb2N1c2VkQ3RybCAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbGFzdEZvY3VzZWRDdHJsLmludm9rZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGUuU3RhY2tUcmFjZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgdGhyb3cgZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIEV2ZW50c01hbmFnZXIuY29tbW9uSGFuZGxlckJlZm9yZSgpOiBpbnZhbGlkIGxpbmUgbnVtYmVyOiBcIiArXHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocmVjID09IG51bGwpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcclxuICAgICAgICAgICAgICBcImluIEV2ZW50c01hbmFnZXIuY29tbW9uSGFuZGxlckJlZm9yZSgpOiBubyBjdXJyZW50IHJlY29yZCBhdmFpbGFibGUgIVwiKTtcclxuXHJcbiAgICAgICAgICAvLyBvbmx5IGZvciBub24gaW50ZXJhY3RpdmUgdGFza3MuIEluY3JlYXNlIHRoZSB0YXNrJ3MgY291bnRlciBmb3IgZXZlcnkgcmVjb3JkIHdlIHBhc3MuXHJcbiAgICAgICAgICAvLyBkbyBpdCBiZWZvcmUgdGhlIGV2YWxFbmRDb25kIHNpbmNlIGl0IG1pZ2h0IGluY2x1ZGUgY291bnRlcigwKS5cclxuICAgICAgICAgIC8vIGluY3JlYXNlIG9ubHkgaWYgZ29pbmcgaW50byB0aGUgcmVjIHByZWZpeC5cclxuICAgICAgICAgIGlmICghdGFzay5Jc0ludGVyYWN0aXZlICYmIHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICAgICAgdGFzay5pbmNyZWFzZUNvdW50ZXIoKTtcclxuXHJcbiAgICAgICAgICAvLyBjaGVjayB0aGUgXCJ0YXNrIGVuZCBjb25kaXRpb25cIiBiZWZvcmUgZW50ZXJpbmcgdGhlIHJlY29yZFxyXG4gICAgICAgICAgaWYgKGF3YWl0IHRhc2suZXZhbEVuZENvbmQoQ29uc3RJbnRlcmZhY2UuRU5EX0NPTkRfRVZBTF9CRUZPUkUpKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZm9ybS5IYXNUYWJsZSgpKVxyXG4gICAgICAgICAgICBhd2FpdCBmb3JtLmJyaW5nUmVjb3JkVG9QYWdlKCk7XHJcblxyXG4gICAgICAgICAgLy8gdG8gcHJldmVudCBkb3VibGUgcHJlZml4IG9uIHRoZSBzYW1lIHJlY29yZFxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcblxyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJSRUNPUkQgUFJFRklYOiBcIiArIHRhc2sucXVlcnlUYXNrUGF0aCgpKTtcclxuICAgICAgICAgIChkdi5nZXRDdXJyUmVjKCkpLnNldEZvcmNlU2F2ZU9yZyhmYWxzZSk7XHJcbiAgICAgICAgICAoZHYuZ2V0Q3VyclJlYygpKS5TeW5jZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICBkdi5zYXZlT3JpZ2luYWwoKTtcclxuXHJcbiAgICAgICAgICAvLyBkbyBSZWNvcmQgUHJlZml4IGZvciBhbGwgZmF0aGVycyB0aGF0IHRoZWlyIFJlY29yZCBQcmVmaXggaXMgbm90IGRvbmUgZWFybGllclxyXG4gICAgICAgICAgaWYgKHRhc2suSXNTdWJGb3JtICYmIHRhc2suUGVyZm9ybVBhcmVudFJlY29yZFByZWZpeCkge1xyXG4gICAgICAgICAgICBsZXQgcGFyZW50VGFzayA9IHRhc2suZ2V0UGFyZW50KCk7XHJcbiAgICAgICAgICAgIHdoaWxlIChwYXJlbnRUYXNrLklzU3ViRm9ybSkge1xyXG4gICAgICAgICAgICAgIGlmIChwYXJlbnRUYXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHBhcmVudFRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudFRhc2sgPSBwYXJlbnRUYXNrLmdldFBhcmVudCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGhhbmRsZSBzdWItZm9ybXNcclxuICAgICAgICAgIHRhc2suSW5Db21tb25IYW5kbGVyQmVmb3JlUlAgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKGF3YWl0IHRhc2suQ2hlY2tSZWZyZXNoU3ViVGFza3MoKSlcclxuICAgICAgICAgICAgYXdhaXQgZHYuY29tcHV0ZVN1YkZvcm1zKCk7XHJcbiAgICAgICAgICB0YXNrLkluQ29tbW9uSGFuZGxlckJlZm9yZVJQID0gZmFsc2U7XHJcbiAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1JFQ09SRCk7XHJcbiAgICAgICAgICAvLyBlbmFibGUtZGlzYWJsZSBhY3Rpb25zIGZvciBhIHJlY29yZFxyXG4gICAgICAgICAgYXdhaXQgdGFzay5lbmFibGVSZWNvcmRBY3Rpb25zKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWDpcclxuICAgICAgICAgIC8vIEZvcmNlIHJlY29yZCBzdWZmaXg6XHJcbiAgICAgICAgICBsZXQgZm9yY2VTdWZmaXg6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICAgIGxldCBpc1NlbGVjdGlvblRhYmxlOiBib29sZWFuO1xyXG5cclxuICAgICAgICAgIHRhc2suQ29uZmlybVVwZGF0ZU5vID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgLy8gTm8gcmVjb3JkIC0+IG5vIHN1ZmZpeFxyXG4gICAgICAgICAgaWYgKHJlYyA9PSBudWxsKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgZm9yY2VTdWZmaXggPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAvLyBkbyBub3QgZXhlY3V0ZSB0aGUgXCJiZWZvcmUgcmVjb3JkIHN1ZmZpeFwiIHdoZW4gZGVsZXRpbmcgdGhlIHJlY29yZCBhbmRcclxuICAgICAgICAgIC8vIHRoZSB0YXNrIG1vZGUgaXMgZGVsZXRlICh0aGUgc2Vjb25kIHJvdW5kKVxyXG4gICAgICAgICAgaWYgKChyZWMuTW9kaWZpZWQgfHwgZm9yY2VTdWZmaXgpICYmIHJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUgJiZcclxuICAgICAgICAgICAgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFKVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAvLyB0byBwcmV2ZW50IGRvdWJsZSBzdWZmaXggb24gdGhlIHNhbWUgcmVjb3JkXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCkge1xyXG4gICAgICAgICAgICB0YXNrLnNldEluUmVjb3JkU3VmZml4KHRydWUpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZSh0YXNrLmdldExhc3RQYXJrZWRDdHJsKCksIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcbiAgICAgICAgICAgIHRhc2suc2V0SW5SZWNvcmRTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgYXdhaXQgdGFzay5oYW5kbGVFdmVudE9uU2xhdmVUYXNrcyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJSRUNPUkQgU1VGRklYOiBcIiArIHRhc2sucXVlcnlUYXNrUGF0aCgpKTtcclxuXHJcblxyXG4gICAgICAgICAgLy8gaW5kaWNhdGUgbmV4dCB2ZXJpZnlDdHJsIGlzIHRoZSBmaXJzdCBjdHJsIGluIHRoZSByZWNvcmRcclxuXHJcbiAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG5cclxuICAgICAgICAgIGlzU2VsZWN0aW9uVGFibGUgPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RJT04sIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAvLyBRdWVyeSBtb2RlIC0+IGRvIHN1ZmZpeCBvbmx5IGlmIHdlIGZvcmNlIGl0IG9yIHNvbWVob3cgdGhlIHJlY29yZCB3YXMgdXBkYXRlZFxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZICYmICFmb3JjZVN1ZmZpeCAmJiAhcmVjLk1vZGlmaWVkICYmXHJcbiAgICAgICAgICAgICFpc1NlbGVjdGlvblRhYmxlKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKCFyZWMuTW9kaWZpZWQgJiYgIWZvcmNlU3VmZml4ICYmICghaXNTZWxlY3Rpb25UYWJsZSB8fCAhdGFzay5JblNlbGVjdCkpIHtcclxuICAgICAgICAgICAgaWYgKHJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUpe1xyXG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVDb250cm9sVmVyaWZpY2F0aW9uKHRhc2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFICYmIHJlYy5Nb2RpZmllZCkge1xyXG4gICAgICAgICAgICBpZiAoISBhd2FpdCB0aGlzLnVwZGF0ZUNvbmZpcm1lZCh0YXNrKSlcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbGV0IHN0b3BFeGVjdXRpb246IGJvb2xlYW4gPSAhYXdhaXQgdGhpcy5leGVjdXRlQ29udHJvbFZlcmlmaWNhdGlvbih0YXNrKTtcclxuICAgICAgICAgIC8vIGRvIG5vdCBjb250aW51ZSBwcm9jZXNzaW5nIFJTIGlmIENWIHJldHVybnMgZXJyb3JcclxuICAgICAgICAgIGlmIChzdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVg6XHJcbiAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5oYW5kbGVDdHJsUHJlZml4KGV2dCkpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGRpZCBub3Qgc3VjY2VlZCBpbiBlbnRlcmluZyB0aGUgY3RybFxyXG4gICAgICAgICAgICBldnQuQ29udHJvbC5JbkNvbnRyb2wgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUw6XHJcbiAgICAgICAgICBNYW5hZ2VyLkNsZWFuTWVzc2FnZVBhbmUodGFzayk7IC8vIFFDUiAjMzcxMzIxXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVg6XHJcblxyXG4gICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIHN0b3BleGVjdXRpb24gY3RybCB3ZSBzaG91bGQgbm90IGV4ZWN1dGUgQ1MuXHJcbiAgICAgICAgICBpZiAoY3RybCA9PSBudWxsIHx8IHRoaXMuZ2V0U3RvcEV4ZWN1dGlvbkN0cmwoKSAhPSBudWxsKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgLy8gdG8gcHJldmVudCBkb3VibGUgc3VmZml4IG9uIHRoZSBzYW1lIGNvbnRyb2xcclxuICAgICAgICAgIGlmICh0YXNrLmdldExldmVsKCkgIT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAoIWN0cmwuaXNTdWJmb3JtKCkpIHtcclxuICAgICAgICAgICAgdmFsID0gTWFuYWdlci5HZXRDdHJsVmFsKGN0cmwpO1xyXG5cclxuICAgICAgICAgICAgLy8gV2UgYXJlIHJlc2V0dGluZyB0aGUgZmxhZyBhcyB3ZSBhcmUgbW92aW5nIGZyb20gb25lIGNvbnRyb2wgdG8gb3RoZXIgY29udHJvbC5cclxuICAgICAgICAgICAgdGFzay5DdXJyZW50RWRpdGluZ0NvbnRyb2wgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgLy8gdmFsaWRhdGUgdGhlIGNvbnRyb2xzIHZhbHVlXHJcbiAgICAgICAgICAgIC8vIEZpeGVkIGJ1ZyAjOjc1ODc4OCwgdGhlIGJyb3dzZXIgY29udHJvbCB3aWxsIG5vdCBiZSB1cGRhdGUgZnJvbSB0aGUgZmlsZWQuXHJcbiAgICAgICAgICAgIC8vIFBhdGNoIGZvciBRQ1IgIzcyOTcwNjpcclxuICAgICAgICAgICAgLy8gTWFnaWMgdGhyZWFkIHB1dHMgdGhlIGZvbGxvd2luZyBHVUkgY29tbWFuZHM6XHJcbiAgICAgICAgICAgIC8vICAgIFBST1BfU0VUX0lNQUdFX0ZJTEVfTkFNRSB0byBzZXQgdGhlIGltYWdlIG9uIHRoZSBJbWFnZSBjb250cm9sLlxyXG4gICAgICAgICAgICAvLyAgICBQUk9QX1NFVF9URVhUIHRvIHNldCB0aGUgdGV4dCBvZiB0aGUgVGV4dEJveCBjb250cm9sLlxyXG4gICAgICAgICAgICAvLyAgICBTRVRfRk9DVVMgdG8gZm9jdXMgb24gdGhlIFRleHRCb3ggY29udHJvbC5cclxuICAgICAgICAgICAgLy8gTm93LCB3aGVuIHRoZSBleGVjdXRpb24gaXMgYnkgRjcsIGlmIHRoZSBmaWxlIGlzIG5vdCByZXRyaWV2ZWQgZnJvbSB0aGUgc2VydmVyXHJcbiAgICAgICAgICAgIC8vIChpLmUuIGlmIHRoZXJlIGlzIDQwNCBlcnJvciksIEh0dHBDbGllbnQgcmUtdHJpZXMgdG8gZ2V0IHRoZSBmaWxlIGZvciBIVFRQdGltZW91dC5cclxuICAgICAgICAgICAgLy8gRHVyaW5nIHRoaXMgdGltZSBhbGwgdGhlIEdVSSBldmVudHMgaW4gR3VpQ29tbWFuZHNRdWV1ZSByZW1haW5zIHBlbmRpbmcgdW5oYW5kbGVkLlxyXG4gICAgICAgICAgICAvLyBJbiB0aGUgbWVhbiB0aW1lLCBNYWdpYyB0aHJlYWQgZXhlY3V0ZXMgdGhlIEV4aXQgZXZlbnQgYW5kIGR1cmluZyB0aGlzLCBpdCB0cmllc1xyXG4gICAgICAgICAgICAvLyB0byBleGVjdXRlIHRoZSBDdHJsIFN1ZmZpeCBvZiB0aGUgVGV4dEJveCBjb250cm9sLlxyXG4gICAgICAgICAgICAvLyBTaW5jZSBTRVRfRk9DVVMgaXMgc3RpbGwgcGVuZGluZyBpbiB0aGUgcXVldWUsIHRoZSBsb2dpY2FsIGNvbnRyb2wgKGlmIGFsbG93VGVzdGluZz1ObylcclxuICAgICAgICAgICAgLy8gaXMgbm90IG1hcHBlZCB3aXRoIGFueSBhY3R1YWwgd2luZG93cyBjb250cm9sLlxyXG4gICAgICAgICAgICAvLyBOb3cgd2hlbiB3ZSB0cnkgdG8gZ2V0IHRoZSB2YWx1ZSBvZiB0aGlzIGxvZ2ljYWwgY29udHJvbCwgTG9naWNhbENvbnRyb2wuZ2V0RWRpdG9yQ29udHJvbCgpXHJcbiAgICAgICAgICAgIC8vIHJldHVybnMgbnVsbCBhbmQgc28sIFN0YXRpY1RleHQuZ2V0VmFsdWUoKSByZXR1cm5zIExvZ2ljYWxDb250cm9sLlRleHQgaW5zdGVhZCBvZiBDb250cm9sLlRleHRcclxuICAgICAgICAgICAgLy8gQmVjYXVzZSBQUk9QX1NFVF9URVhUIGlzIGFsc28gcGVuZGluZywgTG9naWNhbENvbnRyb2wuVGV4dCBpcyBudWxsLlxyXG4gICAgICAgICAgICAvLyBBbmQgc28gdGhlcmUgaXMgYW4gZXhjZXB0aW9uIHdoZW4gdXNpbmcgaXQuXHJcbiAgICAgICAgICAgIC8vIElmIEFsbG93VGVzdGluZz1ZZXMsIHRoZSB2YWwgd2lsbCBiZSBhIGJsYW5rIHN0cmluZy4gU28sIHRoZXJlIGlzIG5vIGNyYXNoLlxyXG4gICAgICAgICAgICAvLyBCdXQgaGVyZSB3ZSBoYXZlIGFub3RoZXIgcHJvYmxlbS4gU3VwcG9zZSwgdGhlIGZpZWxkIGhhZCBhbiBJbml0IGV4cHJlc3Npb24uXHJcbiAgICAgICAgICAgIC8vIE5vdywgTWdDb250cm9sJ3MgdmFsdWUgd291bGQgYmUgdGhlIGluaXRlZCB2YWx1ZSBhbmQgdGhlIHZhbCBpcyBhIGJsYW5rIHN0cmluZy5cclxuICAgICAgICAgICAgLy8gU28sIHdlIHdpbGwgaGF2ZSB2YXJpYWJsZSBjaGFuZ2UuXHJcbiAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBwcm9ibGVtIGlzIHJlbGF0ZWQgdG8gYSB2ZXJ5IHNwZWNpZmljIHNjZW5hcmlvIC0tIHdoZW4gdGhlIGltYWdlIGNvbnRyb2wgd2FzXHJcbiAgICAgICAgICAgIC8vIHRoZSBmaXJzdCBkcm9wcGVkIGNvbnRyb2wgb24gdGhlIGZvcm0sIGltYWdlIGNhbm5vdCBiZSBhY2Nlc3NlZCBhdCB0aGUgdGltZSBvZiB0YXNrXHJcbiAgICAgICAgICAgIC8vIGxvYWRpbmcgYW5kIHRhc2sgbmVlZHMgdG8gYmUgY2xvc2VkLCB3ZSBhcmUgcHV0dGluZyBhIHBhdGNoIGhlcmUgYnkgY2hlY2tpbmcgdmFsIGZvciBOVUxMLlxyXG4gICAgICAgICAgICAvLyBUaGUgaWRlYWwgc29sdXRpb24gd291bGQgYmUgLS0tIGluc3RlYWQgb2Ygc2VuZGluZyB0aGUgaW1hZ2UgZmlsZSBuYW1lIGZyb20gTWFnaWMgdGhyZWFkXHJcbiAgICAgICAgICAgIC8vIHRvIEd1aSB0aHJlYWQgYW5kIGxvYWRpbmcgdGhlIGltYWdlIGZyb20gdGhlIEd1aSB0aHJlYWQsIHdlIGNhbiBsb2FkIHRoZSBpbWFnZSBmcm9tIHRoZVxyXG4gICAgICAgICAgICAvLyBNYWdpYyB0aHJlYWQgKHVzaW5nIHN5bmMgZXhlY3V0aW9uIGkuZS4gdmlhIEd1aUludGVyYWN0aXZlKSBhbmQgc2VuZCBpdCB0byB0aGUgR3VpIHRocmVhZC5cclxuICAgICAgICAgICAgaWYgKCF0YXNrLmNhbmNlbFdhc1JhaXNlZCgpICYmXHJcbiAgICAgICAgICAgICAgKGN0cmwuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlJPV1NFUiAmJiAoIWlzTnVsbE9yVW5kZWZpbmVkKGN0cmwuX2ZpZWxkKSAmJiBjdHJsLl9maWVsZC5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fCB2YWwgIT09IG51bGwpICYmIHR5cGVvZiB2YWwgIT0gXCJ1bmRlZmluZWRcIiAmJlxyXG4gICAgICAgICAgICAgICAgIWF3YWl0IGN0cmwudmFsaWRhdGVBbmRTZXRWYWx1ZSh2YWwsIHRydWUpKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyB3aGVuIHN0b3AgZXhlY3V0aW9uIGluIG9uLCBkb24ndCBjbGVhciB0aGUgbXNnIGZyb20gc3RhdHVzLlxyXG4gICAgICAgICAgaWYgKCF0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgICAgICBNYW5hZ2VyLkNsZWFuTWVzc2FnZVBhbmUodGFzayk7XHJcblxyXG4gICAgICAgICAgLy8gcmVzZXQgSW5Db250cm9sIGJlZm9yZSBleGVjdXRpbmcgY29udHJvbCB2ZXJpZmljYXRpb25cclxuICAgICAgICAgIGN0cmwuSW5Db250cm9sID0gZmFsc2U7XHJcbiAgICAgICAgICBjdHJsLkNsaXBCb2FyZERhdGFFeGlzdHMgPSBmYWxzZTtcclxuICAgICAgICAgIGN0cmwuVmFsaWRhdGVDb250cm9sID0gdHJ1ZTtcclxuICAgICAgICAgIGN0cmwuc2V0SW5Db250cm9sU3VmZml4KHRydWUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZXhlY3V0ZSBhIHNlbGVjdCBwcm9ncmFtIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHByb2dyYW0gd2FzIGV4ZWN1dGVkICA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPnRoZSBzb3VyY2UgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicHJvbXB0XCI+aWYgdHJ1ZSB0aGVuIHRoZSBjYWxsZXIgaXMgZXhlY3V0aW5nIHRoZSBjYWxsZWQgcHJvZ3JhbSBhdCB0aGUgZW5kIG9mIGNvbnRyb2wgcHJlZml4PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByb3RlY3RlZCBhc3luYyBzZWxlY3RQcm9nKCBjdHJsOk1nQ29udHJvbCk6IFByb21pc2U8Ym9vbGVhbj5cclxuICB7XHJcbiAgICBsZXQgY21kIDogSUNsaWVudENvbW1hbmQgO1xyXG4gICAgbGV0IHZhbHVlOiBTdHJpbmc7XHJcbiAgICBsZXQgbWdWYWw6IHN0cmluZztcclxuICAgIGxldCBwcm9nRXhlY3V0ZWQgPSBmYWxzZTtcclxuICAgIGxldCB0YXNrID0gPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG5cclxuICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIHNlbGVjdCBwcm9ncmFtIHRvIHRoZSBjb250cm9sXHJcbiAgICBpZiAoY3RybC5IYXNTZWxlY3RQcm9ncmFtKCkpXHJcbiAgICB7XHJcbiAgICAgIC8vY2hlY2sgaWYgdGhlIGNvbnRyb2wgaXMgcGFya2FibGVcclxuICAgICAgaWYgKGN0cmwuSXNQYXJrYWJsZSgpKVxyXG4gICAgICB7XHJcblxyXG4gICAgICAgIHZhbHVlID0gTWFuYWdlci5HZXRDdHJsVmFsKGN0cmwpO1xyXG5cclxuICAgICAgICAvLyB2YWxpZGF0ZSB0aGUgY29udHJvbHMgdmFsdWVcclxuICAgICAgICBpZiAoIWN0cmwudmFsaWRhdGVBbmRTZXRWYWx1ZSh2YWx1ZSwgZmFsc2UpKVxyXG4gICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGV0ICBlbmNvZGVkVmFsOnN0cmluZyA9IG51bGw7XHJcbiAgICAgICAgICBtZ1ZhbCA9ICBhd2FpdCBjdHJsLmdldE1nVmFsdWUodmFsdWUpO1xyXG4gICAgICAgICAgdmFyIHJlYyA9ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgICAgICAgZW5jb2RlZFZhbCA9IHJlYy5nZXRYTUxGb3JWYWx1ZShjdHJsLmdldEZpZWxkKCkuZ2V0SWQoKSwgbWdWYWwpO1xyXG4gICAgICAgICAgY21kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlU2VsZWN0UHJvZ3JhbUNvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIG51bGwsIEludDMyLk1pblZhbHVlLCBjdHJsLmdldERpdElkeCgpLCBlbmNvZGVkVmFsKTtcclxuICAgICAgICAgIHRhc2suZ2V0TUdEYXRhKCkuQ21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG5cclxuICAgICAgICAgIGxldCBjb21tYW5kc1Byb2Nlc3NvclNlcnZlcjpDb21tYW5kc1Byb2Nlc3NvckJhc2UgPSBDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXIuR2V0Q29tbWFuZHNQcm9jZXNzb3IoKTtcclxuICAgICAgICAgIGF3YWl0IGNvbW1hbmRzUHJvY2Vzc29yU2VydmVyLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG5cclxuICAgICAgICAgIHByb2dFeGVjdXRlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgcmV0dXJuIHByb2dFeGVjdXRlZDtcclxufVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVDb250cm9sVmVyaWZpY2F0aW9uKHRhc2s6VGFzayk6UHJvbWlzZSA8Ym9vbGVhbj4ge1xyXG5cclxuICAgIC8vIGNoZWNrIGFsbCBoYW5kbGVycyBpZiBpdCBpcyBjb250cm9sIHZlcmlmaWNhdGlvbi4gRXhlY3V0ZSBhbGwgU1YgaGFuZGxlcnNcclxuICAgIGxldCB0YWJsZTpIYW5kbGVyc1RhYmxlICA9IHRhc2suZ2V0SGFuZGxlcnNUYWIoKTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0YWJsZS5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICBsZXQgaGFuZGxlcjogRXZlbnRIYW5kbGVyID0gdGFibGUuZ2V0SGFuZGxlcihpKTtcclxuICAgICAgbGV0IGV2dDogRXZlbnQgPSBoYW5kbGVyLmdldEV2ZW50KCk7XHJcbiAgICAgIGlmIChldnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1ZFUklGSUNBVElPTikge1xyXG4gICAgICAgIGxldCBjb250cm9sOiBNZ0NvbnRyb2wgPSAoKHRhc2suZ2V0Rm9ybSgpICE9PSBudWxsKSA/ICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5nZXRDdHJsQnlDdHJsTmFtZShoYW5kbGVyLmdldEN0cmxOYW1lKCkpIDogbnVsbCk7XHJcbiAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChjb250cm9sKSkge1xyXG4gICAgICAgICAgbGV0IHJ1blRpbWVFdmVudDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjb250cm9sKTtcclxuICAgICAgICAgIHJ1blRpbWVFdmVudC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9WRVJJRklDQVRJT04pO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydW5UaW1lRXZlbnQsIGZhbHNlKTtcclxuICAgICAgICAgIGlmKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgZXJyb3IsIHBhcmsvZm9jdXMgb24gdGhpcyBjb250cm9sIHdoZXJlIGVycm9yIG9jY3VycyBpbiBDViBleGVjdXRpb24uXHJcbiAgICAgICAgICAgIExhc3RGb2N1c2VkTWFuYWdlci5zZXRMYXN0Rm9jdXNlZENvbnRyb2wodGFzaywgY29udHJvbCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwobnVsbCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwoY29udHJvbCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgYXN5bmMgb25BY3RTZWxlY3Rpb24oY3RybDogTWdDb250cm9sLCBmb3JtOiBNZ0Zvcm0sIGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZGlzcGxheUxpbmU6IG51bWJlciA9IGV2dC5nZXREaXNwbGF5TGluZSgpO1xyXG4gICAgaWYgKGRpc3BsYXlMaW5lID09PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgZGlzcGxheUxpbmUgPSBmb3JtLkRpc3BsYXlMaW5lO1xyXG5cclxuICAgIGxldCBzaW11bGF0ZTogYm9vbGVhbiA9IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1ggfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04gfHwgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCICYmICFldnQuaXNQcm9kdWNlQ2xpY2soKSk7XHJcbiAgICBpZiAoc2ltdWxhdGUpXHJcbiAgICAgIGF3YWl0IHRoaXMuc2ltdWxhdGVTZWxlY3Rpb24oY3RybCwgZXZ0LmdldFZhbHVlKCksIGRpc3BsYXlMaW5lLCBldnQuaXNQcm9kdWNlQ2xpY2soKSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlU2VsZWN0aW9uKGN0cmwsIGRpc3BsYXlMaW5lLCBldnQuZ2V0VmFsdWUoKSk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGUgdGhlIE1HX0FDVF9TVUJGT1JNX0NMT1NFXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvcm1cIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2dFwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgb25TdWJmb3JtQ2xvc2UodGFzazogVGFzaywgZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBpZiAoKGV2dC5nZXRBcmdMaXN0KCkgIT0gbnVsbCkgJiYgKGV2dC5nZXRBcmdMaXN0KCkuZ2V0U2l6ZSgpID09PSAxKSkge1xyXG4gICAgICBsZXQgc3ViZm9ybUN0cmw6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgICAgIGxldCBjbG9zaW5nU3ViZm9ybU5hbWU6IHN0cmluZyA9IGF3YWl0IGV2dC5nZXRBcmdMaXN0KCkuZ2V0QXJnVmFsdWUoMCwgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSwgMCk7XHJcblxyXG4gICAgICAvLyBRQ1IgIzI4MzExNC4gQXJndW1lbnQgb2YgJ1N1YmZvcm0gcmVmcmVzaCBldmVudCcgY2FuIGJlIHNraXBwZWQgb3Igbm90IGV4aXN0LlxyXG4gICAgICBpZiAoY2xvc2luZ1N1YmZvcm1OYW1lID09IG51bGwpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgLy8gUlMgbXVzdCBiZSBleGVjdXRlZCBvbmx5IGlmIHRoZSBjdXJyZW50IHN1YmZvcm0gaXMgcmVmcmVzaGVkLlxyXG4gICAgICAvLyBJZiBpdHMgYnJvdGhlciBpcyByZWZyZXNoZWQgd2UgZG8gbm90IG5lZWQgdG8gZXhlY3V0ZSBSUyBvZiB0aGUgY3VycmVudCB0YXNrLlxyXG4gICAgICAgIGZvciAobGV0IHBhcmVudFRhc2s6IFRhc2sgPSB0YXNrOyBwYXJlbnRUYXNrLmdldEZvcm0oKSAhPSBudWxsICYmIHBhcmVudFRhc2suZ2V0TWdkSUQoKSA9PT0gdGFzay5nZXRNZ2RJRCgpOyBwYXJlbnRUYXNrID0gPFRhc2s+cGFyZW50VGFzay5nZXRQYXJlbnQoKSkge1xyXG4gICAgICAgICAgc3ViZm9ybUN0cmwgPSA8TWdDb250cm9sPnBhcmVudFRhc2suZ2V0Rm9ybSgpLmdldEN0cmxCeU5hbWUoY2xvc2luZ1N1YmZvcm1OYW1lLnRyaW0oKSwgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STSk7XHJcbiAgICAgICAgICBpZiAoc3ViZm9ybUN0cmwgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBsZXQgc3ViZm9ybVRhc2s6IFRhc2sgPSA8VGFzaz5zdWJmb3JtQ3RybC5nZXRTdWJmb3JtVGFzaygpO1xyXG4gICAgICAgICAgICAvLyBJZiB0aGUgc3ViZm9ybSB0YXNrIHdhcyBub3Qgb3BlbmVkIHlldCwgYnV0IHN1YmZvcm0gcmVmcmVzaCBpcyBkb25lLFxyXG4gICAgICAgICAgICAvLyBpdCdzIG5lZWRlZCB0byBvcGVuIHRoZSBzdWJmb3JtLiBRQ1IgIzQxNTkxNC5cclxuICAgICAgICAgICAgaWYgKHN1YmZvcm1UYXNrICE9IG51bGwgJiYgIXN1YmZvcm1UYXNrLklzUm91dGUoKSkge1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGVyZm9ybVN1YmZvcm1DbG9zZShzdWJmb3JtQ3RybCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBlcmZvcm1TdWJmb3JtQ2xvc2UoKSAgIDogQ2xvc2VzIHRoZSBzdWJmb3JtIHRhc2sgb3BlbmVkIGluIHRoZSBzdWJmb3JtQ3RybFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdWJmb3JtQ3RybFwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHB1YmxpYyBhc3luYyBwZXJmb3JtU3ViZm9ybUNsb3NlIChzdWJmb3JtQ3RybDogTWdDb250cm9sKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgc3ViZm9ybVRhc2s6IFRhc2sgPSA8VGFzaz5zdWJmb3JtQ3RybC5nZXRTdWJmb3JtVGFzaygpO1xyXG4gICAgbGV0IHBhcmVudFRhc2s6IFRhc2sgPSA8VGFzaz5zdWJmb3JtQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG5cclxuICAgIGxldCBtZ2Q6IE1HRGF0YSA9IHN1YmZvcm1UYXNrLmdldE1HRGF0YSgpO1xyXG4gICAgdGhpcy5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgYXdhaXQgc3ViZm9ybVRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgdGhpcy5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICBpZiAoIXRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICB7XHJcbiAgICAgIHBhcmVudFRhc2suVGFza1NlcnZpY2UuUmVtb3ZlUmVjb21wdXRlcyhwYXJlbnRUYXNrKTtcclxuICAgICAgYXdhaXQgc3ViZm9ybVRhc2suc3RvcCgpO1xyXG5cclxuICAgICAgc3ViZm9ybUN0cmwucmVzZXRTdWJmb3JtVGFzaygpO1xyXG4gICAgICBhd2FpdCBDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXIuR2V0Q29tbWFuZHNQcm9jZXNzb3IoKS5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuICAgICAgQ29tbWFuZHMuYWRkQ2xvc2VzdWJmb3JtKENvbW1hbmRUeXBlLkNMT1NFX1NVQl9GT1JNLCBzdWJmb3JtQ3RybCwgc3ViZm9ybVRhc2suZ2V0VGFza1RhZygpLCAoPE1nQ29udHJvbEJhc2U+c3ViZm9ybUN0cmwpLmdldE5hbWUoKSwgc3ViZm9ybVRhc2suZ2V0Rm9ybSgpLmJ1aWxkRm9ybU5hbWUoKSk7XHJcblxyXG4gICAgICAvLyBTZXQgbWdkLmFib3J0KCksIGluIG9yZGVyIHRvIGNsb3NlIGN1cnJlbnQgZXZlbnQgbG9vcCBvZiBNb2RhbCBzdWJmb3JtLlxyXG4gICAgICAvLyBhbmQgcmVzZXQgaXQgYmFjayB0byBmYWxzZSBvbmNlIGl0IGNvbWVzIG91dCBvZiBjdXJyZW50IGV2ZW50c2xvb3AoKS5cclxuICAgICAgaWYgKCg8TWdDb250cm9sQmFzZT5zdWJmb3JtQ3RybCkuSXNNb2RhbCgpKVxyXG4gICAgICAgIG1nZC5hYm9ydCgpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgbW92ZSB0byBhbiBvdGhlciBsaW5lIGFuZCBmb2N1cyBvbiBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvcm1cIj4gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BsYXlMaW5lXCI+bGluZSB0byBtb3ZlIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbCB0byBmb2N1cyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgbW92ZVRvTGluZShmb3JtOiBNZ0Zvcm0sIGRpc3BsYXlMaW5lOiBudW1iZXIsIGN0cmw6IE1nQ29udHJvbCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHJ1blRpbWVFdmVudDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsLCBkaXNwbGF5TGluZSk7XHJcbiAgICBydW5UaW1lRXZlbnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ1blRpbWVFdmVudCwgZmFsc2UpO1xyXG4gICAgaWYgKGN0cmwgIT09IG51bGwpXHJcbiAgICAgICAgYXdhaXQgY3RybC5pbnZva2UoKTtcclxuXHJcbiAgICBmb3JtLlNlbGVjdFJvdyh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxjdWxhdGUgYXJndW1lbnRzIGZvciBldmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+IDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBjcmVhdGVFdmVudEFyZ3VtZW50cyhldnQ6IFJ1blRpbWVFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKGV2dC5nZXRBcmdMaXN0KCkgPT09IG51bGwpIHtcclxuICAgICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuICAgICAgICBzd2l0Y2ggKGV2dC5nZXRJbnRlcm5hbENvZGUoKSkge1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkb1N1ZmZpeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBEb1Rhc2tMZXZlbFJlY29yZFN1ZmZpeCh0YXNrOiBUYXNrQmFzZSwgcmVmRG9TdWZmaXg6IFJlZlBhcmFtPGJvb2xlYW4+KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgc2hvdWxkUmV0dXJuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpIHtcclxuICAgICAgcmVmRG9TdWZmaXgudmFsdWUgPSBmYWxzZTtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICBpZiAodGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgIHNob3VsZFJldHVybiA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNob3VsZFJldHVybjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZvcm1cIj48L3BhcmFtPlxyXG4gIGFzeW5jIERvVGFza0xldmVsUmVjb3JkUHJlZml4KHRhc2s6IFRhc2tCYXNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZG8gdGhlIG1hZ2ljIGRlZmF1bHQgb3BlcmF0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIGludGVybmFsIGV2ZW50IGNvZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+dGhlIGV2ZW50IHRvIGhhbmRsZSA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGVsbHMgdGhlIGNhbGxlciB3aGV0aGVyIHRvIGNvbnRpbnVlIGhhbmRsaW5nIHRoZSBldmVudCA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21tb25IYW5kbGVyKGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPmV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgbWdEYXRhOiBNR0RhdGEgPSB0YXNrLmdldE1HRGF0YSgpO1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5ldnQuQ29udHJvbDtcclxuICAgIGxldCBsYXN0UGFya2VkQ3RybDogTWdDb250cm9sO1xyXG4gICAgbGV0IGRvU3VmZml4OiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCBvbGRNb2RlOiBzdHJpbmc7XHJcbiAgICBsZXQgc2VydmVyOiBDb21tYW5kc1Byb2Nlc3NvckJhc2UgPSBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yO1xyXG5cclxuICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgLy8gaWYgdGhpcyBpcyBhIHVzZXIgZXZlbnQgdGhhdCBjb252ZXJ0cyB0byBhIHN5c3RlbSBvciBpbnRlcm5hbCBldmVuLCBjb252ZXJ0IGl0XHJcbiAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSKVxyXG4gICAgICBldnQgPSBuZXcgUnVuVGltZUV2ZW50KGV2dC5nZXRVc2VyRXZlbnQoKSwgZXZ0KTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLnB1c2hSdEV2ZW50KGV2dCk7XHJcblxyXG4gICAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9TWVNURU0pIHtcclxuICAgICAgICBsZXQgYWN0SWQ6IG51bWJlciA9IHRoaXMuZ2V0TWF0Y2hpbmdBY3Rpb24oICBldnQuZ2V0S2JkSXRtKCkpO1xyXG4gICAgICAgIGlmIChhY3RJZCAhPT0gMClcclxuICAgICAgICAvLyBoYW5kbGVkIGludGVybmFsbHlcclxuICAgICAgICB7XHJcbiAgICAgICAgICBldnQgPSBuZXcgUnVuVGltZUV2ZW50KGV2dCwgZXZ0KTtcclxuICAgICAgICAgIGV2dC5zZXRJbnRlcm5hbChhY3RJZCk7XHJcbiAgICAgICAgICBldnQuc2V0QXJnTGlzdChudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0vLyBlbmQgb2Ygc3lzdGVtIGV2ZW50cyBwcm9jZXNzaW5nXHJcblxyXG4gICAgICAvLyBleGVjdXRlIHRoZSBjb21tb24gaGFuZGxpbmcgb2YgaW50ZXJuYWwgZXZlbnRzIG9ubHkgaWYgdGhleSBhcmUgbm90IGltbWVkaWF0ZS5cclxuICAgICAgLy8gYW4gZXZlbnQgaXMgaW1tZWRpYXRlIHdoZW4gaXQgd2FzIHJhaXNlZCBieSBhIHJhaXNlIGV2ZW50IG9wZXJhdGlvbiB0aGF0IGl0c1xyXG4gICAgICAvLyB3YWl0IGNvbmRpdGlvbiBpcyB5ZXMgb3IgZXZhbHVhdGVzIHRvIHRydWUuXHJcbiAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kO1xyXG4gICAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiAhZXZ0LmlzSW1tZWRpYXRlKCkgJiYgdGhpcy5BY3RBbGxvd2VkKGV2dC5nZXRJbnRlcm5hbENvZGUoKSkgJiYgIXRoaXMuX3Byb2Nlc3NpbmdUb3BNb3N0RW5kVGFzaykge1xyXG4gICAgICAgIGxldCBjbWRzVG9TZXJ2ZXI6IENvbW1hbmRzVGFibGUgPSA8Q29tbWFuZHNUYWJsZT5tZ0RhdGEuQ21kc1RvU2VydmVyO1xyXG4gICAgICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuICAgICAgICBsZXQgcmVjOiBSZWNvcmQgPSBkdi5nZXRDdXJyUmVjKCk7XHJcblxyXG4gICAgICAgIGxldCBpbnRFdnRDb2RlOiBudW1iZXIgPSBldnQuZ2V0SW50ZXJuYWxDb2RlKCk7XHJcblxyXG4gICAgICAgIC8vIGZvciBpbnRlcm5hbCBldmVudHNcclxuICAgICAgICBzd2l0Y2ggKGludEV2dENvZGUpIHtcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TVUJGT1JNX0NMT1NFOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm9uU3ViZm9ybUNsb3NlKHRhc2ssIGV2dCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9CVVRUT046XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX0hJVDpcclxuICAgICAgICAgICAgLy8gaWYgYnV0dG9uIGlzIG5vdCBwYXJrYWJsZSwgcmFpc2UgaXRzIGV2ZW50IG9ubHkgaWYgdGhlIGFjdGlvbiB3YXMgbm90IHRyaWdnZXJlZCBieSBndWkuXHJcbiAgICAgICAgICAgIC8vIGRpcmVjdCBjbGljayBvbiB0aGUgYnV0dG9uIHdpbGwgZ2V0IGhlcmUgYXMgY3RybCBoaXQgLCBidXQgaXMgbm90IHRyaWdnZXJlZCBieSBndWkgKGdvZXMgdmlhIHNlbGVjdGlvbiBldmVudCAxc3QpXHJcbiAgICAgICAgICAgIC8vIG90aGVyIGN0cmxfaGl0IGFjdGlvbnMgc2hvdWxkIGNvbnNpZGVyIHRoZSBwYXJrYWJpbGl0eVxyXG4gICAgICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04gJiZcclxuICAgICAgICAgICAgICAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0JVVFRPTiB8fCAhZXZ0LmlzR3VpVHJpZ2dlcmVkRXZlbnQoKSB8fCBjdHJsLmlzUGFya2FibGUodHJ1ZSkpKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGFSdEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCk7XHJcbiAgICAgICAgICAgICAgaWYgKGN0cmwuZ2V0UnRFdnRUYXNrKCkgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGFSdEV2dC5zZXRUYXNrKGN0cmwuZ2V0UnRFdnRUYXNrKCkpO1xyXG4gICAgICAgICAgICAgIGlmIChDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX05PTkUgIT09IGFSdEV2dC5nZXRUeXBlKCkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsLnVzZVpvb21IYW5kbGVyKCkpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IHRhc2tUb0VuYWJsZTogVGFzayA9IDxUYXNrPmFSdEV2dC5nZXRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0YXNrVG9FbmFibGUgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgICB0YXNrVG9FbmFibGUuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYVJ0RXZ0LnNldEFyZ0xpc3QoY3RybC5BcmdMaXN0KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGFSdEV2dC5zZXRQdWJsaWNOYW1lKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFRvVGFpbChhUnRFdnQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0FuZFNhdmVSb3V0ZUV2ZW50SWZDdHhSZW1vdmVkRnJvbVNydnIgKGFSdEV2dCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCKSB7XHJcbiAgICAgICAgICAgICAgLy8gRml4ZWQgYnVnICM3MjQxNTA6IGFzIHdlIGRvaW5nIGZvciBvbmxpbmUgZm9yIHRhYiBjb250cm9sIHdlIHNlbmQgQUNUX1pPT00gKENob2ljZWlucC5jcHAgOjpEaXRHZXQoKSlcclxuICAgICAgICAgICAgICB0aGlzLmFkZEludGVybmFsRXZlbnRXaXRoQ3RybEFuZENvZGUoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8pIHtcclxuICAgICAgICAgICAgICBjdHJsLnNldENvbnRyb2xUb0ZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RPR0dMRV9JTlNFUlQ6XHJcbiAgICAgICAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5Ub2dnbGVJbnNlcnRNb2RlKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NMT1NFOlxyXG4gICAgICAgICAgICBsZXQgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KGV2dCwgZXZ0KTtcclxuICAgICAgICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICAgICAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQ6XHJcbiAgICAgICAgICAgIC8vIGlmICdleGl0JyBhY2NlcHRlZCBvbiBNREksIGV4aXQgdGhlIHRvcCBtb3N0IHRhc2suIHNhbWUgYXMgd2hlbiBleGl0aW5nIHRoZSBzeXN0ZW0uXHJcbiAgICAgICAgICAgIGxldCB0YXNrVG9FbmQ6IFRhc2sgPSAodGFzay5pc01haW5Qcm9nKCkgPyBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkgOiB0YXNrKTtcclxuICAgICAgICAgICAgYXdhaXQgdGFza1RvRW5kLmVuZFRhc2soZXZ0LnJldmVyc2libGVFeGl0KCksIGZhbHNlLCBldnQuRXhpdER1ZVRvRXJyb3IoKSk7XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUX1NZU1RFTTpcclxuICAgICAgICAgICAgLy8gZW5kIHRoZSB0b3AgbW9zdCB0YXNrIHdpdGggZm9ybS5cclxuICAgICAgICAgICAgYXdhaXQgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLmVuZFRhc2soZXZ0LnJldmVyc2libGVFeGl0KCksIGZhbHNlLFxyXG4gICAgICAgICAgICAgIGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gR2V0VG9wTW9zdFRhc2tXaXRoRm9ybSh0YXNrKS5lbmRUYXNrKGV2dC5yZXZlcnNpYmxlRXhpdCgpLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUTElORTpcclxuICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1csIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9ORVhUKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVkxJTkU6XHJcbiAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfUk9XLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fUFJFVik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRQQUdFOlxyXG4gICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1BBR0UsIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9ORVhUKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVlBBR0U6XHJcbiAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSwgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX1BSRVYpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHUEFHRTpcclxuICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fQkVHSU4pO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfRU5EUEFHRTpcclxuICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fRU5EKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1RCTDpcclxuICAgICAgICAgICAgLy8gIzkxODU4ODogSWYgY3RybCtob21lL2N0cmwrZW5kIHByZXNzZWQgd2hlbiBwYXJrZWQgb24gbGlzdGJveFxyXG4gICAgICAgICAgICAvLyB0aGVuIEJlZ2luIHRhYmxlIGV2ZW50IHNob3VsZCBub3QgYmUgaGFuZGxlZC5cclxuICAgICAgICAgICAgbGFzdFBhcmtlZEN0cmwgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsID09IG51bGwgfHwgIWxhc3RQYXJrZWRDdHJsLmlzTGlzdEJveCgpKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1RBQkxFLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fQkVHSU4pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9FTkRUQkw6XHJcbiAgICAgICAgICAgIC8vICM5MTg1ODg6IElmIGN0cmwraG9tZS9jdHJsK2VuZCBwcmVzc2VkIHdoZW4gcGFya2VkIG9uIGxpc3Rib3hcclxuICAgICAgICAgICAgLy8gdGhlbiBCZWdpbiB0YWJsZSBldmVudCBzaG91bGQgbm90IGJlIGhhbmRsZWQuXHJcbiAgICAgICAgICAgIGxhc3RQYXJrZWRDdHJsID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgICAgIGlmIChsYXN0UGFya2VkQ3RybCA9PT0gbnVsbCB8fCAhbGFzdFBhcmtlZEN0cmwuaXNMaXN0Qm94KCkpIHtcclxuICAgICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfVEFCTEUsIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9FTkQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1dFQl9PTl9EQkxJQ0s6IHtcclxuICAgICAgICAgICAgLy8gVW5saWtlIE9ubGluZSwgaGVyZSBTRUxFQ1Qgb3IgWk9PTSBjb21lcyBhZnRlciB0aGUgREJDTElDSy5cclxuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBEQkNMSUNLIGhhbmRsZXIgd2l0aCBwcm9wb2dhdGUgPSAnTk8nICwgdGhlc2UgYWN0aW9ucyB3aWxsIG5vdCBiZSByYWlzZWQuXHJcbiAgICAgICAgICAgIGxldCBjdHJsVHlwZTogTWdDb250cm9sVHlwZSA9IGN0cmwuVHlwZTtcclxuICAgICAgICAgICAgbGV0IHB1dEFjdGlvbjogbnVtYmVyID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX05PTkU7XHJcbiAgICAgICAgICAgIGlmIChjdHJsVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEUgJiYgY3RybFR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xBQkVMICYmXHJcbiAgICAgICAgICAgICAgY3RybFR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0lNQUdFKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5BY3Rpb25NYW5hZ2VyLmlzRW5hYmxlZChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VMRUNUKSlcclxuICAgICAgICAgICAgICAgIHB1dEFjdGlvbiA9IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1Q7XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLkFjdGlvbk1hbmFnZXIuaXNFbmFibGVkKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NKSlcclxuICAgICAgICAgICAgICAgICAgcHV0QWN0aW9uID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT007XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBpZiAocHV0QWN0aW9uICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfTk9ORSlcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kQ29kZShjdHJsLCBwdXRBY3Rpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RFTExJTkU6XHJcbiAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLkhhbmRsZUFjdGlvbkRlbGxpbmUoIHRhc2ssIGR2LCByZWMsIGZhbHNlKSlcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkU6XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FX0FCT1ZFOlxyXG4gICAgICAgICAgICBpZiAodGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSkge1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ290b0NyZWF0ZU1vZGUodGFzayk7XHJcblxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0YXNrLmdldEluQ3JlYXRlTGluZSgpKVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgdGFzay5zZXRJbkNyZWF0ZUxpbmUodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBjdXJyZW50IHJlY29yZCBpcyBub3QgYWxyZWFkeSBhIG5ldyBvbmVcclxuICAgICAgICAgICAgICBpZiAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmIHJlYyAhPSBudWxsICYmICFyZWMuTW9kaWZpZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIGZhbHNlKSkge1xyXG4gICAgICAgICAgICAgICAgICBkb1N1ZmZpeCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgfHwgdGFzay5pc0Fib3J0aW5nKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgZm9ybSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRGVmZWN0IDE1MjM1NTogUGFyayBvbiBsYXN0UGFya2VkQ29udHJvbCBpZiBuZXh0U2NyZWVuIGV2ZW50IG9jY3VycyBpZiBhbHJlYWR5IGluIGNyZWF0ZSBtb2RlIGFuZCByZWNvcmQgbm90IG1vZGlmaWVkXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RQYXJrZWRDb250cm9sOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFBhcmtlZENvbnRyb2wgIT09IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBsYXN0UGFya2VkQ29udHJvbC5pbnZva2UoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGxldCByZWZEb1N1ZmZpeDogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW0oZG9TdWZmaXgpO1xyXG4gICAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLkRvVGFza0xldmVsUmVjb3JkU3VmZml4KHRhc2ssIHJlZkRvU3VmZml4KSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICBkb1N1ZmZpeCA9IHJlZkRvU3VmZml4LnZhbHVlO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50SWQ6IG51bWJlciA9IDA7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJldkxpbmU6IG51bWJlciA9IDA7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCh0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHx8ICF0YXNrLkNvbmZpcm1VcGRhdGVObylcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5hZGRSZWMoZG9TdWZmaXgsaW50RXZ0Q29kZSA9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORV9BQk9WRT8gdHJ1ZSA6IGZhbHNlICk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLkRvVGFza0xldmVsUmVjb3JkUHJlZml4KHRhc2spO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlQWN0RW50ZXJSb3dFZGl0aW5nKHRhc2spO1xyXG5cclxuICAgICAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICB0YXNrLnNldEluQ3JlYXRlTGluZShmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZUFjdENhbmNlbChldnQsIHRhc2ssIGZvcm0sIGN0cmwsIHJlYywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VOVEVSX1JPV19FRElUSU5HOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZUFjdEVudGVyUm93RWRpdGluZyh0YXNrKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUVVJVDpcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1FVSVQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fQ1JFQVRFOlxyXG4gICAgICAgICAgICBpZiAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFIHx8XHJcbiAgICAgICAgICAgICAgYXdhaXQgKHRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19PUFRJT04pKS5nZXRWYWx1ZUJvb2xlYW4oKSkge1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ290b0NyZWF0ZU1vZGUodGFzayk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19RVUVSWTpcclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZICYmXHJcbiAgICAgICAgICAgICAgKGF3YWl0ICh0YXNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfT1BUSU9OKSkuZ2V0VmFsdWVCb29sZWFuKCkpID09PSBmYWxzZSlcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5lbmFibGVNb2RlcygpO1xyXG4gICAgICAgICAgICBvbGRNb2RlID0gdGFzay5nZXRPcmlnaW5hbFRhc2tNb2RlKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSk7XHJcbiAgICAgICAgICAgICAgaWYgKG9sZE1vZGUgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkdi5jdXJyUmVjQ29tcHV0ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGN0cmwuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBhbHJlYWR5IGV4ZWN1dGVkIHJlY29yZCBzdWZmaXggLSBzbyB3ZSBuZWVkIHRvIHByZXZlbnQgdGhlIHZpZXcgcmVmcmVzaFxyXG4gICAgICAgICAgICAgICAgLy8gZnJvbSBleGVjdXRpbmcgaXQgYWdhaW5cclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudFJlY29yZFN1ZmZpeCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudENvbnRyb2xDaGFuZ2UodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXKTtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGN0cmwuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgICB0YXNrLnNldFByZXZlbnRSZWNvcmRTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50Q29udHJvbENoYW5nZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWR2LmlzRW1wdHkoKSAmJiAoZHYuZ2V0Q3VyclJlYygpKS5nZXRNb2RlKCkgIT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpXHJcbiAgICAgICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRhc2suc2V0T3JpZ2luYWxUYXNrTW9kZShDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0YXNrLnNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19NT0RJRlk6XHJcbiAgICAgICAgICAgIGlmICh0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkgJiZcclxuICAgICAgICAgICAgICAoYXdhaXQgKHRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19PUFRJT04pKS5nZXRWYWx1ZUJvb2xlYW4oKSkgPT09IGZhbHNlKVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrLmVuYWJsZU1vZGVzKCk7XHJcbiAgICAgICAgICAgIG9sZE1vZGUgPSB0YXNrLmdldE9yaWdpbmFsVGFza01vZGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChvbGRNb2RlICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZHYuY3VyclJlY0NvbXB1dGUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3RybCAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBjdHJsLmludm9rZSgpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBhbHJlYWR5IGV4ZWN1dGVkIHJlY29yZCBzdWZmaXggLSBzbyB3ZSBuZWVkIHRvIHByZXZlbnQgdGhlIHZpZXcgcmVmcmVzaFxyXG4gICAgICAgICAgICAgICAgLy8gZnJvbSBleGVjdXRpbmcgaXQgYWdhaW5cclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudFJlY29yZFN1ZmZpeCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudENvbnRyb2xDaGFuZ2UodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXKTtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGN0cmwuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgICB0YXNrLnNldFByZXZlbnRSZWNvcmRTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50Q29udHJvbENoYW5nZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWR2LmlzRW1wdHkoKSAmJiAoZHYuZ2V0Q3VyclJlYygpKS5nZXRNb2RlKCkgIT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpXHJcbiAgICAgICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0YXNrLnNldE9yaWdpbmFsVGFza01vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRhc2suc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VMRUNUOlxyXG4gICAgICAgICAgICAvKiBwcmVmb3JtIHJlYyBzdWZmaXggKi9cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICB0YXNrLkluU2VsZWN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgICAgdGFzay5JblNlbGVjdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAgIC8qIGNsb3NlIHRoZSBzZWxlY3Rpb24gcHJvZ3JhbSAqL1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU1VCRk9STV9SRUZSRVNIOlxyXG4gICAgICAgICAgICBpZiAoKGV2dC5nZXRBcmdMaXN0KCkgIT0gbnVsbCkgJiYgKGV2dC5nZXRBcmdMaXN0KCkuZ2V0U2l6ZSgpID09PSAxKSkge1xyXG4gICAgICAgICAgICAgIGxldCBzdWJmb3JtQ3RybDogTWdDb250cm9sID0gbnVsbDtcclxuICAgICAgICAgICAgICBsZXQgUmVmcmVzaGVkU3ViZm9ybU5hbWU6IHN0cmluZyA9IGF3YWl0IGV2dC5nZXRBcmdMaXN0KCkuZ2V0QXJnVmFsdWUoMCwgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSwgMCk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIFFDUiAjMjgzMTE0LiBBcmd1bWVudCBvZiAnU3ViZm9ybSByZWZyZXNoIGV2ZW50JyBjYW4gYmUgc2tpcHBlZCBvciBub3QgZXhpc3QuXHJcbiAgICAgICAgICAgICAgaWYgKFJlZnJlc2hlZFN1YmZvcm1OYW1lID09IG51bGwpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgLy8gUlMgbXVzdCBiZSBleGVjdXRlZCBvbmx5IGlmIHRoZSBjdXJyZW50IHN1YmZvcm0gaXMgcmVmcmVzaGVkLlxyXG4gICAgICAgICAgICAgIC8vIElmIGl0cyBicm90aGVyIGlzIHJlZnJlc2hlZCB3ZSBkbyBub3QgbmVlZCB0byBleGVjdXRlIFJTIG9mIHRoZSBjdXJyZW50IHRhc2suXHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgcGFyZW50VGFzazogVGFzayA9IHRhc2s7IHBhcmVudFRhc2suZ2V0Rm9ybSgpICE9IG51bGwgJiYgcGFyZW50VGFzay5nZXRNZ2RJRCgpID09PSB0YXNrLmdldE1nZElEKCk7IHBhcmVudFRhc2sgPSA8VGFzaz5wYXJlbnRUYXNrLmdldFBhcmVudCgpKSB7XHJcbiAgICAgICAgICAgICAgICBzdWJmb3JtQ3RybCA9IDxNZ0NvbnRyb2w+cGFyZW50VGFzay5nZXRGb3JtKCkuZ2V0Q3RybEJ5TmFtZShSZWZyZXNoZWRTdWJmb3JtTmFtZS50cmltKCksIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NVQkZPUk0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1YmZvcm1DdHJsICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IHN1YmZvcm1UYXNrOiBUYXNrID0gPFRhc2s+c3ViZm9ybUN0cmwuZ2V0U3ViZm9ybVRhc2soKTtcclxuICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHN1YmZvcm0gdGFzayB3YXMgbm90IG9wZW5lZCB5ZXQsIGJ1dCBzdWJmb3JtIHJlZnJlc2ggaXMgZG9uZSxcclxuICAgICAgICAgICAgICAgICAgLy8gaXQncyBuZWVkZWQgdG8gb3BlbiB0aGUgc3ViZm9ybS4gUUNSICM0MTU5MTQuXHJcbiAgICAgICAgICAgICAgICAgIGlmIChzdWJmb3JtVGFzayA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUUNSICMyODc1NjIuIE9wZW4gdGhlIHN1YmZvcm0gdGFzayBvbmx5IGlmIHRoZSBzdWJmb3JtIGNvbnRyb2wgaXMgY29ubmVjdGVkIHRvIHRoZSB0YXNrLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhd2FpdCAoc3ViZm9ybUN0cmwuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TVUJGT1JNX1RZUEUpKS5nZXRWYWx1ZUludCgpICE9PSBTdWJmb3JtVHlwZS5Ob25lKVxyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5PcGVuU3ViZm9ybShwYXJlbnRUYXNrLCBzdWJmb3JtQ3RybCk7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHBhcmVudFRhc2suU3ViZm9ybVJlZnJlc2goc3ViZm9ybVRhc2ssIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gaWYgaXQgaXMgU3ViZm9ybVJlZnJlc2ggdGhhdCByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIsIHNvIHNlYXJjaCB0aGUgdGFzayBhY2NvcmRpbmcgdG8gaXRzIHRhc2sgaWQgKHRhZylcclxuICAgICAgICAgICAgZWxzZSBpZiAoKGV2dC5nZXRBcmdMaXN0KCkgIT0gbnVsbCkgJiYgKGV2dC5nZXRBcmdMaXN0KCkuZ2V0U2l6ZSgpID09PSAyKSkge1xyXG4gICAgICAgICAgICAgIGxldCBzdWJmb3JtVGFzazogVGFzayA9IHRhc2ssIHBhcmVudFRhc2s7XHJcbiAgICAgICAgICAgICAgbGV0IHRhc2tUYWc6IHN0cmluZyA9IGF3YWl0IGV2dC5nZXRBcmdMaXN0KCkuZ2V0QXJnVmFsdWUoMSwgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDLCAwKTtcclxuXHJcbiAgICAgICAgICAgICAgd2hpbGUgKHN1YmZvcm1UYXNrLklzU3ViRm9ybSkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50VGFzayA9IHN1YmZvcm1UYXNrLmdldFBhcmVudCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1YmZvcm1UYXNrLmdldFRhc2tUYWcoKSA9PT0gdGFza1RhZykge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBwYXJlbnRUYXNrLlN1YmZvcm1SZWZyZXNoKHN1YmZvcm1UYXNrLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzdWJmb3JtVGFzayA9IHBhcmVudFRhc2s7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NVQkZPUk1fT1BFTjpcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5PcGVuU3ViZm9ybSh0YXNrLCA8TWdDb250cm9sPmV2dC5Db250cm9sKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX1NFQVJDSDpcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUV2ZW50Q29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgaW50RXZ0Q29kZSk7XHJcbiAgICAgICAgICAgICAgdGFzay5nZXRUYXNrQ2FjaGUoKS5jbGVhckNhY2hlKCk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGFzay5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZShjbWQpO1xyXG5cclxuICAgICAgICAgICAgICAvLyBBZnRlciB2aWV3IHJlZnJlc2gsIHRoZSBzZXJ2ZXIgYWx3YXlzIHJldHVybnMgY3VyciByZWMgYXMgZmlyc3QgcmVjLlxyXG4gICAgICAgICAgICAgIGlmICghZm9ybS5pc1NjcmVlbk1vZGUoKSkge1xyXG4gICAgICAgICAgICAgICAgZHYuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm0uSGFzVGFibGUoKSkge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLnJlc3RvcmVPbGREaXNwbGF5TGluZShmb3JtLnJlY29yZElkeDJEaXNwbGF5TGluZShkdi5nZXRDdXJyUmVjSWR4KCkpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgICBpZiAoY3RybCAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgY3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1NDUkVFTjpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVzpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfUkVDT1JEOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZVJlZnJlc2hFdmVudHMoZXZ0KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQUNUX0NMT1NFX0FQUEw6XHJcbiAgICAgICAgICAgIGNtZCA9XHJcbiAgICAgICAgICAgICAgQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRXZlbnRDb21tYW5kKFxyXG4gICAgICAgICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLmdldFRhc2tUYWcoKSxcclxuICAgICAgICAgICAgICAgIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9CUk9XU0VSX0VTQyk7XHJcbiAgICAgICAgICAgIGNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICAgICAgYXdhaXQgc2VydmVyLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT05URVhUX1JFTU9WRTpcclxuXHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRyYW5zYWN0aW9uIGlzIHBlbmRpbmdcclxuICAgICAgICAgICAgbGV0IGN1cnJSZWNvcmQgPSAgKDxEYXRhVmlldz5MYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkuRGF0YVZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgICAgICAgICAgaWYgKENsaWVudE1hbmFnZXIuVHJhbnNDYWNoZUV4aXN0cygpIHx8IChjdXJyUmVjb3JkICE9IG51bGwgJiYgY3VyclJlY29yZC5Nb2RpZmllZCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nICgnUGVuZGluZyB0cmFuc2FjdGlvbi9yZWNvcmQgaXMgbW9kaWZpZWQsIGRpc2NhcmRlZCBcXCdDb250ZXh0IFJlbW92ZVxcJyBldmVudC4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBJcyB0aGVyZSBjbGllbnQgY29udGV4dCBpbmFjdGl2aXR5IHRpbWVvdXQ/XHJcbiAgICAgICAgICAgICAgaWYgKEVudmlyb25tZW50Lkluc3RhbmNlLmdldENsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZW91dCgpPjApIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuRXhlY3V0ZUNsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZXIoKTtcclxuICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgaWYgKCFFdmVudHNNYW5hZ2VyLmNsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZXJBYm9ydGVkKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gYWRkIGEgY29tbWFuZCB0byB0ZXJtaW5hdGUgY29udGV4dCBhdCBzZXJ2ZXIgc2lkZVxyXG4gICAgICAgICAgICAgICAgbGV0IGNvbnRleHRUZXJtaW5hdGlvbkV2ZW50Q29tbWFuZDogQ29udGV4dFRlcm1pbmF0aW9uRXZlbnRDb21tYW5kXHJcbiAgICAgICAgICAgICAgICAgID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlQ29udGV4dFRlcm1pbmF0aW9uRXZlbnRDb21tYW5kKE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5nZXRUYXNrVGFnKCkpO1xyXG4gICAgICAgICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRDdXJyTUdEYXRhKCkuQ21kc1RvU2VydmVyLkFkZCg8SUNsaWVudENvbW1hbmQ+Y29udGV4dFRlcm1pbmF0aW9uRXZlbnRDb21tYW5kKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyByZXNwb25zZSBuZWVkIG5vdCB0byBiZSBoYW5kbGVkIGFzIHRoZSB3ZSBhcmUgdGVybWluYXRpbmcgdGhlIGNvbnRleHRcclxuICAgICAgICAgICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLk9OTFlfQ09NTUFORFMpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nICgnUmVtb3ZlZCBjb250ZXh0IGZyb20gc2VydmVyJyk7XHJcbiAgICAgICAgICAgICAgICAvLyBzZXQgZmxhZyB0byB0aGF0IGNvbnRleHQgaXMgcmVtb3ZlZCBmcm9tIHNlcnZlciBieSAnQ29udGV4dCBSZW1vdmUnIGV2ZW50XHJcbiAgICAgICAgICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUmVtb3ZpbmdDb250ZXh0RnJvbVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGlzY2FyZGVkIFxcJ0NvbnRleHQgUmVtb3ZlXFwnIGV2ZW50IGFzIHVzZXIgZXZlbnQgb2NjdXJyZWQuJyk7XHJcbiAgICAgICAgICAgICAgICBFdmVudHNNYW5hZ2VyLmNsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZXJBYm9ydGVkPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VSVkVSX1RFUk1JTkFUSU9OOlxyXG4gICAgICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVFdmVudENvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIGludEV2dENvZGUpO1xyXG4gICAgICAgICAgICBjbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICAgICAgICAgIGF3YWl0IENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9FRFRfTlVMTDpcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJGaWVsZCAhPSBudWxsICYmIHRoaXMuX2N1cnJGaWVsZC5OdWxsQWxsb3dlZCkge1xyXG4gICAgICAgICAgICAgIC8vIHRoZSBuZXh0IGxpbmVzIGlzIGFuIGltbWl0YXRpb24gb2YgdGhlIGJlaGF2aW91ciBvZiBhbiBvbmxpbmUgcHJvZ3JhbTpcclxuICAgICAgICAgICAgICAvLyAxKSB0aGUgcmVjb3JkIG11c3QgYmUgdXBkYXRlZCBpbiB0aGlzIGV2ZW50XHJcbiAgICAgICAgICAgICAgLy8gMikgYSBcIm5leHQgZmllbGRcIiBldmVudCBpcyByYWlzZWRcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9jdXJyRmllbGQuc2V0VmFsdWVBbmRTdGFydFJlY29tcHV0ZSh0aGlzLl9jdXJyRmllbGQuZ2V0TWFnaWNEZWZhdWx0VmFsdWUoKSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2N1cnJGaWVsZC51cGRhdGVEaXNwbGF5KCk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JPTExCQUNLOlxyXG4gICAgICAgICAgICAvLyBmb3Igb2ZmbGluZSB3ZSBuZWVkIHRvIGNhbmNlbCB0aGUgZWRpdCBhbmQgdGhlbiBnbyByb2xsYmFjayB0aGUgdHJhbnNhY3Rpb24sIHRoZSBzYW1lIHdlIGRvaW5nIGZvciByZW1vdmUgd2hpbGUgcmV0dXJuIGZyb20gdGhlIHNlcnZlclxyXG4gICAgICAgICAgICAvLyBzZWUgZGF0YXZpZXcuY3MgY2FzZSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9ST0xMQkFDSzpcclxuICAgICAgICAgICAgLy8gZm9yIG9mZmxpbmUgd2Ugd2lsbCBub3QgZ2V0IHRvIENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX1JPTExCQUNLXHJcbiAgICAgICAgICAgIGF3YWl0IEV2ZW50c01hbmFnZXIuSGFuZGxlUm9sbGJhY2tBY3Rpb24odGFzaywgY21kc1RvU2VydmVyLCBSb2xsYmFja0V2ZW50Q29tbWFuZF9Sb2xsYmFja1R5cGUuUk9MTEJBQ0spO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfT0s6XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9JTkRFWF9DSEFOR0U6XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT0xfU09SVDpcclxuICAgICAgICAgICAgLy8gY2FuIHNvcnQgb25seSBvbiBjb2x1bW4gd2l0aCBhbiBhdHRhY2hlZCBmaWVsZC5cclxuICAgICAgICAgICAgLy8gY2FuIGNoYW5nZSBpbmRleCBvbmx5IGlmIHRoZSBkYXRhdmlldyBpcyByZW1vdGUuXHJcbiAgICAgICAgICAgIGlmICgoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0lOREVYX0NIQU5HRSAmJiB0YXNrLkRhdGF2aWV3TWFuYWdlci5IYXNSZW1vdGVEYXRhKSB8fFxyXG4gICAgICAgICAgICAgIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ09MX1NPUlQgJiYgY3RybC5nZXRGaWVsZCgpICE9IG51bGwpKSB7XHJcbiAgICAgICAgICAgICAgLy8gUUNSICMyOTYzMjUgJiBRQ1IgIzQzMDI4OC5cclxuICAgICAgICAgICAgICAvLyBFeGVjdXRlIENTIG9mIHRoZSBjdXJyZW50IGNvbnRyb2wsIGJlY2F1c2UgaXQgY2FuIGJlIGEgcGFyYW1ldGVyIGZvciBhIHN1YmZvcm0uXHJcbiAgICAgICAgICAgICAgLy8gSWYgaXQncyB2YWx1ZSB3YXMgY2hhbmdlZCwgQ1Mgd2lsbCByZWZyZXNoIHRoZSBzdWJmb3JtIGJlZm9yZSB0aGUgc29ydC5cclxuICAgICAgICAgICAgICBsZXQgbGFzdEZvY3VzZWRUYXNrOiBUYXNrID0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG4gICAgICAgICAgICAgIGxldCBmb2N1c2VkQ3RybDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbChMYXN0Rm9jdXNlZE1hbmFnZXIuTGFzdEZvY3VzTWdkSUQpO1xyXG4gICAgICAgICAgICAgIGlmIChmb2N1c2VkQ3RybCAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UoZm9jdXNlZEN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcblxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGFzay5FeGVjdXRlTmVzdGVkUlMobGFzdEZvY3VzZWRUYXNrKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gUUNSICM0Mzg3NTMuIEV4ZWN1dGUgUlMgb2YgdGhlIHNvcnRlZCB0YXNrLlxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmIHRhc2suZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICAgIHRhc2suZ2V0VGFza0NhY2hlKCkuY2xlYXJDYWNoZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfSU5ERVhfQ0hBTkdFKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCB0YXNrRm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRhc2tGb3JtLkhhc1RhYmxlKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybS5jbGVhclRhYmxlQ29sdW1uU29ydE1hcmsodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICBjbWQgPSBhd2FpdCBDb21tYW5kRmFjdG9yeS5DcmVhdGVJbmRleENoYW5nZUNvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuR2V0Q3VycmVudFJlY0lkKCksIGV2dC5nZXRBcmdMaXN0KCkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgY21kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlQ29sdW1uU29ydENvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIGV2dC5EaXJlY3Rpb24sIGN0cmwuZ2V0RGl0SWR4KCksIGN0cmwuZ2V0RmllbGQoKS5nZXRJZCgpLCAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLkdldEN1cnJlbnRSZWNJZCgpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0YXNrLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcbiAgICAgICAgICAgICAgICBkdi5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLnJlc3RvcmVPbGREaXNwbGF5TGluZSgwKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzU29ydGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAvLyBRQ1IncyAjMTY1ODE1ICYgIzI5MTk3NC4gSWYgdGhlIGZvY3VzZWQgdGFzayBhbmQgdGhlIHNvcnRlZCB0YXNrIGlzIHRoZSBzYW1lIHRhc2sgb3JcclxuICAgICAgICAgICAgICAgIC8vIHRoZSBmb2N1c2VkIHRhc2sgaXMgYSBjaGlsZCBvZiB0aGUgc29ydGVkIHRhc2ssIGdvIHRvIHRoZSBmaXJzdCBjb250cm9sIGluIHRoZSBmaXJzdCBsaW5lLlxyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGZvY3VzZWQgdGFzayBpcyB0aGUgcGFyZW50IHRhc2ssIGRvIG5vdCBsZWF2ZSB0aGUgY3VycmVudCBjb250cm9sLlxyXG4gICAgICAgICAgICAgICAgaWYgKCEodGFzayA9PT0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpIHx8ICF0YXNrLnBhdGhDb250YWlucyhMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkpKSkge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmICF0YXNrLmdldFByZXZlbnRDb250cm9sQ2hhbmdlKCkpXHJcbiAgICAgICAgICAgICAgICAgIC8vIFFDUiAjNDI4Njk3LiBFeGVjdXRlIFJTIG9mIGFsbCBuZXN0ZWQgc3ViZm9ybXMuXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbGFzdEZvY3VzZWRUYXNrLkV4ZWN1dGVOZXN0ZWRSUyh0YXNrKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgZm9jdXNlZEN0cmwgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmb2N1c2VkQ3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNTb3J0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPTF9DTElDSzpcclxuICAgICAgICAgICAgLy8gY2FuIHNvcnQgb24gY29sdW1uIG9ubHkgaWYgZXZlbnQgaXMgcmFpc2VkIGR1ZSB0byBjbGljayBhY3Rpb25cclxuICAgICAgICAgICAgLy8gYW5kIGEgZmllbGQgaXMgYXR0YWNoZWQgdG8gY29sdW1uLlxyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgZXZ0LmlzR3VpVHJpZ2dlcmVkRXZlbnQoKSAmJiBjdHJsLmlzQ29sdW1uU29ydGFibGUoKSkge1xyXG4gICAgICAgICAgICAgIGxldCBjb2x1bW5DaGlsZENvbnRyb2w6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+Y3RybC5nZXRDb2x1bW5DaGlsZENvbnRyb2woKTtcclxuICAgICAgICAgICAgICBpZiAoY29sdW1uQ2hpbGRDb250cm9sICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBTb3J0IG9uIENvbHVtblxyXG4gICAgICAgICAgICAgICAgbGV0IGFSdEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoY29sdW1uQ2hpbGRDb250cm9sLCBldnQuRGlyZWN0aW9uLCAwKTtcclxuICAgICAgICAgICAgICAgIGFSdEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ09MX1NPUlQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRUb1RhaWwoYVJ0RXZ0KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBlbmQgb2YgaW50ZXJuYWwgZXZlbnRzIHByb2Nlc3NpbmdcclxuXHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLnBvcFJ0RXZlbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qXHJcbiogSGFuZGxlQWN0RW50ZXJSb3dFZGl0aW5nXHJcbiogc3RhcnQgdGhlIGVkaXRpbmcgb24gcm93XHJcbiogKi9cclxuICBwcml2YXRlIGFzeW5jIEhhbmRsZUFjdEVudGVyUm93RWRpdGluZyh0YXNrOiBUYXNrKSB7XHJcbiAgICBpZiAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkpXHJcbiAgICAgIHRhc2suV3JpdGVUb01lc3NhZ2VQYW5lKGBDYW5ub3QgZW50ZXIgUm93IEVkaXRpbmcgd2hlbiBpbiBRdWVyeSBNb2RlLmApO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBteWZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICAgIGF3YWl0IG15Zm9ybS5zdGFydFJvd0VkaXRpbmcobXlmb3JtLkRpc3BsYXlMaW5lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgSGFuZGxlU3RvcFJvd0VkaXRpbmcodGFzazogVGFzaykge1xyXG4gICAgbGV0IG15Zm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgIGF3YWl0IG15Zm9ybS5zdG9wUm93RWRpdGluZyhteWZvcm0uRGlzcGxheUxpbmUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDcmVhdGVzIGFuZCBleGVjdXRlcyBzdWJmb3JtIG9wZW5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1YmZvcm1Db250cm9sXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIE9wZW5TdWJmb3JtKHRhc2s6IFRhc2ssIHN1YmZvcm1Db250cm9sOiBNZ0NvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRhc2suVGFza1NlcnZpY2UuUmVtb3ZlUmVjb21wdXRlcyh0YXNrKTtcclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlU3ViZm9ybU9wZW5Db21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCBzdWJmb3JtQ29udHJvbC5nZXREaXRJZHgoKSk7XHJcbiAgICB0YXNrLmdldE1HRGF0YSgpLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgIGF3YWl0IFRhc2suQ29tbWFuZHNQcm9jZXNzb3IuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjbWRzVG9TZXJ2ZXJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJvbGxiYWNrVHlwZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBIYW5kbGVSb2xsYmFja0FjdGlvbih0YXNrOiBUYXNrLCBjbWRzVG9TZXJ2ZXI6IENvbW1hbmRzVGFibGUsIHJvbGxiYWNrVHlwZTogUm9sbGJhY2tFdmVudENvbW1hbmRfUm9sbGJhY2tUeXBlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY29tbWFuZHNQcm9jZXNzb3I6IENvbW1hbmRzUHJvY2Vzc29yQmFzZSA9IFRhc2suQ29tbWFuZHNQcm9jZXNzb3I7XHJcbiAgICBDbGllbnRSZWZyZXNoQ29tbWFuZC5DbGllbnRJc0luUm9sbGJhY2tDb21tYW5kID0gdHJ1ZTtcclxuICAgIC8vIGZvciByZW1vdGUgcHJvZ3JhbSA6ICh3aXRoXFx3aXRob3V0IGxvY2FsIGRhdGEpIHRoZSByb2xsYmFjayBldmVudCBpbiB0aGUgc2VydmVyIE1VU1RcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBiZSBleGVjdXRlIG9uIHRoZSB0YXNrIHRoYXQgb3BlbiB0aGUgdHJhbnNhY3Rpb25cclxuICAgIC8vIGZvciBvZmZsaW5lIHByb2dyYW0gdGhlIHJvbGxiYWNrIHRyYW5zYWN0aW9uIG5lZWQgdG8gYmUgZXhlY3V0ZSBvbiB0aGUgdGFzayB0aGF0IG9wZW4gdGhlIHRyYW5zYWN0aW9uXHJcbiAgICB0YXNrID0gdGFzay5UYXNrU2VydmljZS5HZXRPd25lclRyYW5zYWN0aW9uVGFzayh0YXNrKTtcclxuXHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVJvbGxiYWNrRXZlbnRDb21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCByb2xsYmFja1R5cGUpO1xyXG4gICAgY21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgYXdhaXQgY29tbWFuZHNQcm9jZXNzb3IuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcblxyXG4gICAgQ2xpZW50UmVmcmVzaENvbW1hbmQuQ2xpZW50SXNJblJvbGxiYWNrQ29tbWFuZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXZ0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZWNcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxhc3RQYXJrZWRDdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbGRSZWNNb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbGRNb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgSGFuZGxlQWN0Q2FuY2VsKGV2dDogUnVuVGltZUV2ZW50LCB0YXNrOiBUYXNrLCBmb3JtOiBNZ0Zvcm0sIGN0cmw6IE1nQ29udHJvbCwgcmVjOiBSZWNvcmQsIGlzTUdfQUNUX0NBTkNFTDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gUHJldmVudCByZWN1cnNpdmUgbW9kZVxyXG4gICAgLy8gZml4ZWQgYnVncyAjOjI4NTQ5OCwgMjk3NDU1XFw0Mjc3MDNcXFxyXG4gICAgaWYgKHRhc2suSW5IYW5kbGVBY3RDYW5jZWwpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICB0YXNrLkluSGFuZGxlQWN0Q2FuY2VsID0gdHJ1ZTtcclxuXHJcbiAgICBsZXQgb2xkTW9kZTogc3RyaW5nID0gdGFzay5nZXRNb2RlKCk7XHJcbiAgICBsZXQgc2F2ZURpc3BsYXlMaW5lPSB0YXNrLmdldEZvcm0oKS5EaXNwbGF5TGluZTtcclxuXHJcbiAgICAvLyBXaGVuIGRvIHdlIHNob3cgdGhlICdDb25maXJtIENhbmNlbCB3aW5kb3cnID8gd2hlbiBhbGwgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFwcGx5OlxyXG4gICAgLy8gMS4gVGFzayBtb2RlIGlzIG5vdCBxdWVyeVxyXG4gICAgLy8gMi4gcmVjIGlzIG5vdCBVcGRhdGVkLiBVcGRhdGVkIGlzIHRydWUgd2hlbiB0aGVyZSB3YXMgYW4gVXBkYXRlIG9wZXJhdGlvbiB3aXRoICdmb3JjZSB1cGRhdGUnLiBJZiBpdCBpcyB0cnVlLCB0aGVuIHRoZXJlIGlzIG5vIG1lYW5pbmcgdG8gc2hvdyB0aGVcclxuICAgIC8vICAgIHdpbmRvdyBzaW5jZSB0aGUgdXBkYXRlIHN0YXlzIGFueXdheSAobGlrZSBpbiBvbmxpbmUgd2hlbiB3ZSBnbyB0byBDYW5jZWxXYXNUcmlnZ2VyZWQpLlxyXG4gICAgLy8gMy4gVGhlcmUgbXVzdCBiZSBhIG1vZGlmaWNhdGlvbiwgb3RoZXJ3aXNlIHRoZXJlIGlzIG5vdGhpbmcgdG8gY2FuY2VsLiBTbyBlaXRoZXIgTW9kaWZpZWQgaXMgdHJ1ZSwgbWVhbmluZyBhIGZpZWxkIHdhcyBtb2lkZmllZCAsIG9yXHJcbiAgICAvLyAgICBMYXN0UGFya2VkQ3RybCgpLm1vZGlmaWVkQnlVc2VyKCksIG1lYW5pbmcgdGhhdCB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBjaGFuZ2luZyB0aGUgZmllbGQncyB2YWx1ZSAoVGhlIG1vZGlmaWVkIGlzIGZhbHNlIHVudGlsbCB3ZSBleGl0IHRoZSBmaWVsZCkuXHJcbiAgICAvLyBDcmVhdGUgbW9kZSBhbHNvIGdvZXMgaGVyZSAocmVjIHJlbW92ZWQgYW5kIG1vZGUgY2hhbmdlcyB0byBtb2RpZnkpICwgYnV0IGFsc28gd2lsbCBzaG93IHRoZSBjb25maXJtIGNhbmNlbCBvbmx5IGlmIHNvbWUgY2hhbmdlIHdhcyBkb25lIHRvIHRoZSBuZXcgcmVjb3JkLlxyXG4gICAgaWYgKG9sZE1vZGUgIT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkgJiYgIXJlYy5VcGRhdGVkKSB7XHJcbiAgICAgIGlmIChpc01HX0FDVF9DQU5DRUwpIHtcclxuICAgICAgICBpZiAocmVjLk1vZGlmaWVkIHx8ICh0YXNrLmdldExhc3RQYXJrZWRDdHJsKCkgIT09IG51bGwgJiYgdGFzay5nZXRMYXN0UGFya2VkQ3RybCgpLk1vZGlmaWVkQnlVc2VyKSkge1xyXG4gICAgICAgICAgaWYgKGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTkZJUk1fQ0FOQ0VMLCBmYWxzZSkpIHtcclxuICAgICAgICAgICAgIGxldCBjb25maXJtZWQgPSBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLmNvbmZpcm1fYm9vbChNc2dJbnRlcmZhY2UuQ09ORklSTV9TVFJfQ0FOQ0VMKTtcclxuICAgICAgICAgICAgIGlmKCFjb25maXJtZWQpXHJcbiAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdGFzay5JbkhhbmRsZUFjdENhbmNlbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IG9sZFJlY01vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcyA9IHJlYy5nZXRNb2RlKCk7XHJcblxyXG4gICAgICAvLyBTcGVjaWFsQ2FuY2VsT25DcmVhdGUgYmVoYXZpb3IgZm9yIEFsbG93RW1wdHlEYXRhVmlldyA9IFkgOiBXaGVuIHRoZXJlIGlzIHNpbmdsZSBuZXdseSBjcmVhdGVkIHJlY29yZFxyXG4gICAgICAvLyBleGlzdCBhbmQgdXNlciBjYW5jZWxzIGl0IGFuZCB0YXNrIGhhcyBBbGxvd0VtcHR5RGF0YVZpZXc9WVxyXG4gICAgICAvLyB0aGVuIGNoYW5nZSB0YXNrIG1vZGUgdG8gTW9kaWZ5IG1vZGUgc28gdGhhdCBzZXJ2ZXIgYWxsb3dzIHRoaXMgdGFzayB0byBlbnRlciBhZ2FpbiBpbiBFbXB0eURhdGFWaWV3IG1vZGUuXHJcbiAgICAgIGlmIChHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRTcGVjaWFsQ2FuY2VsT25DcmVhdGUoKSAmJiAgdGFzay5nZXRNb2RlKCkgPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEVcclxuICAgICAgICAgJiYgdGFzay5nZXRPcmlnaW5hbFRhc2tNb2RlKCk9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG5cclxuICAgICAgICBsZXQgZW5hYmxlOiBib29sZWFuID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTU9ESUZZLCB0cnVlKTtcclxuXHJcbiAgICAgICAgaWYgKGVuYWJsZSkge1xyXG4gICAgICAgICAgbGV0IGFsbG93RW1wdHlEYXRhVmlldyA6IGJvb2xlYW4gPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19FTVBUWV9EQVRBVklFVywgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgaWYgKCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0U2l6ZSgpID09IDEgJiYgYWxsb3dFbXB0eURhdGFWaWV3KSB7XHJcbiAgICAgICAgICAgIHRhc2suc2V0TW9kZSgnTScpO1xyXG4gICAgICAgICAgICB0YXNrLkRhdGFWaWV3LnNldEVtcHR5RGF0YXZpZXcodHJ1ZSk7XHJcbiAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGlzTUdfQUNUX0NBTkNFTCkge1xyXG4gICAgICAgIC8vIFdoZW4gY2FuY2VsaW5nLCB3ZSBoYXZlIHRvIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbi5cclxuICAgICAgICAvLyBVbmxlc3MgdGhlIGV2ZW50IGRvZXMgbm90IGFsbG93IHRvIHJvbGxiYWNrIGluIGNhbmNlbC4gVGhhdCBjYW4gaGFwcGVuIGlmIHRoZSBjYW5jZWwgd2FzIGluaXRpYXRlZCBieSB0aGUgc2VydmVyJ3MncyByb2xsYmFjay5cclxuICAgICAgICBpZiAodGFzay5pc1RyYW5zYWN0aW9uT25MZXZlbChDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSAmJiBldnQuUm9sbGJhY2tJbkNhbmNlbCgpKSB7XHJcbiAgICAgICAgICBhd2FpdCBFdmVudHNNYW5hZ2VyLkhhbmRsZVJvbGxiYWNrQWN0aW9uKHRhc2ssIDxDb21tYW5kc1RhYmxlPnRhc2suZ2V0TUdEYXRhKCkuQ21kc1RvU2VydmVyLCBSb2xsYmFja0V2ZW50Q29tbWFuZF9Sb2xsYmFja1R5cGUuQ0FOQ0VMKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IEV2ZW50c01hbmFnZXIuSGFuZGxlQ2FuY2VsRWRpdChldnQsIHRhc2ssIGZvcm0sIHJlYywgb2xkUmVjTW9kZSk7XHJcbiAgICB9XHJcbiAgICAvLyBRY3IgIzc0Nzg3MCBjYW5jZWwgc2hvdWxkIHBlcmZvcm0gdGhlIHJlY29yZCBwcmVmaXggaWYgbm90IHF1aXRpbmdcclxuICAgIGVsc2Uge1xyXG4gICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG5cclxuICAgICAgLy8gd2Ugcm9sbGJhY2sgYSBwYXJlbnQgdGFzayB3aGlsZSBmb2N1c2VkIG9uIHN1YmZvcm0vdGFzay4gV2UgZG8gbm90IHdhbnQgdGhlIGN0cmwgb24gdGhlIHN1YmZvcm0gdG8gZG8gY3RybCBzdWZmaXguXHJcbiAgICAgIGxldCBsYXN0Rm9jdXNlZENvbnRyb2w6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgICAgaWYgKGxhc3RGb2N1c2VkQ29udHJvbCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGxhc3RGb2N1c2VkQ29udHJvbC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghZXZ0LmlzUXVpdCgpKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlUGFya2FiaWxpdHlPblJvd0NoYW5nZSh0YXNrKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFFDUiMgOTQxMjc3OiBJZiBDYW5jZWwgZXZlbnQgaXMgY2FsbGVkIGZyb20gUXVpdCBldmVudCwgdGhlbiBkb24ndCBleGVjdXRlIEV4aXQgZXZlbnRcclxuICAgIC8vIGlmIHVzZXIgaGFzIHByZXNzZWQgJ05vJyBvbiBDb25maXJtIGNhbmNlbCBib3guXHJcbiAgICBpZiAoZXZ0LmlzUXVpdCgpKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcblxyXG4gICAgLy8gcmVzZXQgaXNSb3dFZGl0aW5nXHJcbiAgICBhd2FpdCBmb3JtLnN0b3BSb3dFZGl0aW5nKHNhdmVEaXNwbGF5TGluZSk7XHJcblxyXG4gICAgdGFzay5JbkhhbmRsZUFjdENhbmNlbCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjYW5jZWwgdGhlIGVkaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV2dFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVjXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbGRSZWNNb2RlXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBIYW5kbGVDYW5jZWxFZGl0KGV2dDogUnVuVGltZUV2ZW50LCB0YXNrOiBUYXNrLCBmb3JtOiBNZ0Zvcm0sIHJlYzogUmVjb3JkLCBvbGRSZWNNb2RlOiBEYXRhTW9kaWZpY2F0aW9uVHlwZXMpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGlmIHRoZSBzeW5jZWQgcmVjb3JkIChpLmUuIHRoZSByZWNvcmQgZnJvbSB0aGUgcGFyZW50IHRhc2sgb2YgdGhlIHN1YmZvcm0pIGJlZm9yZSBSb2xsYmFjayB3YXMgaW4gJ0luc2VydCcgbW9kZSxcclxuICAgIC8vIHNvIGl0IG11c3QgYmUgaW4gJ0luc2VydCcgbW9yZSBhZnRlciByZXR1cm4gZnJvbSB0aGUgc2VydmVyXHJcbiAgICBpZiAocmVjLlN5bmNlZCAmJiBvbGRSZWNNb2RlID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KVxyXG4gICAgICByZWMuc2V0TW9kZShvbGRSZWNNb2RlKTtcclxuXHJcbiAgICBpZiAoZm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAvLyByZXNldCB0aGUgbGFzdCBwYXJrZWQgY29udHJvbFxyXG4gICAgICBpZiAodGFzay5nZXRMYXN0UGFya2VkQ3RybCgpICE9PSBudWxsKVxyXG4gICAgICAgIHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKS5yZXNldFByZXZWYWwoKTtcclxuXHJcbiAgICAgIGF3YWl0IGZvcm0uY2FuY2VsRWRpdCh0cnVlLCBldnQuaXNRdWl0KCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXZ0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkdlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVjXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJub25JbnRlcmFjdGl2ZURlbGV0ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIEhhbmRsZUFjdGlvbkRlbGxpbmUoIHRhc2s6IFRhc2ssIGR2OiBEYXRhVmlldywgcmVjOiBSZWNvcmQsIG5vbkludGVyYWN0aXZlRGVsZXRlOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgbGFzdFBhcmtlZEN0cmw6IE1nQ29udHJvbDtcclxuICAgIGxldCBteWZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICBsZXQgc2F2ZUlzUm93RWRpdGluZyA9IG15Zm9ybS5nZXRJc1Jvd0VkaXRpbmdGcm9tR3VpKG15Zm9ybS5EaXNwbGF5TGluZSApOyAvL0NvbW1hbmRzLmdldElzUm90aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShsYXN0UGFya2VkQ3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYKTt3RWRpdGluZyggdGFzay5nZXRGb3JtKCkuZ2V0TWFpbkNvbnRyb2woKSwgdGFzay5nZXRGb3JtKCkuRGlzcGxheUxpbmUpOyAgICBsZXQgb2xkUmVjTW9kZTogRGF0YU1vZGlmaWNhdGlvblR5cGVzO1xyXG4gICAgbGV0IG9sZFJlY01vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcztcclxuICAgIGlmIChhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19ERUxFVEUsIHRydWUpKSB7XHJcbiAgICAgIGxhc3RQYXJrZWRDdHJsID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgIGlmIChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbClcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShsYXN0UGFya2VkQ3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICBvbGRSZWNNb2RlID0gcmVjLmdldE1vZGUoKTtcclxuXHJcbiAgICAgICAgLy8gRm9yY2UgdGhlIGNoYW5nZSB0byBkZWxldGUgbW9kZVxyXG4gICAgICAgIHJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICByZWMuc2V0TW9kZShEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlKTtcclxuXHJcbiAgICAgICAgaWYgKG9sZFJlY01vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpXHJcbiAgICAgICAgICByZWMuc2V0U2VuZFRvU2VydmVyKGZhbHNlKTtcclxuXHJcbiAgICAgICAgLy8gZXhlY3V0ZSB0YXNrIHN1ZmZpeCBpbiBNb2RpZnkgbW9kZSBvciB3aGVuIHRoZXJlIGlzICdmb3JjZSByZWNvcmQgc3VmZml4Jy5cclxuICAgICAgICBpZiAocmVjLk1vZGlmaWVkIHx8IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgZmFsc2UpKSB7XHJcbiAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIHJlY29yZCBzdWZmaXggY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxyXG4gICAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgaWYgKCFyZWMuU2VuZFRvU2VydmVyKSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgZHYuYWRkQ3VyclRvTW9kaWZpZWQoKTtcclxuICAgICAgICAgICAgICByZWMuc2V0U2VuZFRvU2VydmVyKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgICAgIHJlYy5zZXRNb2RlKG9sZFJlY01vZGUpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBleGVjdXRlIHJlY29yZCBzdWZmaXggaW4gRGVsZXRlIG1vZGVcclxuICAgICAgICAvLyBzZXQgdGhlIEluRGVsZXRlUHJvY2VzcyBmbGFnICwgc28gd2Ugd2lsbCBub3QgdHJ5IHRvIHNlbmQgdXBkYXRlcyBvbiB0aGUgcmVjb3JkIGFmdGVyXHJcbiAgICAgICAgLy8gd2UgZGVsZXRlIGl0IGluIHRoZSBjb21tb25IYW5kbGVyQWZ0ZXIgKHJlYyBzdWZmaXgpLlxyXG4gICAgICAgIHJlYy5zZXRJbkRlbGV0ZVByb2Nlc3ModHJ1ZSk7XHJcblxyXG4gICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSk7XHJcbiAgICAgICAgLy8gbm8gY29uZmlybSBtZXNzYWdlIGRpYWxvZyBpZiBpbiBub24gaW50ZXJhY3RpdmUgZGVsZXRlLlxyXG4gICAgICAgIGxldCBza2lwQ29uZmlybURpYWxvZzogYm9vbGVhbiA9IG5vbkludGVyYWN0aXZlRGVsZXRlO1xyXG5cclxuICAgICAgICBpZiAoIXNraXBDb25maXJtRGlhbG9nKSB7XHJcbiAgICAgICAgICBpZiAodGFzay5tdXN0Q29uZmlybUluRGVsZXRlTW9kZSgpIHx8IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTkZJUk1fVVBEQVRFLCBmYWxzZSkpIHtcclxuICAgICAgICAgICAgbGV0IGNvbmZpcm1lZDogYm9vbGVhbiA9IGF3YWl0IEdVSU1hbmFnZXIuSW5zdGFuY2UuY29uZmlybV9ib29sKE1zZ0ludGVyZmFjZS5DT05GSVJNX1NUUl9ERUxFVEUpO1xyXG4gICAgICAgICAgICBpZiAoIWNvbmZpcm1lZCkge1xyXG4gICAgICAgICAgICAgIHJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICAgICAgICByZWMuc2V0TW9kZShvbGRSZWNNb2RlKTtcclxuICAgICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICAgICAgICAgIGlmIChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGxhc3RQYXJrZWRDdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVgpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoc2F2ZUlzUm93RWRpdGluZykge1xyXG4gICAgICAgICAgICAgICAgbGV0IG15Zm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG15Zm9ybS5zdGFydFJvd0VkaXRpbmcobXlmb3JtLkRpc3BsYXlMaW5lKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgcmVjLnNldEluRGVsZXRlUHJvY2VzcyhmYWxzZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICBpZiAoIXJlYy5TZW5kVG9TZXJ2ZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgZHYuYWRkQ3VyclRvTW9kaWZpZWQoKTtcclxuICAgICAgICAgICAgcmVjLnNldFNlbmRUb1NlcnZlcih0cnVlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgICByZWMuc2V0TW9kZShvbGRSZWNNb2RlKTtcclxuICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcbiAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG5cclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgd2UncmUgZGVsZXRpbmcgYW4gaW5zZXJ0ZWQgcmVjb3JkLCB0aGUgc2VydmVyIGlzIG5vdCBhd2FyZSBvZiBpdFxyXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHVwb24gZGVsZXRlLCBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgbW9kaWZpZWQgcmVjIGxpc3RcclxuICAgICAgICBpZiAob2xkUmVjTW9kZSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydCkge1xyXG4gICAgICAgICAgcmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgICAgcmVjLnNldE1vZGUob2xkUmVjTW9kZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgbmV3Q3VyclJlYzogUmVjb3JkID0gZHYuZ2V0Q3VyclJlYygpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgLy8gUUNSICM0MzgxNzU6IHdoZW4gdGhlIHVzZXIgZGVsZXRlcyBhIHJlY29yZCwgd2hpY2ggaXMgdGhlIHNpbmdsZVxyXG4gICAgICAgICAgLy8gcmVjb3JkIGluIHRoZSBkdiwgdGhlbiB3aGVuIGl0cyByZWNvcmQgc3VmZml4IGlzIGV4ZWN1dGVkIGFuZCB0aGVcclxuICAgICAgICAgIC8vIHNlcnZlciBzZW5kcyBhIG5ldyByZWNvcmQgdG8gdGhlIGNsaWVudCBhbmQgc2V0IGl0IHRvIGJlIHRoZVxyXG4gICAgICAgICAgLy8gY3VycmVudCByZWNvcmQuXHJcbiAgICAgICAgICAvLyBUaGlzIGZpeCBtYWtlcyB0aGUgZGVsZXRlZCByZWNvcmQgdG8gYmUgdGhlIGN1cnJlbnQgZm9yIGFcclxuICAgICAgICAgIC8vIG1vbWVudCBqdXN0IHRvIGRlbGV0ZSBpdCBmcm9tIHRoZSBjbGllbnRzIGNhY2hlLiBUaGVuLCBpdCBtYWtlc1xyXG4gICAgICAgICAgLy8gdGhlIG5ldyByZWNvcmQgdG8gYmUgdGhlIGN1cnJlbnQgYWdhaW4gYW5kIGVudGVycyBpbnRvIGNyZWF0ZSBtb2RlLlxyXG4gICAgICAgICAgLy8gSSB0aGluayB0aGF0IGEgYmV0dGVyIHNvbHV0aW9uIGlzIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSBjbGllbnQgaXNcclxuICAgICAgICAgIC8vIHJlc3BvbnNpYmxlIGZvciBhZGRpbmcgYSBuZXcgcmVjb3JkIG9yIHRoZSBzZXJ2ZXIsIGFuZCBtYWtlIHN1cmVcclxuICAgICAgICAgIC8vIHRoYXQgaXQgaXMgZG9uZSBzeXN0ZW13aWRlLlxyXG4gICAgICAgICAgLy8gRWh1ZCAtIDEwLzA5LzIwMDFcclxuICAgICAgICAgIGlmIChyZWMgIT09IG5ld0N1cnJSZWMpXHJcbiAgICAgICAgICAgIGF3YWl0IGR2LnNldEN1cnJSZWMocmVjLmdldElkKCksIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAvLyBubyBuZWVkIHRvIGRlbCB0aGUgY3VyciByZWMgYW5kIHBvc2l0aW9uIG9uIHRoZSBuZXggcmVjIGlmIHRoZSB0YXNrIGlzIGFib3J0aW5nLlxyXG4gICAgICAgICAgLy8gVGhlIGRlbEN1cnJSZWMgbWF5IGNhdXNlIGEgY3Jhc2ggaWYgaXQgdHJpZXMgdG8gZ2V0IHRoZSBuZXh0IHJlYyBmcm9tIHRoZSBuZXh0IGNodW5rLlxyXG4gICAgICAgICAgaWYgKCF0YXNrLmlzQWJvcnRpbmcoKSlcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5kZWxDdXJyUmVjKHRhc2ssIGZhbHNlKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgLy8gUUNSICM0MzgxNzUgLSBmaXggY29udGludWVcclxuICAgICAgICAgIGlmIChyZWMgIT09IG5ld0N1cnJSZWMpIHtcclxuICAgICAgICAgICAgYXdhaXQgZHYuc2V0Q3VyclJlYyhuZXdDdXJyUmVjLmdldElkKCksIGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKGR2LmdldFNpemUoKSA9PT0gMSlcclxuICAgICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gSW4gaW50ZXJhY3RpdmUsIHRoZSBtb2RlIG1pZ2h0IGNoYW5nZSB0byBtb2RpZnkgb3IgY3JlYXRlLiBIb3dldmVyLCBmb3Igbm9uIGludGVyYWN0aXZlIChkZWxldGUgbW9kZSlcclxuICAgICAgICAgIC8vIHRoZSBtb2RlIHNob3VsZCBiZSBzZXQgYmFjayB0byBkZWxldGUgYW5kIHdpbGwgYmUgdXNlZCBpbiB0aGUgbmV4dCByZWNvcmQgY3ljbGUuXHJcbiAgICAgICAgICBpZiAobm9uSW50ZXJhY3RpdmVEZWxldGUpXHJcbiAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaGFuZGxlIHZpZXcgcmVmcmVzaCwgc2NyZWVuIHJlZnJlc2ggYW5kIHJlY29yZCBmbHVzaCBldmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+dGhlIGV2ZW50IHRvIGhhbmRsZSB3aXRoIGFsbCBpdHMgcHJvcGVydGllczwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVSZWZyZXNoRXZlbnRzKGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPmV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuICAgIGxldCBpbnRFdnRDb2RlOiBudW1iZXIgPSBldnQuZ2V0SW50ZXJuYWxDb2RlKCk7XHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IG51bGw7XHJcblxyXG4gICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRClcclxuICAgICAgdGhpcy5faXNJblJlY29yZEZsdXNoRXZlbnQgPSB0cnVlO1xyXG4gICAgLy8gY2hlY2sgaWYgd2UgdHJ5IHRvIHZpZXcgcmVmcmVzaCB3aXRoIGFsbG93X21vZGlmeT1uIGluIGNyZWF0ZSBtb2RlXHJcbiAgICBpZiAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVyAmJiB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgIWF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX01PRElGWSwgdHJ1ZSkpIHtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXdhaXQgdGFzay5FeGVjdXRlTmVzdGVkUlMoTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpKTtcclxuICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgIXRhc2suSW5FbmRUYXNrICYmICF0YXNrLmlzQWJvcnRpbmcoKSkge1xyXG4gICAgICAgIGlmIChpbnRFdnRDb2RlICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9TQ1JFRU4pIHtcclxuICAgICAgICAgIGxldCBjdXJyZW50Um93OiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgaWYgKCFldnQuZ2V0UmVmcmVzaFR5cGUoKSkge1xyXG4gICAgICAgICAgICBpZiAoZXZ0LlJ0Vmlld1JlZnJlc2hVc2VDdXJyZW50Um93KCkgJiYgdGFzay5Jc0ludGVyYWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgY3VycmVudFJvdyA9IGZvcm0uZ2V0Q3VyclJlY1Bvc0luRm9ybSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUludGVybmFsUmVmcmVzaENvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIGludEV2dENvZGUsIGR2LkN1cnJlbnRSZWNJZCwgY3VycmVudFJvdyk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGFzay5Jc0ludGVyYWN0aXZlKVxyXG4gICAgICAgICAgICAgIGN1cnJlbnRSb3cgPSBmb3JtLmdldEN1cnJSZWNQb3NJbkZvcm0oKTtcclxuXHJcbiAgICAgICAgICAgIGxldCByZWZldGNoUmVjb3JkOiBib29sZWFuID0gdHJ1ZTsgLy9SZWZldGNoIHJlY29yZCBmcm9tIHNlcnZlci5cclxuICAgICAgICAgICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRCAmJiBldnQuZ2V0QXJnTGlzdCgpICE9PSBudWxsICYmIGV2dC5nZXRBcmdMaXN0KCkuZ2V0U2l6ZSgpICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHJlZmV0Y2hSZWNTdHI6IHN0cmluZztcclxuICAgICAgICAgICAgICByZWZldGNoUmVjU3RyID0gYXdhaXQgZXZ0LmdldEFyZ0xpc3QoKS5nZXRBcmdWYWx1ZSgwLCBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU4sIDApO1xyXG4gICAgICAgICAgICAgIHJlZmV0Y2hSZWNvcmQgPSAoaXNOdWxsT3JVbmRlZmluZWQocmVmZXRjaFJlY1N0cikgfHwgcmVmZXRjaFJlY1N0ciA9PT0gXCIxXCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocmVmZXRjaFJlY29yZClcclxuICAgICAgICAgICAgICBjbWQgPSBhd2FpdCBDb21tYW5kRmFjdG9yeS5DcmVhdGVSZWFsUmVmcmVzaENvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIGludEV2dENvZGUsIGN1cnJlbnRSb3csIGV2dC5nZXRBcmdMaXN0KCksIGR2LkN1cnJlbnRSZWNJZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHNjcmVlbiByZWZyZXNoIGV2ZW50XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsZXQgaWQ6IG51bWJlcjtcclxuXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRGb3JtKCkgPT09IG51bGwpXHJcbiAgICAgICAgICAgIGlkID0gMDtcclxuICAgICAgICAgIGVsc2UgaWYgKHRhc2suZ2V0Rm9ybSgpLmlzU2NyZWVuTW9kZSgpKVxyXG4gICAgICAgICAgICBpZCA9ICgoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKSkuZ2V0SWQoKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgaWQgPSAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldFJlY0J5SWR4KCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0VG9wUmVjSWR4KCkpLmdldElkKCk7XHJcblxyXG4gICAgICAgICAgY21kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlU2NyZWVuUmVmcmVzaENvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIGlkLCBkdi5DdXJyZW50UmVjSWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcmVhbCB2aWV3IHJlZnJlc2ggY2F1c2VzIHRoZSBjYWNoZSBvZiB0aGUgY3VycmVudCBzdWIgZm9ybSB0YXNrIHRvIGJlIGNsZWFyZWRcclxuICAgICAgICBpZiAoaW50RXZ0Q29kZSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOKVxyXG4gICAgICAgIC8vIHNjcmVlbiByZWZyZXNoIGRvZXMgbm90IGNsZWFyIHRoZSBjYWNoZVxyXG4gICAgICAgICAgdGFzay5nZXRUYXNrQ2FjaGUoKS5jbGVhckNhY2hlKCk7XHJcblxyXG4gICAgICAgIGlmIChjbWQgIT09IG51bGwpXHJcbiAgICAgICAgICBhd2FpdCB0YXNrLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2lzSW5SZWNvcmRGbHVzaEV2ZW50ID0gZmFsc2U7XHJcbiAgICAgICAgLy8gUUNSICMyODkyMjIuIERvIG5vdCBjb250aW51ZSB3aXRoIFJlZnJlc2ggaWYgdGhlIHRhc2sgbXVzdCBiZSBlbmRlZC5cclxuICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiAhdGFzay5JbkVuZFRhc2sgJiYgIXRhc2suaXNBYm9ydGluZygpKSB7XHJcbiAgICAgICAgICAvLyBBZnRlciB2aWV3IHJlZnJlc2gsIHRoZSBzZXJ2ZXIgYWx3YXlzIHJldHVybnMgY3VyciByZWMgYXMgZmlyc3QgcmVjLlxyXG4gICAgICAgICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcgJiYgIWZvcm0uaXNTY3JlZW5Nb2RlKCkpIHtcclxuICAgICAgICAgICAgZHYuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgICAgICBpZiAoZm9ybS5IYXNUYWJsZSgpKSB7XHJcbiAgICAgICAgICAgICAgZm9ybS5jbGVhclRhYmxlQ29sdW1uU29ydE1hcmsodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgZm9ybS5yZXN0b3JlT2xkRGlzcGxheUxpbmUoZm9ybS5yZWNvcmRJZHgyRGlzcGxheUxpbmUoZHYuZ2V0Q3VyclJlY0lkeCgpKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBBZnRlciByZWNvcmQgaGFzIGJlZW4gZmx1c2hlZCBpdCBpcyBub3QgY29uc2lkZXJlZCBhIG5ldyByZWNvcmQgYW55bW9yZS5cclxuICAgICAgICAgIGlmIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9SRUNPUkQgJiYgdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkgJiYgIXRhc2suZ2V0QWZ0ZXJSZXRyeSgpKSB7XHJcbiAgICAgICAgICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICAgICAgICAgICgoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKSkuc2V0T2xkUmVjKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgZHYuY3VyclJlY0NvbXB1dGUodHJ1ZSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1NDUkVFTiAmJiB0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSAmJiAhdGFzay5nZXRBZnRlclJldHJ5KCkpIHtcclxuICAgICAgICAgICAgYXdhaXQgZHYuY3VyclJlY0NvbXB1dGUodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gUUNSICM0MzAwNTkuIElmIHRoZSBmb2N1c2VkIHRhc2sgYW5kIHRoZSByZWZyZXNoZWQgdGFzayBpcyB0aGUgc2FtZSB0YXNrIG9yXHJcbiAgICAgICAgICAvLyB0aGUgZm9jdXNlZCB0YXNrIGlzIGEgY2hpbGQgb2YgdGhlIHJlZnJlc2hlZCB0YXNrLCBnbyB0byB0aGUgZmlyc3QgY29udHJvbCBpbiB0aGUgZmlyc3QgbGluZS5cclxuICAgICAgICAgIC8vIElmIHRoZSBmb2N1c2VkIHRhc2sgaXMgdGhlIHBhcmVudCB0YXNrLCBkbyBub3QgbGVhdmUgdGhlIGN1cnJlbnQgY29udHJvbC5cclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmICF0YXNrLmdldFByZXZlbnRDb250cm9sQ2hhbmdlKCkpIHtcclxuICAgICAgICAgICAgaWYgKCEodGFzayA9PT0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpIHx8ICF0YXNrLnBhdGhDb250YWlucyhMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkpKSlcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR28gdG8gY3JlYXRlIG1vZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjbWRzXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGdvdG9DcmVhdGVNb2RlKHRhc2s6IFRhc2spOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kO1xyXG4gICAgYXdhaXQgdGFzay5lbmFibGVNb2RlcygpO1xyXG4gICAgLy8gUUNSICM0MTc3MzMuIEV4ZWN1dGUgUlMncyBvZiB0aGUgbmVzdGVkIHN1YmZvcm1zIGlmIHRoZSBjdXJyZW50IHRhc2sgaXMgb25lIG9mIHRoZSBuZXN0ZWQgc3ViZm9ybXMuXHJcbiAgICBhd2FpdCB0YXNrLkV4ZWN1dGVOZXN0ZWRSUyhMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkpO1xyXG4gICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUV2ZW50Q29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19DUkVBVEUpO1xyXG4gICAgICBhd2FpdCB0YXNrLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcbiAgICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHModGFzayk7XHJcbiAgICAgIGF3YWl0IHRhc2suc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcbiAgICAgIHRhc2suc2V0T3JpZ2luYWxUYXNrTW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLkhhbmRsZUFjdEVudGVyUm93RWRpdGluZyh0YXNrKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkbyBzb21lIGRlZmF1bHQgb3BlcmF0aW9ucyBmb3IgYW4gZXZlbnQgYWZ0ZXIgYWxsIHRoZSBoYW5kbGVycyBmaW5pc2hlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyY0JlZm9yZVwiPnRoZSBSQyByZXR1cm5lZCBmcm9tIHRoZSBjb21tb25IYW5kbGVyQmVmb3JlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BvZ2F0ZVwiPmlmIGV2ZW50IHdhcyBwcm9wb2dhdGVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIkV2ZW50XCI+dGhlIGV2ZW50IHRvIGhhbmRsZTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21tb25IYW5kbGVyQWZ0ZXIoZXZ0OiBSdW5UaW1lRXZlbnQsIHJjQmVmb3JlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPmV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgZHY6IERhdGFWaWV3O1xyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gbnVsbDtcclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2w7XHJcbiAgICBsZXQgcmVjTW9kaWZpZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCByZWNNb2RlSXNEZWxldGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBmb3JjZVN1ZmZpeDogYm9vbGVhbjtcclxuXHJcbiAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbiAmJiBldnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYICYmIGV2dC5nZXRJbnRlcm5hbENvZGUoKSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuICAgICAgZHYgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuICAgICAgcmVjID0gZHYuZ2V0Q3VyclJlYygpO1xyXG4gICAgICBjdHJsID0gPE1nQ29udHJvbD5ldnQuQ29udHJvbDtcclxuXHJcbiAgICAgIHN3aXRjaCAoZXZ0LmdldEludGVybmFsQ29kZSgpKSB7XHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWDpcclxuICAgICAgICAgIGlmIChyY0JlZm9yZSkge1xyXG4gICAgICAgICAgICAvLyBoYW5kbGUgcmVjb3JkIHByZWZpeCBmb3IgdGhlIHN1YiB0YXNrcyB0b29cclxuICAgICAgICAgICAgaWYgKGF3YWl0IHRhc2suQ2hlY2tSZWZyZXNoU3ViVGFza3MoKSlcclxuICAgICAgICAgICAgICBhd2FpdCB0YXNrLmRvU3ViZm9ybVJlY1ByZWZpeFN1ZmZpeCgpO1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrLmhhbmRsZUV2ZW50T25TbGF2ZVRhc2tzKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5lbmFibGVNb2RlcygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVg6XHJcbiAgICAgICAgICB0YXNrLmlzRmlyc3RSZWNvcmRDeWNsZShmYWxzZSk7XHJcbiAgICAgICAgICAvLyBPbmNlIGFyZSByZWFkeSB0byBlbmQgdGhlIFJTLCBpdCBtZWFucyB3ZSBjYW5ub3QgYmUgdGhlIEZJUlNUIHJlY29yZCBjeWNsZVxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0UHJldmVudFJlY29yZFN1ZmZpeCgpKSB7XHJcbiAgICAgICAgICAgIHRhc2suc2V0UHJldmVudFJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBRQ1IgIzExNTk1MS4gRXZlbiBpZiByZWNvcmQgc3VmZml4IGlzIG5vdCBleGVjdXRlZCwgaW4gdGhlIG5leHQgdGltZSBkbyBub3QgZXhlY3V0ZSBSUCAmIFJTIG9mIHRoZSBzdWJmb3JtLlxyXG4gICAgICAgICAgdGFzay5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAvLyBRQ1IgIzk4NDAzMTogaWYgdGhlIGRlbGV0ZSBvcGVyYXRpb24gZmFpbGVkIGR1ZSB0byBcInZlcmlmeSBlcnJvclwiXHJcbiAgICAgICAgICAgIC8vIGluIHRoZSByZWNvcmQgc3VmZml4IHRoZW4gdGhlIHJlY29yZCBtb2RlIG11c3QgYmUgY2xlYXJlZFxyXG4gICAgICAgICAgICBpZiAocmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSlcclxuICAgICAgICAgICAgICByZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgICAgIC8vIFFjciA3ODMwMzkgOiBJZiB3ZSBhcmUgYWxyZWFkeSBpbiBjb250cm9sIGxldmVsIGl0IG1lYW5zIHRoYXQgY29udHJvbCBwcmVmaXggd2FzIGFscmVhZHkgZG9uZSBvciB0aGF0XHJcbiAgICAgICAgICAgIC8vIGNvbnRyb2wgc3VmZml4IHdhcyBub3QgZG9uZS4gRWl0aGVyIHdheSB0aGVyZSBpcyBubyBuZWVkIHRvIGRvIGNvbnRyb2wgcHJlZml4IGFnYWluLlxyXG4gICAgICAgICAgICBpZiAodGFzay5nZXRMZXZlbCgpICE9PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGxhc3QgPSA8TWdDb250cm9sPnRoaXMuZ2V0U3RvcEV4ZWN1dGlvbkN0cmwoKTtcclxuICAgICAgICAgICAgICBpZiAobGFzdCA9PT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGxhc3QgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuICAgICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25DdHJsKG51bGwpO1xyXG5cclxuICAgICAgICAgICAgICAvLyBRQ1IgNDI2MjgzIGlzIHdlIGhhdmUgYSBzdWItZm9ybSB0aGF0IHdhcyBuZXZlciBiZWVuIGVudGVyZWRcclxuICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgY29udHJvbCBsZXZlbCB3aWxsIG5vdCBiZSBlbnRlcmVkXHJcbiAgICAgICAgICAgICAgaWYgKGxhc3QgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gd2UgZG9ub3Qgd2FudCBDUyB0byBiZSBjYWxsZWQgYWdhaW4gZnJvbSBDUCBpbmNhc2Ugb2YgdmVyaWZ5IGVyciBpbiBDVlxyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBpbkN0cmxQcmVmaXg6IGJvb2xlYW4gPSB0YXNrLkluQ3RybFByZWZpeDtcclxuICAgICAgICAgICAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShsYXN0LCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVgpO1xyXG4gICAgICAgICAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBpbkN0cmxQcmVmaXg7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAvLyBpbiB0aGUgZnV0dXJlIGNoZWNrIHRoZSBzdG9wRXhlY3V0aW9uIGZsYWcgaGVyZSB0b28gYW5kIGRpc3BsYXkgYVxyXG4gICAgICAgICAgICAgIC8vIGNvbmZpcm0gY2FuY2VsIGRpYWxvZyB0aGF0IHdpbGwgY2xvc2UgdGhlIGJyb3dzZXIgaWYgdGhlIHZhbHVlIGlzIHRydWVcclxuICAgICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gRGVmZWN0IDE1Mjg3MTogV2l0aCBuZXcgd2F5IG9mIGVkaXRpbmcgcm93LCBSUyBpcyBub3QgZmlyZWQgaW5maW5pdGVseSwgYnV0IHJvdyBzZWxlY3Rpb24gaXMgc2hpZnRlZCB0byBuZXcgcm93LiBBbHNvIHJvdyBsZWF2ZXMgZWRpdGluZyBtb2RlLlxyXG4gICAgICAgICAgICAvLyBTbyBlbnN1cmUgcm93IGVkaXRpbmcgaXMgbGVmdCB3aGVuIHRoZXJlIGlzIG5vIHZlcmlmeSBlcnJvciBhbmQgbm90IHVuY29uZGl0aW9uYWxseS5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVTdG9wUm93RWRpdGluZyh0YXNrKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAocmVjICE9IG51bGwpIHtcclxuICAgICAgICAgICAgcmVjTW9kaWZpZWQgPSByZWMuTW9kaWZpZWQ7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbiAmJiByZWMuaXNDYXVzZUludmFsaWRhdGlvbigpKSB7XHJcbiAgICAgICAgICAgICAgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLmludmFsaWRhdGVUYWJsZSgpO1xyXG4gICAgICAgICAgICAgIHJlYy5zZXRDYXVzZUludmFsaWRhdGlvbihmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVjTW9kZUlzRGVsZXRlID0gKHJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUpO1xyXG5cclxuICAgICAgICAgICAgZm9yY2VTdWZmaXggPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gaWYgdGhlIHJlY29yZCBpcyBkZWxldGVkIHRoZW4gZXhlY3V0ZSB0aGUgXCJyZWMgc3VmZml4IGFmdGVyXCIgb25seVxyXG4gICAgICAgICAgICAvLyB3aGVuIHRoZSB0YXNrIG1vZGUgaXMgZGVsZXRlIChzZWNvbmQgcm91bmQpXHJcbiAgICAgICAgICAgIC8vIGluRGVsZXRlUHJvY2VzcyA6IGlmIHRoZXJlIGlzIGFuICdFTkQgVEFTSyBDT05EJyB3ZSB3aWxsIGhhdmUgYSAzcmQgY3ljbGUgaW4gcmVjb3JkIHN1ZmZpeCh3aGVuIHVwZCtkZWwgb3IgZm9yY2Ugc3VmZiArIGRlbCkuXHJcbiAgICAgICAgICAgIC8vIDFzdCBjeWNsZSA6IHVwZGFlIGN5Y2xlICh0YXNrIG1vZGUgd2lsbCBiZSB1cGRhdGUpLCAybmQgOiB0YXNrIG1vZGUgaXMgZGVsZXRlICwgdGhpcyBpcyB3aGVuIHdlIHNlbmQgdGhlIGRlbGV0ZSB0byB0aGUgc2VydmVyLlxyXG4gICAgICAgICAgICAvLyAzcmQgLSBzdWZmaXggdGhhdCBpcyBjYWxsZWQgZnJvbSB0aGUgZW5kVGFzay4gSW4gdGhlIDNyZCBjeWNsZSB0aGUgcmVjTW9kZUlzRGVsZXRlIHdpbGwgYmUgZmFsc2UgYWx0aG91Z2ggd2UgYXJlIHN0aWxsIGluIHRoZSBkZWxldGUgcHJvY2VzcyAod2UgYWxyZWFkeSBzZW50IHRoZSBkZWxldGUgb3BlcikuXHJcbiAgICAgICAgICAgIC8vIEEgY29tYmluYXRpb24gb2YgZm9yY2Ugc3VmZml4ICsgZW5kIHRhc2sgY29uZCArIGRlbCBsaW5lICwgd2lsbCBjcmFzaCB0aGUgc2VydmVyIG9uIHRoZSAzcmQgY3ljbGUgc2luY2Ugd2Ugd2lsbCBhc2sgZm9yIHVwZGF0ZSBvZmZcclxuICAgICAgICAgICAgLy8gYSByZWNvcmQgdGhhdCB0aGUgc2VydmVyIGhhZCBkZWxldGVkIG9uIHRoZSAybmQgY3ljbGUuIFRoYXQgaXQgd2h5IHdlIHVzZSAnaW5EZWxldGVQcm9jZXNzJywgc28gd2lsbCB3aWxsIGtub3cgbm90XHJcbiAgICAgICAgICAgIC8vIHRvIGFkZCB1cGRhdGUgb3BlciBvbiBhbiBhbHJlYWR5IGRlbGV0ZWQgcmVjb3JkLiAoUWNyICM3OTAyODMpLlxyXG4gICAgICAgICAgICAvLyAqIHRoZXJlIGlzIHN0aWxsIGEgcHJvYmxlbSBpbiAndXBkYXRlJyBhbmQgJ2luc2VydCcgd2l0aCAnZW5kIHRhc2sgY29uZCcgKyAnZm9yY2UnIDogYW4gZXh0cmEgdXBkYXRlIHdpbGwgYmUgc2VuZFxyXG4gICAgICAgICAgICAvLyAgIHRvIHRoZSBzZXJ2ZXIgb24gdGhlIHJlYyBzdWZmaXggb2YgdGhlIGVuZCB0YXNrLiBidXQgYXBhcnQgZnJvbSBzZXJ2ZXIgdXBkYXRlIGl0IGNhdXNlcyBubyByZWFsIHByb2JsZW0uXHJcbiAgICAgICAgICAgIGlmIChyZWNNb2RlSXNEZWxldGUgJiYgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFIHx8XHJcbiAgICAgICAgICAgICAgIXJlY01vZGVJc0RlbGV0ZSAmJiAhcmVjLmluRGVsZXRlUHJvY2VzcygpICYmIChyZWNNb2RpZmllZCB8fCBmb3JjZVN1ZmZpeCkpIHtcclxuICAgICAgICAgICAgICByZWMuc2V0TW9kZShEYXRhTW9kaWZpY2F0aW9uVHlwZXMuVXBkYXRlKTtcclxuICAgICAgICAgICAgICBhd2FpdCBkdi5hZGRDdXJyVG9Nb2RpZmllZCgpO1xyXG4gICAgICAgICAgICAgIGR2LnNldENoYW5nZWQodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChyZWNNb2RpZmllZCAmJiB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlYy5yZWFsTW9kaWZpZWQoKSAmJlxyXG4gICAgICAgICAgICAgICAgICAhRW52aXJvbm1lbnQuSW5zdGFuY2UuYWxsb3dVcGRhdGVJblF1ZXJ5TW9kZSh0YXNrLmdldENvbXBJZHgoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgLy8gaWYgcmVhbCBmaWVsZHMgd2VyZSBtb2RpZmllZFxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBkdi5jYW5jZWxFZGl0KEV2ZW50c01hbmFnZXIuUkVBTF9PTkxZLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgIHRhc2suV3JpdGVUb01lc3NhZ2VQYW5lYnlNc2dJZChNc2dJbnRlcmZhY2UuUlRfU1RSX1VQREFURV9JTl9RVUVSWSk7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0ICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHdlIG11c3QgY29udGludWUgaGVyZSBhbmQgdHJ5IHRvIGNvbW1pdCB0aGUgdHJhbnNhY3Rpb24gYmVjYXVzZVxyXG4gICAgICAgICAgICAgICAgLy8gdGhlcmUgbWlnaHQgYmUgYWxzbyBzb21lIHN1YiB0YXNrcyB0byB0aGlzIHRhc2tcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFFDUiM3NzYyOTU6IGZvciBwcmUgcmVjb3JkIHVwZGF0ZSwgY29tbWl0IHRoZSByZWNvcmQgYWZ0ZXIgaGFuZGxlcidzIGV4ZWN1dGlvbi5cclxuICAgICAgICAgICAgLy8gRml4ZWQgYnVnICM6MzA2OTI5LCBGb3JjZUV4aXRQcmUgaXMgcmVsZXZhbnQgb25seSBmb3IgdGhlIHRhc2sgdGhhdCByYWlzZWQgdGhlIGV2ZW50XHJcbiAgICAgICAgICAgIC8vIHNlZSBhbHNvIGJ1ZyM6MjkyODc2XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0ZvcmNlRXhpdFByZVJlY29yZFVwZGF0ZSh0YXNrKSAmJlxyXG4gICAgICAgICAgICAgIC8vIERlZmVjdCAxNTQwNDcgOiBkbyBub3QgdHJ5IGFuZCBjb21taXQgaWYgdGFzayBpcyBhYm9ydGluZyBhbmQgd2FzIGFscmVhZHkgcmVtb3ZlZCAob3IgYWxsIE1HRCB3YXMgcmVtb3ZlZCkuXHJcbiAgICAgICAgICAgICAgKCF0YXNrLmlzQWJvcnRpbmcoKSB8fCBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLkdldFRhc2tCeUlEKHRhc2suZ2V0VGFza1RhZygpKSAhPSBudWxsKSlcclxuICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgaWYgKCghcmVjTW9kZUlzRGVsZXRlIHx8IHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSkpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvbW1pdFJlY29yZCh0YXNrLCBldnQucmV2ZXJzaWJsZUV4aXQoKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGFzay50cmFuc2FjdGlvbkZhaWxlZChDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSAmJiAhdGFzay5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRvIGV2YWx1YXRlIHRoZSBlbmQgY29uZGl0aW9uIGFmdGVyIHRoZSByZWNvcmQgc3VmZml4XHJcbiAgICAgICAgICAgICAgLy8gaW4gY2FzZSB0aGVyZSBhcmUgMiBjeWNsZXMgKHVwZGF0ZS9mb3JjZSBzdWZmaXggKyBkZWxldGUpLCBkbyB0aGUgZW5kIHRhc2sgb25seSBpbiB0aGUgMm5kIGN5Y2xlLlxyXG4gICAgICAgICAgICAgIGlmICgocmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSAmJlxyXG4gICAgICAgICAgICAgICAgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFKSB8fFxyXG4gICAgICAgICAgICAgICAgcmVjLmdldE1vZGUoKSAhPT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSlcclxuICAgICAgICAgICAgICAgIGlmIChhd2FpdCB0YXNrLmV2YWxFbmRDb25kKENvbnN0SW50ZXJmYWNlLkVORF9DT05EX0VWQUxfQUZURVIpKVxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSAvLyByZWMgIT0gbnVsbFxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYOlxyXG4gICAgICAgICAgaWYgKHJjQmVmb3JlKSB7XHJcbiAgICAgICAgICAgIC8vIGNoZWNrIHBhcmthYmlsaXR5IG9uY2UgYWdhaW4gYXMgcHJvcGVydHkgbWlnaHQgaGF2ZSBjaGFuZ2VkIGluIHRoZSBoYW5kbGVyXHJcbiAgICAgICAgICAgIC8vIDkyNDExMiAtIGlnbm9yZSBkaXJlY3Rpb24gKGlmIGZsYWcgc2V0KSBhcyB3ZSBhcmUgZm9yY2luZyBwYXJrIGluc3BpdGUgb2YgZmFpbGVkIGRpcmVjdGlvblxyXG4gICAgICAgICAgICAvLyBRQ1IjIDgwNjAxNTogSWYgd2UgaGF2ZSBhIHNpbmdsZSBmaWVsZCB3aXRoIGFsbG93IHBhcmtpbmcgPSBZZXMgYW5kIFRhYiBJbnRvID0gTm8sIHRoZW4gb24gcHJlc3NpbmcgdGFiIGlmIGN1cnNvciBpcyBub3RcclxuICAgICAgICAgICAgLy8gbW92ZWQsIHdlIGNvbWUgdG8gcGFyayBvbiBsYXN0UGFya2VkQ3RybCAod2hpY2ggaXMgc2FtZSBhcyBjdHJsKSBzaW5jZSBUYWJJbnRvIGlzIG5vdCBhbGxvd2VkLlxyXG4gICAgICAgICAgICAvLyBTbyB0byBhdmFvaWQgaW5maW5pdGUgcmVjdXJzaW9uLCB3ZSBzaG91bGQgbm90IGFnYWluIHRyeSB0byBwYXJrIG9uIGl0LlxyXG4gICAgICAgICAgICBpZiAoYXdhaXQgY3RybC5Jc1BhcmthYmxlKCkgfHwgY3RybCA9PT0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICAgICAgLy8gc2V0IEluQ29udHJvbCB0cnVlIGFmdGVyIENvbnRyb2wgUHJlZml4XHJcbiAgICAgICAgICAgICAgY3RybC5JbkNvbnRyb2wgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoY3RybC5TaG91bGRSZWZyZXNoT25Db250cm9sRW50ZXIoKSlcclxuICAgICAgICAgICAgICAgIGF3YWl0ICg8RmllbGQ+Y3RybC5nZXRGaWVsZCgpKS51cGRhdGVEaXNwbGF5KCk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIGlmIHRoaXMgY29kZSBpcyByZWFjaGVkIHRoZW4gZXZlcnl0aGluZyBpcyBvayBpbiB0aGUgY29udHJvbCBwcmVmaXhcclxuICAgICAgICAgICAgICAvLyB1c2VyIGhhbmRsZXIuIE5vdywgbW92ZSB0aGUgZm9jdXMgdG8gdGhlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgdGFzay5zZXRMYXN0UGFya2VkQ3RybChjdHJsKTtcclxuICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHBhcmtlZCBvbiBhIGN0cmwgc2V0IGNsaWNrZWQgY3RybCB0byBudWxsXHJcbiAgICAgICAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkN1cnJlbnRDbGlja2VkQ3RybCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgIC8vIHRvIHRha2UgY2FyZSBvZiB0ZW1wb3JhcnkgZWRpdG9yXHJcbiAgICAgICAgICAgICAgLy8gTWFuYWdlci5zZXRGb2N1cyhjdHJsLCBjdHJsLmdldERpc3BsYXlMaW5lKGZhbHNlKSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgY3RybC5TZXRGb2N1cyhjdHJsLCBjdHJsLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgIHRydWUpO1xyXG4gICAgICAgICAgICAgIC8vIHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IHBhcmtlZCBvbiBhIGN0cmwsIHNldCBzZXRzdG9wZXhlY3V0aW9uQ3RybCB0byBudWxsXHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChudWxsKTtcclxuXHJcbiAgICAgICAgICAgICAgTWdDb250cm9sLlJldHVyblRvQ3RybCA9IGN0cmw7XHJcbiAgICAgICAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0YXNrLkluQ3RybFByZWZpeCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyhjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYOlxyXG4gICAgICAgICAgLy8gZGlzYWJsZSBhY3Rpb25zIGFuZCBzdGF0ZXMuIGRvIGl0IG9ubHkgaWYgd2UgYXJlIGdldHRpbmcgb3V0IG9mIHRoZSBjb250cm9sLlxyXG4gICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuXHJcbiAgICAgICAgICAgIGlmIChjdHJsLmlzQ2hvaWNlQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICAgICAgY3RybC5TZXRLZXlib2FyZExhbmd1YWdlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKVxyXG4gICAgICAgICAgICAgIHRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0JVVFRPTiwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0RW5hYmxlWm9vbUhhbmRsZXIoKSB8fCBjdHJsLnVzZVpvb21IYW5kbGVyKCkpXHJcbiAgICAgICAgICAgICAgdGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB0YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9FRFRfTlVMTCwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAocmNCZWZvcmUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgIC8vIElmIGNvbnRyb2wgc3VmZml4IGdldCAnc3RvcCBleGVjdXRpb24nIChlLmcuIHZlcmlmeSBlcnJvciksIHRoZSBmb2N1cyB3aWxsIGJlIHJlbWFpbiBvbiBjdXJyZW50IGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgLy8gU28gc2V0IEluQ29udHJvbCB0byB0cnVlXHJcbiAgICAgICAgICAgICAgY3RybC5JbkNvbnRyb2wgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gcmVzZXQgdGhlIG5leHRQYXJrZWRDdHJsIChzZXQgaW4gQ2xpZW50TWFuYWdlci5wcm9jZXNzRm9jdXMpXHJcbiAgICAgICAgICAgIHRoaXMuX25leHRQYXJrZWRDdHJsID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBmaWVsZHMgdGhhdCBhcmUgYXNzaWduZWQgdG8gYSB0ZXh0IGNvbnRyb2wgYW5kIHdpdGggdHlwZSB0aGF0IGhhcyBkZWZhdWx0IGRpc3BsYXlcclxuICAgICAgICAgICAgLy8gdmFsdWUgKG51bWVyaWMsIGRhdGUsIHRpbWUsIGxvZ2ljYWwgZXRjKVxyXG4gICAgICAgICAgICBsZXQgZmxkOiBGaWVsZCA9IDxGaWVsZD5jdHJsLmdldEZpZWxkKCk7XHJcbiAgICAgICAgICAgIGlmIChmbGQgIT0gbnVsbCAmJiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9URVhUKSlcclxuICAgICAgICAgICAgICBhd2FpdCBmbGQudXBkYXRlRGlzcGxheSgpO1xyXG5cclxuICAgICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpO1xyXG4gICAgICAgICAgICBjdHJsLnNldEluQ29udHJvbFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICAgIGN0cmwuSXNJbnRlcmFjdGl2ZVVwZGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoY3RybC5Qcm9wZXJ0eUV4aXN0cyhQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fVkFMSURBVE9SUykpXHJcbiAgICAgICAgICAgICAgYXdhaXQgY3RybC5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9WQUxJREFUT1JTKS5SZWZyZXNoRGlzcGxheSh0cnVlKTtcclxuICAgICAgICAgICAgY3RybC5WYWxpZGF0ZUNvbnRyb2wgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuc2V0TGFzdEZvY3VzZWRDb250cm9sKHRhc2ssIG51bGwpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGF3YWl0IHRhc2suZXZhbEVuZENvbmQoQ29uc3RJbnRlcmZhY2UuRU5EX0NPTkRfRVZBTF9JTU1JRElBVEUpKVxyXG4gICAgICAgICAgICAgIGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfUFJFRklYOlxyXG4gICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWDpcclxuICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfTk9ORSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgLy8gc2ltdWxhdGVzIHVzZXIgYXNraW5nIGZvciB0aGUgbmV4dCByZWMuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1lDTEVfTkVYVF9SRUM6XHJcbiAgICAgICAgICBsZXQgZm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICAgICAgICBpZiAoIXRhc2suaXNNYWluUHJvZygpICYmIGZvcm0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoZm9ybS5pc0xpbmVNb2RlKClcclxuICAgICAgICAgICAgICA/IENvbnN0YW50cy5NT1ZFX1VOSVRfUk9XXHJcbiAgICAgICAgICAgICAgOiBDb25zdGFudHMuTU9WRV9VTklUX1BBR0UsXHJcbiAgICAgICAgICAgICAgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQpO1xyXG4gICAgICAgICAgICAvLyBlbmQgb2YgZGF0YSB3aWxsIHNpZ25hbCB1cyB0byBlbmQgdGhlIHRhc2sgKHVubGVzcyBpbiBjcmVhdGUgbW9kZSkuXHJcbiAgICAgICAgICAgIGlmICh0YXNrLmdldEV4ZWNFbmRUYXNrKCkpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgLy8gZGVsZXRlIHJlY29yZCBpbiBub24gaW50ZXJhY3RpdmUgdGFza1xyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NZQ0xFX05FWFRfREVMRVRFX1JFQzpcclxuICAgICAgICAgIC8vIGNoZWNrIGVtcHR5IGRhdGF2aWV3IGJlZm9yZSB0cnlpbmcgdG8gZGVsZXRlLCBpbiBjYXNlIHRhc2sgc3RhcnRlZCB3aXRoIGVtcHR5IGRhdGF2aWV3LlxyXG4gICAgICAgICAgaWYgKHRhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpXHJcbiAgICAgICAgICAgICh0YXNrKS5zZXRFeGVjRW5kVGFzaygpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZUFjdGlvbkRlbGxpbmUoIHRhc2ssIGR2LCByZWMsIHRydWUpO1xyXG5cclxuICAgICAgICAgIC8vIGVuZCBvZiBkYXRhIHdpbGwgc2lnbmFsIHVzIHRvIGVuZCB0aGUgdGFzayAodW5sZXNzIGluIGNyZWF0ZSBtb2RlKS5cclxuICAgICAgICAgIGlmICh0YXNrLmdldEV4ZWNFbmRUYXNrKCkpXHJcbiAgICAgICAgICAgIGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFVF9FWFRFUk5BTF9WQUxVRTpcclxuICAgICAgICAgIGxldCByZWZyZXNoRGlzcGxheSA6IGJvb2xlYW4gPSBhd2FpdCBldnQuZ2V0QXJnTGlzdCgpLmdldEFyZ1ZhbHVlKDEsIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTiwgMCkgPT09ICcxJyA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgICAgIGF3YWl0ICg8TWdDb250cm9sPmN0cmwpLnZhbGlkYXRlQW5kU2V0VmFsdWVJZkFsbG93ZWQoZXZ0LmdldFZhbHVlKCksIHJlZnJlc2hEaXNwbGF5KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNyZWF0ZXMgYSBub24gcmV2ZXJzaWJsZSBldmVudCBhbmQgaGFuZGxlIGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj5hIHJlZmVyZW5jZSB0byB0aGUgdGFzayA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZlbnRDb2RlXCI+dGhlIGNvZGUgb2YgdGhlIGV2ZW50IDwvcGFyYW0+XHJcbiAgYXN5bmMgaGFuZGxlTm9uUmV2ZXJzaWJsZUV2ZW50KHRhc2s6IFRhc2tCYXNlLCBldmVudENvZGU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KHRhc2spO1xyXG4gICAgbGV0IGV4aXRDb21tYW5kOiBib29sZWFuID0gKGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQgfHwgZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0xPU0UpO1xyXG5cclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGV2ZW50Q29kZSk7XHJcblxyXG4gICAgaWYgKGV4aXRDb21tYW5kKVxyXG4gICAgICB0aGlzLl9pc05vblJldmVyc2libGVFeGl0ID0gdHJ1ZTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBydEV2dC5zZXROb25SZXZlcnNpYmxlRXhpdCgpO1xyXG4gICAgICBydEV2dC5zZXRDdHJsKDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpKTtcclxuICAgICAgcnRFdnQuc2V0QXJnTGlzdChudWxsKTtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgaWYgKGV4aXRDb21tYW5kKVxyXG4gICAgICAgIHRoaXMuX2lzTm9uUmV2ZXJzaWJsZUV4aXQgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjcmVhdGVzIGEgbmV3IGludGVybmFsIEV2ZW50IGFuZCBoYW5kbGUgaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPmEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2ZW50Q29kZVwiPnRoZSBjb2RlIG9mIHRoZSBldmVudDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc1F1aXRcIj5pbmRpY2F0ZXMgd2hldGhlciBNR19BQ1RfQ0FOQ0VMIGlzIGNhbGxlZCBmcm9tIE1HX0FDVF9SVF9RVUlUPC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRFdmVudFN1YnR5cGUodGFzazogVGFza0Jhc2UsIGV2ZW50Q29kZTogbnVtYmVyLCBldmVudFN1YlR5cGU6IEV2ZW50U3ViVHlwZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGxhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50O1xyXG5cclxuICAgIGlmIChldmVudENvZGUgPCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVE9UX0NOVCAmJiB0YXNrICE9IG51bGwgJiYgIShldmVudFN1YlR5cGUgPT09IEV2ZW50U3ViVHlwZS5DYW5jZWxJc1F1aXQpICYmICF0YXNrLkFjdGlvbk1hbmFnZXIuaXNFbmFibGVkKGV2ZW50Q29kZSkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IG51bGwpXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2wobGFzdFBhcmtlZEN0cmwsIGV2ZW50Q29kZSwgZXZlbnRTdWJUeXBlKTtcclxuXHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1FVSVQpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRFdmVudFN1YnR5cGUodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBTkNFTCwgRXZlbnRTdWJUeXBlLkNhbmNlbElzUXVpdCk7XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudCh0YXNrKTtcclxuICAgICAgICBydEV2dC5zZXRJbnRlcm5hbChldmVudENvZGUpO1xyXG4gICAgICAgIHJ0RXZ0LlNldEV2ZW50U3ViVHlwZShldmVudFN1YlR5cGUpO1xyXG4gICAgICAgIGlmIChJbnRlcm5hbEludGVyZmFjZS5CdWlsdGluRXZlbnQoZXZlbnRDb2RlKSlcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmNvbW1vbkhhbmRsZXIocnRFdnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY3JlYXRlcyBhIG5ldyBpbnRlcm5hbCBFdmVudCBhbmQgaGFuZGxlIGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5hIHJlZmVyZW5jZSB0byB0aGUgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldmVudENvZGVcIj50aGUgY29kZSBvZiB0aGUgZXZlbnQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNRdWl0XCI+aW5kaWNhdGVzIHdoZXRoZXIgTUdfQUNUX0NBTkNFTCBpcyBjYWxsZWQgZnJvbSBNR19BQ1RfUlRfUVVJVDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbChjdHJsOiBNZ0NvbnRyb2wsIGV2ZW50Q29kZTogbnVtYmVyLCBldmVudFN1YlR5cGU6IEV2ZW50U3ViVHlwZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQ7XHJcblxyXG4gICAgaWYgKGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1FVSVQpXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2woY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBTkNFTCwgRXZlbnRTdWJUeXBlLkNhbmNlbElzUXVpdCk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwpO1xyXG4gICAgICBydEV2dC5zZXRJbnRlcm5hbChldmVudENvZGUpO1xyXG4gICAgICBydEV2dC5TZXRFdmVudFN1YlR5cGUoZXZlbnRTdWJUeXBlKTsgLy8gKHVzZSBmb3IgYWN0X2NhbmNlbCAmIGFjdF9ydF92aWV3X3JlZnJlc2hcclxuICAgICAgLy8gYmFzaWNhbGx5IE1HX0FDVF9WSUVXX1JFRlJFU0ggcmVwcmVzZW50IHRoZSB2aWV3IHJlZnJlc2ggZXZlbnQgcmFpc2VkIGJ5IHRoZSB1c2VyXHJcbiAgICAgIC8vIGhvd2V2ZXIgd2UgdXNlIGludGVybmFsbHkgaW4gdGhlIGNvZGUgdG8gcmVmcmVzaCB0aGUgZGlzcGxheSAobWFpbmx5IGluIHN1YiBmb3JtcyByZWZyZXNoZXMpXHJcbiAgICAgIC8vIGluIG9yZGVyIHRoZSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSByZWFsIHVzZSBhbmQgdGhlIGludGVybmFsIHVzZSB3ZSBzZXQgdGhpcyBmbGFnIHRvIGZhbHNlXHJcbiAgICAgIC8vIHdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgdHdvIHNpbmNlIHdlIG1ha2UgZGlmZmVyZW50IGFjdGlvbnMgd2hlbiBjYWNoaW5nIGEgc3ViZm9ybVxyXG4gICAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXKVxyXG4gICAgICAgIHJ0RXZ0LnNldElzUmVhbFJlZnJlc2goZmFsc2UpO1xyXG5cclxuICAgICAgaWYgKEludGVybmFsSW50ZXJmYWNlLkJ1aWx0aW5FdmVudChldmVudENvZGUpKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGF3YWl0IHRoaXMuY29tbW9uSGFuZGxlcihydEV2dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgY3VycmVudCBmaWVsZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q3VyckZpZWxkKCk6IEZpZWxkIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyRmllbGQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBjdXJyZW50IGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEN1cnJDdHJsKCk6IE1nQ29udHJvbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VyckN0cmw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgY3VycmVudCB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDdXJyVGFzaygpOiBUYXNrIHtcclxuICAgIGlmICh0aGlzLl9jdXJyRmllbGQgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gPFRhc2s+dGhpcy5fY3VyckZpZWxkLmdldFRhc2soKTtcclxuICB9XHJcblxyXG4gIHNldFN0b3BFeGVjdXRpb24oc3RvcDogYm9vbGVhbik6IHZvaWQ7XHJcbiAgc2V0U3RvcEV4ZWN1dGlvbihzdG9wOiBib29sZWFuLCBjbGVhclNydnJFdmVudHM6IGJvb2xlYW4pOiB2b2lkO1xyXG4gIHNldFN0b3BFeGVjdXRpb24oc3RvcDogYm9vbGVhbiwgY2xlYXJTcnZyRXZlbnRzPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpXHJcbiAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbl8wKHN0b3ApO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25fMShzdG9wLCBjbGVhclNydnJFdmVudHMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgXCJzdG9wIGV4ZWN1dGlvblwiIGZsYWcgdG8gdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRTdG9wRXhlY3V0aW9uXzAoc3RvcDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHN0b3AsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgXCJzdG9wIGV4ZWN1dGlvblwiIGZsYWcgdG8gdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRTdG9wRXhlY3V0aW9uXzEoc3RvcDogYm9vbGVhbiwgY2xlYXJTcnZyRXZlbnRzOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoc3RvcClcclxuICAgICAgaWYgKGNsZWFyU3J2ckV2ZW50cylcclxuICAgICAgICB0aGlzLl9ldmVudHNRdWV1ZS5jbGVhcigpO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgdG1wVmVjID0gbmV3IExpc3Q8UnVuVGltZUV2ZW50PigpO1xyXG4gICAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50O1xyXG4gICAgICAgIGxldCBpOiBudW1iZXI7XHJcblxyXG4gICAgICAgIC8vIFdlIHdlcmUgcmVxdWVzdGVkIHRvIGxlYXZlIHRoZSBcInNlcnZlciBldmVudHNcIiBpbiB0aGUgcXVldWUuXHJcbiAgICAgICAgLy8gRG8gaXQsIGJ1dCBhbHNvIHJlbW92ZSB0aGUgXCJwcm90ZWN0aW9uXCIgZnJvbSB0aGVzZSBldmVudHMgc28gbmV4dFxyXG4gICAgICAgIC8vIHRpbWUgd2UgbmVlZCB0byBjbGVhciB0aGUgcXVldWUgdGhleSB3aWxsIGFsc28gYmUgZGVsZXRlZC5cclxuICAgICAgICB3aGlsZSAoIXRoaXMuX2V2ZW50c1F1ZXVlLmlzRW1wdHkoKSkge1xyXG4gICAgICAgICAgcnRFdnQgPSA8UnVuVGltZUV2ZW50PnRoaXMuX2V2ZW50c1F1ZXVlLnBvbGwoKTtcclxuICAgICAgICAgIGlmIChydEV2dC5pc0Zyb21TZXJ2ZXIoKSkge1xyXG4gICAgICAgICAgICBydEV2dC5yZXNldEZyb21TZXJ2ZXIoKTtcclxuICAgICAgICAgICAgdG1wVmVjLnB1c2gocnRFdnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRtcFZlYy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgIHRoaXMuX2V2ZW50c1F1ZXVlLnB1dCh0bXBWZWMuZ2V0X0l0ZW0oaSkpO1xyXG4gICAgICB9XHJcbiAgICB0aGlzLl9zdG9wRXhlY3V0aW9uID0gc3RvcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGN0cmwgb24gd2hpY2ggd2UgaGFkIGEgXCJzdG9wIGV4ZWN1dGlvblwiXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRTdG9wRXhlY3V0aW9uQ3RybChjdHJsOiBNZ0NvbnRyb2wpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uQ3RybCA9PT0gbnVsbCB8fCBjdHJsID09PSBudWxsKVxyXG4gICAgICB0aGlzLl9zdG9wRXhlY3V0aW9uQ3RybCA9IGN0cmw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZGVsZXRlIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+dGhlIHRhc2sgdG8gcmVmZXIgdG8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImluRm9yY2VEZWxcIj50cnVlIGlmIHRoZSBkZWxldGUgaXMgZG9uZSBiZWNhdXNlIG9mIGZvcmNlIGRlbGV0ZSA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgZGVsQ3VyclJlYyh0YXNrOiBUYXNrLCBpbkZvcmNlRGVsOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZHY6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRhc2suRGF0YVZpZXc7XHJcblxyXG4gICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuXHJcbiAgICAvLyBkZWxldGUgdGhlIHJlY29yZCBhbmQgcnVuIHJlY29yZCBzdWZmaXggZm9yIHRoZSBuZXcgY3VycmVudCByZWNvcmRcclxuICAgIGF3YWl0ICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5kZWxDdXJyUmVjKCk7XHJcblxyXG4gICAgLy8gbm8gY3Vyci1yZWMgPT0+IHdlIGRlbGV0ZWQgdGhlIGxhc3QgcmVjb3JkIGFuZCBmYWlsZWQgdG8gY3JlYXRlIGEgbmV3IG9uZSAoZS5nLlxyXG4gICAgLy8gQ1JFQVRFIG1vZGUgaXMgbm90IGFsbG93ZWQpID09PiBlbmQgdGhlIHRhc2suIEFuIGV4Y2VwdGlvbiB0byB0aGUgcnVsZSBpcyB3aGVuXHJcbiAgICAvLyB3ZSBhcmUgYWxyZWFkeSBpbiB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhIHJlY29yZC5cclxuICAgIGlmICghdGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSkge1xyXG4gICAgICBpZiAoZHYuZ2V0Q3VyclJlY0lkeCgpID49IDApIHtcclxuICAgICAgICAvLyBRQ1IgIzY1NjQ5NTogSWYgd2UgZ290IHRvIHRoaXMgcG9pbnQgYW5kIHRoZSBjdXJyZW50IHJlY29yZCBpcyBzdGlsbCB0aGVcclxuICAgICAgICAvLyBkZWxldGVkIG9uZSB0aGVuIHRoZSByZWNvcmQgcHJlZml4IHdpbGwgYmUgaGFuZGxlZCBlbHNld2hlcmUuXHJcbiAgICAgICAgaWYgKChkdi5nZXRDdXJyUmVjKCkpLmdldE1vZGUoKSAhPT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSAmJiAhaW5Gb3JjZURlbCkge1xyXG4gICAgICAgICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICAgIGlmIChjdHJsID09PSBudWxsKVxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyh0YXNrKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKCF0YXNrLmdldEluQ3JlYXRlTGluZSgpKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlTm9uUmV2ZXJzaWJsZUV2ZW50KHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyh0YXNrKTtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwcm9jZXNzIHVzZXJzIGNvbmZpcm1hdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+dG8gY2hlY2sgY29uZmlybSB1cGRhdGU8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSAtIHByb2Nlc3MgY29tbWFuZCwgZmFsc2UgLSBzdG9wIGNvbW1hbmQgcHJvY2Vzc2luZzwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZUNvbmZpcm1lZCh0YXNrOiBUYXNrKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgY29uZmlybTogYm9vbGVhbjtcclxuICAgIGxldCBhbnN3ZXI6IHN0cmluZztcclxuICAgIGxldCBhbnM6IG51bWJlcjtcclxuXHJcbiAgICBpZiAodGFzayA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uZmlybSA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTkZJUk1fVVBEQVRFLCBmYWxzZSk7XHJcbiAgICBpZiAoIXRoaXMuX2lzSW5SZWNvcmRGbHVzaEV2ZW50ICYmIGNvbmZpcm0gJiYgIXRhc2suRGF0YVN5bmNlZCkge1xyXG4gICAgICBhbnMgPSBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLmNvbmZpcm0oTXNnSW50ZXJmYWNlLkNSRl9TVFJfQ09ORl9VUEQsXHJcbiAgICAgICAgU3R5bGVzLk1TR0JPWF9JQ09OX1FVRVNUSU9OIHwgU3R5bGVzLk1TR0JPWF9CVVRUT05fWUVTX05PX0NBTkNFTCk7XHJcbiAgICAgIGlmIChhbnMgPT09IFN0eWxlcy5NU0dCT1hfUkVTVUxUX1lFUylcclxuICAgICAgICBhbnN3ZXIgPSAnWSc7XHJcbiAgICAgIC8vIFllc1xyXG4gICAgICBlbHNlIGlmIChhbnMgPT09IFN0eWxlcy5NU0dCT1hfUkVTVUxUX05PKVxyXG4gICAgICAgIGFuc3dlciA9ICdOJztcclxuICAgICAgLy8gTm9cclxuICAgICAgZWxzZVxyXG4gICAgICAgIGFuc3dlciA9ICdDJzsgLy8gQ2FuY2VsXHJcbiAgICB9IGVsc2VcclxuICAgICAgYW5zd2VyID0gJ1knO1xyXG5cclxuICAgIHN3aXRjaCAoYW5zd2VyKSB7XHJcbiAgICAgIGNhc2UgJ1knOlxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnTic6XHJcbiAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLmNhbmNlbEVkaXQoZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgdGFzay5Db25maXJtVXBkYXRlTm8gPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gbm90IGNvbnRpbnVlIHJlY29yZCBzdWZmaXhcclxuXHJcbiAgICAgIGNhc2UgJ0MnOlxyXG4gICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25DdHJsKExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKSk7XHJcbiAgICAgICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKSwgLTEpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gc3RvcCBldmVudCBwcm9jZXNzaW5nXHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcImluIENsaWVudE1hbmFnZXIuSW5zdGFuY2UudXBkYXRlQ29uZmlybWVkKCkgaWxsZWdhbCBjb25maXJtYXRpb24gY29kZTogXCIgK1xyXG4gICAgICAgICAgY29uZmlybSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBTZXQgdGhlIG9yZGVyIG9mIGhhbmRsaW5nIG1haW4gcHJvZ3JhbXMgb2YgY29tcG9uZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0Q29tcE1haW5QcmdUYWIoY29tcE1haW5QcmdUYWJsZTogQ29tcE1haW5QcmdUYWJsZSk6IHZvaWQge1xyXG4gICAgdGhpcy5fY29tcE1haW5QcmdUYWIgPSBjb21wTWFpblByZ1RhYmxlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBlbmQgb2Ygd29yayBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRFbmRPZldvcmsoZW5kT2ZXb3JrXzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fZW5kT2ZXb3JrID0gZW5kT2ZXb3JrXztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgZW5kIG9mIHdvcmsgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RW5kT2ZXb3JrKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuZE9mV29yaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIG9yZGVyIG9mIGhhbmRsaW5nIG1haW4gcHJvZ3JhbXMgb2YgY29tcG9uZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q29tcE1haW5QcmdUYWIoKTogQ29tcE1haW5QcmdUYWJsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29tcE1haW5QcmdUYWI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSByZXZlcnNpYmxlIGV4aXQgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaW5Ob25SZXZlcnNpYmxlRXhpdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc05vblJldmVyc2libGVFeGl0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHB1c2ggYSBydW50aW1lIGV2ZW50IHRvIHRoZSBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBydW50aW1lIGV2ZW50IHRvIHB1c2ggb24gdGhlIHN0YWNrPC9wYXJhbT5cclxuICBwdXNoUnRFdmVudChydEV2dDogUnVuVGltZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLl9ydEV2ZW50cy5wdXNoKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwb3AgYSBydW50aW1lIGV2ZW50IGZyb20gdGhlIHN0YWNrIGFuZCByZXR1cm4gaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHBvcFJ0RXZlbnQoKTogUnVuVGltZUV2ZW50IHtcclxuICAgIGlmICh0aGlzLl9ydEV2ZW50cy5jb3VudCgpID09PSAwKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiA8UnVuVGltZUV2ZW50PnRoaXMuX3J0RXZlbnRzLnBvcCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHN0b3JlIHRoZSBsYXN0IHNhdmVkIHJvdXRlIGV2ZW50IG9uIGxvY2FsIHN0b3JhZ2UuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdG9yZUxhc3RTYXZlZFJvdXRlRXZlbnRPbkxvY2FsU3RvcmFnZSgpOiB2b2lkXHJcbiAge1xyXG4gICAgbGV0IGRhdGFTdG9yYWdlID0gd2luZG93LmxvY2FsU3RvcmFnZTtcclxuICAgIGlmICh0aGlzLmdldExhc3RTYXZlZFJvdXRlRXZlbnQoKSAhPSBudWxsKVxyXG4gICAge1xyXG4gICAgICBsZXQgcnRFdnQgPSB0aGlzLmdldExhc3RTYXZlZFJvdXRlRXZlbnQoKTtcclxuXHJcbiAgICAgIGRhdGFTdG9yYWdlLnNldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVCwgXCIxXCIpO1xyXG4gICAgICBkYXRhU3RvcmFnZS5zZXRJdGVtKENvbnN0SW50ZXJmYWNlLkxBU1RfUk9VVEVfRVZFTlRfU1JDX1RTSywgSlNPTi5zdHJpbmdpZnkoKDxUYXNrPnJ0RXZ0LmdldFRhc2soKSkuVGFza0RlZmluaXRpb25JZCkpO1xyXG5cclxuICAgICAgaWYgKHJ0RXZ0LmdldEFyZ0xpc3QoKS5nZXRTaXplKCkgPiAwKSB7XHJcbiAgICAgICAgbGV0IHN0cjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICAgICAgcnRFdnQuZ2V0QXJnTGlzdCgpLmJ1aWxkWE1MKHN0cik7XHJcbiAgICAgICAgZGF0YVN0b3JhZ2Uuc2V0SXRlbShDb25zdEludGVyZmFjZS5MQVNUX1JPVVRFX0VWRU5UX0FSR19MSVNULCAgc3RyLnRvU3RyaW5nKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzdG9yZSB0aGUgbGFzdCBzYXZlZCByb3V0ZSBldmVudCBmcm9tIGxvY2FsIHN0b3JhZ2UuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXN0b3JlTGFzdFNhdmVkUm91dGVFdmVudEZyb21Mb2NhbFN0b3JhZ2UoKTogdm9pZFxyXG4gIHtcclxuICAgIC8vZ2V0IHJvdXRlIGV2ZW50IGlmIHN0b3JlZCBvbiBsb2NhbCBzdG9yYWdlXHJcbiAgICBsZXQgZGF0YVN0b3JhZ2UgPSB3aW5kb3cubG9jYWxTdG9yYWdlO1xyXG5cclxuICAgIGxldCBsYXN0Um91dGVFdmVudCA9IGRhdGFTdG9yYWdlLmdldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVCk7XHJcblxyXG4gICAgaWYgKGxhc3RSb3V0ZUV2ZW50ID09PSBcIjFcIikge1xyXG4gICAgICBsZXQgc3JjVGFza0RlZmluaXRpb25TdHIgPSBkYXRhU3RvcmFnZS5nZXRJdGVtKENvbnN0SW50ZXJmYWNlLkxBU1RfUk9VVEVfRVZFTlRfU1JDX1RTSyk7XHJcbiAgICAgIGxldCByb3V0ZUFyZ0xpc3RTdHIgPSBkYXRhU3RvcmFnZS5nZXRJdGVtKENvbnN0SW50ZXJmYWNlLkxBU1RfUk9VVEVfRVZFTlRfQVJHX0xJU1QpO1xyXG5cclxuICAgICAgLy8gcGFyc2Ugc3JjVGFza0RlZmluaXRpb25TdHIgYW5kIHByZXBhcmUgdGFza0RlZmluaXRpb25JZFxyXG4gICAgICBsZXQgdGFza0RlZmluaXRpb25JZCA9IG5ldyBUYXNrRGVmaW5pdGlvbklkKCk7XHJcbiAgICAgIHRhc2tEZWZpbml0aW9uSWQuZnJvbUpTT04oc3JjVGFza0RlZmluaXRpb25TdHIpO1xyXG5cclxuICAgICAgLy9zZWFyY2ggc291cmNlIHRhc2sgaW4gbmV3bHkgbG9hZGVkIHRhc2sgdHJlZSBieSB0YXNrRGVmaW5pdGlvbklkXHJcbiAgICAgIGxldCBzcmNUYXNrID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRDdXJyTUdEYXRhKCkuZ2V0VGFza0J5VGFza0RlZmluaXRpb25JRCh0YXNrRGVmaW5pdGlvbklkKTtcclxuICAgICAgbGV0IGFyZ3MgPSBudWxsO1xyXG4gICAgICBpZiAocm91dGVBcmdMaXN0U3RyICE9IG51bGwpIHtcclxuICAgICAgICBhcmdzID0gbmV3IEFyZ3VtZW50c0xpc3QoKTtcclxuICAgICAgICBhcmdzLmZpbGxMaXN0KHJvdXRlQXJnTGlzdFN0ciwgc3JjVGFzayk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEV2ZW50c01hbmFnZXIuSW5zdGFuY2UuQWRkTGFzdFNhdmVkUm91dGVFdmVudChzcmNUYXNrLCBhcmdzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGxhc3Qgc2F2ZWQgcm91dGUgZXZlbnQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRMYXN0U2F2ZWRSb3V0ZUV2ZW50KCk6IFJ1blRpbWVFdmVudCB7XHJcbiAgICAgIHJldHVybiB0aGlzLmxhc3RTYXZlZFJvdXRlRXZlbnQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICBzYXZlIHRoZSBsYXN0IHJvdXRlIGV2ZW50LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0TGFzdFNhdmVkUm91dGVFdmVudCAocnRFdnQ6UnVuVGltZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAocnRFdnQgPT0gbnVsbClcclxuICAgICAgdGhpcy5sYXN0U2F2ZWRSb3V0ZUV2ZW50ID0gbnVsbDtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5sYXN0U2F2ZWRSb3V0ZUV2ZW50ID0gcnRFdnQucmVwbGljYXRlKCk7XHJcbiAgfVxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHJ1bnRpbWUgZXZlbnQgbG9jYXRlZCBvbiB0aGUgdG9wIG9mIHRoZSBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TGFzdFJ0RXZlbnQoKTogUnVuVGltZUV2ZW50IHtcclxuICAgIGlmICh0aGlzLl9ydEV2ZW50cy5jb3VudCgpID09PSAwKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiA8UnVuVGltZUV2ZW50PnRoaXMuX3J0RXZlbnRzLnBlZWsoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIG9mIGEgZmxhZyB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB3ZSBzaG91bGQgaWdub3JlIHVua25vd24gY29tbWFuZHNcclxuICAvLy8gICBhcnJpdmluZyBmcm9tIHRoZSBlbmdpbmUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRJZ25vcmVVbmtub3duQWJvcnQodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pZ25vcmVVbmtub3duQWJvcnQgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIFwiaWdub3JlIHVua25vd24gYWJvcnRcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpZ25vcmVVbmtub3duQWJvcnQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faWdub3JlVW5rbm93bkFib3J0O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWNvdmVyIGZyb20gYSBmYWlsdXJlIHRvIG92ZXJsYXkgYSB0YXNrLiBXaGVuIHRoZSBzZXJ2ZXIgb3JkZXJzIHRoZSBjbGllbnQgdG8gcnVuIGFcclxuICAvLy8gICBuZXcgdGFzayBpbiBhIGZyYW1lIHdoaWNoIGFscmVhZHkgY29udGFpbnMgYW4gYWN0aXZlIHRhc2ssIHRoZSBjbGllbnQgdHJpZXMgdG8gdGVybSB0aGVcclxuICAvLy8gICBleGlzdGluZyB0YXNrIGFuZCByZXBsYWNlIGhpbS4gV2hlbiB0aGlzIGFjdGlvbiBmYWlscywgdGhlIGNsaWVudCBoYXMgdG8gYXNrIHRoZSBzZXJ2ZXJcclxuICAvLy8gICB0byB0ZXJtaW5hdGUgdGhlIE5FVyBUQVNLLCBhbmQgaWdub3JlIHRoZSBvdmVybGF5IGFjdGlvbi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza2lkXCI+LSB0aGUgaWQgb2YgdGhlIE5FVyBUQVNLPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nZFwiPiAgIC0gdGhlIE1HRGF0YSBvZiB0aGUgT0xEIFRBU0suPC9wYXJhbT5cclxuICBhc3luYyBmYWlsVGFza092ZXJsYXkodGFza0lkOiBzdHJpbmcsIG1nZDogTUdEYXRhKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZDtcclxuXHJcbiAgICBpZiAodGFza0lkICE9PSBudWxsKSB7XHJcbiAgICAgIC8vIFRoZSBzZXJ2ZXIgd2lsbCByZXR1cm4gdXMgJ2Fib3J0JyBjb21tYW5kcyBmb3IgdGhlIG5ldyB0YXNrLiBJZ25vcmUgdGhlbSwgc2luY2UgaXQgd2FzbnQgc3RhcnRlZCB5ZXRcclxuICAgICAgdGhpcy5zZXRJZ25vcmVVbmtub3duQWJvcnQodHJ1ZSk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY21kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlTm9uUmV2ZXJzaWJsZUV4aXRDb21tYW5kKHRhc2tJZCwgZmFsc2UpO1xyXG4gICAgICAgIG1nZC5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICAgICAgYXdhaXQgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICB0aGlzLnNldElnbm9yZVVua25vd25BYm9ydChmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIFRSVUUgaWYgY3VycmVudCBldmVudCBzaG91bGQgYmUgcHJvcG9ndGF0ZWQgdG8gYWxsIHRhc2tzIGluIGEgc3BlY2lmaWMgdHJhbnNhY3Rpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzRXZlbnRTY29wZVRyYW5zKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50U2NvcGUgPT09IEV2ZW50U2NvcGUuVFJBTlM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGV2ZW50IHNjb3BlIHRvIFRSQU5TQUNUSU9OXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRFdmVudFNjb3BlVHJhbnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9ldmVudFNjb3BlID0gRXZlbnRTY29wZS5UUkFOUztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgZXZlbnQgc2NvcGUgdG8gTk9OIFRSQU5TQUNUSU9OXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjbGVhckV2ZW50U2NvcGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9ldmVudFNjb3BlID0gRXZlbnRTY29wZS5OT05FO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aW1lIG9mIGZpc3QgZXZlbnQgaW4gc2VxdWVuY2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGltZSBvZiBmaXRzdCBldmVudCBpbiBzZXF1ZW5jZTwvcmV0dXJucz5cclxuICBHZXRFdmVudFRpbWUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9ldmVudHNRdWV1ZS5HZXRUaW1lKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwia2JJdG1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGxhc3QgZW5hYmxlZCBhY3Rpb24gZm9yIHRoZSBzcGVjaWZpYyBrZXkgKGluIGtiSXRlbSk8L3JldHVybnM+XHJcbiAgLy8vIDxjaGVja0FjY2Vzc0tleUluTWVudXM6PiAgaWYgdG8gY2hlY2sgdGhlIGtleWJvYXJkIGluIHRoZSBtZW51IDwvY2hlY2tBY2Nlc3NLZXlJbk1lbnVzOj5cclxuICBwdWJsaWMgZ2V0TWF0Y2hpbmdBY3Rpb24oICBrYkl0bTogS2V5Ym9hcmRJdGVtKTogbnVtYmVyIHtcclxuXHJcbiAgICBsZXQgYWN0OiBudW1iZXIgPSAwO1xyXG4gICAgLy8gd2hlbiBtZW51IGlzIGRlZmluZSB3aXRoIG5vIGtleWJvYXJkIGRlZmluZSwgdGhlIGtiSXRlbSBpcyByZXR1cm4gbnVsbDtcclxuICAgIGlmIChrYkl0bSA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gYWN0O1xyXG5cclxuXHJcbiAgICAvLyBUaGVyZSB3YXMgbm8ga2JkIG1hcHBpbmcgdGhlIHRoYXQga2V5LCBidXQgaXQgc3RpbGwgYmVsb25ncyB0byBhbiBhY3Rpb24uXHJcbiAgICAvLyBzZWUgaWYgdGhlIGtiSXRtIGhvbGQgYW4gYWN0aW9uIChvcmlnaW5hbGx5IG1hZGUgZm9yIE1HX0FDVF9DSEFSKS5cclxuICAgIGlmIChhY3QgPT09IDApIHtcclxuICAgICAgLy8gaWYgbWVudSB3YXMgZm91bmQgYW5kIGl0IGlzIGludGVybmFsIGV2ZW50IHB1dCBhY3Rpb24gdG8gdGhlIHF1ZXVlIG9ubHkgaWYgdGhlcmUgd2FzIG5vIGtiZCBtYXBwaW5nIHRoZSB0aGF0IGtleS5cclxuICAgICAgaWYgKGtiSXRtLmdldEFjdGlvbigpICE9PSAwKVxyXG4gICAgICAgIGFjdCA9IGtiSXRtLmdldEFjdGlvbigpO1xyXG4gICAgICAvLyB0aGlzIGlzIG9ubHkgVEVNUCBoYXJkY29kZWQuIHRoZSBhY3Rpb24gd2lsbCBuZWVkIHRvIGJlIGluIHRoZSBrZXlib2FyZCBtYXBwaW5nXHJcbiAgICAgIC8vIGFsc28gYSBjaGFuZ2UgdG8gdGhlIG9ubGluZSAoaWYgdGltZSBwZXJtaXRzKSBhbHNvIHRvIHR1cm4gdGhlIHRvZ2dsZSBpbnNlcnQgaW50byBhbiBhY3QuXHJcbiAgICAgIGVsc2UgaWYgKGtiSXRtLmdldEtleUNvZGUoKSA9PT0gNDUgJiYga2JJdG0uZ2V0TW9kaWZpZXIoKSA9PT0gTW9kaWZpZXJzLk1PRElGSUVSX05PTkUgJiYga2JJdG0uZ2V0U3RhdGVzKCkgPT09IDApXHJcbiAgICAgICAgYWN0ID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RPR0dMRV9JTlNFUlQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIChhY3QpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldHRlciBmb3IgdGhlIGV4ZWNTdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgY3VycmVudCBleGVjdXRpb24gc3RhY2s8L3JldHVybnM+XHJcbiAgZ2V0RXhlY1N0YWNrKCk6IEV4ZWN1dGlvblN0YWNrIHtcclxuICAgIHJldHVybiA8RXhlY3V0aW9uU3RhY2s+dGhpcy5fZXhlY1N0YWNrLnBlZWsoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwdXNoZXMgb25lIGVudHJ5IG9mIGFuIG9wZXJhdGlvbiBpbnRvIHRoZSBleGVjdXRpb24gc3RhY2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza0lkXCI+LSB0aGUgaWQgb2YgdGhlIGN1cnJlbnQgdGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJoYW5kbGVySWRcIj4tIHRoZSBpZCBvZiB0aGUgaGFuZGxlciB3aGljaCBob2xkcyB0aGUgcmFpc2UgZXZlbnQgY29tbWFuZCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib3BlcklkeFwiPi0gdGhlIGlkeCBvZiB0aGUgY29tbWFuZCB3aGljaCBjcmVhdGVkIGFuIGV4ZWN1dGlvbiBzdGFjayBlbnRyeSAocmFpc2UgZXZlbnQgb2YgZnVuY3Rpb24gY2FsbCk8L3BhcmFtPlxyXG4gIHB1c2hFeGVjU3RhY2sodGFza0lkOiBzdHJpbmcsIGhhbmRsZXJJZDogc3RyaW5nLCBvcGVySWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fZXhlY1N0YWNrLnBlZWsoKSkucHVzaChNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldFRhc2tJZEJ5SWQodGFza0lkKSwgaGFuZGxlcklkLCBvcGVySWR4KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwb3BzIG9uZSBlbnRyeSBmcm9tIHRoZSBleGVjdXRpb24gc3RhY2sgLSBhZnRlciB0aGUgY29tcGxldGlvbiBvZiBhbiBvcGVyYXRpb24gd2hpY2ggY2FuIGhvbGRcclxuICAvLy8gICBvdGhlciBvcGVyYXRpb25zXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBlbnRyeSB0aGF0IHdhcyBwb3BwZWQ8L3JldHVybnM+XHJcbiAgcG9wRXhlY1N0YWNrKCk6IEV4ZWN1dGlvblN0YWNrRW50cnkge1xyXG4gICAgcmV0dXJuICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fZXhlY1N0YWNrLnBlZWsoKSkucG9wKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHVzaCBhIG5ldyBlbnRyeSB0byB0aGUgc3RhY2sgb2Ygc2VydmVyIGV4ZWMgc3RhY2tzIC0gdGhpcyBpcyB0byBkZWZlciBvcGVyYXRpb25zIHRoYXQgc2hvdWxkIG5vdFxyXG4gIC8vLyAgIGdldCBpbmZsdWVuY2VzIGJ5IHRoZSBjdXJyZW50IHNlcnZlciBleGVjdXRpb24gc3RhY2sgLSB3aGVuIHBlcmZvcm1pbmcgdGhlIHJlY29yZCBwcmVmaXggb2YgYSB0YXNrXHJcbiAgLy8vICAgdGhhdCB3YXMganVzdCByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIsIG9yIHdoZW4gY2FsbGluZyBhIG1vZGFsIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1c2hOZXdFeGVjU3RhY2tzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2VydmVyRXhlY1N0YWNrLnB1c2gobnVsbCk7XHJcbiAgICB0aGlzLl9leGVjU3RhY2sucHVzaChuZXcgRXhlY3V0aW9uU3RhY2soKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcG9wcyB0aGUgbmV3IGVudHJ5IGZyb20gdGhlIHN0YWNrIG9mIHNlcnZlciBleGVjdXRpb24gc3RhY2tzIHdoZW4gdGhlIHNlcXVlbmNlIHRoYXQgbmVlZHMgdG8gYXZvaWRcclxuICAvLy8gICBjdXJyZW50IHNlcnZlciBleGVjdXRpb24gc3RhY2sgaGFzIGVuZGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwb3BOZXdFeGVjU3RhY2tzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2VydmVyRXhlY1N0YWNrLnBvcCgpO1xyXG4gICAgdGhpcy5fZXhlY1N0YWNrLnBvcCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHB1c2hlcyBhbiBleGVjdXRpb24gc3RhY2sgZW50cnkgaW50byB0aGUgc2VydmVyIGV4ZWMgc3RhY2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza0lkXCI+LSB0aGUgaWQgb2YgdGhlIHRhc2sgaW4gdGhlIGVudHJ5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImhhbmRsZXJJZFwiPi0gaGFuZGxlciBpZCBvZiB0aGUgZW50cnk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib3BlcklkeFwiPi0gaWR4IG9mIHRoZSBvcGVyYXRpb24gd2hpY2ggdGhlIGVudHJ5IHJlZmVycyB0bzwvcGFyYW0+XHJcbiAgcHVzaFNlcnZlckV4ZWNTdGFjayh0YXNrSWQ6IHN0cmluZywgaGFuZGxlcklkOiBzdHJpbmcsIG9wZXJJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fc2VydmVyRXhlY1N0YWNrLnBvcCgpO1xyXG4gICAgICB0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucHVzaChuZXcgRXhlY3V0aW9uU3RhY2soKSk7XHJcbiAgICB9XHJcblxyXG4gICAgKDxFeGVjdXRpb25TdGFjaz50aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpKS5wdXNoKHRhc2tJZCwgaGFuZGxlcklkLCBvcGVySWR4KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjbGVhcnMgdGhlIHNlcnZlciBleGVjdXRpb24gc3RhY2sgYWZ0ZXIgd2UgZm91bmQgdGhlIGNvcnJlY3QgbmV4dCBvcGVyYXRpb24gdGhhdCB3ZSBuZWVkIHRvIGNvbnRpbnVlIGZyb21cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNsZWFyU2VydmVyRXhlY1N0YWNrKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkgIT09IG51bGwpIHtcclxuICAgICAgKDxFeGVjdXRpb25TdGFjaz50aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpKS5jbGVhcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldmVyc2UgdGhlIHNlcnZlciBleGVjdXRpb24gc3RhY2sgLSB3ZSBnZXQgaXQgZnJvbSB0aGUgc2VydmVyIGFuZCBwdXNoIGl0IGluIHRoZSBzYW1lIG9yZGVyXHJcbiAgLy8vICAgaXQgaXMgd3JpdHRlbiBpbiB0aGUgbWVzc2FnZSwgd2hpY2ggYWN0dWFsbHkgbWVhbnMgd2UgaGF2ZSB0byByZXZlcnNlIGl0IGluIG9yZGVyIHRvIGhhbmRsZSBpdCBjb3JyZWN0bHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJldmVyc2VTZXJ2ZXJFeGVjU3RhY2soKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSAhPT0gbnVsbClcclxuICAgICAgKDxFeGVjdXRpb25TdGFjaz50aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpKS5yZXZlcnNlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2FsY3VsYXRlIGFjY29yZGluZyB0byB0aGUgc2VydmVyJ3MgZXhlY3V0aW9uIHN0YWNrIGFuZCB0aGUgY3VycmVudCBleGVjdXRpb24gc3RhY2sgb24gdGhlIGNsaWVudCArXHJcbiAgLy8vICAgdGhlIGN1cnJlbnQgb3BlcmF0aW9uIHdoaWNoIHdlIGFyZSBvbiwgd2hpY2ggaXMgdGhlIG5leHQgb3BlcmF0aW9uIHRoYXQgd2UgbmVlZCB0byBleGVjdXRlXHJcbiAgLy8vICAgaW4gdGhlIGN1cnJlbnQgaGFuZGxlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvcGVyXCI+LSB0aGUgb3BlcmF0aW9uIHdoaWNoIHdlIGFyZSBjdXJyZW50bHkgb248L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2xlYXJXaGVuRm91bmRcIj5pbmRpY2F0ZXMgd2hldGhlciB3ZSBzaG91bGQgY2xlYXIgdGhlIHNlcnZlciBzdGFjayB3aGVuIHdlIHJlYWNoIGl0cyBlbmQsXHJcbiAgLy8vICAgb3IgaWYgd2UganVzdCB1c2luZyB0aGlzIG1ldGhvZCB0byBjaGVjayB3aGF0IHRoZSBuZXh0IG9wZXJhdGlvbiBpc1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5zIHRoZSBuZXh0IG9wZXJhdGlvbiB0aGF0IHNob3VsZCBiZSBleGVjdXRlZCBieSB0aGUgY2xpZW50XHJcbiAgLy8vICAgaWYgaXQgcmV0dXJucyAtMSB0aGVuIHRoZSBjbGllbnQgc2hvdWxkIGNvbnRpbnVlIGFzIHVzdWFsXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBnZXROZXh0T3BlcklkeChvcGVyOiBPcGVyYXRpb24sIGNsZWFyV2hlbkZvdW5kOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCB0bXBTZXJ2ZXJFeGVjU3RhY2tFbnRyeTogRXhlY3V0aW9uU3RhY2tFbnRyeSA9IG51bGw7XHJcbiAgICBsZXQgbmV4dE9wZXJJZHg6IG51bWJlciA9IC0xO1xyXG5cclxuICAgIC8vIGlmIHRoZSBzZXJ2ZXIgZXhlYyBzdGFjayBpcyBlbXByeSBpdCBtZWFucyB3ZSBkaWQgbm90IHJldHVybiBmcm9tIHRoZSBzZXJ2ZXIsXHJcbiAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnRpbnVlIHdpdGggZXhlY3V0aW5nIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9uIGluIHRoZSBjdXJyZW50IGhhbmRsZXIgYXMgdXN1YWxcclxuICAgIGlmICh0aGlzLl9zZXJ2ZXJFeGVjU3RhY2suY291bnQoKSAhPT0gMCAmJiB0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpICE9PSBudWxsICYmICEoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpLmVtcHR5KCkpIHtcclxuICAgICAgLy8gaWYgdGhlIHNlcnZlcidzIGV4ZWMgc3RhY2sgaXMgZGVlcGVyIHRoYW4gdGhlIGNsaWVudCdzIC1cclxuICAgICAgLy8gd2UgbmVlZCB0byBjaGVjayB0aGUgZW50cnkgaW4gdGhlIGNsaWVudCdzIHN0YWNrIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBzZXJ2ZXIncyBzdGFjayBzaXplXHJcbiAgICAgIGlmICgoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpLnNpemUoKSA+ICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fZXhlY1N0YWNrLnBlZWsoKSkuc2l6ZSgpKSB7XHJcbiAgICAgICAgLy8gd2UgY29weSB0aGUgc2VydmVyJ3MgZXhlY3V0aW9uIHN0YWNrIGFuZCBwb3AgZnJvbSBpdCB1bnRpbCB0aGUgc2l6ZSBvZiB0aGUgc2VydmVyXHJcbiAgICAgICAgLy8gYW5kIHRoZSBjbGllbnQgaXMgdGhlIHNhbWVcclxuICAgICAgICBsZXQgdG1wU2VydmVyRXhlY1N0YWNrOiBFeGVjdXRpb25TdGFjayA9IG5ldyBFeGVjdXRpb25TdGFjayg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSk7XHJcbiAgICAgICAgd2hpbGUgKHRtcFNlcnZlckV4ZWNTdGFjay5zaXplKCkgPiAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX2V4ZWNTdGFjay5wZWVrKCkpLnNpemUoKSkge1xyXG4gICAgICAgICAgdG1wU2VydmVyRXhlY1N0YWNrRW50cnkgPSB0bXBTZXJ2ZXJFeGVjU3RhY2sucG9wKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiBhbGwgZW50cmllcyBiZWZvcmUgdGhlIGxhc3Qgb25lIHdlIHBvcHBlZCBhcmUgdGhlIHNhbWUgYXMgaW4gdGhlIGNsaWVudCBhbmRcclxuICAgICAgICAvLyB0aGUgY3VycmVudCBlbnRyeSBpcyBvbiB0aGUgc2FtZSBoYW5kbGVyIGFzIHRoZSBzZXJ2ZXIncyBsYXN0IGVudHJ5LFxyXG4gICAgICAgIC8vIGFuZCB0aGUgb3BlcmF0aW9uIGlzIGFmdGVyIHRoZSBjdXJyZW50IG9wZXJhdGlvbixcclxuICAgICAgICAvLyB0aGVuIHRoaXMgZW50cnkgaW4gdGhlIHNlcnZlciBpbmRpY2F0ZXMgd2hpY2ggaXMgb3VyIG5leHQgb3BlcmF0aW9uXHJcbiAgICAgICAgaWYgKHRoaXMuX2V4ZWNTdGFjay5wZWVrKCkuRXF1YWxzKHRtcFNlcnZlckV4ZWNTdGFjaykgJiYgdG1wU2VydmVyRXhlY1N0YWNrRW50cnkuVGFza0lkID09PSBvcGVyLmdldFRhc2tUYWcoKSAmJiB0bXBTZXJ2ZXJFeGVjU3RhY2tFbnRyeS5IYW5kbGVySWQgPT09IG9wZXIuZ2V0SGFuZGxlcklkKCkgJiYgdG1wU2VydmVyRXhlY1N0YWNrRW50cnkuT3BlcklkeCA+PSBvcGVyLmdldFNlcnZlcklkKCkpIHtcclxuICAgICAgICAgIG5leHRPcGVySWR4ID0gdG1wU2VydmVyRXhlY1N0YWNrRW50cnkuT3BlcklkeDtcclxuXHJcbiAgICAgICAgICAvLyBpZiB0aGUgc2VydmVyIGV4ZWMgc3RhY2sgaXMgZGVlcGVyIHRoYW4gdGhlIGNsaWVudCdzIGJ5IG9ubHkgMSxcclxuICAgICAgICAgIC8vIHdoaWNoIG1lYW5zIHdlIGFyZSBjaGVja2luZyB0aGUgdG9wIG1vc3QgZW50cnkgb24gdGhlIHNlcnZlcidzIGV4ZWN1dGlvbiBzdGFjayxcclxuICAgICAgICAgIC8vIHRoZSB3aG9sZSBzdGFjayBpcyB0aGUgc2FtZSBub3csIHNvIHdlIGNhbiBjbGVhciB0aGUgc2VydmVyJ3Mgc3RhY2sgLVxyXG4gICAgICAgICAgLy8gd2UgZ290IHRvIHRoZSBwb2ludCB3aGljaCB3ZSBhcmUgb24gdGhlIGV4YWN0IG9wZXJhdGlvbiB3aGljaCB0aGUgc2VydmVyIGxlZnQgZXhlY3V0aW9uLlxyXG4gICAgICAgICAgaWYgKGNsZWFyV2hlbkZvdW5kICYmICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSkuc2l6ZSgpID09PSAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX2V4ZWNTdGFjay5wZWVrKCkpLnNpemUoKSArIDEpIHtcclxuICAgICAgICAgICAgKDxFeGVjdXRpb25TdGFjaz50aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpKS5jbGVhcigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgbmV4dE9wZXJJZHggPSBFdmVudHNNYW5hZ2VyLk1BWF9PUEVSO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5leHRPcGVySWR4ID0gRXZlbnRzTWFuYWdlci5NQVhfT1BFUjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5leHRPcGVySWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgcHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImluUHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrXCI+PC9wYXJhbT5cclxuICBzZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2soaW5Qcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2s6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX3Byb2Nlc3NpbmdUb3BNb3N0RW5kVGFzayA9IGluUHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHByb2Nlc3NpbmdUb3BNb3N0RW5kVGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0UHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdUb3BNb3N0RW5kVGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIEFsbG93RXZlbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIkFsbG93RXZlbnRzXCI+PC9wYXJhbT5cclxuICBzZXRBbGxvd0V2ZW50cyhBbGxvd0V2ZW50czogRXZlbnRzQWxsb3dlZFR5cGUpOiB2b2lkIHtcclxuICAgIHRoaXMuX2FsbG93RXZlbnRzID0gQWxsb3dFdmVudHM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBBbGxvd0V2ZW50cyBmb3IgYSBub24gaW50ZXJhY3RpdmUgdGFzay5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiQWxsb3dFdmVudHNcIj48L3BhcmFtPlxyXG4gIHNldE5vbkludGVyYWN0aXZlQWxsb3dFdmVudHMoQWxsb3dFdmVudHM6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChBbGxvd0V2ZW50cylcclxuXHJcbiAgICAgIHRoaXMuX2FsbG93RXZlbnRzID0gRXZlbnRzQWxsb3dlZFR5cGUuTk9OX0lOVEVSQUNUSVZFO1xyXG4gICAgLy8gUUNSICM4MDI0OTUsIFRoZSBGb3JtcyBDb250cm9sbGVyIG1lY2hhbmlzbSBpcyBkaXNhYmxlIGlmIHdlIGFyZSBpbiBOb24gaW50ZXJhY3RpdmUgdGFzayB3aXRoIEFsbG93RXZlbnRzID0gdHJ1ZSBhbmQgT3BlbiBXaW5kb3cgPSB0cnVlXHJcblxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLl9hbGxvd0V2ZW50cyA9IEV2ZW50c0FsbG93ZWRUeXBlLk5PTkU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBBbGxvd0V2ZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ3aXRoaW5Ob25JbnRlcmFjdGl2ZUxvb3BcIj48L3BhcmFtPlxyXG4gIGdldEFsbG93RXZlbnRzKCk6IEV2ZW50c0FsbG93ZWRUeXBlIHtcclxuICAgIHJldHVybiB0aGlzLl9hbGxvd0V2ZW50cztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZXR1cm4gVFJVRSBpZiBubyBldmVudHMgYXJlIGFsbG93ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgTm9FdmVudHNBbGxvd2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FsbG93RXZlbnRzID09PSBFdmVudHNBbGxvd2VkVHlwZS5OT05FO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGFuZCBleGVjdXRlIGNvbnRyb2wgbW9kaWZ5IGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYWN0XCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUN0cmxNb2RpZnkoY3RybDogTWdDb250cm9sLCBhY3Q6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gaWYgY2Fubm90IG1vZGlmeSwgZG8gbm90aGluZ1xyXG4gICAgaWYgKGN0cmwgPT0gbnVsbCB8fCAhY3RybC5pc01vZGlmaWFibGUoKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIHN3aXRjaCAoYWN0KSB7XHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX0VEVF9OVUxMOlxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX01PRElGWTpcclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VMRUNUSU9OOlxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQ7XHJcbiAgICBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9NT0RJRlkpO1xyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIGFjdGlvbiBpcyBhbGxvd2VkIGFjY29yZGluZyB0byB0aGUgQWxsb3dlZEV2ZW50cyBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImFjdFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBBY3RBbGxvd2VkKGFjdDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYWxsb3dlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBzd2l0Y2ggKHRoaXMuZ2V0QWxsb3dFdmVudHMoKSkge1xyXG4gICAgICBjYXNlIEV2ZW50c0FsbG93ZWRUeXBlLkFMTDpcclxuICAgICAgICBhbGxvd2VkID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgRXZlbnRzQWxsb3dlZFR5cGUuTk9ORTpcclxuICAgICAgICAvLyBhbGxvdyBjcmVsaW5lIGV2ZW4gaW4gYWxsb3c9bm8uIHdlIGhhdmUgbm8gY2hvaWNlLiBSQyBtZWNoYW5pc20gaXMgZGlmZmVyZW50IHRoZW4gYmF0Y2guIGl0IHVzZXMgQUNUX0NSRUFMSU5FXHJcbiAgICAgICAgLy8gd2hlbiBpbiBjcmVhdGUgbW9kZS4gV2Ugd2lsbCBuZWVkIHRvIGNoYW5nZSBpdCBpbiB0aGUgZnV0dXJlIHNvIHRoYXQgd2hlbiB1c2VyIHJhaXNlcyBjcmVsaW5lIGV2ZW50IGl0IHdpbGwgbm90IHdvcmsuIGp1c3QgaW50ZXJuYWxseS5cclxuICAgICAgICBhbGxvd2VkID0gKGFjdCA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgLy8gT25seSB0aGUgZm9sbG93aW5nIGFjdGlvbnMgYXJlIGFsbG93ZWQgd2hlbiBydW5uaW5nIGluc2lkZSBhIG5vbiBpbnRlcmFjdGl2ZSBsb29wIHdoZW4gYWxsb3cgZXZlbnRzID0gWUVTLlxyXG4gICAgICBjYXNlIEV2ZW50c0FsbG93ZWRUeXBlLk5PTl9JTlRFUkFDVElWRTpcclxuXHJcbiAgICAgICAgc3dpdGNoIChhY3QpIHtcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVRfU1lTVEVNOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVDpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NMT1NFOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORTpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkVfQUJPVkU6XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9ST0xMQkFDSzpcclxuICAgICAgICAgICAgYWxsb3dlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGFsbG93ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhbGxvd2VkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgZnVuY3Rpb24gY29tbWl0cyB0aGUgcmVjb3JkIGFuZCB0aGVuIGRlcGVuZGluZyBvbiB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRyYW5zYWN0aW9uLCBpdCBwZXJmb3JtcyBvdGhlciBhY3Rpb25zLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzUmV2ZXJzaWJsZUV4aXRcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgY29tbWl0UmVjb3JkKHRhc2s6IFRhc2ssIGlzUmV2ZXJzaWJsZUV4aXQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuICAgIGxldCByZWM6IFJlY29yZCA9IGR2LmdldEN1cnJSZWMoKTtcclxuXHJcbiAgICBsZXQgZm9yY2VTdWZmaXg6IGJvb2xlYW4gPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIGZhbHNlKTtcclxuICAgIGxldCBpc1NlbGVjdGlvblRhYmxlOiBib29sZWFuID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0VMRUNUSU9OLCBmYWxzZSk7XHJcbiAgICBsZXQgaXNOZXdSZWM6IGJvb2xlYW4gPSByZWMuaXNOZXdSZWMoKTtcclxuICAgIGxldCBzYXZlUHJldkN1cnJSZWM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IHJlY01vZGlmaWVkOiBib29sZWFuID0gcmVjLk1vZGlmaWVkO1xyXG5cclxuICAgIGlmICghZHYucmVjSW5Nb2RpZmllZFRhYihyZWMuZ2V0SWQoKSkpXHJcbiAgICAgIHJlYy5jbGVhckZsYWdzSGlzdG9yeSgpO1xyXG4gICAgYXdhaXQgdGFzay5UYXNrVHJhbnNhY3Rpb25NYW5hZ2VyLmNoZWNrQW5kQ29tbWl0KGlzUmV2ZXJzaWJsZUV4aXQsIENvbnN0SW50ZXJmYWNlLlRSQU5TX1JFQ09SRF9QUkVGSVgsIHRhc2suQ29uZmlybVVwZGF0ZU5vKTtcclxuICAgIGlmICh0YXNrLnRyYW5zYWN0aW9uRmFpbGVkKENvbnN0SW50ZXJmYWNlLlRSQU5TX1JFQ09SRF9QUkVGSVgpKSB7XHJcbiAgICAgIC8vIG9uIGZhaWx1cmUgb2YgdGhlIHRyYW5zYWN0aW9uIHJlZW50ZXIgdGhlIHJlY29yZCBsZXZlbCBieVxyXG4gICAgICAvLyBleGVjdXRpbmcgXCJyZWNvcmQgcHJlZml4XCIgZm9yIHRoZSBzdWJmb3JtcyB3aGljaCBleGVjdXRlZFxyXG4gICAgICAvLyB0aGUgc3VmZml4IHN1Y2Nlc3NmdWxseVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRhc2suRGF0YVN5bmNlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuICAgICAgICBhd2FpdCB0YXNrLmhhbmRsZUV2ZW50T25TbGF2ZVRhc2tzKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGFzay5pc0Fib3J0aW5nKCkpXHJcbiAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAocmVjTW9kaWZpZWQpXHJcbiAgICAgICAgcmVjLnNldExhdGVDb21wdXRlKHRydWUpO1xyXG5cclxuICAgICAgLy8gUUNSIDc4MzA3MSBpZiBhZnRlciBjaGVja0FuZENvbW1pdCBhbGwgaWYgTy5LLiB0aGVcclxuICAgICAgLy8gcmV0dXJuIHRoZSBsZXZlbCBiYWNrIHRvIHRhc2sgbGV2ZWwgaW4gb3JkZXIgdG8gbGV0IHJlY19wcmZpeCB0byBiZSBleGVjdXRlZC5cclxuICAgICAgLy8gZXZlbiB0aG91Z2ggdGhlIHRhc2sgbGV2ZWwgc2hvdWxkIGJlIFRBU0tfTEVWRUxfVEFTS1xyXG4gICAgICAvLyB0aGUgY2hlY2tBbmRDb21taXQgcHJvY2VzcyBjb3VsZCBoYXZlIGNoYW5nZSBpdFxyXG4gICAgICBpZiAoIXRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuXHJcbiAgICAgIHJlYy5yZXNldFVwZGF0ZWQoKTtcclxuICAgICAgcmVjLnJlc2V0TW9kaWZpZWQoKTtcclxuXHJcbiAgICAgIC8vIFFDUiAjOTgzMTc4OiBjYW5jZWwgdGhlIHJlY29yZCBvbmx5IGFmdGVyIHRoZSB0cmFuc2FjdGlvblxyXG4gICAgICAvLyBoYW5kbGluZyB3YXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBhbmQgdGhlIHJlY29yZCB3YXNuJ3RcclxuICAgICAgLy8gbW9kaWZpZWRcclxuICAgICAgaWYgKCFyZWNNb2RpZmllZCAmJiAhZm9yY2VTdWZmaXggJiYgKCFpc1NlbGVjdGlvblRhYmxlIHx8ICF0YXNrLkluU2VsZWN0KSkge1xyXG4gICAgICAgIGlmIChpc05ld1JlYykge1xyXG4gICAgICAgICAgLy8gUUNSICM0Mjg5NjU6IHNhdmUgdGhlIHByZXZpb3VzIGN1cnJlbnQgcmVjb3JkIEJFRk9SRVxyXG4gICAgICAgICAgLy8gXCJjYW5jZWwgZWRpdFwiIHNvIHRoZSBjb3JyZWN0IHJlY29yZCBpcyBzYXZlZFxyXG4gICAgICAgICAgZHYuc2V0UHJldkN1cnJSZWMoKTtcclxuICAgICAgICAgIHNhdmVQcmV2Q3VyclJlYyA9IGZhbHNlO1xyXG4gICAgICAgICAgcmVjLnNldE5ld1JlYygpO1xyXG4gICAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLmNhbmNlbEVkaXQoZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlU3RvcFJvd0VkaXRpbmcodGFzayk7XHJcbiAgICAgICAgfSBlbHNlIGlmICghcmVjLmdldEZvcmNlU2F2ZU9yZygpKVxyXG4gICAgICAgICAgYXdhaXQgZHYuY2FuY2VsRWRpdChFdmVudHNNYW5hZ2VyLlJFQUxfT05MWSwgdHJ1ZSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgZHYuc2F2ZU9yaWdpbmFsKCk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gUUNSICM5OTUyMjI6IGlmIHRoZSByZWNvcmQgd2FzIG1vZGlmaWVkIHRoZW4gc2F2ZSB0aGVcclxuICAgICAgLy8gb3JpZ2luYWwgcmVjb3JkIGFnYWluIGluIGNhc2UgYSB0YXNrIGxhdmVsIHRyYW5zYWN0aW9uXHJcbiAgICAgIC8vIHdpbGwgZmFpbCB3aXRoIHJldHJ5IHN0cmF0ZWd5LiBCZWZvcmUgdGhpcyBmaXgsIGlmIHN1Y2hcclxuICAgICAgLy8gdGhpbmcgaGFwcGVuZWQgb24gYSByZWNvcmQgd2hpY2ggd2Fzbid0IHRoZSBmaXJzdCB0aGVuXHJcbiAgICAgIC8vIHRoZSBcImJlZ2luIHRhYmxlXCIgZXZlbnQgcmFpc2VkIGEgcmVjb3JkIHN1ZmZpeCBldmVudCBhbmRcclxuICAgICAgLy8gY2F1c2VkIFwiY2FuY2VsIGVkaXRcIi5cclxuICAgICAgZWxzZVxyXG4gICAgICAgIGR2LnNhdmVPcmlnaW5hbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzYXZlUHJldkN1cnJSZWMpXHJcbiAgICAgIGR2LnNldFByZXZDdXJyUmVjKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2FsbGJhY2sgZm9yIGluY3JlbWVudGFsIGxvY2F0ZSB0aW1lclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaW5jTG9jYXRlVGltZXJDQih0YXNrT2JqOiBhbnkpOiB2b2lkIHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gdGFza09iajtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCh0YXNrLCB0cnVlKTtcclxuXHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfSU5DUkVNRU5UQUxfTE9DQVRFKTtcclxuICAgIHJ0RXZ0LnNldE1haW5QcmdDcmVhdG9yKHRhc2spO1xyXG4gICAgcnRFdnQuc2V0Q3RybCg8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZG9TeW5jRm9yU3ViZm9ybVBhcmVudCh0YXNrOiBUYXNrKTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgbGV0IHBhcmVudFRhc2s6IFRhc2sgPSA8VGFzaz50YXNrLmdldFBhcmVudCgpO1xyXG4gICAgbGV0IHBhcmVudER2ID0gPERhdGFWaWV3PnBhcmVudFRhc2suRGF0YVZpZXc7XHJcbiAgICBsZXQgcGFyZW50UmVjOiBSZWNvcmQgPSBwYXJlbnREdi5nZXRDdXJyUmVjKCk7XHJcblxyXG4gICAgLy8gZG8gbm90IHRvdWNoIHRoZSBwYXJlbnQgcmVjb3JkIGlmIHRoZSBwYXJlbnQgZGF0YXZpZXcgaXMgJ2VtcHR5IGRhdGF2aWV3Jy5cclxuICAgIGlmICh0YXNrLklzU3ViRm9ybSAmJiBwYXJlbnRSZWMgIT0gbnVsbCAmJiBwYXJlbnRSZWMuTW9kaWZpZWQgJiYgIXBhcmVudER2LmlzRW1wdHlEYXRhdmlldygpKSB7XHJcbiAgICAgIHBhcmVudFJlYy5zZXRNb2RlKERhdGFNb2RpZmljYXRpb25UeXBlcy5VcGRhdGUpO1xyXG4gICAgICBhd2FpdCBwYXJlbnREdi5hZGRDdXJyVG9Nb2RpZmllZChmYWxzZSk7XHJcbiAgICAgICgocGFyZW50RHYuZ2V0Q3VyclJlYygpKSkuU3luY2VkID0gdHJ1ZTtcclxuICAgICAgcGFyZW50RHYuc2V0Q2hhbmdlZCh0cnVlKTtcclxuICAgICAgbGV0IGRhdGFWaWV3RXhlY3V0ZUxvY2FsVXBkYXRlc0NvbW1hbmQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRGF0YVZpZXdDb21tYW5kKHBhcmVudFRhc2suZ2V0VGFza1RhZygpLCBEYXRhVmlld0NvbW1hbmRUeXBlLkV4ZWN1dGVMb2NhbFVwZGF0ZXMpO1xyXG4gICAgICBsZXQgcmVzdWx0OiBSZXR1cm5SZXN1bHQgPSBhd2FpdCBwYXJlbnRUYXNrLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGRhdGFWaWV3RXhlY3V0ZUxvY2FsVXBkYXRlc0NvbW1hbmQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgUHJvY2Vzc0Fib3J0aW5nRXJyb3IoZXg6IEFwcGxpY2F0aW9uRXhjZXB0aW9uKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZU1zZzogc3RyaW5nO1xyXG4gICAgbGV0IGVyckZvckNvbnNvbGU6IHN0cmluZztcclxuICAgIGxldCBlcnJGb3JNc2dCb3g6IHN0cmluZztcclxuXHJcbiAgICBpZiAoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcilcclxuICAgICAgZU1zZyA9ICg8U2VydmVyRXJyb3I+ZXgpLkdldE1lc3NhZ2UoKTtcclxuICAgIGVsc2VcclxuICAgICAgZU1zZyA9ICgoZXguTWVzc2FnZSAhPT0gbnVsbCkgPyBleC5NZXNzYWdlIDogZXguR2V0VHlwZSgpKTtcclxuXHJcbiAgICBlcnJGb3JDb25zb2xlID0gU3RyVXRpbC5nZXRDb25zb2xlRXJvclN0cmluZyhlTXNnKTtcclxuICAgIGVyckZvck1zZ0JveCA9IFN0clV0aWwuZ2V0TXNnQm94RXJvclN0cmluZyhlTXNnKTtcclxuXHJcbiAgICBpZiAoZXguSW5uZXJFeGNlcHRpb24gIT09IG51bGwpXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nKGV4LklubmVyRXhjZXB0aW9uLCBlcnJGb3JDb25zb2xlKTtcclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoIShleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKSB8fCBMb2dnZXIuSW5zdGFuY2UuTG9nTGV2ZWwgIT09IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWMpIHtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coZXJyRm9yQ29uc29sZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBUT0RPIDogaGFuZGxlIGVycm9yc1xyXG4gICAgbGV0IHNlbmRVbmxvYWRUb1NlcnZlcjogYm9vbGVhbiA9IFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5Db250ZXh0SUQgIT09IFJ1bnRpbWVDb250ZXh0QmFzZS5ub0NvbnRleHRJZDsgIC8vIHVubG9hZCB0aGUgY29udGV4dCBpbiB0aGUgc2VydmVyIG9ubHkgaWYgYSBjb250ZXh0IHdhcyBjcmVhdGVkIGR1cmluZyB0aGUgY3VycmVudCBzZXNzaW9uXHJcblxyXG4gICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5jdXJyTWdkSUQgPSAwO1xyXG5cclxuICAgIGxldCBtZXNzYWdlU3RyaW5nOiBzdHJpbmcgPSBMYW5ndWFnZURhdGEuSW5zdGFuY2UuZ2V0Q29uc3RNZXNzYWdlKE1zZ0ludGVyZmFjZS5CUktUQUJfU1RSX0VSUk9SKTtcclxuXHJcbiAgICBsZXQgc3R5bGU6IG51bWJlciA9IDE2O1xyXG4gICAgaWYgKGV4Lk1lc3NhZ2Uuc3RhcnRzV2l0aChcIjxIVE1MXCIpKSB7XHJcbiAgICAgIHRoaXMucHJvY2Vzc0hUTUxDb250ZW50KGV4Lk1lc3NhZ2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gVE9ETzogdGVtcG9yYXJpbHkgc2hvdyB0aGUgbWVzc2FnZSBib3hcclxuICAgICAgLy8gaWRlYWxseSwgdGhlIGN1cnJlbnQgcGFnZSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCB0aGUgZXJyb3IgcGFnZVxyXG4gICAgICBpZiAodGhpcy5TaG93RXJyb3JJbk1lc3NhZ2VCb3goZXgpKSB7XHJcbiAgICAgICAgYXdhaXQgR1VJTWFuYWdlci5JbnN0YW5jZS5NZXNzYWdlQm94KG1lc3NhZ2VTdHJpbmcsIGVyckZvck1zZ0JveCwgc3R5bGUpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKXtcclxuICAgICAgICBpZigoPFNlcnZlckVycm9yPmV4KS5HZXRDb2RlKCkgPT0gU2VydmVyRXJyb3IuRVJSX1dFQkNMSUVOVF9QUk9HUkFNX1JFTE9BREVEIHx8XHJcbiAgICAgICAgICAgKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09IFNlcnZlckVycm9yLkVSUl9FWEVDVVRFRF9QUk9HUkFNX0NIQU5HRUQpIHtcclxuICAgICAgICAgICBDb21tYW5kcy5hZGRHbG9iYWxDb21tYW5kKENvbW1hbmRUeXBlLlJFTE9BRF9QQUdFKTtcclxuICAgICAgICAgICAvLyBNdXN0IGNhbGwgYmVnaW5JbnZva2UgaGVyZTsgaW4gdGhlIGNhc2UgYSBuZXcgY29ubmVjdGlvbiB3YXMgcmVmdXNlZCwgdGhlIGJlZ2luSW52b2tlIGlzIG5ldmVyIGNhbGxlZCwgc28gd2VcclxuICAgICAgICAgICAvLyBuZWVkIHRvIG1ha2Ugc3VyZSBpdCBpcyBjYWxsZWQgaGVyZVxyXG4gICAgICAgICAgIENvbW1hbmRzLmJlZ2luSW52b2tlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETzogSG93IHRvIGNoZWNrIGlmIGl0IHdhcyBDb25uZWN0RmFpbHVyZSBvciBQcm90b2NvbEVycm9yP1xyXG4gICAgLy8gSW4gY2FzZSBpZiB3ZSBhcmUgYWJsZSB0byBjb25uZWN0IHRvIHRoZSBzZXJ2ZXIgaS5lLiBzdGF0dXMgaXMgQ29ubmVjdGlvbkZhaWx1cmVcclxuICAgIC8vIHRoZW4gdGhlcmUgaXMgbm8gcG9pbnQgaW4gc2VuZGluZyB1bmxvYWQgY29tbWFuZCwgYmVjYXVzZSBpdCB3aWxsIG5ldmVyIHN1Y2NlZWQgYW5kXHJcbiAgICAvLyB3ZSB3aWxsIGluIGluZmluaXRlIGxvb3AuXHJcbiAgICAvLyBsZXQgZmxhZzg6IGJvb2xlYW4gPSBleC5Jbm5lckV4Y2VwdGlvbiAhPT0gbnVsbCAmJiBleC5Jbm5lckV4Y2VwdGlvbi5HZXRUeXBlKCkuRnVsbE5hbWUgPT09IFwiU3lzdGVtLk5ldC5XZWJFeGNlcHRpb25cIjtcclxuICAgIC8vIGlmIChmbGFnOCkge1xyXG4gICAgLy8gICBsZXQgZXgyOiBXZWJFeGNlcHRpb24gPSA8V2ViRXhjZXB0aW9uPmV4LklubmVyRXhjZXB0aW9uO1xyXG4gICAgLy8gICBsZXQgZmxhZzk6IGJvb2xlYW4gPSBleDIuU3RhdHVzID09PSBXZWJFeGNlcHRpb25TdGF0dXMuQ29ubmVjdEZhaWx1cmUgfHwgZXgyLlN0YXR1cyA9PT0gV2ViRXhjZXB0aW9uU3RhdHVzLlByb3RvY29sRXJyb3I7XHJcbiAgICAvLyAgIGlmIChmbGFnOSkge1xyXG4gICAgLy8gICAgIHNlbmRVbmxvYWRUb1NlcnZlciA9IGZhbHNlO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgaWYgKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpIHtcclxuICAgICAgLy8gSWYgdGhlIGNvbnRleHQgd2FzIG5vdCBmb3VuZCwgb3IgdGhlIHByb2dyYW0gaXMgcmVsb2FkZWQgYnkgdGhlIHNlcnZlciwgbm8gcG9pbnQgaW4gdHJ5aW5nIHRvIHVubG9hZCBpdFxyXG4gICAgICBpZiAoKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09PSBTZXJ2ZXJFcnJvci5FUlJfQ1RYX05PVF9GT1VORCB8fFxyXG4gICAgICAgICAgKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09PSBTZXJ2ZXJFcnJvci5FUlJfV0VCQ0xJRU5UX1BST0dSQU1fUkVMT0FERUQgfHxcclxuICAgICAgICAgICg8U2VydmVyRXJyb3I+ZXgpLkdldENvZGUoKSA9PT0gU2VydmVyRXJyb3IuRVJSX0VYRUNVVEVEX1BST0dSQU1fQ0hBTkdFRCkge1xyXG4gICAgICAgIHNlbmRVbmxvYWRUb1NlcnZlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNlbmRVbmxvYWRUb1NlcnZlcikge1xyXG4gICAgICAvLyB0ZWxsIHRoZSBzZXJ2ZXIgdG8gY2xvc2UgdGhlIHJ1bnRpbWUuXHJcbiAgICAgIC8vIElmIHdlIHRlcm1pbmF0ZSBSVEUgYW5kIHRoZW4gY2xvc2UgUkMgd2luZG93IHRoZW4gYWxzbyB3ZSB3aWxsIGJlXHJcbiAgICAgIC8vIFByb2Nlc3NpbmcgQWJvcnQgZXJyb3IgaW4gdGhhdCBjYXNlIHNlcnZlciBpcyBhbHJlYWR5IGNsb3NlZCBzbyBjYXRjaCB0aGUgZXhjZXB0aW9uLlxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlVW5sb2FkQ29tbWFuZCgpO1xyXG4gICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TUdEYXRhKDApLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICBhd2FpdCBDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXIuR2V0Q29tbWFuZHNQcm9jZXNzb3IoKS5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuICAgICAgfSBjYXRjaCAoZXgzKSB7XHJcbiAgICAgICAgaWYgKGV4MyBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZyhleDMpO1xyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgdGhyb3cgZXgzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgR1VJTWFuYWdlci5JbnN0YW5jZS5hYm9ydCgpO1xyXG4gIH1cclxuXHJcblxyXG4gIHByb2Nlc3NIVE1MQ29udGVudChodG1sQ29udGVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBDb21tYW5kcy5hZGRTaG93SFRNTEVycm9yKENvbW1hbmRUeXBlLlNIT1dfSFRNTF9FUlJPUiwgaHRtbENvbnRlbnQpO1xyXG4gICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuICB9XHJcblxyXG4gIC8vIFRoaXMgbWV0aG9kIGRlY2lkZXMgaWYgdGhlIGVycm9yIGhhbmRsZWQgaW4gUHJvY2Vzc0Fib3J0aW5nRXJyb3Igd2lsbCBvcGVuIGEgbWVzc2FnZSBib3hcclxuICBTaG93RXJyb3JJbk1lc3NhZ2VCb3goZXg6IEFwcGxpY2F0aW9uRXhjZXB0aW9uKTogYm9vbGVhbiB7XHJcbiAgICBpZighKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAvLyBpZiBjaGFuZ2VzIGluIHRoZSBzdHVkaW8gY2F1c2UgYSByZWxvYWQsIHNob3cgdGhlIG1lc3NhZ2Vib3ggb25seSBpZiB0aGUgdXNlciB0cmllZCB0b1xyXG4gICAgLy8gY29udGludWUgd29ya2luZyB3aXRoIGFuIG9sZCBjb250ZXh0XHJcbiAgICBpZigoKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09IFNlcnZlckVycm9yLkVSUl9FWEVDVVRFRF9QUk9HUkFNX0NIQU5HRUQgfHxcclxuICAgICAgICg8U2VydmVyRXJyb3I+ZXgpLkdldENvZGUoKSA9PSBTZXJ2ZXJFcnJvci5FUlJfV0VCQ0xJRU5UX1BST0dSQU1fUkVMT0FERUQpICYmXHJcbiAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkNvbnRleHRJRCA9PT0gUnVudGltZUNvbnRleHRCYXNlLm5vQ29udGV4dElkKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG59XHJcbiJdfQ==
3106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRzTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VuZ2luZS9zcmMvZXZlbnQvRXZlbnRzTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLElBQUksRUFDSixZQUFZLEVBQ1osUUFBUSxFQUNSLE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLFdBQVcsRUFDWixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUMzSSxPQUFPLEVBQ0wsUUFBUSxFQUNSLFdBQVcsRUFDWCxxQkFBcUIsRUFDckIsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEVBQ1osY0FBYyxFQUVkLFlBQVksRUFFWixPQUFPLEVBR1AsU0FBUyxFQUNULGFBQWEsRUFDYixrQkFBa0IsRUFDbEIsTUFBTSxFQUNOLGdCQUFnQixFQUNqQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDdEMsT0FBTyxFQUFDLGlDQUFpQyxFQUFDLE1BQU0saURBQWlELENBQUM7QUFDbEcsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzNDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBR3hFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUc1QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUMx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LFFBQVEsQ0FBQyxTQUFTLEtBQUssa0JBQWtCLENBQUMsV0FBVztZQUMxRSxPQUFPLEtBQUssQ0FBQztRQUVmLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7QUFqbkpjLG9DQUFzQixHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVCLHVCQUFTLEdBQVksSUFBSSxDQUFDO0FBQzFCLHNCQUFRLEdBQVcsSUFBSSxDQUFDO0FBQ3hCLDJDQUE2QixHQUFHLElBQUksQ0FBQztBQW9CckMscUNBQXVCLEdBQUcsS0FBSyxDQUFDO0FBQ2hDLGlEQUFtQyxHQUFHLEtBQUssQ0FBQztBQW1CcEQsc0JBQVEsR0FBa0IsSUFBSSxhQUFhLEVBQUUsQ0FBQztBQVE5QyxpQ0FBbUIsR0FBRyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBGb3JjZUV4aXQsXHJcbiAgSW50ZXJuYWxJbnRlcmZhY2UsXHJcbiAgTG9nZ2VyLFxyXG4gIExvZ2dlcl9Mb2dMZXZlbHMsXHJcbiAgTWdDb250cm9sVHlwZSxcclxuICBNaXNjLFxyXG4gIE1zZ0ludGVyZmFjZSxcclxuICBQcmlvcml0eSxcclxuICBSYWlzZUF0LFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RyVXRpbCxcclxuICBTdWJmb3JtVHlwZVxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQge0FwcGxpY2F0aW9uRXhjZXB0aW9uLCBJbnQzMiwgTGlzdCwgTlN0cmluZywgUmVmUGFyYW0sIFN0YWNrLCBTdHJpbmdCdWlsZGVyLCBUaHJlYWQsIGlzTnVsbE9yVW5kZWZpbmVkfSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7XHJcbiAgQ29tbWFuZHMsXHJcbiAgQ29tbWFuZFR5cGUsXHJcbiAgRGF0YU1vZGlmaWNhdGlvblR5cGVzLFxyXG4gIEV4cFZhbCxcclxuICBGb2N1c01hbmFnZXIsXHJcbiAgR3VpQ29uc3RhbnRzLFxyXG4gIEd1aUVudmlyb25tZW50LFxyXG4gIElUYXNrLFxyXG4gIEtleWJvYXJkSXRlbSxcclxuICBMYXN0Rm9jdXNlZFZhbCxcclxuICBNYW5hZ2VyLFxyXG4gIE1nQ29udHJvbEJhc2UsXHJcbiAgTWdGb3JtQmFzZSxcclxuICBNb2RpZmllcnMsXHJcbiAgUHJvcEludGVyZmFjZSxcclxuICBSdW50aW1lQ29udGV4dEJhc2UsXHJcbiAgU3R5bGVzLFxyXG4gIFRhc2tEZWZpbml0aW9uSWRcclxufSBmcm9tICdAbWFnaWMteHBhL2d1aSc7XHJcbmltcG9ydCB7RXZlbnRTdWJUeXBlfSBmcm9tICcuLi9lbnVtcyc7XHJcbmltcG9ydCB7Um9sbGJhY2tFdmVudENvbW1hbmRfUm9sbGJhY2tUeXBlfSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Sb2xsYmFja0V2ZW50Q29tbWFuZCc7XHJcbmltcG9ydCB7TWdDb250cm9sfSBmcm9tICcuLi9ndWkvTWdDb250cm9sJztcclxuaW1wb3J0IHtNZ1ByaW9yaXR5QmxvY2tpbmdRdWV1ZX0gZnJvbSAnLi4vdXRpbC9NZ1ByaW9yaXR5QmxvY2tpbmdRdWV1ZSc7XHJcbmltcG9ydCB7Q29tcE1haW5QcmdUYWJsZX0gZnJvbSAnLi4vcnQvQ29tcE1haW5QcmdUYWJsZSc7XHJcbmltcG9ydCB7RmllbGR9IGZyb20gJy4uL2RhdGEvRmllbGQnO1xyXG5pbXBvcnQge1J1blRpbWVFdmVudH0gZnJvbSAnLi9SdW5UaW1lRXZlbnQnO1xyXG5pbXBvcnQge01nRm9ybX0gZnJvbSAnLi4vZ3VpL01nRm9ybSc7XHJcbmltcG9ydCB7RXZlbnRIYW5kbGVyLCBSZXRWYWxzfSBmcm9tICcuL0V2ZW50SGFuZGxlcic7XHJcbmltcG9ydCB7Rmxvd01vbml0b3JRdWV1ZX0gZnJvbSAnLi4vdXRpbC9GbG93TW9uaXRvclF1ZXVlJztcclxuaW1wb3J0IHtHVUlNYW5hZ2VyfSBmcm9tICcuLi9HVUlNYW5hZ2VyJztcclxuaW1wb3J0IHtUYXNrfSBmcm9tICcuLi90YXNrcy9UYXNrJztcclxuaW1wb3J0IHtUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0sIFRhc2tCYXNlfSBmcm9tICcuLi90YXNrcy9UYXNrQmFzZSc7XHJcbmltcG9ydCB7QXJndW1lbnRzTGlzdH0gZnJvbSAnLi4vcnQvQXJndW1lbnRzTGlzdCc7XHJcbmltcG9ydCB7TUdEYXRhfSBmcm9tICcuLi90YXNrcy9NR0RhdGEnO1xyXG5pbXBvcnQge0hhbmRsZXJzVGFibGV9IGZyb20gJy4uL3J0L0hhbmRsZXJzVGFibGUnO1xyXG5pbXBvcnQge01HRGF0YUNvbGxlY3Rpb259IGZyb20gJy4uL3Rhc2tzL01HRGF0YUNvbGxlY3Rpb24nO1xyXG5pbXBvcnQge1JlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb259IGZyb20gJy4uL2RhdGEvUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbic7XHJcbmltcG9ydCB7Q29tbWFuZHNQcm9jZXNzb3JCYXNlLCBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9ufSBmcm9tICcuLi9Db21tYW5kc1Byb2Nlc3NvckJhc2UnO1xyXG5pbXBvcnQge0NvbW1hbmRzVGFibGV9IGZyb20gJy4uL0NvbW1hbmRzVGFibGUnO1xyXG5pbXBvcnQge0NvbW1hbmRGYWN0b3J5fSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Db21tYW5kRmFjdG9yeSc7XHJcbmltcG9ydCB7SUNsaWVudENvbW1hbmR9IGZyb20gJy4uL2NvbW1hbmRzL0lDbGllbnRDb21tYW5kJztcclxuaW1wb3J0IHtDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXJ9IGZyb20gJy4uL0NvbW1hbmRzUHJvY2Vzc29yTWFuYWdlcic7XHJcbmltcG9ydCB7T3BlcmF0aW9ufSBmcm9tICcuLi9ydC9PcGVyYXRpb24nO1xyXG5pbXBvcnQge0NsaWVudFJlZnJlc2hDb21tYW5kfSBmcm9tICcuLi9jb21tYW5kcy9TZXJ2ZXJUb0NsaWVudC9DbGllbnRSZWZyZXNoQ29tbWFuZCc7XHJcbmltcG9ydCB7UmVtb3RlQ29tbWFuZHNQcm9jZXNzb3J9IGZyb20gJy4uL3JlbW90ZS9SZW1vdGVDb21tYW5kc1Byb2Nlc3Nvcic7XHJcbmltcG9ydCB7RXhlY3V0aW9uU3RhY2t9IGZyb20gJy4uL3J0L0V4ZWN1dGlvblN0YWNrJztcclxuaW1wb3J0IHtFeGVjdXRpb25TdGFja0VudHJ5fSBmcm9tICcuLi9ydC9FeGVjdXRpb25TdGFja0VudHJ5JztcclxuaW1wb3J0IHtSZXR1cm5SZXN1bHR9IGZyb20gJy4uL3V0aWwvUmV0dXJuUmVzdWx0JztcclxuaW1wb3J0IHtFdmVudEhhbmRsZXJQb3NpdGlvbn0gZnJvbSAnLi9FdmVudEhhbmRsZXJQb3NpdGlvbic7XHJcbmltcG9ydCB7RGF0YVZpZXd9IGZyb20gJy4uL2RhdGEvRGF0YVZpZXcnO1xyXG5pbXBvcnQge0V2ZW50fSBmcm9tICcuL0V2ZW50JztcclxuaW1wb3J0IHtSZWNvcmR9IGZyb20gJy4uL2RhdGEvUmVjb3JkJztcclxuaW1wb3J0IHtDb25zdEludGVyZmFjZX0gZnJvbSAnLi4vQ29uc3RJbnRlcmZhY2UnO1xyXG5pbXBvcnQge0Zsb3dNb25pdG9ySW50ZXJmYWNlfSBmcm9tICcuLi9GbG93TW9uaXRvckludGVyZmFjZSc7XHJcbmltcG9ydCB7RGF0YVZpZXdDb21tYW5kVHlwZX0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvRGF0YXZpZXdDb21tYW5kJztcclxuaW1wb3J0IHtTZXJ2ZXJFcnJvcn0gZnJvbSAnLi4vcmVtb3RlL1NlcnZlckVycm9yJztcclxuaW1wb3J0IHtFbnZpcm9ubWVudH0gZnJvbSAnLi4vZW52L0Vudmlyb25tZW50JztcclxuaW1wb3J0IHtMYXN0Rm9jdXNlZE1hbmFnZXJ9IGZyb20gJy4uL3J0L0xhc3RGb2N1c2VkTWFuYWdlcic7XHJcbmltcG9ydCB7RXZlbnRzQWxsb3dlZFR5cGUsIElFdmVudHNNYW5hZ2VyfSBmcm9tICcuL0lFdmVudHNNYW5hZ2VyJztcclxuaW1wb3J0IHtMYW5ndWFnZURhdGF9IGZyb20gJy4uL2Vudi9MYW5ndWFnZURhdGEnO1xyXG5pbXBvcnQge1N1YmplY3R9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7Q2xpZW50TWFuYWdlcn0gZnJvbSBcIi4uL0NsaWVudE1hbmFnZXJcIjtcclxuaW1wb3J0IHtDb250ZXh0VGVybWluYXRpb25FdmVudENvbW1hbmR9IGZyb20gJy4uL2NvbW1hbmRzL0NsaWVudFRvU2VydmVyL0NvbnRleHRUZXJtaW5hdGlvbkV2ZW50Q29tbWFuZCc7XHJcblxyXG5cclxuZW51bSBFdmVudFNjb3BlIHtcclxuICBOT05FID0gJyAnLFxyXG4gIFRSQU5TID0gJ1QnXHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgdGhpcyBjbGFzcyBtYW5hZ2UgdGhlIGV2ZW50cywgcHV0IHRoZW0gaW4gYSBxdWV1ZSBhbmQgaGFuZGxlIHRoZW1cclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIEV2ZW50c01hbmFnZXIgaW1wbGVtZW50cyBJRXZlbnRzTWFuYWdlciB7XHJcbiAgLy8gTE9DQUwgQ09OU1RBTlRTXHJcbiAgcHJpdmF0ZSBzdGF0aWMgVGltZXJfVGltZW91dF9JbmZpbml0ZSA9IC0xO1xyXG4gIHByaXZhdGUgc3RhdGljIFJFQUxfT05MWTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgTUFYX09QRVI6IG51bWJlciA9IDk5OTk7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgdXNlckdyYW50ZWRGb3JDb250ZXh0QWN0aXZpdHkgPSB0cnVlO1xyXG4gIHByaXZhdGUgX2V2ZW50c1F1ZXVlOiBNZ1ByaW9yaXR5QmxvY2tpbmdRdWV1ZSA9IG51bGw7IC8vIHRoZSBxdWV1ZSBvZiBldmVudHMgdG8gZXhlY3V0ZVxyXG4gIHByaXZhdGUgX2V4ZWNTdGFjazogU3RhY2s8RXhlY3V0aW9uU3RhY2s+ID0gbnVsbDsgLy8gRXhlY3V0aW9uIHN0YWNrIG9mIHJhaXNlIGV2ZW50IG9wZXJhdGlvbiBvciBjYWxscyB0byB1c2VyXHJcbiAgcHJpdmF0ZSBfcnRFdmVudHM6IFN0YWNrPFJ1blRpbWVFdmVudD4gPSBudWxsOyAvLyBBIHN0YWNrIG9mIGluLXByb2Nlc3MgcnVuLXRpbWUgZXZlbnRzICh0aGUgbGFzdCBvbmUgaXMgYXQgdGhlIHRvcCkuXHJcbiAgcHJpdmF0ZSBfc2VydmVyRXhlY1N0YWNrOiBTdGFjazxFeGVjdXRpb25TdGFjaz4gPSBudWxsOyAvLyBFeGVjdXRpb24gc3RhY2sgb2YgRXhlY3V0aW9uIHN0YWNrcyBvZiBvcGVyYXRpb25zIHRoYXRcclxuICBwcml2YXRlIF9hbGxvd0V2ZW50czogRXZlbnRzQWxsb3dlZFR5cGUgPSBFdmVudHNBbGxvd2VkVHlwZS5BTEw7XHJcbiAgcHJpdmF0ZSBfY29tcE1haW5QcmdUYWI6IENvbXBNYWluUHJnVGFibGUgPSBudWxsOyAvLyB0aGUgb3JkZXIgb2YgaGFuZGxpbmcgbWFpbiBwcm9ncmFtcyBvZiBjb21wb25lbnRzXHJcbiAgcHJpdmF0ZSBfY3VyckN0cmw6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfY3VyckZpZWxkOiBGaWVsZCA9IG51bGw7IC8vIGZvciBldmVyeSBldmVudCBleGVjdXRlZCB0aGlzIHZhcmlhYmxlIHdpbGwgY29udGFpbiB0aGUgZmllbGQgYXR0YWNoZWQgdG8gdGhlIGNvbnRyb2wgb24gd2hpY2ggdGhlIGV2ZW50IHdhcyBmaXJlZFxyXG4gIHByaXZhdGUgX2N1cnJLYmRJdGVtOiBLZXlib2FyZEl0ZW0gPSBudWxsO1xyXG4gIHByaXZhdGUgX2VuZE9mV29yazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2V2ZW50U2NvcGU6IEV2ZW50U2NvcGUgPSBFdmVudFNjb3BlLk5PTkU7IC8vIGluc3RydWN0cyBob3cgdG8gcHJvY2VzcyBldmVudHMgd2hpY2ggYXJlIHByb3BhZ2F0ZWQgdG8gc2xhdmUgdGFza3MgZHVyaW5nIGV4ZWN1dGlvbi5cclxuICBwcml2YXRlIF9mb3JjZUV4aXQ6IEZvcmNlRXhpdCA9IEZvcmNlRXhpdC5Ob25lO1xyXG4gIHByaXZhdGUgX2ZvcmNlRXhpdFRhc2s6IFRhc2sgPSBudWxsO1xyXG4gIHByaXZhdGUgX2lnbm9yZVVua25vd25BYm9ydDogYm9vbGVhbiA9IGZhbHNlOyAvLyBUUlVFIHdoZW4gJ2Fib3J0JyBjb21tYW5kcyBvbiB1bmtub3duIHRhc2tzIG1heSBhcnJpdmVcclxuICBwcml2YXRlIF9pbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlOyAvLyB1c2VkIHRvIGRldGVjdCByZS1pbml0aWFsaXphdGlvblxyXG4gIHByaXZhdGUgX2lzSGFuZGxpbmdGb3JjZUV4aXQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gaW5kaWNhdGUgd2UgYXJlIGN1cnJlbnRseSBoYW5kbGluZyBhIGZvcmNlRXhpdCByZWxhdGVkIGhhbmRsZXJcclxuICBwcml2YXRlIF9pc05vblJldmVyc2libGVFeGl0OiBib29sZWFuID0gZmFsc2U7IC8vIGlzIHRoZSBjb21tYW5kIG5vbnJldmVyc2libGVcclxuICBwcml2YXRlIF9pc0luUmVjb3JkRmx1c2hFdmVudDogYm9vbGVhbiA9IGZhbHNlOyAvLyB0cnVlIGlmIGN1cnJlbnQgYWN0IGlzIE1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRFxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBjbGllbnRJbmFjdGl2aXR5VGltZXJPTiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgc3RhdGljIGNsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZXJBYm9ydGVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBsYXN0U2F2ZWRSb3V0ZUV2ZW50OiBSdW5UaW1lRXZlbnQgPSBudWxsO1xyXG4gIC8vIHdhcyBzZW50IGZyb20gdGhlIHNlcnZlci4gd2UgbmVlZCBhIHN0YWNrIG9mIGV4ZWNzdGFja3NcclxuICAvLyBoZXJlIGJlY2F1c2Ugd2UgbWlnaHQgY2FsbCBhIG5ldyBwcm9ncmFtIGJlZm9yZSB3ZSBoYW5kbGVkXHJcbiAgLy8gdGhlIHByZXZpb3VzIHNlcnZlciBleGVjIHN0YWNrXHJcbiAgcHJpdmF0ZSBfc3RvcEV4ZWN1dGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3Byb2Nlc3NpbmdUb3BNb3N0RW5kVGFzazogYm9vbGVhbiA9IGZhbHNlOyAvLyBpbmRpY2F0aW9uIHdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBwcm9jZXNzaW5nIGV2ZW50cyBmcm9tIHRoZVxyXG4gIHByaXZhdGUgX3N0b3BFeGVjdXRpb25DdHJsOiBNZ0NvbnRyb2wgPSBudWxsOyAvLyBob2xkcyB0aGUgY3RybCBvbiB3aGljaCB3ZSBnZXQgdGhlIGZpcnN0IHN0b3AgZXhlY3V0aW9uXHJcbiAgcHJpdmF0ZSBfaXNTb3J0aW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfbmV4dFBhcmtlZEN0cmw6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgcHVibGljICBndWlQZW5kaW5nRXZlbnQ6YW55ICA9IG51bGw7XHJcbiAgLy8gS0VZQk9BUkQgRVZFTlRTIENPTlNUQU5UU1xyXG4gIHJlYWRvbmx5IEtCSV9ET1dOOiBLZXlib2FyZEl0ZW0gPSBudWxsO1xyXG4gIHJlYWRvbmx5IEtCSV9VUDogS2V5Ym9hcmRJdGVtID0gbnVsbDtcclxuXHJcbiAgLy8gQ09OVEVYVCBURVJNSU5BVElPTiBXQVJOSU5HIENPTlNUQU5UU1xyXG4gIHJlYWRvbmx5IGNvbmZpcm1hdGlvbkRpYWxvZ01zZzogc3RyaW5nID0gXCJUaGUgc2VydmVyIGNvbnRleHQgc2VydmluZyB0aGlzIGFwcGxpY2F0aW9uIGlzIGFib3V0IHRvIHRpbWUgb3V0LiBEbyB5b3Ugd2FudCB0byBjb250aW51ZSB5b3VyIHdvcms/XCI7XHJcbiAgcmVhZG9ubHkgY29uZmlybWF0aW9uRGlhbG9nVGl0bGU6IHN0cmluZyA9IFwiU2Vzc2lvbiBpcyBhYm91dCB0byBiZSB0ZXJtaW5hdGVkIVwiO1xyXG5cclxuICBzdGF0aWMgSW5zdGFuY2U6IEV2ZW50c01hbmFnZXIgPSBuZXcgRXZlbnRzTWFuYWdlcigpO1xyXG5cclxuICBwcml2YXRlIF9sYXN0RmFpbGVkRm9jdXNlZENvbnRyb2w6IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGlzU3Bpbm5lclNob3duOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIFNwaW5uZXJTdG9wcGVkOiBTdWJqZWN0PG51bWJlcj4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBzdGF0aWMgY2xpZW50QnVzeVRpbWVTdGFydCA9IDA7XHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHByaXZhdGUgQ1RPUiB0byBwcmV2ZW50IGluc3RhbnRpYXRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLl9ydEV2ZW50cyA9IG5ldyBTdGFjaygpO1xyXG5cclxuICAgIHRoaXMuX2V2ZW50c1F1ZXVlID0gbmV3IE1nUHJpb3JpdHlCbG9ja2luZ1F1ZXVlKCk7XHJcblxyXG4gICAgdGhpcy5fZXhlY1N0YWNrID0gbmV3IFN0YWNrKCk7XHJcbiAgICB0aGlzLl9leGVjU3RhY2sucHVzaChuZXcgRXhlY3V0aW9uU3RhY2soKSk7XHJcblxyXG4gICAgdGhpcy5fc2VydmVyRXhlY1N0YWNrID0gbmV3IFN0YWNrKCk7XHJcbiAgICB0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucHVzaChudWxsKTtcclxuXHJcbiAgICB0aGlzLl9uZXh0UGFya2VkQ3RybCA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5LQklfRE9XTiA9IG5ldyBLZXlib2FyZEl0ZW0oR3VpQ29uc3RhbnRzLktFWV9ET1dOLCBNb2RpZmllcnMuTU9ESUZJRVJfTk9ORSk7XHJcbiAgICB0aGlzLktCSV9VUCA9IG5ldyBLZXlib2FyZEl0ZW0oR3VpQ29uc3RhbnRzLktFWV9VUCwgTW9kaWZpZXJzLk1PRElGSUVSX05PTkUpO1xyXG5cclxuICB9XHJcblxyXG4gIGdldFBlbmRpbmdHdWlFdmVudCgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3VpUGVuZGluZ0V2ZW50O1xyXG4gIH1cclxuXHJcbiAgc2V0UGVuZGluZ0d1aUV2ZW50KGd1aUV2ZW50IDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmd1aVBlbmRpbmdFdmVudCA9IGd1aUV2ZW50O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCBhbiBldmVudCB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpcnRFdnRcIj50aGUgZXZlbnQgdG8gYmUgYWRkZWQgPC9wYXJhbT5cclxuICBhZGRUb1RhaWwocnRFdnQ6IFJ1blRpbWVFdmVudCk6IHZvaWQge1xyXG4gICAgLy8gaWYgY3VycmVudCBldmVudCBpcyBub3QgaWRsZSB0aW1lIGV2ZW50IGNoZWNrIGlmIHRoZXJlIGlzIGNsaWVudEluYWN0aXZpdHlUaW1lciBydW5uaW5nP1xyXG4gICAgLy8gaWYgc28gLCBzdG9wIHRoaXMgY2xpZW50IENvbnRleHQgaW5hY3Rpdml0eSB0aW1lclxyXG4gICAgaWYgKCFydEV2dC5pc0lkbGVUaW1lcigpKVxyXG4gICAge1xyXG4gICAgICBpZiAoRXZlbnRzTWFuYWdlci5jbGllbnRJbmFjdGl2aXR5VGltZXJPTikge1xyXG4gICAgICAgICAgRXZlbnRzTWFuYWdlci5jbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyQWJvcnRlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG5cclxuICAgICAgICAvLyBpZiBjbGllbnQgaXMgaWRsZSBhZnRlciByZWNyZWF0aW5nIGNvbnRleHQgLCB0aGVuIGFkZCBsYXN0IHNhdmVkIHJvdXRlIGV2ZW50XHJcbiAgICAgIGlmICh0aGlzLmdldExhc3RTYXZlZFJvdXRlRXZlbnQoKSE9IG51bGwpXHJcbiAgICAgIHtcclxuICAgICAgICB0aGlzLmFkZFRvVGFpbCh0aGlzLmdldExhc3RTYXZlZFJvdXRlRXZlbnQoKSk7XHJcbiAgICAgICAgdGhpcy5zZXRMYXN0U2F2ZWRSb3V0ZUV2ZW50KG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fZXZlbnRzUXVldWUucHV0KHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgYW4ga2V5Ym9hcmQgZXZlbnQgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdGb3JtXCI+Zm9ybSA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdDb250cm9sXCI+Y29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibW9kaWZpZXJcIj5tb2RpZmllciA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RhcnRcIj5zdGFydCBvZiBzZWxlY3RlZCB0ZXh0IDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJlbmRcIj5lbmQgb2Ygc2VsZWN0ZWQgdGV4dCAgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRleHRcIj50ZXh0IDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbVwiPmltIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc0FjdENoYXJcIj5pcyBrZXlib2FyZCBjaGFyIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdWdnZXN0ZWRWYWx1ZVwiPnN1Z2dlc3RlZCB2YWx1ZSBmb3IgY2hvaWNlIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+Y29kZSB0byBiZSBhZGRlZCBpbiB0aGUgcXVldWUgPC9wYXJhbT5cclxuICBBZGRLZXlib2FyZEV2ZW50KG1nRm9ybTogTWdGb3JtQmFzZSwgbWdDb250cm9sOiBNZ0NvbnRyb2xCYXNlLCBtb2RpZmllcjogTW9kaWZpZXJzLCBrZXlDb2RlOiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcsIGlzQWN0Q2hhcjogYm9vbGVhbiwgc3VnZ2VzdGVkVmFsdWU6IHN0cmluZywgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IChtZ0NvbnRyb2wgIT09IG51bGwpID8gbmV3IFJ1blRpbWVFdmVudCg8TWdDb250cm9sPm1nQ29udHJvbCwgdHJ1ZSwgZmFsc2UpIDogbmV3IFJ1blRpbWVFdmVudCg8VGFzaz5tZ0Zvcm0uZ2V0VGFzaygpLCB0cnVlKTtcclxuXHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuXHJcbiAgICBsZXQgbmV3S2JJdGVtOiBLZXlib2FyZEl0ZW0gPSBuZXcgS2V5Ym9hcmRJdGVtKGtleUNvZGUsIG1vZGlmaWVyKTtcclxuXHJcbiAgICBpZiAoaXNBY3RDaGFyICYmIChtZ0NvbnRyb2wgIT09IG51bGwgJiYgKG1nQ29udHJvbC5pc1RleHRDb250cm9sKCkpKSlcclxuICAgICAgbmV3S2JJdGVtLnNldEFjdGlvbihJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0hBUik7XHJcblxyXG4gICAgcnRFdnQuc2V0S2V5Ym9hcmRJdGVtKG5ld0tiSXRlbSk7XHJcblxyXG4gICAgaWYgKGNvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX0tFWURPV04pIHtcclxuICAgICAgcnRFdnQuc2V0RWRpdFBhcm1zKHN0YXJ0LCBlbmQsIHRleHQpO1xyXG4gICAgfSBlbHNlXHJcbiAgICAgIHJ0RXZ0LnNldFZhbHVlKHN1Z2dlc3RlZFZhbHVlKTtcclxuXHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUUNSIDc2MDM4MSBpZiBhZnRlciBoYW5kbGluZyB0aGUgZXZlbnQgdGhlIGN1cnJlbnQgY29udHJvbCBpcyB1bnBhcmthYmxlIHRyeVxyXG4gIC8vLyAgIGFuIG1vdmUgdG8gdGhlIG5leHQgcGFya2FibGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgY2hlY2tQYXJrYWJpbGl0eSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjdXJyZW50OiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcblxyXG4gICAgLyogUUNSIyA5MjU0NjQuIFRoZSBwcm9ibGVtIHdhcyB0aGF0IG9uIGRlbGV0aW5nIGEgcmVjb3JkLCBDUyBvZiB0aGUgY29udHJvbCBnZXRzIGV4ZWN1dGVkLlxyXG4gICAgICogU28sIHRoZSB0YXNrJ3MgbGV2ZWwgaXMgc2V0IHRvIFRBU0suIFRoZW4gd2UgZ28gdG8gc2VydmVyIGFuIG9uIHJldHVybmluZyBiYWNrIGZyb20gdGhlIHNlcnZlcixcclxuICAgICAqIHdlIHJlZnJlc2ggdGhlIGZvcm0uIEhlcmUsIHNpbmNlIHRoZSBsYXN0IHBhcmtlZCBjb250cm9sIGkuZS4gXCJmcm9tXCIgKG51bWVyaWMpIGlzIGhpZGRlbixcclxuICAgICAqIHdlIHRyeSB0byBwYXJrIG9uIHRoZSBuZXh0IHBhcmthYmxlIGNvbnRyb2wgZnJvbSBQcm9wZXJ0eS5SZWZyZXNoRGlzcGxheSgpLiBUaGlzIG1ha2VzIHRoZVxyXG4gICAgICogdGFzaydzIGxldmVsIGFzIENPTlRST0wuIE5vdywgd2UgdHJ5IHRvIGV4ZWN1dGUgUlAsIGJ1dCBzaW5jZSB0aGUgbGV2ZWwgaXMgQ09OVFJPTCxcclxuICAgICAqIHdlIGRvIG5vdCBleGVjdXRlIGl0LiBUaGUgc29sdXRpb24gaXMgdGhhdCBjaGVja1BhcmthYmlsaXR5KCkgd2hpY2ggaXMgY2FsbGVkIGZyb21cclxuICAgICAqIFByb3BlcnR5LlJlZnJlc2hEaXNwbGF5KCksIHNob3VsZCB0cnkgdG8gcGFyayBvbiB0aGUgY29udHJvbCBvbmx5IGlmIHRoZSB0YXNrJ3MgbGV2ZWwgaXMgQ09OVFJPTC5cclxuICAgICAqL1xyXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgKGN1cnJlbnQuZ2V0Rm9ybSgpLmdldFRhc2soKSkuZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCAmJiAhYXdhaXQgY3VycmVudC5Jc1BhcmthYmxlKCkpXHJcbiAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyhjdXJyZW50LmdldEZvcm0oKS5nZXRUYXNrKCkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgSGFuZGxlUGFya2FiaWxpdHlPblJvd0NoYW5nZShpdGFzazogSVRhc2spOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyhpdGFzayk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaGFuZGxlIHNpdHVhdGlvbiB3aXRoIG5vIHBhcmthYmxlIGNvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIml0YXNrXCI+PC9wYXJhbT5cclxuICBhc3luYyBIYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKGl0YXNrOiBJVGFzayk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5pdGFzaztcclxuICAgIC8vIHdlIGNhbiBub3Qgc3RheSBpbiBjcmVhdGUgbW9kZSB3aXRoIG5vIHBhcmthYmxlIGNvbnRyb2xzXHJcbiAgICBpZiAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmIHRhc2suSXNJbnRlcmFjdGl2ZSkge1xyXG4gICAgICBhd2FpdCB0YXNrLmVuYWJsZU1vZGVzKCk7XHJcbiAgICAgIGxldCBvbGRNb2RlOiBzdHJpbmcgPSB0YXNrLmdldE9yaWdpbmFsVGFza01vZGUoKTtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgIGlmIChvbGRNb2RlICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICAgICAgdGFzay5zZXRNb2RlKG9sZE1vZGUpO1xyXG4gICAgICAgICAgYXdhaXQgKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5jdXJyUmVjQ29tcHV0ZSh0cnVlKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgIGF3YWl0ICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgIHRhc2suc2V0TGFzdFBhcmtlZEN0cmwobnVsbCk7XHJcbiAgICAgICAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXModGFzaywgbnVsbCwgLTEsIHRydWUpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyB3ZSBjYW4gbm90IHN0YXkgaW4gY3JlYXRlIG1vZGUgb3IgaW4gc3RvcCBleGVjdXRpb24gc3RhdGUgd2l0aCBubyBwYXJrYWJsZSBjb250cm9sc1xyXG4gICAgICAvLyBEbyBub3QgZ2l2ZSBwYXJrIGVycm9yLCBpZiB0YXNrIGlzIG9wZW5lZCBpbiBjcmVhdGUgbW9kZS4gVGhpcyBpcyB0ZW1wb3JhcnkgY2hhbmdlIGZvciBjdXN0b21lciBwcm9ibGVtLlxyXG4gICAgICAvL3RoaXMuZXhpdFdpdGhFcnJvcih0YXNrLCBNc2dJbnRlcmZhY2UuUlRfU1RSX0NSU1JfQ0FOVF9QQVJLKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBXaGlsZSBoYW5kbGUgbm9uLXBhcmthYmlsaXR5IGNvbmRpdGlvbiwgZW5zdXJlIENTIGlzIGNhbGxlZCBmb3IgY29udHJvbCBpZiBpdCBpcyBpbiBDb250cm9sIGxldmVsIHRoZW4gcGFya2luZyBpcyBzZXQgb24gZm9ybS5cclxuICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wpXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuXHJcbiAgICB0YXNrLnNldExhc3RQYXJrZWRDdHJsKG51bGwpO1xyXG4gICAgTWdDb250cm9sLlJldHVyblRvQ3RybCA9IG51bGw7XHJcbiAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXModGFzaywgbnVsbCwgLTEsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGhhbmRsZSBhIHNpbmdsZSBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpcnRFdnRcIj50aGUgZXZlbnQgdG8gcHJvY2VzcyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmV0dXJuZWRGcm9tU2VydmVyXCI+aW5kaWNhdGVzIHdoZXRoZXIgd2UgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyIC0gdG8gYmUgcGFzc2VkIHRvIGhhbmRsZXIuZXhlY3V0ZSgpIDwvcGFyYW0+XHJcbiAgYXN5bmMgaGFuZGxlRXZlbnQocnRFdnQ6IFJ1blRpbWVFdmVudCwgcmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgaGFuZGxlcjogRXZlbnRIYW5kbGVyID0gbnVsbDtcclxuICAgIGxldCBwb3M6IEV2ZW50SGFuZGxlclBvc2l0aW9uID0gbmV3IEV2ZW50SGFuZGxlclBvc2l0aW9uKCk7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPnJ0RXZ0LmdldFRhc2soKTtcclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgIGxldCBmb3JjZUV4aXREb25lOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgZW5kVGFza0Vycm9yOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgb2xkUnRFdnQ6IFJ1blRpbWVFdmVudCA9IG51bGw7XHJcbiAgICBsZXQgb2xkRm9yY2VFeGl0OiBGb3JjZUV4aXQgPSB0aGlzLmdldEZvcmNlRXhpdCgpO1xyXG4gICAgbGV0IG9sZEZvcmNlRXhpdFRhc2s6IFRhc2sgPSB0aGlzLmdldEZvcmNlRXhpdFRhc2soKTtcclxuICAgIGxldCBvbGRJc0hhbmRsaW5nRm9yY2VFeGl0OiBib29sZWFuID0gdGhpcy5faXNIYW5kbGluZ0ZvcmNlRXhpdDtcclxuICAgIGxldCByZXN0b3JlSXNGb3JjZUV4aXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCByZXN0b3JlQ3VyckN0cmw6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgICBsZXQgcmVzdG9yZUN1cnJGaWVsZDogRmllbGQgPSBudWxsO1xyXG5cclxuICAgIC8vIHRoZSBhY3Rpb24gbmVlZCB0byBiZSBjaGVjayBhY2NvcmRpbmcgdG8gdGhlIHRhc2sgb24gdGhlIGV2ZW50LlxyXG4gICAgLy8gSWYgdGhlIGFjdGlvbiBpcyBpbnRlcm5hbCAodW5kZXIgQUNUX1RPVCksIGRvIG5vdGhpbmcgaWYgaXRzIGRpc2FibGVkIG9yIG5vdCBhbGxvd2VkLlxyXG4gICAgaWYgKChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpKSB7XHJcbiAgICAgIC8vIGRvIG5vdGhpbmcgaWYgYWN0aW9uIGlzIDEuIG5vdCBlbmFibGVkIDIuIHdhaXQgPT0gbm8gYW5kIGV2ZW50cyBhcmUgbm90IGFsbG93ZWRcclxuICAgICAgaWYgKHJ0RXZ0LkludGVybmFsRXZlbnQgPCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVE9UX0NOVCAmJiAoIXRhc2suQWN0aW9uTWFuYWdlci5pc0VuYWJsZWQocnRFdnQuSW50ZXJuYWxFdmVudCkgfHwgKCFydEV2dC5pc0ltbWVkaWF0ZSgpICYmIHRoaXMuTm9FdmVudHNBbGxvd2VkKCkpKSlcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9IGVsc2VcclxuICAgIC8vIGRvIHRoZSBoYW5kbGVycyB3aGVuIDEuIHdhaXQgPT0geWVzIG9yIDIuIGV2ZW50cyBhcmUgYWxsb3dlZFxyXG4gICAgaWYgKCFydEV2dC5pc0ltbWVkaWF0ZSgpICYmIHRoaXMuTm9FdmVudHNBbGxvd2VkKCkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICByZXN0b3JlQ3VyckN0cmwgPSB0aGlzLl9jdXJyQ3RybDtcclxuICAgIHRoaXMuX2N1cnJDdHJsID0gY3RybDsgLy8gc2F2ZSBjdXJyZW50IGNvbnRyb2wgZm9yIEhBTkRMRVJfQ1RSTCBmdW5jdGlvblxyXG5cclxuICAgIGxldCBwcm9wYWdhdGU6IGJvb2xlYW4gPSBydEV2dC5nZXRUeXBlKCkgIT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgfHwgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgPCAxMDAwO1xyXG5cclxuICAgIHRyeSB7XHJcblxyXG4gICAgICB0aGlzLnB1c2hSdEV2ZW50KHJ0RXZ0KTtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuQ2hlY2tBbmRTaG93U3Bpbm5lcih0cnVlKTtcclxuXHJcbiAgICAgIC8vIGRvIHNvbWUgY29tbW9uIHByb2Nlc3NpbmcgYW5kIGlmIHRoZSByZXN1bHQgaXMgdHJ1ZSB0aGVuIGNvbnRpbnVlXHJcbiAgICAgIC8vIHdpdGggdGhlIHVzZXIgZGVmaW5lZCBoYW5kbGVyc1xyXG4gICAgICBsZXQgYlJjQmVmb3JlOiBib29sZWFuID0gYXdhaXQgdGhpcy5jb21tb25IYW5kbGVyQmVmb3JlKHJ0RXZ0KTtcclxuXHJcbiAgICAgIHJlc3RvcmVDdXJyRmllbGQgPSB0aGlzLl9jdXJyRmllbGQ7XHJcbiAgICAgIHRoaXMuX2N1cnJGaWVsZCA9IDxGaWVsZD50YXNrLmdldEN1cnJGaWVsZCgpO1xyXG5cclxuICAgICAgaWYgKGJSY0JlZm9yZSkge1xyXG4gICAgICAgIHBvcy5pbml0KHJ0RXZ0KTtcclxuICAgICAgICAvLyBnZXQgdGhlIGZpcnN0IGhhbmRsZXIgZm9yIHRoZSBjdXJyZW50IGV2ZW50XHJcbiAgICAgICAgaGFuZGxlciA9IHBvcy5nZXROZXh0KCk7XHJcblxyXG4gICAgICAgIGlmIChoYW5kbGVyICE9PSBudWxsICYmIGhhbmRsZXIuZ2V0RXZlbnQoKSAhPT0gbnVsbCAmJiBoYW5kbGVyLmdldEV2ZW50KCkuVXNlckV2dCAhPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuc2V0Rm9yY2VFeGl0KGhhbmRsZXIuZ2V0RXZlbnQoKS5Vc2VyRXZ0LkZvcmNlRXhpdCwgdGFzayk7XHJcblxyXG4gICAgICAgIC8vIGV4ZWN1dGUgdGhlIGNoYWluIG9mIGhhbmRsZXJzIGZvciB0aGUgY3VycmVudCBldmVudC4gdGhlIGV4ZWN1dGlvblxyXG4gICAgICAgIC8vIGNvbnRpbnVlcyB0aWxsIGFuIGV2ZW50IGhhbmRsZXIgcmV0dXJucyBmYWxzZS5cclxuICAgICAgICB3aGlsZSAoaGFuZGxlciAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgbGV0IGhhbmRsZXJDb250ZXh0VGFzazogVGFzayA9IG51bGw7XHJcbiAgICAgICAgICBsZXQgcnRFdnRDaGFuZ2VkOiBib29sZWFuO1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IGVuYWJsZWRDbmRDaGVja2VkQW5kVHJ1ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBoYW5kbGVyIGNoYW5nZSB0aGUgaGFuZGxlcidzIGNvbnRleHQgdGFzayB0byB0aGUgZXZlbnQncyB0YXNrXHJcbiAgICAgICAgICAgIGhhbmRsZXJDb250ZXh0VGFzayA9IDxUYXNrPiBoYW5kbGVyLmdldFRhc2soKS5HZXRDb250ZXh0VGFzaygpO1xyXG4gICAgICAgICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpID49IDEwMDAgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WQVJJQUJMRSlcclxuICAgICAgICAgICAgICBoYW5kbGVyLmdldFRhc2soKS5TZXRDb250ZXh0VGFzayhoYW5kbGVyLmdldFRhc2soKSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBoYW5kbGVyLmdldFRhc2soKS5TZXRDb250ZXh0VGFzayhydEV2dC5nZXRUYXNrKCkpO1xyXG5cclxuICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gbmVlZCB0byBoYW5kbGUgRm9yY2VFeGl0IGZvciBub24tdXNlciBldmVudHNcclxuICAgICAgICAgICAgaWYgKGhhbmRsZXIuZ2V0RXZlbnQoKS5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUiAmJiBhd2FpdCBoYW5kbGVyLmlzRW5hYmxlZCgpKSB7XHJcbiAgICAgICAgICAgICAgZW5hYmxlZENuZENoZWNrZWRBbmRUcnVlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgcmVzdG9yZUlzRm9yY2VFeGl0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAvLyBoYW5kbGUgZm9yY2VFeGl0IG9ubHkgb25jZVxyXG4gICAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmhhbmRsZUZvcmNlRXhpdEJlZm9yZShoYW5kbGVyLmdldEV2ZW50KCksIHJ0RXZ0KSkge1xyXG4gICAgICAgICAgICAgICAgZm9yY2VFeGl0RG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgY3VycmVudCBydW4gdGltZSBldmVudCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZXZlbnRcclxuICAgICAgICAgICAgLy8gb2YgdGhlIGhhbmRsZXJcclxuICAgICAgICAgICAgaWYgKHJ0RXZ0ICE9PSBoYW5kbGVyLmdldEV2ZW50KCkpIHtcclxuICAgICAgICAgICAgICAvLyB0aGUgbmV3IHJ1bnRpbWUgZXZlbnQgaXMgdGhhdCBvZiB0aGUgaGFuZGxlciBjb21iaW5lZCB3aXRoIHRoZVxyXG4gICAgICAgICAgICAgIC8vIGRhdGEgb2YgdGhlIGN1cnJlbnQgcnVudGltZSBldmVudC5cclxuICAgICAgICAgICAgICAvLyB0aGUgcHVycG9zZSBvZiB0aGlzIGlzIHRvIHByb3BhZ2F0ZSB0aGUgZXZlbnQgb2YgdGhlIGhhbmRsZXJcclxuICAgICAgICAgICAgICAvLyBpbiBwbGFjZSBvZiB0aGUgb3JpZ2luYWwgZXZlbnRcclxuICAgICAgICAgICAgICBvbGRSdEV2dCA9IHJ0RXZ0O1xyXG4gICAgICAgICAgICAgIHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudChoYW5kbGVyLmdldEV2ZW50KCksIHJ0RXZ0KTtcclxuICAgICAgICAgICAgICBydEV2dENoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBhIG5ldyBydW50aW1lIGV2ZW50IHRvIGhhbmRsZSBzbyBwb3AgdGhlIG9sZCBvbmUgYW5kIHB1c2hcclxuICAgICAgICAgICAgICAvLyB0aGUgbmV3IG9uZSBpbnN0ZWFkLlxyXG4gICAgICAgICAgICAgIHRoaXMucG9wUnRFdmVudCgpO1xyXG4gICAgICAgICAgICAgIHRoaXMucHVzaFJ0RXZlbnQocnRFdnQpO1xyXG4gICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICBydEV2dENoYW5nZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKVxyXG4gICAgICAgICAgICAgIHJ0RXZ0LmdldFRhc2soKS5zZXRJblJlY29yZFN1ZmZpeCh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRXZlbnRBcmd1bWVudHMocnRFdnQpO1xyXG4gICAgICAgICAgICBsZXQgaGFuZGxlclJldFZhbHM6IFJldFZhbHMgPSBhd2FpdCBoYW5kbGVyLmV4ZWN1dGUocnRFdnQsIHJldHVybmVkRnJvbVNlcnZlciwgZW5hYmxlZENuZENoZWNrZWRBbmRUcnVlKTtcclxuICAgICAgICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpXHJcbiAgICAgICAgICAgICAgcnRFdnQuZ2V0VGFzaygpLnNldEluUmVjb3JkU3VmZml4KGZhbHNlKTtcclxuICAgICAgICAgICAgcHJvcGFnYXRlID0gaGFuZGxlclJldFZhbHMuUHJvcGFnYXRlO1xyXG4gICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXRWYWxzLkVuYWJsZWQgJiYgcnRFdnRDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgcnRFdnQgPSBvbGRSdEV2dDtcclxuICAgICAgICAgICAgICBvbGRSdEV2dCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgcnRFdnRDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYSBuZXcgcnVudGltZSBldmVudCB0byBoYW5kbGUgc28gcG9wIHRoZSBvbGQgb25lIGFuZCBwdXNoXHJcbiAgICAgICAgICAgICAgLy8gdGhlIG5ldyBvbmUgaW5zdGVhZC5cclxuICAgICAgICAgICAgICB0aGlzLnBvcFJ0RXZlbnQoKTtcclxuICAgICAgICAgICAgICB0aGlzLnB1c2hSdEV2ZW50KHJ0RXZ0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgaGF2ZSBmdWxmaWxsZWQgdGhlIGVuZCBjb25kaXRpb25cclxuICAgICAgICAgICAgLy8gQWZ0ZXIgZXhlY3V0aW5nIGEgaGFuZGxlciwgYmVmb3JlIGVuZGluZyBhIHRhc2sgKGlmIHRoZSBlbmQgY29uZGl0aW9uIGlzIFRSVUUpLFxyXG4gICAgICAgICAgICAvLyB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlIHRhc2sgaXMgbm90IGFscmVhZHkgY2xvc2VkLiBUaGlzIGNhbiBoYXBwZW4gbGlrZSBpbiBjYXNlXHJcbiAgICAgICAgICAgIC8vIG9mIFFDUiAjNzk2NDc2IC0tLSBhIG5vbi1pbnRlcmFjdGl2ZSB0YXNrIGhhcyBjYWxsZWQgYW4gaW50ZXJhY3RpdmUgdGFzayBmcm9tXHJcbiAgICAgICAgICAgIC8vIHRhc2sgc3VmZml4LiBOb3cgaWYgd2UgcHJlc3MgQWx0K0Y0LCB3ZSBnZXQgRVhJVF9TWVNURU0gYWN0LiBBbmQgc28gd2UgY2xvc2VcclxuICAgICAgICAgICAgLy8gYWxsIHRhc2tzIHN0YXJ0aW5nIGZyb20gTWFpbiBQcm9ncmFtLiBTbywgd2hlbiB3ZSBjb21lIG91dCBvZiB0aGUgVFMgaGFuZGxlclxyXG4gICAgICAgICAgICAvLyBleGVjdXRpb24sIHRoZSB0YXNrIGlzIGFscmVhZHkgY2xvc2VkLlxyXG4gICAgICAgICAgICAvLyBGb3IgT2ZmbGluZSA6IFRQIGlzIGV4ZWN1dGVkIGF0IGNsaWVudCBzaWRlLiBJZiB3ZSBhcmUgaW4gVGFzayBQcmVmaXgsIGRvbnQgY2hlY2sgZW5kVGFzayBjb25kaXRpb24gaGVyZS5cclxuICAgICAgICAgICAgaWYgKHJ0RXZ0LmdldEludGVybmFsQ29kZSgpICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVggJiYgdGFzay5pc1N0YXJ0ZWQoKSAmJiB0YXNrLmdldEV4ZWNFbmRUYXNrKCkpIHtcclxuICAgICAgICAgICAgICBlbmRUYXNrRXJyb3IgPSBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgICBpZiAoZW5kVGFza0Vycm9yKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5oYW5kbGVTdG9wRXhlY3V0aW9uKHJ0RXZ0KSlcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAvLyByZXN0b3JpbmcgdGhlIGNvbnRleHRcclxuICAgICAgICAgICAgaGFuZGxlci5nZXRUYXNrKCkuU2V0Q29udGV4dFRhc2soaGFuZGxlckNvbnRleHRUYXNrKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoIXByb3BhZ2F0ZSlcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgaWYgKHJ0RXZ0Q2hhbmdlZClcclxuICAgICAgICAgICAgaGFuZGxlciA9IHBvcy5nZXROZXh0KHJ0RXZ0KTtcclxuICAgICAgICAgIC8vIGdldCB0aGUgbmV4dCBoYW5kbGVyIGZvciB0aGUgY3VycmVudCBldmVudFxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBoYW5kbGVyID0gcG9zLmdldE5leHQoKTtcclxuICAgICAgICAgIGlmIChoYW5kbGVyICE9PSBudWxsKVxyXG4gICAgICAgICAgICBGbG93TW9uaXRvclF1ZXVlLkluc3RhbmNlLmFkZFRhc2tFdmVudChydEV2dC5nZXRCcmtMZXZlbCh0cnVlKSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1BST1BBR0FURSwgdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByb3BhZ2F0ZSAmJiAhZW5kVGFza0Vycm9yKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5jb21tb25IYW5kbGVyKHJ0RXZ0KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWVuZFRhc2tFcnJvcikge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY29tbW9uSGFuZGxlckFmdGVyKHJ0RXZ0LCBiUmNCZWZvcmUpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChmb3JjZUV4aXREb25lICYmIHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQpIHtcclxuICAgICAgICB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ID0gZmFsc2U7XHJcbiAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRm9yY2VFeGl0QWZ0ZXIocnRFdnQpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2V0Rm9yY2VFeGl0KG9sZEZvcmNlRXhpdCwgb2xkRm9yY2VFeGl0VGFzayk7XHJcbiAgICAgIGlmIChyZXN0b3JlSXNGb3JjZUV4aXQpXHJcbiAgICAgICAgdGhpcy5faXNIYW5kbGluZ0ZvcmNlRXhpdCA9IG9sZElzSGFuZGxpbmdGb3JjZUV4aXQ7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLl9jdXJyQ3RybCA9IHJlc3RvcmVDdXJyQ3RybDtcclxuICAgICAgdGhpcy5fY3VyckZpZWxkID0gcmVzdG9yZUN1cnJGaWVsZDtcclxuICAgICAgdGhpcy5wb3BSdEV2ZW50KCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vIHVwZGF0ZSB0aGUgZGlzcGxheVxyXG4gICAgR1VJTWFuYWdlci5JbnN0YW5jZS5leGVjR3VpQ29tbWFuZFF1ZXVlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBtZXRob2Qgc2ltdWxhdGVzIGFsbCBldmVudHMgdGhhdCBhcmUgaW4gc2VsZWN0aW9uIHNlcXVlbmNlIHN0YXJ0aW5nIGZyb20gZm9jdXMgZXZlbnRcclxuICAvLy8gICBJdCBpcyB1c2VkIGluIDpcclxuICAvLy8gICBhY3Rpb25zIENUUkwrVEFCICYmIENUUkwrU0hJRlQrVEFCIHRoYXQgbW92ZSB1cyB0byB0aGUgbmV4dC9wcmV2aW91cyBpdGVtIGluIFRhYiBjb250cm9sXHJcbiAgLy8vICAgY2xpY2sgb3IgYWNjZWxlcmF0b3Igb24gcHVzaCBidXR0b25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPmN0cmwgbGluZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9kdWNlQ2xpY2tcIj50cnVlIHNob3VsZCBwcm9kdWNlIGNsaWNrIGV2ZW50PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIHNpbXVsYXRlU2VsZWN0aW9uKGN0cmw6IE1nQ29udHJvbEJhc2UsIHZhbDogYW55LCBsaW5lOiBudW1iZXIsIHByb2R1Y2VDbGljazogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG1nQ29udHJvbDogTWdDb250cm9sID0gPE1nQ29udHJvbD5jdHJsO1xyXG4gICAgbGV0IGN1cnJUYXNrOiBUYXNrID0gPFRhc2s+bWdDb250cm9sLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICBsZXQgY2FuY2VsV2FzUmFpc2VkOiBib29sZWFuID0gY3VyclRhc2suY2FuY2VsV2FzUmFpc2VkKCk7XHJcblxyXG4gICAgLy8gaWYgKG1nQ29udHJvbC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUIpIHtcclxuICAgIC8vICAgaWYgKCFtZ0NvbnRyb2wuaXNNb2RpZmlhYmxlKCkgfHwgIW1nQ29udHJvbC5Jc1BhcmthYmxlKCkpIHtcclxuICAgIC8vICAgICBtZ0NvbnRyb2wucmVzdG9yZU9sZFZhbHVlKCk7XHJcbiAgICAvLyAgICAgbGV0IGxhc3RGb2N1c2VkQ29udHJvbDogTWdDb250cm9sID0gR1VJTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgIC8vICAgICBpZiAobGFzdEZvY3VzZWRDb250cm9sICE9PSBudWxsKVxyXG4gICAgLy8gICAgICAgTWFuYWdlci5TZXRGb2N1cyhsYXN0Rm9jdXNlZENvbnRyb2wsIC0xKTtcclxuICAgIC8vICAgICByZXR1cm47XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyB3aGVuIGEgcHVzaCBidXR0b24gaXMgYWJvdXQgdG8gcmFpc2UgYSAnQ2FuY2VsJyBvciBhICdRdWl0JyBldmVudC4gd2UgZG8gbm90IHdhbnQgdG8gc2V0IHRoZSBuZXcgdmFsdWUgdG8gdGhlIGZpZWxkLlxyXG4gICAgLy8gVGhhdCBzZXR0aW5nIG1pZ2h0IGNhdXNlIGEgcmVjIHN1ZmZpeCBhbmQgYSB2YXJpYWJsZSBjaGFuZ2UuXHJcbiAgICBpZiAobWdDb250cm9sLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTikge1xyXG4gICAgICBsZXQgYVJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KG1nQ29udHJvbCk7XHJcbiAgICAgIGxldCByYWlzZUF0OiBSYWlzZUF0ID0gPFJhaXNlQXQ+KGF3YWl0IChtZ0NvbnRyb2wuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SQUlTRV9BVCkpLmdldFZhbHVlSW50KCkpO1xyXG4gICAgICBpZiAoYVJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiAoYVJ0RXZ0LkludGVybmFsRXZlbnQgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUwgfHwgYVJ0RXZ0LkludGVybmFsRXZlbnQgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9RVUlUKSkge1xyXG4gICAgICAgIGlmIChyYWlzZUF0ID09PSBSYWlzZUF0LlRhc2tJbkZvY3VzKVxyXG4gICAgICAgICAgY3VyclRhc2sgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcbiAgICAgICAgY2FuY2VsV2FzUmFpc2VkID0gY3VyclRhc2suY2FuY2VsV2FzUmFpc2VkKCk7XHJcbiAgICAgICAgY3VyclRhc2suc2V0Q2FuY2VsV2FzUmFpc2VkKHRydWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocmFpc2VBdCA9PT0gUmFpc2VBdC5UYXNrSW5Gb2N1cylcclxuICAgICAgICBtZ0NvbnRyb2wuc2V0UnRFdnRUYXNrKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZmlyc3Qgd2UgaGFuZGxlIGZvY3VzXHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZUZvY3VzKG1nQ29udHJvbCwgbGluZSwgcHJvZHVjZUNsaWNrKTtcclxuXHJcbiAgICBjdXJyVGFzay5zZXRDYW5jZWxXYXNSYWlzZWQoY2FuY2VsV2FzUmFpc2VkKTtcclxuXHJcbiAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIC8vIFFDUiMgOTc0MDQ3IDogSWYgd2UgaGF2ZSBhIFB1c2ggQnV0dG9uIHdpdGggQWxsb3cgUGFya2luZyA9IE5vIGFuZCBmaWVsZCBpcyBhdHRhY2hlZCB0byBpdCwgZG9uJ3QgaGFuZGxlIHRoZSBldmVudC5cclxuICAgIC8vIFRoaXMgaXMgc2FtZSBhcyBvbmxpbmUuIEluIG9ubGluZSwgaWYgZmllbGQgaXMgbm90IGF0dGFjaGVkIHRvIG5vbiBwYXJrYWJsZSBwdXNoIEJ1dHRvbiwgd2UgaGFuZGxlIHRoZSBldmVudFxyXG4gICAgLy8gQnV0IGlmIGZpZWxkIGlzIGF0dGFjaGVkIHRvIGl0LCB3ZSBkb24ndCBoYW5kbGUgZXZlbnQuXHJcbiAgICAvLyBTbyBpZiBjb250cm9sIGlzIHB1c2ggYnV0dG9uLCBleGVjdXRlIGhhbmRsZUV2ZW50IG9ubHkgd2hlbiBmaWVsZCBpcyBub3QgYXR0YWNoZWQgb3IgUGFya29uQ0xpY2sgaXMgTm8gb3JcclxuICAgIC8vIFBhcmtvbkNMaWNrIGFuZCBhbGxvd3BhcmtpbmcgaXMgYm90aCBZZXNcclxuICAgIGxldCBjb250cm9sSXNQYXJrYWJsZTogYm9vbGVhbiA9IGF3YWl0IG1nQ29udHJvbC5Jc1BhcmthYmxlKCk7XHJcbiAgICBpZiAobWdDb250cm9sLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTiB8fCAobWdDb250cm9sLmdldEZpZWxkKCkgPT09IG51bGwgfHwgY29udHJvbElzUGFya2FibGUpKSB7XHJcblxyXG4gICAgICAvLyBRQ1IgIzMwMTY1Mi4gRm9yIG5vbi1wYXJrYWJsZSBidXR0b24gY29udHJvbCB3aXRoIGV2ZW50IHJhaXNlZCBhdCB0aGUgY29udGFpbmVyIHRhc2sgd2lsbCBiZSBjaGFuZ2VkIHNvXHJcbiAgICAgIC8vIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkIHRoZW4gdGhlIHRhc2sgd2lsbCBnZXQgZm9jdXMuIChhcyBpbiBPbmxpbmUgYW5kIGFzIGlmIHRoZSBidXR0b24gd2FzIHBhcmthYmxlKS5cclxuICAgICAgLy8gVGhlIGZvY3VzIHdpbGwgYmUgb24gdGhlIGZpcnN0IGNvbnRyb2wuXHJcbiAgICAgIGlmIChtZ0NvbnRyb2wuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OICYmICFjb250cm9sSXNQYXJrYWJsZSkge1xyXG4gICAgICAgIGxldCBzdWJmb3JtVGFzazogVGFzayA9IDxUYXNrPm1nQ29udHJvbC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgICAgIGlmIChzdWJmb3JtVGFzay5Jc1N1YkZvcm0pIHtcclxuICAgICAgICAgIGN1cnJUYXNrID0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG4gICAgICAgICAgLy8gRGVmZWN0IDExNTQ3NC4gRm9yIHRoZSBzYW1lIHRhc2sgZG8gbm90IG1vdmUgdG8gdGhlIGZpcnN0IGNvbnRyb2wuXHJcbiAgICAgICAgICBpZiAoc3ViZm9ybVRhc2sgIT09IGN1cnJUYXNrICYmIHN1YmZvcm1UYXNrLnBhdGhDb250YWlucyhjdXJyVGFzaykpIHtcclxuXHJcbiAgICAgICAgICAgIGlmIChzdWJmb3JtVGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKSB7IC8vIFRPRE86IENoZWNrIGlmIHRoaXMgY29kZSBjYW4gYmUgbW92ZWQgdG8gSGFuZGxlTm9uUGFya2FibGVDb250cm9scygpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2soc3ViZm9ybVRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoc3ViZm9ybVRhc2spO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIC8vIHRoZW4gQUNUX0hJVCBpcyBzZW50XHJcbiAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChtZ0NvbnRyb2wpO1xyXG4gICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRDdHJsID0gbWdDb250cm9sO1xyXG4gICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9ISVQpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhbmQgc2VsZWN0aW9uIGlzIGhhbmRsZWQgaW4gdGhlIGVuZCBpZiBwcmV2aW91cyBhY3Rpb25zIHN1Y2NlZWRlZFxyXG4gICAgaWYgKG1nQ29udHJvbC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04pXHJcbiAgICAvLyBmb3IgYnV0dG9uXFxjaGVjayB3ZSBkbyBub3QgY2FsbCB0aGlzIHRvIHByZXZlbnQgcmVjdXJzaW9uXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlU2VsZWN0aW9uKG1nQ29udHJvbCwgbGluZSwgdmFsKTtcclxuXHJcbiAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgcmV0dXJuO1xyXG4gICAgLy8gdGhlbiBtb3VzZSB1cFxyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVNb3VzZVVwKG1nQ29udHJvbCwgbGluZSwgcHJvZHVjZUNsaWNrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gYWN0aXZhdGUgaGFuZGxlSW50ZXJuYWxFdmVudCB3aXRoIGlzUXVpdCA9IGZhbHNlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIml0YXNrXCI+YSByZWZlcmVuY2UgdG8gdGhlIHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV2ZW50Q29kZVwiPnRoZSBjb2RlIG9mIHRoZSBldmVudDwvcGFyYW0+XHJcbiAgYXN5bmMgaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKGl0YXNrOiBJVGFzaywgZXZlbnRDb2RlOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kU3ViZm9ybVJlZnJlc2goaXRhc2ssIGV2ZW50Q29kZSwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFjdGl2YXRlIGhhbmRsZUludGVybmFsRXZlbnQgd2l0aCBpc1F1aXQgPSBmYWxzZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpdGFza1wiPmEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldmVudENvZGVcIj50aGUgY29kZSBvZiB0aGUgZXZlbnQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtUmVmcmVzaFwiPmlkZW50aWZpZXIgaWYgdGhlIGV2ZW50IGNhbGxlZCBieSBzdWJmb3JtIHJlZnJlc2g8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZFN1YmZvcm1SZWZyZXNoKGl0YXNrOiBJVGFzaywgZXZlbnRDb2RlOiBudW1iZXIsIHN1YmZvcm1SZWZyZXNoOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPml0YXNrO1xyXG5cclxuICAgIC8vIHNldCBTdWJmb3JtRXhlY01vZGUgKGZvciBTdWJmb3JtRXhlY01vZGUgZnVuY3Rpb24pIG9ubHkgaW4gcmVjb3JkIHByZWZpeC5cclxuICAgIC8vIFN1YmZvcm1FeGVjTW9kZSBpcyBjaGFuZ2VkIGluIHJlY29yZCBwcmVmaXggYW5kIGl0IGlzIHRoZSBzYW1lIHVudGlsIHRoZVxyXG4gICAgLy8gbmV4dCByZWNvcmQgcHJlZml4IGV4ZWN1dGlvbiwgYmVjYXVzZSB3ZSBkbyBub3Qgb3BlbiBhIHN1YmZvcm0gdGFzayBlYWNoIHRpbWVcclxuICAgIC8vIGluIFJDIGFzIGl0IGlzIGluIE9ubGluZS4gQnV0IHdoZW4gdGhlIHN1YmZvcm0gaXMgcmVmcmVzaGVkIGZyb20gdGhlIHBhcmVudFxyXG4gICAgLy8gaXRzIHJlY29yZCBwcmVmaXggJiBzdWZmaXggYXJlIGFsc28gZXhlY3V0ZWQuXHJcbiAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCAmJiB0YXNrLklzU3ViRm9ybSAmJiB0YXNrLlN1YmZvcm1FeGVjTW9kZSAhPT0gVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLkZJUlNUX1RJTUUpLy8gRklSU1RfVElNRSBpcyBzZXQgb25seSBvbmNlIGluXHJcbiAgICAvLyBkb0ZpcnN0UmVjb3JkQ3ljbGUuXHJcbiAgICB7XHJcbiAgICAgIHRhc2suU3ViZm9ybUV4ZWNNb2RlID0gKHN1YmZvcm1SZWZyZXNoID8gVGFza19TdWJmb3JtRXhlY01vZGVFbnVtLlJFRlJFU0ggOiBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uU0VUX0ZPQ1VTKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmb3IgdGhlIHN1YmZvcm0gcmVmcmVzaCBpdCBpcyBuZWVkZWQgdG8gZXhlY3V0ZSBNR19BQ1RfUE9TVF9SRUZSRVNIX0JZX1BBUkVOVCBoYW5kbGVyIGJlZm9yZSBSRUNPUkRfUFJFRklYIGhhbmRsZXJcclxuICAgIGlmIChzdWJmb3JtUmVmcmVzaClcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2soaXRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9QT1NUX1JFRlJFU0hfQllfUEFSRU5UKTtcclxuXHJcbiAgICBpZiAodGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSkge1xyXG4gICAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCB8fCBldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKSB7XHJcbiAgICAgICAgaWYgKGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpXHJcbiAgICAgICAgICBhd2FpdCB0YXNrLmVtcHR5RGF0YXZpZXdPcGVuKHN1YmZvcm1SZWZyZXNoKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0YXNrLmVtcHR5RGF0YXZpZXdDbG9zZSgpO1xyXG5cclxuICAgICAgICBpZiAodGFzay5nZXRGb3JtKCkgIT09IG51bGwpIHtcclxuICAgICAgICAgIGlmIChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKVxyXG4gICAgICAgICAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICB0YXNrLmdldEZvcm0oKS5TZWxlY3RSb3coKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kRXZlbnRTdWJ0eXBlKHRhc2ssIGV2ZW50Q29kZSwgRXZlbnRTdWJUeXBlLk5vcm1hbCk7XHJcbiAgICB9IGVsc2VcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRFdmVudFN1YnR5cGUodGFzaywgZXZlbnRDb2RlLCBFdmVudFN1YlR5cGUuTm9ybWFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhY3RpdmF0ZSBoYW5kbGVJbnRlcm5hbEV2ZW50IHdpdGggaXNRdWl0ID0gZmFsc2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmEgcmVmZXJlbmNlIHRvIHRoZSBjb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldmVudENvZGVcIj50aGUgY29kZSBvZiB0aGUgZXZlbnQgPC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UoY3RybDogTWdDb250cm9sQmFzZSwgZXZlbnRDb2RlOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2woPE1nQ29udHJvbD5jdHJsLCBldmVudENvZGUsIEV2ZW50U3ViVHlwZS5Ob3JtYWwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIFwic3RvcCBleGVjdXRpb25cIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBHZXRTdG9wRXhlY3V0aW9uRmxhZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zdG9wRXhlY3V0aW9uO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgY3RybCBvbiB3aGljaCB3ZSBoYWQgYSBcInN0b3AgZXhlY3V0aW9uXCJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZ2V0U3RvcEV4ZWN1dGlvbkN0cmwoKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RvcEV4ZWN1dGlvbkN0cmw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW5pdGlhbGl6ZXMgdGhlIHN0YXRpYyBzZWN0aW9uIG9mIHRoZSBldmVudHMgbWFuYWdlci4gVXN1YWxseSBkb2VzIG5vdGhpbmcgYnV0IGluIHRoZVxyXG4gIC8vLyAgIGV2ZW50IG9mIGFwcGxldCByZS1sb2FkIChmb3IgZXhhbXBsZSwgYmVjYXVzZSBvZiBhIGJyb3dzZXIgcmVmcmVzaCkgaXQgaW5pdGlhbGl6ZXMgdGhlXHJcbiAgLy8vICAgc3RhdGljIHBhcnQgb2YgdGhpcyBjbGFzcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQpIHtcclxuICAgICAgdGhpcy5faXNIYW5kbGluZ0ZvcmNlRXhpdCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9mb3JjZUV4aXQgPSBGb3JjZUV4aXQuTm9uZTtcclxuICAgICAgdGhpcy5fZm9yY2VFeGl0VGFzayA9IG51bGw7XHJcbiAgICAgIHRoaXMuX2N1cnJGaWVsZCA9IG51bGw7XHJcbiAgICAgIHRoaXMuc2V0RW5kT2ZXb3JrKHRydWUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEFkZCBpbnRlcm5hbCBldmVudCB0byB0aGUgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXRhc2tcIj50YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj5jb2RlIG9mIGludGVybmFsIGV2ZW50PC9wYXJhbT5cclxuICBhZGRJbnRlcm5hbEV2ZW50V2l0aEl0YXNrQW5kQ29kZShpdGFzazogSVRhc2ssIGNvZGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5hZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhUYXNrQW5kQ29kZUFuZE9uTXVsdGlNYXJrKGl0YXNrLCBjb2RlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFkZEludGVybmFsRXZlbnRXaXRoQ3RybEFuZENvZGUoY3RybDogTWdDb250cm9sQmFzZSwgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPE1nQ29udHJvbD5jdHJsKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kRGlzcGxheUxpbmVBbmRDb2RlKGN0cmw6IE1nQ29udHJvbEJhc2UsIERpc3BsYXlMaW5lOiBudW1iZXIsIGNvZGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KDxNZ0NvbnRyb2w+Y3RybCwgRGlzcGxheUxpbmUsIGZhbHNlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicHJpb3JpdHlcIj48L3BhcmFtPlxyXG4gIGFkZEludGVybmFsRXZlbnRXaXRoQ3RybEFuZENvZGVBbmRQcmlvcml0eShjdHJsOiBNZ0NvbnRyb2xCYXNlLCBjb2RlOiBudW1iZXIsIHByaW9yaXR5OiBQcmlvcml0eSk6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KDxNZ0NvbnRyb2w+Y3RybCk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHJ0RXZ0LnNldFByaW9yaXR5KHByaW9yaXR5KTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gYWRkIGd1aSB0cmlnZ2VyZWQgZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIml0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbk11bHRpTWFya1wiPjwvcGFyYW0+XHJcbiAgYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoVGFza0FuZENvZGVBbmRPbk11bHRpTWFyayhpdGFzazogSVRhc2ssIGNvZGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5pdGFzaztcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCh0YXNrKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB3aWxsIGJlIHVzZWQgZm9yIG11bHRpbWFya2luZyBpbiB0aGUgZnV0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb2RpZmllcnNcIj48L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aEN0cmxBbmRDb2RlQW5kTGluZUFuZE1vZGlmaWVyKGN0cmw6IE1nQ29udHJvbEJhc2UsIGNvZGU6IG51bWJlciwgbGluZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPE1nQ29udHJvbD5jdHJsLCBsaW5lLCBmYWxzZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBBZGQgaW50ZXJuYWwgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IEdVSSBxdWV1ZSAoaW5jbHVkZXMgdGltZXIgZXZlbnRzKSB0byB0aGUgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPmNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj5jb2RlIG9mIGludGVybmFsIGV2ZW50IDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+bGluZSBpbiBhIHRhYmxlIGNvbnRyb2wgPC9wYXJhbT5cclxuICBhZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhUYXNrQW5kQ29kZUFuZExpbmUodGFzazogVGFzaywgY29kZTogbnVtYmVyLCBsaW5lOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCB0c2s6IFRhc2sgPSBudWxsO1xyXG4gICAgaWYgKHRhc2sgIT09IG51bGwpXHJcbiAgICAgIHRzayA9IDxUYXNrPnRhc2s7XHJcblxyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KHRzayk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHJ0RXZ0LkRpc3BsYXlMaW5lID0gbGluZTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaGFuZGxlIENvbHVtbiBDbGljayBldmVudCBvbiBDb2x1bW4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aUNvbHVtbkN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRpcmVjdGlvblwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29sdW1uSGVhZGVyXCI+PC9wYXJhbT5cclxuICBBZGRDb2x1bW5DbGlja0V2ZW50KGNvbHVtbkN0cmw6IE1nQ29udHJvbEJhc2UsIGRpcmVjdGlvbjogbnVtYmVyLCBjb2x1bW5IZWFkZXI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KDxNZ0NvbnRyb2w+Y29sdW1uQ3RybCwgZGlyZWN0aW9uLCAwKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT0xfQ0xJQ0spO1xyXG5cclxuICAgIC8vIFByZXBhcmUgYW4gYXJndW1lbnQgbGlzdCB3aXRoIGFyZ3VtZW50IGFzIGNvbHVtbkhlYWRlclN0cmluZy5cclxuICAgIGxldCBhcmdzTGlzdCA9IG5ldyBBcnJheTxFeHBWYWw+KCk7XHJcbiAgICBhcmdzTGlzdFswXSA9IG5ldyBFeHBWYWwoU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFLCBmYWxzZSwgY29sdW1uSGVhZGVyKTtcclxuICAgIGxldCBhcmdzID0gbmV3IEFyZ3VtZW50c0xpc3QoYXJnc0xpc3QpO1xyXG4gICAgcnRFdnQuc2V0QXJnTGlzdChhcmdzKTtcclxuXHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICBBZGRSb3V0ZUV2ZW50KHRhc2s6IElUYXNrLCBjb2RlOiBudW1iZXIsIHJvdXRlcnBhdGg6IHN0cmluZywgcm91dGVyT3V0bGV0TmFtZTogc3RyaW5nLCByb3V0ZVBhcmFtczogTGlzdDxhbnk+KSB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPFRhc2s+dGFzaywgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuXHJcbiAgICBsZXQgYXJnc0xpc3Q6IEV4cFZhbFtdID0gbmV3IEFycmF5PEV4cFZhbD4oMik7XHJcbiAgICBhcmdzTGlzdFswXSA9IG5ldyBFeHBWYWwoU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSwgZmFsc2UsIHJvdXRlcnBhdGgpO1xyXG4gICAgaWYgKHJvdXRlck91dGxldE5hbWUgPT09IG51bGwpXHJcbiAgICAgIHJvdXRlck91dGxldE5hbWUgPSBcIlwiO1xyXG4gICAgYXJnc0xpc3RbMV0gPSBuZXcgRXhwVmFsKFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEsIGZhbHNlLCByb3V0ZXJPdXRsZXROYW1lKTtcclxuXHJcbiAgICBsZXQgYXJncyA9IG5ldyBBcmd1bWVudHNMaXN0KGFyZ3NMaXN0KTtcclxuICAgIHJ0RXZ0LnNldEFyZ0xpc3QoYXJncyk7XHJcbiAgICBydEV2dC5zZXRSb3V0ZVBhcmFtTGlzdChyb3V0ZVBhcmFtcyk7XHJcblxyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgQWRkUm91dGVyQ2xvc2VkRXZlbnQodGFzazogVGFzaykge1xyXG4gICAgbGV0IHN1YkZvcm1Db250cm9sOiBNZ0NvbnRyb2xCYXNlID0gPE1nQ29udHJvbEJhc2U+dGFzay5nZXRGb3JtKCkuZ2V0U3ViRm9ybUN0cmwoKTtcclxuICAgIGxldCBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoPFRhc2tCYXNlPnN1YkZvcm1Db250cm9sLmdldEZvcm0oKS5nZXRUYXNrKCksIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NVQkZPUk1fQ0xPU0UpO1xyXG5cclxuICAgIGxldCBhcmdzTGlzdDogRXhwVmFsW10gPSBuZXcgQXJyYXk8RXhwVmFsPigxKTtcclxuICAgIGFyZ3NMaXN0WzBdID0gbmV3IEV4cFZhbChTdG9yYWdlQXR0cmlidXRlLkFMUEhBLCBmYWxzZSwgc3ViRm9ybUNvbnRyb2wuZ2V0TmFtZSgpKTtcclxuXHJcbiAgICBsZXQgYXJncyA9IG5ldyBBcmd1bWVudHNMaXN0KGFyZ3NMaXN0KTtcclxuICAgIHJ0RXZ0LnNldEFyZ0xpc3QoYXJncyk7XHJcbiAgICBFdmVudHNNYW5hZ2VyLkluc3RhbmNlLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGFkZCBsYXN0IHNhdmVkIHJvdXRlIGV2ZW50IDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzcmNUYXNrU3RyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJhcmdMaXN0U3RyXCI+PC9wYXJhbT5cclxuICBBZGRMYXN0U2F2ZWRSb3V0ZUV2ZW50IChzcmNUYXNrOiBUYXNrLCBhcmdzOiBBcmd1bWVudHNMaXN0ICkge1xyXG4gICAgbGV0IHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudCg8VGFza0Jhc2U+TGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpLCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9XRUJDTElFTlRfUk9VVEUpO1xyXG5cclxuICAgIGlmIChzcmNUYXNrICE9IG51bGwpIHtcclxuICAgICAgcnRFdnQuc2V0VGFzayhzcmNUYXNrKTtcclxuICAgICAgaWYgKGFyZ3MgIT0gbnVsbCkge1xyXG4gICAgICAgIHJ0RXZ0LnNldEFyZ0xpc3QoYXJncyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZXRMYXN0U2F2ZWRSb3V0ZUV2ZW50KHJ0RXZ0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gIEFkZCBpbnRlcm5hbCBldmVudCBybyBzZXQgdGhlIHZhbHVlIG9mIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPiBjb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWx1ZVwiPiB2YWx1ZSBvZiBjb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWZyZXNoRGlzcGxheVwiPiByZWZyZXNoIGRpc3BsYXkgPC9wYXJhbT5cclxuICBBZGRFeHRlcm5hbFZhbHVlRXZlbnQoY3RybDogTWdDb250cm9sICwgdmFsdWU6IGFueSwgcmVmcmVzaERpc3BsYXk6IGJvb2xlYW4pIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsLCAwLCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRVRfRVhURVJOQUxfVkFMVUUpO1xyXG4gICAgcnRFdnQuc2V0VmFsdWUodmFsdWUpO1xyXG5cclxuICAgIGxldCBhcmdzTGlzdDogRXhwVmFsW10gPSBuZXcgQXJyYXk8RXhwVmFsPigxKTtcclxuICAgIGFyZ3NMaXN0WzBdID0gbmV3IEV4cFZhbChTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU4sIGZhbHNlLCByZWZyZXNoRGlzcGxheSA/ICcxJyA6ICcwJyk7XHJcbiAgICBsZXQgYXJncyA9IG5ldyBBcmd1bWVudHNMaXN0KGFyZ3NMaXN0KTtcclxuICAgIHJ0RXZ0LnNldEFyZ0xpc3QoYXJncylcclxuXHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQWRkIGludGVybmFsIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSBHVUkgcXVldWUgKGluY2x1ZGVzIHRpbWVyIGV2ZW50cykgdG8gdGhlIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+Y29kZSBvZiBpbnRlcm5hbCBldmVudCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPmxpbmUgaW4gYSB0YWJsZSBjb250cm9sIDwvcGFyYW0+XHJcbiAgYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoQ3RybEFuZENvZGVBbmRMaW5lKGN0cmw6IE1nQ29udHJvbEJhc2UsIGNvZGU6IG51bWJlciwgbGluZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCwgbGluZSwgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBBZGQgaW50ZXJuYWwgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IEdVSSBxdWV1ZSAoaW5jbHVkZXMgdGltZXIgZXZlbnRzKSB0byB0aGUgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj50aGUgbGluZSBmb3IgbXVsdGlsaW5lIGNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj5jb2RlIG9mIGludGVybmFsIGV2ZW50IDwvcGFyYW0+XHJcbiAgYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoQ3RybEFuZExpbmVBbmRDb2RlQW5kSXNQcm9kdWN0Q2xpY2soY3RybDogTWdDb250cm9sQmFzZSwgY29kZTogbnVtYmVyLCBsaW5lOiBudW1iZXIsIGlzUHJvZHVjZUNsaWNrOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCwgbGluZSwgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHJ0RXZ0LnNldFByb2R1Y2VDbGljayhpc1Byb2R1Y2VDbGljayk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQWRkIGludGVybmFsIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSBHVUkgcXVldWUgKGluY2x1ZGVzIHRpbWVyIGV2ZW50cykgdG8gdGhlIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+Y29kZSBvZiBpbnRlcm5hbCBldmVudCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGlzdFwiPjwvcGFyYW0+XHJcbiAgYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoQ3RybEFuZENvZGVBbmRMaXN0KGN0cmw6IE1nQ29udHJvbEJhc2UsIGNvZGU6IG51bWJlciwgbGlzdDogTGlzdDxNZ0NvbnRyb2xCYXNlPik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwsIGxpc3QsIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IEFkZCBpbnRlcm5hbCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgR1VJIHF1ZXVlIHRvIHRoZSBxdWV1ZSA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+cmVmZXJlbmNlIHRvIHRoZSB0YXNrIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+Y29kZSBvZiBpbnRlcm5hbCBldmVudCA8L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aFRhc2tBbmRDb2RlKHRhc2s6IElUYXNrLCBjb2RlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCg8VGFzaz50YXNrLCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBBZGQgaW50ZXJuYWwgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IEdVSSBxdWV1ZSB0byB0aGUgcXVldWUgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJhaXNlZEJ5XCI+cmVsZXZhbnQgb25seSBmb3Igb25saW5lIChmb3Igd2hpY2ggc3ViZm9ybSBhcmUgaGFuZGxlZCBhcyBvcnBoYW5zKTwvcGFyYW0+XHJcbiAgYWRkR3VpVHJpZ2dlcmVkRXZlbnRUYXNrQW5kQ29kZUFuZFJhaXNlZEJ5KHRhc2s6IElUYXNrLCBjb2RlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoVGFza0FuZENvZGUodGFzaywgY29kZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgZmlyc3QgZXZlbnQgZnJvbSB0aGUgcXVldWUgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldEV2ZW50KCk6IFJ1blRpbWVFdmVudCB7XHJcbiAgICByZXR1cm4gPFJ1blRpbWVFdmVudD50aGlzLl9ldmVudHNRdWV1ZS5wb2xsKCk7XHJcbiAgfVxyXG5cclxuICBnZXRGb3JjZUV4aXQoKTogRm9yY2VFeGl0IHtcclxuICAgIHJldHVybiB0aGlzLl9mb3JjZUV4aXQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEZvcmNlRXhpdChmb3JjZUV4aXQ6IEZvcmNlRXhpdCwgdGFzazogVGFzayk6IHZvaWQge1xyXG4gICAgdGhpcy5fZm9yY2VFeGl0ID0gZm9yY2VFeGl0O1xyXG4gICAgdGhpcy5zZXRGb3JjZUV4aXRUYXNrKHRhc2spO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGb3JjZUV4aXRUYXNrKCk6IFRhc2sge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZvcmNlRXhpdFRhc2s7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEZvcmNlRXhpdFRhc2sodGFzazogVGFzayk6IHZvaWQge1xyXG4gICAgdGhpcy5fZm9yY2VFeGl0VGFzayA9IHRhc2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiByZXR1cm5zIHRydWUgaWYgdGhlIEV2ZW50c01hbmFnZXIgaXMgY3VycmVudGx5IGhhbmRsaW5nIGEgdXNlciBldmVudCB3aXRoXHJcbiAgICogRm9yY2UgRXhpdCA9ICdQcmUtUmVjb3JkIFVwZGF0ZSdcclxuICAgKi9cclxuICBpc0ZvcmNlRXhpdFByZVJlY29yZFVwZGF0ZSh0YXNrOiBUYXNrQmFzZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQgJiYgdGhpcy5nZXRGb3JjZUV4aXQoKSA9PT0gRm9yY2VFeGl0LlByZVJlY29yZFVwZGF0ZSAmJiB0YXNrID09PSB0aGlzLmdldEZvcmNlRXhpdFRhc2soKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRXhlY3V0ZSBDbGllbnRDb250ZXh0SW5hY3Rpdml0eSBUaW1lclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgRXhlY3V0ZUNsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZXIoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgc3RhcnRUaW1lID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuICAgIGxldCBjdXJyVGltZTtcclxuICAgIC8vIGNvbnZlcnQgdGVudGhzIG9mIHNlY29uZHMgdG8gbWlsbGlzZWNvbmRzLlxyXG4gICAgbGV0IGNsaWVudEN0eEluYWN0aXZpdHlUaW1lb3V0ID1cclxuICAgICAgRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0Q2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lb3V0KCkgKiAxMDA7XHJcblxyXG4gICAgRXZlbnRzTWFuYWdlci5jbGllbnRJbmFjdGl2aXR5VGltZXJPTiA9IHRydWU7XHJcbiAgICB3aGlsZSAoRXZlbnRzTWFuYWdlci5jbGllbnRJbmFjdGl2aXR5VGltZXJPTiApIHtcclxuICAgICAgICAgYXdhaXQgVGhyZWFkLlNsZWVwKDEwMDApO1xyXG4gICAgICAgICB2YXIgdGltZUxhcHNlZCA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgLSBzdGFydFRpbWU7XHJcbiAgICAgICAgIGlmIChFdmVudHNNYW5hZ2VyLmNsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZXJBYm9ydGVkIHx8IHRpbWVMYXBzZWQgPj0gY2xpZW50Q3R4SW5hY3Rpdml0eVRpbWVvdXQpIHtcclxuICAgICAgICAgICAgRXZlbnRzTWFuYWdlci5jbGllbnRJbmFjdGl2aXR5VGltZXJPTiA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2hvdyBvciBoaWRlIHRoZSBzcGlubmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNob3dcIj4gPC9wYXJhbT5cclxuICBhc3luYyBDaGVja0FuZFNob3dTcGlubmVyKHNob3c6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+XHJcbiAge1xyXG4gICAgbGV0IHNlbmRDb21tYW5kID0gZmFsc2U7XHJcblxyXG4gICAgLy8gSWYgdGhlIGN1cnJlbnQgZXZlbnQgaXMgb2YgbG93ZXN0IHByaW9yaXR5LCBpdCBpcyBhY3R1YWxseSBzYWZlIHRvIG9wZW4gdXNlciBpbnRlcmFjdGlvbi5cclxuICAgIC8vIFNvLCBzdG9wIHRoZSBzcGlubmVyLlxyXG4gICAgaWYgKHRoaXMuZ2V0TGFzdFJ0RXZlbnQoKSAhPT0gbnVsbCAmJiB0aGlzLmdldExhc3RSdEV2ZW50KCkuZ2V0UHJpb3JpdHkoKSA9PT0gUHJpb3JpdHkuTE9XRVNUKVxyXG4gICAgICBzaG93ID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHNob3cgIT0gdGhpcy5pc1NwaW5uZXJTaG93bikge1xyXG4gICAgICBpZiAoc2hvdykge1xyXG4gICAgICAgIC8vIFNob3cgdGhlIHNwaW5uZXIgb25seSBpZiB0aHJlc2hvbGQgaXMgcmVhY2hlZC5cclxuICAgICAgICAvL1RvRG86IERlZmluZSBhIGNvbnN0IGZvciAxMDAwLiBBbHNvIG1ha2UgaXQgY3VzdG9taXphYmxlIGZyb20gYW5ndWxhciBhcHBcclxuICAgICAgICBpZiAoTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKSAtIHRoaXMuR2V0RXZlbnRUaW1lKCkgPiAxMDAwKSB7XHJcbiAgICAgICAgICBzZW5kQ29tbWFuZCA9IHRydWU7XHJcbiAgICAgICAgICBFdmVudHNNYW5hZ2VyLmNsaWVudEJ1c3lUaW1lU3RhcnQgPSAgTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHNlbmRDb21tYW5kID0gdHJ1ZTtcclxuXHJcbiAgICAgIGlmIChzZW5kQ29tbWFuZCkge1xyXG4gICAgICAgIENvbW1hbmRzLmFkZFNob3dTcGlubmVyKHNob3cpO1xyXG4gICAgICAgIENvbW1hbmRzLmJlZ2luSW52b2tlKCk7XHJcbiAgICAgICAgLy8gcmVsZWFzZSB0aGUgdGhyZWFkIHNvIHRoYXQgZnJhbWV3b3JrIGNhbiBzaG93L2hpZGUgdGhlIHNwaW5uZXJcclxuICAgICAgICBhd2FpdCBUaHJlYWQuU2xlZXAoNTApO1xyXG5cclxuICAgICAgICB0aGlzLmlzU3Bpbm5lclNob3duID0gc2hvdztcclxuXHJcbiAgICAgICAgaWYoIXRoaXMuaXNTcGlubmVyU2hvd24pIHtcclxuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgdGltZSBmb3Igd2hpY2ggY2xpZW50IHdhcyBidXN5XHJcbiAgICAgICAgICBsZXQgdG90YWxDbGllbnRCdXN5VGltZSA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgLSBFdmVudHNNYW5hZ2VyLmNsaWVudEJ1c3lUaW1lU3RhcnQ7XHJcbiAgICAgICAgICB0aGlzLlNwaW5uZXJTdG9wcGVkLm5leHQodG90YWxDbGllbnRCdXN5VGltZSk7XHJcbiAgICAgICAgICBFdmVudHNNYW5hZ2VyLmNsaWVudEJ1c3lUaW1lU3RhcnQgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIE1haW4gZXZlbnRzIGxvb3AsIHJ1bnMgaW4gd29ya2VyIHRocmVhZCBmb3IgbWFpbiB3aW5kb3cgYW5kIGZvciBldmVyeVxyXG4gIC8vLyAgIG1vZGFsIHdpbmRvdyBSZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgZXZlbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nRGF0YVwiPiA8L3BhcmFtPlxyXG4gIGFzeW5jIEV2ZW50c0xvb3AobWdEYXRhOiBNR0RhdGEpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzYXZlZEFsbG93RXZlbnRzOiBFdmVudHNBbGxvd2VkVHlwZSA9IHRoaXMuZ2V0QWxsb3dFdmVudHMoKTtcclxuXHJcbiAgICB0aGlzLnNldEFsbG93RXZlbnRzKEV2ZW50c0FsbG93ZWRUeXBlLkFMTCk7XHJcblxyXG4gICAgdGhpcy5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG5cclxuICAgIHdoaWxlKCFtZ0RhdGEuSXNBYm9ydGluZylcclxuICAgIHtcclxuICAgICAgLy8gSGlkZSB0aGUgc3Bpbm5lciBiZWZvcmUgbW92aW5nIHRvIGlkbGVcclxuICAgICAgYXdhaXQgdGhpcy5DaGVja0FuZFNob3dTcGlubmVyKGZhbHNlKTtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuX2V2ZW50c1F1ZXVlLndhaXRGb3JFbGVtZW50KCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnRzKG1nRGF0YSwgMCk7XHJcblxyXG4gICAgaWYgKCFtZ0RhdGEuSXNBYm9ydGluZylcclxuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrUGFya2FiaWxpdHkoKTtcclxuXHJcbiAgfVxyXG5cclxuICAgIHRoaXMucG9wTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgdGhpcy5zZXRBbGxvd0V2ZW50cyhzYXZlZEFsbG93RXZlbnRzKTtcclxuICAgIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIE5vbiBpbnRlcmFjdGl2ZSBldmVudHMgbG9vcCwgcnVucyBpbiB3b3JrZXIgdGhyZWFkIGZvciBub24gaW50ZXJhY3RpdmUgdGFza3NcclxuICAvLy8gICBSZXNwb25zaWJsZSBmb3IgY3ljbGluZyBmb3J3YXJkIG9uIHJlY29yZHMgYW5kIGhhbmRsaW5nIGV2ZW50cy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdEYXRhXCI+PC9wYXJhbT5cclxuICBhc3luYyBOb25JbnRlcmFjdGl2ZUV2ZW50c0xvb3AobWdEYXRhOiBNR0RhdGEsIHRhc2tCYXNlOiBUYXNrQmFzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz50YXNrQmFzZTtcclxuICAgIGxldCBzYXZlZEFsbG93RXZlbnRzOiBFdmVudHNBbGxvd2VkVHlwZSA9IHRoaXMuZ2V0QWxsb3dFdmVudHMoKTtcclxuXHJcbiAgICB0aGlzLnNldE5vbkludGVyYWN0aXZlQWxsb3dFdmVudHMoYXdhaXQgdGFzay5pc0FsbG93RXZlbnRzKCkpO1xyXG5cclxuICAgIHRoaXMucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuXHJcbiAgICB3aGlsZSAoIW1nRGF0YS5Jc0Fib3J0aW5nKSB7XHJcbiAgICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NZQ0xFX05FWFRfREVMRVRFX1JFQyk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1lDTEVfTkVYVF9SRUMpO1xyXG5cclxuICAgICAgYXdhaXQgVGhyZWFkLlNsZWVwKDEwKTtcclxuXHJcbiAgICAgIC8vIHBvbGwgb25seSAxIGV2ZW50LlxyXG4gICAgICBpZiAoIW1nRGF0YS5Jc0Fib3J0aW5nICYmIGF3YWl0IHRhc2suaXNBbGxvd0V2ZW50cygpKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnRzKG1nRGF0YSwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICB0aGlzLnNldEFsbG93RXZlbnRzKHNhdmVkQWxsb3dFdmVudHMpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaGFuZGxlRXZlbnRzKGJhc2VNZ0RhdGE6IE1HRGF0YSwgZXZlbnRzVG9IYW5kbGVDbnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4gO1xyXG4gIGFzeW5jIGhhbmRsZUV2ZW50cyhoYW5kbGVyc1RhYjogSGFuZGxlcnNUYWJsZSwgcnRFdnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4gO1xyXG4gIGFzeW5jIGhhbmRsZUV2ZW50cyhiYXNlTWdEYXRhT3JIYW5kbGVyc1RhYjogYW55LCBldmVudHNUb0hhbmRsZUNudE9yUnRFdnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKChiYXNlTWdEYXRhT3JIYW5kbGVyc1RhYiA9PT0gbnVsbCB8fCBiYXNlTWdEYXRhT3JIYW5kbGVyc1RhYiBpbnN0YW5jZW9mIE1HRGF0YSkgJiYgKGV2ZW50c1RvSGFuZGxlQ250T3JSdEV2dCA9PT0gbnVsbCB8fCBldmVudHNUb0hhbmRsZUNudE9yUnRFdnQuY29uc3RydWN0b3IgPT09IE51bWJlcikpIHtcclxuICAgICBhd2FpdCAgdGhpcy5oYW5kbGVFdmVudHNfMChiYXNlTWdEYXRhT3JIYW5kbGVyc1RhYiwgZXZlbnRzVG9IYW5kbGVDbnRPclJ0RXZ0KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudHNfMShiYXNlTWdEYXRhT3JIYW5kbGVyc1RhYiwgZXZlbnRzVG9IYW5kbGVDbnRPclJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYW5kIHJlbW92ZSBldmVudHMgZnJvbSB0aGUgcXVldWUgYW5kIGhhbmRsZSB0aGVtIG9uZSBieSBvbmUgdGlsbCB0aGUgcXVldWUgaXMgZW1wdHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYmFzZU1nRGF0YVwiPiBtZ2RhdGEgb2YgdGhlIHdpbmRvdyB0aGF0IG9wZW5lZGVkIHRoYXQgaGFiZGxlIGV2ZW50PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIkV2ZW50c1RvSGFuZGxlQ250XCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUV2ZW50c18wKGJhc2VNZ0RhdGE6IE1HRGF0YSwgZXZlbnRzVG9IYW5kbGVDbnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgbGV0IGRlbHRhOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGV2ZW50c1BvbGxlZENudDogbnVtYmVyID0gMDtcclxuXHJcbiAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG5cclxuICAgIC8vIGdldCBhbmQgcmVtb3ZlIGV2ZW50cyBmcm9tIHRoZSBxdWV1ZSB0aWxsIGl0cyBlbXB0eVxyXG4gICAgd2hpbGUgKCF0aGlzLl9ldmVudHNRdWV1ZS5pc0VtcHR5KCkgJiYgIXRoaXMuX3N0b3BFeGVjdXRpb24gJiYgKGV2ZW50c1RvSGFuZGxlQ250ID09PSAwIHx8IGV2ZW50c1BvbGxlZENudCA8IGV2ZW50c1RvSGFuZGxlQ250KSkge1xyXG4gICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IHRoaXMuZ2V0RXZlbnQoKTtcclxuICAgICAgaWYgKHJ0RXZ0ICE9PSBudWxsICYmIHJ0RXZ0LmlzR3VpVHJpZ2dlcmVkRXZlbnQoKSkge1xyXG4gICAgICAgIGRlbHRhID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuICAgICAgICB0aGlzLl9jdXJyS2JkSXRlbSA9IG51bGw7XHJcblxyXG4gICAgICAgIGxldCBibG9ja2VkQnlNb2RhbFdpbmRvdzogYm9vbGVhbiA9IHJ0RXZ0LmlzQmxvY2tlZEJ5TW9kYWxXaW5kb3coYmFzZU1nRGF0YSk7XHJcbiAgICAgICAgaWYgKGJsb2NrZWRCeU1vZGFsV2luZG93ICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVElNRVIpIC8vIFFDUiAjNzI2MTk4LCBldmVudHMgZnJvbSAuTkVUIG9iamVjdHMgd2hpY2ggYXJlIG5vdCBvbiBmb3JtXHJcbiAgICAgICAgLy8gc2hvdWxkIGJlIGhhbmRsZWQgb24gcGFyZW50IG9mIG1vZGFsIHdpbmRvdyBhbHNvXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZGxlIHRpbWVyLCB0aW1lciBldmVudHMgYW5kIGVuYWJsZS9kaXNhYmxlIGV2ZW50cyBzaG91bGQgbm90IGNoYW5nZSB0aGUgY3VycmVudCB3aW5kb3cuXHJcbiAgICAgICAgLy8gVGhpcyBpcyBiZWNhdXNlIHRoZSBjdXJyZW50IHdpbmRvdyBkZXRlcm1pbmVzIHRoZSBjdXJyZW50IHRhc2sgYW5kIGNoYW5naW5nIHRoZSB0YXNrXHJcbiAgICAgICAgLy8gY2F1c2VzIHNvbWUgdGFzay1zY29wZWQgZXZlbnRzIHRvIHJ1biBvbiBzdWItdGFza3MgYXMgd2VsbC5cclxuICAgICAgICBpZiAoIXJ0RXZ0LmlzSWRsZVRpbWVyKCkgJiYgIWJsb2NrZWRCeU1vZGFsV2luZG93ICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU5BQkxFX0VWRU5UUyAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RJU0FCTEVfRVZFTlRTICYmIHJ0RXZ0LmdldFRhc2soKSAhPT0gbnVsbCAmJiAhcnRFdnQuZ2V0VGFzaygpLmdldE1HRGF0YSgpLklzQWJvcnRpbmcpIHtcclxuICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gcnRFdnQuZ2V0VGFzaygpLmdldE1HRGF0YSgpLkdldElkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBjdXJyTWdkOiBNR0RhdGEgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldEN1cnJNR0RhdGEoKTtcclxuICAgICAgaWYgKGN1cnJNZ2QgIT09IG51bGwpIHtcclxuICAgICAgICB3aGlsZSAoY3Vyck1nZCAhPT0gbnVsbCAmJiBjdXJyTWdkLklzQWJvcnRpbmcpIHtcclxuICAgICAgICAgIGN1cnJNZ2QgPSBjdXJyTWdkLmdldFBhcmVudE1HZGF0YSgpO1xyXG4gICAgICAgICAgaWYgKGN1cnJNZ2QgIT09IG51bGwpXHJcbiAgICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRNZ0RhdGFJZHgoY3Vyck1nZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8qIFFDUnMgIzc3NzIxNyAmICM5NDI5NjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgLyogSXQgbWlnaHQgaGFwcGVuIHRoYXQgd2UgaGF2ZSByZW1vdmVkIHRoZSBNR0RhdGEgICAgKi9cclxuICAgICAgICAvKiBmcm9tIHRoZSBNR1RhYmxlIGluIE1hbmFnZXIuQ2xvc2VFdmVudCgpLiAgKi9cclxuICAgICAgICAvKiBJdCB3YXMgZG9uZSBmb3IgZml4aW5nIFFDUiMgMjk2Mjc3IHJlbGF0aW5nIHRvIG1lbSAqL1xyXG4gICAgICAgIC8qIGxlYWtzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgLyogSW4gdGhhdCBjYXNlLCBtZ2Qgd291bGQgYmUgbnVsbCBoZXJlLiAgICAgICAgICAgICAgKi9cclxuICAgICAgICAvKiBJbiBzdWNoIGEgc2NlbmFyaW8sIHRha2UgdGhlIHBhcmVudCBtZ2QgZnJvbSB0aGUgICAqL1xyXG4gICAgICAgIC8qIHJlbGF0ZWQgdGFzayBhbmQgY29udGludWUgcHJvY2Vzc2luZyB0aGUgZXZlbnRzLiAgICovXHJcbiAgICAgICAgdGFzayA9IDxUYXNrPnJ0RXZ0LmdldFRhc2soKTtcclxuICAgICAgICB3aGlsZSAoY3Vyck1nZCA9PT0gbnVsbCAmJiB0YXNrICE9PSBudWxsICYmIHRhc2suZ2V0UGFyZW50KCkgIT09IG51bGwpIHtcclxuICAgICAgICAgIHRhc2sgPSA8VGFzaz50YXNrLmdldFBhcmVudCgpO1xyXG4gICAgICAgICAgY3Vyck1nZCA9IHRhc2suZ2V0TUdEYXRhKCk7XHJcbiAgICAgICAgICBpZiAoY3Vyck1nZC5Jc0Fib3J0aW5nKVxyXG4gICAgICAgICAgICBjdXJyTWdkID0gbnVsbDtcclxuXHJcbiAgICAgICAgICBpZiAoY3Vyck1nZCAhPT0gbnVsbClcclxuICAgICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5jdXJyTWdkSUQgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldE1nRGF0YUlkeChjdXJyTWdkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGN1cnJNZ2QgPT09IG51bGwpXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBpZiAocnRFdnQuZ2V0VGFzaygpID09PSBudWxsKSB7XHJcbiAgICAgICAgdGFzayA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuICAgICAgICB3aGlsZSAodGFzayAhPT0gbnVsbCAmJiAodGFzay5pc0Fib3J0aW5nKCkgfHwgdGFzay5JbkVuZFRhc2spKVxyXG4gICAgICAgICAgdGFzayA9IDxUYXNrPnRhc2suZ2V0UGFyZW50KCk7XHJcblxyXG4gICAgICAgIGlmICh0YXNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBydEV2dC5zZXRDdHJsKDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpKTtcclxuICAgICAgICAgIHJ0RXZ0LnNldFRhc2sodGFzayk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2VcclxuICAgICAgICB0YXNrID0gPFRhc2s+cnRFdnQuZ2V0VGFzaygpO1xyXG5cclxuICAgICAgaWYgKHRhc2sgIT09IG51bGwpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEdVSU1hbmFnZXIuSW5zdGFuY2UuZXhlY0d1aUNvbW1hbmRRdWV1ZSgpO1xyXG4gICAgICB0aGlzLl9jdXJyQ3RybCA9IG51bGw7IC8vIGRlbGV0ZSBjdXJyZW50IHByb2Nlc3NlZCBjb250cm9sXHJcblxyXG4gICAgICBpZiAodGFzayAhPT0gbnVsbClcclxuICAgICAgICBhd2FpdCBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yLlNlbmRNb25pdG9yT25seSgpO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgbWFpblByb2c6IFRhc2sgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLkdldE1haW5Qcm9nQnlDdGxJZHgoMCk7XHJcbiAgICAgICAgYXdhaXQgVGFzay5Db21tYW5kc1Byb2Nlc3Nvci5TZW5kTW9uaXRvck9ubHkoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJ0RXZ0ICE9PSBudWxsICYmIHJ0RXZ0LmlzR3VpVHJpZ2dlcmVkRXZlbnQoKSkge1xyXG4gICAgICAgIC8vIGxvZ2dpbmcgZm9yIHBlcmZvcm1hbmNlXHJcbiAgICAgICAgaWYgKGRlbHRhID4gMCkge1xyXG4gICAgICAgICAgZGVsdGEgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpIC0gZGVsdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBhZHZhbmNlIEV2ZW50c1BvbGxlZCBvbmx5IGlmIHRoZSBldmVudCBpcyBpbnRlcm5hbC4gb3RoZXJ3aXNlIGludGVybmFscyB0byBiZSBleGVjdXRlZCB3aWxsIGJlIG5ldmVyIHJlYWNoZWQgYnkgbm9uIGludGVyYWN0aXZlIHRhc2tzLlxyXG4gICAgICBpZiAoZXZlbnRzVG9IYW5kbGVDbnQgPiAwICYmIHJ0RXZ0ICE9PSBudWxsICYmIHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiBydEV2dC5JbnRlcm5hbEV2ZW50IDwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RPVF9DTlQpXHJcbiAgICAgICAgZXZlbnRzUG9sbGVkQ250Kys7XHJcbiAgICB9IC8vIHdoaWxlICghX2V2ZW50c1F1ZXVlLmlzRW1wdHkoKSAuLi5cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlIHN0b3AgZXhlY3V0aW9uIHdoaWxlIGV4ZWN1dGluZyBhbnkgaGFuZGxlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVN0b3BFeGVjdXRpb24ocnRFdnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHN0b3A6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgcmV0dXJuIHN0b3A7XHJcblxyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ydEV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgY3VyckN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+cnRFdnQuQ29udHJvbDtcclxuICAgIGxldCBsYXN0UGFya2VkQ3RybDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgbGV0IGVuZFRhc2tEdWVUb1ZlcmlmeUVycm9yOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMKSB7XHJcbiAgICAgIHN3aXRjaCAocnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkpIHtcclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1BSRUZJWDpcclxuICAgICAgICAgIGVuZFRhc2tEdWVUb1ZlcmlmeUVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYOlxyXG4gICAgICAgICAgLy8gQW4gZXJyb3IgaW4gdGhlIHJlY29yZCBwcmVmaXggc2VuZHMgdXMgcmlnaHQgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIHJlY29yZCBwcmVmaXguXHJcbiAgICAgICAgICAvLyBJdCBtaWdodCBjcmVhdGUgYW4gZW5kbGVzcyBsb29wIGJ1dCBpdCBpcyBPSyB0byBkbyBzby4gSXQgaXMgYSBkZXZlbG9wZXIgYnVnLlxyXG4gICAgICAgICAgZW5kVGFza0R1ZVRvVmVyaWZ5RXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVg6XHJcbiAgICAgICAgICAvLyBpdCB3aWxsIGJlIGhhbmRsZWQgaW4gY29tbW9uaGFuZGxlcmFmdGVyXHJcbiAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25DdHJsKG51bGwpO1xyXG4gICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybCg8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVg6XHJcbiAgICAgICAgICAvLyBFcnJvciBtaWdodCBoYXZlIG9jY3VycmVkIGluIENQLlxyXG4gICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuICAgICAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsID09PSBudWxsKVxyXG4gICAgICAgICAgLy8gb25seSBmb3IgdGhlIGZpcnN0IHRpbWVcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdGFzay5zZXRDdXJyRmllbGQobnVsbCk7XHJcblxyXG4gICAgICAgICAgICAvLyByZXNldCB0aGUgc3RvcCBleGVjdXRpb24gY3RybFxyXG4gICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25DdHJsKG51bGwpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25DdHJsKGN1cnJDdHJsKTtcclxuXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyh0YXNrKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIENQIGdvdCBzdG9wIGV4ZWN1dGlvbiB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbnMgaW4gdGhpcyBoYW5kbGVyIGFuZCBpcyBwYXJrYWJsZS5cclxuICAgICAgICAgICAgLy8gd2UgbW92ZSB0byB0aGUgTGFzdFBhcmthYmxlIGNvbnRyb2xcclxuXHJcbiAgICAgICAgICAgIHRhc2suc2V0Q3VyckZpZWxkKGxhc3RQYXJrZWRDdHJsLmdldEZpZWxkKCkpO1xyXG5cclxuICAgICAgICAgICAgYXdhaXQgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKGxhc3RQYXJrZWRDdHJsLCAtMSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVg6XHJcbiAgICAgICAgICAvLyBJdCBtdXN0IGJlIHNldCB0byBmYWxzZSBzbyB0aGF0IG5leHQgdGltZSBmb3IgZmFzdCBtb2RlIENTIG11c3QgYmUgZXhlY3V0ZWQuXHJcbiAgICAgICAgICBjdXJyQ3RybC5zZXRJbkNvbnRyb2xTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICB9XHJcbiAgICAgIGlmIChlbmRUYXNrRHVlVG9WZXJpZnlFcnJvcikge1xyXG4gICAgICAgIGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgc3RvcCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdG9wO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRha2UgY2FyZSBvZiBcIkZvcmNlIEV4aXRcIiBiZWZvcmUgdGhlIGhhbmRsZXIgZXhlY3V0ZSBpdHMgb3BlcmF0aW9ucyByZXR1cm5zIHRydWVcclxuICAvLy8gICBpZiB0aGUgZm9yY2UgZXhpdCB3YXMgaGFuZGxlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldmVudFwiPnRoZSBldmVudCBvZiB0aGUgaGFuZGxlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj50aGUgcnVuLXRpbWUgZXZlbnRcclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUZvcmNlRXhpdEJlZm9yZShldnQ6IEV2ZW50LCBydEV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgZm9yY2VFeGl0OiBGb3JjZUV4aXQgPSBldnQuVXNlckV2dC5Gb3JjZUV4aXQ7XHJcbiAgICBsZXQgaXNOZXdSZWM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBvbGRJZHg6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLy8gVE9ETzogY2hlY2sgdGhlIGVmZmVjdCBvZiByZW1vdmluZyBmb3JjZUV4aXQgPT09IDxGb3JjZUV4aXQ+MFxyXG4gICAgaWYgKGZvcmNlRXhpdCA9PT0gRm9yY2VFeGl0Lk5vbmUgfHwgcnRFdnQuaXNJbW1lZGlhdGUoKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgdGhpcy5faXNIYW5kbGluZ0ZvcmNlRXhpdCA9IHRydWU7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPnJ0RXZ0LmdldFRhc2soKTtcclxuICAgIGxldCBvbGRSZWM6IFJlY29yZCA9ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgaWYgKG9sZFJlYyAhPT0gbnVsbCAmJiBvbGRSZWMuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0ICYmIG9sZFJlYy5pc05ld1JlYygpKSB7XHJcbiAgICAgIGlzTmV3UmVjID0gdHJ1ZTtcclxuICAgICAgb2xkSWR4ID0gb2xkUmVjLmdldElkKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoZm9yY2VFeGl0ICE9PSBGb3JjZUV4aXQuRWRpdGluZyAmJiB0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wpIHtcclxuICAgICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICBpZiAoY3RybCAhPT0gbnVsbClcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNob3VsZCB3ZSBleGl0IHRoZSByZWNvcmQ/XHJcbiAgICBpZiAoKGZvcmNlRXhpdCA9PT0gRm9yY2VFeGl0LlByZVJlY29yZFVwZGF0ZSB8fCBmb3JjZUV4aXQgPT09IEZvcmNlRXhpdC5Qb3N0UmVjb3JkVXBkYXRlKSAmJiB0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1JFQ09SRCkge1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgIXRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgbGV0IGN1cnJSZWM6IFJlY29yZCA9ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgICAvLyBJZiB3ZSBmYWlsZWQgZXhpdGluZyBhIG5ld2x5IGNyZWF0ZWQgcmVjb3JkIC0gcmVzdG9yZSBpbnNlcnQgbW9kZSBvZiB0aGUgcmVjb3JkXHJcbiAgICAgIGlmIChjdXJyUmVjICE9PSBudWxsICYmIHRoaXMuX3N0b3BFeGVjdXRpb24gJiYgaXNOZXdSZWMgJiYgb2xkSWR4ID09PSBjdXJyUmVjLmdldElkKCkgJiYgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgLy8gcmVzdG9yZSBpbnNlcnQgbW9kZSBvZiB0aGUgcmVjb3JkXHJcbiAgICAgICAgY3VyclJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICBjdXJyUmVjLnJlc3RhcnQoRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChmb3JjZUV4aXQgPT09IEZvcmNlRXhpdC5Qb3N0UmVjb3JkVXBkYXRlICYmICF0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFFDUiAjMzAzNzYyIC0gYWRkaXRpb25hbCBzdXBwb3J0IGZvciBmb3JjZUV4aXQgPSBlZGl0aW5nXHJcbiAgICBpZiAoZm9yY2VFeGl0ID09PSBGb3JjZUV4aXQuRWRpdGluZykge1xyXG4gICAgICBsZXQgZXZ0Q3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5ydEV2dC5Db250cm9sO1xyXG5cclxuICAgICAgaWYgKGV2dEN0cmwgIT09IG51bGwgJiYgZXZ0Q3RybC5nZXRGaWVsZCgpICE9PSBudWxsKSB7XHJcbiAgICAgICAgbGV0IGN0cmxWYWw6IHN0cmluZyA9IE1hbmFnZXIuR2V0Q3RybFZhbChldnRDdHJsKTtcclxuICAgICAgICBsZXQgZXZ0Q3RybHZhbDogc3RyaW5nID0gZXZ0Q3RybC5WYWx1ZTtcclxuICAgICAgICAvLyB0ZXN0IHRoZSBuZXcgY29udHJvbCB2YWx1ZVxyXG4gICAgICAgIGF3YWl0IGV2dEN0cmwudmFsaWRhdGVBbmRTZXRWYWx1ZShjdHJsVmFsLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdGFrZSBjYXJlIG9mIFwiRm9yY2UgRXhpdFwiIGFmdGVyIGhhbmRsaW5nIHRoZSBldmVudCA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBydW4tdGltZSBldmVudCA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRm9yY2VFeGl0QWZ0ZXIocnRFdnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGZvcmNlRXhpdDogRm9yY2VFeGl0ID0gcnRFdnQuVXNlckV2dC5Gb3JjZUV4aXQ7XHJcblxyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ydEV2dC5nZXRUYXNrKCk7XHJcblxyXG4gICAgLy8gUUNSIzc3NjI5NTogZm9yIHByZSByZWNvcmQgdXBkYXRlLCBjb21taXQgdGhlIHJlY29yZCBhZnRlciBoYW5kbGVyJ3MgZXhlY3V0aW9uLlxyXG4gICAgaWYgKGZvcmNlRXhpdCA9PT0gRm9yY2VFeGl0LlByZVJlY29yZFVwZGF0ZSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmNvbW1pdFJlY29yZCh0YXNrLCB0cnVlKTtcclxuICAgICAgaWYgKCF0YXNrLnRyYW5zYWN0aW9uRmFpbGVkKENvbnN0SW50ZXJmYWNlLlRSQU5TX1JFQ09SRF9QUkVGSVgpICYmICF0YXNrLmlzQWJvcnRpbmcoKSkge1xyXG4gICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdG8gZXZhbHVhdGUgdGhlIGVuZCBjb25kaXRpb24gYWZ0ZXIgdGhlIHJlY29yZCBzdWZmaXhcclxuICAgICAgICBpZiAoYXdhaXQgdGFzay5ldmFsRW5kQ29uZChDb25zdEludGVyZmFjZS5FTkRfQ09ORF9FVkFMX0FGVEVSKSlcclxuICAgICAgICAgIGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRm9yIHBvc3QtcmVjb3JkIHR5cGUgd2UgYWxyZWFkeSBkaWQgcmVjLXByZWZpeCBhbmQgY3RybCBwcmVmaXggaW4gdGhlIGhhbmRsZUZvcmNlRXhpdEJlZm9yZVxyXG4gICAgaWYgKGZvcmNlRXhpdCAhPT0gRm9yY2VFeGl0LlBvc3RSZWNvcmRVcGRhdGUpIHtcclxuICAgICAgdGFzayA9IDxUYXNrPnJ0RXZ0LmdldFRhc2soKTtcclxuICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICB9XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgaWYgKGN0cmwgIT09IG51bGwgJiYgZm9yY2VFeGl0ICE9PSBGb3JjZUV4aXQuRWRpdGluZykge1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFFDUiA4MDE4NzMgLSB1cGRhdGUgdGhlIGRpc3BsYXkgYWZ0ZXIgaGFuZGxlciBvZiBmb3JjZSBleGl0IGVkaXRpbmdcclxuICAgIGlmIChmb3JjZUV4aXQgPT09IEZvcmNlRXhpdC5FZGl0aW5nKSB7XHJcbiAgICAgIGxldCBldnRDdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnJ0RXZ0LkNvbnRyb2w7XHJcbiAgICAgIC8vIGlmIHRoZXJlIGlzIGEgY29udHJvbCB0aGF0IGlzIGF0dGFjaGVkIHRvIGEgZmllbGRcclxuICAgICAgaWYgKGV2dEN0cmwgIT09IG51bGwgJiYgZXZ0Q3RybC5nZXRGaWVsZCgpICE9PSBudWxsKVxyXG4gICAgICAgIGF3YWl0ICg8RmllbGQ+ZXZ0Q3RybC5nZXRGaWVsZCgpKS51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYSBzcGVjaWFsIHJvdXRpbmUgdG8gaGFuZGxlIGRhdGEgYW5kIHRpbWVyIGV2ZW50c1xyXG4gIC8vLyAgIGl0IHJlY2VpdmVzIGEgSGFuZGxlcnNUYWJsZSBhbmQgZXhlY3V0ZSB0aGVtIG9uZSBieSBvbmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaGFuZGxlcnNUYWJcIj50aGUgaGFuZGxlcnMgdGFibGU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj5hIHJlZmVyZW5uY2UgdG8gdGhlIHRpbWVyIHJ1bnRpbWUgZXZlbnQgLSBmb3IgZXhwcmVzc2lvbiBldmVudHMgaXQgbXVzdCBiZSBudWxsPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUV2ZW50c18xKGhhbmRsZXJzVGFiOiBIYW5kbGVyc1RhYmxlLCBydEV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLnB1c2hSdEV2ZW50KHJ0RXZ0KTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGhhbmRsZXJzVGFiLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGhhbmRsZXI6IEV2ZW50SGFuZGxlciA9IGhhbmRsZXJzVGFiLmdldEhhbmRsZXIoaSk7XHJcbiAgICAgICAgLy8gdGhlIHJ0RXZ0IGlzIHVzZWQgdG8gcGFzcyB0aGUgY3RybCwgdGhlcmVmb3IgaXQgbXVzdCBiZSB2YWxpZCAobm90IG51bGwpXHJcbiAgICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9FWFBSRVNTSU9OIHx8IGhhbmRsZXIuaXNTcGVjaWZpY0hhbmRsZXJPZihydEV2dCkgfHwgaGFuZGxlci5pc05vblNwZWNpZmljSGFuZGxlck9mKHJ0RXZ0KSB8fCBoYW5kbGVyLmlzR2xvYmFsSGFuZGxlck9mKHJ0RXZ0KSkge1xyXG4gICAgICAgICAgYXdhaXQgaGFuZGxlci5leGVjdXRlKHJ0RXZ0LCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5wb3BSdEV2ZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGFrZXMgY2FyZSBvZiBrZXlkb3duIEV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj50YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sIHByZXNzZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwia2JkSXRlbVwiPmtleWJvcmQgaXRlbTwvcGFyYW0+XHJcbiBwcml2YXRlIGFzeW5jIGhhbmRsZUtleURvd24odGFzazogVGFzaywgY3RybDogTWdDb250cm9sLCBldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGtiZEl0ZW06IEtleWJvYXJkSXRlbSA9IGV2dC5nZXRLYmRJdG1BbHdheXMoKTtcclxuICAgIGxldCBrZXlDb2RlOiBudW1iZXIgPSBrYmRJdGVtLmdldEtleUNvZGUoKTtcclxuICAgIGxldCBtb2RpZmllcjogTW9kaWZpZXJzID0ga2JkSXRlbS5nZXRNb2RpZmllcigpO1xyXG4gICAgdGhpcy5fY3VycktiZEl0ZW0gPSBrYmRJdGVtO1xyXG5cclxuICAgIC8vIElmIGtleWJvYXJkIGJ1ZmZlcmluZyBpcyByZXNwb25zaWJsZSBmb3IgdGhpcyBldmVudCwgd2UgbmVlZCB0byBmaW5kIHRoZSByaWdodCBjb250cm9sIHRvIHJlY2VpdmVcclxuICAgIC8vIHRoaXMgZXZlbnRcclxuICAgIGlmIChldnQuSWdub3JlU3BlY2lmaWVkQ29udHJvbCkge1xyXG4gICAgICBjdHJsID0gdGhpcy5nZXRDdXJyQ3RybCgpO1xyXG4gICAgICB0YXNrID0gKCgoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpIGluc3RhbmNlb2YgVGFzaykgPyA8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkgOiBudWxsKSk7XHJcbiAgICAgIC8vIFRoZSBjb250cm9sIHJlY2VpdmluZyBrZXlzIGZyb20ga2V5Ym9hcmQgYnVmZmVyaW5nIG11c3QgYmUgYSB0ZXh0Ym94XHJcbiAgICAgIGlmIChjdHJsLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RFWFQpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiU3RhcnQgaGFuZGxpbmcgS0VZRE9XTiBldmVudC4gS2V5IGNvZGU6IFwiICsga2V5Q29kZSk7XHJcblxyXG4gICAgdHJ5IHtcclxuXHJcbiAgICAgIC8vIERPV04gb3IgVVAgaW52b2tlZCBvbiBhIFNFTEVDVC9SQURJTyBjb250cm9sXHJcbiAgICAgIGlmICh0aGlzLl9jdXJyS2JkSXRlbS5lcXVhbHModGhpcy5LQklfRE9XTikgfHwgdGhpcy5fY3VycktiZEl0ZW0uZXF1YWxzKHRoaXMuS0JJX1VQKSkge1xyXG4gICAgICAgIGlmIChjdHJsICE9PSBudWxsICYmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJU1QgfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTykpXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCh0YXNrLCBjdHJsKTtcclxuICAgICAgcnRFdnQuc2V0U3lzdGVtKHRoaXMuX2N1cnJLYmRJdGVtKTtcclxuICAgICAgcnRFdnQuc2V0RWRpdFBhcm1zKGV2dC5nZXRTdGFydFNlbGVjdGlvbigpLCBldnQuZ2V0RW5kU2VsZWN0aW9uKCksIGV2dC5nZXRWYWx1ZSgpKTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgIGxldCByZXR1cm5Ub0N0cmw6IE1nQ29udHJvbCA9IE1nQ29udHJvbC5SZXR1cm5Ub0N0cmw7XHJcbiAgICAgICAgICBpZiAocmV0dXJuVG9DdHJsICE9PSBudWxsICYmIE1nQ29udHJvbC52YWxpZFJldHVyblRvQ3RybCgpKVxyXG4gICAgICAgICAgICByZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5zZXRMYXN0UGFya2VkQ3RybChyZXR1cm5Ub0N0cmwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgbWdkOiBNR0RhdGEgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldEN1cnJNR0RhdGEoKTtcclxuICAgICAgLy8gY2hlY2sgaWYgdGhlIE1HRGF0YSBpcyBzdGlsbCBhbGl2ZSBhZnRlciBoYW5kbGluZyB0aGUgZXZlbnRzIGFib3ZlXHJcbiAgICAgIGlmIChtZ2QgIT09IG51bGwgJiYgIW1nZC5Jc0Fib3J0aW5nKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXhwcmVzc2lvbkhhbmRsZXJzKCk7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiRW5kIGhhbmRsaW5nIEtFWURPV04gZXZlbnQuIEtleSBjb2RlOiBcIiArIGtleUNvZGUpO1xyXG4gICAgICAvLyBpZiBhIGtleSB3YXMgcHJlc3NlZCBvbiB0YWJsZSBjaGlsZCwgbWFrZSBzdXJlIHRoYXQgaXMgaXMgdmlzaWJsZVxyXG4gICAgICBpZiAoY3RybCAhPT0gbnVsbCAmJiBjdHJsLklzUmVwZWF0YWJsZSAmJiBjdHJsID09PSBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsKSB7XHJcbiAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+Y3RybC5nZXRGb3JtKCkpLmJyaW5nUmVjb3JkVG9QYWdlKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZmluYWxseSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+SGFuZGxlIFNlbGVjdGlvbiBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5saW5lPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbHVlXCI+dmFsdWU8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlU2VsZWN0aW9uKGN0cmw6IE1nQ29udHJvbCwgbGluZTogbnVtYmVyLCB2YWw6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1ggfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTyB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTUJPIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElTVCkge1xyXG4gICAgICBsZXQgY2hlY2tGb2N1czogYm9vbGVhbiA9IChjdHJsLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQiAmJiBjdHJsLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YKTtcclxuICAgICAgbGV0IGFsbG93U2VsZWN0aW9uOiBib29sZWFuID0gKGNoZWNrRm9jdXMgPyAoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldExhc3RQYXJrZWRDdHJsKCkgPT09IGN0cmwpIDogdHJ1ZSk7XHJcblxyXG4gICAgICBpZiAoIWFsbG93U2VsZWN0aW9uIHx8ICFjdHJsLmlzTW9kaWZpYWJsZSgpIHx8ICFhd2FpdCBjdHJsLklzUGFya2FibGUoKSlcclxuICAgICAgICBhd2FpdCBjdHJsLnJlc3RvcmVPbGRWYWx1ZSgpO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoY3RybC5pc0Nob2ljZUNvbnRyb2woKSlcclxuICAgICAgICAgIENvbW1hbmRzLnNldEdldFN1Z2dlc3RlZFZhbHVlT2ZDaG9pY2VDb250cm9sT25UYWdEYXRhKGN0cmwsIGN0cmwuSXNSZXBlYXRhYmxlID8gbGluZSA6IDAsIHRydWUpO1xyXG5cclxuICAgICAgICBpZiAoY3RybC5pc0RpZmZlcmVudFZhbHVlKHZhbCwgY3RybC5Jc051bGwsIHRydWUpKSB7XHJcbiAgICAgICAgICAvLyAjOTMxNTQ1IC0gdmFyIGNoYW5nZSBtdXN0IGJlIGludm9rZWQgZmlyc3QgYmVmb3JlIGNvbnRyb2wgdmVyaWZpY2F0aW9uLlxyXG4gICAgICAgICAgY3RybC5Nb2RpZmllZEJ5VXNlciA9IHRydWU7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUN0cmxNb2RpZnkoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVElPTik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY3RybC5pc0Nob2ljZUNvbnRyb2woKSlcclxuICAgICAgICAgIENvbW1hbmRzLnNldEdldFN1Z2dlc3RlZFZhbHVlT2ZDaG9pY2VDb250cm9sT25UYWdEYXRhKGN0cmwsIGN0cmwuSXNSZXBlYXRhYmxlID8gbGluZSA6IDAsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgLy8gRm9yIG11bHRpcGxlIHNlbGVjdGlvbiBMaXN0Qm94IHZhbHVlIHRvIGZpZWxkIGFuZCBjdHJsIHdvdWxkIGJlIHNldCBvbiBsZWF2aW5nXHJcbiAgICAgICAgLy8gY29udHJvbCwgYmVmb3JlIGV4ZWN1dGluZyBjb250cm9sIHN1ZmZpeC4gU28gdmFyaWFibGUgY2hhbmdlIGludGVybmFsIGV2ZW50IHdvdWxkIGJlXHJcbiAgICAgICAgLy8gaGFuZGxlZCBiZWZvcmUgZXhlY3V0aW5nIGNvbnRyb2wgc3VmZml4LlxyXG4gICAgICAgIGlmICghY3RybC5Jc011bHRpcGxlU2VsZWN0aW9uTGlzdEJveCgpKVxyXG4gICAgICAgICAgYXdhaXQgY3RybC52YWxpZGF0ZUFuZFNldFZhbHVlKHZhbCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGUgTW91c2UgVXAgRXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmNvbnRvbFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPmxpbmUgb2YgbXVsdGlsaW5lIGNvbnRyb2xcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb2R1Y2VDbGlja1wiPmlmIHRydWUsIHByb2R1Y2UgY2xpY2sgZXZlbnRcclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZU1vdXNlVXAoY3RybDogTWdDb250cm9sLCBsaW5lOiBudW1iZXIsIHByb2R1Y2VDbGljazogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGN0cmwgPT09IG51bGwpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICAvLyBRQ1IgIyA2MTQ0IHNlZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgX2N1cnJDbGlja2VkUmFkaW8gbWVtYmVyXHJcbiAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTylcclxuICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkN1cnJlbnRDbGlja2VkUmFkaW8gPSBjdHJsO1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKGN0cmwuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEUpIHtcclxuICAgICAgICBpZiAoISBhd2FpdCBjdHJsLmNoZWNrUHJvcFdpdGhMaW5lKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOQUJMRUQsIHRydWUsIGxpbmUpKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBjYW5Hb3RvQ3RybDogYm9vbGVhbiA9IHRoaXMuY2FuR29Ub0NvbnRyb2woY3RybCwgdHJ1ZSk7XHJcbiAgICAgICAgbGV0IFN0b3BGb2N1czogYm9vbGVhbiA9IGN0cmwuaXNGb2N1c2VkU3RvcEV4ZWN1dGlvbigpO1xyXG5cclxuICAgICAgICBsZXQgcmV0dXJuVG9DdHJsOiBNZ0NvbnRyb2wgPSBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsO1xyXG5cclxuICAgICAgICBpZiAoKCFjYW5Hb3RvQ3RybCB8fCAoKHRoaXMuX3N0b3BFeGVjdXRpb24gfHwgU3RvcEZvY3VzKSAmJiByZXR1cm5Ub0N0cmwgIT09IGN0cmwpKSAmJiByZXR1cm5Ub0N0cmwgIT09IG51bGwpIHtcclxuICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gKDxUYXNrPnJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNZ2RJRCgpO1xyXG4gICAgICAgICAgaWYgKHJldHVyblRvQ3RybC5Jc1JlcGVhdGFibGUpXHJcbiAgICAgICAgICAgIGF3YWl0ICg8TWdGb3JtPnJldHVyblRvQ3RybC5nZXRGb3JtKCkpLmJyaW5nUmVjb3JkVG9QYWdlKCk7XHJcbiAgICAgICAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMocmV0dXJuVG9DdHJsLCAtMSk7XHJcbiAgICAgICAgICByZXR1cm5Ub0N0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5zZXRMYXN0UGFya2VkQ3RybChyZXR1cm5Ub0N0cmwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbiB8fCBTdG9wRm9jdXMpXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChwcm9kdWNlQ2xpY2sgJiYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1ggfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUKSkge1xyXG4gICAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsKTtcclxuICAgICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCX0NMSUNLKTtcclxuICAgICAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgICAgIH1cclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5DdXJyZW50Q2xpY2tlZFJhZGlvID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gIENoZWNrIGlmIGN0eCBpcyByZW1vdmVkIGZyb20gc2VydmVyLCBpZiBzbyBhbmQgY3VycmVudCBldmVudCBpcyByb3V0ZSBldmVudCAsIHRoZW4gc2F2ZSBpdFxyXG4gIC8vICB0byBleGVjdXRlIGFnYWluIHdoZW4gIHNlcnZlciBjdHggaXMgcmVjcmVhdGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjaGVja0FuZFNhdmVSb3V0ZUV2ZW50SWZDdHhSZW1vdmVkRnJvbVNydnIoYVJ0RXZ0OmFueSk6IHZvaWQge1xyXG5cclxuICAgIGlmIChhUnRFdnQuZ2V0VHlwZSgpID09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgYVJ0RXZ0LmdldEludGVybmFsQ29kZSgpID09XHJcbiAgICAgIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9XRUJDTElFTlRfUk9VVEUgJiYgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlJlbW92ZWRDb250ZXh0RnJvbVNlcnZlcikge1xyXG4gICAgICAgIHRoaXMuc2V0TGFzdFNhdmVkUm91dGVFdmVudChhUnRFdnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZSBGb2N1cyBFdmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5saW5lIG9mIG11bHRpbGluZSBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9uQ2xpY2tcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRm9jdXMoY3RybDogTWdDb250cm9sLCBsaW5lOiBudW1iZXIsIG9uQ2xpY2s6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRyeSB7XHJcblxyXG5cclxuICAgICAgLy8gSWYgd2UgYXR0ZW1wdCB0byBwYXJrIG9uIGNvbnRyb2wgd2hlcmUgd2UgZG8gbm90IHdhbnQgdG8gYWxsb3cgdG8gcGFyayBsaWtlIGlmIGNvbnRyb2wgaGFzIGV4cHJlc3Npb24gb3IgcGFyZW50IHRhc2sgZmllbGQsIGRvIG5vdCBhbGxvdyB0byBmb2N1cyBvbiBpdC5cclxuICAgICAgLy8gU2V0IEZvY3VzIGJhY2sgdG8gbGFzdEZvY3VzZWRDb250cm9sLiBXZSBuZWVkIF9sYXN0RmFpbGVkRm9jdXNlZENvbnRyb2wgYXMgd2UgZ2V0IGZvY3VzIGV2ZW50IG9uIGEgY29udHJvbCB0d2ljZS4gU28gdG8gYXZvaWQgdG8gc2hvdyBlcnJvciBtdWx0aXBsZSB0aW1lcyxcclxuICAgICAgLy8gbWFpbnRhaW4gX2xhc3RGYWlsZWRGb2N1c2VkQ29udHJvbC5cclxuICAgICAgaWYgKGN0cmwgIT09IHRoaXMuX2xhc3RGYWlsZWRGb2N1c2VkQ29udHJvbCAmJiBjdHJsLkhhc0V4cE9yUGFyZW50VGFza0ZpZWxkKCkpIHtcclxuICAgICAgICAvLyBTaG93IGVycm9yIG9ubHkgZm9yIGNvbnRyb2xzIGhhdmluZyBEYXRhIHByb3BlcnR5IGFuZCBwYXJrYWJsZVxyXG4gICAgICAgIGlmKGN0cmwuaXNMaXN0Qm94KCkgfHwgY3RybC5pc0NoZWNrQm94KCkgfHwgY3RybC5pc0NvbWJvQm94KCkgfHwgY3RybC5pc1RleHRDb250cm9sKCkgfHwgY3RybC5pc1JhZGlvKCkgfHwgY3RybC5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXJyb3JUb0xvZyhOU3RyaW5nLkZvcm1hdChcIkNvbnRyb2wgZWl0aGVyIGhhcyBleHByZXNzaW9uIG9yIGhhcyBwYXJlbnQgdGFzayB2YXJpYWJsZSBhdHRhY2hlZCB0byBpdC4gRmFpbGVkIHRvIHBhcmsgb24gY29udHJvbCB3aXRoIG5hbWU6IHswfVwiLCBjdHJsLk5hbWUpKTtcclxuICAgICAgICAgIC8vIERlZmVjdCAxNTI3Mjg6IFVzZSBsYXN0IGZvY3VzZWQgdGFzayBpbnN0ZWFkIGNvbnRyb2wgdGFzayBhcyBjb250cm9sIGNhbiBiZSBmcm9tIHN1YmZvcm0uXHJcbiAgICAgICAgICBGb2N1c01hbmFnZXIuU2V0Rm9jdXMoTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpLCBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCksIDAsXHJcbiAgICAgICAgICAgIExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKSA9PT0gbnVsbCA/IHRydWUgOiBmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLl9sYXN0RmFpbGVkRm9jdXNlZENvbnRyb2wgPSBjdHJsO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5fbGFzdEZhaWxlZEZvY3VzZWRDb250cm9sID0gbnVsbDtcclxuXHJcbiAgICAgIGlmIChvbkNsaWNrKVxyXG4gICAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5DdXJyZW50Q2xpY2tlZEN0cmwgPSBjdHJsO1xyXG5cclxuICAgICAgbGV0IHByZXZDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcbiAgICAgIGlmIChjdHJsID09PSBwcmV2Q3RybCAmJiAhY3RybC5pc1JlcGVhdGFibGUoKSkge1xyXG4gICAgICAgIGF3YWl0ICg8TWdGb3JtPmN0cmwuZ2V0Rm9ybSgpKS5icmluZ1JlY29yZFRvUGFnZSgpO1xyXG4gICAgICAgIC8vIHdlIHJlY2VpdmVkIGZvY3VzIHR3aWNlXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvL2NoZWNrIGlmIGxhc3QgdGFzayBpcyBvcGVuZWQgaW4gTW9kYWwgU3ViZm9ybSwgaWYgeWVzLCBjbG9zZSBpdCBiZWZvcmUgZm9jdXNzaW5nIG9uIHBhcmVudCB0YXNrJ3MgY3RybFxyXG4gICAgICBsZXQgcHJldlRhc2s6IFRhc2sgPSA8VGFzaz5MYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcblxyXG5cclxuICAgICAgdGhpcy5fbmV4dFBhcmtlZEN0cmwgPSBjdHJsOyAvLyBzYXZlIHRoZSBORVhUIGNvbnRyb2wgKHVzZWQgdG8gY2hlY2sgdGhlIGRpcmVjdGlvbilcclxuXHJcbiAgICAgIGlmIChjdHJsID09PSBudWxsIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEUpIHtcclxuICAgICAgICBpZiAocHJldkN0cmwgPT09IG51bGwpXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBjdXJyVGFzazogVGFzaztcclxuICAgICAgaWYgKChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTikgJiYgKDxSYWlzZUF0Pihhd2FpdCAoY3RybC5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JBSVNFX0FUKSkuZ2V0VmFsdWVJbnQoKSkgPT09IFJhaXNlQXQuVGFza0luRm9jdXMpKVxyXG4gICAgICAgIGN1cnJUYXNrID0gcHJldlRhc2s7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBjdXJyVGFzayA9IDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuXHJcbiAgICAgIGxldCBjYW5Hb3RvQ3RybDogYm9vbGVhbiA9IHRoaXMuY2FuR29Ub0NvbnRyb2woY3RybCwgb25DbGljayk7XHJcblxyXG4gICAgICAvLyBHbyB0byB0aGUgY29udHJvbCAtIGluc2VydCBwcmVmaXhcclxuICAgICAgaWYgKGNhbkdvdG9DdHJsKSB7XHJcblx0ICAgIC8vIE1vZGFsIHN1YmZvcm0gdGFzayBjbG9zaW5nIGhhcyBhbHJlYWR5IGJlZ3VuLiBEbyBub3QgaGFuZGxlIEhhbmRsZVN1YmZvcm1Nb2RhbGl0eSgpIGFnYWluLlxyXG4gICAgICAgIGlmICh0aGlzLmd1aVBlbmRpbmdFdmVudCAhPSBudWxsKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxldCBoYW5kbGVkID0gYXdhaXQgdGhpcy5IYW5kbGVTdWJmb3JtTW9kYWxpdHkoY3RybCwgcHJldlRhc2ssIGN1cnJUYXNrKTtcclxuICAgICAgICBpZiAoaGFuZGxlZClcclxuICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgbGV0IGV2ZW50TGluZTogbnVtYmVyID0gKGN0cmwuaXNSZXBlYXRhYmxlKCkgfHwgY3RybC5pc1JhZGlvKCkpID8gbGluZSA6IEludDMyLk1pblZhbHVlO1xyXG4gICAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsLCBldmVudExpbmUpO1xyXG4gICAgICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICB9IGVsc2UgaWYgKHByZXZDdHJsICE9PSBudWxsKSB7XHJcbiAgICAgICAgaWYgKCFwcmV2Q3RybC5pc01vZGlmaWFibGUoKSkge1xyXG4gICAgICAgICAgaWYgKHByZXZDdHJsLmlzQ2hvaWNlQ29udHJvbCgpKVxyXG4gICAgICAgICAgICBhd2FpdCBwcmV2Q3RybC5yZXN0b3JlT2xkVmFsdWUoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKCFjdXJyVGFzay5jYW5jZWxXYXNSYWlzZWQoKSkge1xyXG4gICAgICAgICAgbGV0IG5ld1ZhbDogc3RyaW5nID0gTWFuYWdlci5HZXRDdHJsVmFsKHByZXZDdHJsKTtcclxuICAgICAgICAgIGlmICghIGF3YWl0IHByZXZDdHJsLnZhbGlkYXRlQW5kU2V0VmFsdWUobmV3VmFsLCB0cnVlKSlcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsID0gcHJldkN0cmw7XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyhjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLl9zdG9wRXhlY3V0aW9uICYmIE1nQ29udHJvbC5SZXR1cm5Ub0N0cmwgPT09IGN0cmwpXHJcbiAgICAgICAgTGFzdEZvY3VzZWRNYW5hZ2VyLnNldExhc3RGb2N1c2VkQ29udHJvbCg8VGFza0Jhc2U+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLCBjdHJsKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgY3RybC5zZXRGb2N1c2VkU3RvcEV4ZWN1dGlvbih0aGlzLl9zdG9wRXhlY3V0aW9uKTtcclxuICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsZXQgcmV0dXJuVG9DdHJsOiBNZ0NvbnRyb2wgPSBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsO1xyXG5cclxuICAgICAgICAgIGlmIChyZXR1cm5Ub0N0cmwgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5jdXJyTWdkSUQgPSAoPFRhc2s+cmV0dXJuVG9DdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldE1nZElEKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IEZvY3VzTWFuYWdlci5TZXRGb2N1cyhyZXR1cm5Ub0N0cmwsIC0xKTtcclxuICAgICAgICAgICAgcmV0dXJuVG9DdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuc2V0TGFzdFBhcmtlZEN0cmwocmV0dXJuVG9DdHJsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZSBzdWJmb3JtIG1vZGFsaXR5IGJlZm9yIGZvdWNzc2luZyBvbiBwYXJlbnQgY3RybFxyXG4gIC8vLyAxLmlmIGN1cnNvciBpcyBwYXJrZWQgb24gbW9kYWwgc3ViZm9ybSB0YXNrIGFuZCB1c2VyIGNsaWNrcyBvbiBpdCdzIHBhcmVudCA6IGNsb3NlIHRoZSBzdWJmb3JtIHRhc2suXHJcbiAgLy8vIDIuaWYgY3Vyc29yIGlzIHBhcmtlZCBvbiBtb2RhbCBzdWJmb3JtICdTMicgd2hpY2ggaXMgb3BlbmVkIGluIGFub3RoZXIgc3ViZm9ybSBtb2RhbCAnUzEnLCB0aGVuIGNsaWNraW5nIG9uICBwYXJlbnQnUDEnXHJcbiAgLy8vIHdpbGwgY2xvc2UgYm90aCBTMiBhbmQgUzEuXHJcbiAgLy8vIDMuaWYgY3Vyc29yIGlzIHBhcmtlZCBvbiBub24gbW9kYWwgc3ViZm9ybSAnUzInIHdoaWNoIGlzIG9wZW5lZCBpbiBzdWJmb3JtIG1vZGFsICdTMScsIHRoZW4gY2xpY2tpbmcgb24gUzEsIHdpbGwgbm90IGNsb3NlIFMyXHJcbiAgLy8vIGJ1dCBjbGlja2luZyBvbiBQMSB3aWxsIGNsb3NlIGJvdGggUzIgYW5kIFMxLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y3RybCB0byBiZSBmb2N1c3NlZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcmV2VGFza1wiPnByZXZpb3VzIHRhc2sgd2hpY2ggd2FzIGluIGZvY3VzPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN1cnJUYXNrXCI+Y3VycmVudCB0YXNrIHdoaWNoIGlzIHRvIGJlIGZvY3Vzc2VkPC9wYXJhbT5cclxuXHJcbiAgcHJpdmF0ZSAgYXN5bmMgSGFuZGxlU3ViZm9ybU1vZGFsaXR5KGN0cmw6IE1nQ29udHJvbCwgcHJldlRhc2s6IFRhc2ssIGN1cnJUYXNrOiBUYXNrKTogUHJvbWlzZTxib29sZWFuPlxyXG4gIHtcclxuICAgIGxldCBoYW5kbGVkU3ViZm9ybU1vZGFsaXR5ID0gZmFsc2U7XHJcblxyXG4gICAgLy8gZXZhbHVhdGUgdGhlIGNvcnJlY3QgcHJldlRhc2sgdG8gYmUgY2xvc2VkIGlmIGl0IGlzIE1vZGFsLlxyXG4gICAgLy8gaWYgbmV3bHkgc3ViZm9ybSBNb2RhbCB0YXNrIGlzIG9wZW5lZCBhbmQgaXQgaXMgbm90IHlldCBmb2N1c3NlZCwgaW4gdGhhdCBjYXNlIGN1cnIgdGFzayBpcyBzYW1lIGFzIHByZXZ0YXNrLlxyXG4gICAgLy8gbm93IGNsaWNraW5nIG9uIGl0J3MgcGFyZW50IHRhc2ssIHNob3VsZCBjbG9zZSB0aGUgTW9kYWwgc3ViZm9ybSB0YXNrXHJcbiAgICBsZXQgbGVuZ3RoID0gcHJldlRhc2suZ2V0TUdEYXRhKCkuZ2V0VGFza3NDb3VudCgpO1xyXG4gICAgbGV0IHRvcFRhc2s6IFRhc2sgPSBwcmV2VGFzay5nZXRNR0RhdGEoKS5nZXRUYXNrKGxlbmd0aC0xKTtcclxuICAgIGlmIChjdXJyVGFzayA9PSBwcmV2VGFzayB8fCBwcmV2VGFzayAhPSB0b3BUYXNrIC8qIG5lc3RlZCBzdWJmb3JtICovKSB7XHJcbiAgICAgICAgaWYodG9wVGFzayAhPSBudWxsICYmIHByZXZUYXNrICE9IHRvcFRhc2sgJiYgdG9wVGFzay5Jc1N1YkZvcm0gKSB7XHJcbiAgICAgICAgICBsZXQgc3ViZm9ybUN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dG9wVGFzay5nZXRGb3JtKCkuZ2V0U3ViRm9ybUN0cmwoKTtcclxuICAgICAgICAgIGlmIChzdWJmb3JtQ3RybC5Jc01vZGFsKCkpXHJcbiAgICAgICAgICAgIHByZXZUYXNrID0gdG9wVGFzaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGNsb3NlIHN1YmZvcm0gdGFzayBpcyBNb2RhbCBpZiB0byBiZSBwYXJrZWQgb24gcGFyZW50LlxyXG4gICAgaWYgKHByZXZUYXNrICE9IDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSAmJiBwcmV2VGFzay5nZXRJc0Rlc3RpbmF0aW9uQ2FsbCgpKSB7XHJcblxyXG4gICAgICAgIGlmICghY3VyclRhc2suaXNEZXNjZW5kZW50T2YocHJldlRhc2spKSB7XHJcbiAgICAgICAgICBsZXQgc3ViZm9ybUN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+cHJldlRhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCk7XHJcbiAgICAgICAgICBpZiAoIXN1YmZvcm1DdHJsLklzTW9kYWwoKSAmJiAhY3VyclRhc2suZ2V0SXNEZXN0aW5hdGlvbkNhbGwoKSlcclxuICAgICAgICAgICAgc3ViZm9ybUN0cmwgPSBwcmV2VGFzay5HZXRTdWJmb3JtTW9kYWxQYXJlbnRUYXNrKCk7XHJcbiAgICAgICAgICBpZiAoc3ViZm9ybUN0cmwgIT0gbnVsbCAmJiAoY3RybCAhPSBzdWJmb3JtQ3RybCkgJiYgc3ViZm9ybUN0cmwuSXNNb2RhbCgpKSB7XHJcblxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnBlcmZvcm1TdWJmb3JtQ2xvc2UoPE1nQ29udHJvbD5zdWJmb3JtQ3RybCk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICAgICAgICB0aGlzLmd1aVBlbmRpbmdFdmVudCA9IHRoaXMuZ2V0TGFzdFJ0RXZlbnQoKTtcclxuICAgICAgICAgICAgaGFuZGxlZFN1YmZvcm1Nb2RhbGl0eSA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBoYW5kbGVkU3ViZm9ybU1vZGFsaXR5O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgQ2FsbHMgQ29udHJvbHMgU3VmZml4IHdoZW4gZm9jdXMgb24gTm9uIG1hZ2ljIGNvbnRyb2wgaS5lLiBjb250cm9sIHdpdGggTWFnaWNEdW1teUNvbnRyb2wgaXMgcmVjZWl2ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVGb2N1c09uTm9uTWFnaWNDb250cm9sKGN0cmw6IE1nQ29udHJvbCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgRXZlbnRzTWFuYWdlci5JbnN0YW5jZS5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGN0cmwuc2V0Rm9jdXNlZFN0b3BFeGVjdXRpb24odGhpcy5fc3RvcEV4ZWN1dGlvbik7XHJcbiAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGV0IHJldHVyblRvQ3RybDogTWdDb250cm9sID0gTWdDb250cm9sLlJldHVyblRvQ3RybDtcclxuXHJcbiAgICAgICAgICBpZiAocmV0dXJuVG9DdHJsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gKDxUYXNrPnJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNZ2RJRCgpO1xyXG4gICAgICAgICAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMocmV0dXJuVG9DdHJsLCAtMSk7XHJcbiAgICAgICAgICAgIHJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExhc3RQYXJrZWRDdHJsKHJldHVyblRvQ3RybCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHdlIGNhbiBnbyB0byB0aGUgY29udHJvbCBhbmQgdHJ5IHRvIHBhcmsgb24gaW5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPmxpbmU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib25DbGlja1wiPnJlYWwgY2xpY2sgaXMgcGVyZm9ybWVkLCB0aGlzIG5vdCBjbGljayBzaW11bGF0aW9uPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgY2FuR29Ub0NvbnRyb2woY3RybDogTWdDb250cm9sLCBvbkNsaWNrOiBib29sZWFuKTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKG9uQ2xpY2sgJiYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STSB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JST1dTRVIpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gVjkuNFNQNGQgY2hhbmdlIG9mIGJlaGF2aW9yIC0gd2UgZG8gbm90IFwiZXhpdFwiIGZyb20gdGhlIGN1cnJlbnQgY3RybFxyXG4gICAgLy8gKGkuZS4gbm90IHBlcmZvcm1pbmcgY3RybCBzdWZmaXggb3IgY3RybCB2ZXJpZmljYXRpb25zKSBpZiB0aGUgdGFyZ2V0IGN0cmxcclxuICAgIC8vIGlzIElNRyBvciBoeXBlcnRleHQuXHJcbiAgICBsZXQgY2FuR290b0N0cmw6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IGN1cnJUYXNrOiBUYXNrID0gPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG5cclxuICAgIGlmICghY3VyclRhc2suSXNJbnRlcmFjdGl2ZSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0lNQUdFICYmICFjdHJsLklzUmVwZWF0YWJsZSlcclxuICAgICAgY2FuR290b0N0cmwgPSBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gY2FuR290b0N0cmw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlIFRpbWVyIEV2ZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldnRcIj50dW50aW1lIHRpbWVyIGV2ZW50PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVRpbWVyKGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBldnQuc2V0VHlwZShDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1RJTUVSKTtcclxuICAgIGlmIChldnQuaXNJZGxlVGltZXIoKSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV4cHJlc3Npb25IYW5kbGVycygpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUNvbnRleHRJbmFjdGl2aXR5QWxlcnQoZXZ0KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgbWdkOiBNR0RhdGEgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldE1HRGF0YShldnQuZ2V0TWdkSUQoKSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnRzKG1nZC5nZXRUaW1lckhhbmRsZXJzKCksIGV2dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFdoZW4gdGhlIGNvbnRleHQgaW5hY3Rpdml0eSB0aW1lb3V0IGlzIGFib3V0IHRvIGV4cGlyZSwgcmFpc2UgYSB3YXJuaW5nIHRvIHVzZXJcclxuICAvLyAgICBzbyB0aGF0IHRoZSBzZXNzaW9uIGNhbiBiZSBjb250aW51ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+dHVudGltZSB0aW1lciBldmVudDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVDb250ZXh0SW5hY3Rpdml0eUFsZXJ0KGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGltZU5vdzogbnVtYmVyID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuICAgIGxldCBtZ2Q6IE1HRGF0YSA9IGV2dC5nZXRUYXNrKCkuZ2V0TUdEYXRhKCk7XHJcbiAgICBsZXQgbGFzdFJlcXVlc3RUaW1lOiBudW1iZXIgPSBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkdldExhc3RSZXF1ZXN0VGltZTtcclxuICAgIGxldCBjb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQ6IG51bWJlciA9IEVudmlyb25tZW50Lkluc3RhbmNlLmdldENvbnRleHRJbmFjdGl2aXR5VGltZW91dCgpLzEwO1xyXG4gICAgbGV0IGNvbnRleHRJbmFjdGl2aXR5V2FybmluZ1RpbWU6IG51bWJlciA9IEVudmlyb25tZW50Lkluc3RhbmNlLmdldENvbnRleHRJbmFjdGl2aXR5V2FybmluZ1RpbWUoKS8xMDtcclxuXHJcbiAgICBsZXQgaWRsZVRpbWUgPSAodGltZU5vdyAtIGxhc3RSZXF1ZXN0VGltZSkvMTAwMDtcclxuXHJcbiAgICAvLyBEaXNwbGF5IHRoZSBjb25maXJtYXRpb24gb25seSBmb3IgdmFsaWQgdGltZW91dHNcclxuICAgIGlmKGNvbnRleHRJbmFjdGl2aXR5VGltZW91dCA9PSAwIHx8IGNvbnRleHRJbmFjdGl2aXR5V2FybmluZ1RpbWUgPT0gMClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmKEV2ZW50c01hbmFnZXIudXNlckdyYW50ZWRGb3JDb250ZXh0QWN0aXZpdHkgJiYgaWRsZVRpbWUgPj0gKGNvbnRleHRJbmFjdGl2aXR5VGltZW91dCAtIGNvbnRleHRJbmFjdGl2aXR5V2FybmluZ1RpbWUpKSB7XHJcbiAgICAgIC8vIHJhaXNlIGFuIGFsZXJ0IHRvIG5vdGlmeSB1c2VyIHdoZW4gdGhlIGNvbnRleHQgaXMgYWJvdXQgdG8gYmUgdGVybWluYXRlZFxyXG4gICAgICAvLyBpZiB1c2VyIGNsaWNrcyBvbiBPSywgc2VuZCBkdW1teSByZXF1ZXN0IHRvIHNlcnZlci4gSWYgQ2FuY2VsIGlzIGNsaWNrZWQsIGRvIG5vdGhpbmcuXHJcbiAgICAgIGxldCB1c2VyQ29uZmlybWF0aW9uOiBudW1iZXIgPSBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLk1lc3NhZ2VCb3godGhpcy5jb25maXJtYXRpb25EaWFsb2dUaXRsZSwgdGhpcy5jb25maXJtYXRpb25EaWFsb2dNc2csIFN0eWxlcy5NU0dCT1hfQlVUVE9OX1lFU19OTyk7XHJcbiAgICAgIGlmKHVzZXJDb25maXJtYXRpb24gPT0gU3R5bGVzLk1TR0JPWF9SRVNVTFRfWUVTKVxyXG4gICAgICB7XHJcbiAgICAgICAgLy8gc2VuZCByZXF1ZXN0IHRvIHNlcnZlciB0byBtYXJrIHRoZSBjb250ZXh0IGluYWN0aXZpdHkgdGltZW91dCB0byB6ZXJvXHJcbiAgICAgICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVDb250ZXh0VGltZW91dFJlc2V0RXZlbnRDb21tYW5kKCk7XHJcbiAgICAgICAgbWdkLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICBhd2FpdCBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5PTkxZX0NPTU1BTkRTKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgIHtcclxuICAgICAgICBFdmVudHNNYW5hZ2VyLnVzZXJHcmFudGVkRm9yQ29udGV4dEFjdGl2aXR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHByb2Nlc3MgZXhwcmVzc2lvbiBoYW5kbGVyc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgaGFuZGxlRXhwcmVzc2lvbkhhbmRsZXJzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSwgTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpKTtcclxuICAgIHJ0RXZ0LnNldEV4cHJlc3Npb24obnVsbCk7XHJcbiAgICBydEV2dC5zZXRNYWluUHJnQ3JlYXRvcihydEV2dC5nZXRUYXNrKCkpO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgbGV0IG1nZDogTUdEYXRhID0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRNR0RhdGEoaSk7XHJcbiAgICAgIGlmIChtZ2QgIT09IG51bGwgJiYgIW1nZC5Jc0Fib3J0aW5nKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnRzKG1nZC5nZXRFeHBIYW5kbGVycygpLCBydEV2dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzaXplIG9mIHBhZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPnRhYmxlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJvd3NJblBhZ2VcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgaGFuZGxlUmVzaXplKGN0cmw6IE1nQ29udHJvbCwgcm93c0luUGFnZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAoPE1nRm9ybT5jdHJsLmdldEZvcm0oKSkuc2V0Um93c0luUGFnZShyb3dzSW5QYWdlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgZGF0YSBmb3IgUm93XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNlbmRBbGxcIj5pZiB0cnVlLCBzZW5kIGFsbCByZWNvcmRzXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyb3dcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVJvd0RhdGFDdXJQYWdlKHRhYmxlOiBNZ0NvbnRyb2wsIGRlc2lyZWRUb3BJbmRleDogbnVtYmVyLCBzZW5kQWxsOiBib29sZWFuLCBsYXN0Rm9jdXNlZFZhbDogTGFzdEZvY3VzZWRWYWwpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhYmxlLmdldEZvcm0oKTtcclxuICAgIGF3YWl0IGZvcm0uc2V0Um93RGF0YShkZXNpcmVkVG9wSW5kZXgsIHNlbmRBbGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRyYW5zZmVycyBkYXRhIHRvIEdVSSB0aHJlYWQgaW4gZnJlZSB3b3JrZXIgdGhyZWFkIHRpbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVUcmFuc2ZlckRhdGFUb0d1aShjdHJsOiBNZ0NvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPmN0cmwuZ2V0Rm9ybSgpO1xyXG4gICAgYXdhaXQgZm9ybS50cmFuc2ZlckRhdGFUb0d1aSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEZldGNoZXMgdGhlIGNodW5rIGZyb20gc2VydmVyLFxyXG4gIC8vLyAgIElmIHRoZSBsYXN0IHJlY29yZHMgaXMgbm90IHlldCBmZXRjaGVkIGl0IGZldGNoZXMgdGhlIG5leHQgY2h1bmssXHJcbiAgLy8vICAgRWxzZSwgZmV0Y2hlcyB0aGUgcHJldmlvdXMgY2h1bmtcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyKGN0cmw6IE1nQ29udHJvbCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+Y3RybC5nZXRGb3JtKCk7XHJcbiAgICBhd2FpdCBmb3JtLkZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlcigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFdoZW4gaW50ZXJuYWwgYWN0IGFza3MgZm9yIGVuYWJsZS9kaXNhYmxlIG9mIGFuIGFjdCBsaXN0LlxyXG4gIC8vLyAgIGNhbGwgZW5hYmxlTGlzdCB3aXRoIG9ubHlJZkNoYW5nZWQgPSB0cnVlIHRvIG1pbmltaXplIGNhbGxzIHRvcyByZWZyZXNoLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJlbmFibGVcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgaGFuZGxlRW5hYmxlRXZlbnRzKGV2dDogUnVuVGltZUV2ZW50LCBlbmFibGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGV2dC5nZXRUYXNrKCkuQWN0aW9uTWFuYWdlci5lbmFibGVMaXN0KGV2dC5nZXRBY3RFbmFibGVMaXN0KCksIGVuYWJsZSwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlcyBjb250cm9sIFByZWZpeFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVDdHJsUHJlZml4KGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPmV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgY3VyckNsaWNrZWRDdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPlJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5DdXJyZW50Q2xpY2tlZEN0cmw7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgIGxldCBkaXNwbGF5TGluZTogbnVtYmVyID0gZXZ0LmdldERpc3BsYXlMaW5lKCk7XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5ldnQuQ29udHJvbDtcclxuXHJcbiAgICBpZiAoZm9ybS5pc0xpbmVNb2RlKCkpIHtcclxuICAgICAgaWYgKGRpc3BsYXlMaW5lID09PSBJbnQzMi5NaW5WYWx1ZSB8fCBjdHJsLmlzUmFkaW8oKSlcclxuICAgICAgICBkaXNwbGF5TGluZSA9IGZvcm0uRGlzcGxheUxpbmU7XHJcbiAgICB9IGVsc2VcclxuICAgICAgZGlzcGxheUxpbmUgPSBJbnQzMi5NaW5WYWx1ZTtcclxuXHJcbiAgICBsZXQgbGFzdFBhcmtlZEN0cmw6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuXHJcbiAgICAvLyBwcmV2ZW50IGRvdWJsZSBwcmVmaXggb24gdGhlIHNhbWUgY29udHJvbFxyXG4gICAgLy8gRm9yIEZhc3QgTW9kZSwgQ1MgaXMgZXhlY3V0ZWQgZnJvbSBoZXJlLCB3aGVyZWFzIGZvciBzdGVwIG1vZGUgaXQgaXMgZG9uZVxyXG4gICAgLy8gaW4gbW92ZUluUm93LiBzbywgZm9yIHN0ZXAgbW9kZSBkb3VibGUgZXhlY3V0aW9uIG9mIENTIG11c3QgYmUgc3RvcHBlZC5cclxuICAgIGlmIChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbCAmJiAoPFRhc2s+bGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSkuZ2V0TUdEYXRhKCkuR2V0SWQoKSA9PT0gKDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSkuZ2V0TUdEYXRhKCkuR2V0SWQoKSAmJiBsYXN0UGFya2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wpIHtcclxuICAgICAgaWYgKChjdHJsICE9PSBsYXN0UGFya2VkQ3RybCB8fCAoY3RybC5pc1JlcGVhdGFibGUoKSAmJiBkaXNwbGF5TGluZSAhPT0gY3RybC5nZXREaXNwbGF5TGluZSh0cnVlKSkpICYmICFsYXN0UGFya2VkQ3RybC5pc0luQ29udHJvbFN1ZmZpeCgpKVxyXG4gICAgICAvLyBRQ1IgIzk3MDgwNlxyXG4gICAgICB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UobGFzdFBhcmtlZEN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJU1QgfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTyB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YIHx8IGN0cmwuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgICAgICAgY3RybC5yZXNldFByZXZWYWwoKTtcclxuICAgICAgICAgICAgYXdhaXQgY3RybC5SZWZyZXNoRGlzcGxheSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gVE9ETzogRm9jdXMgJiBUYWJiaW5nOiBIYW5kbGUgUGFya2luZyBpbiB0aGlzIGNhc2UuIFNob3VsZCBub3QgcmV0dXJuIGZhbHNlIGluIHNjcmVlbiBtb2RlXHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2VcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAodGFzay5JbkN0cmxQcmVmaXgpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICB0YXNrLkluQ3RybFByZWZpeCA9IHRydWU7XHJcblxyXG4gICAgLy8gbWFrZSBzdXJlIGl0IGhhcyBub3QgY29tZSBhZ2FpbiB0aHJvdWdoIG1vdmVpbnJvdy5cclxuICAgIC8vIGVnOiBpZiBjbGlja2VkIGN0cmwgb24gc3ViZm9ybSBpcyBub24gcGFya2FibGUsIGZpcnN0IHRpbWUgaXQgZXhlY3V0ZXMgUlAgQ1YgZm9yIHN1YmZvcm1zIGFuZCB0aGVuXHJcbiAgICAvLyBlbnRlcnMgbW92ZWlucm93IGZvciBwYXJrYWJsZSBjdHJsLiB3ZSBzaG91bGRub3QgZXhlY3V0ZSB0aGlzIGJsb2NrIHdoZW4gd2UgY29tZSBmb3IgQ1Agb2YgcGFya2FibGUgY3RybC5cclxuICAgIC8vIEZvciB0YWIsIHdlIGNvbWUgaGVyZSBkaXJlY3RseSBmb3IgcGFya2FibGUgY3RybCwgYW5kIHRoaXMgYmxvY2sgbXVzdCBhbHdheXMgZXhlY3V0ZSBpZiBvbiBkaWZmIGZvcm1zLlxyXG4gICAgLy8gaXNTb3J0IDogaWYgY2xpY2tlZCBvbiB0YWJsZSBoZWFkZXIsIHdlIHBhcmsgb24gY29sb21uIGN0cmwgYWZ0ZXIgc29ydCwgYW5kIHdlIG11c3QgaW5jbHVkZSBzdWJmb3Jtc1xyXG4gICAgLy8gaW4gZXhlY3V0aW5nIENWc1xyXG5cclxuICAgIC8vIFRPRE86IFRhYmJpbmcgJiBGb2N1c2luZzogQ2hlY2sgZ2V0TGFzdE1vdmVJblJvd0RpcmVjdGlvbiBpcyByZWxldmFudC4gV2hpbGUgbW92aW5nIGJldHdlZW4gY29udHJvbHMgYnkgVGFiIGNvZGUgaW4gaWYgYmxvY2sgd2FzIG5vdCBjYWxsZWQuXHJcbiAgICAvLyBCdXQgaXQgd2FzIGNhbGxlZCBvbiBjbGljayB0byBhbm90aGVyIGNvbnRyb2wuXHJcbiAgICAvL2lmICh0YXNrLmdldExhc3RNb3ZlSW5Sb3dEaXJlY3Rpb24oKSA9PT0gQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05PTkUgfHwgdGhpcy5faXNTb3J0aW5nKSB7XHJcblxyXG4gICAgLy8gSWYgdGhlIGN1cnJlbnQgY3RybCBpcyBvbiBhIHN1YmZvcm0sIHRoZW4gZXhlY3V0ZSBpbiBzZXF1ZW5jZVxyXG4gICAgLy8gMS4gUlMgb2YgbmVzdGVkIHN1YmZvcm1zIHVudGlsIHN1YmZvcm0gdGFzayBjb250YWluZyB0aGVzZSAyIHN1YmZvcm1zLiB3ZSBtdXN0IGFsc28gZXhlY3V0ZSBSUyBpZiBjbGlja2VkXHJcbiAgICAvLyAgICBpbiBzdWJmb3JtIGFuZCBwYXJrZWQgYmFjayBvbiBhIGN0cmwncyB0YXNrLiAoIzcyMjExNS0gY3VyckNsaWNrZWRDdHJsIGFuZCBjdHJsIHNob3VsZCBub3QgYmUgb24gZGlmZmVyZW50IHdpbmRvdylcclxuICAgIC8vIDIuIENWIGV4ZWN1dGlvbiBvZiBMYXN0UGFya2VkQ3RybCB0aWxsIGVuZFxyXG4gICAgLy8gMy4gUlAtQ1ZzIGZvciBhbGwgaW50ZXJtZWRpYXRlIHN1YmZvcm1zXHJcbiAgICBsZXQgcHJldkN0cmw6IE1nQ29udHJvbCA9IGxhc3RQYXJrZWRDdHJsO1xyXG4gICAgaWYgKGN1cnJDbGlja2VkQ3RybCAhPT0gbnVsbCAmJiAoPFRhc2s+Y3VyckNsaWNrZWRDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldE1nZElEKCkgPT09ICg8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldE1nZElEKCkgJiYgY3RybC5vbkRpZmZGb3JtKGN1cnJDbGlja2VkQ3RybCkpXHJcbiAgICAgIHByZXZDdHJsID0gY3VyckNsaWNrZWRDdHJsO1xyXG5cclxuICAgIGlmIChwcmV2Q3RybCAhPT0gbnVsbCAmJiBjdHJsLm9uRGlmZkZvcm0ocHJldkN0cmwpKSB7XHJcbiAgICAgIC8vIFJTIG9mIG5lc3RlZCBzdWJmb3JtcyB1bnRpbCBzdWJmb3JtIHRhc2sgY29udGFuaW5nIHRoZXNlIDIgc3ViZm9ybXNcclxuICAgICAgbGV0IHByZXZUYXNrOiBUYXNrID0gPFRhc2s+cHJldkN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgICAgYXdhaXQgcHJldlRhc2suZXhlY1N1YmZvcm1SZWNTdWZmaXgoPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWCB8fCBjdHJsLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICBjdHJsLnJlc2V0UHJldlZhbCgpO1xyXG4gICAgICAgICAgYXdhaXQgY3RybC5SZWZyZXNoRGlzcGxheSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0YXNrLkluQ3RybFByZWZpeCA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgICB0YXNrLkluQ3RybFByZWZpeCA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXdhaXQgRXZlbnRzTWFuYWdlci5kb1N5bmNGb3JTdWJmb3JtUGFyZW50KHRhc2spO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEV4ZWN1dGUgUlAgb2YgdGhlIGN1cnJlbnQgdGFzayBiZWZvcmUgZXhlY3V0aW5nIHRoZSBDVnMgYmVmb3JlICdjdHJsJ1xyXG4gICAgaWYgKHRhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgIGVsc2Uge1xyXG4gICAgICB0YXNrLlN1YmZvcm1FeGVjTW9kZSA9IFRhc2tfU3ViZm9ybUV4ZWNNb2RlRW51bS5TRVRfRk9DVVM7XHJcbiAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsLCBkaXNwbGF5TGluZSk7XHJcbiAgICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICB0YXNrLkluQ3RybFByZWZpeCA9IGZhbHNlO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvL31cclxuXHJcbiAgICAvLyBRQ1IjIDgwNjAxNTogSWYgd2UgaGF2ZSBhIHNpbmdsZSBmaWVsZCB3aXRoIGFsbG93IHBhcmtpbmcgPSBZZXMgYW5kIFRhYiBJbnRvID0gTm8sIHRoZW4gb24gcHJlc3NpbmcgdGFiIGlmIGN1cnNvciBpcyBub3QgbW92ZWQsIHdlIGNvbWUgdG9cclxuICAgIC8vIHBhcmsgb24gbGFzdFBhcmtlZEN0cmwod2hpY2ggaXMgc2FtZSBhcyBjdHJsKSBzaW5jZSBUYWJJbnRvIGlzIG5vdCBhbGxvd2VkLlxyXG4gICAgLy8gU28gdG8gYXZhb2lkIGluZmluaXRlIHJlY3Vyc2lvbiwgd2Ugc2hvdWxkIG5vdCBhZ2FpbiB0cnkgdG8gcGFyayBvbiBpdC5cclxuICAgIGlmICghYXdhaXQgY3RybC5Jc1BhcmthYmxlKCkgJiYgY3RybCAhPT0gbGFzdFBhcmtlZEN0cmwpIHtcclxuICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuXHJcbiAgICAgIGlmIChsYXN0UGFya2VkQ3RybCA9PT0gbnVsbCB8fCAhIGF3YWl0IGxhc3RQYXJrZWRDdHJsLmludm9rZSgpKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyhjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpO1xyXG5cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVN1cHBvcnRUb0xvZyhOU3RyaW5nLkZvcm1hdChcInswfSBFbnRlcmluZyBjb250cm9sOiBjb250cm9sIHsxfSwgcm93IHsyfVwiLCAgdGFzay5HZXRUYXNrRGV0YWlscygpLCBjdHJsLk5hbWUsIGRpc3BsYXlMaW5lIDwgMCA/IDAgOiBkaXNwbGF5TGluZSksIHRydWUpO1xyXG5cclxuICAgIC8vIGlmIHdlIGhhdmUgYSBzdG9wIGV4ZWN1dGlvbiBjdHJsLCB3ZSBuZWVkIHRvIHVzZSBpdCBhcyBhIHNyY3RybCwgb3RoZXJ3aXNlIHVzZVxyXG4gICAgLy8gdGhlIGN0cmwgb24gd2hpY2ggd2UgZXhlY3V0ZWQgbGFzdCBDUy5cclxuXHJcblxyXG4gICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKTtcclxuICAgIGN0cmwuS2V5U3Ryb2tlT24gPSBmYWxzZTtcclxuICAgIGN0cmwuTW9kaWZpZWRCeVVzZXIgPSBmYWxzZTtcclxuXHJcbiAgICB0YXNrLnNldEN1cnJGaWVsZChjdHJsLmdldEZpZWxkKCkpO1xyXG5cclxuICAgIGlmIChjdHJsLklzUmVwZWF0YWJsZSlcclxuICAgICAgYXdhaXQgZm9ybS5icmluZ1JlY29yZFRvUGFnZSgpO1xyXG5cclxuICAgIC8vIGVuYWJsZS1kaXNhYmxlIGFjdGlvbnMgZm9yIFN1YmZvcm1zXHJcbiAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IGN0cmwpIHtcclxuICAgICAgaWYgKChsYXN0UGFya2VkQ3RybCA9PT0gbnVsbCAmJiBjdHJsLmdldEZvcm0oKS5pc1N1YkZvcm0oKSkgfHwgKGxhc3RQYXJrZWRDdHJsICE9PSBudWxsICYmIChjdHJsLmdldEZvcm0oKS5pc1N1YkZvcm0oKSB8fCBsYXN0UGFya2VkQ3RybC5nZXRGb3JtKCkuaXNTdWJGb3JtKCkpKSkge1xyXG4gICAgICAgIGxldCBsYXN0UGFya2VkVGFzazogVGFzayA9IG51bGw7XHJcbiAgICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsICE9PSBudWxsKVxyXG4gICAgICAgICAgbGFzdFBhcmtlZFRhc2sgPSA8VGFzaz5sYXN0UGFya2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG5cclxuICAgICAgICBpZiAobGFzdFBhcmtlZFRhc2sgIT09IHRhc2spIHtcclxuICAgICAgICAgIGxldCBmaXJzdFRpbWU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgICAgbGV0IGlzU29uU3ViZm9ybTogYm9vbGVhbjtcclxuICAgICAgICAgIGxldCBwYXJlbnRUYXNrOiBUYXNrO1xyXG5cclxuICAgICAgICAgIGlmIChsYXN0UGFya2VkVGFzayAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpc1NvblN1YmZvcm0gPSBsYXN0UGFya2VkVGFzay5Jc1N1YkZvcm07XHJcblxyXG4gICAgICAgICAgICBmb3IgKHBhcmVudFRhc2sgPSBsYXN0UGFya2VkVGFzazsgcGFyZW50VGFzayAhPT0gbnVsbCAmJiBpc1NvblN1YmZvcm07IHBhcmVudFRhc2sgPSA8VGFzaz5wYXJlbnRUYXNrLmdldFBhcmVudCgpKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCFmaXJzdFRpbWUpIHtcclxuICAgICAgICAgICAgICAgIGlzU29uU3ViZm9ybSA9IHBhcmVudFRhc2suSXNTdWJGb3JtO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50VGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50VGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfREVMTElORSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50VGFzay5lbmFibGVDcmVhdGVBY3RzKGZhbHNlKTtcclxuICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaXNTb25TdWJmb3JtID0gdGFzay5Jc1N1YkZvcm07XHJcblxyXG4gICAgICAgICAgZm9yIChwYXJlbnRUYXNrID0gPFRhc2s+dGFzay5nZXRQYXJlbnQoKTsgKHBhcmVudFRhc2sgIT09IG51bGwpICYmIGlzU29uU3ViZm9ybTsgcGFyZW50VGFzayA9IDxUYXNrPnBhcmVudFRhc2suZ2V0UGFyZW50KCkpIHtcclxuICAgICAgICAgICAgaXNTb25TdWJmb3JtID0gcGFyZW50VGFzay5Jc1N1YkZvcm07XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRUYXNrLmdldEVuYWJsZVpvb21IYW5kbGVyKCkpXHJcbiAgICAgICAgICAgICAgcGFyZW50VGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHBhcmVudFRhc2suc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gV2hlbmV2ZXIgd2UgYXJlIG1vdmluZyBiZXR3ZWVuIHRhc2tzLCByZS1ldmFsdWF0ZSBBbGxvd01vZGVzLlxyXG4gICAgICAgICAgYXdhaXQgdGFzay5lbmFibGVNb2RlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGVuYWJsZSBhY3Rpb25zIGFuZCBzdGF0ZXNcclxuICAgIGlmICh0YXNrLmdldEVuYWJsZVpvb21IYW5kbGVyKCkgfHwgY3RybC51c2Vab29tSGFuZGxlcigpKVxyXG4gICAgICB0YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NLCB0cnVlKTtcclxuXHJcbiAgICBpZiAoY3RybC5pc1RleHRDb250cm9sKCkgfHwgY3RybC5pc0Nob2ljZUNvbnRyb2woKSlcclxuICAgICAgY3RybC5TZXRLZXlib2FyZExhbmd1YWdlKCk7XHJcblxyXG4gICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKVxyXG4gICAgICB0YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9CVVRUT04sIHRydWUpO1xyXG4gICAgYXdhaXQgdGFzay5zZXRDcmVhdGVEZWxldGVBY3RzRW5hYmxlU3RhdGUoKTtcclxuXHJcbiAgICBsZXQgZmllbGQ6IEZpZWxkID0gPEZpZWxkPmN0cmwuZ2V0RmllbGQoKTtcclxuICAgIGlmIChmaWVsZCAhPT0gbnVsbCAmJiBmaWVsZC5OdWxsQWxsb3dlZCAmJiBjdHJsLmlzTW9kaWZpYWJsZSgpICYmIGN0cmwuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKVxyXG4gICAgICB0YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9FRFRfTlVMTCwgdHJ1ZSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGRvIHNvbWUgZGVmYXVsdCBvcGVyYXRpb25zIGZvciBhbiBldmVudCBhbmQgcmV0dXJuIHRydWUgdG8gdGVsbCB0aGUgY2FsbGVyXHJcbiAgLy8vICAgdG8gY29udGludWUgaGFuZGxpbmcgdGhlIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2dFwiPnRoZSBldmVudCB0byBoYW5kbGU8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGVsbHMgdGhlIGNhbGxlciB3aGV0aGVyIHRvIGNvbnRpbnVlIGhhbmRsaW5nIHRoZSBldmVudDwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGNvbW1vbkhhbmRsZXJCZWZvcmUoZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlIDxib29sZWFuPiB7XHJcbiAgICBsZXQgZXZ0U2F2ZTogUnVuVGltZUV2ZW50ID0gZXZ0O1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ldnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gbnVsbDtcclxuICAgIGxldCBwcmV2UmVjOiBSZWNvcmQgPSBudWxsO1xyXG4gICAgbGV0IHZhbDogc3RyaW5nO1xyXG4gICAgbGV0IG9sZERpc3BsYXlMaW5lOiBudW1iZXIgPSBJbnQzMi5NaW5WYWx1ZTtcclxuXHJcbiAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmICh0YXNrLmlzQWJvcnRpbmcoKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1NZU1RFTSkge1xyXG4gICAgICBsZXQgYWN0SWQ6IG51bWJlciA9IHRoaXMuZ2V0TWF0Y2hpbmdBY3Rpb24oIGV2dC5nZXRLYmRJdG0oKSk7XHJcbiAgICAgIGlmIChhY3RJZCAhPT0gMCAmJiBldnQuQ29udHJvbCAhPT0gbnVsbClcclxuICAgICAgLy8gJiYgYWN0SWQgIT0gTUdfQUNUX1NFTEVDVClcclxuICAgICAge1xyXG4gICAgICAgIGV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoZXZ0LCBldnQpO1xyXG4gICAgICAgIGV2dC5zZXRJbnRlcm5hbChhY3RJZCk7XHJcbiAgICAgICAgZXZ0LnNldEFyZ0xpc3QobnVsbCk7XHJcbiAgICAgICAgbGV0IG1nQ29udHJvbDogTWdDb250cm9sID0gPE1nQ29udHJvbD5ldnQuQ29udHJvbDtcclxuICAgICAgICBldnRTYXZlLnNldEN0cmwobWdDb250cm9sKTtcclxuICAgICAgICBpZiAobWdDb250cm9sID09PSBudWxsKVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUUNSIyA5MzkyNTMgLSB3ZSBoYXZlIHRvIHByb2Nlc3MgY29tbW9uSGFuZGxlckJlZm9yZSBldmVuIGZvciBpbnRlcm5hbCBldmVudCBjb252ZXJ0ZWRcclxuICAgIC8vIGZyb20gc3lzdGVtIEV2ZW50XHJcbiAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCkge1xyXG4gICAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgICAgbGV0IGRpc3BsYXlMaW5lOiBudW1iZXIgPSBldnQuZ2V0RGlzcGxheUxpbmUoKTtcclxuICAgICAgbGV0IGR2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50YXNrLkRhdGFWaWV3O1xyXG4gICAgICByZWMgPSBkdi5nZXRDdXJyUmVjKCk7XHJcblxyXG4gICAgICBsZXQgY3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5ldnQuQ29udHJvbDtcclxuICAgICAgbGV0IGludEV2dENvZGU6IG51bWJlciA9IGV2dC5nZXRJbnRlcm5hbENvZGUoKTtcclxuXHJcbiAgICAgIGxldCBsYXN0Rm9jdXNlZEN0cmw6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuXHJcbiAgICAgIC8vIGZvciBpbnRlcm5hbCBldmVudHNcclxuICAgICAgc3dpdGNoIChpbnRFdnRDb2RlKSB7XHJcbiAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT006XHJcbiAgICAgICAgICAgbGV0IGJvb2x2YWwgPSBhd2FpdCB0aGlzLnNlbGVjdFByb2coY3RybCk7XHJcbiAgICAgICAgICAgaWYoYm9vbHZhbClcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCX09OX0RCTElDSzpcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX0ZPQ1VTOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGb2N1cyhjdHJsLCBkaXNwbGF5TGluZSwgZXZ0LmlzUHJvZHVjZUNsaWNrKCkpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX0ZPQ1VTX09OX05PTl9NQUdJQ19DT05UUk9MOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGb2N1c09uTm9uTWFnaWNDb250cm9sKGN0cmwpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX0tFWURPV046XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUtleURvd24odGFzaywgY3RybCwgZXZ0KTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9NT1VTRVVQOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVNb3VzZVVwKGN0cmwsIGRpc3BsYXlMaW5lLCBldnQuaXNQcm9kdWNlQ2xpY2soKSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVElPTjpcclxuICAgICAgICAgIGF3YWl0IHRoaXMub25BY3RTZWxlY3Rpb24oY3RybCwgZm9ybSwgZXZ0KTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVElNRVI6XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZVRpbWVyKGV2dCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFU0laRTpcclxuICAgICAgICAgIHRoaXMuaGFuZGxlUmVzaXplKGN0cmwsIGRpc3BsYXlMaW5lKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUk9XX0RBVEFfQ1VSUl9QQUdFOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVSb3dEYXRhQ3VyUGFnZShjdHJsLCBkaXNwbGF5TGluZSwgZXZ0LmlzU2VuZEFsbCgpLCBldnQuTGFzdEZvY3VzZWRWYWwpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9EVl9UT19HVUk6XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZVRyYW5zZmVyRGF0YVRvR3VpKGN0cmwpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9GRVRDSF9SRUNPUkRTX0FIRUFEX0ZST01fU0VSVkVSOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5mZXRjaFJlY29yZHNBaGVhZEZyb21TZXJ2ZXIoY3RybCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU5BQkxFX0VWRU5UUzpcclxuICAgICAgICAgIHRoaXMuaGFuZGxlRW5hYmxlRXZlbnRzKGV2dCwgdHJ1ZSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RJU0FCTEVfRVZFTlRTOlxyXG4gICAgICAgICAgdGhpcy5oYW5kbGVFbmFibGVFdmVudHMoZXZ0LCBmYWxzZSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfUFJFRklYOlxyXG4gICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWDpcclxuICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWDpcclxuICAgICAgICAgIC8vIERlZmVjdCAxMTU5MDMuIERvIG5vdCBleGVjdXRlIFJQIGlmIHRoZSBzdWJmb3JtIHBhcmVudCB0YXNrIGRpZG4ndCBmaW5pc2hlZCB5ZXRcclxuICAgICAgICAgIC8vIGl0J3MgQ29tbW9uSGFuZGxlckJlZm9yZSBmb3IgUlAuXHJcbiAgICAgICAgICBpZiAodGFzay5Jc1N1YkZvcm0gJiYgKDxUYXNrPnRhc2suZ2V0UGFyZW50KCkpLkluQ29tbW9uSGFuZGxlckJlZm9yZVJQKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgLy8gUmVjb3ZlcnkgZnJvbSB0cmFuc2FjdGlvbiByZXN0YXJ0IHdhcyBjb21wbGV0ZWQuIFdlIG1heSBub3cgY2xlYXIgdGhlIGZsYWdcclxuICAgICAgICAgIHRhc2suc2V0QWZ0ZXJSZXRyeShDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FKTtcclxuICAgICAgICAgIHRhc2suRGF0YVN5bmNlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIGlmICghdGFzay5pc1N0YXJ0ZWQoKSlcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHJcbiAgICAgICAgICAvLyBpZiB0aGUgZm9ybSBjb250YWlucyBhIHRhYmxlIGFuZCB0aGUgY29udHJvbCB3YXMgaW4gdGhlIHRhYmxlXHJcbiAgICAgICAgICAvLyBtb3ZlIHRvIHRoZSBuZXcgcm93XHJcbiAgICAgICAgICBpZiAoZm9ybS5nZXRSb3dzSW5QYWdlKCkgPiBJbnQzMi5NaW5WYWx1ZSAmJiBkaXNwbGF5TGluZSA+IEludDMyLk1pblZhbHVlKSB7XHJcbiAgICAgICAgICAgIC8vIGVuc3VyZSBhIHZhbGlkIHJvd1xyXG4gICAgICAgICAgICB3aGlsZSAoIWR2LnJlY0V4aXN0cyhkaXNwbGF5TGluZSkgJiYgZGlzcGxheUxpbmUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgZGlzcGxheUxpbmUtLTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZGlzcGxheUxpbmUgPj0gMCkge1xyXG4gICAgICAgICAgICAgIHByZXZSZWMgPSBkdi5nZXRDdXJyUmVjKCk7XHJcbiAgICAgICAgICAgICAgbGV0IG9sZFRhc2tNb2RlOiBzdHJpbmcgPSB0YXNrLmdldE1vZGUoKTtcclxuICAgICAgICAgICAgICBsZXQgb2xkUmVjSWQ6IG51bWJlciA9IHByZXZSZWMuZ2V0SWQoKTtcclxuXHJcbiAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIG9sZERpc3BsYXlMaW5lID0gZm9ybS5EaXNwbGF5TGluZTtcclxuICAgICAgICAgICAgICAgIC8vIG9sZERpc3BsYXlMaW5lID0gZm9ybS5nZXRDdXJyUm93KClcclxuICAgICAgICAgICAgICAgIGZvcm0uUHJldkRpc3BsYXlMaW5lID0gb2xkRGlzcGxheUxpbmU7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKGRpc3BsYXlMaW5lLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHRoZSBkaXNwbGF5IGlmIHRoZSBwcmV2aW91cyByZWNvcmQgd2FzIGRlbGV0ZWQgb3IgY2FuY2VsZWRcclxuICAgICAgICAgICAgICAgIGlmIChwcmV2UmVjICE9IG51bGwgJiYgIWR2LnJlY0V4aXN0c0J5SWQocHJldlJlYy5nZXRJZCgpKSkge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfVEFCTEUpO1xyXG4gICAgICAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHJlZnJlc2ggaXMgZXNzZW50aWFsLiBJZiBpdCBmYWlscyBiZWNhdXNlIG9mIGFuXHJcbiAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB0aGVuIHRoZSBvbGQgY3VyciByb3cgaXMgcmVzdG9yZWQgKGluIHRoZSBjYXRjaFxyXG4gICAgICAgICAgICAgICAgICAvLyBzdGF0ZW1lbnQpLiBJdCBjYW4gaGFwcGVuIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIGEgbGluZSB3aGljaFxyXG4gICAgICAgICAgICAgICAgICAvLyBiZWNvbWVzIGJsYW5rIGR1ZSB0byB0aGUgZGVsZXRpb24gb2YgdGhlIHByZXZpb3VzIHJlY29yZC5cclxuICAgICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlYyA9IGR2LmdldEN1cnJSZWMoKTtcclxuICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob2xkVGFza01vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmIG9sZERpc3BsYXlMaW5lID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgIWR2LnJlY0V4aXN0c0J5SWQob2xkUmVjSWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJldkxpbmU6IG51bWJlciA9IGZvcm0uZ2V0UHJldkxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5yZXN0b3JlT2xkRGlzcGxheUxpbmUocHJldkxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxhc3RGb2N1c2VkQ3RybCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEZvY3VzZWRDdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBsYXN0Rm9jdXNlZEN0cmwuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZS5TdGFja1RyYWNlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB0aHJvdyBlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gRXZlbnRzTWFuYWdlci5jb21tb25IYW5kbGVyQmVmb3JlKCk6IGludmFsaWQgbGluZSBudW1iZXI6IFwiICtcclxuICAgICAgICAgICAgICAgIGRpc3BsYXlMaW5lKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChyZWMgPT0gbnVsbClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFxyXG4gICAgICAgICAgICAgIFwiaW4gRXZlbnRzTWFuYWdlci5jb21tb25IYW5kbGVyQmVmb3JlKCk6IG5vIGN1cnJlbnQgcmVjb3JkIGF2YWlsYWJsZSAhXCIpO1xyXG5cclxuICAgICAgICAgIC8vIG9ubHkgZm9yIG5vbiBpbnRlcmFjdGl2ZSB0YXNrcy4gSW5jcmVhc2UgdGhlIHRhc2sncyBjb3VudGVyIGZvciBldmVyeSByZWNvcmQgd2UgcGFzcy5cclxuICAgICAgICAgIC8vIGRvIGl0IGJlZm9yZSB0aGUgZXZhbEVuZENvbmQgc2luY2UgaXQgbWlnaHQgaW5jbHVkZSBjb3VudGVyKDApLlxyXG4gICAgICAgICAgLy8gaW5jcmVhc2Ugb25seSBpZiBnb2luZyBpbnRvIHRoZSByZWMgcHJlZml4LlxyXG4gICAgICAgICAgaWYgKCF0YXNrLklzSW50ZXJhY3RpdmUgJiYgdGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgICAgICB0YXNrLmluY3JlYXNlQ291bnRlcigpO1xyXG5cclxuICAgICAgICAgIC8vIGNoZWNrIHRoZSBcInRhc2sgZW5kIGNvbmRpdGlvblwiIGJlZm9yZSBlbnRlcmluZyB0aGUgcmVjb3JkXHJcbiAgICAgICAgICBpZiAoYXdhaXQgdGFzay5ldmFsRW5kQ29uZChDb25zdEludGVyZmFjZS5FTkRfQ09ORF9FVkFMX0JFRk9SRSkpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChmb3JtLkhhc1RhYmxlKCkpXHJcbiAgICAgICAgICAgIGF3YWl0IGZvcm0uYnJpbmdSZWNvcmRUb1BhZ2UoKTtcclxuXHJcbiAgICAgICAgICAvLyB0byBwcmV2ZW50IGRvdWJsZSBwcmVmaXggb24gdGhlIHNhbWUgcmVjb3JkXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRMZXZlbCgpICE9PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgYXdhaXQgZm9ybS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuXHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIlJFQ09SRCBQUkVGSVg6IFwiICsgdGFzay5xdWVyeVRhc2tQYXRoKCkpO1xyXG4gICAgICAgICAgKGR2LmdldEN1cnJSZWMoKSkuc2V0Rm9yY2VTYXZlT3JnKGZhbHNlKTtcclxuICAgICAgICAgIChkdi5nZXRDdXJyUmVjKCkpLlN5bmNlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIGR2LnNhdmVPcmlnaW5hbCgpO1xyXG5cclxuICAgICAgICAgIC8vIGRvIFJlY29yZCBQcmVmaXggZm9yIGFsbCBmYXRoZXJzIHRoYXQgdGhlaXIgUmVjb3JkIFByZWZpeCBpcyBub3QgZG9uZSBlYXJsaWVyXHJcbiAgICAgICAgICBpZiAodGFzay5Jc1N1YkZvcm0gJiYgdGFzay5QZXJmb3JtUGFyZW50UmVjb3JkUHJlZml4KSB7XHJcbiAgICAgICAgICAgIGxldCBwYXJlbnRUYXNrID0gdGFzay5nZXRQYXJlbnQoKTtcclxuICAgICAgICAgICAgd2hpbGUgKHBhcmVudFRhc2suSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHBhcmVudFRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2socGFyZW50VGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50VGFzayA9IHBhcmVudFRhc2suZ2V0UGFyZW50KCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gaGFuZGxlIHN1Yi1mb3Jtc1xyXG4gICAgICAgICAgdGFzay5JbkNvbW1vbkhhbmRsZXJCZWZvcmVSUCA9IHRydWU7XHJcbiAgICAgICAgICBpZiAoYXdhaXQgdGFzay5DaGVja1JlZnJlc2hTdWJUYXNrcygpKVxyXG4gICAgICAgICAgICBhd2FpdCBkdi5jb21wdXRlU3ViRm9ybXMoKTtcclxuICAgICAgICAgIHRhc2suSW5Db21tb25IYW5kbGVyQmVmb3JlUlAgPSBmYWxzZTtcclxuICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKTtcclxuICAgICAgICAgIC8vIGVuYWJsZS1kaXNhYmxlIGFjdGlvbnMgZm9yIGEgcmVjb3JkXHJcbiAgICAgICAgICBhd2FpdCB0YXNrLmVuYWJsZVJlY29yZEFjdGlvbnMoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYOlxyXG4gICAgICAgICAgLy8gRm9yY2UgcmVjb3JkIHN1ZmZpeDpcclxuICAgICAgICAgIGxldCBmb3JjZVN1ZmZpeDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgbGV0IGlzU2VsZWN0aW9uVGFibGU6IGJvb2xlYW47XHJcblxyXG4gICAgICAgICAgdGFzay5Db25maXJtVXBkYXRlTm8gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAvLyBObyByZWNvcmQgLT4gbm8gc3VmZml4XHJcbiAgICAgICAgICBpZiAocmVjID09IG51bGwpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICBmb3JjZVN1ZmZpeCA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgIC8vIGRvIG5vdCBleGVjdXRlIHRoZSBcImJlZm9yZSByZWNvcmQgc3VmZml4XCIgd2hlbiBkZWxldGluZyB0aGUgcmVjb3JkIGFuZFxyXG4gICAgICAgICAgLy8gdGhlIHRhc2sgbW9kZSBpcyBkZWxldGUgKHRoZSBzZWNvbmQgcm91bmQpXHJcbiAgICAgICAgICBpZiAoKHJlYy5Nb2RpZmllZCB8fCBmb3JjZVN1ZmZpeCkgJiYgcmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSAmJlxyXG4gICAgICAgICAgICB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgICAgIC8vIHRvIHByZXZlbnQgZG91YmxlIHN1ZmZpeCBvbiB0aGUgc2FtZSByZWNvcmRcclxuICAgICAgICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKSB7XHJcbiAgICAgICAgICAgIHRhc2suc2V0SW5SZWNvcmRTdWZmaXgodHJ1ZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuICAgICAgICAgICAgdGFzay5zZXRJblJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBhd2FpdCB0YXNrLmhhbmRsZUV2ZW50T25TbGF2ZVRhc2tzKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIlJFQ09SRCBTVUZGSVg6IFwiICsgdGFzay5xdWVyeVRhc2tQYXRoKCkpO1xyXG5cclxuXHJcbiAgICAgICAgICAvLyBpbmRpY2F0ZSBuZXh0IHZlcmlmeUN0cmwgaXMgdGhlIGZpcnN0IGN0cmwgaW4gdGhlIHJlY29yZFxyXG5cclxuICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcblxyXG4gICAgICAgICAgaXNTZWxlY3Rpb25UYWJsZSA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVElPTiwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgIC8vIFF1ZXJ5IG1vZGUgLT4gZG8gc3VmZml4IG9ubHkgaWYgd2UgZm9yY2UgaXQgb3Igc29tZWhvdyB0aGUgcmVjb3JkIHdhcyB1cGRhdGVkXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkgJiYgIWZvcmNlU3VmZml4ICYmICFyZWMuTW9kaWZpZWQgJiZcclxuICAgICAgICAgICAgIWlzU2VsZWN0aW9uVGFibGUpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAoIXJlYy5Nb2RpZmllZCAmJiAhZm9yY2VTdWZmaXggJiYgKCFpc1NlbGVjdGlvblRhYmxlIHx8ICF0YXNrLkluU2VsZWN0KSkge1xyXG4gICAgICAgICAgICBpZiAocmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSl7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUNvbnRyb2xWZXJpZmljYXRpb24odGFzayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUgJiYgcmVjLk1vZGlmaWVkKSB7XHJcbiAgICAgICAgICAgIGlmICghIGF3YWl0IHRoaXMudXBkYXRlQ29uZmlybWVkKHRhc2spKVxyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgc3RvcEV4ZWN1dGlvbjogYm9vbGVhbiA9ICFhd2FpdCB0aGlzLmV4ZWN1dGVDb250cm9sVmVyaWZpY2F0aW9uKHRhc2spO1xyXG4gICAgICAgICAgLy8gZG8gbm90IGNvbnRpbnVlIHByb2Nlc3NpbmcgUlMgaWYgQ1YgcmV0dXJucyBlcnJvclxyXG4gICAgICAgICAgaWYgKHN0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWDpcclxuICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmhhbmRsZUN0cmxQcmVmaXgoZXZ0KSlcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gZGlkIG5vdCBzdWNjZWVkIGluIGVudGVyaW5nIHRoZSBjdHJsXHJcbiAgICAgICAgICAgIGV2dC5Db250cm9sLkluQ29udHJvbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBTkNFTDpcclxuICAgICAgICAgIE1hbmFnZXIuQ2xlYW5NZXNzYWdlUGFuZSh0YXNrKTsgLy8gUUNSICMzNzEzMjFcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWDpcclxuXHJcbiAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgc3RvcGV4ZWN1dGlvbiBjdHJsIHdlIHNob3VsZCBub3QgZXhlY3V0ZSBDUy5cclxuICAgICAgICAgIGlmIChjdHJsID09IG51bGwgfHwgdGhpcy5nZXRTdG9wRXhlY3V0aW9uQ3RybCgpICE9IG51bGwpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAvLyB0byBwcmV2ZW50IGRvdWJsZSBzdWZmaXggb24gdGhlIHNhbWUgY29udHJvbFxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTClcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgIGlmICghY3RybC5pc1N1YmZvcm0oKSkge1xyXG4gICAgICAgICAgICB2YWwgPSBNYW5hZ2VyLkdldEN0cmxWYWwoY3RybCk7XHJcblxyXG4gICAgICAgICAgICAvLyBXZSBhcmUgcmVzZXR0aW5nIHRoZSBmbGFnIGFzIHdlIGFyZSBtb3ZpbmcgZnJvbSBvbmUgY29udHJvbCB0byBvdGhlciBjb250cm9sLlxyXG4gICAgICAgICAgICB0YXNrLkN1cnJlbnRFZGl0aW5nQ29udHJvbCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAvLyB2YWxpZGF0ZSB0aGUgY29udHJvbHMgdmFsdWVcclxuICAgICAgICAgICAgLy8gRml4ZWQgYnVnICM6NzU4Nzg4LCB0aGUgYnJvd3NlciBjb250cm9sIHdpbGwgbm90IGJlIHVwZGF0ZSBmcm9tIHRoZSBmaWxlZC5cclxuICAgICAgICAgICAgLy8gUGF0Y2ggZm9yIFFDUiAjNzI5NzA2OlxyXG4gICAgICAgICAgICAvLyBNYWdpYyB0aHJlYWQgcHV0cyB0aGUgZm9sbG93aW5nIEdVSSBjb21tYW5kczpcclxuICAgICAgICAgICAgLy8gICAgUFJPUF9TRVRfSU1BR0VfRklMRV9OQU1FIHRvIHNldCB0aGUgaW1hZ2Ugb24gdGhlIEltYWdlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgIC8vICAgIFBST1BfU0VUX1RFWFQgdG8gc2V0IHRoZSB0ZXh0IG9mIHRoZSBUZXh0Qm94IGNvbnRyb2wuXHJcbiAgICAgICAgICAgIC8vICAgIFNFVF9GT0NVUyB0byBmb2N1cyBvbiB0aGUgVGV4dEJveCBjb250cm9sLlxyXG4gICAgICAgICAgICAvLyBOb3csIHdoZW4gdGhlIGV4ZWN1dGlvbiBpcyBieSBGNywgaWYgdGhlIGZpbGUgaXMgbm90IHJldHJpZXZlZCBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgICAgICAgICAgLy8gKGkuZS4gaWYgdGhlcmUgaXMgNDA0IGVycm9yKSwgSHR0cENsaWVudCByZS10cmllcyB0byBnZXQgdGhlIGZpbGUgZm9yIEhUVFB0aW1lb3V0LlxyXG4gICAgICAgICAgICAvLyBEdXJpbmcgdGhpcyB0aW1lIGFsbCB0aGUgR1VJIGV2ZW50cyBpbiBHdWlDb21tYW5kc1F1ZXVlIHJlbWFpbnMgcGVuZGluZyB1bmhhbmRsZWQuXHJcbiAgICAgICAgICAgIC8vIEluIHRoZSBtZWFuIHRpbWUsIE1hZ2ljIHRocmVhZCBleGVjdXRlcyB0aGUgRXhpdCBldmVudCBhbmQgZHVyaW5nIHRoaXMsIGl0IHRyaWVzXHJcbiAgICAgICAgICAgIC8vIHRvIGV4ZWN1dGUgdGhlIEN0cmwgU3VmZml4IG9mIHRoZSBUZXh0Qm94IGNvbnRyb2wuXHJcbiAgICAgICAgICAgIC8vIFNpbmNlIFNFVF9GT0NVUyBpcyBzdGlsbCBwZW5kaW5nIGluIHRoZSBxdWV1ZSwgdGhlIGxvZ2ljYWwgY29udHJvbCAoaWYgYWxsb3dUZXN0aW5nPU5vKVxyXG4gICAgICAgICAgICAvLyBpcyBub3QgbWFwcGVkIHdpdGggYW55IGFjdHVhbCB3aW5kb3dzIGNvbnRyb2wuXHJcbiAgICAgICAgICAgIC8vIE5vdyB3aGVuIHdlIHRyeSB0byBnZXQgdGhlIHZhbHVlIG9mIHRoaXMgbG9naWNhbCBjb250cm9sLCBMb2dpY2FsQ29udHJvbC5nZXRFZGl0b3JDb250cm9sKClcclxuICAgICAgICAgICAgLy8gcmV0dXJucyBudWxsIGFuZCBzbywgU3RhdGljVGV4dC5nZXRWYWx1ZSgpIHJldHVybnMgTG9naWNhbENvbnRyb2wuVGV4dCBpbnN0ZWFkIG9mIENvbnRyb2wuVGV4dFxyXG4gICAgICAgICAgICAvLyBCZWNhdXNlIFBST1BfU0VUX1RFWFQgaXMgYWxzbyBwZW5kaW5nLCBMb2dpY2FsQ29udHJvbC5UZXh0IGlzIG51bGwuXHJcbiAgICAgICAgICAgIC8vIEFuZCBzbyB0aGVyZSBpcyBhbiBleGNlcHRpb24gd2hlbiB1c2luZyBpdC5cclxuICAgICAgICAgICAgLy8gSWYgQWxsb3dUZXN0aW5nPVllcywgdGhlIHZhbCB3aWxsIGJlIGEgYmxhbmsgc3RyaW5nLiBTbywgdGhlcmUgaXMgbm8gY3Jhc2guXHJcbiAgICAgICAgICAgIC8vIEJ1dCBoZXJlIHdlIGhhdmUgYW5vdGhlciBwcm9ibGVtLiBTdXBwb3NlLCB0aGUgZmllbGQgaGFkIGFuIEluaXQgZXhwcmVzc2lvbi5cclxuICAgICAgICAgICAgLy8gTm93LCBNZ0NvbnRyb2wncyB2YWx1ZSB3b3VsZCBiZSB0aGUgaW5pdGVkIHZhbHVlIGFuZCB0aGUgdmFsIGlzIGEgYmxhbmsgc3RyaW5nLlxyXG4gICAgICAgICAgICAvLyBTbywgd2Ugd2lsbCBoYXZlIHZhcmlhYmxlIGNoYW5nZS5cclxuICAgICAgICAgICAgLy8gU2luY2UgdGhlIHByb2JsZW0gaXMgcmVsYXRlZCB0byBhIHZlcnkgc3BlY2lmaWMgc2NlbmFyaW8gLS0gd2hlbiB0aGUgaW1hZ2UgY29udHJvbCB3YXNcclxuICAgICAgICAgICAgLy8gdGhlIGZpcnN0IGRyb3BwZWQgY29udHJvbCBvbiB0aGUgZm9ybSwgaW1hZ2UgY2Fubm90IGJlIGFjY2Vzc2VkIGF0IHRoZSB0aW1lIG9mIHRhc2tcclxuICAgICAgICAgICAgLy8gbG9hZGluZyBhbmQgdGFzayBuZWVkcyB0byBiZSBjbG9zZWQsIHdlIGFyZSBwdXR0aW5nIGEgcGF0Y2ggaGVyZSBieSBjaGVja2luZyB2YWwgZm9yIE5VTEwuXHJcbiAgICAgICAgICAgIC8vIFRoZSBpZGVhbCBzb2x1dGlvbiB3b3VsZCBiZSAtLS0gaW5zdGVhZCBvZiBzZW5kaW5nIHRoZSBpbWFnZSBmaWxlIG5hbWUgZnJvbSBNYWdpYyB0aHJlYWRcclxuICAgICAgICAgICAgLy8gdG8gR3VpIHRocmVhZCBhbmQgbG9hZGluZyB0aGUgaW1hZ2UgZnJvbSB0aGUgR3VpIHRocmVhZCwgd2UgY2FuIGxvYWQgdGhlIGltYWdlIGZyb20gdGhlXHJcbiAgICAgICAgICAgIC8vIE1hZ2ljIHRocmVhZCAodXNpbmcgc3luYyBleGVjdXRpb24gaS5lLiB2aWEgR3VpSW50ZXJhY3RpdmUpIGFuZCBzZW5kIGl0IHRvIHRoZSBHdWkgdGhyZWFkLlxyXG4gICAgICAgICAgICBpZiAoIXRhc2suY2FuY2VsV2FzUmFpc2VkKCkgJiZcclxuICAgICAgICAgICAgICAoY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CUk9XU0VSICYmICghaXNOdWxsT3JVbmRlZmluZWQoY3RybC5fZmllbGQpICYmIGN0cmwuX2ZpZWxkLmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFIHx8IHZhbCAhPT0gbnVsbCkgJiYgdHlwZW9mIHZhbCAhPSBcInVuZGVmaW5lZFwiICYmXHJcbiAgICAgICAgICAgICAgICAhYXdhaXQgY3RybC52YWxpZGF0ZUFuZFNldFZhbHVlKHZhbCwgdHJ1ZSkpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIHdoZW4gc3RvcCBleGVjdXRpb24gaW4gb24sIGRvbid0IGNsZWFyIHRoZSBtc2cgZnJvbSBzdGF0dXMuXHJcbiAgICAgICAgICBpZiAoIXRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgICAgIE1hbmFnZXIuQ2xlYW5NZXNzYWdlUGFuZSh0YXNrKTtcclxuXHJcbiAgICAgICAgICAvLyByZXNldCBJbkNvbnRyb2wgYmVmb3JlIGV4ZWN1dGluZyBjb250cm9sIHZlcmlmaWNhdGlvblxyXG4gICAgICAgICAgY3RybC5JbkNvbnRyb2wgPSBmYWxzZTtcclxuICAgICAgICAgIGN0cmwuQ2xpcEJvYXJkRGF0YUV4aXN0cyA9IGZhbHNlO1xyXG4gICAgICAgICAgY3RybC5WYWxpZGF0ZUNvbnRyb2wgPSB0cnVlO1xyXG4gICAgICAgICAgY3RybC5zZXRJbkNvbnRyb2xTdWZmaXgodHJ1ZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBleGVjdXRlIGEgc2VsZWN0IHByb2dyYW0gYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvZ3JhbSB3YXMgZXhlY3V0ZWQgIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+dGhlIHNvdXJjZSBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcm9tcHRcIj5pZiB0cnVlIHRoZW4gdGhlIGNhbGxlciBpcyBleGVjdXRpbmcgdGhlIGNhbGxlZCBwcm9ncmFtIGF0IHRoZSBlbmQgb2YgY29udHJvbCBwcmVmaXg8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJvdGVjdGVkIGFzeW5jIHNlbGVjdFByb2coIGN0cmw6TWdDb250cm9sKTogUHJvbWlzZTxib29sZWFuPlxyXG4gIHtcclxuICAgIGxldCBjbWQgOiBJQ2xpZW50Q29tbWFuZCA7XHJcbiAgICBsZXQgdmFsdWU6IFN0cmluZztcclxuICAgIGxldCBtZ1ZhbDogc3RyaW5nO1xyXG4gICAgbGV0IHByb2dFeGVjdXRlZCA9IGZhbHNlO1xyXG4gICAgbGV0IHRhc2sgPSA8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcblxyXG4gICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgc2VsZWN0IHByb2dyYW0gdG8gdGhlIGNvbnRyb2xcclxuICAgIGlmIChjdHJsLkhhc1NlbGVjdFByb2dyYW0oKSlcclxuICAgIHtcclxuICAgICAgLy9jaGVjayBpZiB0aGUgY29udHJvbCBpcyBwYXJrYWJsZVxyXG4gICAgICBpZiAoY3RybC5Jc1BhcmthYmxlKCkpXHJcbiAgICAgIHtcclxuXHJcbiAgICAgICAgdmFsdWUgPSBNYW5hZ2VyLkdldEN0cmxWYWwoY3RybCk7XHJcblxyXG4gICAgICAgIC8vIHZhbGlkYXRlIHRoZSBjb250cm9scyB2YWx1ZVxyXG4gICAgICAgIGlmICghY3RybC52YWxpZGF0ZUFuZFNldFZhbHVlKHZhbHVlLCBmYWxzZSkpXHJcbiAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsZXQgIGVuY29kZWRWYWw6c3RyaW5nID0gbnVsbDtcclxuICAgICAgICAgIG1nVmFsID0gIGF3YWl0IGN0cmwuZ2V0TWdWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgICAgICB2YXIgcmVjID0gKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICAgICAgICBlbmNvZGVkVmFsID0gcmVjLmdldFhNTEZvclZhbHVlKGN0cmwuZ2V0RmllbGQoKS5nZXRJZCgpLCBtZ1ZhbCk7XHJcbiAgICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVTZWxlY3RQcm9ncmFtQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgbnVsbCwgSW50MzIuTWluVmFsdWUsIGN0cmwuZ2V0RGl0SWR4KCksIGVuY29kZWRWYWwpO1xyXG4gICAgICAgICAgdGFzay5nZXRNR0RhdGEoKS5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcblxyXG4gICAgICAgICAgbGV0IGNvbW1hbmRzUHJvY2Vzc29yU2VydmVyOkNvbW1hbmRzUHJvY2Vzc29yQmFzZSA9IENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpO1xyXG4gICAgICAgICAgYXdhaXQgY29tbWFuZHNQcm9jZXNzb3JTZXJ2ZXIuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcblxyXG4gICAgICAgICAgcHJvZ0V4ZWN1dGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICByZXR1cm4gcHJvZ0V4ZWN1dGVkO1xyXG59XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUNvbnRyb2xWZXJpZmljYXRpb24odGFzazpUYXNrKTpQcm9taXNlIDxib29sZWFuPiB7XHJcblxyXG4gICAgLy8gY2hlY2sgYWxsIGhhbmRsZXJzIGlmIGl0IGlzIGNvbnRyb2wgdmVyaWZpY2F0aW9uLiBFeGVjdXRlIGFsbCBTViBoYW5kbGVyc1xyXG4gICAgbGV0IHRhYmxlOkhhbmRsZXJzVGFibGUgID0gdGFzay5nZXRIYW5kbGVyc1RhYigpO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRhYmxlLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGxldCBoYW5kbGVyOiBFdmVudEhhbmRsZXIgPSB0YWJsZS5nZXRIYW5kbGVyKGkpO1xyXG4gICAgICBsZXQgZXZ0OiBFdmVudCA9IGhhbmRsZXIuZ2V0RXZlbnQoKTtcclxuICAgICAgaWYgKGV2dC5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfVkVSSUZJQ0FUSU9OKSB7XHJcbiAgICAgICAgbGV0IGNvbnRyb2w6IE1nQ29udHJvbCA9ICgodGFzay5nZXRGb3JtKCkgIT09IG51bGwpID8gKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLmdldEN0cmxCeUN0cmxOYW1lKGhhbmRsZXIuZ2V0Q3RybE5hbWUoKSkgOiBudWxsKTtcclxuICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGNvbnRyb2wpKSB7XHJcbiAgICAgICAgICBsZXQgcnVuVGltZUV2ZW50OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGNvbnRyb2wpO1xyXG4gICAgICAgICAgcnVuVGltZUV2ZW50LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1ZFUklGSUNBVElPTik7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ1blRpbWVFdmVudCwgZmFsc2UpO1xyXG4gICAgICAgICAgaWYodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBlcnJvciwgcGFyay9mb2N1cyBvbiB0aGlzIGNvbnRyb2wgd2hlcmUgZXJyb3Igb2NjdXJzIGluIENWIGV4ZWN1dGlvbi5cclxuICAgICAgICAgICAgTGFzdEZvY3VzZWRNYW5hZ2VyLnNldExhc3RGb2N1c2VkQ29udHJvbCh0YXNrLCBjb250cm9sKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChudWxsKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChjb250cm9sKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBvbkFjdFNlbGVjdGlvbihjdHJsOiBNZ0NvbnRyb2wsIGZvcm06IE1nRm9ybSwgZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkaXNwbGF5TGluZTogbnVtYmVyID0gZXZ0LmdldERpc3BsYXlMaW5lKCk7XHJcbiAgICBpZiAoZGlzcGxheUxpbmUgPT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICBkaXNwbGF5TGluZSA9IGZvcm0uRGlzcGxheUxpbmU7XHJcblxyXG4gICAgbGV0IHNpbXVsYXRlOiBib29sZWFuID0gY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJU1QgfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTyB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTiB8fCAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUIgJiYgIWV2dC5pc1Byb2R1Y2VDbGljaygpKTtcclxuICAgIGlmIChzaW11bGF0ZSlcclxuICAgICAgYXdhaXQgdGhpcy5zaW11bGF0ZVNlbGVjdGlvbihjdHJsLCBldnQuZ2V0VmFsdWUoKSwgZGlzcGxheUxpbmUsIGV2dC5pc1Byb2R1Y2VDbGljaygpKTtcclxuICAgIGVsc2VcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVTZWxlY3Rpb24oY3RybCwgZGlzcGxheUxpbmUsIGV2dC5nZXRWYWx1ZSgpKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZSB0aGUgTUdfQUNUX1NVQkZPUk1fQ0xPU0VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm9ybVwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBvblN1YmZvcm1DbG9zZSh0YXNrOiBUYXNrLCBldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGlmICgoZXZ0LmdldEFyZ0xpc3QoKSAhPSBudWxsKSAmJiAoZXZ0LmdldEFyZ0xpc3QoKS5nZXRTaXplKCkgPT09IDEpKSB7XHJcbiAgICAgIGxldCBzdWJmb3JtQ3RybDogTWdDb250cm9sID0gbnVsbDtcclxuICAgICAgbGV0IGNsb3NpbmdTdWJmb3JtTmFtZTogc3RyaW5nID0gYXdhaXQgZXZ0LmdldEFyZ0xpc3QoKS5nZXRBcmdWYWx1ZSgwLCBTdG9yYWdlQXR0cmlidXRlLkFMUEhBLCAwKTtcclxuXHJcbiAgICAgIC8vIFFDUiAjMjgzMTE0LiBBcmd1bWVudCBvZiAnU3ViZm9ybSByZWZyZXNoIGV2ZW50JyBjYW4gYmUgc2tpcHBlZCBvciBub3QgZXhpc3QuXHJcbiAgICAgIGlmIChjbG9zaW5nU3ViZm9ybU5hbWUgPT0gbnVsbClcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAvLyBSUyBtdXN0IGJlIGV4ZWN1dGVkIG9ubHkgaWYgdGhlIGN1cnJlbnQgc3ViZm9ybSBpcyByZWZyZXNoZWQuXHJcbiAgICAgIC8vIElmIGl0cyBicm90aGVyIGlzIHJlZnJlc2hlZCB3ZSBkbyBub3QgbmVlZCB0byBleGVjdXRlIFJTIG9mIHRoZSBjdXJyZW50IHRhc2suXHJcbiAgICAgICAgZm9yIChsZXQgcGFyZW50VGFzazogVGFzayA9IHRhc2s7IHBhcmVudFRhc2suZ2V0Rm9ybSgpICE9IG51bGwgJiYgcGFyZW50VGFzay5nZXRNZ2RJRCgpID09PSB0YXNrLmdldE1nZElEKCk7IHBhcmVudFRhc2sgPSA8VGFzaz5wYXJlbnRUYXNrLmdldFBhcmVudCgpKSB7XHJcbiAgICAgICAgICBzdWJmb3JtQ3RybCA9IDxNZ0NvbnRyb2w+cGFyZW50VGFzay5nZXRGb3JtKCkuZ2V0Q3RybEJ5TmFtZShjbG9zaW5nU3ViZm9ybU5hbWUudHJpbSgpLCBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9TVUJGT1JNKTtcclxuICAgICAgICAgIGlmIChzdWJmb3JtQ3RybCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGxldCBzdWJmb3JtVGFzazogVGFzayA9IDxUYXNrPnN1YmZvcm1DdHJsLmdldFN1YmZvcm1UYXNrKCk7XHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBzdWJmb3JtIHRhc2sgd2FzIG5vdCBvcGVuZWQgeWV0LCBidXQgc3ViZm9ybSByZWZyZXNoIGlzIGRvbmUsXHJcbiAgICAgICAgICAgIC8vIGl0J3MgbmVlZGVkIHRvIG9wZW4gdGhlIHN1YmZvcm0uIFFDUiAjNDE1OTE0LlxyXG4gICAgICAgICAgICBpZiAoc3ViZm9ybVRhc2sgIT0gbnVsbCAmJiAhc3ViZm9ybVRhc2suSXNSb3V0ZSgpKSB7XHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wZXJmb3JtU3ViZm9ybUNsb3NlKHN1YmZvcm1DdHJsKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGVyZm9ybVN1YmZvcm1DbG9zZSgpICAgOiBDbG9zZXMgdGhlIHN1YmZvcm0gdGFzayBvcGVuZWQgaW4gdGhlIHN1YmZvcm1DdHJsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN1YmZvcm1DdHJsXCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHVibGljIGFzeW5jIHBlcmZvcm1TdWJmb3JtQ2xvc2UgKHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzdWJmb3JtVGFzazogVGFzayA9IDxUYXNrPnN1YmZvcm1DdHJsLmdldFN1YmZvcm1UYXNrKCk7XHJcbiAgICBsZXQgcGFyZW50VGFzazogVGFzayA9IDxUYXNrPnN1YmZvcm1DdHJsLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcblxyXG4gICAgbGV0IG1nZDogTUdEYXRhID0gc3ViZm9ybVRhc2suZ2V0TUdEYXRhKCk7XHJcbiAgICB0aGlzLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICBhd2FpdCBzdWJmb3JtVGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICB0aGlzLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgIHtcclxuICAgICAgcGFyZW50VGFzay5UYXNrU2VydmljZS5SZW1vdmVSZWNvbXB1dGVzKHBhcmVudFRhc2spO1xyXG4gICAgICBhd2FpdCBzdWJmb3JtVGFzay5zdG9wKCk7XHJcblxyXG4gICAgICBzdWJmb3JtQ3RybC5yZXNldFN1YmZvcm1UYXNrKCk7XHJcbiAgICAgIGF3YWl0IENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICBDb21tYW5kcy5hZGRDbG9zZXN1YmZvcm0oQ29tbWFuZFR5cGUuQ0xPU0VfU1VCX0ZPUk0sIHN1YmZvcm1DdHJsLCBzdWJmb3JtVGFzay5nZXRUYXNrVGFnKCksICg8TWdDb250cm9sQmFzZT5zdWJmb3JtQ3RybCkuZ2V0TmFtZSgpLCBzdWJmb3JtVGFzay5nZXRGb3JtKCkuYnVpbGRGb3JtTmFtZSgpKTtcclxuXHJcbiAgICAgIC8vIFNldCBtZ2QuYWJvcnQoKSwgaW4gb3JkZXIgdG8gY2xvc2UgY3VycmVudCBldmVudCBsb29wIG9mIE1vZGFsIHN1YmZvcm0uXHJcbiAgICAgIC8vIGFuZCByZXNldCBpdCBiYWNrIHRvIGZhbHNlIG9uY2UgaXQgY29tZXMgb3V0IG9mIGN1cnJlbnQgZXZlbnRzbG9vcCgpLlxyXG4gICAgICBpZiAoKDxNZ0NvbnRyb2xCYXNlPnN1YmZvcm1DdHJsKS5Jc01vZGFsKCkpXHJcbiAgICAgICAgbWdkLmFib3J0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBtb3ZlIHRvIGFuIG90aGVyIGxpbmUgYW5kIGZvY3VzIG9uIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm9ybVwiPiA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlzcGxheUxpbmVcIj5saW5lIHRvIG1vdmUgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sIHRvIGZvY3VzIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBtb3ZlVG9MaW5lKGZvcm06IE1nRm9ybSwgZGlzcGxheUxpbmU6IG51bWJlciwgY3RybDogTWdDb250cm9sKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcnVuVGltZUV2ZW50OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwsIGRpc3BsYXlMaW5lKTtcclxuICAgIHJ1blRpbWVFdmVudC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnVuVGltZUV2ZW50LCBmYWxzZSk7XHJcbiAgICBpZiAoY3RybCAhPT0gbnVsbClcclxuICAgICAgICBhd2FpdCBjdHJsLmludm9rZSgpO1xyXG5cclxuICAgIGZvcm0uU2VsZWN0Um93KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNhbGN1bGF0ZSBhcmd1bWVudHMgZm9yIGV2ZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldnRcIj4gPC9wYXJhbT5cclxuICBwcml2YXRlIGNyZWF0ZUV2ZW50QXJndW1lbnRzKGV2dDogUnVuVGltZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZ0LmdldEFyZ0xpc3QoKSA9PT0gbnVsbCkge1xyXG4gICAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCkge1xyXG4gICAgICAgIHN3aXRjaCAoZXZ0LmdldEludGVybmFsQ29kZSgpKSB7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRvU3VmZml4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIERvVGFza0xldmVsUmVjb3JkU3VmZml4KHRhc2s6IFRhc2tCYXNlLCByZWZEb1N1ZmZpeDogUmVmUGFyYW08Ym9vbGVhbj4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBzaG91bGRSZXR1cm46IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1JFQ09SRCkge1xyXG4gICAgICByZWZEb1N1ZmZpeC52YWx1ZSA9IGZhbHNlO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgc2hvdWxkUmV0dXJuID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2hvdWxkUmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgRG9UYXNrTGV2ZWxSZWNvcmRQcmVmaXgodGFzazogVGFza0Jhc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkbyB0aGUgbWFnaWMgZGVmYXVsdCBvcGVyYXRpb25zIGFjY29yZGluZyB0byB0aGUgaW50ZXJuYWwgZXZlbnQgY29kZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldnRcIj50aGUgZXZlbnQgdG8gaGFuZGxlIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0ZWxscyB0aGUgY2FsbGVyIHdoZXRoZXIgdG8gY29udGludWUgaGFuZGxpbmcgdGhlIGV2ZW50IDwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGNvbW1vbkhhbmRsZXIoZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+ZXZ0LmdldFRhc2soKTtcclxuICAgIGxldCBtZ0RhdGE6IE1HRGF0YSA9IHRhc2suZ2V0TUdEYXRhKCk7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPmV2dC5Db250cm9sO1xyXG4gICAgbGV0IGxhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2w7XHJcbiAgICBsZXQgZG9TdWZmaXg6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IG9sZE1vZGU6IHN0cmluZztcclxuICAgIGxldCBzZXJ2ZXI6IENvbW1hbmRzUHJvY2Vzc29yQmFzZSA9IFRhc2suQ29tbWFuZHNQcm9jZXNzb3I7XHJcblxyXG4gICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICAvLyBpZiB0aGlzIGlzIGEgdXNlciBldmVudCB0aGF0IGNvbnZlcnRzIHRvIGEgc3lzdGVtIG9yIGludGVybmFsIGV2ZW4sIGNvbnZlcnQgaXRcclxuICAgIGlmIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIpXHJcbiAgICAgIGV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoZXZ0LmdldFVzZXJFdmVudCgpLCBldnQpO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMucHVzaFJ0RXZlbnQoZXZ0KTtcclxuXHJcbiAgICAgIGlmIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1NZU1RFTSkge1xyXG4gICAgICAgIGxldCBhY3RJZDogbnVtYmVyID0gdGhpcy5nZXRNYXRjaGluZ0FjdGlvbiggIGV2dC5nZXRLYmRJdG0oKSk7XHJcbiAgICAgICAgaWYgKGFjdElkICE9PSAwKVxyXG4gICAgICAgIC8vIGhhbmRsZWQgaW50ZXJuYWxseVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoZXZ0LCBldnQpO1xyXG4gICAgICAgICAgZXZ0LnNldEludGVybmFsKGFjdElkKTtcclxuICAgICAgICAgIGV2dC5zZXRBcmdMaXN0KG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfS8vIGVuZCBvZiBzeXN0ZW0gZXZlbnRzIHByb2Nlc3NpbmdcclxuXHJcbiAgICAgIC8vIGV4ZWN1dGUgdGhlIGNvbW1vbiBoYW5kbGluZyBvZiBpbnRlcm5hbCBldmVudHMgb25seSBpZiB0aGV5IGFyZSBub3QgaW1tZWRpYXRlLlxyXG4gICAgICAvLyBhbiBldmVudCBpcyBpbW1lZGlhdGUgd2hlbiBpdCB3YXMgcmFpc2VkIGJ5IGEgcmFpc2UgZXZlbnQgb3BlcmF0aW9uIHRoYXQgaXRzXHJcbiAgICAgIC8vIHdhaXQgY29uZGl0aW9uIGlzIHllcyBvciBldmFsdWF0ZXMgdG8gdHJ1ZS5cclxuICAgICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQ7XHJcbiAgICAgIGlmIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmICFldnQuaXNJbW1lZGlhdGUoKSAmJiB0aGlzLkFjdEFsbG93ZWQoZXZ0LmdldEludGVybmFsQ29kZSgpKSAmJiAhdGhpcy5fcHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKSB7XHJcbiAgICAgICAgbGV0IGNtZHNUb1NlcnZlcjogQ29tbWFuZHNUYWJsZSA9IDxDb21tYW5kc1RhYmxlPm1nRGF0YS5DbWRzVG9TZXJ2ZXI7XHJcbiAgICAgICAgbGV0IGR2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50YXNrLkRhdGFWaWV3O1xyXG4gICAgICAgIGxldCByZWM6IFJlY29yZCA9IGR2LmdldEN1cnJSZWMoKTtcclxuXHJcbiAgICAgICAgbGV0IGludEV2dENvZGU6IG51bWJlciA9IGV2dC5nZXRJbnRlcm5hbENvZGUoKTtcclxuXHJcbiAgICAgICAgLy8gZm9yIGludGVybmFsIGV2ZW50c1xyXG4gICAgICAgIHN3aXRjaCAoaW50RXZ0Q29kZSkge1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NVQkZPUk1fQ0xPU0U6XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub25TdWJmb3JtQ2xvc2UodGFzaywgZXZ0KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0JVVFRPTjpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfSElUOlxyXG4gICAgICAgICAgICAvLyBpZiBidXR0b24gaXMgbm90IHBhcmthYmxlLCByYWlzZSBpdHMgZXZlbnQgb25seSBpZiB0aGUgYWN0aW9uIHdhcyBub3QgdHJpZ2dlcmVkIGJ5IGd1aS5cclxuICAgICAgICAgICAgLy8gZGlyZWN0IGNsaWNrIG9uIHRoZSBidXR0b24gd2lsbCBnZXQgaGVyZSBhcyBjdHJsIGhpdCAsIGJ1dCBpcyBub3QgdHJpZ2dlcmVkIGJ5IGd1aSAoZ29lcyB2aWEgc2VsZWN0aW9uIGV2ZW50IDFzdClcclxuICAgICAgICAgICAgLy8gb3RoZXIgY3RybF9oaXQgYWN0aW9ucyBzaG91bGQgY29uc2lkZXIgdGhlIHBhcmthYmlsaXR5XHJcbiAgICAgICAgICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTiAmJlxyXG4gICAgICAgICAgICAgIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQlVUVE9OIHx8ICFldnQuaXNHdWlUcmlnZ2VyZWRFdmVudCgpIHx8IGN0cmwuaXNQYXJrYWJsZSh0cnVlKSkpIHtcclxuICAgICAgICAgICAgICBsZXQgYVJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsKTtcclxuICAgICAgICAgICAgICBpZiAoY3RybC5nZXRSdEV2dFRhc2soKSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgYVJ0RXZ0LnNldFRhc2soY3RybC5nZXRSdEV2dFRhc2soKSk7XHJcbiAgICAgICAgICAgICAgaWYgKENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfTk9ORSAhPT0gYVJ0RXZ0LmdldFR5cGUoKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGN0cmwudXNlWm9vbUhhbmRsZXIoKSkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgdGFza1RvRW5hYmxlOiBUYXNrID0gPFRhc2s+YVJ0RXZ0LmdldFRhc2soKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRhc2tUb0VuYWJsZSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgIHRhc2tUb0VuYWJsZS5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBhUnRFdnQuc2V0QXJnTGlzdChjdHJsLkFyZ0xpc3QpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgYVJ0RXZ0LnNldFB1YmxpY05hbWUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkVG9UYWlsKGFSdEV2dCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQW5kU2F2ZVJvdXRlRXZlbnRJZkN0eFJlbW92ZWRGcm9tU3J2ciAoYVJ0RXZ0KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUIpIHtcclxuICAgICAgICAgICAgICAvLyBGaXhlZCBidWcgIzcyNDE1MDogYXMgd2UgZG9pbmcgZm9yIG9ubGluZSBmb3IgdGFiIGNvbnRyb2wgd2Ugc2VuZCBBQ1RfWk9PTSAoQ2hvaWNlaW5wLmNwcCA6OkRpdEdldCgpKVxyXG4gICAgICAgICAgICAgIHRoaXMuYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kQ29kZShjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTykge1xyXG4gICAgICAgICAgICAgIGN0cmwuc2V0Q29udHJvbFRvRm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVE9HR0xFX0lOU0VSVDpcclxuICAgICAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlRvZ2dsZUluc2VydE1vZGUoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0xPU0U6XHJcbiAgICAgICAgICAgIGxldCBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoZXZ0LCBldnQpO1xyXG4gICAgICAgICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVDpcclxuICAgICAgICAgICAgLy8gaWYgJ2V4aXQnIGFjY2VwdGVkIG9uIE1ESSwgZXhpdCB0aGUgdG9wIG1vc3QgdGFzay4gc2FtZSBhcyB3aGVuIGV4aXRpbmcgdGhlIHN5c3RlbS5cclxuICAgICAgICAgICAgbGV0IHRhc2tUb0VuZDogVGFzayA9ICh0YXNrLmlzTWFpblByb2coKSA/IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKSA6IHRhc2spO1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrVG9FbmQuZW5kVGFzayhldnQucmV2ZXJzaWJsZUV4aXQoKSwgZmFsc2UsIGV2dC5FeGl0RHVlVG9FcnJvcigpKTtcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVRfU1lTVEVNOlxyXG4gICAgICAgICAgICAvLyBlbmQgdGhlIHRvcCBtb3N0IHRhc2sgd2l0aCBmb3JtLlxyXG4gICAgICAgICAgICBhd2FpdCBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuZW5kVGFzayhldnQucmV2ZXJzaWJsZUV4aXQoKSwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgZmFsc2UpO1xyXG4gICAgICAgICAgICAvLyBHZXRUb3BNb3N0VGFza1dpdGhGb3JtKHRhc2spLmVuZFRhc2soZXZ0LnJldmVyc2libGVFeGl0KCksIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRMSU5FOlxyXG4gICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1JPVywgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWTElORTpcclxuICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1csIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9QUkVWKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVFBBR0U6XHJcbiAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSwgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX05FWFQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWUEFHRTpcclxuICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fUFJFVik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdQQUdFOlxyXG4gICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1BBR0UsIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9CRUdJTik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9FTkRQQUdFOlxyXG4gICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1BBR0UsIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9FTkQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHVEJMOlxyXG4gICAgICAgICAgICAvLyAjOTE4NTg4OiBJZiBjdHJsK2hvbWUvY3RybCtlbmQgcHJlc3NlZCB3aGVuIHBhcmtlZCBvbiBsaXN0Ym94XHJcbiAgICAgICAgICAgIC8vIHRoZW4gQmVnaW4gdGFibGUgZXZlbnQgc2hvdWxkIG5vdCBiZSBoYW5kbGVkLlxyXG4gICAgICAgICAgICBsYXN0UGFya2VkQ3RybCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICAgICAgICBpZiAobGFzdFBhcmtlZEN0cmwgPT0gbnVsbCB8fCAhbGFzdFBhcmtlZEN0cmwuaXNMaXN0Qm94KCkpIHtcclxuICAgICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfVEFCTEUsIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9CRUdJTik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0VORFRCTDpcclxuICAgICAgICAgICAgLy8gIzkxODU4ODogSWYgY3RybCtob21lL2N0cmwrZW5kIHByZXNzZWQgd2hlbiBwYXJrZWQgb24gbGlzdGJveFxyXG4gICAgICAgICAgICAvLyB0aGVuIEJlZ2luIHRhYmxlIGV2ZW50IHNob3VsZCBub3QgYmUgaGFuZGxlZC5cclxuICAgICAgICAgICAgbGFzdFBhcmtlZEN0cmwgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsID09PSBudWxsIHx8ICFsYXN0UGFya2VkQ3RybC5pc0xpc3RCb3goKSkge1xyXG4gICAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9UQUJMRSwgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX0VORCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCX09OX0RCTElDSzoge1xyXG4gICAgICAgICAgICAvLyBVbmxpa2UgT25saW5lLCBoZXJlIFNFTEVDVCBvciBaT09NIGNvbWVzIGFmdGVyIHRoZSBEQkNMSUNLLlxyXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIERCQ0xJQ0sgaGFuZGxlciB3aXRoIHByb3BvZ2F0ZSA9ICdOTycgLCB0aGVzZSBhY3Rpb25zIHdpbGwgbm90IGJlIHJhaXNlZC5cclxuICAgICAgICAgICAgbGV0IGN0cmxUeXBlOiBNZ0NvbnRyb2xUeXBlID0gY3RybC5UeXBlO1xyXG4gICAgICAgICAgICBsZXQgcHV0QWN0aW9uOiBudW1iZXIgPSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfTk9ORTtcclxuICAgICAgICAgICAgaWYgKGN0cmxUeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUJMRSAmJiBjdHJsVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTEFCRUwgJiZcclxuICAgICAgICAgICAgICBjdHJsVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfSU1BR0UpIHtcclxuICAgICAgICAgICAgICBpZiAoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLkFjdGlvbk1hbmFnZXIuaXNFbmFibGVkKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1QpKVxyXG4gICAgICAgICAgICAgICAgcHV0QWN0aW9uID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVDtcclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuQWN0aW9uTWFuYWdlci5pc0VuYWJsZWQoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00pKVxyXG4gICAgICAgICAgICAgICAgICBwdXRBY3Rpb24gPSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGlmIChwdXRBY3Rpb24gIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9OT05FKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRJbnRlcm5hbEV2ZW50V2l0aEN0cmxBbmRDb2RlKGN0cmwsIHB1dEFjdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfREVMTElORTpcclxuICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuSGFuZGxlQWN0aW9uRGVsbGluZSggdGFzaywgZHYsIHJlYywgZmFsc2UpKVxyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORTpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkVfQUJPVkU6XHJcbiAgICAgICAgICAgIGlmICh0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nb3RvQ3JlYXRlTW9kZSh0YXNrKTtcclxuXHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0SW5DcmVhdGVMaW5lKCkpXHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICB0YXNrLnNldEluQ3JlYXRlTGluZSh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UodGFzay5nZXRMYXN0UGFya2VkQ3RybCgpLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIGN1cnJlbnQgcmVjb3JkIGlzIG5vdCBhbHJlYWR5IGEgbmV3IG9uZVxyXG4gICAgICAgICAgICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgcmVjICE9IG51bGwgJiYgIXJlYy5Nb2RpZmllZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgZmFsc2UpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGRvU3VmZml4ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSB8fCB0YXNrLmlzQWJvcnRpbmcoKSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiBmb3JtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBEZWZlY3QgMTUyMzU1OiBQYXJrIG9uIGxhc3RQYXJrZWRDb250cm9sIGlmIG5leHRTY3JlZW4gZXZlbnQgb2NjdXJzIGlmIGFscmVhZHkgaW4gY3JlYXRlIG1vZGUgYW5kIHJlY29yZCBub3QgbW9kaWZpZWRcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdFBhcmtlZENvbnRyb2w6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0UGFya2VkQ29udHJvbCAhPT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGxhc3RQYXJrZWRDb250cm9sLmludm9rZSgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgbGV0IHJlZkRvU3VmZml4OiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbShkb1N1ZmZpeCk7XHJcbiAgICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuRG9UYXNrTGV2ZWxSZWNvcmRTdWZmaXgodGFzaywgcmVmRG9TdWZmaXgpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIGRvU3VmZml4ID0gcmVmRG9TdWZmaXgudmFsdWU7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRJZDogbnVtYmVyID0gMDtcclxuICAgICAgICAgICAgICAgIGxldCBwcmV2TGluZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoKHRhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkgfHwgIXRhc2suQ29uZmlybVVwZGF0ZU5vKVxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLmFkZFJlYyhkb1N1ZmZpeCxpbnRFdnRDb2RlID09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FX0FCT1ZFPyB0cnVlIDogZmFsc2UgKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuRG9UYXNrTGV2ZWxSZWNvcmRQcmVmaXgodGFzayk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVBY3RFbnRlclJvd0VkaXRpbmcodGFzayk7XHJcblxyXG4gICAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgIHRhc2suc2V0SW5DcmVhdGVMaW5lKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUw6XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlQWN0Q2FuY2VsKGV2dCwgdGFzaywgZm9ybSwgY3RybCwgcmVjLCB0cnVlKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU5URVJfUk9XX0VESVRJTkc6XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlQWN0RW50ZXJSb3dFZGl0aW5nKHRhc2spO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9RVUlUOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUVVJVCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19DUkVBVEU6XHJcbiAgICAgICAgICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgfHxcclxuICAgICAgICAgICAgICBhd2FpdCAodGFzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX09QVElPTikpLmdldFZhbHVlQm9vbGVhbigpKSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nb3RvQ3JlYXRlTW9kZSh0YXNrKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX1FVRVJZOlxyXG4gICAgICAgICAgICBpZiAodGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkgJiZcclxuICAgICAgICAgICAgICAoYXdhaXQgKHRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19PUFRJT04pKS5nZXRWYWx1ZUJvb2xlYW4oKSkgPT09IGZhbHNlKVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrLmVuYWJsZU1vZGVzKCk7XHJcbiAgICAgICAgICAgIG9sZE1vZGUgPSB0YXNrLmdldE9yaWdpbmFsVGFza01vZGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZKTtcclxuICAgICAgICAgICAgICBpZiAob2xkTW9kZSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGR2LmN1cnJSZWNDb21wdXRlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN0cmwgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgY3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIHdlIGFscmVhZHkgZXhlY3V0ZWQgcmVjb3JkIHN1ZmZpeCAtIHNvIHdlIG5lZWQgdG8gcHJldmVudCB0aGUgdmlldyByZWZyZXNoXHJcbiAgICAgICAgICAgICAgICAvLyBmcm9tIGV4ZWN1dGluZyBpdCBhZ2FpblxyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50Q29udHJvbENoYW5nZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN0cmwgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgY3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudFJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB0YXNrLnNldFByZXZlbnRDb250cm9sQ2hhbmdlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGlmICghZHYuaXNFbXB0eSgpICYmIChkdi5nZXRDdXJyUmVjKCkpLmdldE1vZGUoKSAhPT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydClcclxuICAgICAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGFzay5zZXRPcmlnaW5hbFRhc2tNb2RlKENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRhc2suc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX01PRElGWTpcclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSAmJlxyXG4gICAgICAgICAgICAgIChhd2FpdCAodGFzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX09QVElPTikpLmdldFZhbHVlQm9vbGVhbigpKSA9PT0gZmFsc2UpXHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGF3YWl0IHRhc2suZW5hYmxlTW9kZXMoKTtcclxuICAgICAgICAgICAgb2xkTW9kZSA9IHRhc2suZ2V0T3JpZ2luYWxUYXNrTW9kZSgpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKG9sZE1vZGUgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkdi5jdXJyUmVjQ29tcHV0ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGN0cmwuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIHdlIGFscmVhZHkgZXhlY3V0ZWQgcmVjb3JkIHN1ZmZpeCAtIHNvIHdlIG5lZWQgdG8gcHJldmVudCB0aGUgdmlldyByZWZyZXNoXHJcbiAgICAgICAgICAgICAgICAvLyBmcm9tIGV4ZWN1dGluZyBpdCBhZ2FpblxyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50Q29udHJvbENoYW5nZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN0cmwgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgY3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudFJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB0YXNrLnNldFByZXZlbnRDb250cm9sQ2hhbmdlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGlmICghZHYuaXNFbXB0eSgpICYmIChkdi5nZXRDdXJyUmVjKCkpLmdldE1vZGUoKSAhPT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydClcclxuICAgICAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRhc2suc2V0T3JpZ2luYWxUYXNrTW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGFzay5zZXRDcmVhdGVEZWxldGVBY3RzRW5hYmxlU3RhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1Q6XHJcbiAgICAgICAgICAgIC8qIHByZWZvcm0gcmVjIHN1ZmZpeCAqL1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIHRhc2suSW5TZWxlY3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICB0YXNrLkluU2VsZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICAgICAgLyogY2xvc2UgdGhlIHNlbGVjdGlvbiBwcm9ncmFtICovXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TVUJGT1JNX1JFRlJFU0g6XHJcbiAgICAgICAgICAgIGlmICgoZXZ0LmdldEFyZ0xpc3QoKSAhPSBudWxsKSAmJiAoZXZ0LmdldEFyZ0xpc3QoKS5nZXRTaXplKCkgPT09IDEpKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG4gICAgICAgICAgICAgIGxldCBSZWZyZXNoZWRTdWJmb3JtTmFtZTogc3RyaW5nID0gYXdhaXQgZXZ0LmdldEFyZ0xpc3QoKS5nZXRBcmdWYWx1ZSgwLCBTdG9yYWdlQXR0cmlidXRlLkFMUEhBLCAwKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gUUNSICMyODMxMTQuIEFyZ3VtZW50IG9mICdTdWJmb3JtIHJlZnJlc2ggZXZlbnQnIGNhbiBiZSBza2lwcGVkIG9yIG5vdCBleGlzdC5cclxuICAgICAgICAgICAgICBpZiAoUmVmcmVzaGVkU3ViZm9ybU5hbWUgPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAvLyBSUyBtdXN0IGJlIGV4ZWN1dGVkIG9ubHkgaWYgdGhlIGN1cnJlbnQgc3ViZm9ybSBpcyByZWZyZXNoZWQuXHJcbiAgICAgICAgICAgICAgLy8gSWYgaXRzIGJyb3RoZXIgaXMgcmVmcmVzaGVkIHdlIGRvIG5vdCBuZWVkIHRvIGV4ZWN1dGUgUlMgb2YgdGhlIGN1cnJlbnQgdGFzay5cclxuICAgICAgICAgICAgICBmb3IgKGxldCBwYXJlbnRUYXNrOiBUYXNrID0gdGFzazsgcGFyZW50VGFzay5nZXRGb3JtKCkgIT0gbnVsbCAmJiBwYXJlbnRUYXNrLmdldE1nZElEKCkgPT09IHRhc2suZ2V0TWdkSUQoKTsgcGFyZW50VGFzayA9IDxUYXNrPnBhcmVudFRhc2suZ2V0UGFyZW50KCkpIHtcclxuICAgICAgICAgICAgICAgIHN1YmZvcm1DdHJsID0gPE1nQ29udHJvbD5wYXJlbnRUYXNrLmdldEZvcm0oKS5nZXRDdHJsQnlOYW1lKFJlZnJlc2hlZFN1YmZvcm1OYW1lLnRyaW0oKSwgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3ViZm9ybUN0cmwgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgc3ViZm9ybVRhc2s6IFRhc2sgPSA8VGFzaz5zdWJmb3JtQ3RybC5nZXRTdWJmb3JtVGFzaygpO1xyXG4gICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc3ViZm9ybSB0YXNrIHdhcyBub3Qgb3BlbmVkIHlldCwgYnV0IHN1YmZvcm0gcmVmcmVzaCBpcyBkb25lLFxyXG4gICAgICAgICAgICAgICAgICAvLyBpdCdzIG5lZWRlZCB0byBvcGVuIHRoZSBzdWJmb3JtLiBRQ1IgIzQxNTkxNC5cclxuICAgICAgICAgICAgICAgICAgaWYgKHN1YmZvcm1UYXNrID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBRQ1IgIzI4NzU2Mi4gT3BlbiB0aGUgc3ViZm9ybSB0YXNrIG9ubHkgaWYgdGhlIHN1YmZvcm0gY29udHJvbCBpcyBjb25uZWN0ZWQgdG8gdGhlIHRhc2suXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF3YWl0IChzdWJmb3JtQ3RybC5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NVQkZPUk1fVFlQRSkpLmdldFZhbHVlSW50KCkgIT09IFN1YmZvcm1UeXBlLk5vbmUpXHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLk9wZW5TdWJmb3JtKHBhcmVudFRhc2ssIHN1YmZvcm1DdHJsKTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcGFyZW50VGFzay5TdWJmb3JtUmVmcmVzaChzdWJmb3JtVGFzaywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBpZiBpdCBpcyBTdWJmb3JtUmVmcmVzaCB0aGF0IHJldHVybmVkIGZyb20gdGhlIHNlcnZlciwgc28gc2VhcmNoIHRoZSB0YXNrIGFjY29yZGluZyB0byBpdHMgdGFzayBpZCAodGFnKVxyXG4gICAgICAgICAgICBlbHNlIGlmICgoZXZ0LmdldEFyZ0xpc3QoKSAhPSBudWxsKSAmJiAoZXZ0LmdldEFyZ0xpc3QoKS5nZXRTaXplKCkgPT09IDIpKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHN1YmZvcm1UYXNrOiBUYXNrID0gdGFzaywgcGFyZW50VGFzaztcclxuICAgICAgICAgICAgICBsZXQgdGFza1RhZzogc3RyaW5nID0gYXdhaXQgZXZ0LmdldEFyZ0xpc3QoKS5nZXRBcmdWYWx1ZSgxLCBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMsIDApO1xyXG5cclxuICAgICAgICAgICAgICB3aGlsZSAoc3ViZm9ybVRhc2suSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRUYXNrID0gc3ViZm9ybVRhc2suZ2V0UGFyZW50KCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3ViZm9ybVRhc2suZ2V0VGFza1RhZygpID09PSB0YXNrVGFnKSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHBhcmVudFRhc2suU3ViZm9ybVJlZnJlc2goc3ViZm9ybVRhc2ssIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHN1YmZvcm1UYXNrID0gcGFyZW50VGFzaztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU1VCRk9STV9PUEVOOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLk9wZW5TdWJmb3JtKHRhc2ssIDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2wpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fU0VBUkNIOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgY21kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRXZlbnRDb21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCBpbnRFdnRDb2RlKTtcclxuICAgICAgICAgICAgICB0YXNrLmdldFRhc2tDYWNoZSgpLmNsZWFyQ2FjaGUoKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0YXNrLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIEFmdGVyIHZpZXcgcmVmcmVzaCwgdGhlIHNlcnZlciBhbHdheXMgcmV0dXJucyBjdXJyIHJlYyBhcyBmaXJzdCByZWMuXHJcbiAgICAgICAgICAgICAgaWYgKCFmb3JtLmlzU2NyZWVuTW9kZSgpKSB7XHJcbiAgICAgICAgICAgICAgICBkdi5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZm9ybS5IYXNUYWJsZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0ucmVzdG9yZU9sZERpc3BsYXlMaW5lKGZvcm0ucmVjb3JkSWR4MkRpc3BsYXlMaW5lKGR2LmdldEN1cnJSZWNJZHgoKSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgICAgIGlmIChjdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjdHJsLmludm9rZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9SRUNPUkQ6XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlUmVmcmVzaEV2ZW50cyhldnQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9BQ1RfQ0xPU0VfQVBQTDpcclxuICAgICAgICAgICAgY21kID1cclxuICAgICAgICAgICAgICBDb21tYW5kRmFjdG9yeS5DcmVhdGVFdmVudENvbW1hbmQoXHJcbiAgICAgICAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuZ2V0VGFza1RhZygpLFxyXG4gICAgICAgICAgICAgICAgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0JST1dTRVJfRVNDKTtcclxuICAgICAgICAgICAgY21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgICAgICAgICBhd2FpdCBzZXJ2ZXIuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPTlRFWFRfUkVNT1ZFOlxyXG5cclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdHJhbnNhY3Rpb24gaXMgcGVuZGluZ1xyXG4gICAgICAgICAgICBsZXQgY3VyclJlY29yZCA9ICAoPERhdGFWaWV3Pkxhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKS5EYXRhVmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgICAgICAgICBpZiAoQ2xpZW50TWFuYWdlci5UcmFuc0NhY2hlRXhpc3RzKCkgfHwgKGN1cnJSZWNvcmQgIT0gbnVsbCAmJiBjdXJyUmVjb3JkLk1vZGlmaWVkKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cgKCdQZW5kaW5nIHRyYW5zYWN0aW9uL3JlY29yZCBpcyBtb2RpZmllZCwgZGlzY2FyZGVkIFxcJ0NvbnRleHQgUmVtb3ZlXFwnIGV2ZW50LicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIElzIHRoZXJlIGNsaWVudCBjb250ZXh0IGluYWN0aXZpdHkgdGltZW91dD9cclxuICAgICAgICAgICAgICBpZiAoRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0Q2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lb3V0KCk+MCkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5FeGVjdXRlQ2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lcigpO1xyXG4gICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBpZiAoIUV2ZW50c01hbmFnZXIuY2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lckFib3J0ZWQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBhZGQgYSBjb21tYW5kIHRvIHRlcm1pbmF0ZSBjb250ZXh0IGF0IHNlcnZlciBzaWRlXHJcbiAgICAgICAgICAgICAgICBsZXQgY29udGV4dFRlcm1pbmF0aW9uRXZlbnRDb21tYW5kOiBDb250ZXh0VGVybWluYXRpb25FdmVudENvbW1hbmRcclxuICAgICAgICAgICAgICAgICAgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVDb250ZXh0VGVybWluYXRpb25FdmVudENvbW1hbmQoTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLmdldFRhc2tUYWcoKSk7XHJcbiAgICAgICAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldEN1cnJNR0RhdGEoKS5DbWRzVG9TZXJ2ZXIuQWRkKDxJQ2xpZW50Q29tbWFuZD5jb250ZXh0VGVybWluYXRpb25FdmVudENvbW1hbmQpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIG5lZWQgbm90IHRvIGJlIGhhbmRsZWQgYXMgdGhlIHdlIGFyZSB0ZXJtaW5hdGluZyB0aGUgY29udGV4dFxyXG4gICAgICAgICAgICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uT05MWV9DT01NQU5EUyk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cgKCdSZW1vdmVkIGNvbnRleHQgZnJvbSBzZXJ2ZXInKTtcclxuICAgICAgICAgICAgICAgIC8vIHNldCBmbGFnIHRvIHRoYXQgY29udGV4dCBpcyByZW1vdmVkIGZyb20gc2VydmVyIGJ5ICdDb250ZXh0IFJlbW92ZScgZXZlbnRcclxuICAgICAgICAgICAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5SZW1vdmluZ0NvbnRleHRGcm9tU2VydmVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEaXNjYXJkZWQgXFwnQ29udGV4dCBSZW1vdmVcXCcgZXZlbnQgYXMgdXNlciBldmVudCBvY2N1cnJlZC4nKTtcclxuICAgICAgICAgICAgICAgIEV2ZW50c01hbmFnZXIuY2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lckFib3J0ZWQ9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRVJWRVJfVEVSTUlOQVRJT046XHJcbiAgICAgICAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUV2ZW50Q29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgaW50RXZ0Q29kZSk7XHJcbiAgICAgICAgICAgIGNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICAgICAgYXdhaXQgQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyLkdldENvbW1hbmRzUHJvY2Vzc29yKCkuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX0VEVF9OVUxMOlxyXG4gICAgICAgICAgICBpZiAodGhpcy5fY3VyckZpZWxkICE9IG51bGwgJiYgdGhpcy5fY3VyckZpZWxkLk51bGxBbGxvd2VkKSB7XHJcbiAgICAgICAgICAgICAgLy8gdGhlIG5leHQgbGluZXMgaXMgYW4gaW1taXRhdGlvbiBvZiB0aGUgYmVoYXZpb3VyIG9mIGFuIG9ubGluZSBwcm9ncmFtOlxyXG4gICAgICAgICAgICAgIC8vIDEpIHRoZSByZWNvcmQgbXVzdCBiZSB1cGRhdGVkIGluIHRoaXMgZXZlbnRcclxuICAgICAgICAgICAgICAvLyAyKSBhIFwibmV4dCBmaWVsZFwiIGV2ZW50IGlzIHJhaXNlZFxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2N1cnJGaWVsZC5zZXRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKHRoaXMuX2N1cnJGaWVsZC5nZXRNYWdpY0RlZmF1bHRWYWx1ZSgpLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fY3VyckZpZWxkLnVwZGF0ZURpc3BsYXkoKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUk9MTEJBQ0s6XHJcbiAgICAgICAgICAgIC8vIGZvciBvZmZsaW5lIHdlIG5lZWQgdG8gY2FuY2VsIHRoZSBlZGl0IGFuZCB0aGVuIGdvIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbiwgdGhlIHNhbWUgd2UgZG9pbmcgZm9yIHJlbW92ZSB3aGlsZSByZXR1cm4gZnJvbSB0aGUgc2VydmVyXHJcbiAgICAgICAgICAgIC8vIHNlZSBkYXRhdmlldy5jcyBjYXNlIENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX1JPTExCQUNLOlxyXG4gICAgICAgICAgICAvLyBmb3Igb2ZmbGluZSB3ZSB3aWxsIG5vdCBnZXQgdG8gQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfUk9MTEJBQ0tcclxuICAgICAgICAgICAgYXdhaXQgRXZlbnRzTWFuYWdlci5IYW5kbGVSb2xsYmFja0FjdGlvbih0YXNrLCBjbWRzVG9TZXJ2ZXIsIFJvbGxiYWNrRXZlbnRDb21tYW5kX1JvbGxiYWNrVHlwZS5ST0xMQkFDSyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9PSzpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0lOREVYX0NIQU5HRTpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPTF9TT1JUOlxyXG4gICAgICAgICAgICAvLyBjYW4gc29ydCBvbmx5IG9uIGNvbHVtbiB3aXRoIGFuIGF0dGFjaGVkIGZpZWxkLlxyXG4gICAgICAgICAgICAvLyBjYW4gY2hhbmdlIGluZGV4IG9ubHkgaWYgdGhlIGRhdGF2aWV3IGlzIHJlbW90ZS5cclxuICAgICAgICAgICAgaWYgKChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfSU5ERVhfQ0hBTkdFICYmIHRhc2suRGF0YXZpZXdNYW5hZ2VyLkhhc1JlbW90ZURhdGEpIHx8XHJcbiAgICAgICAgICAgICAgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT0xfU09SVCAmJiBjdHJsLmdldEZpZWxkKCkgIT0gbnVsbCkpIHtcclxuICAgICAgICAgICAgICAvLyBRQ1IgIzI5NjMyNSAmIFFDUiAjNDMwMjg4LlxyXG4gICAgICAgICAgICAgIC8vIEV4ZWN1dGUgQ1Mgb2YgdGhlIGN1cnJlbnQgY29udHJvbCwgYmVjYXVzZSBpdCBjYW4gYmUgYSBwYXJhbWV0ZXIgZm9yIGEgc3ViZm9ybS5cclxuICAgICAgICAgICAgICAvLyBJZiBpdCdzIHZhbHVlIHdhcyBjaGFuZ2VkLCBDUyB3aWxsIHJlZnJlc2ggdGhlIHN1YmZvcm0gYmVmb3JlIHRoZSBzb3J0LlxyXG4gICAgICAgICAgICAgIGxldCBsYXN0Rm9jdXNlZFRhc2s6IFRhc2sgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgbGV0IGZvY3VzZWRDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKExhc3RGb2N1c2VkTWFuYWdlci5MYXN0Rm9jdXNNZ2RJRCk7XHJcbiAgICAgICAgICAgICAgaWYgKGZvY3VzZWRDdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShmb2N1c2VkQ3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0YXNrLkV4ZWN1dGVOZXN0ZWRSUyhsYXN0Rm9jdXNlZFRhc2spO1xyXG5cclxuICAgICAgICAgICAgICAvLyBRQ1IgIzQzODc1My4gRXhlY3V0ZSBSUyBvZiB0aGUgc29ydGVkIHRhc2suXHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgdGFzay5nZXRMZXZlbCgpICE9PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgICAgdGFzay5nZXRUYXNrQ2FjaGUoKS5jbGVhckNhY2hlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9JTkRFWF9DSEFOR0UpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IHRhc2tGb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGFza0Zvcm0uSGFzVGFibGUoKSlcclxuICAgICAgICAgICAgICAgICAgICBmb3JtLmNsZWFyVGFibGVDb2x1bW5Tb3J0TWFyayh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIGNtZCA9IGF3YWl0IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUluZGV4Q2hhbmdlQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5HZXRDdXJyZW50UmVjSWQoKSwgZXZ0LmdldEFyZ0xpc3QoKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVDb2x1bW5Tb3J0Q29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgZXZ0LkRpcmVjdGlvbiwgY3RybC5nZXREaXRJZHgoKSwgY3RybC5nZXRGaWVsZCgpLmdldElkKCksICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuR2V0Q3VycmVudFJlY0lkKCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuICAgICAgICAgICAgICAgIGR2LnNldFRvcFJlY0lkeCgwKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0ucmVzdG9yZU9sZERpc3BsYXlMaW5lKDApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNTb3J0aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIC8vIFFDUidzICMxNjU4MTUgJiAjMjkxOTc0LiBJZiB0aGUgZm9jdXNlZCB0YXNrIGFuZCB0aGUgc29ydGVkIHRhc2sgaXMgdGhlIHNhbWUgdGFzayBvclxyXG4gICAgICAgICAgICAgICAgLy8gdGhlIGZvY3VzZWQgdGFzayBpcyBhIGNoaWxkIG9mIHRoZSBzb3J0ZWQgdGFzaywgZ28gdG8gdGhlIGZpcnN0IGNvbnRyb2wgaW4gdGhlIGZpcnN0IGxpbmUuXHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZm9jdXNlZCB0YXNrIGlzIHRoZSBwYXJlbnQgdGFzaywgZG8gbm90IGxlYXZlIHRoZSBjdXJyZW50IGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICBpZiAoISh0YXNrID09PSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkgfHwgIXRhc2sucGF0aENvbnRhaW5zKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgIXRhc2suZ2V0UHJldmVudENvbnRyb2xDaGFuZ2UoKSlcclxuICAgICAgICAgICAgICAgICAgLy8gUUNSICM0Mjg2OTcuIEV4ZWN1dGUgUlMgb2YgYWxsIG5lc3RlZCBzdWJmb3Jtcy5cclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBsYXN0Rm9jdXNlZFRhc2suRXhlY3V0ZU5lc3RlZFJTKHRhc2spO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiBmb2N1c2VkQ3RybCAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZvY3VzZWRDdHJsLmludm9rZSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc1NvcnRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ09MX0NMSUNLOlxyXG4gICAgICAgICAgICAvLyBjYW4gc29ydCBvbiBjb2x1bW4gb25seSBpZiBldmVudCBpcyByYWlzZWQgZHVlIHRvIGNsaWNrIGFjdGlvblxyXG4gICAgICAgICAgICAvLyBhbmQgYSBmaWVsZCBpcyBhdHRhY2hlZCB0byBjb2x1bW4uXHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiBldnQuaXNHdWlUcmlnZ2VyZWRFdmVudCgpICYmIGN0cmwuaXNDb2x1bW5Tb3J0YWJsZSgpKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGNvbHVtbkNoaWxkQ29udHJvbDogTWdDb250cm9sID0gPE1nQ29udHJvbD5jdHJsLmdldENvbHVtbkNoaWxkQ29udHJvbCgpO1xyXG4gICAgICAgICAgICAgIGlmIChjb2x1bW5DaGlsZENvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gaGFuZGxlIFNvcnQgb24gQ29sdW1uXHJcbiAgICAgICAgICAgICAgICBsZXQgYVJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudChjb2x1bW5DaGlsZENvbnRyb2wsIGV2dC5EaXJlY3Rpb24sIDApO1xyXG4gICAgICAgICAgICAgICAgYVJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT0xfU09SVCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFRvVGFpbChhUnRFdnQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIGVuZCBvZiBpbnRlcm5hbCBldmVudHMgcHJvY2Vzc2luZ1xyXG5cclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMucG9wUnRFdmVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLypcclxuKiBIYW5kbGVBY3RFbnRlclJvd0VkaXRpbmdcclxuKiBzdGFydCB0aGUgZWRpdGluZyBvbiByb3dcclxuKiAqL1xyXG4gIHByaXZhdGUgYXN5bmMgSGFuZGxlQWN0RW50ZXJSb3dFZGl0aW5nKHRhc2s6IFRhc2spIHtcclxuICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSlcclxuICAgICAgdGFzay5Xcml0ZVRvTWVzc2FnZVBhbmUoYENhbm5vdCBlbnRlciBSb3cgRWRpdGluZyB3aGVuIGluIFF1ZXJ5IE1vZGUuYCk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IG15Zm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgICAgYXdhaXQgbXlmb3JtLnN0YXJ0Um93RWRpdGluZyhteWZvcm0uRGlzcGxheUxpbmUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBIYW5kbGVTdG9wUm93RWRpdGluZyh0YXNrOiBUYXNrKSB7XHJcbiAgICBsZXQgbXlmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgYXdhaXQgbXlmb3JtLnN0b3BSb3dFZGl0aW5nKG15Zm9ybS5EaXNwbGF5TGluZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENyZWF0ZXMgYW5kIGV4ZWN1dGVzIHN1YmZvcm0gb3BlblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3ViZm9ybUNvbnRyb2xcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgT3BlblN1YmZvcm0odGFzazogVGFzaywgc3ViZm9ybUNvbnRyb2w6IE1nQ29udHJvbCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGFzay5UYXNrU2VydmljZS5SZW1vdmVSZWNvbXB1dGVzKHRhc2spO1xyXG4gICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVTdWJmb3JtT3BlbkNvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIHN1YmZvcm1Db250cm9sLmdldERpdElkeCgpKTtcclxuICAgIHRhc2suZ2V0TUdEYXRhKCkuQ21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgYXdhaXQgVGFzay5Db21tYW5kc1Byb2Nlc3Nvci5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNtZHNUb1NlcnZlclwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicm9sbGJhY2tUeXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIEhhbmRsZVJvbGxiYWNrQWN0aW9uKHRhc2s6IFRhc2ssIGNtZHNUb1NlcnZlcjogQ29tbWFuZHNUYWJsZSwgcm9sbGJhY2tUeXBlOiBSb2xsYmFja0V2ZW50Q29tbWFuZF9Sb2xsYmFja1R5cGUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjb21tYW5kc1Byb2Nlc3NvcjogQ29tbWFuZHNQcm9jZXNzb3JCYXNlID0gVGFzay5Db21tYW5kc1Byb2Nlc3NvcjtcclxuICAgIENsaWVudFJlZnJlc2hDb21tYW5kLkNsaWVudElzSW5Sb2xsYmFja0NvbW1hbmQgPSB0cnVlO1xyXG4gICAgLy8gZm9yIHJlbW90ZSBwcm9ncmFtIDogKHdpdGhcXHdpdGhvdXQgbG9jYWwgZGF0YSkgdGhlIHJvbGxiYWNrIGV2ZW50IGluIHRoZSBzZXJ2ZXIgTVVTVFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgIGJlIGV4ZWN1dGUgb24gdGhlIHRhc2sgdGhhdCBvcGVuIHRoZSB0cmFuc2FjdGlvblxyXG4gICAgLy8gZm9yIG9mZmxpbmUgcHJvZ3JhbSB0aGUgcm9sbGJhY2sgdHJhbnNhY3Rpb24gbmVlZCB0byBiZSBleGVjdXRlIG9uIHRoZSB0YXNrIHRoYXQgb3BlbiB0aGUgdHJhbnNhY3Rpb25cclxuICAgIHRhc2sgPSB0YXNrLlRhc2tTZXJ2aWNlLkdldE93bmVyVHJhbnNhY3Rpb25UYXNrKHRhc2spO1xyXG5cclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlUm9sbGJhY2tFdmVudENvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIHJvbGxiYWNrVHlwZSk7XHJcbiAgICBjbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICBhd2FpdCBjb21tYW5kc1Byb2Nlc3Nvci5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuXHJcbiAgICBDbGllbnRSZWZyZXNoQ29tbWFuZC5DbGllbnRJc0luUm9sbGJhY2tDb21tYW5kID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJldnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlY1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGFzdFBhcmtlZEN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9sZFJlY01vZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9sZE1vZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBIYW5kbGVBY3RDYW5jZWwoZXZ0OiBSdW5UaW1lRXZlbnQsIHRhc2s6IFRhc2ssIGZvcm06IE1nRm9ybSwgY3RybDogTWdDb250cm9sLCByZWM6IFJlY29yZCwgaXNNR19BQ1RfQ0FOQ0VMOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBQcmV2ZW50IHJlY3Vyc2l2ZSBtb2RlXHJcbiAgICAvLyBmaXhlZCBidWdzICM6Mjg1NDk4LCAyOTc0NTVcXDQyNzcwM1xcXHJcbiAgICBpZiAodGFzay5JbkhhbmRsZUFjdENhbmNlbClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIHRhc2suSW5IYW5kbGVBY3RDYW5jZWwgPSB0cnVlO1xyXG5cclxuICAgIGxldCBvbGRNb2RlOiBzdHJpbmcgPSB0YXNrLmdldE1vZGUoKTtcclxuICAgIGxldCBzYXZlRGlzcGxheUxpbmU9IHRhc2suZ2V0Rm9ybSgpLkRpc3BsYXlMaW5lO1xyXG5cclxuICAgIC8vIFdoZW4gZG8gd2Ugc2hvdyB0aGUgJ0NvbmZpcm0gQ2FuY2VsIHdpbmRvdycgPyB3aGVuIGFsbCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXBwbHk6XHJcbiAgICAvLyAxLiBUYXNrIG1vZGUgaXMgbm90IHF1ZXJ5XHJcbiAgICAvLyAyLiByZWMgaXMgbm90IFVwZGF0ZWQuIFVwZGF0ZWQgaXMgdHJ1ZSB3aGVuIHRoZXJlIHdhcyBhbiBVcGRhdGUgb3BlcmF0aW9uIHdpdGggJ2ZvcmNlIHVwZGF0ZScuIElmIGl0IGlzIHRydWUsIHRoZW4gdGhlcmUgaXMgbm8gbWVhbmluZyB0byBzaG93IHRoZVxyXG4gICAgLy8gICAgd2luZG93IHNpbmNlIHRoZSB1cGRhdGUgc3RheXMgYW55d2F5IChsaWtlIGluIG9ubGluZSB3aGVuIHdlIGdvIHRvIENhbmNlbFdhc1RyaWdnZXJlZCkuXHJcbiAgICAvLyAzLiBUaGVyZSBtdXN0IGJlIGEgbW9kaWZpY2F0aW9uLCBvdGhlcndpc2UgdGhlcmUgaXMgbm90aGluZyB0byBjYW5jZWwuIFNvIGVpdGhlciBNb2RpZmllZCBpcyB0cnVlLCBtZWFuaW5nIGEgZmllbGQgd2FzIG1vaWRmaWVkICwgb3JcclxuICAgIC8vICAgIExhc3RQYXJrZWRDdHJsKCkubW9kaWZpZWRCeVVzZXIoKSwgbWVhbmluZyB0aGF0IHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGNoYW5naW5nIHRoZSBmaWVsZCdzIHZhbHVlIChUaGUgbW9kaWZpZWQgaXMgZmFsc2UgdW50aWxsIHdlIGV4aXQgdGhlIGZpZWxkKS5cclxuICAgIC8vIENyZWF0ZSBtb2RlIGFsc28gZ29lcyBoZXJlIChyZWMgcmVtb3ZlZCBhbmQgbW9kZSBjaGFuZ2VzIHRvIG1vZGlmeSkgLCBidXQgYWxzbyB3aWxsIHNob3cgdGhlIGNvbmZpcm0gY2FuY2VsIG9ubHkgaWYgc29tZSBjaGFuZ2Ugd2FzIGRvbmUgdG8gdGhlIG5ldyByZWNvcmQuXHJcbiAgICBpZiAob2xkTW9kZSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSAmJiAhcmVjLlVwZGF0ZWQpIHtcclxuICAgICAgaWYgKGlzTUdfQUNUX0NBTkNFTCkge1xyXG4gICAgICAgIGlmIChyZWMuTW9kaWZpZWQgfHwgKHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSAhPT0gbnVsbCAmJiB0YXNrLmdldExhc3RQYXJrZWRDdHJsKCkuTW9kaWZpZWRCeVVzZXIpKSB7XHJcbiAgICAgICAgICBpZiAoYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09ORklSTV9DQU5DRUwsIGZhbHNlKSkge1xyXG4gICAgICAgICAgICAgbGV0IGNvbmZpcm1lZCA9IGF3YWl0IEdVSU1hbmFnZXIuSW5zdGFuY2UuY29uZmlybV9ib29sKE1zZ0ludGVyZmFjZS5DT05GSVJNX1NUUl9DQU5DRUwpO1xyXG4gICAgICAgICAgICAgaWYoIWNvbmZpcm1lZClcclxuICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0YXNrLkluSGFuZGxlQWN0Q2FuY2VsID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgb2xkUmVjTW9kZTogRGF0YU1vZGlmaWNhdGlvblR5cGVzID0gcmVjLmdldE1vZGUoKTtcclxuXHJcbiAgICAgIC8vIFNwZWNpYWxDYW5jZWxPbkNyZWF0ZSBiZWhhdmlvciBmb3IgQWxsb3dFbXB0eURhdGFWaWV3ID0gWSA6IFdoZW4gdGhlcmUgaXMgc2luZ2xlIG5ld2x5IGNyZWF0ZWQgcmVjb3JkXHJcbiAgICAgIC8vIGV4aXN0IGFuZCB1c2VyIGNhbmNlbHMgaXQgYW5kIHRhc2sgaGFzIEFsbG93RW1wdHlEYXRhVmlldz1ZXHJcbiAgICAgIC8vIHRoZW4gY2hhbmdlIHRhc2sgbW9kZSB0byBNb2RpZnkgbW9kZSBzbyB0aGF0IHNlcnZlciBhbGxvd3MgdGhpcyB0YXNrIHRvIGVudGVyIGFnYWluIGluIEVtcHR5RGF0YVZpZXcgbW9kZS5cclxuICAgICAgaWYgKEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFNwZWNpYWxDYW5jZWxPbkNyZWF0ZSgpICYmICB0YXNrLmdldE1vZGUoKSA9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURVxyXG4gICAgICAgICAmJiB0YXNrLmdldE9yaWdpbmFsVGFza01vZGUoKT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcblxyXG4gICAgICAgIGxldCBlbmFibGU6IGJvb2xlYW4gPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRlksIHRydWUpO1xyXG5cclxuICAgICAgICBpZiAoZW5hYmxlKSB7XHJcbiAgICAgICAgICBsZXQgYWxsb3dFbXB0eURhdGFWaWV3IDogYm9vbGVhbiA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0VNUFRZX0RBVEFWSUVXLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICBpZiAoKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRTaXplKCkgPT0gMSAmJiBhbGxvd0VtcHR5RGF0YVZpZXcpIHtcclxuICAgICAgICAgICAgdGFzay5zZXRNb2RlKCdNJyk7XHJcbiAgICAgICAgICAgIHRhc2suRGF0YVZpZXcuc2V0RW1wdHlEYXRhdmlldyh0cnVlKTtcclxuICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaXNNR19BQ1RfQ0FOQ0VMKSB7XHJcbiAgICAgICAgLy8gV2hlbiBjYW5jZWxpbmcsIHdlIGhhdmUgdG8gcm9sbGJhY2sgdGhlIHRyYW5zYWN0aW9uLlxyXG4gICAgICAgIC8vIFVubGVzcyB0aGUgZXZlbnQgZG9lcyBub3QgYWxsb3cgdG8gcm9sbGJhY2sgaW4gY2FuY2VsLiBUaGF0IGNhbiBoYXBwZW4gaWYgdGhlIGNhbmNlbCB3YXMgaW5pdGlhdGVkIGJ5IHRoZSBzZXJ2ZXIncydzIHJvbGxiYWNrLlxyXG4gICAgICAgIGlmICh0YXNrLmlzVHJhbnNhY3Rpb25PbkxldmVsKENvbnN0SW50ZXJmYWNlLlRSQU5TX1JFQ09SRF9QUkVGSVgpICYmIGV2dC5Sb2xsYmFja0luQ2FuY2VsKCkpIHtcclxuICAgICAgICAgIGF3YWl0IEV2ZW50c01hbmFnZXIuSGFuZGxlUm9sbGJhY2tBY3Rpb24odGFzaywgPENvbW1hbmRzVGFibGU+dGFzay5nZXRNR0RhdGEoKS5DbWRzVG9TZXJ2ZXIsIFJvbGxiYWNrRXZlbnRDb21tYW5kX1JvbGxiYWNrVHlwZS5DQU5DRUwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgYXdhaXQgRXZlbnRzTWFuYWdlci5IYW5kbGVDYW5jZWxFZGl0KGV2dCwgdGFzaywgZm9ybSwgcmVjLCBvbGRSZWNNb2RlKTtcclxuICAgIH1cclxuICAgIC8vIFFjciAjNzQ3ODcwIGNhbmNlbCBzaG91bGQgcGVyZm9ybSB0aGUgcmVjb3JkIHByZWZpeCBpZiBub3QgcXVpdGluZ1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcblxyXG4gICAgICAvLyB3ZSByb2xsYmFjayBhIHBhcmVudCB0YXNrIHdoaWxlIGZvY3VzZWQgb24gc3ViZm9ybS90YXNrLiBXZSBkbyBub3Qgd2FudCB0aGUgY3RybCBvbiB0aGUgc3ViZm9ybSB0byBkbyBjdHJsIHN1ZmZpeC5cclxuICAgICAgbGV0IGxhc3RGb2N1c2VkQ29udHJvbDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgICBpZiAobGFzdEZvY3VzZWRDb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgICAgbGFzdEZvY3VzZWRDb250cm9sLmdldEZvcm0oKS5nZXRUYXNrKCkuc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFldnQuaXNRdWl0KCkpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVQYXJrYWJpbGl0eU9uUm93Q2hhbmdlKHRhc2spO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUUNSIyA5NDEyNzc6IElmIENhbmNlbCBldmVudCBpcyBjYWxsZWQgZnJvbSBRdWl0IGV2ZW50LCB0aGVuIGRvbid0IGV4ZWN1dGUgRXhpdCBldmVudFxyXG4gICAgLy8gaWYgdXNlciBoYXMgcHJlc3NlZCAnTm8nIG9uIENvbmZpcm0gY2FuY2VsIGJveC5cclxuICAgIGlmIChldnQuaXNRdWl0KCkpXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuXHJcbiAgICAvLyByZXNldCBpc1Jvd0VkaXRpbmdcclxuICAgIGF3YWl0IGZvcm0uc3RvcFJvd0VkaXRpbmcoc2F2ZURpc3BsYXlMaW5lKTtcclxuXHJcbiAgICB0YXNrLkluSGFuZGxlQWN0Q2FuY2VsID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNhbmNlbCB0aGUgZWRpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXZ0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZWNcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9sZFJlY01vZGVcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIEhhbmRsZUNhbmNlbEVkaXQoZXZ0OiBSdW5UaW1lRXZlbnQsIHRhc2s6IFRhc2ssIGZvcm06IE1nRm9ybSwgcmVjOiBSZWNvcmQsIG9sZFJlY01vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gaWYgdGhlIHN5bmNlZCByZWNvcmQgKGkuZS4gdGhlIHJlY29yZCBmcm9tIHRoZSBwYXJlbnQgdGFzayBvZiB0aGUgc3ViZm9ybSkgYmVmb3JlIFJvbGxiYWNrIHdhcyBpbiAnSW5zZXJ0JyBtb2RlLFxyXG4gICAgLy8gc28gaXQgbXVzdCBiZSBpbiAnSW5zZXJ0JyBtb3JlIGFmdGVyIHJldHVybiBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgIGlmIChyZWMuU3luY2VkICYmIG9sZFJlY01vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpXHJcbiAgICAgIHJlYy5zZXRNb2RlKG9sZFJlY01vZGUpO1xyXG5cclxuICAgIGlmIChmb3JtICE9PSBudWxsKSB7XHJcbiAgICAgIC8vIHJlc2V0IHRoZSBsYXN0IHBhcmtlZCBjb250cm9sXHJcbiAgICAgIGlmICh0YXNrLmdldExhc3RQYXJrZWRDdHJsKCkgIT09IG51bGwpXHJcbiAgICAgICAgdGFzay5nZXRMYXN0UGFya2VkQ3RybCgpLnJlc2V0UHJldlZhbCgpO1xyXG5cclxuICAgICAgYXdhaXQgZm9ybS5jYW5jZWxFZGl0KHRydWUsIGV2dC5pc1F1aXQoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJldnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImR2XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZWNcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5vbkludGVyYWN0aXZlRGVsZXRlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgSGFuZGxlQWN0aW9uRGVsbGluZSggdGFzazogVGFzaywgZHY6IERhdGFWaWV3LCByZWM6IFJlY29yZCwgbm9uSW50ZXJhY3RpdmVEZWxldGU6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBsYXN0UGFya2VkQ3RybDogTWdDb250cm9sO1xyXG4gICAgbGV0IG15Zm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgIGxldCBzYXZlSXNSb3dFZGl0aW5nID0gbXlmb3JtLmdldElzUm93RWRpdGluZ0Zyb21HdWkobXlmb3JtLkRpc3BsYXlMaW5lICk7IC8vQ29tbWFuZHMuZ2V0SXNSb3RoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGxhc3RQYXJrZWRDdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVgpO3dFZGl0aW5nKCB0YXNrLmdldEZvcm0oKS5nZXRNYWluQ29udHJvbCgpLCB0YXNrLmdldEZvcm0oKS5EaXNwbGF5TGluZSk7ICAgIGxldCBvbGRSZWNNb2RlOiBEYXRhTW9kaWZpY2F0aW9uVHlwZXM7XHJcbiAgICBsZXQgb2xkUmVjTW9kZTogRGF0YU1vZGlmaWNhdGlvblR5cGVzO1xyXG4gICAgaWYgKGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0RFTEVURSwgdHJ1ZSkpIHtcclxuICAgICAgbGFzdFBhcmtlZEN0cmwgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsICE9PSBudWxsKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGxhc3RQYXJrZWRDdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpO1xyXG4gICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgIG9sZFJlY01vZGUgPSByZWMuZ2V0TW9kZSgpO1xyXG5cclxuICAgICAgICAvLyBGb3JjZSB0aGUgY2hhbmdlIHRvIGRlbGV0ZSBtb2RlXHJcbiAgICAgICAgcmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgIHJlYy5zZXRNb2RlKERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUpO1xyXG5cclxuICAgICAgICBpZiAob2xkUmVjTW9kZSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydClcclxuICAgICAgICAgIHJlYy5zZXRTZW5kVG9TZXJ2ZXIoZmFsc2UpO1xyXG5cclxuICAgICAgICAvLyBleGVjdXRlIHRhc2sgc3VmZml4IGluIE1vZGlmeSBtb2RlIG9yIHdoZW4gdGhlcmUgaXMgJ2ZvcmNlIHJlY29yZCBzdWZmaXgnLlxyXG4gICAgICAgIGlmIChyZWMuTW9kaWZpZWQgfHwgYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBmYWxzZSkpIHtcclxuICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgcmVjb3JkIHN1ZmZpeCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XHJcbiAgICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICBpZiAoIXJlYy5TZW5kVG9TZXJ2ZXIpIHtcclxuICAgICAgICAgICAgICBhd2FpdCBkdi5hZGRDdXJyVG9Nb2RpZmllZCgpO1xyXG4gICAgICAgICAgICAgIHJlYy5zZXRTZW5kVG9TZXJ2ZXIodHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICAgICAgcmVjLnNldE1vZGUob2xkUmVjTW9kZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGV4ZWN1dGUgcmVjb3JkIHN1ZmZpeCBpbiBEZWxldGUgbW9kZVxyXG4gICAgICAgIC8vIHNldCB0aGUgSW5EZWxldGVQcm9jZXNzIGZsYWcgLCBzbyB3ZSB3aWxsIG5vdCB0cnkgdG8gc2VuZCB1cGRhdGVzIG9uIHRoZSByZWNvcmQgYWZ0ZXJcclxuICAgICAgICAvLyB3ZSBkZWxldGUgaXQgaW4gdGhlIGNvbW1vbkhhbmRsZXJBZnRlciAocmVjIHN1ZmZpeCkuXHJcbiAgICAgICAgcmVjLnNldEluRGVsZXRlUHJvY2Vzcyh0cnVlKTtcclxuXHJcbiAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFKTtcclxuICAgICAgICAvLyBubyBjb25maXJtIG1lc3NhZ2UgZGlhbG9nIGlmIGluIG5vbiBpbnRlcmFjdGl2ZSBkZWxldGUuXHJcbiAgICAgICAgbGV0IHNraXBDb25maXJtRGlhbG9nOiBib29sZWFuID0gbm9uSW50ZXJhY3RpdmVEZWxldGU7XHJcblxyXG4gICAgICAgIGlmICghc2tpcENvbmZpcm1EaWFsb2cpIHtcclxuICAgICAgICAgIGlmICh0YXNrLm11c3RDb25maXJtSW5EZWxldGVNb2RlKCkgfHwgYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09ORklSTV9VUERBVEUsIGZhbHNlKSkge1xyXG4gICAgICAgICAgICBsZXQgY29uZmlybWVkOiBib29sZWFuID0gYXdhaXQgR1VJTWFuYWdlci5JbnN0YW5jZS5jb25maXJtX2Jvb2woTXNnSW50ZXJmYWNlLkNPTkZJUk1fU1RSX0RFTEVURSk7XHJcbiAgICAgICAgICAgIGlmICghY29uZmlybWVkKSB7XHJcbiAgICAgICAgICAgICAgcmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgICAgICAgIHJlYy5zZXRNb2RlKG9sZFJlY01vZGUpO1xyXG4gICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgICAgICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsICE9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UobGFzdFBhcmtlZEN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCk7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChzYXZlSXNSb3dFZGl0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbXlmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgbXlmb3JtLnN0YXJ0Um93RWRpdGluZyhteWZvcm0uRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICByZWMuc2V0SW5EZWxldGVQcm9jZXNzKGZhbHNlKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgIGlmICghcmVjLlNlbmRUb1NlcnZlcikge1xyXG4gICAgICAgICAgICBhd2FpdCBkdi5hZGRDdXJyVG9Nb2RpZmllZCgpO1xyXG4gICAgICAgICAgICByZWMuc2V0U2VuZFRvU2VydmVyKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICAgIHJlYy5zZXRNb2RlKG9sZFJlY01vZGUpO1xyXG4gICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB3ZSdyZSBkZWxldGluZyBhbiBpbnNlcnRlZCByZWNvcmQsIHRoZSBzZXJ2ZXIgaXMgbm90IGF3YXJlIG9mIGl0XHJcbiAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdXBvbiBkZWxldGUsIGl0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBtb2RpZmllZCByZWMgbGlzdFxyXG4gICAgICAgIGlmIChvbGRSZWNNb2RlID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KSB7XHJcbiAgICAgICAgICByZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgICByZWMuc2V0TW9kZShvbGRSZWNNb2RlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBuZXdDdXJyUmVjOiBSZWNvcmQgPSBkdi5nZXRDdXJyUmVjKCk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAvLyBRQ1IgIzQzODE3NTogd2hlbiB0aGUgdXNlciBkZWxldGVzIGEgcmVjb3JkLCB3aGljaCBpcyB0aGUgc2luZ2xlXHJcbiAgICAgICAgICAvLyByZWNvcmQgaW4gdGhlIGR2LCB0aGVuIHdoZW4gaXRzIHJlY29yZCBzdWZmaXggaXMgZXhlY3V0ZWQgYW5kIHRoZVxyXG4gICAgICAgICAgLy8gc2VydmVyIHNlbmRzIGEgbmV3IHJlY29yZCB0byB0aGUgY2xpZW50IGFuZCBzZXQgaXQgdG8gYmUgdGhlXHJcbiAgICAgICAgICAvLyBjdXJyZW50IHJlY29yZC5cclxuICAgICAgICAgIC8vIFRoaXMgZml4IG1ha2VzIHRoZSBkZWxldGVkIHJlY29yZCB0byBiZSB0aGUgY3VycmVudCBmb3IgYVxyXG4gICAgICAgICAgLy8gbW9tZW50IGp1c3QgdG8gZGVsZXRlIGl0IGZyb20gdGhlIGNsaWVudHMgY2FjaGUuIFRoZW4sIGl0IG1ha2VzXHJcbiAgICAgICAgICAvLyB0aGUgbmV3IHJlY29yZCB0byBiZSB0aGUgY3VycmVudCBhZ2FpbiBhbmQgZW50ZXJzIGludG8gY3JlYXRlIG1vZGUuXHJcbiAgICAgICAgICAvLyBJIHRoaW5rIHRoYXQgYSBiZXR0ZXIgc29sdXRpb24gaXMgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIGNsaWVudCBpc1xyXG4gICAgICAgICAgLy8gcmVzcG9uc2libGUgZm9yIGFkZGluZyBhIG5ldyByZWNvcmQgb3IgdGhlIHNlcnZlciwgYW5kIG1ha2Ugc3VyZVxyXG4gICAgICAgICAgLy8gdGhhdCBpdCBpcyBkb25lIHN5c3RlbXdpZGUuXHJcbiAgICAgICAgICAvLyBFaHVkIC0gMTAvMDkvMjAwMVxyXG4gICAgICAgICAgaWYgKHJlYyAhPT0gbmV3Q3VyclJlYylcclxuICAgICAgICAgICAgYXdhaXQgZHYuc2V0Q3VyclJlYyhyZWMuZ2V0SWQoKSwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgIC8vIG5vIG5lZWQgdG8gZGVsIHRoZSBjdXJyIHJlYyBhbmQgcG9zaXRpb24gb24gdGhlIG5leCByZWMgaWYgdGhlIHRhc2sgaXMgYWJvcnRpbmcuXHJcbiAgICAgICAgICAvLyBUaGUgZGVsQ3VyclJlYyBtYXkgY2F1c2UgYSBjcmFzaCBpZiBpdCB0cmllcyB0byBnZXQgdGhlIG5leHQgcmVjIGZyb20gdGhlIG5leHQgY2h1bmsuXHJcbiAgICAgICAgICBpZiAoIXRhc2suaXNBYm9ydGluZygpKVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRlbEN1cnJSZWModGFzaywgZmFsc2UpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAvLyBRQ1IgIzQzODE3NSAtIGZpeCBjb250aW51ZVxyXG4gICAgICAgICAgaWYgKHJlYyAhPT0gbmV3Q3VyclJlYykge1xyXG4gICAgICAgICAgICBhd2FpdCBkdi5zZXRDdXJyUmVjKG5ld0N1cnJSZWMuZ2V0SWQoKSwgZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAoZHYuZ2V0U2l6ZSgpID09PSAxKVxyXG4gICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBJbiBpbnRlcmFjdGl2ZSwgdGhlIG1vZGUgbWlnaHQgY2hhbmdlIHRvIG1vZGlmeSBvciBjcmVhdGUuIEhvd2V2ZXIsIGZvciBub24gaW50ZXJhY3RpdmUgKGRlbGV0ZSBtb2RlKVxyXG4gICAgICAgICAgLy8gdGhlIG1vZGUgc2hvdWxkIGJlIHNldCBiYWNrIHRvIGRlbGV0ZSBhbmQgd2lsbCBiZSB1c2VkIGluIHRoZSBuZXh0IHJlY29yZCBjeWNsZS5cclxuICAgICAgICAgIGlmIChub25JbnRlcmFjdGl2ZURlbGV0ZSlcclxuICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBoYW5kbGUgdmlldyByZWZyZXNoLCBzY3JlZW4gcmVmcmVzaCBhbmQgcmVjb3JkIGZsdXNoIGV2ZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldnRcIj50aGUgZXZlbnQgdG8gaGFuZGxlIHdpdGggYWxsIGl0cyBwcm9wZXJ0aWVzPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVJlZnJlc2hFdmVudHMoZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+ZXZ0LmdldFRhc2soKTtcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50YXNrLkRhdGFWaWV3O1xyXG4gICAgbGV0IGludEV2dENvZGU6IG51bWJlciA9IGV2dC5nZXRJbnRlcm5hbENvZGUoKTtcclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gbnVsbDtcclxuXHJcbiAgICBpZiAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfUkVDT1JEKVxyXG4gICAgICB0aGlzLl9pc0luUmVjb3JkRmx1c2hFdmVudCA9IHRydWU7XHJcbiAgICAvLyBjaGVjayBpZiB3ZSB0cnkgdG8gdmlldyByZWZyZXNoIHdpdGggYWxsb3dfbW9kaWZ5PW4gaW4gY3JlYXRlIG1vZGVcclxuICAgIGlmIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXICYmIHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJiAhYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTU9ESUZZLCB0cnVlKSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhd2FpdCB0YXNrLkV4ZWN1dGVOZXN0ZWRSUyhMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkpO1xyXG4gICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiAhdGFzay5JbkVuZFRhc2sgJiYgIXRhc2suaXNBYm9ydGluZygpKSB7XHJcbiAgICAgICAgaWYgKGludEV2dENvZGUgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1NDUkVFTikge1xyXG4gICAgICAgICAgbGV0IGN1cnJlbnRSb3c6IG51bWJlciA9IDA7XHJcbiAgICAgICAgICBpZiAoIWV2dC5nZXRSZWZyZXNoVHlwZSgpKSB7XHJcbiAgICAgICAgICAgIGlmIChldnQuUnRWaWV3UmVmcmVzaFVzZUN1cnJlbnRSb3coKSAmJiB0YXNrLklzSW50ZXJhY3RpdmUpIHtcclxuICAgICAgICAgICAgICBjdXJyZW50Um93ID0gZm9ybS5nZXRDdXJyUmVjUG9zSW5Gb3JtKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY21kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlSW50ZXJuYWxSZWZyZXNoQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgaW50RXZ0Q29kZSwgZHYuQ3VycmVudFJlY0lkLCBjdXJyZW50Um93KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0YXNrLklzSW50ZXJhY3RpdmUpXHJcbiAgICAgICAgICAgICAgY3VycmVudFJvdyA9IGZvcm0uZ2V0Q3VyclJlY1Bvc0luRm9ybSgpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHJlZmV0Y2hSZWNvcmQ6IGJvb2xlYW4gPSB0cnVlOyAvL1JlZmV0Y2ggcmVjb3JkIGZyb20gc2VydmVyLlxyXG4gICAgICAgICAgICBpZiAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfUkVDT1JEICYmIGV2dC5nZXRBcmdMaXN0KCkgIT09IG51bGwgJiYgZXZ0LmdldEFyZ0xpc3QoKS5nZXRTaXplKCkgIT09IDApIHtcclxuICAgICAgICAgICAgICBsZXQgcmVmZXRjaFJlY1N0cjogc3RyaW5nO1xyXG4gICAgICAgICAgICAgIHJlZmV0Y2hSZWNTdHIgPSBhd2FpdCBldnQuZ2V0QXJnTGlzdCgpLmdldEFyZ1ZhbHVlKDAsIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTiwgMCk7XHJcbiAgICAgICAgICAgICAgcmVmZXRjaFJlY29yZCA9IChpc051bGxPclVuZGVmaW5lZChyZWZldGNoUmVjU3RyKSB8fCByZWZldGNoUmVjU3RyID09PSBcIjFcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyZWZldGNoUmVjb3JkKVxyXG4gICAgICAgICAgICAgIGNtZCA9IGF3YWl0IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVJlYWxSZWZyZXNoQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgaW50RXZ0Q29kZSwgY3VycmVudFJvdywgZXZ0LmdldEFyZ0xpc3QoKSwgZHYuQ3VycmVudFJlY0lkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc2NyZWVuIHJlZnJlc2ggZXZlbnRcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGxldCBpZDogbnVtYmVyO1xyXG5cclxuICAgICAgICAgIGlmICh0YXNrLmdldEZvcm0oKSA9PT0gbnVsbClcclxuICAgICAgICAgICAgaWQgPSAwO1xyXG4gICAgICAgICAgZWxzZSBpZiAodGFzay5nZXRGb3JtKCkuaXNTY3JlZW5Nb2RlKCkpXHJcbiAgICAgICAgICAgIGlkID0gKCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpKS5nZXRJZCgpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBpZCA9ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0UmVjQnlJZHgoKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRUb3BSZWNJZHgoKSkuZ2V0SWQoKTtcclxuXHJcbiAgICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVTY3JlZW5SZWZyZXNoQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgaWQsIGR2LkN1cnJlbnRSZWNJZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyByZWFsIHZpZXcgcmVmcmVzaCBjYXVzZXMgdGhlIGNhY2hlIG9mIHRoZSBjdXJyZW50IHN1YiBmb3JtIHRhc2sgdG8gYmUgY2xlYXJlZFxyXG4gICAgICAgIGlmIChpbnRFdnRDb2RlICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9TQ1JFRU4pXHJcbiAgICAgICAgLy8gc2NyZWVuIHJlZnJlc2ggZG9lcyBub3QgY2xlYXIgdGhlIGNhY2hlXHJcbiAgICAgICAgICB0YXNrLmdldFRhc2tDYWNoZSgpLmNsZWFyQ2FjaGUoKTtcclxuXHJcbiAgICAgICAgaWYgKGNtZCAhPT0gbnVsbClcclxuICAgICAgICAgIGF3YWl0IHRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuXHJcbiAgICAgICAgdGhpcy5faXNJblJlY29yZEZsdXNoRXZlbnQgPSBmYWxzZTtcclxuICAgICAgICAvLyBRQ1IgIzI4OTIyMi4gRG8gbm90IGNvbnRpbnVlIHdpdGggUmVmcmVzaCBpZiB0aGUgdGFzayBtdXN0IGJlIGVuZGVkLlxyXG4gICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmICF0YXNrLkluRW5kVGFzayAmJiAhdGFzay5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgICAgIC8vIEFmdGVyIHZpZXcgcmVmcmVzaCwgdGhlIHNlcnZlciBhbHdheXMgcmV0dXJucyBjdXJyIHJlYyBhcyBmaXJzdCByZWMuXHJcbiAgICAgICAgICBpZiAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVyAmJiAhZm9ybS5pc1NjcmVlbk1vZGUoKSkge1xyXG4gICAgICAgICAgICBkdi5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICAgIGlmIChmb3JtLkhhc1RhYmxlKCkpIHtcclxuICAgICAgICAgICAgICBmb3JtLmNsZWFyVGFibGVDb2x1bW5Tb3J0TWFyayh0cnVlKTtcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLnJlc3RvcmVPbGREaXNwbGF5TGluZShmb3JtLnJlY29yZElkeDJEaXNwbGF5TGluZShkdi5nZXRDdXJyUmVjSWR4KCkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIEFmdGVyIHJlY29yZCBoYXMgYmVlbiBmbHVzaGVkIGl0IGlzIG5vdCBjb25zaWRlcmVkIGEgbmV3IHJlY29yZCBhbnltb3JlLlxyXG4gICAgICAgICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRCAmJiB0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSAmJiAhdGFzay5nZXRBZnRlclJldHJ5KCkpIHtcclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgICAgICAgICAgKCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpKS5zZXRPbGRSZWMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCBkdi5jdXJyUmVjQ29tcHV0ZSh0cnVlKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOICYmIHRhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZICYmICF0YXNrLmdldEFmdGVyUmV0cnkoKSkge1xyXG4gICAgICAgICAgICBhd2FpdCBkdi5jdXJyUmVjQ29tcHV0ZSh0cnVlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBRQ1IgIzQzMDA1OS4gSWYgdGhlIGZvY3VzZWQgdGFzayBhbmQgdGhlIHJlZnJlc2hlZCB0YXNrIGlzIHRoZSBzYW1lIHRhc2sgb3JcclxuICAgICAgICAgIC8vIHRoZSBmb2N1c2VkIHRhc2sgaXMgYSBjaGlsZCBvZiB0aGUgcmVmcmVzaGVkIHRhc2ssIGdvIHRvIHRoZSBmaXJzdCBjb250cm9sIGluIHRoZSBmaXJzdCBsaW5lLlxyXG4gICAgICAgICAgLy8gSWYgdGhlIGZvY3VzZWQgdGFzayBpcyB0aGUgcGFyZW50IHRhc2ssIGRvIG5vdCBsZWF2ZSB0aGUgY3VycmVudCBjb250cm9sLlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgIXRhc2suZ2V0UHJldmVudENvbnRyb2xDaGFuZ2UoKSkge1xyXG4gICAgICAgICAgICBpZiAoISh0YXNrID09PSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkgfHwgIXRhc2sucGF0aENvbnRhaW5zKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSkpKVxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHbyB0byBjcmVhdGUgbW9kZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNtZHNcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgZ290b0NyZWF0ZU1vZGUodGFzazogVGFzayk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQ7XHJcbiAgICBhd2FpdCB0YXNrLmVuYWJsZU1vZGVzKCk7XHJcbiAgICAvLyBRQ1IgIzQxNzczMy4gRXhlY3V0ZSBSUydzIG9mIHRoZSBuZXN0ZWQgc3ViZm9ybXMgaWYgdGhlIGN1cnJlbnQgdGFzayBpcyBvbmUgb2YgdGhlIG5lc3RlZCBzdWJmb3Jtcy5cclxuICAgIGF3YWl0IHRhc2suRXhlY3V0ZU5lc3RlZFJTKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSk7XHJcbiAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgY21kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRXZlbnRDb21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX0NSRUFURSk7XHJcbiAgICAgIGF3YWl0IHRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyh0YXNrKTtcclxuICAgICAgYXdhaXQgdGFzay5zZXRDcmVhdGVEZWxldGVBY3RzRW5hYmxlU3RhdGUoKTtcclxuICAgICAgdGFzay5zZXRPcmlnaW5hbFRhc2tNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuSGFuZGxlQWN0RW50ZXJSb3dFZGl0aW5nKHRhc2spO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGRvIHNvbWUgZGVmYXVsdCBvcGVyYXRpb25zIGZvciBhbiBldmVudCBhZnRlciBhbGwgdGhlIGhhbmRsZXJzIGZpbmlzaGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJjQmVmb3JlXCI+dGhlIFJDIHJldHVybmVkIGZyb20gdGhlIGNvbW1vbkhhbmRsZXJCZWZvcmU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcG9nYXRlXCI+aWYgZXZlbnQgd2FzIHByb3BvZ2F0ZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiRXZlbnRcIj50aGUgZXZlbnQgdG8gaGFuZGxlPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGNvbW1vbkhhbmRsZXJBZnRlcihldnQ6IFJ1blRpbWVFdmVudCwgcmNCZWZvcmU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+ZXZ0LmdldFRhc2soKTtcclxuICAgIGxldCBkdjogRGF0YVZpZXc7XHJcbiAgICBsZXQgcmVjOiBSZWNvcmQgPSBudWxsO1xyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbDtcclxuICAgIGxldCByZWNNb2RpZmllZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHJlY01vZGVJc0RlbGV0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGZvcmNlU3VmZml4OiBib29sZWFuO1xyXG5cclxuICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uICYmIGV2dC5nZXRJbnRlcm5hbENvZGUoKSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVggJiYgZXZ0LmdldEludGVybmFsQ29kZSgpICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCkge1xyXG4gICAgICBkdiA9IDxEYXRhVmlldz50YXNrLkRhdGFWaWV3O1xyXG4gICAgICByZWMgPSBkdi5nZXRDdXJyUmVjKCk7XHJcbiAgICAgIGN0cmwgPSA8TWdDb250cm9sPmV2dC5Db250cm9sO1xyXG5cclxuICAgICAgc3dpdGNoIChldnQuZ2V0SW50ZXJuYWxDb2RlKCkpIHtcclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYOlxyXG4gICAgICAgICAgaWYgKHJjQmVmb3JlKSB7XHJcbiAgICAgICAgICAgIC8vIGhhbmRsZSByZWNvcmQgcHJlZml4IGZvciB0aGUgc3ViIHRhc2tzIHRvb1xyXG4gICAgICAgICAgICBpZiAoYXdhaXQgdGFzay5DaGVja1JlZnJlc2hTdWJUYXNrcygpKVxyXG4gICAgICAgICAgICAgIGF3YWl0IHRhc2suZG9TdWJmb3JtUmVjUHJlZml4U3VmZml4KCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRhc2suaGFuZGxlRXZlbnRPblNsYXZlVGFza3MoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrLmVuYWJsZU1vZGVzKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWDpcclxuICAgICAgICAgIHRhc2suaXNGaXJzdFJlY29yZEN5Y2xlKGZhbHNlKTtcclxuICAgICAgICAgIC8vIE9uY2UgYXJlIHJlYWR5IHRvIGVuZCB0aGUgUlMsIGl0IG1lYW5zIHdlIGNhbm5vdCBiZSB0aGUgRklSU1QgcmVjb3JkIGN5Y2xlXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRQcmV2ZW50UmVjb3JkU3VmZml4KCkpIHtcclxuICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KGZhbHNlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIFFDUiAjMTE1OTUxLiBFdmVuIGlmIHJlY29yZCBzdWZmaXggaXMgbm90IGV4ZWN1dGVkLCBpbiB0aGUgbmV4dCB0aW1lIGRvIG5vdCBleGVjdXRlIFJQICYgUlMgb2YgdGhlIHN1YmZvcm0uXHJcbiAgICAgICAgICB0YXNrLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICAgIC8vIFFDUiAjOTg0MDMxOiBpZiB0aGUgZGVsZXRlIG9wZXJhdGlvbiBmYWlsZWQgZHVlIHRvIFwidmVyaWZ5IGVycm9yXCJcclxuICAgICAgICAgICAgLy8gaW4gdGhlIHJlY29yZCBzdWZmaXggdGhlbiB0aGUgcmVjb3JkIG1vZGUgbXVzdCBiZSBjbGVhcmVkXHJcbiAgICAgICAgICAgIGlmIChyZWMuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlKVxyXG4gICAgICAgICAgICAgIHJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICAgICAgLy8gUWNyIDc4MzAzOSA6IElmIHdlIGFyZSBhbHJlYWR5IGluIGNvbnRyb2wgbGV2ZWwgaXQgbWVhbnMgdGhhdCBjb250cm9sIHByZWZpeCB3YXMgYWxyZWFkeSBkb25lIG9yIHRoYXRcclxuICAgICAgICAgICAgLy8gY29udHJvbCBzdWZmaXggd2FzIG5vdCBkb25lLiBFaXRoZXIgd2F5IHRoZXJlIGlzIG5vIG5lZWQgdG8gZG8gY29udHJvbCBwcmVmaXggYWdhaW4uXHJcbiAgICAgICAgICAgIGlmICh0YXNrLmdldExldmVsKCkgIT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wpIHtcclxuICAgICAgICAgICAgICBsZXQgbGFzdCA9IDxNZ0NvbnRyb2w+dGhpcy5nZXRTdG9wRXhlY3V0aW9uQ3RybCgpO1xyXG4gICAgICAgICAgICAgIGlmIChsYXN0ID09PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgbGFzdCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwobnVsbCk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIFFDUiA0MjYyODMgaXMgd2UgaGF2ZSBhIHN1Yi1mb3JtIHRoYXQgd2FzIG5ldmVyIGJlZW4gZW50ZXJlZFxyXG4gICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBjb250cm9sIGxldmVsIHdpbGwgbm90IGJlIGVudGVyZWRcclxuICAgICAgICAgICAgICBpZiAobGFzdCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBkb25vdCB3YW50IENTIHRvIGJlIGNhbGxlZCBhZ2FpbiBmcm9tIENQIGluY2FzZSBvZiB2ZXJpZnkgZXJyIGluIENWXHJcbiAgICAgICAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1JFQ09SRCk7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGluQ3RybFByZWZpeDogYm9vbGVhbiA9IHRhc2suSW5DdHJsUHJlZml4O1xyXG4gICAgICAgICAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGxhc3QsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCk7XHJcbiAgICAgICAgICAgICAgICB0YXNrLkluQ3RybFByZWZpeCA9IGluQ3RybFByZWZpeDtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIC8vIGluIHRoZSBmdXR1cmUgY2hlY2sgdGhlIHN0b3BFeGVjdXRpb24gZmxhZyBoZXJlIHRvbyBhbmQgZGlzcGxheSBhXHJcbiAgICAgICAgICAgICAgLy8gY29uZmlybSBjYW5jZWwgZGlhbG9nIHRoYXQgd2lsbCBjbG9zZSB0aGUgYnJvd3NlciBpZiB0aGUgdmFsdWUgaXMgdHJ1ZVxyXG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBEZWZlY3QgMTUyODcxOiBXaXRoIG5ldyB3YXkgb2YgZWRpdGluZyByb3csIFJTIGlzIG5vdCBmaXJlZCBpbmZpbml0ZWx5LCBidXQgcm93IHNlbGVjdGlvbiBpcyBzaGlmdGVkIHRvIG5ldyByb3cuIEFsc28gcm93IGxlYXZlcyBlZGl0aW5nIG1vZGUuXHJcbiAgICAgICAgICAgIC8vIFNvIGVuc3VyZSByb3cgZWRpdGluZyBpcyBsZWZ0IHdoZW4gdGhlcmUgaXMgbm8gdmVyaWZ5IGVycm9yIGFuZCBub3QgdW5jb25kaXRpb25hbGx5LlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZVN0b3BSb3dFZGl0aW5nKHRhc2spO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChyZWMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZWNNb2RpZmllZCA9IHJlYy5Nb2RpZmllZDtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9zdG9wRXhlY3V0aW9uICYmIHJlYy5pc0NhdXNlSW52YWxpZGF0aW9uKCkpIHtcclxuICAgICAgICAgICAgICAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuaW52YWxpZGF0ZVRhYmxlKCk7XHJcbiAgICAgICAgICAgICAgcmVjLnNldENhdXNlSW52YWxpZGF0aW9uKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZWNNb2RlSXNEZWxldGUgPSAocmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSk7XHJcblxyXG4gICAgICAgICAgICBmb3JjZVN1ZmZpeCA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAvLyBpZiB0aGUgcmVjb3JkIGlzIGRlbGV0ZWQgdGhlbiBleGVjdXRlIHRoZSBcInJlYyBzdWZmaXggYWZ0ZXJcIiBvbmx5XHJcbiAgICAgICAgICAgIC8vIHdoZW4gdGhlIHRhc2sgbW9kZSBpcyBkZWxldGUgKHNlY29uZCByb3VuZClcclxuICAgICAgICAgICAgLy8gaW5EZWxldGVQcm9jZXNzIDogaWYgdGhlcmUgaXMgYW4gJ0VORCBUQVNLIENPTkQnIHdlIHdpbGwgaGF2ZSBhIDNyZCBjeWNsZSBpbiByZWNvcmQgc3VmZml4KHdoZW4gdXBkK2RlbCBvciBmb3JjZSBzdWZmICsgZGVsKS5cclxuICAgICAgICAgICAgLy8gMXN0IGN5Y2xlIDogdXBkYWUgY3ljbGUgKHRhc2sgbW9kZSB3aWxsIGJlIHVwZGF0ZSksIDJuZCA6IHRhc2sgbW9kZSBpcyBkZWxldGUgLCB0aGlzIGlzIHdoZW4gd2Ugc2VuZCB0aGUgZGVsZXRlIHRvIHRoZSBzZXJ2ZXIuXHJcbiAgICAgICAgICAgIC8vIDNyZCAtIHN1ZmZpeCB0aGF0IGlzIGNhbGxlZCBmcm9tIHRoZSBlbmRUYXNrLiBJbiB0aGUgM3JkIGN5Y2xlIHRoZSByZWNNb2RlSXNEZWxldGUgd2lsbCBiZSBmYWxzZSBhbHRob3VnaCB3ZSBhcmUgc3RpbGwgaW4gdGhlIGRlbGV0ZSBwcm9jZXNzICh3ZSBhbHJlYWR5IHNlbnQgdGhlIGRlbGV0ZSBvcGVyKS5cclxuICAgICAgICAgICAgLy8gQSBjb21iaW5hdGlvbiBvZiBmb3JjZSBzdWZmaXggKyBlbmQgdGFzayBjb25kICsgZGVsIGxpbmUgLCB3aWxsIGNyYXNoIHRoZSBzZXJ2ZXIgb24gdGhlIDNyZCBjeWNsZSBzaW5jZSB3ZSB3aWxsIGFzayBmb3IgdXBkYXRlIG9mZlxyXG4gICAgICAgICAgICAvLyBhIHJlY29yZCB0aGF0IHRoZSBzZXJ2ZXIgaGFkIGRlbGV0ZWQgb24gdGhlIDJuZCBjeWNsZS4gVGhhdCBpdCB3aHkgd2UgdXNlICdpbkRlbGV0ZVByb2Nlc3MnLCBzbyB3aWxsIHdpbGwga25vdyBub3RcclxuICAgICAgICAgICAgLy8gdG8gYWRkIHVwZGF0ZSBvcGVyIG9uIGFuIGFscmVhZHkgZGVsZXRlZCByZWNvcmQuIChRY3IgIzc5MDI4MykuXHJcbiAgICAgICAgICAgIC8vICogdGhlcmUgaXMgc3RpbGwgYSBwcm9ibGVtIGluICd1cGRhdGUnIGFuZCAnaW5zZXJ0JyB3aXRoICdlbmQgdGFzayBjb25kJyArICdmb3JjZScgOiBhbiBleHRyYSB1cGRhdGUgd2lsbCBiZSBzZW5kXHJcbiAgICAgICAgICAgIC8vICAgdG8gdGhlIHNlcnZlciBvbiB0aGUgcmVjIHN1ZmZpeCBvZiB0aGUgZW5kIHRhc2suIGJ1dCBhcGFydCBmcm9tIHNlcnZlciB1cGRhdGUgaXQgY2F1c2VzIG5vIHJlYWwgcHJvYmxlbS5cclxuICAgICAgICAgICAgaWYgKHJlY01vZGVJc0RlbGV0ZSAmJiB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUgfHxcclxuICAgICAgICAgICAgICAhcmVjTW9kZUlzRGVsZXRlICYmICFyZWMuaW5EZWxldGVQcm9jZXNzKCkgJiYgKHJlY01vZGlmaWVkIHx8IGZvcmNlU3VmZml4KSkge1xyXG4gICAgICAgICAgICAgIHJlYy5zZXRNb2RlKERhdGFNb2RpZmljYXRpb25UeXBlcy5VcGRhdGUpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IGR2LmFkZEN1cnJUb01vZGlmaWVkKCk7XHJcbiAgICAgICAgICAgICAgZHYuc2V0Q2hhbmdlZCh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHJlY01vZGlmaWVkICYmIHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVjLnJlYWxNb2RpZmllZCgpICYmXHJcbiAgICAgICAgICAgICAgICAgICFFbnZpcm9ubWVudC5JbnN0YW5jZS5hbGxvd1VwZGF0ZUluUXVlcnlNb2RlKHRhc2suZ2V0Q29tcElkeCgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAvLyBpZiByZWFsIGZpZWxkcyB3ZXJlIG1vZGlmaWVkXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGR2LmNhbmNlbEVkaXQoRXZlbnRzTWFuYWdlci5SRUFMX09OTFksIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgdGFzay5Xcml0ZVRvTWVzc2FnZVBhbmVieU1zZ0lkKE1zZ0ludGVyZmFjZS5SVF9TVFJfVVBEQVRFX0lOX1FVRVJZKTtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gd2UgbXVzdCBjb250aW51ZSBoZXJlIGFuZCB0cnkgdG8gY29tbWl0IHRoZSB0cmFuc2FjdGlvbiBiZWNhdXNlXHJcbiAgICAgICAgICAgICAgICAvLyB0aGVyZSBtaWdodCBiZSBhbHNvIHNvbWUgc3ViIHRhc2tzIHRvIHRoaXMgdGFza1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gUUNSIzc3NjI5NTogZm9yIHByZSByZWNvcmQgdXBkYXRlLCBjb21taXQgdGhlIHJlY29yZCBhZnRlciBoYW5kbGVyJ3MgZXhlY3V0aW9uLlxyXG4gICAgICAgICAgICAvLyBGaXhlZCBidWcgIzozMDY5MjksIEZvcmNlRXhpdFByZSBpcyByZWxldmFudCBvbmx5IGZvciB0aGUgdGFzayB0aGF0IHJhaXNlZCB0aGUgZXZlbnRcclxuICAgICAgICAgICAgLy8gc2VlIGFsc28gYnVnIzoyOTI4NzZcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzRm9yY2VFeGl0UHJlUmVjb3JkVXBkYXRlKHRhc2spICYmXHJcbiAgICAgICAgICAgICAgLy8gRGVmZWN0IDE1NDA0NyA6IGRvIG5vdCB0cnkgYW5kIGNvbW1pdCBpZiB0YXNrIGlzIGFib3J0aW5nIGFuZCB3YXMgYWxyZWFkeSByZW1vdmVkIChvciBhbGwgTUdEIHdhcyByZW1vdmVkKS5cclxuICAgICAgICAgICAgICAoIXRhc2suaXNBYm9ydGluZygpIHx8IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuR2V0VGFza0J5SUQodGFzay5nZXRUYXNrVGFnKCkpICE9IG51bGwpKVxyXG4gICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBpZiAoKCFyZWNNb2RlSXNEZWxldGUgfHwgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFKSlcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29tbWl0UmVjb3JkKHRhc2ssIGV2dC5yZXZlcnNpYmxlRXhpdCgpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF0YXNrLnRyYW5zYWN0aW9uRmFpbGVkKENvbnN0SW50ZXJmYWNlLlRSQU5TX1JFQ09SRF9QUkVGSVgpICYmICF0YXNrLmlzQWJvcnRpbmcoKSkge1xyXG4gICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdG8gZXZhbHVhdGUgdGhlIGVuZCBjb25kaXRpb24gYWZ0ZXIgdGhlIHJlY29yZCBzdWZmaXhcclxuICAgICAgICAgICAgICAvLyBpbiBjYXNlIHRoZXJlIGFyZSAyIGN5Y2xlcyAodXBkYXRlL2ZvcmNlIHN1ZmZpeCArIGRlbGV0ZSksIGRvIHRoZSBlbmQgdGFzayBvbmx5IGluIHRoZSAybmQgY3ljbGUuXHJcbiAgICAgICAgICAgICAgaWYgKChyZWMuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlICYmXHJcbiAgICAgICAgICAgICAgICB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUpIHx8XHJcbiAgICAgICAgICAgICAgICByZWMuZ2V0TW9kZSgpICE9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlKVxyXG4gICAgICAgICAgICAgICAgaWYgKGF3YWl0IHRhc2suZXZhbEVuZENvbmQoQ29uc3RJbnRlcmZhY2UuRU5EX0NPTkRfRVZBTF9BRlRFUikpXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IC8vIHJlYyAhPSBudWxsXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVg6XHJcbiAgICAgICAgICBpZiAocmNCZWZvcmUpIHtcclxuICAgICAgICAgICAgLy8gY2hlY2sgcGFya2FiaWxpdHkgb25jZSBhZ2FpbiBhcyBwcm9wZXJ0eSBtaWdodCBoYXZlIGNoYW5nZWQgaW4gdGhlIGhhbmRsZXJcclxuICAgICAgICAgICAgLy8gOTI0MTEyIC0gaWdub3JlIGRpcmVjdGlvbiAoaWYgZmxhZyBzZXQpIGFzIHdlIGFyZSBmb3JjaW5nIHBhcmsgaW5zcGl0ZSBvZiBmYWlsZWQgZGlyZWN0aW9uXHJcbiAgICAgICAgICAgIC8vIFFDUiMgODA2MDE1OiBJZiB3ZSBoYXZlIGEgc2luZ2xlIGZpZWxkIHdpdGggYWxsb3cgcGFya2luZyA9IFllcyBhbmQgVGFiIEludG8gPSBObywgdGhlbiBvbiBwcmVzc2luZyB0YWIgaWYgY3Vyc29yIGlzIG5vdFxyXG4gICAgICAgICAgICAvLyBtb3ZlZCwgd2UgY29tZSB0byBwYXJrIG9uIGxhc3RQYXJrZWRDdHJsICh3aGljaCBpcyBzYW1lIGFzIGN0cmwpIHNpbmNlIFRhYkludG8gaXMgbm90IGFsbG93ZWQuXHJcbiAgICAgICAgICAgIC8vIFNvIHRvIGF2YW9pZCBpbmZpbml0ZSByZWN1cnNpb24sIHdlIHNob3VsZCBub3QgYWdhaW4gdHJ5IHRvIHBhcmsgb24gaXQuXHJcbiAgICAgICAgICAgIGlmIChhd2FpdCBjdHJsLklzUGFya2FibGUoKSB8fCBjdHJsID09PSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCkpIHtcclxuICAgICAgICAgICAgICAvLyBzZXQgSW5Db250cm9sIHRydWUgYWZ0ZXIgQ29udHJvbCBQcmVmaXhcclxuICAgICAgICAgICAgICBjdHJsLkluQ29udHJvbCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChjdHJsLlNob3VsZFJlZnJlc2hPbkNvbnRyb2xFbnRlcigpKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgKDxGaWVsZD5jdHJsLmdldEZpZWxkKCkpLnVwZGF0ZURpc3BsYXkoKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gaWYgdGhpcyBjb2RlIGlzIHJlYWNoZWQgdGhlbiBldmVyeXRoaW5nIGlzIG9rIGluIHRoZSBjb250cm9sIHByZWZpeFxyXG4gICAgICAgICAgICAgIC8vIHVzZXIgaGFuZGxlci4gTm93LCBtb3ZlIHRoZSBmb2N1cyB0byB0aGUgY29udHJvbC5cclxuICAgICAgICAgICAgICB0YXNrLnNldExhc3RQYXJrZWRDdHJsKGN0cmwpO1xyXG4gICAgICAgICAgICAgIC8vIHdlIGhhdmUgcGFya2VkIG9uIGEgY3RybCBzZXQgY2xpY2tlZCBjdHJsIHRvIG51bGxcclxuICAgICAgICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRDdHJsID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgLy8gdG8gdGFrZSBjYXJlIG9mIHRlbXBvcmFyeSBlZGl0b3JcclxuICAgICAgICAgICAgICAvLyBNYW5hZ2VyLnNldEZvY3VzKGN0cmwsIGN0cmwuZ2V0RGlzcGxheUxpbmUoZmFsc2UpKTtcclxuICAgICAgICAgICAgICBhd2FpdCBjdHJsLlNldEZvY3VzKGN0cmwsIGN0cmwuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCAgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBzdWNjZXNzZnVsbHkgcGFya2VkIG9uIGEgY3RybCwgc2V0IHNldHN0b3BleGVjdXRpb25DdHJsIHRvIG51bGxcclxuICAgICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25DdHJsKG51bGwpO1xyXG5cclxuICAgICAgICAgICAgICBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsID0gY3RybDtcclxuICAgICAgICAgICAgICB0YXNrLkluQ3RybFByZWZpeCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVg6XHJcbiAgICAgICAgICAvLyBkaXNhYmxlIGFjdGlvbnMgYW5kIHN0YXRlcy4gZG8gaXQgb25seSBpZiB3ZSBhcmUgZ2V0dGluZyBvdXQgb2YgdGhlIGNvbnRyb2wuXHJcbiAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG5cclxuICAgICAgICAgICAgaWYgKGN0cmwuaXNDaG9pY2VDb250cm9sKCkpIHtcclxuICAgICAgICAgICAgICBjdHJsLlNldEtleWJvYXJkTGFuZ3VhZ2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04pXHJcbiAgICAgICAgICAgICAgdGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQlVUVE9OLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGFzay5nZXRFbmFibGVab29tSGFuZGxlcigpIHx8IGN0cmwudXNlWm9vbUhhbmRsZXIoKSlcclxuICAgICAgICAgICAgICB0YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX0VEVF9OVUxMLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChyY0JlZm9yZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgLy8gSWYgY29udHJvbCBzdWZmaXggZ2V0ICdzdG9wIGV4ZWN1dGlvbicgKGUuZy4gdmVyaWZ5IGVycm9yKSwgdGhlIGZvY3VzIHdpbGwgYmUgcmVtYWluIG9uIGN1cnJlbnQgY29udHJvbC5cclxuICAgICAgICAgICAgICAvLyBTbyBzZXQgSW5Db250cm9sIHRvIHRydWVcclxuICAgICAgICAgICAgICBjdHJsLkluQ29udHJvbCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyByZXNldCB0aGUgbmV4dFBhcmtlZEN0cmwgKHNldCBpbiBDbGllbnRNYW5hZ2VyLnByb2Nlc3NGb2N1cylcclxuICAgICAgICAgICAgdGhpcy5fbmV4dFBhcmtlZEN0cmwgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgLy8gVXBkYXRlIGZpZWxkcyB0aGF0IGFyZSBhc3NpZ25lZCB0byBhIHRleHQgY29udHJvbCBhbmQgd2l0aCB0eXBlIHRoYXQgaGFzIGRlZmF1bHQgZGlzcGxheVxyXG4gICAgICAgICAgICAvLyB2YWx1ZSAobnVtZXJpYywgZGF0ZSwgdGltZSwgbG9naWNhbCBldGMpXHJcbiAgICAgICAgICAgIGxldCBmbGQ6IEZpZWxkID0gPEZpZWxkPmN0cmwuZ2V0RmllbGQoKTtcclxuICAgICAgICAgICAgaWYgKGZsZCAhPSBudWxsICYmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RFWFQpKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGZsZC51cGRhdGVEaXNwbGF5KCk7XHJcblxyXG4gICAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1JFQ09SRCk7XHJcbiAgICAgICAgICAgIGN0cmwuc2V0SW5Db250cm9sU3VmZml4KGZhbHNlKTtcclxuICAgICAgICAgICAgY3RybC5Jc0ludGVyYWN0aXZlVXBkYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmIChjdHJsLlByb3BlcnR5RXhpc3RzKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9WQUxJREFUT1JTKSlcclxuICAgICAgICAgICAgICBhd2FpdCBjdHJsLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ1VTVE9NX1ZBTElEQVRPUlMpLlJlZnJlc2hEaXNwbGF5KHRydWUpO1xyXG4gICAgICAgICAgICBjdHJsLlZhbGlkYXRlQ29udHJvbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIExhc3RGb2N1c2VkTWFuYWdlci5zZXRMYXN0Rm9jdXNlZENvbnRyb2wodGFzaywgbnVsbCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYXdhaXQgdGFzay5ldmFsRW5kQ29uZChDb25zdEludGVyZmFjZS5FTkRfQ09ORF9FVkFMX0lNTUlESUFURSkpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVg6XHJcbiAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYOlxyXG4gICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9OT05FKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAvLyBzaW11bGF0ZXMgdXNlciBhc2tpbmcgZm9yIHRoZSBuZXh0IHJlYy5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DWUNMRV9ORVhUX1JFQzpcclxuICAgICAgICAgIGxldCBmb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgICAgICAgIGlmICghdGFzay5pc01haW5Qcm9nKCkgJiYgZm9ybSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhmb3JtLmlzTGluZU1vZGUoKVxyXG4gICAgICAgICAgICAgID8gQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1dcclxuICAgICAgICAgICAgICA6IENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSxcclxuICAgICAgICAgICAgICBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTkVYVCk7XHJcbiAgICAgICAgICAgIC8vIGVuZCBvZiBkYXRhIHdpbGwgc2lnbmFsIHVzIHRvIGVuZCB0aGUgdGFzayAodW5sZXNzIGluIGNyZWF0ZSBtb2RlKS5cclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0RXhlY0VuZFRhc2soKSlcclxuICAgICAgICAgICAgICBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAvLyBkZWxldGUgcmVjb3JkIGluIG5vbiBpbnRlcmFjdGl2ZSB0YXNrXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1lDTEVfTkVYVF9ERUxFVEVfUkVDOlxyXG4gICAgICAgICAgLy8gY2hlY2sgZW1wdHkgZGF0YXZpZXcgYmVmb3JlIHRyeWluZyB0byBkZWxldGUsIGluIGNhc2UgdGFzayBzdGFydGVkIHdpdGggZW1wdHkgZGF0YXZpZXcuXHJcbiAgICAgICAgICBpZiAodGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSlcclxuICAgICAgICAgICAgKHRhc2spLnNldEV4ZWNFbmRUYXNrKCk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlQWN0aW9uRGVsbGluZSggdGFzaywgZHYsIHJlYywgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgLy8gZW5kIG9mIGRhdGEgd2lsbCBzaWduYWwgdXMgdG8gZW5kIHRoZSB0YXNrICh1bmxlc3MgaW4gY3JlYXRlIG1vZGUpLlxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0RXhlY0VuZFRhc2soKSlcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VUX0VYVEVSTkFMX1ZBTFVFOlxyXG4gICAgICAgICAgbGV0IHJlZnJlc2hEaXNwbGF5IDogYm9vbGVhbiA9IGF3YWl0IGV2dC5nZXRBcmdMaXN0KCkuZ2V0QXJnVmFsdWUoMSwgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOLCAwKSA9PT0gJzEnID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgICAgYXdhaXQgKDxNZ0NvbnRyb2w+Y3RybCkudmFsaWRhdGVBbmRTZXRWYWx1ZUlmQWxsb3dlZChldnQuZ2V0VmFsdWUoKSwgcmVmcmVzaERpc3BsYXkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY3JlYXRlcyBhIG5vbiByZXZlcnNpYmxlIGV2ZW50IGFuZCBoYW5kbGUgaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPmEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldmVudENvZGVcIj50aGUgY29kZSBvZiB0aGUgZXZlbnQgPC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVOb25SZXZlcnNpYmxlRXZlbnQodGFzazogVGFza0Jhc2UsIGV2ZW50Q29kZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzayk7XHJcbiAgICBsZXQgZXhpdENvbW1hbmQ6IGJvb2xlYW4gPSAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCB8fCBldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DTE9TRSk7XHJcblxyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoZXZlbnRDb2RlKTtcclxuXHJcbiAgICBpZiAoZXhpdENvbW1hbmQpXHJcbiAgICAgIHRoaXMuX2lzTm9uUmV2ZXJzaWJsZUV4aXQgPSB0cnVlO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHJ0RXZ0LnNldE5vblJldmVyc2libGVFeGl0KCk7XHJcbiAgICAgIHJ0RXZ0LnNldEN0cmwoPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCkpO1xyXG4gICAgICBydEV2dC5zZXRBcmdMaXN0KG51bGwpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICBpZiAoZXhpdENvbW1hbmQpXHJcbiAgICAgICAgdGhpcy5faXNOb25SZXZlcnNpYmxlRXhpdCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNyZWF0ZXMgYSBuZXcgaW50ZXJuYWwgRXZlbnQgYW5kIGhhbmRsZSBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+YSByZWZlcmVuY2UgdG8gdGhlIHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZlbnRDb2RlXCI+dGhlIGNvZGUgb2YgdGhlIGV2ZW50PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzUXVpdFwiPmluZGljYXRlcyB3aGV0aGVyIE1HX0FDVF9DQU5DRUwgaXMgY2FsbGVkIGZyb20gTUdfQUNUX1JUX1FVSVQ8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZEV2ZW50U3VidHlwZSh0YXNrOiBUYXNrQmFzZSwgZXZlbnRDb2RlOiBudW1iZXIsIGV2ZW50U3ViVHlwZTogRXZlbnRTdWJUeXBlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbGFzdFBhcmtlZEN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQ7XHJcblxyXG4gICAgaWYgKGV2ZW50Q29kZSA8IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UT1RfQ05UICYmIHRhc2sgIT0gbnVsbCAmJiAhKGV2ZW50U3ViVHlwZSA9PT0gRXZlbnRTdWJUeXBlLkNhbmNlbElzUXVpdCkgJiYgIXRhc2suQWN0aW9uTWFuYWdlci5pc0VuYWJsZWQoZXZlbnRDb2RlKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmIChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbClcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbChsYXN0UGFya2VkQ3RybCwgZXZlbnRDb2RlLCBldmVudFN1YlR5cGUpO1xyXG5cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUVVJVClcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZEV2ZW50U3VidHlwZSh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMLCBFdmVudFN1YlR5cGUuQ2FuY2VsSXNRdWl0KTtcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KHRhc2spO1xyXG4gICAgICAgIHJ0RXZ0LnNldEludGVybmFsKGV2ZW50Q29kZSk7XHJcbiAgICAgICAgcnRFdnQuU2V0RXZlbnRTdWJUeXBlKGV2ZW50U3ViVHlwZSk7XHJcbiAgICAgICAgaWYgKEludGVybmFsSW50ZXJmYWNlLkJ1aWx0aW5FdmVudChldmVudENvZGUpKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGF3YWl0IHRoaXMuY29tbW9uSGFuZGxlcihydEV2dCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjcmVhdGVzIGEgbmV3IGludGVybmFsIEV2ZW50IGFuZCBoYW5kbGUgaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmEgcmVmZXJlbmNlIHRvIHRoZSBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2ZW50Q29kZVwiPnRoZSBjb2RlIG9mIHRoZSBldmVudDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc1F1aXRcIj5pbmRpY2F0ZXMgd2hldGhlciBNR19BQ1RfQ0FOQ0VMIGlzIGNhbGxlZCBmcm9tIE1HX0FDVF9SVF9RVUlUPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sKGN0cmw6IE1nQ29udHJvbCwgZXZlbnRDb2RlOiBudW1iZXIsIGV2ZW50U3ViVHlwZTogRXZlbnRTdWJUeXBlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudDtcclxuXHJcbiAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUVVJVClcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbChjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMLCBFdmVudFN1YlR5cGUuQ2FuY2VsSXNRdWl0KTtcclxuICAgIGVsc2Uge1xyXG4gICAgICBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCk7XHJcbiAgICAgIHJ0RXZ0LnNldEludGVybmFsKGV2ZW50Q29kZSk7XHJcbiAgICAgIHJ0RXZ0LlNldEV2ZW50U3ViVHlwZShldmVudFN1YlR5cGUpOyAvLyAodXNlIGZvciBhY3RfY2FuY2VsICYgYWN0X3J0X3ZpZXdfcmVmcmVzaFxyXG4gICAgICAvLyBiYXNpY2FsbHkgTUdfQUNUX1ZJRVdfUkVGUkVTSCByZXByZXNlbnQgdGhlIHZpZXcgcmVmcmVzaCBldmVudCByYWlzZWQgYnkgdGhlIHVzZXJcclxuICAgICAgLy8gaG93ZXZlciB3ZSB1c2UgaW50ZXJuYWxseSBpbiB0aGUgY29kZSB0byByZWZyZXNoIHRoZSBkaXNwbGF5IChtYWlubHkgaW4gc3ViIGZvcm1zIHJlZnJlc2hlcylcclxuICAgICAgLy8gaW4gb3JkZXIgdGhlIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIHJlYWwgdXNlIGFuZCB0aGUgaW50ZXJuYWwgdXNlIHdlIHNldCB0aGlzIGZsYWcgdG8gZmFsc2VcclxuICAgICAgLy8gd2UgbmVlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSB0d28gc2luY2Ugd2UgbWFrZSBkaWZmZXJlbnQgYWN0aW9ucyB3aGVuIGNhY2hpbmcgYSBzdWJmb3JtXHJcbiAgICAgIGlmIChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcpXHJcbiAgICAgICAgcnRFdnQuc2V0SXNSZWFsUmVmcmVzaChmYWxzZSk7XHJcblxyXG4gICAgICBpZiAoSW50ZXJuYWxJbnRlcmZhY2UuQnVpbHRpbkV2ZW50KGV2ZW50Q29kZSkpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb21tb25IYW5kbGVyKHJ0RXZ0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjdXJyZW50IGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDdXJyRmllbGQoKTogRmllbGQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJGaWVsZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGN1cnJlbnQgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q3VyckN0cmwoKTogTWdDb250cm9sIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyQ3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjdXJyZW50IHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEN1cnJUYXNrKCk6IFRhc2sge1xyXG4gICAgaWYgKHRoaXMuX2N1cnJGaWVsZCA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiA8VGFzaz50aGlzLl9jdXJyRmllbGQuZ2V0VGFzaygpO1xyXG4gIH1cclxuXHJcbiAgc2V0U3RvcEV4ZWN1dGlvbihzdG9wOiBib29sZWFuKTogdm9pZDtcclxuICBzZXRTdG9wRXhlY3V0aW9uKHN0b3A6IGJvb2xlYW4sIGNsZWFyU3J2ckV2ZW50czogYm9vbGVhbik6IHZvaWQ7XHJcbiAgc2V0U3RvcEV4ZWN1dGlvbihzdG9wOiBib29sZWFuLCBjbGVhclNydnJFdmVudHM/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSlcclxuICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uXzAoc3RvcCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbl8xKHN0b3AsIGNsZWFyU3J2ckV2ZW50cyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBcInN0b3AgZXhlY3V0aW9uXCIgZmxhZyB0byB0cnVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHNldFN0b3BFeGVjdXRpb25fMChzdG9wOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oc3RvcCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBcInN0b3AgZXhlY3V0aW9uXCIgZmxhZyB0byB0cnVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHNldFN0b3BFeGVjdXRpb25fMShzdG9wOiBib29sZWFuLCBjbGVhclNydnJFdmVudHM6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChzdG9wKVxyXG4gICAgICBpZiAoY2xlYXJTcnZyRXZlbnRzKVxyXG4gICAgICAgIHRoaXMuX2V2ZW50c1F1ZXVlLmNsZWFyKCk7XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGxldCB0bXBWZWMgPSBuZXcgTGlzdDxSdW5UaW1lRXZlbnQ+KCk7XHJcbiAgICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQ7XHJcbiAgICAgICAgbGV0IGk6IG51bWJlcjtcclxuXHJcbiAgICAgICAgLy8gV2Ugd2VyZSByZXF1ZXN0ZWQgdG8gbGVhdmUgdGhlIFwic2VydmVyIGV2ZW50c1wiIGluIHRoZSBxdWV1ZS5cclxuICAgICAgICAvLyBEbyBpdCwgYnV0IGFsc28gcmVtb3ZlIHRoZSBcInByb3RlY3Rpb25cIiBmcm9tIHRoZXNlIGV2ZW50cyBzbyBuZXh0XHJcbiAgICAgICAgLy8gdGltZSB3ZSBuZWVkIHRvIGNsZWFyIHRoZSBxdWV1ZSB0aGV5IHdpbGwgYWxzbyBiZSBkZWxldGVkLlxyXG4gICAgICAgIHdoaWxlICghdGhpcy5fZXZlbnRzUXVldWUuaXNFbXB0eSgpKSB7XHJcbiAgICAgICAgICBydEV2dCA9IDxSdW5UaW1lRXZlbnQ+dGhpcy5fZXZlbnRzUXVldWUucG9sbCgpO1xyXG4gICAgICAgICAgaWYgKHJ0RXZ0LmlzRnJvbVNlcnZlcigpKSB7XHJcbiAgICAgICAgICAgIHJ0RXZ0LnJlc2V0RnJvbVNlcnZlcigpO1xyXG4gICAgICAgICAgICB0bXBWZWMucHVzaChydEV2dCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG1wVmVjLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgdGhpcy5fZXZlbnRzUXVldWUucHV0KHRtcFZlYy5nZXRfSXRlbShpKSk7XHJcbiAgICAgIH1cclxuICAgIHRoaXMuX3N0b3BFeGVjdXRpb24gPSBzdG9wO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgY3RybCBvbiB3aGljaCB3ZSBoYWQgYSBcInN0b3AgZXhlY3V0aW9uXCJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFN0b3BFeGVjdXRpb25DdHJsKGN0cmw6IE1nQ29udHJvbCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb25DdHJsID09PSBudWxsIHx8IGN0cmwgPT09IG51bGwpXHJcbiAgICAgIHRoaXMuX3N0b3BFeGVjdXRpb25DdHJsID0gY3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkZWxldGUgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj50aGUgdGFzayB0byByZWZlciB0byA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW5Gb3JjZURlbFwiPnRydWUgaWYgdGhlIGRlbGV0ZSBpcyBkb25lIGJlY2F1c2Ugb2YgZm9yY2UgZGVsZXRlIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBkZWxDdXJyUmVjKHRhc2s6IFRhc2ssIGluRm9yY2VEZWw6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuXHJcbiAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG5cclxuICAgIC8vIGRlbGV0ZSB0aGUgcmVjb3JkIGFuZCBydW4gcmVjb3JkIHN1ZmZpeCBmb3IgdGhlIG5ldyBjdXJyZW50IHJlY29yZFxyXG4gICAgYXdhaXQgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLmRlbEN1cnJSZWMoKTtcclxuXHJcbiAgICAvLyBubyBjdXJyLXJlYyA9PT4gd2UgZGVsZXRlZCB0aGUgbGFzdCByZWNvcmQgYW5kIGZhaWxlZCB0byBjcmVhdGUgYSBuZXcgb25lIChlLmcuXHJcbiAgICAvLyBDUkVBVEUgbW9kZSBpcyBub3QgYWxsb3dlZCkgPT0+IGVuZCB0aGUgdGFzay4gQW4gZXhjZXB0aW9uIHRvIHRoZSBydWxlIGlzIHdoZW5cclxuICAgIC8vIHdlIGFyZSBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGEgcmVjb3JkLlxyXG4gICAgaWYgKCF0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKSB7XHJcbiAgICAgIGlmIChkdi5nZXRDdXJyUmVjSWR4KCkgPj0gMCkge1xyXG4gICAgICAgIC8vIFFDUiAjNjU2NDk1OiBJZiB3ZSBnb3QgdG8gdGhpcyBwb2ludCBhbmQgdGhlIGN1cnJlbnQgcmVjb3JkIGlzIHN0aWxsIHRoZVxyXG4gICAgICAgIC8vIGRlbGV0ZWQgb25lIHRoZW4gdGhlIHJlY29yZCBwcmVmaXggd2lsbCBiZSBoYW5kbGVkIGVsc2V3aGVyZS5cclxuICAgICAgICBpZiAoKGR2LmdldEN1cnJSZWMoKSkuZ2V0TW9kZSgpICE9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlICYmICFpbkZvcmNlRGVsKSB7XHJcbiAgICAgICAgICBsZXQgY3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgICAgaWYgKGN0cmwgPT09IG51bGwpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHRhc2spO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoIXRhc2suZ2V0SW5DcmVhdGVMaW5lKCkpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVOb25SZXZlcnNpYmxlRXZlbnQodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHRhc2spO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHByb2Nlc3MgdXNlcnMgY29uZmlybWF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj50byBjaGVjayBjb25maXJtIHVwZGF0ZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIC0gcHJvY2VzcyBjb21tYW5kLCBmYWxzZSAtIHN0b3AgY29tbWFuZCBwcm9jZXNzaW5nPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlQ29uZmlybWVkKHRhc2s6IFRhc2spOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBjb25maXJtOiBib29sZWFuO1xyXG4gICAgbGV0IGFuc3dlcjogc3RyaW5nO1xyXG4gICAgbGV0IGFuczogbnVtYmVyO1xyXG5cclxuICAgIGlmICh0YXNrID09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjb25maXJtID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09ORklSTV9VUERBVEUsIGZhbHNlKTtcclxuICAgIGlmICghdGhpcy5faXNJblJlY29yZEZsdXNoRXZlbnQgJiYgY29uZmlybSAmJiAhdGFzay5EYXRhU3luY2VkKSB7XHJcbiAgICAgIGFucyA9IGF3YWl0IEdVSU1hbmFnZXIuSW5zdGFuY2UuY29uZmlybShNc2dJbnRlcmZhY2UuQ1JGX1NUUl9DT05GX1VQRCxcclxuICAgICAgICBTdHlsZXMuTVNHQk9YX0lDT05fUVVFU1RJT04gfCBTdHlsZXMuTVNHQk9YX0JVVFRPTl9ZRVNfTk9fQ0FOQ0VMKTtcclxuICAgICAgaWYgKGFucyA9PT0gU3R5bGVzLk1TR0JPWF9SRVNVTFRfWUVTKVxyXG4gICAgICAgIGFuc3dlciA9ICdZJztcclxuICAgICAgLy8gWWVzXHJcbiAgICAgIGVsc2UgaWYgKGFucyA9PT0gU3R5bGVzLk1TR0JPWF9SRVNVTFRfTk8pXHJcbiAgICAgICAgYW5zd2VyID0gJ04nO1xyXG4gICAgICAvLyBOb1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgYW5zd2VyID0gJ0MnOyAvLyBDYW5jZWxcclxuICAgIH0gZWxzZVxyXG4gICAgICBhbnN3ZXIgPSAnWSc7XHJcblxyXG4gICAgc3dpdGNoIChhbnN3ZXIpIHtcclxuICAgICAgY2FzZSAnWSc6XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdOJzpcclxuICAgICAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuY2FuY2VsRWRpdChmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgIGF3YWl0ICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICB0YXNrLkNvbmZpcm1VcGRhdGVObyA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBub3QgY29udGludWUgcmVjb3JkIHN1ZmZpeFxyXG5cclxuICAgICAgY2FzZSAnQyc6XHJcbiAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwoTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpKTtcclxuICAgICAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMoTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpLCAtMSk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBzdG9wIGV2ZW50IHByb2Nlc3NpbmdcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS51cGRhdGVDb25maXJtZWQoKSBpbGxlZ2FsIGNvbmZpcm1hdGlvbiBjb2RlOiBcIiArXHJcbiAgICAgICAgICBjb25maXJtKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFNldCB0aGUgb3JkZXIgb2YgaGFuZGxpbmcgbWFpbiBwcm9ncmFtcyBvZiBjb21wb25lbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRDb21wTWFpblByZ1RhYihjb21wTWFpblByZ1RhYmxlOiBDb21wTWFpblByZ1RhYmxlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jb21wTWFpblByZ1RhYiA9IGNvbXBNYWluUHJnVGFibGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGVuZCBvZiB3b3JrIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEVuZE9mV29yayhlbmRPZldvcmtfOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9lbmRPZldvcmsgPSBlbmRPZldvcmtfO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBlbmQgb2Ygd29yayBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRFbmRPZldvcmsoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZW5kT2ZXb3JrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgb3JkZXIgb2YgaGFuZGxpbmcgbWFpbiBwcm9ncmFtcyBvZiBjb21wb25lbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDb21wTWFpblByZ1RhYigpOiBDb21wTWFpblByZ1RhYmxlIHtcclxuICAgIHJldHVybiB0aGlzLl9jb21wTWFpblByZ1RhYjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHJldmVyc2libGUgZXhpdCBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpbk5vblJldmVyc2libGVFeGl0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzTm9uUmV2ZXJzaWJsZUV4aXQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHVzaCBhIHJ1bnRpbWUgZXZlbnQgdG8gdGhlIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+dGhlIHJ1bnRpbWUgZXZlbnQgdG8gcHVzaCBvbiB0aGUgc3RhY2s8L3BhcmFtPlxyXG4gIHB1c2hSdEV2ZW50KHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuX3J0RXZlbnRzLnB1c2gocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBvcCBhIHJ1bnRpbWUgZXZlbnQgZnJvbSB0aGUgc3RhY2sgYW5kIHJldHVybiBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcG9wUnRFdmVudCgpOiBSdW5UaW1lRXZlbnQge1xyXG4gICAgaWYgKHRoaXMuX3J0RXZlbnRzLmNvdW50KCkgPT09IDApXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgcmV0dXJuIDxSdW5UaW1lRXZlbnQ+dGhpcy5fcnRFdmVudHMucG9wKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc3RvcmUgdGhlIGxhc3Qgc2F2ZWQgcm91dGUgZXZlbnQgb24gbG9jYWwgc3RvcmFnZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0b3JlTGFzdFNhdmVkUm91dGVFdmVudE9uTG9jYWxTdG9yYWdlKCk6IHZvaWRcclxuICB7XHJcbiAgICBsZXQgZGF0YVN0b3JhZ2UgPSB3aW5kb3cubG9jYWxTdG9yYWdlO1xyXG4gICAgaWYgKHRoaXMuZ2V0TGFzdFNhdmVkUm91dGVFdmVudCgpICE9IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIGxldCBydEV2dCA9IHRoaXMuZ2V0TGFzdFNhdmVkUm91dGVFdmVudCgpO1xyXG5cclxuICAgICAgZGF0YVN0b3JhZ2Uuc2V0SXRlbShDb25zdEludGVyZmFjZS5MQVNUX1JPVVRFX0VWRU5ULCBcIjFcIik7XHJcbiAgICAgIGRhdGFTdG9yYWdlLnNldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVF9TUkNfVFNLLCBKU09OLnN0cmluZ2lmeSgoPFRhc2s+cnRFdnQuZ2V0VGFzaygpKS5UYXNrRGVmaW5pdGlvbklkKSk7XHJcblxyXG4gICAgICBpZiAocnRFdnQuZ2V0QXJnTGlzdCgpLmdldFNpemUoKSA+IDApIHtcclxuICAgICAgICBsZXQgc3RyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgICAgICBydEV2dC5nZXRBcmdMaXN0KCkuYnVpbGRYTUwoc3RyKTtcclxuICAgICAgICBkYXRhU3RvcmFnZS5zZXRJdGVtKENvbnN0SW50ZXJmYWNlLkxBU1RfUk9VVEVfRVZFTlRfQVJHX0xJU1QsICBzdHIudG9TdHJpbmcoKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXN0b3JlIHRoZSBsYXN0IHNhdmVkIHJvdXRlIGV2ZW50IGZyb20gbG9jYWwgc3RvcmFnZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlc3RvcmVMYXN0U2F2ZWRSb3V0ZUV2ZW50RnJvbUxvY2FsU3RvcmFnZSgpOiB2b2lkXHJcbiAge1xyXG4gICAgLy9nZXQgcm91dGUgZXZlbnQgaWYgc3RvcmVkIG9uIGxvY2FsIHN0b3JhZ2VcclxuICAgIGxldCBkYXRhU3RvcmFnZSA9IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XHJcblxyXG4gICAgbGV0IGxhc3RSb3V0ZUV2ZW50ID0gZGF0YVN0b3JhZ2UuZ2V0SXRlbShDb25zdEludGVyZmFjZS5MQVNUX1JPVVRFX0VWRU5UKTtcclxuXHJcbiAgICBpZiAobGFzdFJvdXRlRXZlbnQgPT09IFwiMVwiKSB7XHJcbiAgICAgIGxldCBzcmNUYXNrRGVmaW5pdGlvblN0ciA9IGRhdGFTdG9yYWdlLmdldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVF9TUkNfVFNLKTtcclxuICAgICAgbGV0IHJvdXRlQXJnTGlzdFN0ciA9IGRhdGFTdG9yYWdlLmdldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVF9BUkdfTElTVCk7XHJcblxyXG4gICAgICAvLyBwYXJzZSBzcmNUYXNrRGVmaW5pdGlvblN0ciBhbmQgcHJlcGFyZSB0YXNrRGVmaW5pdGlvbklkXHJcbiAgICAgIGxldCB0YXNrRGVmaW5pdGlvbklkID0gbmV3IFRhc2tEZWZpbml0aW9uSWQoKTtcclxuICAgICAgdGFza0RlZmluaXRpb25JZC5mcm9tSlNPTihzcmNUYXNrRGVmaW5pdGlvblN0cik7XHJcblxyXG4gICAgICAvL3NlYXJjaCBzb3VyY2UgdGFzayBpbiBuZXdseSBsb2FkZWQgdGFzayB0cmVlIGJ5IHRhc2tEZWZpbml0aW9uSWRcclxuICAgICAgbGV0IHNyY1Rhc2sgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldEN1cnJNR0RhdGEoKS5nZXRUYXNrQnlUYXNrRGVmaW5pdGlvbklEKHRhc2tEZWZpbml0aW9uSWQpO1xyXG4gICAgICBsZXQgYXJncyA9IG51bGw7XHJcbiAgICAgIGlmIChyb3V0ZUFyZ0xpc3RTdHIgIT0gbnVsbCkge1xyXG4gICAgICAgIGFyZ3MgPSBuZXcgQXJndW1lbnRzTGlzdCgpO1xyXG4gICAgICAgIGFyZ3MuZmlsbExpc3Qocm91dGVBcmdMaXN0U3RyLCBzcmNUYXNrKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgRXZlbnRzTWFuYWdlci5JbnN0YW5jZS5BZGRMYXN0U2F2ZWRSb3V0ZUV2ZW50KHNyY1Rhc2ssIGFyZ3MpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgbGFzdCBzYXZlZCByb3V0ZSBldmVudC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldExhc3RTYXZlZFJvdXRlRXZlbnQoKTogUnVuVGltZUV2ZW50IHtcclxuICAgICAgcmV0dXJuIHRoaXMubGFzdFNhdmVkUm91dGVFdmVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gIHNhdmUgdGhlIGxhc3Qgcm91dGUgZXZlbnQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRMYXN0U2F2ZWRSb3V0ZUV2ZW50IChydEV2dDpSdW5UaW1lRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChydEV2dCA9PSBudWxsKVxyXG4gICAgICB0aGlzLmxhc3RTYXZlZFJvdXRlRXZlbnQgPSBudWxsO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmxhc3RTYXZlZFJvdXRlRXZlbnQgPSBydEV2dC5yZXBsaWNhdGUoKTtcclxuICB9XHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgcnVudGltZSBldmVudCBsb2NhdGVkIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRMYXN0UnRFdmVudCgpOiBSdW5UaW1lRXZlbnQge1xyXG4gICAgaWYgKHRoaXMuX3J0RXZlbnRzLmNvdW50KCkgPT09IDApXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgcmV0dXJuIDxSdW5UaW1lRXZlbnQ+dGhpcy5fcnRFdmVudHMucGVlaygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgYSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHdlIHNob3VsZCBpZ25vcmUgdW5rbm93biBjb21tYW5kc1xyXG4gIC8vLyAgIGFycml2aW5nIGZyb20gdGhlIGVuZ2luZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldElnbm9yZVVua25vd25BYm9ydCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2lnbm9yZVVua25vd25BYm9ydCA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgXCJpZ25vcmUgdW5rbm93biBhYm9ydFwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlnbm9yZVVua25vd25BYm9ydCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pZ25vcmVVbmtub3duQWJvcnQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlY292ZXIgZnJvbSBhIGZhaWx1cmUgdG8gb3ZlcmxheSBhIHRhc2suIFdoZW4gdGhlIHNlcnZlciBvcmRlcnMgdGhlIGNsaWVudCB0byBydW4gYVxyXG4gIC8vLyAgIG5ldyB0YXNrIGluIGEgZnJhbWUgd2hpY2ggYWxyZWFkeSBjb250YWlucyBhbiBhY3RpdmUgdGFzaywgdGhlIGNsaWVudCB0cmllcyB0byB0ZXJtIHRoZVxyXG4gIC8vLyAgIGV4aXN0aW5nIHRhc2sgYW5kIHJlcGxhY2UgaGltLiBXaGVuIHRoaXMgYWN0aW9uIGZhaWxzLCB0aGUgY2xpZW50IGhhcyB0byBhc2sgdGhlIHNlcnZlclxyXG4gIC8vLyAgIHRvIHRlcm1pbmF0ZSB0aGUgTkVXIFRBU0ssIGFuZCBpZ25vcmUgdGhlIG92ZXJsYXkgYWN0aW9uLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNraWRcIj4tIHRoZSBpZCBvZiB0aGUgTkVXIFRBU0s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdkXCI+ICAgLSB0aGUgTUdEYXRhIG9mIHRoZSBPTEQgVEFTSy48L3BhcmFtPlxyXG4gIGFzeW5jIGZhaWxUYXNrT3ZlcmxheSh0YXNrSWQ6IHN0cmluZywgbWdkOiBNR0RhdGEpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kO1xyXG5cclxuICAgIGlmICh0YXNrSWQgIT09IG51bGwpIHtcclxuICAgICAgLy8gVGhlIHNlcnZlciB3aWxsIHJldHVybiB1cyAnYWJvcnQnIGNvbW1hbmRzIGZvciB0aGUgbmV3IHRhc2suIElnbm9yZSB0aGVtLCBzaW5jZSBpdCB3YXNudCBzdGFydGVkIHlldFxyXG4gICAgICB0aGlzLnNldElnbm9yZVVua25vd25BYm9ydCh0cnVlKTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVOb25SZXZlcnNpYmxlRXhpdENvbW1hbmQodGFza0lkLCBmYWxzZSk7XHJcbiAgICAgICAgbWdkLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICBhd2FpdCBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIHRoaXMuc2V0SWdub3JlVW5rbm93bkFib3J0KGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgVFJVRSBpZiBjdXJyZW50IGV2ZW50IHNob3VsZCBiZSBwcm9wb2d0YXRlZCB0byBhbGwgdGFza3MgaW4gYSBzcGVjaWZpYyB0cmFuc2FjdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNFdmVudFNjb3BlVHJhbnMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXZlbnRTY29wZSA9PT0gRXZlbnRTY29wZS5UUkFOUztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgZXZlbnQgc2NvcGUgdG8gVFJBTlNBQ1RJT05cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEV2ZW50U2NvcGVUcmFucygpOiB2b2lkIHtcclxuICAgIHRoaXMuX2V2ZW50U2NvcGUgPSBFdmVudFNjb3BlLlRSQU5TO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBldmVudCBzY29wZSB0byBOT04gVFJBTlNBQ1RJT05cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNsZWFyRXZlbnRTY29wZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2V2ZW50U2NvcGUgPSBFdmVudFNjb3BlLk5PTkU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRpbWUgb2YgZmlzdCBldmVudCBpbiBzZXF1ZW5jZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aW1lIG9mIGZpdHN0IGV2ZW50IGluIHNlcXVlbmNlPC9yZXR1cm5zPlxyXG4gIEdldEV2ZW50VGltZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50c1F1ZXVlLkdldFRpbWUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJrYkl0bVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgbGFzdCBlbmFibGVkIGFjdGlvbiBmb3IgdGhlIHNwZWNpZmljIGtleSAoaW4ga2JJdGVtKTwvcmV0dXJucz5cclxuICAvLy8gPGNoZWNrQWNjZXNzS2V5SW5NZW51czo+ICBpZiB0byBjaGVjayB0aGUga2V5Ym9hcmQgaW4gdGhlIG1lbnUgPC9jaGVja0FjY2Vzc0tleUluTWVudXM6PlxyXG4gIHB1YmxpYyBnZXRNYXRjaGluZ0FjdGlvbiggIGtiSXRtOiBLZXlib2FyZEl0ZW0pOiBudW1iZXIge1xyXG5cclxuICAgIGxldCBhY3Q6IG51bWJlciA9IDA7XHJcbiAgICAvLyB3aGVuIG1lbnUgaXMgZGVmaW5lIHdpdGggbm8ga2V5Ym9hcmQgZGVmaW5lLCB0aGUga2JJdGVtIGlzIHJldHVybiBudWxsO1xyXG4gICAgaWYgKGtiSXRtID09IG51bGwpXHJcbiAgICAgIHJldHVybiBhY3Q7XHJcblxyXG5cclxuICAgIC8vIFRoZXJlIHdhcyBubyBrYmQgbWFwcGluZyB0aGUgdGhhdCBrZXksIGJ1dCBpdCBzdGlsbCBiZWxvbmdzIHRvIGFuIGFjdGlvbi5cclxuICAgIC8vIHNlZSBpZiB0aGUga2JJdG0gaG9sZCBhbiBhY3Rpb24gKG9yaWdpbmFsbHkgbWFkZSBmb3IgTUdfQUNUX0NIQVIpLlxyXG4gICAgaWYgKGFjdCA9PT0gMCkge1xyXG4gICAgICAvLyBpZiBtZW51IHdhcyBmb3VuZCBhbmQgaXQgaXMgaW50ZXJuYWwgZXZlbnQgcHV0IGFjdGlvbiB0byB0aGUgcXVldWUgb25seSBpZiB0aGVyZSB3YXMgbm8ga2JkIG1hcHBpbmcgdGhlIHRoYXQga2V5LlxyXG4gICAgICBpZiAoa2JJdG0uZ2V0QWN0aW9uKCkgIT09IDApXHJcbiAgICAgICAgYWN0ID0ga2JJdG0uZ2V0QWN0aW9uKCk7XHJcbiAgICAgIC8vIHRoaXMgaXMgb25seSBURU1QIGhhcmRjb2RlZC4gdGhlIGFjdGlvbiB3aWxsIG5lZWQgdG8gYmUgaW4gdGhlIGtleWJvYXJkIG1hcHBpbmdcclxuICAgICAgLy8gYWxzbyBhIGNoYW5nZSB0byB0aGUgb25saW5lIChpZiB0aW1lIHBlcm1pdHMpIGFsc28gdG8gdHVybiB0aGUgdG9nZ2xlIGluc2VydCBpbnRvIGFuIGFjdC5cclxuICAgICAgZWxzZSBpZiAoa2JJdG0uZ2V0S2V5Q29kZSgpID09PSA0NSAmJiBrYkl0bS5nZXRNb2RpZmllcigpID09PSBNb2RpZmllcnMuTU9ESUZJRVJfTk9ORSAmJiBrYkl0bS5nZXRTdGF0ZXMoKSA9PT0gMClcclxuICAgICAgICBhY3QgPSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVE9HR0xFX0lOU0VSVDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKGFjdCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0dGVyIGZvciB0aGUgZXhlY1N0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBzdGFjazwvcmV0dXJucz5cclxuICBnZXRFeGVjU3RhY2soKTogRXhlY3V0aW9uU3RhY2sge1xyXG4gICAgcmV0dXJuIDxFeGVjdXRpb25TdGFjaz50aGlzLl9leGVjU3RhY2sucGVlaygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHB1c2hlcyBvbmUgZW50cnkgb2YgYW4gb3BlcmF0aW9uIGludG8gdGhlIGV4ZWN1dGlvbiBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrSWRcIj4tIHRoZSBpZCBvZiB0aGUgY3VycmVudCB0YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImhhbmRsZXJJZFwiPi0gdGhlIGlkIG9mIHRoZSBoYW5kbGVyIHdoaWNoIGhvbGRzIHRoZSByYWlzZSBldmVudCBjb21tYW5kIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvcGVySWR4XCI+LSB0aGUgaWR4IG9mIHRoZSBjb21tYW5kIHdoaWNoIGNyZWF0ZWQgYW4gZXhlY3V0aW9uIHN0YWNrIGVudHJ5IChyYWlzZSBldmVudCBvZiBmdW5jdGlvbiBjYWxsKTwvcGFyYW0+XHJcbiAgcHVzaEV4ZWNTdGFjayh0YXNrSWQ6IHN0cmluZywgaGFuZGxlcklkOiBzdHJpbmcsIG9wZXJJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgKDxFeGVjdXRpb25TdGFjaz50aGlzLl9leGVjU3RhY2sucGVlaygpKS5wdXNoKE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0VGFza0lkQnlJZCh0YXNrSWQpLCBoYW5kbGVySWQsIG9wZXJJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBvcHMgb25lIGVudHJ5IGZyb20gdGhlIGV4ZWN1dGlvbiBzdGFjayAtIGFmdGVyIHRoZSBjb21wbGV0aW9uIG9mIGFuIG9wZXJhdGlvbiB3aGljaCBjYW4gaG9sZFxyXG4gIC8vLyAgIG90aGVyIG9wZXJhdGlvbnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGVudHJ5IHRoYXQgd2FzIHBvcHBlZDwvcmV0dXJucz5cclxuICBwb3BFeGVjU3RhY2soKTogRXhlY3V0aW9uU3RhY2tFbnRyeSB7XHJcbiAgICByZXR1cm4gKDxFeGVjdXRpb25TdGFjaz50aGlzLl9leGVjU3RhY2sucGVlaygpKS5wb3AoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwdXNoIGEgbmV3IGVudHJ5IHRvIHRoZSBzdGFjayBvZiBzZXJ2ZXIgZXhlYyBzdGFja3MgLSB0aGlzIGlzIHRvIGRlZmVyIG9wZXJhdGlvbnMgdGhhdCBzaG91bGQgbm90XHJcbiAgLy8vICAgZ2V0IGluZmx1ZW5jZXMgYnkgdGhlIGN1cnJlbnQgc2VydmVyIGV4ZWN1dGlvbiBzdGFjayAtIHdoZW4gcGVyZm9ybWluZyB0aGUgcmVjb3JkIHByZWZpeCBvZiBhIHRhc2tcclxuICAvLy8gICB0aGF0IHdhcyBqdXN0IHJldHVybmVkIGZyb20gdGhlIHNlcnZlciwgb3Igd2hlbiBjYWxsaW5nIGEgbW9kYWwgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVzaE5ld0V4ZWNTdGFja3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucHVzaChudWxsKTtcclxuICAgIHRoaXMuX2V4ZWNTdGFjay5wdXNoKG5ldyBFeGVjdXRpb25TdGFjaygpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwb3BzIHRoZSBuZXcgZW50cnkgZnJvbSB0aGUgc3RhY2sgb2Ygc2VydmVyIGV4ZWN1dGlvbiBzdGFja3Mgd2hlbiB0aGUgc2VxdWVuY2UgdGhhdCBuZWVkcyB0byBhdm9pZFxyXG4gIC8vLyAgIGN1cnJlbnQgc2VydmVyIGV4ZWN1dGlvbiBzdGFjayBoYXMgZW5kZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHBvcE5ld0V4ZWNTdGFja3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucG9wKCk7XHJcbiAgICB0aGlzLl9leGVjU3RhY2sucG9wKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHVzaGVzIGFuIGV4ZWN1dGlvbiBzdGFjayBlbnRyeSBpbnRvIHRoZSBzZXJ2ZXIgZXhlYyBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrSWRcIj4tIHRoZSBpZCBvZiB0aGUgdGFzayBpbiB0aGUgZW50cnk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaGFuZGxlcklkXCI+LSBoYW5kbGVyIGlkIG9mIHRoZSBlbnRyeTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvcGVySWR4XCI+LSBpZHggb2YgdGhlIG9wZXJhdGlvbiB3aGljaCB0aGUgZW50cnkgcmVmZXJzIHRvPC9wYXJhbT5cclxuICBwdXNoU2VydmVyRXhlY1N0YWNrKHRhc2tJZDogc3RyaW5nLCBoYW5kbGVySWQ6IHN0cmluZywgb3BlcklkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucG9wKCk7XHJcbiAgICAgIHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wdXNoKG5ldyBFeGVjdXRpb25TdGFjaygpKTtcclxuICAgIH1cclxuXHJcbiAgICAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpLnB1c2godGFza0lkLCBoYW5kbGVySWQsIG9wZXJJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNsZWFycyB0aGUgc2VydmVyIGV4ZWN1dGlvbiBzdGFjayBhZnRlciB3ZSBmb3VuZCB0aGUgY29ycmVjdCBuZXh0IG9wZXJhdGlvbiB0aGF0IHdlIG5lZWQgdG8gY29udGludWUgZnJvbVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXJTZXJ2ZXJFeGVjU3RhY2soKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSAhPT0gbnVsbCkge1xyXG4gICAgICAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpLmNsZWFyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV2ZXJzZSB0aGUgc2VydmVyIGV4ZWN1dGlvbiBzdGFjayAtIHdlIGdldCBpdCBmcm9tIHRoZSBzZXJ2ZXIgYW5kIHB1c2ggaXQgaW4gdGhlIHNhbWUgb3JkZXJcclxuICAvLy8gICBpdCBpcyB3cml0dGVuIGluIHRoZSBtZXNzYWdlLCB3aGljaCBhY3R1YWxseSBtZWFucyB3ZSBoYXZlIHRvIHJldmVyc2UgaXQgaW4gb3JkZXIgdG8gaGFuZGxlIGl0IGNvcnJlY3RseVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmV2ZXJzZVNlcnZlckV4ZWNTdGFjaygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpICE9PSBudWxsKVxyXG4gICAgICAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpLnJldmVyc2UoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxjdWxhdGUgYWNjb3JkaW5nIHRvIHRoZSBzZXJ2ZXIncyBleGVjdXRpb24gc3RhY2sgYW5kIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBzdGFjayBvbiB0aGUgY2xpZW50ICtcclxuICAvLy8gICB0aGUgY3VycmVudCBvcGVyYXRpb24gd2hpY2ggd2UgYXJlIG9uLCB3aGljaCBpcyB0aGUgbmV4dCBvcGVyYXRpb24gdGhhdCB3ZSBuZWVkIHRvIGV4ZWN1dGVcclxuICAvLy8gICBpbiB0aGUgY3VycmVudCBoYW5kbGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9wZXJcIj4tIHRoZSBvcGVyYXRpb24gd2hpY2ggd2UgYXJlIGN1cnJlbnRseSBvbjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjbGVhcldoZW5Gb3VuZFwiPmluZGljYXRlcyB3aGV0aGVyIHdlIHNob3VsZCBjbGVhciB0aGUgc2VydmVyIHN0YWNrIHdoZW4gd2UgcmVhY2ggaXRzIGVuZCxcclxuICAvLy8gICBvciBpZiB3ZSBqdXN0IHVzaW5nIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHdoYXQgdGhlIG5leHQgb3BlcmF0aW9uIGlzXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnMgdGhlIG5leHQgb3BlcmF0aW9uIHRoYXQgc2hvdWxkIGJlIGV4ZWN1dGVkIGJ5IHRoZSBjbGllbnRcclxuICAvLy8gICBpZiBpdCByZXR1cm5zIC0xIHRoZW4gdGhlIGNsaWVudCBzaG91bGQgY29udGludWUgYXMgdXN1YWxcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGdldE5leHRPcGVySWR4KG9wZXI6IE9wZXJhdGlvbiwgY2xlYXJXaGVuRm91bmQ6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgbGV0IHRtcFNlcnZlckV4ZWNTdGFja0VudHJ5OiBFeGVjdXRpb25TdGFja0VudHJ5ID0gbnVsbDtcclxuICAgIGxldCBuZXh0T3BlcklkeDogbnVtYmVyID0gLTE7XHJcblxyXG4gICAgLy8gaWYgdGhlIHNlcnZlciBleGVjIHN0YWNrIGlzIGVtcHJ5IGl0IG1lYW5zIHdlIGRpZCBub3QgcmV0dXJuIGZyb20gdGhlIHNlcnZlcixcclxuICAgIC8vIHNvIHdlIGhhdmUgdG8gY29udGludWUgd2l0aCBleGVjdXRpbmcgdGhlIGZvbGxvd2luZyBvcGVyYXRpb24gaW4gdGhlIGN1cnJlbnQgaGFuZGxlciBhcyB1c3VhbFxyXG4gICAgaWYgKHRoaXMuX3NlcnZlckV4ZWNTdGFjay5jb3VudCgpICE9PSAwICYmIHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkgIT09IG51bGwgJiYgISg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSkuZW1wdHkoKSkge1xyXG4gICAgICAvLyBpZiB0aGUgc2VydmVyJ3MgZXhlYyBzdGFjayBpcyBkZWVwZXIgdGhhbiB0aGUgY2xpZW50J3MgLVxyXG4gICAgICAvLyB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBlbnRyeSBpbiB0aGUgY2xpZW50J3Mgc3RhY2sgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHNlcnZlcidzIHN0YWNrIHNpemVcclxuICAgICAgaWYgKCg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSkuc2l6ZSgpID4gKDxFeGVjdXRpb25TdGFjaz50aGlzLl9leGVjU3RhY2sucGVlaygpKS5zaXplKCkpIHtcclxuICAgICAgICAvLyB3ZSBjb3B5IHRoZSBzZXJ2ZXIncyBleGVjdXRpb24gc3RhY2sgYW5kIHBvcCBmcm9tIGl0IHVudGlsIHRoZSBzaXplIG9mIHRoZSBzZXJ2ZXJcclxuICAgICAgICAvLyBhbmQgdGhlIGNsaWVudCBpcyB0aGUgc2FtZVxyXG4gICAgICAgIGxldCB0bXBTZXJ2ZXJFeGVjU3RhY2s6IEV4ZWN1dGlvblN0YWNrID0gbmV3IEV4ZWN1dGlvblN0YWNrKDxFeGVjdXRpb25TdGFjaz50aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpKTtcclxuICAgICAgICB3aGlsZSAodG1wU2VydmVyRXhlY1N0YWNrLnNpemUoKSA+ICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fZXhlY1N0YWNrLnBlZWsoKSkuc2l6ZSgpKSB7XHJcbiAgICAgICAgICB0bXBTZXJ2ZXJFeGVjU3RhY2tFbnRyeSA9IHRtcFNlcnZlckV4ZWNTdGFjay5wb3AoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGlmIGFsbCBlbnRyaWVzIGJlZm9yZSB0aGUgbGFzdCBvbmUgd2UgcG9wcGVkIGFyZSB0aGUgc2FtZSBhcyBpbiB0aGUgY2xpZW50IGFuZFxyXG4gICAgICAgIC8vIHRoZSBjdXJyZW50IGVudHJ5IGlzIG9uIHRoZSBzYW1lIGhhbmRsZXIgYXMgdGhlIHNlcnZlcidzIGxhc3QgZW50cnksXHJcbiAgICAgICAgLy8gYW5kIHRoZSBvcGVyYXRpb24gaXMgYWZ0ZXIgdGhlIGN1cnJlbnQgb3BlcmF0aW9uLFxyXG4gICAgICAgIC8vIHRoZW4gdGhpcyBlbnRyeSBpbiB0aGUgc2VydmVyIGluZGljYXRlcyB3aGljaCBpcyBvdXIgbmV4dCBvcGVyYXRpb25cclxuICAgICAgICBpZiAodGhpcy5fZXhlY1N0YWNrLnBlZWsoKS5FcXVhbHModG1wU2VydmVyRXhlY1N0YWNrKSAmJiB0bXBTZXJ2ZXJFeGVjU3RhY2tFbnRyeS5UYXNrSWQgPT09IG9wZXIuZ2V0VGFza1RhZygpICYmIHRtcFNlcnZlckV4ZWNTdGFja0VudHJ5LkhhbmRsZXJJZCA9PT0gb3Blci5nZXRIYW5kbGVySWQoKSAmJiB0bXBTZXJ2ZXJFeGVjU3RhY2tFbnRyeS5PcGVySWR4ID49IG9wZXIuZ2V0U2VydmVySWQoKSkge1xyXG4gICAgICAgICAgbmV4dE9wZXJJZHggPSB0bXBTZXJ2ZXJFeGVjU3RhY2tFbnRyeS5PcGVySWR4O1xyXG5cclxuICAgICAgICAgIC8vIGlmIHRoZSBzZXJ2ZXIgZXhlYyBzdGFjayBpcyBkZWVwZXIgdGhhbiB0aGUgY2xpZW50J3MgYnkgb25seSAxLFxyXG4gICAgICAgICAgLy8gd2hpY2ggbWVhbnMgd2UgYXJlIGNoZWNraW5nIHRoZSB0b3AgbW9zdCBlbnRyeSBvbiB0aGUgc2VydmVyJ3MgZXhlY3V0aW9uIHN0YWNrLFxyXG4gICAgICAgICAgLy8gdGhlIHdob2xlIHN0YWNrIGlzIHRoZSBzYW1lIG5vdywgc28gd2UgY2FuIGNsZWFyIHRoZSBzZXJ2ZXIncyBzdGFjayAtXHJcbiAgICAgICAgICAvLyB3ZSBnb3QgdG8gdGhlIHBvaW50IHdoaWNoIHdlIGFyZSBvbiB0aGUgZXhhY3Qgb3BlcmF0aW9uIHdoaWNoIHRoZSBzZXJ2ZXIgbGVmdCBleGVjdXRpb24uXHJcbiAgICAgICAgICBpZiAoY2xlYXJXaGVuRm91bmQgJiYgKDxFeGVjdXRpb25TdGFjaz50aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpKS5zaXplKCkgPT09ICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fZXhlY1N0YWNrLnBlZWsoKSkuc2l6ZSgpICsgMSkge1xyXG4gICAgICAgICAgICAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpLmNsZWFyKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICBuZXh0T3BlcklkeCA9IEV2ZW50c01hbmFnZXIuTUFYX09QRVI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbmV4dE9wZXJJZHggPSBFdmVudHNNYW5hZ2VyLk1BWF9PUEVSO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV4dE9wZXJJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBwcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW5Qcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2tcIj48L3BhcmFtPlxyXG4gIHNldFByb2Nlc3NpbmdUb3BNb3N0RW5kVGFzayhpblByb2Nlc3NpbmdUb3BNb3N0RW5kVGFzazogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrID0gaW5Qcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2s7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgcHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2soKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgQWxsb3dFdmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiQWxsb3dFdmVudHNcIj48L3BhcmFtPlxyXG4gIHNldEFsbG93RXZlbnRzKEFsbG93RXZlbnRzOiBFdmVudHNBbGxvd2VkVHlwZSk6IHZvaWQge1xyXG4gICAgdGhpcy5fYWxsb3dFdmVudHMgPSBBbGxvd0V2ZW50cztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIEFsbG93RXZlbnRzIGZvciBhIG5vbiBpbnRlcmFjdGl2ZSB0YXNrLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJBbGxvd0V2ZW50c1wiPjwvcGFyYW0+XHJcbiAgc2V0Tm9uSW50ZXJhY3RpdmVBbGxvd0V2ZW50cyhBbGxvd0V2ZW50czogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKEFsbG93RXZlbnRzKVxyXG5cclxuICAgICAgdGhpcy5fYWxsb3dFdmVudHMgPSBFdmVudHNBbGxvd2VkVHlwZS5OT05fSU5URVJBQ1RJVkU7XHJcbiAgICAvLyBRQ1IgIzgwMjQ5NSwgVGhlIEZvcm1zIENvbnRyb2xsZXIgbWVjaGFuaXNtIGlzIGRpc2FibGUgaWYgd2UgYXJlIGluIE5vbiBpbnRlcmFjdGl2ZSB0YXNrIHdpdGggQWxsb3dFdmVudHMgPSB0cnVlIGFuZCBPcGVuIFdpbmRvdyA9IHRydWVcclxuXHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuX2FsbG93RXZlbnRzID0gRXZlbnRzQWxsb3dlZFR5cGUuTk9ORTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIEFsbG93RXZlbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIndpdGhpbk5vbkludGVyYWN0aXZlTG9vcFwiPjwvcGFyYW0+XHJcbiAgZ2V0QWxsb3dFdmVudHMoKTogRXZlbnRzQWxsb3dlZFR5cGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FsbG93RXZlbnRzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybiBUUlVFIGlmIG5vIGV2ZW50cyBhcmUgYWxsb3dlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBOb0V2ZW50c0FsbG93ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dFdmVudHMgPT09IEV2ZW50c0FsbG93ZWRUeXBlLk5PTkU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgYW5kIGV4ZWN1dGUgY29udHJvbCBtb2RpZnkgZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJhY3RcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ3RybE1vZGlmeShjdHJsOiBNZ0NvbnRyb2wsIGFjdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBpZiBjYW5ub3QgbW9kaWZ5LCBkbyBub3RoaW5nXHJcbiAgICBpZiAoY3RybCA9PSBudWxsIHx8ICFjdHJsLmlzTW9kaWZpYWJsZSgpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgc3dpdGNoIChhY3QpIHtcclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfRURUX05VTEw6XHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfTU9ESUZZOlxyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1RJT046XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudDtcclxuICAgIHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX01PRElGWSk7XHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgYWN0aW9uIGlzIGFsbG93ZWQgYWNjb3JkaW5nIHRvIHRoZSBBbGxvd2VkRXZlbnRzIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYWN0XCI+PC9wYXJhbT5cclxuICBwcml2YXRlIEFjdEFsbG93ZWQoYWN0OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBhbGxvd2VkOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHN3aXRjaCAodGhpcy5nZXRBbGxvd0V2ZW50cygpKSB7XHJcbiAgICAgIGNhc2UgRXZlbnRzQWxsb3dlZFR5cGUuQUxMOlxyXG4gICAgICAgIGFsbG93ZWQgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBFdmVudHNBbGxvd2VkVHlwZS5OT05FOlxyXG4gICAgICAgIC8vIGFsbG93IGNyZWxpbmUgZXZlbiBpbiBhbGxvdz1uby4gd2UgaGF2ZSBubyBjaG9pY2UuIFJDIG1lY2hhbmlzbSBpcyBkaWZmZXJlbnQgdGhlbiBiYXRjaC4gaXQgdXNlcyBBQ1RfQ1JFQUxJTkVcclxuICAgICAgICAvLyB3aGVuIGluIGNyZWF0ZSBtb2RlLiBXZSB3aWxsIG5lZWQgdG8gY2hhbmdlIGl0IGluIHRoZSBmdXR1cmUgc28gdGhhdCB3aGVuIHVzZXIgcmFpc2VzIGNyZWxpbmUgZXZlbnQgaXQgd2lsbCBub3Qgd29yay4ganVzdCBpbnRlcm5hbGx5LlxyXG4gICAgICAgIGFsbG93ZWQgPSAoYWN0ID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAvLyBPbmx5IHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBhcmUgYWxsb3dlZCB3aGVuIHJ1bm5pbmcgaW5zaWRlIGEgbm9uIGludGVyYWN0aXZlIGxvb3Agd2hlbiBhbGxvdyBldmVudHMgPSBZRVMuXHJcbiAgICAgIGNhc2UgRXZlbnRzQWxsb3dlZFR5cGUuTk9OX0lOVEVSQUNUSVZFOlxyXG5cclxuICAgICAgICBzd2l0Y2ggKGFjdCkge1xyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVF9TWVNURU06XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0xPU0U6XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORV9BQk9WRTpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JPTExCQUNLOlxyXG4gICAgICAgICAgICBhbGxvd2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYWxsb3dlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFsbG93ZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVGhpcyBmdW5jdGlvbiBjb21taXRzIHRoZSByZWNvcmQgYW5kIHRoZW4gZGVwZW5kaW5nIG9uIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgdHJhbnNhY3Rpb24sIGl0IHBlcmZvcm1zIG90aGVyIGFjdGlvbnMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNSZXZlcnNpYmxlRXhpdFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21taXRSZWNvcmQodGFzazogVGFzaywgaXNSZXZlcnNpYmxlRXhpdDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50YXNrLkRhdGFWaWV3O1xyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gZHYuZ2V0Q3VyclJlYygpO1xyXG5cclxuICAgIGxldCBmb3JjZVN1ZmZpeDogYm9vbGVhbiA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgZmFsc2UpO1xyXG4gICAgbGV0IGlzU2VsZWN0aW9uVGFibGU6IGJvb2xlYW4gPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RJT04sIGZhbHNlKTtcclxuICAgIGxldCBpc05ld1JlYzogYm9vbGVhbiA9IHJlYy5pc05ld1JlYygpO1xyXG4gICAgbGV0IHNhdmVQcmV2Q3VyclJlYzogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgcmVjTW9kaWZpZWQ6IGJvb2xlYW4gPSByZWMuTW9kaWZpZWQ7XHJcblxyXG4gICAgaWYgKCFkdi5yZWNJbk1vZGlmaWVkVGFiKHJlYy5nZXRJZCgpKSlcclxuICAgICAgcmVjLmNsZWFyRmxhZ3NIaXN0b3J5KCk7XHJcbiAgICBhd2FpdCB0YXNrLlRhc2tUcmFuc2FjdGlvbk1hbmFnZXIuY2hlY2tBbmRDb21taXQoaXNSZXZlcnNpYmxlRXhpdCwgQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCwgdGFzay5Db25maXJtVXBkYXRlTm8pO1xyXG4gICAgaWYgKHRhc2sudHJhbnNhY3Rpb25GYWlsZWQoQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCkpIHtcclxuICAgICAgLy8gb24gZmFpbHVyZSBvZiB0aGUgdHJhbnNhY3Rpb24gcmVlbnRlciB0aGUgcmVjb3JkIGxldmVsIGJ5XHJcbiAgICAgIC8vIGV4ZWN1dGluZyBcInJlY29yZCBwcmVmaXhcIiBmb3IgdGhlIHN1YmZvcm1zIHdoaWNoIGV4ZWN1dGVkXHJcbiAgICAgIC8vIHRoZSBzdWZmaXggc3VjY2Vzc2Z1bGx5XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGFzay5EYXRhU3luY2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG4gICAgICAgIGF3YWl0IHRhc2suaGFuZGxlRXZlbnRPblNsYXZlVGFza3MoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0YXNrLmlzQWJvcnRpbmcoKSlcclxuICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChyZWNNb2RpZmllZClcclxuICAgICAgICByZWMuc2V0TGF0ZUNvbXB1dGUodHJ1ZSk7XHJcblxyXG4gICAgICAvLyBRQ1IgNzgzMDcxIGlmIGFmdGVyIGNoZWNrQW5kQ29tbWl0IGFsbCBpZiBPLksuIHRoZVxyXG4gICAgICAvLyByZXR1cm4gdGhlIGxldmVsIGJhY2sgdG8gdGFzayBsZXZlbCBpbiBvcmRlciB0byBsZXQgcmVjX3ByZml4IHRvIGJlIGV4ZWN1dGVkLlxyXG4gICAgICAvLyBldmVuIHRob3VnaCB0aGUgdGFzayBsZXZlbCBzaG91bGQgYmUgVEFTS19MRVZFTF9UQVNLXHJcbiAgICAgIC8vIHRoZSBjaGVja0FuZENvbW1pdCBwcm9jZXNzIGNvdWxkIGhhdmUgY2hhbmdlIGl0XHJcbiAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG5cclxuICAgICAgcmVjLnJlc2V0VXBkYXRlZCgpO1xyXG4gICAgICByZWMucmVzZXRNb2RpZmllZCgpO1xyXG5cclxuICAgICAgLy8gUUNSICM5ODMxNzg6IGNhbmNlbCB0aGUgcmVjb3JkIG9ubHkgYWZ0ZXIgdGhlIHRyYW5zYWN0aW9uXHJcbiAgICAgIC8vIGhhbmRsaW5nIHdhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGFuZCB0aGUgcmVjb3JkIHdhc24ndFxyXG4gICAgICAvLyBtb2RpZmllZFxyXG4gICAgICBpZiAoIXJlY01vZGlmaWVkICYmICFmb3JjZVN1ZmZpeCAmJiAoIWlzU2VsZWN0aW9uVGFibGUgfHwgIXRhc2suSW5TZWxlY3QpKSB7XHJcbiAgICAgICAgaWYgKGlzTmV3UmVjKSB7XHJcbiAgICAgICAgICAvLyBRQ1IgIzQyODk2NTogc2F2ZSB0aGUgcHJldmlvdXMgY3VycmVudCByZWNvcmQgQkVGT1JFXHJcbiAgICAgICAgICAvLyBcImNhbmNlbCBlZGl0XCIgc28gdGhlIGNvcnJlY3QgcmVjb3JkIGlzIHNhdmVkXHJcbiAgICAgICAgICBkdi5zZXRQcmV2Q3VyclJlYygpO1xyXG4gICAgICAgICAgc2F2ZVByZXZDdXJyUmVjID0gZmFsc2U7XHJcbiAgICAgICAgICByZWMuc2V0TmV3UmVjKCk7XHJcbiAgICAgICAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuY2FuY2VsRWRpdChmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVTdG9wUm93RWRpdGluZyh0YXNrKTtcclxuICAgICAgICB9IGVsc2UgaWYgKCFyZWMuZ2V0Rm9yY2VTYXZlT3JnKCkpXHJcbiAgICAgICAgICBhd2FpdCBkdi5jYW5jZWxFZGl0KEV2ZW50c01hbmFnZXIuUkVBTF9PTkxZLCB0cnVlKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBkdi5zYXZlT3JpZ2luYWwoKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBRQ1IgIzk5NTIyMjogaWYgdGhlIHJlY29yZCB3YXMgbW9kaWZpZWQgdGhlbiBzYXZlIHRoZVxyXG4gICAgICAvLyBvcmlnaW5hbCByZWNvcmQgYWdhaW4gaW4gY2FzZSBhIHRhc2sgbGF2ZWwgdHJhbnNhY3Rpb25cclxuICAgICAgLy8gd2lsbCBmYWlsIHdpdGggcmV0cnkgc3RyYXRlZ3kuIEJlZm9yZSB0aGlzIGZpeCwgaWYgc3VjaFxyXG4gICAgICAvLyB0aGluZyBoYXBwZW5lZCBvbiBhIHJlY29yZCB3aGljaCB3YXNuJ3QgdGhlIGZpcnN0IHRoZW5cclxuICAgICAgLy8gdGhlIFwiYmVnaW4gdGFibGVcIiBldmVudCByYWlzZWQgYSByZWNvcmQgc3VmZml4IGV2ZW50IGFuZFxyXG4gICAgICAvLyBjYXVzZWQgXCJjYW5jZWwgZWRpdFwiLlxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgZHYuc2F2ZU9yaWdpbmFsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNhdmVQcmV2Q3VyclJlYylcclxuICAgICAgZHYuc2V0UHJldkN1cnJSZWMoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxsYmFjayBmb3IgaW5jcmVtZW50YWwgbG9jYXRlIHRpbWVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpbmNMb2NhdGVUaW1lckNCKHRhc2tPYmo6IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSB0YXNrT2JqO1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KHRhc2ssIHRydWUpO1xyXG5cclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9JTkNSRU1FTlRBTF9MT0NBVEUpO1xyXG4gICAgcnRFdnQuc2V0TWFpblByZ0NyZWF0b3IodGFzayk7XHJcbiAgICBydEV2dC5zZXRDdHJsKDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBkb1N5bmNGb3JTdWJmb3JtUGFyZW50KHRhc2s6IFRhc2spOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBsZXQgcGFyZW50VGFzazogVGFzayA9IDxUYXNrPnRhc2suZ2V0UGFyZW50KCk7XHJcbiAgICBsZXQgcGFyZW50RHYgPSA8RGF0YVZpZXc+cGFyZW50VGFzay5EYXRhVmlldztcclxuICAgIGxldCBwYXJlbnRSZWM6IFJlY29yZCA9IHBhcmVudER2LmdldEN1cnJSZWMoKTtcclxuXHJcbiAgICAvLyBkbyBub3QgdG91Y2ggdGhlIHBhcmVudCByZWNvcmQgaWYgdGhlIHBhcmVudCBkYXRhdmlldyBpcyAnZW1wdHkgZGF0YXZpZXcnLlxyXG4gICAgaWYgKHRhc2suSXNTdWJGb3JtICYmIHBhcmVudFJlYyAhPSBudWxsICYmIHBhcmVudFJlYy5Nb2RpZmllZCAmJiAhcGFyZW50RHYuaXNFbXB0eURhdGF2aWV3KCkpIHtcclxuICAgICAgcGFyZW50UmVjLnNldE1vZGUoRGF0YU1vZGlmaWNhdGlvblR5cGVzLlVwZGF0ZSk7XHJcbiAgICAgIGF3YWl0IHBhcmVudER2LmFkZEN1cnJUb01vZGlmaWVkKGZhbHNlKTtcclxuICAgICAgKChwYXJlbnREdi5nZXRDdXJyUmVjKCkpKS5TeW5jZWQgPSB0cnVlO1xyXG4gICAgICBwYXJlbnREdi5zZXRDaGFuZ2VkKHRydWUpO1xyXG4gICAgICBsZXQgZGF0YVZpZXdFeGVjdXRlTG9jYWxVcGRhdGVzQ29tbWFuZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVEYXRhVmlld0NvbW1hbmQocGFyZW50VGFzay5nZXRUYXNrVGFnKCksIERhdGFWaWV3Q29tbWFuZFR5cGUuRXhlY3V0ZUxvY2FsVXBkYXRlcyk7XHJcbiAgICAgIGxldCByZXN1bHQ6IFJldHVyblJlc3VsdCA9IGF3YWl0IHBhcmVudFRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdFeGVjdXRlTG9jYWxVcGRhdGVzQ29tbWFuZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBQcm9jZXNzQWJvcnRpbmdFcnJvcihleDogQXBwbGljYXRpb25FeGNlcHRpb24pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBlTXNnOiBzdHJpbmc7XHJcbiAgICBsZXQgZXJyRm9yQ29uc29sZTogc3RyaW5nO1xyXG4gICAgbGV0IGVyckZvck1zZ0JveDogc3RyaW5nO1xyXG5cclxuICAgIGlmIChleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKVxyXG4gICAgICBlTXNnID0gKDxTZXJ2ZXJFcnJvcj5leCkuR2V0TWVzc2FnZSgpO1xyXG4gICAgZWxzZVxyXG4gICAgICBlTXNnID0gKChleC5NZXNzYWdlICE9PSBudWxsKSA/IGV4Lk1lc3NhZ2UgOiBleC5HZXRUeXBlKCkpO1xyXG5cclxuICAgIGVyckZvckNvbnNvbGUgPSBTdHJVdGlsLmdldENvbnNvbGVFcm9yU3RyaW5nKGVNc2cpO1xyXG4gICAgZXJyRm9yTXNnQm94ID0gU3RyVXRpbC5nZXRNc2dCb3hFcm9yU3RyaW5nKGVNc2cpO1xyXG5cclxuICAgIGlmIChleC5Jbm5lckV4Y2VwdGlvbiAhPT0gbnVsbClcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2coZXguSW5uZXJFeGNlcHRpb24sIGVyckZvckNvbnNvbGUpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpIHx8IExvZ2dlci5JbnN0YW5jZS5Mb2dMZXZlbCAhPT0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYykge1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhlcnJGb3JDb25zb2xlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE8gOiBoYW5kbGUgZXJyb3JzXHJcbiAgICBsZXQgc2VuZFVubG9hZFRvU2VydmVyOiBib29sZWFuID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkNvbnRleHRJRCAhPT0gUnVudGltZUNvbnRleHRCYXNlLm5vQ29udGV4dElkOyAgLy8gdW5sb2FkIHRoZSBjb250ZXh0IGluIHRoZSBzZXJ2ZXIgb25seSBpZiBhIGNvbnRleHQgd2FzIGNyZWF0ZWQgZHVyaW5nIHRoZSBjdXJyZW50IHNlc3Npb25cclxuXHJcbiAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9IDA7XHJcblxyXG4gICAgbGV0IG1lc3NhZ2VTdHJpbmc6IHN0cmluZyA9IExhbmd1YWdlRGF0YS5JbnN0YW5jZS5nZXRDb25zdE1lc3NhZ2UoTXNnSW50ZXJmYWNlLkJSS1RBQl9TVFJfRVJST1IpO1xyXG5cclxuICAgIGxldCBzdHlsZTogbnVtYmVyID0gMTY7XHJcbiAgICBpZiAoZXguTWVzc2FnZS5zdGFydHNXaXRoKFwiPEhUTUxcIikpIHtcclxuICAgICAgdGhpcy5wcm9jZXNzSFRNTENvbnRlbnQoZXguTWVzc2FnZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBUT0RPOiB0ZW1wb3JhcmlseSBzaG93IHRoZSBtZXNzYWdlIGJveFxyXG4gICAgICAvLyBpZGVhbGx5LCB0aGUgY3VycmVudCBwYWdlIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIHRoZSBlcnJvciBwYWdlXHJcbiAgICAgIGlmICh0aGlzLlNob3dFcnJvckluTWVzc2FnZUJveChleCkpIHtcclxuICAgICAgICBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLk1lc3NhZ2VCb3gobWVzc2FnZVN0cmluZywgZXJyRm9yTXNnQm94LCBzdHlsZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3Ipe1xyXG4gICAgICAgIGlmKCg8U2VydmVyRXJyb3I+ZXgpLkdldENvZGUoKSA9PSBTZXJ2ZXJFcnJvci5FUlJfV0VCQ0xJRU5UX1BST0dSQU1fUkVMT0FERUQgfHxcclxuICAgICAgICAgICAoPFNlcnZlckVycm9yPmV4KS5HZXRDb2RlKCkgPT0gU2VydmVyRXJyb3IuRVJSX0VYRUNVVEVEX1BST0dSQU1fQ0hBTkdFRCkge1xyXG4gICAgICAgICAgIENvbW1hbmRzLmFkZEdsb2JhbENvbW1hbmQoQ29tbWFuZFR5cGUuUkVMT0FEX1BBR0UpO1xyXG4gICAgICAgICAgIC8vIE11c3QgY2FsbCBiZWdpbkludm9rZSBoZXJlOyBpbiB0aGUgY2FzZSBhIG5ldyBjb25uZWN0aW9uIHdhcyByZWZ1c2VkLCB0aGUgYmVnaW5JbnZva2UgaXMgbmV2ZXIgY2FsbGVkLCBzbyB3ZVxyXG4gICAgICAgICAgIC8vIG5lZWQgdG8gbWFrZSBzdXJlIGl0IGlzIGNhbGxlZCBoZXJlXHJcbiAgICAgICAgICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBUT0RPOiBIb3cgdG8gY2hlY2sgaWYgaXQgd2FzIENvbm5lY3RGYWlsdXJlIG9yIFByb3RvY29sRXJyb3I/XHJcbiAgICAvLyBJbiBjYXNlIGlmIHdlIGFyZSBhYmxlIHRvIGNvbm5lY3QgdG8gdGhlIHNlcnZlciBpLmUuIHN0YXR1cyBpcyBDb25uZWN0aW9uRmFpbHVyZVxyXG4gICAgLy8gdGhlbiB0aGVyZSBpcyBubyBwb2ludCBpbiBzZW5kaW5nIHVubG9hZCBjb21tYW5kLCBiZWNhdXNlIGl0IHdpbGwgbmV2ZXIgc3VjY2VlZCBhbmRcclxuICAgIC8vIHdlIHdpbGwgaW4gaW5maW5pdGUgbG9vcC5cclxuICAgIC8vIGxldCBmbGFnODogYm9vbGVhbiA9IGV4LklubmVyRXhjZXB0aW9uICE9PSBudWxsICYmIGV4LklubmVyRXhjZXB0aW9uLkdldFR5cGUoKS5GdWxsTmFtZSA9PT0gXCJTeXN0ZW0uTmV0LldlYkV4Y2VwdGlvblwiO1xyXG4gICAgLy8gaWYgKGZsYWc4KSB7XHJcbiAgICAvLyAgIGxldCBleDI6IFdlYkV4Y2VwdGlvbiA9IDxXZWJFeGNlcHRpb24+ZXguSW5uZXJFeGNlcHRpb247XHJcbiAgICAvLyAgIGxldCBmbGFnOTogYm9vbGVhbiA9IGV4Mi5TdGF0dXMgPT09IFdlYkV4Y2VwdGlvblN0YXR1cy5Db25uZWN0RmFpbHVyZSB8fCBleDIuU3RhdHVzID09PSBXZWJFeGNlcHRpb25TdGF0dXMuUHJvdG9jb2xFcnJvcjtcclxuICAgIC8vICAgaWYgKGZsYWc5KSB7XHJcbiAgICAvLyAgICAgc2VuZFVubG9hZFRvU2VydmVyID0gZmFsc2U7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICBpZiAoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcikge1xyXG4gICAgICAvLyBJZiB0aGUgY29udGV4dCB3YXMgbm90IGZvdW5kLCBvciB0aGUgcHJvZ3JhbSBpcyByZWxvYWRlZCBieSB0aGUgc2VydmVyLCBubyBwb2ludCBpbiB0cnlpbmcgdG8gdW5sb2FkIGl0XHJcbiAgICAgIGlmICgoPFNlcnZlckVycm9yPmV4KS5HZXRDb2RlKCkgPT09IFNlcnZlckVycm9yLkVSUl9DVFhfTk9UX0ZPVU5EIHx8XHJcbiAgICAgICAgICAoPFNlcnZlckVycm9yPmV4KS5HZXRDb2RlKCkgPT09IFNlcnZlckVycm9yLkVSUl9XRUJDTElFTlRfUFJPR1JBTV9SRUxPQURFRCB8fFxyXG4gICAgICAgICAgKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09PSBTZXJ2ZXJFcnJvci5FUlJfRVhFQ1VURURfUFJPR1JBTV9DSEFOR0VEKSB7XHJcbiAgICAgICAgc2VuZFVubG9hZFRvU2VydmVyID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2VuZFVubG9hZFRvU2VydmVyKSB7XHJcbiAgICAgIC8vIHRlbGwgdGhlIHNlcnZlciB0byBjbG9zZSB0aGUgcnVudGltZS5cclxuICAgICAgLy8gSWYgd2UgdGVybWluYXRlIFJURSBhbmQgdGhlbiBjbG9zZSBSQyB3aW5kb3cgdGhlbiBhbHNvIHdlIHdpbGwgYmVcclxuICAgICAgLy8gUHJvY2Vzc2luZyBBYm9ydCBlcnJvciBpbiB0aGF0IGNhc2Ugc2VydmVyIGlzIGFscmVhZHkgY2xvc2VkIHNvIGNhdGNoIHRoZSBleGNlcHRpb24uXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVVbmxvYWRDb21tYW5kKCk7XHJcbiAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRNR0RhdGEoMCkuQ21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgICAgIGF3YWl0IENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICB9IGNhdGNoIChleDMpIHtcclxuICAgICAgICBpZiAoZXgzIGluc3RhbmNlb2YgQXBwbGljYXRpb25FeGNlcHRpb24pIHtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nKGV4Myk7XHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICB0aHJvdyBleDM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBHVUlNYW5hZ2VyLkluc3RhbmNlLmFib3J0KCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJvY2Vzc0hUTUxDb250ZW50KGh0bWxDb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIENvbW1hbmRzLmFkZFNob3dIVE1MRXJyb3IoQ29tbWFuZFR5cGUuU0hPV19IVE1MX0VSUk9SLCBodG1sQ29udGVudCk7XHJcbiAgICBDb21tYW5kcy5iZWdpbkludm9rZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gVGhpcyBtZXRob2QgZGVjaWRlcyBpZiB0aGUgZXJyb3IgaGFuZGxlZCBpbiBQcm9jZXNzQWJvcnRpbmdFcnJvciB3aWxsIG9wZW4gYSBtZXNzYWdlIGJveFxyXG4gIFNob3dFcnJvckluTWVzc2FnZUJveChleDogQXBwbGljYXRpb25FeGNlcHRpb24pOiBib29sZWFuIHtcclxuICAgIGlmKCEoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcikpXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgIC8vIGlmIGNoYW5nZXMgaW4gdGhlIHN0dWRpbyBjYXVzZSBhIHJlbG9hZCwgc2hvdyB0aGUgbWVzc2FnZWJveCBvbmx5IGlmIHRoZSB1c2VyIHRyaWVkIHRvXHJcbiAgICAvLyBjb250aW51ZSB3b3JraW5nIHdpdGggYW4gb2xkIGNvbnRleHRcclxuICAgIGlmKCgoPFNlcnZlckVycm9yPmV4KS5HZXRDb2RlKCkgPT0gU2VydmVyRXJyb3IuRVJSX0VYRUNVVEVEX1BST0dSQU1fQ0hBTkdFRCB8fFxyXG4gICAgICAgKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09IFNlcnZlckVycm9yLkVSUl9XRUJDTElFTlRfUFJPR1JBTV9SRUxPQURFRCkgJiZcclxuICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ29udGV4dElEID09PSBSdW50aW1lQ29udGV4dEJhc2Uubm9Db250ZXh0SWQpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbn1cclxuIl19