@burgan-tech/morph-touch-runtime 0.0.7 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/burgan-tech-morph-touch-runtime-0.0.9.tgz +0 -0
- package/morph-touch/Functions/get-absence-entry.1.0.0.json +1 -1
- package/morph-touch/Functions/get-advisor-stats.1.0.0.json +1 -1
- package/morph-touch/Functions/get-available-slots.1.0.0.json +1 -1
- package/morph-touch/Functions/get-chat-rooms.http +4 -4
- package/morph-touch/Functions/get-rezervations.1.0.0.json +1 -1
- package/morph-touch/Functions/src/GetAbsenceEntryMapping.csx +18 -4
- package/morph-touch/Functions/src/GetAdvisorStatsMapping.csx +22 -8
- package/morph-touch/Functions/src/GetAvailableSlotsMapping.csx +22 -14
- package/morph-touch/Functions/src/GetRezervationsMapping.csx +19 -2
- package/morph-touch/Functions/src/SendCancelNotificationMapping.csx +27 -2
- package/morph-touch/Tasks/check-existing-permanent-chat-room.1.0.0.json +1 -1
- package/morph-touch/Tasks/login-for-chat.1.0.0.json +27 -0
- package/morph-touch/Tasks/register-for-chat.1.0.0.json +27 -0
- package/morph-touch/Tasks/start-register-matrix-user.1.0.0.json +22 -0
- package/morph-touch/Workflows/chat-room.json +196 -14
- package/morph-touch/Workflows/notification-sender.json +2 -2
- package/morph-touch/Workflows/register-matrix-user.json +128 -0
- package/morph-touch/Workflows/rezervation-start.json +28 -2
- package/morph-touch/Workflows/rezervation-transfer.json +34 -8
- package/morph-touch/Workflows/rezervation-update.json +5 -5
- package/morph-touch/Workflows/rezervation.json +135 -45
- package/morph-touch/Workflows/src/AlwaysTrueRule.csx +0 -3
- package/morph-touch/Workflows/src/CanStartRezervationTimerMapping.csx +18 -3
- package/morph-touch/Workflows/src/ChatRoomRemoveMapping.csx +10 -1
- package/morph-touch/Workflows/src/ChatRoomTransferInviteMapping.csx +10 -1
- package/morph-touch/Workflows/src/ChatRoomTransferRemoveMapping.csx +9 -1
- package/morph-touch/Workflows/src/ChatRoomUpdateMapping.csx +10 -1
- package/morph-touch/Workflows/src/CheckDuplicateRezervationMapping.csx +17 -3
- package/morph-touch/Workflows/src/CheckExistingPermanentChatRoomMapping.csx +4 -7
- package/morph-touch/Workflows/src/CheckRandevuTimeMapping.csx +16 -2
- package/morph-touch/Workflows/src/CreateChatRoomForRezervationMapping.csx +12 -2
- package/morph-touch/Workflows/src/CreatePermanentChatRoomMapping.csx +11 -1
- package/morph-touch/Workflows/src/EnrichRezervationsForTransferMapping.csx +18 -4
- package/morph-touch/Workflows/src/FetchRoomMessagesForSummaryMapping.csx +10 -2
- package/morph-touch/Workflows/src/InviteAdvisorForRandevuUpdateMapping.csx +10 -1
- package/morph-touch/Workflows/src/InviteNewAdvisorToRezervationRoomMapping.csx +11 -2
- package/morph-touch/Workflows/src/InviteNewParticipantToRandevuRoomMapping.csx +10 -1
- package/morph-touch/Workflows/src/JoinChatRoomForAddParticipantMapping.csx +5 -1
- package/morph-touch/Workflows/src/JoinChatRoomForRandevuStartMapping.csx +5 -1
- package/morph-touch/Workflows/src/JoinChatRoomForRezervationMapping.csx +4 -0
- package/morph-touch/Workflows/src/JoinMatrixRoomMapping.csx +11 -1
- package/morph-touch/Workflows/src/JoinUserToRoomMapping.csx +6 -0
- package/morph-touch/Workflows/src/LoginForAddParticipantChatMapping.csx +35 -6
- package/morph-touch/Workflows/src/LoginForChatRoomMapping.csx +121 -0
- package/morph-touch/Workflows/src/LoginForJoinUserToRoomMapping.csx +142 -0
- package/morph-touch/Workflows/src/LoginForRandevuStartChatMapping.csx +35 -10
- package/morph-touch/Workflows/src/LoginForTransferChatMapping.csx +153 -0
- package/morph-touch/Workflows/src/RegisterForAddParticipantChatMapping.csx +74 -0
- package/morph-touch/Workflows/src/RegisterForChatRoomMapping.csx +52 -0
- package/morph-touch/Workflows/src/RegisterForJoinUserToRoomMapping.csx +63 -0
- package/morph-touch/Workflows/src/RegisterForRandevuStartChatMapping.csx +56 -0
- package/morph-touch/Workflows/src/RegisterForTransferChatMapping.csx +90 -0
- package/morph-touch/Workflows/src/RegisterMatrixUserMapping.csx +73 -0
- package/morph-touch/Workflows/src/SendPushNotificationMapping.csx +25 -4
- package/morph-touch/Workflows/src/SendSmsNotificationMapping.csx +25 -4
- package/morph-touch/Workflows/src/SendSummaryToNewRoomMapping.csx +10 -2
- package/morph-touch/Workflows/src/SetRoomHistoryVisibilityMapping.csx +12 -4
- package/morph-touch/Workflows/src/ValidateDateForRezervationMapping.csx +16 -2
- package/morph-touch/Workflows/src/ValidateSlotForRandevuUpdateMapping.csx +22 -15
- package/morph-touch/Workflows/src/ValidateSlotForRezervationMapping.csx +23 -16
- package/morph-touch/Workflows/src/ValidateTransferMapping.csx +16 -2
- package/morph-touch/Workflows/start-chat.json +1 -1
- package/morph-touch/doc/morph-touch-domain.en.md +1 -1
- package/morph-touch/doc/morph-touch-domain.md +1 -1
- package/package.json +1 -1
- package/vnext.config.json +1 -1
- package/burgan-tech-morph-touch-runtime-0.0.7.tgz +0 -0
|
Binary file
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
"mapping": {
|
|
23
23
|
"location": "./src/GetAbsenceEntryMapping.csx",
|
|
24
|
-
"code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CnVzaW5nIEJCVC5Xb3JrZmxvdy5EZWZpbml0aW9uczsKLy8vIDxzdW1tYXJ5PgovLy8gTWFwcGluZyBmb3IgR2V0QWJzZW5jZUVudHJ5VGFzayAoRGFwclNlcnZpY2VUYXNrIC0gVHlwZSAzKQovLy8gUXVlcmllcyBhYnNlbmNlLWVudHJ5IHdvcmtmbG93IGluc3RhbmNlcyBpbiBjb21wbGV0ZSBzdGF0ZSwgZmlsdGVyZWQgYnkgYWJzZW5jZVR5cGUuCi8vLwovLy8gUXVlcnkgcGFyYW1ldGVyczoKLy8vICAgLSBhYnNlbmNlVHlwZSAocmVxdWlyZWQpOiAicHVibGljLWhvbGlkYXkiIHwgInBlcnNvbmFsLWxlYXZlIiB8ICJ3b3JraW5nLWhvdXJzLWNoYW5nZSIgfCAicmV6ZXJ2YXRpb24iCi8vLyAgIC0gc3RhcnREYXRlIChvcHRpb25hbCwgcHVibGljLWhvbGlkYXkvcGVyc29uYWwtbGVhdmUvcmV6ZXJ2YXRpb24pOiBmaWx0ZXIgc3RhcnREYXRlVGltZSA+PSB2YWx1ZQovLy8gICAtIGVuZERhdGUgKG9wdGlvbmFsLCBwdWJsaWMtaG9saWRheS9wZXJzb25hbC1sZWF2ZS9yZXplcnZhdGlvbik6IGZpbHRlciBlbmREYXRlVGltZSA8PSB2YWx1ZQovLy8gICAtIGFkdmlzb3IgKG9wdGlvbmFsLCBwZXJzb25hbC1sZWF2ZS93b3JraW5nLWhvdXJzLWNoYW5nZS9yZXplcnZhdGlvbik6IGZpbHRlciBieSBhZHZpc29yCi8vLyAgIC0gcGFnZVNpemUgKG9wdGlvbmFsLCBkZWZhdWx0IDEwMCkKLy8vCi8vLyBOb3RlOiBEYXRlIGZpbHRlcmluZyAoc3RhcnREYXRlL2VuZERhdGUpIGlzIHBlcmZvcm1lZCBjbGllbnQtc2lkZSBpbiBPdXRwdXRIYW5kbGVyCi8vLyBiZWNhdXNlIHRoZSBwbGF0Zm9ybSBBUEkgZG9lcyBub3Qgc3VwcG9ydCBndGUvbHRlIG9wZXJhdG9ycyBvbiBhdHRyaWJ1dGUgZmllbGRzLgovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgR2V0QWJzZW5jZUVudHJ5TWFwcGluZyA6IFNjcmlwdEJhc2UsIElNYXBwaW5nCnsKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB2YXIgc2VydmljZVRhc2sgPSB0YXNrIGFzIERhcHJTZXJ2aWNlVGFzazsKICAgICAgICBpZiAoc2VydmljZVRhc2sgPT0gbnVsbCkKICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRhc2sgbXVzdCBiZSBhIERhcHJTZXJ2aWNlVGFzayIpOwoKICAgICAgICB2YXIgYXBwSWQgPSBHZXRDb25maWdWYWx1ZSgiREFQUl9BUFBfSUQiKTsKICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGFwcElkKSkKICAgICAgICAgICAgc2VydmljZVRhc2suU2V0QXBwSWQoYXBwSWQpOwoKICAgICAgICB2YXIgYWJzZW5jZVR5cGUgPSBSZWFkUGFyYW0oY29udGV4dCwgImFic2VuY2VUeXBlIik7CgogICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShhYnNlbmNlVHlwZSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAidmFsaWRhdGlvbi1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAiYWJzZW5jZVR5cGUgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9ICJWQUxJREFUSU9OX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICB2YWxpZFZhbHVlcyA9IG5ld1tdIHsgInB1YmxpYy1ob2xpZGF5IiwgInBlcnNvbmFsLWxlYXZlIiwgIndvcmtpbmctaG91cnMtY2hhbmdlIiwgInJlemVydmF0aW9uIiB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgdmFyIHZhbGlkVHlwZXMgPSBuZXdbXSB7ICJwdWJsaWMtaG9saWRheSIsICJwZXJzb25hbC1sZWF2ZSIsICJ3b3JraW5nLWhvdXJzLWNoYW5nZSIsICJyZXplcnZhdGlvbiIgfTsKICAgICAgICBib29sIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICBmb3JlYWNoICh2YXIgdnQgaW4gdmFsaWRUeXBlcykKICAgICAgICB7CiAgICAgICAgICAgIGlmICh2dCA9PSBhYnNlbmNlVHlwZSkgeyBpc1ZhbGlkID0gdHJ1ZTsgYnJlYWs7IH0KICAgICAgICB9CgogICAgICAgIGlmICghaXNWYWxpZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJ2YWxpZGF0aW9uLWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJJbnZhbGlkIGFic2VuY2VUeXBlIHZhbHVlIiwKICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiVkFMSURBVElPTl9FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgPSBhYnNlbmNlVHlwZSwKICAgICAgICAgICAgICAgICAgICB2YWxpZFZhbHVlcyA9IHZhbGlkVHlwZXMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgYWR2aXNvciA9IFJlYWRQYXJhbShjb250ZXh0LCAiYWR2aXNvciIpOwoKICAgICAgICB2YXIgcGFnZVNpemVTdHIgPSBSZWFkUGFyYW0oY29udGV4dCwgInBhZ2VTaXplIik7CiAgICAgICAgaW50IHBhZ2VTaXplID0gMTAwOwogICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkocGFnZVNpemVTdHIpKQogICAgICAgIHsKICAgICAgICAgICAgaW50IHBhcnNlZCA9IDA7CiAgICAgICAgICAgIGlmIChpbnQuVHJ5UGFyc2UocGFnZVNpemVTdHIsIG91dCBwYXJzZWQpICYmIHBhcnNlZCA+IDApCiAgICAgICAgICAgICAgICBwYWdlU2l6ZSA9IHBhcnNlZDsKICAgICAgICB9CgogICAgICAgIHZhciBjb25kaXRpb25zID0gbmV3IExpc3Q8c3RyaW5nPigpOwoKICAgICAgICBjb25kaXRpb25zLkFkZCgie1wiYXR0cmlidXRlc1wiOntcImFic2VuY2VUeXBlXCI6e1wiZXFcIjpcIiIgKyBhYnNlbmNlVHlwZSArICJcIn19fSIpOwoKICAgICAgICBpZiAoYWJzZW5jZVR5cGUgPT0gIndvcmtpbmctaG91cnMtY2hhbmdlIikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoYWR2aXNvcikpCiAgICAgICAgICAgICAgICBjb25kaXRpb25zLkFkZCgie1wia2V5XCI6e1wiZXFcIjpcIndvcmtpbmctaG91ci0iICsgYWR2aXNvciArICJcIn19Iik7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMuQWRkKCJ7XCJrZXlcIjp7XCJlcVwiOlwid29ya2luZy1ob3VyXCJ9fSIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKChhYnNlbmNlVHlwZSA9PSAicGVyc29uYWwtbGVhdmUiIHx8IGFic2VuY2VUeXBlID09ICJyZXplcnZhdGlvbiIpICYmICFzdHJpbmcuSXNOdWxsT3JFbXB0eShhZHZpc29yKSkKICAgICAgICAgICAgY29uZGl0aW9ucy5BZGQoIntcImF0dHJpYnV0ZXNcIjp7XCJhZHZpc29yXCI6e1wiZXFcIjpcIiIgKyBhZHZpc29yICsgIlwifX19Iik7CgogICAgICAgIHZhciBmaWx0ZXJKc29uID0gIntcImFuZFwiOlsiICsgc3RyaW5nLkpvaW4oIiwiLCBjb25kaXRpb25zKSArICJdfSI7CgogICAgICAgIHZhciBxdWVyeVBhcmFtcyA9IG5ldyBMaXN0PHN0cmluZz4KICAgICAgICB7CiAgICAgICAgICAgICJwYWdlU2l6ZT0iICsgcGFnZVNpemUsCiAgICAgICAgICAgICJjdXJyZW50U3RhdGU9Y29tcGxldGUiLAogICAgICAgICAgICAiZmlsdGVyPSIgKyBmaWx0ZXJKc29uCiAgICAgICAgfTsKCiAgICAgICAgc2VydmljZVRhc2suU2V0UXVlcnlTdHJpbmcoc3RyaW5nLkpvaW4oIiYiLCBxdWVyeVBhcmFtcykpOwoKICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZSgpKTsKICAgIH0KCiAgICBwdWJsaWMgYXN5bmMgVGFzazxTY3JpcHRSZXNwb25zZT4gT3V0cHV0SGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgYWJzZW5jZVR5cGUgPSBSZWFkUGFyYW0oY29udGV4dCwgImFic2VuY2VUeXBlIik7CiAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGNvbnRleHQuQm9keTsKCiAgICAgICAgICAgIGlmIChyZXNwb25zZT8uaXNTdWNjZXNzID09IGZhbHNlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gInNlcnZpY2UtZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gIkZhaWxlZCB0byBmZXRjaCBhYnNlbmNlIGVudHJpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiU0VSVklDRV9FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IHJlc3BvbnNlPy5lcnJvck1lc3NhZ2U/LlRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VJbmZvID0gbmV3CiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcElkID0gcmVzcG9uc2U/Lm1ldGFkYXRhPy5hcHBJZD8uVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSByZXNwb25zZT8ubWV0YWRhdGE/Lm1ldGhvZE5hbWU/LlRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwVmVyYiA9IHJlc3BvbnNlPy5tZXRhZGF0YT8uaHR0cFZlcmI/LlRvU3RyaW5nKCkKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImFic2VuY2UtZW50cnkiLCAiZXJyb3IiIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZXNwb25zZURhdGEgPSByZXNwb25zZT8uZGF0YTsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gcmVzcG9uc2VEYXRhPy5pdGVtczsKCiAgICAgICAgICAgIGJvb2wgc3VwcG9ydHNEYXRlRmlsdGVyID0gKGFic2VuY2VUeXBlID09ICJwdWJsaWMtaG9saWRheSIgfHwgYWJzZW5jZVR5cGUgPT0gInBlcnNvbmFsLWxlYXZlIiB8fCBhYnNlbmNlVHlwZSA9PSAicmV6ZXJ2YXRpb24iKTsKICAgICAgICAgICAgdmFyIHN0YXJ0RGF0ZVN0ciA9IFJlYWRQYXJhbShjb250ZXh0LCAic3RhcnREYXRlIik7CiAgICAgICAgICAgIHZhciBlbmREYXRlU3RyID0gUmVhZFBhcmFtKGNvbnRleHQsICJlbmREYXRlIik7CgogICAgICAgICAgICBpZiAoc3VwcG9ydHNEYXRlRmlsdGVyICYmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RhcnREYXRlU3RyKSB8fCAhc3RyaW5nLklzTnVsbE9yRW1wdHkoZW5kRGF0ZVN0cikpICYmIGl0ZW1zICE9IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGVUaW1lIHN0YXJ0RGF0ZUZpbHRlciA9IGRlZmF1bHQ7CiAgICAgICAgICAgICAgICBEYXRlVGltZSBlbmREYXRlRmlsdGVyID0gZGVmYXVsdDsKICAgICAgICAgICAgICAgIGJvb2wgaGFzU3RhcnRGaWx0ZXIgPSAhc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RhcnREYXRlU3RyKSAmJiBEYXRlVGltZS5UcnlQYXJzZShzdGFydERhdGVTdHIsIG91dCBzdGFydERhdGVGaWx0ZXIpOwogICAgICAgICAgICAgICAgYm9vbCBoYXNFbmRGaWx0ZXIgPSAhc3RyaW5nLklzTnVsbE9yRW1wdHkoZW5kRGF0ZVN0cikgJiYgRGF0ZVRpbWUuVHJ5UGFyc2UoZW5kRGF0ZVN0ciwgb3V0IGVuZERhdGVGaWx0ZXIpOwoKICAgICAgICAgICAgICAgIHZhciBmaWx0ZXJlZEl0ZW1zID0gbmV3IExpc3Q8ZHluYW1pYz4oKTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKGR5bmFtaWMgaXRlbSBpbiBpdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cnMgPSBpdGVtPy5hdHRyaWJ1dGVzOwogICAgICAgICAgICAgICAgICAgIGlmIChhdHRycyA9PSBudWxsKSBjb250aW51ZTsKCiAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZW1TdGFydFN0ciA9IGF0dHJzPy5zdGFydERhdGVUaW1lPy5Ub1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVtRW5kU3RyID0gYXR0cnM/LmVuZERhdGVUaW1lPy5Ub1N0cmluZygpOwoKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZSBpdGVtU3RhcnQgPSBkZWZhdWx0OwogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lIGl0ZW1FbmQgPSBkZWZhdWx0OwogICAgICAgICAgICAgICAgICAgIGJvb2wgcGFyc2VkU3RhcnQgPSAhc3RyaW5nLklzTnVsbE9yRW1wdHkoaXRlbVN0YXJ0U3RyKSAmJiBEYXRlVGltZS5UcnlQYXJzZShpdGVtU3RhcnRTdHIsIG91dCBpdGVtU3RhcnQpOwogICAgICAgICAgICAgICAgICAgIGJvb2wgcGFyc2VkRW5kID0gIXN0cmluZy5Jc051bGxPckVtcHR5KGl0ZW1FbmRTdHIpICYmIERhdGVUaW1lLlRyeVBhcnNlKGl0ZW1FbmRTdHIsIG91dCBpdGVtRW5kKTsKCiAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1N0YXJ0RmlsdGVyICYmIHBhcnNlZFN0YXJ0ICYmIGl0ZW1TdGFydCA8IHN0YXJ0RGF0ZUZpbHRlcikKICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzRW5kRmlsdGVyICYmIHBhcnNlZEVuZCAmJiBpdGVtRW5kID4gZW5kRGF0ZUZpbHRlcikKICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZSkKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJdGVtcy5BZGQoaXRlbSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9ICJhYnNlbmNlLWVudHJ5LXN1Y2Nlc3MiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFic2VuY2VUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyA9IGZpbHRlcmVkSXRlbXMKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXcgc3RyaW5nW10geyAiYWJzZW5jZS1lbnRyeSIsIGFic2VuY2VUeXBlID8/ICIiLCAic3VjY2VzcyIgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAiYWJzZW5jZS1lbnRyeS1zdWNjZXNzIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhYnNlbmNlVHlwZSwKICAgICAgICAgICAgICAgICAgICBpdGVtcwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXcgc3RyaW5nW10geyAiYWJzZW5jZS1lbnRyeSIsIGFic2VuY2VUeXBlID8/ICIiLCAic3VjY2VzcyIgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAib3V0cHV0LWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJJbnRlcm5hbCBwcm9jZXNzaW5nIGVycm9yIiwKICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiUFJPQ0VTU0lOR19FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgZXJyb3JEZXNjcmlwdGlvbiA9IGV4Lk1lc3NhZ2UKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiYWJzZW5jZS1lbnRyeSIsICJlcnJvciIgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHN0cmluZyBSZWFkUGFyYW0oU2NyaXB0Q29udGV4dCBjb250ZXh0LCBzdHJpbmcgbmFtZSkKICAgIHsKICAgICAgICBpZiAoY29udGV4dC5RdWVyeVBhcmFtZXRlcnMgPT0gbnVsbCB8fCAhSGFzUHJvcGVydHkoY29udGV4dC5RdWVyeVBhcmFtZXRlcnMsIG5hbWUpKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB2YXIgdmFsID0gY29udGV4dC5RdWVyeVBhcmFtZXRlcnNbbmFtZV07CiAgICAgICAgcmV0dXJuIHZhbCAhPSBudWxsID8gdmFsLlRvU3RyaW5nKCkgOiBudWxsOwogICAgfQp9Cg=="
|
|
24
|
+
"code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CnVzaW5nIEJCVC5Xb3JrZmxvdy5EZWZpbml0aW9uczsKLy8vIDxzdW1tYXJ5PgovLy8gTWFwcGluZyBmb3IgR2V0QWJzZW5jZUVudHJ5VGFzayAoRGFwclNlcnZpY2VUYXNrIC0gVHlwZSAzKQovLy8gUXVlcmllcyBhYnNlbmNlLWVudHJ5IHdvcmtmbG93IGluc3RhbmNlcyBpbiBjb21wbGV0ZSBzdGF0ZSwgZmlsdGVyZWQgYnkgYWJzZW5jZVR5cGUuCi8vLwovLy8gUXVlcnkgcGFyYW1ldGVyczoKLy8vICAgLSBhYnNlbmNlVHlwZSAocmVxdWlyZWQpOiAicHVibGljLWhvbGlkYXkiIHwgInBlcnNvbmFsLWxlYXZlIiB8ICJ3b3JraW5nLWhvdXJzLWNoYW5nZSIgfCAicmV6ZXJ2YXRpb24iCi8vLyAgIC0gc3RhcnREYXRlIChvcHRpb25hbCwgcHVibGljLWhvbGlkYXkvcGVyc29uYWwtbGVhdmUvcmV6ZXJ2YXRpb24pOiBmaWx0ZXIgc3RhcnREYXRlVGltZSA+PSB2YWx1ZQovLy8gICAtIGVuZERhdGUgKG9wdGlvbmFsLCBwdWJsaWMtaG9saWRheS9wZXJzb25hbC1sZWF2ZS9yZXplcnZhdGlvbik6IGZpbHRlciBlbmREYXRlVGltZSA8PSB2YWx1ZQovLy8gICAtIGFkdmlzb3IgKG9wdGlvbmFsLCBwZXJzb25hbC1sZWF2ZS93b3JraW5nLWhvdXJzLWNoYW5nZS9yZXplcnZhdGlvbik6IGZpbHRlciBieSBhZHZpc29yCi8vLyAgIC0gcGFnZVNpemUgKG9wdGlvbmFsLCBkZWZhdWx0IDEwMCkKLy8vCi8vLyBOb3RlOiBEYXRlIGZpbHRlcmluZyAoc3RhcnREYXRlL2VuZERhdGUpIGlzIHBlcmZvcm1lZCBjbGllbnQtc2lkZSBpbiBPdXRwdXRIYW5kbGVyCi8vLyBiZWNhdXNlIHRoZSBwbGF0Zm9ybSBBUEkgZG9lcyBub3Qgc3VwcG9ydCBndGUvbHRlIG9wZXJhdG9ycyBvbiBhdHRyaWJ1dGUgZmllbGRzLgovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgR2V0QWJzZW5jZUVudHJ5TWFwcGluZyA6IFNjcmlwdEJhc2UsIElNYXBwaW5nCnsKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB2YXIgc2VydmljZVRhc2sgPSB0YXNrIGFzIERhcHJTZXJ2aWNlVGFzazsKICAgICAgICBpZiAoc2VydmljZVRhc2sgPT0gbnVsbCkKICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRhc2sgbXVzdCBiZSBhIERhcHJTZXJ2aWNlVGFzayIpOwoKICAgICAgICB2YXIgYXBwSWQgPSBHZXRDb25maWdWYWx1ZSgiREFQUl9BUFBfSUQiKTsKICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGFwcElkKSkKICAgICAgICAgICAgc2VydmljZVRhc2suU2V0QXBwSWQoYXBwSWQpOwoKICAgICAgICB2YXIgYWJzZW5jZVR5cGUgPSBSZWFkUGFyYW0oY29udGV4dCwgImFic2VuY2VUeXBlIik7CgogICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShhYnNlbmNlVHlwZSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAidmFsaWRhdGlvbi1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAiYWJzZW5jZVR5cGUgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9ICJWQUxJREFUSU9OX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICB2YWxpZFZhbHVlcyA9IG5ld1tdIHsgInB1YmxpYy1ob2xpZGF5IiwgInBlcnNvbmFsLWxlYXZlIiwgIndvcmtpbmctaG91cnMtY2hhbmdlIiwgInJlemVydmF0aW9uIiB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgdmFyIHZhbGlkVHlwZXMgPSBuZXdbXSB7ICJwdWJsaWMtaG9saWRheSIsICJwZXJzb25hbC1sZWF2ZSIsICJ3b3JraW5nLWhvdXJzLWNoYW5nZSIsICJyZXplcnZhdGlvbiIgfTsKICAgICAgICBib29sIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICBmb3JlYWNoICh2YXIgdnQgaW4gdmFsaWRUeXBlcykKICAgICAgICB7CiAgICAgICAgICAgIGlmICh2dCA9PSBhYnNlbmNlVHlwZSkgeyBpc1ZhbGlkID0gdHJ1ZTsgYnJlYWs7IH0KICAgICAgICB9CgogICAgICAgIGlmICghaXNWYWxpZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJ2YWxpZGF0aW9uLWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJJbnZhbGlkIGFic2VuY2VUeXBlIHZhbHVlIiwKICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiVkFMSURBVElPTl9FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgPSBhYnNlbmNlVHlwZSwKICAgICAgICAgICAgICAgICAgICB2YWxpZFZhbHVlcyA9IHZhbGlkVHlwZXMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgYWR2aXNvciA9IFJlYWRQYXJhbShjb250ZXh0LCAiYWR2aXNvciIpOwoKICAgICAgICB2YXIgcGFnZVNpemVTdHIgPSBSZWFkUGFyYW0oY29udGV4dCwgInBhZ2VTaXplIik7CiAgICAgICAgaW50IHBhZ2VTaXplID0gMTAwOwogICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkocGFnZVNpemVTdHIpKQogICAgICAgIHsKICAgICAgICAgICAgaW50IHBhcnNlZCA9IDA7CiAgICAgICAgICAgIGlmIChpbnQuVHJ5UGFyc2UocGFnZVNpemVTdHIsIG91dCBwYXJzZWQpICYmIHBhcnNlZCA+IDApCiAgICAgICAgICAgICAgICBwYWdlU2l6ZSA9IHBhcnNlZDsKICAgICAgICB9CgogICAgICAgIHZhciBjb25kaXRpb25zID0gbmV3IExpc3Q8c3RyaW5nPigpOwoKICAgICAgICBjb25kaXRpb25zLkFkZCgie1wiYXR0cmlidXRlc1wiOntcImFic2VuY2VUeXBlXCI6e1wiZXFcIjpcIiIgKyBhYnNlbmNlVHlwZSArICJcIn19fSIpOwoKICAgICAgICBpZiAoYWJzZW5jZVR5cGUgPT0gIndvcmtpbmctaG91cnMtY2hhbmdlIikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoYWR2aXNvcikpCiAgICAgICAgICAgICAgICBjb25kaXRpb25zLkFkZCgie1wia2V5XCI6e1wiZXFcIjpcIndvcmtpbmctaG91ci0iICsgYWR2aXNvciArICJcIn19Iik7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMuQWRkKCJ7XCJrZXlcIjp7XCJlcVwiOlwid29ya2luZy1ob3VyXCJ9fSIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKChhYnNlbmNlVHlwZSA9PSAicGVyc29uYWwtbGVhdmUiIHx8IGFic2VuY2VUeXBlID09ICJyZXplcnZhdGlvbiIpICYmICFzdHJpbmcuSXNOdWxsT3JFbXB0eShhZHZpc29yKSkKICAgICAgICAgICAgY29uZGl0aW9ucy5BZGQoIntcImF0dHJpYnV0ZXNcIjp7XCJhZHZpc29yXCI6e1wiZXFcIjpcIiIgKyBhZHZpc29yICsgIlwifX19Iik7CgogICAgICAgIHZhciBmaWx0ZXJKc29uID0gIntcImFuZFwiOlsiICsgc3RyaW5nLkpvaW4oIiwiLCBjb25kaXRpb25zKSArICJdfSI7CgogICAgICAgIHZhciBxdWVyeVBhcmFtcyA9IG5ldyBMaXN0PHN0cmluZz4KICAgICAgICB7CiAgICAgICAgICAgICJwYWdlU2l6ZT0iICsgcGFnZVNpemUsCiAgICAgICAgICAgICJjdXJyZW50U3RhdGU9Y29tcGxldGUiLAogICAgICAgICAgICAiZmlsdGVyPSIgKyBmaWx0ZXJKc29uCiAgICAgICAgfTsKCiAgICAgICAgc2VydmljZVRhc2suU2V0UXVlcnlTdHJpbmcoc3RyaW5nLkpvaW4oIiYiLCBxdWVyeVBhcmFtcykpOwoKICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZSgpKTsKICAgIH0KCiAgICBwdWJsaWMgYXN5bmMgVGFzazxTY3JpcHRSZXNwb25zZT4gT3V0cHV0SGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgYWJzZW5jZVR5cGUgPSBSZWFkUGFyYW0oY29udGV4dCwgImFic2VuY2VUeXBlIik7CiAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGNvbnRleHQuQm9keTsKCiAgICAgICAgICAgIGlmIChyZXNwb25zZT8uaXNTdWNjZXNzID09IGZhbHNlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gInNlcnZpY2UtZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gIkZhaWxlZCB0byBmZXRjaCBhYnNlbmNlIGVudHJpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiU0VSVklDRV9FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IHJlc3BvbnNlPy5lcnJvck1lc3NhZ2U/LlRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VJbmZvID0gbmV3CiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcElkID0gcmVzcG9uc2U/Lm1ldGFkYXRhPy5hcHBJZD8uVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSByZXNwb25zZT8ubWV0YWRhdGE/Lm1ldGhvZE5hbWU/LlRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwVmVyYiA9IHJlc3BvbnNlPy5tZXRhZGF0YT8uaHR0cFZlcmI/LlRvU3RyaW5nKCkKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImFic2VuY2UtZW50cnkiLCAiZXJyb3IiIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZXNwb25zZURhdGEgPSByZXNwb25zZT8uZGF0YTsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gcmVzcG9uc2VEYXRhPy5pdGVtczsKCiAgICAgICAgICAgIGJvb2wgc3VwcG9ydHNEYXRlRmlsdGVyID0gKGFic2VuY2VUeXBlID09ICJwdWJsaWMtaG9saWRheSIgfHwgYWJzZW5jZVR5cGUgPT0gInBlcnNvbmFsLWxlYXZlIiB8fCBhYnNlbmNlVHlwZSA9PSAicmV6ZXJ2YXRpb24iKTsKICAgICAgICAgICAgdmFyIHN0YXJ0RGF0ZVN0ciA9IFJlYWRQYXJhbShjb250ZXh0LCAic3RhcnREYXRlIik7CiAgICAgICAgICAgIHZhciBlbmREYXRlU3RyID0gUmVhZFBhcmFtKGNvbnRleHQsICJlbmREYXRlIik7CgogICAgICAgICAgICBpZiAoc3VwcG9ydHNEYXRlRmlsdGVyICYmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RhcnREYXRlU3RyKSB8fCAhc3RyaW5nLklzTnVsbE9yRW1wdHkoZW5kRGF0ZVN0cikpICYmIGl0ZW1zICE9IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGVUaW1lIHN0YXJ0RGF0ZUZpbHRlciA9IGRlZmF1bHQ7CiAgICAgICAgICAgICAgICBEYXRlVGltZSBlbmREYXRlRmlsdGVyID0gZGVmYXVsdDsKICAgICAgICAgICAgICAgIGJvb2wgaGFzU3RhcnRGaWx0ZXIgPSAhc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RhcnREYXRlU3RyKSAmJiBUcnlQYXJzZVRvVXRjKHN0YXJ0RGF0ZVN0ciwgb3V0IHN0YXJ0RGF0ZUZpbHRlcik7CiAgICAgICAgICAgICAgICBib29sIGhhc0VuZEZpbHRlciA9ICFzdHJpbmcuSXNOdWxsT3JFbXB0eShlbmREYXRlU3RyKSAmJiBUcnlQYXJzZVRvVXRjKGVuZERhdGVTdHIsIG91dCBlbmREYXRlRmlsdGVyKTsKCiAgICAgICAgICAgICAgICB2YXIgZmlsdGVyZWRJdGVtcyA9IG5ldyBMaXN0PGR5bmFtaWM+KCk7CiAgICAgICAgICAgICAgICBmb3JlYWNoIChkeW5hbWljIGl0ZW0gaW4gaXRlbXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJzID0gaXRlbT8uYXR0cmlidXRlczsKICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cnMgPT0gbnVsbCkgY29udGludWU7CgogICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVtU3RhcnRTdHIgPSBhdHRycz8uc3RhcnREYXRlVGltZT8uVG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlbUVuZFN0ciA9IGF0dHJzPy5lbmREYXRlVGltZT8uVG9TdHJpbmcoKTsKCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWUgaXRlbVN0YXJ0ID0gZGVmYXVsdDsKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZSBpdGVtRW5kID0gZGVmYXVsdDsKICAgICAgICAgICAgICAgICAgICBib29sIHBhcnNlZFN0YXJ0ID0gIXN0cmluZy5Jc051bGxPckVtcHR5KGl0ZW1TdGFydFN0cikgJiYgVHJ5UGFyc2VUb1V0YyhpdGVtU3RhcnRTdHIsIG91dCBpdGVtU3RhcnQpOwogICAgICAgICAgICAgICAgICAgIGJvb2wgcGFyc2VkRW5kID0gIXN0cmluZy5Jc051bGxPckVtcHR5KGl0ZW1FbmRTdHIpICYmIFRyeVBhcnNlVG9VdGMoaXRlbUVuZFN0ciwgb3V0IGl0ZW1FbmQpOwoKICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGUgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzU3RhcnRGaWx0ZXIgJiYgcGFyc2VkU3RhcnQgJiYgaXRlbVN0YXJ0IDwgc3RhcnREYXRlRmlsdGVyKQogICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGlmIChoYXNFbmRGaWx0ZXIgJiYgcGFyc2VkRW5kICYmIGl0ZW1FbmQgPiBlbmREYXRlRmlsdGVyKQogICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlKQogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEl0ZW1zLkFkZChpdGVtKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gImFic2VuY2UtZW50cnktc3VjY2VzcyIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWJzZW5jZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gZmlsdGVyZWRJdGVtcwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgVGFncyA9IG5ldyBzdHJpbmdbXSB7ICJhYnNlbmNlLWVudHJ5IiwgYWJzZW5jZVR5cGUgPz8gIiIsICJzdWNjZXNzIiB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJhYnNlbmNlLWVudHJ5LXN1Y2Nlc3MiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFic2VuY2VUeXBlLAogICAgICAgICAgICAgICAgICAgIGl0ZW1zCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVGFncyA9IG5ldyBzdHJpbmdbXSB7ICJhYnNlbmNlLWVudHJ5IiwgYWJzZW5jZVR5cGUgPz8gIiIsICJzdWNjZXNzIiB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJvdXRwdXQtZXJyb3IiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yID0gIkludGVybmFsIHByb2Nlc3NpbmcgZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9ICJQUk9DRVNTSU5HX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICBlcnJvckRlc2NyaXB0aW9uID0gZXguTWVzc2FnZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJhYnNlbmNlLWVudHJ5IiwgImVycm9yIiB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgYm9vbCBUcnlQYXJzZVRvVXRjKHN0cmluZyBkYXRlU3RyLCBvdXQgRGF0ZVRpbWUgdXRjRGF0ZVRpbWUpCiAgICB7CiAgICAgICAgdXRjRGF0ZVRpbWUgPSBkZWZhdWx0OwogICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShkYXRlU3RyKSkgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmIChEYXRlVGltZU9mZnNldC5UcnlQYXJzZShkYXRlU3RyLAogICAgICAgICAgICBTeXN0ZW0uR2xvYmFsaXphdGlvbi5DdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLAogICAgICAgICAgICBTeXN0ZW0uR2xvYmFsaXphdGlvbi5EYXRlVGltZVN0eWxlcy5Ob25lLCBvdXQgdmFyIGR0bykpCiAgICAgICAgewogICAgICAgICAgICB1dGNEYXRlVGltZSA9IGR0by5VdGNEYXRlVGltZTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBwcml2YXRlIHN0cmluZyBSZWFkUGFyYW0oU2NyaXB0Q29udGV4dCBjb250ZXh0LCBzdHJpbmcgbmFtZSkKICAgIHsKICAgICAgICBpZiAoY29udGV4dC5RdWVyeVBhcmFtZXRlcnMgPT0gbnVsbCB8fCAhSGFzUHJvcGVydHkoY29udGV4dC5RdWVyeVBhcmFtZXRlcnMsIG5hbWUpKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB2YXIgdmFsID0gY29udGV4dC5RdWVyeVBhcmFtZXRlcnNbbmFtZV07CiAgICAgICAgcmV0dXJuIHZhbCAhPSBudWxsID8gdmFsLlRvU3RyaW5nKCkgOiBudWxsOwogICAgfQp9Cg=="
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
},
|
|
21
21
|
"mapping": {
|
|
22
22
|
"location": "./src/GetAdvisorStatsMapping.csx",
|
|
23
|
-
"code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CnVzaW5nIEJCVC5Xb3JrZmxvdy5EZWZpbml0aW9uczsKLy8vIDxzdW1tYXJ5PgovLy8gTWFwcGluZyBmb3IgR2V0QWR2aXNvclN0YXRzVGFzayAoRGFwclNlcnZpY2VUYXNrIC0gVHlwZSAzKQovLy8gUXVlcmllcyByZXplcnZhdGlvbiB3b3JrZmxvdyBpbnN0YW5jZXMgdG8gY2FsY3VsYXRlIGFkdmlzb3IgcGVyZm9ybWFuY2Ugc3RhdGlzdGljcy4KLy8vCi8vLyBRdWVyeSBwYXJhbWV0ZXJzOgovLy8gICAtIGFkdmlzb3JJZCAocmVxdWlyZWQpOiBhZHZpc29yIGlkZW50aWZpZXIKLy8vICAgLSBwZXJpb2QgKG9wdGlvbmFsKTogIndlZWsiIHwgIm1vbnRoIiDigJQgZGVmYXVsdCAid2VlayIKLy8vICAgLSBzdGFydERhdGUgKG9wdGlvbmFsKTogZmlsdGVyIHN0YXJ0RGF0ZVRpbWUgPj0gdmFsdWUKLy8vICAgLSBlbmREYXRlIChvcHRpb25hbCk6IGZpbHRlciBlbmREYXRlVGltZSA8PSB2YWx1ZQovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgR2V0QWR2aXNvclN0YXRzTWFwcGluZyA6IFNjcmlwdEJhc2UsIElNYXBwaW5nCnsKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB2YXIgc2VydmljZVRhc2sgPSB0YXNrIGFzIERhcHJTZXJ2aWNlVGFzazsKICAgICAgICBpZiAoc2VydmljZVRhc2sgPT0gbnVsbCkKICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRhc2sgbXVzdCBiZSBhIERhcHJTZXJ2aWNlVGFzayIpOwoKICAgICAgICB2YXIgYWR2aXNvcklkID0gUmVhZFBhcmFtKGNvbnRleHQsICJhZHZpc29ySWQiKTsKICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoYWR2aXNvcklkKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJ2YWxpZGF0aW9uLWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJhZHZpc29ySWQgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9ICJWQUxJREFUSU9OX0VSUk9SIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIHZhciBwZXJpb2QgPSBSZWFkUGFyYW0oY29udGV4dCwgInBlcmlvZCIpID8/ICJ3ZWVrIjsKICAgICAgICB2YXIgc3RhcnREYXRlID0gUmVhZFBhcmFtKGNvbnRleHQsICJzdGFydERhdGUiKTsKICAgICAgICB2YXIgZW5kRGF0ZSA9IFJlYWRQYXJhbShjb250ZXh0LCAiZW5kRGF0ZSIpOwoKICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RhcnREYXRlKSB8fCBzdHJpbmcuSXNOdWxsT3JFbXB0eShlbmREYXRlKSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBub3cgPSBEYXRlVGltZS5VdGNOb3c7CiAgICAgICAgICAgIGlmIChwZXJpb2QgPT0gIm1vbnRoIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RhcnREYXRlID0gc3RhcnREYXRlID8/IG5vdy5BZGREYXlzKC0zMCkuVG9TdHJpbmcoInl5eXktTU0tZGRUSEg6bW06c3MiKTsKICAgICAgICAgICAgICAgIGVuZERhdGUgPSBlbmREYXRlID8/IG5vdy5Ub1N0cmluZygieXl5eS1NTS1kZFRISDptbTpzcyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RhcnREYXRlID0gc3RhcnREYXRlID8/IG5vdy5BZGREYXlzKC03KS5Ub1N0cmluZygieXl5eS1NTS1kZFRISDptbTpzcyIpOwogICAgICAgICAgICAgICAgZW5kRGF0ZSA9IGVuZERhdGUgPz8gbm93LlRvU3RyaW5nKCJ5eXl5LU1NLWRkVEhIOm1tOnNzIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZhciBjb25kaXRpb25zID0gbmV3IExpc3Q8c3RyaW5nPigpOwogICAgICAgIGNvbmRpdGlvbnMuQWRkKCJ7XCJhdHRyaWJ1dGVzXCI6e1wiYWR2aXNvclwiOntcImVxXCI6XCIiICsgYWR2aXNvcklkICsgIlwifX19Iik7CiAgICAgICAgY29uZGl0aW9ucy5BZGQoIntcInN0YXR1c1wiOntcImVxXCI6XCJBXCJ9fSIpOwoKICAgICAgICB2YXIgZmlsdGVySnNvbiA9ICJ7XCJhbmRcIjpbIiArIHN0cmluZy5Kb2luKCIsIiwgY29uZGl0aW9ucykgKyAiXX0iOwoKICAgICAgICB2YXIgcXVlcnlQYXJhbXMgPSBuZXcgTGlzdDxzdHJpbmc+ewogICAgICAgICAgICAicGFnZVNpemU9NTAwIiwKICAgICAgICAgICAgJCJmaWx0ZXI9e2ZpbHRlckpzb259IgogICAgICAgIH07CgogICAgICAgIHNlcnZpY2VUYXNrLlNldFF1ZXJ5U3RyaW5nKHN0cmluZy5Kb2luKCImIiwgcXVlcnlQYXJhbXMpKTsKICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZSgpKTsKICAgIH0KCiAgICBwdWJsaWMgVGFzazxTY3JpcHRSZXNwb25zZT4gT3V0cHV0SGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgYWR2aXNvcklkID0gUmVhZFBhcmFtKGNvbnRleHQsICJhZHZpc29ySWQiKTsKICAgICAgICAgICAgdmFyIHBlcmlvZCA9IFJlYWRQYXJhbShjb250ZXh0LCAicGVyaW9kIikgPz8gIndlZWsiOwogICAgICAgICAgICB2YXIgc3RhcnREYXRlID0gUmVhZFBhcmFtKGNvbnRleHQsICJzdGFydERhdGUiKTsKICAgICAgICAgICAgdmFyIGVuZERhdGUgPSBSZWFkUGFyYW0oY29udGV4dCwgImVuZERhdGUiKTsKCiAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGNvbnRleHQuQm9keTsKCiAgICAgICAgICAgIGlmIChyZXNwb25zZT8uaXNTdWNjZXNzID09IGZhbHNlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9ICJzZXJ2aWNlLWVycm9yIiwKICAgICAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJGYWlsZWQgdG8gZmV0Y2ggcmVzZXJ2YXRpb25zIGZvciBzdGF0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9ICJTRVJWSUNFX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gcmVzcG9uc2U/LmVycm9yTWVzc2FnZT8uVG9TdHJpbmcoKQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImFkdmlzb3Itc3RhdHMiLCAiZXJyb3IiIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2U/LmRhdGE7CiAgICAgICAgICAgIHZhciBpdGVtcyA9IHJlc3BvbnNlRGF0YT8uaXRlbXM7CgogICAgICAgICAgICBpbnQgdG90YWxDb3VudCA9IDA7CiAgICAgICAgICAgIGludCBjb21wbGV0ZWRDb3VudCA9IDA7CiAgICAgICAgICAgIGludCBjYW5jZWxsZWRDb3VudCA9IDA7CiAgICAgICAgICAgIGludCBhY3RpdmVDb3VudCA9IDA7CiAgICAgICAgICAgIGludCBpbk1lZXRDb3VudCA9IDA7CiAgICAgICAgICAgIGRvdWJsZSB0b3RhbER1cmF0aW9uTWludXRlcyA9IDA7CgogICAgICAgICAgICBEYXRlVGltZSBmaWx0ZXJTdGFydCA9IERhdGVUaW1lLk1pblZhbHVlOwogICAgICAgICAgICBEYXRlVGltZSBmaWx0ZXJFbmQgPSBEYXRlVGltZS5NYXhWYWx1ZTsKICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShzdGFydERhdGUpKSBEYXRlVGltZS5UcnlQYXJzZShzdGFydERhdGUsIG91dCBmaWx0ZXJTdGFydCk7CiAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoZW5kRGF0ZSkpIERhdGVUaW1lLlRyeVBhcnNlKGVuZERhdGUsIG91dCBmaWx0ZXJFbmQpOwoKICAgICAgICAgICAgaWYgKGl0ZW1zICE9IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKGR5bmFtaWMgaXRlbSBpbiBpdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cnMgPSBpdGVtPy5hdHRyaWJ1dGVzOwogICAgICAgICAgICAgICAgICAgIGlmIChhdHRycyA9PSBudWxsKSBjb250aW51ZTsKCiAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZW1TdGFydFN0ciA9IGF0dHJzPy5zdGFydERhdGVUaW1lPy5Ub1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShpdGVtU3RhcnRTdHIpKSBjb250aW51ZTsKCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWUgaXRlbVN0YXJ0OwogICAgICAgICAgICAgICAgICAgIGlmICghRGF0ZVRpbWUuVHJ5UGFyc2UoaXRlbVN0YXJ0U3RyLCBvdXQgaXRlbVN0YXJ0KSkgY29udGludWU7CgogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtU3RhcnQgPCBmaWx0ZXJTdGFydCB8fCBpdGVtU3RhcnQgPiBmaWx0ZXJFbmQpIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgICAgICB0b3RhbENvdW50Kys7CgogICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdGF0ZSA9IGl0ZW0/Lm1ldGFkYXRhPy5jdXJyZW50U3RhdGU/LlRvU3RyaW5nKCkgPz8gIiI7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09ICJtZWV0LWNvbXBsZXRlZCIgfHwgc3RhdGUgPT0gImNvbXBsZXRlZCIpIGNvbXBsZXRlZENvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT0gInVzZXItY2FuY2VsbGVkIiB8fCBzdGF0ZSA9PSAiYWR2aXNvci1jYW5jZWxsZWQiIHx8IHN0YXRlID09ICJ0aW1lb3V0IikgY2FuY2VsbGVkQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PSAiYWN0aXZlIiB8fCBzdGF0ZSA9PSAiY2FuLXN0YXJ0LW1lZXRpbmciIHx8IHN0YXRlID09ICJhY2NlcHQtdGVybXMiKSBhY3RpdmVDb3VudCsrOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlID09ICJpbi1tZWV0IikgaW5NZWV0Q291bnQrKzsKCiAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZW1FbmRTdHIgPSBhdHRycz8uZW5kRGF0ZVRpbWU/LlRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShpdGVtRW5kU3RyKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVUaW1lIGl0ZW1FbmQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEYXRlVGltZS5UcnlQYXJzZShpdGVtRW5kU3RyLCBvdXQgaXRlbUVuZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbER1cmF0aW9uTWludXRlcyArPSAoaXRlbUVuZCAtIGl0ZW1TdGFydCkuVG90YWxNaW51dGVzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gImFkdmlzb3Itc3RhdHMtc3VjY2VzcyIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWR2aXNvcklkLAogICAgICAgICAgICAgICAgICAgIHBlcmlvZCwKICAgICAgICAgICAgICAgICAgICBzdGFydERhdGUsCiAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZSwKICAgICAgICAgICAgICAgICAgICB0b3RhbFJlc2VydmF0aW9ucyA9IHRvdGFsQ291bnQsCiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkID0gY29tcGxldGVkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGVkID0gY2FuY2VsbGVkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgYWN0aXZlID0gYWN0aXZlQ291bnQsCiAgICAgICAgICAgICAgICAgICAgaW5NZWV0ID0gaW5NZWV0Q291bnQsCiAgICAgICAgICAgICAgICAgICAgYXZlcmFnZUR1cmF0aW9uTWludXRlcyA9IHRvdGFsQ291bnQgPiAwID8gTWF0aC5Sb3VuZCh0b3RhbER1cmF0aW9uTWludXRlcyAvIHRvdGFsQ291bnQsIDEpIDogMCwKICAgICAgICAgICAgICAgICAgICB0b3RhbER1cmF0aW9uTWludXRlcyA9IE1hdGguUm91bmQodG90YWxEdXJhdGlvbk1pbnV0ZXMsIDEpCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImFkdmlzb3Itc3RhdHMiLCAic3VjY2VzcyIgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJvdXRwdXQtZXJyb3IiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yID0gIkludGVybmFsIHByb2Nlc3NpbmcgZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9ICJQUk9DRVNTSU5HX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICBlcnJvckRlc2NyaXB0aW9uID0gZXguTWVzc2FnZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJhZHZpc29yLXN0YXRzIiwgImVycm9yIiB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHN0cmluZyBSZWFkUGFyYW0oU2NyaXB0Q29udGV4dCBjb250ZXh0LCBzdHJpbmcgbmFtZSkKICAgIHsKICAgICAgICBpZiAoY29udGV4dC5RdWVyeVBhcmFtZXRlcnMgPT0gbnVsbCB8fCAhSGFzUHJvcGVydHkoY29udGV4dC5RdWVyeVBhcmFtZXRlcnMsIG5hbWUpKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB2YXIgdmFsID0gY29udGV4dC5RdWVyeVBhcmFtZXRlcnNbbmFtZV07CiAgICAgICAgcmV0dXJuIHZhbCAhPSBudWxsID8gdmFsLlRvU3RyaW5nKCkgOiBudWxsOwogICAgfQp9Cg=="
|
|
23
|
+
"code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CnVzaW5nIEJCVC5Xb3JrZmxvdy5EZWZpbml0aW9uczsKLy8vIDxzdW1tYXJ5PgovLy8gTWFwcGluZyBmb3IgR2V0QWR2aXNvclN0YXRzVGFzayAoRGFwclNlcnZpY2VUYXNrIC0gVHlwZSAzKQovLy8gUXVlcmllcyByZXplcnZhdGlvbiB3b3JrZmxvdyBpbnN0YW5jZXMgdG8gY2FsY3VsYXRlIGFkdmlzb3IgcGVyZm9ybWFuY2Ugc3RhdGlzdGljcy4KLy8vCi8vLyBRdWVyeSBwYXJhbWV0ZXJzOgovLy8gICAtIGFkdmlzb3JJZCAocmVxdWlyZWQpOiBhZHZpc29yIGlkZW50aWZpZXIKLy8vICAgLSBwZXJpb2QgKG9wdGlvbmFsKTogIndlZWsiIHwgIm1vbnRoIiDigJQgZGVmYXVsdCAid2VlayIKLy8vICAgLSBzdGFydERhdGUgKG9wdGlvbmFsKTogZmlsdGVyIHN0YXJ0RGF0ZVRpbWUgPj0gdmFsdWUKLy8vICAgLSBlbmREYXRlIChvcHRpb25hbCk6IGZpbHRlciBlbmREYXRlVGltZSA8PSB2YWx1ZQovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgR2V0QWR2aXNvclN0YXRzTWFwcGluZyA6IFNjcmlwdEJhc2UsIElNYXBwaW5nCnsKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB2YXIgc2VydmljZVRhc2sgPSB0YXNrIGFzIERhcHJTZXJ2aWNlVGFzazsKICAgICAgICBpZiAoc2VydmljZVRhc2sgPT0gbnVsbCkKICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRhc2sgbXVzdCBiZSBhIERhcHJTZXJ2aWNlVGFzayIpOwoKICAgICAgICB2YXIgYWR2aXNvcklkID0gUmVhZFBhcmFtKGNvbnRleHQsICJhZHZpc29ySWQiKTsKICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoYWR2aXNvcklkKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJ2YWxpZGF0aW9uLWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJhZHZpc29ySWQgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9ICJWQUxJREFUSU9OX0VSUk9SIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIHZhciBwZXJpb2QgPSBSZWFkUGFyYW0oY29udGV4dCwgInBlcmlvZCIpID8/ICJ3ZWVrIjsKICAgICAgICB2YXIgc3RhcnREYXRlID0gUmVhZFBhcmFtKGNvbnRleHQsICJzdGFydERhdGUiKTsKICAgICAgICB2YXIgZW5kRGF0ZSA9IFJlYWRQYXJhbShjb250ZXh0LCAiZW5kRGF0ZSIpOwoKICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RhcnREYXRlKSB8fCBzdHJpbmcuSXNOdWxsT3JFbXB0eShlbmREYXRlKSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBub3cgPSBEYXRlVGltZS5VdGNOb3c7CiAgICAgICAgICAgIGlmIChwZXJpb2QgPT0gIm1vbnRoIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RhcnREYXRlID0gc3RhcnREYXRlID8/IG5vdy5BZGREYXlzKC0zMCkuVG9TdHJpbmcoInl5eXktTU0tZGRUSEg6bW06c3NaIik7CiAgICAgICAgICAgICAgICBlbmREYXRlID0gZW5kRGF0ZSA/PyBub3cuVG9TdHJpbmcoInl5eXktTU0tZGRUSEg6bW06c3NaIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGFydERhdGUgPSBzdGFydERhdGUgPz8gbm93LkFkZERheXMoLTcpLlRvU3RyaW5nKCJ5eXl5LU1NLWRkVEhIOm1tOnNzWiIpOwogICAgICAgICAgICAgICAgZW5kRGF0ZSA9IGVuZERhdGUgPz8gbm93LlRvU3RyaW5nKCJ5eXl5LU1NLWRkVEhIOm1tOnNzWiIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgY29uZGl0aW9ucyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKICAgICAgICBjb25kaXRpb25zLkFkZCgie1wiYXR0cmlidXRlc1wiOntcImFkdmlzb3JcIjp7XCJlcVwiOlwiIiArIGFkdmlzb3JJZCArICJcIn19fSIpOwogICAgICAgIGNvbmRpdGlvbnMuQWRkKCJ7XCJzdGF0dXNcIjp7XCJlcVwiOlwiQVwifX0iKTsKCiAgICAgICAgdmFyIGZpbHRlckpzb24gPSAie1wiYW5kXCI6WyIgKyBzdHJpbmcuSm9pbigiLCIsIGNvbmRpdGlvbnMpICsgIl19IjsKCiAgICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0gbmV3IExpc3Q8c3RyaW5nPnsKICAgICAgICAgICAgInBhZ2VTaXplPTUwMCIsCiAgICAgICAgICAgICQiZmlsdGVyPXtmaWx0ZXJKc29ufSIKICAgICAgICB9OwoKICAgICAgICBzZXJ2aWNlVGFzay5TZXRRdWVyeVN0cmluZyhzdHJpbmcuSm9pbigiJiIsIHF1ZXJ5UGFyYW1zKSk7CiAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UoKSk7CiAgICB9CgogICAgcHVibGljIFRhc2s8U2NyaXB0UmVzcG9uc2U+IE91dHB1dEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFkdmlzb3JJZCA9IFJlYWRQYXJhbShjb250ZXh0LCAiYWR2aXNvcklkIik7CiAgICAgICAgICAgIHZhciBwZXJpb2QgPSBSZWFkUGFyYW0oY29udGV4dCwgInBlcmlvZCIpID8/ICJ3ZWVrIjsKICAgICAgICAgICAgdmFyIHN0YXJ0RGF0ZSA9IFJlYWRQYXJhbShjb250ZXh0LCAic3RhcnREYXRlIik7CiAgICAgICAgICAgIHZhciBlbmREYXRlID0gUmVhZFBhcmFtKGNvbnRleHQsICJlbmREYXRlIik7CgogICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBjb250ZXh0LkJvZHk7CgogICAgICAgICAgICBpZiAocmVzcG9uc2U/LmlzU3VjY2VzcyA9PSBmYWxzZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPSAic2VydmljZS1lcnJvciIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAiRmFpbGVkIHRvIGZldGNoIHJlc2VydmF0aW9ucyBmb3Igc3RhdHMiLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiU0VSVklDRV9FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IHJlc3BvbnNlPy5lcnJvck1lc3NhZ2U/LlRvU3RyaW5nKCkKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJhZHZpc29yLXN0YXRzIiwgImVycm9yIiB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlPy5kYXRhOwogICAgICAgICAgICB2YXIgaXRlbXMgPSByZXNwb25zZURhdGE/Lml0ZW1zOwoKICAgICAgICAgICAgaW50IHRvdGFsQ291bnQgPSAwOwogICAgICAgICAgICBpbnQgY29tcGxldGVkQ291bnQgPSAwOwogICAgICAgICAgICBpbnQgY2FuY2VsbGVkQ291bnQgPSAwOwogICAgICAgICAgICBpbnQgYWN0aXZlQ291bnQgPSAwOwogICAgICAgICAgICBpbnQgaW5NZWV0Q291bnQgPSAwOwogICAgICAgICAgICBkb3VibGUgdG90YWxEdXJhdGlvbk1pbnV0ZXMgPSAwOwoKICAgICAgICAgICAgRGF0ZVRpbWUgZmlsdGVyU3RhcnQgPSBEYXRlVGltZS5NaW5WYWx1ZTsKICAgICAgICAgICAgRGF0ZVRpbWUgZmlsdGVyRW5kID0gRGF0ZVRpbWUuTWF4VmFsdWU7CiAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RhcnREYXRlKSkgVHJ5UGFyc2VUb1V0YyhzdGFydERhdGUsIG91dCBmaWx0ZXJTdGFydCk7CiAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoZW5kRGF0ZSkpIFRyeVBhcnNlVG9VdGMoZW5kRGF0ZSwgb3V0IGZpbHRlckVuZCk7CgogICAgICAgICAgICBpZiAoaXRlbXMgIT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoZHluYW1pYyBpdGVtIGluIGl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBhdHRycyA9IGl0ZW0/LmF0dHJpYnV0ZXM7CiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJzID09IG51bGwpIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlbVN0YXJ0U3RyID0gYXR0cnM/LnN0YXJ0RGF0ZVRpbWU/LlRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGl0ZW1TdGFydFN0cikpIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZSBpdGVtU3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFUcnlQYXJzZVRvVXRjKGl0ZW1TdGFydFN0ciwgb3V0IGl0ZW1TdGFydCkpIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbVN0YXJ0IDwgZmlsdGVyU3RhcnQgfHwgaXRlbVN0YXJ0ID4gZmlsdGVyRW5kKSBjb250aW51ZTsKCiAgICAgICAgICAgICAgICAgICAgdG90YWxDb3VudCsrOwoKICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3RhdGUgPSBpdGVtPy5tZXRhZGF0YT8uY3VycmVudFN0YXRlPy5Ub1N0cmluZygpID8/ICIiOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSAibWVldC1jb21wbGV0ZWQiIHx8IHN0YXRlID09ICJjb21wbGV0ZWQiKSBjb21wbGV0ZWRDb3VudCsrOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlID09ICJ1c2VyLWNhbmNlbGxlZCIgfHwgc3RhdGUgPT0gImFkdmlzb3ItY2FuY2VsbGVkIiB8fCBzdGF0ZSA9PSAidGltZW91dCIpIGNhbmNlbGxlZENvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT0gImFjdGl2ZSIgfHwgc3RhdGUgPT0gImNhbi1zdGFydC1tZWV0aW5nIiB8fCBzdGF0ZSA9PSAiYWNjZXB0LXRlcm1zIikgYWN0aXZlQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PSAiaW4tbWVldCIpIGluTWVldENvdW50Kys7CgogICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVtRW5kU3RyID0gYXR0cnM/LmVuZERhdGVUaW1lPy5Ub1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoaXRlbUVuZFN0cikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBEYXRlVGltZSBpdGVtRW5kOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoVHJ5UGFyc2VUb1V0YyhpdGVtRW5kU3RyLCBvdXQgaXRlbUVuZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbER1cmF0aW9uTWludXRlcyArPSAoaXRlbUVuZCAtIGl0ZW1TdGFydCkuVG90YWxNaW51dGVzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gImFkdmlzb3Itc3RhdHMtc3VjY2VzcyIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWR2aXNvcklkLAogICAgICAgICAgICAgICAgICAgIHBlcmlvZCwKICAgICAgICAgICAgICAgICAgICBzdGFydERhdGUsCiAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZSwKICAgICAgICAgICAgICAgICAgICB0b3RhbFJlc2VydmF0aW9ucyA9IHRvdGFsQ291bnQsCiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkID0gY29tcGxldGVkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGVkID0gY2FuY2VsbGVkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgYWN0aXZlID0gYWN0aXZlQ291bnQsCiAgICAgICAgICAgICAgICAgICAgaW5NZWV0ID0gaW5NZWV0Q291bnQsCiAgICAgICAgICAgICAgICAgICAgYXZlcmFnZUR1cmF0aW9uTWludXRlcyA9IHRvdGFsQ291bnQgPiAwID8gTWF0aC5Sb3VuZCh0b3RhbER1cmF0aW9uTWludXRlcyAvIHRvdGFsQ291bnQsIDEpIDogMCwKICAgICAgICAgICAgICAgICAgICB0b3RhbER1cmF0aW9uTWludXRlcyA9IE1hdGguUm91bmQodG90YWxEdXJhdGlvbk1pbnV0ZXMsIDEpCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImFkdmlzb3Itc3RhdHMiLCAic3VjY2VzcyIgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJvdXRwdXQtZXJyb3IiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yID0gIkludGVybmFsIHByb2Nlc3NpbmcgZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9ICJQUk9DRVNTSU5HX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICBlcnJvckRlc2NyaXB0aW9uID0gZXguTWVzc2FnZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJhZHZpc29yLXN0YXRzIiwgImVycm9yIiB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIGJvb2wgVHJ5UGFyc2VUb1V0YyhzdHJpbmcgZGF0ZVN0ciwgb3V0IERhdGVUaW1lIHV0Y0RhdGVUaW1lKQogICAgewogICAgICAgIHV0Y0RhdGVUaW1lID0gZGVmYXVsdDsKICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoZGF0ZVN0cikpIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAoRGF0ZVRpbWVPZmZzZXQuVHJ5UGFyc2UoZGF0ZVN0ciwKICAgICAgICAgICAgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwKICAgICAgICAgICAgU3lzdGVtLkdsb2JhbGl6YXRpb24uRGF0ZVRpbWVTdHlsZXMuTm9uZSwgb3V0IHZhciBkdG8pKQogICAgICAgIHsKICAgICAgICAgICAgdXRjRGF0ZVRpbWUgPSBkdG8uVXRjRGF0ZVRpbWU7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcHJpdmF0ZSBzdHJpbmcgUmVhZFBhcmFtKFNjcmlwdENvbnRleHQgY29udGV4dCwgc3RyaW5nIG5hbWUpCiAgICB7CiAgICAgICAgaWYgKGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzID09IG51bGwgfHwgIUhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCBuYW1lKSkKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgdmFyIHZhbCA9IGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzW25hbWVdOwogICAgICAgIHJldHVybiB2YWwgIT0gbnVsbCA/IHZhbC5Ub1N0cmluZygpIDogbnVsbDsKICAgIH0KfQo="
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
}
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
},
|
|
24
24
|
"mapping": {
|
|
25
25
|
"location": "./src/GetAvailableSlotsMapping.csx",
|
|
26
|
-
"code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CnVzaW5nIEJCVC5Xb3JrZmxvdy5EZWZpbml0aW9uczsKLy8vIDxzdW1tYXJ5PgovLy8gTWFwcGluZyBmb3IgR2V0QXZhaWxhYmxlU2xvdHNUYXNrIChEYXByU2VydmljZVRhc2sgLSBUeXBlIDMpCi8vLyBRdWVyaWVzIGFic2VuY2UtZW50cnkgd29ya2Zsb3cgKHN0YXRlOiBjb21wbGV0ZSkgdmlhIERhcHIgc2VydmljZSBpbnZvY2F0aW9uIHRvIGdldAovLy8gcHVibGljIGhvbGlkYXlzLCB3b3JraW5nIGhvdXJzIGNoYW5nZXMsIGFuZCBwZXJzb25hbCBsZWF2ZXMuCi8vLyBUaGVuIGNhbGN1bGF0ZXMgYXZhaWxhYmxlIGFwcG9pbnRtZW50IHNsb3RzIGZvciB0aGUgZ2l2ZW4gYWR2aXNvciBhbmQgZGF0ZS4KLy8vCi8vLyBXb3JraW5nIGhvdXJzIHByaW9yaXR5OiBhZHZpc29yLXNwZWNpZmljID4gY29tcGFueS13aWRlIChhZHZpc29yPW51bGwpID4gbm8gaG91cnMKLy8vIEhhbGYtZGF5IHB1YmxpYyBob2xpZGF5cyBvbmx5IGJsb2NrIHRoZSBob2xpZGF5IGhvdXJzLCBub3QgdGhlIGVudGlyZSBkYXkuCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBHZXRBdmFpbGFibGVTbG90c01hcHBpbmcgOiBTY3JpcHRCYXNlLCBJTWFwcGluZwp7CiAgICBwdWJsaWMgVGFzazxTY3JpcHRSZXNwb25zZT4gSW5wdXRIYW5kbGVyKFdvcmtmbG93VGFzayB0YXNrLCBTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdmFyIHNlcnZpY2VUYXNrID0gdGFzayBhcyBEYXByU2VydmljZVRhc2s7CiAgICAgICAgaWYgKHNlcnZpY2VUYXNrID09IG51bGwpCiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJUYXNrIG11c3QgYmUgYSBEYXByU2VydmljZVRhc2siKTsKCiAgICAgICAgdmFyIGFwcElkID0gR2V0Q29uZmlnVmFsdWUoIkRBUFJfQVBQX0lEIik7CiAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShhcHBJZCkpCiAgICAgICAgICAgIHNlcnZpY2VUYXNrLlNldEFwcElkKGFwcElkKTsKCiAgICAgICAgdmFyIGFkdmlzb3JJZCA9IGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzP1siYWR2aXNvcklkIl0/LlRvU3RyaW5nKCk7CiAgICAgICAgdmFyIGRhdGUgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bImRhdGUiXT8uVG9TdHJpbmcoKTsKCiAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGFkdmlzb3JJZCkgfHwgc3RyaW5nLklzTnVsbE9yRW1wdHkoZGF0ZSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAidmFsaWRhdGlvbi1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAiYWR2aXNvcklkIGFuZCBkYXRlIGFyZSByZXF1aXJlZCIsCiAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlID0gIlZBTElEQVRJT05fRVJST1IiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgdmFyIHJlcXVlc3RlZERhdGUgPSBEYXRlVGltZS5QYXJzZShkYXRlKTsKICAgICAgICB2YXIgdHogPSBSZXNvbHZlVGltZVpvbmUoY29udGV4dCk7CiAgICAgICAgdmFyIHRvZGF5SW5CdXNpbmVzc1R6ID0gVGltZVpvbmVJbmZvLkNvbnZlcnRUaW1lRnJvbVV0YyhEYXRlVGltZS5VdGNOb3csIHR6KS5EYXRlOwogICAgICAgIGlmIChyZXF1ZXN0ZWREYXRlLkRhdGUgPCB0b2RheUluQnVzaW5lc3NUeikKICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJEYXRlIGNhbm5vdCBiZSBpbiB0aGUgcGFzdC4iLCAiZGF0ZSIpOwoKICAgICAgICB2YXIgZmlsdGVySnNvbiA9CiAgICAgICAgICAgICJ7XCJhbmRcIjpbIiArCiAgICAgICAgICAgICJ7XCJvclwiOlt7XCJjdXJyZW50U3RhdGVcIjp7XCJlcVwiOlwiY29tcGxldGVcIn19LHtcImN1cnJlbnRTdGF0ZVwiOntcImVxXCI6XCJjb21wbGV0ZS13aXRoLXRyYW5zZmVyXCJ9fV19LCIgKwogICAgICAgICAgICAie1wib3JcIjpbIiArCiAgICAgICAgICAgICAgICAie1wiYXR0cmlidXRlc1wiOntcImFkdmlzb3JcIjp7XCJlcVwiOlwiIiArIGFkdmlzb3JJZCArICJcIn19fSwiICsKICAgICAgICAgICAgICAgICJ7XCJhdHRyaWJ1dGVzXCI6e1wiYWJzZW5jZVR5cGVcIjp7XCJlcVwiOlwicHVibGljLWhvbGlkYXlcIn19fSwiICsKICAgICAgICAgICAgICAgICJ7XCJhdHRyaWJ1dGVzXCI6e1wiYWJzZW5jZVR5cGVcIjp7XCJlcVwiOlwid29ya2luZy1ob3Vycy1jaGFuZ2VcIn19fSIgKwogICAgICAgICAgICAiXX0iICsKICAgICAgICAgICAgIl19IjsKCiAgICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0gbmV3IExpc3Q8c3RyaW5nPgogICAgICAgIHsKICAgICAgICAgICAgInBhZ2VTaXplPTEwMCIsCiAgICAgICAgICAgICQiZmlsdGVyPXtmaWx0ZXJKc29ufSIKICAgICAgICB9OwoKICAgICAgICBzZXJ2aWNlVGFzay5TZXRRdWVyeVN0cmluZyhzdHJpbmcuSm9pbigiJiIsIHF1ZXJ5UGFyYW1zKSk7CgogICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlKCkpOwogICAgfQoKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBPdXRwdXRIYW5kbGVyKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhZHZpc29ySWQgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bImFkdmlzb3JJZCJdPy5Ub1N0cmluZygpOwogICAgICAgICAgICB2YXIgZGF0ZVN0ciA9IGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzP1siZGF0ZSJdPy5Ub1N0cmluZygpOwogICAgICAgICAgICB2YXIgZHVyYXRpb24gPSBHZXRBcHBvaW50bWVudER1cmF0aW9uKGNvbnRleHQpOwoKICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGFkdmlzb3JJZCkgfHwgc3RyaW5nLklzTnVsbE9yRW1wdHkoZGF0ZVN0cikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gInZhbGlkYXRpb24tZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gImFkdmlzb3JJZCBhbmQgZGF0ZSBhcmUgcmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiVkFMSURBVElPTl9FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkdmlzb3JJZCwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IGRhdGVTdHIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHJlcXVlc3RlZERhdGUgPSBEYXRlVGltZS5QYXJzZShkYXRlU3RyKTsKICAgICAgICAgICAgdmFyIGRheU9mV2VlayA9IHJlcXVlc3RlZERhdGUuRGF5T2ZXZWVrLlRvU3RyaW5nKCkuVG9Mb3dlcigpOwoKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gY29udGV4dC5Cb2R5OwoKICAgICAgICAgICAgaWYgKHJlc3BvbnNlPy5pc1N1Y2Nlc3MgPT0gZmFsc2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBlcnJvclR5cGUgPSBDbGFzc2lmeVNlcnZpY2VFcnJvcihyZXNwb25zZT8uZXJyb3JNZXNzYWdlPy5Ub1N0cmluZygpID8/ICIiKTsKICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gInNlcnZpY2UtZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gIkZhaWxlZCB0byBmZXRjaCBhYnNlbmNlIGVudHJpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiU0VSVklDRV9FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yVHlwZSA9IGVycm9yVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gcmVzcG9uc2U/LmVycm9yTWVzc2FnZT8uVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUluZm8gPSBuZXcKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwSWQgPSByZXNwb25zZT8ubWV0YWRhdGE/LmFwcElkPy5Ub1N0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9IHJlc3BvbnNlPy5tZXRhZGF0YT8ubWV0aG9kTmFtZT8uVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBWZXJiID0gcmVzcG9uc2U/Lm1ldGFkYXRhPy5odHRwVmVyYj8uVG9TdHJpbmcoKQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiYXBwb2ludG1lbnRzIiwgImVycm9yIiB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlPy5kYXRhOwogICAgICAgICAgICB2YXIgaXRlbXMgPSByZXNwb25zZURhdGE/Lml0ZW1zOwoKICAgICAgICAgICAgdmFyIGluc3RhbmNlcyA9IG5ldyBMaXN0PGR5bmFtaWM+KCk7CiAgICAgICAgICAgIGlmIChpdGVtcyAhPSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBpdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZXMuQWRkKGl0ZW0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcHVibGljSG9saWRheXMgPSBuZXcgTGlzdDxkeW5hbWljPigpOwogICAgICAgICAgICB2YXIgYWR2aXNvcldvcmtpbmdIb3VycyA9IG5ldyBMaXN0PGR5bmFtaWM+KCk7CiAgICAgICAgICAgIHZhciBjb21wYW55V29ya2luZ0hvdXJzID0gbmV3IExpc3Q8ZHluYW1pYz4oKTsKICAgICAgICAgICAgdmFyIHBlcnNvbmFsTGVhdmVzID0gbmV3IExpc3Q8ZHluYW1pYz4oKTsKCiAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpbnN0YW5jZSBpbiBpbnN0YW5jZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVzID0gaW5zdGFuY2U/LmF0dHJpYnV0ZXM7CiAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSBjb250aW51ZTsKCiAgICAgICAgICAgICAgICB2YXIgYWJzZW5jZVR5cGUgPSBhdHRyaWJ1dGVzPy5hYnNlbmNlVHlwZT8uVG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgIHZhciBhZHZpc29yID0gSGFzUHJvcGVydHkoYXR0cmlidXRlcywgImFkdmlzb3IiKSA/IGF0dHJpYnV0ZXM/LmFkdmlzb3I/LlRvU3RyaW5nKCkgOiBudWxsOwoKICAgICAgICAgICAgICAgIHN3aXRjaCAoYWJzZW5jZVR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAicHVibGljLWhvbGlkYXkiOgogICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNIb2xpZGF5cy5BZGQoaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJ3b3JraW5nLWhvdXJzLWNoYW5nZSI6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoYWR2aXNvcikgJiYgYWR2aXNvciA9PSBhZHZpc29ySWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZpc29yV29ya2luZ0hvdXJzLkFkZChpbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGFkdmlzb3IpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFueVdvcmtpbmdIb3Vycy5BZGQoaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJwZXJzb25hbC1sZWF2ZSIgd2hlbiBhZHZpc29yID09IGFkdmlzb3JJZDoKICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uYWxMZWF2ZXMuQWRkKGluc3RhbmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAicmV6ZXJ2YXRpb24iIHdoZW4gYWR2aXNvciA9PSBhZHZpc29ySWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNvbmFsTGVhdmVzLkFkZChpbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdW5hdmFpbGFibGVSYW5nZXMgPSBHZXRVbmF2YWlsYWJsZVJhbmdlcyhwZXJzb25hbExlYXZlcywgcmVxdWVzdGVkRGF0ZSk7CgogICAgICAgICAgICAvLyBIYWxmLWRheSAvIGZ1bGwtZGF5IHB1YmxpYyBob2xpZGF5IGhhbmRsaW5nCiAgICAgICAgICAgIHZhciBob2xpZGF5UmFuZ2VzID0gR2V0SG9saWRheVJhbmdlcyhwdWJsaWNIb2xpZGF5cywgcmVxdWVzdGVkRGF0ZSk7CiAgICAgICAgICAgIGlmIChob2xpZGF5UmFuZ2VzICE9IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChob2xpZGF5UmFuZ2VzLkNvdW50ID09IDEKICAgICAgICAgICAgICAgICAgICAmJiBob2xpZGF5UmFuZ2VzWzBdLkl0ZW0xID09IFRpbWVTcGFuLlplcm8KICAgICAgICAgICAgICAgICAgICAmJiBob2xpZGF5UmFuZ2VzWzBdLkl0ZW0yID49IG5ldyBUaW1lU3BhbigyMywgNTksIDApKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBLZXkgPSAicHVibGljLWhvbGlkYXkiLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0gbmV3IHsgYXZhaWxhYmxlU2xvdHMgPSBuZXcgTGlzdDxzdHJpbmc+KCkgfSwKICAgICAgICAgICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImFwcG9pbnRtZW50cyIsICJob2xpZGF5IiB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdW5hdmFpbGFibGVSYW5nZXMuQWRkUmFuZ2UoaG9saWRheVJhbmdlcyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFdvcmtpbmcgaG91cnMgcHJpb3JpdHk6IGFkdmlzb3Itc3BlY2lmaWMgPiBjb21wYW55LXdpZGUKICAgICAgICAgICAgdmFyIHdvcmtpbmdIb3VycyA9IEdldFdvcmtpbmdIb3Vyc0ZvckRheShhZHZpc29yV29ya2luZ0hvdXJzLCBkYXlPZldlZWspOwogICAgICAgICAgICBpZiAod29ya2luZ0hvdXJzID09IG51bGwgfHwgd29ya2luZ0hvdXJzLkNvdW50ID09IDApCiAgICAgICAgICAgICAgICB3b3JraW5nSG91cnMgPSBHZXRXb3JraW5nSG91cnNGb3JEYXkoY29tcGFueVdvcmtpbmdIb3VycywgZGF5T2ZXZWVrKTsKCiAgICAgICAgICAgIGlmICh3b3JraW5nSG91cnMgPT0gbnVsbCB8fCB3b3JraW5nSG91cnMuQ291bnQgPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPSAibm8td29ya2luZy1ob3VycyIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9IG5ldyB7IGF2YWlsYWJsZVNsb3RzID0gbmV3IExpc3Q8c3RyaW5nPigpIH0sCiAgICAgICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImFwcG9pbnRtZW50cyIsICJjbG9zZWQiIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgYXZhaWxhYmxlU2xvdHMgPSBDYWxjdWxhdGVBdmFpbGFibGVTbG90cyh3b3JraW5nSG91cnMsIHVuYXZhaWxhYmxlUmFuZ2VzLCBkdXJhdGlvbik7CiAgICAgICAgICAgIGF2YWlsYWJsZVNsb3RzID0gRmlsdGVyU2xvdHNFeGNsdWRpbmdQYXN0Rm9yQnVzaW5lc3NUb2RheShhdmFpbGFibGVTbG90cywgcmVxdWVzdGVkRGF0ZSwgUmVzb2x2ZVRpbWVab25lKGNvbnRleHQpKTsKCiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJhdmFpbGFibGUtc2xvdHMtc3VjY2VzcyIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3IHsgYXZhaWxhYmxlU2xvdHMgfSwKICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJhcHBvaW50bWVudHMiLCAiYXZhaWxhYmlsaXR5IiwgInN1Y2Nlc3MiIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAib3V0cHV0LWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJJbnRlcm5hbCBwcm9jZXNzaW5nIGVycm9yIiwKICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiUFJPQ0VTU0lOR19FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgZXJyb3JEZXNjcmlwdGlvbiA9IGV4Lk1lc3NhZ2UKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiYXBwb2ludG1lbnRzIiwgImVycm9yIiB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICAjcmVnaW9uIEhlbHBlciBNZXRob2RzCgogICAgcHJpdmF0ZSBzdHJpbmcgQ2xhc3NpZnlTZXJ2aWNlRXJyb3Ioc3RyaW5nIGVycm9yTWVzc2FnZSkKICAgIHsKICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLkNvbnRhaW5zKCJ0aW1lb3V0IiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpCiAgICAgICAgICAgIHJldHVybiAidGltZW91dCI7CiAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5Db250YWlucygidW5hdXRob3JpemVkIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpCiAgICAgICAgICAgIHJldHVybiAiYXV0aGVudGljYXRpb24iOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoImZvcmJpZGRlbiIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gImF1dGhvcml6YXRpb24iOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoIm5vdCBmb3VuZCIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gIm5vdC1mb3VuZCI7CiAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5Db250YWlucygic2VydmljZSB1bmF2YWlsYWJsZSIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gInNlcnZpY2UtdW5hdmFpbGFibGUiOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoImNvbm5lY3Rpb24iLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSkKICAgICAgICAgICAgcmV0dXJuICJjb25uZWN0aW9uLWVycm9yIjsKCiAgICAgICAgcmV0dXJuICJnZW5lcmFsLWVycm9yIjsKICAgIH0KCiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gSUFOQSBpZCAoZS5nLiBFdXJvcGUvSXN0YW5idWwpIG9yIFdpbmRvd3MgaWQgKFR1cmtleSBTdGFuZGFyZCBUaW1lKS4gUXVlcnkgb3ZlcnJpZGVzIGNvbmZpZy4KICAgIC8vLyA8L3N1bW1hcnk+CiAgICBwcml2YXRlIFRpbWVab25lSW5mbyBSZXNvbHZlVGltZVpvbmUoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHN0cmluZyBpZCA9IG51bGw7CiAgICAgICAgaWYgKGNvbnRleHQ/LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAidGltZVpvbmUiKSkKICAgICAgICAgICAgICAgIGlkID0gY29udGV4dC5RdWVyeVBhcmFtZXRlcnNbInRpbWVab25lIl0/LlRvU3RyaW5nKCk7CiAgICAgICAgICAgIGVsc2UgaWYgKEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAidGltZXpvbmUiKSkKICAgICAgICAgICAgICAgIGlkID0gY29udGV4dC5RdWVyeVBhcmFtZXRlcnNbInRpbWV6b25lIl0/LlRvU3RyaW5nKCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZShpZCkpCiAgICAgICAgICAgIGlkID0gR2V0Q29uZmlnVmFsdWUoIkFwcG9pbnRtZW50czpUaW1lWm9uZSIpID8/IEdldENvbmZpZ1ZhbHVlKCJBUFBPSU5UTUVOVF9USU1FWk9ORSIpOwoKICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZShpZCkpCiAgICAgICAgICAgIGlkID0gIkV1cm9wZS9Jc3RhbmJ1bCI7CgogICAgICAgIHJldHVybiBGaW5kVGltZVpvbmVCeUlkKGlkLlRyaW0oKSk7CiAgICB9CgogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIExpbnV4L21hY09TOiBJQU5BIGlkcyAoRXVyb3BlL0lzdGFuYnVsKS4gV2luZG93czogb2Z0ZW4gVHVya2V5IFN0YW5kYXJkIFRpbWUuCiAgICAvLy8gVHJpZXMgYWxpYXNlcywgdGhlbiBmaXhlZCBVVEMrMyBmb3IgVHVya2V5IChubyBEU1Qgc2luY2UgMjAxNikgaWYgc3lzdGVtIERCIGhhcyBuZWl0aGVyLgogICAgLy8vIDwvc3VtbWFyeT4KICAgIHByaXZhdGUgc3RhdGljIFRpbWVab25lSW5mbyBGaW5kVGltZVpvbmVCeUlkKHN0cmluZyBpZCkKICAgIHsKICAgICAgICBmb3JlYWNoICh2YXIgY2FuZGlkYXRlIGluIEdldFRpbWVab25lSWRDYW5kaWRhdGVzKGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gVGltZVpvbmVJbmZvLkZpbmRTeXN0ZW1UaW1lWm9uZUJ5SWQoY2FuZGlkYXRlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoVGltZVpvbmVOb3RGb3VuZEV4Y2VwdGlvbikKICAgICAgICAgICAgewogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkVGltZVpvbmVFeGNlcHRpb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKElzVHVya2V5VGltZVpvbmVJZChpZCkpCiAgICAgICAgICAgIHJldHVybiBDcmVhdGVUdXJrZXlGaXhlZFV0Y1BsdXMzVGltZVpvbmUoKTsKCiAgICAgICAgdGhyb3cgbmV3IFRpbWVab25lTm90Rm91bmRFeGNlcHRpb24oJCJUaW1lIHpvbmUgSUQgJ3tpZH0nIHdhcyBub3QgZm91bmQgb24gdGhpcyBzeXN0ZW0uIik7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgSUVudW1lcmFibGU8c3RyaW5nPiBHZXRUaW1lWm9uZUlkQ2FuZGlkYXRlcyhzdHJpbmcgaWQpCiAgICB7CiAgICAgICAgeWllbGQgcmV0dXJuIGlkOwoKICAgICAgICBpZiAoc3RyaW5nLkVxdWFscyhpZCwgIkV1cm9wZS9Jc3RhbmJ1bCIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgIHsKICAgICAgICAgICAgeWllbGQgcmV0dXJuICJUdXJrZXkgU3RhbmRhcmQgVGltZSI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHN0cmluZy5FcXVhbHMoaWQsICJUdXJrZXkgU3RhbmRhcmQgVGltZSIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgIHsKICAgICAgICAgICAgeWllbGQgcmV0dXJuICJFdXJvcGUvSXN0YW5idWwiOwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBib29sIElzVHVya2V5VGltZVpvbmVJZChzdHJpbmcgaWQpCiAgICB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5FcXVhbHMoaWQsICJFdXJvcGUvSXN0YW5idWwiLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKQogICAgICAgICAgICB8fCBzdHJpbmcuRXF1YWxzKGlkLCAiVHVya2V5IFN0YW5kYXJkIFRpbWUiLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKTsKICAgIH0KCiAgICAvLy8gPHN1bW1hcnk+Rml4ZWQgVVRDKzM7IG1hdGNoZXMgVHVya2V5IHdhbGwgdGltZSBzaW5jZSAyMDE2IChEU1QgYWJvbGlzaGVkKS48L3N1bW1hcnk+CiAgICBwcml2YXRlIHN0YXRpYyBUaW1lWm9uZUluZm8gQ3JlYXRlVHVya2V5Rml4ZWRVdGNQbHVzM1RpbWVab25lKCkKICAgIHsKICAgICAgICByZXR1cm4gVGltZVpvbmVJbmZvLkNyZWF0ZUN1c3RvbVRpbWVab25lKAogICAgICAgICAgICAiRXVyb3BlL0lzdGFuYnVsLUZhbGxiYWNrIiwKICAgICAgICAgICAgVGltZVNwYW4uRnJvbUhvdXJzKDMpLAogICAgICAgICAgICAiRXVyb3BlL0lzdGFuYnVsIChVVEMrMykiLAogICAgICAgICAgICAiRXVyb3BlL0lzdGFuYnVsIChVVEMrMykiKTsKICAgIH0KCiAgICBwcml2YXRlIGludCBHZXRBcHBvaW50bWVudER1cmF0aW9uKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICBjb25zdCBpbnQgZGVmYXVsdER1cmF0aW9uID0gMzA7CgogICAgICAgIGlmIChjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsICYmIEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAiZHVyYXRpb24iKSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkdXJhdGlvblBhcmFtID0gY29udGV4dC5RdWVyeVBhcmFtZXRlcnNbImR1cmF0aW9uIl07CiAgICAgICAgICAgIGludCBxdWVyeUR1cmF0aW9uID0gMDsKICAgICAgICAgICAgaWYgKGR1cmF0aW9uUGFyYW0gIT0gbnVsbCAmJiBpbnQuVHJ5UGFyc2UoZHVyYXRpb25QYXJhbS5Ub1N0cmluZygpLCBvdXQgcXVlcnlEdXJhdGlvbikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBxdWVyeUR1cmF0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgY29uZmlnRHVyYXRpb24gPSBHZXRDb25maWdWYWx1ZSgiQXBwb2ludG1lbnRzOkRlZmF1bHREdXJhdGlvbiIpOwogICAgICAgIGludCBjb25maWdEdXJhdGlvblZhbHVlID0gMDsKICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGNvbmZpZ0R1cmF0aW9uKSAmJiBpbnQuVHJ5UGFyc2UoY29uZmlnRHVyYXRpb24sIG91dCBjb25maWdEdXJhdGlvblZhbHVlKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBjb25maWdEdXJhdGlvblZhbHVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGRlZmF1bHREdXJhdGlvbjsKICAgIH0KCiAgICAjZW5kcmVnaW9uCgogICAgI3JlZ2lvbiBCdXNpbmVzcyBMb2dpYyBNZXRob2RzCgogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIFJldHVybnMgdW5hdmFpbGFibGUgdGltZSByYW5nZXMgZm9yIHB1YmxpYyBob2xpZGF5cyBvbiB0aGUgcmVxdWVzdGVkIGRhdGUuCiAgICAvLy8gbnVsbCA9IG5vIGhvbGlkYXkgb24gdGhpcyBkYXRlLgogICAgLy8vIEZ1bGwtZGF5IGhvbGlkYXk6IHNpbmdsZSByYW5nZSAwMDowMC0yMzo1OS4KICAgIC8vLyBIYWxmLWRheSBob2xpZGF5OiBwYXJ0aWFsIHJhbmdlIChlLmcuLCAwMDowMC0xMzowMCkuCiAgICAvLy8gPC9zdW1tYXJ5PgogICAgcHJpdmF0ZSBMaXN0PFR1cGxlPFRpbWVTcGFuLCBUaW1lU3Bhbj4+IEdldEhvbGlkYXlSYW5nZXMoTGlzdDxkeW5hbWljPiBob2xpZGF5cywgRGF0ZVRpbWUgZGF0ZSkKICAgIHsKICAgICAgICB2YXIgcmFuZ2VzID0gbmV3IExpc3Q8VHVwbGU8VGltZVNwYW4sIFRpbWVTcGFuPj4oKTsKICAgICAgICBib29sIGhhc0hvbGlkYXkgPSBmYWxzZTsKCiAgICAgICAgZm9yZWFjaCAodmFyIGhvbGlkYXkgaW4gaG9saWRheXMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaG9saWRheURhdGEgPSBob2xpZGF5Py5hdHRyaWJ1dGVzOwogICAgICAgICAgICBpZiAoaG9saWRheURhdGEgPT0gbnVsbCkgY29udGludWU7CgogICAgICAgICAgICBzdHJpbmcgc3RhcnREYXRlVGltZVN0ciA9IG51bGw7CiAgICAgICAgICAgIHN0cmluZyBlbmREYXRlVGltZVN0ciA9IG51bGw7CgogICAgICAgICAgICBpZiAoSGFzUHJvcGVydHkoaG9saWRheURhdGEsICJzdGFydERhdGVUaW1lIikgJiYgaG9saWRheURhdGEuc3RhcnREYXRlVGltZSAhPSBudWxsKQogICAgICAgICAgICAgICAgc3RhcnREYXRlVGltZVN0ciA9IGhvbGlkYXlEYXRhLnN0YXJ0RGF0ZVRpbWUuVG9TdHJpbmcoKTsKCiAgICAgICAgICAgIGlmIChIYXNQcm9wZXJ0eShob2xpZGF5RGF0YSwgImVuZERhdGVUaW1lIikgJiYgaG9saWRheURhdGEuZW5kRGF0ZVRpbWUgIT0gbnVsbCkKICAgICAgICAgICAgICAgIGVuZERhdGVUaW1lU3RyID0gaG9saWRheURhdGEuZW5kRGF0ZVRpbWUuVG9TdHJpbmcoKTsKCiAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShzdGFydERhdGVUaW1lU3RyKSB8fCBzdHJpbmcuSXNOdWxsT3JFbXB0eShlbmREYXRlVGltZVN0cikpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIHZhciBzdGFydERhdGVUaW1lID0gRGF0ZVRpbWUuUGFyc2Uoc3RhcnREYXRlVGltZVN0cik7CiAgICAgICAgICAgIHZhciBlbmREYXRlVGltZSA9IERhdGVUaW1lLlBhcnNlKGVuZERhdGVUaW1lU3RyKTsKCiAgICAgICAgICAgIGlmIChkYXRlLkRhdGUgPCBzdGFydERhdGVUaW1lLkRhdGUgfHwgZGF0ZS5EYXRlID4gZW5kRGF0ZVRpbWUuRGF0ZSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgaGFzSG9saWRheSA9IHRydWU7CgogICAgICAgICAgICBpZiAoc3RhcnREYXRlVGltZS5EYXRlICE9IGVuZERhdGVUaW1lLkRhdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChkYXRlLkRhdGUgPT0gc3RhcnREYXRlVGltZS5EYXRlKQogICAgICAgICAgICAgICAgICAgIHJhbmdlcy5BZGQoVHVwbGUuQ3JlYXRlKHN0YXJ0RGF0ZVRpbWUuVGltZU9mRGF5LCBuZXcgVGltZVNwYW4oMjMsIDU5LCA1OSkpKTsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRhdGUuRGF0ZSA9PSBlbmREYXRlVGltZS5EYXRlKQogICAgICAgICAgICAgICAgICAgIHJhbmdlcy5BZGQoVHVwbGUuQ3JlYXRlKFRpbWVTcGFuLlplcm8sIGVuZERhdGVUaW1lLlRpbWVPZkRheSkpOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHJhbmdlcy5BZGQoVHVwbGUuQ3JlYXRlKFRpbWVTcGFuLlplcm8sIG5ldyBUaW1lU3BhbigyMywgNTksIDU5KSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmFuZ2VzLkFkZChUdXBsZS5DcmVhdGUoc3RhcnREYXRlVGltZS5UaW1lT2ZEYXksIGVuZERhdGVUaW1lLlRpbWVPZkRheSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaGFzSG9saWRheSA/IHJhbmdlcyA6IG51bGw7CiAgICB9CgogICAgcHJpdmF0ZSBMaXN0PG9iamVjdD4gR2V0V29ya2luZ0hvdXJzRm9yRGF5KExpc3Q8ZHluYW1pYz4gd29ya2luZ0hvdXJzQ2hhbmdlcywgc3RyaW5nIGRheU9mV2VlaykKICAgIHsKICAgICAgICBmb3JlYWNoICh2YXIgY2hhbmdlIGluIHdvcmtpbmdIb3Vyc0NoYW5nZXMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hhbmdlRGF0YSA9IGNoYW5nZT8uYXR0cmlidXRlczsKICAgICAgICAgICAgaWYgKGNoYW5nZURhdGEgPT0gbnVsbCkgY29udGludWU7CgogICAgICAgICAgICB2YXIgY3VzdG9tV0ggPSBjaGFuZ2VEYXRhPy5jdXN0b21Xb3JraW5nSG91cnM7CiAgICAgICAgICAgIGlmIChjdXN0b21XSCA9PSBudWxsKSBjb250aW51ZTsKCiAgICAgICAgICAgIHZhciBkYXlIb3VycyA9IEdldERheUhvdXJzRnJvbUN1c3RvbShjdXN0b21XSCwgZGF5T2ZXZWVrKTsKICAgICAgICAgICAgaWYgKGRheUhvdXJzICE9IG51bGwpIHJldHVybiBkYXlIb3VyczsKICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHByaXZhdGUgTGlzdDxvYmplY3Q+IEdldERheUhvdXJzRnJvbUN1c3RvbShkeW5hbWljIGN1c3RvbVdILCBzdHJpbmcgZGF5T2ZXZWVrKQogICAgewogICAgICAgIGR5bmFtaWMgZGF5SG91cnMgPSBudWxsOwogICAgICAgIHN3aXRjaCAoZGF5T2ZXZWVrKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAibW9uZGF5IjogZGF5SG91cnMgPSBjdXN0b21XSD8ubW9uZGF5OyBicmVhazsKICAgICAgICAgICAgY2FzZSAidHVlc2RheSI6IGRheUhvdXJzID0gY3VzdG9tV0g/LnR1ZXNkYXk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICJ3ZWRuZXNkYXkiOiBkYXlIb3VycyA9IGN1c3RvbVdIPy53ZWRuZXNkYXk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICJ0aHVyc2RheSI6IGRheUhvdXJzID0gY3VzdG9tV0g/LnRodXJzZGF5OyBicmVhazsKICAgICAgICAgICAgY2FzZSAiZnJpZGF5IjogZGF5SG91cnMgPSBjdXN0b21XSD8uZnJpZGF5OyBicmVhazsKICAgICAgICAgICAgY2FzZSAic2F0dXJkYXkiOiBkYXlIb3VycyA9IGN1c3RvbVdIPy5zYXR1cmRheTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgInN1bmRheSI6IGRheUhvdXJzID0gY3VzdG9tV0g/LnN1bmRheTsgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAoZGF5SG91cnMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CgogICAgICAgIHZhciByZXN1bHQgPSBuZXcgTGlzdDxvYmplY3Q+KCk7CiAgICAgICAgZm9yZWFjaCAodmFyIHJhbmdlIGluIGRheUhvdXJzKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0YXJ0ID0gcmFuZ2U/LnN0YXJ0Py5Ub1N0cmluZygpOwogICAgICAgICAgICB2YXIgZW5kID0gcmFuZ2U/LmVuZD8uVG9TdHJpbmcoKTsKICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShzdGFydCkgJiYgIXN0cmluZy5Jc051bGxPckVtcHR5KGVuZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJlc3VsdC5BZGQobmV3IHsgc3RhcnQsIGVuZCB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0LkNvdW50ID4gMCA/IHJlc3VsdCA6IG51bGw7CiAgICB9CgogICAgcHJpdmF0ZSBMaXN0PFR1cGxlPFRpbWVTcGFuLCBUaW1lU3Bhbj4+IEdldFVuYXZhaWxhYmxlUmFuZ2VzKExpc3Q8ZHluYW1pYz4gcGVyc29uYWxMZWF2ZXMsIERhdGVUaW1lIGRhdGUpCiAgICB7CiAgICAgICAgdmFyIHJhbmdlcyA9IG5ldyBMaXN0PFR1cGxlPFRpbWVTcGFuLCBUaW1lU3Bhbj4+KCk7CgogICAgICAgIGZvcmVhY2ggKHZhciBsZWF2ZSBpbiBwZXJzb25hbExlYXZlcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBsZWF2ZURhdGEgPSBsZWF2ZT8uYXR0cmlidXRlczsKICAgICAgICAgICAgaWYgKGxlYXZlRGF0YSA9PSBudWxsKSBjb250aW51ZTsKCiAgICAgICAgICAgIHN0cmluZyBzdGFydERhdGVUaW1lU3RyID0gbnVsbDsKICAgICAgICAgICAgc3RyaW5nIGVuZERhdGVUaW1lU3RyID0gbnVsbDsKCiAgICAgICAgICAgIGlmIChIYXNQcm9wZXJ0eShsZWF2ZURhdGEsICJzdGFydERhdGVUaW1lIikgJiYgbGVhdmVEYXRhLnN0YXJ0RGF0ZVRpbWUgIT0gbnVsbCkKICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZVRpbWVTdHIgPSBsZWF2ZURhdGEuc3RhcnREYXRlVGltZS5Ub1N0cmluZygpOwoKICAgICAgICAgICAgaWYgKEhhc1Byb3BlcnR5KGxlYXZlRGF0YSwgImVuZERhdGVUaW1lIikgJiYgbGVhdmVEYXRhLmVuZERhdGVUaW1lICE9IG51bGwpCiAgICAgICAgICAgICAgICBlbmREYXRlVGltZVN0ciA9IGxlYXZlRGF0YS5lbmREYXRlVGltZS5Ub1N0cmluZygpOwoKICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHN0YXJ0RGF0ZVRpbWVTdHIpIHx8IHN0cmluZy5Jc051bGxPckVtcHR5KGVuZERhdGVUaW1lU3RyKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgdmFyIHN0YXJ0RGF0ZVRpbWUgPSBEYXRlVGltZS5QYXJzZShzdGFydERhdGVUaW1lU3RyKTsKICAgICAgICAgICAgdmFyIGVuZERhdGVUaW1lID0gRGF0ZVRpbWUuUGFyc2UoZW5kRGF0ZVRpbWVTdHIpOwoKICAgICAgICAgICAgaWYgKGRhdGUuRGF0ZSA8IHN0YXJ0RGF0ZVRpbWUuRGF0ZSB8fCBkYXRlLkRhdGUgPiBlbmREYXRlVGltZS5EYXRlKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBpZiAoc3RhcnREYXRlVGltZS5EYXRlICE9IGVuZERhdGVUaW1lLkRhdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChkYXRlLkRhdGUgPT0gc3RhcnREYXRlVGltZS5EYXRlKQogICAgICAgICAgICAgICAgICAgIHJhbmdlcy5BZGQoVHVwbGUuQ3JlYXRlKHN0YXJ0RGF0ZVRpbWUuVGltZU9mRGF5LCBuZXcgVGltZVNwYW4oMjMsIDU5LCA1OSkpKTsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRhdGUuRGF0ZSA9PSBlbmREYXRlVGltZS5EYXRlKQogICAgICAgICAgICAgICAgICAgIHJhbmdlcy5BZGQoVHVwbGUuQ3JlYXRlKFRpbWVTcGFuLlplcm8sIGVuZERhdGVUaW1lLlRpbWVPZkRheSkpOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHJhbmdlcy5BZGQoVHVwbGUuQ3JlYXRlKFRpbWVTcGFuLlplcm8sIG5ldyBUaW1lU3BhbigyMywgNTksIDU5KSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmFuZ2VzLkFkZChUdXBsZS5DcmVhdGUoc3RhcnREYXRlVGltZS5UaW1lT2ZEYXksIGVuZERhdGVUaW1lLlRpbWVPZkRheSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmFuZ2VzOwogICAgfQoKICAgIHByaXZhdGUgTGlzdDxzdHJpbmc+IENhbGN1bGF0ZUF2YWlsYWJsZVNsb3RzKExpc3Q8b2JqZWN0PiB3b3JraW5nSG91cnMsIExpc3Q8VHVwbGU8VGltZVNwYW4sIFRpbWVTcGFuPj4gdW5hdmFpbGFibGVSYW5nZXMsIGludCBkdXJhdGlvbk1pbnV0ZXMpCiAgICB7CiAgICAgICAgdmFyIHNsb3RzID0gbmV3IExpc3Q8c3RyaW5nPigpOwogICAgICAgIHZhciBkdXJhdGlvbiA9IFRpbWVTcGFuLkZyb21NaW51dGVzKGR1cmF0aW9uTWludXRlcyk7CgogICAgICAgIGZvcmVhY2ggKHZhciB3aCBpbiB3b3JraW5nSG91cnMpCiAgICAgICAgewogICAgICAgICAgICBkeW5hbWljIHdoRHluID0gd2g7CiAgICAgICAgICAgIHZhciBzdGFydFN0ciA9IHdoRHluPy5zdGFydD8uVG9TdHJpbmcoKTsKICAgICAgICAgICAgdmFyIGVuZFN0ciA9IHdoRHluPy5lbmQ/LlRvU3RyaW5nKCk7CgogICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RhcnRTdHIpIHx8IHN0cmluZy5Jc051bGxPckVtcHR5KGVuZFN0cikpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIHZhciB3aFN0YXJ0ID0gVGltZVNwYW4uUGFyc2Uoc3RhcnRTdHIpOwogICAgICAgICAgICB2YXIgd2hFbmQgPSBUaW1lU3Bhbi5QYXJzZShlbmRTdHIpOwoKICAgICAgICAgICAgaWYgKHdoU3RhcnQgPT0gd2hFbmQpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gd2hTdGFydDsKICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQgKyBkdXJhdGlvbiA8PSB3aEVuZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNsb3RTdGFydCA9IGN1cnJlbnQ7CiAgICAgICAgICAgICAgICB2YXIgc2xvdEVuZCA9IGN1cnJlbnQgKyBkdXJhdGlvbjsKCiAgICAgICAgICAgICAgICBib29sIGlzQXZhaWxhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB1ciBpbiB1bmF2YWlsYWJsZVJhbmdlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2xvdFN0YXJ0IDwgdXIuSXRlbTIgJiYgc2xvdEVuZCA+IHVyLkl0ZW0xKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXNBdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpc0F2YWlsYWJsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzbG90cy5BZGQoJCJ7c2xvdFN0YXJ0OmhoXFw6bW19LXtzbG90RW5kOmhoXFw6bW19Iik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQgKyBkdXJhdGlvbjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHNsb3RzOwogICAgfQoKICAgIC8vLyA8c3VtbWFyeT4KICAgIC8vLyBXaGVuIHRoZSByZXF1ZXN0ZWQgY2FsZW5kYXIgZGF5IGVxdWFscyAidG9kYXkiIGluIHRoZSBidXNpbmVzcyB0aW1lem9uZSwgZHJvcCBzbG90cyB3aG9zZQogICAgLy8vIGxvY2FsIHN0YXJ0IHRpbWUgaXMgbm90IGFmdGVyICJub3ciIGluIHRoYXQgdGltZXpvbmUuIFNsb3Qgc3RyaW5ncyBtYXRjaCB3b3JraW5nIGhvdXJzICh3YWxsIGNsb2NrIGluIHRoYXQgVFopLgogICAgLy8vIDwvc3VtbWFyeT4KICAgIHByaXZhdGUgc3RhdGljIExpc3Q8c3RyaW5nPiBGaWx0ZXJTbG90c0V4Y2x1ZGluZ1Bhc3RGb3JCdXNpbmVzc1RvZGF5KExpc3Q8c3RyaW5nPiBzbG90cywgRGF0ZVRpbWUgcmVxdWVzdGVkRGF0ZSwgVGltZVpvbmVJbmZvIHR6KQogICAgewogICAgICAgIGlmIChzbG90cyA9PSBudWxsIHx8IHNsb3RzLkNvdW50ID09IDApCiAgICAgICAgICAgIHJldHVybiBzbG90cyA/PyBuZXcgTGlzdDxzdHJpbmc+KCk7CgogICAgICAgIHZhciBub3dJblR6ID0gVGltZVpvbmVJbmZvLkNvbnZlcnRUaW1lRnJvbVV0YyhEYXRlVGltZS5VdGNOb3csIHR6KTsKICAgICAgICBpZiAocmVxdWVzdGVkRGF0ZS5EYXRlICE9IG5vd0luVHouRGF0ZSkKICAgICAgICAgICAgcmV0dXJuIHNsb3RzOwoKICAgICAgICB2YXIgZmlsdGVyZWQgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CiAgICAgICAgdmFyIGRheVN0YXJ0TG9jYWwgPSBuZXcgRGF0ZVRpbWUocmVxdWVzdGVkRGF0ZS5ZZWFyLCByZXF1ZXN0ZWREYXRlLk1vbnRoLCByZXF1ZXN0ZWREYXRlLkRheSwgMCwgMCwgMCwgRGF0ZVRpbWVLaW5kLlVuc3BlY2lmaWVkKTsKCiAgICAgICAgZm9yZWFjaCAodmFyIHMgaW4gc2xvdHMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZShzKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgdmFyIHBhcnRzID0gcy5TcGxpdChuZXdbXSB7ICctJyB9LCAyLCBTdHJpbmdTcGxpdE9wdGlvbnMuTm9uZSk7CiAgICAgICAgICAgIGlmIChwYXJ0cy5MZW5ndGggIT0gMikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmlsdGVyZWQuQWRkKHMpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghVGltZVNwYW4uVHJ5UGFyc2UocGFydHNbMF0uVHJpbSgpLCBvdXQgdmFyIHN0YXJ0VHMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmaWx0ZXJlZC5BZGQocyk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHNsb3RTdGFydExvY2FsID0gZGF5U3RhcnRMb2NhbC5BZGQoc3RhcnRUcyk7CiAgICAgICAgICAgIGlmIChzbG90U3RhcnRMb2NhbCA+IG5vd0luVHopCiAgICAgICAgICAgICAgICBmaWx0ZXJlZC5BZGQocyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmlsdGVyZWQ7CiAgICB9CgogICAgI2VuZHJlZ2lvbgp9Cg=="
|
|
26
|
+
"code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CnVzaW5nIEJCVC5Xb3JrZmxvdy5EZWZpbml0aW9uczsKLy8vIDxzdW1tYXJ5PgovLy8gTWFwcGluZyBmb3IgR2V0QXZhaWxhYmxlU2xvdHNUYXNrIChEYXByU2VydmljZVRhc2sgLSBUeXBlIDMpCi8vLyBRdWVyaWVzIGFic2VuY2UtZW50cnkgd29ya2Zsb3cgKHN0YXRlOiBjb21wbGV0ZSkgdmlhIERhcHIgc2VydmljZSBpbnZvY2F0aW9uIHRvIGdldAovLy8gcHVibGljIGhvbGlkYXlzLCB3b3JraW5nIGhvdXJzIGNoYW5nZXMsIGFuZCBwZXJzb25hbCBsZWF2ZXMuCi8vLyBUaGVuIGNhbGN1bGF0ZXMgYXZhaWxhYmxlIGFwcG9pbnRtZW50IHNsb3RzIGZvciB0aGUgZ2l2ZW4gYWR2aXNvciBhbmQgZGF0ZS4KLy8vCi8vLyBXb3JraW5nIGhvdXJzIHByaW9yaXR5OiBhZHZpc29yLXNwZWNpZmljID4gY29tcGFueS13aWRlIChhZHZpc29yPW51bGwpID4gbm8gaG91cnMKLy8vIEhhbGYtZGF5IHB1YmxpYyBob2xpZGF5cyBvbmx5IGJsb2NrIHRoZSBob2xpZGF5IGhvdXJzLCBub3QgdGhlIGVudGlyZSBkYXkuCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBHZXRBdmFpbGFibGVTbG90c01hcHBpbmcgOiBTY3JpcHRCYXNlLCBJTWFwcGluZwp7CiAgICBwdWJsaWMgVGFzazxTY3JpcHRSZXNwb25zZT4gSW5wdXRIYW5kbGVyKFdvcmtmbG93VGFzayB0YXNrLCBTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdmFyIHNlcnZpY2VUYXNrID0gdGFzayBhcyBEYXByU2VydmljZVRhc2s7CiAgICAgICAgaWYgKHNlcnZpY2VUYXNrID09IG51bGwpCiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJUYXNrIG11c3QgYmUgYSBEYXByU2VydmljZVRhc2siKTsKCiAgICAgICAgdmFyIGFwcElkID0gR2V0Q29uZmlnVmFsdWUoIkRBUFJfQVBQX0lEIik7CiAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShhcHBJZCkpCiAgICAgICAgICAgIHNlcnZpY2VUYXNrLlNldEFwcElkKGFwcElkKTsKCiAgICAgICAgdmFyIGFkdmlzb3JJZCA9IGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzP1siYWR2aXNvcklkIl0/LlRvU3RyaW5nKCk7CiAgICAgICAgdmFyIGRhdGUgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bImRhdGUiXT8uVG9TdHJpbmcoKTsKCiAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGFkdmlzb3JJZCkgfHwgc3RyaW5nLklzTnVsbE9yRW1wdHkoZGF0ZSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAidmFsaWRhdGlvbi1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAiYWR2aXNvcklkIGFuZCBkYXRlIGFyZSByZXF1aXJlZCIsCiAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlID0gIlZBTElEQVRJT05fRVJST1IiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgdmFyIHJlcXVlc3RlZERhdGUgPSBEYXRlVGltZS5QYXJzZShkYXRlKTsKICAgICAgICB2YXIgdHogPSBSZXNvbHZlVGltZVpvbmUoY29udGV4dCk7CiAgICAgICAgdmFyIHRvZGF5SW5CdXNpbmVzc1R6ID0gVGltZVpvbmVJbmZvLkNvbnZlcnRUaW1lRnJvbVV0YyhEYXRlVGltZS5VdGNOb3csIHR6KS5EYXRlOwogICAgICAgIGlmIChyZXF1ZXN0ZWREYXRlLkRhdGUgPCB0b2RheUluQnVzaW5lc3NUeikKICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJEYXRlIGNhbm5vdCBiZSBpbiB0aGUgcGFzdC4iLCAiZGF0ZSIpOwoKICAgICAgICB2YXIgZmlsdGVySnNvbiA9CiAgICAgICAgICAgICJ7XCJhbmRcIjpbIiArCiAgICAgICAgICAgICJ7XCJvclwiOlt7XCJjdXJyZW50U3RhdGVcIjp7XCJlcVwiOlwiY29tcGxldGVcIn19LHtcImN1cnJlbnRTdGF0ZVwiOntcImVxXCI6XCJjb21wbGV0ZS13aXRoLXRyYW5zZmVyXCJ9fV19LCIgKwogICAgICAgICAgICAie1wib3JcIjpbIiArCiAgICAgICAgICAgICAgICAie1wiYXR0cmlidXRlc1wiOntcImFkdmlzb3JcIjp7XCJlcVwiOlwiIiArIGFkdmlzb3JJZCArICJcIn19fSwiICsKICAgICAgICAgICAgICAgICJ7XCJhdHRyaWJ1dGVzXCI6e1wiYWJzZW5jZVR5cGVcIjp7XCJlcVwiOlwicHVibGljLWhvbGlkYXlcIn19fSwiICsKICAgICAgICAgICAgICAgICJ7XCJhdHRyaWJ1dGVzXCI6e1wiYWJzZW5jZVR5cGVcIjp7XCJlcVwiOlwid29ya2luZy1ob3Vycy1jaGFuZ2VcIn19fSIgKwogICAgICAgICAgICAiXX0iICsKICAgICAgICAgICAgIl19IjsKCiAgICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0gbmV3IExpc3Q8c3RyaW5nPgogICAgICAgIHsKICAgICAgICAgICAgInBhZ2VTaXplPTEwMCIsCiAgICAgICAgICAgICQiZmlsdGVyPXtmaWx0ZXJKc29ufSIKICAgICAgICB9OwoKICAgICAgICBzZXJ2aWNlVGFzay5TZXRRdWVyeVN0cmluZyhzdHJpbmcuSm9pbigiJiIsIHF1ZXJ5UGFyYW1zKSk7CgogICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlKCkpOwogICAgfQoKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBPdXRwdXRIYW5kbGVyKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhZHZpc29ySWQgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bImFkdmlzb3JJZCJdPy5Ub1N0cmluZygpOwogICAgICAgICAgICB2YXIgZGF0ZVN0ciA9IGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzP1siZGF0ZSJdPy5Ub1N0cmluZygpOwogICAgICAgICAgICB2YXIgZHVyYXRpb24gPSBHZXRBcHBvaW50bWVudER1cmF0aW9uKGNvbnRleHQpOwoKICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGFkdmlzb3JJZCkgfHwgc3RyaW5nLklzTnVsbE9yRW1wdHkoZGF0ZVN0cikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gInZhbGlkYXRpb24tZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gImFkdmlzb3JJZCBhbmQgZGF0ZSBhcmUgcmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiVkFMSURBVElPTl9FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkdmlzb3JJZCwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IGRhdGVTdHIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHJlcXVlc3RlZERhdGUgPSBEYXRlVGltZS5QYXJzZShkYXRlU3RyKTsKICAgICAgICAgICAgdmFyIGRheU9mV2VlayA9IHJlcXVlc3RlZERhdGUuRGF5T2ZXZWVrLlRvU3RyaW5nKCkuVG9Mb3dlcigpOwoKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gY29udGV4dC5Cb2R5OwoKICAgICAgICAgICAgaWYgKHJlc3BvbnNlPy5pc1N1Y2Nlc3MgPT0gZmFsc2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBlcnJvclR5cGUgPSBDbGFzc2lmeVNlcnZpY2VFcnJvcihyZXNwb25zZT8uZXJyb3JNZXNzYWdlPy5Ub1N0cmluZygpID8/ICIiKTsKICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gInNlcnZpY2UtZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gIkZhaWxlZCB0byBmZXRjaCBhYnNlbmNlIGVudHJpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiU0VSVklDRV9FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yVHlwZSA9IGVycm9yVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gcmVzcG9uc2U/LmVycm9yTWVzc2FnZT8uVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUluZm8gPSBuZXcKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwSWQgPSByZXNwb25zZT8ubWV0YWRhdGE/LmFwcElkPy5Ub1N0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9IHJlc3BvbnNlPy5tZXRhZGF0YT8ubWV0aG9kTmFtZT8uVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBWZXJiID0gcmVzcG9uc2U/Lm1ldGFkYXRhPy5odHRwVmVyYj8uVG9TdHJpbmcoKQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiYXBwb2ludG1lbnRzIiwgImVycm9yIiB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlPy5kYXRhOwogICAgICAgICAgICB2YXIgaXRlbXMgPSByZXNwb25zZURhdGE/Lml0ZW1zOwoKICAgICAgICAgICAgdmFyIGluc3RhbmNlcyA9IG5ldyBMaXN0PGR5bmFtaWM+KCk7CiAgICAgICAgICAgIGlmIChpdGVtcyAhPSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBpdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZXMuQWRkKGl0ZW0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcHVibGljSG9saWRheXMgPSBuZXcgTGlzdDxkeW5hbWljPigpOwogICAgICAgICAgICB2YXIgYWR2aXNvcldvcmtpbmdIb3VycyA9IG5ldyBMaXN0PGR5bmFtaWM+KCk7CiAgICAgICAgICAgIHZhciBjb21wYW55V29ya2luZ0hvdXJzID0gbmV3IExpc3Q8ZHluYW1pYz4oKTsKICAgICAgICAgICAgdmFyIHBlcnNvbmFsTGVhdmVzID0gbmV3IExpc3Q8ZHluYW1pYz4oKTsKCiAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpbnN0YW5jZSBpbiBpbnN0YW5jZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVzID0gaW5zdGFuY2U/LmF0dHJpYnV0ZXM7CiAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSBjb250aW51ZTsKCiAgICAgICAgICAgICAgICB2YXIgYWJzZW5jZVR5cGUgPSBhdHRyaWJ1dGVzPy5hYnNlbmNlVHlwZT8uVG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgIHZhciBhZHZpc29yID0gSGFzUHJvcGVydHkoYXR0cmlidXRlcywgImFkdmlzb3IiKSA/IGF0dHJpYnV0ZXM/LmFkdmlzb3I/LlRvU3RyaW5nKCkgOiBudWxsOwoKICAgICAgICAgICAgICAgIHN3aXRjaCAoYWJzZW5jZVR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAicHVibGljLWhvbGlkYXkiOgogICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNIb2xpZGF5cy5BZGQoaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJ3b3JraW5nLWhvdXJzLWNoYW5nZSI6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoYWR2aXNvcikgJiYgYWR2aXNvciA9PSBhZHZpc29ySWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZpc29yV29ya2luZ0hvdXJzLkFkZChpbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGFkdmlzb3IpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFueVdvcmtpbmdIb3Vycy5BZGQoaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJwZXJzb25hbC1sZWF2ZSIgd2hlbiBhZHZpc29yID09IGFkdmlzb3JJZDoKICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uYWxMZWF2ZXMuQWRkKGluc3RhbmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAicmV6ZXJ2YXRpb24iIHdoZW4gYWR2aXNvciA9PSBhZHZpc29ySWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNvbmFsTGVhdmVzLkFkZChpbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdHogPSBSZXNvbHZlVGltZVpvbmUoY29udGV4dCk7CiAgICAgICAgICAgIHZhciB1bmF2YWlsYWJsZVJhbmdlcyA9IEdldFVuYXZhaWxhYmxlUmFuZ2VzKHBlcnNvbmFsTGVhdmVzLCByZXF1ZXN0ZWREYXRlLCB0eik7CgogICAgICAgICAgICAvLyBIYWxmLWRheSAvIGZ1bGwtZGF5IHB1YmxpYyBob2xpZGF5IGhhbmRsaW5nCiAgICAgICAgICAgIHZhciBob2xpZGF5UmFuZ2VzID0gR2V0SG9saWRheVJhbmdlcyhwdWJsaWNIb2xpZGF5cywgcmVxdWVzdGVkRGF0ZSwgdHopOwogICAgICAgICAgICBpZiAoaG9saWRheVJhbmdlcyAhPSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaG9saWRheVJhbmdlcy5Db3VudCA9PSAxCiAgICAgICAgICAgICAgICAgICAgJiYgaG9saWRheVJhbmdlc1swXS5JdGVtMSA9PSBUaW1lU3Bhbi5aZXJvCiAgICAgICAgICAgICAgICAgICAgJiYgaG9saWRheVJhbmdlc1swXS5JdGVtMiA+PSBuZXcgVGltZVNwYW4oMjMsIDU5LCAwKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ID0gInB1YmxpYy1ob2xpZGF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9IG5ldyB7IGF2YWlsYWJsZVNsb3RzID0gbmV3IExpc3Q8c3RyaW5nPigpIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJhcHBvaW50bWVudHMiLCAiaG9saWRheSIgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHVuYXZhaWxhYmxlUmFuZ2VzLkFkZFJhbmdlKGhvbGlkYXlSYW5nZXMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBXb3JraW5nIGhvdXJzIHByaW9yaXR5OiBhZHZpc29yLXNwZWNpZmljID4gY29tcGFueS13aWRlCiAgICAgICAgICAgIHZhciB3b3JraW5nSG91cnMgPSBHZXRXb3JraW5nSG91cnNGb3JEYXkoYWR2aXNvcldvcmtpbmdIb3VycywgZGF5T2ZXZWVrKTsKICAgICAgICAgICAgaWYgKHdvcmtpbmdIb3VycyA9PSBudWxsIHx8IHdvcmtpbmdIb3Vycy5Db3VudCA9PSAwKQogICAgICAgICAgICAgICAgd29ya2luZ0hvdXJzID0gR2V0V29ya2luZ0hvdXJzRm9yRGF5KGNvbXBhbnlXb3JraW5nSG91cnMsIGRheU9mV2Vlayk7CgogICAgICAgICAgICBpZiAod29ya2luZ0hvdXJzID09IG51bGwgfHwgd29ya2luZ0hvdXJzLkNvdW50ID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gIm5vLXdvcmtpbmctaG91cnMiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcgeyBhdmFpbGFibGVTbG90cyA9IG5ldyBMaXN0PHN0cmluZz4oKSB9LAogICAgICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJhcHBvaW50bWVudHMiLCAiY2xvc2VkIiB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGF2YWlsYWJsZVNsb3RzID0gQ2FsY3VsYXRlQXZhaWxhYmxlU2xvdHMod29ya2luZ0hvdXJzLCB1bmF2YWlsYWJsZVJhbmdlcywgZHVyYXRpb24pOwogICAgICAgICAgICBhdmFpbGFibGVTbG90cyA9IEZpbHRlclNsb3RzRXhjbHVkaW5nUGFzdEZvckJ1c2luZXNzVG9kYXkoYXZhaWxhYmxlU2xvdHMsIHJlcXVlc3RlZERhdGUsIHR6KTsKCiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJhdmFpbGFibGUtc2xvdHMtc3VjY2VzcyIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3IHsgYXZhaWxhYmxlU2xvdHMgfSwKICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJhcHBvaW50bWVudHMiLCAiYXZhaWxhYmlsaXR5IiwgInN1Y2Nlc3MiIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAib3V0cHV0LWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJJbnRlcm5hbCBwcm9jZXNzaW5nIGVycm9yIiwKICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiUFJPQ0VTU0lOR19FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgZXJyb3JEZXNjcmlwdGlvbiA9IGV4Lk1lc3NhZ2UKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiYXBwb2ludG1lbnRzIiwgImVycm9yIiB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICAjcmVnaW9uIEhlbHBlciBNZXRob2RzCgogICAgcHJpdmF0ZSBzdHJpbmcgQ2xhc3NpZnlTZXJ2aWNlRXJyb3Ioc3RyaW5nIGVycm9yTWVzc2FnZSkKICAgIHsKICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLkNvbnRhaW5zKCJ0aW1lb3V0IiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpCiAgICAgICAgICAgIHJldHVybiAidGltZW91dCI7CiAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5Db250YWlucygidW5hdXRob3JpemVkIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpCiAgICAgICAgICAgIHJldHVybiAiYXV0aGVudGljYXRpb24iOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoImZvcmJpZGRlbiIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gImF1dGhvcml6YXRpb24iOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoIm5vdCBmb3VuZCIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gIm5vdC1mb3VuZCI7CiAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5Db250YWlucygic2VydmljZSB1bmF2YWlsYWJsZSIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gInNlcnZpY2UtdW5hdmFpbGFibGUiOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoImNvbm5lY3Rpb24iLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSkKICAgICAgICAgICAgcmV0dXJuICJjb25uZWN0aW9uLWVycm9yIjsKCiAgICAgICAgcmV0dXJuICJnZW5lcmFsLWVycm9yIjsKICAgIH0KCiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gSUFOQSBpZCAoZS5nLiBFdXJvcGUvSXN0YW5idWwpIG9yIFdpbmRvd3MgaWQgKFR1cmtleSBTdGFuZGFyZCBUaW1lKS4gUXVlcnkgb3ZlcnJpZGVzIGNvbmZpZy4KICAgIC8vLyA8L3N1bW1hcnk+CiAgICBwcml2YXRlIFRpbWVab25lSW5mbyBSZXNvbHZlVGltZVpvbmUoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHN0cmluZyBpZCA9IG51bGw7CiAgICAgICAgaWYgKGNvbnRleHQ/LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAidGltZVpvbmUiKSkKICAgICAgICAgICAgICAgIGlkID0gY29udGV4dC5RdWVyeVBhcmFtZXRlcnNbInRpbWVab25lIl0/LlRvU3RyaW5nKCk7CiAgICAgICAgICAgIGVsc2UgaWYgKEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAidGltZXpvbmUiKSkKICAgICAgICAgICAgICAgIGlkID0gY29udGV4dC5RdWVyeVBhcmFtZXRlcnNbInRpbWV6b25lIl0/LlRvU3RyaW5nKCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZShpZCkpCiAgICAgICAgICAgIGlkID0gR2V0Q29uZmlnVmFsdWUoIkFwcG9pbnRtZW50czpUaW1lWm9uZSIpID8/IEdldENvbmZpZ1ZhbHVlKCJBUFBPSU5UTUVOVF9USU1FWk9ORSIpOwoKICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZShpZCkpCiAgICAgICAgICAgIGlkID0gIkV1cm9wZS9Jc3RhbmJ1bCI7CgogICAgICAgIHJldHVybiBGaW5kVGltZVpvbmVCeUlkKGlkLlRyaW0oKSk7CiAgICB9CgogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIExpbnV4L21hY09TOiBJQU5BIGlkcyAoRXVyb3BlL0lzdGFuYnVsKS4gV2luZG93czogb2Z0ZW4gVHVya2V5IFN0YW5kYXJkIFRpbWUuCiAgICAvLy8gVHJpZXMgYWxpYXNlcywgdGhlbiBmaXhlZCBVVEMrMyBmb3IgVHVya2V5IChubyBEU1Qgc2luY2UgMjAxNikgaWYgc3lzdGVtIERCIGhhcyBuZWl0aGVyLgogICAgLy8vIDwvc3VtbWFyeT4KICAgIHByaXZhdGUgRGF0ZVRpbWUgUGFyc2VUb1V0YyhzdHJpbmcgZGF0ZVN0cikKICAgIHsKICAgICAgICB2YXIgZHRvID0gRGF0ZVRpbWVPZmZzZXQuUGFyc2UoZGF0ZVN0ciwKICAgICAgICAgICAgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CiAgICAgICAgcmV0dXJuIGR0by5VdGNEYXRlVGltZTsKICAgIH0KCiAgICBwcml2YXRlIFRpbWVab25lSW5mbyBGaW5kVGltZVpvbmVCeUlkKHN0cmluZyBpZCkKICAgIHsKICAgICAgICBmb3JlYWNoICh2YXIgY2FuZGlkYXRlIGluIEdldFRpbWVab25lSWRDYW5kaWRhdGVzKGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gVGltZVpvbmVJbmZvLkZpbmRTeXN0ZW1UaW1lWm9uZUJ5SWQoY2FuZGlkYXRlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoVGltZVpvbmVOb3RGb3VuZEV4Y2VwdGlvbikKICAgICAgICAgICAgewogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkVGltZVpvbmVFeGNlcHRpb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKElzVHVya2V5VGltZVpvbmVJZChpZCkpCiAgICAgICAgICAgIHJldHVybiBDcmVhdGVUdXJrZXlGaXhlZFV0Y1BsdXMzVGltZVpvbmUoKTsKCiAgICAgICAgdGhyb3cgbmV3IFRpbWVab25lTm90Rm91bmRFeGNlcHRpb24oJCJUaW1lIHpvbmUgSUQgJ3tpZH0nIHdhcyBub3QgZm91bmQgb24gdGhpcyBzeXN0ZW0uIik7CiAgICB9CgogICAgcHJpdmF0ZSBJRW51bWVyYWJsZTxzdHJpbmc+IEdldFRpbWVab25lSWRDYW5kaWRhdGVzKHN0cmluZyBpZCkKICAgIHsKICAgICAgICB5aWVsZCByZXR1cm4gaWQ7CgogICAgICAgIGlmIChzdHJpbmcuRXF1YWxzKGlkLCAiRXVyb3BlL0lzdGFuYnVsIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpCiAgICAgICAgewogICAgICAgICAgICB5aWVsZCByZXR1cm4gIlR1cmtleSBTdGFuZGFyZCBUaW1lIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc3RyaW5nLkVxdWFscyhpZCwgIlR1cmtleSBTdGFuZGFyZCBUaW1lIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpCiAgICAgICAgewogICAgICAgICAgICB5aWVsZCByZXR1cm4gIkV1cm9wZS9Jc3RhbmJ1bCI7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgYm9vbCBJc1R1cmtleVRpbWVab25lSWQoc3RyaW5nIGlkKQogICAgewogICAgICAgIHJldHVybiBzdHJpbmcuRXF1YWxzKGlkLCAiRXVyb3BlL0lzdGFuYnVsIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkKICAgICAgICAgICAgfHwgc3RyaW5nLkVxdWFscyhpZCwgIlR1cmtleSBTdGFuZGFyZCBUaW1lIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSk7CiAgICB9CgogICAgLy8vIDxzdW1tYXJ5PkZpeGVkIFVUQyszOyBtYXRjaGVzIFR1cmtleSB3YWxsIHRpbWUgc2luY2UgMjAxNiAoRFNUIGFib2xpc2hlZCkuPC9zdW1tYXJ5PgogICAgcHJpdmF0ZSBUaW1lWm9uZUluZm8gQ3JlYXRlVHVya2V5Rml4ZWRVdGNQbHVzM1RpbWVab25lKCkKICAgIHsKICAgICAgICByZXR1cm4gVGltZVpvbmVJbmZvLkNyZWF0ZUN1c3RvbVRpbWVab25lKAogICAgICAgICAgICAiRXVyb3BlL0lzdGFuYnVsLUZhbGxiYWNrIiwKICAgICAgICAgICAgVGltZVNwYW4uRnJvbUhvdXJzKDMpLAogICAgICAgICAgICAiRXVyb3BlL0lzdGFuYnVsIChVVEMrMykiLAogICAgICAgICAgICAiRXVyb3BlL0lzdGFuYnVsIChVVEMrMykiKTsKICAgIH0KCiAgICBwcml2YXRlIGludCBHZXRBcHBvaW50bWVudER1cmF0aW9uKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICBjb25zdCBpbnQgZGVmYXVsdER1cmF0aW9uID0gMzA7CgogICAgICAgIGlmIChjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsICYmIEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAiZHVyYXRpb24iKSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkdXJhdGlvblBhcmFtID0gY29udGV4dC5RdWVyeVBhcmFtZXRlcnNbImR1cmF0aW9uIl07CiAgICAgICAgICAgIGludCBxdWVyeUR1cmF0aW9uID0gMDsKICAgICAgICAgICAgaWYgKGR1cmF0aW9uUGFyYW0gIT0gbnVsbCAmJiBpbnQuVHJ5UGFyc2UoZHVyYXRpb25QYXJhbS5Ub1N0cmluZygpLCBvdXQgcXVlcnlEdXJhdGlvbikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBxdWVyeUR1cmF0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgY29uZmlnRHVyYXRpb24gPSBHZXRDb25maWdWYWx1ZSgiQXBwb2ludG1lbnRzOkRlZmF1bHREdXJhdGlvbiIpOwogICAgICAgIGludCBjb25maWdEdXJhdGlvblZhbHVlID0gMDsKICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGNvbmZpZ0R1cmF0aW9uKSAmJiBpbnQuVHJ5UGFyc2UoY29uZmlnRHVyYXRpb24sIG91dCBjb25maWdEdXJhdGlvblZhbHVlKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBjb25maWdEdXJhdGlvblZhbHVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGRlZmF1bHREdXJhdGlvbjsKICAgIH0KCiAgICAjZW5kcmVnaW9uCgogICAgI3JlZ2lvbiBCdXNpbmVzcyBMb2dpYyBNZXRob2RzCgogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIFJldHVybnMgdW5hdmFpbGFibGUgdGltZSByYW5nZXMgZm9yIHB1YmxpYyBob2xpZGF5cyBvbiB0aGUgcmVxdWVzdGVkIGRhdGUuCiAgICAvLy8gbnVsbCA9IG5vIGhvbGlkYXkgb24gdGhpcyBkYXRlLgogICAgLy8vIEZ1bGwtZGF5IGhvbGlkYXk6IHNpbmdsZSByYW5nZSAwMDowMC0yMzo1OS4KICAgIC8vLyBIYWxmLWRheSBob2xpZGF5OiBwYXJ0aWFsIHJhbmdlIChlLmcuLCAwMDowMC0xMzowMCkuCiAgICAvLy8gPC9zdW1tYXJ5PgogICAgcHJpdmF0ZSBMaXN0PFR1cGxlPFRpbWVTcGFuLCBUaW1lU3Bhbj4+IEdldEhvbGlkYXlSYW5nZXMoTGlzdDxkeW5hbWljPiBob2xpZGF5cywgRGF0ZVRpbWUgZGF0ZSwgVGltZVpvbmVJbmZvIHR6KQogICAgewogICAgICAgIHZhciByYW5nZXMgPSBuZXcgTGlzdDxUdXBsZTxUaW1lU3BhbiwgVGltZVNwYW4+PigpOwogICAgICAgIGJvb2wgaGFzSG9saWRheSA9IGZhbHNlOwoKICAgICAgICBmb3JlYWNoICh2YXIgaG9saWRheSBpbiBob2xpZGF5cykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBob2xpZGF5RGF0YSA9IGhvbGlkYXk/LmF0dHJpYnV0ZXM7CiAgICAgICAgICAgIGlmIChob2xpZGF5RGF0YSA9PSBudWxsKSBjb250aW51ZTsKCiAgICAgICAgICAgIHN0cmluZyBzdGFydERhdGVUaW1lU3RyID0gbnVsbDsKICAgICAgICAgICAgc3RyaW5nIGVuZERhdGVUaW1lU3RyID0gbnVsbDsKCiAgICAgICAgICAgIGlmIChIYXNQcm9wZXJ0eShob2xpZGF5RGF0YSwgInN0YXJ0RGF0ZVRpbWUiKSAmJiBob2xpZGF5RGF0YS5zdGFydERhdGVUaW1lICE9IG51bGwpCiAgICAgICAgICAgICAgICBzdGFydERhdGVUaW1lU3RyID0gaG9saWRheURhdGEuc3RhcnREYXRlVGltZS5Ub1N0cmluZygpOwoKICAgICAgICAgICAgaWYgKEhhc1Byb3BlcnR5KGhvbGlkYXlEYXRhLCAiZW5kRGF0ZVRpbWUiKSAmJiBob2xpZGF5RGF0YS5lbmREYXRlVGltZSAhPSBudWxsKQogICAgICAgICAgICAgICAgZW5kRGF0ZVRpbWVTdHIgPSBob2xpZGF5RGF0YS5lbmREYXRlVGltZS5Ub1N0cmluZygpOwoKICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHN0YXJ0RGF0ZVRpbWVTdHIpIHx8IHN0cmluZy5Jc051bGxPckVtcHR5KGVuZERhdGVUaW1lU3RyKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgdmFyIHN0YXJ0RGF0ZVRpbWUgPSBUaW1lWm9uZUluZm8uQ29udmVydFRpbWVGcm9tVXRjKFBhcnNlVG9VdGMoc3RhcnREYXRlVGltZVN0ciksIHR6KTsKICAgICAgICAgICAgdmFyIGVuZERhdGVUaW1lID0gVGltZVpvbmVJbmZvLkNvbnZlcnRUaW1lRnJvbVV0YyhQYXJzZVRvVXRjKGVuZERhdGVUaW1lU3RyKSwgdHopOwoKICAgICAgICAgICAgaWYgKGRhdGUuRGF0ZSA8IHN0YXJ0RGF0ZVRpbWUuRGF0ZSB8fCBkYXRlLkRhdGUgPiBlbmREYXRlVGltZS5EYXRlKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBoYXNIb2xpZGF5ID0gdHJ1ZTsKCiAgICAgICAgICAgIGlmIChzdGFydERhdGVUaW1lLkRhdGUgIT0gZW5kRGF0ZVRpbWUuRGF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGUuRGF0ZSA9PSBzdGFydERhdGVUaW1lLkRhdGUpCiAgICAgICAgICAgICAgICAgICAgcmFuZ2VzLkFkZChUdXBsZS5DcmVhdGUoc3RhcnREYXRlVGltZS5UaW1lT2ZEYXksIG5ldyBUaW1lU3BhbigyMywgNTksIDU5KSkpOwogICAgICAgICAgICAgICAgZWxzZSBpZiAoZGF0ZS5EYXRlID09IGVuZERhdGVUaW1lLkRhdGUpCiAgICAgICAgICAgICAgICAgICAgcmFuZ2VzLkFkZChUdXBsZS5DcmVhdGUoVGltZVNwYW4uWmVybywgZW5kRGF0ZVRpbWUuVGltZU9mRGF5KSk7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgcmFuZ2VzLkFkZChUdXBsZS5DcmVhdGUoVGltZVNwYW4uWmVybywgbmV3IFRpbWVTcGFuKDIzLCA1OSwgNTkpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByYW5nZXMuQWRkKFR1cGxlLkNyZWF0ZShzdGFydERhdGVUaW1lLlRpbWVPZkRheSwgZW5kRGF0ZVRpbWUuVGltZU9mRGF5KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBoYXNIb2xpZGF5ID8gcmFuZ2VzIDogbnVsbDsKICAgIH0KCiAgICBwcml2YXRlIExpc3Q8b2JqZWN0PiBHZXRXb3JraW5nSG91cnNGb3JEYXkoTGlzdDxkeW5hbWljPiB3b3JraW5nSG91cnNDaGFuZ2VzLCBzdHJpbmcgZGF5T2ZXZWVrKQogICAgewogICAgICAgIGZvcmVhY2ggKHZhciBjaGFuZ2UgaW4gd29ya2luZ0hvdXJzQ2hhbmdlcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGFuZ2VEYXRhID0gY2hhbmdlPy5hdHRyaWJ1dGVzOwogICAgICAgICAgICBpZiAoY2hhbmdlRGF0YSA9PSBudWxsKSBjb250aW51ZTsKCiAgICAgICAgICAgIHZhciBjdXN0b21XSCA9IGNoYW5nZURhdGE/LmN1c3RvbVdvcmtpbmdIb3VyczsKICAgICAgICAgICAgaWYgKGN1c3RvbVdIID09IG51bGwpIGNvbnRpbnVlOwoKICAgICAgICAgICAgdmFyIGRheUhvdXJzID0gR2V0RGF5SG91cnNGcm9tQ3VzdG9tKGN1c3RvbVdILCBkYXlPZldlZWspOwogICAgICAgICAgICBpZiAoZGF5SG91cnMgIT0gbnVsbCkgcmV0dXJuIGRheUhvdXJzOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcHJpdmF0ZSBMaXN0PG9iamVjdD4gR2V0RGF5SG91cnNGcm9tQ3VzdG9tKGR5bmFtaWMgY3VzdG9tV0gsIHN0cmluZyBkYXlPZldlZWspCiAgICB7CiAgICAgICAgZHluYW1pYyBkYXlIb3VycyA9IG51bGw7CiAgICAgICAgc3dpdGNoIChkYXlPZldlZWspCiAgICAgICAgewogICAgICAgICAgICBjYXNlICJtb25kYXkiOiBkYXlIb3VycyA9IGN1c3RvbVdIPy5tb25kYXk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICJ0dWVzZGF5IjogZGF5SG91cnMgPSBjdXN0b21XSD8udHVlc2RheTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIndlZG5lc2RheSI6IGRheUhvdXJzID0gY3VzdG9tV0g/LndlZG5lc2RheTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgInRodXJzZGF5IjogZGF5SG91cnMgPSBjdXN0b21XSD8udGh1cnNkYXk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICJmcmlkYXkiOiBkYXlIb3VycyA9IGN1c3RvbVdIPy5mcmlkYXk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICJzYXR1cmRheSI6IGRheUhvdXJzID0gY3VzdG9tV0g/LnNhdHVyZGF5OyBicmVhazsKICAgICAgICAgICAgY2FzZSAic3VuZGF5IjogZGF5SG91cnMgPSBjdXN0b21XSD8uc3VuZGF5OyBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmIChkYXlIb3VycyA9PSBudWxsKSByZXR1cm4gbnVsbDsKCiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMaXN0PG9iamVjdD4oKTsKICAgICAgICBmb3JlYWNoICh2YXIgcmFuZ2UgaW4gZGF5SG91cnMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3RhcnQgPSByYW5nZT8uc3RhcnQ/LlRvU3RyaW5nKCk7CiAgICAgICAgICAgIHZhciBlbmQgPSByYW5nZT8uZW5kPy5Ub1N0cmluZygpOwogICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHN0YXJ0KSAmJiAhc3RyaW5nLklzTnVsbE9yRW1wdHkoZW5kKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0LkFkZChuZXcgeyBzdGFydCwgZW5kIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQuQ291bnQgPiAwID8gcmVzdWx0IDogbnVsbDsKICAgIH0KCiAgICBwcml2YXRlIExpc3Q8VHVwbGU8VGltZVNwYW4sIFRpbWVTcGFuPj4gR2V0VW5hdmFpbGFibGVSYW5nZXMoTGlzdDxkeW5hbWljPiBwZXJzb25hbExlYXZlcywgRGF0ZVRpbWUgZGF0ZSwgVGltZVpvbmVJbmZvIHR6KQogICAgewogICAgICAgIHZhciByYW5nZXMgPSBuZXcgTGlzdDxUdXBsZTxUaW1lU3BhbiwgVGltZVNwYW4+PigpOwoKICAgICAgICBmb3JlYWNoICh2YXIgbGVhdmUgaW4gcGVyc29uYWxMZWF2ZXMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbGVhdmVEYXRhID0gbGVhdmU/LmF0dHJpYnV0ZXM7CiAgICAgICAgICAgIGlmIChsZWF2ZURhdGEgPT0gbnVsbCkgY29udGludWU7CgogICAgICAgICAgICBzdHJpbmcgc3RhcnREYXRlVGltZVN0ciA9IG51bGw7CiAgICAgICAgICAgIHN0cmluZyBlbmREYXRlVGltZVN0ciA9IG51bGw7CgogICAgICAgICAgICBpZiAoSGFzUHJvcGVydHkobGVhdmVEYXRhLCAic3RhcnREYXRlVGltZSIpICYmIGxlYXZlRGF0YS5zdGFydERhdGVUaW1lICE9IG51bGwpCiAgICAgICAgICAgICAgICBzdGFydERhdGVUaW1lU3RyID0gbGVhdmVEYXRhLnN0YXJ0RGF0ZVRpbWUuVG9TdHJpbmcoKTsKCiAgICAgICAgICAgIGlmIChIYXNQcm9wZXJ0eShsZWF2ZURhdGEsICJlbmREYXRlVGltZSIpICYmIGxlYXZlRGF0YS5lbmREYXRlVGltZSAhPSBudWxsKQogICAgICAgICAgICAgICAgZW5kRGF0ZVRpbWVTdHIgPSBsZWF2ZURhdGEuZW5kRGF0ZVRpbWUuVG9TdHJpbmcoKTsKCiAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShzdGFydERhdGVUaW1lU3RyKSB8fCBzdHJpbmcuSXNOdWxsT3JFbXB0eShlbmREYXRlVGltZVN0cikpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIHZhciBzdGFydERhdGVUaW1lID0gVGltZVpvbmVJbmZvLkNvbnZlcnRUaW1lRnJvbVV0YyhQYXJzZVRvVXRjKHN0YXJ0RGF0ZVRpbWVTdHIpLCB0eik7CiAgICAgICAgICAgIHZhciBlbmREYXRlVGltZSA9IFRpbWVab25lSW5mby5Db252ZXJ0VGltZUZyb21VdGMoUGFyc2VUb1V0YyhlbmREYXRlVGltZVN0ciksIHR6KTsKCiAgICAgICAgICAgIGlmIChkYXRlLkRhdGUgPCBzdGFydERhdGVUaW1lLkRhdGUgfHwgZGF0ZS5EYXRlID4gZW5kRGF0ZVRpbWUuRGF0ZSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgaWYgKHN0YXJ0RGF0ZVRpbWUuRGF0ZSAhPSBlbmREYXRlVGltZS5EYXRlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZGF0ZS5EYXRlID09IHN0YXJ0RGF0ZVRpbWUuRGF0ZSkKICAgICAgICAgICAgICAgICAgICByYW5nZXMuQWRkKFR1cGxlLkNyZWF0ZShzdGFydERhdGVUaW1lLlRpbWVPZkRheSwgbmV3IFRpbWVTcGFuKDIzLCA1OSwgNTkpKSk7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChkYXRlLkRhdGUgPT0gZW5kRGF0ZVRpbWUuRGF0ZSkKICAgICAgICAgICAgICAgICAgICByYW5nZXMuQWRkKFR1cGxlLkNyZWF0ZShUaW1lU3Bhbi5aZXJvLCBlbmREYXRlVGltZS5UaW1lT2ZEYXkpKTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICByYW5nZXMuQWRkKFR1cGxlLkNyZWF0ZShUaW1lU3Bhbi5aZXJvLCBuZXcgVGltZVNwYW4oMjMsIDU5LCA1OSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJhbmdlcy5BZGQoVHVwbGUuQ3JlYXRlKHN0YXJ0RGF0ZVRpbWUuVGltZU9mRGF5LCBlbmREYXRlVGltZS5UaW1lT2ZEYXkpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJhbmdlczsKICAgIH0KCiAgICBwcml2YXRlIExpc3Q8c3RyaW5nPiBDYWxjdWxhdGVBdmFpbGFibGVTbG90cyhMaXN0PG9iamVjdD4gd29ya2luZ0hvdXJzLCBMaXN0PFR1cGxlPFRpbWVTcGFuLCBUaW1lU3Bhbj4+IHVuYXZhaWxhYmxlUmFuZ2VzLCBpbnQgZHVyYXRpb25NaW51dGVzKQogICAgewogICAgICAgIHZhciBzbG90cyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKICAgICAgICB2YXIgZHVyYXRpb24gPSBUaW1lU3Bhbi5Gcm9tTWludXRlcyhkdXJhdGlvbk1pbnV0ZXMpOwoKICAgICAgICBmb3JlYWNoICh2YXIgd2ggaW4gd29ya2luZ0hvdXJzKQogICAgICAgIHsKICAgICAgICAgICAgZHluYW1pYyB3aER5biA9IHdoOwogICAgICAgICAgICB2YXIgc3RhcnRTdHIgPSB3aER5bj8uc3RhcnQ/LlRvU3RyaW5nKCk7CiAgICAgICAgICAgIHZhciBlbmRTdHIgPSB3aER5bj8uZW5kPy5Ub1N0cmluZygpOwoKICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHN0YXJ0U3RyKSB8fCBzdHJpbmcuSXNOdWxsT3JFbXB0eShlbmRTdHIpKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICB2YXIgd2hTdGFydCA9IFRpbWVTcGFuLlBhcnNlKHN0YXJ0U3RyKTsKICAgICAgICAgICAgdmFyIHdoRW5kID0gVGltZVNwYW4uUGFyc2UoZW5kU3RyKTsKCiAgICAgICAgICAgIGlmICh3aFN0YXJ0ID09IHdoRW5kKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICB2YXIgY3VycmVudCA9IHdoU3RhcnQ7CiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50ICsgZHVyYXRpb24gPD0gd2hFbmQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzbG90U3RhcnQgPSBjdXJyZW50OwogICAgICAgICAgICAgICAgdmFyIHNsb3RFbmQgPSBjdXJyZW50ICsgZHVyYXRpb247CgogICAgICAgICAgICAgICAgYm9vbCBpc0F2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdXIgaW4gdW5hdmFpbGFibGVSYW5nZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNsb3RTdGFydCA8IHVyLkl0ZW0yICYmIHNsb3RFbmQgPiB1ci5JdGVtMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlzQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoaXNBdmFpbGFibGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2xvdHMuQWRkKCQie3Nsb3RTdGFydDpoaFxcOm1tfS17c2xvdEVuZDpoaFxcOm1tfSIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50ICsgZHVyYXRpb247CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBzbG90czsKICAgIH0KCiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gV2hlbiB0aGUgcmVxdWVzdGVkIGNhbGVuZGFyIGRheSBlcXVhbHMgInRvZGF5IiBpbiB0aGUgYnVzaW5lc3MgdGltZXpvbmUsIGRyb3Agc2xvdHMgd2hvc2UKICAgIC8vLyBsb2NhbCBzdGFydCB0aW1lIGlzIG5vdCBhZnRlciAibm93IiBpbiB0aGF0IHRpbWV6b25lLiBTbG90IHN0cmluZ3MgbWF0Y2ggd29ya2luZyBob3VycyAod2FsbCBjbG9jayBpbiB0aGF0IFRaKS4KICAgIC8vLyA8L3N1bW1hcnk+CiAgICBwcml2YXRlIExpc3Q8c3RyaW5nPiBGaWx0ZXJTbG90c0V4Y2x1ZGluZ1Bhc3RGb3JCdXNpbmVzc1RvZGF5KExpc3Q8c3RyaW5nPiBzbG90cywgRGF0ZVRpbWUgcmVxdWVzdGVkRGF0ZSwgVGltZVpvbmVJbmZvIHR6KQogICAgewogICAgICAgIGlmIChzbG90cyA9PSBudWxsIHx8IHNsb3RzLkNvdW50ID09IDApCiAgICAgICAgICAgIHJldHVybiBzbG90cyA/PyBuZXcgTGlzdDxzdHJpbmc+KCk7CgogICAgICAgIHZhciBub3dJblR6ID0gVGltZVpvbmVJbmZvLkNvbnZlcnRUaW1lRnJvbVV0YyhEYXRlVGltZS5VdGNOb3csIHR6KTsKICAgICAgICBpZiAocmVxdWVzdGVkRGF0ZS5EYXRlICE9IG5vd0luVHouRGF0ZSkKICAgICAgICAgICAgcmV0dXJuIHNsb3RzOwoKICAgICAgICB2YXIgZmlsdGVyZWQgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CiAgICAgICAgdmFyIGRheVN0YXJ0TG9jYWwgPSBuZXcgRGF0ZVRpbWUocmVxdWVzdGVkRGF0ZS5ZZWFyLCByZXF1ZXN0ZWREYXRlLk1vbnRoLCByZXF1ZXN0ZWREYXRlLkRheSwgMCwgMCwgMCwgRGF0ZVRpbWVLaW5kLlVuc3BlY2lmaWVkKTsKCiAgICAgICAgZm9yZWFjaCAodmFyIHMgaW4gc2xvdHMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZShzKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgdmFyIHBhcnRzID0gcy5TcGxpdChuZXdbXSB7ICctJyB9LCAyLCBTdHJpbmdTcGxpdE9wdGlvbnMuTm9uZSk7CiAgICAgICAgICAgIGlmIChwYXJ0cy5MZW5ndGggIT0gMikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmlsdGVyZWQuQWRkKHMpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghVGltZVNwYW4uVHJ5UGFyc2UocGFydHNbMF0uVHJpbSgpLCBvdXQgdmFyIHN0YXJ0VHMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmaWx0ZXJlZC5BZGQocyk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHNsb3RTdGFydExvY2FsID0gZGF5U3RhcnRMb2NhbC5BZGQoc3RhcnRUcyk7CiAgICAgICAgICAgIGlmIChzbG90U3RhcnRMb2NhbCA+IG5vd0luVHopCiAgICAgICAgICAgICAgICBmaWx0ZXJlZC5BZGQocyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmlsdGVyZWQ7CiAgICB9CgogICAgI2VuZHJlZ2lvbgp9Cg=="
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
}
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
### Get Chat Rooms by User - Lists all permanent chat rooms for a user
|
|
30
30
|
# Flow-level function (scope: F) on chat-room workflow.
|
|
31
31
|
# Returns rooms array with instanceKey, user, advisorType, advisorId, roomId, currentState.
|
|
32
|
-
GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/
|
|
32
|
+
GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/functions/get-chat-rooms?user={{user}}&pageSize=1
|
|
33
33
|
Accept: application/json
|
|
34
34
|
Accept-Language: tr-TR
|
|
35
35
|
X-Request-Id: {{$guid}}
|
|
@@ -40,7 +40,7 @@ X-Request-Id: {{$guid}}
|
|
|
40
40
|
|
|
41
41
|
### Get Chat Rooms by Advisor - Lists all chat rooms for an advisor
|
|
42
42
|
# Flow-level function (scope: F) on chat-room workflow.
|
|
43
|
-
GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/
|
|
43
|
+
GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/functions/get-chat-rooms?advisor={{advisor}}&pageSize=1
|
|
44
44
|
Accept: application/json
|
|
45
45
|
Accept-Language: tr-TR
|
|
46
46
|
X-Request-Id: {{$guid}}
|
|
@@ -50,13 +50,13 @@ X-Request-Id: {{$guid}}
|
|
|
50
50
|
###############################################################################
|
|
51
51
|
|
|
52
52
|
### Get Chat Rooms by User (permanent only)
|
|
53
|
-
GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/
|
|
53
|
+
GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/functions/get-chat-rooms?user={{user}}&roomType=permanent&pageSize=1
|
|
54
54
|
Accept: application/json
|
|
55
55
|
Accept-Language: tr-TR
|
|
56
56
|
X-Request-Id: {{$guid}}
|
|
57
57
|
|
|
58
58
|
### Get Chat Rooms by User (rezervation only)
|
|
59
|
-
GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/
|
|
59
|
+
GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/functions/get-chat-rooms?user={{user}}&roomType=rezervation&pageSize=1
|
|
60
60
|
Accept: application/json
|
|
61
61
|
Accept-Language: tr-TR
|
|
62
62
|
X-Request-Id: {{$guid}}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
},
|
|
20
20
|
"mapping": {
|
|
21
21
|
"location": "./src/GetRezervationsMapping.csx",
|
|
22
|
-
"code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CnVzaW5nIEJCVC5Xb3JrZmxvdy5EZWZpbml0aW9uczsKLy8vIDxzdW1tYXJ5PgovLy8gTWFwcGluZyBmb3IgR2V0QXZhaWxhYmxlU2xvdHNUYXNrIChEYXByU2VydmljZVRhc2sgLSBUeXBlIDMpCi8vLyBRdWVyaWVzIGFic2VuY2UtZW50cnkgd29ya2Zsb3cgdmlhIERhcHIgc2VydmljZSBpbnZvY2F0aW9uIHRvIGdldCBwdWJsaWMgaG9saWRheXMsIAovLy8gd29ya2luZyBob3VycyBjaGFuZ2VzLCBhbmQgcGVyc29uYWwgbGVhdmVzLgovLy8gVGhlbiBjYWxjdWxhdGVzIGF2YWlsYWJsZSBhcHBvaW50bWVudCBzbG90cyBmb3IgdGhlIGdpdmVuIGFkdmlzb3IgYW5kIGRhdGUuCi8vLyAKLy8vIFJlZmVyZW5jZTogaHR0cHM6Ly9naXRodWIuY29tL2J1cmdhbi10ZWNoL3ZuZXh0LXJ1bnRpbWUvYmxvYi9tYWluL2RvYy9lbi9mbG93L3Rhc2tzL2RhcHItc2VydmljZS5tZAovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgR2V0UmV6ZXJ2YXRpb25zTWFwcGluZyA6IFNjcmlwdEJhc2UsIElNYXBwaW5nCnsKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB2YXIgc2VydmljZVRhc2sgPSB0YXNrIGFzIERhcHJTZXJ2aWNlVGFzazsKICAgICAgICBpZiAoc2VydmljZVRhc2sgPT0gbnVsbCkKICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRhc2sgbXVzdCBiZSBhIERhcHJTZXJ2aWNlVGFzayIpOwoKICAgICAgICB2YXIgYXBwSWQgPSBHZXRDb25maWdWYWx1ZSgiREFQUl9BUFBfSUQiKTsKICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGFwcElkKSkKICAgICAgICAgICAgc2VydmljZVRhc2suU2V0QXBwSWQoYXBwSWQpOwoKICAgICAgICAvLyBSZWFkIHBhcmFtZXRlcnMgZnJvbSBxdWVyeSBzdHJpbmcgKEdFVCByZXF1ZXN0KQogICAgICAgIHZhciBhZHZpc29ySWQgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsICYmIEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAiYWR2aXNvcklkIikgPyBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bImFkdmlzb3JJZCJdPy5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OwogICAgICAgIHZhciB1c2VySWQgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsICYmIEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAidXNlcklkIikgPyBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bInVzZXJJZCJdPy5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OwogICAgICAgIHZhciBtYW5hZ2VySWQgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsICYmIEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAibWFuYWdlcklkIikgPyBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bIm1hbmFnZXJJZCJdPy5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OwogICAgICAgIHZhciBzdGFydERhdGUgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsICYmIEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAic3RhcnREYXRlIikgPyBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bInN0YXJ0RGF0ZSJdPy5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OwogICAgICAgIHZhciBlbmREYXRlID0gY29udGV4dC5RdWVyeVBhcmFtZXRlcnMgIT0gbnVsbCAmJiBIYXNQcm9wZXJ0eShjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycywgImVuZERhdGUiKSA/IGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzP1siZW5kRGF0ZSJdPy5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OwoKICAgICAgICAvLyBCdWlsZCBmaWx0ZXIgY29uZGl0aW9ucwogICAgICAgIHZhciBjb25kaXRpb25zID0gbmV3IExpc3Q8c3RyaW5nPigpOwoKICAgICAgICAvLyBDdXJyZW50U3RhdGUgaW4gKCJhY3RpdmUiLCAiY2FuLXN0YXJ0LW1lZXRpbmciLCAiYWNjZXB0LXRlcm1zIikKICAgICAgICBjb25kaXRpb25zLkFkZCgKICAgICAgICAgICAgIntcIm9yXCI6WyIgKwogICAgICAgICAgICAie1wiY3VycmVudFN0YXRlXCI6e1wiZXFcIjpcImFjdGl2ZVwifX0sIiArCiAgICAgICAgICAgICJ7XCJjdXJyZW50U3RhdGVcIjp7XCJlcVwiOlwiaW4tbWVldFwifX0sIiArCiAgICAgICAgICAgICJ7XCJjdXJyZW50U3RhdGVcIjp7XCJlcVwiOlwiYWNjZXB0LXRlcm1zXCJ9fSIgKwogICAgICAgICAgICAiXX0iKTsKCiAgICAgICAgLy8gU3RhdHVzID0gIkEiCiAgICAgICAgY29uZGl0aW9ucy5BZGQoIntcInN0YXR1c1wiOntcImVxXCI6XCJBXCJ9fSIpOwoKICAgICAgICAvLyBDb25kaXRpb25hbDogYWR2aXNvciBmaWx0ZXIg4oCUIHByaW1hcnkgYWR2aXNvciBPUiB2aWRlb0NhbGxVcmxUb0FkZCBtYXAgaGFzIGFuIGVudHJ5IGZvciB0aGlzIGFkdmlzb3IgaWQKICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGFkdmlzb3JJZCkpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZXNjYXBlZEFkdmlzb3JJZCA9IGFkdmlzb3JJZC5SZXBsYWNlKCJcXCIsICJcXFxcIikuUmVwbGFjZSgiXCIiLCAiXFxcIiIpOwogICAgICAgICAgICBjb25kaXRpb25zLkFkZCgKICAgICAgICAgICAgICAgICJ7XCJvclwiOlsiICsKICAgICAgICAgICAgICAgICJ7XCJhdHRyaWJ1dGVzXCI6e1wiYWR2aXNvclwiOntcImVxXCI6XCIiICsgZXNjYXBlZEFkdmlzb3JJZCArICJcIn19fSwiICsKICAgICAgICAgICAgICAgICJ7XCJhdHRyaWJ1dGVzXCI6e1widmlkZW9DYWxsVXJsVG9BZGQuIiArIGVzY2FwZWRBZHZpc29ySWQgKyAiXCI6e1wiaXNOdWxsXCI6ZmFsc2V9fX0iICsKICAgICAgICAgICAgICAgICJdfSIpOwogICAgICAgIH0KCiAgICAgICAgLy8gQ29uZGl0aW9uYWw6IHVzZXIgZmlsdGVyCiAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh1c2VySWQpKQogICAgICAgICAgICBjb25kaXRpb25zLkFkZCgie1wiYXR0cmlidXRlc1wiOntcInVzZXJcIjp7XCJlcVwiOlwiIiArIHVzZXJJZCArICJcIn19fSIpOwoKICAgICAgICAvLyBDb25kaXRpb25hbDogbWFuYWdlciBmaWx0ZXIKICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KG1hbmFnZXJJZCkpCiAgICAgICAgICAgIGNvbmRpdGlvbnMuQWRkKCJ7XCJhdHRyaWJ1dGVzXCI6e1wibWFuYWdlclwiOntcImVxXCI6XCIiICsgbWFuYWdlcklkICsgIlwifX19Iik7CgogICAgICAgIC8vIENvbmRpdGlvbmFsOiBzdGFydERhdGUgZmlsdGVyIChhdHRyaWJ1dGVzLnN0YXJ0RGF0ZVRpbWUgPj0gc3RhcnREYXRlKQogICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RhcnREYXRlKSkKICAgICAgICAgICAgY29uZGl0aW9ucy5BZGQoIntcImF0dHJpYnV0ZXNcIjp7XCJzdGFydERhdGVUaW1lXCI6e1wiZGd0XCI6XCIiICsgc3RhcnREYXRlICsgIlwifX19Iik7CgogICAgICAgIC8vIENvbmRpdGlvbmFsOiBlbmREYXRlIGZpbHRlciAoYXR0cmlidXRlcy5lbmREYXRlVGltZSA8PSBlbmREYXRlKQogICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoZW5kRGF0ZSkpCiAgICAgICAgICAgIGNvbmRpdGlvbnMuQWRkKCJ7XCJhdHRyaWJ1dGVzXCI6e1wiZW5kRGF0ZVRpbWVcIjp7XCJkbHRcIjpcIiIgKyBlbmREYXRlICsgIlwifX19Iik7CgogICAgICAgIHZhciBmaWx0ZXJKc29uID0gIntcImFuZFwiOlsiICsgc3RyaW5nLkpvaW4oIiwiLCBjb25kaXRpb25zKSArICJdfSI7CgogICAgICAgIHZhciBxdWVyeVBhcmFtcyA9IG5ldyBMaXN0PHN0cmluZz57CiAgICAgICAgICAgICJwYWdlU2l6ZT0xMDAiLAogICAgICAgICAgICAkImZpbHRlcj17ZmlsdGVySnNvbn0iCiAgICAgICAgfTsKICAgICAgICBMb2dFcnJvcigiVGVzdCBxdWVyeSBwYXJhbXM6ICIrc3RyaW5nLkpvaW4oIiYiLCBxdWVyeVBhcmFtcykpOwogICAgICAgIHNlcnZpY2VUYXNrLlNldFF1ZXJ5U3RyaW5nKHN0cmluZy5Kb2luKCImIiwgcXVlcnlQYXJhbXMpKTsKICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZSgpKTsKICAgIH0KCiAgICBwdWJsaWMgVGFzazxTY3JpcHRSZXNwb25zZT4gT3V0cHV0SGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBjb250ZXh0LkJvZHk7CgogICAgICAgICAgICAvLyBDaGVjayBpZiBzZXJ2aWNlIGNhbGwgd2FzIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgaWYgKHJlc3BvbnNlPy5pc1N1Y2Nlc3MgPT0gZmFsc2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBlcnJvclR5cGUgPSBDbGFzc2lmeVNlcnZpY2VFcnJvcihyZXNwb25zZT8uZXJyb3JNZXNzYWdlPy5Ub1N0cmluZygpID8/ICIiKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9ICJzZXJ2aWNlLWVycm9yIiwKICAgICAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJGYWlsZWQgdG8gZmV0Y2ggYWJzZW5jZSBlbnRyaWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlID0gIlNFUlZJQ0VfRVJST1IiLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvclR5cGUgPSBlcnJvclR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IHJlc3BvbnNlPy5lcnJvck1lc3NhZ2U/LlRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VJbmZvID0gbmV3CiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcElkID0gcmVzcG9uc2U/Lm1ldGFkYXRhPy5hcHBJZD8uVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSByZXNwb25zZT8ubWV0YWRhdGE/Lm1ldGhvZE5hbWU/LlRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwVmVyYiA9IHJlc3BvbnNlPy5tZXRhZGF0YT8uaHR0cFZlcmI/LlRvU3RyaW5nKCkKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImFwcG9pbnRtZW50cyIsICJlcnJvciIgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEdldCBpdGVtcyBmcm9tIHNlcnZpY2UgcmVzcG9uc2UKICAgICAgICAgICAgLy8gUmVzcG9uc2Ugc3RydWN0dXJlOiB7IGRhdGE6IHsgaXRlbXM6IFsuLi5dIH0sIGlzU3VjY2VzczogdHJ1ZSwgLi4uIH0KICAgICAgICAgICAgdmFyIHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlPy5kYXRhOwogICAgICAgICAgICB2YXIgaXRlbXMgPSByZXNwb25zZURhdGE/Lml0ZW1zOwoKICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gInJlemVydmF0aW9ucy1zdWNjZXNzIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpdGVtcwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJhcHBvaW50bWVudHMiLCAiYXZhaWxhYmlsaXR5IiwgInN1Y2Nlc3MiIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAib3V0cHV0LWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJJbnRlcm5hbCBwcm9jZXNzaW5nIGVycm9yIiwKICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiUFJPQ0VTU0lOR19FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgZXJyb3JEZXNjcmlwdGlvbiA9IGV4Lk1lc3NhZ2UKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiYXBwb2ludG1lbnRzIiwgImVycm9yIiB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICAjcmVnaW9uIEhlbHBlciBNZXRob2RzCgogICAgcHJpdmF0ZSBzdHJpbmcgQ2xhc3NpZnlTZXJ2aWNlRXJyb3Ioc3RyaW5nIGVycm9yTWVzc2FnZSkKICAgIHsKICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLkNvbnRhaW5zKCJ0aW1lb3V0IiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpCiAgICAgICAgICAgIHJldHVybiAidGltZW91dCI7CiAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5Db250YWlucygidW5hdXRob3JpemVkIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpCiAgICAgICAgICAgIHJldHVybiAiYXV0aGVudGljYXRpb24iOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoImZvcmJpZGRlbiIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gImF1dGhvcml6YXRpb24iOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoIm5vdCBmb3VuZCIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gIm5vdC1mb3VuZCI7CiAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5Db250YWlucygic2VydmljZSB1bmF2YWlsYWJsZSIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gInNlcnZpY2UtdW5hdmFpbGFibGUiOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoImNvbm5lY3Rpb24iLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSkKICAgICAgICAgICAgcmV0dXJuICJjb25uZWN0aW9uLWVycm9yIjsKCiAgICAgICAgcmV0dXJuICJnZW5lcmFsLWVycm9yIjsKICAgIH0KCiAgICAjZW5kcmVnaW9uCn0K"
|
|
22
|
+
"code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CnVzaW5nIEJCVC5Xb3JrZmxvdy5EZWZpbml0aW9uczsKLy8vIDxzdW1tYXJ5PgovLy8gTWFwcGluZyBmb3IgR2V0QXZhaWxhYmxlU2xvdHNUYXNrIChEYXByU2VydmljZVRhc2sgLSBUeXBlIDMpCi8vLyBRdWVyaWVzIGFic2VuY2UtZW50cnkgd29ya2Zsb3cgdmlhIERhcHIgc2VydmljZSBpbnZvY2F0aW9uIHRvIGdldCBwdWJsaWMgaG9saWRheXMsIAovLy8gd29ya2luZyBob3VycyBjaGFuZ2VzLCBhbmQgcGVyc29uYWwgbGVhdmVzLgovLy8gVGhlbiBjYWxjdWxhdGVzIGF2YWlsYWJsZSBhcHBvaW50bWVudCBzbG90cyBmb3IgdGhlIGdpdmVuIGFkdmlzb3IgYW5kIGRhdGUuCi8vLyAKLy8vIFJlZmVyZW5jZTogaHR0cHM6Ly9naXRodWIuY29tL2J1cmdhbi10ZWNoL3ZuZXh0LXJ1bnRpbWUvYmxvYi9tYWluL2RvYy9lbi9mbG93L3Rhc2tzL2RhcHItc2VydmljZS5tZAovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgR2V0UmV6ZXJ2YXRpb25zTWFwcGluZyA6IFNjcmlwdEJhc2UsIElNYXBwaW5nCnsKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB2YXIgc2VydmljZVRhc2sgPSB0YXNrIGFzIERhcHJTZXJ2aWNlVGFzazsKICAgICAgICBpZiAoc2VydmljZVRhc2sgPT0gbnVsbCkKICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRhc2sgbXVzdCBiZSBhIERhcHJTZXJ2aWNlVGFzayIpOwoKICAgICAgICB2YXIgYXBwSWQgPSBHZXRDb25maWdWYWx1ZSgiREFQUl9BUFBfSUQiKTsKICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGFwcElkKSkKICAgICAgICAgICAgc2VydmljZVRhc2suU2V0QXBwSWQoYXBwSWQpOwoKICAgICAgICAvLyBSZWFkIHBhcmFtZXRlcnMgZnJvbSBxdWVyeSBzdHJpbmcgKEdFVCByZXF1ZXN0KQogICAgICAgIHZhciBhZHZpc29ySWQgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsICYmIEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAiYWR2aXNvcklkIikgPyBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bImFkdmlzb3JJZCJdPy5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OwogICAgICAgIHZhciB1c2VySWQgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsICYmIEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAidXNlcklkIikgPyBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bInVzZXJJZCJdPy5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OwogICAgICAgIHZhciBtYW5hZ2VySWQgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsICYmIEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAibWFuYWdlcklkIikgPyBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bIm1hbmFnZXJJZCJdPy5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OwogICAgICAgIHZhciBzdGFydERhdGUgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsICYmIEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAic3RhcnREYXRlIikgPyBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bInN0YXJ0RGF0ZSJdPy5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OwogICAgICAgIHZhciBlbmREYXRlID0gY29udGV4dC5RdWVyeVBhcmFtZXRlcnMgIT0gbnVsbCAmJiBIYXNQcm9wZXJ0eShjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycywgImVuZERhdGUiKSA/IGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzP1siZW5kRGF0ZSJdPy5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OwoKICAgICAgICAvLyBCdWlsZCBmaWx0ZXIgY29uZGl0aW9ucwogICAgICAgIHZhciBjb25kaXRpb25zID0gbmV3IExpc3Q8c3RyaW5nPigpOwoKICAgICAgICAvLyBDdXJyZW50U3RhdGUgaW4gKCJhY3RpdmUiLCAiY2FuLXN0YXJ0LW1lZXRpbmciLCAiYWNjZXB0LXRlcm1zIikKICAgICAgICBjb25kaXRpb25zLkFkZCgKICAgICAgICAgICAgIntcIm9yXCI6WyIgKwogICAgICAgICAgICAie1wiY3VycmVudFN0YXRlXCI6e1wiZXFcIjpcImFjdGl2ZVwifX0sIiArCiAgICAgICAgICAgICJ7XCJjdXJyZW50U3RhdGVcIjp7XCJlcVwiOlwiaW4tbWVldFwifX0sIiArCiAgICAgICAgICAgICJ7XCJjdXJyZW50U3RhdGVcIjp7XCJlcVwiOlwiYWNjZXB0LXRlcm1zXCJ9fSIgKwogICAgICAgICAgICAiXX0iKTsKCiAgICAgICAgLy8gU3RhdHVzID0gIkEiCiAgICAgICAgY29uZGl0aW9ucy5BZGQoIntcInN0YXR1c1wiOntcImVxXCI6XCJBXCJ9fSIpOwoKICAgICAgICAvLyBDb25kaXRpb25hbDogYWR2aXNvciBmaWx0ZXIg4oCUIHByaW1hcnkgYWR2aXNvciBPUiB2aWRlb0NhbGxVcmxUb0FkZCBtYXAgaGFzIGFuIGVudHJ5IGZvciB0aGlzIGFkdmlzb3IgaWQKICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGFkdmlzb3JJZCkpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZXNjYXBlZEFkdmlzb3JJZCA9IGFkdmlzb3JJZC5SZXBsYWNlKCJcXCIsICJcXFxcIikuUmVwbGFjZSgiXCIiLCAiXFxcIiIpOwogICAgICAgICAgICBjb25kaXRpb25zLkFkZCgKICAgICAgICAgICAgICAgICJ7XCJvclwiOlsiICsKICAgICAgICAgICAgICAgICJ7XCJhdHRyaWJ1dGVzXCI6e1wiYWR2aXNvclwiOntcImVxXCI6XCIiICsgZXNjYXBlZEFkdmlzb3JJZCArICJcIn19fSwiICsKICAgICAgICAgICAgICAgICJ7XCJhdHRyaWJ1dGVzXCI6e1widmlkZW9DYWxsVXJsVG9BZGQuIiArIGVzY2FwZWRBZHZpc29ySWQgKyAiXCI6e1wiaXNOdWxsXCI6ZmFsc2V9fX0iICsKICAgICAgICAgICAgICAgICJdfSIpOwogICAgICAgIH0KCiAgICAgICAgLy8gQ29uZGl0aW9uYWw6IHVzZXIgZmlsdGVyCiAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh1c2VySWQpKQogICAgICAgICAgICBjb25kaXRpb25zLkFkZCgie1wiYXR0cmlidXRlc1wiOntcInVzZXJcIjp7XCJlcVwiOlwiIiArIHVzZXJJZCArICJcIn19fSIpOwoKICAgICAgICAvLyBDb25kaXRpb25hbDogbWFuYWdlciBmaWx0ZXIKICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KG1hbmFnZXJJZCkpCiAgICAgICAgICAgIGNvbmRpdGlvbnMuQWRkKCJ7XCJhdHRyaWJ1dGVzXCI6e1wibWFuYWdlclwiOntcImVxXCI6XCIiICsgbWFuYWdlcklkICsgIlwifX19Iik7CgogICAgICAgIC8vIENvbmRpdGlvbmFsOiBzdGFydERhdGUgZmlsdGVyIChhdHRyaWJ1dGVzLnN0YXJ0RGF0ZVRpbWUgPj0gc3RhcnREYXRlKQogICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RhcnREYXRlKSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBub3JtYWxpemVkU3RhcnQgPSBOb3JtYWxpemVUb1V0Y1N0cmluZyhzdGFydERhdGUpOwogICAgICAgICAgICBjb25kaXRpb25zLkFkZCgie1wiYXR0cmlidXRlc1wiOntcInN0YXJ0RGF0ZVRpbWVcIjp7XCJkZ3RcIjpcIiIgKyBub3JtYWxpemVkU3RhcnQgKyAiXCJ9fX0iKTsKICAgICAgICB9CgogICAgICAgIC8vIENvbmRpdGlvbmFsOiBlbmREYXRlIGZpbHRlciAoYXR0cmlidXRlcy5lbmREYXRlVGltZSA8PSBlbmREYXRlKQogICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoZW5kRGF0ZSkpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbm9ybWFsaXplZEVuZCA9IE5vcm1hbGl6ZVRvVXRjU3RyaW5nKGVuZERhdGUpOwogICAgICAgICAgICBjb25kaXRpb25zLkFkZCgie1wiYXR0cmlidXRlc1wiOntcImVuZERhdGVUaW1lXCI6e1wiZGx0XCI6XCIiICsgbm9ybWFsaXplZEVuZCArICJcIn19fSIpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGZpbHRlckpzb24gPSAie1wiYW5kXCI6WyIgKyBzdHJpbmcuSm9pbigiLCIsIGNvbmRpdGlvbnMpICsgIl19IjsKCiAgICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0gbmV3IExpc3Q8c3RyaW5nPnsKICAgICAgICAgICAgInBhZ2VTaXplPTEwMCIsCiAgICAgICAgICAgICQiZmlsdGVyPXtmaWx0ZXJKc29ufSIKICAgICAgICB9OwogICAgICAgIExvZ0Vycm9yKCJUZXN0IHF1ZXJ5IHBhcmFtczogIitzdHJpbmcuSm9pbigiJiIsIHF1ZXJ5UGFyYW1zKSk7CiAgICAgICAgc2VydmljZVRhc2suU2V0UXVlcnlTdHJpbmcoc3RyaW5nLkpvaW4oIiYiLCBxdWVyeVBhcmFtcykpOwogICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlKCkpOwogICAgfQoKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBPdXRwdXRIYW5kbGVyKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGNvbnRleHQuQm9keTsKCiAgICAgICAgICAgIC8vIENoZWNrIGlmIHNlcnZpY2UgY2FsbCB3YXMgc3VjY2Vzc2Z1bAogICAgICAgICAgICBpZiAocmVzcG9uc2U/LmlzU3VjY2VzcyA9PSBmYWxzZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGVycm9yVHlwZSA9IENsYXNzaWZ5U2VydmljZUVycm9yKHJlc3BvbnNlPy5lcnJvck1lc3NhZ2U/LlRvU3RyaW5nKCkgPz8gIiIpOwoKICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gInNlcnZpY2UtZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gIkZhaWxlZCB0byBmZXRjaCBhYnNlbmNlIGVudHJpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiU0VSVklDRV9FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yVHlwZSA9IGVycm9yVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gcmVzcG9uc2U/LmVycm9yTWVzc2FnZT8uVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUluZm8gPSBuZXcKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwSWQgPSByZXNwb25zZT8ubWV0YWRhdGE/LmFwcElkPy5Ub1N0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9IHJlc3BvbnNlPy5tZXRhZGF0YT8ubWV0aG9kTmFtZT8uVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBWZXJiID0gcmVzcG9uc2U/Lm1ldGFkYXRhPy5odHRwVmVyYj8uVG9TdHJpbmcoKQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiYXBwb2ludG1lbnRzIiwgImVycm9yIiB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gR2V0IGl0ZW1zIGZyb20gc2VydmljZSByZXNwb25zZQogICAgICAgICAgICAvLyBSZXNwb25zZSBzdHJ1Y3R1cmU6IHsgZGF0YTogeyBpdGVtczogWy4uLl0gfSwgaXNTdWNjZXNzOiB0cnVlLCAuLi4gfQogICAgICAgICAgICB2YXIgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2U/LmRhdGE7CiAgICAgICAgICAgIHZhciBpdGVtcyA9IHJlc3BvbnNlRGF0YT8uaXRlbXM7CgogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAicmV6ZXJ2YXRpb25zLXN1Y2Nlc3MiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGl0ZW1zCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImFwcG9pbnRtZW50cyIsICJhdmFpbGFiaWxpdHkiLCAic3VjY2VzcyIgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJvdXRwdXQtZXJyb3IiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yID0gIkludGVybmFsIHByb2Nlc3NpbmcgZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9ICJQUk9DRVNTSU5HX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICBlcnJvckRlc2NyaXB0aW9uID0gZXguTWVzc2FnZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJhcHBvaW50bWVudHMiLCAiZXJyb3IiIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQoKICAgICNyZWdpb24gSGVscGVyIE1ldGhvZHMKCiAgICBwcml2YXRlIHN0cmluZyBOb3JtYWxpemVUb1V0Y1N0cmluZyhzdHJpbmcgZGF0ZVN0cikKICAgIHsKICAgICAgICBpZiAoRGF0ZVRpbWVPZmZzZXQuVHJ5UGFyc2UoZGF0ZVN0ciwKICAgICAgICAgICAgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwKICAgICAgICAgICAgU3lzdGVtLkdsb2JhbGl6YXRpb24uRGF0ZVRpbWVTdHlsZXMuTm9uZSwgb3V0IHZhciBkdG8pKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGR0by5VdGNEYXRlVGltZS5Ub1N0cmluZygieXl5eS1NTS1kZFRISDptbTpzc1oiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRhdGVTdHI7CiAgICB9CgogICAgcHJpdmF0ZSBzdHJpbmcgQ2xhc3NpZnlTZXJ2aWNlRXJyb3Ioc3RyaW5nIGVycm9yTWVzc2FnZSkKICAgIHsKICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLkNvbnRhaW5zKCJ0aW1lb3V0IiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpCiAgICAgICAgICAgIHJldHVybiAidGltZW91dCI7CiAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5Db250YWlucygidW5hdXRob3JpemVkIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpCiAgICAgICAgICAgIHJldHVybiAiYXV0aGVudGljYXRpb24iOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoImZvcmJpZGRlbiIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gImF1dGhvcml6YXRpb24iOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoIm5vdCBmb3VuZCIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gIm5vdC1mb3VuZCI7CiAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5Db250YWlucygic2VydmljZSB1bmF2YWlsYWJsZSIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gInNlcnZpY2UtdW5hdmFpbGFibGUiOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoImNvbm5lY3Rpb24iLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSkKICAgICAgICAgICAgcmV0dXJuICJjb25uZWN0aW9uLWVycm9yIjsKCiAgICAgICAgcmV0dXJuICJnZW5lcmFsLWVycm9yIjsKICAgIH0KCiAgICAjZW5kcmVnaW9uCn0K"
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
}
|
|
@@ -147,8 +147,8 @@ public class GetAbsenceEntryMapping : ScriptBase, IMapping
|
|
|
147
147
|
{
|
|
148
148
|
DateTime startDateFilter = default;
|
|
149
149
|
DateTime endDateFilter = default;
|
|
150
|
-
bool hasStartFilter = !string.IsNullOrEmpty(startDateStr) &&
|
|
151
|
-
bool hasEndFilter = !string.IsNullOrEmpty(endDateStr) &&
|
|
150
|
+
bool hasStartFilter = !string.IsNullOrEmpty(startDateStr) && TryParseToUtc(startDateStr, out startDateFilter);
|
|
151
|
+
bool hasEndFilter = !string.IsNullOrEmpty(endDateStr) && TryParseToUtc(endDateStr, out endDateFilter);
|
|
152
152
|
|
|
153
153
|
var filteredItems = new List<dynamic>();
|
|
154
154
|
foreach (dynamic item in items)
|
|
@@ -161,8 +161,8 @@ public class GetAbsenceEntryMapping : ScriptBase, IMapping
|
|
|
161
161
|
|
|
162
162
|
DateTime itemStart = default;
|
|
163
163
|
DateTime itemEnd = default;
|
|
164
|
-
bool parsedStart = !string.IsNullOrEmpty(itemStartStr) &&
|
|
165
|
-
bool parsedEnd = !string.IsNullOrEmpty(itemEndStr) &&
|
|
164
|
+
bool parsedStart = !string.IsNullOrEmpty(itemStartStr) && TryParseToUtc(itemStartStr, out itemStart);
|
|
165
|
+
bool parsedEnd = !string.IsNullOrEmpty(itemEndStr) && TryParseToUtc(itemEndStr, out itemEnd);
|
|
166
166
|
|
|
167
167
|
bool include = true;
|
|
168
168
|
|
|
@@ -215,6 +215,20 @@ public class GetAbsenceEntryMapping : ScriptBase, IMapping
|
|
|
215
215
|
}
|
|
216
216
|
}
|
|
217
217
|
|
|
218
|
+
private bool TryParseToUtc(string dateStr, out DateTime utcDateTime)
|
|
219
|
+
{
|
|
220
|
+
utcDateTime = default;
|
|
221
|
+
if (string.IsNullOrEmpty(dateStr)) return false;
|
|
222
|
+
if (DateTimeOffset.TryParse(dateStr,
|
|
223
|
+
System.Globalization.CultureInfo.InvariantCulture,
|
|
224
|
+
System.Globalization.DateTimeStyles.None, out var dto))
|
|
225
|
+
{
|
|
226
|
+
utcDateTime = dto.UtcDateTime;
|
|
227
|
+
return true;
|
|
228
|
+
}
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
|
|
218
232
|
private string ReadParam(ScriptContext context, string name)
|
|
219
233
|
{
|
|
220
234
|
if (context.QueryParameters == null || !HasProperty(context.QueryParameters, name))
|
|
@@ -45,13 +45,13 @@ public class GetAdvisorStatsMapping : ScriptBase, IMapping
|
|
|
45
45
|
var now = DateTime.UtcNow;
|
|
46
46
|
if (period == "month")
|
|
47
47
|
{
|
|
48
|
-
startDate = startDate ?? now.AddDays(-30).ToString("yyyy-MM-ddTHH:mm:
|
|
49
|
-
endDate = endDate ?? now.ToString("yyyy-MM-ddTHH:mm:
|
|
48
|
+
startDate = startDate ?? now.AddDays(-30).ToString("yyyy-MM-ddTHH:mm:ssZ");
|
|
49
|
+
endDate = endDate ?? now.ToString("yyyy-MM-ddTHH:mm:ssZ");
|
|
50
50
|
}
|
|
51
51
|
else
|
|
52
52
|
{
|
|
53
|
-
startDate = startDate ?? now.AddDays(-7).ToString("yyyy-MM-ddTHH:mm:
|
|
54
|
-
endDate = endDate ?? now.ToString("yyyy-MM-ddTHH:mm:
|
|
53
|
+
startDate = startDate ?? now.AddDays(-7).ToString("yyyy-MM-ddTHH:mm:ssZ");
|
|
54
|
+
endDate = endDate ?? now.ToString("yyyy-MM-ddTHH:mm:ssZ");
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
|
|
@@ -108,8 +108,8 @@ public class GetAdvisorStatsMapping : ScriptBase, IMapping
|
|
|
108
108
|
|
|
109
109
|
DateTime filterStart = DateTime.MinValue;
|
|
110
110
|
DateTime filterEnd = DateTime.MaxValue;
|
|
111
|
-
if (!string.IsNullOrEmpty(startDate))
|
|
112
|
-
if (!string.IsNullOrEmpty(endDate))
|
|
111
|
+
if (!string.IsNullOrEmpty(startDate)) TryParseToUtc(startDate, out filterStart);
|
|
112
|
+
if (!string.IsNullOrEmpty(endDate)) TryParseToUtc(endDate, out filterEnd);
|
|
113
113
|
|
|
114
114
|
if (items != null)
|
|
115
115
|
{
|
|
@@ -122,7 +122,7 @@ public class GetAdvisorStatsMapping : ScriptBase, IMapping
|
|
|
122
122
|
if (string.IsNullOrEmpty(itemStartStr)) continue;
|
|
123
123
|
|
|
124
124
|
DateTime itemStart;
|
|
125
|
-
if (!
|
|
125
|
+
if (!TryParseToUtc(itemStartStr, out itemStart)) continue;
|
|
126
126
|
|
|
127
127
|
if (itemStart < filterStart || itemStart > filterEnd) continue;
|
|
128
128
|
|
|
@@ -138,7 +138,7 @@ public class GetAdvisorStatsMapping : ScriptBase, IMapping
|
|
|
138
138
|
if (!string.IsNullOrEmpty(itemEndStr))
|
|
139
139
|
{
|
|
140
140
|
DateTime itemEnd;
|
|
141
|
-
if (
|
|
141
|
+
if (TryParseToUtc(itemEndStr, out itemEnd))
|
|
142
142
|
totalDurationMinutes += (itemEnd - itemStart).TotalMinutes;
|
|
143
143
|
}
|
|
144
144
|
}
|
|
@@ -180,6 +180,20 @@ public class GetAdvisorStatsMapping : ScriptBase, IMapping
|
|
|
180
180
|
}
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
+
private bool TryParseToUtc(string dateStr, out DateTime utcDateTime)
|
|
184
|
+
{
|
|
185
|
+
utcDateTime = default;
|
|
186
|
+
if (string.IsNullOrEmpty(dateStr)) return false;
|
|
187
|
+
if (DateTimeOffset.TryParse(dateStr,
|
|
188
|
+
System.Globalization.CultureInfo.InvariantCulture,
|
|
189
|
+
System.Globalization.DateTimeStyles.None, out var dto))
|
|
190
|
+
{
|
|
191
|
+
utcDateTime = dto.UtcDateTime;
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
|
|
183
197
|
private string ReadParam(ScriptContext context, string name)
|
|
184
198
|
{
|
|
185
199
|
if (context.QueryParameters == null || !HasProperty(context.QueryParameters, name))
|
|
@@ -164,10 +164,11 @@ public class GetAvailableSlotsMapping : ScriptBase, IMapping
|
|
|
164
164
|
}
|
|
165
165
|
}
|
|
166
166
|
|
|
167
|
-
var
|
|
167
|
+
var tz = ResolveTimeZone(context);
|
|
168
|
+
var unavailableRanges = GetUnavailableRanges(personalLeaves, requestedDate, tz);
|
|
168
169
|
|
|
169
170
|
// Half-day / full-day public holiday handling
|
|
170
|
-
var holidayRanges = GetHolidayRanges(publicHolidays, requestedDate);
|
|
171
|
+
var holidayRanges = GetHolidayRanges(publicHolidays, requestedDate, tz);
|
|
171
172
|
if (holidayRanges != null)
|
|
172
173
|
{
|
|
173
174
|
if (holidayRanges.Count == 1
|
|
@@ -201,7 +202,7 @@ public class GetAvailableSlotsMapping : ScriptBase, IMapping
|
|
|
201
202
|
}
|
|
202
203
|
|
|
203
204
|
var availableSlots = CalculateAvailableSlots(workingHours, unavailableRanges, duration);
|
|
204
|
-
availableSlots = FilterSlotsExcludingPastForBusinessToday(availableSlots, requestedDate,
|
|
205
|
+
availableSlots = FilterSlotsExcludingPastForBusinessToday(availableSlots, requestedDate, tz);
|
|
205
206
|
|
|
206
207
|
return Task.FromResult(new ScriptResponse
|
|
207
208
|
{
|
|
@@ -273,7 +274,14 @@ public class GetAvailableSlotsMapping : ScriptBase, IMapping
|
|
|
273
274
|
/// Linux/macOS: IANA ids (Europe/Istanbul). Windows: often Turkey Standard Time.
|
|
274
275
|
/// Tries aliases, then fixed UTC+3 for Turkey (no DST since 2016) if system DB has neither.
|
|
275
276
|
/// </summary>
|
|
276
|
-
private
|
|
277
|
+
private DateTime ParseToUtc(string dateStr)
|
|
278
|
+
{
|
|
279
|
+
var dto = DateTimeOffset.Parse(dateStr,
|
|
280
|
+
System.Globalization.CultureInfo.InvariantCulture);
|
|
281
|
+
return dto.UtcDateTime;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
private TimeZoneInfo FindTimeZoneById(string id)
|
|
277
285
|
{
|
|
278
286
|
foreach (var candidate in GetTimeZoneIdCandidates(id))
|
|
279
287
|
{
|
|
@@ -295,7 +303,7 @@ public class GetAvailableSlotsMapping : ScriptBase, IMapping
|
|
|
295
303
|
throw new TimeZoneNotFoundException($"Time zone ID '{id}' was not found on this system.");
|
|
296
304
|
}
|
|
297
305
|
|
|
298
|
-
private
|
|
306
|
+
private IEnumerable<string> GetTimeZoneIdCandidates(string id)
|
|
299
307
|
{
|
|
300
308
|
yield return id;
|
|
301
309
|
|
|
@@ -309,14 +317,14 @@ public class GetAvailableSlotsMapping : ScriptBase, IMapping
|
|
|
309
317
|
}
|
|
310
318
|
}
|
|
311
319
|
|
|
312
|
-
private
|
|
320
|
+
private bool IsTurkeyTimeZoneId(string id)
|
|
313
321
|
{
|
|
314
322
|
return string.Equals(id, "Europe/Istanbul", StringComparison.OrdinalIgnoreCase)
|
|
315
323
|
|| string.Equals(id, "Turkey Standard Time", StringComparison.OrdinalIgnoreCase);
|
|
316
324
|
}
|
|
317
325
|
|
|
318
326
|
/// <summary>Fixed UTC+3; matches Turkey wall time since 2016 (DST abolished).</summary>
|
|
319
|
-
private
|
|
327
|
+
private TimeZoneInfo CreateTurkeyFixedUtcPlus3TimeZone()
|
|
320
328
|
{
|
|
321
329
|
return TimeZoneInfo.CreateCustomTimeZone(
|
|
322
330
|
"Europe/Istanbul-Fallback",
|
|
@@ -359,7 +367,7 @@ public class GetAvailableSlotsMapping : ScriptBase, IMapping
|
|
|
359
367
|
/// Full-day holiday: single range 00:00-23:59.
|
|
360
368
|
/// Half-day holiday: partial range (e.g., 00:00-13:00).
|
|
361
369
|
/// </summary>
|
|
362
|
-
private List<Tuple<TimeSpan, TimeSpan>> GetHolidayRanges(List<dynamic> holidays, DateTime date)
|
|
370
|
+
private List<Tuple<TimeSpan, TimeSpan>> GetHolidayRanges(List<dynamic> holidays, DateTime date, TimeZoneInfo tz)
|
|
363
371
|
{
|
|
364
372
|
var ranges = new List<Tuple<TimeSpan, TimeSpan>>();
|
|
365
373
|
bool hasHoliday = false;
|
|
@@ -381,8 +389,8 @@ public class GetAvailableSlotsMapping : ScriptBase, IMapping
|
|
|
381
389
|
if (string.IsNullOrEmpty(startDateTimeStr) || string.IsNullOrEmpty(endDateTimeStr))
|
|
382
390
|
continue;
|
|
383
391
|
|
|
384
|
-
var startDateTime =
|
|
385
|
-
var endDateTime =
|
|
392
|
+
var startDateTime = TimeZoneInfo.ConvertTimeFromUtc(ParseToUtc(startDateTimeStr), tz);
|
|
393
|
+
var endDateTime = TimeZoneInfo.ConvertTimeFromUtc(ParseToUtc(endDateTimeStr), tz);
|
|
386
394
|
|
|
387
395
|
if (date.Date < startDateTime.Date || date.Date > endDateTime.Date)
|
|
388
396
|
continue;
|
|
@@ -453,7 +461,7 @@ public class GetAvailableSlotsMapping : ScriptBase, IMapping
|
|
|
453
461
|
return result.Count > 0 ? result : null;
|
|
454
462
|
}
|
|
455
463
|
|
|
456
|
-
private List<Tuple<TimeSpan, TimeSpan>> GetUnavailableRanges(List<dynamic> personalLeaves, DateTime date)
|
|
464
|
+
private List<Tuple<TimeSpan, TimeSpan>> GetUnavailableRanges(List<dynamic> personalLeaves, DateTime date, TimeZoneInfo tz)
|
|
457
465
|
{
|
|
458
466
|
var ranges = new List<Tuple<TimeSpan, TimeSpan>>();
|
|
459
467
|
|
|
@@ -474,8 +482,8 @@ public class GetAvailableSlotsMapping : ScriptBase, IMapping
|
|
|
474
482
|
if (string.IsNullOrEmpty(startDateTimeStr) || string.IsNullOrEmpty(endDateTimeStr))
|
|
475
483
|
continue;
|
|
476
484
|
|
|
477
|
-
var startDateTime =
|
|
478
|
-
var endDateTime =
|
|
485
|
+
var startDateTime = TimeZoneInfo.ConvertTimeFromUtc(ParseToUtc(startDateTimeStr), tz);
|
|
486
|
+
var endDateTime = TimeZoneInfo.ConvertTimeFromUtc(ParseToUtc(endDateTimeStr), tz);
|
|
479
487
|
|
|
480
488
|
if (date.Date < startDateTime.Date || date.Date > endDateTime.Date)
|
|
481
489
|
continue;
|
|
@@ -550,7 +558,7 @@ public class GetAvailableSlotsMapping : ScriptBase, IMapping
|
|
|
550
558
|
/// When the requested calendar day equals "today" in the business timezone, drop slots whose
|
|
551
559
|
/// local start time is not after "now" in that timezone. Slot strings match working hours (wall clock in that TZ).
|
|
552
560
|
/// </summary>
|
|
553
|
-
private
|
|
561
|
+
private List<string> FilterSlotsExcludingPastForBusinessToday(List<string> slots, DateTime requestedDate, TimeZoneInfo tz)
|
|
554
562
|
{
|
|
555
563
|
if (slots == null || slots.Count == 0)
|
|
556
564
|
return slots ?? new List<string>();
|
|
@@ -86,11 +86,17 @@ public class GetRezervationsMapping : ScriptBase, IMapping
|
|
|
86
86
|
|
|
87
87
|
// Conditional: startDate filter (attributes.startDateTime >= startDate)
|
|
88
88
|
if (!string.IsNullOrEmpty(startDate))
|
|
89
|
-
|
|
89
|
+
{
|
|
90
|
+
var normalizedStart = NormalizeToUtcString(startDate);
|
|
91
|
+
conditions.Add("{\"attributes\":{\"startDateTime\":{\"dgt\":\"" + normalizedStart + "\"}}}");
|
|
92
|
+
}
|
|
90
93
|
|
|
91
94
|
// Conditional: endDate filter (attributes.endDateTime <= endDate)
|
|
92
95
|
if (!string.IsNullOrEmpty(endDate))
|
|
93
|
-
|
|
96
|
+
{
|
|
97
|
+
var normalizedEnd = NormalizeToUtcString(endDate);
|
|
98
|
+
conditions.Add("{\"attributes\":{\"endDateTime\":{\"dlt\":\"" + normalizedEnd + "\"}}}");
|
|
99
|
+
}
|
|
94
100
|
|
|
95
101
|
var filterJson = "{\"and\":[" + string.Join(",", conditions) + "]}";
|
|
96
102
|
|
|
@@ -167,6 +173,17 @@ public class GetRezervationsMapping : ScriptBase, IMapping
|
|
|
167
173
|
|
|
168
174
|
#region Helper Methods
|
|
169
175
|
|
|
176
|
+
private string NormalizeToUtcString(string dateStr)
|
|
177
|
+
{
|
|
178
|
+
if (DateTimeOffset.TryParse(dateStr,
|
|
179
|
+
System.Globalization.CultureInfo.InvariantCulture,
|
|
180
|
+
System.Globalization.DateTimeStyles.None, out var dto))
|
|
181
|
+
{
|
|
182
|
+
return dto.UtcDateTime.ToString("yyyy-MM-ddTHH:mm:ssZ");
|
|
183
|
+
}
|
|
184
|
+
return dateStr;
|
|
185
|
+
}
|
|
186
|
+
|
|
170
187
|
private string ClassifyServiceError(string errorMessage)
|
|
171
188
|
{
|
|
172
189
|
if (errorMessage.Contains("timeout", StringComparison.OrdinalIgnoreCase))
|