{"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":1703226585034},{"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+IHsKICAgICAgICAgICAgICAgIG1lc3NhZ2UuX2lzUGxheWluZyA9IHRydWU7CiAgICAgICAgICAgICAgICBhbXIucGxheSgpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYW1yLm9uRW5kZWQoKCkgPT4gewogICAgICAgICAgICAgICAgbWVzc2FnZS5faXNQbGF5aW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdG9yZS5wbGF5Vm9pY2UobnVsbCkKICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnN0YXR1cyA9PT0gTWVzc2FnZVN0YXR1cy5VbnJlYWQpIHsKICAgICAgICAgICAgICAgICAgICB3ZmMudXBkYXRlTWVzc2FnZVN0YXR1cyhtZXNzYWdlLm1lc3NhZ2VJZCwgTWVzc2FnZVN0YXR1cy5QbGF5ZWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KQogICAgICAgIH0sCiAgICAgICAgbWVudGlvbk1lc3NhZ2VTZW5kZXJUaXRsZShtZXNzYWdlKSB7CiAgICAgICAgICAgIGlmICghbWVzc2FnZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnCiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGRpc3BsYXlOYW1lID0gd2ZjLmdldEdyb3VwTWVtYmVyRGlzcGxheU5hbWUobWVzc2FnZS5jb252ZXJzYXRpb24udGFyZ2V0LCBtZXNzYWdlLmZyb20pOwogICAgICAgICAgICByZXR1cm4gJ0AnICsgZGlzcGxheU5hbWU7CiAgICAgICAgfSwKCiAgICAgICAgbWVudGlvbk1lc3NhZ2VTZW5kZXIobWVzc2FnZSkgewogICAgICAgICAgICB0aGlzLiRyZWZzLm1lc3NhZ2VJbnB1dFZpZXcubWVudGlvbihtZXNzYWdlLmNvbnZlcnNhdGlvbi50YXJnZXQsIG1lc3NhZ2UuZnJvbSk7CiAgICAgICAgfSwKCiAgICAgICAgb25SZWNlaXZlTWVzc2FnZShtZXNzYWdlLCBoYXNNb3JlKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmNvbnZlcnNhdGlvbkluZm8gJiYgdGhpcy5jb252ZXJzYXRpb25JbmZvLmNvbnZlcnNhdGlvbi5lcXVhbChtZXNzYWdlLmNvbnZlcnNhdGlvbikKICAgICAgICAgICAgICAgICYmIG1lc3NhZ2UubWVzc2FnZUNvbnRlbnQgaW5zdGFuY2VvZiBNdWx0aUNhbGxPbmdvaW5nTWVzc2FnZUNvbnRlbnQKICAgICAgICAgICAgICAgICYmIENvbmZpZy5FTkFCTEVfTVVMVElfQ0FMTF9BVVRPX0pPSU4KICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAvLyDoh6rlt7HmmK/kuI3mmK/lt7Lnu4/lnKjpgJror53kuK0KICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdNdWx0aUNhbGxPbmdvaW5nTWVzc2FnZUNvbnRlbnQnLCBtZXNzYWdlLm1lc3NhZ2VDb250ZW50KQogICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZUNvbnRlbnQudGFyZ2V0cy5pbmRleE9mKHdmYy5nZXRVc2VySWQoKSkgPj0gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMub25nb2luZ0NhbGxzLmZpbmRJbmRleChjYWxsID0+IGNhbGwubWVzc2FnZUNvbnRlbnQuY2FsbElkID09PSBtZXNzYWdlLm1lc3NhZ2VDb250ZW50LmNhbGxJZCk7CiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMub25nb2luZ0NhbGxzW2luZGV4XSA9IG1lc3NhZ2U7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMub25nb2luZ0NhbGxzLnB1c2gobWVzc2FnZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub25nb2luZ0NhbGxUaW1lcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMub25nb2luZ0NhbGxUaW1lciA9IHNldEludGVydmFsKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbmdvaW5nQ2FsbHMgPSB0aGlzLm9uZ29pbmdDYWxscy5maWx0ZXIoY2FsbCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gKG51bWJlclZhbHVlKGNhbGwudGltZXN0YW1wKSAtIG51bWJlclZhbHVlKHdmYy5nZXRTZXJ2ZXJEZWx0YVRpbWUoKSkpKSA8IDMgKiAxMDAwOwogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vbmdvaW5nQ2FsbHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMub25nb2luZ0NhbGxUaW1lcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uZ29pbmdDYWxsVGltZXIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdvbmdvaW5nIGNhbGxzJywgdGhpcy5vbmdvaW5nQ2FsbHMubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICB9LCAxMDAwKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgam9pbk11bHRpQ2FsbChtZXNzYWdlKSB7CiAgICAgICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IEpvaW5DYWxsUmVxdWVzdE1lc3NhZ2VDb250ZW50KG1lc3NhZ2UubWVzc2FnZUNvbnRlbnQuY2FsbElkLCB3ZmMuZ2V0Q2xpZW50SWQoKSk7CiAgICAgICAgICAgIHdmYy5zZW5kQ29udmVyc2F0aW9uTWVzc2FnZSh0aGlzLmNvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uLCByZXF1ZXN0KTsKICAgICAgICB9LAoKICAgICAgICBzaG93VW5yZWFkTWVzc2FnZSgpIHsKICAgICAgICAgICAgbGV0IG1lc3NhZ2VMaXN0RWxlbWVudCA9IHRoaXMuJHJlZnNbJ2NvbnZlcnNhdGlvbk1lc3NhZ2VMaXN0J107CiAgICAgICAgICAgIG1lc3NhZ2VMaXN0RWxlbWVudC5zY3JvbGwoe3RvcDogbWVzc2FnZUxpc3RFbGVtZW50LnNjcm9sbEhlaWdodCwgbGVmdDogMCwgYmVoYXZpb3I6ICdhdXRvJ30pCiAgICAgICAgICAgIHRoaXMudW5yZWFkTWVzc2FnZUNvdW50ID0gMDsKICAgICAgICB9LAoKICAgICAgICBjbGVhckNvbnZlcnNhdGlvblVucmVhZFN0YXR1cygpIHsKICAgICAgICAgICAgbGV0IGluZm8gPSB0aGlzLnNoYXJlZENvbnZlcnNhdGlvblN0YXRlLmN1cnJlbnRDb252ZXJzYXRpb25JbmZvOwogICAgICAgICAgICBpZiAoaW5mby51bnJlYWRDb3VudC51bnJlYWQgKyBpbmZvLnVucmVhZENvdW50LnVucmVhZE1lbnRpb24gKyBpbmZvLnVucmVhZENvdW50LnVucmVhZE1lbnRpb25BbGwgPiAwKSB7CiAgICAgICAgICAgICAgICBzdG9yZS5jbGVhckNvbnZlcnNhdGlvblVucmVhZFN0YXR1cyhpbmZvLmNvbnZlcnNhdGlvbik7CiAgICAgICAgICAgICAgICAvLyB0aGlzLnVucmVhZE1lc3NhZ2VDb3VudCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9LAoKICAgIG1vdW50ZWQoKSB7CiAgICAgICAgdGhpcy5wb3B1cEl0ZW0gPSB0aGlzLiRyZWZzWydzZXR0aW5nJ107CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZHJhZ0VuZCk7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnKTsKCiAgICAgICAgdGhpcy4kb24oJ29wZW5NZXNzYWdlQ29udGV4dE1lbnUnLCAoZXZlbnQsIG1lc3NhZ2UpID0+IHsKICAgICAgICAgICAgdGhpcy4kcmVmcy5tZW51Lm9wZW4oZXZlbnQsIG1lc3NhZ2UpOwogICAgICAgIH0pOwoKICAgICAgICB0aGlzLiRvbignb3Blbk1lc3NhZ2VTZW5kZXJDb250ZXh0TWVudScsIChldmVudCwgbWVzc2FnZSkgPT4gewogICAgICAgICAgICAvLyDnm67liY3lj6rmlK/mjIHnvqTkvJror53ph4zpnaLvvIzmtojmga/lj5HpgIHogIXlj7PplK5ACiAgICAgICAgICAgIGlmIChtZXNzYWdlLmNvbnZlcnNhdGlvbi50eXBlID09PSBDb252ZXJzYXRpb25UeXBlLkdyb3VwKSB7CiAgICAgICAgICAgICAgICB0aGlzLiRyZWZzLm1lc3NhZ2VTZW5kZXJDb250ZXh0TWVudS5vcGVuKGV2ZW50LCBtZXNzYWdlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICB0aGlzLiRldmVudEJ1cy4kb24oJ3NlbmQtZmlsZScsIGFyZ3MgPT4gewogICAgICAgICAgICBsZXQgZmlsZU1lc3NhZ2VDb250ZW50ID0gbmV3IEZpbGVNZXNzYWdlQ29udGVudChudWxsLCBhcmdzLnJlbW90ZVVybCwgYXJncy5uYW1lLCBhcmdzLnNpemUpOwogICAgICAgICAgICBsZXQgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKG51bGwsIGZpbGVNZXNzYWdlQ29udGVudCk7CiAgICAgICAgICAgIHRoaXMuZm9yd2FyZChtZXNzYWdlKQogICAgICAgIH0pOwoKICAgICAgICB0aGlzLiRldmVudEJ1cy4kb24oJ2ZvcndhcmQtZmF2JywgYXJncyA9PiB7CiAgICAgICAgICAgIGxldCBmYXZJdGVtID0gYXJncy5mYXZJdGVtOwogICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGZhdkl0ZW0udG9NZXNzYWdlKCk7CiAgICAgICAgICAgIHRoaXMuZm9yd2FyZChtZXNzYWdlKTsKICAgICAgICB9KTsKCiAgICAgICAgd2ZjLmV2ZW50RW1pdHRlci5vbihFdmVudFR5cGUuUmVjZWl2ZU1lc3NhZ2UsIHRoaXMub25SZWNlaXZlTWVzc2FnZSkKICAgIH0sCgogICAgYmVmb3JlRGVzdHJveSgpIHsKICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5kcmFnRW5kKTsKICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWcpOwogICAgICAgIHRoaXMuJGV2ZW50QnVzLiRvZmYoJ3NlbmQtZmlsZScpOwogICAgICAgIHRoaXMuJGV2ZW50QnVzLiRvZmYoJ2ZvcndhcmQtZmF2Jyk7CiAgICAgICAgdGhpcy4kb2ZmKCdvcGVuTWVzc2FnZUNvbnRleHRNZW51JykKICAgICAgICB0aGlzLiRvZmYoJ29wZW5NZXNzYWdlU2VuZGVyQ29udGV4dE1lbnUnKQogICAgICAgIHdmYy5ldmVudEVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoRXZlbnRUeXBlLlJlY2VpdmVNZXNzYWdlLCB0aGlzLm9uUmVjZWl2ZU1lc3NhZ2UpOwogICAgfSwKCiAgICB1cGRhdGVkKCkgewogICAgICAgIGlmICghdGhpcy5zaGFyZWRDb252ZXJzYXRpb25TdGF0ZS5jdXJyZW50Q29udmVyc2F0aW9uSW5mbykgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMucG9wdXBJdGVtID0gdGhpcy4kcmVmc1snc2V0dGluZyddOwogICAgICAgIC8vIHJlZmVyIHRvIGh0dHA6Ly9pYW1kdXN0YW4uY29tL3Ntb290aHNjcm9sbC8KICAgICAgICBjb25zb2xlLmxvZygnY29udmVyc2F0aW9uVmlldyB1cGRhdGVkJywgdGhpcy5zaGFyZWRDb252ZXJzYXRpb25TdGF0ZS5jdXJyZW50Q29udmVyc2F0aW9uSW5mbywgdGhpcy5zaGFyZWRDb252ZXJzYXRpb25TdGF0ZS5zaG91bGRBdXRvU2Nyb2xsVG9Cb3R0b20sIHRoaXMuc2hhcmVkTWlzY1N0YXRlLmlzUGFnZUhpZGRlbikKICAgICAgICBpZiAodGhpcy5zaGFyZWRDb252ZXJzYXRpb25TdGF0ZS5zaG91bGRBdXRvU2Nyb2xsVG9Cb3R0b20gJiYgIXRoaXMuc2hhcmVkTWlzY1N0YXRlLmlzUGFnZUhpZGRlbikgewogICAgICAgICAgICBsZXQgbWVzc2FnZUxpc3RFbGVtZW50ID0gdGhpcy4kcmVmc1snY29udmVyc2F0aW9uTWVzc2FnZUxpc3QnXTsKICAgICAgICAgICAgbWVzc2FnZUxpc3RFbGVtZW50LnNjcm9sbCh7dG9wOiBtZXNzYWdlTGlzdEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LCBsZWZ0OiAwLCBiZWhhdmlvcjogJ2F1dG8nfSkKICAgICAgICAgICAgdGhpcy5jbGVhckNvbnZlcnNhdGlvblVucmVhZFN0YXR1cygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIOeUqOaIt+a7keWKqOWIsOS4iumdouS5i+WQju+8jOaUtuWIsOaWsOa2iOaBr++8jOS4jeiHquWKqOa7keWKqOWIsOacgOS4i+mdogogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5zaGFyZWRDb252ZXJzYXRpb25TdGF0ZS5jdXJyZW50Q29udmVyc2F0aW9uSW5mbykgewogICAgICAgICAgICBsZXQgdW5yZWFkQ291bnQgPSB0aGlzLnNoYXJlZENvbnZlcnNhdGlvblN0YXRlLmN1cnJlbnRDb252ZXJzYXRpb25JbmZvLnVucmVhZENvdW50OwogICAgICAgICAgICBpZiAodW5yZWFkQ291bnQudW5yZWFkID4gMCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hhcmVkTWlzY1N0YXRlLmlzUGFnZUhpZGRlbikgewogICAgICAgICAgICAgICAgICAgIHRoaXMudW5yZWFkTWVzc2FnZUNvdW50ID0gdW5yZWFkQ291bnQudW5yZWFkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy51bnJlYWRNZXNzYWdlQ291bnQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyDliIfmjaLliLDmlrDnmoTkvJror50KICAgICAgICBpZiAodGhpcy5jb252ZXJzYXRpb25JbmZvICYmIHRoaXMuc2hhcmVkQ29udmVyc2F0aW9uU3RhdGUuY3VycmVudENvbnZlcnNhdGlvbkluZm8gJiYgIXRoaXMuY29udmVyc2F0aW9uSW5mby5jb252ZXJzYXRpb24uZXF1YWwodGhpcy5zaGFyZWRDb252ZXJzYXRpb25TdGF0ZS5jdXJyZW50Q29udmVyc2F0aW9uSW5mby5jb252ZXJzYXRpb24pKSB7CiAgICAgICAgICAgIHRoaXMuc2hvd0NvbnZlcnNhdGlvbkluZm8gPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5vbmdvaW5nQ2FsbHMgPSBbXTsKICAgICAgICAgICAgaWYgKHRoaXMub25nb2luZ0NhbGxUaW1lcikgewogICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLm9uZ29pbmdDYWxsVGltZXIpOwogICAgICAgICAgICAgICAgdGhpcy5vbmdvaW5nQ2FsbFRpbWVyID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbkluZm8gPSB0aGlzLnNoYXJlZENvbnZlcnNhdGlvblN0YXRlLmN1cnJlbnRDb252ZXJzYXRpb25JbmZvOwogICAgfSwKCiAgICBjb21wdXRlZDogewogICAgICAgIGNvbnZlcnNhdGlvblRpdGxlKCkgewogICAgICAgICAgICBpZiAodGhpcy50aXRsZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGl0bGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGluZm8gPSB0aGlzLnNoYXJlZENvbnZlcnNhdGlvblN0YXRlLmN1cnJlbnRDb252ZXJzYXRpb25JbmZvOwogICAgICAgICAgICBpZiAoaW5mby5jb252ZXJzYXRpb24uX3RhcmdldCkgewogICAgICAgICAgICAgICAgaWYgKGluZm8uY29udmVyc2F0aW9uLnR5cGUgPT09IENvbnZlcnNhdGlvblR5cGUuR3JvdXApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mby5jb252ZXJzYXRpb24uX3RhcmdldC5fZGlzcGxheU5hbWUgKyAiICgiICsgaW5mby5jb252ZXJzYXRpb24uX3RhcmdldC5tZW1iZXJDb3VudCArICIpIjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZm8uY29udmVyc2F0aW9uLl90YXJnZXQuX2Rpc3BsYXlOYW1lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICfkvJror50nOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB0YXJnZXRVc2VyT25saW5lU3RhdGVEZXNjKCkgewogICAgICAgICAgICBsZXQgaW5mbyA9IHRoaXMuc2hhcmVkQ29udmVyc2F0aW9uU3RhdGUuY3VycmVudENvbnZlcnNhdGlvbkluZm87CiAgICAgICAgICAgIGlmIChpbmZvLmNvbnZlcnNhdGlvbi50eXBlID09PSBDb252ZXJzYXRpb25UeXBlLlNpbmdsZSAmJiBpbmZvLmNvbnZlcnNhdGlvbi50YXJnZXQgIT09IENvbmZpZy5GSUxFX0hFTFBFUl9JRCkgewogICAgICAgICAgICAgICAgaWYgKCF3ZmMuaXNNeUZyaWVuZChpbmZvLmNvbnZlcnNhdGlvbi50YXJnZXQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICfkvaDku6zov5jkuI3mmK/lpb3lj4vvvIzngrnlh7vmt7vliqDlpb3lj4snOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGluZm8uY29udmVyc2F0aW9uLl90YXJnZXQudHlwZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmZvLmNvbnZlcnNhdGlvbi5fdGFyZ2V0T25saW5lU3RhdGVEZXNjOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmZvLmNvbnZlcnNhdGlvbi5fdGFyZ2V0LnR5cGUgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2JvdCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5mby5jb252ZXJzYXRpb24udHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5DaGFubmVsKSB7CiAgICAgICAgICAgICAgICBsZXQgZGVzYyA9IGluZm8uY29udmVyc2F0aW9uLl90YXJnZXQuZGVzYzsKICAgICAgICAgICAgICAgIGlmICghZGVzYykgewogICAgICAgICAgICAgICAgICAgIGRlc2MgPSAnY2hhbm5lbCcKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBkZXNjOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBsb2FkaW5nSWRlbnRpZmllcigpIHsKICAgICAgICAgICAgbGV0IGNvbnZlcnNhdGlvbiA9IHRoaXMuc2hhcmVkQ29udmVyc2F0aW9uU3RhdGUuY3VycmVudENvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uOwogICAgICAgICAgICByZXR1cm4gY29udmVyc2F0aW9uLnR5cGUgKyAnLScgKyBjb252ZXJzYXRpb24udGFyZ2V0ICsgJy0nICsgY29udmVyc2F0aW9uLmxpbmU7CiAgICAgICAgfSwKICAgICAgICBjdXJyZW50Vm9pY2VNZXNzYWdlKCkgewogICAgICAgICAgICBsZXQgdm9pY2UgPSB0aGlzLnNoYXJlZENvbnZlcnNhdGlvblN0YXRlLmN1cnJlbnRWb2ljZU1lc3NhZ2U7CiAgICAgICAgICAgIGlmICh2b2ljZSkgewogICAgICAgICAgICAgICAgdGhpcy5wbGF5Vm9pY2Uodm9pY2UpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKGFtcikgewogICAgICAgICAgICAgICAgICAgIGFtci5zdG9wKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKICAgICAgIAogICAgICAgIG11dGVkKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuY29udmVyc2F0aW9uSW5mbykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCB0YXJnZXQgPSB0aGlzLmNvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uLl90YXJnZXQ7CiAgICAgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBHcm91cEluZm8pIHsKICAgICAgICAgICAgICAgIGxldCBncm91cEluZm8gPSB0YXJnZXQ7CiAgICAgICAgICAgICAgICBsZXQgZ3JvdXBNZW1iZXIgPSB3ZmMuZ2V0R3JvdXBNZW1iZXIoZ3JvdXBJbmZvLnRhcmdldCwgd2ZjLmdldFVzZXJJZCgpKTsKICAgICAgICAgICAgICAgIGlmIChncm91cEluZm8ubXV0ZSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBbR3JvdXBNZW1iZXJUeXBlLk93bmVyLCBHcm91cE1lbWJlclR5cGUuTWFuYWdlciwgR3JvdXBNZW1iZXJUeXBlLkFsbG93ZWRdLmluZGV4T2YoZ3JvdXBNZW1iZXIudHlwZSkgPCAwOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXBNZW1iZXIgJiYgZ3JvdXBNZW1iZXIudHlwZSA9PT0gR3JvdXBNZW1iZXJUeXBlLk11dGVkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAogICAgfSwKICAgIC8vIHdhdGNoOiB7CiAgICAvLyAgICAgY29udmVyc2F0aW9uSW5mbygpIHsKICAgIC8vICAgICAgICAgY29uc29sZS5sb2coJ2NvbnZlcnNhdGlvbkluZm8gY2hhbmdlZCcsIHRoaXMuY29udmVyc2F0aW9uSW5mbyk7CiAgICAvLyAgICAgfQogICAgLy8gfSwKCiAgICBkaXJlY3RpdmVzOiB7CiAgICAgICAgQ2xpY2tPdXRzaWRlCiAgICB9LAp9Owo="},null]}