{"remainingRequest":"/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/node_modules/vue-loader/lib/index.js??vue-loader-options!/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/src/ui/main/conversation/ConversationView.vue?vue&type=script&lang=js&","dependencies":[{"path":"/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/src/ui/main/conversation/ConversationView.vue","mtime":1702016964384},{"path":"/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/node_modules/babel-loader/lib/index.js","mtime":1702017034360},{"path":"/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/node_modules/cache-loader/dist/cjs.js","mtime":1702017034107},{"path":"/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/node_modules/vue-loader/lib/index.js","mtime":1702017029242}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KCmltcG9ydCBTaW5nbGVDb252ZXJzYXRpb25JbmZvVmlldyBmcm9tICIuLi8uLi9tYWluL2NvbnZlcnNhdGlvbi9TaW5nbGVDb252ZXJzYXRpb25JbmZvVmlldyI7CmltcG9ydCBTZWNyZXRDb252ZXJzYXRpb25JbmZvVmlldyBmcm9tICIuLi8uLi9tYWluL2NvbnZlcnNhdGlvbi9TZWNyZXRDb252ZXJzYXRpb25JbmZvVmlldyI7CmltcG9ydCBHcm91cENvbnZlcnNhdGlvbkluZm9WaWV3IGZyb20gIi4uLy4uL21haW4vY29udmVyc2F0aW9uL0dyb3VwQ29udmVyc2F0aW9uSW5mb1ZpZXciOwppbXBvcnQgTWVzc2FnZUlucHV0VmlldyBmcm9tICIuLi8uLi9tYWluL2NvbnZlcnNhdGlvbi9NZXNzYWdlSW5wdXRWaWV3IjsKaW1wb3J0IENsaWNrT3V0c2lkZSBmcm9tICd2dWUtY2xpY2stb3V0c2lkZScKaW1wb3J0IE5vcm1hbE91dE1lc3NhZ2VDb250ZW50VmlldyBmcm9tICIuLi8uLi9tYWluL2NvbnZlcnNhdGlvbi9tZXNzYWdlL05vcm1hbE91dE1lc3NhZ2VDb250ZW50Q29udGFpbmVyVmlldyI7CmltcG9ydCBOb3JtYWxJbk1lc3NhZ2VDb250ZW50VmlldyBmcm9tICIuLi8uLi9tYWluL2NvbnZlcnNhdGlvbi9tZXNzYWdlL05vcm1hbEluTWVzc2FnZUNvbnRlbnRDb250YWluZXJWaWV3IjsKaW1wb3J0IE5vdGlmaWNhdGlvbk1lc3NhZ2VDb250ZW50VmlldyBmcm9tICIuLi8uLi9tYWluL2NvbnZlcnNhdGlvbi9tZXNzYWdlL05vdGlmaWNhdGlvbk1lc3NhZ2VDb250ZW50VmlldyI7CmltcG9ydCBSZWNhbGxOb3RpZmljYXRpb25NZXNzYWdlQ29udGVudFZpZXcgZnJvbSAiLi4vLi4vbWFpbi9jb252ZXJzYXRpb24vbWVzc2FnZS9SZWNhbGxOb3RpZmljYXRpb25NZXNzYWdlQ29udGVudFZpZXciOwppbXBvcnQgTm90aWZpY2F0aW9uTWVzc2FnZUNvbnRlbnQgZnJvbSAiLi4vLi4vLi4vd2ZjL21lc3NhZ2VzL25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb25NZXNzYWdlQ29udGVudCI7CmltcG9ydCBUZXh0TWVzc2FnZUNvbnRlbnQgZnJvbSAiLi4vLi4vLi4vd2ZjL21lc3NhZ2VzL3RleHRNZXNzYWdlQ29udGVudCI7CmltcG9ydCBzdG9yZSBmcm9tICIuLi8uLi8uLi9zdG9yZSI7CmltcG9ydCB3ZmMgZnJvbSAiLi4vLi4vLi4vd2ZjL2NsaWVudC93ZmMiOwppbXBvcnQge251bWJlclZhbHVlfSBmcm9tICIuLi8uLi8uLi93ZmMvdXRpbC9sb25nVXRpbCI7CmltcG9ydCBJbmZpbml0ZUxvYWRpbmcgZnJvbSAndnVlLWluZmluaXRlLWxvYWRpbmcnOwppbXBvcnQgTXVsdGlTZWxlY3RBY3Rpb25WaWV3IGZyb20gIi4uLy4uL21haW4vY29udmVyc2F0aW9uL01lc3NhZ2VNdWx0aVNlbGVjdEFjdGlvblZpZXciOwppbXBvcnQgU2NhbGVMb2FkZXIgZnJvbSAndnVlLXNwaW5uZXIvc3JjL1NjYWxlTG9hZGVyJwppbXBvcnQgRm9yd2FyZFR5cGUgZnJvbSAiLi4vLi4vbWFpbi9jb252ZXJzYXRpb24vbWVzc2FnZS9mb3J3YXJkL0ZvcndhcmRUeXBlIjsKaW1wb3J0IHtmcywgaXNFbGVjdHJvbiwgc2hlbGx9IGZyb20gIi4uLy4uLy4uL3BsYXRmb3JtIjsKaW1wb3J0IEZpbGVNZXNzYWdlQ29udGVudCBmcm9tICIuLi8uLi8uLi93ZmMvbWVzc2FnZXMvZmlsZU1lc3NhZ2VDb250ZW50IjsKaW1wb3J0IEltYWdlTWVzc2FnZUNvbnRlbnQgZnJvbSAiLi4vLi4vLi4vd2ZjL21lc3NhZ2VzL2ltYWdlTWVzc2FnZUNvbnRlbnQiOwppbXBvcnQge2NvcHlJbWcsIGNvcHlUZXh0fSBmcm9tICIuLi8uLi91dGlsL2NsaXBib2FyZCI7CmltcG9ydCBNZXNzYWdlIGZyb20gIi4uLy4uLy4uL3dmYy9tZXNzYWdlcy9tZXNzYWdlIjsKaW1wb3J0IHtkb3dubG9hZEZpbGV9IGZyb20gIi4uLy4uLy4uL3BsYXRmb3JtSGVscGVyIjsKaW1wb3J0IFZpZGVvTWVzc2FnZUNvbnRlbnQgZnJvbSAiLi4vLi4vLi4vd2ZjL21lc3NhZ2VzL3ZpZGVvTWVzc2FnZUNvbnRlbnQiOwppbXBvcnQgbG9jYWxTdG9yYWdlRW1pdHRlciBmcm9tICIuLi8uLi8uLi9pcGMvbG9jYWxTdG9yYWdlRW1pdHRlciI7CmltcG9ydCBTb3VuZE1lc3NhZ2VDb250ZW50IGZyb20gIi4uLy4uLy4uL3dmYy9tZXNzYWdlcy9zb3VuZE1lc3NhZ2VDb250ZW50IjsKaW1wb3J0IE1lc3NhZ2VDb250ZW50VHlwZSBmcm9tICIuLi8uLi8uLi93ZmMvbWVzc2FnZXMvbWVzc2FnZUNvbnRlbnRUeXBlIjsKaW1wb3J0IEJlbnpBTVJSZWNvcmRlciBmcm9tICJiZW56LWFtci1yZWNvcmRlciI7CmltcG9ydCBDb252ZXJzYXRpb25UeXBlIGZyb20gIi4uLy4uLy4uL3dmYy9tb2RlbC9jb252ZXJzYXRpb25UeXBlIjsKaW1wb3J0IEdyb3VwTWVtYmVyVHlwZSBmcm9tICIuLi8uLi8uLi93ZmMvbW9kZWwvZ3JvdXBNZW1iZXJUeXBlIjsKaW1wb3J0IENvbXBvc2l0ZU1lc3NhZ2VDb250ZW50IGZyb20gIi4uLy4uLy4uL3dmYy9tZXNzYWdlcy9jb21wb3NpdGVNZXNzYWdlQ29udGVudCI7CmltcG9ydCBFdmVudFR5cGUgZnJvbSAiLi4vLi4vLi4vd2ZjL2NsaWVudC93ZmNFdmVudCI7CmltcG9ydCBNdWx0aUNhbGxPbmdvaW5nTWVzc2FnZUNvbnRlbnQgZnJvbSAiLi4vLi4vLi4vd2ZjL2F2L21lc3NhZ2VzL211bHRpQ2FsbE9uZ29pbmdNZXNzYWdlQ29udGVudCI7CmltcG9ydCBKb2luQ2FsbFJlcXVlc3RNZXNzYWdlQ29udGVudCBmcm9tICIuLi8uLi8uLi93ZmMvYXYvbWVzc2FnZXMvam9pbkNhbGxSZXF1ZXN0TWVzc2FnZUNvbnRlbnQiOwppbXBvcnQgUmljaE5vdGlmaWNhdGlvbk1lc3NhZ2VDb250ZW50IGZyb20gIi4uLy4uLy4uL3dmYy9tZXNzYWdlcy9ub3RpZmljYXRpb24vcmljaE5vdGlmaWNhdGlvbk1lc3NhZ2VDb250ZW50IjsKaW1wb3J0IE1lc3NhZ2VTdGF0dXMgZnJvbSAiLi4vLi4vLi4vd2ZjL21lc3NhZ2VzL21lc3NhZ2VTdGF0dXMiOwppbXBvcnQgTWVkaWFNZXNzYWdlQ29udGVudCBmcm9tICIuLi8uLi8uLi93ZmMvbWVzc2FnZXMvbWVkaWFNZXNzYWdlQ29udGVudCI7CmltcG9ydCBBcnRpY2xlc01lc3NhZ2VDb250ZW50IGZyb20gIi4uLy4uLy4uL3dmYy9tZXNzYWdlcy9hcnRpY2xlc01lc3NhZ2VDb250ZW50IjsKaW1wb3J0IENvbnRleHRhYmxlTm90aWZpY2F0aW9uTWVzc2FnZUNvbnRlbnRDb250YWluZXJWaWV3IGZyb20gIi4vbWVzc2FnZS9Db250ZXh0YWJsZU5vdGlmaWNhdGlvbk1lc3NhZ2VDb250ZW50Q29udGFpbmVyVmlldyI7CmltcG9ydCBDaGFubmVsQ29udmVyc2F0aW9uSW5mb1ZpZXcgZnJvbSAiLi9DaGFubmVsQ29udmVyc2F0aW9uSW5mb1ZpZXciOwppbXBvcnQgRnJpZW5kUmVxdWVzdFZpZXcgZnJvbSAiLi4vY29udGFjdC9GcmllbmRSZXF1ZXN0VmlldyI7CmltcG9ydCB7Y3VycmVudFdpbmRvdywgaXBjUmVuZGVyZXJ9IGZyb20gIi4uLy4uLy4uL3BsYXRmb3JtIjsKaW1wb3J0IGFwcFNlcnZlckFwaSBmcm9tICIuLi8uLi8uLi9hcGkvYXBwU2VydmVyQXBpIjsKaW1wb3J0IENvbmZpZyBmcm9tICIuLi8uLi8uLi9jb25maWciOwppbXBvcnQgSVBDRXZlbnRUeXBlIGZyb20gIi4uLy4uLy4uL2lwY0V2ZW50VHlwZSI7CmltcG9ydCBMb2NhbFN0b3JhZ2VJcGNFdmVudFR5cGUgZnJvbSAiLi4vLi4vLi4vaXBjL2xvY2FsU3RvcmFnZUlwY0V2ZW50VHlwZSI7CmltcG9ydCB7aW1hZ2VUaHVtYm5haWx9IGZyb20gIi4uLy4uL3V0aWwvaW1hZ2VVdGlsIjsKaW1wb3J0IEdyb3VwSW5mbyBmcm9tICIuLi8uLi8uLi93ZmMvbW9kZWwvZ3JvdXBJbmZvIjsKCnZhciBhbXI7CmV4cG9ydCBkZWZhdWx0IHsKICAgIGNvbXBvbmVudHM6IHsKICAgICAgICBDaGFubmVsQ29udmVyc2F0aW9uSW5mb1ZpZXcsCiAgICAgICAgQ29udGV4dGFibGVOb3RpZmljYXRpb25NZXNzYWdlQ29udGVudENvbnRhaW5lclZpZXcsCiAgICAgICAgTXVsdGlTZWxlY3RBY3Rpb25WaWV3LAogICAgICAgIE5vdGlmaWNhdGlvbk1lc3NhZ2VDb250ZW50VmlldywKICAgICAgICBSZWNhbGxOb3RpZmljYXRpb25NZXNzYWdlQ29udGVudFZpZXcsCiAgICAgICAgTm9ybWFsSW5NZXNzYWdlQ29udGVudFZpZXcsCiAgICAgICAgTm9ybWFsT3V0TWVzc2FnZUNvbnRlbnRWaWV3LAogICAgICAgIE1lc3NhZ2VJbnB1dFZpZXcsCiAgICAgICAgR3JvdXBDb252ZXJzYXRpb25JbmZvVmlldywKICAgICAgICBTaW5nbGVDb252ZXJzYXRpb25JbmZvVmlldywKICAgICAgICBTZWNyZXRDb252ZXJzYXRpb25JbmZvVmlldywKICAgICAgICBJbmZpbml0ZUxvYWRpbmcsCiAgICAgICAgU2NhbGVMb2FkZXIsCiAgICB9LAogICAgcHJvcHM6IHsKICAgICAgICBpbnB1dE9wdGlvbnM6IHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsCiAgICAgICAgfSwKICAgICAgICB0aXRsZTogewogICAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKICAgICAgICB9CiAgICB9LAogICAgZGF0YSgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBjb252ZXJzYXRpb25JbmZvOiBudWxsLAogICAgICAgICAgICBzaG93Q29udmVyc2F0aW9uSW5mbzogZmFsc2UsCiAgICAgICAgICAgIHNoYXJlZENvbnZlcnNhdGlvblN0YXRlOiBzdG9yZS5zdGF0ZS5jb252ZXJzYXRpb24sCiAgICAgICAgICAgIHNoYXJlZENvbnRhY3RTdGF0ZTogc3RvcmUuc3RhdGUuY29udGFjdCwKICAgICAgICAgICAgc2hhcmVkUGlja1N0YXRlOiBzdG9yZS5zdGF0ZS5waWNrLAogICAgICAgICAgICBzaGFyZWRNaXNjU3RhdGU6IHN0b3JlLnN0YXRlLm1pc2MsCiAgICAgICAgICAgIGlzSGFuZGxlckRyYWdnaW5nOiBmYWxzZSwKCiAgICAgICAgICAgIHNhdmVkTWVzc2FnZUxpc3RWaWV3SGVpZ2h0OiAtMSwKICAgICAgICAgICAgc2F2ZU1lc3NhZ2VMaXN0Vmlld0ZsZXhHcm93OiAtMSwKCiAgICAgICAgICAgIGRyYWdBbmREcm9wRW50ZXJDb3VudDogMCwKICAgICAgICAgICAgLy8gRklYTUUg6YCJ5Lit5LiA5Liq5Lya6K+d77yM54S25ZCO5YiH5o2i5Yiw5YW25LuWcGFnZe+8jOavlOWmguiBlOezu+S6uu+8jOi/meaXtuivpeS8muivneaUtuWIsOaWsOa2iOaBr+aIluWPkemAgea2iOaBr++8jOS8muWvvOiHtOaWsOaUtuWIsC/lj5HpgIHnmoTmtojmga/nmoTnlYzpnaLplJnkubHvvIzlsJrkuI3nn6XpgZPljp/lm6DvvIzkvYbov5nkuYjlgZrog73op6PlhrPjgIIKICAgICAgICAgICAgZml4VGlwcHk6IHRydWUsCiAgICAgICAgICAgIG9uZ29pbmdDYWxsczogW10sCiAgICAgICAgICAgIG9uZ29pbmdDYWxsVGltZXI6IDAsCiAgICAgICAgICAgIG1lc3NhZ2VJbnB1dFZpZXdSZXNpemVkOiBmYWxzZSwKICAgICAgICAgICAgdW5yZWFkTWVzc2FnZUNvdW50OiAwLAogICAgICAgICAgICBpc1dpbmRvd0Fsd2F5c1RvcDogY3VycmVudFdpbmRvdyAmJiBjdXJyZW50V2luZG93LmlzQWx3YXlzT25Ub3AoKSwKICAgICAgICB9OwogICAgfSwKCiAgICBhY3RpdmF0ZWQoKSB7CiAgICAgICAgdGhpcy5maXhUaXBweSA9IHRydWU7CiAgICB9LAoKICAgIGRlYWN0aXZhdGVkKCkgewogICAgICAgIHRoaXMuZml4VGlwcHkgPSBmYWxzZTsKICAgIH0sCgogICAgbWV0aG9kczogewogICAgICAgIGFzeW5jIGRyYWdFdmVudChlLCB2KSB7CiAgICAgICAgICAgIGlmICh2ID09PSAnZHJhZ2VudGVyJykgewogICAgICAgICAgICAgICAgdGhpcy5kcmFnQW5kRHJvcEVudGVyQ291bnQrKzsKICAgICAgICAgICAgfSBlbHNlIGlmICh2ID09PSAnZHJhZ2xlYXZlJykgewogICAgICAgICAgICAgICAgdGhpcy5kcmFnQW5kRHJvcEVudGVyQ291bnQtLTsKICAgICAgICAgICAgfSBlbHNlIGlmICh2ID09PSAnZHJvcCcpIHsKICAgICAgICAgICAgICAgIHRoaXMuZHJhZ0FuZERyb3BFbnRlckNvdW50LS07CiAgICAgICAgICAgICAgICBsZXQgaXNGaWxlOwogICAgICAgICAgICAgICAgaWYgKGUuZGF0YVRyYW5zZmVyLml0ZW1zICYmIGUuZGF0YVRyYW5zZmVyLml0ZW1zLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhVHJhbnNmZXIuaXRlbXNbMF0ua2luZCA9PT0gJ2ZpbGUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKGUuZGF0YVRyYW5zZmVyLml0ZW1zWzBdLndlYmtpdEdldEFzRW50cnkpID09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRmlsZSA9IGUuZGF0YVRyYW5zZmVyLml0ZW1zWzBdLndlYmtpdEdldEFzRW50cnkoKS5pc0ZpbGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIChlLmRhdGFUcmFuc2Zlci5pdGVtc1swXS5nZXRBc0VudHJ5KSA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ZpbGUgPSBlLmRhdGFUcmFuc2Zlci5pdGVtc1swXS5nZXRBc0VudHJ5KCkuaXNGaWxlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbm90aWZ5KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aXRsZTogJ+S4jeaUr+aMgScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy4kdCgnY29udmVyc2F0aW9uLm5vdF9zdXBwb3J0X3NlbmRfZm9sZGVyJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhcm4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxldCBsZW5ndGggPSBlLmRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID4gMCAmJiBsZW5ndGggPD0gNSkgewogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZXZlbnRCdXMuJGVtaXQoJ3VwbG9hZEZpbGUnLCBlLmRhdGFUcmFuc2Zlci5maWxlc1tpXSkKICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuc2VuZEZpbGUodGhpcy5zaGFyZWRDb252ZXJzYXRpb25TdGF0ZS5jdXJyZW50Q29udmVyc2F0aW9uSW5mby5jb252ZXJzYXRpb24sIGUuZGF0YVRyYW5zZmVyLmZpbGVzW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlbmd0aCA+IDUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLiRub3RpZnkoewogICAgICAgICAgICAgICAgICAgICAgICAvLyB0aXRsZTogJ+Wkp+aWh+S7tuaPkOekuicsCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMuJHQoJ2NvbnZlcnNhdGlvbi5kcmFnX3RvX3NlbmRfbGltaXRfdGlwJyksCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxldCBkcmFnVXJsID0gZS5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgnVVJMJyk7CiAgICAgICAgICAgICAgICBpZiAoZHJhZ1VybCkgewogICAgICAgICAgICAgICAgICAgIC8vIOagueaNruWQjue8gOWIpOaWreexu+WeiwogICAgICAgICAgICAgICAgICAgIGlmIChkcmFnVXJsLmVuZHNXaXRoKCcucG5nJykgfHwgZHJhZ1VybC5lbmRzV2l0aCgnLmpwZycpIHx8IGRyYWdVcmwuZW5kc1dpdGgoJ2pwZWcnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnN0cnVjdG9yKGZpbGVPckxvY2FsUGF0aCwgcmVtb3RlUGF0aCwgdGh1bWJuYWlsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB7dGh1bWJuYWlsOiBpdCwgd2lkdGg6IGl3LCBoZWlnaHQ6IGlofSA9IGF3YWl0IGltYWdlVGh1bWJuYWlsKGRyYWdVcmwpOwogICAgICAgICAgICAgICAgICAgICAgICBpdCA9IGl0ID8gaXQgOiBDb25maWcuREVGQVVMVF9USFVNQk5BSUxfVVJMOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQubGVuZ3RoID4gMTUgKiAxMDI0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCA9IENvbmZpZy5ERUZBVUxUX1RIVU1CTkFJTF9VUkw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBuZXcgSW1hZ2VNZXNzYWdlQ29udGVudChudWxsLCBkcmFnVXJsLCBpdC5zcGxpdCgnLCcpWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5pbWFnZVdpZHRoID0gaXc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuaW1hZ2VIZWlnaHQgPSBpaDsKICAgICAgICAgICAgICAgICAgICAgICAgd2ZjLnNlbmRDb252ZXJzYXRpb25NZXNzYWdlKHRoaXMuY29udmVyc2F0aW9uSW5mby5jb252ZXJzYXRpb24sIGNvbnRlbnQpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gYmxvYiB1cmkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZHJhZyBVcmwnLCBkcmFnVXJsKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh2ID09PSAnZHJhZ292ZXInKSB7CiAgICAgICAgICAgICAgICAvLyBUT0RPIOWPr+S7peWIpOaWreS4gOS6m++8jOS4jeaUr+aMgeeahO+8jGRyb3BFZmZlY3Qg572u5Li6IG5vbmUKICAgICAgICAgICAgICAgIC8vIOaUr+aMgemCo+S6m+exu+Wei+eahOaVsOaNriBkcm9w77yM5Y+C6ICD5LiK6Z2iIGRyb3Ag6YOo5YiG55qE5aSE55CGCiAgICAgICAgICAgICAgICAvLyBJZiBub3Qgc3QgYXMgJ2NvcHknLCBlbGVjdHJvbiB3aWxsIG9wZW4gdGhlIGRyb3AgZmlsZQogICAgICAgICAgICAgICAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5JzsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgdG9nZ2xlQ29udmVyc2F0aW9uSW5mbygpIHsKICAgICAgICAgICAgdGhpcy5zaG93Q29udmVyc2F0aW9uSW5mbyA9ICF0aGlzLnNob3dDb252ZXJzYXRpb25JbmZvOwogICAgICAgIH0sCgogICAgICAgIHNldFdpbmRvd0Fsd2F5c1RvcCgpIHsKICAgICAgICAgICAgdGhpcy5pc1dpbmRvd0Fsd2F5c1RvcCA9ICFjdXJyZW50V2luZG93LmlzQWx3YXlzT25Ub3AoKTsKICAgICAgICAgICAgY3VycmVudFdpbmRvdy5zZXRBbHdheXNPblRvcCh0aGlzLmlzV2luZG93QWx3YXlzVG9wKQogICAgICAgIH0sCgogICAgICAgIGNsaWNrQ29udmVyc2F0aW9uRGVzYygpIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udmVyc2F0aW9uSW5mby5jb252ZXJzYXRpb24udHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5TaW5nbGUgJiYgIXdmYy5pc015RnJpZW5kKHRoaXMuY29udmVyc2F0aW9uSW5mby5jb252ZXJzYXRpb24udGFyZ2V0KSkgewogICAgICAgICAgICAgICAgdGhpcy4kbW9kYWwuc2hvdygKICAgICAgICAgICAgICAgICAgICBGcmllbmRSZXF1ZXN0VmlldywKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOiB0aGlzLmNvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uLl90YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdmcmllbmQtcmVxdWVzdC1tb2RhbCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiA2MDAsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMjUwLAogICAgICAgICAgICAgICAgICAgICAgICBjbGlja1RvQ2xvc2U6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIH0sIHt9KQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgdG9nZ2xlTWVzc2FnZU11bHRpU2VsZWN0aW9uQWN0aW9uVmlldyhtZXNzYWdlKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5zaGFyZWRDb252ZXJzYXRpb25TdGF0ZS5lbmFibGVNZXNzYWdlTXVsdGlTZWxlY3Rpb24pIHsKICAgICAgICAgICAgICAgIHRoaXMuc2F2ZU1lc3NhZ2VMaXN0Vmlld0ZsZXhHcm93ID0gdGhpcy4kcmVmc1snY29udmVyc2F0aW9uTWVzc2FnZUxpc3QnXS5zdHlsZS5mbGV4R3JvdzsKICAgICAgICAgICAgICAgIHRoaXMuc2F2ZWRNZXNzYWdlTGlzdFZpZXdIZWlnaHQgPSB0aGlzLiRyZWZzWydjb252ZXJzYXRpb25NZXNzYWdlTGlzdCddLnN0eWxlLmhlaWdodDsKICAgICAgICAgICAgICAgIHRoaXMuJHJlZnNbJ2NvbnZlcnNhdGlvbk1lc3NhZ2VMaXN0J10uc3R5bGUuZmxleEdyb3cgPSAxOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2F2ZU1lc3NhZ2VMaXN0Vmlld0ZsZXhHcm93ICE9PSAtMSAmJiB0aGlzLnNhdmVkTWVzc2FnZUxpc3RWaWV3SGVpZ2h0ICE9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnNbJ2NvbnZlcnNhdGlvbk1lc3NhZ2VMaXN0J10uc3R5bGUuaGVpZ2h0ID0gdGhpcy5zYXZlZE1lc3NhZ2VMaXN0Vmlld0hlaWdodDsKICAgICAgICAgICAgICAgICAgICB0aGlzLiRyZWZzWydjb252ZXJzYXRpb25NZXNzYWdlTGlzdCddLnN0eWxlLmZsZXhHcm93ID0gdGhpcy5zYXZlTWVzc2FnZUxpc3RWaWV3RmxleEdyb3c7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5zaGFyZWRQaWNrU3RhdGUubWVzc2FnZXMuZm9yRWFjaChtID0+IGNvbnNvbGUubG9nKG0ubWVzc2FnZUlkKSk7CiAgICAgICAgICAgIHN0b3JlLnRvZ2dsZU1lc3NhZ2VNdWx0aVNlbGVjdGlvbihtZXNzYWdlKTsKICAgICAgICB9LAoKICAgICAgICBjbGlja01lc3NhZ2VJdGVtKGV2ZW50LCBtZXNzYWdlKSB7CiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VDb250ZW50IGluc3RhbmNlb2YgTm90aWZpY2F0aW9uTWVzc2FnZUNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5zaGFyZWRDb252ZXJzYXRpb25TdGF0ZS5lbmFibGVNZXNzYWdlTXVsdGlTZWxlY3Rpb24pIHsKICAgICAgICAgICAgICAgIHN0b3JlLnNlbGVjdE9yRGVzZWxlY3RNZXNzYWdlKG1lc3NhZ2UpOwogICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBoaWRlQ29udmVyc2F0aW9uSW5mbygpIHsKICAgICAgICAgICAgLy8gVE9ETwogICAgICAgICAgICAvLyDmmK/lkKblnKjliJvlu7rnvqTogYrvvIzmiJbogIXmmK/lnKjmn6XnnIvkvJror53lj4LkuI7ogIXkv6Hmga8KICAgICAgICAgICAgdGhpcy5zaG93Q29udmVyc2F0aW9uSW5mbyAmJiAodGhpcy5zaG93Q29udmVyc2F0aW9uSW5mbyA9IGZhbHNlKTsKICAgICAgICB9LAoKICAgICAgICBpc05vdGlmaWNhdGlvbk1lc3NhZ2UobWVzc2FnZSkgewogICAgICAgICAgICByZXR1cm4gbWVzc2FnZSAmJiBtZXNzYWdlLm1lc3NhZ2VDb250ZW50IGluc3RhbmNlb2YgTm90aWZpY2F0aW9uTWVzc2FnZUNvbnRlbnQKICAgICAgICAgICAgICAgICYmIG1lc3NhZ2UubWVzc2FnZUNvbnRlbnQudHlwZSAhPT0gTWVzc2FnZUNvbnRlbnRUeXBlLlJlY2FsbE1lc3NhZ2VfTm90aWZpY2F0aW9uCiAgICAgICAgICAgICAgICAmJiBtZXNzYWdlLm1lc3NhZ2VDb250ZW50LnR5cGUgIT09IE1lc3NhZ2VDb250ZW50VHlwZS5SaWNoX05vdGlmaWNhdGlvbjsKICAgICAgICB9LAoKICAgICAgICBpc0NvbnRleHRhYmxlTm90aWZpY2F0aW9uTWVzc2FnZShtZXNzYWdlKSB7CiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlICYmIChtZXNzYWdlLm1lc3NhZ2VDb250ZW50IGluc3RhbmNlb2YgUmljaE5vdGlmaWNhdGlvbk1lc3NhZ2VDb250ZW50IHx8IG1lc3NhZ2UubWVzc2FnZUNvbnRlbnQgaW5zdGFuY2VvZiBBcnRpY2xlc01lc3NhZ2VDb250ZW50KTsKICAgICAgICB9LAoKICAgICAgICBpc1JlY2FsbE5vdGlmaWNhdGlvbk1lc3NhZ2UobWVzc2FnZSkgewogICAgICAgICAgICByZXR1cm4gbWVzc2FnZSAmJiBtZXNzYWdlLm1lc3NhZ2VDb250ZW50LnR5cGUgPT09IE1lc3NhZ2VDb250ZW50VHlwZS5SZWNhbGxNZXNzYWdlX05vdGlmaWNhdGlvbjsKICAgICAgICB9LAoKICAgICAgICBpc0NhbmNlbGFibGUobWVzc2FnZSkgewogICAgICAgICAgICByZXR1cm4gbWVzc2FnZSAmJiBtZXNzYWdlLm1lc3NhZ2VDb250ZW50IGluc3RhbmNlb2YgTWVkaWFNZXNzYWdlQ29udGVudCAmJiBtZXNzYWdlLnN0YXR1cyA9PT0gTWVzc2FnZVN0YXR1cy5TZW5kaW5nOwogICAgICAgIH0sCgogICAgICAgIHJlZWRpdChtZXNzYWdlKSB7CiAgICAgICAgICAgIHRoaXMuJHJlZnMubWVzc2FnZUlucHV0Vmlldy5pbnNlcnRUZXh0KG1lc3NhZ2UubWVzc2FnZUNvbnRlbnQub3JpZ2luYWxTZWFyY2hhYmxlQ29udGVudCk7CiAgICAgICAgfSwKCiAgICAgICAgb25TY3JvbGwoZSkgewogICAgICAgICAgICAvLyBoaWRlIHRpcHB5IHVzZXJDYXJkCiAgICAgICAgICAgIGZvciAoY29uc3QgcG9wcGVyIG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50aXBweS1wb3BwZXInKSkgewogICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBwb3BwZXIuX3RpcHB5OwogICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSkgewogICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmhpZGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBoaWRlIG1lc3NhZ2UgY29udGV4dCBtZW51CiAgICAgICAgICAgIHRoaXMuJHJlZnMubWVudSAmJiB0aGlzLiRyZWZzLm1lbnUuY2xvc2UoKTsKCiAgICAgICAgICAgIC8vIOW9k+eUqOaIt+W+gOS4iua7keWKqOS4gOautei3neemu+S5i+WQju+8jOaUtuWIsOaWsOa2iOaBr++8jOS4jeiHquWKqOa7muWIsOWIsOacgOWQjgogICAgICAgICAgICBpZiAoZS50YXJnZXQuc2Nyb2xsSGVpZ2h0ID4gZS50YXJnZXQuY2xpZW50SGVpZ2h0ICsgZS50YXJnZXQuc2Nyb2xsVG9wICsgZS50YXJnZXQuY2xpZW50SGVpZ2h0IC8gMikgewogICAgICAgICAgICAgICAgc3RvcmUuc2V0U2hvdWxkQXV0b1Njcm9sbFRvQm90dG9tKGZhbHNlKQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3RvcmUuc2V0U2hvdWxkQXV0b1Njcm9sbFRvQm90dG9tKHRydWUpCiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyQ29udmVyc2F0aW9uVW5yZWFkU3RhdHVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBkcmFnU3RhcnQoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLm11dGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5pc0hhbmRsZXJEcmFnZ2luZyA9IHRydWU7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdkcmFnIHN0YXJ0JykKICAgICAgICB9LAoKICAgICAgICBkcmFnKGUpIHsKICAgICAgICAgICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgZHJhZ2dpbmcgZmxhZyBpcyBmYWxzZQogICAgICAgICAgICBpZiAoIXRoaXMuaXNIYW5kbGVyRHJhZ2dpbmcpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gR2V0IG9mZnNldAogICAgICAgICAgICBsZXQgY29udGFpbmVyT2Zmc2V0VG9wID0gdGhpcy4kcmVmc1snY29udmVyc2F0aW9uQ29udGVudENvbnRhaW5lciddLm9mZnNldFRvcDsKCiAgICAgICAgICAgIC8vIEdldCB4LWNvb3JkaW5hdGUgb2YgcG9pbnRlciByZWxhdGl2ZSB0byBjb250YWluZXIKICAgICAgICAgICAgbGV0IHBvaW50ZXJSZWxhdGl2ZVlwb3MgPSBlLmNsaWVudFkgLSBjb250YWluZXJPZmZzZXRUb3A7CgogICAgICAgICAgICAvLyBBcmJpdHJhcnkgbWluaW11bSB3aWR0aCBzZXQgb24gYm94IEEsIG90aGVyd2lzZSBpdHMgaW5uZXIgY29udGVudCB3aWxsIGNvbGxhcHNlIHRvIHdpZHRoIG9mIDAKICAgICAgICAgICAgbGV0IGJveEFtaW5IZWlnaHQgPSAxNTA7CgogICAgICAgICAgICAvLyBSZXNpemUgYm94IEEKICAgICAgICAgICAgLy8gKiA4cHggaXMgdGhlIGxlZnQvcmlnaHQgc3BhY2luZyBiZXR3ZWVuIC5oYW5kbGVyIGFuZCBpdHMgaW5uZXIgcHNldWRvLWVsZW1lbnQKICAgICAgICAgICAgLy8gKiBTZXQgZmxleC1ncm93IHRvIDAgdG8gcHJldmVudCBpdCBmcm9tIGdyb3dpbmcKICAgICAgICAgICAgdGhpcy4kcmVmc1snY29udmVyc2F0aW9uTWVzc2FnZUxpc3QnXS5zdHlsZS5oZWlnaHQgPSAoTWF0aC5tYXgoYm94QW1pbkhlaWdodCwgcG9pbnRlclJlbGF0aXZlWXBvcykpICsgJ3B4JzsKICAgICAgICAgICAgdGhpcy4kcmVmc1snY29udmVyc2F0aW9uTWVzc2FnZUxpc3QnXS5zdHlsZS5mbGV4R3JvdyA9IDA7CiAgICAgICAgICAgIHRoaXMubWVzc2FnZUlucHV0Vmlld1Jlc2l6ZWQgPSB0cnVlOwoKICAgICAgICB9LAoKICAgICAgICBkcmFnRW5kKCkgewogICAgICAgICAgICB0aGlzLmlzSGFuZGxlckRyYWdnaW5nID0gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgb25NZW51Q2xvc2UoKSB7CiAgICAgICAgICAgIHRoaXMuJGVtaXQoJ2NvbnRleHRNZW51Q2xvc2VkJykKICAgICAgICB9LAogICAgICAgIG9uTWVzc2FnZVNlbmRlckNvbnRleHRNZW51Q2xvc2UoKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdvbk1lc3NhZ2VTZW5kZXJDb250ZXh0TWVudUNsb3NlJykKICAgICAgICB9LAoKICAgICAgICAvLyBtZXNzYWdlIGNvbnRleHQgbWVudQogICAgICAgIGlzQ29weWFibGUobWVzc2FnZSkgewogICAgICAgICAgICByZXR1cm4gbWVzc2FnZQogICAgICAgICAgICAgICAgJiYgKG1lc3NhZ2UubWVzc2FnZUNvbnRlbnQgaW5zdGFuY2VvZiBUZXh0TWVzc2FnZUNvbnRlbnQKICAgICAgICAgICAgICAgICAgICB8fCBtZXNzYWdlLm1lc3NhZ2VDb250ZW50IGluc3RhbmNlb2YgSW1hZ2VNZXNzYWdlQ29udGVudAogICAgICAgICAgICAgICAgICAgIHx8ICgobWVzc2FnZS5tZXNzYWdlQ29udGVudCBpbnN0YW5jZW9mIFZpZGVvTWVzc2FnZUNvbnRlbnQKICAgICAgICAgICAgICAgICAgICAgICAgfHwgbWVzc2FnZS5tZXNzYWdlQ29udGVudCBpbnN0YW5jZW9mIEZpbGVNZXNzYWdlQ29udGVudCkgJiYgdGhpcy5pc0xvY2FsRmlsZShtZXNzYWdlKSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgfSwKICAgICAgICBpc0Rvd25sb2FkYWJsZShtZXNzYWdlKSB7CiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlICYmIChtZXNzYWdlLm1lc3NhZ2VDb250ZW50IGluc3RhbmNlb2YgSW1hZ2VNZXNzYWdlQ29udGVudAogICAgICAgICAgICAgICAgfHwgbWVzc2FnZS5tZXNzYWdlQ29udGVudCBpbnN0YW5jZW9mIEZpbGVNZXNzYWdlQ29udGVudAogICAgICAgICAgICAgICAgfHwgbWVzc2FnZS5tZXNzYWdlQ29udGVudCBpbnN0YW5jZW9mIFZpZGVvTWVzc2FnZUNvbnRlbnQpOwogICAgICAgIH0sCgogICAgICAgIGlzRm9yd2FyZGFibGUobWVzc2FnZSkgewogICAgICAgICAgICBpZiAobWVzc2FnZSAmJiBtZXNzYWdlLm1lc3NhZ2VDb250ZW50IGluc3RhbmNlb2YgU291bmRNZXNzYWdlQ29udGVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0sCgogICAgICAgIGlzRmF2YWJsZShtZXNzYWdlKSB7CiAgICAgICAgICAgIGlmICghbWVzc2FnZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBbTWVzc2FnZUNvbnRlbnRUeXBlLlZPSVBfQ09OVEVOVF9UWVBFX1NUQVJULAogICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRlbnRUeXBlLkNPTkZFUkVOQ0VfQ09OVEVOVF9UWVBFX0lOVklURV0uaW5kZXhPZihtZXNzYWdlLm1lc3NhZ2VDb250ZW50LnR5cGUpIDw9IC0xOwogICAgICAgIH0sCgogICAgICAgIGlzUmVjYWxsYWJsZShtZXNzYWdlKSB7CiAgICAgICAgICAgIGlmIChtZXNzYWdlKSB7CiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5jb252ZXJzYXRpb24udHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5Hcm91cCkgewogICAgICAgICAgICAgICAgICAgIGxldCBncm91cEluZm8gPSB3ZmMuZ2V0R3JvdXBJbmZvKG1lc3NhZ2UuY29udmVyc2F0aW9uLnRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGZVc2VySWQgPSB3ZmMuZ2V0VXNlcklkKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwSW5mbyAmJiBncm91cEluZm8ub3duZXIgPT09IHNlbGZVc2VySWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBsZXQgZnJvbUdyb3VwTWVtYmVyID0gd2ZjLmdldEdyb3VwTWVtYmVyKG1lc3NhZ2UuY29udmVyc2F0aW9uLnRhcmdldCwgbWVzc2FnZS5mcm9tKTsKICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXBNZW1iZXIgPSB3ZmMuZ2V0R3JvdXBNZW1iZXIobWVzc2FnZS5jb252ZXJzYXRpb24udGFyZ2V0LCBzZWxmVXNlcklkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWZyb21Hcm91cE1lbWJlciB8fCAhZ3JvdXBNZW1iZXIpewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChncm91cE1lbWJlci50eXBlID09PSBHcm91cE1lbWJlclR5cGUuTWFuYWdlciAmJiBbR3JvdXBNZW1iZXJUeXBlLk1hbmFnZXIsIEdyb3VwTWVtYmVyVHlwZS5Pd25lcl0uaW5kZXhPZihmcm9tR3JvdXBNZW1iZXIudHlwZSkgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxldCBkZWx0YSA9IHdmYy5nZXRTZXJ2ZXJEZWx0YVRpbWUoKTsKICAgICAgICAgICAgICAgIGxldCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmRpcmVjdGlvbiA9PT0gMCAmJiBub3cgLSAobnVtYmVyVmFsdWUobWVzc2FnZS50aW1lc3RhbXApIC0gZGVsdGEpIDwgNjAgKiAxMDAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIGlzTG9jYWxGaWxlKG1lc3NhZ2UpIHsKICAgICAgICAgICAgaWYgKG1lc3NhZ2UgJiYgaXNFbGVjdHJvbigpKSB7CiAgICAgICAgICAgICAgICBsZXQgbWVkaWEgPSBtZXNzYWdlLm1lc3NhZ2VDb250ZW50OwogICAgICAgICAgICAgICAgbGV0IGxvY2FsUGF0aCA9IG1lZGlhLmxvY2FsUGF0aDsKICAgICAgICAgICAgICAgIGlmIChsb2NhbFBhdGgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhsb2NhbFBhdGgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICBpc1F1b3RhYmxlKG1lc3NhZ2UpIHsKICAgICAgICAgICAgaWYgKCFtZXNzYWdlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtNZXNzYWdlQ29udGVudFR5cGUuVk9JUF9DT05URU5UX1RZUEVfU1RBUlQsCiAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGVudFR5cGUuVm9pY2UsCiAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGVudFR5cGUuVmlkZW8sCiAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGVudFR5cGUuQ29tcG9zaXRlX01lc3NhZ2UsCiAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGVudFR5cGUuQXJ0aWNsZXMsCiAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGVudFR5cGUuQ09ORkVSRU5DRV9DT05URU5UX1RZUEVfSU5WSVRFXS5pbmRleE9mKG1lc3NhZ2UubWVzc2FnZUNvbnRlbnQudHlwZSkgPD0gLTE7CiAgICAgICAgfSwKCiAgICAgICAgY29weShtZXNzYWdlKSB7CiAgICAgICAgICAgIGxldCBjb250ZW50ID0gbWVzc2FnZS5tZXNzYWdlQ29udGVudDsKICAgICAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBUZXh0TWVzc2FnZUNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZFRleHQgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkudG9TdHJpbmcoKQogICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkVGV4dCkgewogICAgICAgICAgICAgICAgICAgIGNvcHlUZXh0KHNlbGVjdGVkVGV4dCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvcHlUZXh0KGNvbnRlbnQuY29udGVudCkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgSW1hZ2VNZXNzYWdlQ29udGVudCkgewogICAgICAgICAgICAgICAgY29weUltZyhjb250ZW50LnJlbW90ZVBhdGgpCiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIE1lZGlhTWVzc2FnZUNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIGlmIChpc0VsZWN0cm9uKCkpIHsKICAgICAgICAgICAgICAgICAgICBpcGNSZW5kZXJlci5zZW5kKElQQ0V2ZW50VHlwZS5GSUxFX0NPUFksIHtwYXRoOiBjb250ZW50LmxvY2FsUGF0aH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBkb3dubG9hZChtZXNzYWdlKSB7CiAgICAgICAgICAgIGlmICghc3RvcmUuaXNEb3dubG9hZGluZ01lc3NhZ2UobWVzc2FnZS5tZXNzYWdlSWQpKSB7CiAgICAgICAgICAgICAgICBkb3dubG9hZEZpbGUobWVzc2FnZSkKICAgICAgICAgICAgICAgIHN0b3JlLmFkZERvd25sb2FkaW5nTWVzc2FnZShtZXNzYWdlLm1lc3NhZ2VJZCkKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFRPRE8gdG9hc3Qg5LiL6L295LitCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZmlsZSBpc0Rvd25sb2FkaW5nJykKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIG9wZW5GaWxlKG1lc3NhZ2UpIHsKICAgICAgICAgICAgbGV0IGZpbGUgPSBtZXNzYWdlLm1lc3NhZ2VDb250ZW50OwogICAgICAgICAgICBzaGVsbC5vcGVuSXRlbShmaWxlLmxvY2FsUGF0aCk7CiAgICAgICAgfSwKCiAgICAgICAgb3BlbkRpcihtZXNzYWdlKSB7CiAgICAgICAgICAgIGxldCBmaWxlID0gbWVzc2FnZS5tZXNzYWdlQ29udGVudDsKICAgICAgICAgICAgc2hlbGwuc2hvd0l0ZW1JbkZvbGRlcihmaWxlLmxvY2FsUGF0aCk7CiAgICAgICAgfSwKCiAgICAgICAgcmVjYWxsTWVzc2FnZShtZXNzYWdlKSB7CiAgICAgICAgICAgIHdmYy5yZWNhbGxNZXNzYWdlKG1lc3NhZ2UubWVzc2FnZVVpZCwgbnVsbCwgbnVsbCk7CiAgICAgICAgfSwKICAgICAgICBjYW5jZWxNZXNzYWdlKG1lc3NhZ2UpIHsKICAgICAgICAgICAgbGV0IGNhbmNlbGVkID0gd2ZjLmNhbmNlbFNlbmRpbmdNZXNzYWdlKG1lc3NhZ2UubWVzc2FnZUlkKTsKICAgICAgICAgICAgaWYgKCFjYW5jZWxlZCkgewogICAgICAgICAgICAgICAgdGhpcy4kbm90aWZ5KHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAn5Y+W5raI5aSx6LSlJywKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd2FybicsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGRlbE1lc3NhZ2UobWVzc2FnZSkgewogICAgICAgICAgICB0aGlzLiRhbGVydCh7CiAgICAgICAgICAgICAgICB0aXRsZTogJyDliKDpmaTmtojmga8nLAogICAgICAgICAgICAgICAgY29udGVudDogJ+ehruWumuWIoOmZpOa2iOaBr++8nycsCiAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogJ+acrOWcsOWIoOmZpCcsCiAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiAn6L+c56iL5Yig6ZmkJywKICAgICAgICAgICAgICAgIGNhbmNlbENhbGxiYWNrOiAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgd2ZjLmRlbGV0ZVJlbW90ZU1lc3NhZ2VCeVVpZChtZXNzYWdlLm1lc3NhZ2VVaWQsIG51bGwsIG51bGwpCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgY29uZmlybUNhbGxiYWNrOiAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgd2ZjLmRlbGV0ZU1lc3NhZ2UobWVzc2FnZS5tZXNzYWdlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KQogICAgICAgIH0sCgogICAgICAgIGZvcndhcmQobWVzc2FnZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy4kZm9yd2FyZE1lc3NhZ2UoewogICAgICAgICAgICAgICAgZm9yd2FyZFR5cGU6IEZvcndhcmRUeXBlLk5PUk1BTCwKICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiBbbWVzc2FnZV0sCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9mb3J3YXJkKG1lc3NhZ2UpIHsKICAgICAgICAgICAgdGhpcy5mb3J3YXJkKG1lc3NhZ2UpLmNhdGNoKChyZWFzb24pID0+IHsKICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmb3dhcmQgZXJycm8nLCByZWFzb24pCiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHF1b3RlTWVzc2FnZShtZXNzYWdlKSB7CiAgICAgICAgICAgIHN0b3JlLnF1b3RlTWVzc2FnZShtZXNzYWdlKTsKICAgICAgICB9LAoKICAgICAgICAvLyBjYWxsIGZyb20gY2hpbGQKICAgICAgICBmYXZNZXNzYWdlcyhtZXNzYWdlcykgewogICAgICAgICAgICBjb25zb2xlLmxvZygnZmF2IG1lc3NhZ2VzJyk7CiAgICAgICAgICAgIGxldCBjb21wb3NpdGVNZXNzYWdlQ29udGVudCA9IG5ldyBDb21wb3NpdGVNZXNzYWdlQ29udGVudCgpOwogICAgICAgICAgICBsZXQgdGl0bGUgPSAnJzsKICAgICAgICAgICAgbGV0IG1zZ0NvbnZlcnNhdGlvbiA9IG1lc3NhZ2VzWzBdLmNvbnZlcnNhdGlvbjsKICAgICAgICAgICAgaWYgKG1zZ0NvbnZlcnNhdGlvbi50eXBlID09PSBDb252ZXJzYXRpb25UeXBlLlNpbmdsZSkgewogICAgICAgICAgICAgICAgbGV0IHVzZXJzID0gc3RvcmUuZ2V0VXNlckluZm9zKFt3ZmMuZ2V0VXNlcklkKCksIG1zZ0NvbnZlcnNhdGlvbi50YXJnZXRdLCAnJyk7CiAgICAgICAgICAgICAgICB0aXRsZSA9IHVzZXJzWzBdLl9kaXNwbGF5TmFtZSArICflkownICsgdXNlcnNbMV0uX2Rpc3BsYXlOYW1lICsgJ+eahOiBiuWkqeiusOW9lSc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aXRsZSA9ICfnvqTnmoTogYrlpKnorrDlvZUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbXBvc2l0ZU1lc3NhZ2VDb250ZW50LnRpdGxlID0gdGl0bGU7CiAgICAgICAgICAgIGNvbXBvc2l0ZU1lc3NhZ2VDb250ZW50Lm1lc3NhZ2VzID0gbWVzc2FnZXM7CgogICAgICAgICAgICBsZXQgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKG1zZ0NvbnZlcnNhdGlvbiwgY29tcG9zaXRlTWVzc2FnZUNvbnRlbnQpOwogICAgICAgICAgICBtZXNzYWdlLmZyb20gPSB3ZmMuZ2V0VXNlcklkKCk7CiAgICAgICAgICAgIHRoaXMuZmF2TWVzc2FnZShtZXNzYWdlKTsKICAgICAgICB9LAoKICAgICAgICBmYXZNZXNzYWdlKG1lc3NhZ2UpIHsKICAgICAgICAgICAgYXBwU2VydmVyQXBpLmZhdk1lc3NhZ2UobWVzc2FnZSkKICAgICAgICAgICAgICAgIC50aGVuKGRhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIHRoaXMuJG5vdGlmeSh7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpdGxlOiAn5pS26JeP5oiQ5YqfJywKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJ+aUtuiXj+aIkOWKnycsCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbmZvJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmYXYgZXJyb3InLCBlcnIpCiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbm90aWZ5KHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGl0bGU6ICfmlLbol4/lpLHotKUnLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAn5pS26JeP5aSx6LSlJywKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSkKICAgICAgICB9LAoKICAgICAgICBtdWx0aVNlbGVjdChtZXNzYWdlKSB7CiAgICAgICAgICAgIHRoaXMudG9nZ2xlTWVzc2FnZU11bHRpU2VsZWN0aW9uQWN0aW9uVmlldyhtZXNzYWdlKTsKICAgICAgICB9LAoKICAgICAgICBpbmZpbml0ZUhhbmRsZXIoJHN0YXRlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0byBsb2FkIG1vcmUgbWVzc2FnZScpOwogICAgICAgICAgICBzdG9yZS5sb2FkQ29udmVyc2F0aW9uSGlzdG9yeU1lc3NhZ2VzKCgpID0+IHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsb2FkZWQnKQogICAgICAgICAgICAgICAgJHN0YXRlLmxvYWRlZCgpOwogICAgICAgICAgICB9LCAoKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29tcGxldGUnKQogICAgICAgICAgICAgICAgJHN0YXRlLmNvbXBsZXRlKCkKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgcGxheVZvaWNlKG1lc3NhZ2UpIHsKICAgICAgICAgICAgaWYgKGFtcikgewogICAgICAgICAgICAgICAgYW1yLnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhbXIgPSBuZXcgQmVuekFNUlJlY29yZGVyKCk7CiAgICAgICAgICAgIGxldCB2b2ljZSA9IG1lc3NhZ2UubWVzc2FnZUNvbnRlbnQ7CiAgICAgICAgICAgIGFtci5pbml0V2l0aFVybCh2b2ljZS5yZW1vdGVQYXRoKS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICAgIG1lc3NhZ2UuX2lzUGxheWluZyA9IHRydWU7CiAgICAgICAgICAgICAgICBhbXIucGxheSgpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYW1yLm9uRW5kZWQoKCkgPT4gewogICAgICAgICAgICAgICAgbWVzc2FnZS5faXNQbGF5aW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdG9yZS5wbGF5Vm9pY2UobnVsbCkKICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnN0YXR1cyA9PT0gTWVzc2FnZVN0YXR1cy5VbnJlYWQpIHsKICAgICAgICAgICAgICAgICAgICB3ZmMudXBkYXRlTWVzc2FnZVN0YXR1cyhtZXNzYWdlLm1lc3NhZ2VJZCwgTWVzc2FnZVN0YXR1cy5QbGF5ZWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KQogICAgICAgIH0sCiAgICAgICAgbWVudGlvbk1lc3NhZ2VTZW5kZXJUaXRsZShtZXNzYWdlKSB7CiAgICAgICAgICAgIGlmICghbWVzc2FnZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnCiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGRpc3BsYXlOYW1lID0gd2ZjLmdldEdyb3VwTWVtYmVyRGlzcGxheU5hbWUobWVzc2FnZS5jb252ZXJzYXRpb24udGFyZ2V0LCBtZXNzYWdlLmZyb20pOwogICAgICAgICAgICByZXR1cm4gJ0AnICsgZGlzcGxheU5hbWU7CiAgICAgICAgfSwKCiAgICAgICAgbWVudGlvbk1lc3NhZ2VTZW5kZXIobWVzc2FnZSkgewogICAgICAgICAgICB0aGlzLiRyZWZzLm1lc3NhZ2VJbnB1dFZpZXcubWVudGlvbihtZXNzYWdlLmNvbnZlcnNhdGlvbi50YXJnZXQsIG1lc3NhZ2UuZnJvbSk7CiAgICAgICAgfSwKCiAgICAgICAgb25SZWNlaXZlTWVzc2FnZShtZXNzYWdlLCBoYXNNb3JlKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmNvbnZlcnNhdGlvbkluZm8gJiYgdGhpcy5jb252ZXJzYXRpb25JbmZvLmNvbnZlcnNhdGlvbi5lcXVhbChtZXNzYWdlLmNvbnZlcnNhdGlvbikgJiYgbWVzc2FnZS5tZXNzYWdlQ29udGVudCBpbnN0YW5jZW9mIE11bHRpQ2FsbE9uZ29pbmdNZXNzYWdlQ29udGVudCkgewogICAgICAgICAgICAgICAgLy8g6Ieq5bex5piv5LiN5piv5bey57uP5Zyo6YCa6K+d5LitCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnTXVsdGlDYWxsT25nb2luZ01lc3NhZ2VDb250ZW50JywgbWVzc2FnZS5tZXNzYWdlQ29udGVudCkKICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VDb250ZW50LnRhcmdldHMuaW5kZXhPZih3ZmMuZ2V0VXNlcklkKCkpID49IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLm9uZ29pbmdDYWxscy5maW5kSW5kZXgoY2FsbCA9PiBjYWxsLm1lc3NhZ2VDb250ZW50LmNhbGxJZCA9PT0gbWVzc2FnZS5tZXNzYWdlQ29udGVudC5jYWxsSWQpOwogICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9uZ29pbmdDYWxsc1tpbmRleF0gPSBtZXNzYWdlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9uZ29pbmdDYWxscy5wdXNoKG1lc3NhZ2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9uZ29pbmdDYWxsVGltZXIpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9uZ29pbmdDYWxsVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25nb2luZ0NhbGxzID0gdGhpcy5vbmdvaW5nQ2FsbHMuZmlsdGVyKGNhbGwgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIChudW1iZXJWYWx1ZShjYWxsLnRpbWVzdGFtcCkgLSBudW1iZXJWYWx1ZSh3ZmMuZ2V0U2VydmVyRGVsdGFUaW1lKCkpKSkgPCAzICogMTAwMDsKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25nb2luZ0NhbGxzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLm9uZ29pbmdDYWxsVGltZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbmdvaW5nQ2FsbFRpbWVyID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnb25nb2luZyBjYWxscycsIHRoaXMub25nb2luZ0NhbGxzLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgfSwgMTAwMCkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGpvaW5NdWx0aUNhbGwobWVzc2FnZSkgewogICAgICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBKb2luQ2FsbFJlcXVlc3RNZXNzYWdlQ29udGVudChtZXNzYWdlLm1lc3NhZ2VDb250ZW50LmNhbGxJZCwgd2ZjLmdldENsaWVudElkKCkpOwogICAgICAgICAgICB3ZmMuc2VuZENvbnZlcnNhdGlvbk1lc3NhZ2UodGhpcy5jb252ZXJzYXRpb25JbmZvLmNvbnZlcnNhdGlvbiwgcmVxdWVzdCk7CiAgICAgICAgfSwKCiAgICAgICAgc2hvd1VucmVhZE1lc3NhZ2UoKSB7CiAgICAgICAgICAgIGxldCBtZXNzYWdlTGlzdEVsZW1lbnQgPSB0aGlzLiRyZWZzWydjb252ZXJzYXRpb25NZXNzYWdlTGlzdCddOwogICAgICAgICAgICBtZXNzYWdlTGlzdEVsZW1lbnQuc2Nyb2xsKHt0b3A6IG1lc3NhZ2VMaXN0RWxlbWVudC5zY3JvbGxIZWlnaHQsIGxlZnQ6IDAsIGJlaGF2aW9yOiAnYXV0byd9KQogICAgICAgICAgICB0aGlzLnVucmVhZE1lc3NhZ2VDb3VudCA9IDA7CiAgICAgICAgfSwKCiAgICAgICAgY2xlYXJDb252ZXJzYXRpb25VbnJlYWRTdGF0dXMoKSB7CiAgICAgICAgICAgIGxldCBpbmZvID0gdGhpcy5zaGFyZWRDb252ZXJzYXRpb25TdGF0ZS5jdXJyZW50Q29udmVyc2F0aW9uSW5mbzsKICAgICAgICAgICAgaWYgKGluZm8udW5yZWFkQ291bnQudW5yZWFkICsgaW5mby51bnJlYWRDb3VudC51bnJlYWRNZW50aW9uICsgaW5mby51bnJlYWRDb3VudC51bnJlYWRNZW50aW9uQWxsID4gMCkgewogICAgICAgICAgICAgICAgc3RvcmUuY2xlYXJDb252ZXJzYXRpb25VbnJlYWRTdGF0dXMoaW5mby5jb252ZXJzYXRpb24pOwogICAgICAgICAgICAgICAgLy8gdGhpcy51bnJlYWRNZXNzYWdlQ291bnQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSwKCiAgICBtb3VudGVkKCkgewogICAgICAgIHRoaXMucG9wdXBJdGVtID0gdGhpcy4kcmVmc1snc2V0dGluZyddOwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmRyYWdFbmQpOwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZyk7CgogICAgICAgIHRoaXMuJG9uKCdvcGVuTWVzc2FnZUNvbnRleHRNZW51JywgKGV2ZW50LCBtZXNzYWdlKSA9PiB7CiAgICAgICAgICAgIHRoaXMuJHJlZnMubWVudS5vcGVuKGV2ZW50LCBtZXNzYWdlKTsKICAgICAgICB9KTsKCiAgICAgICAgdGhpcy4kb24oJ29wZW5NZXNzYWdlU2VuZGVyQ29udGV4dE1lbnUnLCAoZXZlbnQsIG1lc3NhZ2UpID0+IHsKICAgICAgICAgICAgLy8g55uu5YmN5Y+q5pSv5oyB576k5Lya6K+d6YeM6Z2i77yM5raI5oGv5Y+R6YCB6ICF5Y+z6ZSuQAogICAgICAgICAgICBpZiAobWVzc2FnZS5jb252ZXJzYXRpb24udHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5Hcm91cCkgewogICAgICAgICAgICAgICAgdGhpcy4kcmVmcy5tZXNzYWdlU2VuZGVyQ29udGV4dE1lbnUub3BlbihldmVudCwgbWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgdGhpcy4kZXZlbnRCdXMuJG9uKCdzZW5kLWZpbGUnLCBhcmdzID0+IHsKICAgICAgICAgICAgbGV0IGZpbGVNZXNzYWdlQ29udGVudCA9IG5ldyBGaWxlTWVzc2FnZUNvbnRlbnQobnVsbCwgYXJncy5yZW1vdGVVcmwsIGFyZ3MubmFtZSwgYXJncy5zaXplKTsKICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBuZXcgTWVzc2FnZShudWxsLCBmaWxlTWVzc2FnZUNvbnRlbnQpOwogICAgICAgICAgICB0aGlzLmZvcndhcmQobWVzc2FnZSkKICAgICAgICB9KTsKCiAgICAgICAgdGhpcy4kZXZlbnRCdXMuJG9uKCdmb3J3YXJkLWZhdicsIGFyZ3MgPT4gewogICAgICAgICAgICBsZXQgZmF2SXRlbSA9IGFyZ3MuZmF2SXRlbTsKICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBmYXZJdGVtLnRvTWVzc2FnZSgpOwogICAgICAgICAgICB0aGlzLmZvcndhcmQobWVzc2FnZSk7CiAgICAgICAgfSk7CgogICAgICAgIHdmYy5ldmVudEVtaXR0ZXIub24oRXZlbnRUeXBlLlJlY2VpdmVNZXNzYWdlLCB0aGlzLm9uUmVjZWl2ZU1lc3NhZ2UpCiAgICB9LAoKICAgIGJlZm9yZURlc3Ryb3koKSB7CiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZHJhZ0VuZCk7CiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnKTsKICAgICAgICB0aGlzLiRldmVudEJ1cy4kb2ZmKCdzZW5kLWZpbGUnKTsKICAgICAgICB0aGlzLiRldmVudEJ1cy4kb2ZmKCdmb3J3YXJkLWZhdicpOwogICAgICAgIHRoaXMuJG9mZignb3Blbk1lc3NhZ2VDb250ZXh0TWVudScpCiAgICAgICAgdGhpcy4kb2ZmKCdvcGVuTWVzc2FnZVNlbmRlckNvbnRleHRNZW51JykKICAgICAgICB3ZmMuZXZlbnRFbWl0dGVyLnJlbW92ZUxpc3RlbmVyKEV2ZW50VHlwZS5SZWNlaXZlTWVzc2FnZSwgdGhpcy5vblJlY2VpdmVNZXNzYWdlKTsKICAgIH0sCgogICAgdXBkYXRlZCgpIHsKICAgICAgICBpZiAoIXRoaXMuc2hhcmVkQ29udmVyc2F0aW9uU3RhdGUuY3VycmVudENvbnZlcnNhdGlvbkluZm8pIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLnBvcHVwSXRlbSA9IHRoaXMuJHJlZnNbJ3NldHRpbmcnXTsKICAgICAgICAvLyByZWZlciB0byBodHRwOi8vaWFtZHVzdGFuLmNvbS9zbW9vdGhzY3JvbGwvCiAgICAgICAgY29uc29sZS5sb2coJ2NvbnZlcnNhdGlvblZpZXcgdXBkYXRlZCcsIHRoaXMuc2hhcmVkQ29udmVyc2F0aW9uU3RhdGUuY3VycmVudENvbnZlcnNhdGlvbkluZm8sIHRoaXMuc2hhcmVkQ29udmVyc2F0aW9uU3RhdGUuc2hvdWxkQXV0b1Njcm9sbFRvQm90dG9tLCB0aGlzLnNoYXJlZE1pc2NTdGF0ZS5pc1BhZ2VIaWRkZW4pCiAgICAgICAgaWYgKHRoaXMuc2hhcmVkQ29udmVyc2F0aW9uU3RhdGUuc2hvdWxkQXV0b1Njcm9sbFRvQm90dG9tICYmICF0aGlzLnNoYXJlZE1pc2NTdGF0ZS5pc1BhZ2VIaWRkZW4pIHsKICAgICAgICAgICAgbGV0IG1lc3NhZ2VMaXN0RWxlbWVudCA9IHRoaXMuJHJlZnNbJ2NvbnZlcnNhdGlvbk1lc3NhZ2VMaXN0J107CiAgICAgICAgICAgIG1lc3NhZ2VMaXN0RWxlbWVudC5zY3JvbGwoe3RvcDogbWVzc2FnZUxpc3RFbGVtZW50LnNjcm9sbEhlaWdodCwgbGVmdDogMCwgYmVoYXZpb3I6ICdhdXRvJ30pCiAgICAgICAgICAgIHRoaXMuY2xlYXJDb252ZXJzYXRpb25VbnJlYWRTdGF0dXMoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyDnlKjmiLfmu5HliqjliLDkuIrpnaLkuYvlkI7vvIzmlLbliLDmlrDmtojmga/vvIzkuI3oh6rliqjmu5HliqjliLDmnIDkuIvpnaIKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuc2hhcmVkQ29udmVyc2F0aW9uU3RhdGUuY3VycmVudENvbnZlcnNhdGlvbkluZm8pIHsKICAgICAgICAgICAgbGV0IHVucmVhZENvdW50ID0gdGhpcy5zaGFyZWRDb252ZXJzYXRpb25TdGF0ZS5jdXJyZW50Q29udmVyc2F0aW9uSW5mby51bnJlYWRDb3VudDsKICAgICAgICAgICAgaWYgKHVucmVhZENvdW50LnVucmVhZCA+IDApIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNoYXJlZE1pc2NTdGF0ZS5pc1BhZ2VIaWRkZW4pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnVucmVhZE1lc3NhZ2VDb3VudCA9IHVucmVhZENvdW50LnVucmVhZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMudW5yZWFkTWVzc2FnZUNvdW50ID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8g5YiH5o2i5Yiw5paw55qE5Lya6K+dCiAgICAgICAgaWYgKHRoaXMuY29udmVyc2F0aW9uSW5mbyAmJiB0aGlzLnNoYXJlZENvbnZlcnNhdGlvblN0YXRlLmN1cnJlbnRDb252ZXJzYXRpb25JbmZvICYmICF0aGlzLmNvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uLmVxdWFsKHRoaXMuc2hhcmVkQ29udmVyc2F0aW9uU3RhdGUuY3VycmVudENvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uKSkgewogICAgICAgICAgICB0aGlzLnNob3dDb252ZXJzYXRpb25JbmZvID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMub25nb2luZ0NhbGxzID0gbnVsbDsKICAgICAgICAgICAgaWYgKHRoaXMub25nb2luZ0NhbGxUaW1lcikgewogICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLm9uZ29pbmdDYWxsVGltZXIpOwogICAgICAgICAgICAgICAgdGhpcy5vbmdvaW5nQ2FsbFRpbWVyID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbkluZm8gPSB0aGlzLnNoYXJlZENvbnZlcnNhdGlvblN0YXRlLmN1cnJlbnRDb252ZXJzYXRpb25JbmZvOwogICAgfSwKCiAgICBjb21wdXRlZDogewogICAgICAgIGNvbnZlcnNhdGlvblRpdGxlKCkgewogICAgICAgICAgICBpZiAodGhpcy50aXRsZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGl0bGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGluZm8gPSB0aGlzLnNoYXJlZENvbnZlcnNhdGlvblN0YXRlLmN1cnJlbnRDb252ZXJzYXRpb25JbmZvOwogICAgICAgICAgICBpZiAoaW5mby5jb252ZXJzYXRpb24uX3RhcmdldCkgewogICAgICAgICAgICAgICAgaWYgKGluZm8uY29udmVyc2F0aW9uLnR5cGUgPT09IENvbnZlcnNhdGlvblR5cGUuR3JvdXApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mby5jb252ZXJzYXRpb24uX3RhcmdldC5fZGlzcGxheU5hbWUgKyAiICgiICsgaW5mby5jb252ZXJzYXRpb24uX3RhcmdldC5tZW1iZXJDb3VudCArICIpIjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZm8uY29udmVyc2F0aW9uLl90YXJnZXQuX2Rpc3BsYXlOYW1lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICfkvJror50nOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB0YXJnZXRVc2VyT25saW5lU3RhdGVEZXNjKCkgewogICAgICAgICAgICBsZXQgaW5mbyA9IHRoaXMuc2hhcmVkQ29udmVyc2F0aW9uU3RhdGUuY3VycmVudENvbnZlcnNhdGlvbkluZm87CiAgICAgICAgICAgIGlmIChpbmZvLmNvbnZlcnNhdGlvbi50eXBlID09PSBDb252ZXJzYXRpb25UeXBlLlNpbmdsZSAmJiBpbmZvLmNvbnZlcnNhdGlvbi50YXJnZXQgIT09IENvbmZpZy5GSUxFX0hFTFBFUl9JRCkgewogICAgICAgICAgICAgICAgaWYgKCF3ZmMuaXNNeUZyaWVuZChpbmZvLmNvbnZlcnNhdGlvbi50YXJnZXQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICfkvaDku6zov5jkuI3mmK/lpb3lj4vvvIzngrnlh7vmt7vliqDlpb3lj4snOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGluZm8uY29udmVyc2F0aW9uLl90YXJnZXQudHlwZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmZvLmNvbnZlcnNhdGlvbi5fdGFyZ2V0T25saW5lU3RhdGVEZXNjOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmZvLmNvbnZlcnNhdGlvbi5fdGFyZ2V0LnR5cGUgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2JvdCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5mby5jb252ZXJzYXRpb24udHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5DaGFubmVsKSB7CiAgICAgICAgICAgICAgICBsZXQgZGVzYyA9IGluZm8uY29udmVyc2F0aW9uLl90YXJnZXQuZGVzYzsKICAgICAgICAgICAgICAgIGlmICghZGVzYykgewogICAgICAgICAgICAgICAgICAgIGRlc2MgPSAnY2hhbm5lbCcKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBkZXNjOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBsb2FkaW5nSWRlbnRpZmllcigpIHsKICAgICAgICAgICAgbGV0IGNvbnZlcnNhdGlvbiA9IHRoaXMuc2hhcmVkQ29udmVyc2F0aW9uU3RhdGUuY3VycmVudENvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uOwogICAgICAgICAgICByZXR1cm4gY29udmVyc2F0aW9uLnR5cGUgKyAnLScgKyBjb252ZXJzYXRpb24udGFyZ2V0ICsgJy0nICsgY29udmVyc2F0aW9uLmxpbmU7CiAgICAgICAgfSwKICAgICAgICBjdXJyZW50Vm9pY2VNZXNzYWdlKCkgewogICAgICAgICAgICBsZXQgdm9pY2UgPSB0aGlzLnNoYXJlZENvbnZlcnNhdGlvblN0YXRlLmN1cnJlbnRWb2ljZU1lc3NhZ2U7CiAgICAgICAgICAgIGlmICh2b2ljZSkgewogICAgICAgICAgICAgICAgdGhpcy5wbGF5Vm9pY2Uodm9pY2UpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKGFtcikgewogICAgICAgICAgICAgICAgICAgIGFtci5zdG9wKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKICAgICAgIAogICAgICAgIG11dGVkKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuY29udmVyc2F0aW9uSW5mbykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCB0YXJnZXQgPSB0aGlzLmNvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uLl90YXJnZXQ7CiAgICAgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBHcm91cEluZm8pIHsKICAgICAgICAgICAgICAgIGxldCBncm91cEluZm8gPSB0YXJnZXQ7CiAgICAgICAgICAgICAgICBsZXQgZ3JvdXBNZW1iZXIgPSB3ZmMuZ2V0R3JvdXBNZW1iZXIoZ3JvdXBJbmZvLnRhcmdldCwgd2ZjLmdldFVzZXJJZCgpKTsKICAgICAgICAgICAgICAgIGlmIChncm91cEluZm8ubXV0ZSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBbR3JvdXBNZW1iZXJUeXBlLk93bmVyLCBHcm91cE1lbWJlclR5cGUuTWFuYWdlciwgR3JvdXBNZW1iZXJUeXBlLkFsbG93ZWRdLmluZGV4T2YoZ3JvdXBNZW1iZXIudHlwZSkgPCAwOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXBNZW1iZXIgJiYgZ3JvdXBNZW1iZXIudHlwZSA9PT0gR3JvdXBNZW1iZXJUeXBlLk11dGVkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAogICAgfSwKICAgIC8vIHdhdGNoOiB7CiAgICAvLyAgICAgY29udmVyc2F0aW9uSW5mbygpIHsKICAgIC8vICAgICAgICAgY29uc29sZS5sb2coJ2NvbnZlcnNhdGlvbkluZm8gY2hhbmdlZCcsIHRoaXMuY29udmVyc2F0aW9uSW5mbyk7CiAgICAvLyAgICAgfQogICAgLy8gfSwKCiAgICBkaXJlY3RpdmVzOiB7CiAgICAgICAgQ2xpY2tPdXRzaWRlCiAgICB9LAp9Owo="},null]}