@magic-xpa/engine 4.1000.0-dev4100.30 → 4.1000.0-dev4100.302

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.
Files changed (52) hide show
  1. package/esm2020/src/ClientManager.mjs +11 -11
  2. package/esm2020/src/ConstInterface.mjs +3 -1
  3. package/esm2020/src/CurrentClientVersion.mjs +2 -2
  4. package/esm2020/src/commands/ClientToServer/DataviewCommand.mjs +6 -6
  5. package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +4 -4
  6. package/esm2020/src/commands/ClientToServer/EventCommand.mjs +8 -8
  7. package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +4 -4
  8. package/esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs +5 -5
  9. package/esm2020/src/commands/ClientToServer/RecomputeCommand.mjs +7 -7
  10. package/esm2020/src/commands/ClientToServer/TransactionCommand.mjs +6 -6
  11. package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +8 -8
  12. package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +7 -7
  13. package/esm2020/src/data/DataView.mjs +34 -34
  14. package/esm2020/src/data/DataviewManager.mjs +7 -7
  15. package/esm2020/src/data/Record.mjs +10 -10
  16. package/esm2020/src/data/TaskTransactionManager.mjs +4 -4
  17. package/esm2020/src/data/XMLBasedDcValuesBuilder.mjs +5 -5
  18. package/esm2020/src/env/Environment.mjs +14 -7
  19. package/esm2020/src/env/MirrorString.mjs +2 -3
  20. package/esm2020/src/event/Event.mjs +4 -1
  21. package/esm2020/src/event/EventHandler.mjs +8 -3
  22. package/esm2020/src/event/EventHandlerPosition.mjs +5 -1
  23. package/esm2020/src/event/EventsManager.mjs +2 -1
  24. package/esm2020/src/event/RunTimeEvent.mjs +16 -16
  25. package/esm2020/src/exp/ExpressionDict.mjs +8 -8
  26. package/esm2020/src/exp/ExpressionEvaluator.mjs +4 -178
  27. package/esm2020/src/gui/FormsTable.mjs +8 -8
  28. package/esm2020/src/gui/MgControl.mjs +10 -13
  29. package/esm2020/src/gui/MgForm.mjs +7 -23
  30. package/esm2020/src/http/HttpManager.mjs +8 -8
  31. package/esm2020/src/remote/RemoteCommandsProcessor.mjs +35 -26
  32. package/esm2020/src/rt/DataviewHeaderBase.mjs +16 -16
  33. package/esm2020/src/security/UserDetails.mjs +12 -12
  34. package/esm2020/src/tasks/MGData.mjs +4 -4
  35. package/esm2020/src/tasks/RCTimer.mjs +10 -10
  36. package/esm2020/src/tasks/Task.mjs +43 -42
  37. package/esm2020/src/util/FlowMonitorQueue.mjs +107 -2
  38. package/esm2020/src/util/PrmMap.mjs +6 -6
  39. package/esm2020/src/util/ReturnResult.mjs +7 -7
  40. package/fesm2015/magic-xpa-engine.mjs +489 -583
  41. package/fesm2015/magic-xpa-engine.mjs.map +1 -1
  42. package/fesm2020/magic-xpa-engine.mjs +489 -547
  43. package/fesm2020/magic-xpa-engine.mjs.map +1 -1
  44. package/package.json +6 -6
  45. package/src/ConstInterface.d.ts +2 -0
  46. package/src/env/Environment.d.ts +2 -0
  47. package/src/exp/ExpressionEvaluator.d.ts +0 -9
  48. package/src/gui/MgControl.d.ts +0 -1
  49. package/src/gui/MgForm.d.ts +1 -3
  50. package/src/util/FlowMonitorQueue.d.ts +8 -0
  51. package/src/util/PrmMap.d.ts +1 -1
  52. package/magic-xpa-engine.d.ts +0 -2
@@ -1907,6 +1907,7 @@ export class EventsManager {
1907
1907
  }
1908
1908
  break;
1909
1909
  case InternalInterface.MG_ACT_SERVER_TERMINATION:
1910
+ case InternalInterface.MG_ACT_DUMP_ENVIRONMENT:
1910
1911
  cmd = CommandFactory.CreateEventCommand(task.getTaskTag(), intEvtCode);
1911
1912
  cmdsToServer.Add(cmd);
1912
1913
  await CommandsProcessorManager.GetCommandsProcessor().Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
@@ -2963,4 +2964,4 @@ EventsManager.clientInactivityTimerON = false;
2963
2964
  EventsManager.clientContextInactivityTimerAborted = false;
2964
2965
  EventsManager.Instance = new EventsManager();
2965
2966
  EventsManager.clientBusyTimeStart = 0;
2966
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRzTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VuZ2luZS9zcmMvZXZlbnQvRXZlbnRzTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxFQUNOLGdCQUFnQixFQUNoQixhQUFhLEVBQ2IsSUFBSSxFQUNKLFlBQVksRUFDWixRQUFRLEVBQ1IsT0FBTyxFQUNQLGdCQUFnQixFQUNoQixPQUFPLEVBQ1AsV0FBVyxFQUNaLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFDLG9CQUFvQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzNJLE9BQU8sRUFDTCxRQUFRLEVBQ1IsV0FBVyxFQUNYLHFCQUFxQixFQUNyQixNQUFNLEVBQ04sWUFBWSxFQUNaLFlBQVksRUFDWixjQUFjLEVBRWQsWUFBWSxFQUVaLE9BQU8sRUFHUCxTQUFTLEVBQ1QsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN0QyxPQUFPLEVBQUMsaUNBQWlDLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUNsRyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFHeEUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRzVDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzFE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LFdBQVcsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQztRQUlkLElBQUcsQ0FBZSxFQUFHLENBQUMsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLDRCQUE0QjtZQUMxRCxFQUFHLENBQUMsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLDhCQUE4QixDQUFDO1lBQ3pFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxTQUFTLEtBQUssa0JBQWtCLENBQUMsV0FBVztZQUMxRSxPQUFPLEtBQUssQ0FBQztRQUVmLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7QUF4a0pjLHVCQUFTLEdBQVksSUFBSSxDQUFDO0FBQzFCLHNCQUFRLEdBQVcsSUFBSSxDQUFDO0FBQ3hCLDJDQUE2QixHQUFHLElBQUksQ0FBQztBQW9CckMscUNBQXVCLEdBQUcsS0FBSyxDQUFDO0FBQ2hDLGlEQUFtQyxHQUFHLEtBQUssQ0FBQztBQWtCcEQsc0JBQVEsR0FBa0IsSUFBSSxhQUFhLEVBQUUsQ0FBQztBQVE5QyxpQ0FBbUIsR0FBRyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBGb3JjZUV4aXQsXHJcbiAgSW50ZXJuYWxJbnRlcmZhY2UsXHJcbiAgTG9nZ2VyLFxyXG4gIExvZ2dlcl9Mb2dMZXZlbHMsXHJcbiAgTWdDb250cm9sVHlwZSxcclxuICBNaXNjLFxyXG4gIE1zZ0ludGVyZmFjZSxcclxuICBQcmlvcml0eSxcclxuICBSYWlzZUF0LFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RyVXRpbCxcclxuICBTdWJmb3JtVHlwZVxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQge0FwcGxpY2F0aW9uRXhjZXB0aW9uLCBJbnQzMiwgTGlzdCwgTlN0cmluZywgUmVmUGFyYW0sIFN0YWNrLCBTdHJpbmdCdWlsZGVyLCBUaHJlYWQsIGlzTnVsbE9yVW5kZWZpbmVkfSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7XHJcbiAgQ29tbWFuZHMsXHJcbiAgQ29tbWFuZFR5cGUsXHJcbiAgRGF0YU1vZGlmaWNhdGlvblR5cGVzLFxyXG4gIEV4cFZhbCxcclxuICBGb2N1c01hbmFnZXIsXHJcbiAgR3VpQ29uc3RhbnRzLFxyXG4gIEd1aUVudmlyb25tZW50LFxyXG4gIElUYXNrLFxyXG4gIEtleWJvYXJkSXRlbSxcclxuICBMYXN0Rm9jdXNlZFZhbCxcclxuICBNYW5hZ2VyLFxyXG4gIE1nQ29udHJvbEJhc2UsXHJcbiAgTWdGb3JtQmFzZSxcclxuICBNb2RpZmllcnMsXHJcbiAgUHJvcEludGVyZmFjZSxcclxuICBSdW50aW1lQ29udGV4dEJhc2UsXHJcbiAgU3R5bGVzLFxyXG4gIFRhc2tEZWZpbml0aW9uSWRcclxufSBmcm9tICdAbWFnaWMteHBhL2d1aSc7XHJcbmltcG9ydCB7RXZlbnRTdWJUeXBlfSBmcm9tICcuLi9lbnVtcyc7XHJcbmltcG9ydCB7Um9sbGJhY2tFdmVudENvbW1hbmRfUm9sbGJhY2tUeXBlfSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Sb2xsYmFja0V2ZW50Q29tbWFuZCc7XHJcbmltcG9ydCB7TWdDb250cm9sfSBmcm9tICcuLi9ndWkvTWdDb250cm9sJztcclxuaW1wb3J0IHtNZ1ByaW9yaXR5QmxvY2tpbmdRdWV1ZX0gZnJvbSAnLi4vdXRpbC9NZ1ByaW9yaXR5QmxvY2tpbmdRdWV1ZSc7XHJcbmltcG9ydCB7Q29tcE1haW5QcmdUYWJsZX0gZnJvbSAnLi4vcnQvQ29tcE1haW5QcmdUYWJsZSc7XHJcbmltcG9ydCB7RmllbGR9IGZyb20gJy4uL2RhdGEvRmllbGQnO1xyXG5pbXBvcnQge1J1blRpbWVFdmVudH0gZnJvbSAnLi9SdW5UaW1lRXZlbnQnO1xyXG5pbXBvcnQge01nRm9ybX0gZnJvbSAnLi4vZ3VpL01nRm9ybSc7XHJcbmltcG9ydCB7RXZlbnRIYW5kbGVyLCBSZXRWYWxzfSBmcm9tICcuL0V2ZW50SGFuZGxlcic7XHJcbmltcG9ydCB7Rmxvd01vbml0b3JRdWV1ZX0gZnJvbSAnLi4vdXRpbC9GbG93TW9uaXRvclF1ZXVlJztcclxuaW1wb3J0IHtHVUlNYW5hZ2VyfSBmcm9tICcuLi9HVUlNYW5hZ2VyJztcclxuaW1wb3J0IHtUYXNrfSBmcm9tICcuLi90YXNrcy9UYXNrJztcclxuaW1wb3J0IHtUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0sIFRhc2tCYXNlfSBmcm9tICcuLi90YXNrcy9UYXNrQmFzZSc7XHJcbmltcG9ydCB7QXJndW1lbnRzTGlzdH0gZnJvbSAnLi4vcnQvQXJndW1lbnRzTGlzdCc7XHJcbmltcG9ydCB7TUdEYXRhfSBmcm9tICcuLi90YXNrcy9NR0RhdGEnO1xyXG5pbXBvcnQge0hhbmRsZXJzVGFibGV9IGZyb20gJy4uL3J0L0hhbmRsZXJzVGFibGUnO1xyXG5pbXBvcnQge01HRGF0YUNvbGxlY3Rpb259IGZyb20gJy4uL3Rhc2tzL01HRGF0YUNvbGxlY3Rpb24nO1xyXG5pbXBvcnQge1JlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb259IGZyb20gJy4uL2RhdGEvUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbic7XHJcbmltcG9ydCB7Q29tbWFuZHNQcm9jZXNzb3JCYXNlLCBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9ufSBmcm9tICcuLi9Db21tYW5kc1Byb2Nlc3NvckJhc2UnO1xyXG5pbXBvcnQge0NvbW1hbmRzVGFibGV9IGZyb20gJy4uL0NvbW1hbmRzVGFibGUnO1xyXG5pbXBvcnQge0NvbW1hbmRGYWN0b3J5fSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Db21tYW5kRmFjdG9yeSc7XHJcbmltcG9ydCB7SUNsaWVudENvbW1hbmR9IGZyb20gJy4uL2NvbW1hbmRzL0lDbGllbnRDb21tYW5kJztcclxuaW1wb3J0IHtDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXJ9IGZyb20gJy4uL0NvbW1hbmRzUHJvY2Vzc29yTWFuYWdlcic7XHJcbmltcG9ydCB7T3BlcmF0aW9ufSBmcm9tICcuLi9ydC9PcGVyYXRpb24nO1xyXG5pbXBvcnQge0NsaWVudFJlZnJlc2hDb21tYW5kfSBmcm9tICcuLi9jb21tYW5kcy9TZXJ2ZXJUb0NsaWVudC9DbGllbnRSZWZyZXNoQ29tbWFuZCc7XHJcbmltcG9ydCB7UmVtb3RlQ29tbWFuZHNQcm9jZXNzb3J9IGZyb20gJy4uL3JlbW90ZS9SZW1vdGVDb21tYW5kc1Byb2Nlc3Nvcic7XHJcbmltcG9ydCB7RXhlY3V0aW9uU3RhY2t9IGZyb20gJy4uL3J0L0V4ZWN1dGlvblN0YWNrJztcclxuaW1wb3J0IHtFeGVjdXRpb25TdGFja0VudHJ5fSBmcm9tICcuLi9ydC9FeGVjdXRpb25TdGFja0VudHJ5JztcclxuaW1wb3J0IHtFdmVudEhhbmRsZXJQb3NpdGlvbn0gZnJvbSAnLi9FdmVudEhhbmRsZXJQb3NpdGlvbic7XHJcbmltcG9ydCB7RGF0YVZpZXd9IGZyb20gJy4uL2RhdGEvRGF0YVZpZXcnO1xyXG5pbXBvcnQge0V2ZW50fSBmcm9tICcuL0V2ZW50JztcclxuaW1wb3J0IHtSZWNvcmR9IGZyb20gJy4uL2RhdGEvUmVjb3JkJztcclxuaW1wb3J0IHtDb25zdEludGVyZmFjZX0gZnJvbSAnLi4vQ29uc3RJbnRlcmZhY2UnO1xyXG5pbXBvcnQge0Zsb3dNb25pdG9ySW50ZXJmYWNlfSBmcm9tICcuLi9GbG93TW9uaXRvckludGVyZmFjZSc7XHJcbmltcG9ydCB7RGF0YVZpZXdDb21tYW5kVHlwZX0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvRGF0YXZpZXdDb21tYW5kJztcclxuaW1wb3J0IHtTZXJ2ZXJFcnJvcn0gZnJvbSAnLi4vcmVtb3RlL1NlcnZlckVycm9yJztcclxuaW1wb3J0IHtFbnZpcm9ubWVudH0gZnJvbSAnLi4vZW52L0Vudmlyb25tZW50JztcclxuaW1wb3J0IHtMYXN0Rm9jdXNlZE1hbmFnZXJ9IGZyb20gJy4uL3J0L0xhc3RGb2N1c2VkTWFuYWdlcic7XHJcbmltcG9ydCB7RXZlbnRzQWxsb3dlZFR5cGUsIElFdmVudHNNYW5hZ2VyfSBmcm9tICcuL0lFdmVudHNNYW5hZ2VyJztcclxuaW1wb3J0IHtMYW5ndWFnZURhdGF9IGZyb20gJy4uL2Vudi9MYW5ndWFnZURhdGEnO1xyXG5pbXBvcnQge1N1YmplY3R9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge0NsaWVudE1hbmFnZXJ9IGZyb20gJy4uL0NsaWVudE1hbmFnZXInO1xyXG5pbXBvcnQge0NvbnRleHRUZXJtaW5hdGlvbkV2ZW50Q29tbWFuZH0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvQ29udGV4dFRlcm1pbmF0aW9uRXZlbnRDb21tYW5kJztcclxuaW1wb3J0IHsgQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24gfSBmcm9tICcuLi9BY2Nlc3NIZWxwZXInO1xyXG5cclxuXHJcbmVudW0gRXZlbnRTY29wZSB7XHJcbiAgTk9ORSA9ICcgJyxcclxuICBUUkFOUyA9ICdUJ1xyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIHRoaXMgY2xhc3MgbWFuYWdlIHRoZSBldmVudHMsIHB1dCB0aGVtIGluIGEgcXVldWUgYW5kIGhhbmRsZSB0aGVtXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBFdmVudHNNYW5hZ2VyIGltcGxlbWVudHMgSUV2ZW50c01hbmFnZXIge1xyXG4gIC8vIExPQ0FMIENPTlNUQU5UU1xyXG4gIHByaXZhdGUgc3RhdGljIFJFQUxfT05MWTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgTUFYX09QRVI6IG51bWJlciA9IDk5OTk7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgdXNlckdyYW50ZWRGb3JDb250ZXh0QWN0aXZpdHkgPSB0cnVlO1xyXG4gIHByaXZhdGUgX2V2ZW50c1F1ZXVlOiBNZ1ByaW9yaXR5QmxvY2tpbmdRdWV1ZSA9IG51bGw7IC8vIHRoZSBxdWV1ZSBvZiBldmVudHMgdG8gZXhlY3V0ZVxyXG4gIHByaXZhdGUgX2V4ZWNTdGFjazogU3RhY2s8RXhlY3V0aW9uU3RhY2s+ID0gbnVsbDsgLy8gRXhlY3V0aW9uIHN0YWNrIG9mIHJhaXNlIGV2ZW50IG9wZXJhdGlvbiBvciBjYWxscyB0byB1c2VyXHJcbiAgcHJpdmF0ZSBfcnRFdmVudHM6IFN0YWNrPFJ1blRpbWVFdmVudD4gPSBudWxsOyAvLyBBIHN0YWNrIG9mIGluLXByb2Nlc3MgcnVuLXRpbWUgZXZlbnRzICh0aGUgbGFzdCBvbmUgaXMgYXQgdGhlIHRvcCkuXHJcbiAgcHJpdmF0ZSBfc2VydmVyRXhlY1N0YWNrOiBTdGFjazxFeGVjdXRpb25TdGFjaz4gPSBudWxsOyAvLyBFeGVjdXRpb24gc3RhY2sgb2YgRXhlY3V0aW9uIHN0YWNrcyBvZiBvcGVyYXRpb25zIHRoYXRcclxuICBwcml2YXRlIF9hbGxvd0V2ZW50czogRXZlbnRzQWxsb3dlZFR5cGUgPSBFdmVudHNBbGxvd2VkVHlwZS5BTEw7XHJcbiAgcHJpdmF0ZSBfY29tcE1haW5QcmdUYWI6IENvbXBNYWluUHJnVGFibGUgPSBudWxsOyAvLyB0aGUgb3JkZXIgb2YgaGFuZGxpbmcgbWFpbiBwcm9ncmFtcyBvZiBjb21wb25lbnRzXHJcbiAgcHJpdmF0ZSBfY3VyckN0cmw6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfY3VyckZpZWxkOiBGaWVsZCA9IG51bGw7IC8vIGZvciBldmVyeSBldmVudCBleGVjdXRlZCB0aGlzIHZhcmlhYmxlIHdpbGwgY29udGFpbiB0aGUgZmllbGQgYXR0YWNoZWQgdG8gdGhlIGNvbnRyb2wgb24gd2hpY2ggdGhlIGV2ZW50IHdhcyBmaXJlZFxyXG4gIHByaXZhdGUgX2N1cnJLYmRJdGVtOiBLZXlib2FyZEl0ZW0gPSBudWxsO1xyXG4gIHByaXZhdGUgX2VuZE9mV29yazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2V2ZW50U2NvcGU6IEV2ZW50U2NvcGUgPSBFdmVudFNjb3BlLk5PTkU7IC8vIGluc3RydWN0cyBob3cgdG8gcHJvY2VzcyBldmVudHMgd2hpY2ggYXJlIHByb3BhZ2F0ZWQgdG8gc2xhdmUgdGFza3MgZHVyaW5nIGV4ZWN1dGlvbi5cclxuICBwcml2YXRlIF9mb3JjZUV4aXQ6IEZvcmNlRXhpdCA9IEZvcmNlRXhpdC5Ob25lO1xyXG4gIHByaXZhdGUgX2ZvcmNlRXhpdFRhc2s6IFRhc2sgPSBudWxsO1xyXG4gIHByaXZhdGUgX2lnbm9yZVVua25vd25BYm9ydDogYm9vbGVhbiA9IGZhbHNlOyAvLyBUUlVFIHdoZW4gJ2Fib3J0JyBjb21tYW5kcyBvbiB1bmtub3duIHRhc2tzIG1heSBhcnJpdmVcclxuICBwcml2YXRlIF9pbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlOyAvLyB1c2VkIHRvIGRldGVjdCByZS1pbml0aWFsaXphdGlvblxyXG4gIHByaXZhdGUgX2lzSGFuZGxpbmdGb3JjZUV4aXQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gaW5kaWNhdGUgd2UgYXJlIGN1cnJlbnRseSBoYW5kbGluZyBhIGZvcmNlRXhpdCByZWxhdGVkIGhhbmRsZXJcclxuICBwcml2YXRlIF9pc05vblJldmVyc2libGVFeGl0OiBib29sZWFuID0gZmFsc2U7IC8vIGlzIHRoZSBjb21tYW5kIG5vbnJldmVyc2libGVcclxuICBwcml2YXRlIF9pc0luUmVjb3JkRmx1c2hFdmVudDogYm9vbGVhbiA9IGZhbHNlOyAvLyB0cnVlIGlmIGN1cnJlbnQgYWN0IGlzIE1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRFxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBjbGllbnRJbmFjdGl2aXR5VGltZXJPTiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgc3RhdGljIGNsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZXJBYm9ydGVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBsYXN0U2F2ZWRSb3V0ZUV2ZW50OiBSdW5UaW1lRXZlbnQgPSBudWxsO1xyXG4gIC8vIHdhcyBzZW50IGZyb20gdGhlIHNlcnZlci4gd2UgbmVlZCBhIHN0YWNrIG9mIGV4ZWNzdGFja3NcclxuICAvLyBoZXJlIGJlY2F1c2Ugd2UgbWlnaHQgY2FsbCBhIG5ldyBwcm9ncmFtIGJlZm9yZSB3ZSBoYW5kbGVkXHJcbiAgLy8gdGhlIHByZXZpb3VzIHNlcnZlciBleGVjIHN0YWNrXHJcbiAgcHJpdmF0ZSBfc3RvcEV4ZWN1dGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3Byb2Nlc3NpbmdUb3BNb3N0RW5kVGFzazogYm9vbGVhbiA9IGZhbHNlOyAvLyBpbmRpY2F0aW9uIHdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBwcm9jZXNzaW5nIGV2ZW50cyBmcm9tIHRoZVxyXG4gIHByaXZhdGUgX3N0b3BFeGVjdXRpb25DdHJsOiBNZ0NvbnRyb2wgPSBudWxsOyAvLyBob2xkcyB0aGUgY3RybCBvbiB3aGljaCB3ZSBnZXQgdGhlIGZpcnN0IHN0b3AgZXhlY3V0aW9uXHJcblxyXG4gIHB1YmxpYyBndWlQZW5kaW5nRXZlbnQ6IGFueSA9IG51bGw7XHJcbiAgLy8gS0VZQk9BUkQgRVZFTlRTIENPTlNUQU5UU1xyXG4gIHJlYWRvbmx5IEtCSV9ET1dOOiBLZXlib2FyZEl0ZW0gPSBudWxsO1xyXG4gIHJlYWRvbmx5IEtCSV9VUDogS2V5Ym9hcmRJdGVtID0gbnVsbDtcclxuXHJcbiAgLy8gQ09OVEVYVCBURVJNSU5BVElPTiBXQVJOSU5HIENPTlNUQU5UU1xyXG4gIHJlYWRvbmx5IGNvbmZpcm1hdGlvbkRpYWxvZ01zZzogc3RyaW5nID0gJ1RoZSBzZXJ2ZXIgY29udGV4dCBzZXJ2aW5nIHRoaXMgYXBwbGljYXRpb24gaXMgYWJvdXQgdG8gdGltZSBvdXQuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlIHlvdXIgd29yaz8nO1xyXG4gIHJlYWRvbmx5IGNvbmZpcm1hdGlvbkRpYWxvZ1RpdGxlOiBzdHJpbmcgPSAnU2Vzc2lvbiBpcyBhYm91dCB0byBiZSB0ZXJtaW5hdGVkISc7XHJcblxyXG4gIHN0YXRpYyBJbnN0YW5jZTogRXZlbnRzTWFuYWdlciA9IG5ldyBFdmVudHNNYW5hZ2VyKCk7XHJcblxyXG4gIHByaXZhdGUgX2xhc3RGYWlsZWRGb2N1c2VkQ29udHJvbDogTWdDb250cm9sQmFzZSA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgaXNTcGlubmVyU2hvd246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgU3Bpbm5lclN0b3BwZWQ6IFN1YmplY3Q8bnVtYmVyPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHN0YXRpYyBjbGllbnRCdXN5VGltZVN0YXJ0ID0gMDtcclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHJpdmF0ZSBDVE9SIHRvIHByZXZlbnQgaW5zdGFudGlhdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuX3J0RXZlbnRzID0gbmV3IFN0YWNrKCk7XHJcblxyXG4gICAgdGhpcy5fZXZlbnRzUXVldWUgPSBuZXcgTWdQcmlvcml0eUJsb2NraW5nUXVldWUoKTtcclxuXHJcbiAgICB0aGlzLl9leGVjU3RhY2sgPSBuZXcgU3RhY2soKTtcclxuICAgIHRoaXMuX2V4ZWNTdGFjay5wdXNoKG5ldyBFeGVjdXRpb25TdGFjaygpKTtcclxuXHJcbiAgICB0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sgPSBuZXcgU3RhY2soKTtcclxuICAgIHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wdXNoKG51bGwpO1xyXG5cclxuXHJcbiAgICB0aGlzLktCSV9ET1dOID0gbmV3IEtleWJvYXJkSXRlbShHdWlDb25zdGFudHMuS0VZX0RPV04sIE1vZGlmaWVycy5NT0RJRklFUl9OT05FKTtcclxuICAgIHRoaXMuS0JJX1VQID0gbmV3IEtleWJvYXJkSXRlbShHdWlDb25zdGFudHMuS0VZX1VQLCBNb2RpZmllcnMuTU9ESUZJRVJfTk9ORSk7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0UGVuZGluZ0d1aUV2ZW50KCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5ndWlQZW5kaW5nRXZlbnQ7XHJcbiAgfVxyXG5cclxuICBzZXRQZW5kaW5nR3VpRXZlbnQoZ3VpRXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5ndWlQZW5kaW5nRXZlbnQgPSBndWlFdmVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgYW4gZXZlbnQgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXJ0RXZ0XCI+dGhlIGV2ZW50IHRvIGJlIGFkZGVkIDwvcGFyYW0+XHJcbiAgYWRkVG9UYWlsKHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIGlmIGN1cnJlbnQgZXZlbnQgaXMgbm90IGlkbGUgdGltZSBldmVudCBjaGVjayBpZiB0aGVyZSBpcyBjbGllbnRJbmFjdGl2aXR5VGltZXIgcnVubmluZz9cclxuICAgIC8vIGlmIHNvICwgc3RvcCB0aGlzIGNsaWVudCBDb250ZXh0IGluYWN0aXZpdHkgdGltZXJcclxuICAgIGlmICghcnRFdnQuaXNJZGxlVGltZXIoKSkge1xyXG4gICAgICBpZiAoRXZlbnRzTWFuYWdlci5jbGllbnRJbmFjdGl2aXR5VGltZXJPTikge1xyXG4gICAgICAgIEV2ZW50c01hbmFnZXIuY2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lckFib3J0ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgLy8gaWYgY2xpZW50IGlzIGlkbGUgYWZ0ZXIgcmVjcmVhdGluZyBjb250ZXh0ICwgdGhlbiBhZGQgbGFzdCBzYXZlZCByb3V0ZSBldmVudFxyXG4gICAgICBpZiAodGhpcy5nZXRMYXN0U2F2ZWRSb3V0ZUV2ZW50KCkgIT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuYWRkVG9UYWlsKHRoaXMuZ2V0TGFzdFNhdmVkUm91dGVFdmVudCgpKTtcclxuICAgICAgICB0aGlzLnNldExhc3RTYXZlZFJvdXRlRXZlbnQobnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9ldmVudHNRdWV1ZS5wdXQocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCBhbiBrZXlib2FyZCBldmVudCB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ0Zvcm1cIj5mb3JtIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ0NvbnRyb2xcIj5jb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtb2RpZmllclwiPm1vZGlmaWVyIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdGFydFwiPnN0YXJ0IG9mIHNlbGVjdGVkIHRleHQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImVuZFwiPmVuZCBvZiBzZWxlY3RlZCB0ZXh0ICA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGV4dFwiPnRleHQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImltXCI+aW0gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzQWN0Q2hhclwiPmlzIGtleWJvYXJkIGNoYXIgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN1Z2dlc3RlZFZhbHVlXCI+c3VnZ2VzdGVkIHZhbHVlIGZvciBjaG9pY2UgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj5jb2RlIHRvIGJlIGFkZGVkIGluIHRoZSBxdWV1ZSA8L3BhcmFtPlxyXG4gIEFkZEtleWJvYXJkRXZlbnQobWdGb3JtOiBNZ0Zvcm1CYXNlLCBtZ0NvbnRyb2w6IE1nQ29udHJvbEJhc2UsIG1vZGlmaWVyOiBNb2RpZmllcnMsIGtleUNvZGU6IG51bWJlciwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHRleHQ6IHN0cmluZywgaXNBY3RDaGFyOiBib29sZWFuLCBzdWdnZXN0ZWRWYWx1ZTogc3RyaW5nLCBjb2RlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gKG1nQ29udHJvbCAhPT0gbnVsbCkgPyBuZXcgUnVuVGltZUV2ZW50KDxNZ0NvbnRyb2w+bWdDb250cm9sLCB0cnVlLCBmYWxzZSkgOiBuZXcgUnVuVGltZUV2ZW50KDxUYXNrPm1nRm9ybS5nZXRUYXNrKCksIHRydWUpO1xyXG5cclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG5cclxuICAgIGxldCBuZXdLYkl0ZW06IEtleWJvYXJkSXRlbSA9IG5ldyBLZXlib2FyZEl0ZW0oa2V5Q29kZSwgbW9kaWZpZXIpO1xyXG5cclxuICAgIGlmIChpc0FjdENoYXIgJiYgKG1nQ29udHJvbCAhPT0gbnVsbCAmJiAobWdDb250cm9sLmlzVGV4dENvbnRyb2woKSkpKVxyXG4gICAgICBuZXdLYkl0ZW0uc2V0QWN0aW9uKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DSEFSKTtcclxuXHJcbiAgICBydEV2dC5zZXRLZXlib2FyZEl0ZW0obmV3S2JJdGVtKTtcclxuXHJcbiAgICBpZiAoY29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfS0VZRE9XTikge1xyXG4gICAgICBydEV2dC5zZXRFZGl0UGFybXMoc3RhcnQsIGVuZCwgdGV4dCk7XHJcbiAgICB9IGVsc2VcclxuICAgICAgcnRFdnQuc2V0VmFsdWUoc3VnZ2VzdGVkVmFsdWUpO1xyXG5cclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBRQ1IgNzYwMzgxIGlmIGFmdGVyIGhhbmRsaW5nIHRoZSBldmVudCB0aGUgY3VycmVudCBjb250cm9sIGlzIHVucGFya2FibGUgdHJ5XHJcbiAgLy8vICAgYW4gbW92ZSB0byB0aGUgbmV4dCBwYXJrYWJsZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBjaGVja1BhcmthYmlsaXR5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGN1cnJlbnQ6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuXHJcbiAgICAvKiBRQ1IjIDkyNTQ2NC4gVGhlIHByb2JsZW0gd2FzIHRoYXQgb24gZGVsZXRpbmcgYSByZWNvcmQsIENTIG9mIHRoZSBjb250cm9sIGdldHMgZXhlY3V0ZWQuXHJcbiAgICAgKiBTbywgdGhlIHRhc2sncyBsZXZlbCBpcyBzZXQgdG8gVEFTSy4gVGhlbiB3ZSBnbyB0byBzZXJ2ZXIgYW4gb24gcmV0dXJuaW5nIGJhY2sgZnJvbSB0aGUgc2VydmVyLFxyXG4gICAgICogd2UgcmVmcmVzaCB0aGUgZm9ybS4gSGVyZSwgc2luY2UgdGhlIGxhc3QgcGFya2VkIGNvbnRyb2wgaS5lLiBcImZyb21cIiAobnVtZXJpYykgaXMgaGlkZGVuLFxyXG4gICAgICogd2UgdHJ5IHRvIHBhcmsgb24gdGhlIG5leHQgcGFya2FibGUgY29udHJvbCBmcm9tIFByb3BlcnR5LlJlZnJlc2hEaXNwbGF5KCkuIFRoaXMgbWFrZXMgdGhlXHJcbiAgICAgKiB0YXNrJ3MgbGV2ZWwgYXMgQ09OVFJPTC4gTm93LCB3ZSB0cnkgdG8gZXhlY3V0ZSBSUCwgYnV0IHNpbmNlIHRoZSBsZXZlbCBpcyBDT05UUk9MLFxyXG4gICAgICogd2UgZG8gbm90IGV4ZWN1dGUgaXQuIFRoZSBzb2x1dGlvbiBpcyB0aGF0IGNoZWNrUGFya2FiaWxpdHkoKSB3aGljaCBpcyBjYWxsZWQgZnJvbVxyXG4gICAgICogUHJvcGVydHkuUmVmcmVzaERpc3BsYXkoKSwgc2hvdWxkIHRyeSB0byBwYXJrIG9uIHRoZSBjb250cm9sIG9ubHkgaWYgdGhlIHRhc2sncyBsZXZlbCBpcyBDT05UUk9MLlxyXG4gICAgICovXHJcbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAoY3VycmVudC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MICYmICFhd2FpdCBjdXJyZW50LklzUGFya2FibGUoKSlcclxuICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKGN1cnJlbnQuZ2V0Rm9ybSgpLmdldFRhc2soKSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBIYW5kbGVQYXJrYWJpbGl0eU9uUm93Q2hhbmdlKGl0YXNrOiBJVGFzayk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKGl0YXNrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBoYW5kbGUgc2l0dWF0aW9uIHdpdGggbm8gcGFya2FibGUgY29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXRhc2tcIj48L3BhcmFtPlxyXG4gIGFzeW5jIEhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoaXRhc2s6IElUYXNrKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPml0YXNrO1xyXG4gICAgLy8gd2UgY2FuIG5vdCBzdGF5IGluIGNyZWF0ZSBtb2RlIHdpdGggbm8gcGFya2FibGUgY29udHJvbHNcclxuICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgdGFzay5Jc0ludGVyYWN0aXZlKSB7XHJcbiAgICAgIGF3YWl0IHRhc2suZW5hYmxlTW9kZXMoKTtcclxuICAgICAgbGV0IG9sZE1vZGU6IHN0cmluZyA9IHRhc2suZ2V0T3JpZ2luYWxUYXNrTW9kZSgpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgaWYgKG9sZE1vZGUgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICB0YXNrLnNldE1vZGUob2xkTW9kZSk7XHJcbiAgICAgICAgICBhd2FpdCAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmN1cnJSZWNDb21wdXRlKHRydWUpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgdGFzay5zZXRMYXN0UGFya2VkQ3RybChudWxsKTtcclxuICAgICAgICAgIGF3YWl0IEZvY3VzTWFuYWdlci5TZXRGb2N1cyh0YXNrLCBudWxsLCAtMSwgdHJ1ZSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIHdlIGNhbiBub3Qgc3RheSBpbiBjcmVhdGUgbW9kZSBvciBpbiBzdG9wIGV4ZWN1dGlvbiBzdGF0ZSB3aXRoIG5vIHBhcmthYmxlIGNvbnRyb2xzXHJcbiAgICAgIC8vIERvIG5vdCBnaXZlIHBhcmsgZXJyb3IsIGlmIHRhc2sgaXMgb3BlbmVkIGluIGNyZWF0ZSBtb2RlLiBUaGlzIGlzIHRlbXBvcmFyeSBjaGFuZ2UgZm9yIGN1c3RvbWVyIHByb2JsZW0uXHJcbiAgICAgIC8vdGhpcy5leGl0V2l0aEVycm9yKHRhc2ssIE1zZ0ludGVyZmFjZS5SVF9TVFJfQ1JTUl9DQU5UX1BBUkspO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFdoaWxlIGhhbmRsZSBub24tcGFya2FiaWxpdHkgY29uZGl0aW9uLCBlbnN1cmUgQ1MgaXMgY2FsbGVkIGZvciBjb250cm9sIGlmIGl0IGlzIGluIENvbnRyb2wgbGV2ZWwgdGhlbiBwYXJraW5nIGlzIHNldCBvbiBmb3JtLlxyXG4gICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTClcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UodGFzay5nZXRMYXN0UGFya2VkQ3RybCgpLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpO1xyXG5cclxuICAgIHRhc2suc2V0TGFzdFBhcmtlZEN0cmwobnVsbCk7XHJcbiAgICBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsID0gbnVsbDtcclxuICAgIGF3YWl0IEZvY3VzTWFuYWdlci5TZXRGb2N1cyh0YXNrLCBudWxsLCAtMSwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaGFuZGxlIGEgc2luZ2xlIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlydEV2dFwiPnRoZSBldmVudCB0byBwcm9jZXNzIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXR1cm5lZEZyb21TZXJ2ZXJcIj5pbmRpY2F0ZXMgd2hldGhlciB3ZSByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgLSB0byBiZSBwYXNzZWQgdG8gaGFuZGxlci5leGVjdXRlKCkgPC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVFdmVudChydEV2dDogUnVuVGltZUV2ZW50LCByZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBoYW5kbGVyOiBFdmVudEhhbmRsZXIgPSBudWxsO1xyXG4gICAgbGV0IHBvczogRXZlbnRIYW5kbGVyUG9zaXRpb24gPSBuZXcgRXZlbnRIYW5kbGVyUG9zaXRpb24oKTtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+cnRFdnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgbGV0IGZvcmNlRXhpdERvbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBlbmRUYXNrRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBvbGRSdEV2dDogUnVuVGltZUV2ZW50ID0gbnVsbDtcclxuICAgIGxldCBvbGRGb3JjZUV4aXQ6IEZvcmNlRXhpdCA9IHRoaXMuZ2V0Rm9yY2VFeGl0KCk7XHJcbiAgICBsZXQgb2xkRm9yY2VFeGl0VGFzazogVGFzayA9IHRoaXMuZ2V0Rm9yY2VFeGl0VGFzaygpO1xyXG4gICAgbGV0IG9sZElzSGFuZGxpbmdGb3JjZUV4aXQ6IGJvb2xlYW4gPSB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0O1xyXG4gICAgbGV0IHJlc3RvcmVJc0ZvcmNlRXhpdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHJlc3RvcmVDdXJyQ3RybDogTWdDb250cm9sO1xyXG4gICAgbGV0IHJlc3RvcmVDdXJyRmllbGQ6IEZpZWxkID0gbnVsbDtcclxuXHJcbiAgICAvLyB0aGUgYWN0aW9uIG5lZWQgdG8gYmUgY2hlY2sgYWNjb3JkaW5nIHRvIHRoZSB0YXNrIG9uIHRoZSBldmVudC5cclxuICAgIC8vIElmIHRoZSBhY3Rpb24gaXMgaW50ZXJuYWwgKHVuZGVyIEFDVF9UT1QpLCBkbyBub3RoaW5nIGlmIGl0cyBkaXNhYmxlZCBvciBub3QgYWxsb3dlZC5cclxuICAgIGlmICgocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMKSkge1xyXG4gICAgICAvLyBkbyBub3RoaW5nIGlmIGFjdGlvbiBpcyAxLiBub3QgZW5hYmxlZCAyLiB3YWl0ID09IG5vIGFuZCBldmVudHMgYXJlIG5vdCBhbGxvd2VkXHJcbiAgICAgIGlmIChydEV2dC5JbnRlcm5hbEV2ZW50IDwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RPVF9DTlQgJiYgKCF0YXNrLkFjdGlvbk1hbmFnZXIuaXNFbmFibGVkKHJ0RXZ0LkludGVybmFsRXZlbnQpIHx8ICghcnRFdnQuaXNJbW1lZGlhdGUoKSAmJiB0aGlzLk5vRXZlbnRzQWxsb3dlZCgpKSkpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlXHJcbiAgICAvLyBkbyB0aGUgaGFuZGxlcnMgd2hlbiAxLiB3YWl0ID09IHllcyBvciAyLiBldmVudHMgYXJlIGFsbG93ZWRcclxuICAgIGlmICghcnRFdnQuaXNJbW1lZGlhdGUoKSAmJiB0aGlzLk5vRXZlbnRzQWxsb3dlZCgpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgcmVzdG9yZUN1cnJDdHJsID0gdGhpcy5fY3VyckN0cmw7XHJcbiAgICB0aGlzLl9jdXJyQ3RybCA9IGN0cmw7IC8vIHNhdmUgY3VycmVudCBjb250cm9sIGZvciBIQU5ETEVSX0NUUkwgZnVuY3Rpb25cclxuXHJcbiAgICBsZXQgcHJvcGFnYXRlOiBib29sZWFuID0gcnRFdnQuZ2V0VHlwZSgpICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMIHx8IHJ0RXZ0LmdldEludGVybmFsQ29kZSgpIDwgMTAwMDtcclxuXHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgdGhpcy5wdXNoUnRFdmVudChydEV2dCk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLkNoZWNrQW5kU2hvd1NwaW5uZXIodHJ1ZSk7XHJcblxyXG4gICAgICAvLyBkbyBzb21lIGNvbW1vbiBwcm9jZXNzaW5nIGFuZCBpZiB0aGUgcmVzdWx0IGlzIHRydWUgdGhlbiBjb250aW51ZVxyXG4gICAgICAvLyB3aXRoIHRoZSB1c2VyIGRlZmluZWQgaGFuZGxlcnNcclxuICAgICAgbGV0IGJSY0JlZm9yZTogYm9vbGVhbiA9IGF3YWl0IHRoaXMuY29tbW9uSGFuZGxlckJlZm9yZShydEV2dCk7XHJcblxyXG4gICAgICByZXN0b3JlQ3VyckZpZWxkID0gdGhpcy5fY3VyckZpZWxkO1xyXG4gICAgICB0aGlzLl9jdXJyRmllbGQgPSA8RmllbGQ+dGFzay5nZXRDdXJyRmllbGQoKTtcclxuXHJcbiAgICAgIGlmIChiUmNCZWZvcmUpIHtcclxuICAgICAgICBwb3MuaW5pdChydEV2dCk7XHJcbiAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCBoYW5kbGVyIGZvciB0aGUgY3VycmVudCBldmVudFxyXG4gICAgICAgIGhhbmRsZXIgPSBwb3MuZ2V0TmV4dCgpO1xyXG5cclxuICAgICAgICBpZiAoaGFuZGxlciAhPT0gbnVsbCAmJiBoYW5kbGVyLmdldEV2ZW50KCkgIT09IG51bGwgJiYgaGFuZGxlci5nZXRFdmVudCgpLlVzZXJFdnQgIT09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLnNldEZvcmNlRXhpdChoYW5kbGVyLmdldEV2ZW50KCkuVXNlckV2dC5Gb3JjZUV4aXQsIHRhc2spO1xyXG5cclxuICAgICAgICAvLyBleGVjdXRlIHRoZSBjaGFpbiBvZiBoYW5kbGVycyBmb3IgdGhlIGN1cnJlbnQgZXZlbnQuIHRoZSBleGVjdXRpb25cclxuICAgICAgICAvLyBjb250aW51ZXMgdGlsbCBhbiBldmVudCBoYW5kbGVyIHJldHVybnMgZmFsc2UuXHJcbiAgICAgICAgd2hpbGUgKGhhbmRsZXIgIT09IG51bGwpIHtcclxuICAgICAgICAgIGxldCBoYW5kbGVyQ29udGV4dFRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgICAgICAgbGV0IHJ0RXZ0Q2hhbmdlZDogYm9vbGVhbjtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBlbmFibGVkQ25kQ2hlY2tlZEFuZFRydWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgaGFuZGxlciBjaGFuZ2UgdGhlIGhhbmRsZXIncyBjb250ZXh0IHRhc2sgdG8gdGhlIGV2ZW50J3MgdGFza1xyXG4gICAgICAgICAgICBoYW5kbGVyQ29udGV4dFRhc2sgPSA8VGFzaz5oYW5kbGVyLmdldFRhc2soKS5HZXRDb250ZXh0VGFzaygpO1xyXG4gICAgICAgICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpID49IDEwMDAgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WQVJJQUJMRSlcclxuICAgICAgICAgICAgICBoYW5kbGVyLmdldFRhc2soKS5TZXRDb250ZXh0VGFzayhoYW5kbGVyLmdldFRhc2soKSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBoYW5kbGVyLmdldFRhc2soKS5TZXRDb250ZXh0VGFzayhydEV2dC5nZXRUYXNrKCkpO1xyXG5cclxuICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gbmVlZCB0byBoYW5kbGUgRm9yY2VFeGl0IGZvciBub24tdXNlciBldmVudHNcclxuICAgICAgICAgICAgaWYgKGhhbmRsZXIuZ2V0RXZlbnQoKS5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUiAmJiBhd2FpdCBoYW5kbGVyLmlzRW5hYmxlZCgpKSB7XHJcbiAgICAgICAgICAgICAgZW5hYmxlZENuZENoZWNrZWRBbmRUcnVlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgcmVzdG9yZUlzRm9yY2VFeGl0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAvLyBoYW5kbGUgZm9yY2VFeGl0IG9ubHkgb25jZVxyXG4gICAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmhhbmRsZUZvcmNlRXhpdEJlZm9yZShoYW5kbGVyLmdldEV2ZW50KCksIHJ0RXZ0KSkge1xyXG4gICAgICAgICAgICAgICAgZm9yY2VFeGl0RG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgY3VycmVudCBydW4gdGltZSBldmVudCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZXZlbnRcclxuICAgICAgICAgICAgLy8gb2YgdGhlIGhhbmRsZXJcclxuICAgICAgICAgICAgaWYgKHJ0RXZ0ICE9PSBoYW5kbGVyLmdldEV2ZW50KCkpIHtcclxuICAgICAgICAgICAgICAvLyB0aGUgbmV3IHJ1bnRpbWUgZXZlbnQgaXMgdGhhdCBvZiB0aGUgaGFuZGxlciBjb21iaW5lZCB3aXRoIHRoZVxyXG4gICAgICAgICAgICAgIC8vIGRhdGEgb2YgdGhlIGN1cnJlbnQgcnVudGltZSBldmVudC5cclxuICAgICAgICAgICAgICAvLyB0aGUgcHVycG9zZSBvZiB0aGlzIGlzIHRvIHByb3BhZ2F0ZSB0aGUgZXZlbnQgb2YgdGhlIGhhbmRsZXJcclxuICAgICAgICAgICAgICAvLyBpbiBwbGFjZSBvZiB0aGUgb3JpZ2luYWwgZXZlbnRcclxuICAgICAgICAgICAgICBvbGRSdEV2dCA9IHJ0RXZ0O1xyXG4gICAgICAgICAgICAgIHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudChoYW5kbGVyLmdldEV2ZW50KCksIHJ0RXZ0KTtcclxuICAgICAgICAgICAgICBydEV2dENoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBhIG5ldyBydW50aW1lIGV2ZW50IHRvIGhhbmRsZSBzbyBwb3AgdGhlIG9sZCBvbmUgYW5kIHB1c2hcclxuICAgICAgICAgICAgICAvLyB0aGUgbmV3IG9uZSBpbnN0ZWFkLlxyXG4gICAgICAgICAgICAgIHRoaXMucG9wUnRFdmVudCgpO1xyXG4gICAgICAgICAgICAgIHRoaXMucHVzaFJ0RXZlbnQocnRFdnQpO1xyXG4gICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICBydEV2dENoYW5nZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKVxyXG4gICAgICAgICAgICAgIHJ0RXZ0LmdldFRhc2soKS5zZXRJblJlY29yZFN1ZmZpeCh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRXZlbnRBcmd1bWVudHMocnRFdnQpO1xyXG4gICAgICAgICAgICBsZXQgaGFuZGxlclJldFZhbHM6IFJldFZhbHMgPSBhd2FpdCBoYW5kbGVyLmV4ZWN1dGUocnRFdnQsIHJldHVybmVkRnJvbVNlcnZlciwgZW5hYmxlZENuZENoZWNrZWRBbmRUcnVlKTtcclxuICAgICAgICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpXHJcbiAgICAgICAgICAgICAgcnRFdnQuZ2V0VGFzaygpLnNldEluUmVjb3JkU3VmZml4KGZhbHNlKTtcclxuICAgICAgICAgICAgcHJvcGFnYXRlID0gaGFuZGxlclJldFZhbHMuUHJvcGFnYXRlO1xyXG4gICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXRWYWxzLkVuYWJsZWQgJiYgcnRFdnRDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgcnRFdnQgPSBvbGRSdEV2dDtcclxuICAgICAgICAgICAgICBvbGRSdEV2dCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgcnRFdnRDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYSBuZXcgcnVudGltZSBldmVudCB0byBoYW5kbGUgc28gcG9wIHRoZSBvbGQgb25lIGFuZCBwdXNoXHJcbiAgICAgICAgICAgICAgLy8gdGhlIG5ldyBvbmUgaW5zdGVhZC5cclxuICAgICAgICAgICAgICB0aGlzLnBvcFJ0RXZlbnQoKTtcclxuICAgICAgICAgICAgICB0aGlzLnB1c2hSdEV2ZW50KHJ0RXZ0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgaGF2ZSBmdWxmaWxsZWQgdGhlIGVuZCBjb25kaXRpb25cclxuICAgICAgICAgICAgLy8gQWZ0ZXIgZXhlY3V0aW5nIGEgaGFuZGxlciwgYmVmb3JlIGVuZGluZyBhIHRhc2sgKGlmIHRoZSBlbmQgY29uZGl0aW9uIGlzIFRSVUUpLFxyXG4gICAgICAgICAgICAvLyB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlIHRhc2sgaXMgbm90IGFscmVhZHkgY2xvc2VkLiBUaGlzIGNhbiBoYXBwZW4gbGlrZSBpbiBjYXNlXHJcbiAgICAgICAgICAgIC8vIG9mIFFDUiAjNzk2NDc2IC0tLSBhIG5vbi1pbnRlcmFjdGl2ZSB0YXNrIGhhcyBjYWxsZWQgYW4gaW50ZXJhY3RpdmUgdGFzayBmcm9tXHJcbiAgICAgICAgICAgIC8vIHRhc2sgc3VmZml4LiBOb3cgaWYgd2UgcHJlc3MgQWx0K0Y0LCB3ZSBnZXQgRVhJVF9TWVNURU0gYWN0LiBBbmQgc28gd2UgY2xvc2VcclxuICAgICAgICAgICAgLy8gYWxsIHRhc2tzIHN0YXJ0aW5nIGZyb20gTWFpbiBQcm9ncmFtLiBTbywgd2hlbiB3ZSBjb21lIG91dCBvZiB0aGUgVFMgaGFuZGxlclxyXG4gICAgICAgICAgICAvLyBleGVjdXRpb24sIHRoZSB0YXNrIGlzIGFscmVhZHkgY2xvc2VkLlxyXG4gICAgICAgICAgICAvLyBGb3IgT2ZmbGluZSA6IFRQIGlzIGV4ZWN1dGVkIGF0IGNsaWVudCBzaWRlLiBJZiB3ZSBhcmUgaW4gVGFzayBQcmVmaXgsIGRvbnQgY2hlY2sgZW5kVGFzayBjb25kaXRpb24gaGVyZS5cclxuICAgICAgICAgICAgaWYgKHJ0RXZ0LmdldEludGVybmFsQ29kZSgpICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVggJiYgdGFzay5pc1N0YXJ0ZWQoKSAmJiB0YXNrLmdldEV4ZWNFbmRUYXNrKCkpIHtcclxuICAgICAgICAgICAgICBlbmRUYXNrRXJyb3IgPSBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgICBpZiAoZW5kVGFza0Vycm9yKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5oYW5kbGVTdG9wRXhlY3V0aW9uKHJ0RXZ0KSlcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAvLyByZXN0b3JpbmcgdGhlIGNvbnRleHRcclxuICAgICAgICAgICAgaGFuZGxlci5nZXRUYXNrKCkuU2V0Q29udGV4dFRhc2soaGFuZGxlckNvbnRleHRUYXNrKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoIXByb3BhZ2F0ZSlcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgaWYgKHJ0RXZ0Q2hhbmdlZClcclxuICAgICAgICAgICAgaGFuZGxlciA9IHBvcy5nZXROZXh0KHJ0RXZ0KTtcclxuICAgICAgICAgIC8vIGdldCB0aGUgbmV4dCBoYW5kbGVyIGZvciB0aGUgY3VycmVudCBldmVudFxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBoYW5kbGVyID0gcG9zLmdldE5leHQoKTtcclxuICAgICAgICAgIGlmIChoYW5kbGVyICE9PSBudWxsKVxyXG4gICAgICAgICAgICBGbG93TW9uaXRvclF1ZXVlLkluc3RhbmNlLmFkZFRhc2tFdmVudChydEV2dC5nZXRCcmtMZXZlbCh0cnVlKSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1BST1BBR0FURSwgdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByb3BhZ2F0ZSAmJiAhZW5kVGFza0Vycm9yKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5jb21tb25IYW5kbGVyKHJ0RXZ0KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWVuZFRhc2tFcnJvcikge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY29tbW9uSGFuZGxlckFmdGVyKHJ0RXZ0LCBiUmNCZWZvcmUpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChmb3JjZUV4aXREb25lICYmIHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQpIHtcclxuICAgICAgICB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ID0gZmFsc2U7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGb3JjZUV4aXRBZnRlcihydEV2dCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZXRGb3JjZUV4aXQob2xkRm9yY2VFeGl0LCBvbGRGb3JjZUV4aXRUYXNrKTtcclxuICAgICAgaWYgKHJlc3RvcmVJc0ZvcmNlRXhpdClcclxuICAgICAgICB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ID0gb2xkSXNIYW5kbGluZ0ZvcmNlRXhpdDtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuX2N1cnJDdHJsID0gcmVzdG9yZUN1cnJDdHJsO1xyXG4gICAgICB0aGlzLl9jdXJyRmllbGQgPSByZXN0b3JlQ3VyckZpZWxkO1xyXG4gICAgICB0aGlzLnBvcFJ0RXZlbnQoKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8gdXBkYXRlIHRoZSBkaXNwbGF5XHJcbiAgICBHVUlNYW5hZ2VyLkluc3RhbmNlLmV4ZWNHdWlDb21tYW5kUXVldWUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUaGlzIG1ldGhvZCBzaW11bGF0ZXMgYWxsIGV2ZW50cyB0aGF0IGFyZSBpbiBzZWxlY3Rpb24gc2VxdWVuY2Ugc3RhcnRpbmcgZnJvbSBmb2N1cyBldmVudFxyXG4gIC8vLyAgIEl0IGlzIHVzZWQgaW4gOlxyXG4gIC8vLyAgIGFjdGlvbnMgQ1RSTCtUQUIgJiYgQ1RSTCtTSElGVCtUQUIgdGhhdCBtb3ZlIHVzIHRvIHRoZSBuZXh0L3ByZXZpb3VzIGl0ZW0gaW4gVGFiIGNvbnRyb2xcclxuICAvLy8gICBjbGljayBvciBhY2NlbGVyYXRvciBvbiBwdXNoIGJ1dHRvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+Y3RybCBsaW5lPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb2R1Y2VDbGlja1wiPnRydWUgc2hvdWxkIHByb2R1Y2UgY2xpY2sgZXZlbnQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgc2ltdWxhdGVTZWxlY3Rpb24oY3RybDogTWdDb250cm9sQmFzZSwgdmFsOiBhbnksIGxpbmU6IG51bWJlciwgcHJvZHVjZUNsaWNrOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbWdDb250cm9sOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPmN0cmw7XHJcbiAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSA8VGFzaz5tZ0NvbnRyb2wuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgIGxldCBjYW5jZWxXYXNSYWlzZWQ6IGJvb2xlYW4gPSBjdXJyVGFzay5jYW5jZWxXYXNSYWlzZWQoKTtcclxuXHJcbiAgICAvLyBpZiAobWdDb250cm9sLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQikge1xyXG4gICAgLy8gICBpZiAoIW1nQ29udHJvbC5pc01vZGlmaWFibGUoKSB8fCAhbWdDb250cm9sLklzUGFya2FibGUoKSkge1xyXG4gICAgLy8gICAgIG1nQ29udHJvbC5yZXN0b3JlT2xkVmFsdWUoKTtcclxuICAgIC8vICAgICBsZXQgbGFzdEZvY3VzZWRDb250cm9sOiBNZ0NvbnRyb2wgPSBHVUlNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgLy8gICAgIGlmIChsYXN0Rm9jdXNlZENvbnRyb2wgIT09IG51bGwpXHJcbiAgICAvLyAgICAgICBNYW5hZ2VyLlNldEZvY3VzKGxhc3RGb2N1c2VkQ29udHJvbCwgLTEpO1xyXG4gICAgLy8gICAgIHJldHVybjtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIHdoZW4gYSBwdXNoIGJ1dHRvbiBpcyBhYm91dCB0byByYWlzZSBhICdDYW5jZWwnIG9yIGEgJ1F1aXQnIGV2ZW50LiB3ZSBkbyBub3Qgd2FudCB0byBzZXQgdGhlIG5ldyB2YWx1ZSB0byB0aGUgZmllbGQuXHJcbiAgICAvLyBUaGF0IHNldHRpbmcgbWlnaHQgY2F1c2UgYSByZWMgc3VmZml4IGFuZCBhIHZhcmlhYmxlIGNoYW5nZS5cclxuICAgIGlmIChtZ0NvbnRyb2wuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKSB7XHJcbiAgICAgIGxldCBhUnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQobWdDb250cm9sKTtcclxuICAgICAgbGV0IHJhaXNlQXQ6IFJhaXNlQXQgPSA8UmFpc2VBdD4oYXdhaXQgKG1nQ29udHJvbC5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JBSVNFX0FUKSkuZ2V0VmFsdWVJbnQoKSk7XHJcbiAgICAgIGlmIChhUnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIChhUnRFdnQuSW50ZXJuYWxFdmVudCA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBTkNFTCB8fCBhUnRFdnQuSW50ZXJuYWxFdmVudCA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1FVSVQpKSB7XHJcbiAgICAgICAgaWYgKHJhaXNlQXQgPT09IFJhaXNlQXQuVGFza0luRm9jdXMpXHJcbiAgICAgICAgICBjdXJyVGFzayA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuICAgICAgICBjYW5jZWxXYXNSYWlzZWQgPSBjdXJyVGFzay5jYW5jZWxXYXNSYWlzZWQoKTtcclxuICAgICAgICBjdXJyVGFzay5zZXRDYW5jZWxXYXNSYWlzZWQodHJ1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyYWlzZUF0ID09PSBSYWlzZUF0LlRhc2tJbkZvY3VzKVxyXG4gICAgICAgIG1nQ29udHJvbC5zZXRSdEV2dFRhc2soTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmaXJzdCB3ZSBoYW5kbGUgZm9jdXNcclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlRm9jdXMobWdDb250cm9sLCBsaW5lLCBwcm9kdWNlQ2xpY2spO1xyXG5cclxuICAgIGN1cnJUYXNrLnNldENhbmNlbFdhc1JhaXNlZChjYW5jZWxXYXNSYWlzZWQpO1xyXG5cclxuICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgLy8gUUNSIyA5NzQwNDcgOiBJZiB3ZSBoYXZlIGEgUHVzaCBCdXR0b24gd2l0aCBBbGxvdyBQYXJraW5nID0gTm8gYW5kIGZpZWxkIGlzIGF0dGFjaGVkIHRvIGl0LCBkb24ndCBoYW5kbGUgdGhlIGV2ZW50LlxyXG4gICAgLy8gVGhpcyBpcyBzYW1lIGFzIG9ubGluZS4gSW4gb25saW5lLCBpZiBmaWVsZCBpcyBub3QgYXR0YWNoZWQgdG8gbm9uIHBhcmthYmxlIHB1c2ggQnV0dG9uLCB3ZSBoYW5kbGUgdGhlIGV2ZW50XHJcbiAgICAvLyBCdXQgaWYgZmllbGQgaXMgYXR0YWNoZWQgdG8gaXQsIHdlIGRvbid0IGhhbmRsZSBldmVudC5cclxuICAgIC8vIFNvIGlmIGNvbnRyb2wgaXMgcHVzaCBidXR0b24sIGV4ZWN1dGUgaGFuZGxlRXZlbnQgb25seSB3aGVuIGZpZWxkIGlzIG5vdCBhdHRhY2hlZCBvciBQYXJrb25DTGljayBpcyBObyBvclxyXG4gICAgLy8gUGFya29uQ0xpY2sgYW5kIGFsbG93cGFya2luZyBpcyBib3RoIFllc1xyXG4gICAgbGV0IGNvbnRyb2xJc1BhcmthYmxlOiBib29sZWFuID0gYXdhaXQgbWdDb250cm9sLklzUGFya2FibGUoKTtcclxuICAgIGlmIChtZ0NvbnRyb2wuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OIHx8IChtZ0NvbnRyb2wuZ2V0RmllbGQoKSA9PT0gbnVsbCB8fCBjb250cm9sSXNQYXJrYWJsZSkpIHtcclxuXHJcbiAgICAgIC8vIFFDUiAjMzAxNjUyLiBGb3Igbm9uLXBhcmthYmxlIGJ1dHRvbiBjb250cm9sIHdpdGggZXZlbnQgcmFpc2VkIGF0IHRoZSBjb250YWluZXIgdGFzayB3aWxsIGJlIGNoYW5nZWQgc29cclxuICAgICAgLy8gd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQgdGhlbiB0aGUgdGFzayB3aWxsIGdldCBmb2N1cy4gKGFzIGluIE9ubGluZSBhbmQgYXMgaWYgdGhlIGJ1dHRvbiB3YXMgcGFya2FibGUpLlxyXG4gICAgICAvLyBUaGUgZm9jdXMgd2lsbCBiZSBvbiB0aGUgZmlyc3QgY29udHJvbC5cclxuICAgICAgaWYgKG1nQ29udHJvbC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04gJiYgIWNvbnRyb2xJc1BhcmthYmxlKSB7XHJcbiAgICAgICAgbGV0IHN1YmZvcm1UYXNrOiBUYXNrID0gPFRhc2s+bWdDb250cm9sLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICAgICAgaWYgKHN1YmZvcm1UYXNrLklzU3ViRm9ybSkge1xyXG4gICAgICAgICAgY3VyclRhc2sgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcbiAgICAgICAgICAvLyBEZWZlY3QgMTE1NDc0LiBGb3IgdGhlIHNhbWUgdGFzayBkbyBub3QgbW92ZSB0byB0aGUgZmlyc3QgY29udHJvbC5cclxuICAgICAgICAgIGlmIChzdWJmb3JtVGFzayAhPT0gY3VyclRhc2sgJiYgc3ViZm9ybVRhc2sucGF0aENvbnRhaW5zKGN1cnJUYXNrKSkge1xyXG5cclxuICAgICAgICAgICAgaWYgKHN1YmZvcm1UYXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spIHsgLy8gVE9ETzogQ2hlY2sgaWYgdGhpcyBjb2RlIGNhbiBiZSBtb3ZlZCB0byBIYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKClcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhzdWJmb3JtVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyhzdWJmb3JtVGFzayk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgLy8gdGhlbiBBQ1RfSElUIGlzIHNlbnRcclxuICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KG1nQ29udHJvbCk7XHJcbiAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5DdXJyZW50Q2xpY2tlZEN0cmwgPSBtZ0NvbnRyb2w7XHJcbiAgICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX0hJVCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFuZCBzZWxlY3Rpb24gaXMgaGFuZGxlZCBpbiB0aGUgZW5kIGlmIHByZXZpb3VzIGFjdGlvbnMgc3VjY2VlZGVkXHJcbiAgICBpZiAobWdDb250cm9sLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTilcclxuICAgIC8vIGZvciBidXR0b25cXGNoZWNrIHdlIGRvIG5vdCBjYWxsIHRoaXMgdG8gcHJldmVudCByZWN1cnNpb25cclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVTZWxlY3Rpb24obWdDb250cm9sLCBsaW5lLCB2YWwpO1xyXG5cclxuICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICByZXR1cm47XHJcbiAgICAvLyB0aGVuIG1vdXNlIHVwXHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZU1vdXNlVXAobWdDb250cm9sLCBsaW5lLCBwcm9kdWNlQ2xpY2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBhY3RpdmF0ZSBoYW5kbGVJbnRlcm5hbEV2ZW50IHdpdGggaXNRdWl0ID0gZmFsc2U8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXRhc2tcIj5hIHJlZmVyZW5jZSB0byB0aGUgdGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXZlbnRDb2RlXCI+dGhlIGNvZGUgb2YgdGhlIGV2ZW50PC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2soaXRhc2s6IElUYXNrLCBldmVudENvZGU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRTdWJmb3JtUmVmcmVzaChpdGFzaywgZXZlbnRDb2RlLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWN0aXZhdGUgaGFuZGxlSW50ZXJuYWxFdmVudCB3aXRoIGlzUXVpdCA9IGZhbHNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIml0YXNrXCI+YSByZWZlcmVuY2UgdG8gdGhlIHRhc2sgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2ZW50Q29kZVwiPnRoZSBjb2RlIG9mIHRoZSBldmVudCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1YmZvcm1SZWZyZXNoXCI+aWRlbnRpZmllciBpZiB0aGUgZXZlbnQgY2FsbGVkIGJ5IHN1YmZvcm0gcmVmcmVzaDwvcGFyYW0+XHJcbiAgYXN5bmMgaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kU3ViZm9ybVJlZnJlc2goaXRhc2s6IElUYXNrLCBldmVudENvZGU6IG51bWJlciwgc3ViZm9ybVJlZnJlc2g6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+aXRhc2s7XHJcblxyXG4gICAgLy8gc2V0IFN1YmZvcm1FeGVjTW9kZSAoZm9yIFN1YmZvcm1FeGVjTW9kZSBmdW5jdGlvbikgb25seSBpbiByZWNvcmQgcHJlZml4LlxyXG4gICAgLy8gU3ViZm9ybUV4ZWNNb2RlIGlzIGNoYW5nZWQgaW4gcmVjb3JkIHByZWZpeCBhbmQgaXQgaXMgdGhlIHNhbWUgdW50aWwgdGhlXHJcbiAgICAvLyBuZXh0IHJlY29yZCBwcmVmaXggZXhlY3V0aW9uLCBiZWNhdXNlIHdlIGRvIG5vdCBvcGVuIGEgc3ViZm9ybSB0YXNrIGVhY2ggdGltZVxyXG4gICAgLy8gaW4gUkMgYXMgaXQgaXMgaW4gT25saW5lLiBCdXQgd2hlbiB0aGUgc3ViZm9ybSBpcyByZWZyZXNoZWQgZnJvbSB0aGUgcGFyZW50XHJcbiAgICAvLyBpdHMgcmVjb3JkIHByZWZpeCAmIHN1ZmZpeCBhcmUgYWxzbyBleGVjdXRlZC5cclxuICAgIGlmIChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYICYmIHRhc2suSXNTdWJGb3JtICYmIHRhc2suU3ViZm9ybUV4ZWNNb2RlICE9PSBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uRklSU1RfVElNRSkvLyBGSVJTVF9USU1FIGlzIHNldCBvbmx5IG9uY2UgaW5cclxuICAgIC8vIGRvRmlyc3RSZWNvcmRDeWNsZS5cclxuICAgIHtcclxuICAgICAgdGFzay5TdWJmb3JtRXhlY01vZGUgPSAoc3ViZm9ybVJlZnJlc2ggPyBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uUkVGUkVTSCA6IFRhc2tfU3ViZm9ybUV4ZWNNb2RlRW51bS5TRVRfRk9DVVMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZvciB0aGUgc3ViZm9ybSByZWZyZXNoIGl0IGlzIG5lZWRlZCB0byBleGVjdXRlIE1HX0FDVF9QT1NUX1JFRlJFU0hfQllfUEFSRU5UIGhhbmRsZXIgYmVmb3JlIFJFQ09SRF9QUkVGSVggaGFuZGxlclxyXG4gICAgaWYgKHN1YmZvcm1SZWZyZXNoKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhpdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1BPU1RfUkVGUkVTSF9CWV9QQVJFTlQpO1xyXG5cclxuICAgIGlmICh0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKSB7XHJcbiAgICAgIGlmIChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYIHx8IGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpIHtcclxuICAgICAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWClcclxuICAgICAgICAgIGF3YWl0IHRhc2suZW1wdHlEYXRhdmlld09wZW4oc3ViZm9ybVJlZnJlc2gpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRhc2suZW1wdHlEYXRhdmlld0Nsb3NlKCk7XHJcblxyXG4gICAgICAgIGlmICh0YXNrLmdldEZvcm0oKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgaWYgKGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpXHJcbiAgICAgICAgICAgIGF3YWl0ICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgIHRhc2suZ2V0Rm9ybSgpLlNlbGVjdFJvdygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRFdmVudFN1YnR5cGUodGFzaywgZXZlbnRDb2RlLCBFdmVudFN1YlR5cGUuTm9ybWFsKTtcclxuICAgIH0gZWxzZVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZEV2ZW50U3VidHlwZSh0YXNrLCBldmVudENvZGUsIEV2ZW50U3ViVHlwZS5Ob3JtYWwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFjdGl2YXRlIGhhbmRsZUludGVybmFsRXZlbnQgd2l0aCBpc1F1aXQgPSBmYWxzZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+YSByZWZlcmVuY2UgdG8gdGhlIGNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2ZW50Q29kZVwiPnRoZSBjb2RlIG9mIHRoZSBldmVudCA8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShjdHJsOiBNZ0NvbnRyb2xCYXNlLCBldmVudENvZGU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbCg8TWdDb250cm9sPmN0cmwsIGV2ZW50Q29kZSwgRXZlbnRTdWJUeXBlLk5vcm1hbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgXCJzdG9wIGV4ZWN1dGlvblwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEdldFN0b3BFeGVjdXRpb25GbGFnKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0b3BFeGVjdXRpb247XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBjdHJsIG9uIHdoaWNoIHdlIGhhZCBhIFwic3RvcCBleGVjdXRpb25cIlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRTdG9wRXhlY3V0aW9uQ3RybCgpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLl9zdG9wRXhlY3V0aW9uQ3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbml0aWFsaXplcyB0aGUgc3RhdGljIHNlY3Rpb24gb2YgdGhlIGV2ZW50cyBtYW5hZ2VyLiBVc3VhbGx5IGRvZXMgbm90aGluZyBidXQgaW4gdGhlXHJcbiAgLy8vICAgZXZlbnQgb2YgYXBwbGV0IHJlLWxvYWQgKGZvciBleGFtcGxlLCBiZWNhdXNlIG9mIGEgYnJvd3NlciByZWZyZXNoKSBpdCBpbml0aWFsaXplcyB0aGVcclxuICAvLy8gICBzdGF0aWMgcGFydCBvZiB0aGlzIGNsYXNzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX2ZvcmNlRXhpdCA9IEZvcmNlRXhpdC5Ob25lO1xyXG4gICAgICB0aGlzLl9mb3JjZUV4aXRUYXNrID0gbnVsbDtcclxuICAgICAgdGhpcy5fY3VyckZpZWxkID0gbnVsbDtcclxuICAgICAgdGhpcy5zZXRFbmRPZldvcmsodHJ1ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQWRkIGludGVybmFsIGV2ZW50IHRvIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpdGFza1wiPnRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQ8L3BhcmFtPlxyXG4gIGFkZEludGVybmFsRXZlbnRXaXRoSXRhc2tBbmRDb2RlKGl0YXNrOiBJVGFzaywgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aFRhc2tBbmRDb2RlQW5kT25NdWx0aU1hcmsoaXRhc2ssIGNvZGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kQ29kZShjdHJsOiBNZ0NvbnRyb2xCYXNlLCBjb2RlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCg8TWdDb250cm9sPmN0cmwpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhZGRJbnRlcm5hbEV2ZW50V2l0aEN0cmxBbmREaXNwbGF5TGluZUFuZENvZGUoY3RybDogTWdDb250cm9sQmFzZSwgRGlzcGxheUxpbmU6IG51bWJlciwgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPE1nQ29udHJvbD5jdHJsLCBEaXNwbGF5TGluZSwgZmFsc2UpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcmlvcml0eVwiPjwvcGFyYW0+XHJcbiAgYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kQ29kZUFuZFByaW9yaXR5KGN0cmw6IE1nQ29udHJvbEJhc2UsIGNvZGU6IG51bWJlciwgcHJpb3JpdHk6IFByaW9yaXR5KTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPE1nQ29udHJvbD5jdHJsKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgcnRFdnQuc2V0UHJpb3JpdHkocHJpb3JpdHkpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBhZGQgZ3VpIHRyaWdnZXJlZCBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9uTXVsdGlNYXJrXCI+PC9wYXJhbT5cclxuICBhZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhUYXNrQW5kQ29kZUFuZE9uTXVsdGlNYXJrKGl0YXNrOiBJVGFzaywgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPml0YXNrO1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KHRhc2spO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHdpbGwgYmUgdXNlZCBmb3IgbXVsdGltYXJraW5nIGluIHRoZSBmdXR1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vZGlmaWVyc1wiPjwvcGFyYW0+XHJcbiAgYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoQ3RybEFuZENvZGVBbmRMaW5lQW5kTW9kaWZpZXIoY3RybDogTWdDb250cm9sQmFzZSwgY29kZTogbnVtYmVyLCBsaW5lOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCg8TWdDb250cm9sPmN0cmwsIGxpbmUsIGZhbHNlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEFkZCBpbnRlcm5hbCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgR1VJIHF1ZXVlIChpbmNsdWRlcyB0aW1lciBldmVudHMpIHRvIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+Y29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5saW5lIGluIGEgdGFibGUgY29udHJvbCA8L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aFRhc2tBbmRDb2RlQW5kTGluZSh0YXNrOiBUYXNrLCBjb2RlOiBudW1iZXIsIGxpbmU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHRzazogVGFzayA9IG51bGw7XHJcbiAgICBpZiAodGFzayAhPT0gbnVsbClcclxuICAgICAgdHNrID0gPFRhc2s+dGFzaztcclxuXHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQodHNrKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgcnRFdnQuRGlzcGxheUxpbmUgPSBsaW5lO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBoYW5kbGUgQ29sdW1uIENsaWNrIGV2ZW50IG9uIENvbHVtbiA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpQ29sdW1uQ3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGlyZWN0aW9uXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb2x1bW5IZWFkZXJcIj48L3BhcmFtPlxyXG4gIEFkZENvbHVtbkNsaWNrRXZlbnQoY29sdW1uQ3RybDogTWdDb250cm9sQmFzZSwgZGlyZWN0aW9uOiBudW1iZXIsIGNvbHVtbkhlYWRlcjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPE1nQ29udHJvbD5jb2x1bW5DdHJsLCBkaXJlY3Rpb24sIDApO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPTF9DTElDSyk7XHJcblxyXG4gICAgLy8gUHJlcGFyZSBhbiBhcmd1bWVudCBsaXN0IHdpdGggYXJndW1lbnQgYXMgY29sdW1uSGVhZGVyU3RyaW5nLlxyXG4gICAgbGV0IGFyZ3NMaXN0ID0gbmV3IEFycmF5PEV4cFZhbD4oKTtcclxuICAgIGFyZ3NMaXN0WzBdID0gbmV3IEV4cFZhbChTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUsIGZhbHNlLCBjb2x1bW5IZWFkZXIpO1xyXG4gICAgbGV0IGFyZ3MgPSBuZXcgQXJndW1lbnRzTGlzdChhcmdzTGlzdCk7XHJcbiAgICBydEV2dC5zZXRBcmdMaXN0KGFyZ3MpO1xyXG5cclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIEFkZFJvdXRlRXZlbnQodGFzazogSVRhc2ssIGNvZGU6IG51bWJlciwgcm91dGVycGF0aDogc3RyaW5nLCByb3V0ZXJPdXRsZXROYW1lOiBzdHJpbmcsIHJvdXRlUGFyYW1zOiBMaXN0PGFueT4pIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCg8VGFzaz50YXNrLCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG5cclxuICAgIGxldCBhcmdzTGlzdDogRXhwVmFsW10gPSBuZXcgQXJyYXk8RXhwVmFsPigyKTtcclxuICAgIGFyZ3NMaXN0WzBdID0gbmV3IEV4cFZhbChTdG9yYWdlQXR0cmlidXRlLkFMUEhBLCBmYWxzZSwgcm91dGVycGF0aCk7XHJcbiAgICBpZiAocm91dGVyT3V0bGV0TmFtZSA9PT0gbnVsbClcclxuICAgICAgcm91dGVyT3V0bGV0TmFtZSA9ICcnO1xyXG4gICAgYXJnc0xpc3RbMV0gPSBuZXcgRXhwVmFsKFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEsIGZhbHNlLCByb3V0ZXJPdXRsZXROYW1lKTtcclxuXHJcbiAgICBsZXQgYXJncyA9IG5ldyBBcmd1bWVudHNMaXN0KGFyZ3NMaXN0KTtcclxuICAgIHJ0RXZ0LnNldEFyZ0xpc3QoYXJncyk7XHJcbiAgICBydEV2dC5zZXRSb3V0ZVBhcmFtTGlzdChyb3V0ZVBhcmFtcyk7XHJcblxyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgQWRkUm91dGVyQ2xvc2VkRXZlbnQodGFzazogVGFzaykge1xyXG4gICAgbGV0IHN1YkZvcm1Db250cm9sOiBNZ0NvbnRyb2xCYXNlID0gPE1nQ29udHJvbEJhc2U+dGFzay5nZXRGb3JtKCkuZ2V0U3ViRm9ybUN0cmwoKTtcclxuICAgIGxldCBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoPFRhc2tCYXNlPnN1YkZvcm1Db250cm9sLmdldEZvcm0oKS5nZXRUYXNrKCksIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NVQkZPUk1fQ0xPU0UpO1xyXG5cclxuICAgIGxldCBhcmdzTGlzdDogRXhwVmFsW10gPSBuZXcgQXJyYXk8RXhwVmFsPigxKTtcclxuICAgIGFyZ3NMaXN0WzBdID0gbmV3IEV4cFZhbChTdG9yYWdlQXR0cmlidXRlLkFMUEhBLCBmYWxzZSwgc3ViRm9ybUNvbnRyb2wuZ2V0TmFtZSgpKTtcclxuXHJcbiAgICBsZXQgYXJncyA9IG5ldyBBcmd1bWVudHNMaXN0KGFyZ3NMaXN0KTtcclxuICAgIHJ0RXZ0LnNldEFyZ0xpc3QoYXJncyk7XHJcbiAgICBFdmVudHNNYW5hZ2VyLkluc3RhbmNlLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGFkZCBsYXN0IHNhdmVkIHJvdXRlIGV2ZW50IDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzcmNUYXNrU3RyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJhcmdMaXN0U3RyXCI+PC9wYXJhbT5cclxuICBBZGRMYXN0U2F2ZWRSb3V0ZUV2ZW50KHNyY1Rhc2s6IFRhc2ssIGFyZ3M6IEFyZ3VtZW50c0xpc3QpIHtcclxuICAgIGxldCBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoPFRhc2tCYXNlPkxhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSwgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCQ0xJRU5UX1JPVVRFKTtcclxuXHJcbiAgICBpZiAoc3JjVGFzayAhPSBudWxsKSB7XHJcbiAgICAgIHJ0RXZ0LnNldFRhc2soc3JjVGFzayk7XHJcbiAgICAgIGlmIChhcmdzICE9IG51bGwpIHtcclxuICAgICAgICBydEV2dC5zZXRBcmdMaXN0KGFyZ3MpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2V0TGFzdFNhdmVkUm91dGVFdmVudChydEV2dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICBBZGQgaW50ZXJuYWwgZXZlbnQgcm8gc2V0IHRoZSB2YWx1ZSBvZiBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj4gY29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsdWVcIj4gdmFsdWUgb2YgY29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVmcmVzaERpc3BsYXlcIj4gcmVmcmVzaCBkaXNwbGF5IDwvcGFyYW0+XHJcbiAgQWRkRXh0ZXJuYWxWYWx1ZUV2ZW50KGN0cmw6IE1nQ29udHJvbCwgdmFsdWU6IGFueSwgcmVmcmVzaERpc3BsYXk6IGJvb2xlYW4pIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsLCAwLCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRVRfRVhURVJOQUxfVkFMVUUpO1xyXG4gICAgcnRFdnQuc2V0VmFsdWUodmFsdWUpO1xyXG5cclxuICAgIGxldCBhcmdzTGlzdDogRXhwVmFsW10gPSBuZXcgQXJyYXk8RXhwVmFsPigxKTtcclxuICAgIGFyZ3NMaXN0WzBdID0gbmV3IEV4cFZhbChTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU4sIGZhbHNlLCByZWZyZXNoRGlzcGxheSA/ICcxJyA6ICcwJyk7XHJcbiAgICBsZXQgYXJncyA9IG5ldyBBcmd1bWVudHNMaXN0KGFyZ3NMaXN0KTtcclxuICAgIHJ0RXZ0LnNldEFyZ0xpc3QoYXJncyk7XHJcblxyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEFkZCBpbnRlcm5hbCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgR1VJIHF1ZXVlIChpbmNsdWRlcyB0aW1lciBldmVudHMpIHRvIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5saW5lIGluIGEgdGFibGUgY29udHJvbCA8L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aEN0cmxBbmRDb2RlQW5kTGluZShjdHJsOiBNZ0NvbnRyb2xCYXNlLCBjb2RlOiBudW1iZXIsIGxpbmU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwsIGxpbmUsIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQWRkIGludGVybmFsIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSBHVUkgcXVldWUgKGluY2x1ZGVzIHRpbWVyIGV2ZW50cykgdG8gdGhlIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+dGhlIGxpbmUgZm9yIG11bHRpbGluZSBjb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+Y29kZSBvZiBpbnRlcm5hbCBldmVudCA8L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aEN0cmxBbmRMaW5lQW5kQ29kZUFuZElzUHJvZHVjdENsaWNrKGN0cmw6IE1nQ29udHJvbEJhc2UsIGNvZGU6IG51bWJlciwgbGluZTogbnVtYmVyLCBpc1Byb2R1Y2VDbGljazogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwsIGxpbmUsIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICBydEV2dC5zZXRQcm9kdWNlQ2xpY2soaXNQcm9kdWNlQ2xpY2spO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEFkZCBpbnRlcm5hbCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgR1VJIHF1ZXVlIChpbmNsdWRlcyB0aW1lciBldmVudHMpIHRvIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpc3RcIj48L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aEN0cmxBbmRDb2RlQW5kTGlzdChjdHJsOiBNZ0NvbnRyb2xCYXNlLCBjb2RlOiBudW1iZXIsIGxpc3Q6IExpc3Q8TWdDb250cm9sQmFzZT4pOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsLCBsaXN0LCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBBZGQgaW50ZXJuYWwgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IEdVSSBxdWV1ZSB0byB0aGUgcXVldWUgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPnJlZmVyZW5jZSB0byB0aGUgdGFzayA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQgPC9wYXJhbT5cclxuICBhZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhUYXNrQW5kQ29kZSh0YXNrOiBJVGFzaywgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPFRhc2s+dGFzaywgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQWRkIGludGVybmFsIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSBHVUkgcXVldWUgdG8gdGhlIHF1ZXVlIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyYWlzZWRCeVwiPnJlbGV2YW50IG9ubHkgZm9yIG9ubGluZSAoZm9yIHdoaWNoIHN1YmZvcm0gYXJlIGhhbmRsZWQgYXMgb3JwaGFucyk8L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50VGFza0FuZENvZGVBbmRSYWlzZWRCeSh0YXNrOiBJVGFzaywgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aFRhc2tBbmRDb2RlKHRhc2ssIGNvZGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGZpcnN0IGV2ZW50IGZyb20gdGhlIHF1ZXVlIGFuZCByZW1vdmUgaXQgZnJvbSB0aGVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRFdmVudCgpOiBSdW5UaW1lRXZlbnQge1xyXG4gICAgcmV0dXJuIDxSdW5UaW1lRXZlbnQ+dGhpcy5fZXZlbnRzUXVldWUucG9sbCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9yY2VFeGl0KCk6IEZvcmNlRXhpdCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZm9yY2VFeGl0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRGb3JjZUV4aXQoZm9yY2VFeGl0OiBGb3JjZUV4aXQsIHRhc2s6IFRhc2spOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZvcmNlRXhpdCA9IGZvcmNlRXhpdDtcclxuICAgIHRoaXMuc2V0Rm9yY2VFeGl0VGFzayh0YXNrKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Rm9yY2VFeGl0VGFzaygpOiBUYXNrIHtcclxuICAgIHJldHVybiB0aGlzLl9mb3JjZUV4aXRUYXNrO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRGb3JjZUV4aXRUYXNrKHRhc2s6IFRhc2spOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZvcmNlRXhpdFRhc2sgPSB0YXNrO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogcmV0dXJucyB0cnVlIGlmIHRoZSBFdmVudHNNYW5hZ2VyIGlzIGN1cnJlbnRseSBoYW5kbGluZyBhIHVzZXIgZXZlbnQgd2l0aFxyXG4gICAqIEZvcmNlIEV4aXQgPSAnUHJlLVJlY29yZCBVcGRhdGUnXHJcbiAgICovXHJcbiAgaXNGb3JjZUV4aXRQcmVSZWNvcmRVcGRhdGUodGFzazogVGFza0Jhc2UpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ICYmIHRoaXMuZ2V0Rm9yY2VFeGl0KCkgPT09IEZvcmNlRXhpdC5QcmVSZWNvcmRVcGRhdGUgJiYgdGFzayA9PT0gdGhpcy5nZXRGb3JjZUV4aXRUYXNrKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEV4ZWN1dGUgQ2xpZW50Q29udGV4dEluYWN0aXZpdHkgVGltZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIEV4ZWN1dGVDbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHN0YXJ0VGltZSA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk7XHJcblxyXG4gICAgLy8gY29udmVydCB0ZW50aHMgb2Ygc2Vjb25kcyB0byBtaWxsaXNlY29uZHMuXHJcbiAgICBsZXQgY2xpZW50Q3R4SW5hY3Rpdml0eVRpbWVvdXQgPVxyXG4gICAgICBFbnZpcm9ubWVudC5JbnN0YW5jZS5nZXRDbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQoKSAqIDEwMDtcclxuXHJcbiAgICBFdmVudHNNYW5hZ2VyLmNsaWVudEluYWN0aXZpdHlUaW1lck9OID0gdHJ1ZTtcclxuICAgIHdoaWxlIChFdmVudHNNYW5hZ2VyLmNsaWVudEluYWN0aXZpdHlUaW1lck9OKSB7XHJcbiAgICAgIGF3YWl0IFRocmVhZC5TbGVlcCgxMDAwKTtcclxuICAgICAgdmFyIHRpbWVMYXBzZWQgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpIC0gc3RhcnRUaW1lO1xyXG4gICAgICBpZiAoRXZlbnRzTWFuYWdlci5jbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyQWJvcnRlZCB8fCB0aW1lTGFwc2VkID49IGNsaWVudEN0eEluYWN0aXZpdHlUaW1lb3V0KSB7XHJcbiAgICAgICAgRXZlbnRzTWFuYWdlci5jbGllbnRJbmFjdGl2aXR5VGltZXJPTiA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTaG93IG9yIGhpZGUgdGhlIHNwaW5uZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic2hvd1wiPiA8L3BhcmFtPlxyXG4gIGFzeW5jIENoZWNrQW5kU2hvd1NwaW5uZXIoc2hvdzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHNlbmRDb21tYW5kID0gZmFsc2U7XHJcblxyXG4gICAgLy8gSWYgdGhlIGN1cnJlbnQgZXZlbnQgaXMgb2YgbG93ZXN0IHByaW9yaXR5LCBpdCBpcyBhY3R1YWxseSBzYWZlIHRvIG9wZW4gdXNlciBpbnRlcmFjdGlvbi5cclxuICAgIC8vIFNvLCBzdG9wIHRoZSBzcGlubmVyLlxyXG4gICAgaWYgKHRoaXMuZ2V0TGFzdFJ0RXZlbnQoKSAhPT0gbnVsbCAmJiB0aGlzLmdldExhc3RSdEV2ZW50KCkuZ2V0UHJpb3JpdHkoKSA9PT0gUHJpb3JpdHkuTE9XRVNUKVxyXG4gICAgICBzaG93ID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHNob3cgIT0gdGhpcy5pc1NwaW5uZXJTaG93bikge1xyXG4gICAgICBpZiAoc2hvdykge1xyXG4gICAgICAgIC8vIFNob3cgdGhlIHNwaW5uZXIgb25seSBpZiB0aHJlc2hvbGQgaXMgcmVhY2hlZC5cclxuICAgICAgICAvL1RvRG86IERlZmluZSBhIGNvbnN0IGZvciAxMDAwLiBBbHNvIG1ha2UgaXQgY3VzdG9taXphYmxlIGZyb20gYW5ndWxhciBhcHBcclxuICAgICAgICBpZiAoTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKSAtIHRoaXMuR2V0RXZlbnRUaW1lKCkgPiAxMDAwKSB7XHJcbiAgICAgICAgICBzZW5kQ29tbWFuZCA9IHRydWU7XHJcbiAgICAgICAgICBFdmVudHNNYW5hZ2VyLmNsaWVudEJ1c3lUaW1lU3RhcnQgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgc2VuZENvbW1hbmQgPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKHNlbmRDb21tYW5kKSB7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkU2hvd1NwaW5uZXIoc2hvdyk7XHJcbiAgICAgICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuICAgICAgICAvLyByZWxlYXNlIHRoZSB0aHJlYWQgc28gdGhhdCBmcmFtZXdvcmsgY2FuIHNob3cvaGlkZSB0aGUgc3Bpbm5lclxyXG4gICAgICAgIGF3YWl0IFRocmVhZC5TbGVlcCg1MCk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNTcGlubmVyU2hvd24gPSBzaG93O1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaXNTcGlubmVyU2hvd24pIHtcclxuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgdGltZSBmb3Igd2hpY2ggY2xpZW50IHdhcyBidXN5XHJcbiAgICAgICAgICBsZXQgdG90YWxDbGllbnRCdXN5VGltZSA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgLSBFdmVudHNNYW5hZ2VyLmNsaWVudEJ1c3lUaW1lU3RhcnQ7XHJcbiAgICAgICAgICB0aGlzLlNwaW5uZXJTdG9wcGVkLm5leHQodG90YWxDbGllbnRCdXN5VGltZSk7XHJcbiAgICAgICAgICBFdmVudHNNYW5hZ2VyLmNsaWVudEJ1c3lUaW1lU3RhcnQgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIE1haW4gZXZlbnRzIGxvb3AsIHJ1bnMgaW4gd29ya2VyIHRocmVhZCBmb3IgbWFpbiB3aW5kb3cgYW5kIGZvciBldmVyeVxyXG4gIC8vLyAgIG1vZGFsIHdpbmRvdyBSZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgZXZlbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nRGF0YVwiPiA8L3BhcmFtPlxyXG4gIGFzeW5jIEV2ZW50c0xvb3AobWdEYXRhOiBNR0RhdGEpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzYXZlZEFsbG93RXZlbnRzOiBFdmVudHNBbGxvd2VkVHlwZSA9IHRoaXMuZ2V0QWxsb3dFdmVudHMoKTtcclxuXHJcbiAgICB0aGlzLnNldEFsbG93RXZlbnRzKEV2ZW50c0FsbG93ZWRUeXBlLkFMTCk7XHJcblxyXG4gICAgdGhpcy5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG5cclxuICAgIHdoaWxlICghbWdEYXRhLklzQWJvcnRpbmcpIHtcclxuICAgICAgLy8gSGlkZSB0aGUgc3Bpbm5lciBiZWZvcmUgbW92aW5nIHRvIGlkbGVcclxuICAgICAgYXdhaXQgdGhpcy5DaGVja0FuZFNob3dTcGlubmVyKGZhbHNlKTtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuX2V2ZW50c1F1ZXVlLndhaXRGb3JFbGVtZW50KCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnRzKG1nRGF0YSwgMCk7XHJcblxyXG4gICAgICBpZiAoIW1nRGF0YS5Jc0Fib3J0aW5nKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tQYXJrYWJpbGl0eSgpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgIHRoaXMuc2V0QWxsb3dFdmVudHMoc2F2ZWRBbGxvd0V2ZW50cyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgTm9uIGludGVyYWN0aXZlIGV2ZW50cyBsb29wLCBydW5zIGluIHdvcmtlciB0aHJlYWQgZm9yIG5vbiBpbnRlcmFjdGl2ZSB0YXNrc1xyXG4gIC8vLyAgIFJlc3BvbnNpYmxlIGZvciBjeWNsaW5nIGZvcndhcmQgb24gcmVjb3JkcyBhbmQgaGFuZGxpbmcgZXZlbnRzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ0RhdGFcIj48L3BhcmFtPlxyXG4gIGFzeW5jIE5vbkludGVyYWN0aXZlRXZlbnRzTG9vcChtZ0RhdGE6IE1HRGF0YSwgdGFza0Jhc2U6IFRhc2tCYXNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPnRhc2tCYXNlO1xyXG4gICAgbGV0IHNhdmVkQWxsb3dFdmVudHM6IEV2ZW50c0FsbG93ZWRUeXBlID0gdGhpcy5nZXRBbGxvd0V2ZW50cygpO1xyXG5cclxuICAgIHRoaXMuc2V0Tm9uSW50ZXJhY3RpdmVBbGxvd0V2ZW50cyhhd2FpdCB0YXNrLmlzQWxsb3dFdmVudHMoKSk7XHJcblxyXG4gICAgdGhpcy5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG5cclxuICAgIHdoaWxlICghbWdEYXRhLklzQWJvcnRpbmcpIHtcclxuICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSlcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1lDTEVfTkVYVF9ERUxFVEVfUkVDKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DWUNMRV9ORVhUX1JFQyk7XHJcblxyXG4gICAgICBhd2FpdCBUaHJlYWQuU2xlZXAoMTApO1xyXG5cclxuICAgICAgLy8gcG9sbCBvbmx5IDEgZXZlbnQuXHJcbiAgICAgIGlmICghbWdEYXRhLklzQWJvcnRpbmcgJiYgYXdhaXQgdGFzay5pc0FsbG93RXZlbnRzKCkpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudHMobWdEYXRhLCAxKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgIHRoaXMuc2V0QWxsb3dFdmVudHMoc2F2ZWRBbGxvd0V2ZW50cyk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBoYW5kbGVFdmVudHMoYmFzZU1nRGF0YTogTUdEYXRhLCBldmVudHNUb0hhbmRsZUNudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiA7XHJcbiAgYXN5bmMgaGFuZGxlRXZlbnRzKGhhbmRsZXJzVGFiOiBIYW5kbGVyc1RhYmxlLCBydEV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiA7XHJcbiAgYXN5bmMgaGFuZGxlRXZlbnRzKGJhc2VNZ0RhdGFPckhhbmRsZXJzVGFiOiBhbnksIGV2ZW50c1RvSGFuZGxlQ250T3JSdEV2dDogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoKGJhc2VNZ0RhdGFPckhhbmRsZXJzVGFiID09PSBudWxsIHx8IGJhc2VNZ0RhdGFPckhhbmRsZXJzVGFiIGluc3RhbmNlb2YgTUdEYXRhKSAmJiAoZXZlbnRzVG9IYW5kbGVDbnRPclJ0RXZ0ID09PSBudWxsIHx8IGV2ZW50c1RvSGFuZGxlQ250T3JSdEV2dC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50c18wKGJhc2VNZ0RhdGFPckhhbmRsZXJzVGFiLCBldmVudHNUb0hhbmRsZUNudE9yUnRFdnQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50c18xKGJhc2VNZ0RhdGFPckhhbmRsZXJzVGFiLCBldmVudHNUb0hhbmRsZUNudE9yUnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhbmQgcmVtb3ZlIGV2ZW50cyBmcm9tIHRoZSBxdWV1ZSBhbmQgaGFuZGxlIHRoZW0gb25lIGJ5IG9uZSB0aWxsIHRoZSBxdWV1ZSBpcyBlbXB0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJiYXNlTWdEYXRhXCI+IG1nZGF0YSBvZiB0aGUgd2luZG93IHRoYXQgb3BlbmVkZWQgdGhhdCBoYWJkbGUgZXZlbnQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiRXZlbnRzVG9IYW5kbGVDbnRcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRXZlbnRzXzAoYmFzZU1nRGF0YTogTUdEYXRhLCBldmVudHNUb0hhbmRsZUNudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IG51bGw7XHJcbiAgICBsZXQgZGVsdGE6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZXZlbnRzUG9sbGVkQ250OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcblxyXG4gICAgLy8gZ2V0IGFuZCByZW1vdmUgZXZlbnRzIGZyb20gdGhlIHF1ZXVlIHRpbGwgaXRzIGVtcHR5XHJcbiAgICB3aGlsZSAoIXRoaXMuX2V2ZW50c1F1ZXVlLmlzRW1wdHkoKSAmJiAhdGhpcy5fc3RvcEV4ZWN1dGlvbiAmJiAoZXZlbnRzVG9IYW5kbGVDbnQgPT09IDAgfHwgZXZlbnRzUG9sbGVkQ250IDwgZXZlbnRzVG9IYW5kbGVDbnQpKSB7XHJcbiAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gdGhpcy5nZXRFdmVudCgpO1xyXG4gICAgICBpZiAocnRFdnQgIT09IG51bGwgJiYgcnRFdnQuaXNHdWlUcmlnZ2VyZWRFdmVudCgpKSB7XHJcbiAgICAgICAgZGVsdGEgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpO1xyXG4gICAgICAgIHRoaXMuX2N1cnJLYmRJdGVtID0gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IGJsb2NrZWRCeU1vZGFsV2luZG93OiBib29sZWFuID0gcnRFdnQuaXNCbG9ja2VkQnlNb2RhbFdpbmRvdyhiYXNlTWdEYXRhKTtcclxuICAgICAgICBpZiAoYmxvY2tlZEJ5TW9kYWxXaW5kb3cgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9USU1FUikgLy8gUUNSICM3MjYxOTgsIGV2ZW50cyBmcm9tIC5ORVQgb2JqZWN0cyB3aGljaCBhcmUgbm90IG9uIGZvcm1cclxuICAgICAgICAvLyBzaG91bGQgYmUgaGFuZGxlZCBvbiBwYXJlbnQgb2YgbW9kYWwgd2luZG93IGFsc29cclxuICAgICAgICB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElkbGUgdGltZXIsIHRpbWVyIGV2ZW50cyBhbmQgZW5hYmxlL2Rpc2FibGUgZXZlbnRzIHNob3VsZCBub3QgY2hhbmdlIHRoZSBjdXJyZW50IHdpbmRvdy5cclxuICAgICAgICAvLyBUaGlzIGlzIGJlY2F1c2UgdGhlIGN1cnJlbnQgd2luZG93IGRldGVybWluZXMgdGhlIGN1cnJlbnQgdGFzayBhbmQgY2hhbmdpbmcgdGhlIHRhc2tcclxuICAgICAgICAvLyBjYXVzZXMgc29tZSB0YXNrLXNjb3BlZCBldmVudHMgdG8gcnVuIG9uIHN1Yi10YXNrcyBhcyB3ZWxsLlxyXG4gICAgICAgIGlmICghcnRFdnQuaXNJZGxlVGltZXIoKSAmJiAhYmxvY2tlZEJ5TW9kYWxXaW5kb3cgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FTkFCTEVfRVZFTlRTICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRElTQUJMRV9FVkVOVFMgJiYgcnRFdnQuZ2V0VGFzaygpICE9PSBudWxsICYmICFydEV2dC5nZXRUYXNrKCkuZ2V0TUdEYXRhKCkuSXNBYm9ydGluZykge1xyXG4gICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5jdXJyTWdkSUQgPSBydEV2dC5nZXRUYXNrKCkuZ2V0TUdEYXRhKCkuR2V0SWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGN1cnJNZ2Q6IE1HRGF0YSA9IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0Q3Vyck1HRGF0YSgpO1xyXG4gICAgICBpZiAoY3Vyck1nZCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHdoaWxlIChjdXJyTWdkICE9PSBudWxsICYmIGN1cnJNZ2QuSXNBYm9ydGluZykge1xyXG4gICAgICAgICAgY3Vyck1nZCA9IGN1cnJNZ2QuZ2V0UGFyZW50TUdkYXRhKCk7XHJcbiAgICAgICAgICBpZiAoY3Vyck1nZCAhPT0gbnVsbClcclxuICAgICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5jdXJyTWdkSUQgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldE1nRGF0YUlkeChjdXJyTWdkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLyogUUNScyAjNzc3MjE3ICYgIzk0Mjk2OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAvKiBJdCBtaWdodCBoYXBwZW4gdGhhdCB3ZSBoYXZlIHJlbW92ZWQgdGhlIE1HRGF0YSAgICAqL1xyXG4gICAgICAgIC8qIGZyb20gdGhlIE1HVGFibGUgaW4gTWFuYWdlci5DbG9zZUV2ZW50KCkuICAqL1xyXG4gICAgICAgIC8qIEl0IHdhcyBkb25lIGZvciBmaXhpbmcgUUNSIyAyOTYyNzcgcmVsYXRpbmcgdG8gbWVtICovXHJcbiAgICAgICAgLyogbGVha3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAvKiBJbiB0aGF0IGNhc2UsIG1nZCB3b3VsZCBiZSBudWxsIGhlcmUuICAgICAgICAgICAgICAqL1xyXG4gICAgICAgIC8qIEluIHN1Y2ggYSBzY2VuYXJpbywgdGFrZSB0aGUgcGFyZW50IG1nZCBmcm9tIHRoZSAgICovXHJcbiAgICAgICAgLyogcmVsYXRlZCB0YXNrIGFuZCBjb250aW51ZSBwcm9jZXNzaW5nIHRoZSBldmVudHMuICAgKi9cclxuICAgICAgICB0YXNrID0gPFRhc2s+cnRFdnQuZ2V0VGFzaygpO1xyXG4gICAgICAgIHdoaWxlIChjdXJyTWdkID09PSBudWxsICYmIHRhc2sgIT09IG51bGwgJiYgdGFzay5nZXRQYXJlbnQoKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgdGFzayA9IDxUYXNrPnRhc2suZ2V0UGFyZW50KCk7XHJcbiAgICAgICAgICBjdXJyTWdkID0gdGFzay5nZXRNR0RhdGEoKTtcclxuICAgICAgICAgIGlmIChjdXJyTWdkLklzQWJvcnRpbmcpXHJcbiAgICAgICAgICAgIGN1cnJNZ2QgPSBudWxsO1xyXG5cclxuICAgICAgICAgIGlmIChjdXJyTWdkICE9PSBudWxsKVxyXG4gICAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TWdEYXRhSWR4KGN1cnJNZ2QpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoY3Vyck1nZCA9PT0gbnVsbClcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGlmIChydEV2dC5nZXRUYXNrKCkgPT09IG51bGwpIHtcclxuICAgICAgICB0YXNrID0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG4gICAgICAgIHdoaWxlICh0YXNrICE9PSBudWxsICYmICh0YXNrLmlzQWJvcnRpbmcoKSB8fCB0YXNrLkluRW5kVGFzaykpXHJcbiAgICAgICAgICB0YXNrID0gPFRhc2s+dGFzay5nZXRQYXJlbnQoKTtcclxuXHJcbiAgICAgICAgaWYgKHRhc2sgIT09IG51bGwpIHtcclxuICAgICAgICAgIHJ0RXZ0LnNldEN0cmwoPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCkpO1xyXG4gICAgICAgICAgcnRFdnQuc2V0VGFzayh0YXNrKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICAgIHRhc2sgPSA8VGFzaz5ydEV2dC5nZXRUYXNrKCk7XHJcblxyXG4gICAgICBpZiAodGFzayAhPT0gbnVsbCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgR1VJTWFuYWdlci5JbnN0YW5jZS5leGVjR3VpQ29tbWFuZFF1ZXVlKCk7XHJcbiAgICAgIHRoaXMuX2N1cnJDdHJsID0gbnVsbDsgLy8gZGVsZXRlIGN1cnJlbnQgcHJvY2Vzc2VkIGNvbnRyb2xcclxuXHJcbiAgICAgIGlmICh0YXNrICE9PSBudWxsKVxyXG4gICAgICAgIGF3YWl0IFRhc2suQ29tbWFuZHNQcm9jZXNzb3IuU2VuZE1vbml0b3JPbmx5KCk7XHJcbiAgICAgIGVsc2Uge1xyXG5cclxuICAgICAgICBhd2FpdCBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yLlNlbmRNb25pdG9yT25seSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocnRFdnQgIT09IG51bGwgJiYgcnRFdnQuaXNHdWlUcmlnZ2VyZWRFdmVudCgpKSB7XHJcbiAgICAgICAgLy8gbG9nZ2luZyBmb3IgcGVyZm9ybWFuY2VcclxuICAgICAgICBpZiAoZGVsdGEgPiAwKSB7XHJcbiAgICAgICAgICBkZWx0YSA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgLSBkZWx0YTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGFkdmFuY2UgRXZlbnRzUG9sbGVkIG9ubHkgaWYgdGhlIGV2ZW50IGlzIGludGVybmFsLiBvdGhlcndpc2UgaW50ZXJuYWxzIHRvIGJlIGV4ZWN1dGVkIHdpbGwgYmUgbmV2ZXIgcmVhY2hlZCBieSBub24gaW50ZXJhY3RpdmUgdGFza3MuXHJcbiAgICAgIGlmIChldmVudHNUb0hhbmRsZUNudCA+IDAgJiYgcnRFdnQgIT09IG51bGwgJiYgcnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIHJ0RXZ0LkludGVybmFsRXZlbnQgPCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVE9UX0NOVClcclxuICAgICAgICBldmVudHNQb2xsZWRDbnQrKztcclxuICAgIH0gLy8gd2hpbGUgKCFfZXZlbnRzUXVldWUuaXNFbXB0eSgpIC4uLlxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGUgc3RvcCBleGVjdXRpb24gd2hpbGUgZXhlY3V0aW5nIGFueSBoYW5kbGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlU3RvcEV4ZWN1dGlvbihydEV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgc3RvcDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICByZXR1cm4gc3RvcDtcclxuXHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPnJ0RXZ0LmdldFRhc2soKTtcclxuICAgIGxldCBjdXJyQ3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5ydEV2dC5Db250cm9sO1xyXG4gICAgbGV0IGxhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcbiAgICBsZXQgZW5kVGFza0R1ZVRvVmVyaWZ5RXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuICAgICAgc3dpdGNoIChydEV2dC5nZXRJbnRlcm5hbENvZGUoKSkge1xyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfUFJFRklYOlxyXG4gICAgICAgICAgZW5kVGFza0R1ZVRvVmVyaWZ5RXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVg6XHJcbiAgICAgICAgICAvLyBBbiBlcnJvciBpbiB0aGUgcmVjb3JkIHByZWZpeCBzZW5kcyB1cyByaWdodCBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgcmVjb3JkIHByZWZpeC5cclxuICAgICAgICAgIC8vIEl0IG1pZ2h0IGNyZWF0ZSBhbiBlbmRsZXNzIGxvb3AgYnV0IGl0IGlzIE9LIHRvIGRvIHNvLiBJdCBpcyBhIGRldmVsb3BlciBidWcuXHJcbiAgICAgICAgICBlbmRUYXNrRHVlVG9WZXJpZnlFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWDpcclxuICAgICAgICAgIC8vIGl0IHdpbGwgYmUgaGFuZGxlZCBpbiBjb21tb25oYW5kbGVyYWZ0ZXJcclxuICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwobnVsbCk7XHJcbiAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25DdHJsKDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWDpcclxuICAgICAgICAgIC8vIEVycm9yIG1pZ2h0IGhhdmUgb2NjdXJyZWQgaW4gQ1AuXHJcbiAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG4gICAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAobGFzdFBhcmtlZEN0cmwgPT09IG51bGwpXHJcbiAgICAgICAgICAvLyBvbmx5IGZvciB0aGUgZmlyc3QgdGltZVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0YXNrLnNldEN1cnJGaWVsZChudWxsKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBzdG9wIGV4ZWN1dGlvbiBjdHJsXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwobnVsbCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwoY3VyckN0cmwpO1xyXG5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHRhc2spO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gQ1AgZ290IHN0b3AgZXhlY3V0aW9uIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9ucyBpbiB0aGlzIGhhbmRsZXIgYW5kIGlzIHBhcmthYmxlLlxyXG4gICAgICAgICAgICAvLyB3ZSBtb3ZlIHRvIHRoZSBMYXN0UGFya2FibGUgY29udHJvbFxyXG5cclxuICAgICAgICAgICAgdGFzay5zZXRDdXJyRmllbGQobGFzdFBhcmtlZEN0cmwuZ2V0RmllbGQoKSk7XHJcblxyXG4gICAgICAgICAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMobGFzdFBhcmtlZEN0cmwsIC0xKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWDpcclxuICAgICAgICAgIC8vIEl0IG11c3QgYmUgc2V0IHRvIGZhbHNlIHNvIHRoYXQgbmV4dCB0aW1lIGZvciBmYXN0IG1vZGUgQ1MgbXVzdCBiZSBleGVjdXRlZC5cclxuICAgICAgICAgIGN1cnJDdHJsLnNldEluQ29udHJvbFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIH1cclxuICAgICAgaWYgKGVuZFRhc2tEdWVUb1ZlcmlmeUVycm9yKSB7XHJcbiAgICAgICAgYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICBzdG9wID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0b3A7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdGFrZSBjYXJlIG9mIFwiRm9yY2UgRXhpdFwiIGJlZm9yZSB0aGUgaGFuZGxlciBleGVjdXRlIGl0cyBvcGVyYXRpb25zIHJldHVybnMgdHJ1ZVxyXG4gIC8vLyAgIGlmIHRoZSBmb3JjZSBleGl0IHdhcyBoYW5kbGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2ZW50XCI+dGhlIGV2ZW50IG9mIHRoZSBoYW5kbGVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBydW4tdGltZSBldmVudFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRm9yY2VFeGl0QmVmb3JlKGV2dDogRXZlbnQsIHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBmb3JjZUV4aXQ6IEZvcmNlRXhpdCA9IGV2dC5Vc2VyRXZ0LkZvcmNlRXhpdDtcclxuICAgIGxldCBpc05ld1JlYzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IG9sZElkeDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvLyBUT0RPOiBjaGVjayB0aGUgZWZmZWN0IG9mIHJlbW92aW5nIGZvcmNlRXhpdCA9PT0gPEZvcmNlRXhpdD4wXHJcbiAgICBpZiAoZm9yY2VFeGl0ID09PSBGb3JjZUV4aXQuTm9uZSB8fCBydEV2dC5pc0ltbWVkaWF0ZSgpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ID0gdHJ1ZTtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+cnRFdnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IG9sZFJlYzogUmVjb3JkID0gKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICBpZiAob2xkUmVjICE9PSBudWxsICYmIG9sZFJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQgJiYgb2xkUmVjLmlzTmV3UmVjKCkpIHtcclxuICAgICAgaXNOZXdSZWMgPSB0cnVlO1xyXG4gICAgICBvbGRJZHggPSBvbGRSZWMuZ2V0SWQoKTtcclxuICAgIH1cclxuICAgIGlmIChmb3JjZUV4aXQgIT09IEZvcmNlRXhpdC5FZGl0aW5nICYmIHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCkge1xyXG4gICAgICBsZXQgY3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgIGlmIChjdHJsICE9PSBudWxsKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2hvdWxkIHdlIGV4aXQgdGhlIHJlY29yZD9cclxuICAgIGlmICgoZm9yY2VFeGl0ID09PSBGb3JjZUV4aXQuUHJlUmVjb3JkVXBkYXRlIHx8IGZvcmNlRXhpdCA9PT0gRm9yY2VFeGl0LlBvc3RSZWNvcmRVcGRhdGUpICYmIHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJiAhdGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICBsZXQgY3VyclJlYzogUmVjb3JkID0gKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICAgIC8vIElmIHdlIGZhaWxlZCBleGl0aW5nIGEgbmV3bHkgY3JlYXRlZCByZWNvcmQgLSByZXN0b3JlIGluc2VydCBtb2RlIG9mIHRoZSByZWNvcmRcclxuICAgICAgaWYgKGN1cnJSZWMgIT09IG51bGwgJiYgdGhpcy5fc3RvcEV4ZWN1dGlvbiAmJiBpc05ld1JlYyAmJiBvbGRJZHggPT09IGN1cnJSZWMuZ2V0SWQoKSAmJiB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAvLyByZXN0b3JlIGluc2VydCBtb2RlIG9mIHRoZSByZWNvcmRcclxuICAgICAgICBjdXJyUmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgIGN1cnJSZWMucmVzdGFydChEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGZvcmNlRXhpdCA9PT0gRm9yY2VFeGl0LlBvc3RSZWNvcmRVcGRhdGUgJiYgIXRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUUNSICMzMDM3NjIgLSBhZGRpdGlvbmFsIHN1cHBvcnQgZm9yIGZvcmNlRXhpdCA9IGVkaXRpbmdcclxuICAgIGlmIChmb3JjZUV4aXQgPT09IEZvcmNlRXhpdC5FZGl0aW5nKSB7XHJcbiAgICAgIGxldCBldnRDdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnJ0RXZ0LkNvbnRyb2w7XHJcblxyXG4gICAgICBpZiAoZXZ0Q3RybCAhPT0gbnVsbCAmJiBldnRDdHJsLmdldEZpZWxkKCkgIT09IG51bGwpIHtcclxuICAgICAgICBsZXQgY3RybFZhbDogc3RyaW5nID0gTWFuYWdlci5HZXRDdHJsVmFsKGV2dEN0cmwpO1xyXG4gICAgICAgIC8vIHRlc3QgdGhlIG5ldyBjb250cm9sIHZhbHVlXHJcbiAgICAgICAgYXdhaXQgZXZ0Q3RybC52YWxpZGF0ZUFuZFNldFZhbHVlKGN0cmxWYWwsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0YWtlIGNhcmUgb2YgXCJGb3JjZSBFeGl0XCIgYWZ0ZXIgaGFuZGxpbmcgdGhlIGV2ZW50IDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+dGhlIHJ1bi10aW1lIGV2ZW50IDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVGb3JjZUV4aXRBZnRlcihydEV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZm9yY2VFeGl0OiBGb3JjZUV4aXQgPSBydEV2dC5Vc2VyRXZ0LkZvcmNlRXhpdDtcclxuXHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPnJ0RXZ0LmdldFRhc2soKTtcclxuXHJcbiAgICAvLyBRQ1IjNzc2Mjk1OiBmb3IgcHJlIHJlY29yZCB1cGRhdGUsIGNvbW1pdCB0aGUgcmVjb3JkIGFmdGVyIGhhbmRsZXIncyBleGVjdXRpb24uXHJcbiAgICBpZiAoZm9yY2VFeGl0ID09PSBGb3JjZUV4aXQuUHJlUmVjb3JkVXBkYXRlKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuY29tbWl0UmVjb3JkKHRhc2ssIHRydWUpO1xyXG4gICAgICBpZiAoIXRhc2sudHJhbnNhY3Rpb25GYWlsZWQoQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCkgJiYgIXRhc2suaXNBYm9ydGluZygpKSB7XHJcbiAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0byBldmFsdWF0ZSB0aGUgZW5kIGNvbmRpdGlvbiBhZnRlciB0aGUgcmVjb3JkIHN1ZmZpeFxyXG4gICAgICAgIGlmIChhd2FpdCB0YXNrLmV2YWxFbmRDb25kKENvbnN0SW50ZXJmYWNlLkVORF9DT05EX0VWQUxfQUZURVIpKVxyXG4gICAgICAgICAgYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBGb3IgcG9zdC1yZWNvcmQgdHlwZSB3ZSBhbHJlYWR5IGRpZCByZWMtcHJlZml4IGFuZCBjdHJsIHByZWZpeCBpbiB0aGUgaGFuZGxlRm9yY2VFeGl0QmVmb3JlXHJcbiAgICBpZiAoZm9yY2VFeGl0ICE9PSBGb3JjZUV4aXQuUG9zdFJlY29yZFVwZGF0ZSkge1xyXG4gICAgICB0YXNrID0gPFRhc2s+cnRFdnQuZ2V0VGFzaygpO1xyXG4gICAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgIH1cclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcbiAgICBpZiAoY3RybCAhPT0gbnVsbCAmJiBmb3JjZUV4aXQgIT09IEZvcmNlRXhpdC5FZGl0aW5nKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUUNSIDgwMTg3MyAtIHVwZGF0ZSB0aGUgZGlzcGxheSBhZnRlciBoYW5kbGVyIG9mIGZvcmNlIGV4aXQgZWRpdGluZ1xyXG4gICAgaWYgKGZvcmNlRXhpdCA9PT0gRm9yY2VFeGl0LkVkaXRpbmcpIHtcclxuICAgICAgbGV0IGV2dEN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+cnRFdnQuQ29udHJvbDtcclxuICAgICAgLy8gaWYgdGhlcmUgaXMgYSBjb250cm9sIHRoYXQgaXMgYXR0YWNoZWQgdG8gYSBmaWVsZFxyXG4gICAgICBpZiAoZXZ0Q3RybCAhPT0gbnVsbCAmJiBldnRDdHJsLmdldEZpZWxkKCkgIT09IG51bGwpXHJcbiAgICAgICAgYXdhaXQgKDxGaWVsZD5ldnRDdHJsLmdldEZpZWxkKCkpLnVwZGF0ZURpc3BsYXkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhIHNwZWNpYWwgcm91dGluZSB0byBoYW5kbGUgZGF0YSBhbmQgdGltZXIgZXZlbnRzXHJcbiAgLy8vICAgaXQgcmVjZWl2ZXMgYSBIYW5kbGVyc1RhYmxlIGFuZCBleGVjdXRlIHRoZW0gb25lIGJ5IG9uZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJoYW5kbGVyc1RhYlwiPnRoZSBoYW5kbGVycyB0YWJsZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPmEgcmVmZXJlbm5jZSB0byB0aGUgdGltZXIgcnVudGltZSBldmVudCAtIGZvciBleHByZXNzaW9uIGV2ZW50cyBpdCBtdXN0IGJlIG51bGw8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRXZlbnRzXzEoaGFuZGxlcnNUYWI6IEhhbmRsZXJzVGFibGUsIHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMucHVzaFJ0RXZlbnQocnRFdnQpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgaGFuZGxlcnNUYWIuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgICBsZXQgaGFuZGxlcjogRXZlbnRIYW5kbGVyID0gaGFuZGxlcnNUYWIuZ2V0SGFuZGxlcihpKTtcclxuICAgICAgICAvLyB0aGUgcnRFdnQgaXMgdXNlZCB0byBwYXNzIHRoZSBjdHJsLCB0aGVyZWZvciBpdCBtdXN0IGJlIHZhbGlkIChub3QgbnVsbClcclxuICAgICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0VYUFJFU1NJT04gfHwgaGFuZGxlci5pc1NwZWNpZmljSGFuZGxlck9mKHJ0RXZ0KSB8fCBoYW5kbGVyLmlzTm9uU3BlY2lmaWNIYW5kbGVyT2YocnRFdnQpIHx8IGhhbmRsZXIuaXNHbG9iYWxIYW5kbGVyT2YocnRFdnQpKSB7XHJcbiAgICAgICAgICBhd2FpdCBoYW5kbGVyLmV4ZWN1dGUocnRFdnQsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLnBvcFJ0RXZlbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUYWtlcyBjYXJlIG9mIGtleWRvd24gRXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPnRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmNvbnRyb2wgcHJlc3NlZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJrYmRJdGVtXCI+a2V5Ym9yZCBpdGVtPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUtleURvd24odGFzazogVGFzaywgY3RybDogTWdDb250cm9sLCBldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGtiZEl0ZW06IEtleWJvYXJkSXRlbSA9IGV2dC5nZXRLYmRJdG1BbHdheXMoKTtcclxuICAgIGxldCBrZXlDb2RlOiBudW1iZXIgPSBrYmRJdGVtLmdldEtleUNvZGUoKTtcclxuICAgIHRoaXMuX2N1cnJLYmRJdGVtID0ga2JkSXRlbTtcclxuXHJcbiAgICAvLyBJZiBrZXlib2FyZCBidWZmZXJpbmcgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgZXZlbnQsIHdlIG5lZWQgdG8gZmluZCB0aGUgcmlnaHQgY29udHJvbCB0byByZWNlaXZlXHJcbiAgICAvLyB0aGlzIGV2ZW50XHJcbiAgICBpZiAoZXZ0Lklnbm9yZVNwZWNpZmllZENvbnRyb2wpIHtcclxuICAgICAgY3RybCA9IHRoaXMuZ2V0Q3VyckN0cmwoKTtcclxuICAgICAgdGFzayA9ICgoKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSBpbnN0YW5jZW9mIFRhc2spID8gPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpIDogbnVsbCkpO1xyXG4gICAgICAvLyBUaGUgY29udHJvbCByZWNlaXZpbmcga2V5cyBmcm9tIGtleWJvYXJkIGJ1ZmZlcmluZyBtdXN0IGJlIGEgdGV4dGJveFxyXG4gICAgICBpZiAoY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9URVhUKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZygnU3RhcnQgaGFuZGxpbmcgS0VZRE9XTiBldmVudC4gS2V5IGNvZGU6ICcgKyBrZXlDb2RlKTtcclxuXHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgLy8gRE9XTiBvciBVUCBpbnZva2VkIG9uIGEgU0VMRUNUL1JBRElPIGNvbnRyb2xcclxuICAgICAgaWYgKHRoaXMuX2N1cnJLYmRJdGVtLmVxdWFscyh0aGlzLktCSV9ET1dOKSB8fCB0aGlzLl9jdXJyS2JkSXRlbS5lcXVhbHModGhpcy5LQklfVVApKSB7XHJcbiAgICAgICAgaWYgKGN0cmwgIT09IG51bGwgJiYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElTVCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPKSlcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KHRhc2ssIGN0cmwpO1xyXG4gICAgICBydEV2dC5zZXRTeXN0ZW0odGhpcy5fY3VycktiZEl0ZW0pO1xyXG4gICAgICBydEV2dC5zZXRFZGl0UGFybXMoZXZ0LmdldFN0YXJ0U2VsZWN0aW9uKCksIGV2dC5nZXRFbmRTZWxlY3Rpb24oKSwgZXZ0LmdldFZhbHVlKCkpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgbGV0IHJldHVyblRvQ3RybDogTWdDb250cm9sID0gTWdDb250cm9sLlJldHVyblRvQ3RybDtcclxuICAgICAgICAgIGlmIChyZXR1cm5Ub0N0cmwgIT09IG51bGwgJiYgTWdDb250cm9sLnZhbGlkUmV0dXJuVG9DdHJsKCkpXHJcbiAgICAgICAgICAgIHJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExhc3RQYXJrZWRDdHJsKHJldHVyblRvQ3RybCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBtZ2Q6IE1HRGF0YSA9IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0Q3Vyck1HRGF0YSgpO1xyXG4gICAgICAvLyBjaGVjayBpZiB0aGUgTUdEYXRhIGlzIHN0aWxsIGFsaXZlIGFmdGVyIGhhbmRsaW5nIHRoZSBldmVudHMgYWJvdmVcclxuICAgICAgaWYgKG1nZCAhPT0gbnVsbCAmJiAhbWdkLklzQWJvcnRpbmcpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFeHByZXNzaW9uSGFuZGxlcnMoKTtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coJ0VuZCBoYW5kbGluZyBLRVlET1dOIGV2ZW50LiBLZXkgY29kZTogJyArIGtleUNvZGUpO1xyXG4gICAgICAvLyBpZiBhIGtleSB3YXMgcHJlc3NlZCBvbiB0YWJsZSBjaGlsZCwgbWFrZSBzdXJlIHRoYXQgaXMgaXMgdmlzaWJsZVxyXG4gICAgICBpZiAoY3RybCAhPT0gbnVsbCAmJiBjdHJsLklzUmVwZWF0YWJsZSAmJiBjdHJsID09PSBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsKSB7XHJcbiAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+Y3RybC5nZXRGb3JtKCkpLmJyaW5nUmVjb3JkVG9QYWdlKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZmluYWxseSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+SGFuZGxlIFNlbGVjdGlvbiBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5saW5lPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbHVlXCI+dmFsdWU8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlU2VsZWN0aW9uKGN0cmw6IE1nQ29udHJvbCwgbGluZTogbnVtYmVyLCB2YWw6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1ggfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTyB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTUJPIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElTVCkge1xyXG4gICAgICBsZXQgY2hlY2tGb2N1czogYm9vbGVhbiA9IChjdHJsLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQiAmJiBjdHJsLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YKTtcclxuICAgICAgbGV0IGFsbG93U2VsZWN0aW9uOiBib29sZWFuID0gKGNoZWNrRm9jdXMgPyAoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldExhc3RQYXJrZWRDdHJsKCkgPT09IGN0cmwpIDogdHJ1ZSk7XHJcblxyXG4gICAgICBpZiAoIWFsbG93U2VsZWN0aW9uIHx8ICFjdHJsLmlzTW9kaWZpYWJsZSgpIHx8ICFhd2FpdCBjdHJsLklzUGFya2FibGUoKSlcclxuICAgICAgICBhd2FpdCBjdHJsLnJlc3RvcmVPbGRWYWx1ZSgpO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoY3RybC5pc0Nob2ljZUNvbnRyb2woKSlcclxuICAgICAgICAgIENvbW1hbmRzLnNldEdldFN1Z2dlc3RlZFZhbHVlT2ZDaG9pY2VDb250cm9sT25UYWdEYXRhKGN0cmwsIGN0cmwuSXNSZXBlYXRhYmxlID8gbGluZSA6IDAsIHRydWUpO1xyXG5cclxuICAgICAgICBpZiAoY3RybC5pc0RpZmZlcmVudFZhbHVlKHZhbCwgY3RybC5Jc051bGwsIHRydWUpKSB7XHJcbiAgICAgICAgICAvLyAjOTMxNTQ1IC0gdmFyIGNoYW5nZSBtdXN0IGJlIGludm9rZWQgZmlyc3QgYmVmb3JlIGNvbnRyb2wgdmVyaWZpY2F0aW9uLlxyXG4gICAgICAgICAgY3RybC5Nb2RpZmllZEJ5VXNlciA9IHRydWU7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUN0cmxNb2RpZnkoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVElPTik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY3RybC5pc0Nob2ljZUNvbnRyb2woKSlcclxuICAgICAgICAgIENvbW1hbmRzLnNldEdldFN1Z2dlc3RlZFZhbHVlT2ZDaG9pY2VDb250cm9sT25UYWdEYXRhKGN0cmwsIGN0cmwuSXNSZXBlYXRhYmxlID8gbGluZSA6IDAsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgLy8gRm9yIG11bHRpcGxlIHNlbGVjdGlvbiBMaXN0Qm94IHZhbHVlIHRvIGZpZWxkIGFuZCBjdHJsIHdvdWxkIGJlIHNldCBvbiBsZWF2aW5nXHJcbiAgICAgICAgLy8gY29udHJvbCwgYmVmb3JlIGV4ZWN1dGluZyBjb250cm9sIHN1ZmZpeC4gU28gdmFyaWFibGUgY2hhbmdlIGludGVybmFsIGV2ZW50IHdvdWxkIGJlXHJcbiAgICAgICAgLy8gaGFuZGxlZCBiZWZvcmUgZXhlY3V0aW5nIGNvbnRyb2wgc3VmZml4LlxyXG4gICAgICAgIGlmICghY3RybC5Jc011bHRpcGxlU2VsZWN0aW9uTGlzdEJveCgpKVxyXG4gICAgICAgICAgYXdhaXQgY3RybC52YWxpZGF0ZUFuZFNldFZhbHVlKHZhbCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGUgTW91c2UgVXAgRXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmNvbnRvbFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPmxpbmUgb2YgbXVsdGlsaW5lIGNvbnRyb2xcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb2R1Y2VDbGlja1wiPmlmIHRydWUsIHByb2R1Y2UgY2xpY2sgZXZlbnRcclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZU1vdXNlVXAoY3RybDogTWdDb250cm9sLCBsaW5lOiBudW1iZXIsIHByb2R1Y2VDbGljazogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGN0cmwgPT09IG51bGwpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICAvLyBRQ1IgIyA2MTQ0IHNlZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgX2N1cnJDbGlja2VkUmFkaW8gbWVtYmVyXHJcbiAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTylcclxuICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkN1cnJlbnRDbGlja2VkUmFkaW8gPSBjdHJsO1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKGN0cmwuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEUpIHtcclxuICAgICAgICBpZiAoIWF3YWl0IGN0cmwuY2hlY2tQcm9wV2l0aExpbmUoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5BQkxFRCwgdHJ1ZSwgbGluZSkpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNhbkdvdG9DdHJsOiBib29sZWFuID0gdGhpcy5jYW5Hb1RvQ29udHJvbChjdHJsLCB0cnVlKTtcclxuICAgICAgICBsZXQgU3RvcEZvY3VzOiBib29sZWFuID0gY3RybC5pc0ZvY3VzZWRTdG9wRXhlY3V0aW9uKCk7XHJcblxyXG4gICAgICAgIGxldCByZXR1cm5Ub0N0cmw6IE1nQ29udHJvbCA9IE1nQ29udHJvbC5SZXR1cm5Ub0N0cmw7XHJcblxyXG4gICAgICAgIGlmICgoIWNhbkdvdG9DdHJsIHx8ICgodGhpcy5fc3RvcEV4ZWN1dGlvbiB8fCBTdG9wRm9jdXMpICYmIHJldHVyblRvQ3RybCAhPT0gY3RybCkpICYmIHJldHVyblRvQ3RybCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5jdXJyTWdkSUQgPSAoPFRhc2s+cmV0dXJuVG9DdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldE1nZElEKCk7XHJcbiAgICAgICAgICBpZiAocmV0dXJuVG9DdHJsLklzUmVwZWF0YWJsZSlcclxuICAgICAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+cmV0dXJuVG9DdHJsLmdldEZvcm0oKSkuYnJpbmdSZWNvcmRUb1BhZ2UoKTtcclxuICAgICAgICAgIGF3YWl0IEZvY3VzTWFuYWdlci5TZXRGb2N1cyhyZXR1cm5Ub0N0cmwsIC0xKTtcclxuICAgICAgICAgIHJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExhc3RQYXJrZWRDdHJsKHJldHVyblRvQ3RybCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uIHx8IFN0b3BGb2N1cylcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHByb2R1Y2VDbGljayAmJiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJU1QpKSB7XHJcbiAgICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwpO1xyXG4gICAgICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9XRUJfQ0xJQ0spO1xyXG4gICAgICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICAgICAgfVxyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkN1cnJlbnRDbGlja2VkUmFkaW8gPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgQ2hlY2sgaWYgY3R4IGlzIHJlbW92ZWQgZnJvbSBzZXJ2ZXIsIGlmIHNvIGFuZCBjdXJyZW50IGV2ZW50IGlzIHJvdXRlIGV2ZW50ICwgdGhlbiBzYXZlIGl0XHJcbiAgLy8gIHRvIGV4ZWN1dGUgYWdhaW4gd2hlbiAgc2VydmVyIGN0eCBpcyByZWNyZWF0ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNoZWNrQW5kU2F2ZVJvdXRlRXZlbnRJZkN0eFJlbW92ZWRGcm9tU3J2cihhUnRFdnQ6IGFueSk6IHZvaWQge1xyXG5cclxuICAgIGlmIChhUnRFdnQuZ2V0VHlwZSgpID09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgYVJ0RXZ0LmdldEludGVybmFsQ29kZSgpID09XHJcbiAgICAgIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9XRUJDTElFTlRfUk9VVEUgJiYgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlJlbW92ZWRDb250ZXh0RnJvbVNlcnZlcikge1xyXG4gICAgICB0aGlzLnNldExhc3RTYXZlZFJvdXRlRXZlbnQoYVJ0RXZ0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGUgRm9jdXMgRXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+bGluZSBvZiBtdWx0aWxpbmUgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvbkNsaWNrXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUZvY3VzKGN0cmw6IE1nQ29udHJvbCwgbGluZTogbnVtYmVyLCBvbkNsaWNrOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgaWYgKGN0cmwuaXNTdGF0aWMoKSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAvLyBJZiB3ZSBhdHRlbXB0IHRvIHBhcmsgb24gY29udHJvbCB3aGVyZSB3ZSBkbyBub3Qgd2FudCB0byBhbGxvdyB0byBwYXJrIGxpa2UgaWYgY29udHJvbCBoYXMgZXhwcmVzc2lvbiBvciBwYXJlbnQgdGFzayBmaWVsZCwgZG8gbm90IGFsbG93IHRvIGZvY3VzIG9uIGl0LlxyXG4gICAgICAvLyBTZXQgRm9jdXMgYmFjayB0byBsYXN0Rm9jdXNlZENvbnRyb2wuIFdlIG5lZWQgX2xhc3RGYWlsZWRGb2N1c2VkQ29udHJvbCBhcyB3ZSBnZXQgZm9jdXMgZXZlbnQgb24gYSBjb250cm9sIHR3aWNlLiBTbyB0byBhdm9pZCB0byBzaG93IGVycm9yIG11bHRpcGxlIHRpbWVzLFxyXG4gICAgICAvLyBtYWludGFpbiBfbGFzdEZhaWxlZEZvY3VzZWRDb250cm9sLlxyXG4gICAgICBpZiAoY3RybCAhPT0gdGhpcy5fbGFzdEZhaWxlZEZvY3VzZWRDb250cm9sICYmIGN0cmwuSGFzRXhwT3JQYXJlbnRUYXNrRmllbGQoKSkge1xyXG4gICAgICAgIC8vIFNob3cgZXJyb3Igb25seSBmb3IgY29udHJvbHMgaGF2aW5nIERhdGEgcHJvcGVydHkgYW5kIHBhcmthYmxlXHJcbiAgICAgICAgaWYgKGN0cmwuaXNMaXN0Qm94KCkgfHwgY3RybC5pc0NoZWNrQm94KCkgfHwgY3RybC5pc0NvbWJvQm94KCkgfHwgY3RybC5pc1RleHRDb250cm9sKCkgfHwgY3RybC5pc1JhZGlvKCkgfHwgY3RybC5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXJyb3JUb0xvZyhOU3RyaW5nLkZvcm1hdCgnQ29udHJvbCBlaXRoZXIgaGFzIGV4cHJlc3Npb24gb3IgaGFzIHBhcmVudCB0YXNrIHZhcmlhYmxlIGF0dGFjaGVkIHRvIGl0LiBGYWlsZWQgdG8gcGFyayBvbiBjb250cm9sIHdpdGggbmFtZTogezB9JywgY3RybC5OYW1lKSk7XHJcbiAgICAgICAgICAvLyBEZWZlY3QgMTUyNzI4OiBVc2UgbGFzdCBmb2N1c2VkIHRhc2sgaW5zdGVhZCBjb250cm9sIHRhc2sgYXMgY29udHJvbCBjYW4gYmUgZnJvbSBzdWJmb3JtLlxyXG4gICAgICAgICAgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSwgTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpLCAwLFxyXG4gICAgICAgICAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCkgPT09IG51bGwgPyB0cnVlIDogZmFsc2UpO1xyXG4gICAgICAgICAgdGhpcy5fbGFzdEZhaWxlZEZvY3VzZWRDb250cm9sID0gY3RybDtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX2xhc3RGYWlsZWRGb2N1c2VkQ29udHJvbCA9IG51bGw7XHJcblxyXG4gICAgICBpZiAob25DbGljaylcclxuICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRDdHJsID0gY3RybDtcclxuXHJcbiAgICAgIGxldCBwcmV2Q3RybDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgICBpZiAoY3RybCA9PT0gcHJldkN0cmwgJiYgIWN0cmwuaXNSZXBlYXRhYmxlKCkpIHtcclxuICAgICAgICBhd2FpdCAoPE1nRm9ybT5jdHJsLmdldEZvcm0oKSkuYnJpbmdSZWNvcmRUb1BhZ2UoKTtcclxuICAgICAgICAvLyB3ZSByZWNlaXZlZCBmb2N1cyB0d2ljZVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy9jaGVjayBpZiBsYXN0IHRhc2sgaXMgb3BlbmVkIGluIE1vZGFsIFN1YmZvcm0sIGlmIHllcywgY2xvc2UgaXQgYmVmb3JlIGZvY3Vzc2luZyBvbiBwYXJlbnQgdGFzaydzIGN0cmxcclxuICAgICAgbGV0IHByZXZUYXNrOiBUYXNrID0gPFRhc2s+TGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG5cclxuXHJcbiAgICAgIGlmIChjdHJsID09PSBudWxsIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEUpIHtcclxuICAgICAgICBpZiAocHJldkN0cmwgPT09IG51bGwpXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBjdXJyVGFzazogVGFzaztcclxuICAgICAgaWYgKChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTikgJiYgKDxSYWlzZUF0Pihhd2FpdCAoY3RybC5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JBSVNFX0FUKSkuZ2V0VmFsdWVJbnQoKSkgPT09IFJhaXNlQXQuVGFza0luRm9jdXMpKVxyXG4gICAgICAgIGN1cnJUYXNrID0gcHJldlRhc2s7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBjdXJyVGFzayA9IDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuXHJcbiAgICAgIGxldCBjYW5Hb3RvQ3RybDogYm9vbGVhbiA9IHRoaXMuY2FuR29Ub0NvbnRyb2woY3RybCwgb25DbGljayk7XHJcblxyXG4gICAgICAvLyBHbyB0byB0aGUgY29udHJvbCAtIGluc2VydCBwcmVmaXhcclxuICAgICAgaWYgKGNhbkdvdG9DdHJsKSB7XHJcbiAgICAgICAgLy8gTW9kYWwgc3ViZm9ybSB0YXNrIGNsb3NpbmcgaGFzIGFscmVhZHkgYmVndW4uIERvIG5vdCBoYW5kbGUgSGFuZGxlU3ViZm9ybU1vZGFsaXR5KCkgYWdhaW4uXHJcbiAgICAgICAgaWYgKHRoaXMuZ3VpUGVuZGluZ0V2ZW50ICE9IG51bGwpXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGV0IGhhbmRsZWQgPSBhd2FpdCB0aGlzLkhhbmRsZVN1YmZvcm1Nb2RhbGl0eShjdHJsLCBwcmV2VGFzaywgY3VyclRhc2spO1xyXG4gICAgICAgIGlmIChoYW5kbGVkKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgZXZlbnRMaW5lOiBudW1iZXIgPSAoY3RybC5pc1JlcGVhdGFibGUoKSB8fCBjdHJsLmlzUmFkaW8oKSkgPyBsaW5lIDogSW50MzIuTWluVmFsdWU7XHJcbiAgICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwsIGV2ZW50TGluZSk7XHJcbiAgICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYKTtcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAocHJldkN0cmwgIT09IG51bGwpIHtcclxuICAgICAgICBpZiAoIXByZXZDdHJsLmlzTW9kaWZpYWJsZSgpKSB7XHJcbiAgICAgICAgICBpZiAocHJldkN0cmwuaXNDaG9pY2VDb250cm9sKCkpXHJcbiAgICAgICAgICAgIGF3YWl0IHByZXZDdHJsLnJlc3RvcmVPbGRWYWx1ZSgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIWN1cnJUYXNrLmNhbmNlbFdhc1JhaXNlZCgpKSB7XHJcbiAgICAgICAgICBsZXQgbmV3VmFsOiBzdHJpbmcgPSBNYW5hZ2VyLkdldEN0cmxWYWwocHJldkN0cmwpO1xyXG4gICAgICAgICAgaWYgKCFhd2FpdCBwcmV2Q3RybC52YWxpZGF0ZUFuZFNldFZhbHVlKG5ld1ZhbCwgdHJ1ZSkpXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgTWdDb250cm9sLlJldHVyblRvQ3RybCA9IHByZXZDdHJsO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbiAmJiBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsID09PSBjdHJsKVxyXG4gICAgICAgIExhc3RGb2N1c2VkTWFuYWdlci5zZXRMYXN0Rm9jdXNlZENvbnRyb2woPFRhc2tCYXNlPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSwgY3RybCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGN0cmwuc2V0Rm9jdXNlZFN0b3BFeGVjdXRpb24odGhpcy5fc3RvcEV4ZWN1dGlvbik7XHJcbiAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGV0IHJldHVyblRvQ3RybDogTWdDb250cm9sID0gTWdDb250cm9sLlJldHVyblRvQ3RybDtcclxuXHJcbiAgICAgICAgICBpZiAocmV0dXJuVG9DdHJsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gKDxUYXNrPnJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNZ2RJRCgpO1xyXG4gICAgICAgICAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMocmV0dXJuVG9DdHJsLCAtMSk7XHJcbiAgICAgICAgICAgIHJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExhc3RQYXJrZWRDdHJsKHJldHVyblRvQ3RybCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGUgc3ViZm9ybSBtb2RhbGl0eSBiZWZvciBmb3Vjc3Npbmcgb24gcGFyZW50IGN0cmxcclxuICAvLy8gMS5pZiBjdXJzb3IgaXMgcGFya2VkIG9uIG1vZGFsIHN1YmZvcm0gdGFzayBhbmQgdXNlciBjbGlja3Mgb24gaXQncyBwYXJlbnQgOiBjbG9zZSB0aGUgc3ViZm9ybSB0YXNrLlxyXG4gIC8vLyAyLmlmIGN1cnNvciBpcyBwYXJrZWQgb24gbW9kYWwgc3ViZm9ybSAnUzInIHdoaWNoIGlzIG9wZW5lZCBpbiBhbm90aGVyIHN1YmZvcm0gbW9kYWwgJ1MxJywgdGhlbiBjbGlja2luZyBvbiAgcGFyZW50J1AxJ1xyXG4gIC8vLyB3aWxsIGNsb3NlIGJvdGggUzIgYW5kIFMxLlxyXG4gIC8vLyAzLmlmIGN1cnNvciBpcyBwYXJrZWQgb24gbm9uIG1vZGFsIHN1YmZvcm0gJ1MyJyB3aGljaCBpcyBvcGVuZWQgaW4gc3ViZm9ybSBtb2RhbCAnUzEnLCB0aGVuIGNsaWNraW5nIG9uIFMxLCB3aWxsIG5vdCBjbG9zZSBTMlxyXG4gIC8vLyBidXQgY2xpY2tpbmcgb24gUDEgd2lsbCBjbG9zZSBib3RoIFMyIGFuZCBTMS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmN0cmwgdG8gYmUgZm9jdXNzZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJldlRhc2tcIj5wcmV2aW91cyB0YXNrIHdoaWNoIHdhcyBpbiBmb2N1czwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdXJyVGFza1wiPmN1cnJlbnQgdGFzayB3aGljaCBpcyB0byBiZSBmb2N1c3NlZDwvcGFyYW0+XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgSGFuZGxlU3ViZm9ybU1vZGFsaXR5KGN0cmw6IE1nQ29udHJvbCwgcHJldlRhc2s6IFRhc2ssIGN1cnJUYXNrOiBUYXNrKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgaGFuZGxlZFN1YmZvcm1Nb2RhbGl0eSA9IGZhbHNlO1xyXG5cclxuICAgIC8vIGV2YWx1YXRlIHRoZSBjb3JyZWN0IHByZXZUYXNrIHRvIGJlIGNsb3NlZCBpZiBpdCBpcyBNb2RhbC5cclxuICAgIC8vIGlmIG5ld2x5IHN1YmZvcm0gTW9kYWwgdGFzayBpcyBvcGVuZWQgYW5kIGl0IGlzIG5vdCB5ZXQgZm9jdXNzZWQsIGluIHRoYXQgY2FzZSBjdXJyIHRhc2sgaXMgc2FtZSBhcyBwcmV2dGFzay5cclxuICAgIC8vIG5vdyBjbGlja2luZyBvbiBpdCdzIHBhcmVudCB0YXNrLCBzaG91bGQgY2xvc2UgdGhlIE1vZGFsIHN1YmZvcm0gdGFza1xyXG4gICAgbGV0IGxlbmd0aCA9IHByZXZUYXNrLmdldE1HRGF0YSgpLmdldFRhc2tzQ291bnQoKTtcclxuICAgIGxldCB0b3BUYXNrOiBUYXNrID0gcHJldlRhc2suZ2V0TUdEYXRhKCkuZ2V0VGFzayhsZW5ndGggLSAxKTtcclxuICAgIGlmIChjdXJyVGFzayA9PSBwcmV2VGFzayB8fCBwcmV2VGFzayAhPSB0b3BUYXNrIC8qIG5lc3RlZCBzdWJmb3JtICovKSB7XHJcbiAgICAgIGlmICh0b3BUYXNrICE9IG51bGwgJiYgcHJldlRhc2sgIT0gdG9wVGFzayAmJiB0b3BUYXNrLklzU3ViRm9ybSkge1xyXG4gICAgICAgIGxldCBzdWJmb3JtQ3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD50b3BUYXNrLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpO1xyXG4gICAgICAgIGlmIChzdWJmb3JtQ3RybC5Jc01vZGFsKCkpXHJcbiAgICAgICAgICBwcmV2VGFzayA9IHRvcFRhc2s7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBjbG9zZSBzdWJmb3JtIHRhc2sgaXMgTW9kYWwgaWYgdG8gYmUgcGFya2VkIG9uIHBhcmVudC5cclxuICAgIGlmIChwcmV2VGFzayAhPSA8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkgJiYgcHJldlRhc2suZ2V0SXNEZXN0aW5hdGlvbkNhbGwoKSkge1xyXG5cclxuICAgICAgaWYgKCFjdXJyVGFzay5pc0Rlc2NlbmRlbnRPZihwcmV2VGFzaykpIHtcclxuICAgICAgICBsZXQgc3ViZm9ybUN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+cHJldlRhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCk7XHJcbiAgICAgICAgaWYgKCFzdWJmb3JtQ3RybC5Jc01vZGFsKCkgJiYgIWN1cnJUYXNrLmdldElzRGVzdGluYXRpb25DYWxsKCkpXHJcbiAgICAgICAgICBzdWJmb3JtQ3RybCA9IHByZXZUYXNrLkdldFN1YmZvcm1Nb2RhbFBhcmVudFRhc2soKTtcclxuICAgICAgICBpZiAoc3ViZm9ybUN0cmwgIT0gbnVsbCAmJiAoY3RybCAhPSBzdWJmb3JtQ3RybCkgJiYgc3ViZm9ybUN0cmwuSXNNb2RhbCgpKSB7XHJcblxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5wZXJmb3JtU3ViZm9ybUNsb3NlKDxNZ0NvbnRyb2w+c3ViZm9ybUN0cmwpO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLmd1aVBlbmRpbmdFdmVudCA9IHRoaXMuZ2V0TGFzdFJ0RXZlbnQoKTtcclxuICAgICAgICAgIGhhbmRsZWRTdWJmb3JtTW9kYWxpdHkgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBoYW5kbGVkU3ViZm9ybU1vZGFsaXR5O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgQ2FsbHMgQ29udHJvbHMgU3VmZml4IHdoZW4gZm9jdXMgb24gTm9uIG1hZ2ljIGNvbnRyb2wgaS5lLiBjb250cm9sIHdpdGggTWFnaWNEdW1teUNvbnRyb2wgaXMgcmVjZWl2ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVGb2N1c09uTm9uTWFnaWNDb250cm9sKGN0cmw6IE1nQ29udHJvbCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgRXZlbnRzTWFuYWdlci5JbnN0YW5jZS5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGN0cmwuc2V0Rm9jdXNlZFN0b3BFeGVjdXRpb24odGhpcy5fc3RvcEV4ZWN1dGlvbik7XHJcbiAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGV0IHJldHVyblRvQ3RybDogTWdDb250cm9sID0gTWdDb250cm9sLlJldHVyblRvQ3RybDtcclxuXHJcbiAgICAgICAgICBpZiAocmV0dXJuVG9DdHJsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gKDxUYXNrPnJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNZ2RJRCgpO1xyXG4gICAgICAgICAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMocmV0dXJuVG9DdHJsLCAtMSk7XHJcbiAgICAgICAgICAgIHJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExhc3RQYXJrZWRDdHJsKHJldHVyblRvQ3RybCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHdlIGNhbiBnbyB0byB0aGUgY29udHJvbCBhbmQgdHJ5IHRvIHBhcmsgb24gaW5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPmxpbmU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib25DbGlja1wiPnJlYWwgY2xpY2sgaXMgcGVyZm9ybWVkLCB0aGlzIG5vdCBjbGljayBzaW11bGF0aW9uPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgY2FuR29Ub0NvbnRyb2woY3RybDogTWdDb250cm9sLCBvbkNsaWNrOiBib29sZWFuKTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKG9uQ2xpY2sgJiYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STSB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JST1dTRVIpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gVjkuNFNQNGQgY2hhbmdlIG9mIGJlaGF2aW9yIC0gd2UgZG8gbm90IFwiZXhpdFwiIGZyb20gdGhlIGN1cnJlbnQgY3RybFxyXG4gICAgLy8gKGkuZS4gbm90IHBlcmZvcm1pbmcgY3RybCBzdWZmaXggb3IgY3RybCB2ZXJpZmljYXRpb25zKSBpZiB0aGUgdGFyZ2V0IGN0cmxcclxuICAgIC8vIGlzIElNRyBvciBoeXBlcnRleHQuXHJcbiAgICBsZXQgY2FuR290b0N0cmw6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IGN1cnJUYXNrOiBUYXNrID0gPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgLy8gaWYgY2FuY2VsIGlzIHJhaXNlZCAsIHRoZW4gZG8gbm90IGdvIHRvIG5leHQgY29udHJvbCBiZWZvcmUgaGFuZGxpbmcgY2FuY2VsIGV2ZW50LlxyXG4gICAgbGV0IGxhc3RUYXNrOiBUYXNrID0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG4gICAgaWYgKCFjdXJyVGFzay5Jc0ludGVyYWN0aXZlIHx8IChsYXN0VGFzayAhPSBudWxsICYmIGxhc3RUYXNrLmdldExhc3RQYXJrZWRDdHJsKCkgIT0gbnVsbCAmJlxyXG4gICAgICBsYXN0VGFzay5jYW5jZWxXYXNSYWlzZWQoKSkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9JTUFHRSAmJiAhY3RybC5Jc1JlcGVhdGFibGUpXHJcbiAgICAgIGNhbkdvdG9DdHJsID0gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIGNhbkdvdG9DdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZSBUaW1lciBFdmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+dHVudGltZSB0aW1lciBldmVudDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVUaW1lcihldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgZXZ0LnNldFR5cGUoQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUik7XHJcbiAgICBpZiAoZXZ0LmlzSWRsZVRpbWVyKCkpIHtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFeHByZXNzaW9uSGFuZGxlcnMoKTtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVDb250ZXh0SW5hY3Rpdml0eUFsZXJ0KGV2dCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgbWdkOiBNR0RhdGEgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldE1HRGF0YShldnQuZ2V0TWdkSUQoKSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnRzKG1nZC5nZXRUaW1lckhhbmRsZXJzKCksIGV2dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFdoZW4gdGhlIGNvbnRleHQgaW5hY3Rpdml0eSB0aW1lb3V0IGlzIGFib3V0IHRvIGV4cGlyZSwgcmFpc2UgYSB3YXJuaW5nIHRvIHVzZXJcclxuICAvLyAgICBzbyB0aGF0IHRoZSBzZXNzaW9uIGNhbiBiZSBjb250aW51ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+dHVudGltZSB0aW1lciBldmVudDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVDb250ZXh0SW5hY3Rpdml0eUFsZXJ0KGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGltZU5vdzogbnVtYmVyID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuICAgIGxldCBtZ2Q6IE1HRGF0YSA9IGV2dC5nZXRUYXNrKCkuZ2V0TUdEYXRhKCk7XHJcbiAgICBsZXQgbGFzdFJlcXVlc3RUaW1lOiBudW1iZXIgPSBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkdldExhc3RSZXF1ZXN0VGltZTtcclxuICAgIGxldCBjb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQ6IG51bWJlciA9IEVudmlyb25tZW50Lkluc3RhbmNlLmdldENvbnRleHRJbmFjdGl2aXR5VGltZW91dCgpIC8gMTA7XHJcbiAgICBsZXQgY29udGV4dEluYWN0aXZpdHlXYXJuaW5nVGltZTogbnVtYmVyID0gRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0Q29udGV4dEluYWN0aXZpdHlXYXJuaW5nVGltZSgpIC8gMTA7XHJcblxyXG4gICAgbGV0IGlkbGVUaW1lID0gKHRpbWVOb3cgLSBsYXN0UmVxdWVzdFRpbWUpIC8gMTAwMDtcclxuXHJcbiAgICAvLyBEaXNwbGF5IHRoZSBjb25maXJtYXRpb24gb25seSBmb3IgdmFsaWQgdGltZW91dHNcclxuICAgIGlmIChjb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQgPT0gMCB8fCBjb250ZXh0SW5hY3Rpdml0eVdhcm5pbmdUaW1lID09IDApXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAoRXZlbnRzTWFuYWdlci51c2VyR3JhbnRlZEZvckNvbnRleHRBY3Rpdml0eSAmJiBpZGxlVGltZSA+PSAoY29udGV4dEluYWN0aXZpdHlUaW1lb3V0IC0gY29udGV4dEluYWN0aXZpdHlXYXJuaW5nVGltZSkpIHtcclxuICAgICAgLy8gcmFpc2UgYW4gYWxlcnQgdG8gbm90aWZ5IHVzZXIgd2hlbiB0aGUgY29udGV4dCBpcyBhYm91dCB0byBiZSB0ZXJtaW5hdGVkXHJcbiAgICAgIC8vIGlmIHVzZXIgY2xpY2tzIG9uIE9LLCBzZW5kIGR1bW15IHJlcXVlc3QgdG8gc2VydmVyLiBJZiBDYW5jZWwgaXMgY2xpY2tlZCwgZG8gbm90aGluZy5cclxuICAgICAgbGV0IHVzZXJDb25maXJtYXRpb246IG51bWJlciA9IGF3YWl0IEdVSU1hbmFnZXIuSW5zdGFuY2UuTWVzc2FnZUJveCh0aGlzLmNvbmZpcm1hdGlvbkRpYWxvZ1RpdGxlLCB0aGlzLmNvbmZpcm1hdGlvbkRpYWxvZ01zZywgU3R5bGVzLk1TR0JPWF9CVVRUT05fWUVTX05PKTtcclxuICAgICAgaWYgKHVzZXJDb25maXJtYXRpb24gPT0gU3R5bGVzLk1TR0JPWF9SRVNVTFRfWUVTKSB7XHJcbiAgICAgICAgLy8gc2VuZCByZXF1ZXN0IHRvIHNlcnZlciB0byBtYXJrIHRoZSBjb250ZXh0IGluYWN0aXZpdHkgdGltZW91dCB0byB6ZXJvXHJcbiAgICAgICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVDb250ZXh0VGltZW91dFJlc2V0RXZlbnRDb21tYW5kKCk7XHJcbiAgICAgICAgbWdkLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICBhd2FpdCBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5PTkxZX0NPTU1BTkRTKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBFdmVudHNNYW5hZ2VyLnVzZXJHcmFudGVkRm9yQ29udGV4dEFjdGl2aXR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwcm9jZXNzIGV4cHJlc3Npb24gaGFuZGxlcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGhhbmRsZUV4cHJlc3Npb25IYW5kbGVycygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCksIExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKSk7XHJcbiAgICBydEV2dC5zZXRFeHByZXNzaW9uKG51bGwpO1xyXG4gICAgcnRFdnQuc2V0TWFpblByZ0NyZWF0b3IocnRFdnQuZ2V0VGFzaygpKTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGxldCBtZ2Q6IE1HRGF0YSA9IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TUdEYXRhKGkpO1xyXG4gICAgICBpZiAobWdkICE9PSBudWxsICYmICFtZ2QuSXNBYm9ydGluZylcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50cyhtZ2QuZ2V0RXhwSGFuZGxlcnMoKSwgcnRFdnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2l6ZSBvZiBwYWdlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj50YWJsZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyb3dzSW5QYWdlXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGhhbmRsZVJlc2l6ZShjdHJsOiBNZ0NvbnRyb2wsIHJvd3NJblBhZ2U6IG51bWJlcik6IHZvaWQge1xyXG4gICAgKDxNZ0Zvcm0+Y3RybC5nZXRGb3JtKCkpLnNldFJvd3NJblBhZ2Uocm93c0luUGFnZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGRhdGEgZm9yIFJvd1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzZW5kQWxsXCI+aWYgdHJ1ZSwgc2VuZCBhbGwgcmVjb3Jkc1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicm93XCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVSb3dEYXRhQ3VyUGFnZSh0YWJsZTogTWdDb250cm9sLCBkZXNpcmVkVG9wSW5kZXg6IG51bWJlciwgc2VuZEFsbDogYm9vbGVhbiwgbGFzdEZvY3VzZWRWYWw6IExhc3RGb2N1c2VkVmFsKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50YWJsZS5nZXRGb3JtKCk7XHJcbiAgICBhd2FpdCBmb3JtLnNldFJvd0RhdGEoZGVzaXJlZFRvcEluZGV4LCBzZW5kQWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cmFuc2ZlcnMgZGF0YSB0byBHVUkgdGhyZWFkIGluIGZyZWUgd29ya2VyIHRocmVhZCB0aW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlVHJhbnNmZXJEYXRhVG9HdWkoY3RybDogTWdDb250cm9sKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT5jdHJsLmdldEZvcm0oKTtcclxuICAgIGF3YWl0IGZvcm0udHJhbnNmZXJEYXRhVG9HdWkoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBGZXRjaGVzIHRoZSBjaHVuayBmcm9tIHNlcnZlcixcclxuICAvLy8gICBJZiB0aGUgbGFzdCByZWNvcmRzIGlzIG5vdCB5ZXQgZmV0Y2hlZCBpdCBmZXRjaGVzIHRoZSBuZXh0IGNodW5rLFxyXG4gIC8vLyAgIEVsc2UsIGZldGNoZXMgdGhlIHByZXZpb3VzIGNodW5rXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIGZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlcihjdHJsOiBNZ0NvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPmN0cmwuZ2V0Rm9ybSgpO1xyXG4gICAgYXdhaXQgZm9ybS5GZXRjaFJlY29yZHNBaGVhZEZyb21TZXJ2ZXIoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBXaGVuIGludGVybmFsIGFjdCBhc2tzIGZvciBlbmFibGUvZGlzYWJsZSBvZiBhbiBhY3QgbGlzdC5cclxuICAvLy8gICBjYWxsIGVuYWJsZUxpc3Qgd2l0aCBvbmx5SWZDaGFuZ2VkID0gdHJ1ZSB0byBtaW5pbWl6ZSBjYWxscyB0b3MgcmVmcmVzaC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZW5hYmxlXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGhhbmRsZUVuYWJsZUV2ZW50cyhldnQ6IFJ1blRpbWVFdmVudCwgZW5hYmxlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBldnQuZ2V0VGFzaygpLkFjdGlvbk1hbmFnZXIuZW5hYmxlTGlzdChldnQuZ2V0QWN0RW5hYmxlTGlzdCgpLCBlbmFibGUsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZXMgY29udHJvbCBQcmVmaXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ3RybFByZWZpeChldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ldnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGN1cnJDbGlja2VkQ3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5SdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRDdHJsO1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICBsZXQgZGlzcGxheUxpbmU6IG51bWJlciA9IGV2dC5nZXREaXNwbGF5TGluZSgpO1xyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2w7XHJcblxyXG4gICAgaWYgKGZvcm0uaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgIGlmIChkaXNwbGF5TGluZSA9PT0gSW50MzIuTWluVmFsdWUgfHwgY3RybC5pc1JhZGlvKCkpXHJcbiAgICAgICAgZGlzcGxheUxpbmUgPSBmb3JtLkRpc3BsYXlMaW5lO1xyXG4gICAgfSBlbHNlXHJcbiAgICAgIGRpc3BsYXlMaW5lID0gSW50MzIuTWluVmFsdWU7XHJcblxyXG4gICAgbGV0IGxhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcblxyXG4gICAgLy8gcHJldmVudCBkb3VibGUgcHJlZml4IG9uIHRoZSBzYW1lIGNvbnRyb2xcclxuICAgIC8vIEZvciBGYXN0IE1vZGUsIENTIGlzIGV4ZWN1dGVkIGZyb20gaGVyZSwgd2hlcmVhcyBmb3Igc3RlcCBtb2RlIGl0IGlzIGRvbmVcclxuICAgIC8vIGluIG1vdmVJblJvdy4gc28sIGZvciBzdGVwIG1vZGUgZG91YmxlIGV4ZWN1dGlvbiBvZiBDUyBtdXN0IGJlIHN0b3BwZWQuXHJcbiAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IG51bGwgJiYgKDxUYXNrPmxhc3RQYXJrZWRDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldE1HRGF0YSgpLkdldElkKCkgPT09ICg8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldE1HRGF0YSgpLkdldElkKCkgJiYgbGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKSB7XHJcbiAgICAgIGlmICgoY3RybCAhPT0gbGFzdFBhcmtlZEN0cmwgfHwgKGN0cmwuaXNSZXBlYXRhYmxlKCkgJiYgZGlzcGxheUxpbmUgIT09IGN0cmwuZ2V0RGlzcGxheUxpbmUodHJ1ZSkpKSAmJiAhbGFzdFBhcmtlZEN0cmwuaXNJbkNvbnRyb2xTdWZmaXgoKSlcclxuICAgICAgLy8gUUNSICM5NzA4MDZcclxuICAgICAge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGxhc3RQYXJrZWRDdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpO1xyXG4gICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWCB8fCBjdHJsLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICAgIGN0cmwucmVzZXRQcmV2VmFsKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGN0cmwuUmVmcmVzaERpc3BsYXkoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIFRPRE86IEZvY3VzICYgVGFiYmluZzogSGFuZGxlIFBhcmtpbmcgaW4gdGhpcyBjYXNlLiBTaG91bGQgbm90IHJldHVybiBmYWxzZSBpbiBzY3JlZW4gbW9kZVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRhc2suSW5DdHJsUHJlZml4KVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgdGFzay5JbkN0cmxQcmVmaXggPSB0cnVlO1xyXG5cclxuICAgIC8vIG1ha2Ugc3VyZSBpdCBoYXMgbm90IGNvbWUgYWdhaW4gdGhyb3VnaCBtb3ZlaW5yb3cuXHJcbiAgICAvLyBlZzogaWYgY2xpY2tlZCBjdHJsIG9uIHN1YmZvcm0gaXMgbm9uIHBhcmthYmxlLCBmaXJzdCB0aW1lIGl0IGV4ZWN1dGVzIFJQIENWIGZvciBzdWJmb3JtcyBhbmQgdGhlblxyXG4gICAgLy8gZW50ZXJzIG1vdmVpbnJvdyBmb3IgcGFya2FibGUgY3RybC4gd2Ugc2hvdWxkbm90IGV4ZWN1dGUgdGhpcyBibG9jayB3aGVuIHdlIGNvbWUgZm9yIENQIG9mIHBhcmthYmxlIGN0cmwuXHJcbiAgICAvLyBGb3IgdGFiLCB3ZSBjb21lIGhlcmUgZGlyZWN0bHkgZm9yIHBhcmthYmxlIGN0cmwsIGFuZCB0aGlzIGJsb2NrIG11c3QgYWx3YXlzIGV4ZWN1dGUgaWYgb24gZGlmZiBmb3Jtcy5cclxuICAgIC8vIGlzU29ydCA6IGlmIGNsaWNrZWQgb24gdGFibGUgaGVhZGVyLCB3ZSBwYXJrIG9uIGNvbG9tbiBjdHJsIGFmdGVyIHNvcnQsIGFuZCB3ZSBtdXN0IGluY2x1ZGUgc3ViZm9ybXNcclxuICAgIC8vIGluIGV4ZWN1dGluZyBDVnNcclxuXHJcbiAgICAvLyBUT0RPOiBUYWJiaW5nICYgRm9jdXNpbmc6IENoZWNrIGdldExhc3RNb3ZlSW5Sb3dEaXJlY3Rpb24gaXMgcmVsZXZhbnQuIFdoaWxlIG1vdmluZyBiZXR3ZWVuIGNvbnRyb2xzIGJ5IFRhYiBjb2RlIGluIGlmIGJsb2NrIHdhcyBub3QgY2FsbGVkLlxyXG4gICAgLy8gQnV0IGl0IHdhcyBjYWxsZWQgb24gY2xpY2sgdG8gYW5vdGhlciBjb250cm9sLlxyXG4gICAgLy9pZiAodGFzay5nZXRMYXN0TW92ZUluUm93RGlyZWN0aW9uKCkgPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9OT05FIHx8IHRoaXMuX2lzU29ydGluZykge1xyXG5cclxuICAgIC8vIElmIHRoZSBjdXJyZW50IGN0cmwgaXMgb24gYSBzdWJmb3JtLCB0aGVuIGV4ZWN1dGUgaW4gc2VxdWVuY2VcclxuICAgIC8vIDEuIFJTIG9mIG5lc3RlZCBzdWJmb3JtcyB1bnRpbCBzdWJmb3JtIHRhc2sgY29udGFpbmcgdGhlc2UgMiBzdWJmb3Jtcy4gd2UgbXVzdCBhbHNvIGV4ZWN1dGUgUlMgaWYgY2xpY2tlZFxyXG4gICAgLy8gICAgaW4gc3ViZm9ybSBhbmQgcGFya2VkIGJhY2sgb24gYSBjdHJsJ3MgdGFzay4gKCM3MjIxMTUtIGN1cnJDbGlja2VkQ3RybCBhbmQgY3RybCBzaG91bGQgbm90IGJlIG9uIGRpZmZlcmVudCB3aW5kb3cpXHJcbiAgICAvLyAyLiBDViBleGVjdXRpb24gb2YgTGFzdFBhcmtlZEN0cmwgdGlsbCBlbmRcclxuICAgIC8vIDMuIFJQLUNWcyBmb3IgYWxsIGludGVybWVkaWF0ZSBzdWJmb3Jtc1xyXG4gICAgbGV0IHByZXZDdHJsOiBNZ0NvbnRyb2wgPSBsYXN0UGFya2VkQ3RybDtcclxuICAgIGlmIChjdXJyQ2xpY2tlZEN0cmwgIT09IG51bGwgJiYgKDxUYXNrPmN1cnJDbGlja2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNZ2RJRCgpID09PSAoPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNZ2RJRCgpICYmIGN0cmwub25EaWZmRm9ybShjdXJyQ2xpY2tlZEN0cmwpKVxyXG4gICAgICBwcmV2Q3RybCA9IGN1cnJDbGlja2VkQ3RybDtcclxuXHJcbiAgICBpZiAocHJldkN0cmwgIT09IG51bGwgJiYgY3RybC5vbkRpZmZGb3JtKHByZXZDdHJsKSkge1xyXG4gICAgICAvLyBSUyBvZiBuZXN0ZWQgc3ViZm9ybXMgdW50aWwgc3ViZm9ybSB0YXNrIGNvbnRhbmluZyB0aGVzZSAyIHN1YmZvcm1zXHJcbiAgICAgIGxldCBwcmV2VGFzazogVGFzayA9IDxUYXNrPnByZXZDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICAgIGF3YWl0IHByZXZUYXNrLmV4ZWNTdWJmb3JtUmVjU3VmZml4KDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSk7XHJcbiAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElTVCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1ggfHwgY3RybC5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgICAgY3RybC5yZXNldFByZXZWYWwoKTtcclxuICAgICAgICAgIGF3YWl0IGN0cmwuUmVmcmVzaERpc3BsYXkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuaXNBYm9ydGluZygpKSB7XHJcbiAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IEV2ZW50c01hbmFnZXIuZG9TeW5jRm9yU3ViZm9ybVBhcmVudCh0YXNrKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBFeGVjdXRlIFJQIG9mIHRoZSBjdXJyZW50IHRhc2sgYmVmb3JlIGV4ZWN1dGluZyB0aGUgQ1ZzIGJlZm9yZSAnY3RybCdcclxuICAgIGlmICh0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGFzay5TdWJmb3JtRXhlY01vZGUgPSBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uU0VUX0ZPQ1VTO1xyXG4gICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCwgZGlzcGxheUxpbmUpO1xyXG4gICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy99XHJcblxyXG4gICAgLy8gUUNSIyA4MDYwMTU6IElmIHdlIGhhdmUgYSBzaW5nbGUgZmllbGQgd2l0aCBhbGxvdyBwYXJraW5nID0gWWVzIGFuZCBUYWIgSW50byA9IE5vLCB0aGVuIG9uIHByZXNzaW5nIHRhYiBpZiBjdXJzb3IgaXMgbm90IG1vdmVkLCB3ZSBjb21lIHRvXHJcbiAgICAvLyBwYXJrIG9uIGxhc3RQYXJrZWRDdHJsKHdoaWNoIGlzIHNhbWUgYXMgY3RybCkgc2luY2UgVGFiSW50byBpcyBub3QgYWxsb3dlZC5cclxuICAgIC8vIFNvIHRvIGF2YW9pZCBpbmZpbml0ZSByZWN1cnNpb24sIHdlIHNob3VsZCBub3QgYWdhaW4gdHJ5IHRvIHBhcmsgb24gaXQuXHJcbiAgICBpZiAoIWF3YWl0IGN0cmwuSXNQYXJrYWJsZSgpICYmIGN0cmwgIT09IGxhc3RQYXJrZWRDdHJsKSB7XHJcbiAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAobGFzdFBhcmtlZEN0cmwgPT09IG51bGwgfHwgIWF3YWl0IGxhc3RQYXJrZWRDdHJsLmludm9rZSgpKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyhjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpO1xyXG5cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVN1cHBvcnRUb0xvZyhOU3RyaW5nLkZvcm1hdCgnezB9IEVudGVyaW5nIGNvbnRyb2w6IGNvbnRyb2wgezF9LCByb3cgezJ9JywgdGFzay5HZXRUYXNrRGV0YWlscygpLCBjdHJsLk5hbWUsIGRpc3BsYXlMaW5lIDwgMCA/IDAgOiBkaXNwbGF5TGluZSksIHRydWUpO1xyXG5cclxuICAgIC8vIGlmIHdlIGhhdmUgYSBzdG9wIGV4ZWN1dGlvbiBjdHJsLCB3ZSBuZWVkIHRvIHVzZSBpdCBhcyBhIHNyY3RybCwgb3RoZXJ3aXNlIHVzZVxyXG4gICAgLy8gdGhlIGN0cmwgb24gd2hpY2ggd2UgZXhlY3V0ZWQgbGFzdCBDUy5cclxuXHJcblxyXG4gICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKTtcclxuICAgIGN0cmwuS2V5U3Ryb2tlT24gPSBmYWxzZTtcclxuICAgIGN0cmwuTW9kaWZpZWRCeVVzZXIgPSBmYWxzZTtcclxuXHJcbiAgICB0YXNrLnNldEN1cnJGaWVsZChjdHJsLmdldEZpZWxkKCkpO1xyXG5cclxuICAgIGlmIChjdHJsLklzUmVwZWF0YWJsZSlcclxuICAgICAgYXdhaXQgZm9ybS5icmluZ1JlY29yZFRvUGFnZSgpO1xyXG5cclxuICAgIC8vIGVuYWJsZS1kaXNhYmxlIGFjdGlvbnMgZm9yIFN1YmZvcm1zXHJcbiAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IGN0cmwpIHtcclxuICAgICAgaWYgKChsYXN0UGFya2VkQ3RybCA9PT0gbnVsbCAmJiBjdHJsLmdldEZvcm0oKS5pc1N1YkZvcm0oKSkgfHwgKGxhc3RQYXJrZWRDdHJsICE9PSBudWxsICYmIChjdHJsLmdldEZvcm0oKS5pc1N1YkZvcm0oKSB8fCBsYXN0UGFya2VkQ3RybC5nZXRGb3JtKCkuaXNTdWJGb3JtKCkpKSkge1xyXG4gICAgICAgIGxldCBsYXN0UGFya2VkVGFzazogVGFzayA9IG51bGw7XHJcbiAgICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsICE9PSBudWxsKVxyXG4gICAgICAgICAgbGFzdFBhcmtlZFRhc2sgPSA8VGFzaz5sYXN0UGFya2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG5cclxuICAgICAgICBpZiAobGFzdFBhcmtlZFRhc2sgIT09IHRhc2spIHtcclxuICAgICAgICAgIGxldCBmaXJzdFRpbWU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgICAgbGV0IGlzU29uU3ViZm9ybTogYm9vbGVhbjtcclxuICAgICAgICAgIGxldCBwYXJlbnRUYXNrOiBUYXNrO1xyXG5cclxuICAgICAgICAgIGlmIChsYXN0UGFya2VkVGFzayAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpc1NvblN1YmZvcm0gPSBsYXN0UGFya2VkVGFzay5Jc1N1YkZvcm07XHJcblxyXG4gICAgICAgICAgICBmb3IgKHBhcmVudFRhc2sgPSBsYXN0UGFya2VkVGFzazsgcGFyZW50VGFzayAhPT0gbnVsbCAmJiBpc1NvblN1YmZvcm07IHBhcmVudFRhc2sgPSA8VGFzaz5wYXJlbnRUYXNrLmdldFBhcmVudCgpKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCFmaXJzdFRpbWUpIHtcclxuICAgICAgICAgICAgICAgIGlzU29uU3ViZm9ybSA9IHBhcmVudFRhc2suSXNTdWJGb3JtO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50VGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50VGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfREVMTElORSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50VGFzay5lbmFibGVDcmVhdGVBY3RzKGZhbHNlKTtcclxuICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaXNTb25TdWJmb3JtID0gdGFzay5Jc1N1YkZvcm07XHJcblxyXG4gICAgICAgICAgZm9yIChwYXJlbnRUYXNrID0gPFRhc2s+dGFzay5nZXRQYXJlbnQoKTsgKHBhcmVudFRhc2sgIT09IG51bGwpICYmIGlzU29uU3ViZm9ybTsgcGFyZW50VGFzayA9IDxUYXNrPnBhcmVudFRhc2suZ2V0UGFyZW50KCkpIHtcclxuICAgICAgICAgICAgaXNTb25TdWJmb3JtID0gcGFyZW50VGFzay5Jc1N1YkZvcm07XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRUYXNrLmdldEVuYWJsZVpvb21IYW5kbGVyKCkpXHJcbiAgICAgICAgICAgICAgcGFyZW50VGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHBhcmVudFRhc2suc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gV2hlbmV2ZXIgd2UgYXJlIG1vdmluZyBiZXR3ZWVuIHRhc2tzLCByZS1ldmFsdWF0ZSBBbGxvd01vZGVzLlxyXG4gICAgICAgICAgYXdhaXQgdGFzay5lbmFibGVNb2RlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGVuYWJsZSBhY3Rpb25zIGFuZCBzdGF0ZXNcclxuICAgIGlmICh0YXNrLmdldEVuYWJsZVpvb21IYW5kbGVyKCkgfHwgY3RybC51c2Vab29tSGFuZGxlcigpKVxyXG4gICAgICB0YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NLCB0cnVlKTtcclxuXHJcbiAgICBpZiAoY3RybC5pc1RleHRDb250cm9sKCkgfHwgY3RybC5pc0Nob2ljZUNvbnRyb2woKSlcclxuICAgICAgY3RybC5TZXRLZXlib2FyZExhbmd1YWdlKCk7XHJcblxyXG4gICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKVxyXG4gICAgICB0YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9CVVRUT04sIHRydWUpO1xyXG4gICAgYXdhaXQgdGFzay5zZXRDcmVhdGVEZWxldGVBY3RzRW5hYmxlU3RhdGUoKTtcclxuXHJcbiAgICBsZXQgZmllbGQ6IEZpZWxkID0gPEZpZWxkPmN0cmwuZ2V0RmllbGQoKTtcclxuICAgIGlmIChmaWVsZCAhPT0gbnVsbCAmJiBmaWVsZC5OdWxsQWxsb3dlZCAmJiBjdHJsLmlzTW9kaWZpYWJsZSgpICYmIGN0cmwuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKVxyXG4gICAgICB0YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9FRFRfTlVMTCwgdHJ1ZSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGRvIHNvbWUgZGVmYXVsdCBvcGVyYXRpb25zIGZvciBhbiBldmVudCBhbmQgcmV0dXJuIHRydWUgdG8gdGVsbCB0aGUgY2FsbGVyXHJcbiAgLy8vICAgdG8gY29udGludWUgaGFuZGxpbmcgdGhlIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2dFwiPnRoZSBldmVudCB0byBoYW5kbGU8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGVsbHMgdGhlIGNhbGxlciB3aGV0aGVyIHRvIGNvbnRpbnVlIGhhbmRsaW5nIHRoZSBldmVudDwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGNvbW1vbkhhbmRsZXJCZWZvcmUoZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBldnRTYXZlOiBSdW5UaW1lRXZlbnQgPSBldnQ7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPmV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgcmVjOiBSZWNvcmQgPSBudWxsO1xyXG4gICAgbGV0IHByZXZSZWM6IFJlY29yZCA9IG51bGw7XHJcbiAgICBsZXQgdmFsOiBzdHJpbmc7XHJcbiAgICBsZXQgb2xkRGlzcGxheUxpbmU6IG51bWJlciA9IEludDMyLk1pblZhbHVlO1xyXG5cclxuICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRhc2suaXNBYm9ydGluZygpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfU1lTVEVNKSB7XHJcbiAgICAgIGxldCBhY3RJZDogbnVtYmVyID0gdGhpcy5nZXRNYXRjaGluZ0FjdGlvbihldnQuZ2V0S2JkSXRtKCkpO1xyXG4gICAgICBpZiAoYWN0SWQgIT09IDAgJiYgZXZ0LkNvbnRyb2wgIT09IG51bGwpXHJcbiAgICAgIC8vICYmIGFjdElkICE9IE1HX0FDVF9TRUxFQ1QpXHJcbiAgICAgIHtcclxuICAgICAgICBldnQgPSBuZXcgUnVuVGltZUV2ZW50KGV2dCwgZXZ0KTtcclxuICAgICAgICBldnQuc2V0SW50ZXJuYWwoYWN0SWQpO1xyXG4gICAgICAgIGV2dC5zZXRBcmdMaXN0KG51bGwpO1xyXG4gICAgICAgIGxldCBtZ0NvbnRyb2w6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2w7XHJcbiAgICAgICAgZXZ0U2F2ZS5zZXRDdHJsKG1nQ29udHJvbCk7XHJcbiAgICAgICAgaWYgKG1nQ29udHJvbCA9PT0gbnVsbClcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFFDUiMgOTM5MjUzIC0gd2UgaGF2ZSB0byBwcm9jZXNzIGNvbW1vbkhhbmRsZXJCZWZvcmUgZXZlbiBmb3IgaW50ZXJuYWwgZXZlbnQgY29udmVydGVkXHJcbiAgICAvLyBmcm9tIHN5c3RlbSBFdmVudFxyXG4gICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuICAgICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICAgIGxldCBkaXNwbGF5TGluZTogbnVtYmVyID0gZXZ0LmdldERpc3BsYXlMaW5lKCk7XHJcbiAgICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuICAgICAgcmVjID0gZHYuZ2V0Q3VyclJlYygpO1xyXG5cclxuICAgICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2w7XHJcbiAgICAgIGxldCBpbnRFdnRDb2RlOiBudW1iZXIgPSBldnQuZ2V0SW50ZXJuYWxDb2RlKCk7XHJcblxyXG4gICAgICBsZXQgbGFzdEZvY3VzZWRDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcblxyXG4gICAgICAvLyBmb3IgaW50ZXJuYWwgZXZlbnRzXHJcbiAgICAgIHN3aXRjaCAoaW50RXZ0Q29kZSkge1xyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT006XHJcbiAgICAgICAgICBsZXQgYm9vbHZhbCA9IGF3YWl0IHRoaXMuc2VsZWN0UHJvZyhjdHJsKTtcclxuICAgICAgICAgIGlmIChib29sdmFsKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCX09OX0RCTElDSzpcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX0ZPQ1VTOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGb2N1cyhjdHJsLCBkaXNwbGF5TGluZSwgZXZ0LmlzUHJvZHVjZUNsaWNrKCkpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX0ZPQ1VTX09OX05PTl9NQUdJQ19DT05UUk9MOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGb2N1c09uTm9uTWFnaWNDb250cm9sKGN0cmwpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX0tFWURPV046XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUtleURvd24odGFzaywgY3RybCwgZXZ0KTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9NT1VTRVVQOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVNb3VzZVVwKGN0cmwsIGRpc3BsYXlMaW5lLCBldnQuaXNQcm9kdWNlQ2xpY2soKSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVElPTjpcclxuICAgICAgICAgIGF3YWl0IHRoaXMub25BY3RTZWxlY3Rpb24oY3RybCwgZm9ybSwgZXZ0KTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVElNRVI6XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZVRpbWVyKGV2dCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFU0laRTpcclxuICAgICAgICAgIHRoaXMuaGFuZGxlUmVzaXplKGN0cmwsIGRpc3BsYXlMaW5lKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUk9XX0RBVEFfQ1VSUl9QQUdFOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVSb3dEYXRhQ3VyUGFnZShjdHJsLCBkaXNwbGF5TGluZSwgZXZ0LmlzU2VuZEFsbCgpLCBldnQuTGFzdEZvY3VzZWRWYWwpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9EVl9UT19HVUk6XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZVRyYW5zZmVyRGF0YVRvR3VpKGN0cmwpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9GRVRDSF9SRUNPUkRTX0FIRUFEX0ZST01fU0VSVkVSOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5mZXRjaFJlY29yZHNBaGVhZEZyb21TZXJ2ZXIoY3RybCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU5BQkxFX0VWRU5UUzpcclxuICAgICAgICAgIHRoaXMuaGFuZGxlRW5hYmxlRXZlbnRzKGV2dCwgdHJ1ZSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RJU0FCTEVfRVZFTlRTOlxyXG4gICAgICAgICAgdGhpcy5oYW5kbGVFbmFibGVFdmVudHMoZXZ0LCBmYWxzZSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfUFJFRklYOlxyXG4gICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWDpcclxuICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWDpcclxuICAgICAgICAgIC8vIERlZmVjdCAxMTU5MDMuIERvIG5vdCBleGVjdXRlIFJQIGlmIHRoZSBzdWJmb3JtIHBhcmVudCB0YXNrIGRpZG4ndCBmaW5pc2hlZCB5ZXRcclxuICAgICAgICAgIC8vIGl0J3MgQ29tbW9uSGFuZGxlckJlZm9yZSBmb3IgUlAuXHJcbiAgICAgICAgICBpZiAodGFzay5Jc1N1YkZvcm0gJiYgKDxUYXNrPnRhc2suZ2V0UGFyZW50KCkpLkluQ29tbW9uSGFuZGxlckJlZm9yZVJQKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgLy8gUmVjb3ZlcnkgZnJvbSB0cmFuc2FjdGlvbiByZXN0YXJ0IHdhcyBjb21wbGV0ZWQuIFdlIG1heSBub3cgY2xlYXIgdGhlIGZsYWdcclxuICAgICAgICAgIHRhc2suc2V0QWZ0ZXJSZXRyeShDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FKTtcclxuICAgICAgICAgIHRhc2suRGF0YVN5bmNlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIGlmICghdGFzay5pc1N0YXJ0ZWQoKSlcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHJcbiAgICAgICAgICAvLyBpZiB0aGUgZm9ybSBjb250YWlucyBhIHRhYmxlIGFuZCB0aGUgY29udHJvbCB3YXMgaW4gdGhlIHRhYmxlXHJcbiAgICAgICAgICAvLyBtb3ZlIHRvIHRoZSBuZXcgcm93XHJcbiAgICAgICAgICBpZiAoZm9ybS5nZXRSb3dzSW5QYWdlKCkgPiBJbnQzMi5NaW5WYWx1ZSAmJiBkaXNwbGF5TGluZSA+IEludDMyLk1pblZhbHVlKSB7XHJcbiAgICAgICAgICAgIC8vIGVuc3VyZSBhIHZhbGlkIHJvd1xyXG4gICAgICAgICAgICB3aGlsZSAoIWR2LnJlY0V4aXN0cyhkaXNwbGF5TGluZSkgJiYgZGlzcGxheUxpbmUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgZGlzcGxheUxpbmUtLTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZGlzcGxheUxpbmUgPj0gMCkge1xyXG4gICAgICAgICAgICAgIHByZXZSZWMgPSBkdi5nZXRDdXJyUmVjKCk7XHJcbiAgICAgICAgICAgICAgbGV0IG9sZFRhc2tNb2RlOiBzdHJpbmcgPSB0YXNrLmdldE1vZGUoKTtcclxuICAgICAgICAgICAgICBsZXQgb2xkUmVjSWQ6IG51bWJlciA9IHByZXZSZWMuZ2V0SWQoKTtcclxuXHJcbiAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIG9sZERpc3BsYXlMaW5lID0gZm9ybS5EaXNwbGF5TGluZTtcclxuICAgICAgICAgICAgICAgIC8vIG9sZERpc3BsYXlMaW5lID0gZm9ybS5nZXRDdXJyUm93KClcclxuICAgICAgICAgICAgICAgIGZvcm0uUHJldkRpc3BsYXlMaW5lID0gb2xkRGlzcGxheUxpbmU7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKGRpc3BsYXlMaW5lLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHRoZSBkaXNwbGF5IGlmIHRoZSBwcmV2aW91cyByZWNvcmQgd2FzIGRlbGV0ZWQgb3IgY2FuY2VsZWRcclxuICAgICAgICAgICAgICAgIGlmIChwcmV2UmVjICE9IG51bGwgJiYgIWR2LnJlY0V4aXN0c0J5SWQocHJldlJlYy5nZXRJZCgpKSkge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfVEFCTEUpO1xyXG4gICAgICAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHJlZnJlc2ggaXMgZXNzZW50aWFsLiBJZiBpdCBmYWlscyBiZWNhdXNlIG9mIGFuXHJcbiAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB0aGVuIHRoZSBvbGQgY3VyciByb3cgaXMgcmVzdG9yZWQgKGluIHRoZSBjYXRjaFxyXG4gICAgICAgICAgICAgICAgICAvLyBzdGF0ZW1lbnQpLiBJdCBjYW4gaGFwcGVuIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIGEgbGluZSB3aGljaFxyXG4gICAgICAgICAgICAgICAgICAvLyBiZWNvbWVzIGJsYW5rIGR1ZSB0byB0aGUgZGVsZXRpb24gb2YgdGhlIHByZXZpb3VzIHJlY29yZC5cclxuICAgICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlYyA9IGR2LmdldEN1cnJSZWMoKTtcclxuICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob2xkVGFza01vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmIG9sZERpc3BsYXlMaW5lID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgIWR2LnJlY0V4aXN0c0J5SWQob2xkUmVjSWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJldkxpbmU6IG51bWJlciA9IGZvcm0uZ2V0UHJldkxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5yZXN0b3JlT2xkRGlzcGxheUxpbmUocHJldkxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxhc3RGb2N1c2VkQ3RybCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEZvY3VzZWRDdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBsYXN0Rm9jdXNlZEN0cmwuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZS5TdGFja1RyYWNlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB0aHJvdyBlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKCdpbiBFdmVudHNNYW5hZ2VyLmNvbW1vbkhhbmRsZXJCZWZvcmUoKTogaW52YWxpZCBsaW5lIG51bWJlcjogJyArXHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocmVjID09IG51bGwpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcclxuICAgICAgICAgICAgICAnaW4gRXZlbnRzTWFuYWdlci5jb21tb25IYW5kbGVyQmVmb3JlKCk6IG5vIGN1cnJlbnQgcmVjb3JkIGF2YWlsYWJsZSAhJyk7XHJcblxyXG4gICAgICAgICAgLy8gb25seSBmb3Igbm9uIGludGVyYWN0aXZlIHRhc2tzLiBJbmNyZWFzZSB0aGUgdGFzaydzIGNvdW50ZXIgZm9yIGV2ZXJ5IHJlY29yZCB3ZSBwYXNzLlxyXG4gICAgICAgICAgLy8gZG8gaXQgYmVmb3JlIHRoZSBldmFsRW5kQ29uZCBzaW5jZSBpdCBtaWdodCBpbmNsdWRlIGNvdW50ZXIoMCkuXHJcbiAgICAgICAgICAvLyBpbmNyZWFzZSBvbmx5IGlmIGdvaW5nIGludG8gdGhlIHJlYyBwcmVmaXguXHJcbiAgICAgICAgICBpZiAoIXRhc2suSXNJbnRlcmFjdGl2ZSAmJiB0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgICAgIHRhc2suaW5jcmVhc2VDb3VudGVyKCk7XHJcblxyXG4gICAgICAgICAgLy8gY2hlY2sgdGhlIFwidGFzayBlbmQgY29uZGl0aW9uXCIgYmVmb3JlIGVudGVyaW5nIHRoZSByZWNvcmRcclxuICAgICAgICAgIGlmIChhd2FpdCB0YXNrLmV2YWxFbmRDb25kKENvbnN0SW50ZXJmYWNlLkVORF9DT05EX0VWQUxfQkVGT1JFKSkge1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGZvcm0uSGFzVGFibGUoKSlcclxuICAgICAgICAgICAgYXdhaXQgZm9ybS5icmluZ1JlY29yZFRvUGFnZSgpO1xyXG5cclxuICAgICAgICAgIC8vIHRvIHByZXZlbnQgZG91YmxlIHByZWZpeCBvbiB0aGUgc2FtZSByZWNvcmRcclxuICAgICAgICAgIGlmICh0YXNrLmdldExldmVsKCkgIT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG5cclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKCdSRUNPUkQgUFJFRklYOiAnICsgdGFzay5xdWVyeVRhc2tQYXRoKCkpO1xyXG4gICAgICAgICAgKGR2LmdldEN1cnJSZWMoKSkuc2V0Rm9yY2VTYXZlT3JnKGZhbHNlKTtcclxuICAgICAgICAgIChkdi5nZXRDdXJyUmVjKCkpLlN5bmNlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIGR2LnNhdmVPcmlnaW5hbCgpO1xyXG5cclxuICAgICAgICAgIC8vIGRvIFJlY29yZCBQcmVmaXggZm9yIGFsbCBmYXRoZXJzIHRoYXQgdGhlaXIgUmVjb3JkIFByZWZpeCBpcyBub3QgZG9uZSBlYXJsaWVyXHJcbiAgICAgICAgICBpZiAodGFzay5Jc1N1YkZvcm0gJiYgdGFzay5QZXJmb3JtUGFyZW50UmVjb3JkUHJlZml4KSB7XHJcbiAgICAgICAgICAgIGxldCBwYXJlbnRUYXNrID0gdGFzay5nZXRQYXJlbnQoKTtcclxuICAgICAgICAgICAgd2hpbGUgKHBhcmVudFRhc2suSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHBhcmVudFRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2socGFyZW50VGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50VGFzayA9IHBhcmVudFRhc2suZ2V0UGFyZW50KCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gaGFuZGxlIHN1Yi1mb3Jtc1xyXG4gICAgICAgICAgdGFzay5JbkNvbW1vbkhhbmRsZXJCZWZvcmVSUCA9IHRydWU7XHJcbiAgICAgICAgICBpZiAoYXdhaXQgdGFzay5DaGVja1JlZnJlc2hTdWJUYXNrcygpKVxyXG4gICAgICAgICAgICBhd2FpdCBkdi5jb21wdXRlU3ViRm9ybXMoKTtcclxuICAgICAgICAgIHRhc2suSW5Db21tb25IYW5kbGVyQmVmb3JlUlAgPSBmYWxzZTtcclxuICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKTtcclxuICAgICAgICAgIC8vIGVuYWJsZS1kaXNhYmxlIGFjdGlvbnMgZm9yIGEgcmVjb3JkXHJcbiAgICAgICAgICBhd2FpdCB0YXNrLmVuYWJsZVJlY29yZEFjdGlvbnMoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYOlxyXG4gICAgICAgICAgLy8gRm9yY2UgcmVjb3JkIHN1ZmZpeDpcclxuICAgICAgICAgIGxldCBmb3JjZVN1ZmZpeDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgbGV0IGlzU2VsZWN0aW9uVGFibGU6IGJvb2xlYW47XHJcblxyXG4gICAgICAgICAgdGFzay5Db25maXJtVXBkYXRlTm8gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAvLyBObyByZWNvcmQgLT4gbm8gc3VmZml4XHJcbiAgICAgICAgICBpZiAocmVjID09IG51bGwpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICBmb3JjZVN1ZmZpeCA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgIC8vIGRvIG5vdCBleGVjdXRlIHRoZSBcImJlZm9yZSByZWNvcmQgc3VmZml4XCIgd2hlbiBkZWxldGluZyB0aGUgcmVjb3JkIGFuZFxyXG4gICAgICAgICAgLy8gdGhlIHRhc2sgbW9kZSBpcyBkZWxldGUgKHRoZSBzZWNvbmQgcm91bmQpXHJcbiAgICAgICAgICBpZiAoKHJlYy5Nb2RpZmllZCB8fCBmb3JjZVN1ZmZpeCkgJiYgcmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSAmJlxyXG4gICAgICAgICAgICB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgICAgIC8vIHRvIHByZXZlbnQgZG91YmxlIHN1ZmZpeCBvbiB0aGUgc2FtZSByZWNvcmRcclxuICAgICAgICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKSB7XHJcbiAgICAgICAgICAgIHRhc2suc2V0SW5SZWNvcmRTdWZmaXgodHJ1ZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuICAgICAgICAgICAgdGFzay5zZXRJblJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBhd2FpdCB0YXNrLmhhbmRsZUV2ZW50T25TbGF2ZVRhc2tzKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZygnUkVDT1JEIFNVRkZJWDogJyArIHRhc2sucXVlcnlUYXNrUGF0aCgpKTtcclxuXHJcblxyXG4gICAgICAgICAgLy8gaW5kaWNhdGUgbmV4dCB2ZXJpZnlDdHJsIGlzIHRoZSBmaXJzdCBjdHJsIGluIHRoZSByZWNvcmRcclxuXHJcbiAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG5cclxuICAgICAgICAgIGlzU2VsZWN0aW9uVGFibGUgPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RJT04sIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAvLyBRdWVyeSBtb2RlIC0+IGRvIHN1ZmZpeCBvbmx5IGlmIHdlIGZvcmNlIGl0IG9yIHNvbWVob3cgdGhlIHJlY29yZCB3YXMgdXBkYXRlZFxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZICYmICFmb3JjZVN1ZmZpeCAmJiAhcmVjLk1vZGlmaWVkICYmXHJcbiAgICAgICAgICAgICFpc1NlbGVjdGlvblRhYmxlKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKCFyZWMuTW9kaWZpZWQgJiYgIWZvcmNlU3VmZml4ICYmICghaXNTZWxlY3Rpb25UYWJsZSB8fCAhdGFzay5JblNlbGVjdCkpIHtcclxuICAgICAgICAgICAgaWYgKHJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlQ29udHJvbFZlcmlmaWNhdGlvbih0YXNrKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSAmJiByZWMuTW9kaWZpZWQpIHtcclxuICAgICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLnVwZGF0ZUNvbmZpcm1lZCh0YXNrKSlcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbGV0IHN0b3BFeGVjdXRpb246IGJvb2xlYW4gPSAhYXdhaXQgdGhpcy5leGVjdXRlQ29udHJvbFZlcmlmaWNhdGlvbih0YXNrKTtcclxuICAgICAgICAgIC8vIGRvIG5vdCBjb250aW51ZSBwcm9jZXNzaW5nIFJTIGlmIENWIHJldHVybnMgZXJyb3JcclxuICAgICAgICAgIGlmIChzdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVg6XHJcbiAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5oYW5kbGVDdHJsUHJlZml4KGV2dCkpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGRpZCBub3Qgc3VjY2VlZCBpbiBlbnRlcmluZyB0aGUgY3RybFxyXG4gICAgICAgICAgICBldnQuQ29udHJvbC5JbkNvbnRyb2wgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUw6XHJcbiAgICAgICAgICBNYW5hZ2VyLkNsZWFuTWVzc2FnZVBhbmUodGFzayk7IC8vIFFDUiAjMzcxMzIxXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVg6XHJcblxyXG4gICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIHN0b3BleGVjdXRpb24gY3RybCB3ZSBzaG91bGQgbm90IGV4ZWN1dGUgQ1MuXHJcbiAgICAgICAgICBpZiAoY3RybCA9PSBudWxsIHx8IHRoaXMuZ2V0U3RvcEV4ZWN1dGlvbkN0cmwoKSAhPSBudWxsKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgLy8gdG8gcHJldmVudCBkb3VibGUgc3VmZml4IG9uIHRoZSBzYW1lIGNvbnRyb2xcclxuICAgICAgICAgIGlmICh0YXNrLmdldExldmVsKCkgIT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAoIWN0cmwuaXNTdWJmb3JtKCkpIHtcclxuICAgICAgICAgICAgdmFsID0gTWFuYWdlci5HZXRDdHJsVmFsKGN0cmwpO1xyXG5cclxuICAgICAgICAgICAgLy8gV2UgYXJlIHJlc2V0dGluZyB0aGUgZmxhZyBhcyB3ZSBhcmUgbW92aW5nIGZyb20gb25lIGNvbnRyb2wgdG8gb3RoZXIgY29udHJvbC5cclxuICAgICAgICAgICAgdGFzay5DdXJyZW50RWRpdGluZ0NvbnRyb2wgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgLy8gdmFsaWRhdGUgdGhlIGNvbnRyb2xzIHZhbHVlXHJcbiAgICAgICAgICAgIC8vIEZpeGVkIGJ1ZyAjOjc1ODc4OCwgdGhlIGJyb3dzZXIgY29udHJvbCB3aWxsIG5vdCBiZSB1cGRhdGUgZnJvbSB0aGUgZmlsZWQuXHJcbiAgICAgICAgICAgIC8vIFBhdGNoIGZvciBRQ1IgIzcyOTcwNjpcclxuICAgICAgICAgICAgLy8gTWFnaWMgdGhyZWFkIHB1dHMgdGhlIGZvbGxvd2luZyBHVUkgY29tbWFuZHM6XHJcbiAgICAgICAgICAgIC8vICAgIFBST1BfU0VUX0lNQUdFX0ZJTEVfTkFNRSB0byBzZXQgdGhlIGltYWdlIG9uIHRoZSBJbWFnZSBjb250cm9sLlxyXG4gICAgICAgICAgICAvLyAgICBQUk9QX1NFVF9URVhUIHRvIHNldCB0aGUgdGV4dCBvZiB0aGUgVGV4dEJveCBjb250cm9sLlxyXG4gICAgICAgICAgICAvLyAgICBTRVRfRk9DVVMgdG8gZm9jdXMgb24gdGhlIFRleHRCb3ggY29udHJvbC5cclxuICAgICAgICAgICAgLy8gTm93LCB3aGVuIHRoZSBleGVjdXRpb24gaXMgYnkgRjcsIGlmIHRoZSBmaWxlIGlzIG5vdCByZXRyaWV2ZWQgZnJvbSB0aGUgc2VydmVyXHJcbiAgICAgICAgICAgIC8vIChpLmUuIGlmIHRoZXJlIGlzIDQwNCBlcnJvciksIEh0dHBDbGllbnQgcmUtdHJpZXMgdG8gZ2V0IHRoZSBmaWxlIGZvciBIVFRQdGltZW91dC5cclxuICAgICAgICAgICAgLy8gRHVyaW5nIHRoaXMgdGltZSBhbGwgdGhlIEdVSSBldmVudHMgaW4gR3VpQ29tbWFuZHNRdWV1ZSByZW1haW5zIHBlbmRpbmcgdW5oYW5kbGVkLlxyXG4gICAgICAgICAgICAvLyBJbiB0aGUgbWVhbiB0aW1lLCBNYWdpYyB0aHJlYWQgZXhlY3V0ZXMgdGhlIEV4aXQgZXZlbnQgYW5kIGR1cmluZyB0aGlzLCBpdCB0cmllc1xyXG4gICAgICAgICAgICAvLyB0byBleGVjdXRlIHRoZSBDdHJsIFN1ZmZpeCBvZiB0aGUgVGV4dEJveCBjb250cm9sLlxyXG4gICAgICAgICAgICAvLyBTaW5jZSBTRVRfRk9DVVMgaXMgc3RpbGwgcGVuZGluZyBpbiB0aGUgcXVldWUsIHRoZSBsb2dpY2FsIGNvbnRyb2wgKGlmIGFsbG93VGVzdGluZz1ObylcclxuICAgICAgICAgICAgLy8gaXMgbm90IG1hcHBlZCB3aXRoIGFueSBhY3R1YWwgd2luZG93cyBjb250cm9sLlxyXG4gICAgICAgICAgICAvLyBOb3cgd2hlbiB3ZSB0cnkgdG8gZ2V0IHRoZSB2YWx1ZSBvZiB0aGlzIGxvZ2ljYWwgY29udHJvbCwgTG9naWNhbENvbnRyb2wuZ2V0RWRpdG9yQ29udHJvbCgpXHJcbiAgICAgICAgICAgIC8vIHJldHVybnMgbnVsbCBhbmQgc28sIFN0YXRpY1RleHQuZ2V0VmFsdWUoKSByZXR1cm5zIExvZ2ljYWxDb250cm9sLlRleHQgaW5zdGVhZCBvZiBDb250cm9sLlRleHRcclxuICAgICAgICAgICAgLy8gQmVjYXVzZSBQUk9QX1NFVF9URVhUIGlzIGFsc28gcGVuZGluZywgTG9naWNhbENvbnRyb2wuVGV4dCBpcyBudWxsLlxyXG4gICAgICAgICAgICAvLyBBbmQgc28gdGhlcmUgaXMgYW4gZXhjZXB0aW9uIHdoZW4gdXNpbmcgaXQuXHJcbiAgICAgICAgICAgIC8vIElmIEFsbG93VGVzdGluZz1ZZXMsIHRoZSB2YWwgd2lsbCBiZSBhIGJsYW5rIHN0cmluZy4gU28sIHRoZXJlIGlzIG5vIGNyYXNoLlxyXG4gICAgICAgICAgICAvLyBCdXQgaGVyZSB3ZSBoYXZlIGFub3RoZXIgcHJvYmxlbS4gU3VwcG9zZSwgdGhlIGZpZWxkIGhhZCBhbiBJbml0IGV4cHJlc3Npb24uXHJcbiAgICAgICAgICAgIC8vIE5vdywgTWdDb250cm9sJ3MgdmFsdWUgd291bGQgYmUgdGhlIGluaXRlZCB2YWx1ZSBhbmQgdGhlIHZhbCBpcyBhIGJsYW5rIHN0cmluZy5cclxuICAgICAgICAgICAgLy8gU28sIHdlIHdpbGwgaGF2ZSB2YXJpYWJsZSBjaGFuZ2UuXHJcbiAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBwcm9ibGVtIGlzIHJlbGF0ZWQgdG8gYSB2ZXJ5IHNwZWNpZmljIHNjZW5hcmlvIC0tIHdoZW4gdGhlIGltYWdlIGNvbnRyb2wgd2FzXHJcbiAgICAgICAgICAgIC8vIHRoZSBmaXJzdCBkcm9wcGVkIGNvbnRyb2wgb24gdGhlIGZvcm0sIGltYWdlIGNhbm5vdCBiZSBhY2Nlc3NlZCBhdCB0aGUgdGltZSBvZiB0YXNrXHJcbiAgICAgICAgICAgIC8vIGxvYWRpbmcgYW5kIHRhc2sgbmVlZHMgdG8gYmUgY2xvc2VkLCB3ZSBhcmUgcHV0dGluZyBhIHBhdGNoIGhlcmUgYnkgY2hlY2tpbmcgdmFsIGZvciBOVUxMLlxyXG4gICAgICAgICAgICAvLyBUaGUgaWRlYWwgc29sdXRpb24gd291bGQgYmUgLS0tIGluc3RlYWQgb2Ygc2VuZGluZyB0aGUgaW1hZ2UgZmlsZSBuYW1lIGZyb20gTWFnaWMgdGhyZWFkXHJcbiAgICAgICAgICAgIC8vIHRvIEd1aSB0aHJlYWQgYW5kIGxvYWRpbmcgdGhlIGltYWdlIGZyb20gdGhlIEd1aSB0aHJlYWQsIHdlIGNhbiBsb2FkIHRoZSBpbWFnZSBmcm9tIHRoZVxyXG4gICAgICAgICAgICAvLyBNYWdpYyB0aHJlYWQgKHVzaW5nIHN5bmMgZXhlY3V0aW9uIGkuZS4gdmlhIEd1aUludGVyYWN0aXZlKSBhbmQgc2VuZCBpdCB0byB0aGUgR3VpIHRocmVhZC5cclxuICAgICAgICAgICAgaWYgKCF0YXNrLmNhbmNlbFdhc1JhaXNlZCgpICYmXHJcbiAgICAgICAgICAgICAgKGN0cmwuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlJPV1NFUiAmJiAoIWlzTnVsbE9yVW5kZWZpbmVkKGN0cmwuX2ZpZWxkKSAmJiAoY3RybC5fZmllbGQuZ2V0VHlwZSgpID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHwgY3RybC5fZmllbGQuZ2V0VHlwZSgpID09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQykgfHwgdmFsICE9PSBudWxsKSAmJiB0eXBlb2YgdmFsICE9ICd1bmRlZmluZWQnICYmXHJcbiAgICAgICAgICAgICAgICAhYXdhaXQgY3RybC52YWxpZGF0ZUFuZFNldFZhbHVlKHZhbCwgdHJ1ZSkpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIHdoZW4gc3RvcCBleGVjdXRpb24gaW4gb24sIGRvbid0IGNsZWFyIHRoZSBtc2cgZnJvbSBzdGF0dXMuXHJcbiAgICAgICAgICBpZiAoIXRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgICAgIE1hbmFnZXIuQ2xlYW5NZXNzYWdlUGFuZSh0YXNrKTtcclxuXHJcbiAgICAgICAgICAvLyByZXNldCBJbkNvbnRyb2wgYmVmb3JlIGV4ZWN1dGluZyBjb250cm9sIHZlcmlmaWNhdGlvblxyXG4gICAgICAgICAgY3RybC5JbkNvbnRyb2wgPSBmYWxzZTtcclxuICAgICAgICAgIGN0cmwuQ2xpcEJvYXJkRGF0YUV4aXN0cyA9IGZhbHNlO1xyXG4gICAgICAgICAgY3RybC5WYWxpZGF0ZUNvbnRyb2wgPSB0cnVlO1xyXG4gICAgICAgICAgY3RybC5zZXRJbkNvbnRyb2xTdWZmaXgodHJ1ZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBleGVjdXRlIGEgc2VsZWN0IHByb2dyYW0gYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvZ3JhbSB3YXMgZXhlY3V0ZWQgIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+dGhlIHNvdXJjZSBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcm9tcHRcIj5pZiB0cnVlIHRoZW4gdGhlIGNhbGxlciBpcyBleGVjdXRpbmcgdGhlIGNhbGxlZCBwcm9ncmFtIGF0IHRoZSBlbmQgb2YgY29udHJvbCBwcmVmaXg8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJvdGVjdGVkIGFzeW5jIHNlbGVjdFByb2coY3RybDogTWdDb250cm9sKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZDtcclxuICAgIGxldCB2YWx1ZTogU3RyaW5nO1xyXG4gICAgbGV0IG1nVmFsOiBzdHJpbmc7XHJcbiAgICBsZXQgcHJvZ0V4ZWN1dGVkID0gZmFsc2U7XHJcbiAgICBsZXQgdGFzayA9IDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuXHJcbiAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBzZWxlY3QgcHJvZ3JhbSB0byB0aGUgY29udHJvbFxyXG4gICAgaWYgKGN0cmwuSGFzU2VsZWN0UHJvZ3JhbSgpKSB7XHJcbiAgICAgIC8vY2hlY2sgaWYgdGhlIGNvbnRyb2wgaXMgcGFya2FibGVcclxuICAgICAgaWYgKGN0cmwuSXNQYXJrYWJsZSgpKSB7XHJcblxyXG4gICAgICAgIHZhbHVlID0gTWFuYWdlci5HZXRDdHJsVmFsKGN0cmwpO1xyXG5cclxuICAgICAgICAvLyB2YWxpZGF0ZSB0aGUgY29udHJvbHMgdmFsdWVcclxuICAgICAgICBpZiAoIWN0cmwudmFsaWRhdGVBbmRTZXRWYWx1ZSh2YWx1ZSwgZmFsc2UpKVxyXG4gICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbGV0IGVuY29kZWRWYWw6IHN0cmluZyA9IG51bGw7XHJcbiAgICAgICAgICBtZ1ZhbCA9IGF3YWl0IGN0cmwuZ2V0TWdWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgICAgICB2YXIgcmVjID0gKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICAgICAgICBlbmNvZGVkVmFsID0gcmVjLmdldFhNTEZvclZhbHVlKGN0cmwuZ2V0RmllbGQoKS5nZXRJZCgpLCBtZ1ZhbCk7XHJcbiAgICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVTZWxlY3RQcm9ncmFtQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgbnVsbCwgSW50MzIuTWluVmFsdWUsIGN0cmwuZ2V0RGl0SWR4KCksIGVuY29kZWRWYWwpO1xyXG4gICAgICAgICAgdGFzay5nZXRNR0RhdGEoKS5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcblxyXG4gICAgICAgICAgbGV0IGNvbW1hbmRzUHJvY2Vzc29yU2VydmVyOiBDb21tYW5kc1Byb2Nlc3NvckJhc2UgPSBDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXIuR2V0Q29tbWFuZHNQcm9jZXNzb3IoKTtcclxuICAgICAgICAgIGF3YWl0IGNvbW1hbmRzUHJvY2Vzc29yU2VydmVyLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG5cclxuICAgICAgICAgIHByb2dFeGVjdXRlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJvZ0V4ZWN1dGVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlQ29udHJvbFZlcmlmaWNhdGlvbih0YXNrOiBUYXNrKTogUHJvbWlzZTxib29sZWFuPiB7XHJcblxyXG4gICAgLy8gY2hlY2sgYWxsIGhhbmRsZXJzIGlmIGl0IGlzIGNvbnRyb2wgdmVyaWZpY2F0aW9uLiBFeGVjdXRlIGFsbCBTViBoYW5kbGVyc1xyXG4gICAgbGV0IHRhYmxlOiBIYW5kbGVyc1RhYmxlID0gdGFzay5nZXRIYW5kbGVyc1RhYigpO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRhYmxlLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGxldCBoYW5kbGVyOiBFdmVudEhhbmRsZXIgPSB0YWJsZS5nZXRIYW5kbGVyKGkpO1xyXG4gICAgICBsZXQgZXZ0OiBFdmVudCA9IGhhbmRsZXIuZ2V0RXZlbnQoKTtcclxuICAgICAgaWYgKGV2dC5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfVkVSSUZJQ0FUSU9OKSB7XHJcbiAgICAgICAgbGV0IGNvbnRyb2w6IE1nQ29udHJvbCA9ICgodGFzay5nZXRGb3JtKCkgIT09IG51bGwpID8gKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLmdldEN0cmxCeUN0cmxOYW1lKGhhbmRsZXIuZ2V0Q3RybE5hbWUoKSkgOiBudWxsKTtcclxuICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGNvbnRyb2wpKSB7XHJcbiAgICAgICAgICBsZXQgcnVuVGltZUV2ZW50OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGNvbnRyb2wpO1xyXG4gICAgICAgICAgcnVuVGltZUV2ZW50LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1ZFUklGSUNBVElPTik7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ1blRpbWVFdmVudCwgZmFsc2UpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgZXJyb3IsIHBhcmsvZm9jdXMgb24gdGhpcyBjb250cm9sIHdoZXJlIGVycm9yIG9jY3VycyBpbiBDViBleGVjdXRpb24uXHJcbiAgICAgICAgICAgIExhc3RGb2N1c2VkTWFuYWdlci5zZXRMYXN0Rm9jdXNlZENvbnRyb2wodGFzaywgY29udHJvbCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwobnVsbCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwoY29udHJvbCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgYXN5bmMgb25BY3RTZWxlY3Rpb24oY3RybDogTWdDb250cm9sLCBmb3JtOiBNZ0Zvcm0sIGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZGlzcGxheUxpbmU6IG51bWJlciA9IGV2dC5nZXREaXNwbGF5TGluZSgpO1xyXG4gICAgaWYgKGRpc3BsYXlMaW5lID09PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgZGlzcGxheUxpbmUgPSBmb3JtLkRpc3BsYXlMaW5lO1xyXG5cclxuICAgIGxldCBzaW11bGF0ZTogYm9vbGVhbiA9IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1ggfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04gfHwgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCICYmICFldnQuaXNQcm9kdWNlQ2xpY2soKSk7XHJcbiAgICBpZiAoc2ltdWxhdGUpXHJcbiAgICAgIGF3YWl0IHRoaXMuc2ltdWxhdGVTZWxlY3Rpb24oY3RybCwgZXZ0LmdldFZhbHVlKCksIGRpc3BsYXlMaW5lLCBldnQuaXNQcm9kdWNlQ2xpY2soKSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlU2VsZWN0aW9uKGN0cmwsIGRpc3BsYXlMaW5lLCBldnQuZ2V0VmFsdWUoKSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZSB0aGUgTUdfQUNUX1NVQkZPUk1fQ0xPU0VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm9ybVwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBvblN1YmZvcm1DbG9zZSh0YXNrOiBUYXNrLCBldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGlmICgoZXZ0LmdldEFyZ0xpc3QoKSAhPSBudWxsKSAmJiAoZXZ0LmdldEFyZ0xpc3QoKS5nZXRTaXplKCkgPT09IDEpKSB7XHJcbiAgICAgIGxldCBzdWJmb3JtQ3RybDogTWdDb250cm9sID0gbnVsbDtcclxuICAgICAgbGV0IGNsb3NpbmdTdWJmb3JtTmFtZTogc3RyaW5nID0gYXdhaXQgZXZ0LmdldEFyZ0xpc3QoKS5nZXRBcmdWYWx1ZSgwLCBTdG9yYWdlQXR0cmlidXRlLkFMUEhBLCAwKTtcclxuXHJcbiAgICAgIC8vIFFDUiAjMjgzMTE0LiBBcmd1bWVudCBvZiAnU3ViZm9ybSByZWZyZXNoIGV2ZW50JyBjYW4gYmUgc2tpcHBlZCBvciBub3QgZXhpc3QuXHJcbiAgICAgIGlmIChjbG9zaW5nU3ViZm9ybU5hbWUgPT0gbnVsbClcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAvLyBSUyBtdXN0IGJlIGV4ZWN1dGVkIG9ubHkgaWYgdGhlIGN1cnJlbnQgc3ViZm9ybSBpcyByZWZyZXNoZWQuXHJcbiAgICAgIC8vIElmIGl0cyBicm90aGVyIGlzIHJlZnJlc2hlZCB3ZSBkbyBub3QgbmVlZCB0byBleGVjdXRlIFJTIG9mIHRoZSBjdXJyZW50IHRhc2suXHJcbiAgICAgIGZvciAobGV0IHBhcmVudFRhc2s6IFRhc2sgPSB0YXNrOyBwYXJlbnRUYXNrLmdldEZvcm0oKSAhPSBudWxsICYmIHBhcmVudFRhc2suZ2V0TWdkSUQoKSA9PT0gdGFzay5nZXRNZ2RJRCgpOyBwYXJlbnRUYXNrID0gPFRhc2s+cGFyZW50VGFzay5nZXRQYXJlbnQoKSkge1xyXG4gICAgICAgIHN1YmZvcm1DdHJsID0gPE1nQ29udHJvbD5wYXJlbnRUYXNrLmdldEZvcm0oKS5nZXRDdHJsQnlOYW1lKGNsb3NpbmdTdWJmb3JtTmFtZS50cmltKCksIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NVQkZPUk0pO1xyXG4gICAgICAgIGlmIChzdWJmb3JtQ3RybCAhPSBudWxsKSB7XHJcbiAgICAgICAgICBsZXQgc3ViZm9ybVRhc2s6IFRhc2sgPSA8VGFzaz5zdWJmb3JtQ3RybC5nZXRTdWJmb3JtVGFzaygpO1xyXG4gICAgICAgICAgLy8gSWYgdGhlIHN1YmZvcm0gdGFzayB3YXMgbm90IG9wZW5lZCB5ZXQsIGJ1dCBzdWJmb3JtIHJlZnJlc2ggaXMgZG9uZSxcclxuICAgICAgICAgIC8vIGl0J3MgbmVlZGVkIHRvIG9wZW4gdGhlIHN1YmZvcm0uIFFDUiAjNDE1OTE0LlxyXG4gICAgICAgICAgaWYgKHN1YmZvcm1UYXNrICE9IG51bGwgJiYgIXN1YmZvcm1UYXNrLklzUm91dGUoKSkge1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wZXJmb3JtU3ViZm9ybUNsb3NlKHN1YmZvcm1DdHJsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwZXJmb3JtU3ViZm9ybUNsb3NlKCkgICA6IENsb3NlcyB0aGUgc3ViZm9ybSB0YXNrIG9wZW5lZCBpbiB0aGUgc3ViZm9ybUN0cmxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3ViZm9ybUN0cmxcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICBwdWJsaWMgYXN5bmMgcGVyZm9ybVN1YmZvcm1DbG9zZShzdWJmb3JtQ3RybDogTWdDb250cm9sKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgc3ViZm9ybVRhc2s6IFRhc2sgPSA8VGFzaz5zdWJmb3JtQ3RybC5nZXRTdWJmb3JtVGFzaygpO1xyXG4gICAgbGV0IHBhcmVudFRhc2s6IFRhc2sgPSA8VGFzaz5zdWJmb3JtQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG5cclxuICAgIGxldCBtZ2Q6IE1HRGF0YSA9IHN1YmZvcm1UYXNrLmdldE1HRGF0YSgpO1xyXG4gICAgdGhpcy5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgYXdhaXQgc3ViZm9ybVRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgdGhpcy5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICBpZiAoIXRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgcGFyZW50VGFzay5UYXNrU2VydmljZS5SZW1vdmVSZWNvbXB1dGVzKHBhcmVudFRhc2spO1xyXG4gICAgICBhd2FpdCBzdWJmb3JtVGFzay5zdG9wKCk7XHJcblxyXG4gICAgICBzdWJmb3JtQ3RybC5yZXNldFN1YmZvcm1UYXNrKCk7XHJcbiAgICAgIGF3YWl0IENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICBDb21tYW5kcy5hZGRDbG9zZXN1YmZvcm0oQ29tbWFuZFR5cGUuQ0xPU0VfU1VCX0ZPUk0sIHN1YmZvcm1DdHJsLCBzdWJmb3JtVGFzay5nZXRUYXNrVGFnKCksICg8TWdDb250cm9sQmFzZT5zdWJmb3JtQ3RybCkuZ2V0TmFtZSgpLCBzdWJmb3JtVGFzay5nZXRGb3JtKCkuYnVpbGRGb3JtTmFtZSgpKTtcclxuXHJcbiAgICAgIC8vIFNldCBtZ2QuYWJvcnQoKSwgaW4gb3JkZXIgdG8gY2xvc2UgY3VycmVudCBldmVudCBsb29wIG9mIE1vZGFsIHN1YmZvcm0uXHJcbiAgICAgIC8vIGFuZCByZXNldCBpdCBiYWNrIHRvIGZhbHNlIG9uY2UgaXQgY29tZXMgb3V0IG9mIGN1cnJlbnQgZXZlbnRzbG9vcCgpLlxyXG4gICAgICBpZiAoKDxNZ0NvbnRyb2xCYXNlPnN1YmZvcm1DdHJsKS5Jc01vZGFsKCkpXHJcbiAgICAgICAgbWdkLmFib3J0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxjdWxhdGUgYXJndW1lbnRzIGZvciBldmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+IDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBjcmVhdGVFdmVudEFyZ3VtZW50cyhldnQ6IFJ1blRpbWVFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKGV2dC5nZXRBcmdMaXN0KCkgPT09IG51bGwpIHtcclxuICAgICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuICAgICAgICBzd2l0Y2ggKGV2dC5nZXRJbnRlcm5hbENvZGUoKSkge1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkb1N1ZmZpeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBEb1Rhc2tMZXZlbFJlY29yZFN1ZmZpeCh0YXNrOiBUYXNrQmFzZSwgcmVmRG9TdWZmaXg6IFJlZlBhcmFtPGJvb2xlYW4+KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgc2hvdWxkUmV0dXJuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpIHtcclxuICAgICAgcmVmRG9TdWZmaXgudmFsdWUgPSBmYWxzZTtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICBpZiAodGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgIHNob3VsZFJldHVybiA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNob3VsZFJldHVybjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZvcm1cIj48L3BhcmFtPlxyXG4gIGFzeW5jIERvVGFza0xldmVsUmVjb3JkUHJlZml4KHRhc2s6IFRhc2tCYXNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZG8gdGhlIG1hZ2ljIGRlZmF1bHQgb3BlcmF0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIGludGVybmFsIGV2ZW50IGNvZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+dGhlIGV2ZW50IHRvIGhhbmRsZSA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGVsbHMgdGhlIGNhbGxlciB3aGV0aGVyIHRvIGNvbnRpbnVlIGhhbmRsaW5nIHRoZSBldmVudCA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21tb25IYW5kbGVyKGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPmV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgbWdEYXRhOiBNR0RhdGEgPSB0YXNrLmdldE1HRGF0YSgpO1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5ldnQuQ29udHJvbDtcclxuICAgIGxldCBsYXN0UGFya2VkQ3RybDogTWdDb250cm9sO1xyXG4gICAgbGV0IGRvU3VmZml4OiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCBvbGRNb2RlOiBzdHJpbmc7XHJcbiAgICBsZXQgc2VydmVyOiBDb21tYW5kc1Byb2Nlc3NvckJhc2UgPSBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yO1xyXG5cclxuICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgLy8gaWYgdGhpcyBpcyBhIHVzZXIgZXZlbnQgdGhhdCBjb252ZXJ0cyB0byBhIHN5c3RlbSBvciBpbnRlcm5hbCBldmVuLCBjb252ZXJ0IGl0XHJcbiAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSKVxyXG4gICAgICBldnQgPSBuZXcgUnVuVGltZUV2ZW50KGV2dC5nZXRVc2VyRXZlbnQoKSwgZXZ0KTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLnB1c2hSdEV2ZW50KGV2dCk7XHJcblxyXG4gICAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9TWVNURU0pIHtcclxuICAgICAgICBsZXQgYWN0SWQ6IG51bWJlciA9IHRoaXMuZ2V0TWF0Y2hpbmdBY3Rpb24oZXZ0LmdldEtiZEl0bSgpKTtcclxuICAgICAgICBpZiAoYWN0SWQgIT09IDApXHJcbiAgICAgICAgLy8gaGFuZGxlZCBpbnRlcm5hbGx5XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZXZ0ID0gbmV3IFJ1blRpbWVFdmVudChldnQsIGV2dCk7XHJcbiAgICAgICAgICBldnQuc2V0SW50ZXJuYWwoYWN0SWQpO1xyXG4gICAgICAgICAgZXZ0LnNldEFyZ0xpc3QobnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9Ly8gZW5kIG9mIHN5c3RlbSBldmVudHMgcHJvY2Vzc2luZ1xyXG5cclxuICAgICAgLy8gZXhlY3V0ZSB0aGUgY29tbW9uIGhhbmRsaW5nIG9mIGludGVybmFsIGV2ZW50cyBvbmx5IGlmIHRoZXkgYXJlIG5vdCBpbW1lZGlhdGUuXHJcbiAgICAgIC8vIGFuIGV2ZW50IGlzIGltbWVkaWF0ZSB3aGVuIGl0IHdhcyByYWlzZWQgYnkgYSByYWlzZSBldmVudCBvcGVyYXRpb24gdGhhdCBpdHNcclxuICAgICAgLy8gd2FpdCBjb25kaXRpb24gaXMgeWVzIG9yIGV2YWx1YXRlcyB0byB0cnVlLlxyXG4gICAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZDtcclxuICAgICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgIWV2dC5pc0ltbWVkaWF0ZSgpICYmIHRoaXMuQWN0QWxsb3dlZChldnQuZ2V0SW50ZXJuYWxDb2RlKCkpICYmICF0aGlzLl9wcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2spIHtcclxuICAgICAgICBsZXQgY21kc1RvU2VydmVyOiBDb21tYW5kc1RhYmxlID0gPENvbW1hbmRzVGFibGU+bWdEYXRhLkNtZHNUb1NlcnZlcjtcclxuICAgICAgICBsZXQgZHY6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRhc2suRGF0YVZpZXc7XHJcbiAgICAgICAgbGV0IHJlYzogUmVjb3JkID0gZHYuZ2V0Q3VyclJlYygpO1xyXG5cclxuICAgICAgICBsZXQgaW50RXZ0Q29kZTogbnVtYmVyID0gZXZ0LmdldEludGVybmFsQ29kZSgpO1xyXG5cclxuICAgICAgICAvLyBmb3IgaW50ZXJuYWwgZXZlbnRzXHJcbiAgICAgICAgc3dpdGNoIChpbnRFdnRDb2RlKSB7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU1VCRk9STV9DTE9TRTpcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5vblN1YmZvcm1DbG9zZSh0YXNrLCBldnQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQlVUVE9OOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9ISVQ6XHJcbiAgICAgICAgICAgIC8vIGlmIGJ1dHRvbiBpcyBub3QgcGFya2FibGUsIHJhaXNlIGl0cyBldmVudCBvbmx5IGlmIHRoZSBhY3Rpb24gd2FzIG5vdCB0cmlnZ2VyZWQgYnkgZ3VpLlxyXG4gICAgICAgICAgICAvLyBkaXJlY3QgY2xpY2sgb24gdGhlIGJ1dHRvbiB3aWxsIGdldCBoZXJlIGFzIGN0cmwgaGl0ICwgYnV0IGlzIG5vdCB0cmlnZ2VyZWQgYnkgZ3VpIChnb2VzIHZpYSBzZWxlY3Rpb24gZXZlbnQgMXN0KVxyXG4gICAgICAgICAgICAvLyBvdGhlciBjdHJsX2hpdCBhY3Rpb25zIHNob3VsZCBjb25zaWRlciB0aGUgcGFya2FiaWxpdHlcclxuICAgICAgICAgICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OICYmXHJcbiAgICAgICAgICAgICAgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9CVVRUT04gfHwgIWV2dC5pc0d1aVRyaWdnZXJlZEV2ZW50KCkgfHwgY3RybC5pc1BhcmthYmxlKHRydWUpKSkge1xyXG4gICAgICAgICAgICAgIGxldCBhUnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwpO1xyXG4gICAgICAgICAgICAgIGlmIChjdHJsLmdldFJ0RXZ0VGFzaygpICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICBhUnRFdnQuc2V0VGFzayhjdHJsLmdldFJ0RXZ0VGFzaygpKTtcclxuICAgICAgICAgICAgICBpZiAoQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9OT05FICE9PSBhUnRFdnQuZ2V0VHlwZSgpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3RybC51c2Vab29tSGFuZGxlcigpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCB0YXNrVG9FbmFibGU6IFRhc2sgPSA8VGFzaz5hUnRFdnQuZ2V0VGFzaygpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGFza1RvRW5hYmxlICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgICAgdGFza1RvRW5hYmxlLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGFSdEV2dC5zZXRBcmdMaXN0KGN0cmwuQXJnTGlzdCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBhUnRFdnQuc2V0UHVibGljTmFtZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRUb1RhaWwoYVJ0RXZ0KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tBbmRTYXZlUm91dGVFdmVudElmQ3R4UmVtb3ZlZEZyb21TcnZyKGFSdEV2dCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCKSB7XHJcbiAgICAgICAgICAgICAgLy8gRml4ZWQgYnVnICM3MjQxNTA6IGFzIHdlIGRvaW5nIGZvciBvbmxpbmUgZm9yIHRhYiBjb250cm9sIHdlIHNlbmQgQUNUX1pPT00gKENob2ljZWlucC5jcHAgOjpEaXRHZXQoKSlcclxuICAgICAgICAgICAgICB0aGlzLmFkZEludGVybmFsRXZlbnRXaXRoQ3RybEFuZENvZGUoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8pIHtcclxuICAgICAgICAgICAgICBjdHJsLnNldENvbnRyb2xUb0ZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RPR0dMRV9JTlNFUlQ6XHJcbiAgICAgICAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5Ub2dnbGVJbnNlcnRNb2RlKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NMT1NFOlxyXG4gICAgICAgICAgICBsZXQgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KGV2dCwgZXZ0KTtcclxuICAgICAgICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICAgICAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQ6XHJcbiAgICAgICAgICAgIC8vIGlmICdleGl0JyBhY2NlcHRlZCBvbiBNREksIGV4aXQgdGhlIHRvcCBtb3N0IHRhc2suIHNhbWUgYXMgd2hlbiBleGl0aW5nIHRoZSBzeXN0ZW0uXHJcbiAgICAgICAgICAgIGxldCB0YXNrVG9FbmQ6IFRhc2sgPSAodGFzay5pc01haW5Qcm9nKCkgPyBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkgOiB0YXNrKTtcclxuICAgICAgICAgICAgYXdhaXQgdGFza1RvRW5kLmVuZFRhc2soZXZ0LnJldmVyc2libGVFeGl0KCksIGZhbHNlLCBldnQuRXhpdER1ZVRvRXJyb3IoKSk7XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUX1NZU1RFTTpcclxuICAgICAgICAgICAgLy8gZW5kIHRoZSB0b3AgbW9zdCB0YXNrIHdpdGggZm9ybS5cclxuICAgICAgICAgICAgYXdhaXQgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLmVuZFRhc2soZXZ0LnJldmVyc2libGVFeGl0KCksIGZhbHNlLFxyXG4gICAgICAgICAgICAgIGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gR2V0VG9wTW9zdFRhc2tXaXRoRm9ybSh0YXNrKS5lbmRUYXNrKGV2dC5yZXZlcnNpYmxlRXhpdCgpLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUTElORTpcclxuICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1csIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9ORVhUKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVkxJTkU6XHJcbiAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfUk9XLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fUFJFVik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRQQUdFOlxyXG4gICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1BBR0UsIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9ORVhUKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVlBBR0U6XHJcbiAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSwgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX1BSRVYpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHUEFHRTpcclxuICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fQkVHSU4pO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfRU5EUEFHRTpcclxuICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fRU5EKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1RCTDpcclxuICAgICAgICAgICAgLy8gIzkxODU4ODogSWYgY3RybCtob21lL2N0cmwrZW5kIHByZXNzZWQgd2hlbiBwYXJrZWQgb24gbGlzdGJveFxyXG4gICAgICAgICAgICAvLyB0aGVuIEJlZ2luIHRhYmxlIGV2ZW50IHNob3VsZCBub3QgYmUgaGFuZGxlZC5cclxuICAgICAgICAgICAgbGFzdFBhcmtlZEN0cmwgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsID09IG51bGwgfHwgIWxhc3RQYXJrZWRDdHJsLmlzTGlzdEJveCgpKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1RBQkxFLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fQkVHSU4pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9FTkRUQkw6XHJcbiAgICAgICAgICAgIC8vICM5MTg1ODg6IElmIGN0cmwraG9tZS9jdHJsK2VuZCBwcmVzc2VkIHdoZW4gcGFya2VkIG9uIGxpc3Rib3hcclxuICAgICAgICAgICAgLy8gdGhlbiBCZWdpbiB0YWJsZSBldmVudCBzaG91bGQgbm90IGJlIGhhbmRsZWQuXHJcbiAgICAgICAgICAgIGxhc3RQYXJrZWRDdHJsID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgICAgIGlmIChsYXN0UGFya2VkQ3RybCA9PT0gbnVsbCB8fCAhbGFzdFBhcmtlZEN0cmwuaXNMaXN0Qm94KCkpIHtcclxuICAgICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfVEFCTEUsIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9FTkQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1dFQl9PTl9EQkxJQ0s6IHtcclxuICAgICAgICAgICAgLy8gVW5saWtlIE9ubGluZSwgaGVyZSBTRUxFQ1Qgb3IgWk9PTSBjb21lcyBhZnRlciB0aGUgREJDTElDSy5cclxuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBEQkNMSUNLIGhhbmRsZXIgd2l0aCBwcm9wb2dhdGUgPSAnTk8nICwgdGhlc2UgYWN0aW9ucyB3aWxsIG5vdCBiZSByYWlzZWQuXHJcbiAgICAgICAgICAgIGxldCBjdHJsVHlwZTogTWdDb250cm9sVHlwZSA9IGN0cmwuVHlwZTtcclxuICAgICAgICAgICAgbGV0IHB1dEFjdGlvbjogbnVtYmVyID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX05PTkU7XHJcbiAgICAgICAgICAgIGlmIChjdHJsVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEUgJiYgY3RybFR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xBQkVMICYmXHJcbiAgICAgICAgICAgICAgY3RybFR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0lNQUdFKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5BY3Rpb25NYW5hZ2VyLmlzRW5hYmxlZChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VMRUNUKSlcclxuICAgICAgICAgICAgICAgIHB1dEFjdGlvbiA9IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1Q7XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLkFjdGlvbk1hbmFnZXIuaXNFbmFibGVkKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NKSlcclxuICAgICAgICAgICAgICAgICAgcHV0QWN0aW9uID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT007XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBpZiAocHV0QWN0aW9uICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfTk9ORSlcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kQ29kZShjdHJsLCBwdXRBY3Rpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RFTExJTkU6XHJcbiAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLkhhbmRsZUFjdGlvbkRlbGxpbmUodGFzaywgZHYsIHJlYywgZmFsc2UpKVxyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORTpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkVfQUJPVkU6XHJcbiAgICAgICAgICAgIGlmICh0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nb3RvQ3JlYXRlTW9kZSh0YXNrKTtcclxuXHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0SW5DcmVhdGVMaW5lKCkpXHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICB0YXNrLnNldEluQ3JlYXRlTGluZSh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UodGFzay5nZXRMYXN0UGFya2VkQ3RybCgpLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIGN1cnJlbnQgcmVjb3JkIGlzIG5vdCBhbHJlYWR5IGEgbmV3IG9uZVxyXG4gICAgICAgICAgICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgcmVjICE9IG51bGwgJiYgIXJlYy5Nb2RpZmllZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgZmFsc2UpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGRvU3VmZml4ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSB8fCB0YXNrLmlzQWJvcnRpbmcoKSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiBmb3JtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBEZWZlY3QgMTUyMzU1OiBQYXJrIG9uIGxhc3RQYXJrZWRDb250cm9sIGlmIG5leHRTY3JlZW4gZXZlbnQgb2NjdXJzIGlmIGFscmVhZHkgaW4gY3JlYXRlIG1vZGUgYW5kIHJlY29yZCBub3QgbW9kaWZpZWRcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdFBhcmtlZENvbnRyb2w6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0UGFya2VkQ29udHJvbCAhPT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGxhc3RQYXJrZWRDb250cm9sLmludm9rZSgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgbGV0IHJlZkRvU3VmZml4OiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbShkb1N1ZmZpeCk7XHJcbiAgICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuRG9UYXNrTGV2ZWxSZWNvcmRTdWZmaXgodGFzaywgcmVmRG9TdWZmaXgpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIGRvU3VmZml4ID0gcmVmRG9TdWZmaXgudmFsdWU7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoKHRhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkgfHwgIXRhc2suQ29uZmlybVVwZGF0ZU5vKVxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLmFkZFJlYyhkb1N1ZmZpeCwgaW50RXZ0Q29kZSA9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORV9BQk9WRSA/IHRydWUgOiBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLkRvVGFza0xldmVsUmVjb3JkUHJlZml4KHRhc2spO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlQWN0RW50ZXJSb3dFZGl0aW5nKHRhc2spO1xyXG5cclxuICAgICAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICB0YXNrLnNldEluQ3JlYXRlTGluZShmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZUFjdENhbmNlbChldnQsIHRhc2ssIGZvcm0sIGN0cmwsIHJlYywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VOVEVSX1JPV19FRElUSU5HOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZUFjdEVudGVyUm93RWRpdGluZyh0YXNrKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUVVJVDpcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1FVSVQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fQ1JFQVRFOlxyXG4gICAgICAgICAgICBpZiAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFIHx8XHJcbiAgICAgICAgICAgICAgYXdhaXQgKHRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19PUFRJT04pKS5nZXRWYWx1ZUJvb2xlYW4oKSkge1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ290b0NyZWF0ZU1vZGUodGFzayk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19RVUVSWTpcclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZICYmXHJcbiAgICAgICAgICAgICAgKGF3YWl0ICh0YXNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfT1BUSU9OKSkuZ2V0VmFsdWVCb29sZWFuKCkpID09PSBmYWxzZSlcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5lbmFibGVNb2RlcygpO1xyXG4gICAgICAgICAgICBvbGRNb2RlID0gdGFzay5nZXRPcmlnaW5hbFRhc2tNb2RlKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSk7XHJcbiAgICAgICAgICAgICAgaWYgKG9sZE1vZGUgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkdi5jdXJyUmVjQ29tcHV0ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGN0cmwuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBhbHJlYWR5IGV4ZWN1dGVkIHJlY29yZCBzdWZmaXggLSBzbyB3ZSBuZWVkIHRvIHByZXZlbnQgdGhlIHZpZXcgcmVmcmVzaFxyXG4gICAgICAgICAgICAgICAgLy8gZnJvbSBleGVjdXRpbmcgaXQgYWdhaW5cclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudFJlY29yZFN1ZmZpeCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudENvbnRyb2xDaGFuZ2UodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXKTtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGN0cmwuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgICB0YXNrLnNldFByZXZlbnRSZWNvcmRTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50Q29udHJvbENoYW5nZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWR2LmlzRW1wdHkoKSAmJiAoZHYuZ2V0Q3VyclJlYygpKS5nZXRNb2RlKCkgIT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpXHJcbiAgICAgICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRhc2suc2V0T3JpZ2luYWxUYXNrTW9kZShDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0YXNrLnNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19NT0RJRlk6XHJcbiAgICAgICAgICAgIGlmICh0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkgJiZcclxuICAgICAgICAgICAgICAoYXdhaXQgKHRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19PUFRJT04pKS5nZXRWYWx1ZUJvb2xlYW4oKSkgPT09IGZhbHNlKVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrLmVuYWJsZU1vZGVzKCk7XHJcbiAgICAgICAgICAgIG9sZE1vZGUgPSB0YXNrLmdldE9yaWdpbmFsVGFza01vZGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChvbGRNb2RlICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZHYuY3VyclJlY0NvbXB1dGUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3RybCAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBjdHJsLmludm9rZSgpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBhbHJlYWR5IGV4ZWN1dGVkIHJlY29yZCBzdWZmaXggLSBzbyB3ZSBuZWVkIHRvIHByZXZlbnQgdGhlIHZpZXcgcmVmcmVzaFxyXG4gICAgICAgICAgICAgICAgLy8gZnJvbSBleGVjdXRpbmcgaXQgYWdhaW5cclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudFJlY29yZFN1ZmZpeCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudENvbnRyb2xDaGFuZ2UodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXKTtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGN0cmwuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgICB0YXNrLnNldFByZXZlbnRSZWNvcmRTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50Q29udHJvbENoYW5nZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWR2LmlzRW1wdHkoKSAmJiAoZHYuZ2V0Q3VyclJlYygpKS5nZXRNb2RlKCkgIT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpXHJcbiAgICAgICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0YXNrLnNldE9yaWdpbmFsVGFza01vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRhc2suc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VMRUNUOlxyXG4gICAgICAgICAgICAvKiBwcmVmb3JtIHJlYyBzdWZmaXggKi9cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICB0YXNrLkluU2VsZWN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgICAgdGFzay5JblNlbGVjdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAgIC8qIGNsb3NlIHRoZSBzZWxlY3Rpb24gcHJvZ3JhbSAqL1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU1VCRk9STV9SRUZSRVNIOlxyXG4gICAgICAgICAgICBpZiAoKGV2dC5nZXRBcmdMaXN0KCkgIT0gbnVsbCkgJiYgKGV2dC5nZXRBcmdMaXN0KCkuZ2V0U2l6ZSgpID09PSAxKSkge1xyXG4gICAgICAgICAgICAgIGxldCBzdWJmb3JtQ3RybDogTWdDb250cm9sID0gbnVsbDtcclxuICAgICAgICAgICAgICBsZXQgUmVmcmVzaGVkU3ViZm9ybU5hbWU6IHN0cmluZyA9IGF3YWl0IGV2dC5nZXRBcmdMaXN0KCkuZ2V0QXJnVmFsdWUoMCwgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSwgMCk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIFFDUiAjMjgzMTE0LiBBcmd1bWVudCBvZiAnU3ViZm9ybSByZWZyZXNoIGV2ZW50JyBjYW4gYmUgc2tpcHBlZCBvciBub3QgZXhpc3QuXHJcbiAgICAgICAgICAgICAgaWYgKFJlZnJlc2hlZFN1YmZvcm1OYW1lID09IG51bGwpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgLy8gUlMgbXVzdCBiZSBleGVjdXRlZCBvbmx5IGlmIHRoZSBjdXJyZW50IHN1YmZvcm0gaXMgcmVmcmVzaGVkLlxyXG4gICAgICAgICAgICAgIC8vIElmIGl0cyBicm90aGVyIGlzIHJlZnJlc2hlZCB3ZSBkbyBub3QgbmVlZCB0byBleGVjdXRlIFJTIG9mIHRoZSBjdXJyZW50IHRhc2suXHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgcGFyZW50VGFzazogVGFzayA9IHRhc2s7IHBhcmVudFRhc2suZ2V0Rm9ybSgpICE9IG51bGwgJiYgcGFyZW50VGFzay5nZXRNZ2RJRCgpID09PSB0YXNrLmdldE1nZElEKCk7IHBhcmVudFRhc2sgPSA8VGFzaz5wYXJlbnRUYXNrLmdldFBhcmVudCgpKSB7XHJcbiAgICAgICAgICAgICAgICBzdWJmb3JtQ3RybCA9IDxNZ0NvbnRyb2w+cGFyZW50VGFzay5nZXRGb3JtKCkuZ2V0Q3RybEJ5TmFtZShSZWZyZXNoZWRTdWJmb3JtTmFtZS50cmltKCksIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NVQkZPUk0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1YmZvcm1DdHJsICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IHN1YmZvcm1UYXNrOiBUYXNrID0gPFRhc2s+c3ViZm9ybUN0cmwuZ2V0U3ViZm9ybVRhc2soKTtcclxuICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHN1YmZvcm0gdGFzayB3YXMgbm90IG9wZW5lZCB5ZXQsIGJ1dCBzdWJmb3JtIHJlZnJlc2ggaXMgZG9uZSxcclxuICAgICAgICAgICAgICAgICAgLy8gaXQncyBuZWVkZWQgdG8gb3BlbiB0aGUgc3ViZm9ybS4gUUNSICM0MTU5MTQuXHJcbiAgICAgICAgICAgICAgICAgIGlmIChzdWJmb3JtVGFzayA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUUNSICMyODc1NjIuIE9wZW4gdGhlIHN1YmZvcm0gdGFzayBvbmx5IGlmIHRoZSBzdWJmb3JtIGNvbnRyb2wgaXMgY29ubmVjdGVkIHRvIHRoZSB0YXNrLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhd2FpdCAoc3ViZm9ybUN0cmwuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TVUJGT1JNX1RZUEUpKS5nZXRWYWx1ZUludCgpICE9PSBTdWJmb3JtVHlwZS5Ob25lKVxyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5PcGVuU3ViZm9ybShwYXJlbnRUYXNrLCBzdWJmb3JtQ3RybCk7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHBhcmVudFRhc2suU3ViZm9ybVJlZnJlc2goc3ViZm9ybVRhc2ssIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gaWYgaXQgaXMgU3ViZm9ybVJlZnJlc2ggdGhhdCByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIsIHNvIHNlYXJjaCB0aGUgdGFzayBhY2NvcmRpbmcgdG8gaXRzIHRhc2sgaWQgKHRhZylcclxuICAgICAgICAgICAgZWxzZSBpZiAoKGV2dC5nZXRBcmdMaXN0KCkgIT0gbnVsbCkgJiYgKGV2dC5nZXRBcmdMaXN0KCkuZ2V0U2l6ZSgpID09PSAyKSkge1xyXG4gICAgICAgICAgICAgIGxldCBzdWJmb3JtVGFzazogVGFzayA9IHRhc2ssIHBhcmVudFRhc2s7XHJcbiAgICAgICAgICAgICAgbGV0IHRhc2tUYWc6IHN0cmluZyA9IGF3YWl0IGV2dC5nZXRBcmdMaXN0KCkuZ2V0QXJnVmFsdWUoMSwgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDLCAwKTtcclxuXHJcbiAgICAgICAgICAgICAgd2hpbGUgKHN1YmZvcm1UYXNrLklzU3ViRm9ybSkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50VGFzayA9IHN1YmZvcm1UYXNrLmdldFBhcmVudCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1YmZvcm1UYXNrLmdldFRhc2tUYWcoKSA9PT0gdGFza1RhZykge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBwYXJlbnRUYXNrLlN1YmZvcm1SZWZyZXNoKHN1YmZvcm1UYXNrLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzdWJmb3JtVGFzayA9IHBhcmVudFRhc2s7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NVQkZPUk1fT1BFTjpcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5PcGVuU3ViZm9ybSh0YXNrLCA8TWdDb250cm9sPmV2dC5Db250cm9sKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX1NFQVJDSDpcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUV2ZW50Q29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgaW50RXZ0Q29kZSk7XHJcbiAgICAgICAgICAgICAgdGFzay5nZXRUYXNrQ2FjaGUoKS5jbGVhckNhY2hlKCk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGFzay5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZShjbWQpO1xyXG5cclxuICAgICAgICAgICAgICAvLyBBZnRlciB2aWV3IHJlZnJlc2gsIHRoZSBzZXJ2ZXIgYWx3YXlzIHJldHVybnMgY3VyciByZWMgYXMgZmlyc3QgcmVjLlxyXG4gICAgICAgICAgICAgIGlmICghZm9ybS5pc1NjcmVlbk1vZGUoKSkge1xyXG4gICAgICAgICAgICAgICAgZHYuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm0uSGFzVGFibGUoKSkge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLnJlc3RvcmVPbGREaXNwbGF5TGluZShmb3JtLnJlY29yZElkeDJEaXNwbGF5TGluZShkdi5nZXRDdXJyUmVjSWR4KCkpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgICBpZiAoY3RybCAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgY3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1NDUkVFTjpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVzpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfUkVDT1JEOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZVJlZnJlc2hFdmVudHMoZXZ0KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQUNUX0NMT1NFX0FQUEw6XHJcbiAgICAgICAgICAgIGNtZCA9XHJcbiAgICAgICAgICAgICAgQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRXZlbnRDb21tYW5kKFxyXG4gICAgICAgICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLmdldFRhc2tUYWcoKSxcclxuICAgICAgICAgICAgICAgIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9CUk9XU0VSX0VTQyk7XHJcbiAgICAgICAgICAgIGNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICAgICAgYXdhaXQgc2VydmVyLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT05URVhUX1JFTU9WRTpcclxuXHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRyYW5zYWN0aW9uIGlzIHBlbmRpbmdcclxuICAgICAgICAgICAgbGV0IGN1cnJSZWNvcmQgPSAoPERhdGFWaWV3Pkxhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKS5EYXRhVmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgICAgICAgICBpZiAoQ2xpZW50TWFuYWdlci5UcmFuc0NhY2hlRXhpc3RzKCkgfHwgKGN1cnJSZWNvcmQgIT0gbnVsbCAmJiBjdXJyUmVjb3JkLk1vZGlmaWVkKSkge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdQZW5kaW5nIHRyYW5zYWN0aW9uL3JlY29yZCBpcyBtb2RpZmllZCwgZGlzY2FyZGVkIFxcJ0NvbnRleHQgUmVtb3ZlXFwnIGV2ZW50LicpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIElzIHRoZXJlIGNsaWVudCBjb250ZXh0IGluYWN0aXZpdHkgdGltZW91dD9cclxuICAgICAgICAgICAgICBpZiAoRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0Q2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lb3V0KCkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLkV4ZWN1dGVDbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBpZiAoIUV2ZW50c01hbmFnZXIuY2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lckFib3J0ZWQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBhZGQgYSBjb21tYW5kIHRvIHRlcm1pbmF0ZSBjb250ZXh0IGF0IHNlcnZlciBzaWRlXHJcbiAgICAgICAgICAgICAgICBsZXQgY29udGV4dFRlcm1pbmF0aW9uRXZlbnRDb21tYW5kOiBDb250ZXh0VGVybWluYXRpb25FdmVudENvbW1hbmRcclxuICAgICAgICAgICAgICAgICAgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVDb250ZXh0VGVybWluYXRpb25FdmVudENvbW1hbmQoTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLmdldFRhc2tUYWcoKSk7XHJcbiAgICAgICAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldEN1cnJNR0RhdGEoKS5DbWRzVG9TZXJ2ZXIuQWRkKDxJQ2xpZW50Q29tbWFuZD5jb250ZXh0VGVybWluYXRpb25FdmVudENvbW1hbmQpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIG5lZWQgbm90IHRvIGJlIGhhbmRsZWQgYXMgdGhlIHdlIGFyZSB0ZXJtaW5hdGluZyB0aGUgY29udGV4dFxyXG4gICAgICAgICAgICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uT05MWV9DT01NQU5EUyk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlbW92ZWQgY29udGV4dCBmcm9tIHNlcnZlcicpO1xyXG4gICAgICAgICAgICAgICAgLy8gc2V0IGZsYWcgdG8gdGhhdCBjb250ZXh0IGlzIHJlbW92ZWQgZnJvbSBzZXJ2ZXIgYnkgJ0NvbnRleHQgUmVtb3ZlJyBldmVudFxyXG4gICAgICAgICAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlJlbW92aW5nQ29udGV4dEZyb21TZXJ2ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGlzY2FyZGVkIFxcJ0NvbnRleHQgUmVtb3ZlXFwnIGV2ZW50IGFzIHVzZXIgZXZlbnQgb2NjdXJyZWQuJyk7XHJcbiAgICAgICAgICAgICAgICBFdmVudHNNYW5hZ2VyLmNsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZXJBYm9ydGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRVJWRVJfVEVSTUlOQVRJT046XHJcbiAgICAgICAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUV2ZW50Q29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgaW50RXZ0Q29kZSk7XHJcbiAgICAgICAgICAgIGNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICAgICAgYXdhaXQgQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyLkdldENvbW1hbmRzUHJvY2Vzc29yKCkuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX0VEVF9OVUxMOlxyXG4gICAgICAgICAgICBpZiAodGhpcy5fY3VyckZpZWxkICE9IG51bGwgJiYgdGhpcy5fY3VyckZpZWxkLk51bGxBbGxvd2VkKSB7XHJcbiAgICAgICAgICAgICAgLy8gdGhlIG5leHQgbGluZXMgaXMgYW4gaW1taXRhdGlvbiBvZiB0aGUgYmVoYXZpb3VyIG9mIGFuIG9ubGluZSBwcm9ncmFtOlxyXG4gICAgICAgICAgICAgIC8vIDEpIHRoZSByZWNvcmQgbXVzdCBiZSB1cGRhdGVkIGluIHRoaXMgZXZlbnRcclxuICAgICAgICAgICAgICAvLyAyKSBhIFwibmV4dCBmaWVsZFwiIGV2ZW50IGlzIHJhaXNlZFxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2N1cnJGaWVsZC5zZXRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKHRoaXMuX2N1cnJGaWVsZC5nZXRNYWdpY0RlZmF1bHRWYWx1ZSgpLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fY3VyckZpZWxkLnVwZGF0ZURpc3BsYXkoKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUk9MTEJBQ0s6XHJcbiAgICAgICAgICAgIC8vIGZvciBvZmZsaW5lIHdlIG5lZWQgdG8gY2FuY2VsIHRoZSBlZGl0IGFuZCB0aGVuIGdvIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbiwgdGhlIHNhbWUgd2UgZG9pbmcgZm9yIHJlbW92ZSB3aGlsZSByZXR1cm4gZnJvbSB0aGUgc2VydmVyXHJcbiAgICAgICAgICAgIC8vIHNlZSBkYXRhdmlldy5jcyBjYXNlIENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX1JPTExCQUNLOlxyXG4gICAgICAgICAgICAvLyBmb3Igb2ZmbGluZSB3ZSB3aWxsIG5vdCBnZXQgdG8gQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfUk9MTEJBQ0tcclxuICAgICAgICAgICAgYXdhaXQgRXZlbnRzTWFuYWdlci5IYW5kbGVSb2xsYmFja0FjdGlvbih0YXNrLCBjbWRzVG9TZXJ2ZXIsIFJvbGxiYWNrRXZlbnRDb21tYW5kX1JvbGxiYWNrVHlwZS5ST0xMQkFDSyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9PSzpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0lOREVYX0NIQU5HRTpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPTF9TT1JUOlxyXG4gICAgICAgICAgICAvLyBjYW4gc29ydCBvbmx5IG9uIGNvbHVtbiB3aXRoIGFuIGF0dGFjaGVkIGZpZWxkLlxyXG4gICAgICAgICAgICAvLyBjYW4gY2hhbmdlIGluZGV4IG9ubHkgaWYgdGhlIGRhdGF2aWV3IGlzIHJlbW90ZS5cclxuICAgICAgICAgICAgaWYgKChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfSU5ERVhfQ0hBTkdFICYmIHRhc2suRGF0YXZpZXdNYW5hZ2VyLkhhc1JlbW90ZURhdGEpIHx8XHJcbiAgICAgICAgICAgICAgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT0xfU09SVCAmJiBjdHJsLmdldEZpZWxkKCkgIT0gbnVsbCkpIHtcclxuICAgICAgICAgICAgICAvLyBRQ1IgIzI5NjMyNSAmIFFDUiAjNDMwMjg4LlxyXG4gICAgICAgICAgICAgIC8vIEV4ZWN1dGUgQ1Mgb2YgdGhlIGN1cnJlbnQgY29udHJvbCwgYmVjYXVzZSBpdCBjYW4gYmUgYSBwYXJhbWV0ZXIgZm9yIGEgc3ViZm9ybS5cclxuICAgICAgICAgICAgICAvLyBJZiBpdCdzIHZhbHVlIHdhcyBjaGFuZ2VkLCBDUyB3aWxsIHJlZnJlc2ggdGhlIHN1YmZvcm0gYmVmb3JlIHRoZSBzb3J0LlxyXG4gICAgICAgICAgICAgIGxldCBsYXN0Rm9jdXNlZFRhc2s6IFRhc2sgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgbGV0IGZvY3VzZWRDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKExhc3RGb2N1c2VkTWFuYWdlci5MYXN0Rm9jdXNNZ2RJRCk7XHJcbiAgICAgICAgICAgICAgaWYgKGZvY3VzZWRDdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShmb2N1c2VkQ3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0YXNrLkV4ZWN1dGVOZXN0ZWRSUyhsYXN0Rm9jdXNlZFRhc2spO1xyXG5cclxuICAgICAgICAgICAgICAvLyBRQ1IgIzQzODc1My4gRXhlY3V0ZSBSUyBvZiB0aGUgc29ydGVkIHRhc2suXHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgdGFzay5nZXRMZXZlbCgpICE9PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgICAgdGFzay5nZXRUYXNrQ2FjaGUoKS5jbGVhckNhY2hlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9JTkRFWF9DSEFOR0UpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IHRhc2tGb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGFza0Zvcm0uSGFzVGFibGUoKSlcclxuICAgICAgICAgICAgICAgICAgICBmb3JtLmNsZWFyVGFibGVDb2x1bW5Tb3J0TWFyayh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIGNtZCA9IGF3YWl0IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUluZGV4Q2hhbmdlQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5HZXRDdXJyZW50UmVjSWQoKSwgZXZ0LmdldEFyZ0xpc3QoKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVDb2x1bW5Tb3J0Q29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgZXZ0LkRpcmVjdGlvbiwgY3RybC5nZXREaXRJZHgoKSwgY3RybC5nZXRGaWVsZCgpLmdldElkKCksICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuR2V0Q3VycmVudFJlY0lkKCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuICAgICAgICAgICAgICAgIGR2LnNldFRvcFJlY0lkeCgwKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0ucmVzdG9yZU9sZERpc3BsYXlMaW5lKDApO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFFDUidzICMxNjU4MTUgJiAjMjkxOTc0LiBJZiB0aGUgZm9jdXNlZCB0YXNrIGFuZCB0aGUgc29ydGVkIHRhc2sgaXMgdGhlIHNhbWUgdGFzayBvclxyXG4gICAgICAgICAgICAgICAgLy8gdGhlIGZvY3VzZWQgdGFzayBpcyBhIGNoaWxkIG9mIHRoZSBzb3J0ZWQgdGFzaywgZ28gdG8gdGhlIGZpcnN0IGNvbnRyb2wgaW4gdGhlIGZpcnN0IGxpbmUuXHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZm9jdXNlZCB0YXNrIGlzIHRoZSBwYXJlbnQgdGFzaywgZG8gbm90IGxlYXZlIHRoZSBjdXJyZW50IGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICBpZiAoISh0YXNrID09PSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkgfHwgIXRhc2sucGF0aENvbnRhaW5zKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgIXRhc2suZ2V0UHJldmVudENvbnRyb2xDaGFuZ2UoKSlcclxuICAgICAgICAgICAgICAgICAgLy8gUUNSICM0Mjg2OTcuIEV4ZWN1dGUgUlMgb2YgYWxsIG5lc3RlZCBzdWJmb3Jtcy5cclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBsYXN0Rm9jdXNlZFRhc2suRXhlY3V0ZU5lc3RlZFJTKHRhc2spO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiBmb2N1c2VkQ3RybCAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZvY3VzZWRDdHJsLmludm9rZSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuXHJcblxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT0xfQ0xJQ0s6XHJcbiAgICAgICAgICAgIC8vIGNhbiBzb3J0IG9uIGNvbHVtbiBvbmx5IGlmIGV2ZW50IGlzIHJhaXNlZCBkdWUgdG8gY2xpY2sgYWN0aW9uXHJcbiAgICAgICAgICAgIC8vIGFuZCBhIGZpZWxkIGlzIGF0dGFjaGVkIHRvIGNvbHVtbi5cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmIGV2dC5pc0d1aVRyaWdnZXJlZEV2ZW50KCkgJiYgY3RybC5pc0NvbHVtblNvcnRhYmxlKCkpIHtcclxuICAgICAgICAgICAgICBsZXQgY29sdW1uQ2hpbGRDb250cm9sOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPmN0cmwuZ2V0Q29sdW1uQ2hpbGRDb250cm9sKCk7XHJcbiAgICAgICAgICAgICAgaWYgKGNvbHVtbkNoaWxkQ29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBoYW5kbGUgU29ydCBvbiBDb2x1bW5cclxuICAgICAgICAgICAgICAgIGxldCBhUnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KGNvbHVtbkNoaWxkQ29udHJvbCwgZXZ0LkRpcmVjdGlvbiwgMCk7XHJcbiAgICAgICAgICAgICAgICBhUnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPTF9TT1JUKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkVG9UYWlsKGFSdEV2dCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gZW5kIG9mIGludGVybmFsIGV2ZW50cyBwcm9jZXNzaW5nXHJcblxyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5wb3BSdEV2ZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKlxyXG4qIEhhbmRsZUFjdEVudGVyUm93RWRpdGluZ1xyXG4qIHN0YXJ0IHRoZSBlZGl0aW5nIG9uIHJvd1xyXG4qICovXHJcbiAgcHJpdmF0ZSBhc3luYyBIYW5kbGVBY3RFbnRlclJvd0VkaXRpbmcodGFzazogVGFzaykge1xyXG4gICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZKVxyXG4gICAgICB0YXNrLldyaXRlVG9NZXNzYWdlUGFuZShgQ2Fubm90IGVudGVyIFJvdyBFZGl0aW5nIHdoZW4gaW4gUXVlcnkgTW9kZS5gKTtcclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgbXlmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICBhd2FpdCBteWZvcm0uc3RhcnRSb3dFZGl0aW5nKG15Zm9ybS5EaXNwbGF5TGluZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIEhhbmRsZVN0b3BSb3dFZGl0aW5nKHRhc2s6IFRhc2spIHtcclxuICAgIGxldCBteWZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICBhd2FpdCBteWZvcm0uc3RvcFJvd0VkaXRpbmcobXlmb3JtLkRpc3BsYXlMaW5lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ3JlYXRlcyBhbmQgZXhlY3V0ZXMgc3ViZm9ybSBvcGVuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtQ29udHJvbFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBPcGVuU3ViZm9ybSh0YXNrOiBUYXNrLCBzdWJmb3JtQ29udHJvbDogTWdDb250cm9sKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0YXNrLlRhc2tTZXJ2aWNlLlJlbW92ZVJlY29tcHV0ZXModGFzayk7XHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVN1YmZvcm1PcGVuQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgc3ViZm9ybUNvbnRyb2wuZ2V0RGl0SWR4KCkpO1xyXG4gICAgdGFzay5nZXRNR0RhdGEoKS5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICBhd2FpdCBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY21kc1RvU2VydmVyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyb2xsYmFja1R5cGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgSGFuZGxlUm9sbGJhY2tBY3Rpb24odGFzazogVGFzaywgY21kc1RvU2VydmVyOiBDb21tYW5kc1RhYmxlLCByb2xsYmFja1R5cGU6IFJvbGxiYWNrRXZlbnRDb21tYW5kX1JvbGxiYWNrVHlwZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGNvbW1hbmRzUHJvY2Vzc29yOiBDb21tYW5kc1Byb2Nlc3NvckJhc2UgPSBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yO1xyXG4gICAgQ2xpZW50UmVmcmVzaENvbW1hbmQuQ2xpZW50SXNJblJvbGxiYWNrQ29tbWFuZCA9IHRydWU7XHJcbiAgICAvLyBmb3IgcmVtb3RlIHByb2dyYW0gOiAod2l0aFxcd2l0aG91dCBsb2NhbCBkYXRhKSB0aGUgcm9sbGJhY2sgZXZlbnQgaW4gdGhlIHNlcnZlciBNVVNUXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgYmUgZXhlY3V0ZSBvbiB0aGUgdGFzayB0aGF0IG9wZW4gdGhlIHRyYW5zYWN0aW9uXHJcbiAgICAvLyBmb3Igb2ZmbGluZSBwcm9ncmFtIHRoZSByb2xsYmFjayB0cmFuc2FjdGlvbiBuZWVkIHRvIGJlIGV4ZWN1dGUgb24gdGhlIHRhc2sgdGhhdCBvcGVuIHRoZSB0cmFuc2FjdGlvblxyXG4gICAgdGFzayA9IHRhc2suVGFza1NlcnZpY2UuR2V0T3duZXJUcmFuc2FjdGlvblRhc2sodGFzayk7XHJcblxyXG4gICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVSb2xsYmFja0V2ZW50Q29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgcm9sbGJhY2tUeXBlKTtcclxuICAgIGNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgIGF3YWl0IGNvbW1hbmRzUHJvY2Vzc29yLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG5cclxuICAgIENsaWVudFJlZnJlc2hDb21tYW5kLkNsaWVudElzSW5Sb2xsYmFja0NvbW1hbmQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV2dFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVjXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsYXN0UGFya2VkQ3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib2xkUmVjTW9kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib2xkTW9kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIEhhbmRsZUFjdENhbmNlbChldnQ6IFJ1blRpbWVFdmVudCwgdGFzazogVGFzaywgZm9ybTogTWdGb3JtLCBjdHJsOiBNZ0NvbnRyb2wsIHJlYzogUmVjb3JkLCBpc01HX0FDVF9DQU5DRUw6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIFByZXZlbnQgcmVjdXJzaXZlIG1vZGVcclxuICAgIC8vIGZpeGVkIGJ1Z3MgIzoyODU0OTgsIDI5NzQ1NVxcNDI3NzAzXFxcclxuICAgIGlmICh0YXNrLkluSGFuZGxlQWN0Q2FuY2VsKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgdGFzay5JbkhhbmRsZUFjdENhbmNlbCA9IHRydWU7XHJcblxyXG4gICAgbGV0IG9sZE1vZGU6IHN0cmluZyA9IHRhc2suZ2V0TW9kZSgpO1xyXG4gICAgbGV0IHNhdmVEaXNwbGF5TGluZSA9IHRhc2suZ2V0Rm9ybSgpLkRpc3BsYXlMaW5lO1xyXG5cclxuICAgIC8vIFdoZW4gZG8gd2Ugc2hvdyB0aGUgJ0NvbmZpcm0gQ2FuY2VsIHdpbmRvdycgPyB3aGVuIGFsbCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXBwbHk6XHJcbiAgICAvLyAxLiBUYXNrIG1vZGUgaXMgbm90IHF1ZXJ5XHJcbiAgICAvLyAyLiByZWMgaXMgbm90IFVwZGF0ZWQuIFVwZGF0ZWQgaXMgdHJ1ZSB3aGVuIHRoZXJlIHdhcyBhbiBVcGRhdGUgb3BlcmF0aW9uIHdpdGggJ2ZvcmNlIHVwZGF0ZScuIElmIGl0IGlzIHRydWUsIHRoZW4gdGhlcmUgaXMgbm8gbWVhbmluZyB0byBzaG93IHRoZVxyXG4gICAgLy8gICAgd2luZG93IHNpbmNlIHRoZSB1cGRhdGUgc3RheXMgYW55d2F5IChsaWtlIGluIG9ubGluZSB3aGVuIHdlIGdvIHRvIENhbmNlbFdhc1RyaWdnZXJlZCkuXHJcbiAgICAvLyAzLiBUaGVyZSBtdXN0IGJlIGEgbW9kaWZpY2F0aW9uLCBvdGhlcndpc2UgdGhlcmUgaXMgbm90aGluZyB0byBjYW5jZWwuIFNvIGVpdGhlciBNb2RpZmllZCBpcyB0cnVlLCBtZWFuaW5nIGEgZmllbGQgd2FzIG1vaWRmaWVkICwgb3JcclxuICAgIC8vICAgIExhc3RQYXJrZWRDdHJsKCkubW9kaWZpZWRCeVVzZXIoKSwgbWVhbmluZyB0aGF0IHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGNoYW5naW5nIHRoZSBmaWVsZCdzIHZhbHVlIChUaGUgbW9kaWZpZWQgaXMgZmFsc2UgdW50aWxsIHdlIGV4aXQgdGhlIGZpZWxkKS5cclxuICAgIC8vIENyZWF0ZSBtb2RlIGFsc28gZ29lcyBoZXJlIChyZWMgcmVtb3ZlZCBhbmQgbW9kZSBjaGFuZ2VzIHRvIG1vZGlmeSkgLCBidXQgYWxzbyB3aWxsIHNob3cgdGhlIGNvbmZpcm0gY2FuY2VsIG9ubHkgaWYgc29tZSBjaGFuZ2Ugd2FzIGRvbmUgdG8gdGhlIG5ldyByZWNvcmQuXHJcbiAgICBpZiAob2xkTW9kZSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSAmJiAhcmVjLlVwZGF0ZWQpIHtcclxuICAgICAgaWYgKGlzTUdfQUNUX0NBTkNFTCkge1xyXG4gICAgICAgIGlmIChyZWMuTW9kaWZpZWQgfHwgKHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSAhPT0gbnVsbCAmJiB0YXNrLmdldExhc3RQYXJrZWRDdHJsKCkuTW9kaWZpZWRCeVVzZXIpKSB7XHJcbiAgICAgICAgICBpZiAoYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09ORklSTV9DQU5DRUwsIGZhbHNlKSkge1xyXG4gICAgICAgICAgICBsZXQgY29uZmlybWVkID0gYXdhaXQgR1VJTWFuYWdlci5JbnN0YW5jZS5jb25maXJtX2Jvb2woTXNnSW50ZXJmYWNlLkNPTkZJUk1fU1RSX0NBTkNFTCk7XHJcbiAgICAgICAgICAgIGlmICghY29uZmlybWVkKSB7XHJcbiAgICAgICAgICAgICAgdGFzay5JbkhhbmRsZUFjdENhbmNlbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IG9sZFJlY01vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcyA9IHJlYy5nZXRNb2RlKCk7XHJcblxyXG4gICAgICAvLyBTcGVjaWFsQ2FuY2VsT25DcmVhdGUgYmVoYXZpb3IgZm9yIEFsbG93RW1wdHlEYXRhVmlldyA9IFkgOiBXaGVuIHRoZXJlIGlzIHNpbmdsZSBuZXdseSBjcmVhdGVkIHJlY29yZFxyXG4gICAgICAvLyBleGlzdCBhbmQgdXNlciBjYW5jZWxzIGl0IGFuZCB0YXNrIGhhcyBBbGxvd0VtcHR5RGF0YVZpZXc9WVxyXG4gICAgICAvLyB0aGVuIGNoYW5nZSB0YXNrIG1vZGUgdG8gTW9kaWZ5IG1vZGUgc28gdGhhdCBzZXJ2ZXIgYWxsb3dzIHRoaXMgdGFzayB0byBlbnRlciBhZ2FpbiBpbiBFbXB0eURhdGFWaWV3IG1vZGUuXHJcbiAgICAgIGlmIChHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRTcGVjaWFsQ2FuY2VsT25DcmVhdGUoKSAmJiB0YXNrLmdldE1vZGUoKSA9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURVxyXG4gICAgICAgICYmIHRhc2suZ2V0T3JpZ2luYWxUYXNrTW9kZSgpID09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcblxyXG4gICAgICAgIGxldCBlbmFibGU6IGJvb2xlYW4gPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRlksIHRydWUpO1xyXG5cclxuICAgICAgICBpZiAoZW5hYmxlKSB7XHJcbiAgICAgICAgICBsZXQgYWxsb3dFbXB0eURhdGFWaWV3OiBib29sZWFuID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfRU1QVFlfREFUQVZJRVcsIHRydWUpO1xyXG5cclxuICAgICAgICAgIGlmICgoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldFNpemUoKSA9PSAxICYmIGFsbG93RW1wdHlEYXRhVmlldykge1xyXG4gICAgICAgICAgICB0YXNrLnNldE1vZGUoJ00nKTtcclxuICAgICAgICAgICAgdGFzay5EYXRhVmlldy5zZXRFbXB0eURhdGF2aWV3KHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGlzTUdfQUNUX0NBTkNFTCkge1xyXG4gICAgICAgIC8vIFdoZW4gY2FuY2VsaW5nLCB3ZSBoYXZlIHRvIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbi5cclxuICAgICAgICAvLyBVbmxlc3MgdGhlIGV2ZW50IGRvZXMgbm90IGFsbG93IHRvIHJvbGxiYWNrIGluIGNhbmNlbC4gVGhhdCBjYW4gaGFwcGVuIGlmIHRoZSBjYW5jZWwgd2FzIGluaXRpYXRlZCBieSB0aGUgc2VydmVyJ3MncyByb2xsYmFjay5cclxuICAgICAgICBpZiAodGFzay5pc1RyYW5zYWN0aW9uT25MZXZlbChDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSAmJiBldnQuUm9sbGJhY2tJbkNhbmNlbCgpKSB7XHJcbiAgICAgICAgICBhd2FpdCBFdmVudHNNYW5hZ2VyLkhhbmRsZVJvbGxiYWNrQWN0aW9uKHRhc2ssIDxDb21tYW5kc1RhYmxlPnRhc2suZ2V0TUdEYXRhKCkuQ21kc1RvU2VydmVyLCBSb2xsYmFja0V2ZW50Q29tbWFuZF9Sb2xsYmFja1R5cGUuQ0FOQ0VMKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IEV2ZW50c01hbmFnZXIuSGFuZGxlQ2FuY2VsRWRpdChldnQsIHRhc2ssIGZvcm0sIHJlYywgb2xkUmVjTW9kZSk7XHJcbiAgICB9XHJcbiAgICAvLyBRY3IgIzc0Nzg3MCBjYW5jZWwgc2hvdWxkIHBlcmZvcm0gdGhlIHJlY29yZCBwcmVmaXggaWYgbm90IHF1aXRpbmdcclxuICAgIGVsc2Uge1xyXG4gICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG5cclxuICAgICAgLy8gd2Ugcm9sbGJhY2sgYSBwYXJlbnQgdGFzayB3aGlsZSBmb2N1c2VkIG9uIHN1YmZvcm0vdGFzay4gV2UgZG8gbm90IHdhbnQgdGhlIGN0cmwgb24gdGhlIHN1YmZvcm0gdG8gZG8gY3RybCBzdWZmaXguXHJcbiAgICAgIGxldCBsYXN0Rm9jdXNlZENvbnRyb2w6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuICAgICAgaWYgKGxhc3RGb2N1c2VkQ29udHJvbCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGxhc3RGb2N1c2VkQ29udHJvbC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghZXZ0LmlzUXVpdCgpKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlUGFya2FiaWxpdHlPblJvd0NoYW5nZSh0YXNrKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFFDUiMgOTQxMjc3OiBJZiBDYW5jZWwgZXZlbnQgaXMgY2FsbGVkIGZyb20gUXVpdCBldmVudCwgdGhlbiBkb24ndCBleGVjdXRlIEV4aXQgZXZlbnRcclxuICAgIC8vIGlmIHVzZXIgaGFzIHByZXNzZWQgJ05vJyBvbiBDb25maXJtIGNhbmNlbCBib3guXHJcbiAgICBpZiAoZXZ0LmlzUXVpdCgpKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcblxyXG4gICAgLy8gcmVzZXQgaXNSb3dFZGl0aW5nXHJcbiAgICBhd2FpdCBmb3JtLnN0b3BSb3dFZGl0aW5nKHNhdmVEaXNwbGF5TGluZSk7XHJcblxyXG4gICAgdGFzay5JbkhhbmRsZUFjdENhbmNlbCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjYW5jZWwgdGhlIGVkaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV2dFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVjXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbGRSZWNNb2RlXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBIYW5kbGVDYW5jZWxFZGl0KGV2dDogUnVuVGltZUV2ZW50LCB0YXNrOiBUYXNrLCBmb3JtOiBNZ0Zvcm0sIHJlYzogUmVjb3JkLCBvbGRSZWNNb2RlOiBEYXRhTW9kaWZpY2F0aW9uVHlwZXMpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGlmIHRoZSBzeW5jZWQgcmVjb3JkIChpLmUuIHRoZSByZWNvcmQgZnJvbSB0aGUgcGFyZW50IHRhc2sgb2YgdGhlIHN1YmZvcm0pIGJlZm9yZSBSb2xsYmFjayB3YXMgaW4gJ0luc2VydCcgbW9kZSxcclxuICAgIC8vIHNvIGl0IG11c3QgYmUgaW4gJ0luc2VydCcgbW9yZSBhZnRlciByZXR1cm4gZnJvbSB0aGUgc2VydmVyXHJcbiAgICBpZiAocmVjLlN5bmNlZCAmJiBvbGRSZWNNb2RlID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KVxyXG4gICAgICByZWMuc2V0TW9kZShvbGRSZWNNb2RlKTtcclxuXHJcbiAgICBpZiAoZm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAvLyByZXNldCB0aGUgbGFzdCBwYXJrZWQgY29udHJvbFxyXG4gICAgICBpZiAodGFzay5nZXRMYXN0UGFya2VkQ3RybCgpICE9PSBudWxsKVxyXG4gICAgICAgIHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKS5yZXNldFByZXZWYWwoKTtcclxuXHJcbiAgICAgIGF3YWl0IGZvcm0uY2FuY2VsRWRpdCh0cnVlLCBldnQuaXNRdWl0KCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXZ0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkdlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVjXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJub25JbnRlcmFjdGl2ZURlbGV0ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIEhhbmRsZUFjdGlvbkRlbGxpbmUodGFzazogVGFzaywgZHY6IERhdGFWaWV3LCByZWM6IFJlY29yZCwgbm9uSW50ZXJhY3RpdmVEZWxldGU6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBsYXN0UGFya2VkQ3RybDogTWdDb250cm9sO1xyXG4gICAgbGV0IG15Zm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgIGxldCBzYXZlSXNSb3dFZGl0aW5nID0gbXlmb3JtLmdldElzUm93RWRpdGluZ0Zyb21HdWkobXlmb3JtLkRpc3BsYXlMaW5lKTsgLy9Db21tYW5kcy5nZXRJc1JvdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UobGFzdFBhcmtlZEN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCk7d0VkaXRpbmcoIHRhc2suZ2V0Rm9ybSgpLmdldE1haW5Db250cm9sKCksIHRhc2suZ2V0Rm9ybSgpLkRpc3BsYXlMaW5lKTsgICAgbGV0IG9sZFJlY01vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcztcclxuICAgIGxldCBvbGRSZWNNb2RlOiBEYXRhTW9kaWZpY2F0aW9uVHlwZXM7XHJcbiAgICBpZiAoYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfREVMRVRFLCB0cnVlKSkge1xyXG4gICAgICBsYXN0UGFya2VkQ3RybCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IG51bGwpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UobGFzdFBhcmtlZEN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcbiAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgb2xkUmVjTW9kZSA9IHJlYy5nZXRNb2RlKCk7XHJcblxyXG4gICAgICAgIC8vIEZvcmNlIHRoZSBjaGFuZ2UgdG8gZGVsZXRlIG1vZGVcclxuICAgICAgICByZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgcmVjLnNldE1vZGUoRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSk7XHJcblxyXG4gICAgICAgIGlmIChvbGRSZWNNb2RlID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KVxyXG4gICAgICAgICAgcmVjLnNldFNlbmRUb1NlcnZlcihmYWxzZSk7XHJcblxyXG4gICAgICAgIC8vIGV4ZWN1dGUgdGFzayBzdWZmaXggaW4gTW9kaWZ5IG1vZGUgb3Igd2hlbiB0aGVyZSBpcyAnZm9yY2UgcmVjb3JkIHN1ZmZpeCcuXHJcbiAgICAgICAgaWYgKHJlYy5Nb2RpZmllZCB8fCBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIGZhbHNlKSkge1xyXG4gICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSByZWNvcmQgc3VmZml4IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcclxuICAgICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICAgIGlmICghcmVjLlNlbmRUb1NlcnZlcikge1xyXG4gICAgICAgICAgICAgIGF3YWl0IGR2LmFkZEN1cnJUb01vZGlmaWVkKCk7XHJcbiAgICAgICAgICAgICAgcmVjLnNldFNlbmRUb1NlcnZlcih0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgICAgICByZWMuc2V0TW9kZShvbGRSZWNNb2RlKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZXhlY3V0ZSByZWNvcmQgc3VmZml4IGluIERlbGV0ZSBtb2RlXHJcbiAgICAgICAgLy8gc2V0IHRoZSBJbkRlbGV0ZVByb2Nlc3MgZmxhZyAsIHNvIHdlIHdpbGwgbm90IHRyeSB0byBzZW5kIHVwZGF0ZXMgb24gdGhlIHJlY29yZCBhZnRlclxyXG4gICAgICAgIC8vIHdlIGRlbGV0ZSBpdCBpbiB0aGUgY29tbW9uSGFuZGxlckFmdGVyIChyZWMgc3VmZml4KS5cclxuICAgICAgICByZWMuc2V0SW5EZWxldGVQcm9jZXNzKHRydWUpO1xyXG5cclxuICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUpO1xyXG4gICAgICAgIC8vIG5vIGNvbmZpcm0gbWVzc2FnZSBkaWFsb2cgaWYgaW4gbm9uIGludGVyYWN0aXZlIGRlbGV0ZS5cclxuICAgICAgICBsZXQgc2tpcENvbmZpcm1EaWFsb2c6IGJvb2xlYW4gPSBub25JbnRlcmFjdGl2ZURlbGV0ZTtcclxuXHJcbiAgICAgICAgaWYgKCFza2lwQ29uZmlybURpYWxvZykge1xyXG4gICAgICAgICAgaWYgKHRhc2subXVzdENvbmZpcm1JbkRlbGV0ZU1vZGUoKSB8fCBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05GSVJNX1VQREFURSwgZmFsc2UpKSB7XHJcbiAgICAgICAgICAgIGxldCBjb25maXJtZWQ6IGJvb2xlYW4gPSBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLmNvbmZpcm1fYm9vbChNc2dJbnRlcmZhY2UuQ09ORklSTV9TVFJfREVMRVRFKTtcclxuICAgICAgICAgICAgaWYgKCFjb25maXJtZWQpIHtcclxuICAgICAgICAgICAgICByZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgICAgICAgcmVjLnNldE1vZGUob2xkUmVjTW9kZSk7XHJcbiAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgICAgICAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IG51bGwpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShsYXN0UGFya2VkQ3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHNhdmVJc1Jvd0VkaXRpbmcpIHtcclxuICAgICAgICAgICAgICAgIGxldCBteWZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBteWZvcm0uc3RhcnRSb3dFZGl0aW5nKG15Zm9ybS5EaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgIHJlYy5zZXRJbkRlbGV0ZVByb2Nlc3MoZmFsc2UpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgaWYgKCFyZWMuU2VuZFRvU2VydmVyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGR2LmFkZEN1cnJUb01vZGlmaWVkKCk7XHJcbiAgICAgICAgICAgIHJlYy5zZXRTZW5kVG9TZXJ2ZXIodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgICAgcmVjLnNldE1vZGUob2xkUmVjTW9kZSk7XHJcbiAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG4gICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHdlJ3JlIGRlbGV0aW5nIGFuIGluc2VydGVkIHJlY29yZCwgdGhlIHNlcnZlciBpcyBub3QgYXdhcmUgb2YgaXRcclxuICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB1cG9uIGRlbGV0ZSwgaXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIG1vZGlmaWVkIHJlYyBsaXN0XHJcbiAgICAgICAgaWYgKG9sZFJlY01vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpIHtcclxuICAgICAgICAgIHJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICAgIHJlYy5zZXRNb2RlKG9sZFJlY01vZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG5ld0N1cnJSZWM6IFJlY29yZCA9IGR2LmdldEN1cnJSZWMoKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIC8vIFFDUiAjNDM4MTc1OiB3aGVuIHRoZSB1c2VyIGRlbGV0ZXMgYSByZWNvcmQsIHdoaWNoIGlzIHRoZSBzaW5nbGVcclxuICAgICAgICAgIC8vIHJlY29yZCBpbiB0aGUgZHYsIHRoZW4gd2hlbiBpdHMgcmVjb3JkIHN1ZmZpeCBpcyBleGVjdXRlZCBhbmQgdGhlXHJcbiAgICAgICAgICAvLyBzZXJ2ZXIgc2VuZHMgYSBuZXcgcmVjb3JkIHRvIHRoZSBjbGllbnQgYW5kIHNldCBpdCB0byBiZSB0aGVcclxuICAgICAgICAgIC8vIGN1cnJlbnQgcmVjb3JkLlxyXG4gICAgICAgICAgLy8gVGhpcyBmaXggbWFrZXMgdGhlIGRlbGV0ZWQgcmVjb3JkIHRvIGJlIHRoZSBjdXJyZW50IGZvciBhXHJcbiAgICAgICAgICAvLyBtb21lbnQganVzdCB0byBkZWxldGUgaXQgZnJvbSB0aGUgY2xpZW50cyBjYWNoZS4gVGhlbiwgaXQgbWFrZXNcclxuICAgICAgICAgIC8vIHRoZSBuZXcgcmVjb3JkIHRvIGJlIHRoZSBjdXJyZW50IGFnYWluIGFuZCBlbnRlcnMgaW50byBjcmVhdGUgbW9kZS5cclxuICAgICAgICAgIC8vIEkgdGhpbmsgdGhhdCBhIGJldHRlciBzb2x1dGlvbiBpcyB0byBkZWNpZGUgd2hldGhlciB0aGUgY2xpZW50IGlzXHJcbiAgICAgICAgICAvLyByZXNwb25zaWJsZSBmb3IgYWRkaW5nIGEgbmV3IHJlY29yZCBvciB0aGUgc2VydmVyLCBhbmQgbWFrZSBzdXJlXHJcbiAgICAgICAgICAvLyB0aGF0IGl0IGlzIGRvbmUgc3lzdGVtd2lkZS5cclxuICAgICAgICAgIC8vIEVodWQgLSAxMC8wOS8yMDAxXHJcbiAgICAgICAgICBpZiAocmVjICE9PSBuZXdDdXJyUmVjKVxyXG4gICAgICAgICAgICBhd2FpdCBkdi5zZXRDdXJyUmVjKHJlYy5nZXRJZCgpLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgLy8gbm8gbmVlZCB0byBkZWwgdGhlIGN1cnIgcmVjIGFuZCBwb3NpdGlvbiBvbiB0aGUgbmV4IHJlYyBpZiB0aGUgdGFzayBpcyBhYm9ydGluZy5cclxuICAgICAgICAgIC8vIFRoZSBkZWxDdXJyUmVjIG1heSBjYXVzZSBhIGNyYXNoIGlmIGl0IHRyaWVzIHRvIGdldCB0aGUgbmV4dCByZWMgZnJvbSB0aGUgbmV4dCBjaHVuay5cclxuICAgICAgICAgIGlmICghdGFzay5pc0Fib3J0aW5nKCkpXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsQ3VyclJlYyh0YXNrLCBmYWxzZSk7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgIC8vIFFDUiAjNDM4MTc1IC0gZml4IGNvbnRpbnVlXHJcbiAgICAgICAgICBpZiAocmVjICE9PSBuZXdDdXJyUmVjKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGR2LnNldEN1cnJSZWMobmV3Q3VyclJlYy5nZXRJZCgpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChkdi5nZXRTaXplKCkgPT09IDEpXHJcbiAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIEluIGludGVyYWN0aXZlLCB0aGUgbW9kZSBtaWdodCBjaGFuZ2UgdG8gbW9kaWZ5IG9yIGNyZWF0ZS4gSG93ZXZlciwgZm9yIG5vbiBpbnRlcmFjdGl2ZSAoZGVsZXRlIG1vZGUpXHJcbiAgICAgICAgICAvLyB0aGUgbW9kZSBzaG91bGQgYmUgc2V0IGJhY2sgdG8gZGVsZXRlIGFuZCB3aWxsIGJlIHVzZWQgaW4gdGhlIG5leHQgcmVjb3JkIGN5Y2xlLlxyXG4gICAgICAgICAgaWYgKG5vbkludGVyYWN0aXZlRGVsZXRlKVxyXG4gICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGhhbmRsZSB2aWV3IHJlZnJlc2gsIHNjcmVlbiByZWZyZXNoIGFuZCByZWNvcmQgZmx1c2ggZXZlbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2dFwiPnRoZSBldmVudCB0byBoYW5kbGUgd2l0aCBhbGwgaXRzIHByb3BlcnRpZXM8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlUmVmcmVzaEV2ZW50cyhldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ldnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICBsZXQgZHY6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRhc2suRGF0YVZpZXc7XHJcbiAgICBsZXQgaW50RXZ0Q29kZTogbnVtYmVyID0gZXZ0LmdldEludGVybmFsQ29kZSgpO1xyXG4gICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSBudWxsO1xyXG5cclxuICAgIGlmIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9SRUNPUkQpXHJcbiAgICAgIHRoaXMuX2lzSW5SZWNvcmRGbHVzaEV2ZW50ID0gdHJ1ZTtcclxuICAgIC8vIGNoZWNrIGlmIHdlIHRyeSB0byB2aWV3IHJlZnJlc2ggd2l0aCBhbGxvd19tb2RpZnk9biBpbiBjcmVhdGUgbW9kZVxyXG4gICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcgJiYgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmICFhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRlksIHRydWUpKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGF3YWl0IHRhc2suRXhlY3V0ZU5lc3RlZFJTKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSk7XHJcbiAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmICF0YXNrLkluRW5kVGFzayAmJiAhdGFzay5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgICBpZiAoaW50RXZ0Q29kZSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOKSB7XHJcbiAgICAgICAgICBsZXQgY3VycmVudFJvdzogbnVtYmVyID0gMDtcclxuICAgICAgICAgIGlmICghZXZ0LmdldFJlZnJlc2hUeXBlKCkpIHtcclxuICAgICAgICAgICAgaWYgKGV2dC5SdFZpZXdSZWZyZXNoVXNlQ3VycmVudFJvdygpICYmIHRhc2suSXNJbnRlcmFjdGl2ZSkge1xyXG4gICAgICAgICAgICAgIGN1cnJlbnRSb3cgPSBmb3JtLmdldEN1cnJSZWNQb3NJbkZvcm0oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVJbnRlcm5hbFJlZnJlc2hDb21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCBpbnRFdnRDb2RlLCBkdi5DdXJyZW50UmVjSWQsIGN1cnJlbnRSb3cpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRhc2suSXNJbnRlcmFjdGl2ZSlcclxuICAgICAgICAgICAgICBjdXJyZW50Um93ID0gZm9ybS5nZXRDdXJyUmVjUG9zSW5Gb3JtKCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgcmVmZXRjaFJlY29yZDogYm9vbGVhbiA9IHRydWU7IC8vUmVmZXRjaCByZWNvcmQgZnJvbSBzZXJ2ZXIuXHJcbiAgICAgICAgICAgIGlmIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9SRUNPUkQgJiYgZXZ0LmdldEFyZ0xpc3QoKSAhPT0gbnVsbCAmJiBldnQuZ2V0QXJnTGlzdCgpLmdldFNpemUoKSAhPT0gMCkge1xyXG4gICAgICAgICAgICAgIGxldCByZWZldGNoUmVjU3RyOiBzdHJpbmc7XHJcbiAgICAgICAgICAgICAgcmVmZXRjaFJlY1N0ciA9IGF3YWl0IGV2dC5nZXRBcmdMaXN0KCkuZ2V0QXJnVmFsdWUoMCwgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOLCAwKTtcclxuICAgICAgICAgICAgICByZWZldGNoUmVjb3JkID0gKGlzTnVsbE9yVW5kZWZpbmVkKHJlZmV0Y2hSZWNTdHIpIHx8IHJlZmV0Y2hSZWNTdHIgPT09ICcxJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyZWZldGNoUmVjb3JkKVxyXG4gICAgICAgICAgICAgIGNtZCA9IGF3YWl0IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVJlYWxSZWZyZXNoQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgaW50RXZ0Q29kZSwgY3VycmVudFJvdywgZXZ0LmdldEFyZ0xpc3QoKSwgZHYuQ3VycmVudFJlY0lkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc2NyZWVuIHJlZnJlc2ggZXZlbnRcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGxldCBpZDogbnVtYmVyO1xyXG5cclxuICAgICAgICAgIGlmICh0YXNrLmdldEZvcm0oKSA9PT0gbnVsbClcclxuICAgICAgICAgICAgaWQgPSAwO1xyXG4gICAgICAgICAgZWxzZSBpZiAodGFzay5nZXRGb3JtKCkuaXNTY3JlZW5Nb2RlKCkpXHJcbiAgICAgICAgICAgIGlkID0gKCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpKS5nZXRJZCgpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBpZCA9ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0UmVjQnlJZHgoKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRUb3BSZWNJZHgoKSkuZ2V0SWQoKTtcclxuXHJcbiAgICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVTY3JlZW5SZWZyZXNoQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgaWQsIGR2LkN1cnJlbnRSZWNJZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyByZWFsIHZpZXcgcmVmcmVzaCBjYXVzZXMgdGhlIGNhY2hlIG9mIHRoZSBjdXJyZW50IHN1YiBmb3JtIHRhc2sgdG8gYmUgY2xlYXJlZFxyXG4gICAgICAgIGlmIChpbnRFdnRDb2RlICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9TQ1JFRU4pXHJcbiAgICAgICAgLy8gc2NyZWVuIHJlZnJlc2ggZG9lcyBub3QgY2xlYXIgdGhlIGNhY2hlXHJcbiAgICAgICAgICB0YXNrLmdldFRhc2tDYWNoZSgpLmNsZWFyQ2FjaGUoKTtcclxuXHJcbiAgICAgICAgaWYgKGNtZCAhPT0gbnVsbClcclxuICAgICAgICAgIGF3YWl0IHRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuXHJcbiAgICAgICAgdGhpcy5faXNJblJlY29yZEZsdXNoRXZlbnQgPSBmYWxzZTtcclxuICAgICAgICAvLyBRQ1IgIzI4OTIyMi4gRG8gbm90IGNvbnRpbnVlIHdpdGggUmVmcmVzaCBpZiB0aGUgdGFzayBtdXN0IGJlIGVuZGVkLlxyXG4gICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmICF0YXNrLkluRW5kVGFzayAmJiAhdGFzay5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgICAgIC8vIEFmdGVyIHZpZXcgcmVmcmVzaCwgdGhlIHNlcnZlciBhbHdheXMgcmV0dXJucyBjdXJyIHJlYyBhcyBmaXJzdCByZWMuXHJcbiAgICAgICAgICBpZiAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVyAmJiAhZm9ybS5pc1NjcmVlbk1vZGUoKSkge1xyXG4gICAgICAgICAgICBkdi5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICAgIGlmIChmb3JtLkhhc1RhYmxlKCkpIHtcclxuICAgICAgICAgICAgICBmb3JtLmNsZWFyVGFibGVDb2x1bW5Tb3J0TWFyayh0cnVlKTtcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLnJlc3RvcmVPbGREaXNwbGF5TGluZShmb3JtLnJlY29yZElkeDJEaXNwbGF5TGluZShkdi5nZXRDdXJyUmVjSWR4KCkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIEFmdGVyIHJlY29yZCBoYXMgYmVlbiBmbHVzaGVkIGl0IGlzIG5vdCBjb25zaWRlcmVkIGEgbmV3IHJlY29yZCBhbnltb3JlLlxyXG4gICAgICAgICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRCAmJiB0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSAmJiAhdGFzay5nZXRBZnRlclJldHJ5KCkpIHtcclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgICAgICAgICAgKCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpKS5zZXRPbGRSZWMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCBkdi5jdXJyUmVjQ29tcHV0ZSh0cnVlKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOICYmIHRhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZICYmICF0YXNrLmdldEFmdGVyUmV0cnkoKSkge1xyXG4gICAgICAgICAgICBhd2FpdCBkdi5jdXJyUmVjQ29tcHV0ZSh0cnVlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBRQ1IgIzQzMDA1OS4gSWYgdGhlIGZvY3VzZWQgdGFzayBhbmQgdGhlIHJlZnJlc2hlZCB0YXNrIGlzIHRoZSBzYW1lIHRhc2sgb3JcclxuICAgICAgICAgIC8vIHRoZSBmb2N1c2VkIHRhc2sgaXMgYSBjaGlsZCBvZiB0aGUgcmVmcmVzaGVkIHRhc2ssIGdvIHRvIHRoZSBmaXJzdCBjb250cm9sIGluIHRoZSBmaXJzdCBsaW5lLlxyXG4gICAgICAgICAgLy8gSWYgdGhlIGZvY3VzZWQgdGFzayBpcyB0aGUgcGFyZW50IHRhc2ssIGRvIG5vdCBsZWF2ZSB0aGUgY3VycmVudCBjb250cm9sLlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgIXRhc2suZ2V0UHJldmVudENvbnRyb2xDaGFuZ2UoKSkge1xyXG4gICAgICAgICAgICBpZiAoISh0YXNrID09PSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkgfHwgIXRhc2sucGF0aENvbnRhaW5zKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSkpKVxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHbyB0byBjcmVhdGUgbW9kZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNtZHNcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgZ290b0NyZWF0ZU1vZGUodGFzazogVGFzayk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQ7XHJcbiAgICBhd2FpdCB0YXNrLmVuYWJsZU1vZGVzKCk7XHJcbiAgICAvLyBRQ1IgIzQxNzczMy4gRXhlY3V0ZSBSUydzIG9mIHRoZSBuZXN0ZWQgc3ViZm9ybXMgaWYgdGhlIGN1cnJlbnQgdGFzayBpcyBvbmUgb2YgdGhlIG5lc3RlZCBzdWJmb3Jtcy5cclxuICAgIGF3YWl0IHRhc2suRXhlY3V0ZU5lc3RlZFJTKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSk7XHJcbiAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgY21kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRXZlbnRDb21tYW5kKHRhc2suZ2V0VGFza1RhZygpLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX0NSRUFURSk7XHJcbiAgICAgIGF3YWl0IHRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyh0YXNrKTtcclxuICAgICAgYXdhaXQgdGFzay5zZXRDcmVhdGVEZWxldGVBY3RzRW5hYmxlU3RhdGUoKTtcclxuICAgICAgdGFzay5zZXRPcmlnaW5hbFRhc2tNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuSGFuZGxlQWN0RW50ZXJSb3dFZGl0aW5nKHRhc2spO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGRvIHNvbWUgZGVmYXVsdCBvcGVyYXRpb25zIGZvciBhbiBldmVudCBhZnRlciBhbGwgdGhlIGhhbmRsZXJzIGZpbmlzaGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJjQmVmb3JlXCI+dGhlIFJDIHJldHVybmVkIGZyb20gdGhlIGNvbW1vbkhhbmRsZXJCZWZvcmU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcG9nYXRlXCI+aWYgZXZlbnQgd2FzIHByb3BvZ2F0ZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiRXZlbnRcIj50aGUgZXZlbnQgdG8gaGFuZGxlPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGNvbW1vbkhhbmRsZXJBZnRlcihldnQ6IFJ1blRpbWVFdmVudCwgcmNCZWZvcmU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+ZXZ0LmdldFRhc2soKTtcclxuICAgIGxldCBkdjogRGF0YVZpZXc7XHJcbiAgICBsZXQgcmVjOiBSZWNvcmQgPSBudWxsO1xyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbDtcclxuICAgIGxldCByZWNNb2RpZmllZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHJlY01vZGVJc0RlbGV0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGZvcmNlU3VmZml4OiBib29sZWFuO1xyXG5cclxuICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uICYmIGV2dC5nZXRJbnRlcm5hbENvZGUoKSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVggJiYgZXZ0LmdldEludGVybmFsQ29kZSgpICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCkge1xyXG4gICAgICBkdiA9IDxEYXRhVmlldz50YXNrLkRhdGFWaWV3O1xyXG4gICAgICByZWMgPSBkdi5nZXRDdXJyUmVjKCk7XHJcbiAgICAgIGN0cmwgPSA8TWdDb250cm9sPmV2dC5Db250cm9sO1xyXG5cclxuICAgICAgc3dpdGNoIChldnQuZ2V0SW50ZXJuYWxDb2RlKCkpIHtcclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYOlxyXG4gICAgICAgICAgaWYgKHJjQmVmb3JlKSB7XHJcbiAgICAgICAgICAgIC8vIGhhbmRsZSByZWNvcmQgcHJlZml4IGZvciB0aGUgc3ViIHRhc2tzIHRvb1xyXG4gICAgICAgICAgICBpZiAoYXdhaXQgdGFzay5DaGVja1JlZnJlc2hTdWJUYXNrcygpKVxyXG4gICAgICAgICAgICAgIGF3YWl0IHRhc2suZG9TdWJmb3JtUmVjUHJlZml4U3VmZml4KCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRhc2suaGFuZGxlRXZlbnRPblNsYXZlVGFza3MoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrLmVuYWJsZU1vZGVzKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWDpcclxuICAgICAgICAgIHRhc2suaXNGaXJzdFJlY29yZEN5Y2xlKGZhbHNlKTtcclxuICAgICAgICAgIC8vIE9uY2UgYXJlIHJlYWR5IHRvIGVuZCB0aGUgUlMsIGl0IG1lYW5zIHdlIGNhbm5vdCBiZSB0aGUgRklSU1QgcmVjb3JkIGN5Y2xlXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRQcmV2ZW50UmVjb3JkU3VmZml4KCkpIHtcclxuICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KGZhbHNlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIFFDUiAjMTE1OTUxLiBFdmVuIGlmIHJlY29yZCBzdWZmaXggaXMgbm90IGV4ZWN1dGVkLCBpbiB0aGUgbmV4dCB0aW1lIGRvIG5vdCBleGVjdXRlIFJQICYgUlMgb2YgdGhlIHN1YmZvcm0uXHJcbiAgICAgICAgICB0YXNrLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICAgIC8vIFFDUiAjOTg0MDMxOiBpZiB0aGUgZGVsZXRlIG9wZXJhdGlvbiBmYWlsZWQgZHVlIHRvIFwidmVyaWZ5IGVycm9yXCJcclxuICAgICAgICAgICAgLy8gaW4gdGhlIHJlY29yZCBzdWZmaXggdGhlbiB0aGUgcmVjb3JkIG1vZGUgbXVzdCBiZSBjbGVhcmVkXHJcbiAgICAgICAgICAgIGlmIChyZWMuZ2V0TW9kZSgpID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlKVxyXG4gICAgICAgICAgICAgIHJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICAgICAgLy8gUWNyIDc4MzAzOSA6IElmIHdlIGFyZSBhbHJlYWR5IGluIGNvbnRyb2wgbGV2ZWwgaXQgbWVhbnMgdGhhdCBjb250cm9sIHByZWZpeCB3YXMgYWxyZWFkeSBkb25lIG9yIHRoYXRcclxuICAgICAgICAgICAgLy8gY29udHJvbCBzdWZmaXggd2FzIG5vdCBkb25lLiBFaXRoZXIgd2F5IHRoZXJlIGlzIG5vIG5lZWQgdG8gZG8gY29udHJvbCBwcmVmaXggYWdhaW4uXHJcbiAgICAgICAgICAgIGlmICh0YXNrLmdldExldmVsKCkgIT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wpIHtcclxuICAgICAgICAgICAgICBsZXQgbGFzdCA9IDxNZ0NvbnRyb2w+dGhpcy5nZXRTdG9wRXhlY3V0aW9uQ3RybCgpO1xyXG4gICAgICAgICAgICAgIGlmIChsYXN0ID09PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgbGFzdCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwobnVsbCk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIFFDUiA0MjYyODMgaXMgd2UgaGF2ZSBhIHN1Yi1mb3JtIHRoYXQgd2FzIG5ldmVyIGJlZW4gZW50ZXJlZFxyXG4gICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBjb250cm9sIGxldmVsIHdpbGwgbm90IGJlIGVudGVyZWRcclxuICAgICAgICAgICAgICBpZiAobGFzdCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBkb25vdCB3YW50IENTIHRvIGJlIGNhbGxlZCBhZ2FpbiBmcm9tIENQIGluY2FzZSBvZiB2ZXJpZnkgZXJyIGluIENWXHJcbiAgICAgICAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1JFQ09SRCk7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGluQ3RybFByZWZpeDogYm9vbGVhbiA9IHRhc2suSW5DdHJsUHJlZml4O1xyXG4gICAgICAgICAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGxhc3QsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCk7XHJcbiAgICAgICAgICAgICAgICB0YXNrLkluQ3RybFByZWZpeCA9IGluQ3RybFByZWZpeDtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIC8vIGluIHRoZSBmdXR1cmUgY2hlY2sgdGhlIHN0b3BFeGVjdXRpb24gZmxhZyBoZXJlIHRvbyBhbmQgZGlzcGxheSBhXHJcbiAgICAgICAgICAgICAgLy8gY29uZmlybSBjYW5jZWwgZGlhbG9nIHRoYXQgd2lsbCBjbG9zZSB0aGUgYnJvd3NlciBpZiB0aGUgdmFsdWUgaXMgdHJ1ZVxyXG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBEZWZlY3QgMTUyODcxOiBXaXRoIG5ldyB3YXkgb2YgZWRpdGluZyByb3csIFJTIGlzIG5vdCBmaXJlZCBpbmZpbml0ZWx5LCBidXQgcm93IHNlbGVjdGlvbiBpcyBzaGlmdGVkIHRvIG5ldyByb3cuIEFsc28gcm93IGxlYXZlcyBlZGl0aW5nIG1vZGUuXHJcbiAgICAgICAgICAgIC8vIFNvIGVuc3VyZSByb3cgZWRpdGluZyBpcyBsZWZ0IHdoZW4gdGhlcmUgaXMgbm8gdmVyaWZ5IGVycm9yIGFuZCBub3QgdW5jb25kaXRpb25hbGx5LlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZVN0b3BSb3dFZGl0aW5nKHRhc2spO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChyZWMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZWNNb2RpZmllZCA9IHJlYy5Nb2RpZmllZDtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9zdG9wRXhlY3V0aW9uICYmIHJlYy5pc0NhdXNlSW52YWxpZGF0aW9uKCkpIHtcclxuICAgICAgICAgICAgICAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuaW52YWxpZGF0ZVRhYmxlKCk7XHJcbiAgICAgICAgICAgICAgcmVjLnNldENhdXNlSW52YWxpZGF0aW9uKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZWNNb2RlSXNEZWxldGUgPSAocmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSk7XHJcblxyXG4gICAgICAgICAgICBmb3JjZVN1ZmZpeCA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAvLyBpZiB0aGUgcmVjb3JkIGlzIGRlbGV0ZWQgdGhlbiBleGVjdXRlIHRoZSBcInJlYyBzdWZmaXggYWZ0ZXJcIiBvbmx5XHJcbiAgICAgICAgICAgIC8vIHdoZW4gdGhlIHRhc2sgbW9kZSBpcyBkZWxldGUgKHNlY29uZCByb3VuZClcclxuICAgICAgICAgICAgLy8gaW5EZWxldGVQcm9jZXNzIDogaWYgdGhlcmUgaXMgYW4gJ0VORCBUQVNLIENPTkQnIHdlIHdpbGwgaGF2ZSBhIDNyZCBjeWNsZSBpbiByZWNvcmQgc3VmZml4KHdoZW4gdXBkK2RlbCBvciBmb3JjZSBzdWZmICsgZGVsKS5cclxuICAgICAgICAgICAgLy8gMXN0IGN5Y2xlIDogdXBkYWUgY3ljbGUgKHRhc2sgbW9kZSB3aWxsIGJlIHVwZGF0ZSksIDJuZCA6IHRhc2sgbW9kZSBpcyBkZWxldGUgLCB0aGlzIGlzIHdoZW4gd2Ugc2VuZCB0aGUgZGVsZXRlIHRvIHRoZSBzZXJ2ZXIuXHJcbiAgICAgICAgICAgIC8vIDNyZCAtIHN1ZmZpeCB0aGF0IGlzIGNhbGxlZCBmcm9tIHRoZSBlbmRUYXNrLiBJbiB0aGUgM3JkIGN5Y2xlIHRoZSByZWNNb2RlSXNEZWxldGUgd2lsbCBiZSBmYWxzZSBhbHRob3VnaCB3ZSBhcmUgc3RpbGwgaW4gdGhlIGRlbGV0ZSBwcm9jZXNzICh3ZSBhbHJlYWR5IHNlbnQgdGhlIGRlbGV0ZSBvcGVyKS5cclxuICAgICAgICAgICAgLy8gQSBjb21iaW5hdGlvbiBvZiBmb3JjZSBzdWZmaXggKyBlbmQgdGFzayBjb25kICsgZGVsIGxpbmUgLCB3aWxsIGNyYXNoIHRoZSBzZXJ2ZXIgb24gdGhlIDNyZCBjeWNsZSBzaW5jZSB3ZSB3aWxsIGFzayBmb3IgdXBkYXRlIG9mZlxyXG4gICAgICAgICAgICAvLyBhIHJlY29yZCB0aGF0IHRoZSBzZXJ2ZXIgaGFkIGRlbGV0ZWQgb24gdGhlIDJuZCBjeWNsZS4gVGhhdCBpdCB3aHkgd2UgdXNlICdpbkRlbGV0ZVByb2Nlc3MnLCBzbyB3aWxsIHdpbGwga25vdyBub3RcclxuICAgICAgICAgICAgLy8gdG8gYWRkIHVwZGF0ZSBvcGVyIG9uIGFuIGFscmVhZHkgZGVsZXRlZCByZWNvcmQuIChRY3IgIzc5MDI4MykuXHJcbiAgICAgICAgICAgIC8vICogdGhlcmUgaXMgc3RpbGwgYSBwcm9ibGVtIGluICd1cGRhdGUnIGFuZCAnaW5zZXJ0JyB3aXRoICdlbmQgdGFzayBjb25kJyArICdmb3JjZScgOiBhbiBleHRyYSB1cGRhdGUgd2lsbCBiZSBzZW5kXHJcbiAgICAgICAgICAgIC8vICAgdG8gdGhlIHNlcnZlciBvbiB0aGUgcmVjIHN1ZmZpeCBvZiB0aGUgZW5kIHRhc2suIGJ1dCBhcGFydCBmcm9tIHNlcnZlciB1cGRhdGUgaXQgY2F1c2VzIG5vIHJlYWwgcHJvYmxlbS5cclxuICAgICAgICAgICAgaWYgKHJlY01vZGVJc0RlbGV0ZSAmJiB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUgfHxcclxuICAgICAgICAgICAgICAhcmVjTW9kZUlzRGVsZXRlICYmICFyZWMuaW5EZWxldGVQcm9jZXNzKCkgJiYgKHJlY01vZGlmaWVkIHx8IGZvcmNlU3VmZml4KSkge1xyXG4gICAgICAgICAgICAgIHJlYy5zZXRNb2RlKERhdGFNb2RpZmljYXRpb25UeXBlcy5VcGRhdGUpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IGR2LmFkZEN1cnJUb01vZGlmaWVkKCk7XHJcbiAgICAgICAgICAgICAgZHYuc2V0Q2hhbmdlZCh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHJlY01vZGlmaWVkICYmIHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVjLnJlYWxNb2RpZmllZCgpICYmXHJcbiAgICAgICAgICAgICAgICAgICFFbnZpcm9ubWVudC5JbnN0YW5jZS5hbGxvd1VwZGF0ZUluUXVlcnlNb2RlKHRhc2suZ2V0Q29tcElkeCgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAvLyBpZiByZWFsIGZpZWxkcyB3ZXJlIG1vZGlmaWVkXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGR2LmNhbmNlbEVkaXQoRXZlbnRzTWFuYWdlci5SRUFMX09OTFksIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgdGFzay5Xcml0ZVRvTWVzc2FnZVBhbmVieU1zZ0lkKE1zZ0ludGVyZmFjZS5SVF9TVFJfVVBEQVRFX0lOX1FVRVJZKTtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gd2UgbXVzdCBjb250aW51ZSBoZXJlIGFuZCB0cnkgdG8gY29tbWl0IHRoZSB0cmFuc2FjdGlvbiBiZWNhdXNlXHJcbiAgICAgICAgICAgICAgICAvLyB0aGVyZSBtaWdodCBiZSBhbHNvIHNvbWUgc3ViIHRhc2tzIHRvIHRoaXMgdGFza1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gUUNSIzc3NjI5NTogZm9yIHByZSByZWNvcmQgdXBkYXRlLCBjb21taXQgdGhlIHJlY29yZCBhZnRlciBoYW5kbGVyJ3MgZXhlY3V0aW9uLlxyXG4gICAgICAgICAgICAvLyBGaXhlZCBidWcgIzozMDY5MjksIEZvcmNlRXhpdFByZSBpcyByZWxldmFudCBvbmx5IGZvciB0aGUgdGFzayB0aGF0IHJhaXNlZCB0aGUgZXZlbnRcclxuICAgICAgICAgICAgLy8gc2VlIGFsc28gYnVnIzoyOTI4NzZcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzRm9yY2VFeGl0UHJlUmVjb3JkVXBkYXRlKHRhc2spICYmXHJcbiAgICAgICAgICAgICAgLy8gRGVmZWN0IDE1NDA0NyA6IGRvIG5vdCB0cnkgYW5kIGNvbW1pdCBpZiB0YXNrIGlzIGFib3J0aW5nIGFuZCB3YXMgYWxyZWFkeSByZW1vdmVkIChvciBhbGwgTUdEIHdhcyByZW1vdmVkKS5cclxuICAgICAgICAgICAgICAoIXRhc2suaXNBYm9ydGluZygpIHx8IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuR2V0VGFza0J5SUQodGFzay5nZXRUYXNrVGFnKCkpICE9IG51bGwpKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCghcmVjTW9kZUlzRGVsZXRlIHx8IHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSkpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvbW1pdFJlY29yZCh0YXNrLCBldnQucmV2ZXJzaWJsZUV4aXQoKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGFzay50cmFuc2FjdGlvbkZhaWxlZChDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSAmJiAhdGFzay5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRvIGV2YWx1YXRlIHRoZSBlbmQgY29uZGl0aW9uIGFmdGVyIHRoZSByZWNvcmQgc3VmZml4XHJcbiAgICAgICAgICAgICAgLy8gaW4gY2FzZSB0aGVyZSBhcmUgMiBjeWNsZXMgKHVwZGF0ZS9mb3JjZSBzdWZmaXggKyBkZWxldGUpLCBkbyB0aGUgZW5kIHRhc2sgb25seSBpbiB0aGUgMm5kIGN5Y2xlLlxyXG4gICAgICAgICAgICAgIGlmICgocmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSAmJlxyXG4gICAgICAgICAgICAgICAgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFKSB8fFxyXG4gICAgICAgICAgICAgICAgcmVjLmdldE1vZGUoKSAhPT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSlcclxuICAgICAgICAgICAgICAgIGlmIChhd2FpdCB0YXNrLmV2YWxFbmRDb25kKENvbnN0SW50ZXJmYWNlLkVORF9DT05EX0VWQUxfQUZURVIpKVxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSAvLyByZWMgIT0gbnVsbFxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYOlxyXG4gICAgICAgICAgaWYgKHJjQmVmb3JlKSB7XHJcbiAgICAgICAgICAgIC8vIGNoZWNrIHBhcmthYmlsaXR5IG9uY2UgYWdhaW4gYXMgcHJvcGVydHkgbWlnaHQgaGF2ZSBjaGFuZ2VkIGluIHRoZSBoYW5kbGVyXHJcbiAgICAgICAgICAgIC8vIDkyNDExMiAtIGlnbm9yZSBkaXJlY3Rpb24gKGlmIGZsYWcgc2V0KSBhcyB3ZSBhcmUgZm9yY2luZyBwYXJrIGluc3BpdGUgb2YgZmFpbGVkIGRpcmVjdGlvblxyXG4gICAgICAgICAgICAvLyBRQ1IjIDgwNjAxNTogSWYgd2UgaGF2ZSBhIHNpbmdsZSBmaWVsZCB3aXRoIGFsbG93IHBhcmtpbmcgPSBZZXMgYW5kIFRhYiBJbnRvID0gTm8sIHRoZW4gb24gcHJlc3NpbmcgdGFiIGlmIGN1cnNvciBpcyBub3RcclxuICAgICAgICAgICAgLy8gbW92ZWQsIHdlIGNvbWUgdG8gcGFyayBvbiBsYXN0UGFya2VkQ3RybCAod2hpY2ggaXMgc2FtZSBhcyBjdHJsKSBzaW5jZSBUYWJJbnRvIGlzIG5vdCBhbGxvd2VkLlxyXG4gICAgICAgICAgICAvLyBTbyB0byBhdmFvaWQgaW5maW5pdGUgcmVjdXJzaW9uLCB3ZSBzaG91bGQgbm90IGFnYWluIHRyeSB0byBwYXJrIG9uIGl0LlxyXG4gICAgICAgICAgICBpZiAoYXdhaXQgY3RybC5Jc1BhcmthYmxlKCkgfHwgY3RybCA9PT0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICAgICAgLy8gc2V0IEluQ29udHJvbCB0cnVlIGFmdGVyIENvbnRyb2wgUHJlZml4XHJcbiAgICAgICAgICAgICAgY3RybC5JbkNvbnRyb2wgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoY3RybC5TaG91bGRSZWZyZXNoT25Db250cm9sRW50ZXIoKSlcclxuICAgICAgICAgICAgICAgIGF3YWl0ICg8RmllbGQ+Y3RybC5nZXRGaWVsZCgpKS51cGRhdGVEaXNwbGF5KCk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIGlmIHRoaXMgY29kZSBpcyByZWFjaGVkIHRoZW4gZXZlcnl0aGluZyBpcyBvayBpbiB0aGUgY29udHJvbCBwcmVmaXhcclxuICAgICAgICAgICAgICAvLyB1c2VyIGhhbmRsZXIuIE5vdywgbW92ZSB0aGUgZm9jdXMgdG8gdGhlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgdGFzay5zZXRMYXN0UGFya2VkQ3RybChjdHJsKTtcclxuICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHBhcmtlZCBvbiBhIGN0cmwgc2V0IGNsaWNrZWQgY3RybCB0byBudWxsXHJcbiAgICAgICAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkN1cnJlbnRDbGlja2VkQ3RybCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgIC8vIHRvIHRha2UgY2FyZSBvZiB0ZW1wb3JhcnkgZWRpdG9yXHJcbiAgICAgICAgICAgICAgLy8gTWFuYWdlci5zZXRGb2N1cyhjdHJsLCBjdHJsLmdldERpc3BsYXlMaW5lKGZhbHNlKSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgY3RybC5TZXRGb2N1cyhjdHJsLCBjdHJsLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBzdWNjZXNzZnVsbHkgcGFya2VkIG9uIGEgY3RybCwgc2V0IHNldHN0b3BleGVjdXRpb25DdHJsIHRvIG51bGxcclxuICAgICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25DdHJsKG51bGwpO1xyXG5cclxuICAgICAgICAgICAgICBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsID0gY3RybDtcclxuICAgICAgICAgICAgICB0YXNrLkluQ3RybFByZWZpeCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVg6XHJcbiAgICAgICAgICAvLyBkaXNhYmxlIGFjdGlvbnMgYW5kIHN0YXRlcy4gZG8gaXQgb25seSBpZiB3ZSBhcmUgZ2V0dGluZyBvdXQgb2YgdGhlIGNvbnRyb2wuXHJcbiAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG5cclxuICAgICAgICAgICAgaWYgKGN0cmwuaXNDaG9pY2VDb250cm9sKCkpIHtcclxuICAgICAgICAgICAgICBjdHJsLlNldEtleWJvYXJkTGFuZ3VhZ2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04pXHJcbiAgICAgICAgICAgICAgdGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQlVUVE9OLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGFzay5nZXRFbmFibGVab29tSGFuZGxlcigpIHx8IGN0cmwudXNlWm9vbUhhbmRsZXIoKSlcclxuICAgICAgICAgICAgICB0YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX0VEVF9OVUxMLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChyY0JlZm9yZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgICAgICAgLy8gSWYgY29udHJvbCBzdWZmaXggZ2V0ICdzdG9wIGV4ZWN1dGlvbicgKGUuZy4gdmVyaWZ5IGVycm9yKSwgdGhlIGZvY3VzIHdpbGwgYmUgcmVtYWluIG9uIGN1cnJlbnQgY29udHJvbC5cclxuICAgICAgICAgICAgICAvLyBTbyBzZXQgSW5Db250cm9sIHRvIHRydWVcclxuICAgICAgICAgICAgICBjdHJsLkluQ29udHJvbCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgLy8gVXBkYXRlIGZpZWxkcyB0aGF0IGFyZSBhc3NpZ25lZCB0byBhIHRleHQgY29udHJvbCBhbmQgd2l0aCB0eXBlIHRoYXQgaGFzIGRlZmF1bHQgZGlzcGxheVxyXG4gICAgICAgICAgICAvLyB2YWx1ZSAobnVtZXJpYywgZGF0ZSwgdGltZSwgbG9naWNhbCBldGMpXHJcbiAgICAgICAgICAgIGxldCBmbGQ6IEZpZWxkID0gPEZpZWxkPmN0cmwuZ2V0RmllbGQoKTtcclxuICAgICAgICAgICAgaWYgKGZsZCAhPSBudWxsICYmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RFWFQpKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGZsZC51cGRhdGVEaXNwbGF5KCk7XHJcblxyXG4gICAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1JFQ09SRCk7XHJcbiAgICAgICAgICAgIGN0cmwuc2V0SW5Db250cm9sU3VmZml4KGZhbHNlKTtcclxuICAgICAgICAgICAgY3RybC5Jc0ludGVyYWN0aXZlVXBkYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmIChjdHJsLlByb3BlcnR5RXhpc3RzKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9WQUxJREFUT1JTKSlcclxuICAgICAgICAgICAgICBhd2FpdCBjdHJsLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ1VTVE9NX1ZBTElEQVRPUlMpLlJlZnJlc2hEaXNwbGF5KHRydWUpO1xyXG4gICAgICAgICAgICBjdHJsLlZhbGlkYXRlQ29udHJvbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIExhc3RGb2N1c2VkTWFuYWdlci5zZXRMYXN0Rm9jdXNlZENvbnRyb2wodGFzaywgbnVsbCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYXdhaXQgdGFzay5ldmFsRW5kQ29uZChDb25zdEludGVyZmFjZS5FTkRfQ09ORF9FVkFMX0lNTUlESUFURSkpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVg6XHJcbiAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYOlxyXG4gICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9OT05FKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAvLyBzaW11bGF0ZXMgdXNlciBhc2tpbmcgZm9yIHRoZSBuZXh0IHJlYy5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DWUNMRV9ORVhUX1JFQzpcclxuICAgICAgICAgIGxldCBmb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgICAgICAgIGlmICghdGFzay5pc01haW5Qcm9nKCkgJiYgZm9ybSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhmb3JtLmlzTGluZU1vZGUoKVxyXG4gICAgICAgICAgICAgID8gQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1dcclxuICAgICAgICAgICAgICA6IENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSxcclxuICAgICAgICAgICAgICBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fTkVYVCk7XHJcbiAgICAgICAgICAgIC8vIGVuZCBvZiBkYXRhIHdpbGwgc2lnbmFsIHVzIHRvIGVuZCB0aGUgdGFzayAodW5sZXNzIGluIGNyZWF0ZSBtb2RlKS5cclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0RXhlY0VuZFRhc2soKSlcclxuICAgICAgICAgICAgICBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAvLyBkZWxldGUgcmVjb3JkIGluIG5vbiBpbnRlcmFjdGl2ZSB0YXNrXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1lDTEVfTkVYVF9ERUxFVEVfUkVDOlxyXG4gICAgICAgICAgLy8gY2hlY2sgZW1wdHkgZGF0YXZpZXcgYmVmb3JlIHRyeWluZyB0byBkZWxldGUsIGluIGNhc2UgdGFzayBzdGFydGVkIHdpdGggZW1wdHkgZGF0YXZpZXcuXHJcbiAgICAgICAgICBpZiAodGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSlcclxuICAgICAgICAgICAgKHRhc2spLnNldEV4ZWNFbmRUYXNrKCk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlQWN0aW9uRGVsbGluZSggdGFzaywgZHYsIHJlYywgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgLy8gZW5kIG9mIGRhdGEgd2lsbCBzaWduYWwgdXMgdG8gZW5kIHRoZSB0YXNrICh1bmxlc3MgaW4gY3JlYXRlIG1vZGUpLlxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0RXhlY0VuZFRhc2soKSlcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VUX0VYVEVSTkFMX1ZBTFVFOlxyXG4gICAgICAgICAgbGV0IHJlZnJlc2hEaXNwbGF5IDogYm9vbGVhbiA9IGF3YWl0IGV2dC5nZXRBcmdMaXN0KCkuZ2V0QXJnVmFsdWUoMSwgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOLCAwKSA9PT0gJzEnID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgICAgYXdhaXQgKDxNZ0NvbnRyb2w+Y3RybCkudmFsaWRhdGVBbmRTZXRWYWx1ZUlmQWxsb3dlZChldnQuZ2V0VmFsdWUoKSwgcmVmcmVzaERpc3BsYXkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY3JlYXRlcyBhIG5vbiByZXZlcnNpYmxlIGV2ZW50IGFuZCBoYW5kbGUgaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPmEgcmVmZXJlbmNlIHRvIHRoZSB0YXNrIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldmVudENvZGVcIj50aGUgY29kZSBvZiB0aGUgZXZlbnQgPC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVOb25SZXZlcnNpYmxlRXZlbnQodGFzazogVGFza0Jhc2UsIGV2ZW50Q29kZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzayk7XHJcbiAgICBsZXQgZXhpdENvbW1hbmQ6IGJvb2xlYW4gPSAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCB8fCBldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DTE9TRSk7XHJcblxyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoZXZlbnRDb2RlKTtcclxuXHJcbiAgICBpZiAoZXhpdENvbW1hbmQpXHJcbiAgICAgIHRoaXMuX2lzTm9uUmV2ZXJzaWJsZUV4aXQgPSB0cnVlO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHJ0RXZ0LnNldE5vblJldmVyc2libGVFeGl0KCk7XHJcbiAgICAgIHJ0RXZ0LnNldEN0cmwoPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCkpO1xyXG4gICAgICBydEV2dC5zZXRBcmdMaXN0KG51bGwpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICBpZiAoZXhpdENvbW1hbmQpXHJcbiAgICAgICAgdGhpcy5faXNOb25SZXZlcnNpYmxlRXhpdCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNyZWF0ZXMgYSBuZXcgaW50ZXJuYWwgRXZlbnQgYW5kIGhhbmRsZSBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+YSByZWZlcmVuY2UgdG8gdGhlIHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZlbnRDb2RlXCI+dGhlIGNvZGUgb2YgdGhlIGV2ZW50PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzUXVpdFwiPmluZGljYXRlcyB3aGV0aGVyIE1HX0FDVF9DQU5DRUwgaXMgY2FsbGVkIGZyb20gTUdfQUNUX1JUX1FVSVQ8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZEV2ZW50U3VidHlwZSh0YXNrOiBUYXNrQmFzZSwgZXZlbnRDb2RlOiBudW1iZXIsIGV2ZW50U3ViVHlwZTogRXZlbnRTdWJUeXBlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbGFzdFBhcmtlZEN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQ7XHJcblxyXG4gICAgaWYgKGV2ZW50Q29kZSA8IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UT1RfQ05UICYmIHRhc2sgIT0gbnVsbCAmJiAhKGV2ZW50U3ViVHlwZSA9PT0gRXZlbnRTdWJUeXBlLkNhbmNlbElzUXVpdCkgJiYgIXRhc2suQWN0aW9uTWFuYWdlci5pc0VuYWJsZWQoZXZlbnRDb2RlKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmIChsYXN0UGFya2VkQ3RybCAhPT0gbnVsbClcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbChsYXN0UGFya2VkQ3RybCwgZXZlbnRDb2RlLCBldmVudFN1YlR5cGUpO1xyXG5cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUVVJVClcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZEV2ZW50U3VidHlwZSh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMLCBFdmVudFN1YlR5cGUuQ2FuY2VsSXNRdWl0KTtcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KHRhc2spO1xyXG4gICAgICAgIHJ0RXZ0LnNldEludGVybmFsKGV2ZW50Q29kZSk7XHJcbiAgICAgICAgcnRFdnQuU2V0RXZlbnRTdWJUeXBlKGV2ZW50U3ViVHlwZSk7XHJcbiAgICAgICAgaWYgKEludGVybmFsSW50ZXJmYWNlLkJ1aWx0aW5FdmVudChldmVudENvZGUpKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGF3YWl0IHRoaXMuY29tbW9uSGFuZGxlcihydEV2dCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjcmVhdGVzIGEgbmV3IGludGVybmFsIEV2ZW50IGFuZCBoYW5kbGUgaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmEgcmVmZXJlbmNlIHRvIHRoZSBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2ZW50Q29kZVwiPnRoZSBjb2RlIG9mIHRoZSBldmVudDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc1F1aXRcIj5pbmRpY2F0ZXMgd2hldGhlciBNR19BQ1RfQ0FOQ0VMIGlzIGNhbGxlZCBmcm9tIE1HX0FDVF9SVF9RVUlUPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sKGN0cmw6IE1nQ29udHJvbCwgZXZlbnRDb2RlOiBudW1iZXIsIGV2ZW50U3ViVHlwZTogRXZlbnRTdWJUeXBlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudDtcclxuXHJcbiAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUVVJVClcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbChjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMLCBFdmVudFN1YlR5cGUuQ2FuY2VsSXNRdWl0KTtcclxuICAgIGVsc2Uge1xyXG4gICAgICBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCk7XHJcbiAgICAgIHJ0RXZ0LnNldEludGVybmFsKGV2ZW50Q29kZSk7XHJcbiAgICAgIHJ0RXZ0LlNldEV2ZW50U3ViVHlwZShldmVudFN1YlR5cGUpOyAvLyAodXNlIGZvciBhY3RfY2FuY2VsICYgYWN0X3J0X3ZpZXdfcmVmcmVzaFxyXG4gICAgICAvLyBiYXNpY2FsbHkgTUdfQUNUX1ZJRVdfUkVGUkVTSCByZXByZXNlbnQgdGhlIHZpZXcgcmVmcmVzaCBldmVudCByYWlzZWQgYnkgdGhlIHVzZXJcclxuICAgICAgLy8gaG93ZXZlciB3ZSB1c2UgaW50ZXJuYWxseSBpbiB0aGUgY29kZSB0byByZWZyZXNoIHRoZSBkaXNwbGF5IChtYWlubHkgaW4gc3ViIGZvcm1zIHJlZnJlc2hlcylcclxuICAgICAgLy8gaW4gb3JkZXIgdGhlIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIHJlYWwgdXNlIGFuZCB0aGUgaW50ZXJuYWwgdXNlIHdlIHNldCB0aGlzIGZsYWcgdG8gZmFsc2VcclxuICAgICAgLy8gd2UgbmVlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSB0d28gc2luY2Ugd2UgbWFrZSBkaWZmZXJlbnQgYWN0aW9ucyB3aGVuIGNhY2hpbmcgYSBzdWJmb3JtXHJcbiAgICAgIGlmIChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcpXHJcbiAgICAgICAgcnRFdnQuc2V0SXNSZWFsUmVmcmVzaChmYWxzZSk7XHJcblxyXG4gICAgICBpZiAoSW50ZXJuYWxJbnRlcmZhY2UuQnVpbHRpbkV2ZW50KGV2ZW50Q29kZSkpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb21tb25IYW5kbGVyKHJ0RXZ0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjdXJyZW50IGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDdXJyRmllbGQoKTogRmllbGQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJGaWVsZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGN1cnJlbnQgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q3VyckN0cmwoKTogTWdDb250cm9sIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyQ3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjdXJyZW50IHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEN1cnJUYXNrKCk6IFRhc2sge1xyXG4gICAgaWYgKHRoaXMuX2N1cnJGaWVsZCA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiA8VGFzaz50aGlzLl9jdXJyRmllbGQuZ2V0VGFzaygpO1xyXG4gIH1cclxuXHJcbiAgc2V0U3RvcEV4ZWN1dGlvbihzdG9wOiBib29sZWFuKTogdm9pZDtcclxuICBzZXRTdG9wRXhlY3V0aW9uKHN0b3A6IGJvb2xlYW4sIGNsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uIDogQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24pOiB2b2lkIDtcclxuICBzZXRTdG9wRXhlY3V0aW9uKHN0b3A6IGJvb2xlYW4sIGNsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uPyA6IENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uKTogdm9pZCB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSlcclxuICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uXzAoc3RvcCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbl8xKHN0b3AsIGNsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIFwic3RvcCBleGVjdXRpb25cIiBmbGFnIHRvIHRydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc2V0U3RvcEV4ZWN1dGlvbl8wKHN0b3A6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihzdG9wLCBDbGVhckV2ZW50c09uU3RvcEV4ZWN1dGlvbi5BTEwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgXCJzdG9wIGV4ZWN1dGlvblwiIGZsYWcgdG8gdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRTdG9wRXhlY3V0aW9uXzEoc3RvcDogYm9vbGVhbiwgY2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb246IENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uKTogdm9pZCB7XHJcbiAgICBpZiAoc3RvcClcclxuICAgICAgaWYgKGNsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uID09IENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uLkFMTClcclxuICAgICAgICB0aGlzLl9ldmVudHNRdWV1ZS5jbGVhcigpO1xyXG4gICAgICBlbHNlIGlmKGNsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uID09IENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uLlNFUlZFUikge1xyXG4gICAgICAgIGxldCB0bXBWZWMgPSBuZXcgTGlzdDxSdW5UaW1lRXZlbnQ+KCk7XHJcbiAgICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQ7XHJcbiAgICAgICAgbGV0IGk6IG51bWJlcjtcclxuXHJcbiAgICAgICAgLy8gV2Ugd2VyZSByZXF1ZXN0ZWQgdG8gbGVhdmUgdGhlIFwic2VydmVyIGV2ZW50c1wiIGluIHRoZSBxdWV1ZS5cclxuICAgICAgICAvLyBEbyBpdCwgYnV0IGFsc28gcmVtb3ZlIHRoZSBcInByb3RlY3Rpb25cIiBmcm9tIHRoZXNlIGV2ZW50cyBzbyBuZXh0XHJcbiAgICAgICAgLy8gdGltZSB3ZSBuZWVkIHRvIGNsZWFyIHRoZSBxdWV1ZSB0aGV5IHdpbGwgYWxzbyBiZSBkZWxldGVkLlxyXG4gICAgICAgIHdoaWxlICghdGhpcy5fZXZlbnRzUXVldWUuaXNFbXB0eSgpKSB7XHJcbiAgICAgICAgICBydEV2dCA9IDxSdW5UaW1lRXZlbnQ+dGhpcy5fZXZlbnRzUXVldWUucG9sbCgpO1xyXG4gICAgICAgICAgaWYgKHJ0RXZ0LmlzRnJvbVNlcnZlcigpKSB7XHJcbiAgICAgICAgICAgIHJ0RXZ0LnJlc2V0RnJvbVNlcnZlcigpO1xyXG4gICAgICAgICAgICB0bXBWZWMucHVzaChydEV2dCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG1wVmVjLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgdGhpcy5fZXZlbnRzUXVldWUucHV0KHRtcFZlYy5nZXRfSXRlbShpKSk7XHJcbiAgICAgIH1cclxuICAgIHRoaXMuX3N0b3BFeGVjdXRpb24gPSBzdG9wO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgY3RybCBvbiB3aGljaCB3ZSBoYWQgYSBcInN0b3AgZXhlY3V0aW9uXCJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFN0b3BFeGVjdXRpb25DdHJsKGN0cmw6IE1nQ29udHJvbCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb25DdHJsID09PSBudWxsIHx8IGN0cmwgPT09IG51bGwpXHJcbiAgICAgIHRoaXMuX3N0b3BFeGVjdXRpb25DdHJsID0gY3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkZWxldGUgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj50aGUgdGFzayB0byByZWZlciB0byA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW5Gb3JjZURlbFwiPnRydWUgaWYgdGhlIGRlbGV0ZSBpcyBkb25lIGJlY2F1c2Ugb2YgZm9yY2UgZGVsZXRlIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBkZWxDdXJyUmVjKHRhc2s6IFRhc2ssIGluRm9yY2VEZWw6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuXHJcbiAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG5cclxuICAgIC8vIGRlbGV0ZSB0aGUgcmVjb3JkIGFuZCBydW4gcmVjb3JkIHN1ZmZpeCBmb3IgdGhlIG5ldyBjdXJyZW50IHJlY29yZFxyXG4gICAgYXdhaXQgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLmRlbEN1cnJSZWMoKTtcclxuXHJcbiAgICAvLyBubyBjdXJyLXJlYyA9PT4gd2UgZGVsZXRlZCB0aGUgbGFzdCByZWNvcmQgYW5kIGZhaWxlZCB0byBjcmVhdGUgYSBuZXcgb25lIChlLmcuXHJcbiAgICAvLyBDUkVBVEUgbW9kZSBpcyBub3QgYWxsb3dlZCkgPT0+IGVuZCB0aGUgdGFzay4gQW4gZXhjZXB0aW9uIHRvIHRoZSBydWxlIGlzIHdoZW5cclxuICAgIC8vIHdlIGFyZSBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGEgcmVjb3JkLlxyXG4gICAgaWYgKCF0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKSB7XHJcbiAgICAgIGlmIChkdi5nZXRDdXJyUmVjSWR4KCkgPj0gMCkge1xyXG4gICAgICAgIC8vIFFDUiAjNjU2NDk1OiBJZiB3ZSBnb3QgdG8gdGhpcyBwb2ludCBhbmQgdGhlIGN1cnJlbnQgcmVjb3JkIGlzIHN0aWxsIHRoZVxyXG4gICAgICAgIC8vIGRlbGV0ZWQgb25lIHRoZW4gdGhlIHJlY29yZCBwcmVmaXggd2lsbCBiZSBoYW5kbGVkIGVsc2V3aGVyZS5cclxuICAgICAgICBpZiAoKGR2LmdldEN1cnJSZWMoKSkuZ2V0TW9kZSgpICE9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlICYmICFpbkZvcmNlRGVsKSB7XHJcbiAgICAgICAgICBsZXQgY3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgICAgaWYgKGN0cmwgPT09IG51bGwpXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHRhc2spO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoIXRhc2suZ2V0SW5DcmVhdGVMaW5lKCkpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVOb25SZXZlcnNpYmxlRXZlbnQodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHRhc2spO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHByb2Nlc3MgdXNlcnMgY29uZmlybWF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj50byBjaGVjayBjb25maXJtIHVwZGF0ZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIC0gcHJvY2VzcyBjb21tYW5kLCBmYWxzZSAtIHN0b3AgY29tbWFuZCBwcm9jZXNzaW5nPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlQ29uZmlybWVkKHRhc2s6IFRhc2spOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBjb25maXJtOiBib29sZWFuO1xyXG4gICAgbGV0IGFuc3dlcjogc3RyaW5nO1xyXG4gICAgbGV0IGFuczogbnVtYmVyO1xyXG5cclxuICAgIGlmICh0YXNrID09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjb25maXJtID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09ORklSTV9VUERBVEUsIGZhbHNlKTtcclxuICAgIGlmICghdGhpcy5faXNJblJlY29yZEZsdXNoRXZlbnQgJiYgY29uZmlybSAmJiAhdGFzay5EYXRhU3luY2VkKSB7XHJcbiAgICAgIGFucyA9IGF3YWl0IEdVSU1hbmFnZXIuSW5zdGFuY2UuY29uZmlybShNc2dJbnRlcmZhY2UuQ1JGX1NUUl9DT05GX1VQRCxcclxuICAgICAgICBTdHlsZXMuTVNHQk9YX0lDT05fUVVFU1RJT04gfCBTdHlsZXMuTVNHQk9YX0JVVFRPTl9ZRVNfTk9fQ0FOQ0VMKTtcclxuICAgICAgaWYgKGFucyA9PT0gU3R5bGVzLk1TR0JPWF9SRVNVTFRfWUVTKVxyXG4gICAgICAgIGFuc3dlciA9ICdZJztcclxuICAgICAgLy8gWWVzXHJcbiAgICAgIGVsc2UgaWYgKGFucyA9PT0gU3R5bGVzLk1TR0JPWF9SRVNVTFRfTk8pXHJcbiAgICAgICAgYW5zd2VyID0gJ04nO1xyXG4gICAgICAvLyBOb1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgYW5zd2VyID0gJ0MnOyAvLyBDYW5jZWxcclxuICAgIH0gZWxzZVxyXG4gICAgICBhbnN3ZXIgPSAnWSc7XHJcblxyXG4gICAgc3dpdGNoIChhbnN3ZXIpIHtcclxuICAgICAgY2FzZSAnWSc6XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdOJzpcclxuICAgICAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuY2FuY2VsRWRpdChmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgIGF3YWl0ICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICB0YXNrLkNvbmZpcm1VcGRhdGVObyA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBub3QgY29udGludWUgcmVjb3JkIHN1ZmZpeFxyXG5cclxuICAgICAgY2FzZSAnQyc6XHJcbiAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwoTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpKTtcclxuICAgICAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMoTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpLCAtMSk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBzdG9wIGV2ZW50IHByb2Nlc3NpbmdcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKCdpbiBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLnVwZGF0ZUNvbmZpcm1lZCgpIGlsbGVnYWwgY29uZmlybWF0aW9uIGNvZGU6ICcgK1xyXG4gICAgICAgICAgY29uZmlybSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBTZXQgdGhlIG9yZGVyIG9mIGhhbmRsaW5nIG1haW4gcHJvZ3JhbXMgb2YgY29tcG9uZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0Q29tcE1haW5QcmdUYWIoY29tcE1haW5QcmdUYWJsZTogQ29tcE1haW5QcmdUYWJsZSk6IHZvaWQge1xyXG4gICAgdGhpcy5fY29tcE1haW5QcmdUYWIgPSBjb21wTWFpblByZ1RhYmxlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBlbmQgb2Ygd29yayBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRFbmRPZldvcmsoZW5kT2ZXb3JrXzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fZW5kT2ZXb3JrID0gZW5kT2ZXb3JrXztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgZW5kIG9mIHdvcmsgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RW5kT2ZXb3JrKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuZE9mV29yaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIG9yZGVyIG9mIGhhbmRsaW5nIG1haW4gcHJvZ3JhbXMgb2YgY29tcG9uZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q29tcE1haW5QcmdUYWIoKTogQ29tcE1haW5QcmdUYWJsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29tcE1haW5QcmdUYWI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSByZXZlcnNpYmxlIGV4aXQgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaW5Ob25SZXZlcnNpYmxlRXhpdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc05vblJldmVyc2libGVFeGl0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHB1c2ggYSBydW50aW1lIGV2ZW50IHRvIHRoZSBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBydW50aW1lIGV2ZW50IHRvIHB1c2ggb24gdGhlIHN0YWNrPC9wYXJhbT5cclxuICBwdXNoUnRFdmVudChydEV2dDogUnVuVGltZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLl9ydEV2ZW50cy5wdXNoKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwb3AgYSBydW50aW1lIGV2ZW50IGZyb20gdGhlIHN0YWNrIGFuZCByZXR1cm4gaXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHBvcFJ0RXZlbnQoKTogUnVuVGltZUV2ZW50IHtcclxuICAgIGlmICh0aGlzLl9ydEV2ZW50cy5jb3VudCgpID09PSAwKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiA8UnVuVGltZUV2ZW50PnRoaXMuX3J0RXZlbnRzLnBvcCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHN0b3JlIHRoZSBsYXN0IHNhdmVkIHJvdXRlIGV2ZW50IG9uIGxvY2FsIHN0b3JhZ2UuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdG9yZUxhc3RTYXZlZFJvdXRlRXZlbnRPbkxvY2FsU3RvcmFnZSgpOiB2b2lkXHJcbiAge1xyXG4gICAgbGV0IGRhdGFTdG9yYWdlID0gd2luZG93LmxvY2FsU3RvcmFnZTtcclxuICAgIGlmICh0aGlzLmdldExhc3RTYXZlZFJvdXRlRXZlbnQoKSAhPSBudWxsKVxyXG4gICAge1xyXG4gICAgICBsZXQgcnRFdnQgPSB0aGlzLmdldExhc3RTYXZlZFJvdXRlRXZlbnQoKTtcclxuXHJcbiAgICAgIGRhdGFTdG9yYWdlLnNldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVCwgJzEnKTtcclxuICAgICAgZGF0YVN0b3JhZ2Uuc2V0SXRlbShDb25zdEludGVyZmFjZS5MQVNUX1JPVVRFX0VWRU5UX1NSQ19UU0ssIEpTT04uc3RyaW5naWZ5KCg8VGFzaz5ydEV2dC5nZXRUYXNrKCkpLlRhc2tEZWZpbml0aW9uSWQpKTtcclxuXHJcbiAgICAgIGlmIChydEV2dC5nZXRBcmdMaXN0KCkuZ2V0U2l6ZSgpID4gMCkge1xyXG4gICAgICAgIGxldCBzdHI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgICAgIHJ0RXZ0LmdldEFyZ0xpc3QoKS5idWlsZFhNTChzdHIpO1xyXG4gICAgICAgIGRhdGFTdG9yYWdlLnNldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVF9BUkdfTElTVCwgIHN0ci50b1N0cmluZygpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc3RvcmUgdGhlIGxhc3Qgc2F2ZWQgcm91dGUgZXZlbnQgZnJvbSBsb2NhbCBzdG9yYWdlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzdG9yZUxhc3RTYXZlZFJvdXRlRXZlbnRGcm9tTG9jYWxTdG9yYWdlKCk6IHZvaWRcclxuICB7XHJcbiAgICAvL2dldCByb3V0ZSBldmVudCBpZiBzdG9yZWQgb24gbG9jYWwgc3RvcmFnZVxyXG4gICAgbGV0IGRhdGFTdG9yYWdlID0gd2luZG93LmxvY2FsU3RvcmFnZTtcclxuXHJcbiAgICBsZXQgbGFzdFJvdXRlRXZlbnQgPSBkYXRhU3RvcmFnZS5nZXRJdGVtKENvbnN0SW50ZXJmYWNlLkxBU1RfUk9VVEVfRVZFTlQpO1xyXG5cclxuICAgIGlmIChsYXN0Um91dGVFdmVudCA9PT0gJzEnKSB7XHJcbiAgICAgIGxldCBzcmNUYXNrRGVmaW5pdGlvblN0ciA9IGRhdGFTdG9yYWdlLmdldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVF9TUkNfVFNLKTtcclxuICAgICAgbGV0IHJvdXRlQXJnTGlzdFN0ciA9IGRhdGFTdG9yYWdlLmdldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVF9BUkdfTElTVCk7XHJcblxyXG4gICAgICAvLyBwYXJzZSBzcmNUYXNrRGVmaW5pdGlvblN0ciBhbmQgcHJlcGFyZSB0YXNrRGVmaW5pdGlvbklkXHJcbiAgICAgIGxldCB0YXNrRGVmaW5pdGlvbklkID0gbmV3IFRhc2tEZWZpbml0aW9uSWQoKTtcclxuICAgICAgdGFza0RlZmluaXRpb25JZC5mcm9tSlNPTihzcmNUYXNrRGVmaW5pdGlvblN0cik7XHJcblxyXG4gICAgICAvL3NlYXJjaCBzb3VyY2UgdGFzayBpbiBuZXdseSBsb2FkZWQgdGFzayB0cmVlIGJ5IHRhc2tEZWZpbml0aW9uSWRcclxuICAgICAgbGV0IHNyY1Rhc2sgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldEN1cnJNR0RhdGEoKS5nZXRUYXNrQnlUYXNrRGVmaW5pdGlvbklEKHRhc2tEZWZpbml0aW9uSWQpO1xyXG4gICAgICBsZXQgYXJncyA9IG51bGw7XHJcbiAgICAgIGlmIChyb3V0ZUFyZ0xpc3RTdHIgIT0gbnVsbCkge1xyXG4gICAgICAgIGFyZ3MgPSBuZXcgQXJndW1lbnRzTGlzdCgpO1xyXG4gICAgICAgIGFyZ3MuZmlsbExpc3Qocm91dGVBcmdMaXN0U3RyLCBzcmNUYXNrKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgRXZlbnRzTWFuYWdlci5JbnN0YW5jZS5BZGRMYXN0U2F2ZWRSb3V0ZUV2ZW50KHNyY1Rhc2ssIGFyZ3MpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgbGFzdCBzYXZlZCByb3V0ZSBldmVudC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldExhc3RTYXZlZFJvdXRlRXZlbnQoKTogUnVuVGltZUV2ZW50IHtcclxuICAgICAgcmV0dXJuIHRoaXMubGFzdFNhdmVkUm91dGVFdmVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gIHNhdmUgdGhlIGxhc3Qgcm91dGUgZXZlbnQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRMYXN0U2F2ZWRSb3V0ZUV2ZW50IChydEV2dDpSdW5UaW1lRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChydEV2dCA9PSBudWxsKVxyXG4gICAgICB0aGlzLmxhc3RTYXZlZFJvdXRlRXZlbnQgPSBudWxsO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmxhc3RTYXZlZFJvdXRlRXZlbnQgPSBydEV2dC5yZXBsaWNhdGUoKTtcclxuICB9XHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgcnVudGltZSBldmVudCBsb2NhdGVkIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRMYXN0UnRFdmVudCgpOiBSdW5UaW1lRXZlbnQge1xyXG4gICAgaWYgKHRoaXMuX3J0RXZlbnRzLmNvdW50KCkgPT09IDApXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgcmV0dXJuIDxSdW5UaW1lRXZlbnQ+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+cGFyZW50VGFzay5EYXRhVmlldztcclxuICAgIGxldCBwYXJlbnRSZWM6IFJlY29yZCA9IHBhcmVudER2LmdldEN1cnJSZWMoKTtcclxuXHJcbiAgICAvLyBkbyBub3QgdG91Y2ggdGhlIHBhcmVudCByZWNvcmQgaWYgdGhlIHBhcmVudCBkYXRhdmlldyBpcyAnZW1wdHkgZGF0YXZpZXcnLlxyXG4gICAgaWYgKHRhc2suSXNTdWJGb3JtICYmIHBhcmVudFJlYyAhPSBudWxsICYmIHBhcmVudFJlYy5Nb2RpZmllZCAmJiAhcGFyZW50RHYuaXNFbXB0eURhdGF2aWV3KCkpIHtcclxuICAgICAgcGFyZW50UmVjLnNldE1vZGUoRGF0YU1vZGlmaWNhdGlvblR5cGVzLlVwZGF0ZSk7XHJcbiAgICAgIGF3YWl0IHBhcmVudER2LmFkZEN1cnJUb01vZGlmaWVkKGZhbHNlKTtcclxuICAgICAgKChwYXJlbnREdi5nZXRDdXJyUmVjKCkpKS5TeW5jZWQgPSB0cnVlO1xyXG4gICAgICBwYXJlbnREdi5zZXRDaGFuZ2VkKHRydWUpO1xyXG4gICAgICBsZXQgZGF0YVZpZXdFeGVjdXRlTG9jYWxVcGRhdGVzQ29tbWFuZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVEYXRhVmlld0NvbW1hbmQocGFyZW50VGFzay5nZXRUYXNrVGFnKCksIERhdGFWaWV3Q29tbWFuZFR5cGUuRXhlY3V0ZUxvY2FsVXBkYXRlcyk7XHJcbiAgICAgIGF3YWl0IHBhcmVudFRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdFeGVjdXRlTG9jYWxVcGRhdGVzQ29tbWFuZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBQcm9jZXNzQWJvcnRpbmdFcnJvcihleDogQXBwbGljYXRpb25FeGNlcHRpb24pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBlTXNnOiBzdHJpbmc7XHJcbiAgICBsZXQgZXJyRm9yQ29uc29sZTogc3RyaW5nO1xyXG4gICAgbGV0IGVyckZvck1zZ0JveDogc3RyaW5nO1xyXG5cclxuICAgIGlmIChleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKVxyXG4gICAgICBlTXNnID0gKDxTZXJ2ZXJFcnJvcj5leCkuR2V0TWVzc2FnZSgpO1xyXG4gICAgZWxzZVxyXG4gICAgICBlTXNnID0gKChleC5NZXNzYWdlICE9PSBudWxsKSA/IGV4Lk1lc3NhZ2UgOiBleC5HZXRUeXBlKCkpO1xyXG5cclxuICAgIGVyckZvckNvbnNvbGUgPSBTdHJVdGlsLmdldENvbnNvbGVFcm9yU3RyaW5nKGVNc2cpO1xyXG4gICAgZXJyRm9yTXNnQm94ID0gU3RyVXRpbC5nZXRNc2dCb3hFcm9yU3RyaW5nKGVNc2cpO1xyXG5cclxuICAgIGlmIChleC5Jbm5lckV4Y2VwdGlvbiAhPT0gbnVsbClcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2coZXguSW5uZXJFeGNlcHRpb24sIGVyckZvckNvbnNvbGUpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpIHx8IExvZ2dlci5JbnN0YW5jZS5Mb2dMZXZlbCAhPT0gTG9nZ2VyX0xvZ0xldmVscy5CYXNpYykge1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhlcnJGb3JDb25zb2xlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE8gOiBoYW5kbGUgZXJyb3JzXHJcbiAgICBsZXQgc2VuZFVubG9hZFRvU2VydmVyOiBib29sZWFuID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkNvbnRleHRJRCAhPT0gUnVudGltZUNvbnRleHRCYXNlLm5vQ29udGV4dElkOyAgLy8gdW5sb2FkIHRoZSBjb250ZXh0IGluIHRoZSBzZXJ2ZXIgb25seSBpZiBhIGNvbnRleHQgd2FzIGNyZWF0ZWQgZHVyaW5nIHRoZSBjdXJyZW50IHNlc3Npb25cclxuXHJcbiAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9IDA7XHJcblxyXG4gICAgbGV0IG1lc3NhZ2VTdHJpbmc6IHN0cmluZyA9IExhbmd1YWdlRGF0YS5JbnN0YW5jZS5nZXRDb25zdE1lc3NhZ2UoTXNnSW50ZXJmYWNlLkJSS1RBQl9TVFJfRVJST1IpO1xyXG5cclxuICAgIGxldCBzdHlsZTogbnVtYmVyID0gMTY7XHJcbiAgICBpZiAoZXguTWVzc2FnZS5zdGFydHNXaXRoKCc8SFRNTCcpKSB7XHJcbiAgICAgIHRoaXMucHJvY2Vzc0hUTUxDb250ZW50KGV4Lk1lc3NhZ2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gVE9ETzogdGVtcG9yYXJpbHkgc2hvdyB0aGUgbWVzc2FnZSBib3hcclxuICAgICAgLy8gaWRlYWxseSwgdGhlIGN1cnJlbnQgcGFnZSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCB0aGUgZXJyb3IgcGFnZVxyXG4gICAgICBpZiAodGhpcy5TaG93RXJyb3JJbk1lc3NhZ2VCb3goZXgpKSB7XHJcbiAgICAgICAgYXdhaXQgR1VJTWFuYWdlci5JbnN0YW5jZS5NZXNzYWdlQm94KG1lc3NhZ2VTdHJpbmcsIGVyckZvck1zZ0JveCwgc3R5bGUpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKXtcclxuICAgICAgICBpZigoPFNlcnZlckVycm9yPmV4KS5HZXRDb2RlKCkgPT0gU2VydmVyRXJyb3IuRVJSX1dFQkNMSUVOVF9QUk9HUkFNX1JFTE9BREVEIHx8XHJcbiAgICAgICAgICAgKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09IFNlcnZlckVycm9yLkVSUl9FWEVDVVRFRF9QUk9HUkFNX0NIQU5HRUQpIHtcclxuICAgICAgICAgICBDb21tYW5kcy5hZGRHbG9iYWxDb21tYW5kKENvbW1hbmRUeXBlLlJFTE9BRF9QQUdFKTtcclxuICAgICAgICAgICAvLyBNdXN0IGNhbGwgYmVnaW5JbnZva2UgaGVyZTsgaW4gdGhlIGNhc2UgYSBuZXcgY29ubmVjdGlvbiB3YXMgcmVmdXNlZCwgdGhlIGJlZ2luSW52b2tlIGlzIG5ldmVyIGNhbGxlZCwgc28gd2VcclxuICAgICAgICAgICAvLyBuZWVkIHRvIG1ha2Ugc3VyZSBpdCBpcyBjYWxsZWQgaGVyZVxyXG4gICAgICAgICAgIENvbW1hbmRzLmJlZ2luSW52b2tlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETzogSG93IHRvIGNoZWNrIGlmIGl0IHdhcyBDb25uZWN0RmFpbHVyZSBvciBQcm90b2NvbEVycm9yP1xyXG4gICAgLy8gSW4gY2FzZSBpZiB3ZSBhcmUgYWJsZSB0byBjb25uZWN0IHRvIHRoZSBzZXJ2ZXIgaS5lLiBzdGF0dXMgaXMgQ29ubmVjdGlvbkZhaWx1cmVcclxuICAgIC8vIHRoZW4gdGhlcmUgaXMgbm8gcG9pbnQgaW4gc2VuZGluZyB1bmxvYWQgY29tbWFuZCwgYmVjYXVzZSBpdCB3aWxsIG5ldmVyIHN1Y2NlZWQgYW5kXHJcbiAgICAvLyB3ZSB3aWxsIGluIGluZmluaXRlIGxvb3AuXHJcbiAgICAvLyBsZXQgZmxhZzg6IGJvb2xlYW4gPSBleC5Jbm5lckV4Y2VwdGlvbiAhPT0gbnVsbCAmJiBleC5Jbm5lckV4Y2VwdGlvbi5HZXRUeXBlKCkuRnVsbE5hbWUgPT09IFwiU3lzdGVtLk5ldC5XZWJFeGNlcHRpb25cIjtcclxuICAgIC8vIGlmIChmbGFnOCkge1xyXG4gICAgLy8gICBsZXQgZXgyOiBXZWJFeGNlcHRpb24gPSA8V2ViRXhjZXB0aW9uPmV4LklubmVyRXhjZXB0aW9uO1xyXG4gICAgLy8gICBsZXQgZmxhZzk6IGJvb2xlYW4gPSBleDIuU3RhdHVzID09PSBXZWJFeGNlcHRpb25TdGF0dXMuQ29ubmVjdEZhaWx1cmUgfHwgZXgyLlN0YXR1cyA9PT0gV2ViRXhjZXB0aW9uU3RhdHVzLlByb3RvY29sRXJyb3I7XHJcbiAgICAvLyAgIGlmIChmbGFnOSkge1xyXG4gICAgLy8gICAgIHNlbmRVbmxvYWRUb1NlcnZlciA9IGZhbHNlO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgaWYgKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpIHtcclxuICAgICAgLy8gSWYgdGhlIGNvbnRleHQgd2FzIG5vdCBmb3VuZCwgb3IgdGhlIHByb2dyYW0gaXMgcmVsb2FkZWQgYnkgdGhlIHNlcnZlciwgbm8gcG9pbnQgaW4gdHJ5aW5nIHRvIHVubG9hZCBpdFxyXG4gICAgICBpZiAoKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09PSBTZXJ2ZXJFcnJvci5FUlJfQ1RYX05PVF9GT1VORCB8fFxyXG4gICAgICAgICAgKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09PSBTZXJ2ZXJFcnJvci5FUlJfV0VCQ0xJRU5UX1BST0dSQU1fUkVMT0FERUQgfHxcclxuICAgICAgICAgICg8U2VydmVyRXJyb3I+ZXgpLkdldENvZGUoKSA9PT0gU2VydmVyRXJyb3IuRVJSX0VYRUNVVEVEX1BST0dSQU1fQ0hBTkdFRCkge1xyXG4gICAgICAgIHNlbmRVbmxvYWRUb1NlcnZlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNlbmRVbmxvYWRUb1NlcnZlcikge1xyXG4gICAgICAvLyB0ZWxsIHRoZSBzZXJ2ZXIgdG8gY2xvc2UgdGhlIHJ1bnRpbWUuXHJcbiAgICAgIC8vIElmIHdlIHRlcm1pbmF0ZSBSVEUgYW5kIHRoZW4gY2xvc2UgUkMgd2luZG93IHRoZW4gYWxzbyB3ZSB3aWxsIGJlXHJcbiAgICAgIC8vIFByb2Nlc3NpbmcgQWJvcnQgZXJyb3IgaW4gdGhhdCBjYXNlIHNlcnZlciBpcyBhbHJlYWR5IGNsb3NlZCBzbyBjYXRjaCB0aGUgZXhjZXB0aW9uLlxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlVW5sb2FkQ29tbWFuZCgpO1xyXG4gICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TUdEYXRhKDApLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICBhd2FpdCBDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXIuR2V0Q29tbWFuZHNQcm9jZXNzb3IoKS5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuICAgICAgfSBjYXRjaCAoZXgzKSB7XHJcbiAgICAgICAgaWYgKGV4MyBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZyhleDMpO1xyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgdGhyb3cgZXgzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgR1VJTWFuYWdlci5JbnN0YW5jZS5hYm9ydCgpO1xyXG4gIH1cclxuXHJcblxyXG4gIHByb2Nlc3NIVE1MQ29udGVudChodG1sQ29udGVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBDb21tYW5kcy5hZGRTaG93SFRNTEVycm9yKENvbW1hbmRUeXBlLlNIT1dfSFRNTF9FUlJPUiwgaHRtbENvbnRlbnQpO1xyXG4gICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuICB9XHJcblxyXG4gIC8vIFRoaXMgbWV0aG9kIGRlY2lkZXMgaWYgdGhlIGVycm9yIGhhbmRsZWQgaW4gUHJvY2Vzc0Fib3J0aW5nRXJyb3Igd2lsbCBvcGVuIGEgbWVzc2FnZSBib3hcclxuICBTaG93RXJyb3JJbk1lc3NhZ2VCb3goZXg6IEFwcGxpY2F0aW9uRXhjZXB0aW9uKTogYm9vbGVhbiB7XHJcbiAgICBpZighKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAvLyBpZiBjaGFuZ2VzIGluIHRoZSBzdHVkaW8gY2F1c2UgYSByZWxvYWQsIHNob3cgdGhlIG1lc3NhZ2Vib3ggb25seSBpZiB0aGUgdXNlciB0cmllZCB0b1xyXG4gICAgLy8gY29udGludWUgd29ya2luZyB3aXRoIGFuIG9sZCBjb250ZXh0XHJcbiAgICBpZigoKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09IFNlcnZlckVycm9yLkVSUl9FWEVDVVRFRF9QUk9HUkFNX0NIQU5HRUQgfHxcclxuICAgICAgICg8U2VydmVyRXJyb3I+ZXgpLkdldENvZGUoKSA9PSBTZXJ2ZXJFcnJvci5FUlJfV0VCQ0xJRU5UX1BST0dSQU1fUkVMT0FERUQpICYmXHJcbiAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkNvbnRleHRJRCA9PT0gUnVudGltZUNvbnRleHRCYXNlLm5vQ29udGV4dElkKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG59XHJcbiJdfQ==
2967
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRzTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VuZ2luZS9zcmMvZXZlbnQvRXZlbnRzTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxFQUNOLGdCQUFnQixFQUNoQixhQUFhLEVBQ2IsSUFBSSxFQUNKLFlBQVksRUFDWixRQUFRLEVBQ1IsT0FBTyxFQUNQLGdCQUFnQixFQUNoQixPQUFPLEVBQ1AsV0FBVyxFQUNaLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFDLG9CQUFvQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzNJLE9BQU8sRUFDTCxRQUFRLEVBQ1IsV0FBVyxFQUNYLHFCQUFxQixFQUNyQixNQUFNLEVBQ04sWUFBWSxFQUNaLFlBQVksRUFDWixjQUFjLEVBRWQsWUFBWSxFQUVaLE9BQU8sRUFHUCxTQUFTLEVBQ1QsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN0QyxPQUFPLEVBQUMsaUNBQWlDLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUNsRyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFHeEUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRzVDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNuQyxPQUFPLEVBQUMsd0JBQXdCLEVBQVcsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXZDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xGLE9BQU8sRUFBd0Isd0NBQXdDLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUV6RyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFFekUsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFFckUsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0saURBQWlELENBQUM7QUFDckYsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDMUUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXBELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBSTVELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUMvRSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBQyxpQkFBaUIsRUFBaUIsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFL0MsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHN0QsSUFBSyxVQUdKO0FBSEQsV0FBSyxVQUFVO0lBQ2Isd0JBQVUsQ0FBQTtJQUNWLHlCQUFXLENBQUE7QUFDYixDQUFDLEVBSEksVUFBVSxLQUFWLFVBQVUsUUFHZDtBQUtELE1BQU0sT0FBTyxhQUFhO0lBdUR4QjtRQWxEUSxpQkFBWSxHQUE0QixJQUFJLENBQUM7UUFDN0MsZUFBVSxHQUEwQixJQUFJLENBQUM7UUFDekMsY0FBUyxHQUF3QixJQUFJLENBQUM7UUFDdEMscUJBQWdCLEdBQTBCLElBQUksQ0FBQztRQUMvQyxpQkFBWSxHQUFzQixpQkFBaUIsQ0FBQyxHQUFHLENBQUM7UUFDeEQsb0JBQWUsR0FBcUIsSUFBSSxDQUFDO1FBQ3pDLGNBQVMsR0FBYyxJQUFJLENBQUM7UUFDNUIsZUFBVSxHQUFVLElBQUksQ0FBQztRQUN6QixpQkFBWSxHQUFpQixJQUFJLENBQUM7UUFDbEMsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixnQkFBVyxHQUFlLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDMUMsZUFBVSxHQUFjLFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFDdkMsbUJBQWMsR0FBUyxJQUFJLENBQUM7UUFDNUIsd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBQ3JDLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLHlCQUFvQixHQUFZLEtBQUssQ0FBQztRQUN0Qyx5QkFBb0IsR0FBWSxLQUFLLENBQUM7UUFDdEMsMEJBQXFCLEdBQVksS0FBSyxDQUFDO1FBSXZDLHdCQUFtQixHQUFpQixJQUFJLENBQUM7UUFJekMsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMsOEJBQXlCLEdBQVksS0FBSyxDQUFDO1FBQzNDLHVCQUFrQixHQUFjLElBQUksQ0FBQztRQUV0QyxvQkFBZSxHQUFRLElBQUksQ0FBQztRQUUxQixhQUFRLEdBQWlCLElBQUksQ0FBQztRQUM5QixXQUFNLEdBQWlCLElBQUksQ0FBQztRQUc1QiwwQkFBcUIsR0FBVyxzR0FBc0csQ0FBQztRQUN2SSw0QkFBdUIsR0FBVyxvQ0FBb0MsQ0FBQztRQUl4RSw4QkFBeUIsR0FBa0IsSUFBSSxDQUFDO1FBRWhELG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBRXhDLG1CQUFjLEdBQW9CLElBQUksT0FBTyxFQUFFLENBQUM7UUFPOUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBRTdCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBRWxELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFFM0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUdqQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksWUFBWSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7SUFFL0UsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELGtCQUFrQixDQUFDLFFBQWE7UUFDOUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUM7SUFDbEMsQ0FBQztJQU1ELFNBQVMsQ0FBQyxLQUFtQjtRQUczQixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ3hCLElBQUksYUFBYSxDQUFDLHVCQUF1QixFQUFFO2dCQUN6QyxhQUFhLENBQUMsbUNBQW1DLEdBQUcsSUFBSSxDQUFDO2FBQzFEO1NBQ0Y7YUFBTTtZQUdMLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFLElBQUksSUFBSSxFQUFFO2dCQUN6QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNuQztTQUNGO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQWVELGdCQUFnQixDQUFDLE1BQWtCLEVBQUUsU0FBd0IsRUFBRSxRQUFtQixFQUFFLE9BQWUsRUFBRSxLQUFhLEVBQUUsR0FBVyxFQUFFLElBQVksRUFBRSxTQUFrQixFQUFFLGNBQXNCLEVBQUUsSUFBWTtRQUNyTSxJQUFJLEtBQUssR0FBaUIsQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFZLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFPLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV0SixLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXhCLElBQUksU0FBUyxHQUFpQixJQUFJLFlBQVksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFbEUsSUFBSSxTQUFTLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFDbEUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVyRCxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWpDLElBQUksSUFBSSxLQUFLLGlCQUFpQixDQUFDLG1CQUFtQixFQUFFO1lBQ2xELEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN0Qzs7WUFDQyxLQUFLLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRWpDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsT0FBTztJQUNULENBQUM7SUFNRCxLQUFLLENBQUMsZ0JBQWdCO1FBQ3BCLElBQUksT0FBTyxHQUFjLGtCQUFrQixDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFVcEUsSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssU0FBUyxDQUFDLGtCQUFrQixJQUFJLENBQUMsTUFBTSxPQUFPLENBQUMsVUFBVSxFQUFFO1lBQzlILE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxLQUFLLENBQUMsNEJBQTRCLENBQUMsS0FBWTtRQUM3QyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBTUQsS0FBSyxDQUFDLHlCQUF5QixDQUFDLEtBQVk7UUFDMUMsSUFBSSxJQUFJLEdBQWUsS0FBSyxDQUFDO1FBRTdCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3ZFLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3pCLElBQUksT0FBTyxHQUFXLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ2pELE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ2xGLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRTtnQkFDaEMsSUFBSSxPQUFPLEtBQUssU0FBUyxDQUFDLGdCQUFnQixFQUFFO29CQUMxQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUN0QixNQUFpQixJQUFJLENBQUMsUUFBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDckQsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7b0JBQ2xGLE1BQWUsSUFBSSxDQUFDLE9BQU8sRUFBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsQ0FBQztvQkFDL0UsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM3QixNQUFNLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDbEQsT0FBTztpQkFDUjthQUNGO1NBSUY7UUFHRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxTQUFTLENBQUMsa0JBQWtCO1lBQ2xELE1BQU0sSUFBSSxDQUFDLG9DQUFvQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFbEgsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLFNBQVMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQzlCLE1BQU0sWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFPRCxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQW1CLEVBQUUsa0JBQTJCO1FBQ2hFLElBQUksT0FBTyxHQUFpQixJQUFJLENBQUM7UUFDakMsSUFBSSxHQUFHLEdBQXlCLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUMzRCxJQUFJLElBQUksR0FBZSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdkMsSUFBSSxJQUFJLEdBQXlCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzFELElBQUksYUFBYSxHQUFZLEtBQUssQ0FBQztRQUNuQyxJQUFJLFlBQVksR0FBWSxLQUFLLENBQUM7UUFDbEMsSUFBSSxRQUFRLEdBQWlCLElBQUksQ0FBQztRQUNsQyxJQUFJLFlBQVksR0FBYyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEQsSUFBSSxnQkFBZ0IsR0FBUyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNyRCxJQUFJLHNCQUFzQixHQUFZLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztRQUNoRSxJQUFJLGtCQUFrQixHQUFZLEtBQUssQ0FBQztRQUN4QyxJQUFJLGVBQTBCLENBQUM7UUFDL0IsSUFBSSxnQkFBZ0IsR0FBVSxJQUFJLENBQUM7UUFJbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUU1RCxJQUFJLEtBQUssQ0FBQyxhQUFhLEdBQUcsaUJBQWlCLENBQUMsY0FBYyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztnQkFDcEssT0FBTztTQUNWO2FBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ2hELE9BQU87UUFFVCxlQUFlLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUV0QixJQUFJLFNBQVMsR0FBWSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssY0FBYyxDQUFDLG1CQUFtQixJQUFJLEtBQUssQ0FBQyxlQUFlLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFFbEgsSUFBSTtZQUVGLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFeEIsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFJckMsSUFBSSxTQUFTLEdBQVksTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFL0QsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFVLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUU3QyxJQUFJLFNBQVMsRUFBRTtnQkFDYixHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUVoQixPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUV4QixJQUFJLE9BQU8sS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxLQUFLLElBQUk7b0JBQ3hGLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBSWhFLE9BQU8sT0FBTyxLQUFLLElBQUksRUFBRTtvQkFDdkIsSUFBSSxrQkFBa0IsR0FBUyxJQUFJLENBQUM7b0JBQ3BDLElBQUksWUFBcUIsQ0FBQztvQkFDMUIsSUFBSTt3QkFDRixJQUFJLHdCQUF3QixHQUFZLEtBQUssQ0FBQzt3QkFHOUMsa0JBQWtCLEdBQVMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDO3dCQUM5RCxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsbUJBQW1CLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFLEtBQUssaUJBQWlCLENBQUMsZUFBZTs0QkFDNUosT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQzs7NEJBRXBELE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7d0JBR3BELElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxlQUFlLElBQUksTUFBTSxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUU7NEJBQ2hHLHdCQUF3QixHQUFHLElBQUksQ0FBQzs0QkFDaEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQzs0QkFDbEMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDOzRCQUUxQixJQUFJLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRTtnQ0FDL0QsYUFBYSxHQUFHLElBQUksQ0FBQzs2QkFDdEI7eUJBQ0Y7d0JBSUQsSUFBSSxLQUFLLEtBQUssT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFOzRCQUtoQyxRQUFRLEdBQUcsS0FBSyxDQUFDOzRCQUNqQixLQUFLLEdBQUcsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDOzRCQUNwRCxZQUFZLEdBQUcsSUFBSSxDQUFDOzRCQUlwQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7NEJBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7eUJBQ3pCOzs0QkFDQyxZQUFZLEdBQUcsS0FBSyxDQUFDO3dCQUV2QixJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsbUJBQW1CLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxLQUFLLGlCQUFpQixDQUFDLGlCQUFpQjs0QkFDM0gsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUUxQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ2pDLElBQUksY0FBYyxHQUFZLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsd0JBQXdCLENBQUMsQ0FBQzt3QkFDekcsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssY0FBYyxDQUFDLG1CQUFtQixJQUFJLEtBQUssQ0FBQyxlQUFlLEVBQUUsS0FBSyxpQkFBaUIsQ0FBQyxpQkFBaUI7NEJBQzNILEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDM0MsU0FBUyxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUM7d0JBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxJQUFJLFlBQVksRUFBRTs0QkFDM0MsS0FBSyxHQUFHLFFBQVEsQ0FBQzs0QkFDakIsUUFBUSxHQUFHLElBQUksQ0FBQzs0QkFDaEIsWUFBWSxHQUFHLEtBQUssQ0FBQzs0QkFHckIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDOzRCQUNsQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO3lCQUN6Qjt3QkFVRCxJQUFJLEtBQUssQ0FBQyxlQUFlLEVBQUUsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFOzRCQUNqSCxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7NEJBQ3RELElBQUksWUFBWTtnQ0FDZCxNQUFNO3lCQUNUO3dCQUVELElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUU7NEJBQy9CLElBQUksTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDO2dDQUN2QyxNQUFNO3lCQUNUO3FCQUNGOzRCQUFTO3dCQUVSLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsQ0FBQztxQkFDdEQ7b0JBRUQsSUFBSSxDQUFDLFNBQVM7d0JBQ1osTUFBTTtvQkFFUixJQUFJLFlBQVk7d0JBQ2QsT0FBTyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7O3dCQUc3QixPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUMxQixJQUFJLE9BQU8sS0FBSyxJQUFJO3dCQUNsQixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsb0JBQW9CLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7aUJBQ2pJO2dCQUNELElBQUksU0FBUyxJQUFJLENBQUMsWUFBWTtvQkFDNUIsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ25DO1lBQ0QsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDakIsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQ2pEO1lBQ0QsSUFBSSxhQUFhLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO2dCQUM5QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO2dCQUNsQyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN4QztZQUNELElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFDbEQsSUFBSSxrQkFBa0I7Z0JBQ3BCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxzQkFBc0IsQ0FBQztTQUN0RDtnQkFBUztZQUNSLElBQUksQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxVQUFVLEdBQUcsZ0JBQWdCLENBQUM7WUFDbkMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBRW5CO1FBR0QsVUFBVSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFZTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBbUIsRUFBRSxHQUFRLEVBQUUsSUFBWSxFQUFFLFlBQXFCO1FBQ2hHLElBQUksU0FBUyxHQUF5QixJQUFJLENBQUM7UUFDM0MsSUFBSSxRQUFRLEdBQWUsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3pELElBQUksZUFBZSxHQUFZLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQWMxRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGdCQUFnQixFQUFFO1lBQ3JELElBQUksTUFBTSxHQUFpQixJQUFJLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN2RCxJQUFJLE9BQU8sR0FBcUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDNUcsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssY0FBYyxDQUFDLG1CQUFtQixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsS0FBSyxpQkFBaUIsQ0FBQyxhQUFhLElBQUksTUFBTSxDQUFDLGFBQWEsS0FBSyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsRUFBRTtnQkFDdEwsSUFBSSxPQUFPLEtBQUssT0FBTyxDQUFDLFdBQVc7b0JBQ2pDLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDOUQsZUFBZSxHQUFHLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDN0MsUUFBUSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ25DO1lBRUQsSUFBSSxPQUFPLEtBQUssT0FBTyxDQUFDLFdBQVc7Z0JBQ2pDLFNBQVMsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztTQUM1RTtRQUdELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRXRELFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUU3QyxJQUFJLElBQUksQ0FBQyxjQUFjO1lBQ3JCLE9BQU87UUFPVCxJQUFJLGlCQUFpQixHQUFZLE1BQU0sU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzlELElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxJQUFJLGlCQUFpQixDQUFDLEVBQUU7WUFLN0csSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUMzRSxJQUFJLFdBQVcsR0FBZSxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzVELElBQUksV0FBVyxDQUFDLFNBQVMsRUFBRTtvQkFDekIsUUFBUSxHQUFHLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUU1RCxJQUFJLFdBQVcsS0FBSyxRQUFRLElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRTt3QkFFbEUsSUFBSSxXQUFXLENBQUMsUUFBUSxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWUsRUFBRTs0QkFDeEQsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsV0FBVyxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7eUJBQzFGO3dCQUNELE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLFdBQVcsQ0FBQyxDQUFDO3FCQUNuRDtpQkFDRjthQUNGO1lBSUQsSUFBSSxLQUFLLEdBQWlCLElBQUksWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RELGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUM7WUFDM0QsS0FBSyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNyRCxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLElBQUksSUFBSSxDQUFDLGNBQWM7Z0JBQ3JCLE9BQU87U0FDVjtRQUdELElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZ0JBQWdCO1lBRW5ELE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRW5ELElBQUksSUFBSSxDQUFDLGNBQWM7WUFDckIsT0FBTztRQUVULE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFLRCxLQUFLLENBQUMsMkJBQTJCLENBQUMsS0FBWSxFQUFFLFNBQWlCO1FBQy9ELE1BQU0sSUFBSSxDQUFDLDRDQUE0QyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQVFELEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxLQUFZLEVBQUUsU0FBaUIsRUFBRSxjQUF1QjtRQUN6RyxJQUFJLElBQUksR0FBZSxLQUFLLENBQUM7UUFPN0IsSUFBSSxTQUFTLEtBQUssaUJBQWlCLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLHdCQUF3QixDQUFDLFVBQVUsRUFFdkk7WUFDRSxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ2pIO1FBR0QsSUFBSSxjQUFjO1lBQ2hCLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBRWpHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsRUFBRTtZQUNuQyxJQUFJLFNBQVMsS0FBSyxpQkFBaUIsQ0FBQyxpQkFBaUIsSUFBSSxTQUFTLEtBQUssaUJBQWlCLENBQUMsaUJBQWlCLEVBQUU7Z0JBQzFHLElBQUksU0FBUyxLQUFLLGlCQUFpQixDQUFDLGlCQUFpQjtvQkFDbkQsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7O29CQUU3QyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFFNUIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxFQUFFO29CQUMzQixJQUFJLFNBQVMsS0FBSyxpQkFBaUIsQ0FBQyxpQkFBaUI7d0JBQ25ELE1BQWUsSUFBSSxDQUFDLE9BQU8sRUFBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsQ0FBQztvQkFDakYsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO2lCQUM1QjthQUNGOztnQkFDQyxNQUFNLElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMvRjs7WUFDQyxNQUFNLElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBT0QsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLElBQW1CLEVBQUUsU0FBaUI7UUFDL0UsTUFBTSxJQUFJLENBQUMsZ0NBQWdDLENBQVksSUFBSSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUtELG9CQUFvQjtRQUNsQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUtPLG9CQUFvQjtRQUMxQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBT0QsSUFBSTtRQUNGLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztZQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3pCO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQU9ELGdDQUFnQyxDQUFDLEtBQVksRUFBRSxJQUFZO1FBQ3pELElBQUksQ0FBQyxpREFBaUQsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQU9ELCtCQUErQixDQUFDLElBQW1CLEVBQUUsSUFBWTtRQUMvRCxJQUFJLEtBQUssR0FBaUIsSUFBSSxZQUFZLENBQVksSUFBSSxDQUFDLENBQUM7UUFDNUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFPRCw2Q0FBNkMsQ0FBQyxJQUFtQixFQUFFLFdBQW1CLEVBQUUsSUFBWTtRQUNsRyxJQUFJLEtBQUssR0FBaUIsSUFBSSxZQUFZLENBQVksSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRixLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQVFELDBDQUEwQyxDQUFDLElBQW1CLEVBQUUsSUFBWSxFQUFFLFFBQWtCO1FBQzlGLElBQUksS0FBSyxHQUFpQixJQUFJLFlBQVksQ0FBWSxJQUFJLENBQUMsQ0FBQztRQUM1RCxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBUUQsaURBQWlELENBQUMsS0FBWSxFQUFFLElBQVk7UUFDMUUsSUFBSSxJQUFJLEdBQWUsS0FBSyxDQUFDO1FBQzdCLElBQUksS0FBSyxHQUFpQixJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRCxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQVNELHFEQUFxRCxDQUFDLElBQW1CLEVBQUUsSUFBWSxFQUFFLElBQVk7UUFDbkcsSUFBSSxLQUFLLEdBQWlCLElBQUksWUFBWSxDQUFZLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFRRCwwQ0FBMEMsQ0FBQyxJQUFVLEVBQUUsSUFBWSxFQUFFLElBQVk7UUFDL0UsSUFBSSxHQUFHLEdBQVMsSUFBSSxDQUFDO1FBQ3JCLElBQUksSUFBSSxLQUFLLElBQUk7WUFDZixHQUFHLEdBQVMsSUFBSSxDQUFDO1FBRW5CLElBQUksS0FBSyxHQUFpQixJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRCxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLEtBQUssQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQU1ELG1CQUFtQixDQUFDLFVBQXlCLEVBQUUsU0FBaUIsRUFBRSxZQUFvQjtRQUNwRixJQUFJLEtBQUssR0FBaUIsSUFBSSxZQUFZLENBQVksVUFBVSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNoRixLQUFLLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFHdEQsSUFBSSxRQUFRLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUNuQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN4RSxJQUFJLElBQUksR0FBRyxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXZCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFXLEVBQUUsSUFBWSxFQUFFLFVBQWtCLEVBQUUsZ0JBQXdCLEVBQUUsV0FBc0I7UUFDM0csSUFBSSxLQUFLLEdBQWlCLElBQUksWUFBWSxDQUFPLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3RCxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXhCLElBQUksUUFBUSxHQUFhLElBQUksS0FBSyxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzlDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3BFLElBQUksZ0JBQWdCLEtBQUssSUFBSTtZQUMzQixnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDeEIsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUUxRSxJQUFJLElBQUksR0FBRyxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVyQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxJQUFVO1FBQzdCLElBQUksY0FBYyxHQUFpQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDbkYsSUFBSSxLQUFLLEdBQUcsSUFBSSxZQUFZLENBQVcsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pGLEtBQUssQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUUxRCxJQUFJLFFBQVEsR0FBYSxJQUFJLEtBQUssQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUM5QyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUVsRixJQUFJLElBQUksR0FBRyxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLGFBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFLRCxzQkFBc0IsQ0FBQyxPQUFhLEVBQUUsSUFBbUI7UUFDdkQsSUFBSSxLQUFLLEdBQUcsSUFBSSxZQUFZLENBQVcsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0YsS0FBSyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRTVELElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtZQUNuQixLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZCLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtnQkFDaEIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN4QjtZQUNELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNwQztJQUNILENBQUM7SUFRRCxxQkFBcUIsQ0FBQyxJQUFlLEVBQUUsS0FBVSxFQUFFLGNBQXVCO1FBQ3hFLElBQUksS0FBSyxHQUFpQixJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFELEtBQUssQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUMvRCxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXRCLElBQUksUUFBUSxHQUFhLElBQUksS0FBSyxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzlDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0RixJQUFJLElBQUksR0FBRyxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXZCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQVFELDBDQUEwQyxDQUFDLElBQW1CLEVBQUUsSUFBWSxFQUFFLElBQVk7UUFDeEYsSUFBSSxLQUFLLEdBQWlCLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0QsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFRRCwyREFBMkQsQ0FBQyxJQUFtQixFQUFFLElBQVksRUFBRSxJQUFZLEVBQUUsY0FBdUI7UUFDbEksSUFBSSxLQUFLLEdBQWlCLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0QsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixLQUFLLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQVFELDBDQUEwQyxDQUFDLElBQW1CLEVBQUUsSUFBWSxFQUFFLElBQXlCO1FBQ3JHLElBQUksS0FBSyxHQUFpQixJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdELEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBS0QsbUNBQW1DLENBQUMsSUFBVyxFQUFFLElBQVk7UUFDM0QsSUFBSSxLQUFLLEdBQWlCLElBQUksWUFBWSxDQUFPLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3RCxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQU1ELDBDQUEwQyxDQUFDLElBQVcsRUFBRSxJQUFZO1FBQ2xFLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUtPLFFBQVE7UUFDZCxPQUFxQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFTyxZQUFZLENBQUMsU0FBb0IsRUFBRSxJQUFVO1FBQ25ELElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsSUFBVTtRQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztJQUM3QixDQUFDO0lBTUQsMEJBQTBCLENBQUMsSUFBYztRQUN2QyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWUsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDNUgsQ0FBQztJQUtELEtBQUssQ0FBQyxtQ0FBbUM7UUFDdkMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFHN0MsSUFBSSwwQkFBMEIsR0FDNUIsV0FBVyxDQUFDLFFBQVEsQ0FBQyxpQ0FBaUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztRQUVqRSxhQUFhLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO1FBQzdDLE9BQU8sYUFBYSxDQUFDLHVCQUF1QixFQUFFO1lBQzVDLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsR0FBRyxTQUFTLENBQUM7WUFDMUQsSUFBSSxhQUFhLENBQUMsbUNBQW1DLElBQUksVUFBVSxJQUFJLDBCQUEwQixFQUFFO2dCQUNqRyxhQUFhLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO2FBQy9DO1NBQ0Y7SUFDSCxDQUFDO0lBT0QsS0FBSyxDQUFDLG1CQUFtQixDQUFDLElBQWE7UUFDckMsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBSXhCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsV0FBVyxFQUFFLEtBQUssUUFBUSxDQUFDLE1BQU07WUFDM0YsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUVmLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDL0IsSUFBSSxJQUFJLEVBQUU7Z0JBR1IsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsSUFBSSxFQUFFO29CQUM3RCxXQUFXLEdBQUcsSUFBSSxDQUFDO29CQUNuQixhQUFhLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7aUJBQ2xFO2FBQ0Y7O2dCQUNDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFFckIsSUFBSSxXQUFXLEVBQUU7Z0JBQ2YsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDOUIsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUV2QixNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBRXZCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUUzQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFFeEIsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsR0FBRyxhQUFhLENBQUMsbUJBQW1CLENBQUM7b0JBQzNGLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7b0JBQzlDLGFBQWEsQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7aUJBQ3ZDO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFPRCxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQWM7UUFDN0IsSUFBSSxnQkFBZ0IsR0FBc0IsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRWhFLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFM0MsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7WUFFekIsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFdEMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVO2dCQUNwQixNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1NBRWpDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFPRCxLQUFLLENBQUMsd0JBQXdCLENBQUMsTUFBYyxFQUFFLFFBQWtCO1FBQy9ELElBQUksSUFBSSxHQUFlLFFBQVEsQ0FBQztRQUNoQyxJQUFJLGdCQUFnQixHQUFzQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFaEUsSUFBSSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFFOUQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7WUFDekIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQjtnQkFDL0MsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLDRCQUE0QixDQUFDLENBQUM7O2dCQUU3RixNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUV4RixNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFHdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUNsRCxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3RDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFJRCxLQUFLLENBQUMsWUFBWSxDQUFDLHVCQUE0QixFQUFFLHdCQUE2QjtRQUM1RSxJQUFJLENBQUMsdUJBQXVCLEtBQUssSUFBSSxJQUFJLHVCQUF1QixZQUFZLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEtBQUssSUFBSSxJQUFJLHdCQUF3QixDQUFDLFdBQVcsS0FBSyxNQUFNLENBQUMsRUFBRTtZQUM3SyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztZQUM3RSxPQUFPO1NBQ1I7UUFDRCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBT08sS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUFrQixFQUFFLGlCQUF5QjtRQUN4RSxJQUFJLElBQUksR0FBUyxJQUFJLENBQUM7UUFDdEIsSUFBSSxLQUFLLEdBQVcsQ0FBQyxDQUFDO1FBQ3RCLElBQUksZUFBZSxHQUFXLENBQUMsQ0FBQztRQUVoQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFHN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsaUJBQWlCLEtBQUssQ0FBQyxJQUFJLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQyxFQUFFO1lBQy9ILElBQUksS0FBSyxHQUFpQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDMUMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxFQUFFO2dCQUNqRCxLQUFLLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2dCQUV6QixJQUFJLG9CQUFvQixHQUFZLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDN0UsSUFBSSxvQkFBb0IsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFLEtBQUssaUJBQWlCLENBQUMsWUFBWSxFQUV0RjtvQkFDRSxTQUFTO2lCQUNWO2dCQUtELElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFLEtBQUssaUJBQWlCLENBQUMsb0JBQW9CLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxLQUFLLGlCQUFpQixDQUFDLHFCQUFxQixJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsVUFBVSxFQUFFO29CQUNyUSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDM0U7YUFDRjtZQUNELElBQUksT0FBTyxHQUFXLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNoRSxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7Z0JBQ3BCLE9BQU8sT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFO29CQUM3QyxPQUFPLEdBQUcsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUNwQyxJQUFJLE9BQU8sS0FBSyxJQUFJO3dCQUNsQixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ3pGO2FBQ0Y7aUJBQU07Z0JBU0wsSUFBSSxHQUFTLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDN0IsT0FBTyxPQUFPLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLElBQUksRUFBRTtvQkFDckUsSUFBSSxHQUFTLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDOUIsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxPQUFPLENBQUMsVUFBVTt3QkFDcEIsT0FBTyxHQUFHLElBQUksQ0FBQztvQkFFakIsSUFBSSxPQUFPLEtBQUssSUFBSTt3QkFDbEIsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUN6RjthQUNGO1lBQ0QsSUFBSSxPQUFPLEtBQUssSUFBSTtnQkFDbEIsTUFBTTtZQUVSLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDNUIsSUFBSSxHQUFHLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUN4RCxPQUFPLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDM0QsSUFBSSxHQUFTLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFFaEMsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO29CQUNqQixLQUFLLENBQUMsT0FBTyxDQUFZLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7b0JBQ25ELEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3JCO2FBQ0Y7O2dCQUNDLElBQUksR0FBUyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFL0IsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO2dCQUNqQixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQ3RDO1lBRUQsVUFBVSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBRXRCLElBQUksSUFBSSxLQUFLLElBQUk7Z0JBQ2YsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxFQUFFLENBQUM7aUJBQzVDO2dCQUVILE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsRUFBRSxDQUFDO2FBQ2hEO1lBRUQsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxFQUFFO2dCQUVqRCxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7b0JBQ2IsS0FBSyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEtBQUssQ0FBQztpQkFDOUM7YUFDRjtZQUdELElBQUksaUJBQWlCLEdBQUcsQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxtQkFBbUIsSUFBSSxLQUFLLENBQUMsYUFBYSxHQUFHLGlCQUFpQixDQUFDLGNBQWM7Z0JBQzdKLGVBQWUsRUFBRSxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztJQVFPLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxLQUFtQjtRQUNuRCxJQUFJLElBQUksR0FBWSxLQUFLLENBQUM7UUFFMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM5QixPQUFPLElBQUksQ0FBQztRQUVkLElBQUksSUFBSSxHQUFlLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN2QyxJQUFJLFFBQVEsR0FBeUIsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUNuRCxJQUFJLGNBQWMsR0FBYyxrQkFBa0IsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzNFLElBQUksdUJBQXVCLEdBQVksS0FBSyxDQUFDO1FBQzdDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRTtZQUMxRCxRQUFRLEtBQUssQ0FBQyxlQUFlLEVBQUUsRUFBRTtnQkFDL0IsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7b0JBQ3ZDLHVCQUF1QixHQUFHLElBQUksQ0FBQztvQkFDL0IsTUFBTTtnQkFFUixLQUFLLGlCQUFpQixDQUFDLGlCQUFpQjtvQkFHdEMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO29CQUMvQixNQUFNO2dCQUVSLEtBQUssaUJBQWlCLENBQUMsaUJBQWlCO29CQUV0QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ2hDLElBQUksQ0FBQyxvQkFBb0IsQ0FBWSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO29CQUMvRCxNQUFNO2dCQUVSLEtBQUssaUJBQWlCLENBQUMsa0JBQWtCO29CQUV2QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzdCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO29CQUUxQixJQUFJLGNBQWMsS0FBSyxJQUFJLEVBRTNCO3dCQUNFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBR3hCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDaEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUVwQyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDNUM7eUJBQU07d0JBSUwsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzt3QkFFN0MsTUFBTSxZQUFZLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNqRDtvQkFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzVCLE1BQU07Z0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7b0JBRXZDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDbkMsTUFBTTthQUVUO1lBQ0QsSUFBSSx1QkFBdUIsRUFBRTtnQkFDM0IsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3RDLElBQUksR0FBRyxJQUFJLENBQUM7YUFDYjtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBVU8sS0FBSyxDQUFDLHFCQUFxQixDQUFDLEdBQVUsRUFBRSxLQUFtQjtRQUNqRSxJQUFJLFNBQVMsR0FBYyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUNqRCxJQUFJLFFBQVEsR0FBWSxLQUFLLENBQUM7UUFDOUIsSUFBSSxNQUFNLEdBQVcsQ0FBQyxDQUFDO1FBR3ZCLElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRTtZQUNyRCxPQUFPLEtBQUssQ0FBQztRQUNmLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFDakMsSUFBSSxJQUFJLEdBQWUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZDLElBQUksTUFBTSxHQUFzQixJQUFJLENBQUMsUUFBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzVELElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUsscUJBQXFCLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM3RixRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ2hCLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDekI7UUFDRCxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxTQUFTLENBQUMsa0JBQWtCLEVBQUU7WUFDdkYsSUFBSSxJQUFJLEdBQXlCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzFELElBQUksSUFBSSxLQUFLLElBQUk7Z0JBQ2YsTUFBTSxJQUFJLENBQUMsb0NBQW9DLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDL0Y7UUFHRCxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxlQUFlLElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxTQUFTLENBQUMsaUJBQWlCLEVBQUU7WUFDNUksTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDbEYsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWM7Z0JBQ3ZFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDM0MsSUFBSSxPQUFPLEdBQXNCLElBQUksQ0FBQyxRQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7WUFFN0QsSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksUUFBUSxJQUFJLE1BQU0sS0FBSyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRTtnQkFFdEksT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNwQixPQUFPLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQy9DO1NBQ0Y7UUFDRCxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3BFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVMsQ0FBQyxlQUFlO2dCQUMvQyxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUNyRjtRQUdELElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxPQUFPLEVBQUU7WUFDbkMsSUFBSSxPQUFPLEdBQXlCLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFFbEQsSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ25ELElBQUksT0FBTyxHQUFXLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRWxELE1BQU0sT0FBTyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQzthQUNsRDtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBS08sS0FBSyxDQUFDLG9CQUFvQixDQUFDLEtBQW1CO1FBQ3BELElBQUksU0FBUyxHQUFjLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBRW5ELElBQUksSUFBSSxHQUFlLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUd2QyxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsZUFBZSxFQUFFO1lBQzNDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRTtnQkFFckYsSUFBSSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDO29CQUM1RCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQzthQUMxQztTQUNGO1FBR0QsSUFBSSxTQUFTLEtBQUssU0FBUyxDQUFDLGdCQUFnQixFQUFFO1lBQzVDLElBQUksR0FBUyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDN0IsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWU7Z0JBQy9DLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQ3JGO1FBQ0QsSUFBSSxJQUFJLEdBQWMsa0JBQWtCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNqRSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxPQUFPLEVBQUU7WUFDcEQsTUFBTSxJQUFJLENBQUMsb0NBQW9DLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDN0Y7UUFHRCxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsT0FBTyxFQUFFO1lBQ25DLElBQUksT0FBTyxHQUF5QixLQUFLLENBQUMsT0FBTyxDQUFDO1lBRWxELElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSTtnQkFDakQsTUFBYyxPQUFPLENBQUMsUUFBUSxFQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDckQ7SUFDSCxDQUFDO0lBUU8sS0FBSyxDQUFDLGNBQWMsQ0FBQyxXQUEwQixFQUFFLEtBQW1CO1FBQzFFLElBQUk7WUFDRixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3RELElBQUksT0FBTyxHQUFpQixXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV0RCxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMscUJBQXFCLElBQUksT0FBTyxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQy9LLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUM1QzthQUNGO1NBQ0Y7Z0JBQVM7WUFDUixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDbkI7SUFDSCxDQUFDO0lBUU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFVLEVBQUUsSUFBZSxFQUFFLEdBQWlCO1FBQ3hFLElBQUksT0FBTyxHQUFpQixHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDbEQsSUFBSSxPQUFPLEdBQVcsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDO1FBSTVCLElBQUksR0FBRyxDQUFDLHNCQUFzQixFQUFFO1lBQzlCLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDMUIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBRTlGLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsY0FBYztnQkFDNUMsT0FBTztTQUNWO1FBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsMENBQTBDLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFFcEYsSUFBSTtZQUdGLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDcEYsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGVBQWUsQ0FBQztvQkFDOUcsT0FBTzthQUNWO1lBRUQsSUFBSSxLQUFLLEdBQWlCLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN2RCxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNuQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLEdBQUcsQ0FBQyxlQUFlLEVBQUUsRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNuRixJQUFJO2dCQUNGLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDdEM7b0JBQVM7Z0JBQ1IsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO29CQUN2QixJQUFJLFlBQVksR0FBYyxTQUFTLENBQUMsWUFBWSxDQUFDO29CQUNyRCxJQUFJLFlBQVksS0FBSyxJQUFJLElBQUksU0FBUyxDQUFDLGlCQUFpQixFQUFFO3dCQUN4RCxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQ3BFO2FBQ0Y7WUFDRCxJQUFJLEdBQUcsR0FBVyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUM7WUFFNUQsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVU7Z0JBQ2pDLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsd0NBQXdDLEdBQUcsT0FBTyxDQUFDLENBQUM7WUFFbEYsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxLQUFLLFNBQVMsQ0FBQyxZQUFZLEVBQUU7Z0JBQ3pFLE1BQWUsSUFBSSxDQUFDLE9BQU8sRUFBRyxDQUFDLGlCQUFpQixFQUFFLENBQUM7YUFDcEQ7U0FDRjtnQkFBUztTQUNUO0lBQ0gsQ0FBQztJQU1PLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBZSxFQUFFLElBQVksRUFBRSxHQUFRO1FBQ25FLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsY0FBYyxFQUFFO1lBQzNPLElBQUksVUFBVSxHQUFZLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDeEgsSUFBSSxjQUFjLEdBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLGlCQUFpQixFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRTVHLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3JFLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2lCQUMxQjtnQkFDSCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7b0JBQ3hCLFFBQVEsQ0FBQyw0Q0FBNEMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBRWxHLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO29CQUVqRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztvQkFDM0IsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLENBQUM7aUJBQ3ZFO2dCQUVELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtvQkFDeEIsUUFBUSxDQUFDLDRDQUE0QyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFLbkcsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRTtvQkFDcEMsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzdDO1NBQ0Y7SUFDSCxDQUFDO0lBV08sS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFlLEVBQUUsSUFBWSxFQUFFLFlBQXFCO1FBQzlFLElBQUksSUFBSSxLQUFLLElBQUk7WUFDZixPQUFPO1FBR1QsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxlQUFlO1lBQzdDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDekQsSUFBSTtZQUNGLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZUFBZSxFQUFFO2dCQUMvQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRTtvQkFDOUUsT0FBTztpQkFDUjtnQkFDRCxJQUFJLFdBQVcsR0FBWSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxTQUFTLEdBQVksSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7Z0JBRXZELElBQUksWUFBWSxHQUFjLFNBQVMsQ0FBQyxZQUFZLENBQUM7Z0JBRXJELElBQUksQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxTQUFTLENBQUMsSUFBSSxZQUFZLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLEtBQUssSUFBSSxFQUFFO29CQUM1RyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFVLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDMUYsSUFBSSxZQUFZLENBQUMsWUFBWTt3QkFDM0IsTUFBZSxZQUFZLENBQUMsT0FBTyxFQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztvQkFDN0QsTUFBTSxZQUFZLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM5QyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQ2xFO2dCQUNELElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxTQUFTO29CQUNsQyxPQUFPO2FBQ1Y7WUFFRCxJQUFJLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGNBQWMsQ0FBQyxFQUFFO2dCQUNsSyxJQUFJLEtBQUssR0FBaUIsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pELEtBQUssQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN2QjtTQUNGO2dCQUFTO1lBQ1Isa0JBQWtCLENBQUMsUUFBUSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztTQUN4RDtJQUNILENBQUM7SUFNRCwwQ0FBMEMsQ0FBQyxNQUFXO1FBRXBELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLGNBQWMsQ0FBQyxtQkFBbUIsSUFBSSxNQUFNLENBQUMsZUFBZSxFQUFFO1lBQ3BGLGlCQUFpQixDQUFDLHNCQUFzQixJQUFJLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRTtZQUNsRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDO0lBUU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFlLEVBQUUsSUFBWSxFQUFFLE9BQWdCO1FBQ3ZFLElBQUk7WUFFRixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pCLE9BQU87WUFLVCxJQUFJLElBQUksS0FBSyxJQUFJLENBQUMseUJBQXlCLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLEVBQUU7Z0JBRTdFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUU7b0JBQy9ILE1BQU0sQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0hBQW9ILEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBRWpMLFlBQVksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsa0JBQWtCLENBQUMscUJBQXFCLEVBQUUsRUFBRSxDQUFDLEVBQ25ILGtCQUFrQixDQUFDLHFCQUFxQixFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN0RSxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDO29CQUN0QyxPQUFPO2lCQUNSO2FBQ0Y7WUFFRCxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDO1lBRXRDLElBQUksT0FBTztnQkFDVCxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1lBRXhELElBQUksUUFBUSxHQUFjLGtCQUFrQixDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDckUsSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFO2dCQUM3QyxNQUFlLElBQUksQ0FBQyxPQUFPLEVBQUcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUVuRCxPQUFPO2FBQ1I7WUFHRCxJQUFJLFFBQVEsR0FBZSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUc1RSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZUFBZSxFQUFFO2dCQUNoRSxJQUFJLFFBQVEsS0FBSyxJQUFJO29CQUNuQixNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDakUsT0FBTzthQUNSO1lBRUQsSUFBSSxRQUFjLENBQUM7WUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxPQUFPLENBQUMsV0FBVyxDQUFDO2dCQUM3SixRQUFRLEdBQUcsUUFBUSxDQUFDOztnQkFFcEIsUUFBUSxHQUFTLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUU1QyxJQUFJLFdBQVcsR0FBWSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUc5RCxJQUFJLFdBQVcsRUFBRTtnQkFFZixJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSTtvQkFDOUIsT0FBTztnQkFDVCxJQUFJLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUN6RSxJQUFJLE9BQU87b0JBQ1QsT0FBTztnQkFFVCxJQUFJLFNBQVMsR0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO2dCQUN4RixJQUFJLEtBQUssR0FBaUIsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUM1RCxLQUFLLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQ3hELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDdEM7aUJBQU0sSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFO2dCQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxFQUFFO29CQUM1QixJQUFJLFFBQVEsQ0FBQyxlQUFlLEVBQUU7d0JBQzVCLE1BQU0sUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDO2lCQUNwQztxQkFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxFQUFFO29CQUN0QyxJQUFJLE1BQU0sR0FBVyxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNsRCxJQUFJLENBQUMsTUFBTSxRQUFRLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQzt3QkFDbkQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUMvQjtnQkFDRCxTQUFTLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQzthQUNuQzs7Z0JBQ0MsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFFakUsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksU0FBUyxDQUFDLFlBQVksS0FBSyxJQUFJO2dCQUN6RCxrQkFBa0IsQ0FBQyxxQkFBcUIsQ0FBVyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDckYsT0FBTztTQUNSO2dCQUFTO1lBQ1IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNsRCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3ZCO29CQUNFLElBQUksWUFBWSxHQUFjLFNBQVMsQ0FBQyxZQUFZLENBQUM7b0JBRXJELElBQUksWUFBWSxLQUFLLElBQUksRUFBRTt3QkFDekIsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBVSxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQzFGLE1BQU0sWUFBWSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDOUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO3FCQUNsRTtpQkFDRjthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBY08sS0FBSyxDQUFDLHFCQUFxQixDQUFDLElBQWUsRUFBRSxRQUFjLEVBQUUsUUFBYztRQUNqRixJQUFJLHNCQUFzQixHQUFHLEtBQUssQ0FBQztRQUtuQyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbEQsSUFBSSxPQUFPLEdBQVMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0QsSUFBSSxRQUFRLElBQUksUUFBUSxJQUFJLFFBQVEsSUFBSSxPQUFPLEVBQXVCO1lBQ3BFLElBQUksT0FBTyxJQUFJLElBQUksSUFBSSxRQUFRLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7Z0JBQy9ELElBQUksV0FBVyxHQUF5QixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQzNFLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRTtvQkFDdkIsUUFBUSxHQUFHLE9BQU8sQ0FBQzthQUN0QjtTQUNGO1FBR0QsSUFBSSxRQUFRLElBQVUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFO1lBRWpGLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUN0QyxJQUFJLFdBQVcsR0FBeUIsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUM1RSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixFQUFFO29CQUM1RCxXQUFXLEdBQUcsUUFBUSxDQUFDLHlCQUF5QixFQUFFLENBQUM7Z0JBQ3JELElBQUksV0FBVyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBRXpFLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFZLFdBQVcsQ0FBQyxDQUFDO29CQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWM7d0JBQ3RCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUMvQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7aUJBQy9CO2FBQ0Y7U0FDRjtRQUVELE9BQU8sc0JBQXNCLENBQUM7SUFDaEMsQ0FBQztJQU9PLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxJQUFlO1FBQ3hELElBQUk7WUFDRixNQUFNLGFBQWEsQ0FBQyxRQUFRLENBQUMsb0NBQW9DLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDL0c7Z0JBQVM7WUFDUixJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2xELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFDdkI7b0JBQ0UsSUFBSSxZQUFZLEdBQWMsU0FBUyxDQUFDLFlBQVksQ0FBQztvQkFFckQsSUFBSSxZQUFZLEtBQUssSUFBSSxFQUFFO3dCQUN6QixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFVLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDMUYsTUFBTSxZQUFZLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUM5QyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7cUJBQ2xFO2lCQUNGO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFTTyxjQUFjLENBQUMsSUFBZSxFQUFFLE9BQWdCO1FBRXRELElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsaUJBQWlCLENBQUM7WUFDN0csT0FBTyxLQUFLLENBQUM7UUFLZixJQUFJLFdBQVcsR0FBWSxJQUFJLENBQUM7UUFDaEMsSUFBSSxRQUFRLEdBQWUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRXBELElBQUksUUFBUSxHQUFTLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3RFLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksSUFBSSxRQUFRLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxJQUFJO1lBQ3RGLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMzQixPQUFPLEtBQUssQ0FBQztRQUVmLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7WUFDbkUsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUV0QixPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBTU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFpQjtRQUN6QyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdDLElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ3JCLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDOUM7YUFBTTtZQUNMLElBQUksR0FBRyxHQUFXLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDdEUsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ3REO0lBQ0gsQ0FBQztJQVFPLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxHQUFpQjtRQUMxRCxJQUFJLE9BQU8sR0FBVyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNuRCxJQUFJLEdBQUcsR0FBVyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDNUMsSUFBSSxlQUFlLEdBQVcsdUJBQXVCLENBQUMsV0FBVyxFQUFFLENBQUMsa0JBQWtCLENBQUM7UUFDdkYsSUFBSSx3QkFBd0IsR0FBVyxXQUFXLENBQUMsUUFBUSxDQUFDLDJCQUEyQixFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQy9GLElBQUksNEJBQTRCLEdBQVcsV0FBVyxDQUFDLFFBQVEsQ0FBQywrQkFBK0IsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUV2RyxJQUFJLFFBQVEsR0FBRyxDQUFDLE9BQU8sR0FBRyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUM7UUFHbEQsSUFBSSx3QkFBd0IsSUFBSSxDQUFDLElBQUksNEJBQTRCLElBQUksQ0FBQztZQUNwRSxPQUFPO1FBRVQsSUFBSSxhQUFhLENBQUMsNkJBQTZCLElBQUksUUFBUSxJQUFJLENBQUMsd0JBQXdCLEdBQUcsNEJBQTRCLENBQUMsRUFBRTtZQUd4SCxJQUFJLGdCQUFnQixHQUFXLE1BQU0sVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUMzSixJQUFJLGdCQUFnQixJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRTtnQkFFaEQsSUFBSSxHQUFHLEdBQW1CLGNBQWMsQ0FBQyxxQ0FBcUMsRUFBRSxDQUFDO2dCQUNqRixHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDMUIsTUFBTSx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsd0NBQXdDLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDN0c7aUJBQU07Z0JBQ0wsYUFBYSxDQUFDLDZCQUE2QixHQUFHLEtBQUssQ0FBQzthQUNyRDtTQUNGO0lBQ0gsQ0FBQztJQUtELEtBQUssQ0FBQyx3QkFBd0I7UUFDNUIsSUFBSSxLQUFLLEdBQWlCLElBQUksWUFBWSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLGtCQUFrQixDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztRQUN6SSxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN6QyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BFLElBQUksR0FBRyxHQUFXLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekQsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVU7Z0JBQ2pDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDeEQ7SUFDSCxDQUFDO0lBT08sWUFBWSxDQUFDLElBQWUsRUFBRSxVQUFrQjtRQUM3QyxJQUFJLENBQUMsT0FBTyxFQUFHLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFXTyxLQUFLLENBQUMsb0JBQW9CLENBQUMsS0FBZ0IsRUFBRSxlQUF1QixFQUFFLE9BQWdCLEVBQUUsY0FBOEI7UUFDNUgsSUFBSSxJQUFJLEdBQW1CLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMzQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFNTyxLQUFLLENBQUMsdUJBQXVCLENBQUMsSUFBZTtRQUNuRCxJQUFJLElBQUksR0FBbUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzFDLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDakMsQ0FBQztJQU9PLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxJQUFlO1FBQ3ZELElBQUksSUFBSSxHQUFtQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUMsTUFBTSxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBT08sa0JBQWtCLENBQUMsR0FBaUIsRUFBRSxNQUFlO1FBQzNELEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBT08sS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQWlCO1FBQzlDLElBQUksSUFBSSxHQUFlLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQyxJQUFJLGVBQWUsR0FBeUIsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDO1FBQzNGLElBQUksSUFBSSxHQUFtQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUMsSUFBSSxXQUFXLEdBQVcsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQy9DLElBQUksSUFBSSxHQUF5QixHQUFHLENBQUMsT0FBTyxDQUFDO1FBRTdDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ3JCLElBQUksV0FBVyxLQUFLLEtBQUssQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDbEQsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7U0FDbEM7O1lBQ0MsV0FBVyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFFL0IsSUFBSSxjQUFjLEdBQWMsa0JBQWtCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUszRSxJQUFJLGNBQWMsS0FBSyxJQUFJLElBQVcsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFZLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLEtBQUssU0FBUyxDQUFDLGtCQUFrQixFQUFFO1lBQ3hPLElBQUksQ0FBQyxJQUFJLEtBQUssY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLFdBQVcsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsRUFBRSxFQUUxSTtnQkFDRSxNQUFNLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxjQUFjLEVBQUUsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFDdEcsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO29CQUN2QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFO3dCQUN0SyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7d0JBQ3BCLE1BQU0sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO3FCQUM3QjtvQkFFRCxPQUFPLEtBQUssQ0FBQztpQkFDZDthQUNGOztnQkFDQyxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUNELElBQUksSUFBSSxDQUFDLFlBQVk7WUFDbkIsT0FBTyxLQUFLLENBQUM7UUFFZixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQWtCekIsSUFBSSxRQUFRLEdBQWMsY0FBYyxDQUFDO1FBQ3pDLElBQUksZUFBZSxLQUFLLElBQUksSUFBVyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFHLENBQUMsUUFBUSxFQUFFLEtBQVksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDO1lBQ3hLLFFBQVEsR0FBRyxlQUFlLENBQUM7UUFFN0IsSUFBSSxRQUFRLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFFbEQsSUFBSSxRQUFRLEdBQWUsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3hELE1BQU0sUUFBUSxDQUFDLG9CQUFvQixDQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFDdkIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRTtvQkFDdEssSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUNwQixNQUFNLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztpQkFDN0I7Z0JBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQzFCLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRTtnQkFDekMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQzFCLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFFRCxNQUFNLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNsRDtRQUdELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUU7WUFDakMsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7YUFDL0U7WUFDSCxJQUFJLENBQUMsZUFBZSxHQUFHLHdCQUF3QixDQUFDLFNBQVMsQ0FBQztZQUMxRCxJQUFJLEtBQUssR0FBaUIsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQzlELEtBQUssQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUN2RCxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3RDO1FBQ0QsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRTtZQUMvQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUMxQixPQUFPLEtBQUssQ0FBQztTQUNkO1FBTUQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksS0FBSyxjQUFjLEVBQUU7WUFDdkQsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFFMUIsSUFBSSxjQUFjLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxjQUFjLENBQUMsTUFBTSxFQUFFO2dCQUMzRCxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUVqRSxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLDRDQUE0QyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFNM0ssSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUU1QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRW5DLElBQUksSUFBSSxDQUFDLFlBQVk7WUFDbkIsTUFBTSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUdqQyxJQUFJLGNBQWMsS0FBSyxJQUFJLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2hLLElBQUksY0FBYyxHQUFTLElBQUksQ0FBQztnQkFDaEMsSUFBSSxjQUFjLEtBQUssSUFBSTtvQkFDekIsY0FBYyxHQUFTLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFFNUQsSUFBSSxjQUFjLEtBQUssSUFBSSxFQUFFO29CQUMzQixJQUFJLFNBQVMsR0FBWSxJQUFJLENBQUM7b0JBQzlCLElBQUksWUFBcUIsQ0FBQztvQkFDMUIsSUFBSSxVQUFnQixDQUFDO29CQUVyQixJQUFJLGNBQWMsS0FBSyxJQUFJLEVBQUU7d0JBQzNCLFlBQVksR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDO3dCQUV4QyxLQUFLLFVBQVUsR0FBRyxjQUFjLEVBQUUsVUFBVSxLQUFLLElBQUksSUFBSSxZQUFZLEVBQUUsVUFBVSxHQUFTLFVBQVUsQ0FBQyxTQUFTLEVBQUUsRUFBRTs0QkFDaEgsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQ0FDZCxZQUFZLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQztnQ0FDcEMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dDQUN0RSxVQUFVLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0NBQ3pFLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzs2QkFDcEM7O2dDQUNDLFNBQVMsR0FBRyxLQUFLLENBQUM7eUJBQ3JCO3FCQUNGO29CQUVELFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUU5QixLQUFLLFVBQVUsR0FBUyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLElBQUksWUFBWSxFQUFFLFVBQVUsR0FBUyxVQUFVLENBQUMsU0FBUyxFQUFFLEVBQUU7d0JBQzFILFlBQVksR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDO3dCQUNwQyxJQUFJLFVBQVUsQ0FBQyxvQkFBb0IsRUFBRTs0QkFDbkMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUN2RSxNQUFNLFVBQVUsQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO3FCQUNuRDtvQkFHRCxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztpQkFDMUI7YUFDRjtTQUNGO1FBR0QsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVqRSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ2hELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRTdCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZ0JBQWdCO1lBQzlDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuRSxNQUFNLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBRTVDLElBQUksS0FBSyxHQUFpQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGdCQUFnQjtZQUM1RyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV4RSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFTTyxLQUFLLENBQUMsbUJBQW1CLENBQUMsR0FBaUI7UUFDakQsSUFBSSxPQUFPLEdBQWlCLEdBQUcsQ0FBQztRQUNoQyxJQUFJLElBQUksR0FBZSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsSUFBSSxHQUFHLEdBQVcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksT0FBTyxHQUFXLElBQUksQ0FBQztRQUMzQixJQUFJLEdBQVcsQ0FBQztRQUNoQixJQUFJLGNBQWMsR0FBVyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBRTVDLElBQUksSUFBSSxDQUFDLGNBQWM7WUFDckIsT0FBTyxLQUFLLENBQUM7UUFFZixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsT0FBTyxLQUFLLENBQUM7UUFFZixJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsaUJBQWlCLEVBQUU7WUFDdEQsSUFBSSxLQUFLLEdBQVcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQzVELElBQUksS0FBSyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxLQUFLLElBQUksRUFFdkM7Z0JBQ0UsR0FBRyxHQUFHLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDakMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdkIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckIsSUFBSSxTQUFTLEdBQXlCLEdBQUcsQ0FBQyxPQUFPLENBQUM7Z0JBQ2xELE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzNCLElBQUksU0FBUyxLQUFLLElBQUk7b0JBQ3BCLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1NBQ0Y7UUFJRCxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsbUJBQW1CLEVBQUU7WUFDeEQsSUFBSSxJQUFJLEdBQW1CLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMxQyxJQUFJLFdBQVcsR0FBVyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDL0MsSUFBSSxFQUFFLEdBQXVCLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDM0MsR0FBRyxHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUV0QixJQUFJLElBQUksR0FBeUIsR0FBRyxDQUFDLE9BQU8sQ0FBQztZQUM3QyxJQUFJLFVBQVUsR0FBVyxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7WUFFL0MsSUFBSSxlQUFlLEdBQWMsa0JBQWtCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUc1RSxRQUFRLFVBQVUsRUFBRTtnQkFDbEIsS0FBSyxpQkFBaUIsQ0FBQyxXQUFXO29CQUNoQyxJQUFJLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzFDLElBQUksT0FBTzt3QkFDVCxPQUFPLEtBQUssQ0FBQztnQkFDakIsS0FBSyxpQkFBaUIsQ0FBQyxvQkFBb0I7b0JBQ3pDLE1BQU07Z0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxpQkFBaUI7b0JBQ3RDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO29CQUNoRSxPQUFPLEtBQUssQ0FBQztnQkFFZixLQUFLLGlCQUFpQixDQUFDLHNDQUFzQztvQkFDM0QsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzlDLE9BQU8sS0FBSyxDQUFDO2dCQUVmLEtBQUssaUJBQWlCLENBQUMsbUJBQW1CO29CQUN4QyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDMUMsT0FBTyxLQUFLLENBQUM7Z0JBRWYsS0FBSyxpQkFBaUIsQ0FBQyxtQkFBbUI7b0JBQ3hDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO29CQUNsRSxPQUFPLEtBQUssQ0FBQztnQkFFZixLQUFLLGlCQUFpQixDQUFDLGdCQUFnQjtvQkFDckMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQzNDLE9BQU8sS0FBSyxDQUFDO2dCQUVmLEtBQUssaUJBQWlCLENBQUMsWUFBWTtvQkFDakMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM1QixPQUFPLEtBQUssQ0FBQztnQkFFZixLQUFLLGlCQUFpQixDQUFDLGFBQWE7b0JBQ2xDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO29CQUNyQyxPQUFPLEtBQUssQ0FBQztnQkFFZixLQUFLLGlCQUFpQixDQUFDLHlCQUF5QjtvQkFDOUMsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLEVBQUUsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO29CQUN4RixPQUFPLEtBQUssQ0FBQztnQkFFZixLQUFLLGlCQUFpQixDQUFDLGdCQUFnQjtvQkFDckMsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3pDLE9BQU8sS0FBSyxDQUFDO2dCQUVmLEtBQUssaUJBQWlCLENBQUMsc0NBQXNDO29CQUMzRCxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDN0MsTUFBTTtnQkFFUixLQUFLLGlCQUFpQixDQUFDLG9CQUFvQjtvQkFDekMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDbkMsT0FBTyxLQUFLLENBQUM7Z0JBRWYsS0FBSyxpQkFBaUIsQ0FBQyxxQkFBcUI7b0JBQzFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3BDLE9BQU8sS0FBSyxDQUFDO2dCQUVmLEtBQUssaUJBQWlCLENBQUMsa0JBQWtCO29CQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDekMsTUFBTTtnQkFFUixLQUFLLGlCQUFpQixDQUFDLGtCQUFrQjtvQkFDdkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ3pDLE1BQU07Z0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxpQkFBaUI7b0JBR3RDLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBVyxJQUFJLENBQUMsU0FBUyxFQUFHLENBQUMsdUJBQXVCO3dCQUNwRSxPQUFPLEtBQUssQ0FBQztvQkFHZixJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDakQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7b0JBRXhCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO3dCQUNuQixPQUFPLEtBQUssQ0FBQztvQkFLZixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFO3dCQUV6RSxPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFOzRCQUNwRCxXQUFXLEVBQUUsQ0FBQzt5QkFDZjt3QkFDRCxJQUFJLFdBQVcsSUFBSSxDQUFDLEVBQUU7NEJBQ3BCLE9BQU8sR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUM7NEJBQzFCLElBQUksV0FBVyxHQUFXLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzs0QkFDekMsSUFBSSxRQUFRLEdBQVcsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDOzRCQUV2QyxJQUFJO2dDQUNGLGNBQWMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO2dDQUVsQyxJQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQztnQ0FDdEMsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztnQ0FFN0QsSUFBSSxPQUFPLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRTtvQ0FDekQsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29DQUt4RCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLENBQUM7aUNBQzVEO2dDQUNELEdBQUcsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUM7NkJBQ3ZCOzRCQUFDLE9BQU8sQ0FBQyxFQUFFO2dDQUNWLElBQUksQ0FBQyxZQUFZLDRCQUE0QixFQUFFO29DQUM3QyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7d0NBQ3ZCLElBQUksV0FBVyxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0IsSUFBSSxjQUFjLEdBQUcsQ0FBQzs0Q0FDbEUsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFOzRDQUM3QixJQUFJLFFBQVEsR0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDOzRDQUN4RCxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQzt5Q0FDNUM7OzRDQUNDLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxDQUFDO3dDQUNuRCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7d0NBQ3ZELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3Q0FDN0IsZUFBZSxHQUFjLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO3dDQUN0RCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzt3Q0FDekIsSUFBSSxlQUFlLElBQUksSUFBSTs0Q0FDekIsTUFBTSxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7d0NBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3Q0FDNUIsT0FBTyxLQUFLLENBQUM7cUNBQ2Q7O3dDQUNDLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztpQ0FDL0M7O29DQUFNLE1BQU0sQ0FBQyxDQUFDOzZCQUNoQjt5QkFDRjs7NEJBQ0MsTUFBTSxJQUFJLG9CQUFvQixDQUFDLCtEQUErRDtnQ0FDNUYsV0FBVyxDQUFDLENBQUM7cUJBQ2xCO29CQUNELElBQUksR0FBRyxJQUFJLElBQUk7d0JBQ2IsTUFBTSxJQUFJLG9CQUFvQixDQUM1Qix1RUFBdUUsQ0FBQyxDQUFDO29CQUs3RSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWU7d0JBQ3RFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFHekIsSUFBSSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLEVBQUU7d0JBQy9ELE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUN2QyxPQUFPLEtBQUssQ0FBQztxQkFDZDtvQkFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7d0JBQ2pCLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7b0JBR2pDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVMsQ0FBQyxlQUFlO3dCQUMvQyxPQUFPLEtBQUssQ0FBQztvQkFFZixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLENBQUM7b0JBRTNELE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO29CQUN4RSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDekMsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO29CQUVqQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBR2xCLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMseUJBQXlCLEVBQUU7d0JBQ3BELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDbEMsT0FBTyxVQUFVLENBQUMsU0FBUyxFQUFFOzRCQUMzQixJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxTQUFTLENBQUMsZUFBZSxFQUFFO2dDQUN2RCxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQ0FDeEYsVUFBVSxHQUFHLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQ0FDcEMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7b0NBQzdCLE1BQU07NkJBQ1Q7O2dDQUNDLE1BQU07eUJBQ1Q7cUJBQ0Y7b0JBR0QsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQztvQkFDcEMsSUFBSSxNQUFNLElBQUksQ0FBQyxvQkFBb0IsRUFBRTt3QkFDbkMsTUFBTSxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQzdCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7b0JBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7b0JBRTNDLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7b0JBQ2pDLE1BQU07Z0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxpQkFBaUI7b0JBRXRDLElBQUksV0FBVyxHQUFZLEtBQUssQ0FBQztvQkFDakMsSUFBSSxnQkFBeUIsQ0FBQztvQkFFOUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7b0JBRzdCLElBQUksR0FBRyxJQUFJLElBQUk7d0JBQ2IsT0FBTyxLQUFLLENBQUM7b0JBRWYsV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBSWhGLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLFdBQVcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxxQkFBcUIsQ0FBQyxNQUFNO3dCQUNqRixJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQjt3QkFDN0MsT0FBTyxJQUFJLENBQUM7b0JBR2QsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWU7d0JBQy9DLE9BQU8sS0FBSyxDQUFDO29CQUVmLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRTt3QkFDcEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUM3QixNQUFNLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO3dCQUNoSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQzlCLElBQUksSUFBSSxDQUFDLGNBQWM7NEJBQ3JCLE9BQU8sS0FBSyxDQUFDO3FCQUNoQjtvQkFFRCxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29CQUN4RSxJQUFJLElBQUksQ0FBQyxjQUFjO3dCQUNyQixPQUFPLEtBQUssQ0FBQztvQkFDZixNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztvQkFLeEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBRXpDLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBR2xGLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLFNBQVMsQ0FBQyxlQUFlLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUTt3QkFDL0UsQ0FBQyxnQkFBZ0I7d0JBQ2pCLE9BQU8sS0FBSyxDQUFDO29CQUVmLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTt3QkFDMUUsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUsscUJBQXFCLENBQUMsTUFBTSxFQUFFOzRCQUNsRCxPQUFPLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDO3lCQUNwRDt3QkFDRCxPQUFPLEtBQUssQ0FBQztxQkFDZDtvQkFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZ0JBQWdCLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRTt3QkFDakUsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7NEJBQ25DLE9BQU8sS0FBSyxDQUFDO3FCQUNoQjtvQkFFRCxJQUFJLGFBQWEsR0FBWSxDQUFDLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUUxRSxJQUFJLGFBQWE7d0JBQ2YsT0FBTyxLQUFLLENBQUM7b0JBQ2YsTUFBTTtnQkFFUixLQUFLLGlCQUFpQixDQUFDLGtCQUFrQjtvQkFDdkMsSUFBSSxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUM7d0JBQ2xDLE9BQU8sSUFBSSxDQUFDO3lCQUNUO3dCQUVILEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzt3QkFDOUIsT0FBTyxLQUFLLENBQUM7cUJBQ2Q7Z0JBRUgsS0FBSyxpQkFBaUIsQ0FBQyxhQUFhO29CQUNsQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQy9CLE1BQU07Z0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7b0JBR3ZDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxJQUFJO3dCQUNyRCxPQUFPLEtBQUssQ0FBQztvQkFHZixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxTQUFTLENBQUMsa0JBQWtCO3dCQUNsRCxPQUFPLEtBQUssQ0FBQztvQkFFZixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFO3dCQUNyQixHQUFHLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFHL0IsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQzt3QkE4QmxDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFOzRCQUN6QixDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGlCQUFpQixJQUFJLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLGdCQUFnQixDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsSUFBSSxPQUFPLEdBQUcsSUFBSSxXQUFXO2dDQUN4TyxDQUFDLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFOzRCQUMvQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQzVCLE9BQU8sS0FBSyxDQUFDO3lCQUNkO3FCQUNGO29CQUdELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYzt3QkFDdEIsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUdqQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztvQkFDdkIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztvQkFDakMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7b0JBQzVCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDOUIsTUFBTTthQUVUO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFPUyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQWU7UUFDeEMsSUFBSSxHQUFtQixDQUFDO1FBQ3hCLElBQUksS0FBYSxDQUFDO1FBQ2xCLElBQUksS0FBYSxDQUFDO1FBQ2xCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLElBQUksR0FBUyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFHMUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRTtZQUUzQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRTtnQkFFckIsS0FBSyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBR2pDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQztvQkFDekMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUN6QjtvQkFDSCxJQUFJLFVBQVUsR0FBVyxJQUFJLENBQUM7b0JBQzlCLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3JDLElBQUksR0FBRyxHQUFjLElBQUksQ0FBQyxRQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ2pELFVBQVUsR0FBRyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDaEUsR0FBRyxHQUFHLGNBQWMsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO29CQUN2SCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFFdkMsSUFBSSx1QkFBdUIsR0FBMEIsd0JBQXdCLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztvQkFDckcsTUFBTSx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsd0NBQXdDLENBQUMsa0JBQWtCLENBQUMsQ0FBQztvQkFFbkcsWUFBWSxHQUFHLElBQUksQ0FBQztpQkFDckI7YUFDRjtTQUNGO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVPLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxJQUFVO1FBR2pELElBQUksS0FBSyxHQUFrQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDakQsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNoRCxJQUFJLE9BQU8sR0FBaUIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRCxJQUFJLEdBQUcsR0FBVSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEMsSUFBSSxHQUFHLENBQUMsZUFBZSxFQUFFLEtBQUssaUJBQWlCLENBQUMsd0JBQXdCLEVBQUU7Z0JBQ3hFLElBQUksT0FBTyxHQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFVLElBQUksQ0FBQyxPQUFPLEVBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDL0IsSUFBSSxZQUFZLEdBQWlCLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUMzRCxZQUFZLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLENBQUM7b0JBQ3JFLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQzVDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTt3QkFFdkIsa0JBQWtCLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dCQUN4RCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ2hDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDbkMsT0FBTyxLQUFLLENBQUM7cUJBQ2Q7aUJBQ0Y7YUFDRjtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBR08sS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFlLEVBQUUsSUFBWSxFQUFFLEdBQWlCO1FBQzNFLElBQUksV0FBVyxHQUFXLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMvQyxJQUFJLFdBQVcsS0FBSyxLQUFLLENBQUMsUUFBUTtZQUNoQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUVqQyxJQUFJLFFBQVEsR0FBWSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsYUFBYSxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDNVIsSUFBSSxRQUFRO1lBQ1YsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7O1lBRXRGLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFVTyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQVUsRUFBRSxHQUFpQjtRQUV4RCxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ3BFLElBQUksV0FBVyxHQUFjLElBQUksQ0FBQztZQUNsQyxJQUFJLGtCQUFrQixHQUFXLE1BQU0sR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBR2xHLElBQUksa0JBQWtCLElBQUksSUFBSTtnQkFDNUIsT0FBTztZQUlULEtBQUssSUFBSSxVQUFVLEdBQVMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLElBQUksVUFBVSxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxVQUFVLEdBQVMsVUFBVSxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUN0SixXQUFXLEdBQWMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDeEgsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO29CQUN2QixJQUFJLFdBQVcsR0FBZSxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBRzNELElBQUksV0FBVyxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsRUFBRTt3QkFDakQ7NEJBQ0UsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7eUJBQzdDO3dCQUNELE1BQU07cUJBQ1A7aUJBQ0Y7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQU9NLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxXQUFzQjtRQUNyRCxJQUFJLFdBQVcsR0FBZSxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDM0QsSUFBSSxVQUFVLEdBQWUsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRTdELElBQUksR0FBRyxHQUFXLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixNQUFNLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDeEIsVUFBVSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNwRCxNQUFNLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUV6QixXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMvQixNQUFNLHdCQUF3QixDQUFDLG9CQUFvQixFQUFFLENBQUMsT0FBTyxDQUFDLHdDQUF3QyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDM0gsUUFBUSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsVUFBVSxFQUFFLEVBQWtCLFdBQVksQ0FBQyxPQUFPLEVBQUUsRUFBRSxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztZQUkzSyxJQUFvQixXQUFZLENBQUMsT0FBTyxFQUFFO2dCQUN4QyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDZjtJQUNILENBQUM7SUFRTyxvQkFBb0IsQ0FBQyxHQUFpQjtRQUM1QyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDN0IsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssY0FBYyxDQUFDLG1CQUFtQixFQUFFO2dCQUN4RCxRQUFRLEdBQUcsQ0FBQyxlQUFlLEVBQUUsRUFBRTtvQkFDN0I7d0JBQ0UsTUFBTTtpQkFDVDthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBUUQsS0FBSyxDQUFDLHVCQUF1QixDQUFDLElBQWMsRUFBRSxXQUE4QjtRQUMxRSxJQUFJLFlBQVksR0FBWSxLQUFLLENBQUM7UUFDbEMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssU0FBUyxDQUFDLGlCQUFpQixFQUFFO1lBQ25ELFdBQVcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQzFCLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ2xGLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO2dCQUM3QixZQUFZLEdBQUcsSUFBSSxDQUFDO1NBQ3ZCO1FBRUQsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQU9ELEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxJQUFjO1FBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRTtZQUNoQyxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUNuRjtJQUNILENBQUM7SUFPTyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQWlCO1FBQzNDLElBQUksSUFBSSxHQUFlLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQyxJQUFJLE1BQU0sR0FBVyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdEMsSUFBSSxJQUFJLEdBQW1CLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMxQyxJQUFJLElBQUksR0FBeUIsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUM3QyxJQUFJLGNBQXlCLENBQUM7UUFDOUIsSUFBSSxRQUFRLEdBQVksSUFBSSxDQUFDO1FBQzdCLElBQUksT0FBZSxDQUFDO1FBQ3BCLElBQUksTUFBTSxHQUEwQixJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFFM0QsSUFBSSxJQUFJLENBQUMsY0FBYztZQUNyQixPQUFPO1FBR1QsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssY0FBYyxDQUFDLGVBQWU7WUFDbEQsR0FBRyxHQUFHLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUVsRCxJQUFJO1lBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV0QixJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ3RELElBQUksS0FBSyxHQUFXLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztnQkFDNUQsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUVmO29CQUNFLEdBQUcsR0FBRyxJQUFJLFlBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQ2pDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3ZCLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3RCO2FBQ0Y7WUFLRCxJQUFJLEdBQW1CLENBQUM7WUFDeEIsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssY0FBYyxDQUFDLG1CQUFtQixJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUU7Z0JBQzNKLElBQUksWUFBWSxHQUFpQyxNQUFNLENBQUMsWUFBWSxDQUFDO2dCQUNyRSxJQUFJLEVBQUUsR0FBdUIsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDM0MsSUFBSSxHQUFHLEdBQVcsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUVsQyxJQUFJLFVBQVUsR0FBVyxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBRy9DLFFBQVEsVUFBVSxFQUFFO29CQUVsQixLQUFLLGlCQUFpQixDQUFDLG9CQUFvQjt3QkFDekMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQzt3QkFDckMsTUFBTTtvQkFHUixLQUFLLGlCQUFpQixDQUFDLGFBQWEsQ0FBQztvQkFDckMsS0FBSyxpQkFBaUIsQ0FBQyxlQUFlO3dCQUlwQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGdCQUFnQjs0QkFDOUMsQ0FBQyxVQUFVLEtBQUssaUJBQWlCLENBQUMsYUFBYSxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFOzRCQUN6RyxJQUFJLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDcEMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksSUFBSTtnQ0FDN0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQzs0QkFDdEMsSUFBSSxjQUFjLENBQUMsZUFBZSxLQUFLLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQ0FDdkQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUU7b0NBQ3pCLElBQUksWUFBWSxHQUFlLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQ0FDaEQsSUFBSSxZQUFZLElBQUksSUFBSTt3Q0FDdEIsWUFBWSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO2lDQUMxRTtnQ0FDRCxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQ0FDaEMsTUFBTSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7Z0NBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7Z0NBQ3ZCLElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxNQUFNLENBQUMsQ0FBQzs2QkFDekQ7eUJBQ0Y7NkJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxhQUFhLEVBQUU7NEJBRXBELElBQUksQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7eUJBQzNFOzZCQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZUFBZSxFQUFFOzRCQUN0RCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzt5QkFDMUI7d0JBRUQsTUFBTTtvQkFFUixLQUFLLGlCQUFpQixDQUFDLG9CQUFvQjt3QkFDekMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUM7d0JBQy9DLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxZQUFZO3dCQUNqQyxJQUFJLEtBQUssR0FBRyxJQUFJLFlBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7d0JBQ3ZDLEtBQUssQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7d0JBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3RCLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxXQUFXO3dCQUVoQyxJQUFJLFNBQVMsR0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzFHLE1BQU0sU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO3dCQUUzRSxNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsa0JBQWtCO3dCQUV2QyxNQUFNLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsRUFBRSxLQUFLLEVBQzlGLEtBQUssQ0FBQyxDQUFDO3dCQUVULE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7d0JBQ3ZDLElBQUksSUFBSSxJQUFJLElBQUk7NEJBQ2QsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7d0JBQ2hGLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7d0JBQ3ZDLElBQUksSUFBSSxJQUFJLElBQUk7NEJBQ2QsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7d0JBQ2hGLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7d0JBQ3ZDLElBQUksSUFBSSxJQUFJLElBQUk7NEJBQ2QsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7d0JBQ2pGLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7d0JBQ3ZDLElBQUksSUFBSSxJQUFJLElBQUk7NEJBQ2QsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7d0JBQ2pGLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7d0JBQ3ZDLElBQUksSUFBSSxJQUFJLElBQUk7NEJBQ2QsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDLG9CQUFvQixDQUFDLENBQUM7d0JBQ2xGLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7d0JBQ3ZDLElBQUksSUFBSSxJQUFJLElBQUk7NEJBQ2QsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUM7d0JBQ2hGLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxpQkFBaUI7d0JBR3RDLGNBQWMsR0FBYyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzt3QkFDckQsSUFBSSxjQUFjLElBQUksSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxFQUFFOzRCQUN6RCxJQUFJLElBQUksSUFBSSxJQUFJO2dDQUNkLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO3lCQUNwRjt3QkFDRCxNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsaUJBQWlCO3dCQUd0QyxjQUFjLEdBQWMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7d0JBQ3JELElBQUksY0FBYyxLQUFLLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsRUFBRTs0QkFDMUQsSUFBSSxJQUFJLElBQUksSUFBSTtnQ0FDZCxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQzt5QkFDbEY7d0JBQ0QsTUFBTTtvQkFFUixLQUFLLGlCQUFpQixDQUFDLG9CQUFvQjt3QkFBRTs0QkFHM0MsSUFBSSxRQUFRLEdBQWtCLElBQUksQ0FBQyxJQUFJLENBQUM7NEJBQ3hDLElBQUksU0FBUyxHQUFXLGlCQUFpQixDQUFDLFdBQVcsQ0FBQzs0QkFDdEQsSUFBSSxRQUFRLEtBQUssYUFBYSxDQUFDLGVBQWUsSUFBSSxRQUFRLEtBQUssYUFBYSxDQUFDLGVBQWU7Z0NBQzFGLFFBQVEsS0FBSyxhQUFhLENBQUMsZUFBZSxFQUFFO2dDQUM1QyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQztvQ0FDbkYsU0FBUyxHQUFHLGlCQUFpQixDQUFDLGFBQWEsQ0FBQztxQ0FDekM7b0NBQ0gsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUM7d0NBQ2pGLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxXQUFXLENBQUM7aUNBQzdDO2dDQUVELElBQUksU0FBUyxLQUFLLGlCQUFpQixDQUFDLFdBQVc7b0NBQzdDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7NkJBQ3pEO3lCQUNGO3dCQUNDLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxjQUFjO3dCQUNuQyxJQUFJLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQzs0QkFDdEQsT0FBTzt3QkFDVCxNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsY0FBYyxDQUFDO29CQUN0QyxLQUFLLGlCQUFpQixDQUFDLG9CQUFvQjt3QkFDekMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxFQUFFOzRCQUNuQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBRWhDLE1BQU07eUJBQ1A7d0JBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFOzRCQUN4QixNQUFNO3dCQUVSLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBRTNCLElBQUk7NEJBQ0YsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssU0FBUyxDQUFDLGtCQUFrQixFQUFFO2dDQUNwRCxNQUFNLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dDQUNoSCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtvQ0FDN0IsT0FBTzs2QkFDVjs0QkFHRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZ0JBQWdCLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUU7Z0NBQ2pGLElBQUksTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLENBQUMsRUFBRTtvQ0FDckUsUUFBUSxHQUFHLEtBQUssQ0FBQztvQ0FDakIsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7b0NBQ2xGLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTt3Q0FDbEQsT0FBTztpQ0FDVjtxQ0FBTTtvQ0FDTCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztvQ0FDekMsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7b0NBRWxGLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO3dDQUVoRCxJQUFJLGlCQUFpQixHQUF5QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzt3Q0FDdkUsSUFBSSxpQkFBaUIsS0FBSyxJQUFJOzRDQUM1QixNQUFNLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDO3FDQUNwQztvQ0FDRCxPQUFPO2lDQUNSOzZCQUNGOzRCQUNELElBQUksV0FBVyxHQUFzQixJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQzs0QkFDNUQsSUFBSSxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDO2dDQUN2RCxPQUFPOzRCQUNULFFBQVEsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDOzRCQUU3QixJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7Z0NBRWhCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZTtvQ0FDMUUsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxVQUFVLElBQUksaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7NkJBQ3BHOzRCQUVELE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUN6QyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzt5QkFFM0M7Z0NBQVM7NEJBQ1IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFDN0I7d0JBQ0QsTUFBTTtvQkFFUixLQUFLLGlCQUFpQixDQUFDLGFBQWE7d0JBQ2xDLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUM3RCxNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsd0JBQXdCO3dCQUM3QyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDMUMsTUFBTTtvQkFFUixLQUFLLGlCQUFpQixDQUFDLGNBQWM7d0JBQ25DLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsQ0FBQzt3QkFDL0UsTUFBTTtvQkFFUixLQUFLLGlCQUFpQixDQUFDLGlCQUFpQjt3QkFDdEMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQjs0QkFDL0MsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsRUFBRTs0QkFDOUUsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO3lCQUVqQzt3QkFDRCxNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsZ0JBQWdCO3dCQUNyQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZUFBZTs0QkFDOUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDLEtBQUssS0FBSzs0QkFDeEYsTUFBTTt3QkFDUixNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDekIsT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO3dCQUNyQyxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQzt3QkFDbEYsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFOzRCQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQzs0QkFDeEMsSUFBSSxPQUFPLEtBQUssU0FBUyxDQUFDLGdCQUFnQixFQUFFO2dDQUMxQyxNQUFNLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7Z0NBQzlCLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dDQUNsRixJQUFJLElBQUksSUFBSSxJQUFJO29DQUNkLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dDQUN0QixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLENBQUM7NkJBQzVEO2lDQUFNO2dDQUdMLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQ0FDbEMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO2dDQUNuQyxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztnQ0FDdkYsSUFBSSxJQUFJLElBQUksSUFBSTtvQ0FDZCxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQ0FDdEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dDQUNuQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0NBQ3BDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxxQkFBcUIsQ0FBQyxNQUFNO29DQUMvRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQzs7b0NBRXhDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0NBQzNDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsQ0FBQzs2QkFDNUQ7NEJBQ0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQzs0QkFDcEQsTUFBTSxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQzt5QkFDN0M7d0JBQ0QsTUFBTTtvQkFFUixLQUFLLGlCQUFpQixDQUFDLGlCQUFpQjt3QkFDdEMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQjs0QkFDL0MsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDLEtBQUssS0FBSzs0QkFDeEYsTUFBTTt3QkFDUixNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDekIsT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO3dCQUNyQyxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQzt3QkFDbEYsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFOzRCQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDOzRCQUV6QyxJQUFJLE9BQU8sS0FBSyxTQUFTLENBQUMsZ0JBQWdCLEVBQUU7Z0NBQzFDLE1BQU0sRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQ0FDOUIsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0NBQ2xGLElBQUksSUFBSSxJQUFJLElBQUk7b0NBQ2QsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7NkJBQ3ZCO2lDQUFNO2dDQUdMLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQ0FDbEMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO2dDQUNuQyxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztnQ0FDdkYsSUFBSSxJQUFJLElBQUksSUFBSTtvQ0FDZCxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQ0FDdEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dDQUNuQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0NBQ3BDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxxQkFBcUIsQ0FBQyxNQUFNO29DQUMvRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDOztvQ0FFekMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQ0FDM0MsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDOzZCQUM1RDs0QkFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7NEJBQ3JELE1BQU0sSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7eUJBQzdDO3dCQUNELE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxhQUFhO3dCQUVsQyxJQUFJOzRCQUNGLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDOzRCQUNyQixNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQzt5QkFDbkY7Z0NBQVM7NEJBQ1IsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7eUJBQ3ZCO3dCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFOzRCQUV4QixNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7eUJBQzdFO3dCQUNELE1BQU07b0JBR1IsS0FBSyxpQkFBaUIsQ0FBQyxzQkFBc0I7d0JBQzNDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUU7NEJBQ3BFLElBQUksV0FBVyxHQUFjLElBQUksQ0FBQzs0QkFDbEMsSUFBSSxvQkFBb0IsR0FBVyxNQUFNLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFHcEcsSUFBSSxvQkFBb0IsSUFBSSxJQUFJO2dDQUM5QixNQUFNOzRCQUlSLEtBQUssSUFBSSxVQUFVLEdBQVMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLElBQUksVUFBVSxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxVQUFVLEdBQVMsVUFBVSxDQUFDLFNBQVMsRUFBRSxFQUFFO2dDQUN0SixXQUFXLEdBQWMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQ0FDMUgsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO29DQUN2QixJQUFJLFdBQVcsR0FBZSxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUM7b0NBRzNELElBQUksV0FBVyxJQUFJLElBQUksRUFBRTt3Q0FFdkIsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLFdBQVcsQ0FBQyxJQUFJOzRDQUN0RyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO3FDQUNuRDs7d0NBQ0MsTUFBTSxVQUFVLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztvQ0FDckQsTUFBTTtpQ0FDUDs2QkFDRjt5QkFDRjs2QkFFSSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFOzRCQUN6RSxJQUFJLFdBQVcsR0FBUyxJQUFJLEVBQUUsVUFBVSxDQUFDOzRCQUN6QyxJQUFJLE9BQU8sR0FBVyxNQUFNLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFFekYsT0FBTyxXQUFXLENBQUMsU0FBUyxFQUFFO2dDQUM1QixVQUFVLEdBQUcsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dDQUNyQyxJQUFJLFdBQVcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxPQUFPLEVBQUU7b0NBQ3hDLE1BQU0sVUFBVSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7b0NBQ25ELE1BQU07aUNBQ1A7Z0NBQ0QsV0FBVyxHQUFHLFVBQVUsQ0FBQzs2QkFDMUI7eUJBQ0Y7d0JBQ0QsTUFBTTtvQkFFUixLQUFLLGlCQUFpQixDQUFDLG1CQUFtQjt3QkFDeEMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBYSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ3JELE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxpQkFBaUI7d0JBQ3RDLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO3dCQUNsRixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUU7NEJBQ2hDLEdBQUcsR0FBRyxjQUFjLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDOzRCQUN2RSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUM7NEJBQ2pDLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBR3hDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUU7Z0NBQ3hCLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQ25CLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFO29DQUNuQixNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztpQ0FDbEY7NkJBQ0Y7NEJBRUQsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7NEJBQ2xGLElBQUksSUFBSSxJQUFJLElBQUk7Z0NBQ2QsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7eUJBQ3ZCO3dCQUNELE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBQztvQkFDaEQsS0FBSyxpQkFBaUIsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDOUMsS0FBSyxpQkFBaUIsQ0FBQyx3QkFBd0I7d0JBQzdDLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNwQyxNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMscUJBQXFCO3dCQUMxQyxHQUFHOzRCQUNELGNBQWMsQ0FBQyxrQkFBa0IsQ0FDL0IsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFDbkUsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsQ0FBQzt3QkFDMUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDdEIsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLHdDQUF3QyxDQUFDLGtCQUFrQixDQUFDLENBQUM7d0JBQ2xGLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxxQkFBcUI7d0JBRzFDLElBQUksVUFBVSxHQUFjLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQzt3QkFDcEcsSUFBSSxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFOzRCQUNuRixPQUFPLENBQUMsR0FBRyxDQUFDLDZFQUE2RSxDQUFDLENBQUM7eUJBQzVGOzZCQUFNOzRCQUVMLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxpQ0FBaUMsRUFBRSxHQUFHLENBQUMsRUFBRTtnQ0FDaEUsTUFBTSxJQUFJLENBQUMsbUNBQW1DLEVBQUUsQ0FBQzs2QkFDbEQ7NEJBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQ0FBbUMsRUFBRTtnQ0FHdEQsSUFBSSw4QkFBOEIsR0FDOUIsY0FBYyxDQUFDLG9DQUFvQyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztnQ0FDN0gsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQWlCLDhCQUE4QixDQUFDLENBQUM7Z0NBRzNHLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyx3Q0FBd0MsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQ0FFdEcsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO2dDQUUzQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDOzZCQUM5RDtpQ0FBTTtnQ0FDTCxPQUFPLENBQUMsR0FBRyxDQUFDLDREQUE0RCxDQUFDLENBQUM7Z0NBQzFFLGFBQWEsQ0FBQyxtQ0FBbUMsR0FBRyxLQUFLLENBQUM7Z0NBQzFELE1BQU07NkJBQ1A7eUJBQ0Y7d0JBQ0QsTUFBTTtvQkFDUixLQUFLLGlCQUFpQixDQUFDLHlCQUF5QixDQUFDO29CQUNqRCxLQUFLLGlCQUFpQixDQUFDLHVCQUF1Qjt3QkFDNUMsR0FBRyxHQUFHLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7d0JBQ3ZFLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ3RCLE1BQU0sd0JBQXdCLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxPQUFPLENBQUMsd0NBQXdDLENBQUMsa0JBQWtCLENBQUMsQ0FBQzt3QkFDM0gsTUFBTTtvQkFFUixLQUFLLGlCQUFpQixDQUFDLGtCQUFrQjt3QkFDdkMsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRTs0QkFJMUQsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQzs0QkFDakgsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO3lCQUV2Qzt3QkFDRCxNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsZUFBZTt3QkFJcEMsTUFBTSxhQUFhLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxpQ0FBaUMsQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDekcsTUFBTTtvQkFHUixLQUFLLGlCQUFpQixDQUFDLFNBQVMsQ0FBQztvQkFDakMsS0FBSyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQztvQkFDM0MsS0FBSyxpQkFBaUIsQ0FBQyxlQUFlO3dCQUdwQyxJQUFJLENBQUMsVUFBVSxLQUFLLGlCQUFpQixDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDOzRCQUM5RixDQUFDLFVBQVUsS0FBSyxpQkFBaUIsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxFQUFFOzRCQUkvRSxJQUFJLGVBQWUsR0FBUyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzs0QkFDN0UsSUFBSSxXQUFXLEdBQWMsa0JBQWtCLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLENBQUM7NEJBQ3pHLElBQUksV0FBVyxJQUFJLElBQUk7Z0NBQ3JCLE1BQU0sSUFBSSxDQUFDLG9DQUFvQyxDQUFDLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDOzRCQUVyRyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFO2dDQUM5QixNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUM7NEJBRzlDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWU7Z0NBQy9FLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDOzRCQUVwRixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUU7Z0NBQ2hDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQ0FFakMsSUFBSSxVQUFVLEtBQUssaUJBQWlCLENBQUMsbUJBQW1CLEVBQUU7b0NBQ3hELElBQUksUUFBUSxHQUFtQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7b0NBQzlDLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRTt3Q0FDckIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDO29DQUV0QyxHQUFHLEdBQUcsTUFBTSxjQUFjLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFhLElBQUksQ0FBQyxRQUFTLENBQUMsZUFBZSxFQUFFLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7aUNBQ3ZJO3FDQUFNO29DQUNMLEdBQUcsR0FBRyxjQUFjLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBYSxJQUFJLENBQUMsUUFBUyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7aUNBQ3hLO2dDQUVELE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7Z0NBQ3hDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQ25CLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUtwQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssa0JBQWtCLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsRUFBRTtvQ0FDeEksTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7b0NBQ2xGLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRTt3Q0FFakUsTUFBTSxlQUFlLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO29DQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksV0FBVyxJQUFJLElBQUk7d0NBQ3JELE1BQU0sV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO2lDQUM5Qjs7b0NBQ0MsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7NkJBR3JGO3lCQUNGO3dCQUNELE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxnQkFBZ0I7d0JBSXJDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxHQUFHLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRTs0QkFDeEYsSUFBSSxrQkFBa0IsR0FBeUIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7NEJBQzVFLElBQUksa0JBQWtCLElBQUksSUFBSSxFQUFFO2dDQUU5QixJQUFJLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dDQUNwRSxNQUFNLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxDQUFDO2dDQUN0RCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDOzZCQUN4Qjt5QkFDRjt3QkFDRCxNQUFNO2lCQUVUO2FBQ0Y7U0FHRjtnQkFBUztZQUNSLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNuQjtJQUNILENBQUM7SUFNTyxLQUFLLENBQUMsd0JBQXdCLENBQUMsSUFBVTtRQUMvQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZUFBZTtZQUM5QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsOENBQThDLENBQUMsQ0FBQzthQUNyRTtZQUNILElBQUksTUFBTSxHQUFtQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDNUMsTUFBTSxNQUFNLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNsRDtJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsb0JBQW9CLENBQUMsSUFBVTtRQUMzQyxJQUFJLE1BQU0sR0FBbUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVDLE1BQU0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQU9PLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBVSxFQUFFLGNBQXlCO1FBQzdELElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsSUFBSSxHQUFHLEdBQW1CLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsY0FBYyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDakgsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLHdDQUF3QyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDcEcsQ0FBQztJQVNPLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsSUFBVSxFQUFFLFlBQTJCLEVBQUUsWUFBK0M7UUFDaEksSUFBSSxpQkFBaUIsR0FBMEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ3RFLG9CQUFvQixDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQztRQUl0RCxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0RCxJQUFJLEdBQUcsR0FBbUIsY0FBYyxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNyRyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0saUJBQWlCLENBQUMsT0FBTyxDQUFDLHdDQUF3QyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFN0Ysb0JBQW9CLENBQUMseUJBQXlCLEdBQUcsS0FBSyxDQUFDO0lBQ3pELENBQUM7SUFjTyxLQUFLLENBQUMsZUFBZSxDQUFDLEdBQWlCLEVBQUUsSUFBVSxFQUFFLElBQVksRUFBRSxJQUFlLEVBQUUsR0FBVyxFQUFFLGVBQXdCO1FBRy9ILElBQUksSUFBSSxDQUFDLGlCQUFpQjtZQUN4QixPQUFPO1FBRVQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUU5QixJQUFJLE9BQU8sR0FBVyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFdBQVcsQ0FBQztRQVNqRCxJQUFJLE9BQU8sS0FBSyxTQUFTLENBQUMsZUFBZSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRTtZQUN6RCxJQUFJLGVBQWUsRUFBRTtnQkFDbkIsSUFBSSxHQUFHLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFO29CQUNsRyxJQUFJLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLEVBQUU7d0JBQ3ZFLElBQUksU0FBUyxHQUFHLE1BQU0sVUFBVSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUM7d0JBQ3hGLElBQUksQ0FBQyxTQUFTLEVBQUU7NEJBQ2QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQzs0QkFDL0IsT0FBTzt5QkFDUjtxQkFDRjtpQkFDRjthQUNGO1lBRUQsSUFBSSxVQUFVLEdBQTBCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUt0RCxJQUFJLGNBQWMsQ0FBQyxXQUFXLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksU0FBUyxDQUFDLGdCQUFnQjttQkFDcEcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksU0FBUyxDQUFDLGdCQUFnQixFQUFFO2dCQUU3RCxJQUFJLE1BQU0sR0FBWSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUV2RixJQUFJLE1BQU0sRUFBRTtvQkFDVixJQUFJLGtCQUFrQixHQUFZLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsOEJBQThCLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBRTNHLElBQWUsSUFBSSxDQUFDLFFBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksa0JBQWtCLEVBQUU7d0JBQ2xFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ3RDO2lCQUNGO2FBQ0Y7WUFFRCxJQUFJLGVBQWUsRUFBRTtnQkFHbkIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLElBQUksR0FBRyxDQUFDLGdCQUFnQixFQUFFLEVBQUU7b0JBQzNGLE1BQU0sYUFBYSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBaUIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLFlBQVksRUFBRSxpQ0FBaUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDeEk7YUFDRjtZQUVELE1BQU0sYUFBYSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztTQUN4RTthQUVJO1lBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7WUFHekMsSUFBSSxrQkFBa0IsR0FBYyxrQkFBa0IsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQy9FLElBQUksa0JBQWtCLEtBQUssSUFBSSxFQUFFO2dCQUMvQixrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2FBQzVFO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDakIsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQ2xGLE1BQU0sSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQy9DO1NBQ0Y7UUFJRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUU7WUFDZCxNQUFNLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFHdkYsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRTNDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDakMsQ0FBQztJQVVPLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBaUIsRUFBRSxJQUFVLEVBQUUsSUFBWSxFQUFFLEdBQVcsRUFBRSxVQUFpQztRQUcvSCxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksVUFBVSxLQUFLLHFCQUFxQixDQUFDLE1BQU07WUFDM0QsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUxQixJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7WUFFakIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxJQUFJO2dCQUNuQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUUxQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1NBQzNDO0lBQ0gsQ0FBQztJQVdPLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxJQUFVLEVBQUUsRUFBWSxFQUFFLEdBQVcsRUFBRSxvQkFBNkI7UUFDcEcsSUFBSSxjQUF5QixDQUFDO1FBQzlCLElBQUksTUFBTSxHQUFtQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUMsSUFBSSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3pFLElBQUksVUFBaUMsQ0FBQztRQUN0QyxJQUFJLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDcEUsY0FBYyxHQUFjLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3JELElBQUksY0FBYyxLQUFLLElBQUk7Z0JBQ3pCLE1BQU0sSUFBSSxDQUFDLG9DQUFvQyxDQUFDLGNBQWMsRUFBRSxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3hHLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRTtnQkFDaEMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFHM0IsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNoQixHQUFHLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUUxQyxJQUFJLFVBQVUsS0FBSyxxQkFBcUIsQ0FBQyxNQUFNO29CQUM3QyxHQUFHLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUc3QixJQUFJLEdBQUcsQ0FBQyxRQUFRLElBQUksTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLENBQUMsRUFBRTtvQkFDckYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQkFDekMsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7b0JBRWxGLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTt3QkFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUU7NEJBQ3JCLE1BQU0sRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7NEJBQzdCLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQzNCO3dCQUVELEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDaEIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDeEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUM3QixNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQzt3QkFDbEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUM1QixPQUFPLElBQUksQ0FBQztxQkFDYjtpQkFDRjtnQkFLRCxHQUFHLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRTdCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBRXpDLElBQUksaUJBQWlCLEdBQVksb0JBQW9CLENBQUM7Z0JBRXRELElBQUksQ0FBQyxpQkFBaUIsRUFBRTtvQkFDdEIsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxFQUFFO3dCQUN6RyxJQUFJLFNBQVMsR0FBWSxNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO3dCQUNqRyxJQUFJLENBQUMsU0FBUyxFQUFFOzRCQUNkLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs0QkFDaEIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQzs0QkFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzs0QkFDekMsSUFBSSxjQUFjLEtBQUssSUFBSTtnQ0FDekIsTUFBTSxJQUFJLENBQUMsb0NBQW9DLENBQUMsY0FBYyxFQUFFLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLENBQUM7NEJBRXhHLElBQUksZ0JBQWdCLEVBQUU7Z0NBQ3BCLElBQUksTUFBTSxHQUFtQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0NBQzVDLE1BQU0sTUFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7NkJBQ2xEOzRCQUVELE9BQU8sSUFBSSxDQUFDO3lCQUNiO3FCQUNGO2lCQUNGO2dCQUVELE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUNsRixHQUFHLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRTlCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUU7d0JBQ3JCLE1BQU0sRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7d0JBQzdCLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQzNCO29CQUVELEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDaEIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDeEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUM3QixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO29CQUN6QyxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztvQkFDbEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUU1QixPQUFPLElBQUksQ0FBQztpQkFDYjtnQkFJRCxJQUFJLFVBQVUsS0FBSyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUU7b0JBQy9DLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDaEIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDekI7Z0JBRUQsSUFBSSxVQUFVLEdBQVcsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUV6QyxJQUFJO29CQVlGLElBQUksR0FBRyxLQUFLLFVBQVU7d0JBQ3BCLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBSTFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO3dCQUNwQixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUN0Qzt3QkFBUztvQkFFUixJQUFJLEdBQUcsS0FBSyxVQUFVLEVBQUU7d0JBQ3RCLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7d0JBQy9DLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7NEJBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7cUJBQzVDO29CQUdELElBQUksb0JBQW9CO3dCQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2lCQUM1QzthQUNGO1NBQ0Y7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFNTyxLQUFLLENBQUMsbUJBQW1CLENBQUMsR0FBaUI7UUFDakQsSUFBSSxJQUFJLEdBQWUsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JDLElBQUksSUFBSSxHQUFtQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUMsSUFBSSxFQUFFLEdBQXVCLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDM0MsSUFBSSxVQUFVLEdBQVcsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQy9DLElBQUksR0FBRyxHQUFtQixJQUFJLENBQUM7UUFFL0IsSUFBSSxVQUFVLEtBQUssaUJBQWlCLENBQUMsd0JBQXdCO1lBQzNELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7UUFFcEMsSUFBSSxVQUFVLEtBQUssaUJBQWlCLENBQUMsc0JBQXNCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDakwsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQzdFO2FBQU07WUFDTCxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztZQUM3RSxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUU7Z0JBQ2hDLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2FBQ25GO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRTtnQkFDekUsSUFBSSxVQUFVLEtBQUssaUJBQWlCLENBQUMsd0JBQXdCLEVBQUU7b0JBQzdELElBQUksVUFBVSxHQUFXLENBQUMsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsRUFBRTt3QkFDekIsSUFBSSxHQUFHLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFOzRCQUMxRCxVQUFVLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7eUJBQ3pDO3dCQUNELEdBQUcsR0FBRyxjQUFjLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO3FCQUMvRzt5QkFBTTt3QkFDTCxJQUFJLElBQUksQ0FBQyxhQUFhOzRCQUNwQixVQUFVLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7d0JBRTFDLElBQUksYUFBYSxHQUFZLElBQUksQ0FBQzt3QkFDbEMsSUFBSSxVQUFVLEtBQUssaUJBQWlCLENBQUMsd0JBQXdCLElBQUksR0FBRyxDQUFDLFVBQVUsRUFBRSxLQUFLLElBQUksSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFOzRCQUM5SCxJQUFJLGFBQXFCLENBQUM7NEJBQzFCLGFBQWEsR0FBRyxNQUFNLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFDbkYsYUFBYSxHQUFHLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLElBQUksYUFBYSxLQUFLLEdBQUcsQ0FBQyxDQUFDO3lCQUM3RTt3QkFFRCxJQUFJLGFBQWE7NEJBQ2YsR0FBRyxHQUFHLE1BQU0sY0FBYyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7cUJBQ3JJO2lCQUNGO3FCQUVJO29CQUNILElBQUksRUFBVSxDQUFDO29CQUVmLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUk7d0JBQ3pCLEVBQUUsR0FBRyxDQUFDLENBQUM7eUJBQ0osSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFO3dCQUNwQyxFQUFFLEdBQUcsQ0FBWSxJQUFJLENBQUMsUUFBUyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7O3dCQUV0RCxFQUFFLEdBQWMsSUFBSSxDQUFDLFFBQVMsQ0FBQyxXQUFXLENBQVksSUFBSSxDQUFDLFFBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUUvRixHQUFHLEdBQUcsY0FBYyxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUN6RjtnQkFHRCxJQUFJLFVBQVUsS0FBSyxpQkFBaUIsQ0FBQyx3QkFBd0I7b0JBRTNELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFFbkMsSUFBSSxHQUFHLEtBQUssSUFBSTtvQkFDZCxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUUxQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO2dCQUVuQyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFO29CQUV6RSxJQUFJLFVBQVUsS0FBSyxpQkFBaUIsQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRTt3QkFDbkYsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDbkIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUU7NEJBQ25CLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDcEMsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7eUJBQ2xGO3FCQUNGO29CQUdELElBQUksVUFBVSxLQUFLLGlCQUFpQixDQUFDLHdCQUF3QixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFO3dCQUN0SSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZ0JBQWdCLEVBQUU7NEJBQ2pELElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7NEJBQ3pDLENBQVksSUFBSSxDQUFDLFFBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO3lCQUN0RDt3QkFDRCxNQUFNLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQy9CO3lCQUFNLElBQUksVUFBVSxLQUFLLGlCQUFpQixDQUFDLHdCQUF3QixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFO3dCQUM3SSxNQUFNLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQy9CO29CQUtELE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29CQUNsRixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBRTt3QkFDbkUsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDOzRCQUN0SSxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztxQkFDckY7aUJBQ0Y7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQU9PLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBVTtRQUNyQyxJQUFJLEdBQW1CLENBQUM7UUFDeEIsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFekIsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM5QixNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNwRixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUU7WUFDaEMsR0FBRyxHQUFHLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNoRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVMsQ0FBQyxlQUFlO2dCQUMvQyxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNwRixNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQyxNQUFNLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUVyRCxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMzQztJQUNILENBQUM7SUFRTyxLQUFLLENBQUMsa0JBQWtCLENBQUMsR0FBaUIsRUFBRSxRQUFpQjtRQUNuRSxJQUFJLElBQUksR0FBZSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsSUFBSSxFQUFZLENBQUM7UUFDakIsSUFBSSxHQUFHLEdBQVcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksSUFBZSxDQUFDO1FBQ3BCLElBQUksV0FBVyxHQUFZLEtBQUssQ0FBQztRQUNqQyxJQUFJLGVBQWUsR0FBWSxLQUFLLENBQUM7UUFDckMsSUFBSSxXQUFvQixDQUFDO1FBRXpCLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxHQUFHLENBQUMsZUFBZSxFQUFFLEtBQUssaUJBQWlCLENBQUMsaUJBQWlCLElBQUksR0FBRyxDQUFDLGVBQWUsRUFBRSxLQUFLLGlCQUFpQixDQUFDLGtCQUFrQjtZQUN4SixPQUFPO1FBRVQsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssY0FBYyxDQUFDLG1CQUFtQixFQUFFO1lBQ3hELEVBQUUsR0FBYSxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQzdCLEdBQUcsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdEIsSUFBSSxHQUFjLEdBQUcsQ0FBQyxPQUFPLENBQUM7WUFFOUIsUUFBUSxHQUFHLENBQUMsZUFBZSxFQUFFLEVBQUU7Z0JBQzdCLEtBQUssaUJBQWlCLENBQUMsaUJBQWlCO29CQUN0QyxJQUFJLFFBQVEsRUFBRTt3QkFFWixJQUFJLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixFQUFFOzRCQUNuQyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO3dCQUN4QyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO3dCQUN4RSxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztxQkFDMUI7b0JBQ0QsTUFBTTtnQkFFUixLQUFLLGlCQUFpQixDQUFDLGlCQUFpQjtvQkFDdEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUUvQixJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxFQUFFO3dCQUNqQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ25DLE9BQU87cUJBQ1I7b0JBR0QsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztvQkFFbkMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO3dCQUd2QixJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxxQkFBcUIsQ0FBQyxNQUFNOzRCQUNoRCxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBR2xCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRTs0QkFDcEQsSUFBSSxJQUFJLEdBQWMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7NEJBQ2xELElBQUksSUFBSSxLQUFLLElBQUk7Z0NBQ2YsSUFBSSxHQUFjLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDOzRCQUU3QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQzdCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFJaEMsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO2dDQUVoQixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dDQUUzQyxJQUFJLFlBQVksR0FBWSxJQUFJLENBQUMsWUFBWSxDQUFDO2dDQUM5QyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQ0FDMUIsTUFBTSxJQUFJLENBQUMsb0NBQW9DLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0NBQzVGLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDOzZCQUNsQzs0QkFJRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQzdCO3dCQUNELE9BQU87cUJBQ1I7eUJBQU07d0JBR0wsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ3ZDO29CQUVELElBQUksR0FBRyxJQUFJLElBQUksRUFBRTt3QkFDZixXQUFXLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQzt3QkFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksR0FBRyxDQUFDLG1CQUFtQixFQUFFLEVBQUU7NEJBQzVDLElBQUksQ0FBQyxPQUFPLEVBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQzs0QkFDM0MsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO3lCQUNqQzt3QkFDRCxlQUFlLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUsscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBRW5FLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQVdoRixJQUFJLGVBQWUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQjs0QkFDbEUsQ0FBQyxlQUFlLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLEVBQUU7NEJBQzVFLEdBQUcsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7NEJBQzFDLE1BQU0sRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7NEJBQzdCLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBRXBCLElBQUksV0FBVyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsZUFBZSxFQUFFO2dDQUMvRCxJQUFJLEdBQUcsQ0FBQyxZQUFZLEVBQUU7b0NBQ3BCLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRTtvQ0FFakUsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7b0NBQ3BELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsQ0FBQztvQ0FDcEUsTUFBZSxJQUFJLENBQUMsT0FBTyxFQUFHLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2lDQUNoRjs2QkFHRjt5QkFDRjt3QkFLRCxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQzs0QkFFeEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFOzRCQUMxRixJQUFJLENBQUMsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQztnQ0FDckUsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQzt5QkFDdkQ7d0JBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRTs0QkFHckYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxxQkFBcUIsQ0FBQyxNQUFNO2dDQUNqRCxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxDQUFDLGdCQUFnQixDQUFDO2dDQUM5QyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUsscUJBQXFCLENBQUMsTUFBTTtnQ0FDOUMsSUFBSSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDO29DQUM1RCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQzt5QkFDNUM7cUJBQ0Y7b0JBQ0QsTUFBTTtnQkFFUixLQUFLLGlCQUFpQixDQUFDLGtCQUFrQjtvQkFDdkMsSUFBSSxRQUFRLEVBQUU7d0JBTVosSUFBSSxNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLEtBQUssa0JBQWtCLENBQUMscUJBQXFCLEVBQUUsRUFBRTs0QkFFbEYsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7NEJBRXRCLElBQUksSUFBSSxDQUFDLDJCQUEyQixFQUFFO2dDQUNwQyxNQUFjLElBQUksQ0FBQyxRQUFRLEVBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQzs0QkFJakQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUU3QixrQkFBa0IsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDOzRCQUl0RCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7NEJBRTVELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFFaEMsU0FBUyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7NEJBQzlCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO3lCQUMzQjs2QkFBTTs0QkFDTCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQzs0QkFDMUIsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7eUJBQ2hFO3FCQUNGO29CQUVELE1BQU07Z0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7b0JBRXZDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRTt3QkFFaEMsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUU7NEJBQzFCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO3lCQUM1Qjt3QkFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGdCQUFnQjs0QkFDOUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUVwRSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7NEJBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDbEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7cUJBRXhFO29CQUVELElBQUksUUFBUSxFQUFFO3dCQUNaLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUU7NEJBRy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDOzRCQUN0QixPQUFPO3lCQUNSO3dCQUtELElBQUksR0FBRyxHQUFpQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ3hDLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGNBQWMsQ0FBQzs0QkFDN0QsTUFBTSxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBRTVCLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7d0JBQzNDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDL0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQzt3QkFDakMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQzs0QkFDaEUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDckYsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7d0JBQzdCLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzt3QkFFckQsSUFBSSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLHVCQUF1QixDQUFDOzRCQUNoRSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztxQkFDMUM7b0JBQ0QsTUFBTTtnQkFFUixLQUFLLGlCQUFpQixDQUFDLGtCQUFrQjtvQkFDdkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ3pDLE1BQU07Z0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7b0JBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUN6QyxNQUFNO2dCQUdSLEtBQUssaUJBQWlCLENBQUMscUJBQXFCO29CQUMxQyxJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTt3QkFDdEMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7NEJBQ3JDLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYTs0QkFDekIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQzFCLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO3dCQUVqQyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7NEJBQ3ZCLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO3FCQUMxQztvQkFDRCxNQUFNO2dCQUdSLEtBQUssaUJBQWlCLENBQUMsNEJBQTRCO29CQUVqRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFO3dCQUNqQyxDQUFDLElBQUksQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDOzt3QkFFeEIsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBR3ZELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTt3QkFDdkIsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3pDLE1BQU07Z0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyx5QkFBeUI7b0JBQzlDLElBQUksY0FBYyxHQUFhLE1BQU0sR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7b0JBQ3pILE1BQWtCLElBQUssQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7b0JBQ3JGLE1BQU07YUFFVDtTQUNGO0lBQ0gsQ0FBQztJQU9ELEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxJQUFjLEVBQUUsU0FBaUI7UUFDOUQsSUFBSSxLQUFLLEdBQWlCLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELElBQUksV0FBVyxHQUFZLENBQUMsU0FBUyxLQUFLLGlCQUFpQixDQUFDLFdBQVcsSUFBSSxTQUFTLEtBQUssaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFekgsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU3QixJQUFJLFdBQVc7WUFDYixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1FBRW5DLElBQUk7WUFDRixLQUFLLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM3QixLQUFLLENBQUMsT0FBTyxDQUFZLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7WUFDbkQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3RDO2dCQUFTO1lBQ1IsSUFBSSxXQUFXO2dCQUNiLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7U0FDckM7SUFDSCxDQUFDO0lBUUQsS0FBSyxDQUFDLDBDQUEwQyxDQUFDLElBQWMsRUFBRSxTQUFpQixFQUFFLFlBQTBCO1FBQzVHLElBQUksY0FBYyxHQUF5QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNwRSxJQUFJLEtBQW1CLENBQUM7UUFFeEIsSUFBSSxTQUFTLEdBQUcsaUJBQWlCLENBQUMsY0FBYyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLFlBQVksS0FBSyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7WUFDM0osT0FBTztRQUVULElBQUksY0FBYyxLQUFLLElBQUk7WUFDekIsTUFBTSxJQUFJLENBQUMsZ0NBQWdDLENBQUMsY0FBYyxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQzthQUVsRjtZQUNILElBQUksU0FBUyxLQUFLLGlCQUFpQixDQUFDLGNBQWM7Z0JBQ2hELE1BQU0sSUFBSSxDQUFDLDBDQUEwQyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUNySDtnQkFDSCxLQUFLLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9CLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzdCLEtBQUssQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3BDLElBQUksaUJBQWlCLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztvQkFDM0MsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQzs7b0JBRXJDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNuQztTQUNGO0lBQ0gsQ0FBQztJQVFPLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFlLEVBQUUsU0FBaUIsRUFBRSxZQUEwQjtRQUMzRyxJQUFJLEtBQW1CLENBQUM7UUFFeEIsSUFBSSxTQUFTLEtBQUssaUJBQWlCLENBQUMsY0FBYztZQUNoRCxNQUFNLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUMzRztZQUNILEtBQUssR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQixLQUFLLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdCLEtBQUssQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7WUFLcEMsSUFBSSxTQUFTLEtBQUssaUJBQWlCLENBQUMsc0JBQXNCO2dCQUN4RCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFaEMsSUFBSSxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDO2dCQUMzQyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDOztnQkFFckMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25DO0lBQ0gsQ0FBQztJQUtELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUtELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUtELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSTtZQUN6QixPQUFPLElBQUksQ0FBQztRQUNkLE9BQWEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBSUQsZ0JBQWdCLENBQUMsSUFBYSxFQUFFLDBCQUF3RDtRQUN0RixJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUN4QixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7O1lBRTlCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBS08sa0JBQWtCLENBQUMsSUFBYTtRQUN0QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFLTyxrQkFBa0IsQ0FBQyxJQUFhLEVBQUUsMEJBQXNEO1FBQzlGLElBQUksSUFBSTtZQUNOLElBQUksMEJBQTBCLElBQUksMEJBQTBCLENBQUMsR0FBRztnQkFDOUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDdkIsSUFBRywwQkFBMEIsSUFBSSwwQkFBMEIsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3ZFLElBQUksTUFBTSxHQUFHLElBQUksSUFBSSxFQUFnQixDQUFDO2dCQUN0QyxJQUFJLEtBQW1CLENBQUM7Z0JBQ3hCLElBQUksQ0FBUyxDQUFDO2dCQUtkLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUNuQyxLQUFLLEdBQWlCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQy9DLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxFQUFFO3dCQUN4QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7d0JBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ3BCO2lCQUNGO2dCQUVELEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7b0JBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM3QztRQUNILElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFLRCxvQkFBb0IsQ0FBQyxJQUFlO1FBQ2xDLElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSTtZQUNuRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0lBQ25DLENBQUM7SUFPTyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQVUsRUFBRSxVQUFtQjtRQUN0RCxJQUFJLEVBQUUsR0FBdUIsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUUzQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBR3pDLE1BQWUsSUFBSSxDQUFDLE9BQU8sRUFBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBSzVDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxFQUFFO1lBQ3BDLElBQUksRUFBRSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFHM0IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLHFCQUFxQixDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDL0UsSUFBSSxJQUFJLEdBQXlCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUMxRCxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztvQkFDbEYsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTt3QkFDOUIsSUFBSSxJQUFJLEtBQUssSUFBSTs0QkFDZixNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7NEJBRTNDLE1BQU0sSUFBSSxDQUFDLG9DQUFvQyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2lCQUNqRzthQUNGO2lCQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUNoQyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDNUU7YUFBTTtZQUNMLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNDLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQ25GO0lBQ0gsQ0FBQztJQVFPLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBVTtRQUN0QyxJQUFJLE9BQWdCLENBQUM7UUFDckIsSUFBSSxNQUFjLENBQUM7UUFDbkIsSUFBSSxHQUFXLENBQUM7UUFFaEIsSUFBSSxJQUFJLElBQUksSUFBSTtZQUNkLE9BQU8sS0FBSyxDQUFDO1FBRWYsT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQzlELEdBQUcsR0FBRyxNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFDbkUsTUFBTSxDQUFDLG9CQUFvQixHQUFHLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQ3BFLElBQUksR0FBRyxLQUFLLE1BQU0sQ0FBQyxpQkFBaUI7Z0JBQ2xDLE1BQU0sR0FBRyxHQUFHLENBQUM7aUJBRVYsSUFBSSxHQUFHLEtBQUssTUFBTSxDQUFDLGdCQUFnQjtnQkFDdEMsTUFBTSxHQUFHLEdBQUcsQ0FBQzs7Z0JBR2IsTUFBTSxHQUFHLEdBQUcsQ0FBQztTQUNoQjs7WUFDQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBRWYsUUFBUSxNQUFNLEVBQUU7WUFDZCxLQUFLLEdBQUc7Z0JBQ04sTUFBTTtZQUVSLEtBQUssR0FBRztnQkFDTixNQUFlLElBQUksQ0FBQyxPQUFPLEVBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN4RCxNQUFlLElBQUksQ0FBQyxPQUFPLEVBQUcsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQy9FLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO2dCQUM1QixPQUFPLEtBQUssQ0FBQztZQUVmLEtBQUssR0FBRztnQkFDTixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7Z0JBQ3RFLE1BQU0sWUFBWSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVFLE9BQU8sS0FBSyxDQUFDO1lBRWY7Z0JBQ0UsTUFBTSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyx5RUFBeUU7b0JBQ2xILE9BQU8sQ0FBQyxDQUFDO2dCQUNYLE1BQU07U0FDVDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUtELGlCQUFpQixDQUFDLGdCQUFrQztRQUNsRCxJQUFJLENBQUMsZUFBZSxHQUFHLGdCQUFnQixDQUFDO0lBQzFDLENBQUM7SUFLRCxZQUFZLENBQUMsVUFBbUI7UUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUtELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUtELGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBS0QsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7SUFNRCxXQUFXLENBQUMsS0FBbUI7UUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUtELFVBQVU7UUFDUixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQztZQUM5QixPQUFPLElBQUksQ0FBQztRQUNkLE9BQXFCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUtELHNDQUFzQztRQUVwQyxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQ3RDLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFLElBQUksSUFBSSxFQUN6QztZQUNFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBRTFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzFELFdBQVcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLHdCQUF3QixFQUFFLElBQUksQ0FBQyxTQUFTLENBQVEsS0FBSyxDQUFDLE9BQU8sRUFBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztZQUV2SCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ3BDLElBQUksR0FBRyxHQUFrQixJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUM3QyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQyxXQUFXLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyx5QkFBeUIsRUFBRyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzthQUNoRjtTQUNGO0lBQ0gsQ0FBQztJQUtELDBDQUEwQztRQUd4QyxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBRXRDLElBQUksY0FBYyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFMUUsSUFBSSxjQUFjLEtBQUssR0FBRyxFQUFFO1lBQzFCLElBQUksb0JBQW9CLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsd0JBQXdCLENBQUMsQ0FBQztZQUN4RixJQUFJLGVBQWUsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBR3BGLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQzlDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBR2hELElBQUksT0FBTyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3BHLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztZQUNoQixJQUFJLGVBQWUsSUFBSSxJQUFJLEVBQUU7Z0JBQzNCLElBQUksR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUN6QztZQUVELGFBQWEsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzlEO0lBQ0gsQ0FBQztJQUtELHNCQUFzQjtRQUNsQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNwQyxDQUFDO0lBS0Qsc0JBQXNCLENBQUUsS0FBa0I7UUFDeEMsSUFBSSxLQUFLLElBQUksSUFBSTtZQUNmLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7O1lBRWhDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUlELGNBQWM7UUFDWixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQztZQUM5QixPQUFPLElBQUksQ0FBQztRQUNkLE9BQXFCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQU1ELHFCQUFxQixDQUFDLEdBQVk7UUFDaEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztJQUNqQyxDQUFDO0lBS0Qsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7SUFXRCxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQWMsRUFBRSxHQUFXO1FBQy9DLElBQUksR0FBbUIsQ0FBQztRQUV4QixJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFFbkIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLElBQUk7Z0JBQ0YsR0FBRyxHQUFHLGNBQWMsQ0FBQyw4QkFBOEIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ25FLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMxQixNQUFNLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyx3Q0FBd0MsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2FBQ2xIO29CQUFTO2dCQUNSLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNuQztTQUNGO0lBQ0gsQ0FBQztJQUtELGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLFdBQVcsS0FBSyxVQUFVLENBQUMsS0FBSyxDQUFDO0lBQy9DLENBQUM7SUFLRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO0lBQ3RDLENBQUM7SUFLRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO0lBQ3JDLENBQUM7SUFNRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFNTSxpQkFBaUIsQ0FBRyxLQUFtQjtRQUU1QyxJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUM7UUFFcEIsSUFBSSxLQUFLLElBQUksSUFBSTtZQUNmLE9BQU8sR0FBRyxDQUFDO1FBS2IsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO1lBRWIsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQztnQkFDekIsR0FBRyxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztpQkFHckIsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxTQUFTLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDO2dCQUM5RyxHQUFHLEdBQUcsaUJBQWlCLENBQUMsb0JBQW9CLENBQUM7U0FDaEQ7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZixDQUFDO0lBTUQsWUFBWTtRQUNWLE9BQXVCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQVFELGFBQWEsQ0FBQyxNQUFjLEVBQUUsU0FBaUIsRUFBRSxPQUFlO1FBQzdDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JILENBQUM7SUFPRCxZQUFZO1FBQ1YsT0FBd0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBT0QsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQU1ELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFRRCxtQkFBbUIsQ0FBQyxNQUFjLEVBQUUsU0FBaUIsRUFBRSxPQUFlO1FBQ3BFLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLLElBQUksRUFBRTtZQUN6QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLGNBQWMsRUFBRSxDQUFDLENBQUM7U0FDbEQ7UUFFZ0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFLRCxvQkFBb0I7UUFDbEIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUN4RDtJQUNILENBQUM7SUFNRCxzQkFBc0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssSUFBSTtZQUN0QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDN0QsQ0FBQztJQWNELGNBQWMsQ0FBQyxJQUFlLEVBQUUsY0FBdUI7UUFDckQsSUFBSSx1QkFBdUIsR0FBd0IsSUFBSSxDQUFDO1FBQ3hELElBQUksV0FBVyxHQUFXLENBQUMsQ0FBQyxDQUFDO1FBSTdCLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQWtCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUczSSxJQUFxQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFHLENBQUMsSUFBSSxFQUFFLEdBQW9CLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFHLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBRzNHLElBQUksa0JBQWtCLEdBQW1CLElBQUksY0FBYyxDQUFpQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDMUcsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsR0FBb0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDbEYsdUJBQXVCLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxFQUFFLENBQUM7aUJBQ3BEO2dCQU1ELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLHVCQUF1QixDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksdUJBQXVCLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRTtvQkFDbk8sV0FBVyxHQUFHLHVCQUF1QixDQUFDLE9BQU8sQ0FBQztvQkFNOUMsSUFBSSxjQUFjLElBQXFCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBc0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUU7d0JBQ2xILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztxQkFDeEQ7aUJBQ0Y7O29CQUNDLFdBQVcsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDO2FBQ3hDO2lCQUFNO2dCQUNMLFdBQVcsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDO2FBQ3RDO1NBQ0Y7UUFDRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBTUQsMkJBQTJCLENBQUMsMEJBQW1DO1FBQzdELElBQUksQ0FBQyx5QkFBeUIsR0FBRywwQkFBMEIsQ0FBQztJQUM5RCxDQUFDO0lBTUQsMkJBQTJCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUFDO0lBQ3hDLENBQUM7SUFNRCxjQUFjLENBQUMsV0FBOEI7UUFDM0MsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7SUFDbEMsQ0FBQztJQU1ELDRCQUE0QixDQUFDLFdBQW9CO1FBQy9DLElBQUksV0FBVztZQUViLElBQUksQ0FBQyxZQUFZLEdBQUcsaUJBQWlCLENBQUMsZUFBZSxDQUFDOztZQUl0RCxJQUFJLENBQUMsWUFBWSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQztJQUMvQyxDQUFDO0lBTUQsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBTUQsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksS0FBSyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7SUFDdEQsQ0FBQztJQU9PLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFlLEVBQUUsR0FBVztRQUV6RCxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RDLE9BQU87UUFFVCxRQUFRLEdBQUcsRUFBRTtZQUNYLEtBQUssaUJBQWlCLENBQUMsa0JBQWtCLENBQUM7WUFDMUMsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQztZQUMxQyxLQUFLLGlCQUFpQixDQUFDLGdCQUFnQjtnQkFDckMsTUFBTTtZQUVSO2dCQUNFLE9BQU87U0FDVjtRQUVELElBQUksS0FBbUIsQ0FBQztRQUN4QixLQUFLLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsS0FBSyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQU1PLFVBQVUsQ0FBQyxHQUFXO1FBQzVCLElBQUksT0FBTyxHQUFZLElBQUksQ0FBQztRQUM1QixRQUFRLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRTtZQUM3QixLQUFLLGlCQUFpQixDQUFDLEdBQUc7Z0JBQ3hCLE9BQU8sR0FBRyxJQUFJLENBQUM7Z0JBQ2YsTUFBTTtZQUVSLEtBQUssaUJBQWlCLENBQUMsSUFBSTtnQkFHekIsT0FBTyxHQUFHLENBQUMsR0FBRyxLQUFLLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUNyRCxNQUFNO1lBR1IsS0FBSyxpQkFBaUIsQ0FBQyxlQUFlO2dCQUVwQyxRQUFRLEdBQUcsRUFBRTtvQkFDWCxLQUFLLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDO29CQUMxQyxLQUFLLGlCQUFpQixDQUFDLFdBQVcsQ0FBQztvQkFDbkMsS0FBSyxpQkFBaUIsQ0FBQyxZQUFZLENBQUM7b0JBQ3BDLEtBQUssaUJBQWlCLENBQUMsY0FBYyxDQUFDO29CQUN0QyxLQUFLLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDO29CQUM1QyxLQUFLLGlCQUFpQixDQUFDLGVBQWU7d0JBQ3BDLE9BQU8sR0FBRyxJQUFJLENBQUM7d0JBQ2YsTUFBTTtvQkFFUjt3QkFDRSxPQUFPLEdBQUcsS0FBSyxDQUFDO3dCQUNoQixNQUFNO2lCQUNUO2dCQUNELE1BQU07U0FDVDtRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFPTyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQVUsRUFBRSxnQkFBeUI7UUFDOUQsSUFBSSxFQUFFLEdBQXVCLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDM0MsSUFBSSxHQUFHLEdBQVcsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWxDLElBQUksV0FBVyxHQUFZLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0YsSUFBSSxnQkFBZ0IsR0FBWSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9GLElBQUksUUFBUSxHQUFZLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QyxJQUFJLGVBQWUsR0FBWSxJQUFJLENBQUM7UUFDcEMsSUFBSSxXQUFXLEdBQVksR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUV4QyxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMxQixNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM3SCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUk5RCxJQUFJO2dCQUNGLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzdCLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7YUFDekU7b0JBQVM7Z0JBQ1IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzdCO1NBQ0Y7YUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3pCO1lBQ0gsSUFBSSxXQUFXO2dCQUNiLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFNM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjO2dCQUN0QixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUUzQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbkIsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBS3BCLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFFBQVEsRUFBRTtvQkFHWixFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3BCLGVBQWUsR0FBRyxLQUFLLENBQUM7b0JBQ3hCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDaEIsTUFBZSxJQUFJLENBQUMsT0FBTyxFQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDeEQsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3ZDO3FCQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFO29CQUMvQixNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQzs7b0JBRW5ELEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUNyQjs7Z0JBUUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxlQUFlO1lBQ2pCLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBS0QsZ0JBQWdCLENBQUMsT0FBWTtRQUMzQixJQUFJLElBQUksR0FBUyxPQUFPLENBQUM7UUFDekIsSUFBSSxLQUFLLEdBQWlCLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV2RCxLQUFLLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDL0QsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLEtBQUssQ0FBQyxPQUFPLENBQVksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFNTyxNQUFNLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLElBQVU7UUFFcEQsSUFBSSxVQUFVLEdBQWUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzlDLElBQUksUUFBUSxHQUFhLFVBQVUsQ0FBQyxRQUFRLENBQUM7UUFDN0MsSUFBSSxTQUFTLEdBQVcsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRzlDLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLElBQUksSUFBSSxJQUFJLFNBQVMsQ0FBQyxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLEVBQUU7WUFDNUYsU0FBUyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoRCxNQUFNLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ3hDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUIsSUFBSSxrQ0FBa0MsR0FBbUIsY0FBYyxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ2hLLE1BQU0sVUFBVSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQztTQUM5RTtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsb0JBQW9CLENBQUMsRUFBd0I7UUFDakQsSUFBSSxJQUFZLENBQUM7UUFDakIsSUFBSSxhQUFxQixDQUFDO1FBQzFCLElBQUksWUFBb0IsQ0FBQztRQUV6QixJQUFJLEVBQUUsWUFBWSxXQUFXO1lBQzNCLElBQUksR0FBaUIsRUFBRyxDQUFDLFVBQVUsRUFBRSxDQUFDOztZQUV0QyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRTdELGFBQWEsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkQsWUFBWSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVqRCxJQUFJLEVBQUUsQ0FBQyxjQUFjLEtBQUssSUFBSTtZQUM1QixNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFDLENBQUM7YUFDbkU7WUFDSCxJQUFJLENBQUMsQ0FBQyxFQUFFLFlBQVksV0FBVyxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLENBQUMsS0FBSyxFQUFFO2dCQUN2RixNQUFNLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQzNEO1NBQ0Y7UUFHRCxJQUFJLGtCQUFrQixHQUFZLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxTQUFTLEtBQUssa0JBQWtCLENBQUMsV0FBVyxDQUFDO1FBRTNHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRXhDLElBQUksYUFBYSxHQUFXLFlBQVksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRWpHLElBQUksS0FBSyxHQUFXLEVBQUUsQ0FBQztRQUN2QixJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDckM7YUFBTTtZQUdMLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUNsQyxNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDMUU7WUFDRCxJQUFJLEVBQUUsWUFBWSxXQUFXLEVBQUM7Z0JBQzVCLElBQWlCLEVBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsOEJBQThCO29CQUMzRCxFQUFHLENBQUMsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLDRCQUE0QixFQUFFO29CQUN6RSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUduRCxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7aUJBQ3pCO2FBQ0Y7U0FDRjtRQWVELElBQUksRUFBRSxZQUFZLFdBQVcsRUFBRTtZQUU3QixJQUFrQixFQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssV0FBVyxDQUFDLGlCQUFpQjtnQkFDL0MsRUFBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLFdBQVcsQ0FBQyw4QkFBOEI7Z0JBQzVELEVBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxXQUFXLENBQUMsNEJBQTRCLEVBQUU7Z0JBQzVFLGtCQUFrQixHQUFHLEtBQUssQ0FBQzthQUM1QjtTQUNGO1FBRUQsSUFBSSxrQkFBa0IsRUFBRTtZQUl0QixJQUFJO2dCQUNGLElBQUksR0FBRyxHQUFtQixjQUFjLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDL0QsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM3RCxNQUFNLHdCQUF3QixDQUFDLG9CQUFvQixFQUFFLENBQUMsT0FBTyxDQUFDLHdDQUF3QyxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDNUg7WUFBQyxPQUFPLEdBQUcsRUFBRTtnQkFDWixJQUFJLEdBQUcsWUFBWSxvQkFBb0IsRUFBRTtvQkFDdkMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDMUM7O29CQUNDLE1BQU0sR0FBRyxDQUFDO2FBQ2I7U0FDRjtRQUVELFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUdELGtCQUFrQixDQUFDLFdBQW1CO1FBQ3BDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3BFLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBR0QscUJBQXFCLENBQUMsRUFBd0I7UUFDNUMsSUFBRyxDQUFDLENBQUMsRUFBRSxZQUFZLFdBQVcsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQztRQUlkLElBQUcsQ0FBZSxFQUFHLENBQUMsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLDRCQUE0QjtZQUMxRCxFQUFHLENBQUMsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLDhCQUE4QixDQUFDO1lBQ3pFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxTQUFTLEtBQUssa0JBQWtCLENBQUMsV0FBVztZQUMxRSxPQUFPLEtBQUssQ0FBQztRQUVmLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7QUF6a0pjLHVCQUFTLEdBQVksSUFBSSxDQUFDO0FBQzFCLHNCQUFRLEdBQVcsSUFBSSxDQUFDO0FBQ3hCLDJDQUE2QixHQUFHLElBQUksQ0FBQztBQW9CckMscUNBQXVCLEdBQUcsS0FBSyxDQUFDO0FBQ2hDLGlEQUFtQyxHQUFHLEtBQUssQ0FBQztBQWtCcEQsc0JBQVEsR0FBa0IsSUFBSSxhQUFhLEVBQUUsQ0FBQztBQVE5QyxpQ0FBbUIsR0FBRyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBGb3JjZUV4aXQsXHJcbiAgSW50ZXJuYWxJbnRlcmZhY2UsXHJcbiAgTG9nZ2VyLFxyXG4gIExvZ2dlcl9Mb2dMZXZlbHMsXHJcbiAgTWdDb250cm9sVHlwZSxcclxuICBNaXNjLFxyXG4gIE1zZ0ludGVyZmFjZSxcclxuICBQcmlvcml0eSxcclxuICBSYWlzZUF0LFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RyVXRpbCxcclxuICBTdWJmb3JtVHlwZVxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQge0FwcGxpY2F0aW9uRXhjZXB0aW9uLCBJbnQzMiwgTGlzdCwgTlN0cmluZywgUmVmUGFyYW0sIFN0YWNrLCBTdHJpbmdCdWlsZGVyLCBUaHJlYWQsIGlzTnVsbE9yVW5kZWZpbmVkfSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7XHJcbiAgQ29tbWFuZHMsXHJcbiAgQ29tbWFuZFR5cGUsXHJcbiAgRGF0YU1vZGlmaWNhdGlvblR5cGVzLFxyXG4gIEV4cFZhbCxcclxuICBGb2N1c01hbmFnZXIsXHJcbiAgR3VpQ29uc3RhbnRzLFxyXG4gIEd1aUVudmlyb25tZW50LFxyXG4gIElUYXNrLFxyXG4gIEtleWJvYXJkSXRlbSxcclxuICBMYXN0Rm9jdXNlZFZhbCxcclxuICBNYW5hZ2VyLFxyXG4gIE1nQ29udHJvbEJhc2UsXHJcbiAgTWdGb3JtQmFzZSxcclxuICBNb2RpZmllcnMsXHJcbiAgUHJvcEludGVyZmFjZSxcclxuICBSdW50aW1lQ29udGV4dEJhc2UsXHJcbiAgU3R5bGVzLFxyXG4gIFRhc2tEZWZpbml0aW9uSWRcclxufSBmcm9tICdAbWFnaWMteHBhL2d1aSc7XHJcbmltcG9ydCB7RXZlbnRTdWJUeXBlfSBmcm9tICcuLi9lbnVtcyc7XHJcbmltcG9ydCB7Um9sbGJhY2tFdmVudENvbW1hbmRfUm9sbGJhY2tUeXBlfSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Sb2xsYmFja0V2ZW50Q29tbWFuZCc7XHJcbmltcG9ydCB7TWdDb250cm9sfSBmcm9tICcuLi9ndWkvTWdDb250cm9sJztcclxuaW1wb3J0IHtNZ1ByaW9yaXR5QmxvY2tpbmdRdWV1ZX0gZnJvbSAnLi4vdXRpbC9NZ1ByaW9yaXR5QmxvY2tpbmdRdWV1ZSc7XHJcbmltcG9ydCB7Q29tcE1haW5QcmdUYWJsZX0gZnJvbSAnLi4vcnQvQ29tcE1haW5QcmdUYWJsZSc7XHJcbmltcG9ydCB7RmllbGR9IGZyb20gJy4uL2RhdGEvRmllbGQnO1xyXG5pbXBvcnQge1J1blRpbWVFdmVudH0gZnJvbSAnLi9SdW5UaW1lRXZlbnQnO1xyXG5pbXBvcnQge01nRm9ybX0gZnJvbSAnLi4vZ3VpL01nRm9ybSc7XHJcbmltcG9ydCB7RXZlbnRIYW5kbGVyLCBSZXRWYWxzfSBmcm9tICcuL0V2ZW50SGFuZGxlcic7XHJcbmltcG9ydCB7Rmxvd01vbml0b3JRdWV1ZX0gZnJvbSAnLi4vdXRpbC9GbG93TW9uaXRvclF1ZXVlJztcclxuaW1wb3J0IHtHVUlNYW5hZ2VyfSBmcm9tICcuLi9HVUlNYW5hZ2VyJztcclxuaW1wb3J0IHtUYXNrfSBmcm9tICcuLi90YXNrcy9UYXNrJztcclxuaW1wb3J0IHtUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0sIFRhc2tCYXNlfSBmcm9tICcuLi90YXNrcy9UYXNrQmFzZSc7XHJcbmltcG9ydCB7QXJndW1lbnRzTGlzdH0gZnJvbSAnLi4vcnQvQXJndW1lbnRzTGlzdCc7XHJcbmltcG9ydCB7TUdEYXRhfSBmcm9tICcuLi90YXNrcy9NR0RhdGEnO1xyXG5pbXBvcnQge0hhbmRsZXJzVGFibGV9IGZyb20gJy4uL3J0L0hhbmRsZXJzVGFibGUnO1xyXG5pbXBvcnQge01HRGF0YUNvbGxlY3Rpb259IGZyb20gJy4uL3Rhc2tzL01HRGF0YUNvbGxlY3Rpb24nO1xyXG5pbXBvcnQge1JlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb259IGZyb20gJy4uL2RhdGEvUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbic7XHJcbmltcG9ydCB7Q29tbWFuZHNQcm9jZXNzb3JCYXNlLCBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9ufSBmcm9tICcuLi9Db21tYW5kc1Byb2Nlc3NvckJhc2UnO1xyXG5pbXBvcnQge0NvbW1hbmRzVGFibGV9IGZyb20gJy4uL0NvbW1hbmRzVGFibGUnO1xyXG5pbXBvcnQge0NvbW1hbmRGYWN0b3J5fSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Db21tYW5kRmFjdG9yeSc7XHJcbmltcG9ydCB7SUNsaWVudENvbW1hbmR9IGZyb20gJy4uL2NvbW1hbmRzL0lDbGllbnRDb21tYW5kJztcclxuaW1wb3J0IHtDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXJ9IGZyb20gJy4uL0NvbW1hbmRzUHJvY2Vzc29yTWFuYWdlcic7XHJcbmltcG9ydCB7T3BlcmF0aW9ufSBmcm9tICcuLi9ydC9PcGVyYXRpb24nO1xyXG5pbXBvcnQge0NsaWVudFJlZnJlc2hDb21tYW5kfSBmcm9tICcuLi9jb21tYW5kcy9TZXJ2ZXJUb0NsaWVudC9DbGllbnRSZWZyZXNoQ29tbWFuZCc7XHJcbmltcG9ydCB7UmVtb3RlQ29tbWFuZHNQcm9jZXNzb3J9IGZyb20gJy4uL3JlbW90ZS9SZW1vdGVDb21tYW5kc1Byb2Nlc3Nvcic7XHJcbmltcG9ydCB7RXhlY3V0aW9uU3RhY2t9IGZyb20gJy4uL3J0L0V4ZWN1dGlvblN0YWNrJztcclxuaW1wb3J0IHtFeGVjdXRpb25TdGFja0VudHJ5fSBmcm9tICcuLi9ydC9FeGVjdXRpb25TdGFja0VudHJ5JztcclxuaW1wb3J0IHtFdmVudEhhbmRsZXJQb3NpdGlvbn0gZnJvbSAnLi9FdmVudEhhbmRsZXJQb3NpdGlvbic7XHJcbmltcG9ydCB7RGF0YVZpZXd9IGZyb20gJy4uL2RhdGEvRGF0YVZpZXcnO1xyXG5pbXBvcnQge0V2ZW50fSBmcm9tICcuL0V2ZW50JztcclxuaW1wb3J0IHtSZWNvcmR9IGZyb20gJy4uL2RhdGEvUmVjb3JkJztcclxuaW1wb3J0IHtDb25zdEludGVyZmFjZX0gZnJvbSAnLi4vQ29uc3RJbnRlcmZhY2UnO1xyXG5pbXBvcnQge0Zsb3dNb25pdG9ySW50ZXJmYWNlfSBmcm9tICcuLi9GbG93TW9uaXRvckludGVyZmFjZSc7XHJcbmltcG9ydCB7RGF0YVZpZXdDb21tYW5kVHlwZX0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvRGF0YXZpZXdDb21tYW5kJztcclxuaW1wb3J0IHtTZXJ2ZXJFcnJvcn0gZnJvbSAnLi4vcmVtb3RlL1NlcnZlckVycm9yJztcclxuaW1wb3J0IHtFbnZpcm9ubWVudH0gZnJvbSAnLi4vZW52L0Vudmlyb25tZW50JztcclxuaW1wb3J0IHtMYXN0Rm9jdXNlZE1hbmFnZXJ9IGZyb20gJy4uL3J0L0xhc3RGb2N1c2VkTWFuYWdlcic7XHJcbmltcG9ydCB7RXZlbnRzQWxsb3dlZFR5cGUsIElFdmVudHNNYW5hZ2VyfSBmcm9tICcuL0lFdmVudHNNYW5hZ2VyJztcclxuaW1wb3J0IHtMYW5ndWFnZURhdGF9IGZyb20gJy4uL2Vudi9MYW5ndWFnZURhdGEnO1xyXG5pbXBvcnQge1N1YmplY3R9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge0NsaWVudE1hbmFnZXJ9IGZyb20gJy4uL0NsaWVudE1hbmFnZXInO1xyXG5pbXBvcnQge0NvbnRleHRUZXJtaW5hdGlvbkV2ZW50Q29tbWFuZH0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvQ29udGV4dFRlcm1pbmF0aW9uRXZlbnRDb21tYW5kJztcclxuaW1wb3J0IHsgQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24gfSBmcm9tICcuLi9BY2Nlc3NIZWxwZXInO1xyXG5cclxuXHJcbmVudW0gRXZlbnRTY29wZSB7XHJcbiAgTk9ORSA9ICcgJyxcclxuICBUUkFOUyA9ICdUJ1xyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIHRoaXMgY2xhc3MgbWFuYWdlIHRoZSBldmVudHMsIHB1dCB0aGVtIGluIGEgcXVldWUgYW5kIGhhbmRsZSB0aGVtXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBFdmVudHNNYW5hZ2VyIGltcGxlbWVudHMgSUV2ZW50c01hbmFnZXIge1xyXG4gIC8vIExPQ0FMIENPTlNUQU5UU1xyXG4gIHByaXZhdGUgc3RhdGljIFJFQUxfT05MWTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgTUFYX09QRVI6IG51bWJlciA9IDk5OTk7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgdXNlckdyYW50ZWRGb3JDb250ZXh0QWN0aXZpdHkgPSB0cnVlO1xyXG4gIHByaXZhdGUgX2V2ZW50c1F1ZXVlOiBNZ1ByaW9yaXR5QmxvY2tpbmdRdWV1ZSA9IG51bGw7IC8vIHRoZSBxdWV1ZSBvZiBldmVudHMgdG8gZXhlY3V0ZVxyXG4gIHByaXZhdGUgX2V4ZWNTdGFjazogU3RhY2s8RXhlY3V0aW9uU3RhY2s+ID0gbnVsbDsgLy8gRXhlY3V0aW9uIHN0YWNrIG9mIHJhaXNlIGV2ZW50IG9wZXJhdGlvbiBvciBjYWxscyB0byB1c2VyXHJcbiAgcHJpdmF0ZSBfcnRFdmVudHM6IFN0YWNrPFJ1blRpbWVFdmVudD4gPSBudWxsOyAvLyBBIHN0YWNrIG9mIGluLXByb2Nlc3MgcnVuLXRpbWUgZXZlbnRzICh0aGUgbGFzdCBvbmUgaXMgYXQgdGhlIHRvcCkuXHJcbiAgcHJpdmF0ZSBfc2VydmVyRXhlY1N0YWNrOiBTdGFjazxFeGVjdXRpb25TdGFjaz4gPSBudWxsOyAvLyBFeGVjdXRpb24gc3RhY2sgb2YgRXhlY3V0aW9uIHN0YWNrcyBvZiBvcGVyYXRpb25zIHRoYXRcclxuICBwcml2YXRlIF9hbGxvd0V2ZW50czogRXZlbnRzQWxsb3dlZFR5cGUgPSBFdmVudHNBbGxvd2VkVHlwZS5BTEw7XHJcbiAgcHJpdmF0ZSBfY29tcE1haW5QcmdUYWI6IENvbXBNYWluUHJnVGFibGUgPSBudWxsOyAvLyB0aGUgb3JkZXIgb2YgaGFuZGxpbmcgbWFpbiBwcm9ncmFtcyBvZiBjb21wb25lbnRzXHJcbiAgcHJpdmF0ZSBfY3VyckN0cmw6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfY3VyckZpZWxkOiBGaWVsZCA9IG51bGw7IC8vIGZvciBldmVyeSBldmVudCBleGVjdXRlZCB0aGlzIHZhcmlhYmxlIHdpbGwgY29udGFpbiB0aGUgZmllbGQgYXR0YWNoZWQgdG8gdGhlIGNvbnRyb2wgb24gd2hpY2ggdGhlIGV2ZW50IHdhcyBmaXJlZFxyXG4gIHByaXZhdGUgX2N1cnJLYmRJdGVtOiBLZXlib2FyZEl0ZW0gPSBudWxsO1xyXG4gIHByaXZhdGUgX2VuZE9mV29yazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2V2ZW50U2NvcGU6IEV2ZW50U2NvcGUgPSBFdmVudFNjb3BlLk5PTkU7IC8vIGluc3RydWN0cyBob3cgdG8gcHJvY2VzcyBldmVudHMgd2hpY2ggYXJlIHByb3BhZ2F0ZWQgdG8gc2xhdmUgdGFza3MgZHVyaW5nIGV4ZWN1dGlvbi5cclxuICBwcml2YXRlIF9mb3JjZUV4aXQ6IEZvcmNlRXhpdCA9IEZvcmNlRXhpdC5Ob25lO1xyXG4gIHByaXZhdGUgX2ZvcmNlRXhpdFRhc2s6IFRhc2sgPSBudWxsO1xyXG4gIHByaXZhdGUgX2lnbm9yZVVua25vd25BYm9ydDogYm9vbGVhbiA9IGZhbHNlOyAvLyBUUlVFIHdoZW4gJ2Fib3J0JyBjb21tYW5kcyBvbiB1bmtub3duIHRhc2tzIG1heSBhcnJpdmVcclxuICBwcml2YXRlIF9pbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlOyAvLyB1c2VkIHRvIGRldGVjdCByZS1pbml0aWFsaXphdGlvblxyXG4gIHByaXZhdGUgX2lzSGFuZGxpbmdGb3JjZUV4aXQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gaW5kaWNhdGUgd2UgYXJlIGN1cnJlbnRseSBoYW5kbGluZyBhIGZvcmNlRXhpdCByZWxhdGVkIGhhbmRsZXJcclxuICBwcml2YXRlIF9pc05vblJldmVyc2libGVFeGl0OiBib29sZWFuID0gZmFsc2U7IC8vIGlzIHRoZSBjb21tYW5kIG5vbnJldmVyc2libGVcclxuICBwcml2YXRlIF9pc0luUmVjb3JkRmx1c2hFdmVudDogYm9vbGVhbiA9IGZhbHNlOyAvLyB0cnVlIGlmIGN1cnJlbnQgYWN0IGlzIE1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRFxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBjbGllbnRJbmFjdGl2aXR5VGltZXJPTiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgc3RhdGljIGNsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZXJBYm9ydGVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBsYXN0U2F2ZWRSb3V0ZUV2ZW50OiBSdW5UaW1lRXZlbnQgPSBudWxsO1xyXG4gIC8vIHdhcyBzZW50IGZyb20gdGhlIHNlcnZlci4gd2UgbmVlZCBhIHN0YWNrIG9mIGV4ZWNzdGFja3NcclxuICAvLyBoZXJlIGJlY2F1c2Ugd2UgbWlnaHQgY2FsbCBhIG5ldyBwcm9ncmFtIGJlZm9yZSB3ZSBoYW5kbGVkXHJcbiAgLy8gdGhlIHByZXZpb3VzIHNlcnZlciBleGVjIHN0YWNrXHJcbiAgcHJpdmF0ZSBfc3RvcEV4ZWN1dGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3Byb2Nlc3NpbmdUb3BNb3N0RW5kVGFzazogYm9vbGVhbiA9IGZhbHNlOyAvLyBpbmRpY2F0aW9uIHdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBwcm9jZXNzaW5nIGV2ZW50cyBmcm9tIHRoZVxyXG4gIHByaXZhdGUgX3N0b3BFeGVjdXRpb25DdHJsOiBNZ0NvbnRyb2wgPSBudWxsOyAvLyBob2xkcyB0aGUgY3RybCBvbiB3aGljaCB3ZSBnZXQgdGhlIGZpcnN0IHN0b3AgZXhlY3V0aW9uXHJcblxyXG4gIHB1YmxpYyBndWlQZW5kaW5nRXZlbnQ6IGFueSA9IG51bGw7XHJcbiAgLy8gS0VZQk9BUkQgRVZFTlRTIENPTlNUQU5UU1xyXG4gIHJlYWRvbmx5IEtCSV9ET1dOOiBLZXlib2FyZEl0ZW0gPSBudWxsO1xyXG4gIHJlYWRvbmx5IEtCSV9VUDogS2V5Ym9hcmRJdGVtID0gbnVsbDtcclxuXHJcbiAgLy8gQ09OVEVYVCBURVJNSU5BVElPTiBXQVJOSU5HIENPTlNUQU5UU1xyXG4gIHJlYWRvbmx5IGNvbmZpcm1hdGlvbkRpYWxvZ01zZzogc3RyaW5nID0gJ1RoZSBzZXJ2ZXIgY29udGV4dCBzZXJ2aW5nIHRoaXMgYXBwbGljYXRpb24gaXMgYWJvdXQgdG8gdGltZSBvdXQuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlIHlvdXIgd29yaz8nO1xyXG4gIHJlYWRvbmx5IGNvbmZpcm1hdGlvbkRpYWxvZ1RpdGxlOiBzdHJpbmcgPSAnU2Vzc2lvbiBpcyBhYm91dCB0byBiZSB0ZXJtaW5hdGVkISc7XHJcblxyXG4gIHN0YXRpYyBJbnN0YW5jZTogRXZlbnRzTWFuYWdlciA9IG5ldyBFdmVudHNNYW5hZ2VyKCk7XHJcblxyXG4gIHByaXZhdGUgX2xhc3RGYWlsZWRGb2N1c2VkQ29udHJvbDogTWdDb250cm9sQmFzZSA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgaXNTcGlubmVyU2hvd246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgU3Bpbm5lclN0b3BwZWQ6IFN1YmplY3Q8bnVtYmVyPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHN0YXRpYyBjbGllbnRCdXN5VGltZVN0YXJ0ID0gMDtcclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHJpdmF0ZSBDVE9SIHRvIHByZXZlbnQgaW5zdGFudGlhdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuX3J0RXZlbnRzID0gbmV3IFN0YWNrKCk7XHJcblxyXG4gICAgdGhpcy5fZXZlbnRzUXVldWUgPSBuZXcgTWdQcmlvcml0eUJsb2NraW5nUXVldWUoKTtcclxuXHJcbiAgICB0aGlzLl9leGVjU3RhY2sgPSBuZXcgU3RhY2soKTtcclxuICAgIHRoaXMuX2V4ZWNTdGFjay5wdXNoKG5ldyBFeGVjdXRpb25TdGFjaygpKTtcclxuXHJcbiAgICB0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sgPSBuZXcgU3RhY2soKTtcclxuICAgIHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wdXNoKG51bGwpO1xyXG5cclxuXHJcbiAgICB0aGlzLktCSV9ET1dOID0gbmV3IEtleWJvYXJkSXRlbShHdWlDb25zdGFudHMuS0VZX0RPV04sIE1vZGlmaWVycy5NT0RJRklFUl9OT05FKTtcclxuICAgIHRoaXMuS0JJX1VQID0gbmV3IEtleWJvYXJkSXRlbShHdWlDb25zdGFudHMuS0VZX1VQLCBNb2RpZmllcnMuTU9ESUZJRVJfTk9ORSk7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0UGVuZGluZ0d1aUV2ZW50KCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5ndWlQZW5kaW5nRXZlbnQ7XHJcbiAgfVxyXG5cclxuICBzZXRQZW5kaW5nR3VpRXZlbnQoZ3VpRXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5ndWlQZW5kaW5nRXZlbnQgPSBndWlFdmVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgYW4gZXZlbnQgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXJ0RXZ0XCI+dGhlIGV2ZW50IHRvIGJlIGFkZGVkIDwvcGFyYW0+XHJcbiAgYWRkVG9UYWlsKHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIGlmIGN1cnJlbnQgZXZlbnQgaXMgbm90IGlkbGUgdGltZSBldmVudCBjaGVjayBpZiB0aGVyZSBpcyBjbGllbnRJbmFjdGl2aXR5VGltZXIgcnVubmluZz9cclxuICAgIC8vIGlmIHNvICwgc3RvcCB0aGlzIGNsaWVudCBDb250ZXh0IGluYWN0aXZpdHkgdGltZXJcclxuICAgIGlmICghcnRFdnQuaXNJZGxlVGltZXIoKSkge1xyXG4gICAgICBpZiAoRXZlbnRzTWFuYWdlci5jbGllbnRJbmFjdGl2aXR5VGltZXJPTikge1xyXG4gICAgICAgIEV2ZW50c01hbmFnZXIuY2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lckFib3J0ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgLy8gaWYgY2xpZW50IGlzIGlkbGUgYWZ0ZXIgcmVjcmVhdGluZyBjb250ZXh0ICwgdGhlbiBhZGQgbGFzdCBzYXZlZCByb3V0ZSBldmVudFxyXG4gICAgICBpZiAodGhpcy5nZXRMYXN0U2F2ZWRSb3V0ZUV2ZW50KCkgIT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuYWRkVG9UYWlsKHRoaXMuZ2V0TGFzdFNhdmVkUm91dGVFdmVudCgpKTtcclxuICAgICAgICB0aGlzLnNldExhc3RTYXZlZFJvdXRlRXZlbnQobnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9ldmVudHNRdWV1ZS5wdXQocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCBhbiBrZXlib2FyZCBldmVudCB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ0Zvcm1cIj5mb3JtIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ0NvbnRyb2xcIj5jb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtb2RpZmllclwiPm1vZGlmaWVyIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdGFydFwiPnN0YXJ0IG9mIHNlbGVjdGVkIHRleHQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImVuZFwiPmVuZCBvZiBzZWxlY3RlZCB0ZXh0ICA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGV4dFwiPnRleHQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImltXCI+aW0gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzQWN0Q2hhclwiPmlzIGtleWJvYXJkIGNoYXIgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN1Z2dlc3RlZFZhbHVlXCI+c3VnZ2VzdGVkIHZhbHVlIGZvciBjaG9pY2UgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj5jb2RlIHRvIGJlIGFkZGVkIGluIHRoZSBxdWV1ZSA8L3BhcmFtPlxyXG4gIEFkZEtleWJvYXJkRXZlbnQobWdGb3JtOiBNZ0Zvcm1CYXNlLCBtZ0NvbnRyb2w6IE1nQ29udHJvbEJhc2UsIG1vZGlmaWVyOiBNb2RpZmllcnMsIGtleUNvZGU6IG51bWJlciwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHRleHQ6IHN0cmluZywgaXNBY3RDaGFyOiBib29sZWFuLCBzdWdnZXN0ZWRWYWx1ZTogc3RyaW5nLCBjb2RlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gKG1nQ29udHJvbCAhPT0gbnVsbCkgPyBuZXcgUnVuVGltZUV2ZW50KDxNZ0NvbnRyb2w+bWdDb250cm9sLCB0cnVlLCBmYWxzZSkgOiBuZXcgUnVuVGltZUV2ZW50KDxUYXNrPm1nRm9ybS5nZXRUYXNrKCksIHRydWUpO1xyXG5cclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG5cclxuICAgIGxldCBuZXdLYkl0ZW06IEtleWJvYXJkSXRlbSA9IG5ldyBLZXlib2FyZEl0ZW0oa2V5Q29kZSwgbW9kaWZpZXIpO1xyXG5cclxuICAgIGlmIChpc0FjdENoYXIgJiYgKG1nQ29udHJvbCAhPT0gbnVsbCAmJiAobWdDb250cm9sLmlzVGV4dENvbnRyb2woKSkpKVxyXG4gICAgICBuZXdLYkl0ZW0uc2V0QWN0aW9uKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DSEFSKTtcclxuXHJcbiAgICBydEV2dC5zZXRLZXlib2FyZEl0ZW0obmV3S2JJdGVtKTtcclxuXHJcbiAgICBpZiAoY29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfS0VZRE9XTikge1xyXG4gICAgICBydEV2dC5zZXRFZGl0UGFybXMoc3RhcnQsIGVuZCwgdGV4dCk7XHJcbiAgICB9IGVsc2VcclxuICAgICAgcnRFdnQuc2V0VmFsdWUoc3VnZ2VzdGVkVmFsdWUpO1xyXG5cclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBRQ1IgNzYwMzgxIGlmIGFmdGVyIGhhbmRsaW5nIHRoZSBldmVudCB0aGUgY3VycmVudCBjb250cm9sIGlzIHVucGFya2FibGUgdHJ5XHJcbiAgLy8vICAgYW4gbW92ZSB0byB0aGUgbmV4dCBwYXJrYWJsZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBjaGVja1BhcmthYmlsaXR5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGN1cnJlbnQ6IE1nQ29udHJvbCA9IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKTtcclxuXHJcbiAgICAvKiBRQ1IjIDkyNTQ2NC4gVGhlIHByb2JsZW0gd2FzIHRoYXQgb24gZGVsZXRpbmcgYSByZWNvcmQsIENTIG9mIHRoZSBjb250cm9sIGdldHMgZXhlY3V0ZWQuXHJcbiAgICAgKiBTbywgdGhlIHRhc2sncyBsZXZlbCBpcyBzZXQgdG8gVEFTSy4gVGhlbiB3ZSBnbyB0byBzZXJ2ZXIgYW4gb24gcmV0dXJuaW5nIGJhY2sgZnJvbSB0aGUgc2VydmVyLFxyXG4gICAgICogd2UgcmVmcmVzaCB0aGUgZm9ybS4gSGVyZSwgc2luY2UgdGhlIGxhc3QgcGFya2VkIGNvbnRyb2wgaS5lLiBcImZyb21cIiAobnVtZXJpYykgaXMgaGlkZGVuLFxyXG4gICAgICogd2UgdHJ5IHRvIHBhcmsgb24gdGhlIG5leHQgcGFya2FibGUgY29udHJvbCBmcm9tIFByb3BlcnR5LlJlZnJlc2hEaXNwbGF5KCkuIFRoaXMgbWFrZXMgdGhlXHJcbiAgICAgKiB0YXNrJ3MgbGV2ZWwgYXMgQ09OVFJPTC4gTm93LCB3ZSB0cnkgdG8gZXhlY3V0ZSBSUCwgYnV0IHNpbmNlIHRoZSBsZXZlbCBpcyBDT05UUk9MLFxyXG4gICAgICogd2UgZG8gbm90IGV4ZWN1dGUgaXQuIFRoZSBzb2x1dGlvbiBpcyB0aGF0IGNoZWNrUGFya2FiaWxpdHkoKSB3aGljaCBpcyBjYWxsZWQgZnJvbVxyXG4gICAgICogUHJvcGVydHkuUmVmcmVzaERpc3BsYXkoKSwgc2hvdWxkIHRyeSB0byBwYXJrIG9uIHRoZSBjb250cm9sIG9ubHkgaWYgdGhlIHRhc2sncyBsZXZlbCBpcyBDT05UUk9MLlxyXG4gICAgICovXHJcbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAoY3VycmVudC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MICYmICFhd2FpdCBjdXJyZW50LklzUGFya2FibGUoKSlcclxuICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKGN1cnJlbnQuZ2V0Rm9ybSgpLmdldFRhc2soKSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBIYW5kbGVQYXJrYWJpbGl0eU9uUm93Q2hhbmdlKGl0YXNrOiBJVGFzayk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKGl0YXNrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBoYW5kbGUgc2l0dWF0aW9uIHdpdGggbm8gcGFya2FibGUgY29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXRhc2tcIj48L3BhcmFtPlxyXG4gIGFzeW5jIEhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoaXRhc2s6IElUYXNrKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPml0YXNrO1xyXG4gICAgLy8gd2UgY2FuIG5vdCBzdGF5IGluIGNyZWF0ZSBtb2RlIHdpdGggbm8gcGFya2FibGUgY29udHJvbHNcclxuICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgdGFzay5Jc0ludGVyYWN0aXZlKSB7XHJcbiAgICAgIGF3YWl0IHRhc2suZW5hYmxlTW9kZXMoKTtcclxuICAgICAgbGV0IG9sZE1vZGU6IHN0cmluZyA9IHRhc2suZ2V0T3JpZ2luYWxUYXNrTW9kZSgpO1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgaWYgKG9sZE1vZGUgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICB0YXNrLnNldE1vZGUob2xkTW9kZSk7XHJcbiAgICAgICAgICBhd2FpdCAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmN1cnJSZWNDb21wdXRlKHRydWUpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgdGFzay5zZXRMYXN0UGFya2VkQ3RybChudWxsKTtcclxuICAgICAgICAgIGF3YWl0IEZvY3VzTWFuYWdlci5TZXRGb2N1cyh0YXNrLCBudWxsLCAtMSwgdHJ1ZSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIHdlIGNhbiBub3Qgc3RheSBpbiBjcmVhdGUgbW9kZSBvciBpbiBzdG9wIGV4ZWN1dGlvbiBzdGF0ZSB3aXRoIG5vIHBhcmthYmxlIGNvbnRyb2xzXHJcbiAgICAgIC8vIERvIG5vdCBnaXZlIHBhcmsgZXJyb3IsIGlmIHRhc2sgaXMgb3BlbmVkIGluIGNyZWF0ZSBtb2RlLiBUaGlzIGlzIHRlbXBvcmFyeSBjaGFuZ2UgZm9yIGN1c3RvbWVyIHByb2JsZW0uXHJcbiAgICAgIC8vdGhpcy5leGl0V2l0aEVycm9yKHRhc2ssIE1zZ0ludGVyZmFjZS5SVF9TVFJfQ1JTUl9DQU5UX1BBUkspO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFdoaWxlIGhhbmRsZSBub24tcGFya2FiaWxpdHkgY29uZGl0aW9uLCBlbnN1cmUgQ1MgaXMgY2FsbGVkIGZvciBjb250cm9sIGlmIGl0IGlzIGluIENvbnRyb2wgbGV2ZWwgdGhlbiBwYXJraW5nIGlzIHNldCBvbiBmb3JtLlxyXG4gICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTClcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UodGFzay5nZXRMYXN0UGFya2VkQ3RybCgpLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpO1xyXG5cclxuICAgIHRhc2suc2V0TGFzdFBhcmtlZEN0cmwobnVsbCk7XHJcbiAgICBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsID0gbnVsbDtcclxuICAgIGF3YWl0IEZvY3VzTWFuYWdlci5TZXRGb2N1cyh0YXNrLCBudWxsLCAtMSwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaGFuZGxlIGEgc2luZ2xlIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlydEV2dFwiPnRoZSBldmVudCB0byBwcm9jZXNzIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXR1cm5lZEZyb21TZXJ2ZXJcIj5pbmRpY2F0ZXMgd2hldGhlciB3ZSByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgLSB0byBiZSBwYXNzZWQgdG8gaGFuZGxlci5leGVjdXRlKCkgPC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVFdmVudChydEV2dDogUnVuVGltZUV2ZW50LCByZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBoYW5kbGVyOiBFdmVudEhhbmRsZXIgPSBudWxsO1xyXG4gICAgbGV0IHBvczogRXZlbnRIYW5kbGVyUG9zaXRpb24gPSBuZXcgRXZlbnRIYW5kbGVyUG9zaXRpb24oKTtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+cnRFdnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgbGV0IGZvcmNlRXhpdERvbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBlbmRUYXNrRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBvbGRSdEV2dDogUnVuVGltZUV2ZW50ID0gbnVsbDtcclxuICAgIGxldCBvbGRGb3JjZUV4aXQ6IEZvcmNlRXhpdCA9IHRoaXMuZ2V0Rm9yY2VFeGl0KCk7XHJcbiAgICBsZXQgb2xkRm9yY2VFeGl0VGFzazogVGFzayA9IHRoaXMuZ2V0Rm9yY2VFeGl0VGFzaygpO1xyXG4gICAgbGV0IG9sZElzSGFuZGxpbmdGb3JjZUV4aXQ6IGJvb2xlYW4gPSB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0O1xyXG4gICAgbGV0IHJlc3RvcmVJc0ZvcmNlRXhpdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHJlc3RvcmVDdXJyQ3RybDogTWdDb250cm9sO1xyXG4gICAgbGV0IHJlc3RvcmVDdXJyRmllbGQ6IEZpZWxkID0gbnVsbDtcclxuXHJcbiAgICAvLyB0aGUgYWN0aW9uIG5lZWQgdG8gYmUgY2hlY2sgYWNjb3JkaW5nIHRvIHRoZSB0YXNrIG9uIHRoZSBldmVudC5cclxuICAgIC8vIElmIHRoZSBhY3Rpb24gaXMgaW50ZXJuYWwgKHVuZGVyIEFDVF9UT1QpLCBkbyBub3RoaW5nIGlmIGl0cyBkaXNhYmxlZCBvciBub3QgYWxsb3dlZC5cclxuICAgIGlmICgocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMKSkge1xyXG4gICAgICAvLyBkbyBub3RoaW5nIGlmIGFjdGlvbiBpcyAxLiBub3QgZW5hYmxlZCAyLiB3YWl0ID09IG5vIGFuZCBldmVudHMgYXJlIG5vdCBhbGxvd2VkXHJcbiAgICAgIGlmIChydEV2dC5JbnRlcm5hbEV2ZW50IDwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RPVF9DTlQgJiYgKCF0YXNrLkFjdGlvbk1hbmFnZXIuaXNFbmFibGVkKHJ0RXZ0LkludGVybmFsRXZlbnQpIHx8ICghcnRFdnQuaXNJbW1lZGlhdGUoKSAmJiB0aGlzLk5vRXZlbnRzQWxsb3dlZCgpKSkpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlXHJcbiAgICAvLyBkbyB0aGUgaGFuZGxlcnMgd2hlbiAxLiB3YWl0ID09IHllcyBvciAyLiBldmVudHMgYXJlIGFsbG93ZWRcclxuICAgIGlmICghcnRFdnQuaXNJbW1lZGlhdGUoKSAmJiB0aGlzLk5vRXZlbnRzQWxsb3dlZCgpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgcmVzdG9yZUN1cnJDdHJsID0gdGhpcy5fY3VyckN0cmw7XHJcbiAgICB0aGlzLl9jdXJyQ3RybCA9IGN0cmw7IC8vIHNhdmUgY3VycmVudCBjb250cm9sIGZvciBIQU5ETEVSX0NUUkwgZnVuY3Rpb25cclxuXHJcbiAgICBsZXQgcHJvcGFnYXRlOiBib29sZWFuID0gcnRFdnQuZ2V0VHlwZSgpICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMIHx8IHJ0RXZ0LmdldEludGVybmFsQ29kZSgpIDwgMTAwMDtcclxuXHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgdGhpcy5wdXNoUnRFdmVudChydEV2dCk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLkNoZWNrQW5kU2hvd1NwaW5uZXIodHJ1ZSk7XHJcblxyXG4gICAgICAvLyBkbyBzb21lIGNvbW1vbiBwcm9jZXNzaW5nIGFuZCBpZiB0aGUgcmVzdWx0IGlzIHRydWUgdGhlbiBjb250aW51ZVxyXG4gICAgICAvLyB3aXRoIHRoZSB1c2VyIGRlZmluZWQgaGFuZGxlcnNcclxuICAgICAgbGV0IGJSY0JlZm9yZTogYm9vbGVhbiA9IGF3YWl0IHRoaXMuY29tbW9uSGFuZGxlckJlZm9yZShydEV2dCk7XHJcblxyXG4gICAgICByZXN0b3JlQ3VyckZpZWxkID0gdGhpcy5fY3VyckZpZWxkO1xyXG4gICAgICB0aGlzLl9jdXJyRmllbGQgPSA8RmllbGQ+dGFzay5nZXRDdXJyRmllbGQoKTtcclxuXHJcbiAgICAgIGlmIChiUmNCZWZvcmUpIHtcclxuICAgICAgICBwb3MuaW5pdChydEV2dCk7XHJcbiAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCBoYW5kbGVyIGZvciB0aGUgY3VycmVudCBldmVudFxyXG4gICAgICAgIGhhbmRsZXIgPSBwb3MuZ2V0TmV4dCgpO1xyXG5cclxuICAgICAgICBpZiAoaGFuZGxlciAhPT0gbnVsbCAmJiBoYW5kbGVyLmdldEV2ZW50KCkgIT09IG51bGwgJiYgaGFuZGxlci5nZXRFdmVudCgpLlVzZXJFdnQgIT09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLnNldEZvcmNlRXhpdChoYW5kbGVyLmdldEV2ZW50KCkuVXNlckV2dC5Gb3JjZUV4aXQsIHRhc2spO1xyXG5cclxuICAgICAgICAvLyBleGVjdXRlIHRoZSBjaGFpbiBvZiBoYW5kbGVycyBmb3IgdGhlIGN1cnJlbnQgZXZlbnQuIHRoZSBleGVjdXRpb25cclxuICAgICAgICAvLyBjb250aW51ZXMgdGlsbCBhbiBldmVudCBoYW5kbGVyIHJldHVybnMgZmFsc2UuXHJcbiAgICAgICAgd2hpbGUgKGhhbmRsZXIgIT09IG51bGwpIHtcclxuICAgICAgICAgIGxldCBoYW5kbGVyQ29udGV4dFRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgICAgICAgbGV0IHJ0RXZ0Q2hhbmdlZDogYm9vbGVhbjtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBlbmFibGVkQ25kQ2hlY2tlZEFuZFRydWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgaGFuZGxlciBjaGFuZ2UgdGhlIGhhbmRsZXIncyBjb250ZXh0IHRhc2sgdG8gdGhlIGV2ZW50J3MgdGFza1xyXG4gICAgICAgICAgICBoYW5kbGVyQ29udGV4dFRhc2sgPSA8VGFzaz5oYW5kbGVyLmdldFRhc2soKS5HZXRDb250ZXh0VGFzaygpO1xyXG4gICAgICAgICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpID49IDEwMDAgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WQVJJQUJMRSlcclxuICAgICAgICAgICAgICBoYW5kbGVyLmdldFRhc2soKS5TZXRDb250ZXh0VGFzayhoYW5kbGVyLmdldFRhc2soKSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBoYW5kbGVyLmdldFRhc2soKS5TZXRDb250ZXh0VGFzayhydEV2dC5nZXRUYXNrKCkpO1xyXG5cclxuICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gbmVlZCB0byBoYW5kbGUgRm9yY2VFeGl0IGZvciBub24tdXNlciBldmVudHNcclxuICAgICAgICAgICAgaWYgKGhhbmRsZXIuZ2V0RXZlbnQoKS5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUiAmJiBhd2FpdCBoYW5kbGVyLmlzRW5hYmxlZCgpKSB7XHJcbiAgICAgICAgICAgICAgZW5hYmxlZENuZENoZWNrZWRBbmRUcnVlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgcmVzdG9yZUlzRm9yY2VFeGl0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAvLyBoYW5kbGUgZm9yY2VFeGl0IG9ubHkgb25jZVxyXG4gICAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmhhbmRsZUZvcmNlRXhpdEJlZm9yZShoYW5kbGVyLmdldEV2ZW50KCksIHJ0RXZ0KSkge1xyXG4gICAgICAgICAgICAgICAgZm9yY2VFeGl0RG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgY3VycmVudCBydW4gdGltZSBldmVudCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZXZlbnRcclxuICAgICAgICAgICAgLy8gb2YgdGhlIGhhbmRsZXJcclxuICAgICAgICAgICAgaWYgKHJ0RXZ0ICE9PSBoYW5kbGVyLmdldEV2ZW50KCkpIHtcclxuICAgICAgICAgICAgICAvLyB0aGUgbmV3IHJ1bnRpbWUgZXZlbnQgaXMgdGhhdCBvZiB0aGUgaGFuZGxlciBjb21iaW5lZCB3aXRoIHRoZVxyXG4gICAgICAgICAgICAgIC8vIGRhdGEgb2YgdGhlIGN1cnJlbnQgcnVudGltZSBldmVudC5cclxuICAgICAgICAgICAgICAvLyB0aGUgcHVycG9zZSBvZiB0aGlzIGlzIHRvIHByb3BhZ2F0ZSB0aGUgZXZlbnQgb2YgdGhlIGhhbmRsZXJcclxuICAgICAgICAgICAgICAvLyBpbiBwbGFjZSBvZiB0aGUgb3JpZ2luYWwgZXZlbnRcclxuICAgICAgICAgICAgICBvbGRSdEV2dCA9IHJ0RXZ0O1xyXG4gICAgICAgICAgICAgIHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudChoYW5kbGVyLmdldEV2ZW50KCksIHJ0RXZ0KTtcclxuICAgICAgICAgICAgICBydEV2dENoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBhIG5ldyBydW50aW1lIGV2ZW50IHRvIGhhbmRsZSBzbyBwb3AgdGhlIG9sZCBvbmUgYW5kIHB1c2hcclxuICAgICAgICAgICAgICAvLyB0aGUgbmV3IG9uZSBpbnN0ZWFkLlxyXG4gICAgICAgICAgICAgIHRoaXMucG9wUnRFdmVudCgpO1xyXG4gICAgICAgICAgICAgIHRoaXMucHVzaFJ0RXZlbnQocnRFdnQpO1xyXG4gICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICBydEV2dENoYW5nZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKVxyXG4gICAgICAgICAgICAgIHJ0RXZ0LmdldFRhc2soKS5zZXRJblJlY29yZFN1ZmZpeCh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRXZlbnRBcmd1bWVudHMocnRFdnQpO1xyXG4gICAgICAgICAgICBsZXQgaGFuZGxlclJldFZhbHM6IFJldFZhbHMgPSBhd2FpdCBoYW5kbGVyLmV4ZWN1dGUocnRFdnQsIHJldHVybmVkRnJvbVNlcnZlciwgZW5hYmxlZENuZENoZWNrZWRBbmRUcnVlKTtcclxuICAgICAgICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpXHJcbiAgICAgICAgICAgICAgcnRFdnQuZ2V0VGFzaygpLnNldEluUmVjb3JkU3VmZml4KGZhbHNlKTtcclxuICAgICAgICAgICAgcHJvcGFnYXRlID0gaGFuZGxlclJldFZhbHMuUHJvcGFnYXRlO1xyXG4gICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXRWYWxzLkVuYWJsZWQgJiYgcnRFdnRDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgcnRFdnQgPSBvbGRSdEV2dDtcclxuICAgICAgICAgICAgICBvbGRSdEV2dCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgcnRFdnRDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYSBuZXcgcnVudGltZSBldmVudCB0byBoYW5kbGUgc28gcG9wIHRoZSBvbGQgb25lIGFuZCBwdXNoXHJcbiAgICAgICAgICAgICAgLy8gdGhlIG5ldyBvbmUgaW5zdGVhZC5cclxuICAgICAgICAgICAgICB0aGlzLnBvcFJ0RXZlbnQoKTtcclxuICAgICAgICAgICAgICB0aGlzLnB1c2hSdEV2ZW50KHJ0RXZ0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgaGF2ZSBmdWxmaWxsZWQgdGhlIGVuZCBjb25kaXRpb25cclxuICAgICAgICAgICAgLy8gQWZ0ZXIgZXhlY3V0aW5nIGEgaGFuZGxlciwgYmVmb3JlIGVuZGluZyBhIHRhc2sgKGlmIHRoZSBlbmQgY29uZGl0aW9uIGlzIFRSVUUpLFxyXG4gICAgICAgICAgICAvLyB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlIHRhc2sgaXMgbm90IGFscmVhZHkgY2xvc2VkLiBUaGlzIGNhbiBoYXBwZW4gbGlrZSBpbiBjYXNlXHJcbiAgICAgICAgICAgIC8vIG9mIFFDUiAjNzk2NDc2IC0tLSBhIG5vbi1pbnRlcmFjdGl2ZSB0YXNrIGhhcyBjYWxsZWQgYW4gaW50ZXJhY3RpdmUgdGFzayBmcm9tXHJcbiAgICAgICAgICAgIC8vIHRhc2sgc3VmZml4LiBOb3cgaWYgd2UgcHJlc3MgQWx0K0Y0LCB3ZSBnZXQgRVhJVF9TWVNURU0gYWN0LiBBbmQgc28gd2UgY2xvc2VcclxuICAgICAgICAgICAgLy8gYWxsIHRhc2tzIHN0YXJ0aW5nIGZyb20gTWFpbiBQcm9ncmFtLiBTbywgd2hlbiB3ZSBjb21lIG91dCBvZiB0aGUgVFMgaGFuZGxlclxyXG4gICAgICAgICAgICAvLyBleGVjdXRpb24sIHRoZSB0YXNrIGlzIGFscmVhZHkgY2xvc2VkLlxyXG4gICAgICAgICAgICAvLyBGb3IgT2ZmbGluZSA6IFRQIGlzIGV4ZWN1dGVkIGF0IGNsaWVudCBzaWRlLiBJZiB3ZSBhcmUgaW4gVGFzayBQcmVmaXgsIGRvbnQgY2hlY2sgZW5kVGFzayBjb25kaXRpb24gaGVyZS5cclxuICAgICAgICAgICAgaWYgKHJ0RXZ0LmdldEludGVybmFsQ29kZSgpICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVggJiYgdGFzay5pc1N0YXJ0ZWQoKSAmJiB0YXNrLmdldEV4ZWNFbmRUYXNrKCkpIHtcclxuICAgICAgICAgICAgICBlbmRUYXNrRXJyb3IgPSBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgICBpZiAoZW5kVGFza0Vycm9yKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5oYW5kbGVTdG9wRXhlY3V0aW9uKHJ0RXZ0KSlcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAvLyByZXN0b3JpbmcgdGhlIGNvbnRleHRcclxuICAgICAgICAgICAgaGFuZGxlci5nZXRUYXNrKCkuU2V0Q29udGV4dFRhc2soaGFuZGxlckNvbnRleHRUYXNrKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoIXByb3BhZ2F0ZSlcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgaWYgKHJ0RXZ0Q2hhbmdlZClcclxuICAgICAgICAgICAgaGFuZGxlciA9IHBvcy5nZXROZXh0KHJ0RXZ0KTtcclxuICAgICAgICAgIC8vIGdldCB0aGUgbmV4dCBoYW5kbGVyIGZvciB0aGUgY3VycmVudCBldmVudFxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBoYW5kbGVyID0gcG9zLmdldE5leHQoKTtcclxuICAgICAgICAgIGlmIChoYW5kbGVyICE9PSBudWxsKVxyXG4gICAgICAgICAgICBGbG93TW9uaXRvclF1ZXVlLkluc3RhbmNlLmFkZFRhc2tFdmVudChydEV2dC5nZXRCcmtMZXZlbCh0cnVlKSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1BST1BBR0FURSwgdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByb3BhZ2F0ZSAmJiAhZW5kVGFza0Vycm9yKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5jb21tb25IYW5kbGVyKHJ0RXZ0KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWVuZFRhc2tFcnJvcikge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY29tbW9uSGFuZGxlckFmdGVyKHJ0RXZ0LCBiUmNCZWZvcmUpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChmb3JjZUV4aXREb25lICYmIHRoaXMuX2lzSGFuZGxpbmdGb3JjZUV4aXQpIHtcclxuICAgICAgICB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ID0gZmFsc2U7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGb3JjZUV4aXRBZnRlcihydEV2dCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZXRGb3JjZUV4aXQob2xkRm9yY2VFeGl0LCBvbGRGb3JjZUV4aXRUYXNrKTtcclxuICAgICAgaWYgKHJlc3RvcmVJc0ZvcmNlRXhpdClcclxuICAgICAgICB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ID0gb2xkSXNIYW5kbGluZ0ZvcmNlRXhpdDtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuX2N1cnJDdHJsID0gcmVzdG9yZUN1cnJDdHJsO1xyXG4gICAgICB0aGlzLl9jdXJyRmllbGQgPSByZXN0b3JlQ3VyckZpZWxkO1xyXG4gICAgICB0aGlzLnBvcFJ0RXZlbnQoKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8gdXBkYXRlIHRoZSBkaXNwbGF5XHJcbiAgICBHVUlNYW5hZ2VyLkluc3RhbmNlLmV4ZWNHdWlDb21tYW5kUXVldWUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUaGlzIG1ldGhvZCBzaW11bGF0ZXMgYWxsIGV2ZW50cyB0aGF0IGFyZSBpbiBzZWxlY3Rpb24gc2VxdWVuY2Ugc3RhcnRpbmcgZnJvbSBmb2N1cyBldmVudFxyXG4gIC8vLyAgIEl0IGlzIHVzZWQgaW4gOlxyXG4gIC8vLyAgIGFjdGlvbnMgQ1RSTCtUQUIgJiYgQ1RSTCtTSElGVCtUQUIgdGhhdCBtb3ZlIHVzIHRvIHRoZSBuZXh0L3ByZXZpb3VzIGl0ZW0gaW4gVGFiIGNvbnRyb2xcclxuICAvLy8gICBjbGljayBvciBhY2NlbGVyYXRvciBvbiBwdXNoIGJ1dHRvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+Y3RybCBsaW5lPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb2R1Y2VDbGlja1wiPnRydWUgc2hvdWxkIHByb2R1Y2UgY2xpY2sgZXZlbnQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgc2ltdWxhdGVTZWxlY3Rpb24oY3RybDogTWdDb250cm9sQmFzZSwgdmFsOiBhbnksIGxpbmU6IG51bWJlciwgcHJvZHVjZUNsaWNrOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbWdDb250cm9sOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPmN0cmw7XHJcbiAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSA8VGFzaz5tZ0NvbnRyb2wuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgIGxldCBjYW5jZWxXYXNSYWlzZWQ6IGJvb2xlYW4gPSBjdXJyVGFzay5jYW5jZWxXYXNSYWlzZWQoKTtcclxuXHJcbiAgICAvLyBpZiAobWdDb250cm9sLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQikge1xyXG4gICAgLy8gICBpZiAoIW1nQ29udHJvbC5pc01vZGlmaWFibGUoKSB8fCAhbWdDb250cm9sLklzUGFya2FibGUoKSkge1xyXG4gICAgLy8gICAgIG1nQ29udHJvbC5yZXN0b3JlT2xkVmFsdWUoKTtcclxuICAgIC8vICAgICBsZXQgbGFzdEZvY3VzZWRDb250cm9sOiBNZ0NvbnRyb2wgPSBHVUlNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgLy8gICAgIGlmIChsYXN0Rm9jdXNlZENvbnRyb2wgIT09IG51bGwpXHJcbiAgICAvLyAgICAgICBNYW5hZ2VyLlNldEZvY3VzKGxhc3RGb2N1c2VkQ29udHJvbCwgLTEpO1xyXG4gICAgLy8gICAgIHJldHVybjtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIHdoZW4gYSBwdXNoIGJ1dHRvbiBpcyBhYm91dCB0byByYWlzZSBhICdDYW5jZWwnIG9yIGEgJ1F1aXQnIGV2ZW50LiB3ZSBkbyBub3Qgd2FudCB0byBzZXQgdGhlIG5ldyB2YWx1ZSB0byB0aGUgZmllbGQuXHJcbiAgICAvLyBUaGF0IHNldHRpbmcgbWlnaHQgY2F1c2UgYSByZWMgc3VmZml4IGFuZCBhIHZhcmlhYmxlIGNoYW5nZS5cclxuICAgIGlmIChtZ0NvbnRyb2wuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKSB7XHJcbiAgICAgIGxldCBhUnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQobWdDb250cm9sKTtcclxuICAgICAgbGV0IHJhaXNlQXQ6IFJhaXNlQXQgPSA8UmFpc2VBdD4oYXdhaXQgKG1nQ29udHJvbC5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JBSVNFX0FUKSkuZ2V0VmFsdWVJbnQoKSk7XHJcbiAgICAgIGlmIChhUnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIChhUnRFdnQuSW50ZXJuYWxFdmVudCA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBTkNFTCB8fCBhUnRFdnQuSW50ZXJuYWxFdmVudCA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1FVSVQpKSB7XHJcbiAgICAgICAgaWYgKHJhaXNlQXQgPT09IFJhaXNlQXQuVGFza0luRm9jdXMpXHJcbiAgICAgICAgICBjdXJyVGFzayA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuICAgICAgICBjYW5jZWxXYXNSYWlzZWQgPSBjdXJyVGFzay5jYW5jZWxXYXNSYWlzZWQoKTtcclxuICAgICAgICBjdXJyVGFzay5zZXRDYW5jZWxXYXNSYWlzZWQodHJ1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyYWlzZUF0ID09PSBSYWlzZUF0LlRhc2tJbkZvY3VzKVxyXG4gICAgICAgIG1nQ29udHJvbC5zZXRSdEV2dFRhc2soTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmaXJzdCB3ZSBoYW5kbGUgZm9jdXNcclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlRm9jdXMobWdDb250cm9sLCBsaW5lLCBwcm9kdWNlQ2xpY2spO1xyXG5cclxuICAgIGN1cnJUYXNrLnNldENhbmNlbFdhc1JhaXNlZChjYW5jZWxXYXNSYWlzZWQpO1xyXG5cclxuICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgLy8gUUNSIyA5NzQwNDcgOiBJZiB3ZSBoYXZlIGEgUHVzaCBCdXR0b24gd2l0aCBBbGxvdyBQYXJraW5nID0gTm8gYW5kIGZpZWxkIGlzIGF0dGFjaGVkIHRvIGl0LCBkb24ndCBoYW5kbGUgdGhlIGV2ZW50LlxyXG4gICAgLy8gVGhpcyBpcyBzYW1lIGFzIG9ubGluZS4gSW4gb25saW5lLCBpZiBmaWVsZCBpcyBub3QgYXR0YWNoZWQgdG8gbm9uIHBhcmthYmxlIHB1c2ggQnV0dG9uLCB3ZSBoYW5kbGUgdGhlIGV2ZW50XHJcbiAgICAvLyBCdXQgaWYgZmllbGQgaXMgYXR0YWNoZWQgdG8gaXQsIHdlIGRvbid0IGhhbmRsZSBldmVudC5cclxuICAgIC8vIFNvIGlmIGNvbnRyb2wgaXMgcHVzaCBidXR0b24sIGV4ZWN1dGUgaGFuZGxlRXZlbnQgb25seSB3aGVuIGZpZWxkIGlzIG5vdCBhdHRhY2hlZCBvciBQYXJrb25DTGljayBpcyBObyBvclxyXG4gICAgLy8gUGFya29uQ0xpY2sgYW5kIGFsbG93cGFya2luZyBpcyBib3RoIFllc1xyXG4gICAgbGV0IGNvbnRyb2xJc1BhcmthYmxlOiBib29sZWFuID0gYXdhaXQgbWdDb250cm9sLklzUGFya2FibGUoKTtcclxuICAgIGlmIChtZ0NvbnRyb2wuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OIHx8IChtZ0NvbnRyb2wuZ2V0RmllbGQoKSA9PT0gbnVsbCB8fCBjb250cm9sSXNQYXJrYWJsZSkpIHtcclxuXHJcbiAgICAgIC8vIFFDUiAjMzAxNjUyLiBGb3Igbm9uLXBhcmthYmxlIGJ1dHRvbiBjb250cm9sIHdpdGggZXZlbnQgcmFpc2VkIGF0IHRoZSBjb250YWluZXIgdGFzayB3aWxsIGJlIGNoYW5nZWQgc29cclxuICAgICAgLy8gd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQgdGhlbiB0aGUgdGFzayB3aWxsIGdldCBmb2N1cy4gKGFzIGluIE9ubGluZSBhbmQgYXMgaWYgdGhlIGJ1dHRvbiB3YXMgcGFya2FibGUpLlxyXG4gICAgICAvLyBUaGUgZm9jdXMgd2lsbCBiZSBvbiB0aGUgZmlyc3QgY29udHJvbC5cclxuICAgICAgaWYgKG1nQ29udHJvbC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04gJiYgIWNvbnRyb2xJc1BhcmthYmxlKSB7XHJcbiAgICAgICAgbGV0IHN1YmZvcm1UYXNrOiBUYXNrID0gPFRhc2s+bWdDb250cm9sLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICAgICAgaWYgKHN1YmZvcm1UYXNrLklzU3ViRm9ybSkge1xyXG4gICAgICAgICAgY3VyclRhc2sgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcbiAgICAgICAgICAvLyBEZWZlY3QgMTE1NDc0LiBGb3IgdGhlIHNhbWUgdGFzayBkbyBub3QgbW92ZSB0byB0aGUgZmlyc3QgY29udHJvbC5cclxuICAgICAgICAgIGlmIChzdWJmb3JtVGFzayAhPT0gY3VyclRhc2sgJiYgc3ViZm9ybVRhc2sucGF0aENvbnRhaW5zKGN1cnJUYXNrKSkge1xyXG5cclxuICAgICAgICAgICAgaWYgKHN1YmZvcm1UYXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spIHsgLy8gVE9ETzogQ2hlY2sgaWYgdGhpcyBjb2RlIGNhbiBiZSBtb3ZlZCB0byBIYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKClcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhzdWJmb3JtVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyhzdWJmb3JtVGFzayk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgLy8gdGhlbiBBQ1RfSElUIGlzIHNlbnRcclxuICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KG1nQ29udHJvbCk7XHJcbiAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5DdXJyZW50Q2xpY2tlZEN0cmwgPSBtZ0NvbnRyb2w7XHJcbiAgICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX0hJVCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFuZCBzZWxlY3Rpb24gaXMgaGFuZGxlZCBpbiB0aGUgZW5kIGlmIHByZXZpb3VzIGFjdGlvbnMgc3VjY2VlZGVkXHJcbiAgICBpZiAobWdDb250cm9sLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTilcclxuICAgIC8vIGZvciBidXR0b25cXGNoZWNrIHdlIGRvIG5vdCBjYWxsIHRoaXMgdG8gcHJldmVudCByZWN1cnNpb25cclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVTZWxlY3Rpb24obWdDb250cm9sLCBsaW5lLCB2YWwpO1xyXG5cclxuICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICByZXR1cm47XHJcbiAgICAvLyB0aGVuIG1vdXNlIHVwXHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZU1vdXNlVXAobWdDb250cm9sLCBsaW5lLCBwcm9kdWNlQ2xpY2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBhY3RpdmF0ZSBoYW5kbGVJbnRlcm5hbEV2ZW50IHdpdGggaXNRdWl0ID0gZmFsc2U8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXRhc2tcIj5hIHJlZmVyZW5jZSB0byB0aGUgdGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZXZlbnRDb2RlXCI+dGhlIGNvZGUgb2YgdGhlIGV2ZW50PC9wYXJhbT5cclxuICBhc3luYyBoYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2soaXRhc2s6IElUYXNrLCBldmVudENvZGU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRTdWJmb3JtUmVmcmVzaChpdGFzaywgZXZlbnRDb2RlLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWN0aXZhdGUgaGFuZGxlSW50ZXJuYWxFdmVudCB3aXRoIGlzUXVpdCA9IGZhbHNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIml0YXNrXCI+YSByZWZlcmVuY2UgdG8gdGhlIHRhc2sgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2ZW50Q29kZVwiPnRoZSBjb2RlIG9mIHRoZSBldmVudCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1YmZvcm1SZWZyZXNoXCI+aWRlbnRpZmllciBpZiB0aGUgZXZlbnQgY2FsbGVkIGJ5IHN1YmZvcm0gcmVmcmVzaDwvcGFyYW0+XHJcbiAgYXN5bmMgaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kU3ViZm9ybVJlZnJlc2goaXRhc2s6IElUYXNrLCBldmVudENvZGU6IG51bWJlciwgc3ViZm9ybVJlZnJlc2g6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+aXRhc2s7XHJcblxyXG4gICAgLy8gc2V0IFN1YmZvcm1FeGVjTW9kZSAoZm9yIFN1YmZvcm1FeGVjTW9kZSBmdW5jdGlvbikgb25seSBpbiByZWNvcmQgcHJlZml4LlxyXG4gICAgLy8gU3ViZm9ybUV4ZWNNb2RlIGlzIGNoYW5nZWQgaW4gcmVjb3JkIHByZWZpeCBhbmQgaXQgaXMgdGhlIHNhbWUgdW50aWwgdGhlXHJcbiAgICAvLyBuZXh0IHJlY29yZCBwcmVmaXggZXhlY3V0aW9uLCBiZWNhdXNlIHdlIGRvIG5vdCBvcGVuIGEgc3ViZm9ybSB0YXNrIGVhY2ggdGltZVxyXG4gICAgLy8gaW4gUkMgYXMgaXQgaXMgaW4gT25saW5lLiBCdXQgd2hlbiB0aGUgc3ViZm9ybSBpcyByZWZyZXNoZWQgZnJvbSB0aGUgcGFyZW50XHJcbiAgICAvLyBpdHMgcmVjb3JkIHByZWZpeCAmIHN1ZmZpeCBhcmUgYWxzbyBleGVjdXRlZC5cclxuICAgIGlmIChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYICYmIHRhc2suSXNTdWJGb3JtICYmIHRhc2suU3ViZm9ybUV4ZWNNb2RlICE9PSBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uRklSU1RfVElNRSkvLyBGSVJTVF9USU1FIGlzIHNldCBvbmx5IG9uY2UgaW5cclxuICAgIC8vIGRvRmlyc3RSZWNvcmRDeWNsZS5cclxuICAgIHtcclxuICAgICAgdGFzay5TdWJmb3JtRXhlY01vZGUgPSAoc3ViZm9ybVJlZnJlc2ggPyBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uUkVGUkVTSCA6IFRhc2tfU3ViZm9ybUV4ZWNNb2RlRW51bS5TRVRfRk9DVVMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZvciB0aGUgc3ViZm9ybSByZWZyZXNoIGl0IGlzIG5lZWRlZCB0byBleGVjdXRlIE1HX0FDVF9QT1NUX1JFRlJFU0hfQllfUEFSRU5UIGhhbmRsZXIgYmVmb3JlIFJFQ09SRF9QUkVGSVggaGFuZGxlclxyXG4gICAgaWYgKHN1YmZvcm1SZWZyZXNoKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhpdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1BPU1RfUkVGUkVTSF9CWV9QQVJFTlQpO1xyXG5cclxuICAgIGlmICh0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKSB7XHJcbiAgICAgIGlmIChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYIHx8IGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpIHtcclxuICAgICAgICBpZiAoZXZlbnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWClcclxuICAgICAgICAgIGF3YWl0IHRhc2suZW1wdHlEYXRhdmlld09wZW4oc3ViZm9ybVJlZnJlc2gpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRhc2suZW1wdHlEYXRhdmlld0Nsb3NlKCk7XHJcblxyXG4gICAgICAgIGlmICh0YXNrLmdldEZvcm0oKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgaWYgKGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpXHJcbiAgICAgICAgICAgIGF3YWl0ICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgIHRhc2suZ2V0Rm9ybSgpLlNlbGVjdFJvdygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRFdmVudFN1YnR5cGUodGFzaywgZXZlbnRDb2RlLCBFdmVudFN1YlR5cGUuTm9ybWFsKTtcclxuICAgIH0gZWxzZVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZEV2ZW50U3VidHlwZSh0YXNrLCBldmVudENvZGUsIEV2ZW50U3ViVHlwZS5Ob3JtYWwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFjdGl2YXRlIGhhbmRsZUludGVybmFsRXZlbnQgd2l0aCBpc1F1aXQgPSBmYWxzZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+YSByZWZlcmVuY2UgdG8gdGhlIGNvbnRyb2wgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2ZW50Q29kZVwiPnRoZSBjb2RlIG9mIHRoZSBldmVudCA8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShjdHJsOiBNZ0NvbnRyb2xCYXNlLCBldmVudENvZGU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbCg8TWdDb250cm9sPmN0cmwsIGV2ZW50Q29kZSwgRXZlbnRTdWJUeXBlLk5vcm1hbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgXCJzdG9wIGV4ZWN1dGlvblwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEdldFN0b3BFeGVjdXRpb25GbGFnKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0b3BFeGVjdXRpb247XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBjdHJsIG9uIHdoaWNoIHdlIGhhZCBhIFwic3RvcCBleGVjdXRpb25cIlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRTdG9wRXhlY3V0aW9uQ3RybCgpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLl9zdG9wRXhlY3V0aW9uQ3RybDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbml0aWFsaXplcyB0aGUgc3RhdGljIHNlY3Rpb24gb2YgdGhlIGV2ZW50cyBtYW5hZ2VyLiBVc3VhbGx5IGRvZXMgbm90aGluZyBidXQgaW4gdGhlXHJcbiAgLy8vICAgZXZlbnQgb2YgYXBwbGV0IHJlLWxvYWQgKGZvciBleGFtcGxlLCBiZWNhdXNlIG9mIGEgYnJvd3NlciByZWZyZXNoKSBpdCBpbml0aWFsaXplcyB0aGVcclxuICAvLy8gICBzdGF0aWMgcGFydCBvZiB0aGlzIGNsYXNzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX2ZvcmNlRXhpdCA9IEZvcmNlRXhpdC5Ob25lO1xyXG4gICAgICB0aGlzLl9mb3JjZUV4aXRUYXNrID0gbnVsbDtcclxuICAgICAgdGhpcy5fY3VyckZpZWxkID0gbnVsbDtcclxuICAgICAgdGhpcy5zZXRFbmRPZldvcmsodHJ1ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQWRkIGludGVybmFsIGV2ZW50IHRvIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpdGFza1wiPnRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQ8L3BhcmFtPlxyXG4gIGFkZEludGVybmFsRXZlbnRXaXRoSXRhc2tBbmRDb2RlKGl0YXNrOiBJVGFzaywgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aFRhc2tBbmRDb2RlQW5kT25NdWx0aU1hcmsoaXRhc2ssIGNvZGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kQ29kZShjdHJsOiBNZ0NvbnRyb2xCYXNlLCBjb2RlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCg8TWdDb250cm9sPmN0cmwpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhZGRJbnRlcm5hbEV2ZW50V2l0aEN0cmxBbmREaXNwbGF5TGluZUFuZENvZGUoY3RybDogTWdDb250cm9sQmFzZSwgRGlzcGxheUxpbmU6IG51bWJlciwgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPE1nQ29udHJvbD5jdHJsLCBEaXNwbGF5TGluZSwgZmFsc2UpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcmlvcml0eVwiPjwvcGFyYW0+XHJcbiAgYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kQ29kZUFuZFByaW9yaXR5KGN0cmw6IE1nQ29udHJvbEJhc2UsIGNvZGU6IG51bWJlciwgcHJpb3JpdHk6IFByaW9yaXR5KTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPE1nQ29udHJvbD5jdHJsKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgcnRFdnQuc2V0UHJpb3JpdHkocHJpb3JpdHkpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBhZGQgZ3VpIHRyaWdnZXJlZCBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9uTXVsdGlNYXJrXCI+PC9wYXJhbT5cclxuICBhZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhUYXNrQW5kQ29kZUFuZE9uTXVsdGlNYXJrKGl0YXNrOiBJVGFzaywgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPml0YXNrO1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KHRhc2spO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHdpbGwgYmUgdXNlZCBmb3IgbXVsdGltYXJraW5nIGluIHRoZSBmdXR1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vZGlmaWVyc1wiPjwvcGFyYW0+XHJcbiAgYWRkR3VpVHJpZ2dlcmVkRXZlbnRXaXRoQ3RybEFuZENvZGVBbmRMaW5lQW5kTW9kaWZpZXIoY3RybDogTWdDb250cm9sQmFzZSwgY29kZTogbnVtYmVyLCBsaW5lOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCg8TWdDb250cm9sPmN0cmwsIGxpbmUsIGZhbHNlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEFkZCBpbnRlcm5hbCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgR1VJIHF1ZXVlIChpbmNsdWRlcyB0aW1lciBldmVudHMpIHRvIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+Y29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5saW5lIGluIGEgdGFibGUgY29udHJvbCA8L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aFRhc2tBbmRDb2RlQW5kTGluZSh0YXNrOiBUYXNrLCBjb2RlOiBudW1iZXIsIGxpbmU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHRzazogVGFzayA9IG51bGw7XHJcbiAgICBpZiAodGFzayAhPT0gbnVsbClcclxuICAgICAgdHNrID0gPFRhc2s+dGFzaztcclxuXHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQodHNrKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgcnRFdnQuRGlzcGxheUxpbmUgPSBsaW5lO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBoYW5kbGUgQ29sdW1uIENsaWNrIGV2ZW50IG9uIENvbHVtbiA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpQ29sdW1uQ3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGlyZWN0aW9uXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb2x1bW5IZWFkZXJcIj48L3BhcmFtPlxyXG4gIEFkZENvbHVtbkNsaWNrRXZlbnQoY29sdW1uQ3RybDogTWdDb250cm9sQmFzZSwgZGlyZWN0aW9uOiBudW1iZXIsIGNvbHVtbkhlYWRlcjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPE1nQ29udHJvbD5jb2x1bW5DdHJsLCBkaXJlY3Rpb24sIDApO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NPTF9DTElDSyk7XHJcblxyXG4gICAgLy8gUHJlcGFyZSBhbiBhcmd1bWVudCBsaXN0IHdpdGggYXJndW1lbnQgYXMgY29sdW1uSGVhZGVyU3RyaW5nLlxyXG4gICAgbGV0IGFyZ3NMaXN0ID0gbmV3IEFycmF5PEV4cFZhbD4oKTtcclxuICAgIGFyZ3NMaXN0WzBdID0gbmV3IEV4cFZhbChTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUsIGZhbHNlLCBjb2x1bW5IZWFkZXIpO1xyXG4gICAgbGV0IGFyZ3MgPSBuZXcgQXJndW1lbnRzTGlzdChhcmdzTGlzdCk7XHJcbiAgICBydEV2dC5zZXRBcmdMaXN0KGFyZ3MpO1xyXG5cclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIEFkZFJvdXRlRXZlbnQodGFzazogSVRhc2ssIGNvZGU6IG51bWJlciwgcm91dGVycGF0aDogc3RyaW5nLCByb3V0ZXJPdXRsZXROYW1lOiBzdHJpbmcsIHJvdXRlUGFyYW1zOiBMaXN0PGFueT4pIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCg8VGFzaz50YXNrLCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG5cclxuICAgIGxldCBhcmdzTGlzdDogRXhwVmFsW10gPSBuZXcgQXJyYXk8RXhwVmFsPigyKTtcclxuICAgIGFyZ3NMaXN0WzBdID0gbmV3IEV4cFZhbChTdG9yYWdlQXR0cmlidXRlLkFMUEhBLCBmYWxzZSwgcm91dGVycGF0aCk7XHJcbiAgICBpZiAocm91dGVyT3V0bGV0TmFtZSA9PT0gbnVsbClcclxuICAgICAgcm91dGVyT3V0bGV0TmFtZSA9ICcnO1xyXG4gICAgYXJnc0xpc3RbMV0gPSBuZXcgRXhwVmFsKFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEsIGZhbHNlLCByb3V0ZXJPdXRsZXROYW1lKTtcclxuXHJcbiAgICBsZXQgYXJncyA9IG5ldyBBcmd1bWVudHNMaXN0KGFyZ3NMaXN0KTtcclxuICAgIHJ0RXZ0LnNldEFyZ0xpc3QoYXJncyk7XHJcbiAgICBydEV2dC5zZXRSb3V0ZVBhcmFtTGlzdChyb3V0ZVBhcmFtcyk7XHJcblxyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgQWRkUm91dGVyQ2xvc2VkRXZlbnQodGFzazogVGFzaykge1xyXG4gICAgbGV0IHN1YkZvcm1Db250cm9sOiBNZ0NvbnRyb2xCYXNlID0gPE1nQ29udHJvbEJhc2U+dGFzay5nZXRGb3JtKCkuZ2V0U3ViRm9ybUN0cmwoKTtcclxuICAgIGxldCBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoPFRhc2tCYXNlPnN1YkZvcm1Db250cm9sLmdldEZvcm0oKS5nZXRUYXNrKCksIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NVQkZPUk1fQ0xPU0UpO1xyXG5cclxuICAgIGxldCBhcmdzTGlzdDogRXhwVmFsW10gPSBuZXcgQXJyYXk8RXhwVmFsPigxKTtcclxuICAgIGFyZ3NMaXN0WzBdID0gbmV3IEV4cFZhbChTdG9yYWdlQXR0cmlidXRlLkFMUEhBLCBmYWxzZSwgc3ViRm9ybUNvbnRyb2wuZ2V0TmFtZSgpKTtcclxuXHJcbiAgICBsZXQgYXJncyA9IG5ldyBBcmd1bWVudHNMaXN0KGFyZ3NMaXN0KTtcclxuICAgIHJ0RXZ0LnNldEFyZ0xpc3QoYXJncyk7XHJcbiAgICBFdmVudHNNYW5hZ2VyLkluc3RhbmNlLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGFkZCBsYXN0IHNhdmVkIHJvdXRlIGV2ZW50IDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzcmNUYXNrU3RyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJhcmdMaXN0U3RyXCI+PC9wYXJhbT5cclxuICBBZGRMYXN0U2F2ZWRSb3V0ZUV2ZW50KHNyY1Rhc2s6IFRhc2ssIGFyZ3M6IEFyZ3VtZW50c0xpc3QpIHtcclxuICAgIGxldCBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQoPFRhc2tCYXNlPkxhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSwgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCQ0xJRU5UX1JPVVRFKTtcclxuXHJcbiAgICBpZiAoc3JjVGFzayAhPSBudWxsKSB7XHJcbiAgICAgIHJ0RXZ0LnNldFRhc2soc3JjVGFzayk7XHJcbiAgICAgIGlmIChhcmdzICE9IG51bGwpIHtcclxuICAgICAgICBydEV2dC5zZXRBcmdMaXN0KGFyZ3MpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2V0TGFzdFNhdmVkUm91dGVFdmVudChydEV2dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICBBZGQgaW50ZXJuYWwgZXZlbnQgcm8gc2V0IHRoZSB2YWx1ZSBvZiBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj4gY29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsdWVcIj4gdmFsdWUgb2YgY29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVmcmVzaERpc3BsYXlcIj4gcmVmcmVzaCBkaXNwbGF5IDwvcGFyYW0+XHJcbiAgQWRkRXh0ZXJuYWxWYWx1ZUV2ZW50KGN0cmw6IE1nQ29udHJvbCwgdmFsdWU6IGFueSwgcmVmcmVzaERpc3BsYXk6IGJvb2xlYW4pIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsLCAwLCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRVRfRVhURVJOQUxfVkFMVUUpO1xyXG4gICAgcnRFdnQuc2V0VmFsdWUodmFsdWUpO1xyXG5cclxuICAgIGxldCBhcmdzTGlzdDogRXhwVmFsW10gPSBuZXcgQXJyYXk8RXhwVmFsPigxKTtcclxuICAgIGFyZ3NMaXN0WzBdID0gbmV3IEV4cFZhbChTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU4sIGZhbHNlLCByZWZyZXNoRGlzcGxheSA/ICcxJyA6ICcwJyk7XHJcbiAgICBsZXQgYXJncyA9IG5ldyBBcmd1bWVudHNMaXN0KGFyZ3NMaXN0KTtcclxuICAgIHJ0RXZ0LnNldEFyZ0xpc3QoYXJncyk7XHJcblxyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEFkZCBpbnRlcm5hbCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgR1VJIHF1ZXVlIChpbmNsdWRlcyB0aW1lciBldmVudHMpIHRvIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5saW5lIGluIGEgdGFibGUgY29udHJvbCA8L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aEN0cmxBbmRDb2RlQW5kTGluZShjdHJsOiBNZ0NvbnRyb2xCYXNlLCBjb2RlOiBudW1iZXIsIGxpbmU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwsIGxpbmUsIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQWRkIGludGVybmFsIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSBHVUkgcXVldWUgKGluY2x1ZGVzIHRpbWVyIGV2ZW50cykgdG8gdGhlIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+dGhlIGxpbmUgZm9yIG11bHRpbGluZSBjb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb2RlXCI+Y29kZSBvZiBpbnRlcm5hbCBldmVudCA8L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aEN0cmxBbmRMaW5lQW5kQ29kZUFuZElzUHJvZHVjdENsaWNrKGN0cmw6IE1nQ29udHJvbEJhc2UsIGNvZGU6IG51bWJlciwgbGluZTogbnVtYmVyLCBpc1Byb2R1Y2VDbGljazogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwsIGxpbmUsIHRydWUpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoY29kZSk7XHJcbiAgICBydEV2dC5zZXRQcm9kdWNlQ2xpY2soaXNQcm9kdWNlQ2xpY2spO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEFkZCBpbnRlcm5hbCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgR1VJIHF1ZXVlIChpbmNsdWRlcyB0aW1lciBldmVudHMpIHRvIHRoZSBxdWV1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+Y29udHJvbCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpc3RcIj48L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aEN0cmxBbmRDb2RlQW5kTGlzdChjdHJsOiBNZ0NvbnRyb2xCYXNlLCBjb2RlOiBudW1iZXIsIGxpc3Q6IExpc3Q8TWdDb250cm9sQmFzZT4pOiB2b2lkIHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsLCBsaXN0LCB0cnVlKTtcclxuICAgIHJ0RXZ0LnNldEludGVybmFsKGNvZGUpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBBZGQgaW50ZXJuYWwgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IEdVSSBxdWV1ZSB0byB0aGUgcXVldWUgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPnJlZmVyZW5jZSB0byB0aGUgdGFzayA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY29kZVwiPmNvZGUgb2YgaW50ZXJuYWwgZXZlbnQgPC9wYXJhbT5cclxuICBhZGRHdWlUcmlnZ2VyZWRFdmVudFdpdGhUYXNrQW5kQ29kZSh0YXNrOiBJVGFzaywgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoPFRhc2s+dGFzaywgdHJ1ZSk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChjb2RlKTtcclxuICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQWRkIGludGVybmFsIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSBHVUkgcXVldWUgdG8gdGhlIHF1ZXVlIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyYWlzZWRCeVwiPnJlbGV2YW50IG9ubHkgZm9yIG9ubGluZSAoZm9yIHdoaWNoIHN1YmZvcm0gYXJlIGhhbmRsZWQgYXMgb3JwaGFucyk8L3BhcmFtPlxyXG4gIGFkZEd1aVRyaWdnZXJlZEV2ZW50VGFza0FuZENvZGVBbmRSYWlzZWRCeSh0YXNrOiBJVGFzaywgY29kZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aFRhc2tBbmRDb2RlKHRhc2ssIGNvZGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGZpcnN0IGV2ZW50IGZyb20gdGhlIHF1ZXVlIGFuZCByZW1vdmUgaXQgZnJvbSB0aGVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRFdmVudCgpOiBSdW5UaW1lRXZlbnQge1xyXG4gICAgcmV0dXJuIDxSdW5UaW1lRXZlbnQ+dGhpcy5fZXZlbnRzUXVldWUucG9sbCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9yY2VFeGl0KCk6IEZvcmNlRXhpdCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZm9yY2VFeGl0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRGb3JjZUV4aXQoZm9yY2VFeGl0OiBGb3JjZUV4aXQsIHRhc2s6IFRhc2spOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZvcmNlRXhpdCA9IGZvcmNlRXhpdDtcclxuICAgIHRoaXMuc2V0Rm9yY2VFeGl0VGFzayh0YXNrKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Rm9yY2VFeGl0VGFzaygpOiBUYXNrIHtcclxuICAgIHJldHVybiB0aGlzLl9mb3JjZUV4aXRUYXNrO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRGb3JjZUV4aXRUYXNrKHRhc2s6IFRhc2spOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZvcmNlRXhpdFRhc2sgPSB0YXNrO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogcmV0dXJucyB0cnVlIGlmIHRoZSBFdmVudHNNYW5hZ2VyIGlzIGN1cnJlbnRseSBoYW5kbGluZyBhIHVzZXIgZXZlbnQgd2l0aFxyXG4gICAqIEZvcmNlIEV4aXQgPSAnUHJlLVJlY29yZCBVcGRhdGUnXHJcbiAgICovXHJcbiAgaXNGb3JjZUV4aXRQcmVSZWNvcmRVcGRhdGUodGFzazogVGFza0Jhc2UpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ICYmIHRoaXMuZ2V0Rm9yY2VFeGl0KCkgPT09IEZvcmNlRXhpdC5QcmVSZWNvcmRVcGRhdGUgJiYgdGFzayA9PT0gdGhpcy5nZXRGb3JjZUV4aXRUYXNrKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEV4ZWN1dGUgQ2xpZW50Q29udGV4dEluYWN0aXZpdHkgVGltZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIEV4ZWN1dGVDbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHN0YXJ0VGltZSA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk7XHJcblxyXG4gICAgLy8gY29udmVydCB0ZW50aHMgb2Ygc2Vjb25kcyB0byBtaWxsaXNlY29uZHMuXHJcbiAgICBsZXQgY2xpZW50Q3R4SW5hY3Rpdml0eVRpbWVvdXQgPVxyXG4gICAgICBFbnZpcm9ubWVudC5JbnN0YW5jZS5nZXRDbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQoKSAqIDEwMDtcclxuXHJcbiAgICBFdmVudHNNYW5hZ2VyLmNsaWVudEluYWN0aXZpdHlUaW1lck9OID0gdHJ1ZTtcclxuICAgIHdoaWxlIChFdmVudHNNYW5hZ2VyLmNsaWVudEluYWN0aXZpdHlUaW1lck9OKSB7XHJcbiAgICAgIGF3YWl0IFRocmVhZC5TbGVlcCgxMDAwKTtcclxuICAgICAgdmFyIHRpbWVMYXBzZWQgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpIC0gc3RhcnRUaW1lO1xyXG4gICAgICBpZiAoRXZlbnRzTWFuYWdlci5jbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyQWJvcnRlZCB8fCB0aW1lTGFwc2VkID49IGNsaWVudEN0eEluYWN0aXZpdHlUaW1lb3V0KSB7XHJcbiAgICAgICAgRXZlbnRzTWFuYWdlci5jbGllbnRJbmFjdGl2aXR5VGltZXJPTiA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTaG93IG9yIGhpZGUgdGhlIHNwaW5uZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic2hvd1wiPiA8L3BhcmFtPlxyXG4gIGFzeW5jIENoZWNrQW5kU2hvd1NwaW5uZXIoc2hvdzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHNlbmRDb21tYW5kID0gZmFsc2U7XHJcblxyXG4gICAgLy8gSWYgdGhlIGN1cnJlbnQgZXZlbnQgaXMgb2YgbG93ZXN0IHByaW9yaXR5LCBpdCBpcyBhY3R1YWxseSBzYWZlIHRvIG9wZW4gdXNlciBpbnRlcmFjdGlvbi5cclxuICAgIC8vIFNvLCBzdG9wIHRoZSBzcGlubmVyLlxyXG4gICAgaWYgKHRoaXMuZ2V0TGFzdFJ0RXZlbnQoKSAhPT0gbnVsbCAmJiB0aGlzLmdldExhc3RSdEV2ZW50KCkuZ2V0UHJpb3JpdHkoKSA9PT0gUHJpb3JpdHkuTE9XRVNUKVxyXG4gICAgICBzaG93ID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHNob3cgIT0gdGhpcy5pc1NwaW5uZXJTaG93bikge1xyXG4gICAgICBpZiAoc2hvdykge1xyXG4gICAgICAgIC8vIFNob3cgdGhlIHNwaW5uZXIgb25seSBpZiB0aHJlc2hvbGQgaXMgcmVhY2hlZC5cclxuICAgICAgICAvL1RvRG86IERlZmluZSBhIGNvbnN0IGZvciAxMDAwLiBBbHNvIG1ha2UgaXQgY3VzdG9taXphYmxlIGZyb20gYW5ndWxhciBhcHBcclxuICAgICAgICBpZiAoTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKSAtIHRoaXMuR2V0RXZlbnRUaW1lKCkgPiAxMDAwKSB7XHJcbiAgICAgICAgICBzZW5kQ29tbWFuZCA9IHRydWU7XHJcbiAgICAgICAgICBFdmVudHNNYW5hZ2VyLmNsaWVudEJ1c3lUaW1lU3RhcnQgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgc2VuZENvbW1hbmQgPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKHNlbmRDb21tYW5kKSB7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkU2hvd1NwaW5uZXIoc2hvdyk7XHJcbiAgICAgICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuICAgICAgICAvLyByZWxlYXNlIHRoZSB0aHJlYWQgc28gdGhhdCBmcmFtZXdvcmsgY2FuIHNob3cvaGlkZSB0aGUgc3Bpbm5lclxyXG4gICAgICAgIGF3YWl0IFRocmVhZC5TbGVlcCg1MCk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNTcGlubmVyU2hvd24gPSBzaG93O1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaXNTcGlubmVyU2hvd24pIHtcclxuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgdGltZSBmb3Igd2hpY2ggY2xpZW50IHdhcyBidXN5XHJcbiAgICAgICAgICBsZXQgdG90YWxDbGllbnRCdXN5VGltZSA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgLSBFdmVudHNNYW5hZ2VyLmNsaWVudEJ1c3lUaW1lU3RhcnQ7XHJcbiAgICAgICAgICB0aGlzLlNwaW5uZXJTdG9wcGVkLm5leHQodG90YWxDbGllbnRCdXN5VGltZSk7XHJcbiAgICAgICAgICBFdmVudHNNYW5hZ2VyLmNsaWVudEJ1c3lUaW1lU3RhcnQgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIE1haW4gZXZlbnRzIGxvb3AsIHJ1bnMgaW4gd29ya2VyIHRocmVhZCBmb3IgbWFpbiB3aW5kb3cgYW5kIGZvciBldmVyeVxyXG4gIC8vLyAgIG1vZGFsIHdpbmRvdyBSZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgZXZlbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nRGF0YVwiPiA8L3BhcmFtPlxyXG4gIGFzeW5jIEV2ZW50c0xvb3AobWdEYXRhOiBNR0RhdGEpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzYXZlZEFsbG93RXZlbnRzOiBFdmVudHNBbGxvd2VkVHlwZSA9IHRoaXMuZ2V0QWxsb3dFdmVudHMoKTtcclxuXHJcbiAgICB0aGlzLnNldEFsbG93RXZlbnRzKEV2ZW50c0FsbG93ZWRUeXBlLkFMTCk7XHJcblxyXG4gICAgdGhpcy5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG5cclxuICAgIHdoaWxlICghbWdEYXRhLklzQWJvcnRpbmcpIHtcclxuICAgICAgLy8gSGlkZSB0aGUgc3Bpbm5lciBiZWZvcmUgbW92aW5nIHRvIGlkbGVcclxuICAgICAgYXdhaXQgdGhpcy5DaGVja0FuZFNob3dTcGlubmVyKGZhbHNlKTtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuX2V2ZW50c1F1ZXVlLndhaXRGb3JFbGVtZW50KCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnRzKG1nRGF0YSwgMCk7XHJcblxyXG4gICAgICBpZiAoIW1nRGF0YS5Jc0Fib3J0aW5nKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tQYXJrYWJpbGl0eSgpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgIHRoaXMuc2V0QWxsb3dFdmVudHMoc2F2ZWRBbGxvd0V2ZW50cyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgTm9uIGludGVyYWN0aXZlIGV2ZW50cyBsb29wLCBydW5zIGluIHdvcmtlciB0aHJlYWQgZm9yIG5vbiBpbnRlcmFjdGl2ZSB0YXNrc1xyXG4gIC8vLyAgIFJlc3BvbnNpYmxlIGZvciBjeWNsaW5nIGZvcndhcmQgb24gcmVjb3JkcyBhbmQgaGFuZGxpbmcgZXZlbnRzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ0RhdGFcIj48L3BhcmFtPlxyXG4gIGFzeW5jIE5vbkludGVyYWN0aXZlRXZlbnRzTG9vcChtZ0RhdGE6IE1HRGF0YSwgdGFza0Jhc2U6IFRhc2tCYXNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPnRhc2tCYXNlO1xyXG4gICAgbGV0IHNhdmVkQWxsb3dFdmVudHM6IEV2ZW50c0FsbG93ZWRUeXBlID0gdGhpcy5nZXRBbGxvd0V2ZW50cygpO1xyXG5cclxuICAgIHRoaXMuc2V0Tm9uSW50ZXJhY3RpdmVBbGxvd0V2ZW50cyhhd2FpdCB0YXNrLmlzQWxsb3dFdmVudHMoKSk7XHJcblxyXG4gICAgdGhpcy5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG5cclxuICAgIHdoaWxlICghbWdEYXRhLklzQWJvcnRpbmcpIHtcclxuICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSlcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1lDTEVfTkVYVF9ERUxFVEVfUkVDKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DWUNMRV9ORVhUX1JFQyk7XHJcblxyXG4gICAgICBhd2FpdCBUaHJlYWQuU2xlZXAoMTApO1xyXG5cclxuICAgICAgLy8gcG9sbCBvbmx5IDEgZXZlbnQuXHJcbiAgICAgIGlmICghbWdEYXRhLklzQWJvcnRpbmcgJiYgYXdhaXQgdGFzay5pc0FsbG93RXZlbnRzKCkpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFdmVudHMobWdEYXRhLCAxKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgIHRoaXMuc2V0QWxsb3dFdmVudHMoc2F2ZWRBbGxvd0V2ZW50cyk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBoYW5kbGVFdmVudHMoYmFzZU1nRGF0YTogTUdEYXRhLCBldmVudHNUb0hhbmRsZUNudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiA7XHJcbiAgYXN5bmMgaGFuZGxlRXZlbnRzKGhhbmRsZXJzVGFiOiBIYW5kbGVyc1RhYmxlLCBydEV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiA7XHJcbiAgYXN5bmMgaGFuZGxlRXZlbnRzKGJhc2VNZ0RhdGFPckhhbmRsZXJzVGFiOiBhbnksIGV2ZW50c1RvSGFuZGxlQ250T3JSdEV2dDogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoKGJhc2VNZ0RhdGFPckhhbmRsZXJzVGFiID09PSBudWxsIHx8IGJhc2VNZ0RhdGFPckhhbmRsZXJzVGFiIGluc3RhbmNlb2YgTUdEYXRhKSAmJiAoZXZlbnRzVG9IYW5kbGVDbnRPclJ0RXZ0ID09PSBudWxsIHx8IGV2ZW50c1RvSGFuZGxlQ250T3JSdEV2dC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50c18wKGJhc2VNZ0RhdGFPckhhbmRsZXJzVGFiLCBldmVudHNUb0hhbmRsZUNudE9yUnRFdnQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50c18xKGJhc2VNZ0RhdGFPckhhbmRsZXJzVGFiLCBldmVudHNUb0hhbmRsZUNudE9yUnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhbmQgcmVtb3ZlIGV2ZW50cyBmcm9tIHRoZSBxdWV1ZSBhbmQgaGFuZGxlIHRoZW0gb25lIGJ5IG9uZSB0aWxsIHRoZSBxdWV1ZSBpcyBlbXB0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJiYXNlTWdEYXRhXCI+IG1nZGF0YSBvZiB0aGUgd2luZG93IHRoYXQgb3BlbmVkZWQgdGhhdCBoYWJkbGUgZXZlbnQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiRXZlbnRzVG9IYW5kbGVDbnRcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRXZlbnRzXzAoYmFzZU1nRGF0YTogTUdEYXRhLCBldmVudHNUb0hhbmRsZUNudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IG51bGw7XHJcbiAgICBsZXQgZGVsdGE6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZXZlbnRzUG9sbGVkQ250OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcblxyXG4gICAgLy8gZ2V0IGFuZCByZW1vdmUgZXZlbnRzIGZyb20gdGhlIHF1ZXVlIHRpbGwgaXRzIGVtcHR5XHJcbiAgICB3aGlsZSAoIXRoaXMuX2V2ZW50c1F1ZXVlLmlzRW1wdHkoKSAmJiAhdGhpcy5fc3RvcEV4ZWN1dGlvbiAmJiAoZXZlbnRzVG9IYW5kbGVDbnQgPT09IDAgfHwgZXZlbnRzUG9sbGVkQ250IDwgZXZlbnRzVG9IYW5kbGVDbnQpKSB7XHJcbiAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gdGhpcy5nZXRFdmVudCgpO1xyXG4gICAgICBpZiAocnRFdnQgIT09IG51bGwgJiYgcnRFdnQuaXNHdWlUcmlnZ2VyZWRFdmVudCgpKSB7XHJcbiAgICAgICAgZGVsdGEgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpO1xyXG4gICAgICAgIHRoaXMuX2N1cnJLYmRJdGVtID0gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IGJsb2NrZWRCeU1vZGFsV2luZG93OiBib29sZWFuID0gcnRFdnQuaXNCbG9ja2VkQnlNb2RhbFdpbmRvdyhiYXNlTWdEYXRhKTtcclxuICAgICAgICBpZiAoYmxvY2tlZEJ5TW9kYWxXaW5kb3cgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9USU1FUikgLy8gUUNSICM3MjYxOTgsIGV2ZW50cyBmcm9tIC5ORVQgb2JqZWN0cyB3aGljaCBhcmUgbm90IG9uIGZvcm1cclxuICAgICAgICAvLyBzaG91bGQgYmUgaGFuZGxlZCBvbiBwYXJlbnQgb2YgbW9kYWwgd2luZG93IGFsc29cclxuICAgICAgICB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElkbGUgdGltZXIsIHRpbWVyIGV2ZW50cyBhbmQgZW5hYmxlL2Rpc2FibGUgZXZlbnRzIHNob3VsZCBub3QgY2hhbmdlIHRoZSBjdXJyZW50IHdpbmRvdy5cclxuICAgICAgICAvLyBUaGlzIGlzIGJlY2F1c2UgdGhlIGN1cnJlbnQgd2luZG93IGRldGVybWluZXMgdGhlIGN1cnJlbnQgdGFzayBhbmQgY2hhbmdpbmcgdGhlIHRhc2tcclxuICAgICAgICAvLyBjYXVzZXMgc29tZSB0YXNrLXNjb3BlZCBldmVudHMgdG8gcnVuIG9uIHN1Yi10YXNrcyBhcyB3ZWxsLlxyXG4gICAgICAgIGlmICghcnRFdnQuaXNJZGxlVGltZXIoKSAmJiAhYmxvY2tlZEJ5TW9kYWxXaW5kb3cgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FTkFCTEVfRVZFTlRTICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRElTQUJMRV9FVkVOVFMgJiYgcnRFdnQuZ2V0VGFzaygpICE9PSBudWxsICYmICFydEV2dC5nZXRUYXNrKCkuZ2V0TUdEYXRhKCkuSXNBYm9ydGluZykge1xyXG4gICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5jdXJyTWdkSUQgPSBydEV2dC5nZXRUYXNrKCkuZ2V0TUdEYXRhKCkuR2V0SWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGN1cnJNZ2Q6IE1HRGF0YSA9IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0Q3Vyck1HRGF0YSgpO1xyXG4gICAgICBpZiAoY3Vyck1nZCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHdoaWxlIChjdXJyTWdkICE9PSBudWxsICYmIGN1cnJNZ2QuSXNBYm9ydGluZykge1xyXG4gICAgICAgICAgY3Vyck1nZCA9IGN1cnJNZ2QuZ2V0UGFyZW50TUdkYXRhKCk7XHJcbiAgICAgICAgICBpZiAoY3Vyck1nZCAhPT0gbnVsbClcclxuICAgICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5jdXJyTWdkSUQgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldE1nRGF0YUlkeChjdXJyTWdkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLyogUUNScyAjNzc3MjE3ICYgIzk0Mjk2OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAvKiBJdCBtaWdodCBoYXBwZW4gdGhhdCB3ZSBoYXZlIHJlbW92ZWQgdGhlIE1HRGF0YSAgICAqL1xyXG4gICAgICAgIC8qIGZyb20gdGhlIE1HVGFibGUgaW4gTWFuYWdlci5DbG9zZUV2ZW50KCkuICAqL1xyXG4gICAgICAgIC8qIEl0IHdhcyBkb25lIGZvciBmaXhpbmcgUUNSIyAyOTYyNzcgcmVsYXRpbmcgdG8gbWVtICovXHJcbiAgICAgICAgLyogbGVha3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAvKiBJbiB0aGF0IGNhc2UsIG1nZCB3b3VsZCBiZSBudWxsIGhlcmUuICAgICAgICAgICAgICAqL1xyXG4gICAgICAgIC8qIEluIHN1Y2ggYSBzY2VuYXJpbywgdGFrZSB0aGUgcGFyZW50IG1nZCBmcm9tIHRoZSAgICovXHJcbiAgICAgICAgLyogcmVsYXRlZCB0YXNrIGFuZCBjb250aW51ZSBwcm9jZXNzaW5nIHRoZSBldmVudHMuICAgKi9cclxuICAgICAgICB0YXNrID0gPFRhc2s+cnRFdnQuZ2V0VGFzaygpO1xyXG4gICAgICAgIHdoaWxlIChjdXJyTWdkID09PSBudWxsICYmIHRhc2sgIT09IG51bGwgJiYgdGFzay5nZXRQYXJlbnQoKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgdGFzayA9IDxUYXNrPnRhc2suZ2V0UGFyZW50KCk7XHJcbiAgICAgICAgICBjdXJyTWdkID0gdGFzay5nZXRNR0RhdGEoKTtcclxuICAgICAgICAgIGlmIChjdXJyTWdkLklzQWJvcnRpbmcpXHJcbiAgICAgICAgICAgIGN1cnJNZ2QgPSBudWxsO1xyXG5cclxuICAgICAgICAgIGlmIChjdXJyTWdkICE9PSBudWxsKVxyXG4gICAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmN1cnJNZ2RJRCA9IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TWdEYXRhSWR4KGN1cnJNZ2QpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoY3Vyck1nZCA9PT0gbnVsbClcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGlmIChydEV2dC5nZXRUYXNrKCkgPT09IG51bGwpIHtcclxuICAgICAgICB0YXNrID0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG4gICAgICAgIHdoaWxlICh0YXNrICE9PSBudWxsICYmICh0YXNrLmlzQWJvcnRpbmcoKSB8fCB0YXNrLkluRW5kVGFzaykpXHJcbiAgICAgICAgICB0YXNrID0gPFRhc2s+dGFzay5nZXRQYXJlbnQoKTtcclxuXHJcbiAgICAgICAgaWYgKHRhc2sgIT09IG51bGwpIHtcclxuICAgICAgICAgIHJ0RXZ0LnNldEN0cmwoPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCkpO1xyXG4gICAgICAgICAgcnRFdnQuc2V0VGFzayh0YXNrKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICAgIHRhc2sgPSA8VGFzaz5ydEV2dC5nZXRUYXNrKCk7XHJcblxyXG4gICAgICBpZiAodGFzayAhPT0gbnVsbCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgR1VJTWFuYWdlci5JbnN0YW5jZS5leGVjR3VpQ29tbWFuZFF1ZXVlKCk7XHJcbiAgICAgIHRoaXMuX2N1cnJDdHJsID0gbnVsbDsgLy8gZGVsZXRlIGN1cnJlbnQgcHJvY2Vzc2VkIGNvbnRyb2xcclxuXHJcbiAgICAgIGlmICh0YXNrICE9PSBudWxsKVxyXG4gICAgICAgIGF3YWl0IFRhc2suQ29tbWFuZHNQcm9jZXNzb3IuU2VuZE1vbml0b3JPbmx5KCk7XHJcbiAgICAgIGVsc2Uge1xyXG5cclxuICAgICAgICBhd2FpdCBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yLlNlbmRNb25pdG9yT25seSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocnRFdnQgIT09IG51bGwgJiYgcnRFdnQuaXNHdWlUcmlnZ2VyZWRFdmVudCgpKSB7XHJcbiAgICAgICAgLy8gbG9nZ2luZyBmb3IgcGVyZm9ybWFuY2VcclxuICAgICAgICBpZiAoZGVsdGEgPiAwKSB7XHJcbiAgICAgICAgICBkZWx0YSA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgLSBkZWx0YTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGFkdmFuY2UgRXZlbnRzUG9sbGVkIG9ubHkgaWYgdGhlIGV2ZW50IGlzIGludGVybmFsLiBvdGhlcndpc2UgaW50ZXJuYWxzIHRvIGJlIGV4ZWN1dGVkIHdpbGwgYmUgbmV2ZXIgcmVhY2hlZCBieSBub24gaW50ZXJhY3RpdmUgdGFza3MuXHJcbiAgICAgIGlmIChldmVudHNUb0hhbmRsZUNudCA+IDAgJiYgcnRFdnQgIT09IG51bGwgJiYgcnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIHJ0RXZ0LkludGVybmFsRXZlbnQgPCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVE9UX0NOVClcclxuICAgICAgICBldmVudHNQb2xsZWRDbnQrKztcclxuICAgIH0gLy8gd2hpbGUgKCFfZXZlbnRzUXVldWUuaXNFbXB0eSgpIC4uLlxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGUgc3RvcCBleGVjdXRpb24gd2hpbGUgZXhlY3V0aW5nIGFueSBoYW5kbGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlU3RvcEV4ZWN1dGlvbihydEV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgc3RvcDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICByZXR1cm4gc3RvcDtcclxuXHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPnJ0RXZ0LmdldFRhc2soKTtcclxuICAgIGxldCBjdXJyQ3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5ydEV2dC5Db250cm9sO1xyXG4gICAgbGV0IGxhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcbiAgICBsZXQgZW5kVGFza0R1ZVRvVmVyaWZ5RXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuICAgICAgc3dpdGNoIChydEV2dC5nZXRJbnRlcm5hbENvZGUoKSkge1xyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfUFJFRklYOlxyXG4gICAgICAgICAgZW5kVGFza0R1ZVRvVmVyaWZ5RXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVg6XHJcbiAgICAgICAgICAvLyBBbiBlcnJvciBpbiB0aGUgcmVjb3JkIHByZWZpeCBzZW5kcyB1cyByaWdodCBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgcmVjb3JkIHByZWZpeC5cclxuICAgICAgICAgIC8vIEl0IG1pZ2h0IGNyZWF0ZSBhbiBlbmRsZXNzIGxvb3AgYnV0IGl0IGlzIE9LIHRvIGRvIHNvLiBJdCBpcyBhIGRldmVsb3BlciBidWcuXHJcbiAgICAgICAgICBlbmRUYXNrRHVlVG9WZXJpZnlFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWDpcclxuICAgICAgICAgIC8vIGl0IHdpbGwgYmUgaGFuZGxlZCBpbiBjb21tb25oYW5kbGVyYWZ0ZXJcclxuICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwobnVsbCk7XHJcbiAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25DdHJsKDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWDpcclxuICAgICAgICAgIC8vIEVycm9yIG1pZ2h0IGhhdmUgb2NjdXJyZWQgaW4gQ1AuXHJcbiAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG4gICAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAobGFzdFBhcmtlZEN0cmwgPT09IG51bGwpXHJcbiAgICAgICAgICAvLyBvbmx5IGZvciB0aGUgZmlyc3QgdGltZVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0YXNrLnNldEN1cnJGaWVsZChudWxsKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBzdG9wIGV4ZWN1dGlvbiBjdHJsXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwobnVsbCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwoY3VyckN0cmwpO1xyXG5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVOb25QYXJrYWJsZUNvbnRyb2xzKHRhc2spO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gQ1AgZ290IHN0b3AgZXhlY3V0aW9uIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9ucyBpbiB0aGlzIGhhbmRsZXIgYW5kIGlzIHBhcmthYmxlLlxyXG4gICAgICAgICAgICAvLyB3ZSBtb3ZlIHRvIHRoZSBMYXN0UGFya2FibGUgY29udHJvbFxyXG5cclxuICAgICAgICAgICAgdGFzay5zZXRDdXJyRmllbGQobGFzdFBhcmtlZEN0cmwuZ2V0RmllbGQoKSk7XHJcblxyXG4gICAgICAgICAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMobGFzdFBhcmtlZEN0cmwsIC0xKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWDpcclxuICAgICAgICAgIC8vIEl0IG11c3QgYmUgc2V0IHRvIGZhbHNlIHNvIHRoYXQgbmV4dCB0aW1lIGZvciBmYXN0IG1vZGUgQ1MgbXVzdCBiZSBleGVjdXRlZC5cclxuICAgICAgICAgIGN1cnJDdHJsLnNldEluQ29udHJvbFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIH1cclxuICAgICAgaWYgKGVuZFRhc2tEdWVUb1ZlcmlmeUVycm9yKSB7XHJcbiAgICAgICAgYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICBzdG9wID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0b3A7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdGFrZSBjYXJlIG9mIFwiRm9yY2UgRXhpdFwiIGJlZm9yZSB0aGUgaGFuZGxlciBleGVjdXRlIGl0cyBvcGVyYXRpb25zIHJldHVybnMgdHJ1ZVxyXG4gIC8vLyAgIGlmIHRoZSBmb3JjZSBleGl0IHdhcyBoYW5kbGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2ZW50XCI+dGhlIGV2ZW50IG9mIHRoZSBoYW5kbGVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBydW4tdGltZSBldmVudFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRm9yY2VFeGl0QmVmb3JlKGV2dDogRXZlbnQsIHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBmb3JjZUV4aXQ6IEZvcmNlRXhpdCA9IGV2dC5Vc2VyRXZ0LkZvcmNlRXhpdDtcclxuICAgIGxldCBpc05ld1JlYzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IG9sZElkeDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvLyBUT0RPOiBjaGVjayB0aGUgZWZmZWN0IG9mIHJlbW92aW5nIGZvcmNlRXhpdCA9PT0gPEZvcmNlRXhpdD4wXHJcbiAgICBpZiAoZm9yY2VFeGl0ID09PSBGb3JjZUV4aXQuTm9uZSB8fCBydEV2dC5pc0ltbWVkaWF0ZSgpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB0aGlzLl9pc0hhbmRsaW5nRm9yY2VFeGl0ID0gdHJ1ZTtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+cnRFdnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IG9sZFJlYzogUmVjb3JkID0gKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICBpZiAob2xkUmVjICE9PSBudWxsICYmIG9sZFJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQgJiYgb2xkUmVjLmlzTmV3UmVjKCkpIHtcclxuICAgICAgaXNOZXdSZWMgPSB0cnVlO1xyXG4gICAgICBvbGRJZHggPSBvbGRSZWMuZ2V0SWQoKTtcclxuICAgIH1cclxuICAgIGlmIChmb3JjZUV4aXQgIT09IEZvcmNlRXhpdC5FZGl0aW5nICYmIHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCkge1xyXG4gICAgICBsZXQgY3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgIGlmIChjdHJsICE9PSBudWxsKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2hvdWxkIHdlIGV4aXQgdGhlIHJlY29yZD9cclxuICAgIGlmICgoZm9yY2VFeGl0ID09PSBGb3JjZUV4aXQuUHJlUmVjb3JkVXBkYXRlIHx8IGZvcmNlRXhpdCA9PT0gRm9yY2VFeGl0LlBvc3RSZWNvcmRVcGRhdGUpICYmIHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJiAhdGhpcy5fc3RvcEV4ZWN1dGlvbilcclxuICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICBsZXQgY3VyclJlYzogUmVjb3JkID0gKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICAgIC8vIElmIHdlIGZhaWxlZCBleGl0aW5nIGEgbmV3bHkgY3JlYXRlZCByZWNvcmQgLSByZXN0b3JlIGluc2VydCBtb2RlIG9mIHRoZSByZWNvcmRcclxuICAgICAgaWYgKGN1cnJSZWMgIT09IG51bGwgJiYgdGhpcy5fc3RvcEV4ZWN1dGlvbiAmJiBpc05ld1JlYyAmJiBvbGRJZHggPT09IGN1cnJSZWMuZ2V0SWQoKSAmJiB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAvLyByZXN0b3JlIGluc2VydCBtb2RlIG9mIHRoZSByZWNvcmRcclxuICAgICAgICBjdXJyUmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgIGN1cnJSZWMucmVzdGFydChEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGZvcmNlRXhpdCA9PT0gRm9yY2VFeGl0LlBvc3RSZWNvcmRVcGRhdGUgJiYgIXRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUUNSICMzMDM3NjIgLSBhZGRpdGlvbmFsIHN1cHBvcnQgZm9yIGZvcmNlRXhpdCA9IGVkaXRpbmdcclxuICAgIGlmIChmb3JjZUV4aXQgPT09IEZvcmNlRXhpdC5FZGl0aW5nKSB7XHJcbiAgICAgIGxldCBldnRDdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnJ0RXZ0LkNvbnRyb2w7XHJcblxyXG4gICAgICBpZiAoZXZ0Q3RybCAhPT0gbnVsbCAmJiBldnRDdHJsLmdldEZpZWxkKCkgIT09IG51bGwpIHtcclxuICAgICAgICBsZXQgY3RybFZhbDogc3RyaW5nID0gTWFuYWdlci5HZXRDdHJsVmFsKGV2dEN0cmwpO1xyXG4gICAgICAgIC8vIHRlc3QgdGhlIG5ldyBjb250cm9sIHZhbHVlXHJcbiAgICAgICAgYXdhaXQgZXZ0Q3RybC52YWxpZGF0ZUFuZFNldFZhbHVlKGN0cmxWYWwsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0YWtlIGNhcmUgb2YgXCJGb3JjZSBFeGl0XCIgYWZ0ZXIgaGFuZGxpbmcgdGhlIGV2ZW50IDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+dGhlIHJ1bi10aW1lIGV2ZW50IDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVGb3JjZUV4aXRBZnRlcihydEV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZm9yY2VFeGl0OiBGb3JjZUV4aXQgPSBydEV2dC5Vc2VyRXZ0LkZvcmNlRXhpdDtcclxuXHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPnJ0RXZ0LmdldFRhc2soKTtcclxuXHJcbiAgICAvLyBRQ1IjNzc2Mjk1OiBmb3IgcHJlIHJlY29yZCB1cGRhdGUsIGNvbW1pdCB0aGUgcmVjb3JkIGFmdGVyIGhhbmRsZXIncyBleGVjdXRpb24uXHJcbiAgICBpZiAoZm9yY2VFeGl0ID09PSBGb3JjZUV4aXQuUHJlUmVjb3JkVXBkYXRlKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuY29tbWl0UmVjb3JkKHRhc2ssIHRydWUpO1xyXG4gICAgICBpZiAoIXRhc2sudHJhbnNhY3Rpb25GYWlsZWQoQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCkgJiYgIXRhc2suaXNBYm9ydGluZygpKSB7XHJcbiAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0byBldmFsdWF0ZSB0aGUgZW5kIGNvbmRpdGlvbiBhZnRlciB0aGUgcmVjb3JkIHN1ZmZpeFxyXG4gICAgICAgIGlmIChhd2FpdCB0YXNrLmV2YWxFbmRDb25kKENvbnN0SW50ZXJmYWNlLkVORF9DT05EX0VWQUxfQUZURVIpKVxyXG4gICAgICAgICAgYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBGb3IgcG9zdC1yZWNvcmQgdHlwZSB3ZSBhbHJlYWR5IGRpZCByZWMtcHJlZml4IGFuZCBjdHJsIHByZWZpeCBpbiB0aGUgaGFuZGxlRm9yY2VFeGl0QmVmb3JlXHJcbiAgICBpZiAoZm9yY2VFeGl0ICE9PSBGb3JjZUV4aXQuUG9zdFJlY29yZFVwZGF0ZSkge1xyXG4gICAgICB0YXNrID0gPFRhc2s+cnRFdnQuZ2V0VGFzaygpO1xyXG4gICAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgIH1cclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcbiAgICBpZiAoY3RybCAhPT0gbnVsbCAmJiBmb3JjZUV4aXQgIT09IEZvcmNlRXhpdC5FZGl0aW5nKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUUNSIDgwMTg3MyAtIHVwZGF0ZSB0aGUgZGlzcGxheSBhZnRlciBoYW5kbGVyIG9mIGZvcmNlIGV4aXQgZWRpdGluZ1xyXG4gICAgaWYgKGZvcmNlRXhpdCA9PT0gRm9yY2VFeGl0LkVkaXRpbmcpIHtcclxuICAgICAgbGV0IGV2dEN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+cnRFdnQuQ29udHJvbDtcclxuICAgICAgLy8gaWYgdGhlcmUgaXMgYSBjb250cm9sIHRoYXQgaXMgYXR0YWNoZWQgdG8gYSBmaWVsZFxyXG4gICAgICBpZiAoZXZ0Q3RybCAhPT0gbnVsbCAmJiBldnRDdHJsLmdldEZpZWxkKCkgIT09IG51bGwpXHJcbiAgICAgICAgYXdhaXQgKDxGaWVsZD5ldnRDdHJsLmdldEZpZWxkKCkpLnVwZGF0ZURpc3BsYXkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhIHNwZWNpYWwgcm91dGluZSB0byBoYW5kbGUgZGF0YSBhbmQgdGltZXIgZXZlbnRzXHJcbiAgLy8vICAgaXQgcmVjZWl2ZXMgYSBIYW5kbGVyc1RhYmxlIGFuZCBleGVjdXRlIHRoZW0gb25lIGJ5IG9uZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJoYW5kbGVyc1RhYlwiPnRoZSBoYW5kbGVycyB0YWJsZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPmEgcmVmZXJlbm5jZSB0byB0aGUgdGltZXIgcnVudGltZSBldmVudCAtIGZvciBleHByZXNzaW9uIGV2ZW50cyBpdCBtdXN0IGJlIG51bGw8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRXZlbnRzXzEoaGFuZGxlcnNUYWI6IEhhbmRsZXJzVGFibGUsIHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMucHVzaFJ0RXZlbnQocnRFdnQpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgaGFuZGxlcnNUYWIuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgICBsZXQgaGFuZGxlcjogRXZlbnRIYW5kbGVyID0gaGFuZGxlcnNUYWIuZ2V0SGFuZGxlcihpKTtcclxuICAgICAgICAvLyB0aGUgcnRFdnQgaXMgdXNlZCB0byBwYXNzIHRoZSBjdHJsLCB0aGVyZWZvciBpdCBtdXN0IGJlIHZhbGlkIChub3QgbnVsbClcclxuICAgICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0VYUFJFU1NJT04gfHwgaGFuZGxlci5pc1NwZWNpZmljSGFuZGxlck9mKHJ0RXZ0KSB8fCBoYW5kbGVyLmlzTm9uU3BlY2lmaWNIYW5kbGVyT2YocnRFdnQpIHx8IGhhbmRsZXIuaXNHbG9iYWxIYW5kbGVyT2YocnRFdnQpKSB7XHJcbiAgICAgICAgICBhd2FpdCBoYW5kbGVyLmV4ZWN1dGUocnRFdnQsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLnBvcFJ0RXZlbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUYWtlcyBjYXJlIG9mIGtleWRvd24gRXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPnRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmNvbnRyb2wgcHJlc3NlZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJrYmRJdGVtXCI+a2V5Ym9yZCBpdGVtPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUtleURvd24odGFzazogVGFzaywgY3RybDogTWdDb250cm9sLCBldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGtiZEl0ZW06IEtleWJvYXJkSXRlbSA9IGV2dC5nZXRLYmRJdG1BbHdheXMoKTtcclxuICAgIGxldCBrZXlDb2RlOiBudW1iZXIgPSBrYmRJdGVtLmdldEtleUNvZGUoKTtcclxuICAgIHRoaXMuX2N1cnJLYmRJdGVtID0ga2JkSXRlbTtcclxuXHJcbiAgICAvLyBJZiBrZXlib2FyZCBidWZmZXJpbmcgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgZXZlbnQsIHdlIG5lZWQgdG8gZmluZCB0aGUgcmlnaHQgY29udHJvbCB0byByZWNlaXZlXHJcbiAgICAvLyB0aGlzIGV2ZW50XHJcbiAgICBpZiAoZXZ0Lklnbm9yZVNwZWNpZmllZENvbnRyb2wpIHtcclxuICAgICAgY3RybCA9IHRoaXMuZ2V0Q3VyckN0cmwoKTtcclxuICAgICAgdGFzayA9ICgoKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSBpbnN0YW5jZW9mIFRhc2spID8gPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpIDogbnVsbCkpO1xyXG4gICAgICAvLyBUaGUgY29udHJvbCByZWNlaXZpbmcga2V5cyBmcm9tIGtleWJvYXJkIGJ1ZmZlcmluZyBtdXN0IGJlIGEgdGV4dGJveFxyXG4gICAgICBpZiAoY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9URVhUKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZygnU3RhcnQgaGFuZGxpbmcgS0VZRE9XTiBldmVudC4gS2V5IGNvZGU6ICcgKyBrZXlDb2RlKTtcclxuXHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgLy8gRE9XTiBvciBVUCBpbnZva2VkIG9uIGEgU0VMRUNUL1JBRElPIGNvbnRyb2xcclxuICAgICAgaWYgKHRoaXMuX2N1cnJLYmRJdGVtLmVxdWFscyh0aGlzLktCSV9ET1dOKSB8fCB0aGlzLl9jdXJyS2JkSXRlbS5lcXVhbHModGhpcy5LQklfVVApKSB7XHJcbiAgICAgICAgaWYgKGN0cmwgIT09IG51bGwgJiYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElTVCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPKSlcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KHRhc2ssIGN0cmwpO1xyXG4gICAgICBydEV2dC5zZXRTeXN0ZW0odGhpcy5fY3VycktiZEl0ZW0pO1xyXG4gICAgICBydEV2dC5zZXRFZGl0UGFybXMoZXZ0LmdldFN0YXJ0U2VsZWN0aW9uKCksIGV2dC5nZXRFbmRTZWxlY3Rpb24oKSwgZXZ0LmdldFZhbHVlKCkpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgbGV0IHJldHVyblRvQ3RybDogTWdDb250cm9sID0gTWdDb250cm9sLlJldHVyblRvQ3RybDtcclxuICAgICAgICAgIGlmIChyZXR1cm5Ub0N0cmwgIT09IG51bGwgJiYgTWdDb250cm9sLnZhbGlkUmV0dXJuVG9DdHJsKCkpXHJcbiAgICAgICAgICAgIHJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExhc3RQYXJrZWRDdHJsKHJldHVyblRvQ3RybCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBtZ2Q6IE1HRGF0YSA9IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0Q3Vyck1HRGF0YSgpO1xyXG4gICAgICAvLyBjaGVjayBpZiB0aGUgTUdEYXRhIGlzIHN0aWxsIGFsaXZlIGFmdGVyIGhhbmRsaW5nIHRoZSBldmVudHMgYWJvdmVcclxuICAgICAgaWYgKG1nZCAhPT0gbnVsbCAmJiAhbWdkLklzQWJvcnRpbmcpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFeHByZXNzaW9uSGFuZGxlcnMoKTtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coJ0VuZCBoYW5kbGluZyBLRVlET1dOIGV2ZW50LiBLZXkgY29kZTogJyArIGtleUNvZGUpO1xyXG4gICAgICAvLyBpZiBhIGtleSB3YXMgcHJlc3NlZCBvbiB0YWJsZSBjaGlsZCwgbWFrZSBzdXJlIHRoYXQgaXMgaXMgdmlzaWJsZVxyXG4gICAgICBpZiAoY3RybCAhPT0gbnVsbCAmJiBjdHJsLklzUmVwZWF0YWJsZSAmJiBjdHJsID09PSBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsKSB7XHJcbiAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+Y3RybC5nZXRGb3JtKCkpLmJyaW5nUmVjb3JkVG9QYWdlKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZmluYWxseSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+SGFuZGxlIFNlbGVjdGlvbiBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj5jb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj5saW5lPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbHVlXCI+dmFsdWU8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlU2VsZWN0aW9uKGN0cmw6IE1nQ29udHJvbCwgbGluZTogbnVtYmVyLCB2YWw6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1ggfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTyB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTUJPIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElTVCkge1xyXG4gICAgICBsZXQgY2hlY2tGb2N1czogYm9vbGVhbiA9IChjdHJsLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RBQiAmJiBjdHJsLlR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YKTtcclxuICAgICAgbGV0IGFsbG93U2VsZWN0aW9uOiBib29sZWFuID0gKGNoZWNrRm9jdXMgPyAoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldExhc3RQYXJrZWRDdHJsKCkgPT09IGN0cmwpIDogdHJ1ZSk7XHJcblxyXG4gICAgICBpZiAoIWFsbG93U2VsZWN0aW9uIHx8ICFjdHJsLmlzTW9kaWZpYWJsZSgpIHx8ICFhd2FpdCBjdHJsLklzUGFya2FibGUoKSlcclxuICAgICAgICBhd2FpdCBjdHJsLnJlc3RvcmVPbGRWYWx1ZSgpO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoY3RybC5pc0Nob2ljZUNvbnRyb2woKSlcclxuICAgICAgICAgIENvbW1hbmRzLnNldEdldFN1Z2dlc3RlZFZhbHVlT2ZDaG9pY2VDb250cm9sT25UYWdEYXRhKGN0cmwsIGN0cmwuSXNSZXBlYXRhYmxlID8gbGluZSA6IDAsIHRydWUpO1xyXG5cclxuICAgICAgICBpZiAoY3RybC5pc0RpZmZlcmVudFZhbHVlKHZhbCwgY3RybC5Jc051bGwsIHRydWUpKSB7XHJcbiAgICAgICAgICAvLyAjOTMxNTQ1IC0gdmFyIGNoYW5nZSBtdXN0IGJlIGludm9rZWQgZmlyc3QgYmVmb3JlIGNvbnRyb2wgdmVyaWZpY2F0aW9uLlxyXG4gICAgICAgICAgY3RybC5Nb2RpZmllZEJ5VXNlciA9IHRydWU7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUN0cmxNb2RpZnkoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVElPTik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY3RybC5pc0Nob2ljZUNvbnRyb2woKSlcclxuICAgICAgICAgIENvbW1hbmRzLnNldEdldFN1Z2dlc3RlZFZhbHVlT2ZDaG9pY2VDb250cm9sT25UYWdEYXRhKGN0cmwsIGN0cmwuSXNSZXBlYXRhYmxlID8gbGluZSA6IDAsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgLy8gRm9yIG11bHRpcGxlIHNlbGVjdGlvbiBMaXN0Qm94IHZhbHVlIHRvIGZpZWxkIGFuZCBjdHJsIHdvdWxkIGJlIHNldCBvbiBsZWF2aW5nXHJcbiAgICAgICAgLy8gY29udHJvbCwgYmVmb3JlIGV4ZWN1dGluZyBjb250cm9sIHN1ZmZpeC4gU28gdmFyaWFibGUgY2hhbmdlIGludGVybmFsIGV2ZW50IHdvdWxkIGJlXHJcbiAgICAgICAgLy8gaGFuZGxlZCBiZWZvcmUgZXhlY3V0aW5nIGNvbnRyb2wgc3VmZml4LlxyXG4gICAgICAgIGlmICghY3RybC5Jc011bHRpcGxlU2VsZWN0aW9uTGlzdEJveCgpKVxyXG4gICAgICAgICAgYXdhaXQgY3RybC52YWxpZGF0ZUFuZFNldFZhbHVlKHZhbCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGUgTW91c2UgVXAgRXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmNvbnRvbFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPmxpbmUgb2YgbXVsdGlsaW5lIGNvbnRyb2xcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb2R1Y2VDbGlja1wiPmlmIHRydWUsIHByb2R1Y2UgY2xpY2sgZXZlbnRcclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZU1vdXNlVXAoY3RybDogTWdDb250cm9sLCBsaW5lOiBudW1iZXIsIHByb2R1Y2VDbGljazogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGN0cmwgPT09IG51bGwpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICAvLyBRQ1IgIyA2MTQ0IHNlZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgX2N1cnJDbGlja2VkUmFkaW8gbWVtYmVyXHJcbiAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTylcclxuICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkN1cnJlbnRDbGlja2VkUmFkaW8gPSBjdHJsO1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKGN0cmwuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEUpIHtcclxuICAgICAgICBpZiAoIWF3YWl0IGN0cmwuY2hlY2tQcm9wV2l0aExpbmUoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5BQkxFRCwgdHJ1ZSwgbGluZSkpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNhbkdvdG9DdHJsOiBib29sZWFuID0gdGhpcy5jYW5Hb1RvQ29udHJvbChjdHJsLCB0cnVlKTtcclxuICAgICAgICBsZXQgU3RvcEZvY3VzOiBib29sZWFuID0gY3RybC5pc0ZvY3VzZWRTdG9wRXhlY3V0aW9uKCk7XHJcblxyXG4gICAgICAgIGxldCByZXR1cm5Ub0N0cmw6IE1nQ29udHJvbCA9IE1nQ29udHJvbC5SZXR1cm5Ub0N0cmw7XHJcblxyXG4gICAgICAgIGlmICgoIWNhbkdvdG9DdHJsIHx8ICgodGhpcy5fc3RvcEV4ZWN1dGlvbiB8fCBTdG9wRm9jdXMpICYmIHJldHVyblRvQ3RybCAhPT0gY3RybCkpICYmIHJldHVyblRvQ3RybCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5jdXJyTWdkSUQgPSAoPFRhc2s+cmV0dXJuVG9DdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldE1nZElEKCk7XHJcbiAgICAgICAgICBpZiAocmV0dXJuVG9DdHJsLklzUmVwZWF0YWJsZSlcclxuICAgICAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+cmV0dXJuVG9DdHJsLmdldEZvcm0oKSkuYnJpbmdSZWNvcmRUb1BhZ2UoKTtcclxuICAgICAgICAgIGF3YWl0IEZvY3VzTWFuYWdlci5TZXRGb2N1cyhyZXR1cm5Ub0N0cmwsIC0xKTtcclxuICAgICAgICAgIHJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExhc3RQYXJrZWRDdHJsKHJldHVyblRvQ3RybCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uIHx8IFN0b3BGb2N1cylcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHByb2R1Y2VDbGljayAmJiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJU1QpKSB7XHJcbiAgICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwpO1xyXG4gICAgICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9XRUJfQ0xJQ0spO1xyXG4gICAgICAgIHRoaXMuYWRkVG9UYWlsKHJ0RXZ0KTtcclxuICAgICAgfVxyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkN1cnJlbnRDbGlja2VkUmFkaW8gPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgQ2hlY2sgaWYgY3R4IGlzIHJlbW92ZWQgZnJvbSBzZXJ2ZXIsIGlmIHNvIGFuZCBjdXJyZW50IGV2ZW50IGlzIHJvdXRlIGV2ZW50ICwgdGhlbiBzYXZlIGl0XHJcbiAgLy8gIHRvIGV4ZWN1dGUgYWdhaW4gd2hlbiAgc2VydmVyIGN0eCBpcyByZWNyZWF0ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNoZWNrQW5kU2F2ZVJvdXRlRXZlbnRJZkN0eFJlbW92ZWRGcm9tU3J2cihhUnRFdnQ6IGFueSk6IHZvaWQge1xyXG5cclxuICAgIGlmIChhUnRFdnQuZ2V0VHlwZSgpID09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgYVJ0RXZ0LmdldEludGVybmFsQ29kZSgpID09XHJcbiAgICAgIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9XRUJDTElFTlRfUk9VVEUgJiYgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlJlbW92ZWRDb250ZXh0RnJvbVNlcnZlcikge1xyXG4gICAgICB0aGlzLnNldExhc3RTYXZlZFJvdXRlRXZlbnQoYVJ0RXZ0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGUgRm9jdXMgRXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+bGluZSBvZiBtdWx0aWxpbmUgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvbkNsaWNrXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUZvY3VzKGN0cmw6IE1nQ29udHJvbCwgbGluZTogbnVtYmVyLCBvbkNsaWNrOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgaWYgKGN0cmwuaXNTdGF0aWMoKSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAvLyBJZiB3ZSBhdHRlbXB0IHRvIHBhcmsgb24gY29udHJvbCB3aGVyZSB3ZSBkbyBub3Qgd2FudCB0byBhbGxvdyB0byBwYXJrIGxpa2UgaWYgY29udHJvbCBoYXMgZXhwcmVzc2lvbiBvciBwYXJlbnQgdGFzayBmaWVsZCwgZG8gbm90IGFsbG93IHRvIGZvY3VzIG9uIGl0LlxyXG4gICAgICAvLyBTZXQgRm9jdXMgYmFjayB0byBsYXN0Rm9jdXNlZENvbnRyb2wuIFdlIG5lZWQgX2xhc3RGYWlsZWRGb2N1c2VkQ29udHJvbCBhcyB3ZSBnZXQgZm9jdXMgZXZlbnQgb24gYSBjb250cm9sIHR3aWNlLiBTbyB0byBhdm9pZCB0byBzaG93IGVycm9yIG11bHRpcGxlIHRpbWVzLFxyXG4gICAgICAvLyBtYWludGFpbiBfbGFzdEZhaWxlZEZvY3VzZWRDb250cm9sLlxyXG4gICAgICBpZiAoY3RybCAhPT0gdGhpcy5fbGFzdEZhaWxlZEZvY3VzZWRDb250cm9sICYmIGN0cmwuSGFzRXhwT3JQYXJlbnRUYXNrRmllbGQoKSkge1xyXG4gICAgICAgIC8vIFNob3cgZXJyb3Igb25seSBmb3IgY29udHJvbHMgaGF2aW5nIERhdGEgcHJvcGVydHkgYW5kIHBhcmthYmxlXHJcbiAgICAgICAgaWYgKGN0cmwuaXNMaXN0Qm94KCkgfHwgY3RybC5pc0NoZWNrQm94KCkgfHwgY3RybC5pc0NvbWJvQm94KCkgfHwgY3RybC5pc1RleHRDb250cm9sKCkgfHwgY3RybC5pc1JhZGlvKCkgfHwgY3RybC5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXJyb3JUb0xvZyhOU3RyaW5nLkZvcm1hdCgnQ29udHJvbCBlaXRoZXIgaGFzIGV4cHJlc3Npb24gb3IgaGFzIHBhcmVudCB0YXNrIHZhcmlhYmxlIGF0dGFjaGVkIHRvIGl0LiBGYWlsZWQgdG8gcGFyayBvbiBjb250cm9sIHdpdGggbmFtZTogezB9JywgY3RybC5OYW1lKSk7XHJcbiAgICAgICAgICAvLyBEZWZlY3QgMTUyNzI4OiBVc2UgbGFzdCBmb2N1c2VkIHRhc2sgaW5zdGVhZCBjb250cm9sIHRhc2sgYXMgY29udHJvbCBjYW4gYmUgZnJvbSBzdWJmb3JtLlxyXG4gICAgICAgICAgRm9jdXNNYW5hZ2VyLlNldEZvY3VzKExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKSwgTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpLCAwLFxyXG4gICAgICAgICAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCkgPT09IG51bGwgPyB0cnVlIDogZmFsc2UpO1xyXG4gICAgICAgICAgdGhpcy5fbGFzdEZhaWxlZEZvY3VzZWRDb250cm9sID0gY3RybDtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX2xhc3RGYWlsZWRGb2N1c2VkQ29udHJvbCA9IG51bGw7XHJcblxyXG4gICAgICBpZiAob25DbGljaylcclxuICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRDdHJsID0gY3RybDtcclxuXHJcbiAgICAgIGxldCBwcmV2Q3RybDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbCgpO1xyXG4gICAgICBpZiAoY3RybCA9PT0gcHJldkN0cmwgJiYgIWN0cmwuaXNSZXBlYXRhYmxlKCkpIHtcclxuICAgICAgICBhd2FpdCAoPE1nRm9ybT5jdHJsLmdldEZvcm0oKSkuYnJpbmdSZWNvcmRUb1BhZ2UoKTtcclxuICAgICAgICAvLyB3ZSByZWNlaXZlZCBmb2N1cyB0d2ljZVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy9jaGVjayBpZiBsYXN0IHRhc2sgaXMgb3BlbmVkIGluIE1vZGFsIFN1YmZvcm0sIGlmIHllcywgY2xvc2UgaXQgYmVmb3JlIGZvY3Vzc2luZyBvbiBwYXJlbnQgdGFzaydzIGN0cmxcclxuICAgICAgbGV0IHByZXZUYXNrOiBUYXNrID0gPFRhc2s+TGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG5cclxuXHJcbiAgICAgIGlmIChjdHJsID09PSBudWxsIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEUpIHtcclxuICAgICAgICBpZiAocHJldkN0cmwgPT09IG51bGwpXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBjdXJyVGFzazogVGFzaztcclxuICAgICAgaWYgKChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTikgJiYgKDxSYWlzZUF0Pihhd2FpdCAoY3RybC5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JBSVNFX0FUKSkuZ2V0VmFsdWVJbnQoKSkgPT09IFJhaXNlQXQuVGFza0luRm9jdXMpKVxyXG4gICAgICAgIGN1cnJUYXNrID0gcHJldlRhc2s7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBjdXJyVGFzayA9IDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuXHJcbiAgICAgIGxldCBjYW5Hb3RvQ3RybDogYm9vbGVhbiA9IHRoaXMuY2FuR29Ub0NvbnRyb2woY3RybCwgb25DbGljayk7XHJcblxyXG4gICAgICAvLyBHbyB0byB0aGUgY29udHJvbCAtIGluc2VydCBwcmVmaXhcclxuICAgICAgaWYgKGNhbkdvdG9DdHJsKSB7XHJcbiAgICAgICAgLy8gTW9kYWwgc3ViZm9ybSB0YXNrIGNsb3NpbmcgaGFzIGFscmVhZHkgYmVndW4uIERvIG5vdCBoYW5kbGUgSGFuZGxlU3ViZm9ybU1vZGFsaXR5KCkgYWdhaW4uXHJcbiAgICAgICAgaWYgKHRoaXMuZ3VpUGVuZGluZ0V2ZW50ICE9IG51bGwpXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGV0IGhhbmRsZWQgPSBhd2FpdCB0aGlzLkhhbmRsZVN1YmZvcm1Nb2RhbGl0eShjdHJsLCBwcmV2VGFzaywgY3VyclRhc2spO1xyXG4gICAgICAgIGlmIChoYW5kbGVkKVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgZXZlbnRMaW5lOiBudW1iZXIgPSAoY3RybC5pc1JlcGVhdGFibGUoKSB8fCBjdHJsLmlzUmFkaW8oKSkgPyBsaW5lIDogSW50MzIuTWluVmFsdWU7XHJcbiAgICAgICAgbGV0IHJ0RXZ0OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwsIGV2ZW50TGluZSk7XHJcbiAgICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYKTtcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAocHJldkN0cmwgIT09IG51bGwpIHtcclxuICAgICAgICBpZiAoIXByZXZDdHJsLmlzTW9kaWZpYWJsZSgpKSB7XHJcbiAgICAgICAgICBpZiAocHJldkN0cmwuaXNDaG9pY2VDb250cm9sKCkpXHJcbiAgICAgICAgICAgIGF3YWl0IHByZXZDdHJsLnJlc3RvcmVPbGRWYWx1ZSgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIWN1cnJUYXNrLmNhbmNlbFdhc1JhaXNlZCgpKSB7XHJcbiAgICAgICAgICBsZXQgbmV3VmFsOiBzdHJpbmcgPSBNYW5hZ2VyLkdldEN0cmxWYWwocHJldkN0cmwpO1xyXG4gICAgICAgICAgaWYgKCFhd2FpdCBwcmV2Q3RybC52YWxpZGF0ZUFuZFNldFZhbHVlKG5ld1ZhbCwgdHJ1ZSkpXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgTWdDb250cm9sLlJldHVyblRvQ3RybCA9IHByZXZDdHJsO1xyXG4gICAgICB9IGVsc2VcclxuICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHMoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbiAmJiBNZ0NvbnRyb2wuUmV0dXJuVG9DdHJsID09PSBjdHJsKVxyXG4gICAgICAgIExhc3RGb2N1c2VkTWFuYWdlci5zZXRMYXN0Rm9jdXNlZENvbnRyb2woPFRhc2tCYXNlPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSwgY3RybCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGN0cmwuc2V0Rm9jdXNlZFN0b3BFeGVjdXRpb24odGhpcy5fc3RvcEV4ZWN1dGlvbik7XHJcbiAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGV0IHJldHVyblRvQ3RybDogTWdDb250cm9sID0gTWdDb250cm9sLlJldHVyblRvQ3RybDtcclxuXHJcbiAgICAgICAgICBpZiAocmV0dXJuVG9DdHJsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gKDxUYXNrPnJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNZ2RJRCgpO1xyXG4gICAgICAgICAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMocmV0dXJuVG9DdHJsLCAtMSk7XHJcbiAgICAgICAgICAgIHJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExhc3RQYXJrZWRDdHJsKHJldHVyblRvQ3RybCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGUgc3ViZm9ybSBtb2RhbGl0eSBiZWZvciBmb3Vjc3Npbmcgb24gcGFyZW50IGN0cmxcclxuICAvLy8gMS5pZiBjdXJzb3IgaXMgcGFya2VkIG9uIG1vZGFsIHN1YmZvcm0gdGFzayBhbmQgdXNlciBjbGlja3Mgb24gaXQncyBwYXJlbnQgOiBjbG9zZSB0aGUgc3ViZm9ybSB0YXNrLlxyXG4gIC8vLyAyLmlmIGN1cnNvciBpcyBwYXJrZWQgb24gbW9kYWwgc3ViZm9ybSAnUzInIHdoaWNoIGlzIG9wZW5lZCBpbiBhbm90aGVyIHN1YmZvcm0gbW9kYWwgJ1MxJywgdGhlbiBjbGlja2luZyBvbiAgcGFyZW50J1AxJ1xyXG4gIC8vLyB3aWxsIGNsb3NlIGJvdGggUzIgYW5kIFMxLlxyXG4gIC8vLyAzLmlmIGN1cnNvciBpcyBwYXJrZWQgb24gbm9uIG1vZGFsIHN1YmZvcm0gJ1MyJyB3aGljaCBpcyBvcGVuZWQgaW4gc3ViZm9ybSBtb2RhbCAnUzEnLCB0aGVuIGNsaWNraW5nIG9uIFMxLCB3aWxsIG5vdCBjbG9zZSBTMlxyXG4gIC8vLyBidXQgY2xpY2tpbmcgb24gUDEgd2lsbCBjbG9zZSBib3RoIFMyIGFuZCBTMS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmN0cmwgdG8gYmUgZm9jdXNzZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJldlRhc2tcIj5wcmV2aW91cyB0YXNrIHdoaWNoIHdhcyBpbiBmb2N1czwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdXJyVGFza1wiPmN1cnJlbnQgdGFzayB3aGljaCBpcyB0byBiZSBmb2N1c3NlZDwvcGFyYW0+XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgSGFuZGxlU3ViZm9ybU1vZGFsaXR5KGN0cmw6IE1nQ29udHJvbCwgcHJldlRhc2s6IFRhc2ssIGN1cnJUYXNrOiBUYXNrKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgaGFuZGxlZFN1YmZvcm1Nb2RhbGl0eSA9IGZhbHNlO1xyXG5cclxuICAgIC8vIGV2YWx1YXRlIHRoZSBjb3JyZWN0IHByZXZUYXNrIHRvIGJlIGNsb3NlZCBpZiBpdCBpcyBNb2RhbC5cclxuICAgIC8vIGlmIG5ld2x5IHN1YmZvcm0gTW9kYWwgdGFzayBpcyBvcGVuZWQgYW5kIGl0IGlzIG5vdCB5ZXQgZm9jdXNzZWQsIGluIHRoYXQgY2FzZSBjdXJyIHRhc2sgaXMgc2FtZSBhcyBwcmV2dGFzay5cclxuICAgIC8vIG5vdyBjbGlja2luZyBvbiBpdCdzIHBhcmVudCB0YXNrLCBzaG91bGQgY2xvc2UgdGhlIE1vZGFsIHN1YmZvcm0gdGFza1xyXG4gICAgbGV0IGxlbmd0aCA9IHByZXZUYXNrLmdldE1HRGF0YSgpLmdldFRhc2tzQ291bnQoKTtcclxuICAgIGxldCB0b3BUYXNrOiBUYXNrID0gcHJldlRhc2suZ2V0TUdEYXRhKCkuZ2V0VGFzayhsZW5ndGggLSAxKTtcclxuICAgIGlmIChjdXJyVGFzayA9PSBwcmV2VGFzayB8fCBwcmV2VGFzayAhPSB0b3BUYXNrIC8qIG5lc3RlZCBzdWJmb3JtICovKSB7XHJcbiAgICAgIGlmICh0b3BUYXNrICE9IG51bGwgJiYgcHJldlRhc2sgIT0gdG9wVGFzayAmJiB0b3BUYXNrLklzU3ViRm9ybSkge1xyXG4gICAgICAgIGxldCBzdWJmb3JtQ3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD50b3BUYXNrLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpO1xyXG4gICAgICAgIGlmIChzdWJmb3JtQ3RybC5Jc01vZGFsKCkpXHJcbiAgICAgICAgICBwcmV2VGFzayA9IHRvcFRhc2s7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBjbG9zZSBzdWJmb3JtIHRhc2sgaXMgTW9kYWwgaWYgdG8gYmUgcGFya2VkIG9uIHBhcmVudC5cclxuICAgIGlmIChwcmV2VGFzayAhPSA8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkgJiYgcHJldlRhc2suZ2V0SXNEZXN0aW5hdGlvbkNhbGwoKSkge1xyXG5cclxuICAgICAgaWYgKCFjdXJyVGFzay5pc0Rlc2NlbmRlbnRPZihwcmV2VGFzaykpIHtcclxuICAgICAgICBsZXQgc3ViZm9ybUN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+cHJldlRhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCk7XHJcbiAgICAgICAgaWYgKCFzdWJmb3JtQ3RybC5Jc01vZGFsKCkgJiYgIWN1cnJUYXNrLmdldElzRGVzdGluYXRpb25DYWxsKCkpXHJcbiAgICAgICAgICBzdWJmb3JtQ3RybCA9IHByZXZUYXNrLkdldFN1YmZvcm1Nb2RhbFBhcmVudFRhc2soKTtcclxuICAgICAgICBpZiAoc3ViZm9ybUN0cmwgIT0gbnVsbCAmJiAoY3RybCAhPSBzdWJmb3JtQ3RybCkgJiYgc3ViZm9ybUN0cmwuSXNNb2RhbCgpKSB7XHJcblxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5wZXJmb3JtU3ViZm9ybUNsb3NlKDxNZ0NvbnRyb2w+c3ViZm9ybUN0cmwpO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLmd1aVBlbmRpbmdFdmVudCA9IHRoaXMuZ2V0TGFzdFJ0RXZlbnQoKTtcclxuICAgICAgICAgIGhhbmRsZWRTdWJmb3JtTW9kYWxpdHkgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBoYW5kbGVkU3ViZm9ybU1vZGFsaXR5O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgQ2FsbHMgQ29udHJvbHMgU3VmZml4IHdoZW4gZm9jdXMgb24gTm9uIG1hZ2ljIGNvbnRyb2wgaS5lLiBjb250cm9sIHdpdGggTWFnaWNEdW1teUNvbnRyb2wgaXMgcmVjZWl2ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVGb2N1c09uTm9uTWFnaWNDb250cm9sKGN0cmw6IE1nQ29udHJvbCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgRXZlbnRzTWFuYWdlci5JbnN0YW5jZS5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGN0cmwuc2V0Rm9jdXNlZFN0b3BFeGVjdXRpb24odGhpcy5fc3RvcEV4ZWN1dGlvbik7XHJcbiAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGV0IHJldHVyblRvQ3RybDogTWdDb250cm9sID0gTWdDb250cm9sLlJldHVyblRvQ3RybDtcclxuXHJcbiAgICAgICAgICBpZiAocmV0dXJuVG9DdHJsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gKDxUYXNrPnJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNZ2RJRCgpO1xyXG4gICAgICAgICAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMocmV0dXJuVG9DdHJsLCAtMSk7XHJcbiAgICAgICAgICAgIHJldHVyblRvQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLnNldExhc3RQYXJrZWRDdHJsKHJldHVyblRvQ3RybCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHdlIGNhbiBnbyB0byB0aGUgY29udHJvbCBhbmQgdHJ5IHRvIHBhcmsgb24gaW5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPmxpbmU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib25DbGlja1wiPnJlYWwgY2xpY2sgaXMgcGVyZm9ybWVkLCB0aGlzIG5vdCBjbGljayBzaW11bGF0aW9uPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgY2FuR29Ub0NvbnRyb2woY3RybDogTWdDb250cm9sLCBvbkNsaWNrOiBib29sZWFuKTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKG9uQ2xpY2sgJiYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STSB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JST1dTRVIpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gVjkuNFNQNGQgY2hhbmdlIG9mIGJlaGF2aW9yIC0gd2UgZG8gbm90IFwiZXhpdFwiIGZyb20gdGhlIGN1cnJlbnQgY3RybFxyXG4gICAgLy8gKGkuZS4gbm90IHBlcmZvcm1pbmcgY3RybCBzdWZmaXggb3IgY3RybCB2ZXJpZmljYXRpb25zKSBpZiB0aGUgdGFyZ2V0IGN0cmxcclxuICAgIC8vIGlzIElNRyBvciBoeXBlcnRleHQuXHJcbiAgICBsZXQgY2FuR290b0N0cmw6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IGN1cnJUYXNrOiBUYXNrID0gPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgLy8gaWYgY2FuY2VsIGlzIHJhaXNlZCAsIHRoZW4gZG8gbm90IGdvIHRvIG5leHQgY29udHJvbCBiZWZvcmUgaGFuZGxpbmcgY2FuY2VsIGV2ZW50LlxyXG4gICAgbGV0IGxhc3RUYXNrOiBUYXNrID0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG4gICAgaWYgKCFjdXJyVGFzay5Jc0ludGVyYWN0aXZlIHx8IChsYXN0VGFzayAhPSBudWxsICYmIGxhc3RUYXNrLmdldExhc3RQYXJrZWRDdHJsKCkgIT0gbnVsbCAmJlxyXG4gICAgICBsYXN0VGFzay5jYW5jZWxXYXNSYWlzZWQoKSkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9JTUFHRSAmJiAhY3RybC5Jc1JlcGVhdGFibGUpXHJcbiAgICAgIGNhbkdvdG9DdHJsID0gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIGNhbkdvdG9DdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZSBUaW1lciBFdmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+dHVudGltZSB0aW1lciBldmVudDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVUaW1lcihldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgZXZ0LnNldFR5cGUoQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUik7XHJcbiAgICBpZiAoZXZ0LmlzSWRsZVRpbWVyKCkpIHtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFeHByZXNzaW9uSGFuZGxlcnMoKTtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVDb250ZXh0SW5hY3Rpdml0eUFsZXJ0KGV2dCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgbWdkOiBNR0RhdGEgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldE1HRGF0YShldnQuZ2V0TWdkSUQoKSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnRzKG1nZC5nZXRUaW1lckhhbmRsZXJzKCksIGV2dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFdoZW4gdGhlIGNvbnRleHQgaW5hY3Rpdml0eSB0aW1lb3V0IGlzIGFib3V0IHRvIGV4cGlyZSwgcmFpc2UgYSB3YXJuaW5nIHRvIHVzZXJcclxuICAvLyAgICBzbyB0aGF0IHRoZSBzZXNzaW9uIGNhbiBiZSBjb250aW51ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+dHVudGltZSB0aW1lciBldmVudDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVDb250ZXh0SW5hY3Rpdml0eUFsZXJ0KGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGltZU5vdzogbnVtYmVyID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuICAgIGxldCBtZ2Q6IE1HRGF0YSA9IGV2dC5nZXRUYXNrKCkuZ2V0TUdEYXRhKCk7XHJcbiAgICBsZXQgbGFzdFJlcXVlc3RUaW1lOiBudW1iZXIgPSBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkdldExhc3RSZXF1ZXN0VGltZTtcclxuICAgIGxldCBjb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQ6IG51bWJlciA9IEVudmlyb25tZW50Lkluc3RhbmNlLmdldENvbnRleHRJbmFjdGl2aXR5VGltZW91dCgpIC8gMTA7XHJcbiAgICBsZXQgY29udGV4dEluYWN0aXZpdHlXYXJuaW5nVGltZTogbnVtYmVyID0gRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0Q29udGV4dEluYWN0aXZpdHlXYXJuaW5nVGltZSgpIC8gMTA7XHJcblxyXG4gICAgbGV0IGlkbGVUaW1lID0gKHRpbWVOb3cgLSBsYXN0UmVxdWVzdFRpbWUpIC8gMTAwMDtcclxuXHJcbiAgICAvLyBEaXNwbGF5IHRoZSBjb25maXJtYXRpb24gb25seSBmb3IgdmFsaWQgdGltZW91dHNcclxuICAgIGlmIChjb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQgPT0gMCB8fCBjb250ZXh0SW5hY3Rpdml0eVdhcm5pbmdUaW1lID09IDApXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAoRXZlbnRzTWFuYWdlci51c2VyR3JhbnRlZEZvckNvbnRleHRBY3Rpdml0eSAmJiBpZGxlVGltZSA+PSAoY29udGV4dEluYWN0aXZpdHlUaW1lb3V0IC0gY29udGV4dEluYWN0aXZpdHlXYXJuaW5nVGltZSkpIHtcclxuICAgICAgLy8gcmFpc2UgYW4gYWxlcnQgdG8gbm90aWZ5IHVzZXIgd2hlbiB0aGUgY29udGV4dCBpcyBhYm91dCB0byBiZSB0ZXJtaW5hdGVkXHJcbiAgICAgIC8vIGlmIHVzZXIgY2xpY2tzIG9uIE9LLCBzZW5kIGR1bW15IHJlcXVlc3QgdG8gc2VydmVyLiBJZiBDYW5jZWwgaXMgY2xpY2tlZCwgZG8gbm90aGluZy5cclxuICAgICAgbGV0IHVzZXJDb25maXJtYXRpb246IG51bWJlciA9IGF3YWl0IEdVSU1hbmFnZXIuSW5zdGFuY2UuTWVzc2FnZUJveCh0aGlzLmNvbmZpcm1hdGlvbkRpYWxvZ1RpdGxlLCB0aGlzLmNvbmZpcm1hdGlvbkRpYWxvZ01zZywgU3R5bGVzLk1TR0JPWF9CVVRUT05fWUVTX05PKTtcclxuICAgICAgaWYgKHVzZXJDb25maXJtYXRpb24gPT0gU3R5bGVzLk1TR0JPWF9SRVNVTFRfWUVTKSB7XHJcbiAgICAgICAgLy8gc2VuZCByZXF1ZXN0IHRvIHNlcnZlciB0byBtYXJrIHRoZSBjb250ZXh0IGluYWN0aXZpdHkgdGltZW91dCB0byB6ZXJvXHJcbiAgICAgICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVDb250ZXh0VGltZW91dFJlc2V0RXZlbnRDb21tYW5kKCk7XHJcbiAgICAgICAgbWdkLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICBhd2FpdCBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5PTkxZX0NPTU1BTkRTKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBFdmVudHNNYW5hZ2VyLnVzZXJHcmFudGVkRm9yQ29udGV4dEFjdGl2aXR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwcm9jZXNzIGV4cHJlc3Npb24gaGFuZGxlcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGhhbmRsZUV4cHJlc3Npb25IYW5kbGVycygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudChMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCksIExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKSk7XHJcbiAgICBydEV2dC5zZXRFeHByZXNzaW9uKG51bGwpO1xyXG4gICAgcnRFdnQuc2V0TWFpblByZ0NyZWF0b3IocnRFdnQuZ2V0VGFzaygpKTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGxldCBtZ2Q6IE1HRGF0YSA9IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0TUdEYXRhKGkpO1xyXG4gICAgICBpZiAobWdkICE9PSBudWxsICYmICFtZ2QuSXNBYm9ydGluZylcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50cyhtZ2QuZ2V0RXhwSGFuZGxlcnMoKSwgcnRFdnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2l6ZSBvZiBwYWdlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj50YWJsZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyb3dzSW5QYWdlXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGhhbmRsZVJlc2l6ZShjdHJsOiBNZ0NvbnRyb2wsIHJvd3NJblBhZ2U6IG51bWJlcik6IHZvaWQge1xyXG4gICAgKDxNZ0Zvcm0+Y3RybC5nZXRGb3JtKCkpLnNldFJvd3NJblBhZ2Uocm93c0luUGFnZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGRhdGEgZm9yIFJvd1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzZW5kQWxsXCI+aWYgdHJ1ZSwgc2VuZCBhbGwgcmVjb3Jkc1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicm93XCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVSb3dEYXRhQ3VyUGFnZSh0YWJsZTogTWdDb250cm9sLCBkZXNpcmVkVG9wSW5kZXg6IG51bWJlciwgc2VuZEFsbDogYm9vbGVhbiwgbGFzdEZvY3VzZWRWYWw6IExhc3RGb2N1c2VkVmFsKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50YWJsZS5nZXRGb3JtKCk7XHJcbiAgICBhd2FpdCBmb3JtLnNldFJvd0RhdGEoZGVzaXJlZFRvcEluZGV4LCBzZW5kQWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cmFuc2ZlcnMgZGF0YSB0byBHVUkgdGhyZWFkIGluIGZyZWUgd29ya2VyIHRocmVhZCB0aW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlVHJhbnNmZXJEYXRhVG9HdWkoY3RybDogTWdDb250cm9sKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT5jdHJsLmdldEZvcm0oKTtcclxuICAgIGF3YWl0IGZvcm0udHJhbnNmZXJEYXRhVG9HdWkoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBGZXRjaGVzIHRoZSBjaHVuayBmcm9tIHNlcnZlcixcclxuICAvLy8gICBJZiB0aGUgbGFzdCByZWNvcmRzIGlzIG5vdCB5ZXQgZmV0Y2hlZCBpdCBmZXRjaGVzIHRoZSBuZXh0IGNodW5rLFxyXG4gIC8vLyAgIEVsc2UsIGZldGNoZXMgdGhlIHByZXZpb3VzIGNodW5rXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIGZldGNoUmVjb3Jkc0FoZWFkRnJvbVNlcnZlcihjdHJsOiBNZ0NvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPmN0cmwuZ2V0Rm9ybSgpO1xyXG4gICAgYXdhaXQgZm9ybS5GZXRjaFJlY29yZHNBaGVhZEZyb21TZXJ2ZXIoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBXaGVuIGludGVybmFsIGFjdCBhc2tzIGZvciBlbmFibGUvZGlzYWJsZSBvZiBhbiBhY3QgbGlzdC5cclxuICAvLy8gICBjYWxsIGVuYWJsZUxpc3Qgd2l0aCBvbmx5SWZDaGFuZ2VkID0gdHJ1ZSB0byBtaW5pbWl6ZSBjYWxscyB0b3MgcmVmcmVzaC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZW5hYmxlXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGhhbmRsZUVuYWJsZUV2ZW50cyhldnQ6IFJ1blRpbWVFdmVudCwgZW5hYmxlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBldnQuZ2V0VGFzaygpLkFjdGlvbk1hbmFnZXIuZW5hYmxlTGlzdChldnQuZ2V0QWN0RW5hYmxlTGlzdCgpLCBlbmFibGUsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZXMgY29udHJvbCBQcmVmaXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ3RybFByZWZpeChldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz5ldnQuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGN1cnJDbGlja2VkQ3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5SdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRDdHJsO1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICBsZXQgZGlzcGxheUxpbmU6IG51bWJlciA9IGV2dC5nZXREaXNwbGF5TGluZSgpO1xyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2w7XHJcblxyXG4gICAgaWYgKGZvcm0uaXNMaW5lTW9kZSgpKSB7XHJcbiAgICAgIGlmIChkaXNwbGF5TGluZSA9PT0gSW50MzIuTWluVmFsdWUgfHwgY3RybC5pc1JhZGlvKCkpXHJcbiAgICAgICAgZGlzcGxheUxpbmUgPSBmb3JtLkRpc3BsYXlMaW5lO1xyXG4gICAgfSBlbHNlXHJcbiAgICAgIGRpc3BsYXlMaW5lID0gSW50MzIuTWluVmFsdWU7XHJcblxyXG4gICAgbGV0IGxhc3RQYXJrZWRDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcblxyXG4gICAgLy8gcHJldmVudCBkb3VibGUgcHJlZml4IG9uIHRoZSBzYW1lIGNvbnRyb2xcclxuICAgIC8vIEZvciBGYXN0IE1vZGUsIENTIGlzIGV4ZWN1dGVkIGZyb20gaGVyZSwgd2hlcmVhcyBmb3Igc3RlcCBtb2RlIGl0IGlzIGRvbmVcclxuICAgIC8vIGluIG1vdmVJblJvdy4gc28sIGZvciBzdGVwIG1vZGUgZG91YmxlIGV4ZWN1dGlvbiBvZiBDUyBtdXN0IGJlIHN0b3BwZWQuXHJcbiAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IG51bGwgJiYgKDxUYXNrPmxhc3RQYXJrZWRDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldE1HRGF0YSgpLkdldElkKCkgPT09ICg8VGFzaz5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpLmdldE1HRGF0YSgpLkdldElkKCkgJiYgbGFzdFBhcmtlZEN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKSB7XHJcbiAgICAgIGlmICgoY3RybCAhPT0gbGFzdFBhcmtlZEN0cmwgfHwgKGN0cmwuaXNSZXBlYXRhYmxlKCkgJiYgZGlzcGxheUxpbmUgIT09IGN0cmwuZ2V0RGlzcGxheUxpbmUodHJ1ZSkpKSAmJiAhbGFzdFBhcmtlZEN0cmwuaXNJbkNvbnRyb2xTdWZmaXgoKSlcclxuICAgICAgLy8gUUNSICM5NzA4MDZcclxuICAgICAge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGxhc3RQYXJrZWRDdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpO1xyXG4gICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWCB8fCBjdHJsLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICAgIGN0cmwucmVzZXRQcmV2VmFsKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGN0cmwuUmVmcmVzaERpc3BsYXkoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIFRPRE86IEZvY3VzICYgVGFiYmluZzogSGFuZGxlIFBhcmtpbmcgaW4gdGhpcyBjYXNlLiBTaG91bGQgbm90IHJldHVybiBmYWxzZSBpbiBzY3JlZW4gbW9kZVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRhc2suSW5DdHJsUHJlZml4KVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgdGFzay5JbkN0cmxQcmVmaXggPSB0cnVlO1xyXG5cclxuICAgIC8vIG1ha2Ugc3VyZSBpdCBoYXMgbm90IGNvbWUgYWdhaW4gdGhyb3VnaCBtb3ZlaW5yb3cuXHJcbiAgICAvLyBlZzogaWYgY2xpY2tlZCBjdHJsIG9uIHN1YmZvcm0gaXMgbm9uIHBhcmthYmxlLCBmaXJzdCB0aW1lIGl0IGV4ZWN1dGVzIFJQIENWIGZvciBzdWJmb3JtcyBhbmQgdGhlblxyXG4gICAgLy8gZW50ZXJzIG1vdmVpbnJvdyBmb3IgcGFya2FibGUgY3RybC4gd2Ugc2hvdWxkbm90IGV4ZWN1dGUgdGhpcyBibG9jayB3aGVuIHdlIGNvbWUgZm9yIENQIG9mIHBhcmthYmxlIGN0cmwuXHJcbiAgICAvLyBGb3IgdGFiLCB3ZSBjb21lIGhlcmUgZGlyZWN0bHkgZm9yIHBhcmthYmxlIGN0cmwsIGFuZCB0aGlzIGJsb2NrIG11c3QgYWx3YXlzIGV4ZWN1dGUgaWYgb24gZGlmZiBmb3Jtcy5cclxuICAgIC8vIGlzU29ydCA6IGlmIGNsaWNrZWQgb24gdGFibGUgaGVhZGVyLCB3ZSBwYXJrIG9uIGNvbG9tbiBjdHJsIGFmdGVyIHNvcnQsIGFuZCB3ZSBtdXN0IGluY2x1ZGUgc3ViZm9ybXNcclxuICAgIC8vIGluIGV4ZWN1dGluZyBDVnNcclxuXHJcbiAgICAvLyBUT0RPOiBUYWJiaW5nICYgRm9jdXNpbmc6IENoZWNrIGdldExhc3RNb3ZlSW5Sb3dEaXJlY3Rpb24gaXMgcmVsZXZhbnQuIFdoaWxlIG1vdmluZyBiZXR3ZWVuIGNvbnRyb2xzIGJ5IFRhYiBjb2RlIGluIGlmIGJsb2NrIHdhcyBub3QgY2FsbGVkLlxyXG4gICAgLy8gQnV0IGl0IHdhcyBjYWxsZWQgb24gY2xpY2sgdG8gYW5vdGhlciBjb250cm9sLlxyXG4gICAgLy9pZiAodGFzay5nZXRMYXN0TW92ZUluUm93RGlyZWN0aW9uKCkgPT09IENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9OT05FIHx8IHRoaXMuX2lzU29ydGluZykge1xyXG5cclxuICAgIC8vIElmIHRoZSBjdXJyZW50IGN0cmwgaXMgb24gYSBzdWJmb3JtLCB0aGVuIGV4ZWN1dGUgaW4gc2VxdWVuY2VcclxuICAgIC8vIDEuIFJTIG9mIG5lc3RlZCBzdWJmb3JtcyB1bnRpbCBzdWJmb3JtIHRhc2sgY29udGFpbmcgdGhlc2UgMiBzdWJmb3Jtcy4gd2UgbXVzdCBhbHNvIGV4ZWN1dGUgUlMgaWYgY2xpY2tlZFxyXG4gICAgLy8gICAgaW4gc3ViZm9ybSBhbmQgcGFya2VkIGJhY2sgb24gYSBjdHJsJ3MgdGFzay4gKCM3MjIxMTUtIGN1cnJDbGlja2VkQ3RybCBhbmQgY3RybCBzaG91bGQgbm90IGJlIG9uIGRpZmZlcmVudCB3aW5kb3cpXHJcbiAgICAvLyAyLiBDViBleGVjdXRpb24gb2YgTGFzdFBhcmtlZEN0cmwgdGlsbCBlbmRcclxuICAgIC8vIDMuIFJQLUNWcyBmb3IgYWxsIGludGVybWVkaWF0ZSBzdWJmb3Jtc1xyXG4gICAgbGV0IHByZXZDdHJsOiBNZ0NvbnRyb2wgPSBsYXN0UGFya2VkQ3RybDtcclxuICAgIGlmIChjdXJyQ2xpY2tlZEN0cmwgIT09IG51bGwgJiYgKDxUYXNrPmN1cnJDbGlja2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNZ2RJRCgpID09PSAoPFRhc2s+Y3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpKS5nZXRNZ2RJRCgpICYmIGN0cmwub25EaWZmRm9ybShjdXJyQ2xpY2tlZEN0cmwpKVxyXG4gICAgICBwcmV2Q3RybCA9IGN1cnJDbGlja2VkQ3RybDtcclxuXHJcbiAgICBpZiAocHJldkN0cmwgIT09IG51bGwgJiYgY3RybC5vbkRpZmZGb3JtKHByZXZDdHJsKSkge1xyXG4gICAgICAvLyBSUyBvZiBuZXN0ZWQgc3ViZm9ybXMgdW50aWwgc3ViZm9ybSB0YXNrIGNvbnRhbmluZyB0aGVzZSAyIHN1YmZvcm1zXHJcbiAgICAgIGxldCBwcmV2VGFzazogVGFzayA9IDxUYXNrPnByZXZDdHJsLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICAgIGF3YWl0IHByZXZUYXNrLmV4ZWNTdWJmb3JtUmVjU3VmZml4KDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSk7XHJcbiAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfTElTVCB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1ggfHwgY3RybC5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgICAgY3RybC5yZXNldFByZXZWYWwoKTtcclxuICAgICAgICAgIGF3YWl0IGN0cmwuUmVmcmVzaERpc3BsYXkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuaXNBYm9ydGluZygpKSB7XHJcbiAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IEV2ZW50c01hbmFnZXIuZG9TeW5jRm9yU3ViZm9ybVBhcmVudCh0YXNrKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBFeGVjdXRlIFJQIG9mIHRoZSBjdXJyZW50IHRhc2sgYmVmb3JlIGV4ZWN1dGluZyB0aGUgQ1ZzIGJlZm9yZSAnY3RybCdcclxuICAgIGlmICh0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGFzay5TdWJmb3JtRXhlY01vZGUgPSBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uU0VUX0ZPQ1VTO1xyXG4gICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQoY3RybCwgZGlzcGxheUxpbmUpO1xyXG4gICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy99XHJcblxyXG4gICAgLy8gUUNSIyA4MDYwMTU6IElmIHdlIGhhdmUgYSBzaW5nbGUgZmllbGQgd2l0aCBhbGxvdyBwYXJraW5nID0gWWVzIGFuZCBUYWIgSW50byA9IE5vLCB0aGVuIG9uIHByZXNzaW5nIHRhYiBpZiBjdXJzb3IgaXMgbm90IG1vdmVkLCB3ZSBjb21lIHRvXHJcbiAgICAvLyBwYXJrIG9uIGxhc3RQYXJrZWRDdHJsKHdoaWNoIGlzIHNhbWUgYXMgY3RybCkgc2luY2UgVGFiSW50byBpcyBub3QgYWxsb3dlZC5cclxuICAgIC8vIFNvIHRvIGF2YW9pZCBpbmZpbml0ZSByZWN1cnNpb24sIHdlIHNob3VsZCBub3QgYWdhaW4gdHJ5IHRvIHBhcmsgb24gaXQuXHJcbiAgICBpZiAoIWF3YWl0IGN0cmwuSXNQYXJrYWJsZSgpICYmIGN0cmwgIT09IGxhc3RQYXJrZWRDdHJsKSB7XHJcbiAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAobGFzdFBhcmtlZEN0cmwgPT09IG51bGwgfHwgIWF3YWl0IGxhc3RQYXJrZWRDdHJsLmludm9rZSgpKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyhjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpO1xyXG5cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVN1cHBvcnRUb0xvZyhOU3RyaW5nLkZvcm1hdCgnezB9IEVudGVyaW5nIGNvbnRyb2w6IGNvbnRyb2wgezF9LCByb3cgezJ9JywgdGFzay5HZXRUYXNrRGV0YWlscygpLCBjdHJsLk5hbWUsIGRpc3BsYXlMaW5lIDwgMCA/IDAgOiBkaXNwbGF5TGluZSksIHRydWUpO1xyXG5cclxuICAgIC8vIGlmIHdlIGhhdmUgYSBzdG9wIGV4ZWN1dGlvbiBjdHJsLCB3ZSBuZWVkIHRvIHVzZSBpdCBhcyBhIHNyY3RybCwgb3RoZXJ3aXNlIHVzZVxyXG4gICAgLy8gdGhlIGN0cmwgb24gd2hpY2ggd2UgZXhlY3V0ZWQgbGFzdCBDUy5cclxuXHJcblxyXG4gICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKTtcclxuICAgIGN0cmwuS2V5U3Ryb2tlT24gPSBmYWxzZTtcclxuICAgIGN0cmwuTW9kaWZpZWRCeVVzZXIgPSBmYWxzZTtcclxuXHJcbiAgICB0YXNrLnNldEN1cnJGaWVsZChjdHJsLmdldEZpZWxkKCkpO1xyXG5cclxuICAgIGlmIChjdHJsLklzUmVwZWF0YWJsZSlcclxuICAgICAgYXdhaXQgZm9ybS5icmluZ1JlY29yZFRvUGFnZSgpO1xyXG5cclxuICAgIC8vIGVuYWJsZS1kaXNhYmxlIGFjdGlvbnMgZm9yIFN1YmZvcm1zXHJcbiAgICBpZiAobGFzdFBhcmtlZEN0cmwgIT09IGN0cmwpIHtcclxuICAgICAgaWYgKChsYXN0UGFya2VkQ3RybCA9PT0gbnVsbCAmJiBjdHJsLmdldEZvcm0oKS5pc1N1YkZvcm0oKSkgfHwgKGxhc3RQYXJrZWRDdHJsICE9PSBudWxsICYmIChjdHJsLmdldEZvcm0oKS5pc1N1YkZvcm0oKSB8fCBsYXN0UGFya2VkQ3RybC5nZXRGb3JtKCkuaXNTdWJGb3JtKCkpKSkge1xyXG4gICAgICAgIGxldCBsYXN0UGFya2VkVGFzazogVGFzayA9IG51bGw7XHJcbiAgICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsICE9PSBudWxsKVxyXG4gICAgICAgICAgbGFzdFBhcmtlZFRhc2sgPSA8VGFzaz5sYXN0UGFya2VkQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG5cclxuICAgICAgICBpZiAobGFzdFBhcmtlZFRhc2sgIT09IHRhc2spIHtcclxuICAgICAgICAgIGxldCBmaXJzdFRpbWU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgICAgbGV0IGlzU29uU3ViZm9ybTogYm9vbGVhbjtcclxuICAgICAgICAgIGxldCBwYXJlbnRUYXNrOiBUYXNrO1xyXG5cclxuICAgICAgICAgIGlmIChsYXN0UGFya2VkVGFzayAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpc1NvblN1YmZvcm0gPSBsYXN0UGFya2VkVGFzay5Jc1N1YkZvcm07XHJcblxyXG4gICAgICAgICAgICBmb3IgKHBhcmVudFRhc2sgPSBsYXN0UGFya2VkVGFzazsgcGFyZW50VGFzayAhPT0gbnVsbCAmJiBpc1NvblN1YmZvcm07IHBhcmVudFRhc2sgPSA8VGFzaz5wYXJlbnRUYXNrLmdldFBhcmVudCgpKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCFmaXJzdFRpbWUpIHtcclxuICAgICAgICAgICAgICAgIGlzU29uU3ViZm9ybSA9IHBhcmVudFRhc2suSXNTdWJGb3JtO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50VGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50VGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfREVMTElORSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50VGFzay5lbmFibGVDcmVhdGVBY3RzKGZhbHNlKTtcclxuICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaXNTb25TdWJmb3JtID0gdGFzay5Jc1N1YkZvcm07XHJcblxyXG4gICAgICAgICAgZm9yIChwYXJlbnRUYXNrID0gPFRhc2s+dGFzay5nZXRQYXJlbnQoKTsgKHBhcmVudFRhc2sgIT09IG51bGwpICYmIGlzU29uU3ViZm9ybTsgcGFyZW50VGFzayA9IDxUYXNrPnBhcmVudFRhc2suZ2V0UGFyZW50KCkpIHtcclxuICAgICAgICAgICAgaXNTb25TdWJmb3JtID0gcGFyZW50VGFzay5Jc1N1YkZvcm07XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRUYXNrLmdldEVuYWJsZVpvb21IYW5kbGVyKCkpXHJcbiAgICAgICAgICAgICAgcGFyZW50VGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHBhcmVudFRhc2suc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gV2hlbmV2ZXIgd2UgYXJlIG1vdmluZyBiZXR3ZWVuIHRhc2tzLCByZS1ldmFsdWF0ZSBBbGxvd01vZGVzLlxyXG4gICAgICAgICAgYXdhaXQgdGFzay5lbmFibGVNb2RlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGVuYWJsZSBhY3Rpb25zIGFuZCBzdGF0ZXNcclxuICAgIGlmICh0YXNrLmdldEVuYWJsZVpvb21IYW5kbGVyKCkgfHwgY3RybC51c2Vab29tSGFuZGxlcigpKVxyXG4gICAgICB0YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NLCB0cnVlKTtcclxuXHJcbiAgICBpZiAoY3RybC5pc1RleHRDb250cm9sKCkgfHwgY3RybC5pc0Nob2ljZUNvbnRyb2woKSlcclxuICAgICAgY3RybC5TZXRLZXlib2FyZExhbmd1YWdlKCk7XHJcblxyXG4gICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKVxyXG4gICAgICB0YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9CVVRUT04sIHRydWUpO1xyXG4gICAgYXdhaXQgdGFzay5zZXRDcmVhdGVEZWxldGVBY3RzRW5hYmxlU3RhdGUoKTtcclxuXHJcbiAgICBsZXQgZmllbGQ6IEZpZWxkID0gPEZpZWxkPmN0cmwuZ2V0RmllbGQoKTtcclxuICAgIGlmIChmaWVsZCAhPT0gbnVsbCAmJiBmaWVsZC5OdWxsQWxsb3dlZCAmJiBjdHJsLmlzTW9kaWZpYWJsZSgpICYmIGN0cmwuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKVxyXG4gICAgICB0YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9FRFRfTlVMTCwgdHJ1ZSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGRvIHNvbWUgZGVmYXVsdCBvcGVyYXRpb25zIGZvciBhbiBldmVudCBhbmQgcmV0dXJuIHRydWUgdG8gdGVsbCB0aGUgY2FsbGVyXHJcbiAgLy8vICAgdG8gY29udGludWUgaGFuZGxpbmcgdGhlIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2dFwiPnRoZSBldmVudCB0byBoYW5kbGU8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGVsbHMgdGhlIGNhbGxlciB3aGV0aGVyIHRvIGNvbnRpbnVlIGhhbmRsaW5nIHRoZSBldmVudDwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGNvbW1vbkhhbmRsZXJCZWZvcmUoZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBldnRTYXZlOiBSdW5UaW1lRXZlbnQgPSBldnQ7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPmV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgcmVjOiBSZWNvcmQgPSBudWxsO1xyXG4gICAgbGV0IHByZXZSZWM6IFJlY29yZCA9IG51bGw7XHJcbiAgICBsZXQgdmFsOiBzdHJpbmc7XHJcbiAgICBsZXQgb2xkRGlzcGxheUxpbmU6IG51bWJlciA9IEludDMyLk1pblZhbHVlO1xyXG5cclxuICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRhc2suaXNBYm9ydGluZygpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfU1lTVEVNKSB7XHJcbiAgICAgIGxldCBhY3RJZDogbnVtYmVyID0gdGhpcy5nZXRNYXRjaGluZ0FjdGlvbihldnQuZ2V0S2JkSXRtKCkpO1xyXG4gICAgICBpZiAoYWN0SWQgIT09IDAgJiYgZXZ0LkNvbnRyb2wgIT09IG51bGwpXHJcbiAgICAgIC8vICYmIGFjdElkICE9IE1HX0FDVF9TRUxFQ1QpXHJcbiAgICAgIHtcclxuICAgICAgICBldnQgPSBuZXcgUnVuVGltZUV2ZW50KGV2dCwgZXZ0KTtcclxuICAgICAgICBldnQuc2V0SW50ZXJuYWwoYWN0SWQpO1xyXG4gICAgICAgIGV2dC5zZXRBcmdMaXN0KG51bGwpO1xyXG4gICAgICAgIGxldCBtZ0NvbnRyb2w6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2w7XHJcbiAgICAgICAgZXZ0U2F2ZS5zZXRDdHJsKG1nQ29udHJvbCk7XHJcbiAgICAgICAgaWYgKG1nQ29udHJvbCA9PT0gbnVsbClcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFFDUiMgOTM5MjUzIC0gd2UgaGF2ZSB0byBwcm9jZXNzIGNvbW1vbkhhbmRsZXJCZWZvcmUgZXZlbiBmb3IgaW50ZXJuYWwgZXZlbnQgY29udmVydGVkXHJcbiAgICAvLyBmcm9tIHN5c3RlbSBFdmVudFxyXG4gICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuICAgICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICAgIGxldCBkaXNwbGF5TGluZTogbnVtYmVyID0gZXZ0LmdldERpc3BsYXlMaW5lKCk7XHJcbiAgICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuICAgICAgcmVjID0gZHYuZ2V0Q3VyclJlYygpO1xyXG5cclxuICAgICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+ZXZ0LkNvbnRyb2w7XHJcbiAgICAgIGxldCBpbnRFdnRDb2RlOiBudW1iZXIgPSBldnQuZ2V0SW50ZXJuYWxDb2RlKCk7XHJcblxyXG4gICAgICBsZXQgbGFzdEZvY3VzZWRDdHJsOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcblxyXG4gICAgICAvLyBmb3IgaW50ZXJuYWwgZXZlbnRzXHJcbiAgICAgIHN3aXRjaCAoaW50RXZ0Q29kZSkge1xyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT006XHJcbiAgICAgICAgICBsZXQgYm9vbHZhbCA9IGF3YWl0IHRoaXMuc2VsZWN0UHJvZyhjdHJsKTtcclxuICAgICAgICAgIGlmIChib29sdmFsKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCX09OX0RCTElDSzpcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX0ZPQ1VTOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGb2N1cyhjdHJsLCBkaXNwbGF5TGluZSwgZXZ0LmlzUHJvZHVjZUNsaWNrKCkpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX0ZPQ1VTX09OX05PTl9NQUdJQ19DT05UUk9MOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGb2N1c09uTm9uTWFnaWNDb250cm9sKGN0cmwpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX0tFWURPV046XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUtleURvd24odGFzaywgY3RybCwgZXZ0KTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9NT1VTRVVQOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVNb3VzZVVwKGN0cmwsIGRpc3BsYXlMaW5lLCBldnQuaXNQcm9kdWNlQ2xpY2soKSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVElPTjpcclxuICAgICAgICAgIGF3YWl0IHRoaXMub25BY3RTZWxlY3Rpb24oY3RybCwgZm9ybSwgZXZ0KTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVElNRVI6XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZVRpbWVyKGV2dCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFU0laRTpcclxuICAgICAgICAgIHRoaXMuaGFuZGxlUmVzaXplKGN0cmwsIGRpc3BsYXlMaW5lKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUk9XX0RBVEFfQ1VSUl9QQUdFOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVSb3dEYXRhQ3VyUGFnZShjdHJsLCBkaXNwbGF5TGluZSwgZXZ0LmlzU2VuZEFsbCgpLCBldnQuTGFzdEZvY3VzZWRWYWwpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9EVl9UT19HVUk6XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZVRyYW5zZmVyRGF0YVRvR3VpKGN0cmwpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9GRVRDSF9SRUNPUkRTX0FIRUFEX0ZST01fU0VSVkVSOlxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5mZXRjaFJlY29yZHNBaGVhZEZyb21TZXJ2ZXIoY3RybCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRU5BQkxFX0VWRU5UUzpcclxuICAgICAgICAgIHRoaXMuaGFuZGxlRW5hYmxlRXZlbnRzKGV2dCwgdHJ1ZSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RJU0FCTEVfRVZFTlRTOlxyXG4gICAgICAgICAgdGhpcy5oYW5kbGVFbmFibGVFdmVudHMoZXZ0LCBmYWxzZSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfUFJFRklYOlxyXG4gICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWDpcclxuICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWDpcclxuICAgICAgICAgIC8vIERlZmVjdCAxMTU5MDMuIERvIG5vdCBleGVjdXRlIFJQIGlmIHRoZSBzdWJmb3JtIHBhcmVudCB0YXNrIGRpZG4ndCBmaW5pc2hlZCB5ZXRcclxuICAgICAgICAgIC8vIGl0J3MgQ29tbW9uSGFuZGxlckJlZm9yZSBmb3IgUlAuXHJcbiAgICAgICAgICBpZiAodGFzay5Jc1N1YkZvcm0gJiYgKDxUYXNrPnRhc2suZ2V0UGFyZW50KCkpLkluQ29tbW9uSGFuZGxlckJlZm9yZVJQKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgLy8gUmVjb3ZlcnkgZnJvbSB0cmFuc2FjdGlvbiByZXN0YXJ0IHdhcyBjb21wbGV0ZWQuIFdlIG1heSBub3cgY2xlYXIgdGhlIGZsYWdcclxuICAgICAgICAgIHRhc2suc2V0QWZ0ZXJSZXRyeShDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FKTtcclxuICAgICAgICAgIHRhc2suRGF0YVN5bmNlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIGlmICghdGFzay5pc1N0YXJ0ZWQoKSlcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHJcbiAgICAgICAgICAvLyBpZiB0aGUgZm9ybSBjb250YWlucyBhIHRhYmxlIGFuZCB0aGUgY29udHJvbCB3YXMgaW4gdGhlIHRhYmxlXHJcbiAgICAgICAgICAvLyBtb3ZlIHRvIHRoZSBuZXcgcm93XHJcbiAgICAgICAgICBpZiAoZm9ybS5nZXRSb3dzSW5QYWdlKCkgPiBJbnQzMi5NaW5WYWx1ZSAmJiBkaXNwbGF5TGluZSA+IEludDMyLk1pblZhbHVlKSB7XHJcbiAgICAgICAgICAgIC8vIGVuc3VyZSBhIHZhbGlkIHJvd1xyXG4gICAgICAgICAgICB3aGlsZSAoIWR2LnJlY0V4aXN0cyhkaXNwbGF5TGluZSkgJiYgZGlzcGxheUxpbmUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgZGlzcGxheUxpbmUtLTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZGlzcGxheUxpbmUgPj0gMCkge1xyXG4gICAgICAgICAgICAgIHByZXZSZWMgPSBkdi5nZXRDdXJyUmVjKCk7XHJcbiAgICAgICAgICAgICAgbGV0IG9sZFRhc2tNb2RlOiBzdHJpbmcgPSB0YXNrLmdldE1vZGUoKTtcclxuICAgICAgICAgICAgICBsZXQgb2xkUmVjSWQ6IG51bWJlciA9IHByZXZSZWMuZ2V0SWQoKTtcclxuXHJcbiAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIG9sZERpc3BsYXlMaW5lID0gZm9ybS5EaXNwbGF5TGluZTtcclxuICAgICAgICAgICAgICAgIC8vIG9sZERpc3BsYXlMaW5lID0gZm9ybS5nZXRDdXJyUm93KClcclxuICAgICAgICAgICAgICAgIGZvcm0uUHJldkRpc3BsYXlMaW5lID0gb2xkRGlzcGxheUxpbmU7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKGRpc3BsYXlMaW5lLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHRoZSBkaXNwbGF5IGlmIHRoZSBwcmV2aW91cyByZWNvcmQgd2FzIGRlbGV0ZWQgb3IgY2FuY2VsZWRcclxuICAgICAgICAgICAgICAgIGlmIChwcmV2UmVjICE9IG51bGwgJiYgIWR2LnJlY0V4aXN0c0J5SWQocHJldlJlYy5nZXRJZCgpKSkge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfVEFCTEUpO1xyXG4gICAgICAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHJlZnJlc2ggaXMgZXNzZW50aWFsLiBJZiBpdCBmYWlscyBiZWNhdXNlIG9mIGFuXHJcbiAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB0aGVuIHRoZSBvbGQgY3VyciByb3cgaXMgcmVzdG9yZWQgKGluIHRoZSBjYXRjaFxyXG4gICAgICAgICAgICAgICAgICAvLyBzdGF0ZW1lbnQpLiBJdCBjYW4gaGFwcGVuIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIGEgbGluZSB3aGljaFxyXG4gICAgICAgICAgICAgICAgICAvLyBiZWNvbWVzIGJsYW5rIGR1ZSB0byB0aGUgZGVsZXRpb24gb2YgdGhlIHByZXZpb3VzIHJlY29yZC5cclxuICAgICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlYyA9IGR2LmdldEN1cnJSZWMoKTtcclxuICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob2xkVGFza01vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmIG9sZERpc3BsYXlMaW5lID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgIWR2LnJlY0V4aXN0c0J5SWQob2xkUmVjSWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJldkxpbmU6IG51bWJlciA9IGZvcm0uZ2V0UHJldkxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5yZXN0b3JlT2xkRGlzcGxheUxpbmUocHJldkxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5yZXN0b3JlT2xkRGlzcGxheUxpbmUob2xkRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24oZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxhc3RGb2N1c2VkQ3RybCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEZvY3VzZWRDdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBsYXN0Rm9jdXNlZEN0cmwuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coZS5TdGFja1RyYWNlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB0aHJvdyBlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKCdpbiBFdmVudHNNYW5hZ2VyLmNvbW1vbkhhbmRsZXJCZWZvcmUoKTogaW52YWxpZCBsaW5lIG51bWJlcjogJyArXHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocmVjID09IG51bGwpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcclxuICAgICAgICAgICAgICAnaW4gRXZlbnRzTWFuYWdlci5jb21tb25IYW5kbGVyQmVmb3JlKCk6IG5vIGN1cnJlbnQgcmVjb3JkIGF2YWlsYWJsZSAhJyk7XHJcblxyXG4gICAgICAgICAgLy8gb25seSBmb3Igbm9uIGludGVyYWN0aXZlIHRhc2tzLiBJbmNyZWFzZSB0aGUgdGFzaydzIGNvdW50ZXIgZm9yIGV2ZXJ5IHJlY29yZCB3ZSBwYXNzLlxyXG4gICAgICAgICAgLy8gZG8gaXQgYmVmb3JlIHRoZSBldmFsRW5kQ29uZCBzaW5jZSBpdCBtaWdodCBpbmNsdWRlIGNvdW50ZXIoMCkuXHJcbiAgICAgICAgICAvLyBpbmNyZWFzZSBvbmx5IGlmIGdvaW5nIGludG8gdGhlIHJlYyBwcmVmaXguXHJcbiAgICAgICAgICBpZiAoIXRhc2suSXNJbnRlcmFjdGl2ZSAmJiB0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgICAgIHRhc2suaW5jcmVhc2VDb3VudGVyKCk7XHJcblxyXG4gICAgICAgICAgLy8gY2hlY2sgdGhlIFwidGFzayBlbmQgY29uZGl0aW9uXCIgYmVmb3JlIGVudGVyaW5nIHRoZSByZWNvcmRcclxuICAgICAgICAgIGlmIChhd2FpdCB0YXNrLmV2YWxFbmRDb25kKENvbnN0SW50ZXJmYWNlLkVORF9DT05EX0VWQUxfQkVGT1JFKSkge1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGZvcm0uSGFzVGFibGUoKSlcclxuICAgICAgICAgICAgYXdhaXQgZm9ybS5icmluZ1JlY29yZFRvUGFnZSgpO1xyXG5cclxuICAgICAgICAgIC8vIHRvIHByZXZlbnQgZG91YmxlIHByZWZpeCBvbiB0aGUgc2FtZSByZWNvcmRcclxuICAgICAgICAgIGlmICh0YXNrLmdldExldmVsKCkgIT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG5cclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKCdSRUNPUkQgUFJFRklYOiAnICsgdGFzay5xdWVyeVRhc2tQYXRoKCkpO1xyXG4gICAgICAgICAgKGR2LmdldEN1cnJSZWMoKSkuc2V0Rm9yY2VTYXZlT3JnKGZhbHNlKTtcclxuICAgICAgICAgIChkdi5nZXRDdXJyUmVjKCkpLlN5bmNlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIGR2LnNhdmVPcmlnaW5hbCgpO1xyXG5cclxuICAgICAgICAgIC8vIGRvIFJlY29yZCBQcmVmaXggZm9yIGFsbCBmYXRoZXJzIHRoYXQgdGhlaXIgUmVjb3JkIFByZWZpeCBpcyBub3QgZG9uZSBlYXJsaWVyXHJcbiAgICAgICAgICBpZiAodGFzay5Jc1N1YkZvcm0gJiYgdGFzay5QZXJmb3JtUGFyZW50UmVjb3JkUHJlZml4KSB7XHJcbiAgICAgICAgICAgIGxldCBwYXJlbnRUYXNrID0gdGFzay5nZXRQYXJlbnQoKTtcclxuICAgICAgICAgICAgd2hpbGUgKHBhcmVudFRhc2suSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHBhcmVudFRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2socGFyZW50VGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50VGFzayA9IHBhcmVudFRhc2suZ2V0UGFyZW50KCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gaGFuZGxlIHN1Yi1mb3Jtc1xyXG4gICAgICAgICAgdGFzay5JbkNvbW1vbkhhbmRsZXJCZWZvcmVSUCA9IHRydWU7XHJcbiAgICAgICAgICBpZiAoYXdhaXQgdGFzay5DaGVja1JlZnJlc2hTdWJUYXNrcygpKVxyXG4gICAgICAgICAgICBhd2FpdCBkdi5jb21wdXRlU3ViRm9ybXMoKTtcclxuICAgICAgICAgIHRhc2suSW5Db21tb25IYW5kbGVyQmVmb3JlUlAgPSBmYWxzZTtcclxuICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKTtcclxuICAgICAgICAgIC8vIGVuYWJsZS1kaXNhYmxlIGFjdGlvbnMgZm9yIGEgcmVjb3JkXHJcbiAgICAgICAgICBhd2FpdCB0YXNrLmVuYWJsZVJlY29yZEFjdGlvbnMoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYOlxyXG4gICAgICAgICAgLy8gRm9yY2UgcmVjb3JkIHN1ZmZpeDpcclxuICAgICAgICAgIGxldCBmb3JjZVN1ZmZpeDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgbGV0IGlzU2VsZWN0aW9uVGFibGU6IGJvb2xlYW47XHJcblxyXG4gICAgICAgICAgdGFzay5Db25maXJtVXBkYXRlTm8gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAvLyBObyByZWNvcmQgLT4gbm8gc3VmZml4XHJcbiAgICAgICAgICBpZiAocmVjID09IG51bGwpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICBmb3JjZVN1ZmZpeCA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgIC8vIGRvIG5vdCBleGVjdXRlIHRoZSBcImJlZm9yZSByZWNvcmQgc3VmZml4XCIgd2hlbiBkZWxldGluZyB0aGUgcmVjb3JkIGFuZFxyXG4gICAgICAgICAgLy8gdGhlIHRhc2sgbW9kZSBpcyBkZWxldGUgKHRoZSBzZWNvbmQgcm91bmQpXHJcbiAgICAgICAgICBpZiAoKHJlYy5Nb2RpZmllZCB8fCBmb3JjZVN1ZmZpeCkgJiYgcmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSAmJlxyXG4gICAgICAgICAgICB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgICAgIC8vIHRvIHByZXZlbnQgZG91YmxlIHN1ZmZpeCBvbiB0aGUgc2FtZSByZWNvcmRcclxuICAgICAgICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKSB7XHJcbiAgICAgICAgICAgIHRhc2suc2V0SW5SZWNvcmRTdWZmaXgodHJ1ZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKTtcclxuICAgICAgICAgICAgdGFzay5zZXRJblJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBhd2FpdCB0YXNrLmhhbmRsZUV2ZW50T25TbGF2ZVRhc2tzKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZygnUkVDT1JEIFNVRkZJWDogJyArIHRhc2sucXVlcnlUYXNrUGF0aCgpKTtcclxuXHJcblxyXG4gICAgICAgICAgLy8gaW5kaWNhdGUgbmV4dCB2ZXJpZnlDdHJsIGlzIHRoZSBmaXJzdCBjdHJsIGluIHRoZSByZWNvcmRcclxuXHJcbiAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG5cclxuICAgICAgICAgIGlzU2VsZWN0aW9uVGFibGUgPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RJT04sIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAvLyBRdWVyeSBtb2RlIC0+IGRvIHN1ZmZpeCBvbmx5IGlmIHdlIGZvcmNlIGl0IG9yIHNvbWVob3cgdGhlIHJlY29yZCB3YXMgdXBkYXRlZFxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZICYmICFmb3JjZVN1ZmZpeCAmJiAhcmVjLk1vZGlmaWVkICYmXHJcbiAgICAgICAgICAgICFpc1NlbGVjdGlvblRhYmxlKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKCFyZWMuTW9kaWZpZWQgJiYgIWZvcmNlU3VmZml4ICYmICghaXNTZWxlY3Rpb25UYWJsZSB8fCAhdGFzay5JblNlbGVjdCkpIHtcclxuICAgICAgICAgICAgaWYgKHJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlQ29udHJvbFZlcmlmaWNhdGlvbih0YXNrKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSAmJiByZWMuTW9kaWZpZWQpIHtcclxuICAgICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLnVwZGF0ZUNvbmZpcm1lZCh0YXNrKSlcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbGV0IHN0b3BFeGVjdXRpb246IGJvb2xlYW4gPSAhYXdhaXQgdGhpcy5leGVjdXRlQ29udHJvbFZlcmlmaWNhdGlvbih0YXNrKTtcclxuICAgICAgICAgIC8vIGRvIG5vdCBjb250aW51ZSBwcm9jZXNzaW5nIFJTIGlmIENWIHJldHVybnMgZXJyb3JcclxuICAgICAgICAgIGlmIChzdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVg6XHJcbiAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5oYW5kbGVDdHJsUHJlZml4KGV2dCkpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGRpZCBub3Qgc3VjY2VlZCBpbiBlbnRlcmluZyB0aGUgY3RybFxyXG4gICAgICAgICAgICBldnQuQ29udHJvbC5JbkNvbnRyb2wgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUw6XHJcbiAgICAgICAgICBNYW5hZ2VyLkNsZWFuTWVzc2FnZVBhbmUodGFzayk7IC8vIFFDUiAjMzcxMzIxXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVg6XHJcblxyXG4gICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIHN0b3BleGVjdXRpb24gY3RybCB3ZSBzaG91bGQgbm90IGV4ZWN1dGUgQ1MuXHJcbiAgICAgICAgICBpZiAoY3RybCA9PSBudWxsIHx8IHRoaXMuZ2V0U3RvcEV4ZWN1dGlvbkN0cmwoKSAhPSBudWxsKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgLy8gdG8gcHJldmVudCBkb3VibGUgc3VmZml4IG9uIHRoZSBzYW1lIGNvbnRyb2xcclxuICAgICAgICAgIGlmICh0YXNrLmdldExldmVsKCkgIT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAoIWN0cmwuaXNTdWJmb3JtKCkpIHtcclxuICAgICAgICAgICAgdmFsID0gTWFuYWdlci5HZXRDdHJsVmFsKGN0cmwpO1xyXG5cclxuICAgICAgICAgICAgLy8gV2UgYXJlIHJlc2V0dGluZyB0aGUgZmxhZyBhcyB3ZSBhcmUgbW92aW5nIGZyb20gb25lIGNvbnRyb2wgdG8gb3RoZXIgY29udHJvbC5cclxuICAgICAgICAgICAgdGFzay5DdXJyZW50RWRpdGluZ0NvbnRyb2wgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgLy8gdmFsaWRhdGUgdGhlIGNvbnRyb2xzIHZhbHVlXHJcbiAgICAgICAgICAgIC8vIEZpeGVkIGJ1ZyAjOjc1ODc4OCwgdGhlIGJyb3dzZXIgY29udHJvbCB3aWxsIG5vdCBiZSB1cGRhdGUgZnJvbSB0aGUgZmlsZWQuXHJcbiAgICAgICAgICAgIC8vIFBhdGNoIGZvciBRQ1IgIzcyOTcwNjpcclxuICAgICAgICAgICAgLy8gTWFnaWMgdGhyZWFkIHB1dHMgdGhlIGZvbGxvd2luZyBHVUkgY29tbWFuZHM6XHJcbiAgICAgICAgICAgIC8vICAgIFBST1BfU0VUX0lNQUdFX0ZJTEVfTkFNRSB0byBzZXQgdGhlIGltYWdlIG9uIHRoZSBJbWFnZSBjb250cm9sLlxyXG4gICAgICAgICAgICAvLyAgICBQUk9QX1NFVF9URVhUIHRvIHNldCB0aGUgdGV4dCBvZiB0aGUgVGV4dEJveCBjb250cm9sLlxyXG4gICAgICAgICAgICAvLyAgICBTRVRfRk9DVVMgdG8gZm9jdXMgb24gdGhlIFRleHRCb3ggY29udHJvbC5cclxuICAgICAgICAgICAgLy8gTm93LCB3aGVuIHRoZSBleGVjdXRpb24gaXMgYnkgRjcsIGlmIHRoZSBmaWxlIGlzIG5vdCByZXRyaWV2ZWQgZnJvbSB0aGUgc2VydmVyXHJcbiAgICAgICAgICAgIC8vIChpLmUuIGlmIHRoZXJlIGlzIDQwNCBlcnJvciksIEh0dHBDbGllbnQgcmUtdHJpZXMgdG8gZ2V0IHRoZSBmaWxlIGZvciBIVFRQdGltZW91dC5cclxuICAgICAgICAgICAgLy8gRHVyaW5nIHRoaXMgdGltZSBhbGwgdGhlIEdVSSBldmVudHMgaW4gR3VpQ29tbWFuZHNRdWV1ZSByZW1haW5zIHBlbmRpbmcgdW5oYW5kbGVkLlxyXG4gICAgICAgICAgICAvLyBJbiB0aGUgbWVhbiB0aW1lLCBNYWdpYyB0aHJlYWQgZXhlY3V0ZXMgdGhlIEV4aXQgZXZlbnQgYW5kIGR1cmluZyB0aGlzLCBpdCB0cmllc1xyXG4gICAgICAgICAgICAvLyB0byBleGVjdXRlIHRoZSBDdHJsIFN1ZmZpeCBvZiB0aGUgVGV4dEJveCBjb250cm9sLlxyXG4gICAgICAgICAgICAvLyBTaW5jZSBTRVRfRk9DVVMgaXMgc3RpbGwgcGVuZGluZyBpbiB0aGUgcXVldWUsIHRoZSBsb2dpY2FsIGNvbnRyb2wgKGlmIGFsbG93VGVzdGluZz1ObylcclxuICAgICAgICAgICAgLy8gaXMgbm90IG1hcHBlZCB3aXRoIGFueSBhY3R1YWwgd2luZG93cyBjb250cm9sLlxyXG4gICAgICAgICAgICAvLyBOb3cgd2hlbiB3ZSB0cnkgdG8gZ2V0IHRoZSB2YWx1ZSBvZiB0aGlzIGxvZ2ljYWwgY29udHJvbCwgTG9naWNhbENvbnRyb2wuZ2V0RWRpdG9yQ29udHJvbCgpXHJcbiAgICAgICAgICAgIC8vIHJldHVybnMgbnVsbCBhbmQgc28sIFN0YXRpY1RleHQuZ2V0VmFsdWUoKSByZXR1cm5zIExvZ2ljYWxDb250cm9sLlRleHQgaW5zdGVhZCBvZiBDb250cm9sLlRleHRcclxuICAgICAgICAgICAgLy8gQmVjYXVzZSBQUk9QX1NFVF9URVhUIGlzIGFsc28gcGVuZGluZywgTG9naWNhbENvbnRyb2wuVGV4dCBpcyBudWxsLlxyXG4gICAgICAgICAgICAvLyBBbmQgc28gdGhlcmUgaXMgYW4gZXhjZXB0aW9uIHdoZW4gdXNpbmcgaXQuXHJcbiAgICAgICAgICAgIC8vIElmIEFsbG93VGVzdGluZz1ZZXMsIHRoZSB2YWwgd2lsbCBiZSBhIGJsYW5rIHN0cmluZy4gU28sIHRoZXJlIGlzIG5vIGNyYXNoLlxyXG4gICAgICAgICAgICAvLyBCdXQgaGVyZSB3ZSBoYXZlIGFub3RoZXIgcHJvYmxlbS4gU3VwcG9zZSwgdGhlIGZpZWxkIGhhZCBhbiBJbml0IGV4cHJlc3Npb24uXHJcbiAgICAgICAgICAgIC8vIE5vdywgTWdDb250cm9sJ3MgdmFsdWUgd291bGQgYmUgdGhlIGluaXRlZCB2YWx1ZSBhbmQgdGhlIHZhbCBpcyBhIGJsYW5rIHN0cmluZy5cclxuICAgICAgICAgICAgLy8gU28sIHdlIHdpbGwgaGF2ZSB2YXJpYWJsZSBjaGFuZ2UuXHJcbiAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBwcm9ibGVtIGlzIHJlbGF0ZWQgdG8gYSB2ZXJ5IHNwZWNpZmljIHNjZW5hcmlvIC0tIHdoZW4gdGhlIGltYWdlIGNvbnRyb2wgd2FzXHJcbiAgICAgICAgICAgIC8vIHRoZSBmaXJzdCBkcm9wcGVkIGNvbnRyb2wgb24gdGhlIGZvcm0sIGltYWdlIGNhbm5vdCBiZSBhY2Nlc3NlZCBhdCB0aGUgdGltZSBvZiB0YXNrXHJcbiAgICAgICAgICAgIC8vIGxvYWRpbmcgYW5kIHRhc2sgbmVlZHMgdG8gYmUgY2xvc2VkLCB3ZSBhcmUgcHV0dGluZyBhIHBhdGNoIGhlcmUgYnkgY2hlY2tpbmcgdmFsIGZvciBOVUxMLlxyXG4gICAgICAgICAgICAvLyBUaGUgaWRlYWwgc29sdXRpb24gd291bGQgYmUgLS0tIGluc3RlYWQgb2Ygc2VuZGluZyB0aGUgaW1hZ2UgZmlsZSBuYW1lIGZyb20gTWFnaWMgdGhyZWFkXHJcbiAgICAgICAgICAgIC8vIHRvIEd1aSB0aHJlYWQgYW5kIGxvYWRpbmcgdGhlIGltYWdlIGZyb20gdGhlIEd1aSB0aHJlYWQsIHdlIGNhbiBsb2FkIHRoZSBpbWFnZSBmcm9tIHRoZVxyXG4gICAgICAgICAgICAvLyBNYWdpYyB0aHJlYWQgKHVzaW5nIHN5bmMgZXhlY3V0aW9uIGkuZS4gdmlhIEd1aUludGVyYWN0aXZlKSBhbmQgc2VuZCBpdCB0byB0aGUgR3VpIHRocmVhZC5cclxuICAgICAgICAgICAgaWYgKCF0YXNrLmNhbmNlbFdhc1JhaXNlZCgpICYmXHJcbiAgICAgICAgICAgICAgKGN0cmwuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlJPV1NFUiAmJiAoIWlzTnVsbE9yVW5kZWZpbmVkKGN0cmwuX2ZpZWxkKSAmJiAoY3RybC5fZmllbGQuZ2V0VHlwZSgpID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHwgY3RybC5fZmllbGQuZ2V0VHlwZSgpID09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQykgfHwgdmFsICE9PSBudWxsKSAmJiB0eXBlb2YgdmFsICE9ICd1bmRlZmluZWQnICYmXHJcbiAgICAgICAgICAgICAgICAhYXdhaXQgY3RybC52YWxpZGF0ZUFuZFNldFZhbHVlKHZhbCwgdHJ1ZSkpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIHdoZW4gc3RvcCBleGVjdXRpb24gaW4gb24sIGRvbid0IGNsZWFyIHRoZSBtc2cgZnJvbSBzdGF0dXMuXHJcbiAgICAgICAgICBpZiAoIXRoaXMuX3N0b3BFeGVjdXRpb24pXHJcbiAgICAgICAgICAgIE1hbmFnZXIuQ2xlYW5NZXNzYWdlUGFuZSh0YXNrKTtcclxuXHJcbiAgICAgICAgICAvLyByZXNldCBJbkNvbnRyb2wgYmVmb3JlIGV4ZWN1dGluZyBjb250cm9sIHZlcmlmaWNhdGlvblxyXG4gICAgICAgICAgY3RybC5JbkNvbnRyb2wgPSBmYWxzZTtcclxuICAgICAgICAgIGN0cmwuQ2xpcEJvYXJkRGF0YUV4aXN0cyA9IGZhbHNlO1xyXG4gICAgICAgICAgY3RybC5WYWxpZGF0ZUNvbnRyb2wgPSB0cnVlO1xyXG4gICAgICAgICAgY3RybC5zZXRJbkNvbnRyb2xTdWZmaXgodHJ1ZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBleGVjdXRlIGEgc2VsZWN0IHByb2dyYW0gYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvZ3JhbSB3YXMgZXhlY3V0ZWQgIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+dGhlIHNvdXJjZSBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcm9tcHRcIj5pZiB0cnVlIHRoZW4gdGhlIGNhbGxlciBpcyBleGVjdXRpbmcgdGhlIGNhbGxlZCBwcm9ncmFtIGF0IHRoZSBlbmQgb2YgY29udHJvbCBwcmVmaXg8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJvdGVjdGVkIGFzeW5jIHNlbGVjdFByb2coY3RybDogTWdDb250cm9sKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZDtcclxuICAgIGxldCB2YWx1ZTogU3RyaW5nO1xyXG4gICAgbGV0IG1nVmFsOiBzdHJpbmc7XHJcbiAgICBsZXQgcHJvZ0V4ZWN1dGVkID0gZmFsc2U7XHJcbiAgICBsZXQgdGFzayA9IDxUYXNrPmN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuXHJcbiAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBzZWxlY3QgcHJvZ3JhbSB0byB0aGUgY29udHJvbFxyXG4gICAgaWYgKGN0cmwuSGFzU2VsZWN0UHJvZ3JhbSgpKSB7XHJcbiAgICAgIC8vY2hlY2sgaWYgdGhlIGNvbnRyb2wgaXMgcGFya2FibGVcclxuICAgICAgaWYgKGN0cmwuSXNQYXJrYWJsZSgpKSB7XHJcblxyXG4gICAgICAgIHZhbHVlID0gTWFuYWdlci5HZXRDdHJsVmFsKGN0cmwpO1xyXG5cclxuICAgICAgICAvLyB2YWxpZGF0ZSB0aGUgY29udHJvbHMgdmFsdWVcclxuICAgICAgICBpZiAoIWN0cmwudmFsaWRhdGVBbmRTZXRWYWx1ZSh2YWx1ZSwgZmFsc2UpKVxyXG4gICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbGV0IGVuY29kZWRWYWw6IHN0cmluZyA9IG51bGw7XHJcbiAgICAgICAgICBtZ1ZhbCA9IGF3YWl0IGN0cmwuZ2V0TWdWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgICAgICB2YXIgcmVjID0gKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICAgICAgICBlbmNvZGVkVmFsID0gcmVjLmdldFhNTEZvclZhbHVlKGN0cmwuZ2V0RmllbGQoKS5nZXRJZCgpLCBtZ1ZhbCk7XHJcbiAgICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVTZWxlY3RQcm9ncmFtQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgbnVsbCwgSW50MzIuTWluVmFsdWUsIGN0cmwuZ2V0RGl0SWR4KCksIGVuY29kZWRWYWwpO1xyXG4gICAgICAgICAgdGFzay5nZXRNR0RhdGEoKS5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcblxyXG4gICAgICAgICAgbGV0IGNvbW1hbmRzUHJvY2Vzc29yU2VydmVyOiBDb21tYW5kc1Byb2Nlc3NvckJhc2UgPSBDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXIuR2V0Q29tbWFuZHNQcm9jZXNzb3IoKTtcclxuICAgICAgICAgIGF3YWl0IGNvbW1hbmRzUHJvY2Vzc29yU2VydmVyLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG5cclxuICAgICAgICAgIHByb2dFeGVjdXRlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJvZ0V4ZWN1dGVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlQ29udHJvbFZlcmlmaWNhdGlvbih0YXNrOiBUYXNrKTogUHJvbWlzZTxib29sZWFuPiB7XHJcblxyXG4gICAgLy8gY2hlY2sgYWxsIGhhbmRsZXJzIGlmIGl0IGlzIGNvbnRyb2wgdmVyaWZpY2F0aW9uLiBFeGVjdXRlIGFsbCBTViBoYW5kbGVyc1xyXG4gICAgbGV0IHRhYmxlOiBIYW5kbGVyc1RhYmxlID0gdGFzay5nZXRIYW5kbGVyc1RhYigpO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRhYmxlLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGxldCBoYW5kbGVyOiBFdmVudEhhbmRsZXIgPSB0YWJsZS5nZXRIYW5kbGVyKGkpO1xyXG4gICAgICBsZXQgZXZ0OiBFdmVudCA9IGhhbmRsZXIuZ2V0RXZlbnQoKTtcclxuICAgICAgaWYgKGV2dC5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfVkVSSUZJQ0FUSU9OKSB7XHJcbiAgICAgICAgbGV0IGNvbnRyb2w6IE1nQ29udHJvbCA9ICgodGFzay5nZXRGb3JtKCkgIT09IG51bGwpID8gKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLmdldEN0cmxCeUN0cmxOYW1lKGhhbmRsZXIuZ2V0Q3RybE5hbWUoKSkgOiBudWxsKTtcclxuICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGNvbnRyb2wpKSB7XHJcbiAgICAgICAgICBsZXQgcnVuVGltZUV2ZW50OiBSdW5UaW1lRXZlbnQgPSBuZXcgUnVuVGltZUV2ZW50KGNvbnRyb2wpO1xyXG4gICAgICAgICAgcnVuVGltZUV2ZW50LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1ZFUklGSUNBVElPTik7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ1blRpbWVFdmVudCwgZmFsc2UpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgZXJyb3IsIHBhcmsvZm9jdXMgb24gdGhpcyBjb250cm9sIHdoZXJlIGVycm9yIG9jY3VycyBpbiBDViBleGVjdXRpb24uXHJcbiAgICAgICAgICAgIExhc3RGb2N1c2VkTWFuYWdlci5zZXRMYXN0Rm9jdXNlZENvbnRyb2wodGFzaywgY29udHJvbCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwobnVsbCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbkN0cmwoY29udHJvbCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgYXN5bmMgb25BY3RTZWxlY3Rpb24oY3RybDogTWdDb250cm9sLCBmb3JtOiBNZ0Zvcm0sIGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZGlzcGxheUxpbmU6IG51bWJlciA9IGV2dC5nZXREaXNwbGF5TGluZSgpO1xyXG4gICAgaWYgKGRpc3BsYXlMaW5lID09PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgZGlzcGxheUxpbmUgPSBmb3JtLkRpc3BsYXlMaW5lO1xyXG5cclxuICAgIGxldCBzaW11bGF0ZTogYm9vbGVhbiA9IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ0hFQ0tCT1ggfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8gfHwgY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04gfHwgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCICYmICFldnQuaXNQcm9kdWNlQ2xpY2soKSk7XHJcbiAgICBpZiAoc2ltdWxhdGUpXHJcbiAgICAgIGF3YWl0IHRoaXMuc2ltdWxhdGVTZWxlY3Rpb24oY3RybCwgZXZ0LmdldFZhbHVlKCksIGRpc3BsYXlMaW5lLCBldnQuaXNQcm9kdWNlQ2xpY2soKSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlU2VsZWN0aW9uKGN0cmwsIGRpc3BsYXlMaW5lLCBldnQuZ2V0VmFsdWUoKSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZSB0aGUgTUdfQUNUX1NVQkZPUk1fQ0xPU0VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm9ybVwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBvblN1YmZvcm1DbG9zZSh0YXNrOiBUYXNrLCBldnQ6IFJ1blRpbWVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGlmICgoZXZ0LmdldEFyZ0xpc3QoKSAhPSBudWxsKSAmJiAoZXZ0LmdldEFyZ0xpc3QoKS5nZXRTaXplKCkgPT09IDEpKSB7XHJcbiAgICAgIGxldCBzdWJmb3JtQ3RybDogTWdDb250cm9sID0gbnVsbDtcclxuICAgICAgbGV0IGNsb3NpbmdTdWJmb3JtTmFtZTogc3RyaW5nID0gYXdhaXQgZXZ0LmdldEFyZ0xpc3QoKS5nZXRBcmdWYWx1ZSgwLCBTdG9yYWdlQXR0cmlidXRlLkFMUEhBLCAwKTtcclxuXHJcbiAgICAgIC8vIFFDUiAjMjgzMTE0LiBBcmd1bWVudCBvZiAnU3ViZm9ybSByZWZyZXNoIGV2ZW50JyBjYW4gYmUgc2tpcHBlZCBvciBub3QgZXhpc3QuXHJcbiAgICAgIGlmIChjbG9zaW5nU3ViZm9ybU5hbWUgPT0gbnVsbClcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAvLyBSUyBtdXN0IGJlIGV4ZWN1dGVkIG9ubHkgaWYgdGhlIGN1cnJlbnQgc3ViZm9ybSBpcyByZWZyZXNoZWQuXHJcbiAgICAgIC8vIElmIGl0cyBicm90aGVyIGlzIHJlZnJlc2hlZCB3ZSBkbyBub3QgbmVlZCB0byBleGVjdXRlIFJTIG9mIHRoZSBjdXJyZW50IHRhc2suXHJcbiAgICAgIGZvciAobGV0IHBhcmVudFRhc2s6IFRhc2sgPSB0YXNrOyBwYXJlbnRUYXNrLmdldEZvcm0oKSAhPSBudWxsICYmIHBhcmVudFRhc2suZ2V0TWdkSUQoKSA9PT0gdGFzay5nZXRNZ2RJRCgpOyBwYXJlbnRUYXNrID0gPFRhc2s+cGFyZW50VGFzay5nZXRQYXJlbnQoKSkge1xyXG4gICAgICAgIHN1YmZvcm1DdHJsID0gPE1nQ29udHJvbD5wYXJlbnRUYXNrLmdldEZvcm0oKS5nZXRDdHJsQnlOYW1lKGNsb3NpbmdTdWJmb3JtTmFtZS50cmltKCksIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NVQkZPUk0pO1xyXG4gICAgICAgIGlmIChzdWJmb3JtQ3RybCAhPSBudWxsKSB7XHJcbiAgICAgICAgICBsZXQgc3ViZm9ybVRhc2s6IFRhc2sgPSA8VGFzaz5zdWJmb3JtQ3RybC5nZXRTdWJmb3JtVGFzaygpO1xyXG4gICAgICAgICAgLy8gSWYgdGhlIHN1YmZvcm0gdGFzayB3YXMgbm90IG9wZW5lZCB5ZXQsIGJ1dCBzdWJmb3JtIHJlZnJlc2ggaXMgZG9uZSxcclxuICAgICAgICAgIC8vIGl0J3MgbmVlZGVkIHRvIG9wZW4gdGhlIHN1YmZvcm0uIFFDUiAjNDE1OTE0LlxyXG4gICAgICAgICAgaWYgKHN1YmZvcm1UYXNrICE9IG51bGwgJiYgIXN1YmZvcm1UYXNrLklzUm91dGUoKSkge1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wZXJmb3JtU3ViZm9ybUNsb3NlKHN1YmZvcm1DdHJsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwZXJmb3JtU3ViZm9ybUNsb3NlKCkgICA6IENsb3NlcyB0aGUgc3ViZm9ybSB0YXNrIG9wZW5lZCBpbiB0aGUgc3ViZm9ybUN0cmxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3ViZm9ybUN0cmxcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICBwdWJsaWMgYXN5bmMgcGVyZm9ybVN1YmZvcm1DbG9zZShzdWJmb3JtQ3RybDogTWdDb250cm9sKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgc3ViZm9ybVRhc2s6IFRhc2sgPSA8VGFzaz5zdWJmb3JtQ3RybC5nZXRTdWJmb3JtVGFzaygpO1xyXG4gICAgbGV0IHBhcmVudFRhc2s6IFRhc2sgPSA8VGFzaz5zdWJmb3JtQ3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG5cclxuICAgIGxldCBtZ2Q6IE1HRGF0YSA9IHN1YmZvcm1UYXNrLmdldE1HRGF0YSgpO1xyXG4gICAgdGhpcy5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgYXdhaXQgc3ViZm9ybVRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgdGhpcy5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICBpZiAoIXRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgcGFyZW50VGFzay5UYXNrU2VydmljZS5SZW1vdmVSZWNvbXB1dGVzKHBhcmVudFRhc2spO1xyXG4gICAgICBhd2FpdCBzdWJmb3JtVGFzay5zdG9wKCk7XHJcblxyXG4gICAgICBzdWJmb3JtQ3RybC5yZXNldFN1YmZvcm1UYXNrKCk7XHJcbiAgICAgIGF3YWl0IENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICBDb21tYW5kcy5hZGRDbG9zZXN1YmZvcm0oQ29tbWFuZFR5cGUuQ0xPU0VfU1VCX0ZPUk0sIHN1YmZvcm1DdHJsLCBzdWJmb3JtVGFzay5nZXRUYXNrVGFnKCksICg8TWdDb250cm9sQmFzZT5zdWJmb3JtQ3RybCkuZ2V0TmFtZSgpLCBzdWJmb3JtVGFzay5nZXRGb3JtKCkuYnVpbGRGb3JtTmFtZSgpKTtcclxuXHJcbiAgICAgIC8vIFNldCBtZ2QuYWJvcnQoKSwgaW4gb3JkZXIgdG8gY2xvc2UgY3VycmVudCBldmVudCBsb29wIG9mIE1vZGFsIHN1YmZvcm0uXHJcbiAgICAgIC8vIGFuZCByZXNldCBpdCBiYWNrIHRvIGZhbHNlIG9uY2UgaXQgY29tZXMgb3V0IG9mIGN1cnJlbnQgZXZlbnRzbG9vcCgpLlxyXG4gICAgICBpZiAoKDxNZ0NvbnRyb2xCYXNlPnN1YmZvcm1DdHJsKS5Jc01vZGFsKCkpXHJcbiAgICAgICAgbWdkLmFib3J0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxjdWxhdGUgYXJndW1lbnRzIGZvciBldmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+IDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBjcmVhdGVFdmVudEFyZ3VtZW50cyhldnQ6IFJ1blRpbWVFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKGV2dC5nZXRBcmdMaXN0KCkgPT09IG51bGwpIHtcclxuICAgICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuICAgICAgICBzd2l0Y2ggKGV2dC5nZXRJbnRlcm5hbENvZGUoKSkge1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkb1N1ZmZpeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBEb1Rhc2tMZXZlbFJlY29yZFN1ZmZpeCh0YXNrOiBUYXNrQmFzZSwgcmVmRG9TdWZmaXg6IFJlZlBhcmFtPGJvb2xlYW4+KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgc2hvdWxkUmV0dXJuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpIHtcclxuICAgICAgcmVmRG9TdWZmaXgudmFsdWUgPSBmYWxzZTtcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICBpZiAodGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgIHNob3VsZFJldHVybiA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNob3VsZFJldHVybjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZvcm1cIj48L3BhcmFtPlxyXG4gIGFzeW5jIERvVGFza0xldmVsUmVjb3JkUHJlZml4KHRhc2s6IFRhc2tCYXNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZG8gdGhlIG1hZ2ljIGRlZmF1bHQgb3BlcmF0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIGludGVybmFsIGV2ZW50IGNvZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZ0XCI+dGhlIGV2ZW50IHRvIGhhbmRsZSA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGVsbHMgdGhlIGNhbGxlciB3aGV0aGVyIHRvIGNvbnRpbnVlIGhhbmRsaW5nIHRoZSBldmVudCA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21tb25IYW5kbGVyKGV2dDogUnVuVGltZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPmV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgbWdEYXRhOiBNR0RhdGEgPSB0YXNrLmdldE1HRGF0YSgpO1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD5ldnQuQ29udHJvbDtcclxuICAgIGxldCBsYXN0UGFya2VkQ3RybDogTWdDb250cm9sO1xyXG4gICAgbGV0IGRvU3VmZml4OiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCBvbGRNb2RlOiBzdHJpbmc7XHJcbiAgICBsZXQgc2VydmVyOiBDb21tYW5kc1Byb2Nlc3NvckJhc2UgPSBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yO1xyXG5cclxuICAgIGlmICh0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgLy8gaWYgdGhpcyBpcyBhIHVzZXIgZXZlbnQgdGhhdCBjb252ZXJ0cyB0byBhIHN5c3RlbSBvciBpbnRlcm5hbCBldmVuLCBjb252ZXJ0IGl0XHJcbiAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSKVxyXG4gICAgICBldnQgPSBuZXcgUnVuVGltZUV2ZW50KGV2dC5nZXRVc2VyRXZlbnQoKSwgZXZ0KTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLnB1c2hSdEV2ZW50KGV2dCk7XHJcblxyXG4gICAgICBpZiAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9TWVNURU0pIHtcclxuICAgICAgICBsZXQgYWN0SWQ6IG51bWJlciA9IHRoaXMuZ2V0TWF0Y2hpbmdBY3Rpb24oZXZ0LmdldEtiZEl0bSgpKTtcclxuICAgICAgICBpZiAoYWN0SWQgIT09IDApXHJcbiAgICAgICAgLy8gaGFuZGxlZCBpbnRlcm5hbGx5XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZXZ0ID0gbmV3IFJ1blRpbWVFdmVudChldnQsIGV2dCk7XHJcbiAgICAgICAgICBldnQuc2V0SW50ZXJuYWwoYWN0SWQpO1xyXG4gICAgICAgICAgZXZ0LnNldEFyZ0xpc3QobnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9Ly8gZW5kIG9mIHN5c3RlbSBldmVudHMgcHJvY2Vzc2luZ1xyXG5cclxuICAgICAgLy8gZXhlY3V0ZSB0aGUgY29tbW9uIGhhbmRsaW5nIG9mIGludGVybmFsIGV2ZW50cyBvbmx5IGlmIHRoZXkgYXJlIG5vdCBpbW1lZGlhdGUuXHJcbiAgICAgIC8vIGFuIGV2ZW50IGlzIGltbWVkaWF0ZSB3aGVuIGl0IHdhcyByYWlzZWQgYnkgYSByYWlzZSBldmVudCBvcGVyYXRpb24gdGhhdCBpdHNcclxuICAgICAgLy8gd2FpdCBjb25kaXRpb24gaXMgeWVzIG9yIGV2YWx1YXRlcyB0byB0cnVlLlxyXG4gICAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZDtcclxuICAgICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgIWV2dC5pc0ltbWVkaWF0ZSgpICYmIHRoaXMuQWN0QWxsb3dlZChldnQuZ2V0SW50ZXJuYWxDb2RlKCkpICYmICF0aGlzLl9wcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2spIHtcclxuICAgICAgICBsZXQgY21kc1RvU2VydmVyOiBDb21tYW5kc1RhYmxlID0gPENvbW1hbmRzVGFibGU+bWdEYXRhLkNtZHNUb1NlcnZlcjtcclxuICAgICAgICBsZXQgZHY6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRhc2suRGF0YVZpZXc7XHJcbiAgICAgICAgbGV0IHJlYzogUmVjb3JkID0gZHYuZ2V0Q3VyclJlYygpO1xyXG5cclxuICAgICAgICBsZXQgaW50RXZ0Q29kZTogbnVtYmVyID0gZXZ0LmdldEludGVybmFsQ29kZSgpO1xyXG5cclxuICAgICAgICAvLyBmb3IgaW50ZXJuYWwgZXZlbnRzXHJcbiAgICAgICAgc3dpdGNoIChpbnRFdnRDb2RlKSB7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU1VCRk9STV9DTE9TRTpcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5vblN1YmZvcm1DbG9zZSh0YXNrLCBldnQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQlVUVE9OOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9ISVQ6XHJcbiAgICAgICAgICAgIC8vIGlmIGJ1dHRvbiBpcyBub3QgcGFya2FibGUsIHJhaXNlIGl0cyBldmVudCBvbmx5IGlmIHRoZSBhY3Rpb24gd2FzIG5vdCB0cmlnZ2VyZWQgYnkgZ3VpLlxyXG4gICAgICAgICAgICAvLyBkaXJlY3QgY2xpY2sgb24gdGhlIGJ1dHRvbiB3aWxsIGdldCBoZXJlIGFzIGN0cmwgaGl0ICwgYnV0IGlzIG5vdCB0cmlnZ2VyZWQgYnkgZ3VpIChnb2VzIHZpYSBzZWxlY3Rpb24gZXZlbnQgMXN0KVxyXG4gICAgICAgICAgICAvLyBvdGhlciBjdHJsX2hpdCBhY3Rpb25zIHNob3VsZCBjb25zaWRlciB0aGUgcGFya2FiaWxpdHlcclxuICAgICAgICAgICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OICYmXHJcbiAgICAgICAgICAgICAgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9CVVRUT04gfHwgIWV2dC5pc0d1aVRyaWdnZXJlZEV2ZW50KCkgfHwgY3RybC5pc1BhcmthYmxlKHRydWUpKSkge1xyXG4gICAgICAgICAgICAgIGxldCBhUnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwpO1xyXG4gICAgICAgICAgICAgIGlmIChjdHJsLmdldFJ0RXZ0VGFzaygpICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICBhUnRFdnQuc2V0VGFzayhjdHJsLmdldFJ0RXZ0VGFzaygpKTtcclxuICAgICAgICAgICAgICBpZiAoQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9OT05FICE9PSBhUnRFdnQuZ2V0VHlwZSgpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3RybC51c2Vab29tSGFuZGxlcigpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCB0YXNrVG9FbmFibGU6IFRhc2sgPSA8VGFzaz5hUnRFdnQuZ2V0VGFzaygpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGFza1RvRW5hYmxlICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgICAgdGFza1RvRW5hYmxlLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGFSdEV2dC5zZXRBcmdMaXN0KGN0cmwuQXJnTGlzdCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBhUnRFdnQuc2V0UHVibGljTmFtZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRUb1RhaWwoYVJ0RXZ0KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tBbmRTYXZlUm91dGVFdmVudElmQ3R4UmVtb3ZlZEZyb21TcnZyKGFSdEV2dCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCKSB7XHJcbiAgICAgICAgICAgICAgLy8gRml4ZWQgYnVnICM3MjQxNTA6IGFzIHdlIGRvaW5nIGZvciBvbmxpbmUgZm9yIHRhYiBjb250cm9sIHdlIHNlbmQgQUNUX1pPT00gKENob2ljZWlucC5jcHAgOjpEaXRHZXQoKSlcclxuICAgICAgICAgICAgICB0aGlzLmFkZEludGVybmFsRXZlbnRXaXRoQ3RybEFuZENvZGUoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU8pIHtcclxuICAgICAgICAgICAgICBjdHJsLnNldENvbnRyb2xUb0ZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RPR0dMRV9JTlNFUlQ6XHJcbiAgICAgICAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5Ub2dnbGVJbnNlcnRNb2RlKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NMT1NFOlxyXG4gICAgICAgICAgICBsZXQgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KGV2dCwgZXZ0KTtcclxuICAgICAgICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICAgICAgICB0aGlzLmFkZFRvVGFpbChydEV2dCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQ6XHJcbiAgICAgICAgICAgIC8vIGlmICdleGl0JyBhY2NlcHRlZCBvbiBNREksIGV4aXQgdGhlIHRvcCBtb3N0IHRhc2suIHNhbWUgYXMgd2hlbiBleGl0aW5nIHRoZSBzeXN0ZW0uXHJcbiAgICAgICAgICAgIGxldCB0YXNrVG9FbmQ6IFRhc2sgPSAodGFzay5pc01haW5Qcm9nKCkgPyBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkgOiB0YXNrKTtcclxuICAgICAgICAgICAgYXdhaXQgdGFza1RvRW5kLmVuZFRhc2soZXZ0LnJldmVyc2libGVFeGl0KCksIGZhbHNlLCBldnQuRXhpdER1ZVRvRXJyb3IoKSk7XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUX1NZU1RFTTpcclxuICAgICAgICAgICAgLy8gZW5kIHRoZSB0b3AgbW9zdCB0YXNrIHdpdGggZm9ybS5cclxuICAgICAgICAgICAgYXdhaXQgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLmVuZFRhc2soZXZ0LnJldmVyc2libGVFeGl0KCksIGZhbHNlLFxyXG4gICAgICAgICAgICAgIGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gR2V0VG9wTW9zdFRhc2tXaXRoRm9ybSh0YXNrKS5lbmRUYXNrKGV2dC5yZXZlcnNpYmxlRXhpdCgpLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUTElORTpcclxuICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9ST1csIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9ORVhUKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVkxJTkU6XHJcbiAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfUk9XLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fUFJFVik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRQQUdFOlxyXG4gICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1BBR0UsIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9ORVhUKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVlBBR0U6XHJcbiAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfUEFHRSwgQ29uc3RhbnRzLk1PVkVfRElSRUNUSU9OX1BSRVYpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHUEFHRTpcclxuICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fQkVHSU4pO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfRU5EUEFHRTpcclxuICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCBmb3JtLm1vdmVJblZpZXcoQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fRU5EKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1RCTDpcclxuICAgICAgICAgICAgLy8gIzkxODU4ODogSWYgY3RybCtob21lL2N0cmwrZW5kIHByZXNzZWQgd2hlbiBwYXJrZWQgb24gbGlzdGJveFxyXG4gICAgICAgICAgICAvLyB0aGVuIEJlZ2luIHRhYmxlIGV2ZW50IHNob3VsZCBub3QgYmUgaGFuZGxlZC5cclxuICAgICAgICAgICAgbGFzdFBhcmtlZEN0cmwgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsID09IG51bGwgfHwgIWxhc3RQYXJrZWRDdHJsLmlzTGlzdEJveCgpKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0ubW92ZUluVmlldyhDb25zdGFudHMuTU9WRV9VTklUX1RBQkxFLCBDb25zdGFudHMuTU9WRV9ESVJFQ1RJT05fQkVHSU4pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9FTkRUQkw6XHJcbiAgICAgICAgICAgIC8vICM5MTg1ODg6IElmIGN0cmwraG9tZS9jdHJsK2VuZCBwcmVzc2VkIHdoZW4gcGFya2VkIG9uIGxpc3Rib3hcclxuICAgICAgICAgICAgLy8gdGhlbiBCZWdpbiB0YWJsZSBldmVudCBzaG91bGQgbm90IGJlIGhhbmRsZWQuXHJcbiAgICAgICAgICAgIGxhc3RQYXJrZWRDdHJsID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgICAgIGlmIChsYXN0UGFya2VkQ3RybCA9PT0gbnVsbCB8fCAhbGFzdFBhcmtlZEN0cmwuaXNMaXN0Qm94KCkpIHtcclxuICAgICAgICAgICAgICBpZiAoZm9ybSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KENvbnN0YW50cy5NT1ZFX1VOSVRfVEFCTEUsIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9FTkQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1dFQl9PTl9EQkxJQ0s6IHtcclxuICAgICAgICAgICAgLy8gVW5saWtlIE9ubGluZSwgaGVyZSBTRUxFQ1Qgb3IgWk9PTSBjb21lcyBhZnRlciB0aGUgREJDTElDSy5cclxuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBEQkNMSUNLIGhhbmRsZXIgd2l0aCBwcm9wb2dhdGUgPSAnTk8nICwgdGhlc2UgYWN0aW9ucyB3aWxsIG5vdCBiZSByYWlzZWQuXHJcbiAgICAgICAgICAgIGxldCBjdHJsVHlwZTogTWdDb250cm9sVHlwZSA9IGN0cmwuVHlwZTtcclxuICAgICAgICAgICAgbGV0IHB1dEFjdGlvbjogbnVtYmVyID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX05PTkU7XHJcbiAgICAgICAgICAgIGlmIChjdHJsVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEUgJiYgY3RybFR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xBQkVMICYmXHJcbiAgICAgICAgICAgICAgY3RybFR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0lNQUdFKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5BY3Rpb25NYW5hZ2VyLmlzRW5hYmxlZChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VMRUNUKSlcclxuICAgICAgICAgICAgICAgIHB1dEFjdGlvbiA9IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRUxFQ1Q7XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLkFjdGlvbk1hbmFnZXIuaXNFbmFibGVkKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NKSlcclxuICAgICAgICAgICAgICAgICAgcHV0QWN0aW9uID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT007XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBpZiAocHV0QWN0aW9uICE9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfTk9ORSlcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkSW50ZXJuYWxFdmVudFdpdGhDdHJsQW5kQ29kZShjdHJsLCBwdXRBY3Rpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RFTExJTkU6XHJcbiAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLkhhbmRsZUFjdGlvbkRlbGxpbmUodGFzaywgZHYsIHJlYywgZmFsc2UpKVxyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORTpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkVfQUJPVkU6XHJcbiAgICAgICAgICAgIGlmICh0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nb3RvQ3JlYXRlTW9kZSh0YXNrKTtcclxuXHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0SW5DcmVhdGVMaW5lKCkpXHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICB0YXNrLnNldEluQ3JlYXRlTGluZSh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UodGFzay5nZXRMYXN0UGFya2VkQ3RybCgpLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIGN1cnJlbnQgcmVjb3JkIGlzIG5vdCBhbHJlYWR5IGEgbmV3IG9uZVxyXG4gICAgICAgICAgICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgcmVjICE9IG51bGwgJiYgIXJlYy5Nb2RpZmllZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgZmFsc2UpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGRvU3VmZml4ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSB8fCB0YXNrLmlzQWJvcnRpbmcoKSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiBmb3JtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBEZWZlY3QgMTUyMzU1OiBQYXJrIG9uIGxhc3RQYXJrZWRDb250cm9sIGlmIG5leHRTY3JlZW4gZXZlbnQgb2NjdXJzIGlmIGFscmVhZHkgaW4gY3JlYXRlIG1vZGUgYW5kIHJlY29yZCBub3QgbW9kaWZpZWRcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdFBhcmtlZENvbnRyb2w6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0UGFya2VkQ29udHJvbCAhPT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGxhc3RQYXJrZWRDb250cm9sLmludm9rZSgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgbGV0IHJlZkRvU3VmZml4OiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbShkb1N1ZmZpeCk7XHJcbiAgICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuRG9UYXNrTGV2ZWxSZWNvcmRTdWZmaXgodGFzaywgcmVmRG9TdWZmaXgpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIGRvU3VmZml4ID0gcmVmRG9TdWZmaXgudmFsdWU7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChmb3JtICE9IG51bGwpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoKHRhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkgfHwgIXRhc2suQ29uZmlybVVwZGF0ZU5vKVxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLmFkZFJlYyhkb1N1ZmZpeCwgaW50RXZ0Q29kZSA9PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORV9BQk9WRSA/IHRydWUgOiBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLkRvVGFza0xldmVsUmVjb3JkUHJlZml4KHRhc2spO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlQWN0RW50ZXJSb3dFZGl0aW5nKHRhc2spO1xyXG5cclxuICAgICAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICB0YXNrLnNldEluQ3JlYXRlTGluZShmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZUFjdENhbmNlbChldnQsIHRhc2ssIGZvcm0sIGN0cmwsIHJlYywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VOVEVSX1JPV19FRElUSU5HOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZUFjdEVudGVyUm93RWRpdGluZyh0YXNrKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUVVJVDpcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1FVSVQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fQ1JFQVRFOlxyXG4gICAgICAgICAgICBpZiAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFIHx8XHJcbiAgICAgICAgICAgICAgYXdhaXQgKHRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19PUFRJT04pKS5nZXRWYWx1ZUJvb2xlYW4oKSkge1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ290b0NyZWF0ZU1vZGUodGFzayk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19RVUVSWTpcclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZICYmXHJcbiAgICAgICAgICAgICAgKGF3YWl0ICh0YXNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfT1BUSU9OKSkuZ2V0VmFsdWVCb29sZWFuKCkpID09PSBmYWxzZSlcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5lbmFibGVNb2RlcygpO1xyXG4gICAgICAgICAgICBvbGRNb2RlID0gdGFzay5nZXRPcmlnaW5hbFRhc2tNb2RlKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSk7XHJcbiAgICAgICAgICAgICAgaWYgKG9sZE1vZGUgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkdi5jdXJyUmVjQ29tcHV0ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGN0cmwuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBhbHJlYWR5IGV4ZWN1dGVkIHJlY29yZCBzdWZmaXggLSBzbyB3ZSBuZWVkIHRvIHByZXZlbnQgdGhlIHZpZXcgcmVmcmVzaFxyXG4gICAgICAgICAgICAgICAgLy8gZnJvbSBleGVjdXRpbmcgaXQgYWdhaW5cclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudFJlY29yZFN1ZmZpeCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudENvbnRyb2xDaGFuZ2UodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXKTtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGN0cmwuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgICB0YXNrLnNldFByZXZlbnRSZWNvcmRTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50Q29udHJvbENoYW5nZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWR2LmlzRW1wdHkoKSAmJiAoZHYuZ2V0Q3VyclJlYygpKS5nZXRNb2RlKCkgIT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpXHJcbiAgICAgICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZvcm0uUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9DVVJSX1JFQyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRhc2suc2V0T3JpZ2luYWxUYXNrTW9kZShDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZKTtcclxuICAgICAgICAgICAgICBhd2FpdCB0YXNrLnNldENyZWF0ZURlbGV0ZUFjdHNFbmFibGVTdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19NT0RJRlk6XHJcbiAgICAgICAgICAgIGlmICh0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkgJiZcclxuICAgICAgICAgICAgICAoYXdhaXQgKHRhc2suZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19PUFRJT04pKS5nZXRWYWx1ZUJvb2xlYW4oKSkgPT09IGZhbHNlKVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrLmVuYWJsZU1vZGVzKCk7XHJcbiAgICAgICAgICAgIG9sZE1vZGUgPSB0YXNrLmdldE9yaWdpbmFsVGFza01vZGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChvbGRNb2RlICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZHYuY3VyclJlY0NvbXB1dGUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3RybCAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBjdHJsLmludm9rZSgpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBhbHJlYWR5IGV4ZWN1dGVkIHJlY29yZCBzdWZmaXggLSBzbyB3ZSBuZWVkIHRvIHByZXZlbnQgdGhlIHZpZXcgcmVmcmVzaFxyXG4gICAgICAgICAgICAgICAgLy8gZnJvbSBleGVjdXRpbmcgaXQgYWdhaW5cclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudFJlY29yZFN1ZmZpeCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRhc2suc2V0UHJldmVudENvbnRyb2xDaGFuZ2UodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXKTtcclxuICAgICAgICAgICAgICAgIGlmIChjdHJsICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGN0cmwuaW52b2tlKCk7XHJcbiAgICAgICAgICAgICAgICB0YXNrLnNldFByZXZlbnRSZWNvcmRTdWZmaXgoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRQcmV2ZW50Q29udHJvbENoYW5nZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWR2LmlzRW1wdHkoKSAmJiAoZHYuZ2V0Q3VyclJlYygpKS5nZXRNb2RlKCkgIT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpXHJcbiAgICAgICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0YXNrLnNldE9yaWdpbmFsVGFza01vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRhc2suc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU0VMRUNUOlxyXG4gICAgICAgICAgICAvKiBwcmVmb3JtIHJlYyBzdWZmaXggKi9cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICB0YXNrLkluU2VsZWN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgICAgdGFzay5JblNlbGVjdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAgIC8qIGNsb3NlIHRoZSBzZWxlY3Rpb24gcHJvZ3JhbSAqL1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfU1VCRk9STV9SRUZSRVNIOlxyXG4gICAgICAgICAgICBpZiAoKGV2dC5nZXRBcmdMaXN0KCkgIT0gbnVsbCkgJiYgKGV2dC5nZXRBcmdMaXN0KCkuZ2V0U2l6ZSgpID09PSAxKSkge1xyXG4gICAgICAgICAgICAgIGxldCBzdWJmb3JtQ3RybDogTWdDb250cm9sID0gbnVsbDtcclxuICAgICAgICAgICAgICBsZXQgUmVmcmVzaGVkU3ViZm9ybU5hbWU6IHN0cmluZyA9IGF3YWl0IGV2dC5nZXRBcmdMaXN0KCkuZ2V0QXJnVmFsdWUoMCwgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSwgMCk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIFFDUiAjMjgzMTE0LiBBcmd1bWVudCBvZiAnU3ViZm9ybSByZWZyZXNoIGV2ZW50JyBjYW4gYmUgc2tpcHBlZCBvciBub3QgZXhpc3QuXHJcbiAgICAgICAgICAgICAgaWYgKFJlZnJlc2hlZFN1YmZvcm1OYW1lID09IG51bGwpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgLy8gUlMgbXVzdCBiZSBleGVjdXRlZCBvbmx5IGlmIHRoZSBjdXJyZW50IHN1YmZvcm0gaXMgcmVmcmVzaGVkLlxyXG4gICAgICAgICAgICAgIC8vIElmIGl0cyBicm90aGVyIGlzIHJlZnJlc2hlZCB3ZSBkbyBub3QgbmVlZCB0byBleGVjdXRlIFJTIG9mIHRoZSBjdXJyZW50IHRhc2suXHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgcGFyZW50VGFzazogVGFzayA9IHRhc2s7IHBhcmVudFRhc2suZ2V0Rm9ybSgpICE9IG51bGwgJiYgcGFyZW50VGFzay5nZXRNZ2RJRCgpID09PSB0YXNrLmdldE1nZElEKCk7IHBhcmVudFRhc2sgPSA8VGFzaz5wYXJlbnRUYXNrLmdldFBhcmVudCgpKSB7XHJcbiAgICAgICAgICAgICAgICBzdWJmb3JtQ3RybCA9IDxNZ0NvbnRyb2w+cGFyZW50VGFzay5nZXRGb3JtKCkuZ2V0Q3RybEJ5TmFtZShSZWZyZXNoZWRTdWJmb3JtTmFtZS50cmltKCksIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NVQkZPUk0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1YmZvcm1DdHJsICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IHN1YmZvcm1UYXNrOiBUYXNrID0gPFRhc2s+c3ViZm9ybUN0cmwuZ2V0U3ViZm9ybVRhc2soKTtcclxuICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHN1YmZvcm0gdGFzayB3YXMgbm90IG9wZW5lZCB5ZXQsIGJ1dCBzdWJmb3JtIHJlZnJlc2ggaXMgZG9uZSxcclxuICAgICAgICAgICAgICAgICAgLy8gaXQncyBuZWVkZWQgdG8gb3BlbiB0aGUgc3ViZm9ybS4gUUNSICM0MTU5MTQuXHJcbiAgICAgICAgICAgICAgICAgIGlmIChzdWJmb3JtVGFzayA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUUNSICMyODc1NjIuIE9wZW4gdGhlIHN1YmZvcm0gdGFzayBvbmx5IGlmIHRoZSBzdWJmb3JtIGNvbnRyb2wgaXMgY29ubmVjdGVkIHRvIHRoZSB0YXNrLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhd2FpdCAoc3ViZm9ybUN0cmwuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TVUJGT1JNX1RZUEUpKS5nZXRWYWx1ZUludCgpICE9PSBTdWJmb3JtVHlwZS5Ob25lKVxyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5PcGVuU3ViZm9ybShwYXJlbnRUYXNrLCBzdWJmb3JtQ3RybCk7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHBhcmVudFRhc2suU3ViZm9ybVJlZnJlc2goc3ViZm9ybVRhc2ssIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gaWYgaXQgaXMgU3ViZm9ybVJlZnJlc2ggdGhhdCByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIsIHNvIHNlYXJjaCB0aGUgdGFzayBhY2NvcmRpbmcgdG8gaXRzIHRhc2sgaWQgKHRhZylcclxuICAgICAgICAgICAgZWxzZSBpZiAoKGV2dC5nZXRBcmdMaXN0KCkgIT0gbnVsbCkgJiYgKGV2dC5nZXRBcmdMaXN0KCkuZ2V0U2l6ZSgpID09PSAyKSkge1xyXG4gICAgICAgICAgICAgIGxldCBzdWJmb3JtVGFzazogVGFzayA9IHRhc2ssIHBhcmVudFRhc2s7XHJcbiAgICAgICAgICAgICAgbGV0IHRhc2tUYWc6IHN0cmluZyA9IGF3YWl0IGV2dC5nZXRBcmdMaXN0KCkuZ2V0QXJnVmFsdWUoMSwgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDLCAwKTtcclxuXHJcbiAgICAgICAgICAgICAgd2hpbGUgKHN1YmZvcm1UYXNrLklzU3ViRm9ybSkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50VGFzayA9IHN1YmZvcm1UYXNrLmdldFBhcmVudCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1YmZvcm1UYXNrLmdldFRhc2tUYWcoKSA9PT0gdGFza1RhZykge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBwYXJlbnRUYXNrLlN1YmZvcm1SZWZyZXNoKHN1YmZvcm1UYXNrLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzdWJmb3JtVGFzayA9IHBhcmVudFRhc2s7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NVQkZPUk1fT1BFTjpcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5PcGVuU3ViZm9ybSh0YXNrLCA8TWdDb250cm9sPmV2dC5Db250cm9sKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX1NFQVJDSDpcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUV2ZW50Q29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgaW50RXZ0Q29kZSk7XHJcbiAgICAgICAgICAgICAgdGFzay5nZXRUYXNrQ2FjaGUoKS5jbGVhckNhY2hlKCk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGFzay5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZShjbWQpO1xyXG5cclxuICAgICAgICAgICAgICAvLyBBZnRlciB2aWV3IHJlZnJlc2gsIHRoZSBzZXJ2ZXIgYWx3YXlzIHJldHVybnMgY3VyciByZWMgYXMgZmlyc3QgcmVjLlxyXG4gICAgICAgICAgICAgIGlmICghZm9ybS5pc1NjcmVlbk1vZGUoKSkge1xyXG4gICAgICAgICAgICAgICAgZHYuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm0uSGFzVGFibGUoKSkge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLnJlc3RvcmVPbGREaXNwbGF5TGluZShmb3JtLnJlY29yZElkeDJEaXNwbGF5TGluZShkdi5nZXRDdXJyUmVjSWR4KCkpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgICBpZiAoY3RybCAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgY3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1NDUkVFTjpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVzpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfUkVDT1JEOlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZVJlZnJlc2hFdmVudHMoZXZ0KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQUNUX0NMT1NFX0FQUEw6XHJcbiAgICAgICAgICAgIGNtZCA9XHJcbiAgICAgICAgICAgICAgQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRXZlbnRDb21tYW5kKFxyXG4gICAgICAgICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLmdldFRhc2tUYWcoKSxcclxuICAgICAgICAgICAgICAgIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9CUk9XU0VSX0VTQyk7XHJcbiAgICAgICAgICAgIGNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAgICAgICAgICAgYXdhaXQgc2VydmVyLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT05URVhUX1JFTU9WRTpcclxuXHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRyYW5zYWN0aW9uIGlzIHBlbmRpbmdcclxuICAgICAgICAgICAgbGV0IGN1cnJSZWNvcmQgPSAoPERhdGFWaWV3Pkxhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKS5EYXRhVmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgICAgICAgICBpZiAoQ2xpZW50TWFuYWdlci5UcmFuc0NhY2hlRXhpc3RzKCkgfHwgKGN1cnJSZWNvcmQgIT0gbnVsbCAmJiBjdXJyUmVjb3JkLk1vZGlmaWVkKSkge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdQZW5kaW5nIHRyYW5zYWN0aW9uL3JlY29yZCBpcyBtb2RpZmllZCwgZGlzY2FyZGVkIFxcJ0NvbnRleHQgUmVtb3ZlXFwnIGV2ZW50LicpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIElzIHRoZXJlIGNsaWVudCBjb250ZXh0IGluYWN0aXZpdHkgdGltZW91dD9cclxuICAgICAgICAgICAgICBpZiAoRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0Q2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lb3V0KCkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLkV4ZWN1dGVDbGllbnRDb250ZXh0SW5hY3Rpdml0eVRpbWVyKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBpZiAoIUV2ZW50c01hbmFnZXIuY2xpZW50Q29udGV4dEluYWN0aXZpdHlUaW1lckFib3J0ZWQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBhZGQgYSBjb21tYW5kIHRvIHRlcm1pbmF0ZSBjb250ZXh0IGF0IHNlcnZlciBzaWRlXHJcbiAgICAgICAgICAgICAgICBsZXQgY29udGV4dFRlcm1pbmF0aW9uRXZlbnRDb21tYW5kOiBDb250ZXh0VGVybWluYXRpb25FdmVudENvbW1hbmRcclxuICAgICAgICAgICAgICAgICAgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVDb250ZXh0VGVybWluYXRpb25FdmVudENvbW1hbmQoTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLmdldFRhc2tUYWcoKSk7XHJcbiAgICAgICAgICAgICAgICBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldEN1cnJNR0RhdGEoKS5DbWRzVG9TZXJ2ZXIuQWRkKDxJQ2xpZW50Q29tbWFuZD5jb250ZXh0VGVybWluYXRpb25FdmVudENvbW1hbmQpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIG5lZWQgbm90IHRvIGJlIGhhbmRsZWQgYXMgdGhlIHdlIGFyZSB0ZXJtaW5hdGluZyB0aGUgY29udGV4dFxyXG4gICAgICAgICAgICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uT05MWV9DT01NQU5EUyk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlbW92ZWQgY29udGV4dCBmcm9tIHNlcnZlcicpO1xyXG4gICAgICAgICAgICAgICAgLy8gc2V0IGZsYWcgdG8gdGhhdCBjb250ZXh0IGlzIHJlbW92ZWQgZnJvbSBzZXJ2ZXIgYnkgJ0NvbnRleHQgUmVtb3ZlJyBldmVudFxyXG4gICAgICAgICAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlJlbW92aW5nQ29udGV4dEZyb21TZXJ2ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGlzY2FyZGVkIFxcJ0NvbnRleHQgUmVtb3ZlXFwnIGV2ZW50IGFzIHVzZXIgZXZlbnQgb2NjdXJyZWQuJyk7XHJcbiAgICAgICAgICAgICAgICBFdmVudHNNYW5hZ2VyLmNsaWVudENvbnRleHRJbmFjdGl2aXR5VGltZXJBYm9ydGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRVJWRVJfVEVSTUlOQVRJT046XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9EVU1QX0VOVklST05NRU5UOlxyXG4gICAgICAgICAgICBjbWQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVFdmVudENvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIGludEV2dENvZGUpO1xyXG4gICAgICAgICAgICBjbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICAgICAgICAgIGF3YWl0IENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9FRFRfTlVMTDpcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJGaWVsZCAhPSBudWxsICYmIHRoaXMuX2N1cnJGaWVsZC5OdWxsQWxsb3dlZCkge1xyXG4gICAgICAgICAgICAgIC8vIHRoZSBuZXh0IGxpbmVzIGlzIGFuIGltbWl0YXRpb24gb2YgdGhlIGJlaGF2aW91ciBvZiBhbiBvbmxpbmUgcHJvZ3JhbTpcclxuICAgICAgICAgICAgICAvLyAxKSB0aGUgcmVjb3JkIG11c3QgYmUgdXBkYXRlZCBpbiB0aGlzIGV2ZW50XHJcbiAgICAgICAgICAgICAgLy8gMikgYSBcIm5leHQgZmllbGRcIiBldmVudCBpcyByYWlzZWRcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9jdXJyRmllbGQuc2V0VmFsdWVBbmRTdGFydFJlY29tcHV0ZSh0aGlzLl9jdXJyRmllbGQuZ2V0TWFnaWNEZWZhdWx0VmFsdWUoKSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2N1cnJGaWVsZC51cGRhdGVEaXNwbGF5KCk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JPTExCQUNLOlxyXG4gICAgICAgICAgICAvLyBmb3Igb2ZmbGluZSB3ZSBuZWVkIHRvIGNhbmNlbCB0aGUgZWRpdCBhbmQgdGhlbiBnbyByb2xsYmFjayB0aGUgdHJhbnNhY3Rpb24sIHRoZSBzYW1lIHdlIGRvaW5nIGZvciByZW1vdmUgd2hpbGUgcmV0dXJuIGZyb20gdGhlIHNlcnZlclxyXG4gICAgICAgICAgICAvLyBzZWUgZGF0YXZpZXcuY3MgY2FzZSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9ST0xMQkFDSzpcclxuICAgICAgICAgICAgLy8gZm9yIG9mZmxpbmUgd2Ugd2lsbCBub3QgZ2V0IHRvIENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX1JPTExCQUNLXHJcbiAgICAgICAgICAgIGF3YWl0IEV2ZW50c01hbmFnZXIuSGFuZGxlUm9sbGJhY2tBY3Rpb24odGFzaywgY21kc1RvU2VydmVyLCBSb2xsYmFja0V2ZW50Q29tbWFuZF9Sb2xsYmFja1R5cGUuUk9MTEJBQ0spO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfT0s6XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9JTkRFWF9DSEFOR0U6XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT0xfU09SVDpcclxuICAgICAgICAgICAgLy8gY2FuIHNvcnQgb25seSBvbiBjb2x1bW4gd2l0aCBhbiBhdHRhY2hlZCBmaWVsZC5cclxuICAgICAgICAgICAgLy8gY2FuIGNoYW5nZSBpbmRleCBvbmx5IGlmIHRoZSBkYXRhdmlldyBpcyByZW1vdGUuXHJcbiAgICAgICAgICAgIGlmICgoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0lOREVYX0NIQU5HRSAmJiB0YXNrLkRhdGF2aWV3TWFuYWdlci5IYXNSZW1vdGVEYXRhKSB8fFxyXG4gICAgICAgICAgICAgIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ09MX1NPUlQgJiYgY3RybC5nZXRGaWVsZCgpICE9IG51bGwpKSB7XHJcbiAgICAgICAgICAgICAgLy8gUUNSICMyOTYzMjUgJiBRQ1IgIzQzMDI4OC5cclxuICAgICAgICAgICAgICAvLyBFeGVjdXRlIENTIG9mIHRoZSBjdXJyZW50IGNvbnRyb2wsIGJlY2F1c2UgaXQgY2FuIGJlIGEgcGFyYW1ldGVyIGZvciBhIHN1YmZvcm0uXHJcbiAgICAgICAgICAgICAgLy8gSWYgaXQncyB2YWx1ZSB3YXMgY2hhbmdlZCwgQ1Mgd2lsbCByZWZyZXNoIHRoZSBzdWJmb3JtIGJlZm9yZSB0aGUgc29ydC5cclxuICAgICAgICAgICAgICBsZXQgbGFzdEZvY3VzZWRUYXNrOiBUYXNrID0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG4gICAgICAgICAgICAgIGxldCBmb2N1c2VkQ3RybDogTWdDb250cm9sID0gTGFzdEZvY3VzZWRNYW5hZ2VyLmdldExhc3RGb2N1c2VkQ29udHJvbChMYXN0Rm9jdXNlZE1hbmFnZXIuTGFzdEZvY3VzTWdkSUQpO1xyXG4gICAgICAgICAgICAgIGlmIChmb2N1c2VkQ3RybCAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UoZm9jdXNlZEN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1NVRkZJWCk7XHJcblxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGFzay5FeGVjdXRlTmVzdGVkUlMobGFzdEZvY3VzZWRUYXNrKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gUUNSICM0Mzg3NTMuIEV4ZWN1dGUgUlMgb2YgdGhlIHNvcnRlZCB0YXNrLlxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmIHRhc2suZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuICAgICAgICAgICAgICAgIHRhc2suZ2V0VGFza0NhY2hlKCkuY2xlYXJDYWNoZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfSU5ERVhfQ0hBTkdFKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCB0YXNrRm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRhc2tGb3JtLkhhc1RhYmxlKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybS5jbGVhclRhYmxlQ29sdW1uU29ydE1hcmsodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICBjbWQgPSBhd2FpdCBDb21tYW5kRmFjdG9yeS5DcmVhdGVJbmRleENoYW5nZUNvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuR2V0Q3VycmVudFJlY0lkKCksIGV2dC5nZXRBcmdMaXN0KCkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgY21kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlQ29sdW1uU29ydENvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIGV2dC5EaXJlY3Rpb24sIGN0cmwuZ2V0RGl0SWR4KCksIGN0cmwuZ2V0RmllbGQoKS5nZXRJZCgpLCAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLkdldEN1cnJlbnRSZWNJZCgpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0YXNrLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcbiAgICAgICAgICAgICAgICBkdi5zZXRUb3BSZWNJZHgoMCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLnJlc3RvcmVPbGREaXNwbGF5TGluZSgwKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBRQ1IncyAjMTY1ODE1ICYgIzI5MTk3NC4gSWYgdGhlIGZvY3VzZWQgdGFzayBhbmQgdGhlIHNvcnRlZCB0YXNrIGlzIHRoZSBzYW1lIHRhc2sgb3JcclxuICAgICAgICAgICAgICAgIC8vIHRoZSBmb2N1c2VkIHRhc2sgaXMgYSBjaGlsZCBvZiB0aGUgc29ydGVkIHRhc2ssIGdvIHRvIHRoZSBmaXJzdCBjb250cm9sIGluIHRoZSBmaXJzdCBsaW5lLlxyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGZvY3VzZWQgdGFzayBpcyB0aGUgcGFyZW50IHRhc2ssIGRvIG5vdCBsZWF2ZSB0aGUgY3VycmVudCBjb250cm9sLlxyXG4gICAgICAgICAgICAgICAgaWYgKCEodGFzayA9PT0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpIHx8ICF0YXNrLnBhdGhDb250YWlucyhMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkpKSkge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmICF0YXNrLmdldFByZXZlbnRDb250cm9sQ2hhbmdlKCkpXHJcbiAgICAgICAgICAgICAgICAgIC8vIFFDUiAjNDI4Njk3LiBFeGVjdXRlIFJTIG9mIGFsbCBuZXN0ZWQgc3ViZm9ybXMuXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbGFzdEZvY3VzZWRUYXNrLkV4ZWN1dGVOZXN0ZWRSUyh0YXNrKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgJiYgZm9jdXNlZEN0cmwgIT0gbnVsbClcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmb2N1c2VkQ3RybC5pbnZva2UoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcblxyXG5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ09MX0NMSUNLOlxyXG4gICAgICAgICAgICAvLyBjYW4gc29ydCBvbiBjb2x1bW4gb25seSBpZiBldmVudCBpcyByYWlzZWQgZHVlIHRvIGNsaWNrIGFjdGlvblxyXG4gICAgICAgICAgICAvLyBhbmQgYSBmaWVsZCBpcyBhdHRhY2hlZCB0byBjb2x1bW4uXHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiBldnQuaXNHdWlUcmlnZ2VyZWRFdmVudCgpICYmIGN0cmwuaXNDb2x1bW5Tb3J0YWJsZSgpKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGNvbHVtbkNoaWxkQ29udHJvbDogTWdDb250cm9sID0gPE1nQ29udHJvbD5jdHJsLmdldENvbHVtbkNoaWxkQ29udHJvbCgpO1xyXG4gICAgICAgICAgICAgIGlmIChjb2x1bW5DaGlsZENvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gaGFuZGxlIFNvcnQgb24gQ29sdW1uXHJcbiAgICAgICAgICAgICAgICBsZXQgYVJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudChjb2x1bW5DaGlsZENvbnRyb2wsIGV2dC5EaXJlY3Rpb24sIDApO1xyXG4gICAgICAgICAgICAgICAgYVJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DT0xfU09SVCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFRvVGFpbChhUnRFdnQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIGVuZCBvZiBpbnRlcm5hbCBldmVudHMgcHJvY2Vzc2luZ1xyXG5cclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMucG9wUnRFdmVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLypcclxuKiBIYW5kbGVBY3RFbnRlclJvd0VkaXRpbmdcclxuKiBzdGFydCB0aGUgZWRpdGluZyBvbiByb3dcclxuKiAqL1xyXG4gIHByaXZhdGUgYXN5bmMgSGFuZGxlQWN0RW50ZXJSb3dFZGl0aW5nKHRhc2s6IFRhc2spIHtcclxuICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSlcclxuICAgICAgdGFzay5Xcml0ZVRvTWVzc2FnZVBhbmUoYENhbm5vdCBlbnRlciBSb3cgRWRpdGluZyB3aGVuIGluIFF1ZXJ5IE1vZGUuYCk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IG15Zm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuICAgICAgYXdhaXQgbXlmb3JtLnN0YXJ0Um93RWRpdGluZyhteWZvcm0uRGlzcGxheUxpbmUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBIYW5kbGVTdG9wUm93RWRpdGluZyh0YXNrOiBUYXNrKSB7XHJcbiAgICBsZXQgbXlmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgYXdhaXQgbXlmb3JtLnN0b3BSb3dFZGl0aW5nKG15Zm9ybS5EaXNwbGF5TGluZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENyZWF0ZXMgYW5kIGV4ZWN1dGVzIHN1YmZvcm0gb3BlblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3ViZm9ybUNvbnRyb2xcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgT3BlblN1YmZvcm0odGFzazogVGFzaywgc3ViZm9ybUNvbnRyb2w6IE1nQ29udHJvbCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGFzay5UYXNrU2VydmljZS5SZW1vdmVSZWNvbXB1dGVzKHRhc2spO1xyXG4gICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVTdWJmb3JtT3BlbkNvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIHN1YmZvcm1Db250cm9sLmdldERpdElkeCgpKTtcclxuICAgIHRhc2suZ2V0TUdEYXRhKCkuQ21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgYXdhaXQgVGFzay5Db21tYW5kc1Byb2Nlc3Nvci5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNtZHNUb1NlcnZlclwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicm9sbGJhY2tUeXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIEhhbmRsZVJvbGxiYWNrQWN0aW9uKHRhc2s6IFRhc2ssIGNtZHNUb1NlcnZlcjogQ29tbWFuZHNUYWJsZSwgcm9sbGJhY2tUeXBlOiBSb2xsYmFja0V2ZW50Q29tbWFuZF9Sb2xsYmFja1R5cGUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjb21tYW5kc1Byb2Nlc3NvcjogQ29tbWFuZHNQcm9jZXNzb3JCYXNlID0gVGFzay5Db21tYW5kc1Byb2Nlc3NvcjtcclxuICAgIENsaWVudFJlZnJlc2hDb21tYW5kLkNsaWVudElzSW5Sb2xsYmFja0NvbW1hbmQgPSB0cnVlO1xyXG4gICAgLy8gZm9yIHJlbW90ZSBwcm9ncmFtIDogKHdpdGhcXHdpdGhvdXQgbG9jYWwgZGF0YSkgdGhlIHJvbGxiYWNrIGV2ZW50IGluIHRoZSBzZXJ2ZXIgTVVTVFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgIGJlIGV4ZWN1dGUgb24gdGhlIHRhc2sgdGhhdCBvcGVuIHRoZSB0cmFuc2FjdGlvblxyXG4gICAgLy8gZm9yIG9mZmxpbmUgcHJvZ3JhbSB0aGUgcm9sbGJhY2sgdHJhbnNhY3Rpb24gbmVlZCB0byBiZSBleGVjdXRlIG9uIHRoZSB0YXNrIHRoYXQgb3BlbiB0aGUgdHJhbnNhY3Rpb25cclxuICAgIHRhc2sgPSB0YXNrLlRhc2tTZXJ2aWNlLkdldE93bmVyVHJhbnNhY3Rpb25UYXNrKHRhc2spO1xyXG5cclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlUm9sbGJhY2tFdmVudENvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIHJvbGxiYWNrVHlwZSk7XHJcbiAgICBjbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICBhd2FpdCBjb21tYW5kc1Byb2Nlc3Nvci5FeGVjdXRlKENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuXHJcbiAgICBDbGllbnRSZWZyZXNoQ29tbWFuZC5DbGllbnRJc0luUm9sbGJhY2tDb21tYW5kID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJldnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlY1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGFzdFBhcmtlZEN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9sZFJlY01vZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9sZE1vZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBIYW5kbGVBY3RDYW5jZWwoZXZ0OiBSdW5UaW1lRXZlbnQsIHRhc2s6IFRhc2ssIGZvcm06IE1nRm9ybSwgY3RybDogTWdDb250cm9sLCByZWM6IFJlY29yZCwgaXNNR19BQ1RfQ0FOQ0VMOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBQcmV2ZW50IHJlY3Vyc2l2ZSBtb2RlXHJcbiAgICAvLyBmaXhlZCBidWdzICM6Mjg1NDk4LCAyOTc0NTVcXDQyNzcwM1xcXHJcbiAgICBpZiAodGFzay5JbkhhbmRsZUFjdENhbmNlbClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIHRhc2suSW5IYW5kbGVBY3RDYW5jZWwgPSB0cnVlO1xyXG5cclxuICAgIGxldCBvbGRNb2RlOiBzdHJpbmcgPSB0YXNrLmdldE1vZGUoKTtcclxuICAgIGxldCBzYXZlRGlzcGxheUxpbmUgPSB0YXNrLmdldEZvcm0oKS5EaXNwbGF5TGluZTtcclxuXHJcbiAgICAvLyBXaGVuIGRvIHdlIHNob3cgdGhlICdDb25maXJtIENhbmNlbCB3aW5kb3cnID8gd2hlbiBhbGwgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFwcGx5OlxyXG4gICAgLy8gMS4gVGFzayBtb2RlIGlzIG5vdCBxdWVyeVxyXG4gICAgLy8gMi4gcmVjIGlzIG5vdCBVcGRhdGVkLiBVcGRhdGVkIGlzIHRydWUgd2hlbiB0aGVyZSB3YXMgYW4gVXBkYXRlIG9wZXJhdGlvbiB3aXRoICdmb3JjZSB1cGRhdGUnLiBJZiBpdCBpcyB0cnVlLCB0aGVuIHRoZXJlIGlzIG5vIG1lYW5pbmcgdG8gc2hvdyB0aGVcclxuICAgIC8vICAgIHdpbmRvdyBzaW5jZSB0aGUgdXBkYXRlIHN0YXlzIGFueXdheSAobGlrZSBpbiBvbmxpbmUgd2hlbiB3ZSBnbyB0byBDYW5jZWxXYXNUcmlnZ2VyZWQpLlxyXG4gICAgLy8gMy4gVGhlcmUgbXVzdCBiZSBhIG1vZGlmaWNhdGlvbiwgb3RoZXJ3aXNlIHRoZXJlIGlzIG5vdGhpbmcgdG8gY2FuY2VsLiBTbyBlaXRoZXIgTW9kaWZpZWQgaXMgdHJ1ZSwgbWVhbmluZyBhIGZpZWxkIHdhcyBtb2lkZmllZCAsIG9yXHJcbiAgICAvLyAgICBMYXN0UGFya2VkQ3RybCgpLm1vZGlmaWVkQnlVc2VyKCksIG1lYW5pbmcgdGhhdCB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBjaGFuZ2luZyB0aGUgZmllbGQncyB2YWx1ZSAoVGhlIG1vZGlmaWVkIGlzIGZhbHNlIHVudGlsbCB3ZSBleGl0IHRoZSBmaWVsZCkuXHJcbiAgICAvLyBDcmVhdGUgbW9kZSBhbHNvIGdvZXMgaGVyZSAocmVjIHJlbW92ZWQgYW5kIG1vZGUgY2hhbmdlcyB0byBtb2RpZnkpICwgYnV0IGFsc28gd2lsbCBzaG93IHRoZSBjb25maXJtIGNhbmNlbCBvbmx5IGlmIHNvbWUgY2hhbmdlIHdhcyBkb25lIHRvIHRoZSBuZXcgcmVjb3JkLlxyXG4gICAgaWYgKG9sZE1vZGUgIT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkgJiYgIXJlYy5VcGRhdGVkKSB7XHJcbiAgICAgIGlmIChpc01HX0FDVF9DQU5DRUwpIHtcclxuICAgICAgICBpZiAocmVjLk1vZGlmaWVkIHx8ICh0YXNrLmdldExhc3RQYXJrZWRDdHJsKCkgIT09IG51bGwgJiYgdGFzay5nZXRMYXN0UGFya2VkQ3RybCgpLk1vZGlmaWVkQnlVc2VyKSkge1xyXG4gICAgICAgICAgaWYgKGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTkZJUk1fQ0FOQ0VMLCBmYWxzZSkpIHtcclxuICAgICAgICAgICAgbGV0IGNvbmZpcm1lZCA9IGF3YWl0IEdVSU1hbmFnZXIuSW5zdGFuY2UuY29uZmlybV9ib29sKE1zZ0ludGVyZmFjZS5DT05GSVJNX1NUUl9DQU5DRUwpO1xyXG4gICAgICAgICAgICBpZiAoIWNvbmZpcm1lZCkge1xyXG4gICAgICAgICAgICAgIHRhc2suSW5IYW5kbGVBY3RDYW5jZWwgPSBmYWxzZTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBvbGRSZWNNb2RlOiBEYXRhTW9kaWZpY2F0aW9uVHlwZXMgPSByZWMuZ2V0TW9kZSgpO1xyXG5cclxuICAgICAgLy8gU3BlY2lhbENhbmNlbE9uQ3JlYXRlIGJlaGF2aW9yIGZvciBBbGxvd0VtcHR5RGF0YVZpZXcgPSBZIDogV2hlbiB0aGVyZSBpcyBzaW5nbGUgbmV3bHkgY3JlYXRlZCByZWNvcmRcclxuICAgICAgLy8gZXhpc3QgYW5kIHVzZXIgY2FuY2VscyBpdCBhbmQgdGFzayBoYXMgQWxsb3dFbXB0eURhdGFWaWV3PVlcclxuICAgICAgLy8gdGhlbiBjaGFuZ2UgdGFzayBtb2RlIHRvIE1vZGlmeSBtb2RlIHNvIHRoYXQgc2VydmVyIGFsbG93cyB0aGlzIHRhc2sgdG8gZW50ZXIgYWdhaW4gaW4gRW1wdHlEYXRhVmlldyBtb2RlLlxyXG4gICAgICBpZiAoR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0U3BlY2lhbENhbmNlbE9uQ3JlYXRlKCkgJiYgdGFzay5nZXRNb2RlKCkgPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEVcclxuICAgICAgICAmJiB0YXNrLmdldE9yaWdpbmFsVGFza01vZGUoKSA9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG5cclxuICAgICAgICBsZXQgZW5hYmxlOiBib29sZWFuID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTU9ESUZZLCB0cnVlKTtcclxuXHJcbiAgICAgICAgaWYgKGVuYWJsZSkge1xyXG4gICAgICAgICAgbGV0IGFsbG93RW1wdHlEYXRhVmlldzogYm9vbGVhbiA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0VNUFRZX0RBVEFWSUVXLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICBpZiAoKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRTaXplKCkgPT0gMSAmJiBhbGxvd0VtcHR5RGF0YVZpZXcpIHtcclxuICAgICAgICAgICAgdGFzay5zZXRNb2RlKCdNJyk7XHJcbiAgICAgICAgICAgIHRhc2suRGF0YVZpZXcuc2V0RW1wdHlEYXRhdmlldyh0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChpc01HX0FDVF9DQU5DRUwpIHtcclxuICAgICAgICAvLyBXaGVuIGNhbmNlbGluZywgd2UgaGF2ZSB0byByb2xsYmFjayB0aGUgdHJhbnNhY3Rpb24uXHJcbiAgICAgICAgLy8gVW5sZXNzIHRoZSBldmVudCBkb2VzIG5vdCBhbGxvdyB0byByb2xsYmFjayBpbiBjYW5jZWwuIFRoYXQgY2FuIGhhcHBlbiBpZiB0aGUgY2FuY2VsIHdhcyBpbml0aWF0ZWQgYnkgdGhlIHNlcnZlcidzJ3Mgcm9sbGJhY2suXHJcbiAgICAgICAgaWYgKHRhc2suaXNUcmFuc2FjdGlvbk9uTGV2ZWwoQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCkgJiYgZXZ0LlJvbGxiYWNrSW5DYW5jZWwoKSkge1xyXG4gICAgICAgICAgYXdhaXQgRXZlbnRzTWFuYWdlci5IYW5kbGVSb2xsYmFja0FjdGlvbih0YXNrLCA8Q29tbWFuZHNUYWJsZT50YXNrLmdldE1HRGF0YSgpLkNtZHNUb1NlcnZlciwgUm9sbGJhY2tFdmVudENvbW1hbmRfUm9sbGJhY2tUeXBlLkNBTkNFTCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBhd2FpdCBFdmVudHNNYW5hZ2VyLkhhbmRsZUNhbmNlbEVkaXQoZXZ0LCB0YXNrLCBmb3JtLCByZWMsIG9sZFJlY01vZGUpO1xyXG4gICAgfVxyXG4gICAgLy8gUWNyICM3NDc4NzAgY2FuY2VsIHNob3VsZCBwZXJmb3JtIHRoZSByZWNvcmQgcHJlZml4IGlmIG5vdCBxdWl0aW5nXHJcbiAgICBlbHNlIHtcclxuICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuXHJcbiAgICAgIC8vIHdlIHJvbGxiYWNrIGEgcGFyZW50IHRhc2sgd2hpbGUgZm9jdXNlZCBvbiBzdWJmb3JtL3Rhc2suIFdlIGRvIG5vdCB3YW50IHRoZSBjdHJsIG9uIHRoZSBzdWJmb3JtIHRvIGRvIGN0cmwgc3VmZml4LlxyXG4gICAgICBsZXQgbGFzdEZvY3VzZWRDb250cm9sOiBNZ0NvbnRyb2wgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCk7XHJcbiAgICAgIGlmIChsYXN0Rm9jdXNlZENvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgICBsYXN0Rm9jdXNlZENvbnRyb2wuZ2V0Rm9ybSgpLmdldFRhc2soKS5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWV2dC5pc1F1aXQoKSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZVBhcmthYmlsaXR5T25Sb3dDaGFuZ2UodGFzayk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBRQ1IjIDk0MTI3NzogSWYgQ2FuY2VsIGV2ZW50IGlzIGNhbGxlZCBmcm9tIFF1aXQgZXZlbnQsIHRoZW4gZG9uJ3QgZXhlY3V0ZSBFeGl0IGV2ZW50XHJcbiAgICAvLyBpZiB1c2VyIGhhcyBwcmVzc2VkICdObycgb24gQ29uZmlybSBjYW5jZWwgYm94LlxyXG4gICAgaWYgKGV2dC5pc1F1aXQoKSlcclxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UoY3RybCwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG5cclxuICAgIC8vIHJlc2V0IGlzUm93RWRpdGluZ1xyXG4gICAgYXdhaXQgZm9ybS5zdG9wUm93RWRpdGluZyhzYXZlRGlzcGxheUxpbmUpO1xyXG5cclxuICAgIHRhc2suSW5IYW5kbGVBY3RDYW5jZWwgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2FuY2VsIHRoZSBlZGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJldnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlY1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib2xkUmVjTW9kZVwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgSGFuZGxlQ2FuY2VsRWRpdChldnQ6IFJ1blRpbWVFdmVudCwgdGFzazogVGFzaywgZm9ybTogTWdGb3JtLCByZWM6IFJlY29yZCwgb2xkUmVjTW9kZTogRGF0YU1vZGlmaWNhdGlvblR5cGVzKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBpZiB0aGUgc3luY2VkIHJlY29yZCAoaS5lLiB0aGUgcmVjb3JkIGZyb20gdGhlIHBhcmVudCB0YXNrIG9mIHRoZSBzdWJmb3JtKSBiZWZvcmUgUm9sbGJhY2sgd2FzIGluICdJbnNlcnQnIG1vZGUsXHJcbiAgICAvLyBzbyBpdCBtdXN0IGJlIGluICdJbnNlcnQnIG1vcmUgYWZ0ZXIgcmV0dXJuIGZyb20gdGhlIHNlcnZlclxyXG4gICAgaWYgKHJlYy5TeW5jZWQgJiYgb2xkUmVjTW9kZSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydClcclxuICAgICAgcmVjLnNldE1vZGUob2xkUmVjTW9kZSk7XHJcblxyXG4gICAgaWYgKGZvcm0gIT09IG51bGwpIHtcclxuICAgICAgLy8gcmVzZXQgdGhlIGxhc3QgcGFya2VkIGNvbnRyb2xcclxuICAgICAgaWYgKHRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSAhPT0gbnVsbClcclxuICAgICAgICB0YXNrLmdldExhc3RQYXJrZWRDdHJsKCkucmVzZXRQcmV2VmFsKCk7XHJcblxyXG4gICAgICBhd2FpdCBmb3JtLmNhbmNlbEVkaXQodHJ1ZSwgZXZ0LmlzUXVpdCgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV2dFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZHZcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlY1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibm9uSW50ZXJhY3RpdmVEZWxldGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBIYW5kbGVBY3Rpb25EZWxsaW5lKHRhc2s6IFRhc2ssIGR2OiBEYXRhVmlldywgcmVjOiBSZWNvcmQsIG5vbkludGVyYWN0aXZlRGVsZXRlOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgbGFzdFBhcmtlZEN0cmw6IE1nQ29udHJvbDtcclxuICAgIGxldCBteWZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcbiAgICBsZXQgc2F2ZUlzUm93RWRpdGluZyA9IG15Zm9ybS5nZXRJc1Jvd0VkaXRpbmdGcm9tR3VpKG15Zm9ybS5EaXNwbGF5TGluZSk7IC8vQ29tbWFuZHMuZ2V0SXNSb3RoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGxhc3RQYXJrZWRDdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVgpO3dFZGl0aW5nKCB0YXNrLmdldEZvcm0oKS5nZXRNYWluQ29udHJvbCgpLCB0YXNrLmdldEZvcm0oKS5EaXNwbGF5TGluZSk7ICAgIGxldCBvbGRSZWNNb2RlOiBEYXRhTW9kaWZpY2F0aW9uVHlwZXM7XHJcbiAgICBsZXQgb2xkUmVjTW9kZTogRGF0YU1vZGlmaWNhdGlvblR5cGVzO1xyXG4gICAgaWYgKGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0RFTEVURSwgdHJ1ZSkpIHtcclxuICAgICAgbGFzdFBhcmtlZEN0cmwgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsICE9PSBudWxsKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2xCYXNlKGxhc3RQYXJrZWRDdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgpO1xyXG4gICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgIG9sZFJlY01vZGUgPSByZWMuZ2V0TW9kZSgpO1xyXG5cclxuICAgICAgICAvLyBGb3JjZSB0aGUgY2hhbmdlIHRvIGRlbGV0ZSBtb2RlXHJcbiAgICAgICAgcmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgIHJlYy5zZXRNb2RlKERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUpO1xyXG5cclxuICAgICAgICBpZiAob2xkUmVjTW9kZSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydClcclxuICAgICAgICAgIHJlYy5zZXRTZW5kVG9TZXJ2ZXIoZmFsc2UpO1xyXG5cclxuICAgICAgICAvLyBleGVjdXRlIHRhc2sgc3VmZml4IGluIE1vZGlmeSBtb2RlIG9yIHdoZW4gdGhlcmUgaXMgJ2ZvcmNlIHJlY29yZCBzdWZmaXgnLlxyXG4gICAgICAgIGlmIChyZWMuTW9kaWZpZWQgfHwgYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBmYWxzZSkpIHtcclxuICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgcmVjb3JkIHN1ZmZpeCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XHJcbiAgICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICBpZiAoIXJlYy5TZW5kVG9TZXJ2ZXIpIHtcclxuICAgICAgICAgICAgICBhd2FpdCBkdi5hZGRDdXJyVG9Nb2RpZmllZCgpO1xyXG4gICAgICAgICAgICAgIHJlYy5zZXRTZW5kVG9TZXJ2ZXIodHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICAgICAgcmVjLnNldE1vZGUob2xkUmVjTW9kZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGV4ZWN1dGUgcmVjb3JkIHN1ZmZpeCBpbiBEZWxldGUgbW9kZVxyXG4gICAgICAgIC8vIHNldCB0aGUgSW5EZWxldGVQcm9jZXNzIGZsYWcgLCBzbyB3ZSB3aWxsIG5vdCB0cnkgdG8gc2VuZCB1cGRhdGVzIG9uIHRoZSByZWNvcmQgYWZ0ZXJcclxuICAgICAgICAvLyB3ZSBkZWxldGUgaXQgaW4gdGhlIGNvbW1vbkhhbmRsZXJBZnRlciAocmVjIHN1ZmZpeCkuXHJcbiAgICAgICAgcmVjLnNldEluRGVsZXRlUHJvY2Vzcyh0cnVlKTtcclxuXHJcbiAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFKTtcclxuICAgICAgICAvLyBubyBjb25maXJtIG1lc3NhZ2UgZGlhbG9nIGlmIGluIG5vbiBpbnRlcmFjdGl2ZSBkZWxldGUuXHJcbiAgICAgICAgbGV0IHNraXBDb25maXJtRGlhbG9nOiBib29sZWFuID0gbm9uSW50ZXJhY3RpdmVEZWxldGU7XHJcblxyXG4gICAgICAgIGlmICghc2tpcENvbmZpcm1EaWFsb2cpIHtcclxuICAgICAgICAgIGlmICh0YXNrLm11c3RDb25maXJtSW5EZWxldGVNb2RlKCkgfHwgYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09ORklSTV9VUERBVEUsIGZhbHNlKSkge1xyXG4gICAgICAgICAgICBsZXQgY29uZmlybWVkOiBib29sZWFuID0gYXdhaXQgR1VJTWFuYWdlci5JbnN0YW5jZS5jb25maXJtX2Jvb2woTXNnSW50ZXJmYWNlLkNPTkZJUk1fU1RSX0RFTEVURSk7XHJcbiAgICAgICAgICAgIGlmICghY29uZmlybWVkKSB7XHJcbiAgICAgICAgICAgICAgcmVjLmNsZWFyTW9kZSgpO1xyXG4gICAgICAgICAgICAgIHJlYy5zZXRNb2RlKG9sZFJlY01vZGUpO1xyXG4gICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgICAgICAgICAgaWYgKGxhc3RQYXJrZWRDdHJsICE9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aE1nQ29udHJvbEJhc2UobGFzdFBhcmtlZEN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCk7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChzYXZlSXNSb3dFZGl0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbXlmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgbXlmb3JtLnN0YXJ0Um93RWRpdGluZyhteWZvcm0uRGlzcGxheUxpbmUpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICByZWMuc2V0SW5EZWxldGVQcm9jZXNzKGZhbHNlKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3N0b3BFeGVjdXRpb24pIHtcclxuICAgICAgICAgIGlmICghcmVjLlNlbmRUb1NlcnZlcikge1xyXG4gICAgICAgICAgICBhd2FpdCBkdi5hZGRDdXJyVG9Nb2RpZmllZCgpO1xyXG4gICAgICAgICAgICByZWMuc2V0U2VuZFRvU2VydmVyKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICAgIHJlYy5zZXRNb2RlKG9sZFJlY01vZGUpO1xyXG4gICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB3ZSdyZSBkZWxldGluZyBhbiBpbnNlcnRlZCByZWNvcmQsIHRoZSBzZXJ2ZXIgaXMgbm90IGF3YXJlIG9mIGl0XHJcbiAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdXBvbiBkZWxldGUsIGl0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBtb2RpZmllZCByZWMgbGlzdFxyXG4gICAgICAgIGlmIChvbGRSZWNNb2RlID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KSB7XHJcbiAgICAgICAgICByZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgICByZWMuc2V0TW9kZShvbGRSZWNNb2RlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBuZXdDdXJyUmVjOiBSZWNvcmQgPSBkdi5nZXRDdXJyUmVjKCk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAvLyBRQ1IgIzQzODE3NTogd2hlbiB0aGUgdXNlciBkZWxldGVzIGEgcmVjb3JkLCB3aGljaCBpcyB0aGUgc2luZ2xlXHJcbiAgICAgICAgICAvLyByZWNvcmQgaW4gdGhlIGR2LCB0aGVuIHdoZW4gaXRzIHJlY29yZCBzdWZmaXggaXMgZXhlY3V0ZWQgYW5kIHRoZVxyXG4gICAgICAgICAgLy8gc2VydmVyIHNlbmRzIGEgbmV3IHJlY29yZCB0byB0aGUgY2xpZW50IGFuZCBzZXQgaXQgdG8gYmUgdGhlXHJcbiAgICAgICAgICAvLyBjdXJyZW50IHJlY29yZC5cclxuICAgICAgICAgIC8vIFRoaXMgZml4IG1ha2VzIHRoZSBkZWxldGVkIHJlY29yZCB0byBiZSB0aGUgY3VycmVudCBmb3IgYVxyXG4gICAgICAgICAgLy8gbW9tZW50IGp1c3QgdG8gZGVsZXRlIGl0IGZyb20gdGhlIGNsaWVudHMgY2FjaGUuIFRoZW4sIGl0IG1ha2VzXHJcbiAgICAgICAgICAvLyB0aGUgbmV3IHJlY29yZCB0byBiZSB0aGUgY3VycmVudCBhZ2FpbiBhbmQgZW50ZXJzIGludG8gY3JlYXRlIG1vZGUuXHJcbiAgICAgICAgICAvLyBJIHRoaW5rIHRoYXQgYSBiZXR0ZXIgc29sdXRpb24gaXMgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIGNsaWVudCBpc1xyXG4gICAgICAgICAgLy8gcmVzcG9uc2libGUgZm9yIGFkZGluZyBhIG5ldyByZWNvcmQgb3IgdGhlIHNlcnZlciwgYW5kIG1ha2Ugc3VyZVxyXG4gICAgICAgICAgLy8gdGhhdCBpdCBpcyBkb25lIHN5c3RlbXdpZGUuXHJcbiAgICAgICAgICAvLyBFaHVkIC0gMTAvMDkvMjAwMVxyXG4gICAgICAgICAgaWYgKHJlYyAhPT0gbmV3Q3VyclJlYylcclxuICAgICAgICAgICAgYXdhaXQgZHYuc2V0Q3VyclJlYyhyZWMuZ2V0SWQoKSwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgIC8vIG5vIG5lZWQgdG8gZGVsIHRoZSBjdXJyIHJlYyBhbmQgcG9zaXRpb24gb24gdGhlIG5leCByZWMgaWYgdGhlIHRhc2sgaXMgYWJvcnRpbmcuXHJcbiAgICAgICAgICAvLyBUaGUgZGVsQ3VyclJlYyBtYXkgY2F1c2UgYSBjcmFzaCBpZiBpdCB0cmllcyB0byBnZXQgdGhlIG5leHQgcmVjIGZyb20gdGhlIG5leHQgY2h1bmsuXHJcbiAgICAgICAgICBpZiAoIXRhc2suaXNBYm9ydGluZygpKVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRlbEN1cnJSZWModGFzaywgZmFsc2UpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAvLyBRQ1IgIzQzODE3NSAtIGZpeCBjb250aW51ZVxyXG4gICAgICAgICAgaWYgKHJlYyAhPT0gbmV3Q3VyclJlYykge1xyXG4gICAgICAgICAgICBhd2FpdCBkdi5zZXRDdXJyUmVjKG5ld0N1cnJSZWMuZ2V0SWQoKSwgZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAoZHYuZ2V0U2l6ZSgpID09PSAxKVxyXG4gICAgICAgICAgICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBJbiBpbnRlcmFjdGl2ZSwgdGhlIG1vZGUgbWlnaHQgY2hhbmdlIHRvIG1vZGlmeSBvciBjcmVhdGUuIEhvd2V2ZXIsIGZvciBub24gaW50ZXJhY3RpdmUgKGRlbGV0ZSBtb2RlKVxyXG4gICAgICAgICAgLy8gdGhlIG1vZGUgc2hvdWxkIGJlIHNldCBiYWNrIHRvIGRlbGV0ZSBhbmQgd2lsbCBiZSB1c2VkIGluIHRoZSBuZXh0IHJlY29yZCBjeWNsZS5cclxuICAgICAgICAgIGlmIChub25JbnRlcmFjdGl2ZURlbGV0ZSlcclxuICAgICAgICAgICAgdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBoYW5kbGUgdmlldyByZWZyZXNoLCBzY3JlZW4gcmVmcmVzaCBhbmQgcmVjb3JkIGZsdXNoIGV2ZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldnRcIj50aGUgZXZlbnQgdG8gaGFuZGxlIHdpdGggYWxsIGl0cyBwcm9wZXJ0aWVzPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVJlZnJlc2hFdmVudHMoZXZ0OiBSdW5UaW1lRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+ZXZ0LmdldFRhc2soKTtcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50YXNrLkRhdGFWaWV3O1xyXG4gICAgbGV0IGludEV2dENvZGU6IG51bWJlciA9IGV2dC5nZXRJbnRlcm5hbENvZGUoKTtcclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gbnVsbDtcclxuXHJcbiAgICBpZiAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfUkVDT1JEKVxyXG4gICAgICB0aGlzLl9pc0luUmVjb3JkRmx1c2hFdmVudCA9IHRydWU7XHJcbiAgICAvLyBjaGVjayBpZiB3ZSB0cnkgdG8gdmlldyByZWZyZXNoIHdpdGggYWxsb3dfbW9kaWZ5PW4gaW4gY3JlYXRlIG1vZGVcclxuICAgIGlmIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXICYmIHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJiAhYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTU9ESUZZLCB0cnVlKSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhd2FpdCB0YXNrLkV4ZWN1dGVOZXN0ZWRSUyhMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkpO1xyXG4gICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiAhdGFzay5JbkVuZFRhc2sgJiYgIXRhc2suaXNBYm9ydGluZygpKSB7XHJcbiAgICAgICAgaWYgKGludEV2dENvZGUgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1NDUkVFTikge1xyXG4gICAgICAgICAgbGV0IGN1cnJlbnRSb3c6IG51bWJlciA9IDA7XHJcbiAgICAgICAgICBpZiAoIWV2dC5nZXRSZWZyZXNoVHlwZSgpKSB7XHJcbiAgICAgICAgICAgIGlmIChldnQuUnRWaWV3UmVmcmVzaFVzZUN1cnJlbnRSb3coKSAmJiB0YXNrLklzSW50ZXJhY3RpdmUpIHtcclxuICAgICAgICAgICAgICBjdXJyZW50Um93ID0gZm9ybS5nZXRDdXJyUmVjUG9zSW5Gb3JtKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY21kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlSW50ZXJuYWxSZWZyZXNoQ29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgaW50RXZ0Q29kZSwgZHYuQ3VycmVudFJlY0lkLCBjdXJyZW50Um93KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0YXNrLklzSW50ZXJhY3RpdmUpXHJcbiAgICAgICAgICAgICAgY3VycmVudFJvdyA9IGZvcm0uZ2V0Q3VyclJlY1Bvc0luRm9ybSgpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHJlZmV0Y2hSZWNvcmQ6IGJvb2xlYW4gPSB0cnVlOyAvL1JlZmV0Y2ggcmVjb3JkIGZyb20gc2VydmVyLlxyXG4gICAgICAgICAgICBpZiAoaW50RXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfUkVDT1JEICYmIGV2dC5nZXRBcmdMaXN0KCkgIT09IG51bGwgJiYgZXZ0LmdldEFyZ0xpc3QoKS5nZXRTaXplKCkgIT09IDApIHtcclxuICAgICAgICAgICAgICBsZXQgcmVmZXRjaFJlY1N0cjogc3RyaW5nO1xyXG4gICAgICAgICAgICAgIHJlZmV0Y2hSZWNTdHIgPSBhd2FpdCBldnQuZ2V0QXJnTGlzdCgpLmdldEFyZ1ZhbHVlKDAsIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTiwgMCk7XHJcbiAgICAgICAgICAgICAgcmVmZXRjaFJlY29yZCA9IChpc051bGxPclVuZGVmaW5lZChyZWZldGNoUmVjU3RyKSB8fCByZWZldGNoUmVjU3RyID09PSAnMScpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocmVmZXRjaFJlY29yZClcclxuICAgICAgICAgICAgICBjbWQgPSBhd2FpdCBDb21tYW5kRmFjdG9yeS5DcmVhdGVSZWFsUmVmcmVzaENvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIGludEV2dENvZGUsIGN1cnJlbnRSb3csIGV2dC5nZXRBcmdMaXN0KCksIGR2LkN1cnJlbnRSZWNJZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHNjcmVlbiByZWZyZXNoIGV2ZW50XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsZXQgaWQ6IG51bWJlcjtcclxuXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRGb3JtKCkgPT09IG51bGwpXHJcbiAgICAgICAgICAgIGlkID0gMDtcclxuICAgICAgICAgIGVsc2UgaWYgKHRhc2suZ2V0Rm9ybSgpLmlzU2NyZWVuTW9kZSgpKVxyXG4gICAgICAgICAgICBpZCA9ICgoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKSkuZ2V0SWQoKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgaWQgPSAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldFJlY0J5SWR4KCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuZ2V0VG9wUmVjSWR4KCkpLmdldElkKCk7XHJcblxyXG4gICAgICAgICAgY21kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlU2NyZWVuUmVmcmVzaENvbW1hbmQodGFzay5nZXRUYXNrVGFnKCksIGlkLCBkdi5DdXJyZW50UmVjSWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcmVhbCB2aWV3IHJlZnJlc2ggY2F1c2VzIHRoZSBjYWNoZSBvZiB0aGUgY3VycmVudCBzdWIgZm9ybSB0YXNrIHRvIGJlIGNsZWFyZWRcclxuICAgICAgICBpZiAoaW50RXZ0Q29kZSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfU0NSRUVOKVxyXG4gICAgICAgIC8vIHNjcmVlbiByZWZyZXNoIGRvZXMgbm90IGNsZWFyIHRoZSBjYWNoZVxyXG4gICAgICAgICAgdGFzay5nZXRUYXNrQ2FjaGUoKS5jbGVhckNhY2hlKCk7XHJcblxyXG4gICAgICAgIGlmIChjbWQgIT09IG51bGwpXHJcbiAgICAgICAgICBhd2FpdCB0YXNrLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2lzSW5SZWNvcmRGbHVzaEV2ZW50ID0gZmFsc2U7XHJcbiAgICAgICAgLy8gUUNSICMyODkyMjIuIERvIG5vdCBjb250aW51ZSB3aXRoIFJlZnJlc2ggaWYgdGhlIHRhc2sgbXVzdCBiZSBlbmRlZC5cclxuICAgICAgICBpZiAoIXRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiAhdGFzay5JbkVuZFRhc2sgJiYgIXRhc2suaXNBYm9ydGluZygpKSB7XHJcbiAgICAgICAgICAvLyBBZnRlciB2aWV3IHJlZnJlc2gsIHRoZSBzZXJ2ZXIgYWx3YXlzIHJldHVybnMgY3VyciByZWMgYXMgZmlyc3QgcmVjLlxyXG4gICAgICAgICAgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcgJiYgIWZvcm0uaXNTY3JlZW5Nb2RlKCkpIHtcclxuICAgICAgICAgICAgZHYuc2V0VG9wUmVjSWR4KDApO1xyXG4gICAgICAgICAgICBpZiAoZm9ybS5IYXNUYWJsZSgpKSB7XHJcbiAgICAgICAgICAgICAgZm9ybS5jbGVhclRhYmxlQ29sdW1uU29ydE1hcmsodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgZm9ybS5yZXN0b3JlT2xkRGlzcGxheUxpbmUoZm9ybS5yZWNvcmRJZHgyRGlzcGxheUxpbmUoZHYuZ2V0Q3VyclJlY0lkeCgpKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBBZnRlciByZWNvcmQgaGFzIGJlZW4gZmx1c2hlZCBpdCBpcyBub3QgY29uc2lkZXJlZCBhIG5ldyByZWNvcmQgYW55bW9yZS5cclxuICAgICAgICAgIGlmIChpbnRFdnRDb2RlID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9SRUNPUkQgJiYgdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfUVVFUlkgJiYgIXRhc2suZ2V0QWZ0ZXJSZXRyeSgpKSB7XHJcbiAgICAgICAgICAgIGlmICh0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHtcclxuICAgICAgICAgICAgICB0YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpO1xyXG4gICAgICAgICAgICAgICgoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKSkuc2V0T2xkUmVjKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgZHYuY3VyclJlY0NvbXB1dGUodHJ1ZSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGludEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1NDUkVFTiAmJiB0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSAmJiAhdGFzay5nZXRBZnRlclJldHJ5KCkpIHtcclxuICAgICAgICAgICAgYXdhaXQgZHYuY3VyclJlY0NvbXB1dGUodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gUUNSICM0MzAwNTkuIElmIHRoZSBmb2N1c2VkIHRhc2sgYW5kIHRoZSByZWZyZXNoZWQgdGFzayBpcyB0aGUgc2FtZSB0YXNrIG9yXHJcbiAgICAgICAgICAvLyB0aGUgZm9jdXNlZCB0YXNrIGlzIGEgY2hpbGQgb2YgdGhlIHJlZnJlc2hlZCB0YXNrLCBnbyB0byB0aGUgZmlyc3QgY29udHJvbCBpbiB0aGUgZmlyc3QgbGluZS5cclxuICAgICAgICAgIC8vIElmIHRoZSBmb2N1c2VkIHRhc2sgaXMgdGhlIHBhcmVudCB0YXNrLCBkbyBub3QgbGVhdmUgdGhlIGN1cnJlbnQgY29udHJvbC5cclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpICYmICF0YXNrLmdldFByZXZlbnRDb250cm9sQ2hhbmdlKCkpIHtcclxuICAgICAgICAgICAgaWYgKCEodGFzayA9PT0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpIHx8ICF0YXNrLnBhdGhDb250YWlucyhMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkpKSlcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR28gdG8gY3JlYXRlIG1vZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjbWRzXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGdvdG9DcmVhdGVNb2RlKHRhc2s6IFRhc2spOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kO1xyXG4gICAgYXdhaXQgdGFzay5lbmFibGVNb2RlcygpO1xyXG4gICAgLy8gUUNSICM0MTc3MzMuIEV4ZWN1dGUgUlMncyBvZiB0aGUgbmVzdGVkIHN1YmZvcm1zIGlmIHRoZSBjdXJyZW50IHRhc2sgaXMgb25lIG9mIHRoZSBuZXN0ZWQgc3ViZm9ybXMuXHJcbiAgICBhd2FpdCB0YXNrLkV4ZWN1dGVOZXN0ZWRSUyhMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkpO1xyXG4gICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZUV2ZW50Q29tbWFuZCh0YXNrLmdldFRhc2tUYWcoKSwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUT19DUkVBVEUpO1xyXG4gICAgICBhd2FpdCB0YXNrLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcbiAgICAgIGlmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHModGFzayk7XHJcbiAgICAgIGF3YWl0IHRhc2suc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcbiAgICAgIHRhc2suc2V0T3JpZ2luYWxUYXNrTW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLkhhbmRsZUFjdEVudGVyUm93RWRpdGluZyh0YXNrKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkbyBzb21lIGRlZmF1bHQgb3BlcmF0aW9ucyBmb3IgYW4gZXZlbnQgYWZ0ZXIgYWxsIHRoZSBoYW5kbGVycyBmaW5pc2hlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyY0JlZm9yZVwiPnRoZSBSQyByZXR1cm5lZCBmcm9tIHRoZSBjb21tb25IYW5kbGVyQmVmb3JlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BvZ2F0ZVwiPmlmIGV2ZW50IHdhcyBwcm9wb2dhdGVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIkV2ZW50XCI+dGhlIGV2ZW50IHRvIGhhbmRsZTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21tb25IYW5kbGVyQWZ0ZXIoZXZ0OiBSdW5UaW1lRXZlbnQsIHJjQmVmb3JlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPmV2dC5nZXRUYXNrKCk7XHJcbiAgICBsZXQgZHY6IERhdGFWaWV3O1xyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gbnVsbDtcclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2w7XHJcbiAgICBsZXQgcmVjTW9kaWZpZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCByZWNNb2RlSXNEZWxldGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBmb3JjZVN1ZmZpeDogYm9vbGVhbjtcclxuXHJcbiAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbiAmJiBldnQuZ2V0SW50ZXJuYWxDb2RlKCkgIT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYICYmIGV2dC5nZXRJbnRlcm5hbENvZGUoKSAhPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKGV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuICAgICAgZHYgPSA8RGF0YVZpZXc+dGFzay5EYXRhVmlldztcclxuICAgICAgcmVjID0gZHYuZ2V0Q3VyclJlYygpO1xyXG4gICAgICBjdHJsID0gPE1nQ29udHJvbD5ldnQuQ29udHJvbDtcclxuXHJcbiAgICAgIHN3aXRjaCAoZXZ0LmdldEludGVybmFsQ29kZSgpKSB7XHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWDpcclxuICAgICAgICAgIGlmIChyY0JlZm9yZSkge1xyXG4gICAgICAgICAgICAvLyBoYW5kbGUgcmVjb3JkIHByZWZpeCBmb3IgdGhlIHN1YiB0YXNrcyB0b29cclxuICAgICAgICAgICAgaWYgKGF3YWl0IHRhc2suQ2hlY2tSZWZyZXNoU3ViVGFza3MoKSlcclxuICAgICAgICAgICAgICBhd2FpdCB0YXNrLmRvU3ViZm9ybVJlY1ByZWZpeFN1ZmZpeCgpO1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrLmhhbmRsZUV2ZW50T25TbGF2ZVRhc2tzKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgICAgYXdhaXQgdGFzay5lbmFibGVNb2RlcygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVg6XHJcbiAgICAgICAgICB0YXNrLmlzRmlyc3RSZWNvcmRDeWNsZShmYWxzZSk7XHJcbiAgICAgICAgICAvLyBPbmNlIGFyZSByZWFkeSB0byBlbmQgdGhlIFJTLCBpdCBtZWFucyB3ZSBjYW5ub3QgYmUgdGhlIEZJUlNUIHJlY29yZCBjeWNsZVxyXG4gICAgICAgICAgaWYgKHRhc2suZ2V0UHJldmVudFJlY29yZFN1ZmZpeCgpKSB7XHJcbiAgICAgICAgICAgIHRhc2suc2V0UHJldmVudFJlY29yZFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBRQ1IgIzExNTk1MS4gRXZlbiBpZiByZWNvcmQgc3VmZml4IGlzIG5vdCBleGVjdXRlZCwgaW4gdGhlIG5leHQgdGltZSBkbyBub3QgZXhlY3V0ZSBSUCAmIFJTIG9mIHRoZSBzdWJmb3JtLlxyXG4gICAgICAgICAgdGFzay5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAvLyBRQ1IgIzk4NDAzMTogaWYgdGhlIGRlbGV0ZSBvcGVyYXRpb24gZmFpbGVkIGR1ZSB0byBcInZlcmlmeSBlcnJvclwiXHJcbiAgICAgICAgICAgIC8vIGluIHRoZSByZWNvcmQgc3VmZml4IHRoZW4gdGhlIHJlY29yZCBtb2RlIG11c3QgYmUgY2xlYXJlZFxyXG4gICAgICAgICAgICBpZiAocmVjLmdldE1vZGUoKSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSlcclxuICAgICAgICAgICAgICByZWMuY2xlYXJNb2RlKCk7XHJcbiAgICAgICAgICAgIC8vIFFjciA3ODMwMzkgOiBJZiB3ZSBhcmUgYWxyZWFkeSBpbiBjb250cm9sIGxldmVsIGl0IG1lYW5zIHRoYXQgY29udHJvbCBwcmVmaXggd2FzIGFscmVhZHkgZG9uZSBvciB0aGF0XHJcbiAgICAgICAgICAgIC8vIGNvbnRyb2wgc3VmZml4IHdhcyBub3QgZG9uZS4gRWl0aGVyIHdheSB0aGVyZSBpcyBubyBuZWVkIHRvIGRvIGNvbnRyb2wgcHJlZml4IGFnYWluLlxyXG4gICAgICAgICAgICBpZiAodGFzay5nZXRMZXZlbCgpICE9PSBDb25zdGFudHMuVEFTS19MRVZFTF9DT05UUk9MKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGxhc3QgPSA8TWdDb250cm9sPnRoaXMuZ2V0U3RvcEV4ZWN1dGlvbkN0cmwoKTtcclxuICAgICAgICAgICAgICBpZiAobGFzdCA9PT0gbnVsbClcclxuICAgICAgICAgICAgICAgIGxhc3QgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuICAgICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25DdHJsKG51bGwpO1xyXG5cclxuICAgICAgICAgICAgICAvLyBRQ1IgNDI2MjgzIGlzIHdlIGhhdmUgYSBzdWItZm9ybSB0aGF0IHdhcyBuZXZlciBiZWVuIGVudGVyZWRcclxuICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgY29udHJvbCBsZXZlbCB3aWxsIG5vdCBiZSBlbnRlcmVkXHJcbiAgICAgICAgICAgICAgaWYgKGxhc3QgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gd2UgZG9ub3Qgd2FudCBDUyB0byBiZSBjYWxsZWQgYWdhaW4gZnJvbSBDUCBpbmNhc2Ugb2YgdmVyaWZ5IGVyciBpbiBDVlxyXG4gICAgICAgICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBpbkN0cmxQcmVmaXg6IGJvb2xlYW4gPSB0YXNrLkluQ3RybFByZWZpeDtcclxuICAgICAgICAgICAgICAgIHRhc2suSW5DdHJsUHJlZml4ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShsYXN0LCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVgpO1xyXG4gICAgICAgICAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBpbkN0cmxQcmVmaXg7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAvLyBpbiB0aGUgZnV0dXJlIGNoZWNrIHRoZSBzdG9wRXhlY3V0aW9uIGZsYWcgaGVyZSB0b28gYW5kIGRpc3BsYXkgYVxyXG4gICAgICAgICAgICAgIC8vIGNvbmZpcm0gY2FuY2VsIGRpYWxvZyB0aGF0IHdpbGwgY2xvc2UgdGhlIGJyb3dzZXIgaWYgdGhlIHZhbHVlIGlzIHRydWVcclxuICAgICAgICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gRGVmZWN0IDE1Mjg3MTogV2l0aCBuZXcgd2F5IG9mIGVkaXRpbmcgcm93LCBSUyBpcyBub3QgZmlyZWQgaW5maW5pdGVseSwgYnV0IHJvdyBzZWxlY3Rpb24gaXMgc2hpZnRlZCB0byBuZXcgcm93LiBBbHNvIHJvdyBsZWF2ZXMgZWRpdGluZyBtb2RlLlxyXG4gICAgICAgICAgICAvLyBTbyBlbnN1cmUgcm93IGVkaXRpbmcgaXMgbGVmdCB3aGVuIHRoZXJlIGlzIG5vIHZlcmlmeSBlcnJvciBhbmQgbm90IHVuY29uZGl0aW9uYWxseS5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVTdG9wUm93RWRpdGluZyh0YXNrKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAocmVjICE9IG51bGwpIHtcclxuICAgICAgICAgICAgcmVjTW9kaWZpZWQgPSByZWMuTW9kaWZpZWQ7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fc3RvcEV4ZWN1dGlvbiAmJiByZWMuaXNDYXVzZUludmFsaWRhdGlvbigpKSB7XHJcbiAgICAgICAgICAgICAgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLmludmFsaWRhdGVUYWJsZSgpO1xyXG4gICAgICAgICAgICAgIHJlYy5zZXRDYXVzZUludmFsaWRhdGlvbihmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVjTW9kZUlzRGVsZXRlID0gKHJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUpO1xyXG5cclxuICAgICAgICAgICAgZm9yY2VTdWZmaXggPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gaWYgdGhlIHJlY29yZCBpcyBkZWxldGVkIHRoZW4gZXhlY3V0ZSB0aGUgXCJyZWMgc3VmZml4IGFmdGVyXCIgb25seVxyXG4gICAgICAgICAgICAvLyB3aGVuIHRoZSB0YXNrIG1vZGUgaXMgZGVsZXRlIChzZWNvbmQgcm91bmQpXHJcbiAgICAgICAgICAgIC8vIGluRGVsZXRlUHJvY2VzcyA6IGlmIHRoZXJlIGlzIGFuICdFTkQgVEFTSyBDT05EJyB3ZSB3aWxsIGhhdmUgYSAzcmQgY3ljbGUgaW4gcmVjb3JkIHN1ZmZpeCh3aGVuIHVwZCtkZWwgb3IgZm9yY2Ugc3VmZiArIGRlbCkuXHJcbiAgICAgICAgICAgIC8vIDFzdCBjeWNsZSA6IHVwZGFlIGN5Y2xlICh0YXNrIG1vZGUgd2lsbCBiZSB1cGRhdGUpLCAybmQgOiB0YXNrIG1vZGUgaXMgZGVsZXRlICwgdGhpcyBpcyB3aGVuIHdlIHNlbmQgdGhlIGRlbGV0ZSB0byB0aGUgc2VydmVyLlxyXG4gICAgICAgICAgICAvLyAzcmQgLSBzdWZmaXggdGhhdCBpcyBjYWxsZWQgZnJvbSB0aGUgZW5kVGFzay4gSW4gdGhlIDNyZCBjeWNsZSB0aGUgcmVjTW9kZUlzRGVsZXRlIHdpbGwgYmUgZmFsc2UgYWx0aG91Z2ggd2UgYXJlIHN0aWxsIGluIHRoZSBkZWxldGUgcHJvY2VzcyAod2UgYWxyZWFkeSBzZW50IHRoZSBkZWxldGUgb3BlcikuXHJcbiAgICAgICAgICAgIC8vIEEgY29tYmluYXRpb24gb2YgZm9yY2Ugc3VmZml4ICsgZW5kIHRhc2sgY29uZCArIGRlbCBsaW5lICwgd2lsbCBjcmFzaCB0aGUgc2VydmVyIG9uIHRoZSAzcmQgY3ljbGUgc2luY2Ugd2Ugd2lsbCBhc2sgZm9yIHVwZGF0ZSBvZmZcclxuICAgICAgICAgICAgLy8gYSByZWNvcmQgdGhhdCB0aGUgc2VydmVyIGhhZCBkZWxldGVkIG9uIHRoZSAybmQgY3ljbGUuIFRoYXQgaXQgd2h5IHdlIHVzZSAnaW5EZWxldGVQcm9jZXNzJywgc28gd2lsbCB3aWxsIGtub3cgbm90XHJcbiAgICAgICAgICAgIC8vIHRvIGFkZCB1cGRhdGUgb3BlciBvbiBhbiBhbHJlYWR5IGRlbGV0ZWQgcmVjb3JkLiAoUWNyICM3OTAyODMpLlxyXG4gICAgICAgICAgICAvLyAqIHRoZXJlIGlzIHN0aWxsIGEgcHJvYmxlbSBpbiAndXBkYXRlJyBhbmQgJ2luc2VydCcgd2l0aCAnZW5kIHRhc2sgY29uZCcgKyAnZm9yY2UnIDogYW4gZXh0cmEgdXBkYXRlIHdpbGwgYmUgc2VuZFxyXG4gICAgICAgICAgICAvLyAgIHRvIHRoZSBzZXJ2ZXIgb24gdGhlIHJlYyBzdWZmaXggb2YgdGhlIGVuZCB0YXNrLiBidXQgYXBhcnQgZnJvbSBzZXJ2ZXIgdXBkYXRlIGl0IGNhdXNlcyBubyByZWFsIHByb2JsZW0uXHJcbiAgICAgICAgICAgIGlmIChyZWNNb2RlSXNEZWxldGUgJiYgdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFIHx8XHJcbiAgICAgICAgICAgICAgIXJlY01vZGVJc0RlbGV0ZSAmJiAhcmVjLmluRGVsZXRlUHJvY2VzcygpICYmIChyZWNNb2RpZmllZCB8fCBmb3JjZVN1ZmZpeCkpIHtcclxuICAgICAgICAgICAgICByZWMuc2V0TW9kZShEYXRhTW9kaWZpY2F0aW9uVHlwZXMuVXBkYXRlKTtcclxuICAgICAgICAgICAgICBhd2FpdCBkdi5hZGRDdXJyVG9Nb2RpZmllZCgpO1xyXG4gICAgICAgICAgICAgIGR2LnNldENoYW5nZWQodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChyZWNNb2RpZmllZCAmJiB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlYy5yZWFsTW9kaWZpZWQoKSAmJlxyXG4gICAgICAgICAgICAgICAgICAhRW52aXJvbm1lbnQuSW5zdGFuY2UuYWxsb3dVcGRhdGVJblF1ZXJ5TW9kZSh0YXNrLmdldENvbXBJZHgoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgLy8gaWYgcmVhbCBmaWVsZHMgd2VyZSBtb2RpZmllZFxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBkdi5jYW5jZWxFZGl0KEV2ZW50c01hbmFnZXIuUkVBTF9PTkxZLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgIHRhc2suV3JpdGVUb01lc3NhZ2VQYW5lYnlNc2dJZChNc2dJbnRlcmZhY2UuUlRfU1RSX1VQREFURV9JTl9RVUVSWSk7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0ICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHdlIG11c3QgY29udGludWUgaGVyZSBhbmQgdHJ5IHRvIGNvbW1pdCB0aGUgdHJhbnNhY3Rpb24gYmVjYXVzZVxyXG4gICAgICAgICAgICAgICAgLy8gdGhlcmUgbWlnaHQgYmUgYWxzbyBzb21lIHN1YiB0YXNrcyB0byB0aGlzIHRhc2tcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFFDUiM3NzYyOTU6IGZvciBwcmUgcmVjb3JkIHVwZGF0ZSwgY29tbWl0IHRoZSByZWNvcmQgYWZ0ZXIgaGFuZGxlcidzIGV4ZWN1dGlvbi5cclxuICAgICAgICAgICAgLy8gRml4ZWQgYnVnICM6MzA2OTI5LCBGb3JjZUV4aXRQcmUgaXMgcmVsZXZhbnQgb25seSBmb3IgdGhlIHRhc2sgdGhhdCByYWlzZWQgdGhlIGV2ZW50XHJcbiAgICAgICAgICAgIC8vIHNlZSBhbHNvIGJ1ZyM6MjkyODc2XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0ZvcmNlRXhpdFByZVJlY29yZFVwZGF0ZSh0YXNrKSAmJlxyXG4gICAgICAgICAgICAgIC8vIERlZmVjdCAxNTQwNDcgOiBkbyBub3QgdHJ5IGFuZCBjb21taXQgaWYgdGFzayBpcyBhYm9ydGluZyBhbmQgd2FzIGFscmVhZHkgcmVtb3ZlZCAob3IgYWxsIE1HRCB3YXMgcmVtb3ZlZCkuXHJcbiAgICAgICAgICAgICAgKCF0YXNrLmlzQWJvcnRpbmcoKSB8fCBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLkdldFRhc2tCeUlEKHRhc2suZ2V0VGFza1RhZygpKSAhPSBudWxsKSkge1xyXG4gICAgICAgICAgICAgIGlmICgoIXJlY01vZGVJc0RlbGV0ZSB8fCB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9ERUxFVEUpKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb21taXRSZWNvcmQodGFzaywgZXZ0LnJldmVyc2libGVFeGl0KCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRhc2sudHJhbnNhY3Rpb25GYWlsZWQoQ29uc3RJbnRlcmZhY2UuVFJBTlNfUkVDT1JEX1BSRUZJWCkgJiYgIXRhc2suaXNBYm9ydGluZygpKSB7XHJcbiAgICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0byBldmFsdWF0ZSB0aGUgZW5kIGNvbmRpdGlvbiBhZnRlciB0aGUgcmVjb3JkIHN1ZmZpeFxyXG4gICAgICAgICAgICAgIC8vIGluIGNhc2UgdGhlcmUgYXJlIDIgY3ljbGVzICh1cGRhdGUvZm9yY2Ugc3VmZml4ICsgZGVsZXRlKSwgZG8gdGhlIGVuZCB0YXNrIG9ubHkgaW4gdGhlIDJuZCBjeWNsZS5cclxuICAgICAgICAgICAgICBpZiAoKHJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUgJiZcclxuICAgICAgICAgICAgICAgIHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSkgfHxcclxuICAgICAgICAgICAgICAgIHJlYy5nZXRNb2RlKCkgIT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUpXHJcbiAgICAgICAgICAgICAgICBpZiAoYXdhaXQgdGFzay5ldmFsRW5kQ29uZChDb25zdEludGVyZmFjZS5FTkRfQ09ORF9FVkFMX0FGVEVSKSlcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGFzay5lbmRUYXNrKHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gLy8gcmVjICE9IG51bGxcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWDpcclxuICAgICAgICAgIGlmIChyY0JlZm9yZSkge1xyXG4gICAgICAgICAgICAvLyBjaGVjayBwYXJrYWJpbGl0eSBvbmNlIGFnYWluIGFzIHByb3BlcnR5IG1pZ2h0IGhhdmUgY2hhbmdlZCBpbiB0aGUgaGFuZGxlclxyXG4gICAgICAgICAgICAvLyA5MjQxMTIgLSBpZ25vcmUgZGlyZWN0aW9uIChpZiBmbGFnIHNldCkgYXMgd2UgYXJlIGZvcmNpbmcgcGFyayBpbnNwaXRlIG9mIGZhaWxlZCBkaXJlY3Rpb25cclxuICAgICAgICAgICAgLy8gUUNSIyA4MDYwMTU6IElmIHdlIGhhdmUgYSBzaW5nbGUgZmllbGQgd2l0aCBhbGxvdyBwYXJraW5nID0gWWVzIGFuZCBUYWIgSW50byA9IE5vLCB0aGVuIG9uIHByZXNzaW5nIHRhYiBpZiBjdXJzb3IgaXMgbm90XHJcbiAgICAgICAgICAgIC8vIG1vdmVkLCB3ZSBjb21lIHRvIHBhcmsgb24gbGFzdFBhcmtlZEN0cmwgKHdoaWNoIGlzIHNhbWUgYXMgY3RybCkgc2luY2UgVGFiSW50byBpcyBub3QgYWxsb3dlZC5cclxuICAgICAgICAgICAgLy8gU28gdG8gYXZhb2lkIGluZmluaXRlIHJlY3Vyc2lvbiwgd2Ugc2hvdWxkIG5vdCBhZ2FpbiB0cnkgdG8gcGFyayBvbiBpdC5cclxuICAgICAgICAgICAgaWYgKGF3YWl0IGN0cmwuSXNQYXJrYWJsZSgpIHx8IGN0cmwgPT09IExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKSkge1xyXG4gICAgICAgICAgICAgIC8vIHNldCBJbkNvbnRyb2wgdHJ1ZSBhZnRlciBDb250cm9sIFByZWZpeFxyXG4gICAgICAgICAgICAgIGN0cmwuSW5Db250cm9sID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGN0cmwuU2hvdWxkUmVmcmVzaE9uQ29udHJvbEVudGVyKCkpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCAoPEZpZWxkPmN0cmwuZ2V0RmllbGQoKSkudXBkYXRlRGlzcGxheSgpO1xyXG5cclxuICAgICAgICAgICAgICAvLyBpZiB0aGlzIGNvZGUgaXMgcmVhY2hlZCB0aGVuIGV2ZXJ5dGhpbmcgaXMgb2sgaW4gdGhlIGNvbnRyb2wgcHJlZml4XHJcbiAgICAgICAgICAgICAgLy8gdXNlciBoYW5kbGVyLiBOb3csIG1vdmUgdGhlIGZvY3VzIHRvIHRoZSBjb250cm9sLlxyXG4gICAgICAgICAgICAgIHRhc2suc2V0TGFzdFBhcmtlZEN0cmwoY3RybCk7XHJcbiAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBwYXJrZWQgb24gYSBjdHJsIHNldCBjbGlja2VkIGN0cmwgdG8gbnVsbFxyXG4gICAgICAgICAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5DdXJyZW50Q2xpY2tlZEN0cmwgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAvLyB0byB0YWtlIGNhcmUgb2YgdGVtcG9yYXJ5IGVkaXRvclxyXG4gICAgICAgICAgICAgIC8vIE1hbmFnZXIuc2V0Rm9jdXMoY3RybCwgY3RybC5nZXREaXNwbGF5TGluZShmYWxzZSkpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IGN0cmwuU2V0Rm9jdXMoY3RybCwgY3RybC5nZXREaXNwbGF5TGluZShmYWxzZSksIHRydWUpO1xyXG4gICAgICAgICAgICAgIC8vIHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IHBhcmtlZCBvbiBhIGN0cmwsIHNldCBzZXRzdG9wZXhlY3V0aW9uQ3RybCB0byBudWxsXHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChudWxsKTtcclxuXHJcbiAgICAgICAgICAgICAgTWdDb250cm9sLlJldHVyblRvQ3RybCA9IGN0cmw7XHJcbiAgICAgICAgICAgICAgdGFzay5JbkN0cmxQcmVmaXggPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0YXNrLkluQ3RybFByZWZpeCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyhjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYOlxyXG4gICAgICAgICAgLy8gZGlzYWJsZSBhY3Rpb25zIGFuZCBzdGF0ZXMuIGRvIGl0IG9ubHkgaWYgd2UgYXJlIGdldHRpbmcgb3V0IG9mIHRoZSBjb250cm9sLlxyXG4gICAgICAgICAgaWYgKCF0aGlzLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpIHtcclxuXHJcbiAgICAgICAgICAgIGlmIChjdHJsLmlzQ2hvaWNlQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICAgICAgY3RybC5TZXRLZXlib2FyZExhbmd1YWdlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlVUVE9OKVxyXG4gICAgICAgICAgICAgIHRhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0JVVFRPTiwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRhc2suZ2V0RW5hYmxlWm9vbUhhbmRsZXIoKSB8fCBjdHJsLnVzZVpvb21IYW5kbGVyKCkpXHJcbiAgICAgICAgICAgICAgdGFzay5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB0YXNrLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9FRFRfTlVMTCwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAocmNCZWZvcmUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgICAgIC8vIElmIGNvbnRyb2wgc3VmZml4IGdldCAnc3RvcCBleGVjdXRpb24nIChlLmcuIHZlcmlmeSBlcnJvciksIHRoZSBmb2N1cyB3aWxsIGJlIHJlbWFpbiBvbiBjdXJyZW50IGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgLy8gU28gc2V0IEluQ29udHJvbCB0byB0cnVlXHJcbiAgICAgICAgICAgICAgY3RybC5JbkNvbnRyb2wgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBmaWVsZHMgdGhhdCBhcmUgYXNzaWduZWQgdG8gYSB0ZXh0IGNvbnRyb2wgYW5kIHdpdGggdHlwZSB0aGF0IGhhcyBkZWZhdWx0IGRpc3BsYXlcclxuICAgICAgICAgICAgLy8gdmFsdWUgKG51bWVyaWMsIGRhdGUsIHRpbWUsIGxvZ2ljYWwgZXRjKVxyXG4gICAgICAgICAgICBsZXQgZmxkOiBGaWVsZCA9IDxGaWVsZD5jdHJsLmdldEZpZWxkKCk7XHJcbiAgICAgICAgICAgIGlmIChmbGQgIT0gbnVsbCAmJiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9URVhUKSlcclxuICAgICAgICAgICAgICBhd2FpdCBmbGQudXBkYXRlRGlzcGxheSgpO1xyXG5cclxuICAgICAgICAgICAgdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpO1xyXG4gICAgICAgICAgICBjdHJsLnNldEluQ29udHJvbFN1ZmZpeChmYWxzZSk7XHJcbiAgICAgICAgICAgIGN0cmwuSXNJbnRlcmFjdGl2ZVVwZGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoY3RybC5Qcm9wZXJ0eUV4aXN0cyhQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fVkFMSURBVE9SUykpXHJcbiAgICAgICAgICAgICAgYXdhaXQgY3RybC5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9WQUxJREFUT1JTKS5SZWZyZXNoRGlzcGxheSh0cnVlKTtcclxuICAgICAgICAgICAgY3RybC5WYWxpZGF0ZUNvbnRyb2wgPSBmYWxzZTtcclxuICAgICAgICAgICAgTGFzdEZvY3VzZWRNYW5hZ2VyLnNldExhc3RGb2N1c2VkQ29udHJvbCh0YXNrLCBudWxsKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhd2FpdCB0YXNrLmV2YWxFbmRDb25kKENvbnN0SW50ZXJmYWNlLkVORF9DT05EX0VWQUxfSU1NSURJQVRFKSlcclxuICAgICAgICAgICAgICBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1BSRUZJWDpcclxuICAgICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVg6XHJcbiAgICAgICAgICB0YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX05PTkUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIC8vIHNpbXVsYXRlcyB1c2VyIGFza2luZyBmb3IgdGhlIG5leHQgcmVjLlxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NZQ0xFX05FWFRfUkVDOlxyXG4gICAgICAgICAgbGV0IGZvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICAgICAgaWYgKCF0YXNrLmlzTWFpblByb2coKSAmJiBmb3JtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgYXdhaXQgZm9ybS5tb3ZlSW5WaWV3KGZvcm0uaXNMaW5lTW9kZSgpXHJcbiAgICAgICAgICAgICAgPyBDb25zdGFudHMuTU9WRV9VTklUX1JPV1xyXG4gICAgICAgICAgICAgIDogQ29uc3RhbnRzLk1PVkVfVU5JVF9QQUdFLFxyXG4gICAgICAgICAgICAgIENvbnN0YW50cy5NT1ZFX0RJUkVDVElPTl9ORVhUKTtcclxuICAgICAgICAgICAgLy8gZW5kIG9mIGRhdGEgd2lsbCBzaWduYWwgdXMgdG8gZW5kIHRoZSB0YXNrICh1bmxlc3MgaW4gY3JlYXRlIG1vZGUpLlxyXG4gICAgICAgICAgICBpZiAodGFzay5nZXRFeGVjRW5kVGFzaygpKVxyXG4gICAgICAgICAgICAgIGF3YWl0IHRhc2suZW5kVGFzayh0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIC8vIGRlbGV0ZSByZWNvcmQgaW4gbm9uIGludGVyYWN0aXZlIHRhc2tcclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DWUNMRV9ORVhUX0RFTEVURV9SRUM6XHJcbiAgICAgICAgICAvLyBjaGVjayBlbXB0eSBkYXRhdmlldyBiZWZvcmUgdHJ5aW5nIHRvIGRlbGV0ZSwgaW4gY2FzZSB0YXNrIHN0YXJ0ZWQgd2l0aCBlbXB0eSBkYXRhdmlldy5cclxuICAgICAgICAgIGlmICh0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpKVxyXG4gICAgICAgICAgICAodGFzaykuc2V0RXhlY0VuZFRhc2soKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5IYW5kbGVBY3Rpb25EZWxsaW5lKCB0YXNrLCBkdiwgcmVjLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAvLyBlbmQgb2YgZGF0YSB3aWxsIHNpZ25hbCB1cyB0byBlbmQgdGhlIHRhc2sgKHVubGVzcyBpbiBjcmVhdGUgbW9kZSkuXHJcbiAgICAgICAgICBpZiAodGFzay5nZXRFeGVjRW5kVGFzaygpKVxyXG4gICAgICAgICAgICBhd2FpdCB0YXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9TRVRfRVhURVJOQUxfVkFMVUU6XHJcbiAgICAgICAgICBsZXQgcmVmcmVzaERpc3BsYXkgOiBib29sZWFuID0gYXdhaXQgZXZ0LmdldEFyZ0xpc3QoKS5nZXRBcmdWYWx1ZSgxLCBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU4sIDApID09PSAnMScgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgICBhd2FpdCAoPE1nQ29udHJvbD5jdHJsKS52YWxpZGF0ZUFuZFNldFZhbHVlSWZBbGxvd2VkKGV2dC5nZXRWYWx1ZSgpLCByZWZyZXNoRGlzcGxheSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjcmVhdGVzIGEgbm9uIHJldmVyc2libGUgZXZlbnQgYW5kIGhhbmRsZSBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+YSByZWZlcmVuY2UgdG8gdGhlIHRhc2sgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV2ZW50Q29kZVwiPnRoZSBjb2RlIG9mIHRoZSBldmVudCA8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZU5vblJldmVyc2libGVFdmVudCh0YXNrOiBUYXNrQmFzZSwgZXZlbnRDb2RlOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCh0YXNrKTtcclxuICAgIGxldCBleGl0Q29tbWFuZDogYm9vbGVhbiA9IChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUIHx8IGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NMT1NFKTtcclxuXHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChldmVudENvZGUpO1xyXG5cclxuICAgIGlmIChleGl0Q29tbWFuZClcclxuICAgICAgdGhpcy5faXNOb25SZXZlcnNpYmxlRXhpdCA9IHRydWU7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgcnRFdnQuc2V0Tm9uUmV2ZXJzaWJsZUV4aXQoKTtcclxuICAgICAgcnRFdnQuc2V0Q3RybCg8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKSk7XHJcbiAgICAgIHJ0RXZ0LnNldEFyZ0xpc3QobnVsbCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGlmIChleGl0Q29tbWFuZClcclxuICAgICAgICB0aGlzLl9pc05vblJldmVyc2libGVFeGl0ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY3JlYXRlcyBhIG5ldyBpbnRlcm5hbCBFdmVudCBhbmQgaGFuZGxlIGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj5hIHJlZmVyZW5jZSB0byB0aGUgdGFzazwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJldmVudENvZGVcIj50aGUgY29kZSBvZiB0aGUgZXZlbnQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNRdWl0XCI+aW5kaWNhdGVzIHdoZXRoZXIgTUdfQUNUX0NBTkNFTCBpcyBjYWxsZWQgZnJvbSBNR19BQ1RfUlRfUVVJVDwvcGFyYW0+XHJcbiAgYXN5bmMgaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kRXZlbnRTdWJ0eXBlKHRhc2s6IFRhc2tCYXNlLCBldmVudENvZGU6IG51bWJlciwgZXZlbnRTdWJUeXBlOiBFdmVudFN1YlR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBsYXN0UGFya2VkQ3RybDogTWdDb250cm9sID0gPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudDtcclxuXHJcbiAgICBpZiAoZXZlbnRDb2RlIDwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RPVF9DTlQgJiYgdGFzayAhPSBudWxsICYmICEoZXZlbnRTdWJUeXBlID09PSBFdmVudFN1YlR5cGUuQ2FuY2VsSXNRdWl0KSAmJiAhdGFzay5BY3Rpb25NYW5hZ2VyLmlzRW5hYmxlZChldmVudENvZGUpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKGxhc3RQYXJrZWRDdHJsICE9PSBudWxsKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sKGxhc3RQYXJrZWRDdHJsLCBldmVudENvZGUsIGV2ZW50U3ViVHlwZSk7XHJcblxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9RVUlUKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kRXZlbnRTdWJ0eXBlKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUwsIEV2ZW50U3ViVHlwZS5DYW5jZWxJc1F1aXQpO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzayk7XHJcbiAgICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoZXZlbnRDb2RlKTtcclxuICAgICAgICBydEV2dC5TZXRFdmVudFN1YlR5cGUoZXZlbnRTdWJUeXBlKTtcclxuICAgICAgICBpZiAoSW50ZXJuYWxJbnRlcmZhY2UuQnVpbHRpbkV2ZW50KGV2ZW50Q29kZSkpXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5jb21tb25IYW5kbGVyKHJ0RXZ0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNyZWF0ZXMgYSBuZXcgaW50ZXJuYWwgRXZlbnQgYW5kIGhhbmRsZSBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+YSByZWZlcmVuY2UgdG8gdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZXZlbnRDb2RlXCI+dGhlIGNvZGUgb2YgdGhlIGV2ZW50PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzUXVpdFwiPmluZGljYXRlcyB3aGV0aGVyIE1HX0FDVF9DQU5DRUwgaXMgY2FsbGVkIGZyb20gTUdfQUNUX1JUX1FVSVQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhNZ0NvbnRyb2woY3RybDogTWdDb250cm9sLCBldmVudENvZGU6IG51bWJlciwgZXZlbnRTdWJUeXBlOiBFdmVudFN1YlR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50O1xyXG5cclxuICAgIGlmIChldmVudENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9RVUlUKVxyXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sKGN0cmwsIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUwsIEV2ZW50U3ViVHlwZS5DYW5jZWxJc1F1aXQpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudChjdHJsKTtcclxuICAgICAgcnRFdnQuc2V0SW50ZXJuYWwoZXZlbnRDb2RlKTtcclxuICAgICAgcnRFdnQuU2V0RXZlbnRTdWJUeXBlKGV2ZW50U3ViVHlwZSk7IC8vICh1c2UgZm9yIGFjdF9jYW5jZWwgJiBhY3RfcnRfdmlld19yZWZyZXNoXHJcbiAgICAgIC8vIGJhc2ljYWxseSBNR19BQ1RfVklFV19SRUZSRVNIIHJlcHJlc2VudCB0aGUgdmlldyByZWZyZXNoIGV2ZW50IHJhaXNlZCBieSB0aGUgdXNlclxyXG4gICAgICAvLyBob3dldmVyIHdlIHVzZSBpbnRlcm5hbGx5IGluIHRoZSBjb2RlIHRvIHJlZnJlc2ggdGhlIGRpc3BsYXkgKG1haW5seSBpbiBzdWIgZm9ybXMgcmVmcmVzaGVzKVxyXG4gICAgICAvLyBpbiBvcmRlciB0aGUgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgcmVhbCB1c2UgYW5kIHRoZSBpbnRlcm5hbCB1c2Ugd2Ugc2V0IHRoaXMgZmxhZyB0byBmYWxzZVxyXG4gICAgICAvLyB3ZSBuZWVkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIHR3byBzaW5jZSB3ZSBtYWtlIGRpZmZlcmVudCBhY3Rpb25zIHdoZW4gY2FjaGluZyBhIHN1YmZvcm1cclxuICAgICAgaWYgKGV2ZW50Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JUX1JFRlJFU0hfVklFVylcclxuICAgICAgICBydEV2dC5zZXRJc1JlYWxSZWZyZXNoKGZhbHNlKTtcclxuXHJcbiAgICAgIGlmIChJbnRlcm5hbEludGVyZmFjZS5CdWlsdGluRXZlbnQoZXZlbnRDb2RlKSlcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV2ZW50KHJ0RXZ0LCBmYWxzZSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBhd2FpdCB0aGlzLmNvbW1vbkhhbmRsZXIocnRFdnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGN1cnJlbnQgZmllbGRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEN1cnJGaWVsZCgpOiBGaWVsZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VyckZpZWxkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgY3VycmVudCBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDdXJyQ3RybCgpOiBNZ0NvbnRyb2wge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJDdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGN1cnJlbnQgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q3VyclRhc2soKTogVGFzayB7XHJcbiAgICBpZiAodGhpcy5fY3VyckZpZWxkID09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgcmV0dXJuIDxUYXNrPnRoaXMuX2N1cnJGaWVsZC5nZXRUYXNrKCk7XHJcbiAgfVxyXG5cclxuICBzZXRTdG9wRXhlY3V0aW9uKHN0b3A6IGJvb2xlYW4pOiB2b2lkO1xyXG4gIHNldFN0b3BFeGVjdXRpb24oc3RvcDogYm9vbGVhbiwgY2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24gOiBDbGVhckV2ZW50c09uU3RvcEV4ZWN1dGlvbik6IHZvaWQgO1xyXG4gIHNldFN0b3BFeGVjdXRpb24oc3RvcDogYm9vbGVhbiwgY2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24/IDogQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24pOiB2b2lkIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKVxyXG4gICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb25fMChzdG9wKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uXzEoc3RvcCwgY2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgXCJzdG9wIGV4ZWN1dGlvblwiIGZsYWcgdG8gdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRTdG9wRXhlY3V0aW9uXzAoc3RvcDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHN0b3AsIENsZWFyRXZlbnRzT25TdG9wRXhlY3V0aW9uLkFMTCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBcInN0b3AgZXhlY3V0aW9uXCIgZmxhZyB0byB0cnVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHNldFN0b3BFeGVjdXRpb25fMShzdG9wOiBib29sZWFuLCBjbGVhckV2ZW50c09uU3RvcEV4ZWN1dGlvbjogQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24pOiB2b2lkIHtcclxuICAgIGlmIChzdG9wKVxyXG4gICAgICBpZiAoY2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24gPT0gQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24uQUxMKVxyXG4gICAgICAgIHRoaXMuX2V2ZW50c1F1ZXVlLmNsZWFyKCk7XHJcbiAgICAgIGVsc2UgaWYoY2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24gPT0gQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24uU0VSVkVSKSB7XHJcbiAgICAgICAgbGV0IHRtcFZlYyA9IG5ldyBMaXN0PFJ1blRpbWVFdmVudD4oKTtcclxuICAgICAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudDtcclxuICAgICAgICBsZXQgaTogbnVtYmVyO1xyXG5cclxuICAgICAgICAvLyBXZSB3ZXJlIHJlcXVlc3RlZCB0byBsZWF2ZSB0aGUgXCJzZXJ2ZXIgZXZlbnRzXCIgaW4gdGhlIHF1ZXVlLlxyXG4gICAgICAgIC8vIERvIGl0LCBidXQgYWxzbyByZW1vdmUgdGhlIFwicHJvdGVjdGlvblwiIGZyb20gdGhlc2UgZXZlbnRzIHNvIG5leHRcclxuICAgICAgICAvLyB0aW1lIHdlIG5lZWQgdG8gY2xlYXIgdGhlIHF1ZXVlIHRoZXkgd2lsbCBhbHNvIGJlIGRlbGV0ZWQuXHJcbiAgICAgICAgd2hpbGUgKCF0aGlzLl9ldmVudHNRdWV1ZS5pc0VtcHR5KCkpIHtcclxuICAgICAgICAgIHJ0RXZ0ID0gPFJ1blRpbWVFdmVudD50aGlzLl9ldmVudHNRdWV1ZS5wb2xsKCk7XHJcbiAgICAgICAgICBpZiAocnRFdnQuaXNGcm9tU2VydmVyKCkpIHtcclxuICAgICAgICAgICAgcnRFdnQucmVzZXRGcm9tU2VydmVyKCk7XHJcbiAgICAgICAgICAgIHRtcFZlYy5wdXNoKHJ0RXZ0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0bXBWZWMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICB0aGlzLl9ldmVudHNRdWV1ZS5wdXQodG1wVmVjLmdldF9JdGVtKGkpKTtcclxuICAgICAgfVxyXG4gICAgdGhpcy5fc3RvcEV4ZWN1dGlvbiA9IHN0b3A7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBjdHJsIG9uIHdoaWNoIHdlIGhhZCBhIFwic3RvcCBleGVjdXRpb25cIlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0U3RvcEV4ZWN1dGlvbkN0cmwoY3RybDogTWdDb250cm9sKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fc3RvcEV4ZWN1dGlvbkN0cmwgPT09IG51bGwgfHwgY3RybCA9PT0gbnVsbClcclxuICAgICAgdGhpcy5fc3RvcEV4ZWN1dGlvbkN0cmwgPSBjdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGRlbGV0ZSB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPnRoZSB0YXNrIHRvIHJlZmVyIHRvIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbkZvcmNlRGVsXCI+dHJ1ZSBpZiB0aGUgZGVsZXRlIGlzIGRvbmUgYmVjYXVzZSBvZiBmb3JjZSBkZWxldGUgPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGRlbEN1cnJSZWModGFzazogVGFzaywgaW5Gb3JjZURlbDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50YXNrLkRhdGFWaWV3O1xyXG5cclxuICAgIHRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcblxyXG4gICAgLy8gZGVsZXRlIHRoZSByZWNvcmQgYW5kIHJ1biByZWNvcmQgc3VmZml4IGZvciB0aGUgbmV3IGN1cnJlbnQgcmVjb3JkXHJcbiAgICBhd2FpdCAoPE1nRm9ybT50YXNrLmdldEZvcm0oKSkuZGVsQ3VyclJlYygpO1xyXG5cclxuICAgIC8vIG5vIGN1cnItcmVjID09PiB3ZSBkZWxldGVkIHRoZSBsYXN0IHJlY29yZCBhbmQgZmFpbGVkIHRvIGNyZWF0ZSBhIG5ldyBvbmUgKGUuZy5cclxuICAgIC8vIENSRUFURSBtb2RlIGlzIG5vdCBhbGxvd2VkKSA9PT4gZW5kIHRoZSB0YXNrLiBBbiBleGNlcHRpb24gdG8gdGhlIHJ1bGUgaXMgd2hlblxyXG4gICAgLy8gd2UgYXJlIGFscmVhZHkgaW4gdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYSByZWNvcmQuXHJcbiAgICBpZiAoIXRhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpIHtcclxuICAgICAgaWYgKGR2LmdldEN1cnJSZWNJZHgoKSA+PSAwKSB7XHJcbiAgICAgICAgLy8gUUNSICM2NTY0OTU6IElmIHdlIGdvdCB0byB0aGlzIHBvaW50IGFuZCB0aGUgY3VycmVudCByZWNvcmQgaXMgc3RpbGwgdGhlXHJcbiAgICAgICAgLy8gZGVsZXRlZCBvbmUgdGhlbiB0aGUgcmVjb3JkIHByZWZpeCB3aWxsIGJlIGhhbmRsZWQgZWxzZXdoZXJlLlxyXG4gICAgICAgIGlmICgoZHYuZ2V0Q3VyclJlYygpKS5nZXRNb2RlKCkgIT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUgJiYgIWluRm9yY2VEZWwpIHtcclxuICAgICAgICAgIGxldCBjdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnRhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgICAgICAgIGlmICghdGhpcy5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgICAgICBpZiAoY3RybCA9PT0gbnVsbClcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHModGFzayk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsRXZlbnRXaXRoTWdDb250cm9sQmFzZShjdHJsLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICghdGFzay5nZXRJbkNyZWF0ZUxpbmUoKSlcclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZU5vblJldmVyc2libGVFdmVudCh0YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhd2FpdCB0aGlzLkhhbmRsZU5vblBhcmthYmxlQ29udHJvbHModGFzayk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHJvY2VzcyB1c2VycyBjb25maXJtYXRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPnRvIGNoZWNrIGNvbmZpcm0gdXBkYXRlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgLSBwcm9jZXNzIGNvbW1hbmQsIGZhbHNlIC0gc3RvcCBjb21tYW5kIHByb2Nlc3Npbmc8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVDb25maXJtZWQodGFzazogVGFzayk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGNvbmZpcm06IGJvb2xlYW47XHJcbiAgICBsZXQgYW5zd2VyOiBzdHJpbmc7XHJcbiAgICBsZXQgYW5zOiBudW1iZXI7XHJcblxyXG4gICAgaWYgKHRhc2sgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGNvbmZpcm0gPSBhd2FpdCB0YXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05GSVJNX1VQREFURSwgZmFsc2UpO1xyXG4gICAgaWYgKCF0aGlzLl9pc0luUmVjb3JkRmx1c2hFdmVudCAmJiBjb25maXJtICYmICF0YXNrLkRhdGFTeW5jZWQpIHtcclxuICAgICAgYW5zID0gYXdhaXQgR1VJTWFuYWdlci5JbnN0YW5jZS5jb25maXJtKE1zZ0ludGVyZmFjZS5DUkZfU1RSX0NPTkZfVVBELFxyXG4gICAgICAgIFN0eWxlcy5NU0dCT1hfSUNPTl9RVUVTVElPTiB8IFN0eWxlcy5NU0dCT1hfQlVUVE9OX1lFU19OT19DQU5DRUwpO1xyXG4gICAgICBpZiAoYW5zID09PSBTdHlsZXMuTVNHQk9YX1JFU1VMVF9ZRVMpXHJcbiAgICAgICAgYW5zd2VyID0gJ1knO1xyXG4gICAgICAvLyBZZXNcclxuICAgICAgZWxzZSBpZiAoYW5zID09PSBTdHlsZXMuTVNHQk9YX1JFU1VMVF9OTylcclxuICAgICAgICBhbnN3ZXIgPSAnTic7XHJcbiAgICAgIC8vIE5vXHJcbiAgICAgIGVsc2VcclxuICAgICAgICBhbnN3ZXIgPSAnQyc7IC8vIENhbmNlbFxyXG4gICAgfSBlbHNlXHJcbiAgICAgIGFuc3dlciA9ICdZJztcclxuXHJcbiAgICBzd2l0Y2ggKGFuc3dlcikge1xyXG4gICAgICBjYXNlICdZJzpcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ04nOlxyXG4gICAgICAgIGF3YWl0ICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5jYW5jZWxFZGl0KGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgYXdhaXQgKDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCkpLlJlZnJlc2hEaXNwbGF5KENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUMpO1xyXG4gICAgICAgIHRhc2suQ29uZmlybVVwZGF0ZU5vID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG5vdCBjb250aW51ZSByZWNvcmQgc3VmZml4XHJcblxyXG4gICAgICBjYXNlICdDJzpcclxuICAgICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uQ3RybChMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCkpO1xyXG4gICAgICAgIGF3YWl0IEZvY3VzTWFuYWdlci5TZXRGb2N1cyhMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCksIC0xKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHN0b3AgZXZlbnQgcHJvY2Vzc2luZ1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coJ2luIENsaWVudE1hbmFnZXIuSW5zdGFuY2UudXBkYXRlQ29uZmlybWVkKCkgaWxsZWdhbCBjb25maXJtYXRpb24gY29kZTogJyArXHJcbiAgICAgICAgICBjb25maXJtKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFNldCB0aGUgb3JkZXIgb2YgaGFuZGxpbmcgbWFpbiBwcm9ncmFtcyBvZiBjb21wb25lbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRDb21wTWFpblByZ1RhYihjb21wTWFpblByZ1RhYmxlOiBDb21wTWFpblByZ1RhYmxlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jb21wTWFpblByZ1RhYiA9IGNvbXBNYWluUHJnVGFibGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGVuZCBvZiB3b3JrIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEVuZE9mV29yayhlbmRPZldvcmtfOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9lbmRPZldvcmsgPSBlbmRPZldvcmtfO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBlbmQgb2Ygd29yayBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRFbmRPZldvcmsoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZW5kT2ZXb3JrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgb3JkZXIgb2YgaGFuZGxpbmcgbWFpbiBwcm9ncmFtcyBvZiBjb21wb25lbnRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDb21wTWFpblByZ1RhYigpOiBDb21wTWFpblByZ1RhYmxlIHtcclxuICAgIHJldHVybiB0aGlzLl9jb21wTWFpblByZ1RhYjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHJldmVyc2libGUgZXhpdCBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpbk5vblJldmVyc2libGVFeGl0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzTm9uUmV2ZXJzaWJsZUV4aXQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHVzaCBhIHJ1bnRpbWUgZXZlbnQgdG8gdGhlIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+dGhlIHJ1bnRpbWUgZXZlbnQgdG8gcHVzaCBvbiB0aGUgc3RhY2s8L3BhcmFtPlxyXG4gIHB1c2hSdEV2ZW50KHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuX3J0RXZlbnRzLnB1c2gocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBvcCBhIHJ1bnRpbWUgZXZlbnQgZnJvbSB0aGUgc3RhY2sgYW5kIHJldHVybiBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcG9wUnRFdmVudCgpOiBSdW5UaW1lRXZlbnQge1xyXG4gICAgaWYgKHRoaXMuX3J0RXZlbnRzLmNvdW50KCkgPT09IDApXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgcmV0dXJuIDxSdW5UaW1lRXZlbnQ+dGhpcy5fcnRFdmVudHMucG9wKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc3RvcmUgdGhlIGxhc3Qgc2F2ZWQgcm91dGUgZXZlbnQgb24gbG9jYWwgc3RvcmFnZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0b3JlTGFzdFNhdmVkUm91dGVFdmVudE9uTG9jYWxTdG9yYWdlKCk6IHZvaWRcclxuICB7XHJcbiAgICBsZXQgZGF0YVN0b3JhZ2UgPSB3aW5kb3cubG9jYWxTdG9yYWdlO1xyXG4gICAgaWYgKHRoaXMuZ2V0TGFzdFNhdmVkUm91dGVFdmVudCgpICE9IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIGxldCBydEV2dCA9IHRoaXMuZ2V0TGFzdFNhdmVkUm91dGVFdmVudCgpO1xyXG5cclxuICAgICAgZGF0YVN0b3JhZ2Uuc2V0SXRlbShDb25zdEludGVyZmFjZS5MQVNUX1JPVVRFX0VWRU5ULCAnMScpO1xyXG4gICAgICBkYXRhU3RvcmFnZS5zZXRJdGVtKENvbnN0SW50ZXJmYWNlLkxBU1RfUk9VVEVfRVZFTlRfU1JDX1RTSywgSlNPTi5zdHJpbmdpZnkoKDxUYXNrPnJ0RXZ0LmdldFRhc2soKSkuVGFza0RlZmluaXRpb25JZCkpO1xyXG5cclxuICAgICAgaWYgKHJ0RXZ0LmdldEFyZ0xpc3QoKS5nZXRTaXplKCkgPiAwKSB7XHJcbiAgICAgICAgbGV0IHN0cjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICAgICAgcnRFdnQuZ2V0QXJnTGlzdCgpLmJ1aWxkWE1MKHN0cik7XHJcbiAgICAgICAgZGF0YVN0b3JhZ2Uuc2V0SXRlbShDb25zdEludGVyZmFjZS5MQVNUX1JPVVRFX0VWRU5UX0FSR19MSVNULCAgc3RyLnRvU3RyaW5nKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzdG9yZSB0aGUgbGFzdCBzYXZlZCByb3V0ZSBldmVudCBmcm9tIGxvY2FsIHN0b3JhZ2UuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXN0b3JlTGFzdFNhdmVkUm91dGVFdmVudEZyb21Mb2NhbFN0b3JhZ2UoKTogdm9pZFxyXG4gIHtcclxuICAgIC8vZ2V0IHJvdXRlIGV2ZW50IGlmIHN0b3JlZCBvbiBsb2NhbCBzdG9yYWdlXHJcbiAgICBsZXQgZGF0YVN0b3JhZ2UgPSB3aW5kb3cubG9jYWxTdG9yYWdlO1xyXG5cclxuICAgIGxldCBsYXN0Um91dGVFdmVudCA9IGRhdGFTdG9yYWdlLmdldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVCk7XHJcblxyXG4gICAgaWYgKGxhc3RSb3V0ZUV2ZW50ID09PSAnMScpIHtcclxuICAgICAgbGV0IHNyY1Rhc2tEZWZpbml0aW9uU3RyID0gZGF0YVN0b3JhZ2UuZ2V0SXRlbShDb25zdEludGVyZmFjZS5MQVNUX1JPVVRFX0VWRU5UX1NSQ19UU0spO1xyXG4gICAgICBsZXQgcm91dGVBcmdMaXN0U3RyID0gZGF0YVN0b3JhZ2UuZ2V0SXRlbShDb25zdEludGVyZmFjZS5MQVNUX1JPVVRFX0VWRU5UX0FSR19MSVNUKTtcclxuXHJcbiAgICAgIC8vIHBhcnNlIHNyY1Rhc2tEZWZpbml0aW9uU3RyIGFuZCBwcmVwYXJlIHRhc2tEZWZpbml0aW9uSWRcclxuICAgICAgbGV0IHRhc2tEZWZpbml0aW9uSWQgPSBuZXcgVGFza0RlZmluaXRpb25JZCgpO1xyXG4gICAgICB0YXNrRGVmaW5pdGlvbklkLmZyb21KU09OKHNyY1Rhc2tEZWZpbml0aW9uU3RyKTtcclxuXHJcbiAgICAgIC8vc2VhcmNoIHNvdXJjZSB0YXNrIGluIG5ld2x5IGxvYWRlZCB0YXNrIHRyZWUgYnkgdGFza0RlZmluaXRpb25JZFxyXG4gICAgICBsZXQgc3JjVGFzayA9IE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0Q3Vyck1HRGF0YSgpLmdldFRhc2tCeVRhc2tEZWZpbml0aW9uSUQodGFza0RlZmluaXRpb25JZCk7XHJcbiAgICAgIGxldCBhcmdzID0gbnVsbDtcclxuICAgICAgaWYgKHJvdXRlQXJnTGlzdFN0ciAhPSBudWxsKSB7XHJcbiAgICAgICAgYXJncyA9IG5ldyBBcmd1bWVudHNMaXN0KCk7XHJcbiAgICAgICAgYXJncy5maWxsTGlzdChyb3V0ZUFyZ0xpc3RTdHIsIHNyY1Rhc2spO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBFdmVudHNNYW5hZ2VyLkluc3RhbmNlLkFkZExhc3RTYXZlZFJvdXRlRXZlbnQoc3JjVGFzaywgYXJncyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBsYXN0IHNhdmVkIHJvdXRlIGV2ZW50LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TGFzdFNhdmVkUm91dGVFdmVudCgpOiBSdW5UaW1lRXZlbnQge1xyXG4gICAgICByZXR1cm4gdGhpcy5sYXN0U2F2ZWRSb3V0ZUV2ZW50O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgc2F2ZSB0aGUgbGFzdCByb3V0ZSBldmVudC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldExhc3RTYXZlZFJvdXRlRXZlbnQgKHJ0RXZ0OlJ1blRpbWVFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHJ0RXZ0ID09IG51bGwpXHJcbiAgICAgIHRoaXMubGFzdFNhdmVkUm91dGVFdmVudCA9IG51bGw7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMubGFzdFNhdmVkUm91dGVFdmVudCA9IHJ0RXZ0LnJlcGxpY2F0ZSgpO1xyXG4gIH1cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBydW50aW1lIGV2ZW50IGxvY2F0ZWQgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldExhc3RSdEV2ZW50KCk6IFJ1blRpbWVFdmVudCB7XHJcbiAgICBpZiAodGhpcy5fcnRFdmVudHMuY291bnQoKSA9PT0gMClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gPFJ1blRpbWVFdmVudD50aGlzLl9ydEV2ZW50cy5wZWVrKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSBvZiBhIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgd2Ugc2hvdWxkIGlnbm9yZSB1bmtub3duIGNvbW1hbmRzXHJcbiAgLy8vICAgYXJyaXZpbmcgZnJvbSB0aGUgZW5naW5lLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0SWdub3JlVW5rbm93bkFib3J0KHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5faWdub3JlVW5rbm93bkFib3J0ID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBcImlnbm9yZSB1bmtub3duIGFib3J0XCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaWdub3JlVW5rbm93bkFib3J0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lnbm9yZVVua25vd25BYm9ydDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVjb3ZlciBmcm9tIGEgZmFpbHVyZSB0byBvdmVybGF5IGEgdGFzay4gV2hlbiB0aGUgc2VydmVyIG9yZGVycyB0aGUgY2xpZW50IHRvIHJ1biBhXHJcbiAgLy8vICAgbmV3IHRhc2sgaW4gYSBmcmFtZSB3aGljaCBhbHJlYWR5IGNvbnRhaW5zIGFuIGFjdGl2ZSB0YXNrLCB0aGUgY2xpZW50IHRyaWVzIHRvIHRlcm0gdGhlXHJcbiAgLy8vICAgZXhpc3RpbmcgdGFzayBhbmQgcmVwbGFjZSBoaW0uIFdoZW4gdGhpcyBhY3Rpb24gZmFpbHMsIHRoZSBjbGllbnQgaGFzIHRvIGFzayB0aGUgc2VydmVyXHJcbiAgLy8vICAgdG8gdGVybWluYXRlIHRoZSBORVcgVEFTSywgYW5kIGlnbm9yZSB0aGUgb3ZlcmxheSBhY3Rpb24uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tpZFwiPi0gdGhlIGlkIG9mIHRoZSBORVcgVEFTSzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ2RcIj4gICAtIHRoZSBNR0RhdGEgb2YgdGhlIE9MRCBUQVNLLjwvcGFyYW0+XHJcbiAgYXN5bmMgZmFpbFRhc2tPdmVybGF5KHRhc2tJZDogc3RyaW5nLCBtZ2Q6IE1HRGF0YSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQ7XHJcblxyXG4gICAgaWYgKHRhc2tJZCAhPT0gbnVsbCkge1xyXG4gICAgICAvLyBUaGUgc2VydmVyIHdpbGwgcmV0dXJuIHVzICdhYm9ydCcgY29tbWFuZHMgZm9yIHRoZSBuZXcgdGFzay4gSWdub3JlIHRoZW0sIHNpbmNlIGl0IHdhc250IHN0YXJ0ZWQgeWV0XHJcbiAgICAgIHRoaXMuc2V0SWdub3JlVW5rbm93bkFib3J0KHRydWUpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNtZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZU5vblJldmVyc2libGVFeGl0Q29tbWFuZCh0YXNrSWQsIGZhbHNlKTtcclxuICAgICAgICBtZ2QuQ21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgICAgIGF3YWl0IFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgdGhpcy5zZXRJZ25vcmVVbmtub3duQWJvcnQoZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBUUlVFIGlmIGN1cnJlbnQgZXZlbnQgc2hvdWxkIGJlIHByb3BvZ3RhdGVkIHRvIGFsbCB0YXNrcyBpbiBhIHNwZWNpZmljIHRyYW5zYWN0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc0V2ZW50U2NvcGVUcmFucygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9ldmVudFNjb3BlID09PSBFdmVudFNjb3BlLlRSQU5TO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBldmVudCBzY29wZSB0byBUUkFOU0FDVElPTlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0RXZlbnRTY29wZVRyYW5zKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZXZlbnRTY29wZSA9IEV2ZW50U2NvcGUuVFJBTlM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGV2ZW50IHNjb3BlIHRvIE5PTiBUUkFOU0FDVElPTlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXJFdmVudFNjb3BlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZXZlbnRTY29wZSA9IEV2ZW50U2NvcGUuTk9ORTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGltZSBvZiBmaXN0IGV2ZW50IGluIHNlcXVlbmNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRpbWUgb2YgZml0c3QgZXZlbnQgaW4gc2VxdWVuY2U8L3JldHVybnM+XHJcbiAgR2V0RXZlbnRUaW1lKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXZlbnRzUXVldWUuR2V0VGltZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImtiSXRtXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBsYXN0IGVuYWJsZWQgYWN0aW9uIGZvciB0aGUgc3BlY2lmaWMga2V5IChpbiBrYkl0ZW0pPC9yZXR1cm5zPlxyXG4gIC8vLyA8Y2hlY2tBY2Nlc3NLZXlJbk1lbnVzOj4gIGlmIHRvIGNoZWNrIHRoZSBrZXlib2FyZCBpbiB0aGUgbWVudSA8L2NoZWNrQWNjZXNzS2V5SW5NZW51czo+XHJcbiAgcHVibGljIGdldE1hdGNoaW5nQWN0aW9uKCAga2JJdG06IEtleWJvYXJkSXRlbSk6IG51bWJlciB7XHJcblxyXG4gICAgbGV0IGFjdDogbnVtYmVyID0gMDtcclxuICAgIC8vIHdoZW4gbWVudSBpcyBkZWZpbmUgd2l0aCBubyBrZXlib2FyZCBkZWZpbmUsIHRoZSBrYkl0ZW0gaXMgcmV0dXJuIG51bGw7XHJcbiAgICBpZiAoa2JJdG0gPT0gbnVsbClcclxuICAgICAgcmV0dXJuIGFjdDtcclxuXHJcblxyXG4gICAgLy8gVGhlcmUgd2FzIG5vIGtiZCBtYXBwaW5nIHRoZSB0aGF0IGtleSwgYnV0IGl0IHN0aWxsIGJlbG9uZ3MgdG8gYW4gYWN0aW9uLlxyXG4gICAgLy8gc2VlIGlmIHRoZSBrYkl0bSBob2xkIGFuIGFjdGlvbiAob3JpZ2luYWxseSBtYWRlIGZvciBNR19BQ1RfQ0hBUikuXHJcbiAgICBpZiAoYWN0ID09PSAwKSB7XHJcbiAgICAgIC8vIGlmIG1lbnUgd2FzIGZvdW5kIGFuZCBpdCBpcyBpbnRlcm5hbCBldmVudCBwdXQgYWN0aW9uIHRvIHRoZSBxdWV1ZSBvbmx5IGlmIHRoZXJlIHdhcyBubyBrYmQgbWFwcGluZyB0aGUgdGhhdCBrZXkuXHJcbiAgICAgIGlmIChrYkl0bS5nZXRBY3Rpb24oKSAhPT0gMClcclxuICAgICAgICBhY3QgPSBrYkl0bS5nZXRBY3Rpb24oKTtcclxuICAgICAgLy8gdGhpcyBpcyBvbmx5IFRFTVAgaGFyZGNvZGVkLiB0aGUgYWN0aW9uIHdpbGwgbmVlZCB0byBiZSBpbiB0aGUga2V5Ym9hcmQgbWFwcGluZ1xyXG4gICAgICAvLyBhbHNvIGEgY2hhbmdlIHRvIHRoZSBvbmxpbmUgKGlmIHRpbWUgcGVybWl0cykgYWxzbyB0byB0dXJuIHRoZSB0b2dnbGUgaW5zZXJ0IGludG8gYW4gYWN0LlxyXG4gICAgICBlbHNlIGlmIChrYkl0bS5nZXRLZXlDb2RlKCkgPT09IDQ1ICYmIGtiSXRtLmdldE1vZGlmaWVyKCkgPT09IE1vZGlmaWVycy5NT0RJRklFUl9OT05FICYmIGtiSXRtLmdldFN0YXRlcygpID09PSAwKVxyXG4gICAgICAgIGFjdCA9IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UT0dHTEVfSU5TRVJUO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAoYWN0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXR0ZXIgZm9yIHRoZSBleGVjU3RhY2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIHN0YWNrPC9yZXR1cm5zPlxyXG4gIGdldEV4ZWNTdGFjaygpOiBFeGVjdXRpb25TdGFjayB7XHJcbiAgICByZXR1cm4gPEV4ZWN1dGlvblN0YWNrPnRoaXMuX2V4ZWNTdGFjay5wZWVrKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHVzaGVzIG9uZSBlbnRyeSBvZiBhbiBvcGVyYXRpb24gaW50byB0aGUgZXhlY3V0aW9uIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tJZFwiPi0gdGhlIGlkIG9mIHRoZSBjdXJyZW50IHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaGFuZGxlcklkXCI+LSB0aGUgaWQgb2YgdGhlIGhhbmRsZXIgd2hpY2ggaG9sZHMgdGhlIHJhaXNlIGV2ZW50IGNvbW1hbmQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9wZXJJZHhcIj4tIHRoZSBpZHggb2YgdGhlIGNvbW1hbmQgd2hpY2ggY3JlYXRlZCBhbiBleGVjdXRpb24gc3RhY2sgZW50cnkgKHJhaXNlIGV2ZW50IG9mIGZ1bmN0aW9uIGNhbGwpPC9wYXJhbT5cclxuICBwdXNoRXhlY1N0YWNrKHRhc2tJZDogc3RyaW5nLCBoYW5kbGVySWQ6IHN0cmluZywgb3BlcklkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX2V4ZWNTdGFjay5wZWVrKCkpLnB1c2goTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRUYXNrSWRCeUlkKHRhc2tJZCksIGhhbmRsZXJJZCwgb3BlcklkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcG9wcyBvbmUgZW50cnkgZnJvbSB0aGUgZXhlY3V0aW9uIHN0YWNrIC0gYWZ0ZXIgdGhlIGNvbXBsZXRpb24gb2YgYW4gb3BlcmF0aW9uIHdoaWNoIGNhbiBob2xkXHJcbiAgLy8vICAgb3RoZXIgb3BlcmF0aW9uc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgZW50cnkgdGhhdCB3YXMgcG9wcGVkPC9yZXR1cm5zPlxyXG4gIHBvcEV4ZWNTdGFjaygpOiBFeGVjdXRpb25TdGFja0VudHJ5IHtcclxuICAgIHJldHVybiAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX2V4ZWNTdGFjay5wZWVrKCkpLnBvcCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHB1c2ggYSBuZXcgZW50cnkgdG8gdGhlIHN0YWNrIG9mIHNlcnZlciBleGVjIHN0YWNrcyAtIHRoaXMgaXMgdG8gZGVmZXIgb3BlcmF0aW9ucyB0aGF0IHNob3VsZCBub3RcclxuICAvLy8gICBnZXQgaW5mbHVlbmNlcyBieSB0aGUgY3VycmVudCBzZXJ2ZXIgZXhlY3V0aW9uIHN0YWNrIC0gd2hlbiBwZXJmb3JtaW5nIHRoZSByZWNvcmQgcHJlZml4IG9mIGEgdGFza1xyXG4gIC8vLyAgIHRoYXQgd2FzIGp1c3QgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyLCBvciB3aGVuIGNhbGxpbmcgYSBtb2RhbCB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdXNoTmV3RXhlY1N0YWNrcygpOiB2b2lkIHtcclxuICAgIHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wdXNoKG51bGwpO1xyXG4gICAgdGhpcy5fZXhlY1N0YWNrLnB1c2gobmV3IEV4ZWN1dGlvblN0YWNrKCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBvcHMgdGhlIG5ldyBlbnRyeSBmcm9tIHRoZSBzdGFjayBvZiBzZXJ2ZXIgZXhlY3V0aW9uIHN0YWNrcyB3aGVuIHRoZSBzZXF1ZW5jZSB0aGF0IG5lZWRzIHRvIGF2b2lkXHJcbiAgLy8vICAgY3VycmVudCBzZXJ2ZXIgZXhlY3V0aW9uIHN0YWNrIGhhcyBlbmRlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcG9wTmV3RXhlY1N0YWNrcygpOiB2b2lkIHtcclxuICAgIHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wb3AoKTtcclxuICAgIHRoaXMuX2V4ZWNTdGFjay5wb3AoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwdXNoZXMgYW4gZXhlY3V0aW9uIHN0YWNrIGVudHJ5IGludG8gdGhlIHNlcnZlciBleGVjIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tJZFwiPi0gdGhlIGlkIG9mIHRoZSB0YXNrIGluIHRoZSBlbnRyeTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJoYW5kbGVySWRcIj4tIGhhbmRsZXIgaWQgb2YgdGhlIGVudHJ5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9wZXJJZHhcIj4tIGlkeCBvZiB0aGUgb3BlcmF0aW9uIHdoaWNoIHRoZSBlbnRyeSByZWZlcnMgdG88L3BhcmFtPlxyXG4gIHB1c2hTZXJ2ZXJFeGVjU3RhY2sodGFza0lkOiBzdHJpbmcsIGhhbmRsZXJJZDogc3RyaW5nLCBvcGVySWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wb3AoKTtcclxuICAgICAgdGhpcy5fc2VydmVyRXhlY1N0YWNrLnB1c2gobmV3IEV4ZWN1dGlvblN0YWNrKCkpO1xyXG4gICAgfVxyXG5cclxuICAgICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSkucHVzaCh0YXNrSWQsIGhhbmRsZXJJZCwgb3BlcklkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2xlYXJzIHRoZSBzZXJ2ZXIgZXhlY3V0aW9uIHN0YWNrIGFmdGVyIHdlIGZvdW5kIHRoZSBjb3JyZWN0IG5leHQgb3BlcmF0aW9uIHRoYXQgd2UgbmVlZCB0byBjb250aW51ZSBmcm9tXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjbGVhclNlcnZlckV4ZWNTdGFjaygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpICE9PSBudWxsKSB7XHJcbiAgICAgICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSkuY2xlYXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXZlcnNlIHRoZSBzZXJ2ZXIgZXhlY3V0aW9uIHN0YWNrIC0gd2UgZ2V0IGl0IGZyb20gdGhlIHNlcnZlciBhbmQgcHVzaCBpdCBpbiB0aGUgc2FtZSBvcmRlclxyXG4gIC8vLyAgIGl0IGlzIHdyaXR0ZW4gaW4gdGhlIG1lc3NhZ2UsIHdoaWNoIGFjdHVhbGx5IG1lYW5zIHdlIGhhdmUgdG8gcmV2ZXJzZSBpdCBpbiBvcmRlciB0byBoYW5kbGUgaXQgY29ycmVjdGx5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXZlcnNlU2VydmVyRXhlY1N0YWNrKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkgIT09IG51bGwpXHJcbiAgICAgICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSkucmV2ZXJzZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNhbGN1bGF0ZSBhY2NvcmRpbmcgdG8gdGhlIHNlcnZlcidzIGV4ZWN1dGlvbiBzdGFjayBhbmQgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIHN0YWNrIG9uIHRoZSBjbGllbnQgK1xyXG4gIC8vLyAgIHRoZSBjdXJyZW50IG9wZXJhdGlvbiB3aGljaCB3ZSBhcmUgb24sIHdoaWNoIGlzIHRoZSBuZXh0IG9wZXJhdGlvbiB0aGF0IHdlIG5lZWQgdG8gZXhlY3V0ZVxyXG4gIC8vLyAgIGluIHRoZSBjdXJyZW50IGhhbmRsZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib3BlclwiPi0gdGhlIG9wZXJhdGlvbiB3aGljaCB3ZSBhcmUgY3VycmVudGx5IG9uPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNsZWFyV2hlbkZvdW5kXCI+aW5kaWNhdGVzIHdoZXRoZXIgd2Ugc2hvdWxkIGNsZWFyIHRoZSBzZXJ2ZXIgc3RhY2sgd2hlbiB3ZSByZWFjaCBpdHMgZW5kLFxyXG4gIC8vLyAgIG9yIGlmIHdlIGp1c3QgdXNpbmcgdGhpcyBtZXRob2QgdG8gY2hlY2sgd2hhdCB0aGUgbmV4dCBvcGVyYXRpb24gaXNcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+cyB0aGUgbmV4dCBvcGVyYXRpb24gdGhhdCBzaG91bGQgYmUgZXhlY3V0ZWQgYnkgdGhlIGNsaWVudFxyXG4gIC8vLyAgIGlmIGl0IHJldHVybnMgLTEgdGhlbiB0aGUgY2xpZW50IHNob3VsZCBjb250aW51ZSBhcyB1c3VhbFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgZ2V0TmV4dE9wZXJJZHgob3BlcjogT3BlcmF0aW9uLCBjbGVhcldoZW5Gb3VuZDogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBsZXQgdG1wU2VydmVyRXhlY1N0YWNrRW50cnk6IEV4ZWN1dGlvblN0YWNrRW50cnkgPSBudWxsO1xyXG4gICAgbGV0IG5leHRPcGVySWR4OiBudW1iZXIgPSAtMTtcclxuXHJcbiAgICAvLyBpZiB0aGUgc2VydmVyIGV4ZWMgc3RhY2sgaXMgZW1wcnkgaXQgbWVhbnMgd2UgZGlkIG5vdCByZXR1cm4gZnJvbSB0aGUgc2VydmVyLFxyXG4gICAgLy8gc28gd2UgaGF2ZSB0byBjb250aW51ZSB3aXRoIGV4ZWN1dGluZyB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbiBpbiB0aGUgY3VycmVudCBoYW5kbGVyIGFzIHVzdWFsXHJcbiAgICBpZiAodGhpcy5fc2VydmVyRXhlY1N0YWNrLmNvdW50KCkgIT09IDAgJiYgdGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSAhPT0gbnVsbCAmJiAhKDxFeGVjdXRpb25TdGFjaz50aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpKS5lbXB0eSgpKSB7XHJcbiAgICAgIC8vIGlmIHRoZSBzZXJ2ZXIncyBleGVjIHN0YWNrIGlzIGRlZXBlciB0aGFuIHRoZSBjbGllbnQncyAtXHJcbiAgICAgIC8vIHdlIG5lZWQgdG8gY2hlY2sgdGhlIGVudHJ5IGluIHRoZSBjbGllbnQncyBzdGFjayB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgc2VydmVyJ3Mgc3RhY2sgc2l6ZVxyXG4gICAgICBpZiAoKDxFeGVjdXRpb25TdGFjaz50aGlzLl9zZXJ2ZXJFeGVjU3RhY2sucGVlaygpKS5zaXplKCkgPiAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX2V4ZWNTdGFjay5wZWVrKCkpLnNpemUoKSkge1xyXG4gICAgICAgIC8vIHdlIGNvcHkgdGhlIHNlcnZlcidzIGV4ZWN1dGlvbiBzdGFjayBhbmQgcG9wIGZyb20gaXQgdW50aWwgdGhlIHNpemUgb2YgdGhlIHNlcnZlclxyXG4gICAgICAgIC8vIGFuZCB0aGUgY2xpZW50IGlzIHRoZSBzYW1lXHJcbiAgICAgICAgbGV0IHRtcFNlcnZlckV4ZWNTdGFjazogRXhlY3V0aW9uU3RhY2sgPSBuZXcgRXhlY3V0aW9uU3RhY2soPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpO1xyXG4gICAgICAgIHdoaWxlICh0bXBTZXJ2ZXJFeGVjU3RhY2suc2l6ZSgpID4gKDxFeGVjdXRpb25TdGFjaz50aGlzLl9leGVjU3RhY2sucGVlaygpKS5zaXplKCkpIHtcclxuICAgICAgICAgIHRtcFNlcnZlckV4ZWNTdGFja0VudHJ5ID0gdG1wU2VydmVyRXhlY1N0YWNrLnBvcCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgYWxsIGVudHJpZXMgYmVmb3JlIHRoZSBsYXN0IG9uZSB3ZSBwb3BwZWQgYXJlIHRoZSBzYW1lIGFzIGluIHRoZSBjbGllbnQgYW5kXHJcbiAgICAgICAgLy8gdGhlIGN1cnJlbnQgZW50cnkgaXMgb24gdGhlIHNhbWUgaGFuZGxlciBhcyB0aGUgc2VydmVyJ3MgbGFzdCBlbnRyeSxcclxuICAgICAgICAvLyBhbmQgdGhlIG9wZXJhdGlvbiBpcyBhZnRlciB0aGUgY3VycmVudCBvcGVyYXRpb24sXHJcbiAgICAgICAgLy8gdGhlbiB0aGlzIGVudHJ5IGluIHRoZSBzZXJ2ZXIgaW5kaWNhdGVzIHdoaWNoIGlzIG91ciBuZXh0IG9wZXJhdGlvblxyXG4gICAgICAgIGlmICh0aGlzLl9leGVjU3RhY2sucGVlaygpLkVxdWFscyh0bXBTZXJ2ZXJFeGVjU3RhY2spICYmIHRtcFNlcnZlckV4ZWNTdGFja0VudHJ5LlRhc2tJZCA9PT0gb3Blci5nZXRUYXNrVGFnKCkgJiYgdG1wU2VydmVyRXhlY1N0YWNrRW50cnkuSGFuZGxlcklkID09PSBvcGVyLmdldEhhbmRsZXJJZCgpICYmIHRtcFNlcnZlckV4ZWNTdGFja0VudHJ5Lk9wZXJJZHggPj0gb3Blci5nZXRTZXJ2ZXJJZCgpKSB7XHJcbiAgICAgICAgICBuZXh0T3BlcklkeCA9IHRtcFNlcnZlckV4ZWNTdGFja0VudHJ5Lk9wZXJJZHg7XHJcblxyXG4gICAgICAgICAgLy8gaWYgdGhlIHNlcnZlciBleGVjIHN0YWNrIGlzIGRlZXBlciB0aGFuIHRoZSBjbGllbnQncyBieSBvbmx5IDEsXHJcbiAgICAgICAgICAvLyB3aGljaCBtZWFucyB3ZSBhcmUgY2hlY2tpbmcgdGhlIHRvcCBtb3N0IGVudHJ5IG9uIHRoZSBzZXJ2ZXIncyBleGVjdXRpb24gc3RhY2ssXHJcbiAgICAgICAgICAvLyB0aGUgd2hvbGUgc3RhY2sgaXMgdGhlIHNhbWUgbm93LCBzbyB3ZSBjYW4gY2xlYXIgdGhlIHNlcnZlcidzIHN0YWNrIC1cclxuICAgICAgICAgIC8vIHdlIGdvdCB0byB0aGUgcG9pbnQgd2hpY2ggd2UgYXJlIG9uIHRoZSBleGFjdCBvcGVyYXRpb24gd2hpY2ggdGhlIHNlcnZlciBsZWZ0IGV4ZWN1dGlvbi5cclxuICAgICAgICAgIGlmIChjbGVhcldoZW5Gb3VuZCAmJiAoPEV4ZWN1dGlvblN0YWNrPnRoaXMuX3NlcnZlckV4ZWNTdGFjay5wZWVrKCkpLnNpemUoKSA9PT0gKDxFeGVjdXRpb25TdGFjaz50aGlzLl9leGVjU3RhY2sucGVlaygpKS5zaXplKCkgKyAxKSB7XHJcbiAgICAgICAgICAgICg8RXhlY3V0aW9uU3RhY2s+dGhpcy5fc2VydmVyRXhlY1N0YWNrLnBlZWsoKSkuY2xlYXIoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgIG5leHRPcGVySWR4ID0gRXZlbnRzTWFuYWdlci5NQVhfT1BFUjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZXh0T3BlcklkeCA9IEV2ZW50c01hbmFnZXIuTUFYX09QRVI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBuZXh0T3BlcklkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHByb2Nlc3NpbmdUb3BNb3N0RW5kVGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpblByb2Nlc3NpbmdUb3BNb3N0RW5kVGFza1wiPjwvcGFyYW0+XHJcbiAgc2V0UHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrKGluUHJvY2Vzc2luZ1RvcE1vc3RFbmRUYXNrOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2sgPSBpblByb2Nlc3NpbmdUb3BNb3N0RW5kVGFzaztcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBwcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFByb2Nlc3NpbmdUb3BNb3N0RW5kVGFzaygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9wcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBBbGxvd0V2ZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJBbGxvd0V2ZW50c1wiPjwvcGFyYW0+XHJcbiAgc2V0QWxsb3dFdmVudHMoQWxsb3dFdmVudHM6IEV2ZW50c0FsbG93ZWRUeXBlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9hbGxvd0V2ZW50cyA9IEFsbG93RXZlbnRzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgQWxsb3dFdmVudHMgZm9yIGEgbm9uIGludGVyYWN0aXZlIHRhc2suXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIkFsbG93RXZlbnRzXCI+PC9wYXJhbT5cclxuICBzZXROb25JbnRlcmFjdGl2ZUFsbG93RXZlbnRzKEFsbG93RXZlbnRzOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoQWxsb3dFdmVudHMpXHJcblxyXG4gICAgICB0aGlzLl9hbGxvd0V2ZW50cyA9IEV2ZW50c0FsbG93ZWRUeXBlLk5PTl9JTlRFUkFDVElWRTtcclxuICAgIC8vIFFDUiAjODAyNDk1LCBUaGUgRm9ybXMgQ29udHJvbGxlciBtZWNoYW5pc20gaXMgZGlzYWJsZSBpZiB3ZSBhcmUgaW4gTm9uIGludGVyYWN0aXZlIHRhc2sgd2l0aCBBbGxvd0V2ZW50cyA9IHRydWUgYW5kIE9wZW4gV2luZG93ID0gdHJ1ZVxyXG5cclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5fYWxsb3dFdmVudHMgPSBFdmVudHNBbGxvd2VkVHlwZS5OT05FO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgQWxsb3dFdmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwid2l0aGluTm9uSW50ZXJhY3RpdmVMb29wXCI+PC9wYXJhbT5cclxuICBnZXRBbGxvd0V2ZW50cygpOiBFdmVudHNBbGxvd2VkVHlwZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dFdmVudHM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmV0dXJuIFRSVUUgaWYgbm8gZXZlbnRzIGFyZSBhbGxvd2VkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIE5vRXZlbnRzQWxsb3dlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9hbGxvd0V2ZW50cyA9PT0gRXZlbnRzQWxsb3dlZFR5cGUuTk9ORTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBhbmQgZXhlY3V0ZSBjb250cm9sIG1vZGlmeSBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImFjdFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVDdHJsTW9kaWZ5KGN0cmw6IE1nQ29udHJvbCwgYWN0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGlmIGNhbm5vdCBtb2RpZnksIGRvIG5vdGhpbmdcclxuICAgIGlmIChjdHJsID09IG51bGwgfHwgIWN0cmwuaXNNb2RpZmlhYmxlKCkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBzd2l0Y2ggKGFjdCkge1xyXG4gICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9FRFRfTlVMTDpcclxuICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9NT0RJRlk6XHJcbiAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVElPTjpcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50O1xyXG4gICAgcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KGN0cmwpO1xyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfTU9ESUZZKTtcclxuICAgIGF3YWl0IHRoaXMuaGFuZGxlRXZlbnQocnRFdnQsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpZiBhY3Rpb24gaXMgYWxsb3dlZCBhY2NvcmRpbmcgdG8gdGhlIEFsbG93ZWRFdmVudHMgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJhY3RcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgQWN0QWxsb3dlZChhY3Q6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGFsbG93ZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgc3dpdGNoICh0aGlzLmdldEFsbG93RXZlbnRzKCkpIHtcclxuICAgICAgY2FzZSBFdmVudHNBbGxvd2VkVHlwZS5BTEw6XHJcbiAgICAgICAgYWxsb3dlZCA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEV2ZW50c0FsbG93ZWRUeXBlLk5PTkU6XHJcbiAgICAgICAgLy8gYWxsb3cgY3JlbGluZSBldmVuIGluIGFsbG93PW5vLiB3ZSBoYXZlIG5vIGNob2ljZS4gUkMgbWVjaGFuaXNtIGlzIGRpZmZlcmVudCB0aGVuIGJhdGNoLiBpdCB1c2VzIEFDVF9DUkVBTElORVxyXG4gICAgICAgIC8vIHdoZW4gaW4gY3JlYXRlIG1vZGUuIFdlIHdpbGwgbmVlZCB0byBjaGFuZ2UgaXQgaW4gdGhlIGZ1dHVyZSBzbyB0aGF0IHdoZW4gdXNlciByYWlzZXMgY3JlbGluZSBldmVudCBpdCB3aWxsIG5vdCB3b3JrLiBqdXN0IGludGVybmFsbHkuXHJcbiAgICAgICAgYWxsb3dlZCA9IChhY3QgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIC8vIE9ubHkgdGhlIGZvbGxvd2luZyBhY3Rpb25zIGFyZSBhbGxvd2VkIHdoZW4gcnVubmluZyBpbnNpZGUgYSBub24gaW50ZXJhY3RpdmUgbG9vcCB3aGVuIGFsbG93IGV2ZW50cyA9IFlFUy5cclxuICAgICAgY2FzZSBFdmVudHNBbGxvd2VkVHlwZS5OT05fSU5URVJBQ1RJVkU6XHJcblxyXG4gICAgICAgIHN3aXRjaCAoYWN0KSB7XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUX1NZU1RFTTpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQ6XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DTE9TRTpcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkU6XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DUkVMSU5FX0FCT1ZFOlxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUk9MTEJBQ0s6XHJcbiAgICAgICAgICAgIGFsbG93ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBhbGxvd2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYWxsb3dlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUaGlzIGZ1bmN0aW9uIGNvbW1pdHMgdGhlIHJlY29yZCBhbmQgdGhlbiBkZXBlbmRpbmcgb24gdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0cmFuc2FjdGlvbiwgaXQgcGVyZm9ybXMgb3RoZXIgYWN0aW9ucy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc1JldmVyc2libGVFeGl0XCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGNvbW1pdFJlY29yZCh0YXNrOiBUYXNrLCBpc1JldmVyc2libGVFeGl0OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZHY6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRhc2suRGF0YVZpZXc7XHJcbiAgICBsZXQgcmVjOiBSZWNvcmQgPSBkdi5nZXRDdXJyUmVjKCk7XHJcblxyXG4gICAgbGV0IGZvcmNlU3VmZml4OiBib29sZWFuID0gYXdhaXQgdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBmYWxzZSk7XHJcbiAgICBsZXQgaXNTZWxlY3Rpb25UYWJsZTogYm9vbGVhbiA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVElPTiwgZmFsc2UpO1xyXG4gICAgbGV0IGlzTmV3UmVjOiBib29sZWFuID0gcmVjLmlzTmV3UmVjKCk7XHJcbiAgICBsZXQgc2F2ZVByZXZDdXJyUmVjOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCByZWNNb2RpZmllZDogYm9vbGVhbiA9IHJlYy5Nb2RpZmllZDtcclxuXHJcbiAgICBpZiAoIWR2LnJlY0luTW9kaWZpZWRUYWIocmVjLmdldElkKCkpKVxyXG4gICAgICByZWMuY2xlYXJGbGFnc0hpc3RvcnkoKTtcclxuICAgIGF3YWl0IHRhc2suVGFza1RyYW5zYWN0aW9uTWFuYWdlci5jaGVja0FuZENvbW1pdChpc1JldmVyc2libGVFeGl0LCBDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYLCB0YXNrLkNvbmZpcm1VcGRhdGVObyk7XHJcbiAgICBpZiAodGFzay50cmFuc2FjdGlvbkZhaWxlZChDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSkge1xyXG4gICAgICAvLyBvbiBmYWlsdXJlIG9mIHRoZSB0cmFuc2FjdGlvbiByZWVudGVyIHRoZSByZWNvcmQgbGV2ZWwgYnlcclxuICAgICAgLy8gZXhlY3V0aW5nIFwicmVjb3JkIHByZWZpeFwiIGZvciB0aGUgc3ViZm9ybXMgd2hpY2ggZXhlY3V0ZWRcclxuICAgICAgLy8gdGhlIHN1ZmZpeCBzdWNjZXNzZnVsbHlcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0YXNrLkRhdGFTeW5jZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2V0U3RvcEV4ZWN1dGlvbihmYWxzZSk7XHJcbiAgICAgICAgYXdhaXQgdGFzay5oYW5kbGVFdmVudE9uU2xhdmVUYXNrcyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCk7XHJcbiAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRhc2suaXNBYm9ydGluZygpKVxyXG4gICAgICB0aGlzLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHJlY01vZGlmaWVkKVxyXG4gICAgICAgIHJlYy5zZXRMYXRlQ29tcHV0ZSh0cnVlKTtcclxuXHJcbiAgICAgIC8vIFFDUiA3ODMwNzEgaWYgYWZ0ZXIgY2hlY2tBbmRDb21taXQgYWxsIGlmIE8uSy4gdGhlXHJcbiAgICAgIC8vIHJldHVybiB0aGUgbGV2ZWwgYmFjayB0byB0YXNrIGxldmVsIGluIG9yZGVyIHRvIGxldCByZWNfcHJmaXggdG8gYmUgZXhlY3V0ZWQuXHJcbiAgICAgIC8vIGV2ZW4gdGhvdWdoIHRoZSB0YXNrIGxldmVsIHNob3VsZCBiZSBUQVNLX0xFVkVMX1RBU0tcclxuICAgICAgLy8gdGhlIGNoZWNrQW5kQ29tbWl0IHByb2Nlc3MgY291bGQgaGF2ZSBjaGFuZ2UgaXRcclxuICAgICAgaWYgKCF0aGlzLl9zdG9wRXhlY3V0aW9uKVxyXG4gICAgICAgIHRhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSyk7XHJcblxyXG4gICAgICByZWMucmVzZXRVcGRhdGVkKCk7XHJcbiAgICAgIHJlYy5yZXNldE1vZGlmaWVkKCk7XHJcblxyXG4gICAgICAvLyBRQ1IgIzk4MzE3ODogY2FuY2VsIHRoZSByZWNvcmQgb25seSBhZnRlciB0aGUgdHJhbnNhY3Rpb25cclxuICAgICAgLy8gaGFuZGxpbmcgd2FzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgYW5kIHRoZSByZWNvcmQgd2Fzbid0XHJcbiAgICAgIC8vIG1vZGlmaWVkXHJcbiAgICAgIGlmICghcmVjTW9kaWZpZWQgJiYgIWZvcmNlU3VmZml4ICYmICghaXNTZWxlY3Rpb25UYWJsZSB8fCAhdGFzay5JblNlbGVjdCkpIHtcclxuICAgICAgICBpZiAoaXNOZXdSZWMpIHtcclxuICAgICAgICAgIC8vIFFDUiAjNDI4OTY1OiBzYXZlIHRoZSBwcmV2aW91cyBjdXJyZW50IHJlY29yZCBCRUZPUkVcclxuICAgICAgICAgIC8vIFwiY2FuY2VsIGVkaXRcIiBzbyB0aGUgY29ycmVjdCByZWNvcmQgaXMgc2F2ZWRcclxuICAgICAgICAgIGR2LnNldFByZXZDdXJyUmVjKCk7XHJcbiAgICAgICAgICBzYXZlUHJldkN1cnJSZWMgPSBmYWxzZTtcclxuICAgICAgICAgIHJlYy5zZXROZXdSZWMoKTtcclxuICAgICAgICAgIGF3YWl0ICg8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpKS5jYW5jZWxFZGl0KGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLkhhbmRsZVN0b3BSb3dFZGl0aW5nKHRhc2spO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIXJlYy5nZXRGb3JjZVNhdmVPcmcoKSlcclxuICAgICAgICAgIGF3YWl0IGR2LmNhbmNlbEVkaXQoRXZlbnRzTWFuYWdlci5SRUFMX09OTFksIHRydWUpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGR2LnNhdmVPcmlnaW5hbCgpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIFFDUiAjOTk1MjIyOiBpZiB0aGUgcmVjb3JkIHdhcyBtb2RpZmllZCB0aGVuIHNhdmUgdGhlXHJcbiAgICAgIC8vIG9yaWdpbmFsIHJlY29yZCBhZ2FpbiBpbiBjYXNlIGEgdGFzayBsYXZlbCB0cmFuc2FjdGlvblxyXG4gICAgICAvLyB3aWxsIGZhaWwgd2l0aCByZXRyeSBzdHJhdGVneS4gQmVmb3JlIHRoaXMgZml4LCBpZiBzdWNoXHJcbiAgICAgIC8vIHRoaW5nIGhhcHBlbmVkIG9uIGEgcmVjb3JkIHdoaWNoIHdhc24ndCB0aGUgZmlyc3QgdGhlblxyXG4gICAgICAvLyB0aGUgXCJiZWdpbiB0YWJsZVwiIGV2ZW50IHJhaXNlZCBhIHJlY29yZCBzdWZmaXggZXZlbnQgYW5kXHJcbiAgICAgIC8vIGNhdXNlZCBcImNhbmNlbCBlZGl0XCIuXHJcbiAgICAgIGVsc2VcclxuICAgICAgICBkdi5zYXZlT3JpZ2luYWwoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2F2ZVByZXZDdXJyUmVjKVxyXG4gICAgICBkdi5zZXRQcmV2Q3VyclJlYygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNhbGxiYWNrIGZvciBpbmNyZW1lbnRhbCBsb2NhdGUgdGltZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGluY0xvY2F0ZVRpbWVyQ0IodGFza09iajogYW55KTogdm9pZCB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IHRhc2tPYmo7XHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzaywgdHJ1ZSk7XHJcblxyXG4gICAgcnRFdnQuc2V0SW50ZXJuYWwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0lOQ1JFTUVOVEFMX0xPQ0FURSk7XHJcbiAgICBydEV2dC5zZXRNYWluUHJnQ3JlYXRvcih0YXNrKTtcclxuICAgIHJ0RXZ0LnNldEN0cmwoPE1nQ29udHJvbD50YXNrLmdldExhc3RQYXJrZWRDdHJsKCkpO1xyXG4gICAgdGhpcy5hZGRUb1RhaWwocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIGRvU3luY0ZvclN1YmZvcm1QYXJlbnQodGFzazogVGFzayk6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGxldCBwYXJlbnRUYXNrOiBUYXNrID0gPFRhc2s+dGFzay5nZXRQYXJlbnQoKTtcclxuICAgIGxldCBwYXJlbnREdiA9IDxEYXRhVmlldz5wYXJlbnRUYXNrLkRhdGFWaWV3O1xyXG4gICAgbGV0IHBhcmVudFJlYzogUmVjb3JkID0gcGFyZW50RHYuZ2V0Q3VyclJlYygpO1xyXG5cclxuICAgIC8vIGRvIG5vdCB0b3VjaCB0aGUgcGFyZW50IHJlY29yZCBpZiB0aGUgcGFyZW50IGRhdGF2aWV3IGlzICdlbXB0eSBkYXRhdmlldycuXHJcbiAgICBpZiAodGFzay5Jc1N1YkZvcm0gJiYgcGFyZW50UmVjICE9IG51bGwgJiYgcGFyZW50UmVjLk1vZGlmaWVkICYmICFwYXJlbnREdi5pc0VtcHR5RGF0YXZpZXcoKSkge1xyXG4gICAgICBwYXJlbnRSZWMuc2V0TW9kZShEYXRhTW9kaWZpY2F0aW9uVHlwZXMuVXBkYXRlKTtcclxuICAgICAgYXdhaXQgcGFyZW50RHYuYWRkQ3VyclRvTW9kaWZpZWQoZmFsc2UpO1xyXG4gICAgICAoKHBhcmVudER2LmdldEN1cnJSZWMoKSkpLlN5bmNlZCA9IHRydWU7XHJcbiAgICAgIHBhcmVudER2LnNldENoYW5nZWQodHJ1ZSk7XHJcbiAgICAgIGxldCBkYXRhVmlld0V4ZWN1dGVMb2NhbFVwZGF0ZXNDb21tYW5kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZURhdGFWaWV3Q29tbWFuZChwYXJlbnRUYXNrLmdldFRhc2tUYWcoKSwgRGF0YVZpZXdDb21tYW5kVHlwZS5FeGVjdXRlTG9jYWxVcGRhdGVzKTtcclxuICAgICAgYXdhaXQgcGFyZW50VGFzay5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZShkYXRhVmlld0V4ZWN1dGVMb2NhbFVwZGF0ZXNDb21tYW5kKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIFByb2Nlc3NBYm9ydGluZ0Vycm9yKGV4OiBBcHBsaWNhdGlvbkV4Y2VwdGlvbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGVNc2c6IHN0cmluZztcclxuICAgIGxldCBlcnJGb3JDb25zb2xlOiBzdHJpbmc7XHJcbiAgICBsZXQgZXJyRm9yTXNnQm94OiBzdHJpbmc7XHJcblxyXG4gICAgaWYgKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpXHJcbiAgICAgIGVNc2cgPSAoPFNlcnZlckVycm9yPmV4KS5HZXRNZXNzYWdlKCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIGVNc2cgPSAoKGV4Lk1lc3NhZ2UgIT09IG51bGwpID8gZXguTWVzc2FnZSA6IGV4LkdldFR5cGUoKSk7XHJcblxyXG4gICAgZXJyRm9yQ29uc29sZSA9IFN0clV0aWwuZ2V0Q29uc29sZUVyb3JTdHJpbmcoZU1zZyk7XHJcbiAgICBlcnJGb3JNc2dCb3ggPSBTdHJVdGlsLmdldE1zZ0JveEVyb3JTdHJpbmcoZU1zZyk7XHJcblxyXG4gICAgaWYgKGV4LklubmVyRXhjZXB0aW9uICE9PSBudWxsKVxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZyhleC5Jbm5lckV4Y2VwdGlvbiwgZXJyRm9yQ29uc29sZSk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKCEoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcikgfHwgTG9nZ2VyLkluc3RhbmNlLkxvZ0xldmVsICE9PSBMb2dnZXJfTG9nTGV2ZWxzLkJhc2ljKSB7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKGVyckZvckNvbnNvbGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETyA6IGhhbmRsZSBlcnJvcnNcclxuICAgIGxldCBzZW5kVW5sb2FkVG9TZXJ2ZXI6IGJvb2xlYW4gPSBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ29udGV4dElEICE9PSBSdW50aW1lQ29udGV4dEJhc2Uubm9Db250ZXh0SWQ7ICAvLyB1bmxvYWQgdGhlIGNvbnRleHQgaW4gdGhlIHNlcnZlciBvbmx5IGlmIGEgY29udGV4dCB3YXMgY3JlYXRlZCBkdXJpbmcgdGhlIGN1cnJlbnQgc2Vzc2lvblxyXG5cclxuICAgIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuY3Vyck1nZElEID0gMDtcclxuXHJcbiAgICBsZXQgbWVzc2FnZVN0cmluZzogc3RyaW5nID0gTGFuZ3VhZ2VEYXRhLkluc3RhbmNlLmdldENvbnN0TWVzc2FnZShNc2dJbnRlcmZhY2UuQlJLVEFCX1NUUl9FUlJPUik7XHJcblxyXG4gICAgbGV0IHN0eWxlOiBudW1iZXIgPSAxNjtcclxuICAgIGlmIChleC5NZXNzYWdlLnN0YXJ0c1dpdGgoJzxIVE1MJykpIHtcclxuICAgICAgdGhpcy5wcm9jZXNzSFRNTENvbnRlbnQoZXguTWVzc2FnZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBUT0RPOiB0ZW1wb3JhcmlseSBzaG93IHRoZSBtZXNzYWdlIGJveFxyXG4gICAgICAvLyBpZGVhbGx5LCB0aGUgY3VycmVudCBwYWdlIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIHRoZSBlcnJvciBwYWdlXHJcbiAgICAgIGlmICh0aGlzLlNob3dFcnJvckluTWVzc2FnZUJveChleCkpIHtcclxuICAgICAgICBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLk1lc3NhZ2VCb3gobWVzc2FnZVN0cmluZywgZXJyRm9yTXNnQm94LCBzdHlsZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3Ipe1xyXG4gICAgICAgIGlmKCg8U2VydmVyRXJyb3I+ZXgpLkdldENvZGUoKSA9PSBTZXJ2ZXJFcnJvci5FUlJfV0VCQ0xJRU5UX1BST0dSQU1fUkVMT0FERUQgfHxcclxuICAgICAgICAgICAoPFNlcnZlckVycm9yPmV4KS5HZXRDb2RlKCkgPT0gU2VydmVyRXJyb3IuRVJSX0VYRUNVVEVEX1BST0dSQU1fQ0hBTkdFRCkge1xyXG4gICAgICAgICAgIENvbW1hbmRzLmFkZEdsb2JhbENvbW1hbmQoQ29tbWFuZFR5cGUuUkVMT0FEX1BBR0UpO1xyXG4gICAgICAgICAgIC8vIE11c3QgY2FsbCBiZWdpbkludm9rZSBoZXJlOyBpbiB0aGUgY2FzZSBhIG5ldyBjb25uZWN0aW9uIHdhcyByZWZ1c2VkLCB0aGUgYmVnaW5JbnZva2UgaXMgbmV2ZXIgY2FsbGVkLCBzbyB3ZVxyXG4gICAgICAgICAgIC8vIG5lZWQgdG8gbWFrZSBzdXJlIGl0IGlzIGNhbGxlZCBoZXJlXHJcbiAgICAgICAgICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBUT0RPOiBIb3cgdG8gY2hlY2sgaWYgaXQgd2FzIENvbm5lY3RGYWlsdXJlIG9yIFByb3RvY29sRXJyb3I/XHJcbiAgICAvLyBJbiBjYXNlIGlmIHdlIGFyZSBhYmxlIHRvIGNvbm5lY3QgdG8gdGhlIHNlcnZlciBpLmUuIHN0YXR1cyBpcyBDb25uZWN0aW9uRmFpbHVyZVxyXG4gICAgLy8gdGhlbiB0aGVyZSBpcyBubyBwb2ludCBpbiBzZW5kaW5nIHVubG9hZCBjb21tYW5kLCBiZWNhdXNlIGl0IHdpbGwgbmV2ZXIgc3VjY2VlZCBhbmRcclxuICAgIC8vIHdlIHdpbGwgaW4gaW5maW5pdGUgbG9vcC5cclxuICAgIC8vIGxldCBmbGFnODogYm9vbGVhbiA9IGV4LklubmVyRXhjZXB0aW9uICE9PSBudWxsICYmIGV4LklubmVyRXhjZXB0aW9uLkdldFR5cGUoKS5GdWxsTmFtZSA9PT0gXCJTeXN0ZW0uTmV0LldlYkV4Y2VwdGlvblwiO1xyXG4gICAgLy8gaWYgKGZsYWc4KSB7XHJcbiAgICAvLyAgIGxldCBleDI6IFdlYkV4Y2VwdGlvbiA9IDxXZWJFeGNlcHRpb24+ZXguSW5uZXJFeGNlcHRpb247XHJcbiAgICAvLyAgIGxldCBmbGFnOTogYm9vbGVhbiA9IGV4Mi5TdGF0dXMgPT09IFdlYkV4Y2VwdGlvblN0YXR1cy5Db25uZWN0RmFpbHVyZSB8fCBleDIuU3RhdHVzID09PSBXZWJFeGNlcHRpb25TdGF0dXMuUHJvdG9jb2xFcnJvcjtcclxuICAgIC8vICAgaWYgKGZsYWc5KSB7XHJcbiAgICAvLyAgICAgc2VuZFVubG9hZFRvU2VydmVyID0gZmFsc2U7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICBpZiAoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcikge1xyXG4gICAgICAvLyBJZiB0aGUgY29udGV4dCB3YXMgbm90IGZvdW5kLCBvciB0aGUgcHJvZ3JhbSBpcyByZWxvYWRlZCBieSB0aGUgc2VydmVyLCBubyBwb2ludCBpbiB0cnlpbmcgdG8gdW5sb2FkIGl0XHJcbiAgICAgIGlmICgoPFNlcnZlckVycm9yPmV4KS5HZXRDb2RlKCkgPT09IFNlcnZlckVycm9yLkVSUl9DVFhfTk9UX0ZPVU5EIHx8XHJcbiAgICAgICAgICAoPFNlcnZlckVycm9yPmV4KS5HZXRDb2RlKCkgPT09IFNlcnZlckVycm9yLkVSUl9XRUJDTElFTlRfUFJPR1JBTV9SRUxPQURFRCB8fFxyXG4gICAgICAgICAgKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09PSBTZXJ2ZXJFcnJvci5FUlJfRVhFQ1VURURfUFJPR1JBTV9DSEFOR0VEKSB7XHJcbiAgICAgICAgc2VuZFVubG9hZFRvU2VydmVyID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2VuZFVubG9hZFRvU2VydmVyKSB7XHJcbiAgICAgIC8vIHRlbGwgdGhlIHNlcnZlciB0byBjbG9zZSB0aGUgcnVudGltZS5cclxuICAgICAgLy8gSWYgd2UgdGVybWluYXRlIFJURSBhbmQgdGhlbiBjbG9zZSBSQyB3aW5kb3cgdGhlbiBhbHNvIHdlIHdpbGwgYmVcclxuICAgICAgLy8gUHJvY2Vzc2luZyBBYm9ydCBlcnJvciBpbiB0aGF0IGNhc2Ugc2VydmVyIGlzIGFscmVhZHkgY2xvc2VkIHNvIGNhdGNoIHRoZSBleGNlcHRpb24uXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVVbmxvYWRDb21tYW5kKCk7XHJcbiAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRNR0RhdGEoMCkuQ21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgICAgIGF3YWl0IENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICB9IGNhdGNoIChleDMpIHtcclxuICAgICAgICBpZiAoZXgzIGluc3RhbmNlb2YgQXBwbGljYXRpb25FeGNlcHRpb24pIHtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nKGV4Myk7XHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICB0aHJvdyBleDM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBHVUlNYW5hZ2VyLkluc3RhbmNlLmFib3J0KCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJvY2Vzc0hUTUxDb250ZW50KGh0bWxDb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIENvbW1hbmRzLmFkZFNob3dIVE1MRXJyb3IoQ29tbWFuZFR5cGUuU0hPV19IVE1MX0VSUk9SLCBodG1sQ29udGVudCk7XHJcbiAgICBDb21tYW5kcy5iZWdpbkludm9rZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gVGhpcyBtZXRob2QgZGVjaWRlcyBpZiB0aGUgZXJyb3IgaGFuZGxlZCBpbiBQcm9jZXNzQWJvcnRpbmdFcnJvciB3aWxsIG9wZW4gYSBtZXNzYWdlIGJveFxyXG4gIFNob3dFcnJvckluTWVzc2FnZUJveChleDogQXBwbGljYXRpb25FeGNlcHRpb24pOiBib29sZWFuIHtcclxuICAgIGlmKCEoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcikpXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgIC8vIGlmIGNoYW5nZXMgaW4gdGhlIHN0dWRpbyBjYXVzZSBhIHJlbG9hZCwgc2hvdyB0aGUgbWVzc2FnZWJveCBvbmx5IGlmIHRoZSB1c2VyIHRyaWVkIHRvXHJcbiAgICAvLyBjb250aW51ZSB3b3JraW5nIHdpdGggYW4gb2xkIGNvbnRleHRcclxuICAgIGlmKCgoPFNlcnZlckVycm9yPmV4KS5HZXRDb2RlKCkgPT0gU2VydmVyRXJyb3IuRVJSX0VYRUNVVEVEX1BST0dSQU1fQ0hBTkdFRCB8fFxyXG4gICAgICAgKDxTZXJ2ZXJFcnJvcj5leCkuR2V0Q29kZSgpID09IFNlcnZlckVycm9yLkVSUl9XRUJDTElFTlRfUFJPR1JBTV9SRUxPQURFRCkgJiZcclxuICAgICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ29udGV4dElEID09PSBSdW50aW1lQ29udGV4dEJhc2Uubm9Db250ZXh0SWQpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbn1cclxuIl19