快速跳转语雀进行内容收藏
// ==UserScript==
// @name 快速跳转语雀进行内容收藏
// @namespace npm/vite-plugin-monkey
// @version 0.0.0
// @author xiaolaji
// @description 快速跳转语雀进行内容收藏
// @icon https://ts1.cn.mm.bing.net/th?id=OIP-C.hpjQBHE4wfYFA1nm4KhTDwAAAA&w=173&h=185&c=8&rs=1&qlt=90&o=6&dpr=1.3&pid=3.1&rm=2
// @match https://www.bilibili.com/*
// @match http://127.0.0.1:5500/%E5%9F%BA%E7%A1%80/html/%E6%B5%8B%E8%AF%95%E8%84%9A%E6%9C%AC%E7%9A%84%E6%89%A7%E8%A1%8C%E6%97%B6%E6%9C%BA.html
// @match https://www.yuque.com/*
// @require https://cdn.jsdelivr.net/npm/react@18.2.0/umd/react.production.min.js
// @require https://cdn.jsdelivr.net/npm/react-dom@18.2.0/umd/react-dom.production.min.js
// @grant GM.addElement
// @grant GM_addElement
// @grant GM_cookie
// @grant GM_cookie
// @grant GM_getValue
// @grant GM_getValue
// @grant GM_setClipboard
// @grant GM_setValue
// @grant GM_setValue
// @grant unsafeWindow
// ==/UserScript==
(n=>{const t=document.createElement("style");t.dataset.source="vite-plugin-monkey",t.innerText=n,document.head.appendChild(t)})('abbr[title],abbr[data-original-title]{text-decoration:underline;text-decoration:underline dotted;border-bottom:0;cursor:help}.ant-btn{line-height:1.5715;position:relative;display:inline-block;font-weight:400;white-space:nowrap;text-align:center;background-image:none;border:1px solid transparent;box-shadow:0 2px #00000004;cursor:pointer;transition:all .3s cubic-bezier(.645,.045,.355,1);user-select:none;touch-action:manipulation;height:32px;padding:4px 15px;font-size:14px;border-radius:2px;color:#000000d9;border-color:#d9d9d9;background:#fff}.ant-form-item-label>label .ant-form-item-tooltip{color:#00000073;cursor:help;writing-mode:horizontal-tb;margin-inline-start:4px}.ant-tooltip{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:absolute;z-index:1070;display:block;width:max-content;width:intrinsic;max-width:250px;visibility:visible}.ant-tooltip-arrow-content:before{position:absolute;top:-11.3137085px;left:-11.3137085px;width:33.9411255px;height:33.9411255px;background:var(--antd-arrow-background-color);background-repeat:no-repeat;background-position:-10px -10px;content:"";clip-path:inset(33% 33%);clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z")}.fr-inline-field{display:inline-block;margin-right:16px}.fr-inline-container{display:inline-flex;flex-wrap:wrap}.ant-form-item-optional-hide{padding:0 8px}.ant-form-item-optional-hide .ant-form-item-label>label{font-size:16px;font-weight:#000000d9;font-weight:600}.fr-desc{word-break:break-all;color:#00000073;line-height:22px;margin-left:5px;font-weight:400;font-size:14px}.fr-hide-label>.ant-form-item-row>.ant-form-item-label{visibility:hidden}.fr-field .ant-form-item-row{flex-wrap:nowrap}.fr-field .ant-form-item-control-input-content{display:flex}.fr-field-visibility{width:0;height:0;visibility:hidden}.fr-form .ant-form-item-control{width:0}.fr-form .fr-inline-field .ant-form-item-control{width:auto}.ant-input-affix-wrapper::placeholder{color:#bfbfbf;user-select:none}.ant-input::placeholder{color:#bfbfbf;user-select:none}.ant-input-number-affix-wrapper{display:inline-block;width:100%;min-width:0;color:#000000d9;font-size:14px;line-height:1.5715;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:2px;transition:all .3s;position:relative;display:inline-flex;width:90px;padding:0;padding-inline-start:11px}.ant-input-number-affix-wrapper::placeholder{color:#bfbfbf;user-select:none}.ant-input-number-prefix{margin-inline-end:4px}.ant-input-number::placeholder{color:#bfbfbf;user-select:none}.ant-input-number-handler-up-inner,.ant-input-number-handler-down-inner{display:inline-block;color:inherit;font-style:normal;line-height:0;text-align:center;text-transform:none;vertical-align:-.125em;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:absolute;right:4px;width:12px;height:12px;color:#00000073;line-height:12px;transition:all .1s linear;user-select:none}.ant-input-number-input{width:100%;height:30px;padding:0 11px;text-align:left;background-color:transparent;border:0;border-radius:2px;outline:0;transition:all .3s linear;appearance:textfield!important}.ant-input-number-input::placeholder{color:#bfbfbf;user-select:none}.ant-select-single .ant-select-selector .ant-select-selection-item{position:relative;user-select:none}.ant-select-multiple .ant-select-selection-item{position:relative;display:flex;flex:none;box-sizing:border-box;max-width:100%;height:24px;margin-top:2px;margin-bottom:2px;line-height:22px;background:#f5f5f5;border:1px solid #f0f0f0;border-radius:2px;cursor:default;transition:font-size .3s,line-height .3s,height .3s;user-select:none;margin-inline-end:4px;padding-inline-start:8px;padding-inline-end:4px}.ant-select-multiple .ant-select-selection-overflow-item+.ant-select-selection-overflow-item .ant-select-selection-search{margin-inline-start:0}.ant-select-multiple .ant-select-selection-search{position:relative;max-width:100%;margin-inline-start:7px}.ant-select-multiple.ant-select-sm .ant-select-selection-search{margin-inline-start:3px}.ant-select:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input{margin:0;padding:0;background:transparent;border:none;outline:none;appearance:none}.ant-select-arrow>*:not(:last-child){margin-inline-end:8px}.ant-empty-img-default-path-2{fill:url(#linearGradient-1)}.ant-switch{margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;display:inline-block;box-sizing:border-box;min-width:44px;height:22px;line-height:22px;vertical-align:middle;background-color:#00000040;border:0;border-radius:100px;cursor:pointer;transition:all .2s;user-select:none}.ant-rate-star-first,.ant-rate-star-second{color:#f0f0f0;transition:all .3s;user-select:none}.ant-select-tree-indent{align-self:stretch;white-space:nowrap;user-select:none}.ant-select-tree-switcher{position:relative;flex:none;align-self:stretch;width:24px;margin:0;line-height:24px;text-align:center;cursor:pointer;user-select:none}.ant-select-tree-node-content-wrapper{line-height:24px;user-select:none}.rc-color-picker-panel-inner{position:relative;border-radius:4px;box-shadow:0 1px 5px #ccc;border:1px solid #ccc;padding-bottom:8px}.rc-color-picker-panel-wrap{margin:5px 0 0;height:30px;width:100%;position:relative}.rc-color-picker-panel-wrap-preview{position:absolute;right:8px}.rc-color-picker-panel-wrap-ribbon{position:absolute;left:8px;top:0;right:43px;height:30px}.rc-color-picker-panel-wrap-alpha{position:absolute;left:8px;right:43px;bottom:0;height:12.5px}.rc-color-picker-panel-wrap-has-alpha .rc-color-picker-panel-wrap-ribbon{height:12.5px}.rc-color-picker-trigger{border:1px solid #999;display:inline-block;padding:2px;border-radius:2px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:20px;height:20px;cursor:pointer;box-shadow:0 0 0 2px #fff inset}.rc-color-picker-trigger-open{box-shadow:0 0 3px #999}.rc-color-picker-panel{width:218px;background-color:#fff;box-sizing:border-box;outline:none;z-index:9;border-radius:4px;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.rc-color-picker-panel *{box-sizing:border-box}.rc-color-picker-panel-open{display:block}.rc-color-picker-panel-close{display:none}.rc-color-picker-panel-preview{height:30px;width:30px;overflow:hidden;border-radius:2px;background-image:url(data:image/png;base64,R0lGODdhCgAKAPAAAOXl5f///ywAAAAACgAKAEACEIQdqXt9GxyETrI279OIgwIAOw==)}.rc-color-picker-panel-preview span{box-shadow:0 0 2px gray inset}.rc-color-picker-panel-preview span,.rc-color-picker-panel-preview input[type=color]{position:absolute;display:block;height:100%;width:30px;border-radius:2px}.rc-color-picker-panel-preview input[type=color]{opacity:0}.rc-color-picker-panel-board{position:relative;font-size:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin:8px 8px 0}.rc-color-picker-panel-board span{position:absolute;border-radius:10px;border:1px solid #fff;width:9px;height:9px;margin:-4px 0 0 -4px;left:-999px;top:-999px;box-shadow:0 0 1px #787878b3;z-index:2}.rc-color-picker-panel-board-hsv{width:200px;height:150px;position:relative;z-index:1;border-radius:2px}.rc-color-picker-panel-board-value{border-radius:2px;position:absolute;width:100%;height:100%;left:0;top:0;z-index:2;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB2aWV3Qm94PSIwIDAgMSAxIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIj48bGluZWFyR3JhZGllbnQgaWQ9Imxlc3NoYXQtZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9InJnYigwLDAsMCkiIHN0b3Atb3BhY2l0eT0iMCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIxIi8+PC9saW5lYXJHcmFkaWVudD48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2xlc3NoYXQtZ2VuZXJhdGVkKSIgLz48L3N2Zz4=);background-image:-webkit-linear-gradient(top,transparent 0%,#000000 100%);background-image:-moz-linear-gradient(top,transparent 0%,#000000 100%);background-image:-o-linear-gradient(top,transparent 0%,#000000 100%);background-image:linear-gradient(to bottom,transparent 0%,#000000 100%)}.rc-color-picker-panel-board-saturation{border-radius:2px;position:absolute;width:100%;height:100%;left:0;top:0;z-index:1;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB2aWV3Qm94PSIwIDAgMSAxIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIj48bGluZWFyR3JhZGllbnQgaWQ9Imxlc3NoYXQtZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0icmdiKDAsMCwwKSIgc3RvcC1vcGFjaXR5PSIwIi8+PC9saW5lYXJHcmFkaWVudD48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2xlc3NoYXQtZ2VuZXJhdGVkKSIgLz48L3N2Zz4=);background-image:-webkit-linear-gradient(left,#ffffff 0%,transparent 100%);background-image:-moz-linear-gradient(left,#ffffff 0%,transparent 100%);background-image:-o-linear-gradient(left,#ffffff 0%,transparent 100%);background-image:linear-gradient(to right,#ffffff 0%,transparent 100%)}.rc-color-picker-panel-board-handler{box-shadow:0 0 2px gray inset;border-radius:2px;cursor:crosshair;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:3}.rc-color-picker-panel-ribbon{position:relative;height:100%;border-radius:2px;box-shadow:0 0 2px gray inset;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB2aWV3Qm94PSIwIDAgMSAxIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIj48bGluZWFyR3JhZGllbnQgaWQ9Imxlc3NoYXQtZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiNmZjAwMDAiIHN0b3Atb3BhY2l0eT0iMSIvPjxzdG9wIG9mZnNldD0iMTAlIiBzdG9wLWNvbG9yPSIjZmY5OTAwIiBzdG9wLW9wYWNpdHk9IjEiLz48c3RvcCBvZmZzZXQ9IjIwJSIgc3RvcC1jb2xvcj0iI2NkZmYwMCIgc3RvcC1vcGFjaXR5PSIxIi8+PHN0b3Agb2Zmc2V0PSIzMCUiIHN0b3AtY29sb3I9IiMzNWZmMDAiIHN0b3Atb3BhY2l0eT0iMSIvPjxzdG9wIG9mZnNldD0iNDAlIiBzdG9wLWNvbG9yPSIjMDBmZjY2IiBzdG9wLW9wYWNpdHk9IjEiLz48c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iIzAwZmZmZCIgc3RvcC1vcGFjaXR5PSIxIi8+PHN0b3Agb2Zmc2V0PSI2MCUiIHN0b3AtY29sb3I9IiMwMDY2ZmYiIHN0b3Atb3BhY2l0eT0iMSIvPjxzdG9wIG9mZnNldD0iNzAlIiBzdG9wLWNvbG9yPSIjMzIwMGZmIiBzdG9wLW9wYWNpdHk9IjEiLz48c3RvcCBvZmZzZXQ9IjgwJSIgc3RvcC1jb2xvcj0iI2NkMDBmZiIgc3RvcC1vcGFjaXR5PSIxIi8+PHN0b3Agb2Zmc2V0PSI5MCUiIHN0b3AtY29sb3I9IiNmZjAwOTkiIHN0b3Atb3BhY2l0eT0iMSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ZmMDAwMCIgc3RvcC1vcGFjaXR5PSIxIi8+PC9saW5lYXJHcmFkaWVudD48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2xlc3NoYXQtZ2VuZXJhdGVkKSIgLz48L3N2Zz4=);background-image:-webkit-linear-gradient(left,#ff0000 0%,#ff9900 10%,#cdff00 20%,#35ff00 30%,#00ff66 40%,#00fffd 50%,#0066ff 60%,#3200ff 70%,#cd00ff 80%,#ff0099 90%,#ff0000 100%);background-image:-moz-linear-gradient(left,#ff0000 0%,#ff9900 10%,#cdff00 20%,#35ff00 30%,#00ff66 40%,#00fffd 50%,#0066ff 60%,#3200ff 70%,#cd00ff 80%,#ff0099 90%,#ff0000 100%);background-image:-o-linear-gradient(left,#ff0000 0%,#ff9900 10%,#cdff00 20%,#35ff00 30%,#00ff66 40%,#00fffd 50%,#0066ff 60%,#3200ff 70%,#cd00ff 80%,#ff0099 90%,#ff0000 100%);background-image:linear-gradient(to right,#ff0000 0%,#ff9900 10%,#cdff00 20%,#35ff00 30%,#00ff66 40%,#00fffd 50%,#0066ff 60%,#3200ff 70%,#cd00ff 80%,#ff0099 90%,#ff0000 100%)}.rc-color-picker-panel-ribbon span{position:absolute;top:0;height:100%;width:4px;border:1px solid #000000;padding:1px 0;margin-left:-2px;background-color:#fff;border-radius:3px}.rc-color-picker-panel-ribbon-handler{position:absolute;width:104%;height:100%;left:-2%;cursor:pointer}.rc-color-picker-panel-alpha{position:relative;height:100%;width:100%;border-radius:2px;background-image:url(data:image/png;base64,R0lGODdhCgAKAPAAAOXl5f///ywAAAAACgAKAEACEIQdqXt9GxyETrI279OIgwIAOw==);background-repeat:repeat;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.rc-color-picker-panel-alpha-bg{position:absolute;width:100%;height:100%;border-radius:2px;box-shadow:0 0 2px gray inset}.rc-color-picker-panel-alpha span{position:absolute;top:0;height:100%;width:4px;border:1px solid #000000;padding:1px 0;margin-left:-2px;background-color:#fff;border-radius:3px}.rc-color-picker-panel-alpha-handler{position:absolute;width:104%;height:100%;left:-2%;cursor:pointer}.rc-color-picker-panel-params{font-size:12px}.rc-color-picker-panel-params-input{overflow:hidden;padding:2px 8px}.rc-color-picker-panel-params input{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;text-align:center;padding:1px;margin:0;float:left;border-radius:2px;border:1px solid #CACACA;font-family:Helvetica Neue,Helvetica,sans-serif}.rc-color-picker-panel-params-hex{width:52px}.rc-color-picker-panel-params input[type=number]{margin-left:5px;width:44px}.rc-color-picker-panel-params input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none}.rc-color-picker-panel-params-lable{padding:2px 8px;height:22px;line-height:18px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.rc-color-picker-panel-params-lable label{float:left;text-align:center}.rc-color-picker-panel-params-lable-hex{width:52px}.rc-color-picker-panel-params-lable-number,.rc-color-picker-panel-params-lable-alpha{margin-left:5px;width:44px;text-transform:uppercase}.rc-color-picker-panel-params-lable-number:hover{border-radius:2px;background-color:#eee;box-shadow:0 0 0 1px #ccc inset;cursor:pointer}.rc-color-picker-panel-params-has-alpha input[type=number],.rc-color-picker-panel-params-has-alpha .rc-color-picker-panel-params-lable-number,.rc-color-picker-panel-params-has-alpha .rc-color-picker-panel-params-lable-alpha{width:32px}.rc-color-picker{position:absolute;left:-9999px;top:-9999px;z-index:1000}.rc-color-picker-wrap{display:inline-block}.rc-color-picker-slide-up-enter,.rc-color-picker-slide-up-appear{animation-duration:.3s;animation-fill-mode:both;transform-origin:0 0;display:block!important;opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-play-state:paused}.rc-color-picker-slide-up-leave{animation-duration:.3s;animation-fill-mode:both;transform-origin:0 0;display:block!important;opacity:1;animation-timing-function:cubic-bezier(.6,.04,.98,.34);animation-play-state:paused}.rc-color-picker-slide-up-enter.rc-color-picker-slide-up-enter-active.rc-color-picker-placement-bottomLeft,.rc-color-picker-slide-up-enter.rc-color-picker-slide-up-enter-active.rc-color-picker-placement-bottomRight,.rc-color-picker-slide-up-appear.rc-color-picker-slide-up-appear-active.rc-color-picker-placement-bottomLeft,.rc-color-picker-slide-up-appear.rc-color-picker-slide-up-appear-active.rc-color-picker-placement-bottomRight{animation-name:rcColorPickerSlideUpIn;animation-play-state:running}.rc-color-picker-slide-up-enter.rc-color-picker-slide-up-enter-active.rc-color-picker-placement-topLeft,.rc-color-picker-slide-up-enter.rc-color-picker-slide-up-enter-active.rc-color-picker-placement-topRight,.rc-color-picker-slide-up-appear.rc-color-picker-slide-up-appear-active.rc-color-picker-placement-topLeft,.rc-color-picker-slide-up-appear.rc-color-picker-slide-up-appear-active.rc-color-picker-placement-topRight{animation-name:rcColorPickerSlideDownIn;animation-play-state:running}.rc-color-picker-slide-up-leave.rc-color-picker-slide-up-leave-active.rc-color-picker-placement-bottomLeft,.rc-color-picker-slide-up-leave.rc-color-picker-slide-up-leave-active.rc-color-picker-placement-bottomRight{animation-name:rcColorPickerSlideUpOut;animation-play-state:running}.rc-color-picker-slide-up-leave.rc-color-picker-slide-up-leave-active.rc-color-picker-placement-topLeft,.rc-color-picker-slide-up-leave.rc-color-picker-slide-up-leave-active.rc-color-picker-placement-topRight{animation-name:rcColorPickerSlideDownOut;animation-play-state:running}@keyframes rcColorPickerSlideUpIn{0%{opacity:0;transform-origin:0% 0%;transform:scaleY(0)}to{opacity:1;transform-origin:0% 0%;transform:scaleY(1)}}@keyframes rcColorPickerSlideUpOut{0%{opacity:1;transform-origin:0% 0%;transform:scaleY(1)}to{opacity:0;transform-origin:0% 0%;transform:scaleY(0)}}@keyframes rcColorPickerSlideDownIn{0%{opacity:0;transform-origin:100% 100%;transform:scaleY(0)}to{opacity:1;transform-origin:100% 100%;transform:scaleY(1)}}@keyframes rcColorPickerSlideDownOut{0%{opacity:1;transform-origin:100% 100%;transform:scaleY(1)}to{opacity:0;transform-origin:100% 100%;transform:scaleY(0)}}.fr-color-picker{width:100%;display:flex;flex-direction:row;align-items:center;color:#666}.fr-color-picker .rc-color-picker-trigger{margin-right:12px;height:32px;width:60px;border:1px solid #e5e5e5}.fr-color-picker>p{margin:0;font-size:14px;line-height:28px}.fr-color-picker .rc-color-picker-wrap{display:flex}.ant-picker-input>input::placeholder{color:#bfbfbf;user-select:none}.ant-picker-range-arrow:before{position:absolute;top:-11.3137085px;left:-11.3137085px;width:33.9411255px;height:33.9411255px;background:#fff;background-repeat:no-repeat;background-position:-10px -10px;content:"";clip-path:inset(33% 33%);clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z")}.ant-picker-footer{width:min-content;min-width:100%;line-height:38px;text-align:center;border-bottom:1px solid transparent}.ant-popover{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:absolute;top:0;left:0;z-index:1030;font-weight:400;white-space:normal;text-align:left;cursor:auto;user-select:text}.ant-popover-arrow-content:before{position:absolute;top:-11.3137085px;left:-11.3137085px;width:33.9411255px;height:33.9411255px;background:var(--antd-arrow-background-color);background-repeat:no-repeat;background-position:-10px -10px;content:"";clip-path:inset(33% 33%);clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z")}.fr-preview-image{width:160px}.fr-preview{position:relative;cursor:pointer}.ant-slider-mark-text{position:absolute;display:inline-block;color:#00000073;text-align:center;word-break:keep-all;cursor:pointer;user-select:none}.fr-slider{display:flex;width:100%;align-items:center}.ant-upload-list-picture-card .ant-upload-list-item-thumbnail,.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img{position:static;display:block;width:100%;height:100%;object-fit:contain}.fr-upload-mod,.fr-upload-file{display:flex}.fr-upload-mod{align-items:center}.fr-upload-mod .fr-upload-preview{margin:0 12px}.fr-upload-file .ant-upload-list-item{margin:5px 0 0 8px}.fr-upload-file .ant-upload-list-item-name{margin-right:6px}.fr-upload-file .ant-upload-list-item-info{cursor:pointer}.fr-upload-file .next-upload-list-text .next-upload-list-item-done,.fr-upload-file .next-upload-list-text .next-upload-list-item .next-icon{height:28px;line-height:28px;margin-left:12px}.fr-upload-file .next-upload-list-item-name-wrap{margin-top:-4px}.ant-image-img-placeholder{background-color:#f5f5f5;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTQuNSAyLjVoLTEzQS41LjUgMCAwIDAgMSAzdjEwYS41LjUgMCAwIDAgLjUuNWgxM2EuNS41IDAgMCAwIC41LS41VjNhLjUuNSAwIDAgMC0uNS0uNXpNNS4yODEgNC43NWExIDEgMCAwIDEgMCAyIDEgMSAwIDAgMSAwLTJ6bTguMDMgNi44M2EuMTI3LjEyNyAwIDAgMS0uMDgxLjAzSDIuNzY5YS4xMjUuMTI1IDAgMCAxLS4wOTYtLjIwN2wyLjY2MS0zLjE1NmEuMTI2LjEyNiAwIDAgMSAuMTc3LS4wMTZsLjAxNi4wMTZMNy4wOCAxMC4wOWwyLjQ3LTIuOTNhLjEyNi4xMjYgMCAwIDEgLjE3Ny0uMDE2bC4wMTUuMDE2IDMuNTg4IDQuMjQ0YS4xMjcuMTI3IDAgMCAxLS4wMi4xNzV6IiBmaWxsPSIjOEM4QzhDIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L3N2Zz4=);background-repeat:no-repeat;background-position:center center;background-size:30%}.ant-image-mask-info .anticon{margin-inline-end:4px}.ant-image-preview.ant-zoom-enter,.ant-image-preview.ant-zoom-appear{transform:none;opacity:0;animation-duration:.3s;user-select:none}.ant-image-preview-img{max-width:100%;max-height:100%;vertical-align:middle;transform:scaleZ(1);cursor:grab;transition:transform .3s cubic-bezier(.215,.61,.355,1) 0s;user-select:none;pointer-events:auto}.ant-card-loading .ant-card-body{user-select:none}.fr-panel-bordered{border-radius:4px;border:1px solid #f4f4f4;padding:52px 24px 0;margin-bottom:24px}.fr-obj-card{border-radius:4px;border-color:#f4f4f4;margin-bottom:24px!important}.fr-obj-card .ant-card-head{border:none}.fr-obj-card .ant-card-body{padding:12px 24px!important}.fr-obj-card .fr-header-desc{word-break:break-all;color:#00000073;margin-left:6px;font-weight:400}.fr-obj-collapse{border-radius:4px;border:1px solid #f1f1f1;margin-bottom:24px}.fr-obj-collapse .collapse-title{height:24px;color:#000000e0;font-weight:600;font-size:16px;line-height:24px}.fr-obj-collapse .fr-header-desc{word-break:break-all;color:#00000073;margin-left:6px;font-weight:400}.fr-obj-collapse .header-item-label{height:14px;margin-left:30px;color:#000;font-weight:600;font-size:14px;line-height:14px}.fr-obj-collapse .header-item-label span{color:#141414}.fr-obj-collapse .expand-icon-desc{margin-left:4px}.fr-obj-collapse .ant-collapse-header{display:flex;align-items:center!important;padding:16px!important;background-color:#fff;border-radius:4px!important}.fr-obj-collapse .ant-collapse-header-text{display:flex;align-items:center}.fr-obj-collapse .tag-no-data{color:#000000a6}.fr-obj-collapse .ant-collapse-content-box{padding:12px 24px!important}.fr-obj-collapse .ant-collapse-content-box .ant-skeleton-title,.fr-obj-collapse .ant-collapse-content-box .ant-skeleton-paragraph>li{animation:none!important}.fr-obj-subinline-label-hidden>.ant-form-item-row>.ant-form-item-label{visibility:hidden}.fr-obj-subinline-background>.ant-form-item-row>.ant-form-item-control{background-color:#f6f6f6;padding:24px 24px 0;border-radius:4px}.fr-obj-subinline .ant-form-item-row{flex-wrap:nowrap}.fr-obj-line-title .fr-obj-header{line-height:36px;border-bottom:1px solid #e9e9e9}.fr-obj-line-title .fr-header-title{color:#000000e0;font-size:16px;font-weight:600}.fr-obj-line-title .fr-header-desc{word-break:break-all;color:#00000073;margin-left:6px;font-weight:400}.fr-obj-line-title .fr-obj-content{padding:24px 0 0}.fr-list-simple{display:inline-block}.fr-list-simple .fr-inline-field{min-width:220px;margin-bottom:24px!important}.fr-list-simple .fr-list-item{display:flex;align-items:flex-start;position:relative}.fr-list-simple .fr-list-item-operate{height:32px;gap:0!important}.fr-list-simple-background{padding:24px 24px 0;background-color:#f6f6f6;border-radius:4px}.fr-list-simple-background .add-btn{margin-bottom:24px}.fr-list-simple-column .fr-list-item{align-items:center}.fr-list-card{margin-bottom:24px}.fr-list-card .fr-list-item{display:flex;align-items:flex-start;position:relative}.fr-list-card .fr-list-item-operate{padding:0 20px;height:32px;gap:0!important}.fr-list-card .fr-list-item-operate-fixed{position:absolute;right:8px}.fr-list-card .fr-list-add-btn{padding:0 8px}.ant-table.ant-table-middle .ant-table-selection-column{padding-inline-start:2px}.ant-table.ant-table-small .ant-table-selection-column{padding-inline-start:2px}.ant-table-selection-extra{position:absolute;top:0;z-index:1;cursor:pointer;transition:all .3s;margin-inline-start:100%;padding-inline-start:4px}.ant-table-row-expand-icon{color:#1890ff;outline:none;cursor:pointer;transition:color .3s;position:relative;float:left;box-sizing:border-box;width:17px;height:17px;padding:0;color:inherit;line-height:17px;background:#fff;border:1px solid #f0f0f0;border-radius:2px;transform:scale(.94117647);transition:all .3s;user-select:none}.ant-dropdown-arrow:before{position:absolute;top:-11.3137085px;left:-11.3137085px;width:33.9411255px;height:33.9411255px;background:#fff;background-repeat:no-repeat;background-position:-10px -10px;content:"";clip-path:inset(33% 33%);clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z")}.ant-pagination-item{display:inline-block;min-width:32px;height:32px;margin-right:8px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:30px;text-align:center;vertical-align:middle;list-style:none;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;outline:0;cursor:pointer;user-select:none}.ant-pagination-prev button,.ant-pagination-next button{color:#000000d9;cursor:pointer;user-select:none}.ant-pagination-options-quick-jumper input::placeholder{color:#bfbfbf;user-select:none}.ant-spin-blur{clear:both;opacity:.5;user-select:none;pointer-events:none}.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper{border-radius:0;user-select:none}.ant-tree-indent{align-self:stretch;white-space:nowrap;user-select:none}.ant-tree-switcher{position:relative;flex:none;align-self:stretch;width:24px;margin:0;line-height:24px;text-align:center;cursor:pointer;user-select:none}.ant-tree-node-content-wrapper{line-height:24px;user-select:none}.fr-table-list{margin-bottom:24px}.fr-table-list .ant-form-item{margin-bottom:0}.fr-table-list .ant-form-item-label,.fr-table-list .ant-form-item-explain-error{display:none}.fr-table-list .fr-list-item-operate{gap:0!important}.fr-table-list-no-popover .ant-table-tbody .ant-table-cell{padding:24px 8px 0!important}.fr-table-list-no-popover .ant-form-item{margin-bottom:24px}.fr-table-list-no-popover .ant-form-item-explain-error{display:block;font-size:10px}.fr-list-drawer{margin-bottom:24px}.fr-list-drawer-table-header{width:100%;display:flex;justify-content:right;align-items:center;margin-bottom:10px}.fr-list-drawer .ant-form-item{margin-bottom:0}.fr-list-drawer .fr-list-item-operate{gap:0!important}.fr-virtual-list{margin-bottom:12px}.fr-virtual-list .ant-form-item{margin-bottom:0}.fr-virtual-list .ant-form-item-label,.fr-virtual-list .ant-form-item-explain-error{display:none}.fr-virtual-list .fr-list-item-operate{gap:0!important}.fr-popover-error .ant-popover-inner-content{color:#ff4d4f!important}.fr-virtual-list-no-popover .ant-table-tbody .ant-table-cell{padding:24px 8px 0!important}.fr-virtual-list-no-popover .ant-form-item{margin-bottom:24px}.fr-virtual-list-no-popover .ant-form-item-explain-error{display:block;font-size:10px}.fr-void-title{height:24px;color:#000000e0;font-weight:600;font-size:16px;line-height:24px}.fr-search{width:100%;background:#fff;padding:24px 24px 0 0;margin-bottom:16px;box-sizing:border-box;overflow:hidden;position:relative}.fr-search .search-action-col{flex:1;display:flex;justify-content:flex-end;align-items:baseline;height:56px}.fr-search .search-action-fixed{position:absolute;right:0;bottom:0;background-color:#fff;padding-right:24px!important}.fr-search .search-action-column{height:auto}.fr-search .search-action-column-fixed{height:86px;padding-top:30px}.fr-search .fr-form>.ant-row{align-items:center}.fr-column-search{padding-left:24px}[class^=ant-]::-ms-clear,[class*=ant-]::-ms-clear,[class^=ant-] input::-ms-clear,[class*=ant-] input::-ms-clear,[class^=ant-] input::-ms-reveal,[class*=ant-] input::-ms-reveal{display:none}html,body{width:100%;height:100%}input::-ms-clear,input::-ms-reveal{display:none}*,*:before,*:after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}@-ms-viewport{width:device-width}body{margin:0;color:#000000d9;font-size:14px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-variant:tabular-nums;line-height:1.5715;background-color:#fff;font-feature-settings:"tnum"}[tabindex="-1"]:focus{outline:none!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5em;color:#000000d9;font-weight:500}p{margin-top:0;margin-bottom:1em}abbr[title],abbr[data-original-title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;border-bottom:0;cursor:help}address{margin-bottom:1em;font-style:normal;line-height:inherit}input[type=text],input[type=password],input[type=number],textarea{-webkit-appearance:none}ol,ul,dl{margin-top:0;margin-bottom:1em}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:500}dd{margin-bottom:.5em;margin-left:0}blockquote{margin:0 0 1em}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#1890ff;text-decoration:none;background-color:transparent;outline:none;cursor:pointer;transition:color .3s;-webkit-text-decoration-skip:objects}a:hover{color:#40a9ff}a:active{color:#096dd9}a:active,a:hover{text-decoration:none;outline:0}a:focus{text-decoration:none;outline:0}a[disabled]{color:#00000040;cursor:not-allowed}pre,code,kbd,samp{font-size:1em;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace}pre{margin-top:0;margin-bottom:1em;overflow:auto}figure{margin:0 0 1em}img{vertical-align:middle;border-style:none}a,area,button,[role=button],input:not([type="range"]),label,select,summary,textarea{touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75em;padding-bottom:.3em;color:#00000073;text-align:left;caption-side:bottom}input,button,select,optgroup,textarea{margin:0;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{padding:0;border-style:none}input[type=radio],input[type=checkbox]{box-sizing:border-box;padding:0}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;margin:0;padding:0;border:0}legend{display:block;width:100%;max-width:100%;margin-bottom:.5em;padding:0;color:inherit;font-size:1.5em;line-height:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}mark{padding:.2em;background-color:#feffe6}::-moz-selection{color:#fff;background:#1890ff}::selection{color:#fff;background:#1890ff}.clearfix:before{display:table;content:""}.clearfix:after{display:table;clear:both;content:""}.anticon{display:inline-block;color:inherit;font-style:normal;line-height:0;text-align:center;text-transform:none;vertical-align:-.125em;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.anticon>*{line-height:1}.anticon svg{display:inline-block}.anticon:before{display:none}.anticon .anticon-icon{display:block}.anticon>.anticon{line-height:0;vertical-align:0}.anticon[tabindex]{cursor:pointer}.anticon-spin,.anticon-spin:before{display:inline-block;animation:loadingCircle 1s infinite linear}.ant-fade-enter,.ant-fade-appear,.ant-fade-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-fade-enter.ant-fade-enter-active,.ant-fade-appear.ant-fade-appear-active{animation-name:antFadeIn;animation-play-state:running}.ant-fade-leave.ant-fade-leave-active{animation-name:antFadeOut;animation-play-state:running;pointer-events:none}.ant-fade-enter,.ant-fade-appear{opacity:0;animation-timing-function:linear}.ant-fade-leave{animation-timing-function:linear}@keyframes antFadeIn{0%{opacity:0}to{opacity:1}}@keyframes antFadeOut{0%{opacity:1}to{opacity:0}}.ant-move-up-enter,.ant-move-up-appear,.ant-move-up-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-move-up-enter.ant-move-up-enter-active,.ant-move-up-appear.ant-move-up-appear-active{animation-name:antMoveUpIn;animation-play-state:running}.ant-move-up-leave.ant-move-up-leave-active{animation-name:antMoveUpOut;animation-play-state:running;pointer-events:none}.ant-move-up-enter,.ant-move-up-appear{opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-move-up-leave{animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.ant-move-down-enter,.ant-move-down-appear,.ant-move-down-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-move-down-enter.ant-move-down-enter-active,.ant-move-down-appear.ant-move-down-appear-active{animation-name:antMoveDownIn;animation-play-state:running}.ant-move-down-leave.ant-move-down-leave-active{animation-name:antMoveDownOut;animation-play-state:running;pointer-events:none}.ant-move-down-enter,.ant-move-down-appear{opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-move-down-leave{animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.ant-move-left-enter,.ant-move-left-appear,.ant-move-left-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-move-left-enter.ant-move-left-enter-active,.ant-move-left-appear.ant-move-left-appear-active{animation-name:antMoveLeftIn;animation-play-state:running}.ant-move-left-leave.ant-move-left-leave-active{animation-name:antMoveLeftOut;animation-play-state:running;pointer-events:none}.ant-move-left-enter,.ant-move-left-appear{opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-move-left-leave{animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.ant-move-right-enter,.ant-move-right-appear,.ant-move-right-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-move-right-enter.ant-move-right-enter-active,.ant-move-right-appear.ant-move-right-appear-active{animation-name:antMoveRightIn;animation-play-state:running}.ant-move-right-leave.ant-move-right-leave-active{animation-name:antMoveRightOut;animation-play-state:running;pointer-events:none}.ant-move-right-enter,.ant-move-right-appear{opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-move-right-leave{animation-timing-function:cubic-bezier(.6,.04,.98,.34)}@keyframes antMoveDownIn{0%{transform:translateY(100%);transform-origin:0 0;opacity:0}to{transform:translateY(0);transform-origin:0 0;opacity:1}}@keyframes antMoveDownOut{0%{transform:translateY(0);transform-origin:0 0;opacity:1}to{transform:translateY(100%);transform-origin:0 0;opacity:0}}@keyframes antMoveLeftIn{0%{transform:translate(-100%);transform-origin:0 0;opacity:0}to{transform:translate(0);transform-origin:0 0;opacity:1}}@keyframes antMoveLeftOut{0%{transform:translate(0);transform-origin:0 0;opacity:1}to{transform:translate(-100%);transform-origin:0 0;opacity:0}}@keyframes antMoveRightIn{0%{transform:translate(100%);transform-origin:0 0;opacity:0}to{transform:translate(0);transform-origin:0 0;opacity:1}}@keyframes antMoveRightOut{0%{transform:translate(0);transform-origin:0 0;opacity:1}to{transform:translate(100%);transform-origin:0 0;opacity:0}}@keyframes antMoveUpIn{0%{transform:translateY(-100%);transform-origin:0 0;opacity:0}to{transform:translateY(0);transform-origin:0 0;opacity:1}}@keyframes antMoveUpOut{0%{transform:translateY(0);transform-origin:0 0;opacity:1}to{transform:translateY(-100%);transform-origin:0 0;opacity:0}}@keyframes loadingCircle{to{transform:rotate(360deg)}}[ant-click-animating=true],[ant-click-animating-without-extra-node=true]{position:relative}html{--antd-wave-shadow-color: #1890ff;--scroll-bar: 0}[ant-click-animating-without-extra-node=true]:after,.ant-click-animating-node{position:absolute;inset:0;display:block;border-radius:inherit;box-shadow:0 0 #1890ff;box-shadow:0 0 0 0 var(--antd-wave-shadow-color);opacity:.2;animation:fadeEffect 2s cubic-bezier(.08,.82,.17,1),waveEffect .4s cubic-bezier(.08,.82,.17,1);animation-fill-mode:forwards;content:"";pointer-events:none}@keyframes waveEffect{to{box-shadow:0 0 #1890ff;box-shadow:0 0 0 6px var(--antd-wave-shadow-color)}}@keyframes fadeEffect{to{opacity:0}}.ant-slide-up-enter,.ant-slide-up-appear,.ant-slide-up-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-slide-up-enter.ant-slide-up-enter-active,.ant-slide-up-appear.ant-slide-up-appear-active{animation-name:antSlideUpIn;animation-play-state:running}.ant-slide-up-leave.ant-slide-up-leave-active{animation-name:antSlideUpOut;animation-play-state:running;pointer-events:none}.ant-slide-up-enter,.ant-slide-up-appear{opacity:0;animation-timing-function:cubic-bezier(.23,1,.32,1)}.ant-slide-up-leave{animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.ant-slide-down-enter,.ant-slide-down-appear,.ant-slide-down-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-slide-down-enter.ant-slide-down-enter-active,.ant-slide-down-appear.ant-slide-down-appear-active{animation-name:antSlideDownIn;animation-play-state:running}.ant-slide-down-leave.ant-slide-down-leave-active{animation-name:antSlideDownOut;animation-play-state:running;pointer-events:none}.ant-slide-down-enter,.ant-slide-down-appear{opacity:0;animation-timing-function:cubic-bezier(.23,1,.32,1)}.ant-slide-down-leave{animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.ant-slide-left-enter,.ant-slide-left-appear,.ant-slide-left-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-slide-left-enter.ant-slide-left-enter-active,.ant-slide-left-appear.ant-slide-left-appear-active{animation-name:antSlideLeftIn;animation-play-state:running}.ant-slide-left-leave.ant-slide-left-leave-active{animation-name:antSlideLeftOut;animation-play-state:running;pointer-events:none}.ant-slide-left-enter,.ant-slide-left-appear{opacity:0;animation-timing-function:cubic-bezier(.23,1,.32,1)}.ant-slide-left-leave{animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.ant-slide-right-enter,.ant-slide-right-appear,.ant-slide-right-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-slide-right-enter.ant-slide-right-enter-active,.ant-slide-right-appear.ant-slide-right-appear-active{animation-name:antSlideRightIn;animation-play-state:running}.ant-slide-right-leave.ant-slide-right-leave-active{animation-name:antSlideRightOut;animation-play-state:running;pointer-events:none}.ant-slide-right-enter,.ant-slide-right-appear{opacity:0;animation-timing-function:cubic-bezier(.23,1,.32,1)}.ant-slide-right-leave{animation-timing-function:cubic-bezier(.755,.05,.855,.06)}@keyframes antSlideUpIn{0%{transform:scaleY(.8);transform-origin:0% 0%;opacity:0}to{transform:scaleY(1);transform-origin:0% 0%;opacity:1}}@keyframes antSlideUpOut{0%{transform:scaleY(1);transform-origin:0% 0%;opacity:1}to{transform:scaleY(.8);transform-origin:0% 0%;opacity:0}}@keyframes antSlideDownIn{0%{transform:scaleY(.8);transform-origin:100% 100%;opacity:0}to{transform:scaleY(1);transform-origin:100% 100%;opacity:1}}@keyframes antSlideDownOut{0%{transform:scaleY(1);transform-origin:100% 100%;opacity:1}to{transform:scaleY(.8);transform-origin:100% 100%;opacity:0}}@keyframes antSlideLeftIn{0%{transform:scaleX(.8);transform-origin:0% 0%;opacity:0}to{transform:scaleX(1);transform-origin:0% 0%;opacity:1}}@keyframes antSlideLeftOut{0%{transform:scaleX(1);transform-origin:0% 0%;opacity:1}to{transform:scaleX(.8);transform-origin:0% 0%;opacity:0}}@keyframes antSlideRightIn{0%{transform:scaleX(.8);transform-origin:100% 0%;opacity:0}to{transform:scaleX(1);transform-origin:100% 0%;opacity:1}}@keyframes antSlideRightOut{0%{transform:scaleX(1);transform-origin:100% 0%;opacity:1}to{transform:scaleX(.8);transform-origin:100% 0%;opacity:0}}.ant-zoom-enter,.ant-zoom-appear,.ant-zoom-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-enter.ant-zoom-enter-active,.ant-zoom-appear.ant-zoom-appear-active{animation-name:antZoomIn;animation-play-state:running}.ant-zoom-leave.ant-zoom-leave-active{animation-name:antZoomOut;animation-play-state:running;pointer-events:none}.ant-zoom-enter,.ant-zoom-appear{transform:scale(0);opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-zoom-enter-prepare,.ant-zoom-appear-prepare{transform:none}.ant-zoom-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-big-enter,.ant-zoom-big-appear,.ant-zoom-big-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-big-enter.ant-zoom-big-enter-active,.ant-zoom-big-appear.ant-zoom-big-appear-active{animation-name:antZoomBigIn;animation-play-state:running}.ant-zoom-big-leave.ant-zoom-big-leave-active{animation-name:antZoomBigOut;animation-play-state:running;pointer-events:none}.ant-zoom-big-enter,.ant-zoom-big-appear{transform:scale(0);opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-zoom-big-enter-prepare,.ant-zoom-big-appear-prepare{transform:none}.ant-zoom-big-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-big-fast-enter,.ant-zoom-big-fast-appear,.ant-zoom-big-fast-leave{animation-duration:.1s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-big-fast-enter.ant-zoom-big-fast-enter-active,.ant-zoom-big-fast-appear.ant-zoom-big-fast-appear-active{animation-name:antZoomBigIn;animation-play-state:running}.ant-zoom-big-fast-leave.ant-zoom-big-fast-leave-active{animation-name:antZoomBigOut;animation-play-state:running;pointer-events:none}.ant-zoom-big-fast-enter,.ant-zoom-big-fast-appear{transform:scale(0);opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-zoom-big-fast-enter-prepare,.ant-zoom-big-fast-appear-prepare{transform:none}.ant-zoom-big-fast-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-up-enter,.ant-zoom-up-appear,.ant-zoom-up-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-up-enter.ant-zoom-up-enter-active,.ant-zoom-up-appear.ant-zoom-up-appear-active{animation-name:antZoomUpIn;animation-play-state:running}.ant-zoom-up-leave.ant-zoom-up-leave-active{animation-name:antZoomUpOut;animation-play-state:running;pointer-events:none}.ant-zoom-up-enter,.ant-zoom-up-appear{transform:scale(0);opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-zoom-up-enter-prepare,.ant-zoom-up-appear-prepare{transform:none}.ant-zoom-up-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-down-enter,.ant-zoom-down-appear,.ant-zoom-down-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-down-enter.ant-zoom-down-enter-active,.ant-zoom-down-appear.ant-zoom-down-appear-active{animation-name:antZoomDownIn;animation-play-state:running}.ant-zoom-down-leave.ant-zoom-down-leave-active{animation-name:antZoomDownOut;animation-play-state:running;pointer-events:none}.ant-zoom-down-enter,.ant-zoom-down-appear{transform:scale(0);opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-zoom-down-enter-prepare,.ant-zoom-down-appear-prepare{transform:none}.ant-zoom-down-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-left-enter,.ant-zoom-left-appear,.ant-zoom-left-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-left-enter.ant-zoom-left-enter-active,.ant-zoom-left-appear.ant-zoom-left-appear-active{animation-name:antZoomLeftIn;animation-play-state:running}.ant-zoom-left-leave.ant-zoom-left-leave-active{animation-name:antZoomLeftOut;animation-play-state:running;pointer-events:none}.ant-zoom-left-enter,.ant-zoom-left-appear{transform:scale(0);opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-zoom-left-enter-prepare,.ant-zoom-left-appear-prepare{transform:none}.ant-zoom-left-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-right-enter,.ant-zoom-right-appear,.ant-zoom-right-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-right-enter.ant-zoom-right-enter-active,.ant-zoom-right-appear.ant-zoom-right-appear-active{animation-name:antZoomRightIn;animation-play-state:running}.ant-zoom-right-leave.ant-zoom-right-leave-active{animation-name:antZoomRightOut;animation-play-state:running;pointer-events:none}.ant-zoom-right-enter,.ant-zoom-right-appear{transform:scale(0);opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-zoom-right-enter-prepare,.ant-zoom-right-appear-prepare{transform:none}.ant-zoom-right-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}@keyframes antZoomIn{0%{transform:scale(.2);opacity:0}to{transform:scale(1);opacity:1}}@keyframes antZoomOut{0%{transform:scale(1)}to{transform:scale(.2);opacity:0}}@keyframes antZoomBigIn{0%{transform:scale(.8);opacity:0}to{transform:scale(1);opacity:1}}@keyframes antZoomBigOut{0%{transform:scale(1)}to{transform:scale(.8);opacity:0}}@keyframes antZoomUpIn{0%{transform:scale(.8);transform-origin:50% 0%;opacity:0}to{transform:scale(1);transform-origin:50% 0%}}@keyframes antZoomUpOut{0%{transform:scale(1);transform-origin:50% 0%}to{transform:scale(.8);transform-origin:50% 0%;opacity:0}}@keyframes antZoomLeftIn{0%{transform:scale(.8);transform-origin:0% 50%;opacity:0}to{transform:scale(1);transform-origin:0% 50%}}@keyframes antZoomLeftOut{0%{transform:scale(1);transform-origin:0% 50%}to{transform:scale(.8);transform-origin:0% 50%;opacity:0}}@keyframes antZoomRightIn{0%{transform:scale(.8);transform-origin:100% 50%;opacity:0}to{transform:scale(1);transform-origin:100% 50%}}@keyframes antZoomRightOut{0%{transform:scale(1);transform-origin:100% 50%}to{transform:scale(.8);transform-origin:100% 50%;opacity:0}}@keyframes antZoomDownIn{0%{transform:scale(.8);transform-origin:50% 100%;opacity:0}to{transform:scale(1);transform-origin:50% 100%}}@keyframes antZoomDownOut{0%{transform:scale(1);transform-origin:50% 100%}to{transform:scale(.8);transform-origin:50% 100%;opacity:0}}.ant-motion-collapse-legacy{overflow:hidden}.ant-motion-collapse-legacy-active{transition:height .2s cubic-bezier(.645,.045,.355,1),opacity .2s cubic-bezier(.645,.045,.355,1)!important}.ant-motion-collapse{overflow:hidden;transition:height .2s cubic-bezier(.645,.045,.355,1),opacity .2s cubic-bezier(.645,.045,.355,1)!important}.ant-affix{position:fixed;z-index:10}.ant-alert{box-sizing:border-box;margin:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;display:flex;align-items:center;padding:8px 15px;word-wrap:break-word;border-radius:2px}.ant-alert-content{flex:1;min-width:0}.ant-alert-icon{margin-right:8px}.ant-alert-description{display:none;font-size:14px;line-height:22px}.ant-alert-success{background-color:#f6ffed;border:1px solid #b7eb8f}.ant-alert-success .ant-alert-icon{color:#52c41a}.ant-alert-info{background-color:#e6f7ff;border:1px solid #91d5ff}.ant-alert-info .ant-alert-icon{color:#1890ff}.ant-alert-warning{background-color:#fffbe6;border:1px solid #ffe58f}.ant-alert-warning .ant-alert-icon{color:#faad14}.ant-alert-error{background-color:#fff2f0;border:1px solid #ffccc7}.ant-alert-error .ant-alert-icon{color:#ff4d4f}.ant-alert-error .ant-alert-description>pre{margin:0;padding:0}.ant-alert-action{margin-left:8px}.ant-alert-close-icon{margin-left:8px;padding:0;overflow:hidden;font-size:12px;line-height:12px;background-color:transparent;border:none;outline:none;cursor:pointer}.ant-alert-close-icon .anticon-close{color:#00000073;transition:color .3s}.ant-alert-close-icon .anticon-close:hover{color:#000000bf}.ant-alert-close-text{color:#00000073;transition:color .3s}.ant-alert-close-text:hover{color:#000000bf}.ant-alert-with-description{align-items:flex-start;padding:15px 15px 15px 24px}.ant-alert-with-description.ant-alert-no-icon{padding:15px}.ant-alert-with-description .ant-alert-icon{margin-right:15px;font-size:24px}.ant-alert-with-description .ant-alert-message{display:block;margin-bottom:4px;color:#000000d9;font-size:16px}.ant-alert-message{color:#000000d9}.ant-alert-with-description .ant-alert-description{display:block}.ant-alert.ant-alert-motion-leave{overflow:hidden;opacity:1;transition:max-height .3s cubic-bezier(.78,.14,.15,.86),opacity .3s cubic-bezier(.78,.14,.15,.86),padding-top .3s cubic-bezier(.78,.14,.15,.86),padding-bottom .3s cubic-bezier(.78,.14,.15,.86),margin-bottom .3s cubic-bezier(.78,.14,.15,.86)}.ant-alert.ant-alert-motion-leave-active{max-height:0;margin-bottom:0!important;padding-top:0;padding-bottom:0;opacity:0}.ant-alert-banner{margin-bottom:0;border:0;border-radius:0}.ant-alert.ant-alert-rtl{direction:rtl}.ant-alert-rtl .ant-alert-icon{margin-right:auto;margin-left:8px}.ant-alert-rtl .ant-alert-action,.ant-alert-rtl .ant-alert-close-icon{margin-right:8px;margin-left:auto}.ant-alert-rtl.ant-alert-with-description{padding-right:24px;padding-left:15px}.ant-alert-rtl.ant-alert-with-description .ant-alert-icon{margin-right:auto;margin-left:15px}.ant-anchor{box-sizing:border-box;margin:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;padding:0 0 0 2px}.ant-anchor-wrapper{margin-left:-4px;padding-left:4px;overflow:auto;background-color:transparent}.ant-anchor-ink{position:absolute;top:0;left:0;height:100%}.ant-anchor-ink:before{position:relative;display:block;width:2px;height:100%;margin:0 auto;background-color:#f0f0f0;content:" "}.ant-anchor-ink-ball{position:absolute;left:50%;display:none;width:8px;height:8px;background-color:#fff;border:2px solid #1890ff;border-radius:8px;transform:translate(-50%);transition:top .3s ease-in-out}.ant-anchor-ink-ball.ant-anchor-ink-ball-visible{display:inline-block}.ant-anchor-fixed .ant-anchor-ink .ant-anchor-ink-ball{display:none}.ant-anchor-link{padding:4px 0 4px 16px}.ant-anchor-link-title{position:relative;display:block;margin-bottom:3px;overflow:hidden;color:#000000d9;white-space:nowrap;text-overflow:ellipsis;transition:all .3s}.ant-anchor-link-title:only-child{margin-bottom:0}.ant-anchor-link-active>.ant-anchor-link-title{color:#1890ff}.ant-anchor-link .ant-anchor-link{padding-top:2px;padding-bottom:2px}.ant-anchor-rtl{direction:rtl}.ant-anchor-rtl.ant-anchor-wrapper{margin-right:-4px;margin-left:0;padding-right:4px;padding-left:0}.ant-anchor-rtl .ant-anchor-ink{right:0;left:auto}.ant-anchor-rtl .ant-anchor-ink-ball{right:50%;left:0;transform:translate(50%)}.ant-anchor-rtl .ant-anchor-link{padding:4px 16px 4px 0}.ant-select-auto-complete{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum"}.ant-select-auto-complete .ant-select-clear{right:13px}.ant-select-single .ant-select-selector{display:flex}.ant-select-single .ant-select-selector .ant-select-selection-search{position:absolute;inset:0 11px}.ant-select-single .ant-select-selector .ant-select-selection-search-input{width:100%}.ant-select-single .ant-select-selector .ant-select-selection-item,.ant-select-single .ant-select-selector .ant-select-selection-placeholder{padding:0;line-height:30px;transition:all .3s}.ant-select-single .ant-select-selector .ant-select-selection-item{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-select-single .ant-select-selector .ant-select-selection-placeholder{transition:none;pointer-events:none}.ant-select-single .ant-select-selector:after,.ant-select-single .ant-select-selector .ant-select-selection-item:after,.ant-select-single .ant-select-selector .ant-select-selection-placeholder:after{display:inline-block;width:0;visibility:hidden;content:"\\a0"}.ant-select-single.ant-select-show-arrow .ant-select-selection-search{right:25px}.ant-select-single.ant-select-show-arrow .ant-select-selection-item,.ant-select-single.ant-select-show-arrow .ant-select-selection-placeholder{padding-right:18px}.ant-select-single.ant-select-open .ant-select-selection-item{color:#bfbfbf}.ant-select-single:not(.ant-select-customize-input) .ant-select-selector{width:100%;height:32px;padding:0 11px}.ant-select-single:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input{height:30px}.ant-select-single:not(.ant-select-customize-input) .ant-select-selector:after{line-height:30px}.ant-select-single.ant-select-customize-input .ant-select-selector:after{display:none}.ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-search{position:static;width:100%}.ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-placeholder{position:absolute;right:0;left:0;padding:0 11px}.ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-placeholder:after{display:none}.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector{height:40px}.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector:after,.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-item,.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-placeholder{line-height:38px}.ant-select-single.ant-select-lg:not(.ant-select-customize-input):not(.ant-select-customize-input) .ant-select-selection-search-input{height:38px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector{height:24px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector:after,.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-item,.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-placeholder{line-height:22px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input):not(.ant-select-customize-input) .ant-select-selection-search-input{height:22px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selection-search{right:7px;left:7px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector{padding:0 7px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-search{right:28px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-item,.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-placeholder{padding-right:21px}.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector{padding:0 11px}.ant-select-selection-overflow{position:relative;display:flex;flex:auto;flex-wrap:wrap;max-width:100%}.ant-select-selection-overflow-item{flex:none;align-self:center;max-width:100%}.ant-select-multiple .ant-select-selector{display:flex;flex-wrap:wrap;align-items:center;padding:1px 4px}.ant-select-show-search.ant-select-multiple .ant-select-selector{cursor:text}.ant-select-disabled.ant-select-multiple .ant-select-selector{background:#f5f5f5;cursor:not-allowed}.ant-select-multiple .ant-select-selector:after{display:inline-block;width:0;margin:2px 0;line-height:24px;content:"\\a0"}.ant-select-multiple.ant-select-show-arrow .ant-select-selector,.ant-select-multiple.ant-select-allow-clear .ant-select-selector{padding-right:24px}.ant-select-multiple .ant-select-selection-item{position:relative;display:flex;flex:none;box-sizing:border-box;max-width:100%;height:24px;margin-top:2px;margin-bottom:2px;line-height:22px;background:#f5f5f5;border:1px solid #f0f0f0;border-radius:2px;cursor:default;transition:font-size .3s,line-height .3s,height .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-margin-end:4px;margin-inline-end:4px;-webkit-padding-start:8px;padding-inline-start:8px;-webkit-padding-end:4px;padding-inline-end:4px}.ant-select-disabled.ant-select-multiple .ant-select-selection-item{color:#bfbfbf;border-color:#d9d9d9;cursor:not-allowed}.ant-select-multiple .ant-select-selection-item-content{display:inline-block;margin-right:4px;overflow:hidden;white-space:pre;text-overflow:ellipsis}.ant-select-multiple .ant-select-selection-item-remove{color:inherit;font-style:normal;line-height:0;text-align:center;text-transform:none;vertical-align:-.125em;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;color:#00000073;font-weight:700;font-size:10px;line-height:inherit;cursor:pointer}.ant-select-multiple .ant-select-selection-item-remove>*{line-height:1}.ant-select-multiple .ant-select-selection-item-remove svg{display:inline-block}.ant-select-multiple .ant-select-selection-item-remove:before{display:none}.ant-select-multiple .ant-select-selection-item-remove .ant-select-multiple .ant-select-selection-item-remove-icon{display:block}.ant-select-multiple .ant-select-selection-item-remove>.anticon{vertical-align:middle}.ant-select-multiple .ant-select-selection-item-remove:hover{color:#000000bf}.ant-select-multiple .ant-select-selection-overflow-item+.ant-select-selection-overflow-item .ant-select-selection-search{-webkit-margin-start:0;margin-inline-start:0}.ant-select-multiple .ant-select-selection-search{position:relative;max-width:100%;-webkit-margin-start:7px;margin-inline-start:7px}.ant-select-multiple .ant-select-selection-search-input,.ant-select-multiple .ant-select-selection-search-mirror{height:24px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:24px;transition:all .3s}.ant-select-multiple .ant-select-selection-search-input{width:100%;min-width:4.1px}.ant-select-multiple .ant-select-selection-search-mirror{position:absolute;top:0;left:0;z-index:999;white-space:pre;visibility:hidden}.ant-select-multiple .ant-select-selection-placeholder{position:absolute;top:50%;right:11px;left:11px;transform:translateY(-50%);transition:all .3s}.ant-select-multiple.ant-select-lg .ant-select-selector:after{line-height:32px}.ant-select-multiple.ant-select-lg .ant-select-selection-item{height:32px;line-height:30px}.ant-select-multiple.ant-select-lg .ant-select-selection-search{height:32px;line-height:32px}.ant-select-multiple.ant-select-lg .ant-select-selection-search-input,.ant-select-multiple.ant-select-lg .ant-select-selection-search-mirror{height:32px;line-height:30px}.ant-select-multiple.ant-select-sm .ant-select-selector:after{line-height:16px}.ant-select-multiple.ant-select-sm .ant-select-selection-item{height:16px;line-height:14px}.ant-select-multiple.ant-select-sm .ant-select-selection-search{height:16px;line-height:16px}.ant-select-multiple.ant-select-sm .ant-select-selection-search-input,.ant-select-multiple.ant-select-sm .ant-select-selection-search-mirror{height:16px;line-height:14px}.ant-select-multiple.ant-select-sm .ant-select-selection-placeholder{left:7px}.ant-select-multiple.ant-select-sm .ant-select-selection-search{-webkit-margin-start:3px;margin-inline-start:3px}.ant-select-multiple.ant-select-lg .ant-select-selection-item{height:32px;line-height:32px}.ant-select-disabled .ant-select-selection-item-remove{display:none}.ant-select-status-error.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer) .ant-select-selector{background-color:#fff;border-color:#ff4d4f!important}.ant-select-status-error.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer).ant-select-open .ant-select-selector,.ant-select-status-error.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer).ant-select-focused .ant-select-selector{border-color:#ff7875;box-shadow:0 0 0 2px #ff4d4f33;border-right-width:1px;outline:0}.ant-select-status-warning.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer) .ant-select-selector{background-color:#fff;border-color:#faad14!important}.ant-select-status-warning.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer).ant-select-open .ant-select-selector,.ant-select-status-warning.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer).ant-select-focused .ant-select-selector{border-color:#ffc53d;box-shadow:0 0 0 2px #faad1433;border-right-width:1px;outline:0}.ant-select-status-error.ant-select-has-feedback .ant-select-clear,.ant-select-status-warning.ant-select-has-feedback .ant-select-clear,.ant-select-status-success.ant-select-has-feedback .ant-select-clear,.ant-select-status-validating.ant-select-has-feedback .ant-select-clear{right:32px}.ant-select-status-error.ant-select-has-feedback .ant-select-selection-selected-value,.ant-select-status-warning.ant-select-has-feedback .ant-select-selection-selected-value,.ant-select-status-success.ant-select-has-feedback .ant-select-selection-selected-value,.ant-select-status-validating.ant-select-has-feedback .ant-select-selection-selected-value{padding-right:42px}.ant-select{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;display:inline-block;cursor:pointer}.ant-select:not(.ant-select-customize-input) .ant-select-selector{position:relative;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-select:not(.ant-select-customize-input) .ant-select-selector input{cursor:pointer}.ant-select-show-search.ant-select:not(.ant-select-customize-input) .ant-select-selector{cursor:text}.ant-select-show-search.ant-select:not(.ant-select-customize-input) .ant-select-selector input{cursor:auto}.ant-select-focused:not(.ant-select-disabled).ant-select:not(.ant-select-customize-input) .ant-select-selector{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector{color:#00000040;background:#f5f5f5;cursor:not-allowed}.ant-select-multiple.ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector{background:#f5f5f5}.ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector input{cursor:not-allowed}.ant-select:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input{margin:0;padding:0;background:transparent;border:none;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.ant-select:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input::-webkit-search-cancel-button{display:none;-webkit-appearance:none}.ant-select:not(.ant-select-disabled):hover .ant-select-selector{border-color:#40a9ff;border-right-width:1px}.ant-select-selection-item{flex:1;overflow:hidden;font-weight:400;white-space:nowrap;text-overflow:ellipsis}@media all and (-ms-high-contrast: none){.ant-select-selection-item *::-ms-backdrop,.ant-select-selection-item{flex:auto}}.ant-select-selection-placeholder{flex:1;overflow:hidden;color:#bfbfbf;white-space:nowrap;text-overflow:ellipsis;pointer-events:none}@media all and (-ms-high-contrast: none){.ant-select-selection-placeholder *::-ms-backdrop,.ant-select-selection-placeholder{flex:auto}}.ant-select-arrow{display:inline-block;color:inherit;font-style:normal;line-height:0;text-transform:none;vertical-align:-.125em;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:absolute;top:50%;right:11px;display:flex;align-items:center;height:12px;margin-top:-6px;color:#00000040;font-size:12px;line-height:1;text-align:center;pointer-events:none}.ant-select-arrow>*{line-height:1}.ant-select-arrow svg{display:inline-block}.ant-select-arrow:before{display:none}.ant-select-arrow .ant-select-arrow-icon{display:block}.ant-select-arrow .anticon{vertical-align:top;transition:transform .3s}.ant-select-arrow .anticon>svg{vertical-align:top}.ant-select-arrow .anticon:not(.ant-select-suffix){pointer-events:auto}.ant-select-disabled .ant-select-arrow{cursor:not-allowed}.ant-select-arrow>*:not(:last-child){-webkit-margin-end:8px;margin-inline-end:8px}.ant-select-clear{position:absolute;top:50%;right:11px;z-index:1;display:inline-block;width:12px;height:12px;margin-top:-6px;color:#00000040;font-size:12px;font-style:normal;line-height:1;text-align:center;text-transform:none;background:#fff;cursor:pointer;opacity:0;transition:color .3s ease,opacity .15s ease;text-rendering:auto}.ant-select-clear:before{display:block}.ant-select-clear:hover{color:#00000073}.ant-select:hover .ant-select-clear{opacity:1}.ant-select-dropdown{margin:0;color:#000000d9;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:absolute;top:-9999px;left:-9999px;z-index:1050;box-sizing:border-box;padding:4px 0;overflow:hidden;font-size:14px;font-variant:initial;background-color:#fff;border-radius:2px;outline:none;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d}.ant-select-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-select-dropdown-placement-bottomLeft,.ant-select-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-select-dropdown-placement-bottomLeft{animation-name:antSlideUpIn}.ant-select-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-select-dropdown-placement-topLeft,.ant-select-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-select-dropdown-placement-topLeft{animation-name:antSlideDownIn}.ant-select-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-select-dropdown-placement-bottomLeft{animation-name:antSlideUpOut}.ant-select-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-select-dropdown-placement-topLeft{animation-name:antSlideDownOut}.ant-select-dropdown-hidden{display:none}.ant-select-dropdown-empty{color:#00000040}.ant-select-item-empty{position:relative;display:block;min-height:32px;padding:5px 12px;color:#000000d9;font-weight:400;font-size:14px;line-height:22px;color:#00000040}.ant-select-item{position:relative;display:block;min-height:32px;padding:5px 12px;color:#000000d9;font-weight:400;font-size:14px;line-height:22px;cursor:pointer;transition:background .3s ease}.ant-select-item-group{color:#00000073;font-size:12px;cursor:default}.ant-select-item-option{display:flex}.ant-select-item-option-content{flex:auto;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-select-item-option-state{flex:none}.ant-select-item-option-active:not(.ant-select-item-option-disabled){background-color:#f5f5f5}.ant-select-item-option-selected:not(.ant-select-item-option-disabled){color:#000000d9;font-weight:600;background-color:#e6f7ff}.ant-select-item-option-selected:not(.ant-select-item-option-disabled) .ant-select-item-option-state{color:#1890ff}.ant-select-item-option-disabled{color:#00000040;cursor:not-allowed}.ant-select-item-option-disabled.ant-select-item-option-selected{background-color:#f5f5f5}.ant-select-item-option-grouped{padding-left:24px}.ant-select-lg{font-size:16px}.ant-select-borderless .ant-select-selector{background-color:transparent!important;border-color:transparent!important;box-shadow:none!important}.ant-select.ant-select-in-form-item{width:100%}.ant-select-compact-item:not(.ant-select-compact-last-item){margin-right:-1px}.ant-select-compact-item:not(.ant-select-compact-last-item).ant-select-compact-item-rtl{margin-right:0;margin-left:-1px}.ant-select-compact-item:hover>*,.ant-select-compact-item:focus>*,.ant-select-compact-item:active>*{z-index:2}.ant-select-compact-item.ant-select-focused>*{z-index:2}.ant-select-compact-item[disabled]>*{z-index:0}.ant-select-compact-item:not(.ant-select-compact-first-item):not(.ant-select-compact-last-item).ant-select>.ant-select-selector{border-radius:0}.ant-select-compact-item.ant-select-compact-first-item.ant-select:not(.ant-select-compact-last-item):not(.ant-select-compact-item-rtl)>.ant-select-selector{border-top-right-radius:0;border-bottom-right-radius:0}.ant-select-compact-item.ant-select-compact-last-item.ant-select:not(.ant-select-compact-first-item):not(.ant-select-compact-item-rtl)>.ant-select-selector{border-top-left-radius:0;border-bottom-left-radius:0}.ant-select-compact-item.ant-select.ant-select-compact-first-item.ant-select-compact-item-rtl:not(.ant-select-compact-last-item)>.ant-select-selector{border-top-left-radius:0;border-bottom-left-radius:0}.ant-select-compact-item.ant-select.ant-select-compact-last-item.ant-select-compact-item-rtl:not(.ant-select-compact-first-item)>.ant-select-selector{border-top-right-radius:0;border-bottom-right-radius:0}.ant-select-rtl{direction:rtl}.ant-select-rtl .ant-select-arrow,.ant-select-rtl .ant-select-clear{right:initial;left:11px}.ant-select-dropdown-rtl{direction:rtl}.ant-select-dropdown-rtl .ant-select-item-option-grouped{padding-right:24px;padding-left:12px}.ant-select-rtl.ant-select-multiple.ant-select-show-arrow .ant-select-selector,.ant-select-rtl.ant-select-multiple.ant-select-allow-clear .ant-select-selector{padding-right:4px;padding-left:24px}.ant-select-rtl.ant-select-multiple .ant-select-selection-item{text-align:right}.ant-select-rtl.ant-select-multiple .ant-select-selection-item-content{margin-right:0;margin-left:4px;text-align:right}.ant-select-rtl.ant-select-multiple .ant-select-selection-search-mirror{right:0;left:auto}.ant-select-rtl.ant-select-multiple .ant-select-selection-placeholder{right:11px;left:auto}.ant-select-rtl.ant-select-multiple.ant-select-sm .ant-select-selection-placeholder{right:7px}.ant-select-rtl.ant-select-single .ant-select-selector .ant-select-selection-item,.ant-select-rtl.ant-select-single .ant-select-selector .ant-select-selection-placeholder{right:0;left:9px;text-align:right}.ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-search{right:11px;left:25px}.ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-item,.ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-placeholder{padding-right:0;padding-left:18px}.ant-select-rtl.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-search{right:6px}.ant-select-rtl.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-item,.ant-select-rtl.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-placeholder{padding-right:0;padding-left:21px}.ant-empty{margin:0 8px;font-size:14px;line-height:1.5715;text-align:center}.ant-empty-image{height:100px;margin-bottom:8px}.ant-empty-image img{height:100%}.ant-empty-image svg{height:100%;margin:auto}.ant-empty-footer{margin-top:16px}.ant-empty-normal{margin:32px 0;color:#00000040}.ant-empty-normal .ant-empty-image{height:40px}.ant-empty-small{margin:8px 0;color:#00000040}.ant-empty-small .ant-empty-image{height:35px}.ant-empty-img-default-ellipse{fill:#f5f5f5;fill-opacity:.8}.ant-empty-img-default-path-1{fill:#aeb8c2}.ant-empty-img-default-path-2{fill:url(#linearGradient-1)}.ant-empty-img-default-path-3{fill:#f5f5f7}.ant-empty-img-default-path-4,.ant-empty-img-default-path-5{fill:#dce0e6}.ant-empty-img-default-g{fill:#fff}.ant-empty-img-simple-ellipse{fill:#f5f5f5}.ant-empty-img-simple-g{stroke:#d9d9d9}.ant-empty-img-simple-path{fill:#fafafa}.ant-empty-rtl{direction:rtl}.ant-avatar{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;display:inline-block;overflow:hidden;color:#fff;white-space:nowrap;text-align:center;vertical-align:middle;background:#ccc;width:32px;height:32px;line-height:32px;border-radius:50%}.ant-avatar-image{background:transparent}.ant-avatar .ant-image-img{display:block}.ant-avatar-string{position:absolute;left:50%;transform-origin:0 center}.ant-avatar.ant-avatar-icon{font-size:18px}.ant-avatar.ant-avatar-icon>.anticon{margin:0}.ant-avatar-lg{width:40px;height:40px;line-height:40px;border-radius:50%}.ant-avatar-lg-string{position:absolute;left:50%;transform-origin:0 center}.ant-avatar-lg.ant-avatar-icon{font-size:24px}.ant-avatar-lg.ant-avatar-icon>.anticon{margin:0}.ant-avatar-sm{width:24px;height:24px;line-height:24px;border-radius:50%}.ant-avatar-sm-string{position:absolute;left:50%;transform-origin:0 center}.ant-avatar-sm.ant-avatar-icon{font-size:14px}.ant-avatar-sm.ant-avatar-icon>.anticon{margin:0}.ant-avatar-square{border-radius:2px}.ant-avatar>img{display:block;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.ant-avatar-group{display:inline-flex}.ant-avatar-group .ant-avatar{border:1px solid #fff}.ant-avatar-group .ant-avatar:not(:first-child){margin-left:-8px}.ant-avatar-group-popover .ant-avatar+.ant-avatar{margin-left:3px}.ant-avatar-group-rtl .ant-avatar:not(:first-child){margin-right:-8px;margin-left:0}.ant-avatar-group-popover.ant-popover-rtl .ant-avatar+.ant-avatar{margin-right:3px;margin-left:0}.ant-popover{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:absolute;top:0;left:0;z-index:1030;font-weight:400;white-space:normal;text-align:left;cursor:auto;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.ant-popover-content{position:relative}.ant-popover:after{position:absolute;background:rgba(255,255,255,.01);content:""}.ant-popover-hidden{display:none}.ant-popover-placement-top,.ant-popover-placement-topLeft,.ant-popover-placement-topRight{padding-bottom:15.3137085px}.ant-popover-placement-right,.ant-popover-placement-rightTop,.ant-popover-placement-rightBottom{padding-left:15.3137085px}.ant-popover-placement-bottom,.ant-popover-placement-bottomLeft,.ant-popover-placement-bottomRight{padding-top:15.3137085px}.ant-popover-placement-left,.ant-popover-placement-leftTop,.ant-popover-placement-leftBottom{padding-right:15.3137085px}.ant-popover-inner{background-color:#fff;background-clip:padding-box;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d}@media screen and (-ms-high-contrast: active),(-ms-high-contrast: none){.ant-popover-inner{box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d}}.ant-popover-title{min-width:177px;min-height:32px;margin:0;padding:5px 16px 4px;color:#000000d9;font-weight:500;border-bottom:1px solid #f0f0f0}.ant-popover-inner-content{padding:12px 16px;color:#000000d9}.ant-popover-message{display:flex;padding:4px 0 12px;color:#000000d9;font-size:14px}.ant-popover-message-icon{display:inline-block;margin-right:8px;color:#faad14;font-size:14px}.ant-popover-buttons{margin-bottom:4px;text-align:right}.ant-popover-buttons button:not(:first-child){margin-left:8px}.ant-popover-arrow{position:absolute;display:block;width:22px;height:22px;overflow:hidden;background:transparent;pointer-events:none}.ant-popover-arrow-content{--antd-arrow-background-color: #fff;position:absolute;inset:0;display:block;width:11.3137085px;height:11.3137085px;margin:auto;content:"";pointer-events:auto;border-radius:0 0 2px;pointer-events:none}.ant-popover-arrow-content:before{position:absolute;top:-11.3137085px;left:-11.3137085px;width:33.9411255px;height:33.9411255px;background:var(--antd-arrow-background-color);background-repeat:no-repeat;background-position:-10px -10px;content:"";-webkit-clip-path:inset(33% 33%);clip-path:inset(33% 33%);-webkit-clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z");clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z")}.ant-popover-placement-top .ant-popover-arrow,.ant-popover-placement-topLeft .ant-popover-arrow,.ant-popover-placement-topRight .ant-popover-arrow{bottom:0;transform:translateY(100%)}.ant-popover-placement-top .ant-popover-arrow-content,.ant-popover-placement-topLeft .ant-popover-arrow-content,.ant-popover-placement-topRight .ant-popover-arrow-content{box-shadow:3px 3px 7px #00000012;transform:translateY(-11px) rotate(45deg)}.ant-popover-placement-top .ant-popover-arrow{left:50%;transform:translateY(100%) translate(-50%)}.ant-popover-placement-topLeft .ant-popover-arrow{left:16px}.ant-popover-placement-topRight .ant-popover-arrow{right:16px}.ant-popover-placement-right .ant-popover-arrow,.ant-popover-placement-rightTop .ant-popover-arrow,.ant-popover-placement-rightBottom .ant-popover-arrow{left:0;transform:translate(-100%)}.ant-popover-placement-right .ant-popover-arrow-content,.ant-popover-placement-rightTop .ant-popover-arrow-content,.ant-popover-placement-rightBottom .ant-popover-arrow-content{box-shadow:3px 3px 7px #00000012;transform:translate(11px) rotate(135deg)}.ant-popover-placement-right .ant-popover-arrow{top:50%;transform:translate(-100%) translateY(-50%)}.ant-popover-placement-rightTop .ant-popover-arrow{top:12px}.ant-popover-placement-rightBottom .ant-popover-arrow{bottom:12px}.ant-popover-placement-bottom .ant-popover-arrow,.ant-popover-placement-bottomLeft .ant-popover-arrow,.ant-popover-placement-bottomRight .ant-popover-arrow{top:0;transform:translateY(-100%)}.ant-popover-placement-bottom .ant-popover-arrow-content,.ant-popover-placement-bottomLeft .ant-popover-arrow-content,.ant-popover-placement-bottomRight .ant-popover-arrow-content{box-shadow:2px 2px 5px #0000000f;transform:translateY(11px) rotate(-135deg)}.ant-popover-placement-bottom .ant-popover-arrow{left:50%;transform:translateY(-100%) translate(-50%)}.ant-popover-placement-bottomLeft .ant-popover-arrow{left:16px}.ant-popover-placement-bottomRight .ant-popover-arrow{right:16px}.ant-popover-placement-left .ant-popover-arrow,.ant-popover-placement-leftTop .ant-popover-arrow,.ant-popover-placement-leftBottom .ant-popover-arrow{right:0;transform:translate(100%)}.ant-popover-placement-left .ant-popover-arrow-content,.ant-popover-placement-leftTop .ant-popover-arrow-content,.ant-popover-placement-leftBottom .ant-popover-arrow-content{box-shadow:3px 3px 7px #00000012;transform:translate(-11px) rotate(-45deg)}.ant-popover-placement-left .ant-popover-arrow{top:50%;transform:translate(100%) translateY(-50%)}.ant-popover-placement-leftTop .ant-popover-arrow{top:12px}.ant-popover-placement-leftBottom .ant-popover-arrow{bottom:12px}.ant-popover-pink .ant-popover-inner,.ant-popover-pink .ant-popover-arrow-content,.ant-popover-magenta .ant-popover-inner,.ant-popover-magenta .ant-popover-arrow-content{background-color:#eb2f96}.ant-popover-red .ant-popover-inner,.ant-popover-red .ant-popover-arrow-content{background-color:#f5222d}.ant-popover-volcano .ant-popover-inner,.ant-popover-volcano .ant-popover-arrow-content{background-color:#fa541c}.ant-popover-orange .ant-popover-inner,.ant-popover-orange .ant-popover-arrow-content{background-color:#fa8c16}.ant-popover-yellow .ant-popover-inner,.ant-popover-yellow .ant-popover-arrow-content{background-color:#fadb14}.ant-popover-gold .ant-popover-inner,.ant-popover-gold .ant-popover-arrow-content{background-color:#faad14}.ant-popover-cyan .ant-popover-inner,.ant-popover-cyan .ant-popover-arrow-content{background-color:#13c2c2}.ant-popover-lime .ant-popover-inner,.ant-popover-lime .ant-popover-arrow-content{background-color:#a0d911}.ant-popover-green .ant-popover-inner,.ant-popover-green .ant-popover-arrow-content{background-color:#52c41a}.ant-popover-blue .ant-popover-inner,.ant-popover-blue .ant-popover-arrow-content{background-color:#1890ff}.ant-popover-geekblue .ant-popover-inner,.ant-popover-geekblue .ant-popover-arrow-content{background-color:#2f54eb}.ant-popover-purple .ant-popover-inner,.ant-popover-purple .ant-popover-arrow-content{background-color:#722ed1}.ant-popover-rtl{direction:rtl;text-align:right}.ant-popover-rtl .ant-popover-message-icon{margin-right:0;margin-left:8px}.ant-popover-rtl .ant-popover-message-title{padding-left:16px}.ant-popover-rtl .ant-popover-buttons{text-align:left}.ant-popover-rtl .ant-popover-buttons button{margin-right:8px;margin-left:0}.ant-back-top{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:fixed;right:100px;bottom:50px;z-index:10;width:40px;height:40px;cursor:pointer}.ant-back-top:empty{display:none}.ant-back-top-rtl{right:auto;left:100px;direction:rtl}.ant-back-top-content{width:40px;height:40px;overflow:hidden;color:#fff;text-align:center;background-color:#00000073;border-radius:20px;transition:all .3s}.ant-back-top-content:hover{background-color:#000000d9;transition:all .3s}.ant-back-top-icon{font-size:24px;line-height:40px}@media screen and (max-width: 768px){.ant-back-top{right:60px}.ant-back-top-rtl{right:auto;left:60px}}@media screen and (max-width: 480px){.ant-back-top{right:20px}.ant-back-top-rtl{right:auto;left:20px}}.ant-badge{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;display:inline-block;line-height:1}.ant-badge-count{z-index:auto;min-width:20px;height:20px;padding:0 6px;color:#fff;font-weight:400;font-size:12px;line-height:20px;white-space:nowrap;text-align:center;background:#ff4d4f;border-radius:10px;box-shadow:0 0 0 1px #fff}.ant-badge-count a,.ant-badge-count a:hover{color:#fff}.ant-badge-count-sm{min-width:14px;height:14px;padding:0;font-size:12px;line-height:14px;border-radius:7px}.ant-badge-multiple-words{padding:0 8px}.ant-badge-dot{z-index:auto;width:6px;min-width:6px;height:6px;background:#ff4d4f;border-radius:100%;box-shadow:0 0 0 1px #fff}.ant-badge-dot.ant-scroll-number{transition:background 1.5s}.ant-badge-count,.ant-badge-dot,.ant-badge .ant-scroll-number-custom-component{position:absolute;top:0;right:0;transform:translate(50%,-50%);transform-origin:100% 0%}.ant-badge-count.anticon-spin,.ant-badge-dot.anticon-spin,.ant-badge .ant-scroll-number-custom-component.anticon-spin{animation:antBadgeLoadingCircle 1s infinite linear}.ant-badge-status{line-height:inherit;vertical-align:baseline}.ant-badge-status-dot{position:relative;top:-1px;display:inline-block;width:6px;height:6px;vertical-align:middle;border-radius:50%}.ant-badge-status-success{background-color:#52c41a}.ant-badge-status-processing{position:relative;background-color:#1890ff}.ant-badge-status-processing:after{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid #1890ff;border-radius:50%;animation:antStatusProcessing 1.2s infinite ease-in-out;content:""}.ant-badge-status-default{background-color:#d9d9d9}.ant-badge-status-error{background-color:#ff4d4f}.ant-badge-status-warning{background-color:#faad14}.ant-badge-status-pink,.ant-badge-status-magenta{background:#eb2f96}.ant-badge-status-red{background:#f5222d}.ant-badge-status-volcano{background:#fa541c}.ant-badge-status-orange{background:#fa8c16}.ant-badge-status-yellow{background:#fadb14}.ant-badge-status-gold{background:#faad14}.ant-badge-status-cyan{background:#13c2c2}.ant-badge-status-lime{background:#a0d911}.ant-badge-status-green{background:#52c41a}.ant-badge-status-blue{background:#1890ff}.ant-badge-status-geekblue{background:#2f54eb}.ant-badge-status-purple{background:#722ed1}.ant-badge-status-text{margin-left:8px;color:#000000d9;font-size:14px}.ant-badge-zoom-appear,.ant-badge-zoom-enter{animation:antZoomBadgeIn .3s cubic-bezier(.12,.4,.29,1.46);animation-fill-mode:both}.ant-badge-zoom-leave{animation:antZoomBadgeOut .3s cubic-bezier(.71,-.46,.88,.6);animation-fill-mode:both}.ant-badge-not-a-wrapper .ant-badge-zoom-appear,.ant-badge-not-a-wrapper .ant-badge-zoom-enter{animation:antNoWrapperZoomBadgeIn .3s cubic-bezier(.12,.4,.29,1.46)}.ant-badge-not-a-wrapper .ant-badge-zoom-leave{animation:antNoWrapperZoomBadgeOut .3s cubic-bezier(.71,-.46,.88,.6)}.ant-badge-not-a-wrapper:not(.ant-badge-status){vertical-align:middle}.ant-badge-not-a-wrapper .ant-scroll-number-custom-component,.ant-badge-not-a-wrapper .ant-badge-count{transform:none}.ant-badge-not-a-wrapper .ant-scroll-number-custom-component,.ant-badge-not-a-wrapper .ant-scroll-number{position:relative;top:auto;display:block;transform-origin:50% 50%}@keyframes antStatusProcessing{0%{transform:scale(.8);opacity:.5}to{transform:scale(2.4);opacity:0}}.ant-scroll-number{overflow:hidden;direction:ltr}.ant-scroll-number-only{position:relative;display:inline-block;height:20px;transition:all .3s cubic-bezier(.645,.045,.355,1);-webkit-transform-style:preserve-3d;-webkit-backface-visibility:hidden}.ant-scroll-number-only>p.ant-scroll-number-only-unit{height:20px;margin:0;-webkit-transform-style:preserve-3d;-webkit-backface-visibility:hidden}.ant-scroll-number-symbol{vertical-align:top}@keyframes antZoomBadgeIn{0%{transform:scale(0) translate(50%,-50%);opacity:0}to{transform:scale(1) translate(50%,-50%)}}@keyframes antZoomBadgeOut{0%{transform:scale(1) translate(50%,-50%)}to{transform:scale(0) translate(50%,-50%);opacity:0}}@keyframes antNoWrapperZoomBadgeIn{0%{transform:scale(0);opacity:0}to{transform:scale(1)}}@keyframes antNoWrapperZoomBadgeOut{0%{transform:scale(1)}to{transform:scale(0);opacity:0}}@keyframes antBadgeLoadingCircle{0%{transform-origin:50%}to{transform:translate(50%,-50%) rotate(360deg);transform-origin:50%}}.ant-ribbon-wrapper{position:relative}.ant-ribbon{box-sizing:border-box;margin:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:absolute;top:8px;height:22px;padding:0 8px;color:#fff;line-height:22px;white-space:nowrap;background-color:#1890ff;border-radius:2px}.ant-ribbon-text{color:#fff}.ant-ribbon-corner{position:absolute;top:100%;width:8px;height:8px;color:currentcolor;border:4px solid;transform:scaleY(.75);transform-origin:top}.ant-ribbon-corner:after{position:absolute;top:-4px;left:-4px;width:inherit;height:inherit;color:#00000040;border:inherit;content:""}.ant-ribbon-color-pink,.ant-ribbon-color-magenta{color:#eb2f96;background:#eb2f96}.ant-ribbon-color-red{color:#f5222d;background:#f5222d}.ant-ribbon-color-volcano{color:#fa541c;background:#fa541c}.ant-ribbon-color-orange{color:#fa8c16;background:#fa8c16}.ant-ribbon-color-yellow{color:#fadb14;background:#fadb14}.ant-ribbon-color-gold{color:#faad14;background:#faad14}.ant-ribbon-color-cyan{color:#13c2c2;background:#13c2c2}.ant-ribbon-color-lime{color:#a0d911;background:#a0d911}.ant-ribbon-color-green{color:#52c41a;background:#52c41a}.ant-ribbon-color-blue{color:#1890ff;background:#1890ff}.ant-ribbon-color-geekblue{color:#2f54eb;background:#2f54eb}.ant-ribbon-color-purple{color:#722ed1;background:#722ed1}.ant-ribbon.ant-ribbon-placement-end{right:-8px;border-bottom-right-radius:0}.ant-ribbon.ant-ribbon-placement-end .ant-ribbon-corner{right:0;border-color:currentcolor transparent transparent currentcolor}.ant-ribbon.ant-ribbon-placement-start{left:-8px;border-bottom-left-radius:0}.ant-ribbon.ant-ribbon-placement-start .ant-ribbon-corner{left:0;border-color:currentcolor currentcolor transparent transparent}.ant-badge-rtl{direction:rtl}.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-badge-count,.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-badge-dot,.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-scroll-number-custom-component{right:auto;left:0;direction:ltr;transform:translate(-50%,-50%);transform-origin:0% 0%}.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-scroll-number-custom-component{right:auto;left:0;transform:translate(-50%,-50%);transform-origin:0% 0%}.ant-badge-rtl .ant-badge-status-text{margin-right:8px;margin-left:0}.ant-badge:not(.ant-badge-not-a-wrapper).ant-badge-rtl .ant-badge-zoom-appear,.ant-badge:not(.ant-badge-not-a-wrapper).ant-badge-rtl .ant-badge-zoom-enter{animation-name:antZoomBadgeInRtl}.ant-badge:not(.ant-badge-not-a-wrapper).ant-badge-rtl .ant-badge-zoom-leave{animation-name:antZoomBadgeOutRtl}.ant-ribbon-rtl{direction:rtl}.ant-ribbon-rtl.ant-ribbon-placement-end{right:unset;left:-8px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.ant-ribbon-rtl.ant-ribbon-placement-end .ant-ribbon-corner{right:unset;left:0;border-color:currentcolor currentcolor transparent transparent}.ant-ribbon-rtl.ant-ribbon-placement-end .ant-ribbon-corner:after{border-color:currentcolor currentcolor transparent transparent}.ant-ribbon-rtl.ant-ribbon-placement-start{right:-8px;left:unset;border-bottom-right-radius:0;border-bottom-left-radius:2px}.ant-ribbon-rtl.ant-ribbon-placement-start .ant-ribbon-corner{right:0;left:unset;border-color:currentcolor transparent transparent currentcolor}.ant-ribbon-rtl.ant-ribbon-placement-start .ant-ribbon-corner:after{border-color:currentcolor transparent transparent currentcolor}@keyframes antZoomBadgeInRtl{0%{transform:scale(0) translate(-50%,-50%);opacity:0}to{transform:scale(1) translate(-50%,-50%)}}@keyframes antZoomBadgeOutRtl{0%{transform:scale(1) translate(-50%,-50%)}to{transform:scale(0) translate(-50%,-50%);opacity:0}}.ant-breadcrumb{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";color:#00000073;font-size:14px}.ant-breadcrumb .anticon{font-size:14px}.ant-breadcrumb ol{display:flex;flex-wrap:wrap;margin:0;padding:0;list-style:none}.ant-breadcrumb a{color:#00000073;transition:color .3s}.ant-breadcrumb a:hover{color:#000000d9}.ant-breadcrumb li:last-child{color:#000000d9}.ant-breadcrumb li:last-child a{color:#000000d9}li:last-child>.ant-breadcrumb-separator{display:none}.ant-breadcrumb-separator{margin:0 8px;color:#00000073}.ant-breadcrumb-link>.anticon+span,.ant-breadcrumb-link>.anticon+a{margin-left:4px}.ant-breadcrumb-overlay-link>.anticon{margin-left:4px}.ant-breadcrumb-rtl{direction:rtl}.ant-breadcrumb-rtl:before{display:table;content:""}.ant-breadcrumb-rtl:after{display:table;clear:both;content:""}.ant-breadcrumb-rtl>span{float:right}.ant-breadcrumb-rtl .ant-breadcrumb-link>.anticon+span,.ant-breadcrumb-rtl .ant-breadcrumb-link>.anticon+a{margin-right:4px;margin-left:0}.ant-breadcrumb-rtl .ant-breadcrumb-overlay-link>.anticon{margin-right:4px;margin-left:0}.ant-dropdown-menu-item.ant-dropdown-menu-item-danger{color:#ff4d4f}.ant-dropdown-menu-item.ant-dropdown-menu-item-danger:hover{color:#fff;background-color:#ff4d4f}.ant-dropdown{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:absolute;top:-9999px;left:-9999px;z-index:1050;display:block}.ant-dropdown:before{position:absolute;inset:-4px 0 -4px -7px;z-index:-9999;opacity:.0001;content:" "}.ant-dropdown-wrap{position:relative}.ant-dropdown-wrap .ant-btn>.anticon-down{font-size:10px}.ant-dropdown-wrap .anticon-down:before{transition:transform .2s}.ant-dropdown-wrap-open .anticon-down:before{transform:rotate(180deg)}.ant-dropdown-hidden,.ant-dropdown-menu-hidden,.ant-dropdown-menu-submenu-hidden{display:none}.ant-dropdown-show-arrow.ant-dropdown-placement-topLeft,.ant-dropdown-show-arrow.ant-dropdown-placement-top,.ant-dropdown-show-arrow.ant-dropdown-placement-topRight{padding-bottom:15.3137085px}.ant-dropdown-show-arrow.ant-dropdown-placement-bottomLeft,.ant-dropdown-show-arrow.ant-dropdown-placement-bottom,.ant-dropdown-show-arrow.ant-dropdown-placement-bottomRight{padding-top:15.3137085px}.ant-dropdown-arrow{position:absolute;z-index:1;display:block;width:11.3137085px;height:11.3137085px;border-radius:0 0 2px;pointer-events:none}.ant-dropdown-arrow:before{position:absolute;top:-11.3137085px;left:-11.3137085px;width:33.9411255px;height:33.9411255px;background:#fff;background-repeat:no-repeat;background-position:-10px -10px;content:"";-webkit-clip-path:inset(33% 33%);clip-path:inset(33% 33%);-webkit-clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z");clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z")}.ant-dropdown-placement-top>.ant-dropdown-arrow,.ant-dropdown-placement-topLeft>.ant-dropdown-arrow,.ant-dropdown-placement-topRight>.ant-dropdown-arrow{bottom:10px;box-shadow:3px 3px 7px -3px #0000001a;transform:rotate(45deg)}.ant-dropdown-placement-top>.ant-dropdown-arrow{left:50%;transform:translate(-50%) rotate(45deg)}.ant-dropdown-placement-topLeft>.ant-dropdown-arrow{left:16px}.ant-dropdown-placement-topRight>.ant-dropdown-arrow{right:16px}.ant-dropdown-placement-bottom>.ant-dropdown-arrow,.ant-dropdown-placement-bottomLeft>.ant-dropdown-arrow,.ant-dropdown-placement-bottomRight>.ant-dropdown-arrow{top:9.41421356px;box-shadow:2px 2px 5px -2px #0000001a;transform:rotate(-135deg) translateY(-.5px)}.ant-dropdown-placement-bottom>.ant-dropdown-arrow{left:50%;transform:translate(-50%) rotate(-135deg) translateY(-.5px)}.ant-dropdown-placement-bottomLeft>.ant-dropdown-arrow{left:16px}.ant-dropdown-placement-bottomRight>.ant-dropdown-arrow{right:16px}.ant-dropdown-menu{position:relative;margin:0;padding:4px 0;text-align:left;list-style-type:none;background-color:#fff;background-clip:padding-box;border-radius:2px;outline:none;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d}.ant-dropdown-menu-item-group-title{padding:5px 12px;color:#00000073;transition:all .3s}.ant-dropdown-menu-submenu-popup{position:absolute;z-index:1050;background:transparent;box-shadow:none;transform-origin:0 0}.ant-dropdown-menu-submenu-popup ul,.ant-dropdown-menu-submenu-popup li{list-style:none}.ant-dropdown-menu-submenu-popup ul{margin-right:.3em;margin-left:.3em}.ant-dropdown-menu-item{position:relative;display:flex;align-items:center}.ant-dropdown-menu-item-icon{min-width:12px;margin-right:8px;font-size:12px}.ant-dropdown-menu-title-content{flex:auto}.ant-dropdown-menu-title-content>a{color:inherit;transition:all .3s}.ant-dropdown-menu-title-content>a:hover{color:inherit}.ant-dropdown-menu-title-content>a:after{position:absolute;inset:0;content:""}.ant-dropdown-menu-item,.ant-dropdown-menu-submenu-title{clear:both;margin:0;padding:5px 12px;color:#000000d9;font-weight:400;font-size:14px;line-height:22px;cursor:pointer;transition:all .3s}.ant-dropdown-menu-item-selected,.ant-dropdown-menu-submenu-title-selected{color:#1890ff;background-color:#e6f7ff}.ant-dropdown-menu-item:hover,.ant-dropdown-menu-submenu-title:hover,.ant-dropdown-menu-item.ant-dropdown-menu-item-active,.ant-dropdown-menu-item.ant-dropdown-menu-submenu-title-active,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-item-active,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-submenu-title-active{background-color:#f5f5f5}.ant-dropdown-menu-item.ant-dropdown-menu-item-disabled,.ant-dropdown-menu-item.ant-dropdown-menu-submenu-title-disabled,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-item-disabled,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-submenu-title-disabled{color:#00000040;cursor:not-allowed}.ant-dropdown-menu-item.ant-dropdown-menu-item-disabled:hover,.ant-dropdown-menu-item.ant-dropdown-menu-submenu-title-disabled:hover,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-item-disabled:hover,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-submenu-title-disabled:hover{color:#00000040;background-color:#fff;cursor:not-allowed}.ant-dropdown-menu-item.ant-dropdown-menu-item-disabled a,.ant-dropdown-menu-item.ant-dropdown-menu-submenu-title-disabled a,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-item-disabled a,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-submenu-title-disabled a{pointer-events:none}.ant-dropdown-menu-item-divider,.ant-dropdown-menu-submenu-title-divider{height:1px;margin:4px 0;overflow:hidden;line-height:0;background-color:#f0f0f0}.ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon,.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon{position:absolute;right:8px}.ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon,.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon{margin-right:0!important;color:#00000073;font-size:10px;font-style:normal}.ant-dropdown-menu-item-group-list{margin:0 8px;padding:0;list-style:none}.ant-dropdown-menu-submenu-title{padding-right:24px}.ant-dropdown-menu-submenu-vertical{position:relative}.ant-dropdown-menu-submenu-vertical>.ant-dropdown-menu{position:absolute;top:0;left:100%;min-width:100%;margin-left:4px;transform-origin:0 0}.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title,.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon{color:#00000040;background-color:#fff;cursor:not-allowed}.ant-dropdown-menu-submenu-selected .ant-dropdown-menu-submenu-title{color:#1890ff}.ant-dropdown.ant-slide-down-enter.ant-slide-down-enter-active.ant-dropdown-placement-bottomLeft,.ant-dropdown.ant-slide-down-appear.ant-slide-down-appear-active.ant-dropdown-placement-bottomLeft,.ant-dropdown.ant-slide-down-enter.ant-slide-down-enter-active.ant-dropdown-placement-bottom,.ant-dropdown.ant-slide-down-appear.ant-slide-down-appear-active.ant-dropdown-placement-bottom,.ant-dropdown.ant-slide-down-enter.ant-slide-down-enter-active.ant-dropdown-placement-bottomRight,.ant-dropdown.ant-slide-down-appear.ant-slide-down-appear-active.ant-dropdown-placement-bottomRight{animation-name:antSlideUpIn}.ant-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-dropdown-placement-topLeft,.ant-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-dropdown-placement-topLeft,.ant-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-dropdown-placement-top,.ant-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-dropdown-placement-top,.ant-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-dropdown-placement-topRight,.ant-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-dropdown-placement-topRight{animation-name:antSlideDownIn}.ant-dropdown.ant-slide-down-leave.ant-slide-down-leave-active.ant-dropdown-placement-bottomLeft,.ant-dropdown.ant-slide-down-leave.ant-slide-down-leave-active.ant-dropdown-placement-bottom,.ant-dropdown.ant-slide-down-leave.ant-slide-down-leave-active.ant-dropdown-placement-bottomRight{animation-name:antSlideUpOut}.ant-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-dropdown-placement-topLeft,.ant-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-dropdown-placement-top,.ant-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-dropdown-placement-topRight{animation-name:antSlideDownOut}.ant-dropdown-trigger>.anticon.anticon-down,.ant-dropdown-link>.anticon.anticon-down,.ant-dropdown-button>.anticon.anticon-down{font-size:10px;vertical-align:baseline}.ant-dropdown-button{white-space:nowrap}.ant-dropdown-button.ant-btn-group>.ant-btn-loading,.ant-dropdown-button.ant-btn-group>.ant-btn-loading+.ant-btn{cursor:default;pointer-events:none}.ant-dropdown-button.ant-btn-group>.ant-btn-loading+.ant-btn:before{display:block}.ant-dropdown-button.ant-btn-group>.ant-btn:last-child:not(:first-child):not(.ant-btn-icon-only){padding-right:8px;padding-left:8px}.ant-dropdown-menu-dark,.ant-dropdown-menu-dark .ant-dropdown-menu{background:#001529}.ant-dropdown-menu-dark .ant-dropdown-menu-item,.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title,.ant-dropdown-menu-dark .ant-dropdown-menu-item>a,.ant-dropdown-menu-dark .ant-dropdown-menu-item>.anticon+span>a{color:#ffffffa6}.ant-dropdown-menu-dark .ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow:after,.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow:after,.ant-dropdown-menu-dark .ant-dropdown-menu-item>a .ant-dropdown-menu-submenu-arrow:after,.ant-dropdown-menu-dark .ant-dropdown-menu-item>.anticon+span>a .ant-dropdown-menu-submenu-arrow:after{color:#ffffffa6}.ant-dropdown-menu-dark .ant-dropdown-menu-item:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-item>a:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-item>.anticon+span>a:hover{color:#fff;background:transparent}.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected,.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected>a{color:#fff;background:#1890ff}.ant-dropdown-rtl{direction:rtl}.ant-dropdown-rtl.ant-dropdown:before{right:-7px;left:0}.ant-dropdown-menu.ant-dropdown-menu-rtl,.ant-dropdown-rtl .ant-dropdown-menu-item-group-title,.ant-dropdown-menu-submenu-rtl .ant-dropdown-menu-item-group-title{direction:rtl;text-align:right}.ant-dropdown-menu-submenu-popup.ant-dropdown-menu-submenu-rtl{transform-origin:100% 0}.ant-dropdown-rtl .ant-dropdown-menu-submenu-popup ul,.ant-dropdown-rtl .ant-dropdown-menu-submenu-popup li,.ant-dropdown-rtl .ant-dropdown-menu-item,.ant-dropdown-rtl .ant-dropdown-menu-submenu-title{text-align:right}.ant-dropdown-rtl .ant-dropdown-menu-item>.anticon:first-child,.ant-dropdown-rtl .ant-dropdown-menu-submenu-title>.anticon:first-child,.ant-dropdown-rtl .ant-dropdown-menu-item>span>.anticon:first-child,.ant-dropdown-rtl .ant-dropdown-menu-submenu-title>span>.anticon:first-child{margin-right:0;margin-left:8px}.ant-dropdown-rtl .ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon,.ant-dropdown-rtl .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon{right:auto;left:8px}.ant-dropdown-rtl .ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon,.ant-dropdown-rtl .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon{margin-left:0!important;transform:scaleX(-1)}.ant-dropdown-rtl .ant-dropdown-menu-submenu-title{padding-right:12px;padding-left:24px}.ant-dropdown-rtl .ant-dropdown-menu-submenu-vertical>.ant-dropdown-menu{right:100%;left:0;margin-right:4px;margin-left:0}.ant-btn{line-height:1.5715;position:relative;display:inline-block;font-weight:400;white-space:nowrap;text-align:center;background-image:none;border:1px solid transparent;box-shadow:0 2px #00000004;cursor:pointer;transition:all .3s cubic-bezier(.645,.045,.355,1);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;touch-action:manipulation;height:32px;padding:4px 15px;font-size:14px;border-radius:2px;color:#000000d9;border-color:#d9d9d9;background:#fff}.ant-btn>.anticon{line-height:1}.ant-btn,.ant-btn:active,.ant-btn:focus{outline:0}.ant-btn:not([disabled]):hover{text-decoration:none}.ant-btn:not([disabled]):active{outline:0;box-shadow:none}.ant-btn[disabled]{cursor:not-allowed}.ant-btn[disabled]>*{pointer-events:none}.ant-btn-lg{height:40px;padding:6.4px 15px;font-size:16px;border-radius:2px}.ant-btn-sm{height:24px;padding:0 7px;font-size:14px;border-radius:2px}.ant-btn>a:only-child{color:currentcolor}.ant-btn>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn:hover,.ant-btn:focus{color:#40a9ff;border-color:#40a9ff;background:#fff}.ant-btn:hover>a:only-child,.ant-btn:focus>a:only-child{color:currentcolor}.ant-btn:hover>a:only-child:after,.ant-btn:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn:active{color:#096dd9;border-color:#096dd9;background:#fff}.ant-btn:active>a:only-child{color:currentcolor}.ant-btn:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn[disabled],.ant-btn[disabled]:hover,.ant-btn[disabled]:focus,.ant-btn[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn[disabled]>a:only-child,.ant-btn[disabled]:hover>a:only-child,.ant-btn[disabled]:focus>a:only-child,.ant-btn[disabled]:active>a:only-child{color:currentcolor}.ant-btn[disabled]>a:only-child:after,.ant-btn[disabled]:hover>a:only-child:after,.ant-btn[disabled]:focus>a:only-child:after,.ant-btn[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn:hover,.ant-btn:focus,.ant-btn:active{text-decoration:none;background:#fff}.ant-btn>span{display:inline-block}.ant-btn-primary{color:#fff;border-color:#1890ff;background:#1890ff;text-shadow:0 -1px 0 rgba(0,0,0,.12);box-shadow:0 2px #0000000b}.ant-btn-primary>a:only-child{color:currentcolor}.ant-btn-primary>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-primary:hover,.ant-btn-primary:focus{color:#fff;border-color:#40a9ff;background:#40a9ff}.ant-btn-primary:hover>a:only-child,.ant-btn-primary:focus>a:only-child{color:currentcolor}.ant-btn-primary:hover>a:only-child:after,.ant-btn-primary:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-primary:active{color:#fff;border-color:#096dd9;background:#096dd9}.ant-btn-primary:active>a:only-child{color:currentcolor}.ant-btn-primary:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-primary[disabled],.ant-btn-primary[disabled]:hover,.ant-btn-primary[disabled]:focus,.ant-btn-primary[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-primary[disabled]>a:only-child,.ant-btn-primary[disabled]:hover>a:only-child,.ant-btn-primary[disabled]:focus>a:only-child,.ant-btn-primary[disabled]:active>a:only-child{color:currentcolor}.ant-btn-primary[disabled]>a:only-child:after,.ant-btn-primary[disabled]:hover>a:only-child:after,.ant-btn-primary[disabled]:focus>a:only-child:after,.ant-btn-primary[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child){border-right-color:#40a9ff;border-left-color:#40a9ff}.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child):disabled{border-color:#d9d9d9}.ant-btn-group .ant-btn-primary:first-child:not(:last-child){border-right-color:#40a9ff}.ant-btn-group .ant-btn-primary:first-child:not(:last-child)[disabled]{border-right-color:#d9d9d9}.ant-btn-group .ant-btn-primary:last-child:not(:first-child),.ant-btn-group .ant-btn-primary+.ant-btn-primary{border-left-color:#40a9ff}.ant-btn-group .ant-btn-primary:last-child:not(:first-child)[disabled],.ant-btn-group .ant-btn-primary+.ant-btn-primary[disabled]{border-left-color:#d9d9d9}.ant-btn-ghost{color:#000000d9;border-color:#d9d9d9;background:transparent}.ant-btn-ghost>a:only-child{color:currentcolor}.ant-btn-ghost>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-ghost:hover,.ant-btn-ghost:focus{color:#40a9ff;border-color:#40a9ff;background:transparent}.ant-btn-ghost:hover>a:only-child,.ant-btn-ghost:focus>a:only-child{color:currentcolor}.ant-btn-ghost:hover>a:only-child:after,.ant-btn-ghost:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-ghost:active{color:#096dd9;border-color:#096dd9;background:transparent}.ant-btn-ghost:active>a:only-child{color:currentcolor}.ant-btn-ghost:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-ghost[disabled],.ant-btn-ghost[disabled]:hover,.ant-btn-ghost[disabled]:focus,.ant-btn-ghost[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-ghost[disabled]>a:only-child,.ant-btn-ghost[disabled]:hover>a:only-child,.ant-btn-ghost[disabled]:focus>a:only-child,.ant-btn-ghost[disabled]:active>a:only-child{color:currentcolor}.ant-btn-ghost[disabled]>a:only-child:after,.ant-btn-ghost[disabled]:hover>a:only-child:after,.ant-btn-ghost[disabled]:focus>a:only-child:after,.ant-btn-ghost[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dashed{color:#000000d9;border-color:#d9d9d9;background:#fff;border-style:dashed}.ant-btn-dashed>a:only-child{color:currentcolor}.ant-btn-dashed>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dashed:hover,.ant-btn-dashed:focus{color:#40a9ff;border-color:#40a9ff;background:#fff}.ant-btn-dashed:hover>a:only-child,.ant-btn-dashed:focus>a:only-child{color:currentcolor}.ant-btn-dashed:hover>a:only-child:after,.ant-btn-dashed:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dashed:active{color:#096dd9;border-color:#096dd9;background:#fff}.ant-btn-dashed:active>a:only-child{color:currentcolor}.ant-btn-dashed:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dashed[disabled],.ant-btn-dashed[disabled]:hover,.ant-btn-dashed[disabled]:focus,.ant-btn-dashed[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-dashed[disabled]>a:only-child,.ant-btn-dashed[disabled]:hover>a:only-child,.ant-btn-dashed[disabled]:focus>a:only-child,.ant-btn-dashed[disabled]:active>a:only-child{color:currentcolor}.ant-btn-dashed[disabled]>a:only-child:after,.ant-btn-dashed[disabled]:hover>a:only-child:after,.ant-btn-dashed[disabled]:focus>a:only-child:after,.ant-btn-dashed[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-danger{color:#fff;border-color:#ff4d4f;background:#ff4d4f;text-shadow:0 -1px 0 rgba(0,0,0,.12);box-shadow:0 2px #0000000b}.ant-btn-danger>a:only-child{color:currentcolor}.ant-btn-danger>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-danger:hover,.ant-btn-danger:focus{color:#fff;border-color:#ff7875;background:#ff7875}.ant-btn-danger:hover>a:only-child,.ant-btn-danger:focus>a:only-child{color:currentcolor}.ant-btn-danger:hover>a:only-child:after,.ant-btn-danger:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-danger:active{color:#fff;border-color:#d9363e;background:#d9363e}.ant-btn-danger:active>a:only-child{color:currentcolor}.ant-btn-danger:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-danger[disabled],.ant-btn-danger[disabled]:hover,.ant-btn-danger[disabled]:focus,.ant-btn-danger[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-danger[disabled]>a:only-child,.ant-btn-danger[disabled]:hover>a:only-child,.ant-btn-danger[disabled]:focus>a:only-child,.ant-btn-danger[disabled]:active>a:only-child{color:currentcolor}.ant-btn-danger[disabled]>a:only-child:after,.ant-btn-danger[disabled]:hover>a:only-child:after,.ant-btn-danger[disabled]:focus>a:only-child:after,.ant-btn-danger[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-link{color:#1890ff;border-color:transparent;background:transparent;box-shadow:none}.ant-btn-link>a:only-child{color:currentcolor}.ant-btn-link>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-link:hover,.ant-btn-link:focus{color:#40a9ff;border-color:#40a9ff;background:transparent}.ant-btn-link:hover>a:only-child,.ant-btn-link:focus>a:only-child{color:currentcolor}.ant-btn-link:hover>a:only-child:after,.ant-btn-link:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-link:active{color:#096dd9;border-color:#096dd9;background:transparent}.ant-btn-link:active>a:only-child{color:currentcolor}.ant-btn-link:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-link[disabled],.ant-btn-link[disabled]:hover,.ant-btn-link[disabled]:focus,.ant-btn-link[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-link:hover{background:transparent}.ant-btn-link:hover,.ant-btn-link:focus,.ant-btn-link:active{border-color:transparent}.ant-btn-link[disabled],.ant-btn-link[disabled]:hover,.ant-btn-link[disabled]:focus,.ant-btn-link[disabled]:active{color:#00000040;border-color:transparent;background:transparent;text-shadow:none;box-shadow:none}.ant-btn-link[disabled]>a:only-child,.ant-btn-link[disabled]:hover>a:only-child,.ant-btn-link[disabled]:focus>a:only-child,.ant-btn-link[disabled]:active>a:only-child{color:currentcolor}.ant-btn-link[disabled]>a:only-child:after,.ant-btn-link[disabled]:hover>a:only-child:after,.ant-btn-link[disabled]:focus>a:only-child:after,.ant-btn-link[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-text{color:#000000d9;border-color:transparent;background:transparent;box-shadow:none}.ant-btn-text>a:only-child{color:currentcolor}.ant-btn-text>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-text:hover,.ant-btn-text:focus{color:#40a9ff;border-color:#40a9ff;background:transparent}.ant-btn-text:hover>a:only-child,.ant-btn-text:focus>a:only-child{color:currentcolor}.ant-btn-text:hover>a:only-child:after,.ant-btn-text:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-text:active{color:#096dd9;border-color:#096dd9;background:transparent}.ant-btn-text:active>a:only-child{color:currentcolor}.ant-btn-text:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-text[disabled],.ant-btn-text[disabled]:hover,.ant-btn-text[disabled]:focus,.ant-btn-text[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-text:hover,.ant-btn-text:focus{color:#000000d9;background:rgba(0,0,0,.018);border-color:transparent}.ant-btn-text:active{color:#000000d9;background:rgba(0,0,0,.028);border-color:transparent}.ant-btn-text[disabled],.ant-btn-text[disabled]:hover,.ant-btn-text[disabled]:focus,.ant-btn-text[disabled]:active{color:#00000040;border-color:transparent;background:transparent;text-shadow:none;box-shadow:none}.ant-btn-text[disabled]>a:only-child,.ant-btn-text[disabled]:hover>a:only-child,.ant-btn-text[disabled]:focus>a:only-child,.ant-btn-text[disabled]:active>a:only-child{color:currentcolor}.ant-btn-text[disabled]>a:only-child:after,.ant-btn-text[disabled]:hover>a:only-child:after,.ant-btn-text[disabled]:focus>a:only-child:after,.ant-btn-text[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous{color:#ff4d4f;border-color:#ff4d4f;background:#fff}.ant-btn-dangerous>a:only-child{color:currentcolor}.ant-btn-dangerous>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous:hover,.ant-btn-dangerous:focus{color:#ff7875;border-color:#ff7875;background:#fff}.ant-btn-dangerous:hover>a:only-child,.ant-btn-dangerous:focus>a:only-child{color:currentcolor}.ant-btn-dangerous:hover>a:only-child:after,.ant-btn-dangerous:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous:active{color:#d9363e;border-color:#d9363e;background:#fff}.ant-btn-dangerous:active>a:only-child{color:currentcolor}.ant-btn-dangerous:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous[disabled],.ant-btn-dangerous[disabled]:hover,.ant-btn-dangerous[disabled]:focus,.ant-btn-dangerous[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-dangerous[disabled]>a:only-child,.ant-btn-dangerous[disabled]:hover>a:only-child,.ant-btn-dangerous[disabled]:focus>a:only-child,.ant-btn-dangerous[disabled]:active>a:only-child{color:currentcolor}.ant-btn-dangerous[disabled]>a:only-child:after,.ant-btn-dangerous[disabled]:hover>a:only-child:after,.ant-btn-dangerous[disabled]:focus>a:only-child:after,.ant-btn-dangerous[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-primary{color:#fff;border-color:#ff4d4f;background:#ff4d4f;text-shadow:0 -1px 0 rgba(0,0,0,.12);box-shadow:0 2px #0000000b}.ant-btn-dangerous.ant-btn-primary>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-primary>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-primary:hover,.ant-btn-dangerous.ant-btn-primary:focus{color:#fff;border-color:#ff7875;background:#ff7875}.ant-btn-dangerous.ant-btn-primary:hover>a:only-child,.ant-btn-dangerous.ant-btn-primary:focus>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-primary:hover>a:only-child:after,.ant-btn-dangerous.ant-btn-primary:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-primary:active{color:#fff;border-color:#d9363e;background:#d9363e}.ant-btn-dangerous.ant-btn-primary:active>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-primary:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-primary[disabled],.ant-btn-dangerous.ant-btn-primary[disabled]:hover,.ant-btn-dangerous.ant-btn-primary[disabled]:focus,.ant-btn-dangerous.ant-btn-primary[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-dangerous.ant-btn-primary[disabled]>a:only-child,.ant-btn-dangerous.ant-btn-primary[disabled]:hover>a:only-child,.ant-btn-dangerous.ant-btn-primary[disabled]:focus>a:only-child,.ant-btn-dangerous.ant-btn-primary[disabled]:active>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-primary[disabled]>a:only-child:after,.ant-btn-dangerous.ant-btn-primary[disabled]:hover>a:only-child:after,.ant-btn-dangerous.ant-btn-primary[disabled]:focus>a:only-child:after,.ant-btn-dangerous.ant-btn-primary[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-link{color:#ff4d4f;border-color:transparent;background:transparent;box-shadow:none}.ant-btn-dangerous.ant-btn-link>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-link>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-link:hover,.ant-btn-dangerous.ant-btn-link:focus{color:#40a9ff;border-color:#40a9ff;background:transparent}.ant-btn-dangerous.ant-btn-link:active{color:#096dd9;border-color:#096dd9;background:transparent}.ant-btn-dangerous.ant-btn-link[disabled],.ant-btn-dangerous.ant-btn-link[disabled]:hover,.ant-btn-dangerous.ant-btn-link[disabled]:focus,.ant-btn-dangerous.ant-btn-link[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-dangerous.ant-btn-link:hover,.ant-btn-dangerous.ant-btn-link:focus{color:#ff7875;border-color:transparent;background:transparent}.ant-btn-dangerous.ant-btn-link:hover>a:only-child,.ant-btn-dangerous.ant-btn-link:focus>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-link:hover>a:only-child:after,.ant-btn-dangerous.ant-btn-link:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-link:active{color:#d9363e;border-color:transparent;background:transparent}.ant-btn-dangerous.ant-btn-link:active>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-link:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-link[disabled],.ant-btn-dangerous.ant-btn-link[disabled]:hover,.ant-btn-dangerous.ant-btn-link[disabled]:focus,.ant-btn-dangerous.ant-btn-link[disabled]:active{color:#00000040;border-color:transparent;background:transparent;text-shadow:none;box-shadow:none}.ant-btn-dangerous.ant-btn-link[disabled]>a:only-child,.ant-btn-dangerous.ant-btn-link[disabled]:hover>a:only-child,.ant-btn-dangerous.ant-btn-link[disabled]:focus>a:only-child,.ant-btn-dangerous.ant-btn-link[disabled]:active>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-link[disabled]>a:only-child:after,.ant-btn-dangerous.ant-btn-link[disabled]:hover>a:only-child:after,.ant-btn-dangerous.ant-btn-link[disabled]:focus>a:only-child:after,.ant-btn-dangerous.ant-btn-link[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-text{color:#ff4d4f;border-color:transparent;background:transparent;box-shadow:none}.ant-btn-dangerous.ant-btn-text>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-text>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-text:hover,.ant-btn-dangerous.ant-btn-text:focus{color:#40a9ff;border-color:#40a9ff;background:transparent}.ant-btn-dangerous.ant-btn-text:active{color:#096dd9;border-color:#096dd9;background:transparent}.ant-btn-dangerous.ant-btn-text[disabled],.ant-btn-dangerous.ant-btn-text[disabled]:hover,.ant-btn-dangerous.ant-btn-text[disabled]:focus,.ant-btn-dangerous.ant-btn-text[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-dangerous.ant-btn-text:hover,.ant-btn-dangerous.ant-btn-text:focus{color:#ff7875;border-color:transparent;background:rgba(0,0,0,.018)}.ant-btn-dangerous.ant-btn-text:hover>a:only-child,.ant-btn-dangerous.ant-btn-text:focus>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-text:hover>a:only-child:after,.ant-btn-dangerous.ant-btn-text:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-text:active{color:#d9363e;border-color:transparent;background:rgba(0,0,0,.028)}.ant-btn-dangerous.ant-btn-text:active>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-text:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-text[disabled],.ant-btn-dangerous.ant-btn-text[disabled]:hover,.ant-btn-dangerous.ant-btn-text[disabled]:focus,.ant-btn-dangerous.ant-btn-text[disabled]:active{color:#00000040;border-color:transparent;background:transparent;text-shadow:none;box-shadow:none}.ant-btn-dangerous.ant-btn-text[disabled]>a:only-child,.ant-btn-dangerous.ant-btn-text[disabled]:hover>a:only-child,.ant-btn-dangerous.ant-btn-text[disabled]:focus>a:only-child,.ant-btn-dangerous.ant-btn-text[disabled]:active>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-text[disabled]>a:only-child:after,.ant-btn-dangerous.ant-btn-text[disabled]:hover>a:only-child:after,.ant-btn-dangerous.ant-btn-text[disabled]:focus>a:only-child:after,.ant-btn-dangerous.ant-btn-text[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-icon-only{width:32px;height:32px;padding:2.4px 0;font-size:16px;border-radius:2px;vertical-align:-3px}.ant-btn-icon-only>*{font-size:16px}.ant-btn-icon-only.ant-btn-lg{width:40px;height:40px;padding:4.9px 0;font-size:18px;border-radius:2px}.ant-btn-icon-only.ant-btn-lg>*{font-size:18px}.ant-btn-icon-only.ant-btn-sm{width:24px;height:24px;padding:0;font-size:14px;border-radius:2px}.ant-btn-icon-only.ant-btn-sm>*{font-size:14px}.ant-btn-icon-only>.anticon{display:flex;justify-content:center}.ant-btn-icon-only .anticon-loading{padding:0!important}a.ant-btn-icon-only{vertical-align:-1px}a.ant-btn-icon-only>.anticon{display:inline}.ant-btn-round{height:32px;padding:4px 16px;font-size:14px;border-radius:32px}.ant-btn-round.ant-btn-lg{height:40px;padding:6.4px 20px;font-size:16px;border-radius:40px}.ant-btn-round.ant-btn-sm{height:24px;padding:0 12px;font-size:14px;border-radius:24px}.ant-btn-round.ant-btn-icon-only{width:auto}.ant-btn-circle{min-width:32px;padding-right:0;padding-left:0;text-align:center;border-radius:50%}.ant-btn-circle.ant-btn-lg{min-width:40px;border-radius:50%}.ant-btn-circle.ant-btn-sm{min-width:24px;border-radius:50%}.ant-btn:before{position:absolute;inset:-1px;z-index:1;display:none;background:#fff;border-radius:inherit;opacity:.35;transition:opacity .2s;content:"";pointer-events:none}.ant-btn .anticon{transition:margin-left .3s cubic-bezier(.645,.045,.355,1)}.ant-btn .anticon.anticon-plus>svg,.ant-btn .anticon.anticon-minus>svg{shape-rendering:optimizespeed}.ant-btn.ant-btn-loading{position:relative;cursor:default}.ant-btn.ant-btn-loading:before{display:block}.ant-btn>.ant-btn-loading-icon{transition:width .3s cubic-bezier(.645,.045,.355,1),opacity .3s cubic-bezier(.645,.045,.355,1)}.ant-btn>.ant-btn-loading-icon .anticon{padding-right:8px;animation:none}.ant-btn>.ant-btn-loading-icon .anticon svg{animation:loadingCircle 1s infinite linear}.ant-btn-group{position:relative;display:inline-flex}.ant-btn-group>.ant-btn,.ant-btn-group>span>.ant-btn{position:relative}.ant-btn-group>.ant-btn:hover,.ant-btn-group>span>.ant-btn:hover,.ant-btn-group>.ant-btn:focus,.ant-btn-group>span>.ant-btn:focus,.ant-btn-group>.ant-btn:active,.ant-btn-group>span>.ant-btn:active{z-index:2}.ant-btn-group>.ant-btn[disabled],.ant-btn-group>span>.ant-btn[disabled]{z-index:0}.ant-btn-group .ant-btn-icon-only{font-size:14px}.ant-btn-group .ant-btn+.ant-btn,.ant-btn+.ant-btn-group,.ant-btn-group span+.ant-btn,.ant-btn-group .ant-btn+span,.ant-btn-group>span+span,.ant-btn-group+.ant-btn,.ant-btn-group+.ant-btn-group{margin-left:-1px}.ant-btn-group .ant-btn-primary+.ant-btn:not(.ant-btn-primary):not([disabled]){border-left-color:transparent}.ant-btn-group .ant-btn{border-radius:0}.ant-btn-group>.ant-btn:first-child,.ant-btn-group>span:first-child>.ant-btn{margin-left:0}.ant-btn-group>.ant-btn:only-child{border-radius:2px}.ant-btn-group>span:only-child>.ant-btn{border-radius:2px}.ant-btn-group>.ant-btn:first-child:not(:last-child),.ant-btn-group>span:first-child:not(:last-child)>.ant-btn{border-top-left-radius:2px;border-bottom-left-radius:2px}.ant-btn-group>.ant-btn:last-child:not(:first-child),.ant-btn-group>span:last-child:not(:first-child)>.ant-btn{border-top-right-radius:2px;border-bottom-right-radius:2px}.ant-btn-group-sm>.ant-btn:only-child{border-radius:2px}.ant-btn-group-sm>span:only-child>.ant-btn{border-radius:2px}.ant-btn-group-sm>.ant-btn:first-child:not(:last-child),.ant-btn-group-sm>span:first-child:not(:last-child)>.ant-btn{border-top-left-radius:2px;border-bottom-left-radius:2px}.ant-btn-group-sm>.ant-btn:last-child:not(:first-child),.ant-btn-group-sm>span:last-child:not(:first-child)>.ant-btn{border-top-right-radius:2px;border-bottom-right-radius:2px}.ant-btn-group>.ant-btn-group{float:left}.ant-btn-group>.ant-btn-group:not(:first-child):not(:last-child)>.ant-btn{border-radius:0}.ant-btn-group>.ant-btn-group:first-child:not(:last-child)>.ant-btn:last-child{padding-right:8px;border-top-right-radius:0;border-bottom-right-radius:0}.ant-btn-group>.ant-btn-group:last-child:not(:first-child)>.ant-btn:first-child{padding-left:8px;border-top-left-radius:0;border-bottom-left-radius:0}.ant-btn-rtl.ant-btn-group .ant-btn+.ant-btn,.ant-btn-rtl.ant-btn+.ant-btn-group,.ant-btn-rtl.ant-btn-group span+.ant-btn,.ant-btn-rtl.ant-btn-group .ant-btn+span,.ant-btn-rtl.ant-btn-group>span+span,.ant-btn-rtl.ant-btn-group+.ant-btn,.ant-btn-rtl.ant-btn-group+.ant-btn-group,.ant-btn-group-rtl.ant-btn-group .ant-btn+.ant-btn,.ant-btn-group-rtl.ant-btn+.ant-btn-group,.ant-btn-group-rtl.ant-btn-group span+.ant-btn,.ant-btn-group-rtl.ant-btn-group .ant-btn+span,.ant-btn-group-rtl.ant-btn-group>span+span,.ant-btn-group-rtl.ant-btn-group+.ant-btn,.ant-btn-group-rtl.ant-btn-group+.ant-btn-group{margin-right:-1px;margin-left:auto}.ant-btn-group.ant-btn-group-rtl{direction:rtl}.ant-btn-group-rtl.ant-btn-group>.ant-btn:first-child:not(:last-child),.ant-btn-group-rtl.ant-btn-group>span:first-child:not(:last-child)>.ant-btn{border-radius:0 2px 2px 0}.ant-btn-group-rtl.ant-btn-group>.ant-btn:last-child:not(:first-child),.ant-btn-group-rtl.ant-btn-group>span:last-child:not(:first-child)>.ant-btn{border-radius:2px 0 0 2px}.ant-btn-group-rtl.ant-btn-group-sm>.ant-btn:first-child:not(:last-child),.ant-btn-group-rtl.ant-btn-group-sm>span:first-child:not(:last-child)>.ant-btn{border-radius:0 2px 2px 0}.ant-btn-group-rtl.ant-btn-group-sm>.ant-btn:last-child:not(:first-child),.ant-btn-group-rtl.ant-btn-group-sm>span:last-child:not(:first-child)>.ant-btn{border-radius:2px 0 0 2px}.ant-btn:focus>span,.ant-btn:active>span{position:relative}.ant-btn>.anticon+span,.ant-btn>span+.anticon{margin-left:8px}.ant-btn.ant-btn-background-ghost{color:#fff;border-color:#fff}.ant-btn.ant-btn-background-ghost,.ant-btn.ant-btn-background-ghost:hover,.ant-btn.ant-btn-background-ghost:active,.ant-btn.ant-btn-background-ghost:focus{background:transparent}.ant-btn.ant-btn-background-ghost:hover,.ant-btn.ant-btn-background-ghost:focus{color:#40a9ff;border-color:#40a9ff}.ant-btn.ant-btn-background-ghost:active{color:#096dd9;border-color:#096dd9}.ant-btn.ant-btn-background-ghost[disabled]{color:#00000040;background:transparent;border-color:#d9d9d9}.ant-btn-background-ghost.ant-btn-primary{color:#1890ff;border-color:#1890ff;text-shadow:none}.ant-btn-background-ghost.ant-btn-primary>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-primary>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-primary:hover,.ant-btn-background-ghost.ant-btn-primary:focus{color:#40a9ff;border-color:#40a9ff}.ant-btn-background-ghost.ant-btn-primary:hover>a:only-child,.ant-btn-background-ghost.ant-btn-primary:focus>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-primary:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-primary:active{color:#096dd9;border-color:#096dd9}.ant-btn-background-ghost.ant-btn-primary:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-primary:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-primary[disabled],.ant-btn-background-ghost.ant-btn-primary[disabled]:hover,.ant-btn-background-ghost.ant-btn-primary[disabled]:focus,.ant-btn-background-ghost.ant-btn-primary[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-background-ghost.ant-btn-primary[disabled]>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]:hover>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]:focus>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-primary[disabled]>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-danger{color:#ff4d4f;border-color:#ff4d4f;text-shadow:none}.ant-btn-background-ghost.ant-btn-danger>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-danger>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-danger:hover,.ant-btn-background-ghost.ant-btn-danger:focus{color:#ff7875;border-color:#ff7875}.ant-btn-background-ghost.ant-btn-danger:hover>a:only-child,.ant-btn-background-ghost.ant-btn-danger:focus>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-danger:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-danger:active{color:#d9363e;border-color:#d9363e}.ant-btn-background-ghost.ant-btn-danger:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-danger:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-danger[disabled],.ant-btn-background-ghost.ant-btn-danger[disabled]:hover,.ant-btn-background-ghost.ant-btn-danger[disabled]:focus,.ant-btn-background-ghost.ant-btn-danger[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-background-ghost.ant-btn-danger[disabled]>a:only-child,.ant-btn-background-ghost.ant-btn-danger[disabled]:hover>a:only-child,.ant-btn-background-ghost.ant-btn-danger[disabled]:focus>a:only-child,.ant-btn-background-ghost.ant-btn-danger[disabled]:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-danger[disabled]>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger[disabled]:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger[disabled]:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous{color:#ff4d4f;border-color:#ff4d4f;text-shadow:none}.ant-btn-background-ghost.ant-btn-dangerous>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous:hover,.ant-btn-background-ghost.ant-btn-dangerous:focus{color:#ff7875;border-color:#ff7875}.ant-btn-background-ghost.ant-btn-dangerous:hover>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous:focus>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous:active{color:#d9363e;border-color:#d9363e}.ant-btn-background-ghost.ant-btn-dangerous:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous[disabled],.ant-btn-background-ghost.ant-btn-dangerous[disabled]:hover,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:focus,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-background-ghost.ant-btn-dangerous[disabled]>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:hover>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:focus>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous[disabled]>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link{color:#ff4d4f;border-color:transparent;text-shadow:none}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:hover,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:focus{color:#ff7875;border-color:transparent}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:hover>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:focus>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:active{color:#d9363e;border-color:transparent}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled],.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:hover,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:focus,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:hover>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:focus>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-two-chinese-chars:first-letter{letter-spacing:.34em}.ant-btn-two-chinese-chars>*:not(.anticon){margin-right:-.34em;letter-spacing:.34em}.ant-btn.ant-btn-block{width:100%}.ant-btn:empty{display:inline-block;width:0;visibility:hidden;content:"\\a0"}a.ant-btn{padding-top:.01px!important;line-height:30px}a.ant-btn-disabled{cursor:not-allowed}a.ant-btn-disabled>*{pointer-events:none}a.ant-btn-disabled,a.ant-btn-disabled:hover,a.ant-btn-disabled:focus,a.ant-btn-disabled:active{color:#00000040;border-color:transparent;background:transparent;text-shadow:none;box-shadow:none}a.ant-btn-disabled>a:only-child,a.ant-btn-disabled:hover>a:only-child,a.ant-btn-disabled:focus>a:only-child,a.ant-btn-disabled:active>a:only-child{color:currentcolor}a.ant-btn-disabled>a:only-child:after,a.ant-btn-disabled:hover>a:only-child:after,a.ant-btn-disabled:focus>a:only-child:after,a.ant-btn-disabled:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}a.ant-btn-lg{line-height:38px}a.ant-btn-sm{line-height:22px}.ant-btn-compact-item:not(.ant-btn-compact-last-item):not(.ant-btn-compact-item-rtl){margin-right:-1px}.ant-btn-compact-item:not(.ant-btn-compact-last-item).ant-btn-compact-item-rtl{margin-left:-1px}.ant-btn-compact-item:hover,.ant-btn-compact-item:focus,.ant-btn-compact-item:active{z-index:2}.ant-btn-compact-item[disabled]{z-index:0}.ant-btn-compact-item:not(.ant-btn-compact-first-item):not(.ant-btn-compact-last-item).ant-btn{border-radius:0}.ant-btn-compact-item.ant-btn.ant-btn-compact-first-item:not(.ant-btn-compact-last-item):not(.ant-btn-compact-item-rtl){border-top-right-radius:0;border-bottom-right-radius:0}.ant-btn-compact-item.ant-btn.ant-btn-compact-last-item:not(.ant-btn-compact-first-item):not(.ant-btn-compact-item-rtl){border-top-left-radius:0;border-bottom-left-radius:0}.ant-btn-compact-item.ant-btn.ant-btn-compact-item-rtl.ant-btn-compact-first-item:not(.ant-btn-compact-last-item){border-top-left-radius:0;border-bottom-left-radius:0}.ant-btn-compact-item.ant-btn.ant-btn-compact-item-rtl.ant-btn-compact-last-item:not(.ant-btn-compact-first-item){border-top-right-radius:0;border-bottom-right-radius:0}.ant-btn-icon-only.ant-btn-compact-item{flex:none}.ant-btn-compact-item.ant-btn-primary:not([disabled])+.ant-btn-compact-item.ant-btn-primary:not([disabled]){position:relative}.ant-btn-compact-item.ant-btn-primary:not([disabled])+.ant-btn-compact-item.ant-btn-primary:not([disabled]):after{position:absolute;top:-1px;left:-1px;display:inline-block;width:1px;height:calc(100% + 2px);background-color:#40a9ff;content:" "}.ant-btn-compact-item-rtl.ant-btn-compact-first-item.ant-btn-compact-item-rtl:not(.ant-btn-compact-last-item){border-top-left-radius:0;border-bottom-left-radius:0}.ant-btn-compact-item-rtl.ant-btn-compact-last-item.ant-btn-compact-item-rtl:not(.ant-btn-compact-first-item){border-top-right-radius:0;border-bottom-right-radius:0}.ant-btn-compact-item-rtl.ant-btn-sm.ant-btn-compact-first-item.ant-btn-compact-item-rtl.ant-btn-sm:not(.ant-btn-compact-last-item){border-top-left-radius:0;border-bottom-left-radius:0}.ant-btn-compact-item-rtl.ant-btn-sm.ant-btn-compact-last-item.ant-btn-compact-item-rtl.ant-btn-sm:not(.ant-btn-compact-first-item){border-top-right-radius:0;border-bottom-right-radius:0}.ant-btn-compact-item-rtl.ant-btn-primary:not([disabled])+.ant-btn-compact-item-rtl.ant-btn-primary:not([disabled]):after{right:-1px}.ant-btn-compact-vertical-item:not(.ant-btn-compact-vertical-last-item){margin-bottom:-1px}.ant-btn-compact-vertical-item:hover,.ant-btn-compact-vertical-item:focus,.ant-btn-compact-vertical-item:active{z-index:2}.ant-btn-compact-vertical-item[disabled]{z-index:0}.ant-btn-compact-vertical-item:not(.ant-btn-compact-vertical-first-item):not(.ant-btn-compact-vertical-last-item){border-radius:0}.ant-btn-compact-vertical-item.ant-btn-compact-vertical-first-item:not(.ant-btn-compact-vertical-last-item){border-bottom-right-radius:0;border-bottom-left-radius:0}.ant-btn-compact-vertical-item.ant-btn-compact-vertical-last-item:not(.ant-btn-compact-vertical-first-item){border-top-left-radius:0;border-top-right-radius:0}.ant-btn-compact-vertical-item.ant-btn-primary:not([disabled])+.ant-btn-compact-vertical-item.ant-btn-primary:not([disabled]){position:relative}.ant-btn-compact-vertical-item.ant-btn-primary:not([disabled])+.ant-btn-compact-vertical-item.ant-btn-primary:not([disabled]):after{position:absolute;top:-1px;left:-1px;display:inline-block;width:calc(100% + 2px);height:1px;background-color:#40a9ff;content:" "}.ant-btn-rtl{direction:rtl}.ant-btn-group-rtl.ant-btn-group .ant-btn-primary:last-child:not(:first-child),.ant-btn-group-rtl.ant-btn-group .ant-btn-primary+.ant-btn-primary{border-right-color:#40a9ff;border-left-color:#d9d9d9}.ant-btn-group-rtl.ant-btn-group .ant-btn-primary:last-child:not(:first-child)[disabled],.ant-btn-group-rtl.ant-btn-group .ant-btn-primary+.ant-btn-primary[disabled]{border-right-color:#d9d9d9;border-left-color:#40a9ff}.ant-btn-rtl.ant-btn>.ant-btn-loading-icon .anticon{padding-right:0;padding-left:8px}.ant-btn-rtl.ant-btn>.anticon+span,.ant-btn-rtl.ant-btn>span+.anticon{margin-right:8px;margin-left:0}.ant-menu-item-danger.ant-menu-item,.ant-menu-item-danger.ant-menu-item:hover,.ant-menu-item-danger.ant-menu-item-active{color:#ff4d4f}.ant-menu-item-danger.ant-menu-item:active{background:#fff1f0}.ant-menu-item-danger.ant-menu-item-selected{color:#ff4d4f}.ant-menu-item-danger.ant-menu-item-selected>a,.ant-menu-item-danger.ant-menu-item-selected>a:hover{color:#ff4d4f}.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-danger.ant-menu-item-selected{background-color:#fff1f0}.ant-menu-inline .ant-menu-item-danger.ant-menu-item:after{border-right-color:#ff4d4f}.ant-menu-dark .ant-menu-item-danger.ant-menu-item,.ant-menu-dark .ant-menu-item-danger.ant-menu-item:hover,.ant-menu-dark .ant-menu-item-danger.ant-menu-item>a{color:#ff4d4f}.ant-menu-dark.ant-menu-dark:not(.ant-menu-horizontal) .ant-menu-item-danger.ant-menu-item-selected{color:#fff;background-color:#ff4d4f}.ant-menu{box-sizing:border-box;margin:0;font-variant:tabular-nums;line-height:1.5715;font-feature-settings:"tnum";padding:0;color:#000000d9;font-size:14px;line-height:0;text-align:left;list-style:none;background:#fff;outline:none;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d;transition:background .3s,width .3s cubic-bezier(.2,0,0,1) 0s}.ant-menu:before{display:table;content:""}.ant-menu:after{display:table;clear:both;content:""}.ant-menu.ant-menu-root:focus-visible{box-shadow:0 0 0 2px #bae7ff}.ant-menu ul,.ant-menu ol{margin:0;padding:0;list-style:none}.ant-menu-overflow{display:flex}.ant-menu-overflow-item{flex:none}.ant-menu-hidden,.ant-menu-submenu-hidden{display:none}.ant-menu-item-group-title{height:1.5715;padding:8px 16px;color:#00000073;font-size:14px;line-height:1.5715;transition:all .3s}.ant-menu-horizontal .ant-menu-submenu{transition:border-color .3s cubic-bezier(.645,.045,.355,1),background .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-submenu,.ant-menu-submenu-inline{transition:border-color .3s cubic-bezier(.645,.045,.355,1),background .3s cubic-bezier(.645,.045,.355,1),padding .15s cubic-bezier(.645,.045,.355,1)}.ant-menu-submenu-selected{color:#1890ff}.ant-menu-item:active,.ant-menu-submenu-title:active{background:#e6f7ff}.ant-menu-submenu .ant-menu-sub{cursor:initial;transition:background .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-title-content{transition:color .3s}.ant-menu-item a{color:#000000d9}.ant-menu-item a:hover{color:#1890ff}.ant-menu-item a:before{position:absolute;inset:0;background-color:transparent;content:""}.ant-menu-item>.ant-badge a{color:#000000d9}.ant-menu-item>.ant-badge a:hover{color:#1890ff}.ant-menu-item-divider{overflow:hidden;line-height:0;border-color:#f0f0f0;border-style:solid;border-width:1px 0 0}.ant-menu-item-divider-dashed{border-style:dashed}.ant-menu-horizontal .ant-menu-item,.ant-menu-horizontal .ant-menu-submenu{margin-top:-1px}.ant-menu-horizontal>.ant-menu-item:hover,.ant-menu-horizontal>.ant-menu-item-active,.ant-menu-horizontal>.ant-menu-submenu .ant-menu-submenu-title:hover{background-color:transparent}.ant-menu-item-selected,.ant-menu-item-selected a,.ant-menu-item-selected a:hover{color:#1890ff}.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected{background-color:#e6f7ff}.ant-menu-inline,.ant-menu-vertical,.ant-menu-vertical-left{border-right:1px solid #f0f0f0}.ant-menu-vertical-right{border-left:1px solid #f0f0f0}.ant-menu-vertical.ant-menu-sub,.ant-menu-vertical-left.ant-menu-sub,.ant-menu-vertical-right.ant-menu-sub{min-width:160px;max-height:calc(100vh - 100px);padding:0;overflow:hidden;border-right:0}.ant-menu-vertical.ant-menu-sub:not([class*="-active"]),.ant-menu-vertical-left.ant-menu-sub:not([class*="-active"]),.ant-menu-vertical-right.ant-menu-sub:not([class*="-active"]){overflow-x:hidden;overflow-y:auto}.ant-menu-vertical.ant-menu-sub .ant-menu-item,.ant-menu-vertical-left.ant-menu-sub .ant-menu-item,.ant-menu-vertical-right.ant-menu-sub .ant-menu-item{left:0;margin-left:0;border-right:0}.ant-menu-vertical.ant-menu-sub .ant-menu-item:after,.ant-menu-vertical-left.ant-menu-sub .ant-menu-item:after,.ant-menu-vertical-right.ant-menu-sub .ant-menu-item:after{border-right:0}.ant-menu-vertical.ant-menu-sub>.ant-menu-item,.ant-menu-vertical-left.ant-menu-sub>.ant-menu-item,.ant-menu-vertical-right.ant-menu-sub>.ant-menu-item,.ant-menu-vertical.ant-menu-sub>.ant-menu-submenu,.ant-menu-vertical-left.ant-menu-sub>.ant-menu-submenu,.ant-menu-vertical-right.ant-menu-sub>.ant-menu-submenu{transform-origin:0 0}.ant-menu-horizontal.ant-menu-sub{min-width:114px}.ant-menu-horizontal .ant-menu-item,.ant-menu-horizontal .ant-menu-submenu-title{transition:border-color .3s,background .3s}.ant-menu-item,.ant-menu-submenu-title{position:relative;display:block;margin:0;padding:0 20px;white-space:nowrap;cursor:pointer;transition:border-color .3s,background .3s,padding .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-item .ant-menu-item-icon,.ant-menu-submenu-title .ant-menu-item-icon,.ant-menu-item .anticon,.ant-menu-submenu-title .anticon{min-width:14px;font-size:14px;transition:font-size .15s cubic-bezier(.215,.61,.355,1),margin .3s cubic-bezier(.645,.045,.355,1),color .3s}.ant-menu-item .ant-menu-item-icon+span,.ant-menu-submenu-title .ant-menu-item-icon+span,.ant-menu-item .anticon+span,.ant-menu-submenu-title .anticon+span{margin-left:10px;opacity:1;transition:opacity .3s cubic-bezier(.645,.045,.355,1),margin .3s,color .3s}.ant-menu-item .ant-menu-item-icon.svg,.ant-menu-submenu-title .ant-menu-item-icon.svg{vertical-align:-.125em}.ant-menu-item.ant-menu-item-only-child>.anticon,.ant-menu-submenu-title.ant-menu-item-only-child>.anticon,.ant-menu-item.ant-menu-item-only-child>.ant-menu-item-icon,.ant-menu-submenu-title.ant-menu-item-only-child>.ant-menu-item-icon{margin-right:0}.ant-menu-item:not(.ant-menu-item-disabled):focus-visible,.ant-menu-submenu-title:not(.ant-menu-item-disabled):focus-visible{box-shadow:0 0 0 2px #bae7ff}.ant-menu>.ant-menu-item-divider{margin:1px 0;padding:0}.ant-menu-submenu-popup{position:absolute;z-index:1050;background:transparent;border-radius:2px;box-shadow:none;transform-origin:0 0}.ant-menu-submenu-popup:before{position:absolute;inset:-7px 0 0;z-index:-1;width:100%;height:100%;opacity:.0001;content:" "}.ant-menu-submenu-placement-rightTop:before{top:0;left:-7px}.ant-menu-submenu>.ant-menu{background-color:#fff;border-radius:2px}.ant-menu-submenu>.ant-menu-submenu-title:after{transition:transform .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-submenu-popup>.ant-menu{background-color:#fff}.ant-menu-submenu-expand-icon,.ant-menu-submenu-arrow{position:absolute;top:50%;right:16px;width:10px;color:#000000d9;transform:translateY(-50%);transition:transform .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-submenu-arrow:before,.ant-menu-submenu-arrow:after{position:absolute;width:6px;height:1.5px;background-color:currentcolor;border-radius:2px;transition:background .3s cubic-bezier(.645,.045,.355,1),transform .3s cubic-bezier(.645,.045,.355,1),top .3s cubic-bezier(.645,.045,.355,1),color .3s cubic-bezier(.645,.045,.355,1);content:""}.ant-menu-submenu-arrow:before{transform:rotate(45deg) translateY(-2.5px)}.ant-menu-submenu-arrow:after{transform:rotate(-45deg) translateY(2.5px)}.ant-menu-submenu:hover>.ant-menu-submenu-title>.ant-menu-submenu-expand-icon,.ant-menu-submenu:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow{color:#1890ff}.ant-menu-inline-collapsed .ant-menu-submenu-arrow:before,.ant-menu-submenu-inline .ant-menu-submenu-arrow:before{transform:rotate(-45deg) translate(2.5px)}.ant-menu-inline-collapsed .ant-menu-submenu-arrow:after,.ant-menu-submenu-inline .ant-menu-submenu-arrow:after{transform:rotate(45deg) translate(-2.5px)}.ant-menu-submenu-horizontal .ant-menu-submenu-arrow{display:none}.ant-menu-submenu-open.ant-menu-submenu-inline>.ant-menu-submenu-title>.ant-menu-submenu-arrow{transform:translateY(-2px)}.ant-menu-submenu-open.ant-menu-submenu-inline>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after{transform:rotate(-45deg) translate(-2.5px)}.ant-menu-submenu-open.ant-menu-submenu-inline>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before{transform:rotate(45deg) translate(2.5px)}.ant-menu-vertical .ant-menu-submenu-selected,.ant-menu-vertical-left .ant-menu-submenu-selected,.ant-menu-vertical-right .ant-menu-submenu-selected{color:#1890ff}.ant-menu-horizontal{line-height:46px;border:0;border-bottom:1px solid #f0f0f0;box-shadow:none}.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu{margin-top:-1px;margin-bottom:0;padding:0 20px}.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item:hover,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu:hover,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-active,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-active,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-open,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-open,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-selected,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-selected{color:#1890ff}.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item:hover:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu:hover:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-active:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-active:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-open:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-open:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-selected:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-selected:after{border-bottom:2px solid #1890ff}.ant-menu-horizontal>.ant-menu-item,.ant-menu-horizontal>.ant-menu-submenu{position:relative;top:1px;display:inline-block;vertical-align:bottom}.ant-menu-horizontal>.ant-menu-item:after,.ant-menu-horizontal>.ant-menu-submenu:after{position:absolute;right:20px;bottom:0;left:20px;border-bottom:2px solid transparent;transition:border-color .3s cubic-bezier(.645,.045,.355,1);content:""}.ant-menu-horizontal>.ant-menu-submenu>.ant-menu-submenu-title{padding:0}.ant-menu-horizontal>.ant-menu-item a{color:#000000d9}.ant-menu-horizontal>.ant-menu-item a:hover{color:#1890ff}.ant-menu-horizontal>.ant-menu-item a:before{bottom:-2px}.ant-menu-horizontal>.ant-menu-item-selected a{color:#1890ff}.ant-menu-horizontal:after{display:block;clear:both;height:0;content:" "}.ant-menu-vertical .ant-menu-item,.ant-menu-vertical-left .ant-menu-item,.ant-menu-vertical-right .ant-menu-item,.ant-menu-inline .ant-menu-item{position:relative}.ant-menu-vertical .ant-menu-item:after,.ant-menu-vertical-left .ant-menu-item:after,.ant-menu-vertical-right .ant-menu-item:after,.ant-menu-inline .ant-menu-item:after{position:absolute;top:0;right:0;bottom:0;border-right:3px solid #1890ff;transform:scaleY(.0001);opacity:0;transition:transform .15s cubic-bezier(.215,.61,.355,1),opacity .15s cubic-bezier(.215,.61,.355,1);content:""}.ant-menu-vertical .ant-menu-item,.ant-menu-vertical-left .ant-menu-item,.ant-menu-vertical-right .ant-menu-item,.ant-menu-inline .ant-menu-item,.ant-menu-vertical .ant-menu-submenu-title,.ant-menu-vertical-left .ant-menu-submenu-title,.ant-menu-vertical-right .ant-menu-submenu-title,.ant-menu-inline .ant-menu-submenu-title{height:40px;margin-top:4px;margin-bottom:4px;padding:0 16px;overflow:hidden;line-height:40px;text-overflow:ellipsis}.ant-menu-vertical .ant-menu-submenu,.ant-menu-vertical-left .ant-menu-submenu,.ant-menu-vertical-right .ant-menu-submenu,.ant-menu-inline .ant-menu-submenu{padding-bottom:.02px}.ant-menu-vertical .ant-menu-item:not(:last-child),.ant-menu-vertical-left .ant-menu-item:not(:last-child),.ant-menu-vertical-right .ant-menu-item:not(:last-child),.ant-menu-inline .ant-menu-item:not(:last-child){margin-bottom:8px}.ant-menu-vertical>.ant-menu-item,.ant-menu-vertical-left>.ant-menu-item,.ant-menu-vertical-right>.ant-menu-item,.ant-menu-inline>.ant-menu-item,.ant-menu-vertical>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu-vertical-left>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu-vertical-right>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu-inline>.ant-menu-submenu>.ant-menu-submenu-title{height:40px;line-height:40px}.ant-menu-vertical .ant-menu-item-group-list .ant-menu-submenu-title,.ant-menu-vertical .ant-menu-submenu-title{padding-right:34px}.ant-menu-inline{width:100%}.ant-menu-inline .ant-menu-selected:after,.ant-menu-inline .ant-menu-item-selected:after{transform:scaleY(1);opacity:1;transition:transform .15s cubic-bezier(.645,.045,.355,1),opacity .15s cubic-bezier(.645,.045,.355,1)}.ant-menu-inline .ant-menu-item,.ant-menu-inline .ant-menu-submenu-title{width:calc(100% + 1px)}.ant-menu-inline .ant-menu-item-group-list .ant-menu-submenu-title,.ant-menu-inline .ant-menu-submenu-title{padding-right:34px}.ant-menu-inline.ant-menu-root .ant-menu-item,.ant-menu-inline.ant-menu-root .ant-menu-submenu-title{display:flex;align-items:center;transition:border-color .3s,background .3s,padding .1s cubic-bezier(.215,.61,.355,1)}.ant-menu-inline.ant-menu-root .ant-menu-item>.ant-menu-title-content,.ant-menu-inline.ant-menu-root .ant-menu-submenu-title>.ant-menu-title-content{flex:auto;min-width:0;overflow:hidden;text-overflow:ellipsis}.ant-menu-inline.ant-menu-root .ant-menu-item>*,.ant-menu-inline.ant-menu-root .ant-menu-submenu-title>*{flex:none}.ant-menu.ant-menu-inline-collapsed{width:80px}.ant-menu.ant-menu-inline-collapsed>.ant-menu-item,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title{left:0;padding:0 calc(50% - 8px);text-overflow:clip}.ant-menu.ant-menu-inline-collapsed>.ant-menu-item .ant-menu-submenu-arrow,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .ant-menu-submenu-arrow,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-submenu-arrow{opacity:0}.ant-menu.ant-menu-inline-collapsed>.ant-menu-item .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item .anticon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .anticon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .anticon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .anticon{margin:0;font-size:16px;line-height:40px}.ant-menu.ant-menu-inline-collapsed>.ant-menu-item .ant-menu-item-icon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .ant-menu-item-icon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-item-icon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-item-icon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item .anticon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .anticon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .anticon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .anticon+span{display:inline-block;opacity:0}.ant-menu.ant-menu-inline-collapsed .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed .anticon{display:inline-block}.ant-menu.ant-menu-inline-collapsed-tooltip{pointer-events:none}.ant-menu.ant-menu-inline-collapsed-tooltip .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed-tooltip .anticon{display:none}.ant-menu.ant-menu-inline-collapsed-tooltip a{color:#ffffffd9}.ant-menu.ant-menu-inline-collapsed .ant-menu-item-group-title{padding-right:4px;padding-left:4px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-menu-item-group-list{margin:0;padding:0}.ant-menu-item-group-list .ant-menu-item,.ant-menu-item-group-list .ant-menu-submenu-title{padding:0 16px 0 28px}.ant-menu-root.ant-menu-vertical,.ant-menu-root.ant-menu-vertical-left,.ant-menu-root.ant-menu-vertical-right,.ant-menu-root.ant-menu-inline{box-shadow:none}.ant-menu-root.ant-menu-inline-collapsed .ant-menu-item>.ant-menu-inline-collapsed-noicon,.ant-menu-root.ant-menu-inline-collapsed .ant-menu-submenu .ant-menu-submenu-title>.ant-menu-inline-collapsed-noicon{font-size:16px;text-align:center}.ant-menu-sub.ant-menu-inline{padding:0;background:#fafafa;border:0;border-radius:0;box-shadow:none}.ant-menu-sub.ant-menu-inline>.ant-menu-item,.ant-menu-sub.ant-menu-inline>.ant-menu-submenu>.ant-menu-submenu-title{height:40px;line-height:40px;list-style-position:inside;list-style-type:disc}.ant-menu-sub.ant-menu-inline .ant-menu-item-group-title{padding-left:32px}.ant-menu-item-disabled,.ant-menu-submenu-disabled{color:#00000040!important;background:none;cursor:not-allowed}.ant-menu-item-disabled:after,.ant-menu-submenu-disabled:after{border-color:transparent!important}.ant-menu-item-disabled a,.ant-menu-submenu-disabled a{color:#00000040!important;pointer-events:none}.ant-menu-item-disabled>.ant-menu-submenu-title,.ant-menu-submenu-disabled>.ant-menu-submenu-title{color:#00000040!important;cursor:not-allowed}.ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after{background:rgba(0,0,0,.25)!important}.ant-layout-header .ant-menu{line-height:inherit}.ant-menu-inline-collapsed-tooltip a,.ant-menu-inline-collapsed-tooltip a:hover{color:#fff}.ant-menu-light .ant-menu-item:hover,.ant-menu-light .ant-menu-item-active,.ant-menu-light .ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open,.ant-menu-light .ant-menu-submenu-active,.ant-menu-light .ant-menu-submenu-title:hover{color:#1890ff}.ant-menu.ant-menu-root:focus-visible{box-shadow:0 0 0 2px #096dd9}.ant-menu-dark .ant-menu-item:focus-visible,.ant-menu-dark .ant-menu-submenu-title:focus-visible{box-shadow:0 0 0 2px #096dd9}.ant-menu.ant-menu-dark,.ant-menu-dark .ant-menu-sub,.ant-menu.ant-menu-dark .ant-menu-sub{color:#ffffffa6;background:#001529}.ant-menu.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow{opacity:.45;transition:all .3s}.ant-menu.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:before{background:#fff}.ant-menu-dark.ant-menu-submenu-popup{background:transparent}.ant-menu-dark .ant-menu-inline.ant-menu-sub{background:#000c17}.ant-menu-dark.ant-menu-horizontal{border-bottom:0}.ant-menu-dark.ant-menu-horizontal>.ant-menu-item,.ant-menu-dark.ant-menu-horizontal>.ant-menu-submenu{top:0;margin-top:0;padding:0 20px;border-color:#001529;border-bottom:0}.ant-menu-dark.ant-menu-horizontal>.ant-menu-item:hover{background-color:#1890ff}.ant-menu-dark.ant-menu-horizontal>.ant-menu-item>a:before{bottom:0}.ant-menu-dark .ant-menu-item,.ant-menu-dark .ant-menu-item-group-title,.ant-menu-dark .ant-menu-item>a,.ant-menu-dark .ant-menu-item>span>a{color:#ffffffa6}.ant-menu-dark.ant-menu-inline,.ant-menu-dark.ant-menu-vertical,.ant-menu-dark.ant-menu-vertical-left,.ant-menu-dark.ant-menu-vertical-right{border-right:0}.ant-menu-dark.ant-menu-inline .ant-menu-item,.ant-menu-dark.ant-menu-vertical .ant-menu-item,.ant-menu-dark.ant-menu-vertical-left .ant-menu-item,.ant-menu-dark.ant-menu-vertical-right .ant-menu-item{left:0;margin-left:0;border-right:0}.ant-menu-dark.ant-menu-inline .ant-menu-item:after,.ant-menu-dark.ant-menu-vertical .ant-menu-item:after,.ant-menu-dark.ant-menu-vertical-left .ant-menu-item:after,.ant-menu-dark.ant-menu-vertical-right .ant-menu-item:after{border-right:0}.ant-menu-dark.ant-menu-inline .ant-menu-item,.ant-menu-dark.ant-menu-inline .ant-menu-submenu-title{width:100%}.ant-menu-dark .ant-menu-item:hover,.ant-menu-dark .ant-menu-item-active,.ant-menu-dark .ant-menu-submenu-active,.ant-menu-dark .ant-menu-submenu-open,.ant-menu-dark .ant-menu-submenu-selected,.ant-menu-dark .ant-menu-submenu-title:hover{color:#fff;background-color:transparent}.ant-menu-dark .ant-menu-item:hover>a,.ant-menu-dark .ant-menu-item-active>a,.ant-menu-dark .ant-menu-submenu-active>a,.ant-menu-dark .ant-menu-submenu-open>a,.ant-menu-dark .ant-menu-submenu-selected>a,.ant-menu-dark .ant-menu-submenu-title:hover>a,.ant-menu-dark .ant-menu-item:hover>span>a,.ant-menu-dark .ant-menu-item-active>span>a,.ant-menu-dark .ant-menu-submenu-active>span>a,.ant-menu-dark .ant-menu-submenu-open>span>a,.ant-menu-dark .ant-menu-submenu-selected>span>a,.ant-menu-dark .ant-menu-submenu-title:hover>span>a{color:#fff}.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow{opacity:1}.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before{background:#fff}.ant-menu-dark .ant-menu-item:hover{background-color:transparent}.ant-menu-dark.ant-menu-dark:not(.ant-menu-horizontal) .ant-menu-item-selected{background-color:#1890ff}.ant-menu-dark .ant-menu-item-selected{color:#fff;border-right:0}.ant-menu-dark .ant-menu-item-selected:after{border-right:0}.ant-menu-dark .ant-menu-item-selected>a,.ant-menu-dark .ant-menu-item-selected>span>a,.ant-menu-dark .ant-menu-item-selected>a:hover,.ant-menu-dark .ant-menu-item-selected>span>a:hover{color:#fff}.ant-menu-dark .ant-menu-item-selected .ant-menu-item-icon,.ant-menu-dark .ant-menu-item-selected .anticon{color:#fff}.ant-menu-dark .ant-menu-item-selected .ant-menu-item-icon+span,.ant-menu-dark .ant-menu-item-selected .anticon+span{color:#fff}.ant-menu.ant-menu-dark .ant-menu-item-selected,.ant-menu-submenu-popup.ant-menu-dark .ant-menu-item-selected{background-color:#1890ff}.ant-menu-dark .ant-menu-item-disabled,.ant-menu-dark .ant-menu-submenu-disabled,.ant-menu-dark .ant-menu-item-disabled>a,.ant-menu-dark .ant-menu-submenu-disabled>a,.ant-menu-dark .ant-menu-item-disabled>span>a,.ant-menu-dark .ant-menu-submenu-disabled>span>a{color:#ffffff59!important;opacity:.8}.ant-menu-dark .ant-menu-item-disabled>.ant-menu-submenu-title,.ant-menu-dark .ant-menu-submenu-disabled>.ant-menu-submenu-title{color:#ffffff59!important}.ant-menu-dark .ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after{background:rgba(255,255,255,.35)!important}.ant-menu.ant-menu-rtl{direction:rtl;text-align:right}.ant-menu-rtl .ant-menu-item-group-title{text-align:right}.ant-menu-rtl.ant-menu-inline,.ant-menu-rtl.ant-menu-vertical{border-right:none;border-left:1px solid #f0f0f0}.ant-menu-rtl.ant-menu-dark.ant-menu-inline,.ant-menu-rtl.ant-menu-dark.ant-menu-vertical{border-left:none}.ant-menu-rtl.ant-menu-vertical.ant-menu-sub>.ant-menu-item,.ant-menu-rtl.ant-menu-vertical-left.ant-menu-sub>.ant-menu-item,.ant-menu-rtl.ant-menu-vertical-right.ant-menu-sub>.ant-menu-item,.ant-menu-rtl.ant-menu-vertical.ant-menu-sub>.ant-menu-submenu,.ant-menu-rtl.ant-menu-vertical-left.ant-menu-sub>.ant-menu-submenu,.ant-menu-rtl.ant-menu-vertical-right.ant-menu-sub>.ant-menu-submenu{transform-origin:top right}.ant-menu-rtl .ant-menu-item .ant-menu-item-icon,.ant-menu-rtl .ant-menu-submenu-title .ant-menu-item-icon,.ant-menu-rtl .ant-menu-item .anticon,.ant-menu-rtl .ant-menu-submenu-title .anticon{margin-right:auto;margin-left:10px}.ant-menu-rtl .ant-menu-item.ant-menu-item-only-child>.ant-menu-item-icon,.ant-menu-rtl .ant-menu-submenu-title.ant-menu-item-only-child>.ant-menu-item-icon,.ant-menu-rtl .ant-menu-item.ant-menu-item-only-child>.anticon,.ant-menu-rtl .ant-menu-submenu-title.ant-menu-item-only-child>.anticon{margin-left:0}.ant-menu-submenu-rtl.ant-menu-submenu-popup{transform-origin:100% 0}.ant-menu-rtl .ant-menu-submenu-vertical>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-rtl .ant-menu-submenu-vertical-left>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-rtl .ant-menu-submenu-vertical-right>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-rtl .ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow{right:auto;left:16px}.ant-menu-rtl .ant-menu-submenu-vertical>.ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-rtl .ant-menu-submenu-vertical-left>.ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-rtl .ant-menu-submenu-vertical-right>.ant-menu-submenu-title .ant-menu-submenu-arrow:before{transform:rotate(-45deg) translateY(-2px)}.ant-menu-rtl .ant-menu-submenu-vertical>.ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-rtl .ant-menu-submenu-vertical-left>.ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-rtl .ant-menu-submenu-vertical-right>.ant-menu-submenu-title .ant-menu-submenu-arrow:after{transform:rotate(45deg) translateY(2px)}.ant-menu-rtl.ant-menu-vertical .ant-menu-item:after,.ant-menu-rtl.ant-menu-vertical-left .ant-menu-item:after,.ant-menu-rtl.ant-menu-vertical-right .ant-menu-item:after,.ant-menu-rtl.ant-menu-inline .ant-menu-item:after{right:auto;left:0}.ant-menu-rtl.ant-menu-vertical .ant-menu-item,.ant-menu-rtl.ant-menu-vertical-left .ant-menu-item,.ant-menu-rtl.ant-menu-vertical-right .ant-menu-item,.ant-menu-rtl.ant-menu-inline .ant-menu-item,.ant-menu-rtl.ant-menu-vertical .ant-menu-submenu-title,.ant-menu-rtl.ant-menu-vertical-left .ant-menu-submenu-title,.ant-menu-rtl.ant-menu-vertical-right .ant-menu-submenu-title,.ant-menu-rtl.ant-menu-inline .ant-menu-submenu-title{text-align:right}.ant-menu-rtl.ant-menu-inline .ant-menu-submenu-title{padding-right:0;padding-left:34px}.ant-menu-rtl.ant-menu-vertical .ant-menu-submenu-title{padding-right:16px;padding-left:34px}.ant-menu-rtl.ant-menu-inline-collapsed.ant-menu-vertical .ant-menu-submenu-title{padding:0 calc(50% - 8px)}.ant-menu-rtl .ant-menu-item-group-list .ant-menu-item,.ant-menu-rtl .ant-menu-item-group-list .ant-menu-submenu-title{padding:0 28px 0 16px}.ant-menu-sub.ant-menu-inline{border:0}.ant-menu-rtl.ant-menu-sub.ant-menu-inline .ant-menu-item-group-title{padding-right:32px;padding-left:0}.ant-tooltip{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:absolute;z-index:1070;display:block;width:-moz-max-content;width:max-content;width:intrinsic;max-width:250px;visibility:visible}.ant-tooltip-content{position:relative}.ant-tooltip-hidden{display:none}.ant-tooltip-placement-top,.ant-tooltip-placement-topLeft,.ant-tooltip-placement-topRight{padding-bottom:14.3137085px}.ant-tooltip-placement-right,.ant-tooltip-placement-rightTop,.ant-tooltip-placement-rightBottom{padding-left:14.3137085px}.ant-tooltip-placement-bottom,.ant-tooltip-placement-bottomLeft,.ant-tooltip-placement-bottomRight{padding-top:14.3137085px}.ant-tooltip-placement-left,.ant-tooltip-placement-leftTop,.ant-tooltip-placement-leftBottom{padding-right:14.3137085px}.ant-tooltip-inner{min-width:30px;min-height:32px;padding:6px 8px;color:#fff;text-align:left;text-decoration:none;word-wrap:break-word;background-color:#000000bf;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d}.ant-tooltip-arrow{position:absolute;z-index:2;display:block;width:22px;height:22px;overflow:hidden;background:transparent;pointer-events:none}.ant-tooltip-arrow-content{--antd-arrow-background-color: linear-gradient(to right bottom, rgba(0, 0, 0, .65), rgba(0, 0, 0, .75));position:absolute;inset:0;display:block;width:11.3137085px;height:11.3137085px;margin:auto;content:"";pointer-events:auto;border-radius:0 0 2px;pointer-events:none}.ant-tooltip-arrow-content:before{position:absolute;top:-11.3137085px;left:-11.3137085px;width:33.9411255px;height:33.9411255px;background:var(--antd-arrow-background-color);background-repeat:no-repeat;background-position:-10px -10px;content:"";-webkit-clip-path:inset(33% 33%);clip-path:inset(33% 33%);-webkit-clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z");clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z")}.ant-tooltip-placement-top .ant-tooltip-arrow,.ant-tooltip-placement-topLeft .ant-tooltip-arrow,.ant-tooltip-placement-topRight .ant-tooltip-arrow{bottom:0;transform:translateY(100%)}.ant-tooltip-placement-top .ant-tooltip-arrow-content,.ant-tooltip-placement-topLeft .ant-tooltip-arrow-content,.ant-tooltip-placement-topRight .ant-tooltip-arrow-content{box-shadow:3px 3px 7px #00000012;transform:translateY(-11px) rotate(45deg)}.ant-tooltip-placement-top .ant-tooltip-arrow{left:50%;transform:translateY(100%) translate(-50%)}.ant-tooltip-placement-topLeft .ant-tooltip-arrow{left:13px}.ant-tooltip-placement-topRight .ant-tooltip-arrow{right:13px}.ant-tooltip-placement-right .ant-tooltip-arrow,.ant-tooltip-placement-rightTop .ant-tooltip-arrow,.ant-tooltip-placement-rightBottom .ant-tooltip-arrow{left:0;transform:translate(-100%)}.ant-tooltip-placement-right .ant-tooltip-arrow-content,.ant-tooltip-placement-rightTop .ant-tooltip-arrow-content,.ant-tooltip-placement-rightBottom .ant-tooltip-arrow-content{box-shadow:-3px 3px 7px #00000012;transform:translate(11px) rotate(135deg)}.ant-tooltip-placement-right .ant-tooltip-arrow{top:50%;transform:translate(-100%) translateY(-50%)}.ant-tooltip-placement-rightTop .ant-tooltip-arrow{top:5px}.ant-tooltip-placement-rightBottom .ant-tooltip-arrow{bottom:5px}.ant-tooltip-placement-left .ant-tooltip-arrow,.ant-tooltip-placement-leftTop .ant-tooltip-arrow,.ant-tooltip-placement-leftBottom .ant-tooltip-arrow{right:0;transform:translate(100%)}.ant-tooltip-placement-left .ant-tooltip-arrow-content,.ant-tooltip-placement-leftTop .ant-tooltip-arrow-content,.ant-tooltip-placement-leftBottom .ant-tooltip-arrow-content{box-shadow:3px -3px 7px #00000012;transform:translate(-11px) rotate(315deg)}.ant-tooltip-placement-left .ant-tooltip-arrow{top:50%;transform:translate(100%) translateY(-50%)}.ant-tooltip-placement-leftTop .ant-tooltip-arrow{top:5px}.ant-tooltip-placement-leftBottom .ant-tooltip-arrow{bottom:5px}.ant-tooltip-placement-bottom .ant-tooltip-arrow,.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow,.ant-tooltip-placement-bottomRight .ant-tooltip-arrow{top:0;transform:translateY(-100%)}.ant-tooltip-placement-bottom .ant-tooltip-arrow-content,.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow-content,.ant-tooltip-placement-bottomRight .ant-tooltip-arrow-content{box-shadow:-3px -3px 7px #00000012;transform:translateY(11px) rotate(225deg)}.ant-tooltip-placement-bottom .ant-tooltip-arrow{left:50%;transform:translateY(-100%) translate(-50%)}.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow{left:13px}.ant-tooltip-placement-bottomRight .ant-tooltip-arrow{right:13px}.ant-tooltip-pink .ant-tooltip-inner{background-color:#eb2f96}.ant-tooltip-pink .ant-tooltip-arrow-content:before{background:#eb2f96}.ant-tooltip-magenta .ant-tooltip-inner{background-color:#eb2f96}.ant-tooltip-magenta .ant-tooltip-arrow-content:before{background:#eb2f96}.ant-tooltip-red .ant-tooltip-inner{background-color:#f5222d}.ant-tooltip-red .ant-tooltip-arrow-content:before{background:#f5222d}.ant-tooltip-volcano .ant-tooltip-inner{background-color:#fa541c}.ant-tooltip-volcano .ant-tooltip-arrow-content:before{background:#fa541c}.ant-tooltip-orange .ant-tooltip-inner{background-color:#fa8c16}.ant-tooltip-orange .ant-tooltip-arrow-content:before{background:#fa8c16}.ant-tooltip-yellow .ant-tooltip-inner{background-color:#fadb14}.ant-tooltip-yellow .ant-tooltip-arrow-content:before{background:#fadb14}.ant-tooltip-gold .ant-tooltip-inner{background-color:#faad14}.ant-tooltip-gold .ant-tooltip-arrow-content:before{background:#faad14}.ant-tooltip-cyan .ant-tooltip-inner{background-color:#13c2c2}.ant-tooltip-cyan .ant-tooltip-arrow-content:before{background:#13c2c2}.ant-tooltip-lime .ant-tooltip-inner{background-color:#a0d911}.ant-tooltip-lime .ant-tooltip-arrow-content:before{background:#a0d911}.ant-tooltip-green .ant-tooltip-inner{background-color:#52c41a}.ant-tooltip-green .ant-tooltip-arrow-content:before{background:#52c41a}.ant-tooltip-blue .ant-tooltip-inner{background-color:#1890ff}.ant-tooltip-blue .ant-tooltip-arrow-content:before{background:#1890ff}.ant-tooltip-geekblue .ant-tooltip-inner{background-color:#2f54eb}.ant-tooltip-geekblue .ant-tooltip-arrow-content:before{background:#2f54eb}.ant-tooltip-purple .ant-tooltip-inner{background-color:#722ed1}.ant-tooltip-purple .ant-tooltip-arrow-content:before{background:#722ed1}.ant-tooltip-rtl{direction:rtl}.ant-tooltip-rtl .ant-tooltip-inner{text-align:right}.ant-space{display:inline-flex}.ant-space-vertical{flex-direction:column}.ant-space-align-center{align-items:center}.ant-space-align-start{align-items:flex-start}.ant-space-align-end{align-items:flex-end}.ant-space-align-baseline{align-items:baseline}.ant-space-item:empty{display:none}.ant-space-compact{display:inline-flex}.ant-space-compact-block{display:flex;width:100%}.ant-space-compact-vertical{flex-direction:column}.ant-space-rtl,.ant-space-compact-rtl{direction:rtl}.ant-picker-calendar{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";background:#fff}.ant-picker-calendar-header{display:flex;justify-content:flex-end;padding:12px 0}.ant-picker-calendar-header .ant-picker-calendar-year-select{min-width:80px}.ant-picker-calendar-header .ant-picker-calendar-month-select{min-width:70px;margin-left:8px}.ant-picker-calendar-header .ant-picker-calendar-mode-switch{margin-left:8px}.ant-picker-calendar .ant-picker-panel{background:#fff;border:0;border-top:1px solid #f0f0f0;border-radius:0}.ant-picker-calendar .ant-picker-panel .ant-picker-month-panel,.ant-picker-calendar .ant-picker-panel .ant-picker-date-panel{width:auto}.ant-picker-calendar .ant-picker-panel .ant-picker-body{padding:8px 0}.ant-picker-calendar .ant-picker-panel .ant-picker-content{width:100%}.ant-picker-calendar-mini{border-radius:2px}.ant-picker-calendar-mini .ant-picker-calendar-header{padding-right:8px;padding-left:8px}.ant-picker-calendar-mini .ant-picker-panel{border-radius:0 0 2px 2px}.ant-picker-calendar-mini .ant-picker-content{height:256px}.ant-picker-calendar-mini .ant-picker-content th{height:auto;padding:0;line-height:18px}.ant-picker-calendar-mini .ant-picker-cell:before{pointer-events:none}.ant-picker-calendar-full .ant-picker-panel{display:block;width:100%;text-align:right;background:#fff;border:0}.ant-picker-calendar-full .ant-picker-panel .ant-picker-body th,.ant-picker-calendar-full .ant-picker-panel .ant-picker-body td{padding:0}.ant-picker-calendar-full .ant-picker-panel .ant-picker-body th{height:auto;padding:0 12px 5px 0;line-height:18px}.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell:before{display:none}.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell:hover .ant-picker-calendar-date{background:#f5f5f5}.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell .ant-picker-calendar-date-today:before{display:none}.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date,.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date,.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date-today,.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date-today{background:#e6f7ff}.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date .ant-picker-calendar-date-value,.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date .ant-picker-calendar-date-value,.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date-today .ant-picker-calendar-date-value,.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date-today .ant-picker-calendar-date-value{color:#1890ff}.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date{display:block;width:auto;height:auto;margin:0 4px;padding:4px 8px 0;border:0;border-top:2px solid #f0f0f0;border-radius:0;transition:background .3s}.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-value{line-height:24px;transition:color .3s}.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-content{position:static;width:auto;height:86px;overflow-y:auto;color:#000000d9;line-height:1.5715;text-align:left}.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today{border-color:#1890ff}.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today .ant-picker-calendar-date-value{color:#000000d9}@media only screen and (max-width: 480px){.ant-picker-calendar-header{display:block}.ant-picker-calendar-header .ant-picker-calendar-year-select{width:50%}.ant-picker-calendar-header .ant-picker-calendar-month-select{width:calc(50% - 8px)}.ant-picker-calendar-header .ant-picker-calendar-mode-switch{width:100%;margin-top:8px;margin-left:0}.ant-picker-calendar-header .ant-picker-calendar-mode-switch>label{width:50%;text-align:center}}.ant-picker-calendar-rtl{direction:rtl}.ant-picker-calendar-rtl .ant-picker-calendar-header .ant-picker-calendar-month-select,.ant-picker-calendar-rtl .ant-picker-calendar-header .ant-picker-calendar-mode-switch{margin-right:8px;margin-left:0}.ant-picker-calendar-rtl.ant-picker-calendar-full .ant-picker-panel{text-align:left}.ant-picker-calendar-rtl.ant-picker-calendar-full .ant-picker-panel .ant-picker-body th{padding:0 0 5px 12px}.ant-picker-calendar-rtl.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-content{text-align:right}.ant-picker-status-error.ant-picker,.ant-picker-status-error.ant-picker:not([disabled]):hover{background-color:#fff;border-color:#ff4d4f}.ant-picker-status-error.ant-picker-focused,.ant-picker-status-error.ant-picker:focus{border-color:#ff7875;box-shadow:0 0 0 2px #ff4d4f33;border-right-width:1px;outline:0}.ant-picker-status-error.ant-picker .ant-picker-active-bar{background:#ff7875}.ant-picker-status-warning.ant-picker,.ant-picker-status-warning.ant-picker:not([disabled]):hover{background-color:#fff;border-color:#faad14}.ant-picker-status-warning.ant-picker-focused,.ant-picker-status-warning.ant-picker:focus{border-color:#ffc53d;box-shadow:0 0 0 2px #faad1433;border-right-width:1px;outline:0}.ant-picker-status-warning.ant-picker .ant-picker-active-bar{background:#ffc53d}.ant-picker{box-sizing:border-box;margin:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";padding:4px 11px;position:relative;display:inline-flex;align-items:center;background:#fff;border:1px solid #d9d9d9;border-radius:2px;transition:border .3s,box-shadow .3s}.ant-picker:hover,.ant-picker-focused{border-color:#40a9ff;border-right-width:1px}.ant-picker-focused{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-picker.ant-picker-disabled{background:#f5f5f5;border-color:#d9d9d9;cursor:not-allowed}.ant-picker.ant-picker-disabled .ant-picker-suffix{color:#00000040}.ant-picker.ant-picker-borderless{background-color:transparent!important;border-color:transparent!important;box-shadow:none!important}.ant-picker-input{position:relative;display:inline-flex;align-items:center;width:100%}.ant-picker-input>input{position:relative;display:inline-block;width:100%;min-width:0;color:#000000d9;font-size:14px;line-height:1.5715;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:2px;transition:all .3s;flex:auto;min-width:1px;height:auto;padding:0;background:transparent;border:0}.ant-picker-input>input::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-picker-input>input:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-picker-input>input::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-picker-input>input:-moz-placeholder-shown{text-overflow:ellipsis}.ant-picker-input>input:-ms-input-placeholder{text-overflow:ellipsis}.ant-picker-input>input:placeholder-shown{text-overflow:ellipsis}.ant-picker-input>input:hover{border-color:#40a9ff;border-right-width:1px}.ant-picker-input>input:focus,.ant-picker-input>input-focused{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-picker-input>input-disabled{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-picker-input>input-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-picker-input>input[disabled]{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-picker-input>input[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-picker-input>input-borderless,.ant-picker-input>input-borderless:hover,.ant-picker-input>input-borderless:focus,.ant-picker-input>input-borderless-focused,.ant-picker-input>input-borderless-disabled,.ant-picker-input>input-borderless[disabled]{background-color:transparent;border:none;box-shadow:none}textarea.ant-picker-input>input{max-width:100%;height:auto;min-height:32px;line-height:1.5715;vertical-align:bottom;transition:all .3s,height 0s}.ant-picker-input>input-lg{padding:6.5px 11px;font-size:16px}.ant-picker-input>input-sm{padding:0 7px}.ant-picker-input>input:focus{box-shadow:none}.ant-picker-input>input[disabled]{background:transparent}.ant-picker-input:hover .ant-picker-clear{opacity:1}.ant-picker-input-placeholder>input{color:#bfbfbf}.ant-picker-large{padding:6.5px 11px}.ant-picker-large .ant-picker-input>input{font-size:16px}.ant-picker-small{padding:0 7px}.ant-picker-suffix{display:flex;flex:none;align-self:center;margin-left:4px;color:#00000040;line-height:1;pointer-events:none}.ant-picker-suffix>*{vertical-align:top}.ant-picker-suffix>*:not(:last-child){margin-right:8px}.ant-picker-clear{position:absolute;top:50%;right:0;color:#00000040;line-height:1;background:#fff;transform:translateY(-50%);cursor:pointer;opacity:0;transition:opacity .3s,color .3s}.ant-picker-clear>*{vertical-align:top}.ant-picker-clear:hover{color:#00000073}.ant-picker-separator{position:relative;display:inline-block;width:1em;height:16px;color:#00000040;font-size:16px;vertical-align:top;cursor:default}.ant-picker-focused .ant-picker-separator{color:#00000073}.ant-picker-disabled .ant-picker-range-separator .ant-picker-separator{cursor:not-allowed}.ant-picker-range{position:relative;display:inline-flex}.ant-picker-range .ant-picker-clear{right:11px}.ant-picker-range:hover .ant-picker-clear{opacity:1}.ant-picker-range .ant-picker-active-bar{bottom:-1px;height:2px;margin-left:11px;background:#1890ff;opacity:0;transition:all .3s ease-out;pointer-events:none}.ant-picker-range.ant-picker-focused .ant-picker-active-bar{opacity:1}.ant-picker-range-separator{align-items:center;padding:0 8px;line-height:1}.ant-picker-range.ant-picker-small .ant-picker-clear{right:7px}.ant-picker-range.ant-picker-small .ant-picker-active-bar{margin-left:7px}.ant-picker-dropdown{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:absolute;top:-9999px;left:-9999px;z-index:1050}.ant-picker-dropdown-hidden{display:none}.ant-picker-dropdown-placement-bottomLeft .ant-picker-range-arrow{top:2.58561808px;display:block;transform:rotate(-135deg) translateY(1px)}.ant-picker-dropdown-placement-topLeft .ant-picker-range-arrow{bottom:2.58561808px;display:block;transform:rotate(45deg)}.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-topLeft,.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-topRight,.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-topLeft,.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-topRight{animation-name:antSlideDownIn}.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-bottomLeft,.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-bottomRight,.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-bottomLeft,.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-bottomRight{animation-name:antSlideUpIn}.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-topLeft,.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-topRight{animation-name:antSlideDownOut}.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-bottomLeft,.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-bottomRight{animation-name:antSlideUpOut}.ant-picker-dropdown-range{padding:7.54247233px 0}.ant-picker-dropdown-range-hidden{display:none}.ant-picker-dropdown .ant-picker-panel>.ant-picker-time-panel{padding-top:4px}.ant-picker-ranges{margin-bottom:0;padding:4px 12px;overflow:hidden;line-height:34px;text-align:left;list-style:none}.ant-picker-ranges>li{display:inline-block}.ant-picker-ranges .ant-picker-preset>.ant-tag-blue{color:#1890ff;background:#e6f7ff;border-color:#91d5ff;cursor:pointer}.ant-picker-ranges .ant-picker-ok{float:right;margin-left:8px}.ant-picker-range-wrapper{display:flex}.ant-picker-range-arrow{position:absolute;z-index:1;display:none;width:11.3137085px;height:11.3137085px;margin-left:16.5px;box-shadow:2px 2px 6px -2px #0000001a;transition:left .3s ease-out;border-radius:0 0 2px;pointer-events:none}.ant-picker-range-arrow:before{position:absolute;top:-11.3137085px;left:-11.3137085px;width:33.9411255px;height:33.9411255px;background:#fff;background-repeat:no-repeat;background-position:-10px -10px;content:"";-webkit-clip-path:inset(33% 33%);clip-path:inset(33% 33%);-webkit-clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z");clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z")}.ant-picker-panel-container{overflow:hidden;vertical-align:top;background:#fff;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d;transition:margin .3s}.ant-picker-panel-container .ant-picker-panels{display:inline-flex;flex-wrap:nowrap;direction:ltr}.ant-picker-panel-container .ant-picker-panel{vertical-align:top;background:transparent;border-width:0 0 1px 0;border-radius:0}.ant-picker-panel-container .ant-picker-panel .ant-picker-content,.ant-picker-panel-container .ant-picker-panel table{text-align:center}.ant-picker-panel-container .ant-picker-panel-focused{border-color:#f0f0f0}.ant-picker-compact-item:not(.ant-picker-compact-last-item):not(.ant-picker-compact-item-rtl){margin-right:-1px}.ant-picker-compact-item:not(.ant-picker-compact-last-item).ant-picker-compact-item-rtl{margin-left:-1px}.ant-picker-compact-item:hover,.ant-picker-compact-item:focus,.ant-picker-compact-item:active{z-index:2}.ant-picker-compact-item.ant-picker-focused{z-index:2}.ant-picker-compact-item[disabled]{z-index:0}.ant-picker-compact-item:not(.ant-picker-compact-first-item):not(.ant-picker-compact-last-item).ant-picker{border-radius:0}.ant-picker-compact-item.ant-picker.ant-picker-compact-first-item:not(.ant-picker-compact-last-item):not(.ant-picker-compact-item-rtl){border-top-right-radius:0;border-bottom-right-radius:0}.ant-picker-compact-item.ant-picker.ant-picker-compact-last-item:not(.ant-picker-compact-first-item):not(.ant-picker-compact-item-rtl){border-top-left-radius:0;border-bottom-left-radius:0}.ant-picker-compact-item.ant-picker.ant-picker-compact-item-rtl.ant-picker-compact-first-item:not(.ant-picker-compact-last-item){border-top-left-radius:0;border-bottom-left-radius:0}.ant-picker-compact-item.ant-picker.ant-picker-compact-item-rtl.ant-picker-compact-last-item:not(.ant-picker-compact-first-item){border-top-right-radius:0;border-bottom-right-radius:0}.ant-picker-panel{display:inline-flex;flex-direction:column;text-align:center;background:#fff;border:1px solid #f0f0f0;border-radius:2px;outline:none}.ant-picker-panel-focused{border-color:#1890ff}.ant-picker-decade-panel,.ant-picker-year-panel,.ant-picker-quarter-panel,.ant-picker-month-panel,.ant-picker-week-panel,.ant-picker-date-panel,.ant-picker-time-panel{display:flex;flex-direction:column;width:280px}.ant-picker-header{display:flex;padding:0 8px;color:#000000d9;border-bottom:1px solid #f0f0f0}.ant-picker-header>*{flex:none}.ant-picker-header button{padding:0;color:#00000040;line-height:40px;background:transparent;border:0;cursor:pointer;transition:color .3s}.ant-picker-header>button{min-width:1.6em;font-size:14px}.ant-picker-header>button:hover{color:#000000d9}.ant-picker-header-view{flex:auto;font-weight:500;line-height:40px}.ant-picker-header-view button{color:inherit;font-weight:inherit}.ant-picker-header-view button:not(:first-child){margin-left:8px}.ant-picker-header-view button:hover{color:#1890ff}.ant-picker-prev-icon,.ant-picker-next-icon,.ant-picker-super-prev-icon,.ant-picker-super-next-icon{position:relative;display:inline-block;width:7px;height:7px}.ant-picker-prev-icon:before,.ant-picker-next-icon:before,.ant-picker-super-prev-icon:before,.ant-picker-super-next-icon:before{position:absolute;top:0;left:0;display:inline-block;width:7px;height:7px;border:0 solid currentcolor;border-width:1.5px 0 0 1.5px;content:""}.ant-picker-super-prev-icon:after,.ant-picker-super-next-icon:after{position:absolute;top:4px;left:4px;display:inline-block;width:7px;height:7px;border:0 solid currentcolor;border-width:1.5px 0 0 1.5px;content:""}.ant-picker-prev-icon,.ant-picker-super-prev-icon{transform:rotate(-45deg)}.ant-picker-next-icon,.ant-picker-super-next-icon{transform:rotate(135deg)}.ant-picker-content{width:100%;table-layout:fixed;border-collapse:collapse}.ant-picker-content th,.ant-picker-content td{position:relative;min-width:24px;font-weight:400}.ant-picker-content th{height:30px;color:#000000d9;line-height:30px}.ant-picker-cell{padding:3px 0;color:#00000040;cursor:pointer}.ant-picker-cell-in-view{color:#000000d9}.ant-picker-cell:before{position:absolute;top:50%;right:0;left:0;z-index:1;height:24px;transform:translateY(-50%);transition:all .3s;content:""}.ant-picker-cell:hover:not(.ant-picker-cell-in-view) .ant-picker-cell-inner,.ant-picker-cell:hover:not(.ant-picker-cell-selected):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end):not(.ant-picker-cell-range-hover-start):not(.ant-picker-cell-range-hover-end) .ant-picker-cell-inner{background:#f5f5f5}.ant-picker-cell-in-view.ant-picker-cell-today .ant-picker-cell-inner:before{position:absolute;inset:0;z-index:1;border:1px solid #1890ff;border-radius:2px;content:""}.ant-picker-cell-in-view.ant-picker-cell-in-range{position:relative}.ant-picker-cell-in-view.ant-picker-cell-in-range:before{background:#e6f7ff}.ant-picker-cell-in-view.ant-picker-cell-selected .ant-picker-cell-inner,.ant-picker-cell-in-view.ant-picker-cell-range-start .ant-picker-cell-inner,.ant-picker-cell-in-view.ant-picker-cell-range-end .ant-picker-cell-inner{color:#fff;background:#1890ff}.ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single):before,.ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single):before{background:#e6f7ff}.ant-picker-cell-in-view.ant-picker-cell-range-start:before{left:50%}.ant-picker-cell-in-view.ant-picker-cell-range-end:before{right:50%}.ant-picker-cell-in-view.ant-picker-cell-range-hover-start:not(.ant-picker-cell-in-range):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end):after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-end:not(.ant-picker-cell-in-range):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end):after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-start.ant-picker-cell-range-start-single:after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-start.ant-picker-cell-range-start.ant-picker-cell-range-end.ant-picker-cell-range-end-near-hover:after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-end.ant-picker-cell-range-start.ant-picker-cell-range-end.ant-picker-cell-range-start-near-hover:after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-end.ant-picker-cell-range-end-single:after,.ant-picker-cell-in-view.ant-picker-cell-range-hover:not(.ant-picker-cell-in-range):after{position:absolute;top:50%;z-index:0;height:24px;border-top:1px dashed #7ec1ff;border-bottom:1px dashed #7ec1ff;transform:translateY(-50%);transition:all .3s;content:""}.ant-picker-cell-range-hover-start:after,.ant-picker-cell-range-hover-end:after,.ant-picker-cell-range-hover:after{right:0;left:2px}.ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover:before,.ant-picker-cell-in-view.ant-picker-cell-range-start.ant-picker-cell-range-hover:before,.ant-picker-cell-in-view.ant-picker-cell-range-end.ant-picker-cell-range-hover:before,.ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single).ant-picker-cell-range-hover-start:before,.ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single).ant-picker-cell-range-hover-end:before,.ant-picker-panel>:not(.ant-picker-date-panel) .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start:before,.ant-picker-panel>:not(.ant-picker-date-panel) .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end:before{background:#cbe6ff}.ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single):not(.ant-picker-cell-range-end) .ant-picker-cell-inner{border-radius:2px 0 0 2px}.ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single):not(.ant-picker-cell-range-start) .ant-picker-cell-inner{border-radius:0 2px 2px 0}.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start .ant-picker-cell-inner:after,.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end .ant-picker-cell-inner:after{position:absolute;top:0;bottom:0;z-index:-1;background:#cbe6ff;transition:all .3s;content:""}.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start .ant-picker-cell-inner:after{right:-6px;left:0}.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end .ant-picker-cell-inner:after{right:0;left:-6px}.ant-picker-cell-range-hover.ant-picker-cell-range-start:after{right:50%}.ant-picker-cell-range-hover.ant-picker-cell-range-end:after{left:50%}tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover:first-child:after,tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover-end:first-child:after,.ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-edge-start.ant-picker-cell-range-hover-edge-start-near-range:after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover-edge-start-near-range):after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-start:after{left:6px;border-left:1px dashed #7ec1ff;border-top-left-radius:2px;border-bottom-left-radius:2px}tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover:last-child:after,tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child:after,.ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover-edge-end.ant-picker-cell-range-hover-edge-end-near-range:after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-end:not(.ant-picker-cell-range-hover-edge-end-near-range):after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-end:after{right:6px;border-right:1px dashed #7ec1ff;border-top-right-radius:2px;border-bottom-right-radius:2px}.ant-picker-cell-disabled{color:#00000040;pointer-events:none}.ant-picker-cell-disabled .ant-picker-cell-inner{background:transparent}.ant-picker-cell-disabled:before{background:rgba(0,0,0,.04)}.ant-picker-cell-disabled.ant-picker-cell-today .ant-picker-cell-inner:before{border-color:#00000040}.ant-picker-decade-panel .ant-picker-content,.ant-picker-year-panel .ant-picker-content,.ant-picker-quarter-panel .ant-picker-content,.ant-picker-month-panel .ant-picker-content{height:264px}.ant-picker-decade-panel .ant-picker-cell-inner,.ant-picker-year-panel .ant-picker-cell-inner,.ant-picker-quarter-panel .ant-picker-cell-inner,.ant-picker-month-panel .ant-picker-cell-inner{padding:0 8px}.ant-picker-quarter-panel .ant-picker-content{height:56px}.ant-picker-footer{width:-moz-min-content;width:min-content;min-width:100%;line-height:38px;text-align:center;border-bottom:1px solid transparent}.ant-picker-panel .ant-picker-footer{border-top:1px solid #f0f0f0}.ant-picker-footer-extra{padding:0 12px;line-height:38px;text-align:left}.ant-picker-footer-extra:not(:last-child){border-bottom:1px solid #f0f0f0}.ant-picker-now{text-align:left}.ant-picker-today-btn{color:#1890ff}.ant-picker-today-btn:hover{color:#40a9ff}.ant-picker-today-btn:active{color:#096dd9}.ant-picker-today-btn.ant-picker-today-btn-disabled{color:#00000040;cursor:not-allowed}.ant-picker-decade-panel .ant-picker-cell-inner{padding:0 4px}.ant-picker-decade-panel .ant-picker-cell:before{display:none}.ant-picker-year-panel .ant-picker-body,.ant-picker-quarter-panel .ant-picker-body,.ant-picker-month-panel .ant-picker-body{padding:0 8px}.ant-picker-year-panel .ant-picker-cell-inner,.ant-picker-quarter-panel .ant-picker-cell-inner,.ant-picker-month-panel .ant-picker-cell-inner{width:60px}.ant-picker-year-panel .ant-picker-cell-range-hover-start:after,.ant-picker-quarter-panel .ant-picker-cell-range-hover-start:after,.ant-picker-month-panel .ant-picker-cell-range-hover-start:after{left:14px;border-left:1px dashed #7ec1ff;border-radius:2px 0 0 2px}.ant-picker-panel-rtl .ant-picker-year-panel .ant-picker-cell-range-hover-start:after,.ant-picker-panel-rtl .ant-picker-quarter-panel .ant-picker-cell-range-hover-start:after,.ant-picker-panel-rtl .ant-picker-month-panel .ant-picker-cell-range-hover-start:after{right:14px;border-right:1px dashed #7ec1ff;border-radius:0 2px 2px 0}.ant-picker-year-panel .ant-picker-cell-range-hover-end:after,.ant-picker-quarter-panel .ant-picker-cell-range-hover-end:after,.ant-picker-month-panel .ant-picker-cell-range-hover-end:after{right:14px;border-right:1px dashed #7ec1ff;border-radius:0 2px 2px 0}.ant-picker-panel-rtl .ant-picker-year-panel .ant-picker-cell-range-hover-end:after,.ant-picker-panel-rtl .ant-picker-quarter-panel .ant-picker-cell-range-hover-end:after,.ant-picker-panel-rtl .ant-picker-month-panel .ant-picker-cell-range-hover-end:after{left:14px;border-left:1px dashed #7ec1ff;border-radius:2px 0 0 2px}.ant-picker-week-panel .ant-picker-body{padding:8px 12px}.ant-picker-week-panel .ant-picker-cell:hover .ant-picker-cell-inner,.ant-picker-week-panel .ant-picker-cell-selected .ant-picker-cell-inner,.ant-picker-week-panel .ant-picker-cell .ant-picker-cell-inner{background:transparent!important}.ant-picker-week-panel-row td{transition:background .3s}.ant-picker-week-panel-row:hover td{background:#f5f5f5}.ant-picker-week-panel-row-selected td,.ant-picker-week-panel-row-selected:hover td{background:#1890ff}.ant-picker-week-panel-row-selected td.ant-picker-cell-week,.ant-picker-week-panel-row-selected:hover td.ant-picker-cell-week{color:#ffffff80}.ant-picker-week-panel-row-selected td.ant-picker-cell-today .ant-picker-cell-inner:before,.ant-picker-week-panel-row-selected:hover td.ant-picker-cell-today .ant-picker-cell-inner:before{border-color:#fff}.ant-picker-week-panel-row-selected td .ant-picker-cell-inner,.ant-picker-week-panel-row-selected:hover td .ant-picker-cell-inner{color:#fff}.ant-picker-date-panel .ant-picker-body{padding:8px 12px}.ant-picker-date-panel .ant-picker-content{width:252px}.ant-picker-date-panel .ant-picker-content th{width:36px}.ant-picker-datetime-panel{display:flex}.ant-picker-datetime-panel .ant-picker-time-panel{border-left:1px solid #f0f0f0}.ant-picker-datetime-panel .ant-picker-date-panel,.ant-picker-datetime-panel .ant-picker-time-panel{transition:opacity .3s}.ant-picker-datetime-panel-active .ant-picker-date-panel,.ant-picker-datetime-panel-active .ant-picker-time-panel{opacity:.3}.ant-picker-datetime-panel-active .ant-picker-date-panel-active,.ant-picker-datetime-panel-active .ant-picker-time-panel-active{opacity:1}.ant-picker-time-panel{width:auto;min-width:auto}.ant-picker-time-panel .ant-picker-content{display:flex;flex:auto;height:224px}.ant-picker-time-panel-column{flex:1 0 auto;width:56px;margin:0;padding:0;overflow-y:hidden;text-align:left;list-style:none;transition:background .3s}.ant-picker-time-panel-column:after{display:block;height:196px;content:""}.ant-picker-datetime-panel .ant-picker-time-panel-column:after{height:198px}.ant-picker-time-panel-column:not(:first-child){border-left:1px solid #f0f0f0}.ant-picker-time-panel-column-active{background:rgba(230,247,255,.2)}.ant-picker-time-panel-column:hover{overflow-y:auto}.ant-picker-time-panel-column>li{margin:0;padding:0}.ant-picker-time-panel-column>li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner{display:block;width:100%;height:28px;margin:0;padding:0 0 0 14px;color:#000000d9;line-height:28px;border-radius:0;cursor:pointer;transition:background .3s}.ant-picker-time-panel-column>li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner:hover{background:#f5f5f5}.ant-picker-time-panel-column>li.ant-picker-time-panel-cell-selected .ant-picker-time-panel-cell-inner{background:#e6f7ff}.ant-picker-time-panel-column>li.ant-picker-time-panel-cell-disabled .ant-picker-time-panel-cell-inner{color:#00000040;background:transparent;cursor:not-allowed}_:-ms-fullscreen .ant-picker-range-wrapper .ant-picker-month-panel .ant-picker-cell,:root .ant-picker-range-wrapper .ant-picker-month-panel .ant-picker-cell,_:-ms-fullscreen .ant-picker-range-wrapper .ant-picker-year-panel .ant-picker-cell,:root .ant-picker-range-wrapper .ant-picker-year-panel .ant-picker-cell{padding:21px 0}.ant-picker-rtl{direction:rtl}.ant-picker-rtl .ant-picker-suffix{margin-right:4px;margin-left:0}.ant-picker-rtl .ant-picker-clear{right:auto;left:0}.ant-picker-rtl .ant-picker-separator{transform:rotate(180deg)}.ant-picker-panel-rtl .ant-picker-header-view button:not(:first-child){margin-right:8px;margin-left:0}.ant-picker-rtl.ant-picker-range .ant-picker-clear{right:auto;left:11px}.ant-picker-rtl.ant-picker-range .ant-picker-active-bar{margin-right:11px;margin-left:0}.ant-picker-rtl.ant-picker-range.ant-picker-small .ant-picker-active-bar{margin-right:7px}.ant-picker-dropdown-rtl .ant-picker-ranges{text-align:right}.ant-picker-dropdown-rtl .ant-picker-ranges .ant-picker-ok{float:left;margin-right:8px;margin-left:0}.ant-picker-panel-rtl{direction:rtl}.ant-picker-panel-rtl .ant-picker-prev-icon,.ant-picker-panel-rtl .ant-picker-super-prev-icon{transform:rotate(135deg)}.ant-picker-panel-rtl .ant-picker-next-icon,.ant-picker-panel-rtl .ant-picker-super-next-icon{transform:rotate(-45deg)}.ant-picker-cell .ant-picker-cell-inner{position:relative;z-index:2;display:inline-block;min-width:24px;height:24px;line-height:24px;border-radius:2px;transition:background .3s,border .3s}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-start:before{right:50%;left:0}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-end:before{right:0;left:50%}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-start.ant-picker-cell-range-end:before{right:50%;left:50%}.ant-picker-panel-rtl .ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start .ant-picker-cell-inner:after{right:0;left:-6px}.ant-picker-panel-rtl .ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end .ant-picker-cell-inner:after{right:-6px;left:0}.ant-picker-panel-rtl .ant-picker-cell-range-hover.ant-picker-cell-range-start:after{right:0;left:50%}.ant-picker-panel-rtl .ant-picker-cell-range-hover.ant-picker-cell-range-end:after{right:50%;left:0}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single):not(.ant-picker-cell-range-end) .ant-picker-cell-inner{border-radius:0 2px 2px 0}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single):not(.ant-picker-cell-range-start) .ant-picker-cell-inner{border-radius:2px 0 0 2px}.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover:not(.ant-picker-cell-selected):first-child:after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-edge-start.ant-picker-cell-range-hover-edge-start-near-range:after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover-edge-start-near-range):after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:after{right:6px;left:0;border-right:1px dashed #7ec1ff;border-left:none;border-radius:0 2px 2px 0}.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover:not(.ant-picker-cell-selected):last-child:after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover-edge-end.ant-picker-cell-range-hover-edge-end-near-range:after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-end:not(.ant-picker-cell-range-hover-edge-end-near-range):after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-end:after{right:0;left:6px;border-right:none;border-left:1px dashed #7ec1ff;border-radius:2px 0 0 2px}.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child:after,.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover-end:first-child:after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover):after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-end.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover):after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover-start.ant-picker-cell-range-hover-edge-end:not(.ant-picker-cell-range-hover):after,.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover.ant-picker-cell-range-hover-edge-start:last-child:after,.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover.ant-picker-cell-range-hover-edge-end:first-child:after{right:6px;left:6px;border-right:1px dashed #7ec1ff;border-left:1px dashed #7ec1ff;border-radius:2px}.ant-picker-dropdown-rtl .ant-picker-footer-extra{direction:rtl;text-align:right}.ant-picker-panel-rtl .ant-picker-time-panel{direction:ltr}.ant-tag{box-sizing:border-box;margin:0 8px 0 0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-block;height:auto;padding:0 7px;font-size:12px;line-height:20px;white-space:nowrap;background:#fafafa;border:1px solid #d9d9d9;border-radius:2px;opacity:1;transition:all .3s}.ant-tag,.ant-tag a,.ant-tag a:hover{color:#000000d9}.ant-tag>a:first-child:last-child{display:inline-block;margin:0 -8px;padding:0 8px}.ant-tag-close-icon{margin-left:3px;color:#00000073;font-size:10px;cursor:pointer;transition:all .3s}.ant-tag-close-icon:hover{color:#000000d9}.ant-tag-has-color{border-color:transparent}.ant-tag-has-color,.ant-tag-has-color a,.ant-tag-has-color a:hover,.ant-tag-has-color .anticon-close,.ant-tag-has-color .anticon-close:hover{color:#fff}.ant-tag-checkable{background-color:transparent;border-color:transparent;cursor:pointer}.ant-tag-checkable:not(.ant-tag-checkable-checked):hover{color:#1890ff}.ant-tag-checkable:active,.ant-tag-checkable-checked{color:#fff}.ant-tag-checkable-checked{background-color:#1890ff}.ant-tag-checkable:active{background-color:#096dd9}.ant-tag-hidden{display:none}.ant-tag-pink{color:#c41d7f;background:#fff0f6;border-color:#ffadd2}.ant-tag-pink-inverse{color:#fff;background:#eb2f96;border-color:#eb2f96}.ant-tag-magenta{color:#c41d7f;background:#fff0f6;border-color:#ffadd2}.ant-tag-magenta-inverse{color:#fff;background:#eb2f96;border-color:#eb2f96}.ant-tag-red{color:#cf1322;background:#fff1f0;border-color:#ffa39e}.ant-tag-red-inverse{color:#fff;background:#f5222d;border-color:#f5222d}.ant-tag-volcano{color:#d4380d;background:#fff2e8;border-color:#ffbb96}.ant-tag-volcano-inverse{color:#fff;background:#fa541c;border-color:#fa541c}.ant-tag-orange{color:#d46b08;background:#fff7e6;border-color:#ffd591}.ant-tag-orange-inverse{color:#fff;background:#fa8c16;border-color:#fa8c16}.ant-tag-yellow{color:#d4b106;background:#feffe6;border-color:#fffb8f}.ant-tag-yellow-inverse{color:#fff;background:#fadb14;border-color:#fadb14}.ant-tag-gold{color:#d48806;background:#fffbe6;border-color:#ffe58f}.ant-tag-gold-inverse{color:#fff;background:#faad14;border-color:#faad14}.ant-tag-cyan{color:#08979c;background:#e6fffb;border-color:#87e8de}.ant-tag-cyan-inverse{color:#fff;background:#13c2c2;border-color:#13c2c2}.ant-tag-lime{color:#7cb305;background:#fcffe6;border-color:#eaff8f}.ant-tag-lime-inverse{color:#fff;background:#a0d911;border-color:#a0d911}.ant-tag-green{color:#389e0d;background:#f6ffed;border-color:#b7eb8f}.ant-tag-green-inverse{color:#fff;background:#52c41a;border-color:#52c41a}.ant-tag-blue{color:#096dd9;background:#e6f7ff;border-color:#91d5ff}.ant-tag-blue-inverse{color:#fff;background:#1890ff;border-color:#1890ff}.ant-tag-geekblue{color:#1d39c4;background:#f0f5ff;border-color:#adc6ff}.ant-tag-geekblue-inverse{color:#fff;background:#2f54eb;border-color:#2f54eb}.ant-tag-purple{color:#531dab;background:#f9f0ff;border-color:#d3adf7}.ant-tag-purple-inverse{color:#fff;background:#722ed1;border-color:#722ed1}.ant-tag-success{color:#52c41a;background:#f6ffed;border-color:#b7eb8f}.ant-tag-processing{color:#1890ff;background:#e6f7ff;border-color:#91d5ff}.ant-tag-error{color:#ff4d4f;background:#fff2f0;border-color:#ffccc7}.ant-tag-warning{color:#faad14;background:#fffbe6;border-color:#ffe58f}.ant-tag>.anticon+span,.ant-tag>span+.anticon{margin-left:7px}.ant-tag.ant-tag-rtl{margin-right:0;margin-left:8px;direction:rtl;text-align:right}.ant-tag-rtl .ant-tag-close-icon{margin-right:3px;margin-left:0}.ant-tag-rtl.ant-tag>.anticon+span,.ant-tag-rtl.ant-tag>span+.anticon{margin-right:7px;margin-left:0}.ant-radio-group{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-block;font-size:0}.ant-radio-group .ant-badge-count{z-index:1}.ant-radio-group>.ant-badge:not(:first-child)>.ant-radio-button-wrapper{border-left:none}.ant-radio-wrapper{box-sizing:border-box;margin:0 8px 0 0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;display:inline-flex;align-items:baseline;cursor:pointer}.ant-radio-wrapper-disabled{cursor:not-allowed}.ant-radio-wrapper:after{display:inline-block;width:0;overflow:hidden;content:"\\a0"}.ant-radio-wrapper.ant-radio-wrapper-in-form-item input[type=radio]{width:14px;height:14px}.ant-radio{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;top:.2em;display:inline-block;outline:none;cursor:pointer}.ant-radio-wrapper:hover .ant-radio,.ant-radio:hover .ant-radio-inner,.ant-radio-input:focus+.ant-radio-inner{border-color:#1890ff}.ant-radio-input:focus+.ant-radio-inner{box-shadow:0 0 0 3px #1890ff1f}.ant-radio-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid #1890ff;border-radius:50%;visibility:hidden;animation:antRadioEffect .36s ease-in-out;animation-fill-mode:both;content:""}.ant-radio:hover:after,.ant-radio-wrapper:hover .ant-radio:after{visibility:visible}.ant-radio-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;background-color:#fff;border-color:#d9d9d9;border-style:solid;border-width:1px;border-radius:50%;transition:all .3s}.ant-radio-inner:after{position:absolute;top:50%;left:50%;display:block;width:16px;height:16px;margin-top:-8px;margin-left:-8px;background-color:#1890ff;border-top:0;border-left:0;border-radius:16px;transform:scale(0);opacity:0;transition:all .3s cubic-bezier(.78,.14,.15,.86);content:" "}.ant-radio-input{position:absolute;inset:0;z-index:1;cursor:pointer;opacity:0}.ant-radio.ant-radio-disabled .ant-radio-inner{border-color:#d9d9d9}.ant-radio-checked .ant-radio-inner{border-color:#1890ff}.ant-radio-checked .ant-radio-inner:after{transform:scale(.5);opacity:1;transition:all .3s cubic-bezier(.78,.14,.15,.86)}.ant-radio-disabled{cursor:not-allowed}.ant-radio-disabled .ant-radio-inner{background-color:#f5f5f5;cursor:not-allowed}.ant-radio-disabled .ant-radio-inner:after{background-color:#0003}.ant-radio-disabled .ant-radio-input{cursor:not-allowed}.ant-radio-disabled+span{color:#00000040;cursor:not-allowed}span.ant-radio+*{padding-right:8px;padding-left:8px}.ant-radio-button-wrapper{position:relative;display:inline-block;height:32px;margin:0;padding:0 15px;color:#000000d9;font-size:14px;line-height:30px;background:#fff;border:1px solid #d9d9d9;border-top-width:1.02px;border-left-width:0;cursor:pointer;transition:color .3s,background .3s,border-color .3s,box-shadow .3s}.ant-radio-button-wrapper a{color:#000000d9}.ant-radio-button-wrapper>.ant-radio-button{position:absolute;top:0;left:0;z-index:-1;width:100%;height:100%}.ant-radio-group-large .ant-radio-button-wrapper{height:40px;font-size:16px;line-height:38px}.ant-radio-group-small .ant-radio-button-wrapper{height:24px;padding:0 7px;line-height:22px}.ant-radio-button-wrapper:not(:first-child):before{position:absolute;top:-1px;left:-1px;display:block;box-sizing:content-box;width:1px;height:100%;padding:1px 0;background-color:#d9d9d9;transition:background-color .3s;content:""}.ant-radio-button-wrapper:first-child{border-left:1px solid #d9d9d9;border-radius:2px 0 0 2px}.ant-radio-button-wrapper:last-child{border-radius:0 2px 2px 0}.ant-radio-button-wrapper:first-child:last-child{border-radius:2px}.ant-radio-button-wrapper:hover{position:relative;color:#1890ff}.ant-radio-button-wrapper:focus-within{box-shadow:0 0 0 3px #1890ff1f}.ant-radio-button-wrapper .ant-radio-inner,.ant-radio-button-wrapper input[type=checkbox],.ant-radio-button-wrapper input[type=radio]{width:0;height:0;opacity:0;pointer-events:none}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled){z-index:1;color:#1890ff;background:#fff;border-color:#1890ff}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):before{background-color:#1890ff}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):first-child{border-color:#1890ff}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover{color:#40a9ff;border-color:#40a9ff}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover:before{background-color:#40a9ff}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active{color:#096dd9;border-color:#096dd9}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active:before{background-color:#096dd9}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):focus-within{box-shadow:0 0 0 3px #1890ff1f}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled){color:#fff;background:#1890ff;border-color:#1890ff}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover{color:#fff;background:#40a9ff;border-color:#40a9ff}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active{color:#fff;background:#096dd9;border-color:#096dd9}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):focus-within{box-shadow:0 0 0 3px #1890ff1f}.ant-radio-button-wrapper-disabled{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;cursor:not-allowed}.ant-radio-button-wrapper-disabled:first-child,.ant-radio-button-wrapper-disabled:hover{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9}.ant-radio-button-wrapper-disabled:first-child{border-left-color:#d9d9d9}.ant-radio-button-wrapper-disabled.ant-radio-button-wrapper-checked{color:#00000040;background-color:#e6e6e6;border-color:#d9d9d9;box-shadow:none}@keyframes antRadioEffect{0%{transform:scale(1);opacity:.5}to{transform:scale(1.6);opacity:0}}.ant-radio-group.ant-radio-group-rtl{direction:rtl}.ant-radio-wrapper.ant-radio-wrapper-rtl{margin-right:0;margin-left:8px;direction:rtl}.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl{border-right-width:0;border-left-width:1px}.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper:not(:first-child):before{right:-1px;left:0}.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper:first-child{border-right:1px solid #d9d9d9;border-radius:0 2px 2px 0}.ant-radio-button-wrapper-checked:not([class*=" ant-radio-button-wrapper-disabled"]).ant-radio-button-wrapper:first-child{border-right-color:#40a9ff}.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper:last-child{border-radius:2px 0 0 2px}.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper-disabled:first-child{border-right-color:#d9d9d9}.ant-card{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;background:#fff;border-radius:2px}.ant-card-rtl{direction:rtl}.ant-card-hoverable{cursor:pointer;transition:box-shadow .3s,border-color .3s}.ant-card-hoverable:hover{border-color:transparent;box-shadow:0 1px 2px -2px #00000029,0 3px 6px #0000001f,0 5px 12px 4px #00000017}.ant-card-bordered{border:1px solid #f0f0f0}.ant-card-head{min-height:48px;margin-bottom:-1px;padding:0 24px;color:#000000d9;font-weight:500;font-size:16px;background:transparent;border-bottom:1px solid #f0f0f0;border-radius:2px 2px 0 0}.ant-card-head:before{display:table;content:""}.ant-card-head:after{display:table;clear:both;content:""}.ant-card-head-wrapper{display:flex;align-items:center}.ant-card-head-title{display:inline-block;flex:1;padding:16px 0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-card-head-title>.ant-typography,.ant-card-head-title>.ant-typography-edit-content{left:0;margin-top:0;margin-bottom:0}.ant-card-head .ant-tabs-top{clear:both;margin-bottom:-17px;color:#000000d9;font-weight:400;font-size:14px}.ant-card-head .ant-tabs-top-bar{border-bottom:1px solid #f0f0f0}.ant-card-extra{margin-left:auto;padding:16px 0;color:#000000d9;font-weight:400;font-size:14px}.ant-card-rtl .ant-card-extra{margin-right:auto;margin-left:0}.ant-card-body{padding:24px}.ant-card-body:before{display:table;content:""}.ant-card-body:after{display:table;clear:both;content:""}.ant-card-contain-grid .ant-card-body{display:flex;flex-wrap:wrap}.ant-card-contain-grid:not(.ant-card-loading) .ant-card-body{margin:-1px 0 0 -1px;padding:0}.ant-card-grid{width:33.33%;padding:24px;border:0;border-radius:0;box-shadow:1px 0 #f0f0f0,0 1px #f0f0f0,1px 1px #f0f0f0,1px 0 #f0f0f0 inset,0 1px #f0f0f0 inset;transition:all .3s}.ant-card-grid-hoverable:hover{position:relative;z-index:1;box-shadow:0 1px 2px -2px #00000029,0 3px 6px #0000001f,0 5px 12px 4px #00000017}.ant-card-contain-tabs>.ant-card-head .ant-card-head-title{min-height:32px;padding-bottom:0}.ant-card-contain-tabs>.ant-card-head .ant-card-extra{padding-bottom:0}.ant-card-bordered .ant-card-cover{margin-top:-1px;margin-right:-1px;margin-left:-1px}.ant-card-cover>*{display:block;width:100%}.ant-card-cover img{border-radius:2px 2px 0 0}.ant-card-actions{display:flex;margin:0;padding:0;list-style:none;background:#fff;border-top:1px solid #f0f0f0}.ant-card-actions:before{display:table;content:""}.ant-card-actions:after{display:table;clear:both;content:""}.ant-card-actions>li{margin:12px 0;color:#00000073;text-align:center}.ant-card-actions>li>span{position:relative;display:block;min-width:32px;font-size:14px;line-height:1.5715;cursor:pointer}.ant-card-actions>li>span:hover{color:#1890ff;transition:color .3s}.ant-card-actions>li>span a:not(.ant-btn),.ant-card-actions>li>span>.anticon{display:inline-block;width:100%;color:#00000073;line-height:22px;transition:color .3s}.ant-card-actions>li>span a:not(.ant-btn):hover,.ant-card-actions>li>span>.anticon:hover{color:#1890ff}.ant-card-actions>li>span>.anticon{font-size:16px;line-height:22px}.ant-card-actions>li:not(:last-child){border-right:1px solid #f0f0f0}.ant-card-rtl .ant-card-actions>li:not(:last-child){border-right:none;border-left:1px solid #f0f0f0}.ant-card-type-inner .ant-card-head{padding:0 24px;background:#fafafa}.ant-card-type-inner .ant-card-head-title{padding:12px 0;font-size:14px}.ant-card-type-inner .ant-card-body{padding:16px 24px}.ant-card-type-inner .ant-card-extra{padding:13.5px 0}.ant-card-meta{display:flex;margin:-4px 0}.ant-card-meta:before{display:table;content:""}.ant-card-meta:after{display:table;clear:both;content:""}.ant-card-meta-avatar{padding-right:16px}.ant-card-rtl .ant-card-meta-avatar{padding-right:0;padding-left:16px}.ant-card-meta-detail{flex:1;overflow:hidden}.ant-card-meta-detail>div:not(:last-child){margin-bottom:8px}.ant-card-meta-title{overflow:hidden;color:#000000d9;font-weight:500;font-size:16px;white-space:nowrap;text-overflow:ellipsis}.ant-card-meta-description{color:#00000073}.ant-card-loading{overflow:hidden}.ant-card-loading .ant-card-body{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-card-small>.ant-card-head{min-height:36px;padding:0 12px;font-size:14px}.ant-card-small>.ant-card-head>.ant-card-head-wrapper>.ant-card-head-title{padding:8px 0}.ant-card-small>.ant-card-head>.ant-card-head-wrapper>.ant-card-extra{padding:8px 0;font-size:14px}.ant-card-small>.ant-card-body{padding:12px}.ant-skeleton{display:table;width:100%}.ant-skeleton-header{display:table-cell;padding-right:16px;vertical-align:top}.ant-skeleton-header .ant-skeleton-avatar{display:inline-block;vertical-align:top;background:rgba(190,190,190,.2);width:32px;height:32px;line-height:32px}.ant-skeleton-header .ant-skeleton-avatar.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-header .ant-skeleton-avatar-lg{width:40px;height:40px;line-height:40px}.ant-skeleton-header .ant-skeleton-avatar-lg.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-header .ant-skeleton-avatar-sm{width:24px;height:24px;line-height:24px}.ant-skeleton-header .ant-skeleton-avatar-sm.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-content{display:table-cell;width:100%;vertical-align:top}.ant-skeleton-content .ant-skeleton-title{width:100%;height:16px;background:rgba(190,190,190,.2);border-radius:2px}.ant-skeleton-content .ant-skeleton-title+.ant-skeleton-paragraph{margin-top:24px}.ant-skeleton-content .ant-skeleton-paragraph{padding:0}.ant-skeleton-content .ant-skeleton-paragraph>li{width:100%;height:16px;list-style:none;background:rgba(190,190,190,.2);border-radius:2px}.ant-skeleton-content .ant-skeleton-paragraph>li:last-child:not(:first-child):not(:nth-child(2)){width:61%}.ant-skeleton-content .ant-skeleton-paragraph>li+li{margin-top:16px}.ant-skeleton-with-avatar .ant-skeleton-content .ant-skeleton-title{margin-top:12px}.ant-skeleton-with-avatar .ant-skeleton-content .ant-skeleton-title+.ant-skeleton-paragraph{margin-top:28px}.ant-skeleton-round .ant-skeleton-content .ant-skeleton-title,.ant-skeleton-round .ant-skeleton-content .ant-skeleton-paragraph>li{border-radius:100px}.ant-skeleton-active .ant-skeleton-title,.ant-skeleton-active .ant-skeleton-paragraph>li,.ant-skeleton-active .ant-skeleton-avatar,.ant-skeleton-active .ant-skeleton-button,.ant-skeleton-active .ant-skeleton-input,.ant-skeleton-active .ant-skeleton-image{position:relative;z-index:0;overflow:hidden;background:transparent}.ant-skeleton-active .ant-skeleton-title:after,.ant-skeleton-active .ant-skeleton-paragraph>li:after,.ant-skeleton-active .ant-skeleton-avatar:after,.ant-skeleton-active .ant-skeleton-button:after,.ant-skeleton-active .ant-skeleton-input:after,.ant-skeleton-active .ant-skeleton-image:after{position:absolute;inset:0 -150%;background:linear-gradient(90deg,rgba(190,190,190,.2) 25%,rgba(129,129,129,.24) 37%,rgba(190,190,190,.2) 63%);animation:ant-skeleton-loading 1.4s ease infinite;content:""}.ant-skeleton.ant-skeleton-block,.ant-skeleton.ant-skeleton-block .ant-skeleton-button,.ant-skeleton.ant-skeleton-block .ant-skeleton-input{width:100%}.ant-skeleton-element{display:inline-block;width:auto}.ant-skeleton-element .ant-skeleton-button{display:inline-block;vertical-align:top;background:rgba(190,190,190,.2);border-radius:2px;width:64px;min-width:64px;height:32px;line-height:32px}.ant-skeleton-element .ant-skeleton-button.ant-skeleton-button-square{width:32px;min-width:32px}.ant-skeleton-element .ant-skeleton-button.ant-skeleton-button-circle{width:32px;min-width:32px;border-radius:50%}.ant-skeleton-element .ant-skeleton-button.ant-skeleton-button-round{border-radius:32px}.ant-skeleton-element .ant-skeleton-button-lg{width:80px;min-width:80px;height:40px;line-height:40px}.ant-skeleton-element .ant-skeleton-button-lg.ant-skeleton-button-square{width:40px;min-width:40px}.ant-skeleton-element .ant-skeleton-button-lg.ant-skeleton-button-circle{width:40px;min-width:40px;border-radius:50%}.ant-skeleton-element .ant-skeleton-button-lg.ant-skeleton-button-round{border-radius:40px}.ant-skeleton-element .ant-skeleton-button-sm{width:48px;min-width:48px;height:24px;line-height:24px}.ant-skeleton-element .ant-skeleton-button-sm.ant-skeleton-button-square{width:24px;min-width:24px}.ant-skeleton-element .ant-skeleton-button-sm.ant-skeleton-button-circle{width:24px;min-width:24px;border-radius:50%}.ant-skeleton-element .ant-skeleton-button-sm.ant-skeleton-button-round{border-radius:24px}.ant-skeleton-element .ant-skeleton-avatar{display:inline-block;vertical-align:top;background:rgba(190,190,190,.2);width:32px;height:32px;line-height:32px}.ant-skeleton-element .ant-skeleton-avatar.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-element .ant-skeleton-avatar-lg{width:40px;height:40px;line-height:40px}.ant-skeleton-element .ant-skeleton-avatar-lg.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-element .ant-skeleton-avatar-sm{width:24px;height:24px;line-height:24px}.ant-skeleton-element .ant-skeleton-avatar-sm.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-element .ant-skeleton-input{display:inline-block;vertical-align:top;background:rgba(190,190,190,.2);width:160px;min-width:160px;height:32px;line-height:32px}.ant-skeleton-element .ant-skeleton-input-lg{width:200px;min-width:200px;height:40px;line-height:40px}.ant-skeleton-element .ant-skeleton-input-sm{width:120px;min-width:120px;height:24px;line-height:24px}.ant-skeleton-element .ant-skeleton-image{display:flex;align-items:center;justify-content:center;vertical-align:top;background:rgba(190,190,190,.2);width:96px;height:96px;line-height:96px}.ant-skeleton-element .ant-skeleton-image.ant-skeleton-image-circle{border-radius:50%}.ant-skeleton-element .ant-skeleton-image-path{fill:#bfbfbf}.ant-skeleton-element .ant-skeleton-image-svg{width:48px;height:48px;line-height:48px;max-width:192px;max-height:192px}.ant-skeleton-element .ant-skeleton-image-svg.ant-skeleton-image-circle{border-radius:50%}@keyframes ant-skeleton-loading{0%{transform:translate(-37.5%)}to{transform:translate(37.5%)}}.ant-skeleton-rtl{direction:rtl}.ant-skeleton-rtl .ant-skeleton-header{padding-right:0;padding-left:16px}.ant-skeleton-rtl.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-title,.ant-skeleton-rtl.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-paragraph>li{animation-name:ant-skeleton-loading-rtl}.ant-skeleton-rtl.ant-skeleton.ant-skeleton-active .ant-skeleton-avatar{animation-name:ant-skeleton-loading-rtl}@keyframes ant-skeleton-loading-rtl{0%{background-position:0% 50%}to{background-position:100% 50%}}.ant-tabs-small>.ant-tabs-nav .ant-tabs-tab{padding:8px 0;font-size:14px}.ant-tabs-large>.ant-tabs-nav .ant-tabs-tab{padding:16px 0;font-size:16px}.ant-tabs-card.ant-tabs-small>.ant-tabs-nav .ant-tabs-tab{padding:6px 16px}.ant-tabs-card.ant-tabs-large>.ant-tabs-nav .ant-tabs-tab{padding:7px 16px 6px}.ant-tabs-rtl{direction:rtl}.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab{margin:0 0 0 32px}.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab:last-of-type{margin-left:0}.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab .anticon{margin-right:0;margin-left:12px}.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab .ant-tabs-tab-remove{margin-right:8px;margin-left:-4px}.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab .ant-tabs-tab-remove .anticon{margin:0}.ant-tabs-rtl.ant-tabs-left>.ant-tabs-nav{order:1}.ant-tabs-rtl.ant-tabs-left>.ant-tabs-content-holder{order:0}.ant-tabs-rtl.ant-tabs-right>.ant-tabs-nav{order:0}.ant-tabs-rtl.ant-tabs-right>.ant-tabs-content-holder{order:1}.ant-tabs-rtl.ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-rtl.ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab{margin-right:2px;margin-left:0}.ant-tabs-rtl.ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-add,.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-add,.ant-tabs-rtl.ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-add,.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-add{margin-right:2px;margin-left:0}.ant-tabs-dropdown-rtl{direction:rtl}.ant-tabs-dropdown-rtl .ant-tabs-dropdown-menu-item{text-align:right}.ant-tabs-top,.ant-tabs-bottom{flex-direction:column}.ant-tabs-top>.ant-tabs-nav,.ant-tabs-bottom>.ant-tabs-nav,.ant-tabs-top>div>.ant-tabs-nav,.ant-tabs-bottom>div>.ant-tabs-nav{margin:0 0 16px}.ant-tabs-top>.ant-tabs-nav:before,.ant-tabs-bottom>.ant-tabs-nav:before,.ant-tabs-top>div>.ant-tabs-nav:before,.ant-tabs-bottom>div>.ant-tabs-nav:before{position:absolute;right:0;left:0;border-bottom:1px solid #f0f0f0;content:""}.ant-tabs-top>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-ink-bar{height:2px}.ant-tabs-top>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-ink-bar-animated{transition:width .3s,left .3s,right .3s}.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap:after{top:0;bottom:0;width:30px}.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap:before{left:0;box-shadow:inset 10px 0 8px -8px #00000014}.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap:after{right:0;box-shadow:inset -10px 0 8px -8px #00000014}.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left:before,.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left:before,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left:before,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left:before{opacity:1}.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right:after,.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right:after,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right:after,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right:after{opacity:1}.ant-tabs-top>.ant-tabs-nav:before,.ant-tabs-top>div>.ant-tabs-nav:before{bottom:0}.ant-tabs-top>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-ink-bar{bottom:0}.ant-tabs-bottom>.ant-tabs-nav,.ant-tabs-bottom>div>.ant-tabs-nav{order:1;margin-top:16px;margin-bottom:0}.ant-tabs-bottom>.ant-tabs-nav:before,.ant-tabs-bottom>div>.ant-tabs-nav:before{top:0}.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-ink-bar{top:0}.ant-tabs-bottom>.ant-tabs-content-holder,.ant-tabs-bottom>div>.ant-tabs-content-holder{order:0}.ant-tabs-left>.ant-tabs-nav,.ant-tabs-right>.ant-tabs-nav,.ant-tabs-left>div>.ant-tabs-nav,.ant-tabs-right>div>.ant-tabs-nav{flex-direction:column;min-width:50px}.ant-tabs-left>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-right>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-tab{padding:8px 24px;text-align:center}.ant-tabs-left>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-right>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab{margin:16px 0 0}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap{flex-direction:column}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap:after{right:0;left:0;height:30px}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap:before{top:0;box-shadow:inset 0 10px 8px -8px #00000014}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap:after{bottom:0;box-shadow:inset 0 -10px 8px -8px #00000014}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top:before,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top:before,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top:before,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top:before{opacity:1}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom:after,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom:after,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom:after,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom:after{opacity:1}.ant-tabs-left>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-right>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-ink-bar{width:2px}.ant-tabs-left>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-right>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-ink-bar-animated{transition:height .3s,top .3s}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-operations,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-operations,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-operations,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-operations{flex:1 0 auto;flex-direction:column}.ant-tabs-left>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-ink-bar{right:0}.ant-tabs-left>.ant-tabs-content-holder,.ant-tabs-left>div>.ant-tabs-content-holder{margin-left:-1px;border-left:1px solid #f0f0f0}.ant-tabs-left>.ant-tabs-content-holder>.ant-tabs-content>.ant-tabs-tabpane,.ant-tabs-left>div>.ant-tabs-content-holder>.ant-tabs-content>.ant-tabs-tabpane{padding-left:24px}.ant-tabs-right>.ant-tabs-nav,.ant-tabs-right>div>.ant-tabs-nav{order:1}.ant-tabs-right>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-ink-bar{left:0}.ant-tabs-right>.ant-tabs-content-holder,.ant-tabs-right>div>.ant-tabs-content-holder{order:0;margin-right:-1px;border-right:1px solid #f0f0f0}.ant-tabs-right>.ant-tabs-content-holder>.ant-tabs-content>.ant-tabs-tabpane,.ant-tabs-right>div>.ant-tabs-content-holder>.ant-tabs-content>.ant-tabs-tabpane{padding-right:24px}.ant-tabs-dropdown{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:absolute;top:-9999px;left:-9999px;z-index:1050;display:block}.ant-tabs-dropdown-hidden{display:none}.ant-tabs-dropdown-menu{max-height:200px;margin:0;padding:4px 0;overflow-x:hidden;overflow-y:auto;text-align:left;list-style-type:none;background-color:#fff;background-clip:padding-box;border-radius:2px;outline:none;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d}.ant-tabs-dropdown-menu-item{display:flex;align-items:center;min-width:120px;margin:0;padding:5px 12px;overflow:hidden;color:#000000d9;font-weight:400;font-size:14px;line-height:22px;white-space:nowrap;text-overflow:ellipsis;cursor:pointer;transition:all .3s}.ant-tabs-dropdown-menu-item>span{flex:1;white-space:nowrap}.ant-tabs-dropdown-menu-item-remove{flex:none;margin-left:12px;color:#00000073;font-size:12px;background:transparent;border:0;cursor:pointer}.ant-tabs-dropdown-menu-item-remove:hover{color:#40a9ff}.ant-tabs-dropdown-menu-item:hover{background:#f5f5f5}.ant-tabs-dropdown-menu-item-disabled,.ant-tabs-dropdown-menu-item-disabled:hover{color:#00000040;background:transparent;cursor:not-allowed}.ant-tabs-card>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-card>div>.ant-tabs-nav .ant-tabs-tab{margin:0;padding:8px 16px;background:#fafafa;border:1px solid #f0f0f0;transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs-card>.ant-tabs-nav .ant-tabs-tab-active,.ant-tabs-card>div>.ant-tabs-nav .ant-tabs-tab-active{color:#1890ff;background:#fff}.ant-tabs-card>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-card>div>.ant-tabs-nav .ant-tabs-ink-bar{visibility:hidden}.ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab{margin-left:2px}.ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-tab{border-radius:2px 2px 0 0}.ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-tab-active,.ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-tab-active{border-bottom-color:#fff}.ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-tab{border-radius:0 0 2px 2px}.ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-tab-active,.ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-tab-active{border-top-color:#fff}.ant-tabs-card.ant-tabs-left>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-right>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab{margin-top:2px}.ant-tabs-card.ant-tabs-left>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-card.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-tab{border-radius:2px 0 0 2px}.ant-tabs-card.ant-tabs-left>.ant-tabs-nav .ant-tabs-tab-active,.ant-tabs-card.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-tab-active{border-right-color:#fff}.ant-tabs-card.ant-tabs-right>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-card.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-tab{border-radius:0 2px 2px 0}.ant-tabs-card.ant-tabs-right>.ant-tabs-nav .ant-tabs-tab-active,.ant-tabs-card.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-tab-active{border-left-color:#fff}.ant-tabs{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:flex}.ant-tabs>.ant-tabs-nav,.ant-tabs>div>.ant-tabs-nav{position:relative;display:flex;flex:none;align-items:center}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-wrap,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-wrap{position:relative;display:inline-block;display:flex;flex:auto;align-self:stretch;overflow:hidden;white-space:nowrap;transform:translate(0)}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-wrap:after{position:absolute;z-index:1;opacity:0;transition:opacity .3s;content:"";pointer-events:none}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-list{position:relative;display:flex;transition:transform .3s}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-operations,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-operations{display:flex;align-self:stretch}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-operations-hidden,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-operations-hidden{position:absolute;visibility:hidden;pointer-events:none}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-more,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-more{position:relative;padding:8px 16px;background:transparent;border:0}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-more:after,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-more:after{position:absolute;right:0;bottom:0;left:0;height:5px;transform:translateY(100%);content:""}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-add,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-add{min-width:40px;margin-left:2px;padding:0 8px;background:#fafafa;border:1px solid #f0f0f0;border-radius:2px 2px 0 0;outline:none;cursor:pointer;transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-add:hover,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-add:hover{color:#40a9ff}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-add:active,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-add:active,.ant-tabs>.ant-tabs-nav .ant-tabs-nav-add:focus,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-add:focus{color:#096dd9}.ant-tabs-extra-content{flex:none}.ant-tabs-centered>.ant-tabs-nav .ant-tabs-nav-wrap:not([class*="ant-tabs-nav-wrap-ping"]),.ant-tabs-centered>div>.ant-tabs-nav .ant-tabs-nav-wrap:not([class*="ant-tabs-nav-wrap-ping"]){justify-content:center}.ant-tabs-ink-bar{position:absolute;background:#1890ff;pointer-events:none}.ant-tabs-tab{position:relative;display:inline-flex;align-items:center;padding:12px 0;font-size:14px;background:transparent;border:0;outline:none;cursor:pointer}.ant-tabs-tab-btn:focus,.ant-tabs-tab-remove:focus,.ant-tabs-tab-btn:active,.ant-tabs-tab-remove:active{color:#096dd9}.ant-tabs-tab-btn{outline:none;transition:all .3s}.ant-tabs-tab-remove{flex:none;margin-right:-4px;margin-left:8px;color:#00000073;font-size:12px;background:transparent;border:none;outline:none;cursor:pointer;transition:all .3s}.ant-tabs-tab-remove:hover{color:#000000d9}.ant-tabs-tab:hover{color:#40a9ff}.ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn{color:#1890ff;text-shadow:0 0 .25px currentcolor}.ant-tabs-tab.ant-tabs-tab-disabled{color:#00000040;cursor:not-allowed}.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-btn:focus,.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-remove:focus,.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-btn:active,.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-remove:active{color:#00000040}.ant-tabs-tab .ant-tabs-tab-remove .anticon{margin:0}.ant-tabs-tab .anticon{margin-right:12px}.ant-tabs-tab+.ant-tabs-tab{margin:0 0 0 32px}.ant-tabs-content{position:relative;width:100%}.ant-tabs-content-holder{flex:auto;min-width:0;min-height:0}.ant-tabs-tabpane{outline:none}.ant-tabs-tabpane-hidden{display:none}.ant-tabs-switch-appear,.ant-tabs-switch-enter{transition:none}.ant-tabs-switch-appear-start,.ant-tabs-switch-enter-start{opacity:0}.ant-tabs-switch-appear-active,.ant-tabs-switch-enter-active{opacity:1;transition:opacity .3s}.ant-tabs-switch-leave{position:absolute;transition:none;inset:0}.ant-tabs-switch-leave-start{opacity:1}.ant-tabs-switch-leave-active{opacity:0;transition:opacity .3s}.ant-carousel{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum"}.ant-carousel .slick-slider{position:relative;display:block;box-sizing:border-box;touch-action:pan-y;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.ant-carousel .slick-list{position:relative;display:block;margin:0;padding:0;overflow:hidden}.ant-carousel .slick-list:focus{outline:none}.ant-carousel .slick-list.dragging{cursor:pointer}.ant-carousel .slick-list .slick-slide{pointer-events:none}.ant-carousel .slick-list .slick-slide input.ant-radio-input,.ant-carousel .slick-list .slick-slide input.ant-checkbox-input{visibility:hidden}.ant-carousel .slick-list .slick-slide.slick-active{pointer-events:auto}.ant-carousel .slick-list .slick-slide.slick-active input.ant-radio-input,.ant-carousel .slick-list .slick-slide.slick-active input.ant-checkbox-input{visibility:visible}.ant-carousel .slick-list .slick-slide>div>div{vertical-align:bottom}.ant-carousel .slick-slider .slick-track,.ant-carousel .slick-slider .slick-list{transform:translateZ(0);touch-action:pan-y}.ant-carousel .slick-track{position:relative;top:0;left:0;display:block}.ant-carousel .slick-track:before,.ant-carousel .slick-track:after{display:table;content:""}.ant-carousel .slick-track:after{clear:both}.slick-loading .ant-carousel .slick-track{visibility:hidden}.ant-carousel .slick-slide{display:none;float:left;height:100%;min-height:1px}.ant-carousel .slick-slide img{display:block}.ant-carousel .slick-slide.slick-loading img{display:none}.ant-carousel .slick-slide.dragging img{pointer-events:none}.ant-carousel .slick-initialized .slick-slide{display:block}.ant-carousel .slick-loading .slick-slide{visibility:hidden}.ant-carousel .slick-vertical .slick-slide{display:block;height:auto}.ant-carousel .slick-arrow.slick-hidden{display:none}.ant-carousel .slick-prev,.ant-carousel .slick-next{position:absolute;top:50%;display:block;width:20px;height:20px;margin-top:-10px;padding:0;color:transparent;font-size:0;line-height:0;background:transparent;border:0;outline:none;cursor:pointer}.ant-carousel .slick-prev:hover,.ant-carousel .slick-next:hover,.ant-carousel .slick-prev:focus,.ant-carousel .slick-next:focus{color:transparent;background:transparent;outline:none}.ant-carousel .slick-prev:hover:before,.ant-carousel .slick-next:hover:before,.ant-carousel .slick-prev:focus:before,.ant-carousel .slick-next:focus:before{opacity:1}.ant-carousel .slick-prev.slick-disabled:before,.ant-carousel .slick-next.slick-disabled:before{opacity:.25}.ant-carousel .slick-prev{left:-25px}.ant-carousel .slick-prev:before{content:"\\2190"}.ant-carousel .slick-next{right:-25px}.ant-carousel .slick-next:before{content:"\\2192"}.ant-carousel .slick-dots{position:absolute;right:0;bottom:0;left:0;z-index:15;display:flex!important;justify-content:center;margin-right:15%;margin-bottom:0;margin-left:15%;padding-left:0;list-style:none}.ant-carousel .slick-dots-bottom{bottom:12px}.ant-carousel .slick-dots-top{top:12px;bottom:auto}.ant-carousel .slick-dots li{position:relative;display:inline-block;flex:0 1 auto;box-sizing:content-box;width:16px;height:3px;margin:0 4px;padding:0;text-align:center;text-indent:-999px;vertical-align:top;transition:all .5s}.ant-carousel .slick-dots li button{position:relative;display:block;width:100%;height:3px;padding:0;color:transparent;font-size:0;background:#fff;border:0;border-radius:1px;outline:none;cursor:pointer;opacity:.3;transition:all .5s}.ant-carousel .slick-dots li button:hover,.ant-carousel .slick-dots li button:focus{opacity:.75}.ant-carousel .slick-dots li button:after{position:absolute;inset:-4px;content:""}.ant-carousel .slick-dots li.slick-active{width:24px}.ant-carousel .slick-dots li.slick-active button{background:#fff;opacity:1}.ant-carousel .slick-dots li.slick-active:hover,.ant-carousel .slick-dots li.slick-active:focus{opacity:1}.ant-carousel-vertical .slick-dots{top:50%;bottom:auto;flex-direction:column;width:3px;height:auto;margin:0;transform:translateY(-50%)}.ant-carousel-vertical .slick-dots-left{right:auto;left:12px}.ant-carousel-vertical .slick-dots-right{right:12px;left:auto}.ant-carousel-vertical .slick-dots li{width:3px;height:16px;margin:4px 0;vertical-align:baseline}.ant-carousel-vertical .slick-dots li button{width:3px;height:16px}.ant-carousel-vertical .slick-dots li.slick-active,.ant-carousel-vertical .slick-dots li.slick-active button{width:3px;height:24px}.ant-carousel-rtl{direction:rtl}.ant-carousel-rtl .ant-carousel .slick-track{right:0;left:auto}.ant-carousel-rtl .ant-carousel .slick-prev{right:-25px;left:auto}.ant-carousel-rtl .ant-carousel .slick-prev:before{content:"\\2192"}.ant-carousel-rtl .ant-carousel .slick-next{right:auto;left:-25px}.ant-carousel-rtl .ant-carousel .slick-next:before{content:"\\2190"}.ant-carousel-rtl.ant-carousel .slick-dots{flex-direction:row-reverse}.ant-carousel-rtl.ant-carousel-vertical .slick-dots{flex-direction:column}.ant-cascader-checkbox{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;top:.2em;line-height:1;white-space:nowrap;outline:none;cursor:pointer}.ant-cascader-checkbox-wrapper:hover .ant-cascader-checkbox-inner,.ant-cascader-checkbox:hover .ant-cascader-checkbox-inner,.ant-cascader-checkbox-input:focus+.ant-cascader-checkbox-inner{border-color:#1890ff}.ant-cascader-checkbox-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid #1890ff;border-radius:2px;visibility:hidden;animation:antCheckboxEffect .36s ease-in-out;animation-fill-mode:backwards;content:""}.ant-cascader-checkbox:hover:after,.ant-cascader-checkbox-wrapper:hover .ant-cascader-checkbox:after{visibility:visible}.ant-cascader-checkbox-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;direction:ltr;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;border-collapse:separate;transition:all .3s}.ant-cascader-checkbox-inner:after{position:absolute;top:50%;left:21.5%;display:table;width:5.71428571px;height:9.14285714px;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(0) translate(-50%,-50%);opacity:0;transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;content:" "}.ant-cascader-checkbox-input{position:absolute;inset:0;z-index:1;width:100%;height:100%;cursor:pointer;opacity:0}.ant-cascader-checkbox-checked .ant-cascader-checkbox-inner:after{position:absolute;display:table;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(1) translate(-50%,-50%);opacity:1;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;content:" "}.ant-cascader-checkbox-checked .ant-cascader-checkbox-inner{background-color:#1890ff;border-color:#1890ff}.ant-cascader-checkbox-disabled{cursor:not-allowed}.ant-cascader-checkbox-disabled.ant-cascader-checkbox-checked .ant-cascader-checkbox-inner:after{border-color:#00000040;animation-name:none}.ant-cascader-checkbox-disabled .ant-cascader-checkbox-input{cursor:not-allowed;pointer-events:none}.ant-cascader-checkbox-disabled .ant-cascader-checkbox-inner{background-color:#f5f5f5;border-color:#d9d9d9!important}.ant-cascader-checkbox-disabled .ant-cascader-checkbox-inner:after{border-color:#f5f5f5;border-collapse:separate;animation-name:none}.ant-cascader-checkbox-disabled+span{color:#00000040;cursor:not-allowed}.ant-cascader-checkbox-disabled:hover:after,.ant-cascader-checkbox-wrapper:hover .ant-cascader-checkbox-disabled:after{visibility:hidden}.ant-cascader-checkbox-wrapper{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-flex;align-items:baseline;line-height:unset;cursor:pointer}.ant-cascader-checkbox-wrapper:after{display:inline-block;width:0;overflow:hidden;content:"\\a0"}.ant-cascader-checkbox-wrapper.ant-cascader-checkbox-wrapper-disabled{cursor:not-allowed}.ant-cascader-checkbox-wrapper+.ant-cascader-checkbox-wrapper{margin-left:8px}.ant-cascader-checkbox-wrapper.ant-cascader-checkbox-wrapper-in-form-item input[type=checkbox]{width:14px;height:14px}.ant-cascader-checkbox+span{padding-right:8px;padding-left:8px}.ant-cascader-checkbox-group{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-block}.ant-cascader-checkbox-group-item{margin-right:8px}.ant-cascader-checkbox-group-item:last-child{margin-right:0}.ant-cascader-checkbox-group-item+.ant-cascader-checkbox-group-item{margin-left:0}.ant-cascader-checkbox-indeterminate .ant-cascader-checkbox-inner{background-color:#fff;border-color:#d9d9d9}.ant-cascader-checkbox-indeterminate .ant-cascader-checkbox-inner:after{top:50%;left:50%;width:8px;height:8px;background-color:#1890ff;border:0;transform:translate(-50%,-50%) scale(1);opacity:1;content:" "}.ant-cascader-checkbox-indeterminate.ant-cascader-checkbox-disabled .ant-cascader-checkbox-inner:after{background-color:#00000040;border-color:#00000040}.ant-cascader{width:184px}.ant-cascader-checkbox{top:0;margin-right:8px}.ant-cascader-menus{display:flex;flex-wrap:nowrap;align-items:flex-start}.ant-cascader-menus.ant-cascader-menu-empty .ant-cascader-menu{width:100%;height:auto}.ant-cascader-menu{flex-grow:1;min-width:111px;height:180px;margin:-4px 0;padding:4px 0;overflow:auto;vertical-align:top;list-style:none;border-right:1px solid #f0f0f0;-ms-overflow-style:-ms-autohiding-scrollbar}.ant-cascader-menu-item{display:flex;flex-wrap:nowrap;align-items:center;padding:5px 12px;overflow:hidden;line-height:22px;white-space:nowrap;text-overflow:ellipsis;cursor:pointer;transition:all .3s}.ant-cascader-menu-item:hover{background:#f5f5f5}.ant-cascader-menu-item-disabled{color:#00000040;cursor:not-allowed}.ant-cascader-menu-item-disabled:hover{background:transparent}.ant-cascader-menu-empty .ant-cascader-menu-item{color:#00000040;cursor:default;pointer-events:none}.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled),.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled):hover{font-weight:600;background-color:#e6f7ff}.ant-cascader-menu-item-content{flex:auto}.ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon,.ant-cascader-menu-item-loading-icon{margin-left:4px;color:#00000073;font-size:10px}.ant-cascader-menu-item-disabled.ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon,.ant-cascader-menu-item-disabled.ant-cascader-menu-item-loading-icon{color:#00000040}.ant-cascader-menu-item-keyword{color:#ff4d4f}.ant-cascader-compact-item:not(.ant-cascader-compact-last-item):not(.ant-cascader-compact-item-rtl){margin-right:-1px}.ant-cascader-compact-item:not(.ant-cascader-compact-last-item).ant-cascader-compact-item-rtl{margin-left:-1px}.ant-cascader-compact-item:hover,.ant-cascader-compact-item:focus,.ant-cascader-compact-item:active{z-index:2}.ant-cascader-compact-item[disabled]{z-index:0}.ant-cascader-compact-item:not(.ant-cascader-compact-first-item):not(.ant-cascader-compact-last-item).ant-cascader{border-radius:0}.ant-cascader-compact-item.ant-cascader.ant-cascader-compact-first-item:not(.ant-cascader-compact-last-item):not(.ant-cascader-compact-item-rtl){border-top-right-radius:0;border-bottom-right-radius:0}.ant-cascader-compact-item.ant-cascader.ant-cascader-compact-last-item:not(.ant-cascader-compact-first-item):not(.ant-cascader-compact-item-rtl){border-top-left-radius:0;border-bottom-left-radius:0}.ant-cascader-compact-item.ant-cascader.ant-cascader-compact-item-rtl.ant-cascader-compact-first-item:not(.ant-cascader-compact-last-item){border-top-left-radius:0;border-bottom-left-radius:0}.ant-cascader-compact-item.ant-cascader.ant-cascader-compact-item-rtl.ant-cascader-compact-last-item:not(.ant-cascader-compact-first-item){border-top-right-radius:0;border-bottom-right-radius:0}.ant-cascader-rtl .ant-cascader-menu-item-expand-icon,.ant-cascader-rtl .ant-cascader-menu-item-loading-icon{margin-right:4px;margin-left:0}.ant-cascader-rtl .ant-cascader-checkbox{top:0;margin-right:0;margin-left:8px}.ant-checkbox{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;top:.2em;line-height:1;white-space:nowrap;outline:none;cursor:pointer}.ant-checkbox-wrapper:hover .ant-checkbox-inner,.ant-checkbox:hover .ant-checkbox-inner,.ant-checkbox-input:focus+.ant-checkbox-inner{border-color:#1890ff}.ant-checkbox-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid #1890ff;border-radius:2px;visibility:hidden;animation:antCheckboxEffect .36s ease-in-out;animation-fill-mode:backwards;content:""}.ant-checkbox:hover:after,.ant-checkbox-wrapper:hover .ant-checkbox:after{visibility:visible}.ant-checkbox-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;direction:ltr;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;border-collapse:separate;transition:all .3s}.ant-checkbox-inner:after{position:absolute;top:50%;left:21.5%;display:table;width:5.71428571px;height:9.14285714px;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(0) translate(-50%,-50%);opacity:0;transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;content:" "}.ant-checkbox-input{position:absolute;inset:0;z-index:1;width:100%;height:100%;cursor:pointer;opacity:0}.ant-checkbox-checked .ant-checkbox-inner:after{position:absolute;display:table;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(1) translate(-50%,-50%);opacity:1;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;content:" "}.ant-checkbox-checked .ant-checkbox-inner{background-color:#1890ff;border-color:#1890ff}.ant-checkbox-disabled{cursor:not-allowed}.ant-checkbox-disabled.ant-checkbox-checked .ant-checkbox-inner:after{border-color:#00000040;animation-name:none}.ant-checkbox-disabled .ant-checkbox-input{cursor:not-allowed;pointer-events:none}.ant-checkbox-disabled .ant-checkbox-inner{background-color:#f5f5f5;border-color:#d9d9d9!important}.ant-checkbox-disabled .ant-checkbox-inner:after{border-color:#f5f5f5;border-collapse:separate;animation-name:none}.ant-checkbox-disabled+span{color:#00000040;cursor:not-allowed}.ant-checkbox-disabled:hover:after,.ant-checkbox-wrapper:hover .ant-checkbox-disabled:after{visibility:hidden}.ant-checkbox-wrapper{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-flex;align-items:baseline;line-height:unset;cursor:pointer}.ant-checkbox-wrapper:after{display:inline-block;width:0;overflow:hidden;content:"\\a0"}.ant-checkbox-wrapper.ant-checkbox-wrapper-disabled{cursor:not-allowed}.ant-checkbox-wrapper+.ant-checkbox-wrapper{margin-left:8px}.ant-checkbox-wrapper.ant-checkbox-wrapper-in-form-item input[type=checkbox]{width:14px;height:14px}.ant-checkbox+span{padding-right:8px;padding-left:8px}.ant-checkbox-group{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-block}.ant-checkbox-group-item{margin-right:8px}.ant-checkbox-group-item:last-child{margin-right:0}.ant-checkbox-group-item+.ant-checkbox-group-item{margin-left:0}.ant-checkbox-indeterminate .ant-checkbox-inner{background-color:#fff;border-color:#d9d9d9}.ant-checkbox-indeterminate .ant-checkbox-inner:after{top:50%;left:50%;width:8px;height:8px;background-color:#1890ff;border:0;transform:translate(-50%,-50%) scale(1);opacity:1;content:" "}.ant-checkbox-indeterminate.ant-checkbox-disabled .ant-checkbox-inner:after{background-color:#00000040;border-color:#00000040}.ant-checkbox-rtl{direction:rtl}.ant-checkbox-group-rtl .ant-checkbox-group-item{margin-right:0;margin-left:8px}.ant-checkbox-group-rtl .ant-checkbox-group-item:last-child{margin-left:0!important}.ant-checkbox-group-rtl .ant-checkbox-group-item+.ant-checkbox-group-item{margin-left:8px}.ant-row{display:flex;flex-flow:row wrap;min-width:0}.ant-row:before,.ant-row:after{display:flex}.ant-row-no-wrap{flex-wrap:nowrap}.ant-row-start{justify-content:flex-start}.ant-row-center{justify-content:center}.ant-row-end{justify-content:flex-end}.ant-row-space-between{justify-content:space-between}.ant-row-space-around{justify-content:space-around}.ant-row-space-evenly{justify-content:space-evenly}.ant-row-top{align-items:flex-start}.ant-row-middle{align-items:center}.ant-row-bottom{align-items:flex-end}.ant-col{position:relative;max-width:100%;min-height:1px}.ant-col-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-push-24{left:100%}.ant-col-pull-24{right:100%}.ant-col-offset-24{margin-left:100%}.ant-col-order-24{order:24}.ant-col-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-push-23{left:95.83333333%}.ant-col-pull-23{right:95.83333333%}.ant-col-offset-23{margin-left:95.83333333%}.ant-col-order-23{order:23}.ant-col-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-push-22{left:91.66666667%}.ant-col-pull-22{right:91.66666667%}.ant-col-offset-22{margin-left:91.66666667%}.ant-col-order-22{order:22}.ant-col-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-push-21{left:87.5%}.ant-col-pull-21{right:87.5%}.ant-col-offset-21{margin-left:87.5%}.ant-col-order-21{order:21}.ant-col-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-push-20{left:83.33333333%}.ant-col-pull-20{right:83.33333333%}.ant-col-offset-20{margin-left:83.33333333%}.ant-col-order-20{order:20}.ant-col-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-push-19{left:79.16666667%}.ant-col-pull-19{right:79.16666667%}.ant-col-offset-19{margin-left:79.16666667%}.ant-col-order-19{order:19}.ant-col-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-push-18{left:75%}.ant-col-pull-18{right:75%}.ant-col-offset-18{margin-left:75%}.ant-col-order-18{order:18}.ant-col-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-push-17{left:70.83333333%}.ant-col-pull-17{right:70.83333333%}.ant-col-offset-17{margin-left:70.83333333%}.ant-col-order-17{order:17}.ant-col-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-push-16{left:66.66666667%}.ant-col-pull-16{right:66.66666667%}.ant-col-offset-16{margin-left:66.66666667%}.ant-col-order-16{order:16}.ant-col-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-push-15{left:62.5%}.ant-col-pull-15{right:62.5%}.ant-col-offset-15{margin-left:62.5%}.ant-col-order-15{order:15}.ant-col-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-push-14{left:58.33333333%}.ant-col-pull-14{right:58.33333333%}.ant-col-offset-14{margin-left:58.33333333%}.ant-col-order-14{order:14}.ant-col-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-push-13{left:54.16666667%}.ant-col-pull-13{right:54.16666667%}.ant-col-offset-13{margin-left:54.16666667%}.ant-col-order-13{order:13}.ant-col-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-push-12{left:50%}.ant-col-pull-12{right:50%}.ant-col-offset-12{margin-left:50%}.ant-col-order-12{order:12}.ant-col-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-push-11{left:45.83333333%}.ant-col-pull-11{right:45.83333333%}.ant-col-offset-11{margin-left:45.83333333%}.ant-col-order-11{order:11}.ant-col-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-push-10{left:41.66666667%}.ant-col-pull-10{right:41.66666667%}.ant-col-offset-10{margin-left:41.66666667%}.ant-col-order-10{order:10}.ant-col-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-push-9{left:37.5%}.ant-col-pull-9{right:37.5%}.ant-col-offset-9{margin-left:37.5%}.ant-col-order-9{order:9}.ant-col-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-push-8{left:33.33333333%}.ant-col-pull-8{right:33.33333333%}.ant-col-offset-8{margin-left:33.33333333%}.ant-col-order-8{order:8}.ant-col-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-push-7{left:29.16666667%}.ant-col-pull-7{right:29.16666667%}.ant-col-offset-7{margin-left:29.16666667%}.ant-col-order-7{order:7}.ant-col-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-push-6{left:25%}.ant-col-pull-6{right:25%}.ant-col-offset-6{margin-left:25%}.ant-col-order-6{order:6}.ant-col-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-push-5{left:20.83333333%}.ant-col-pull-5{right:20.83333333%}.ant-col-offset-5{margin-left:20.83333333%}.ant-col-order-5{order:5}.ant-col-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-push-4{left:16.66666667%}.ant-col-pull-4{right:16.66666667%}.ant-col-offset-4{margin-left:16.66666667%}.ant-col-order-4{order:4}.ant-col-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-push-3{left:12.5%}.ant-col-pull-3{right:12.5%}.ant-col-offset-3{margin-left:12.5%}.ant-col-order-3{order:3}.ant-col-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-push-2{left:8.33333333%}.ant-col-pull-2{right:8.33333333%}.ant-col-offset-2{margin-left:8.33333333%}.ant-col-order-2{order:2}.ant-col-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-push-1{left:4.16666667%}.ant-col-pull-1{right:4.16666667%}.ant-col-offset-1{margin-left:4.16666667%}.ant-col-order-1{order:1}.ant-col-0{display:none}.ant-col-offset-0{margin-left:0}.ant-col-order-0{order:0}.ant-col-offset-0.ant-col-rtl{margin-right:0}.ant-col-push-1.ant-col-rtl{right:4.16666667%;left:auto}.ant-col-pull-1.ant-col-rtl{right:auto;left:4.16666667%}.ant-col-offset-1.ant-col-rtl{margin-right:4.16666667%;margin-left:0}.ant-col-push-2.ant-col-rtl{right:8.33333333%;left:auto}.ant-col-pull-2.ant-col-rtl{right:auto;left:8.33333333%}.ant-col-offset-2.ant-col-rtl{margin-right:8.33333333%;margin-left:0}.ant-col-push-3.ant-col-rtl{right:12.5%;left:auto}.ant-col-pull-3.ant-col-rtl{right:auto;left:12.5%}.ant-col-offset-3.ant-col-rtl{margin-right:12.5%;margin-left:0}.ant-col-push-4.ant-col-rtl{right:16.66666667%;left:auto}.ant-col-pull-4.ant-col-rtl{right:auto;left:16.66666667%}.ant-col-offset-4.ant-col-rtl{margin-right:16.66666667%;margin-left:0}.ant-col-push-5.ant-col-rtl{right:20.83333333%;left:auto}.ant-col-pull-5.ant-col-rtl{right:auto;left:20.83333333%}.ant-col-offset-5.ant-col-rtl{margin-right:20.83333333%;margin-left:0}.ant-col-push-6.ant-col-rtl{right:25%;left:auto}.ant-col-pull-6.ant-col-rtl{right:auto;left:25%}.ant-col-offset-6.ant-col-rtl{margin-right:25%;margin-left:0}.ant-col-push-7.ant-col-rtl{right:29.16666667%;left:auto}.ant-col-pull-7.ant-col-rtl{right:auto;left:29.16666667%}.ant-col-offset-7.ant-col-rtl{margin-right:29.16666667%;margin-left:0}.ant-col-push-8.ant-col-rtl{right:33.33333333%;left:auto}.ant-col-pull-8.ant-col-rtl{right:auto;left:33.33333333%}.ant-col-offset-8.ant-col-rtl{margin-right:33.33333333%;margin-left:0}.ant-col-push-9.ant-col-rtl{right:37.5%;left:auto}.ant-col-pull-9.ant-col-rtl{right:auto;left:37.5%}.ant-col-offset-9.ant-col-rtl{margin-right:37.5%;margin-left:0}.ant-col-push-10.ant-col-rtl{right:41.66666667%;left:auto}.ant-col-pull-10.ant-col-rtl{right:auto;left:41.66666667%}.ant-col-offset-10.ant-col-rtl{margin-right:41.66666667%;margin-left:0}.ant-col-push-11.ant-col-rtl{right:45.83333333%;left:auto}.ant-col-pull-11.ant-col-rtl{right:auto;left:45.83333333%}.ant-col-offset-11.ant-col-rtl{margin-right:45.83333333%;margin-left:0}.ant-col-push-12.ant-col-rtl{right:50%;left:auto}.ant-col-pull-12.ant-col-rtl{right:auto;left:50%}.ant-col-offset-12.ant-col-rtl{margin-right:50%;margin-left:0}.ant-col-push-13.ant-col-rtl{right:54.16666667%;left:auto}.ant-col-pull-13.ant-col-rtl{right:auto;left:54.16666667%}.ant-col-offset-13.ant-col-rtl{margin-right:54.16666667%;margin-left:0}.ant-col-push-14.ant-col-rtl{right:58.33333333%;left:auto}.ant-col-pull-14.ant-col-rtl{right:auto;left:58.33333333%}.ant-col-offset-14.ant-col-rtl{margin-right:58.33333333%;margin-left:0}.ant-col-push-15.ant-col-rtl{right:62.5%;left:auto}.ant-col-pull-15.ant-col-rtl{right:auto;left:62.5%}.ant-col-offset-15.ant-col-rtl{margin-right:62.5%;margin-left:0}.ant-col-push-16.ant-col-rtl{right:66.66666667%;left:auto}.ant-col-pull-16.ant-col-rtl{right:auto;left:66.66666667%}.ant-col-offset-16.ant-col-rtl{margin-right:66.66666667%;margin-left:0}.ant-col-push-17.ant-col-rtl{right:70.83333333%;left:auto}.ant-col-pull-17.ant-col-rtl{right:auto;left:70.83333333%}.ant-col-offset-17.ant-col-rtl{margin-right:70.83333333%;margin-left:0}.ant-col-push-18.ant-col-rtl{right:75%;left:auto}.ant-col-pull-18.ant-col-rtl{right:auto;left:75%}.ant-col-offset-18.ant-col-rtl{margin-right:75%;margin-left:0}.ant-col-push-19.ant-col-rtl{right:79.16666667%;left:auto}.ant-col-pull-19.ant-col-rtl{right:auto;left:79.16666667%}.ant-col-offset-19.ant-col-rtl{margin-right:79.16666667%;margin-left:0}.ant-col-push-20.ant-col-rtl{right:83.33333333%;left:auto}.ant-col-pull-20.ant-col-rtl{right:auto;left:83.33333333%}.ant-col-offset-20.ant-col-rtl{margin-right:83.33333333%;margin-left:0}.ant-col-push-21.ant-col-rtl{right:87.5%;left:auto}.ant-col-pull-21.ant-col-rtl{right:auto;left:87.5%}.ant-col-offset-21.ant-col-rtl{margin-right:87.5%;margin-left:0}.ant-col-push-22.ant-col-rtl{right:91.66666667%;left:auto}.ant-col-pull-22.ant-col-rtl{right:auto;left:91.66666667%}.ant-col-offset-22.ant-col-rtl{margin-right:91.66666667%;margin-left:0}.ant-col-push-23.ant-col-rtl{right:95.83333333%;left:auto}.ant-col-pull-23.ant-col-rtl{right:auto;left:95.83333333%}.ant-col-offset-23.ant-col-rtl{margin-right:95.83333333%;margin-left:0}.ant-col-push-24.ant-col-rtl{right:100%;left:auto}.ant-col-pull-24.ant-col-rtl{right:auto;left:100%}.ant-col-offset-24.ant-col-rtl{margin-right:100%;margin-left:0}.ant-col-xs-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-xs-push-24{left:100%}.ant-col-xs-pull-24{right:100%}.ant-col-xs-offset-24{margin-left:100%}.ant-col-xs-order-24{order:24}.ant-col-xs-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-xs-push-23{left:95.83333333%}.ant-col-xs-pull-23{right:95.83333333%}.ant-col-xs-offset-23{margin-left:95.83333333%}.ant-col-xs-order-23{order:23}.ant-col-xs-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-xs-push-22{left:91.66666667%}.ant-col-xs-pull-22{right:91.66666667%}.ant-col-xs-offset-22{margin-left:91.66666667%}.ant-col-xs-order-22{order:22}.ant-col-xs-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-xs-push-21{left:87.5%}.ant-col-xs-pull-21{right:87.5%}.ant-col-xs-offset-21{margin-left:87.5%}.ant-col-xs-order-21{order:21}.ant-col-xs-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-xs-push-20{left:83.33333333%}.ant-col-xs-pull-20{right:83.33333333%}.ant-col-xs-offset-20{margin-left:83.33333333%}.ant-col-xs-order-20{order:20}.ant-col-xs-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-xs-push-19{left:79.16666667%}.ant-col-xs-pull-19{right:79.16666667%}.ant-col-xs-offset-19{margin-left:79.16666667%}.ant-col-xs-order-19{order:19}.ant-col-xs-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-xs-push-18{left:75%}.ant-col-xs-pull-18{right:75%}.ant-col-xs-offset-18{margin-left:75%}.ant-col-xs-order-18{order:18}.ant-col-xs-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-xs-push-17{left:70.83333333%}.ant-col-xs-pull-17{right:70.83333333%}.ant-col-xs-offset-17{margin-left:70.83333333%}.ant-col-xs-order-17{order:17}.ant-col-xs-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-xs-push-16{left:66.66666667%}.ant-col-xs-pull-16{right:66.66666667%}.ant-col-xs-offset-16{margin-left:66.66666667%}.ant-col-xs-order-16{order:16}.ant-col-xs-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-xs-push-15{left:62.5%}.ant-col-xs-pull-15{right:62.5%}.ant-col-xs-offset-15{margin-left:62.5%}.ant-col-xs-order-15{order:15}.ant-col-xs-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-xs-push-14{left:58.33333333%}.ant-col-xs-pull-14{right:58.33333333%}.ant-col-xs-offset-14{margin-left:58.33333333%}.ant-col-xs-order-14{order:14}.ant-col-xs-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-xs-push-13{left:54.16666667%}.ant-col-xs-pull-13{right:54.16666667%}.ant-col-xs-offset-13{margin-left:54.16666667%}.ant-col-xs-order-13{order:13}.ant-col-xs-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-xs-push-12{left:50%}.ant-col-xs-pull-12{right:50%}.ant-col-xs-offset-12{margin-left:50%}.ant-col-xs-order-12{order:12}.ant-col-xs-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-xs-push-11{left:45.83333333%}.ant-col-xs-pull-11{right:45.83333333%}.ant-col-xs-offset-11{margin-left:45.83333333%}.ant-col-xs-order-11{order:11}.ant-col-xs-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-xs-push-10{left:41.66666667%}.ant-col-xs-pull-10{right:41.66666667%}.ant-col-xs-offset-10{margin-left:41.66666667%}.ant-col-xs-order-10{order:10}.ant-col-xs-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-xs-push-9{left:37.5%}.ant-col-xs-pull-9{right:37.5%}.ant-col-xs-offset-9{margin-left:37.5%}.ant-col-xs-order-9{order:9}.ant-col-xs-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-xs-push-8{left:33.33333333%}.ant-col-xs-pull-8{right:33.33333333%}.ant-col-xs-offset-8{margin-left:33.33333333%}.ant-col-xs-order-8{order:8}.ant-col-xs-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-xs-push-7{left:29.16666667%}.ant-col-xs-pull-7{right:29.16666667%}.ant-col-xs-offset-7{margin-left:29.16666667%}.ant-col-xs-order-7{order:7}.ant-col-xs-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-xs-push-6{left:25%}.ant-col-xs-pull-6{right:25%}.ant-col-xs-offset-6{margin-left:25%}.ant-col-xs-order-6{order:6}.ant-col-xs-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-xs-push-5{left:20.83333333%}.ant-col-xs-pull-5{right:20.83333333%}.ant-col-xs-offset-5{margin-left:20.83333333%}.ant-col-xs-order-5{order:5}.ant-col-xs-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-xs-push-4{left:16.66666667%}.ant-col-xs-pull-4{right:16.66666667%}.ant-col-xs-offset-4{margin-left:16.66666667%}.ant-col-xs-order-4{order:4}.ant-col-xs-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-xs-push-3{left:12.5%}.ant-col-xs-pull-3{right:12.5%}.ant-col-xs-offset-3{margin-left:12.5%}.ant-col-xs-order-3{order:3}.ant-col-xs-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-xs-push-2{left:8.33333333%}.ant-col-xs-pull-2{right:8.33333333%}.ant-col-xs-offset-2{margin-left:8.33333333%}.ant-col-xs-order-2{order:2}.ant-col-xs-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-xs-push-1{left:4.16666667%}.ant-col-xs-pull-1{right:4.16666667%}.ant-col-xs-offset-1{margin-left:4.16666667%}.ant-col-xs-order-1{order:1}.ant-col-xs-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-xs-push-0{left:auto}.ant-col-xs-pull-0{right:auto}.ant-col-xs-offset-0{margin-left:0}.ant-col-xs-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-xs-push-0.ant-col-rtl{right:auto}.ant-col-xs-pull-0.ant-col-rtl{left:auto}.ant-col-xs-offset-0.ant-col-rtl{margin-right:0}.ant-col-xs-push-1.ant-col-rtl{right:4.16666667%;left:auto}.ant-col-xs-pull-1.ant-col-rtl{right:auto;left:4.16666667%}.ant-col-xs-offset-1.ant-col-rtl{margin-right:4.16666667%;margin-left:0}.ant-col-xs-push-2.ant-col-rtl{right:8.33333333%;left:auto}.ant-col-xs-pull-2.ant-col-rtl{right:auto;left:8.33333333%}.ant-col-xs-offset-2.ant-col-rtl{margin-right:8.33333333%;margin-left:0}.ant-col-xs-push-3.ant-col-rtl{right:12.5%;left:auto}.ant-col-xs-pull-3.ant-col-rtl{right:auto;left:12.5%}.ant-col-xs-offset-3.ant-col-rtl{margin-right:12.5%;margin-left:0}.ant-col-xs-push-4.ant-col-rtl{right:16.66666667%;left:auto}.ant-col-xs-pull-4.ant-col-rtl{right:auto;left:16.66666667%}.ant-col-xs-offset-4.ant-col-rtl{margin-right:16.66666667%;margin-left:0}.ant-col-xs-push-5.ant-col-rtl{right:20.83333333%;left:auto}.ant-col-xs-pull-5.ant-col-rtl{right:auto;left:20.83333333%}.ant-col-xs-offset-5.ant-col-rtl{margin-right:20.83333333%;margin-left:0}.ant-col-xs-push-6.ant-col-rtl{right:25%;left:auto}.ant-col-xs-pull-6.ant-col-rtl{right:auto;left:25%}.ant-col-xs-offset-6.ant-col-rtl{margin-right:25%;margin-left:0}.ant-col-xs-push-7.ant-col-rtl{right:29.16666667%;left:auto}.ant-col-xs-pull-7.ant-col-rtl{right:auto;left:29.16666667%}.ant-col-xs-offset-7.ant-col-rtl{margin-right:29.16666667%;margin-left:0}.ant-col-xs-push-8.ant-col-rtl{right:33.33333333%;left:auto}.ant-col-xs-pull-8.ant-col-rtl{right:auto;left:33.33333333%}.ant-col-xs-offset-8.ant-col-rtl{margin-right:33.33333333%;margin-left:0}.ant-col-xs-push-9.ant-col-rtl{right:37.5%;left:auto}.ant-col-xs-pull-9.ant-col-rtl{right:auto;left:37.5%}.ant-col-xs-offset-9.ant-col-rtl{margin-right:37.5%;margin-left:0}.ant-col-xs-push-10.ant-col-rtl{right:41.66666667%;left:auto}.ant-col-xs-pull-10.ant-col-rtl{right:auto;left:41.66666667%}.ant-col-xs-offset-10.ant-col-rtl{margin-right:41.66666667%;margin-left:0}.ant-col-xs-push-11.ant-col-rtl{right:45.83333333%;left:auto}.ant-col-xs-pull-11.ant-col-rtl{right:auto;left:45.83333333%}.ant-col-xs-offset-11.ant-col-rtl{margin-right:45.83333333%;margin-left:0}.ant-col-xs-push-12.ant-col-rtl{right:50%;left:auto}.ant-col-xs-pull-12.ant-col-rtl{right:auto;left:50%}.ant-col-xs-offset-12.ant-col-rtl{margin-right:50%;margin-left:0}.ant-col-xs-push-13.ant-col-rtl{right:54.16666667%;left:auto}.ant-col-xs-pull-13.ant-col-rtl{right:auto;left:54.16666667%}.ant-col-xs-offset-13.ant-col-rtl{margin-right:54.16666667%;margin-left:0}.ant-col-xs-push-14.ant-col-rtl{right:58.33333333%;left:auto}.ant-col-xs-pull-14.ant-col-rtl{right:auto;left:58.33333333%}.ant-col-xs-offset-14.ant-col-rtl{margin-right:58.33333333%;margin-left:0}.ant-col-xs-push-15.ant-col-rtl{right:62.5%;left:auto}.ant-col-xs-pull-15.ant-col-rtl{right:auto;left:62.5%}.ant-col-xs-offset-15.ant-col-rtl{margin-right:62.5%;margin-left:0}.ant-col-xs-push-16.ant-col-rtl{right:66.66666667%;left:auto}.ant-col-xs-pull-16.ant-col-rtl{right:auto;left:66.66666667%}.ant-col-xs-offset-16.ant-col-rtl{margin-right:66.66666667%;margin-left:0}.ant-col-xs-push-17.ant-col-rtl{right:70.83333333%;left:auto}.ant-col-xs-pull-17.ant-col-rtl{right:auto;left:70.83333333%}.ant-col-xs-offset-17.ant-col-rtl{margin-right:70.83333333%;margin-left:0}.ant-col-xs-push-18.ant-col-rtl{right:75%;left:auto}.ant-col-xs-pull-18.ant-col-rtl{right:auto;left:75%}.ant-col-xs-offset-18.ant-col-rtl{margin-right:75%;margin-left:0}.ant-col-xs-push-19.ant-col-rtl{right:79.16666667%;left:auto}.ant-col-xs-pull-19.ant-col-rtl{right:auto;left:79.16666667%}.ant-col-xs-offset-19.ant-col-rtl{margin-right:79.16666667%;margin-left:0}.ant-col-xs-push-20.ant-col-rtl{right:83.33333333%;left:auto}.ant-col-xs-pull-20.ant-col-rtl{right:auto;left:83.33333333%}.ant-col-xs-offset-20.ant-col-rtl{margin-right:83.33333333%;margin-left:0}.ant-col-xs-push-21.ant-col-rtl{right:87.5%;left:auto}.ant-col-xs-pull-21.ant-col-rtl{right:auto;left:87.5%}.ant-col-xs-offset-21.ant-col-rtl{margin-right:87.5%;margin-left:0}.ant-col-xs-push-22.ant-col-rtl{right:91.66666667%;left:auto}.ant-col-xs-pull-22.ant-col-rtl{right:auto;left:91.66666667%}.ant-col-xs-offset-22.ant-col-rtl{margin-right:91.66666667%;margin-left:0}.ant-col-xs-push-23.ant-col-rtl{right:95.83333333%;left:auto}.ant-col-xs-pull-23.ant-col-rtl{right:auto;left:95.83333333%}.ant-col-xs-offset-23.ant-col-rtl{margin-right:95.83333333%;margin-left:0}.ant-col-xs-push-24.ant-col-rtl{right:100%;left:auto}.ant-col-xs-pull-24.ant-col-rtl{right:auto;left:100%}.ant-col-xs-offset-24.ant-col-rtl{margin-right:100%;margin-left:0}@media (min-width: 576px){.ant-col-sm-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-sm-push-24{left:100%}.ant-col-sm-pull-24{right:100%}.ant-col-sm-offset-24{margin-left:100%}.ant-col-sm-order-24{order:24}.ant-col-sm-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-sm-push-23{left:95.83333333%}.ant-col-sm-pull-23{right:95.83333333%}.ant-col-sm-offset-23{margin-left:95.83333333%}.ant-col-sm-order-23{order:23}.ant-col-sm-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-sm-push-22{left:91.66666667%}.ant-col-sm-pull-22{right:91.66666667%}.ant-col-sm-offset-22{margin-left:91.66666667%}.ant-col-sm-order-22{order:22}.ant-col-sm-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-sm-push-21{left:87.5%}.ant-col-sm-pull-21{right:87.5%}.ant-col-sm-offset-21{margin-left:87.5%}.ant-col-sm-order-21{order:21}.ant-col-sm-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-sm-push-20{left:83.33333333%}.ant-col-sm-pull-20{right:83.33333333%}.ant-col-sm-offset-20{margin-left:83.33333333%}.ant-col-sm-order-20{order:20}.ant-col-sm-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-sm-push-19{left:79.16666667%}.ant-col-sm-pull-19{right:79.16666667%}.ant-col-sm-offset-19{margin-left:79.16666667%}.ant-col-sm-order-19{order:19}.ant-col-sm-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-sm-push-18{left:75%}.ant-col-sm-pull-18{right:75%}.ant-col-sm-offset-18{margin-left:75%}.ant-col-sm-order-18{order:18}.ant-col-sm-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-sm-push-17{left:70.83333333%}.ant-col-sm-pull-17{right:70.83333333%}.ant-col-sm-offset-17{margin-left:70.83333333%}.ant-col-sm-order-17{order:17}.ant-col-sm-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-sm-push-16{left:66.66666667%}.ant-col-sm-pull-16{right:66.66666667%}.ant-col-sm-offset-16{margin-left:66.66666667%}.ant-col-sm-order-16{order:16}.ant-col-sm-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-sm-push-15{left:62.5%}.ant-col-sm-pull-15{right:62.5%}.ant-col-sm-offset-15{margin-left:62.5%}.ant-col-sm-order-15{order:15}.ant-col-sm-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-sm-push-14{left:58.33333333%}.ant-col-sm-pull-14{right:58.33333333%}.ant-col-sm-offset-14{margin-left:58.33333333%}.ant-col-sm-order-14{order:14}.ant-col-sm-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-sm-push-13{left:54.16666667%}.ant-col-sm-pull-13{right:54.16666667%}.ant-col-sm-offset-13{margin-left:54.16666667%}.ant-col-sm-order-13{order:13}.ant-col-sm-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-sm-push-12{left:50%}.ant-col-sm-pull-12{right:50%}.ant-col-sm-offset-12{margin-left:50%}.ant-col-sm-order-12{order:12}.ant-col-sm-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-sm-push-11{left:45.83333333%}.ant-col-sm-pull-11{right:45.83333333%}.ant-col-sm-offset-11{margin-left:45.83333333%}.ant-col-sm-order-11{order:11}.ant-col-sm-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-sm-push-10{left:41.66666667%}.ant-col-sm-pull-10{right:41.66666667%}.ant-col-sm-offset-10{margin-left:41.66666667%}.ant-col-sm-order-10{order:10}.ant-col-sm-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-sm-push-9{left:37.5%}.ant-col-sm-pull-9{right:37.5%}.ant-col-sm-offset-9{margin-left:37.5%}.ant-col-sm-order-9{order:9}.ant-col-sm-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-sm-push-8{left:33.33333333%}.ant-col-sm-pull-8{right:33.33333333%}.ant-col-sm-offset-8{margin-left:33.33333333%}.ant-col-sm-order-8{order:8}.ant-col-sm-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-sm-push-7{left:29.16666667%}.ant-col-sm-pull-7{right:29.16666667%}.ant-col-sm-offset-7{margin-left:29.16666667%}.ant-col-sm-order-7{order:7}.ant-col-sm-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-sm-push-6{left:25%}.ant-col-sm-pull-6{right:25%}.ant-col-sm-offset-6{margin-left:25%}.ant-col-sm-order-6{order:6}.ant-col-sm-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-sm-push-5{left:20.83333333%}.ant-col-sm-pull-5{right:20.83333333%}.ant-col-sm-offset-5{margin-left:20.83333333%}.ant-col-sm-order-5{order:5}.ant-col-sm-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-sm-push-4{left:16.66666667%}.ant-col-sm-pull-4{right:16.66666667%}.ant-col-sm-offset-4{margin-left:16.66666667%}.ant-col-sm-order-4{order:4}.ant-col-sm-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-sm-push-3{left:12.5%}.ant-col-sm-pull-3{right:12.5%}.ant-col-sm-offset-3{margin-left:12.5%}.ant-col-sm-order-3{order:3}.ant-col-sm-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-sm-push-2{left:8.33333333%}.ant-col-sm-pull-2{right:8.33333333%}.ant-col-sm-offset-2{margin-left:8.33333333%}.ant-col-sm-order-2{order:2}.ant-col-sm-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-sm-push-1{left:4.16666667%}.ant-col-sm-pull-1{right:4.16666667%}.ant-col-sm-offset-1{margin-left:4.16666667%}.ant-col-sm-order-1{order:1}.ant-col-sm-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-sm-push-0{left:auto}.ant-col-sm-pull-0{right:auto}.ant-col-sm-offset-0{margin-left:0}.ant-col-sm-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-sm-push-0.ant-col-rtl{right:auto}.ant-col-sm-pull-0.ant-col-rtl{left:auto}.ant-col-sm-offset-0.ant-col-rtl{margin-right:0}.ant-col-sm-push-1.ant-col-rtl{right:4.16666667%;left:auto}.ant-col-sm-pull-1.ant-col-rtl{right:auto;left:4.16666667%}.ant-col-sm-offset-1.ant-col-rtl{margin-right:4.16666667%;margin-left:0}.ant-col-sm-push-2.ant-col-rtl{right:8.33333333%;left:auto}.ant-col-sm-pull-2.ant-col-rtl{right:auto;left:8.33333333%}.ant-col-sm-offset-2.ant-col-rtl{margin-right:8.33333333%;margin-left:0}.ant-col-sm-push-3.ant-col-rtl{right:12.5%;left:auto}.ant-col-sm-pull-3.ant-col-rtl{right:auto;left:12.5%}.ant-col-sm-offset-3.ant-col-rtl{margin-right:12.5%;margin-left:0}.ant-col-sm-push-4.ant-col-rtl{right:16.66666667%;left:auto}.ant-col-sm-pull-4.ant-col-rtl{right:auto;left:16.66666667%}.ant-col-sm-offset-4.ant-col-rtl{margin-right:16.66666667%;margin-left:0}.ant-col-sm-push-5.ant-col-rtl{right:20.83333333%;left:auto}.ant-col-sm-pull-5.ant-col-rtl{right:auto;left:20.83333333%}.ant-col-sm-offset-5.ant-col-rtl{margin-right:20.83333333%;margin-left:0}.ant-col-sm-push-6.ant-col-rtl{right:25%;left:auto}.ant-col-sm-pull-6.ant-col-rtl{right:auto;left:25%}.ant-col-sm-offset-6.ant-col-rtl{margin-right:25%;margin-left:0}.ant-col-sm-push-7.ant-col-rtl{right:29.16666667%;left:auto}.ant-col-sm-pull-7.ant-col-rtl{right:auto;left:29.16666667%}.ant-col-sm-offset-7.ant-col-rtl{margin-right:29.16666667%;margin-left:0}.ant-col-sm-push-8.ant-col-rtl{right:33.33333333%;left:auto}.ant-col-sm-pull-8.ant-col-rtl{right:auto;left:33.33333333%}.ant-col-sm-offset-8.ant-col-rtl{margin-right:33.33333333%;margin-left:0}.ant-col-sm-push-9.ant-col-rtl{right:37.5%;left:auto}.ant-col-sm-pull-9.ant-col-rtl{right:auto;left:37.5%}.ant-col-sm-offset-9.ant-col-rtl{margin-right:37.5%;margin-left:0}.ant-col-sm-push-10.ant-col-rtl{right:41.66666667%;left:auto}.ant-col-sm-pull-10.ant-col-rtl{right:auto;left:41.66666667%}.ant-col-sm-offset-10.ant-col-rtl{margin-right:41.66666667%;margin-left:0}.ant-col-sm-push-11.ant-col-rtl{right:45.83333333%;left:auto}.ant-col-sm-pull-11.ant-col-rtl{right:auto;left:45.83333333%}.ant-col-sm-offset-11.ant-col-rtl{margin-right:45.83333333%;margin-left:0}.ant-col-sm-push-12.ant-col-rtl{right:50%;left:auto}.ant-col-sm-pull-12.ant-col-rtl{right:auto;left:50%}.ant-col-sm-offset-12.ant-col-rtl{margin-right:50%;margin-left:0}.ant-col-sm-push-13.ant-col-rtl{right:54.16666667%;left:auto}.ant-col-sm-pull-13.ant-col-rtl{right:auto;left:54.16666667%}.ant-col-sm-offset-13.ant-col-rtl{margin-right:54.16666667%;margin-left:0}.ant-col-sm-push-14.ant-col-rtl{right:58.33333333%;left:auto}.ant-col-sm-pull-14.ant-col-rtl{right:auto;left:58.33333333%}.ant-col-sm-offset-14.ant-col-rtl{margin-right:58.33333333%;margin-left:0}.ant-col-sm-push-15.ant-col-rtl{right:62.5%;left:auto}.ant-col-sm-pull-15.ant-col-rtl{right:auto;left:62.5%}.ant-col-sm-offset-15.ant-col-rtl{margin-right:62.5%;margin-left:0}.ant-col-sm-push-16.ant-col-rtl{right:66.66666667%;left:auto}.ant-col-sm-pull-16.ant-col-rtl{right:auto;left:66.66666667%}.ant-col-sm-offset-16.ant-col-rtl{margin-right:66.66666667%;margin-left:0}.ant-col-sm-push-17.ant-col-rtl{right:70.83333333%;left:auto}.ant-col-sm-pull-17.ant-col-rtl{right:auto;left:70.83333333%}.ant-col-sm-offset-17.ant-col-rtl{margin-right:70.83333333%;margin-left:0}.ant-col-sm-push-18.ant-col-rtl{right:75%;left:auto}.ant-col-sm-pull-18.ant-col-rtl{right:auto;left:75%}.ant-col-sm-offset-18.ant-col-rtl{margin-right:75%;margin-left:0}.ant-col-sm-push-19.ant-col-rtl{right:79.16666667%;left:auto}.ant-col-sm-pull-19.ant-col-rtl{right:auto;left:79.16666667%}.ant-col-sm-offset-19.ant-col-rtl{margin-right:79.16666667%;margin-left:0}.ant-col-sm-push-20.ant-col-rtl{right:83.33333333%;left:auto}.ant-col-sm-pull-20.ant-col-rtl{right:auto;left:83.33333333%}.ant-col-sm-offset-20.ant-col-rtl{margin-right:83.33333333%;margin-left:0}.ant-col-sm-push-21.ant-col-rtl{right:87.5%;left:auto}.ant-col-sm-pull-21.ant-col-rtl{right:auto;left:87.5%}.ant-col-sm-offset-21.ant-col-rtl{margin-right:87.5%;margin-left:0}.ant-col-sm-push-22.ant-col-rtl{right:91.66666667%;left:auto}.ant-col-sm-pull-22.ant-col-rtl{right:auto;left:91.66666667%}.ant-col-sm-offset-22.ant-col-rtl{margin-right:91.66666667%;margin-left:0}.ant-col-sm-push-23.ant-col-rtl{right:95.83333333%;left:auto}.ant-col-sm-pull-23.ant-col-rtl{right:auto;left:95.83333333%}.ant-col-sm-offset-23.ant-col-rtl{margin-right:95.83333333%;margin-left:0}.ant-col-sm-push-24.ant-col-rtl{right:100%;left:auto}.ant-col-sm-pull-24.ant-col-rtl{right:auto;left:100%}.ant-col-sm-offset-24.ant-col-rtl{margin-right:100%;margin-left:0}}@media (min-width: 768px){.ant-col-md-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-md-push-24{left:100%}.ant-col-md-pull-24{right:100%}.ant-col-md-offset-24{margin-left:100%}.ant-col-md-order-24{order:24}.ant-col-md-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-md-push-23{left:95.83333333%}.ant-col-md-pull-23{right:95.83333333%}.ant-col-md-offset-23{margin-left:95.83333333%}.ant-col-md-order-23{order:23}.ant-col-md-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-md-push-22{left:91.66666667%}.ant-col-md-pull-22{right:91.66666667%}.ant-col-md-offset-22{margin-left:91.66666667%}.ant-col-md-order-22{order:22}.ant-col-md-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-md-push-21{left:87.5%}.ant-col-md-pull-21{right:87.5%}.ant-col-md-offset-21{margin-left:87.5%}.ant-col-md-order-21{order:21}.ant-col-md-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-md-push-20{left:83.33333333%}.ant-col-md-pull-20{right:83.33333333%}.ant-col-md-offset-20{margin-left:83.33333333%}.ant-col-md-order-20{order:20}.ant-col-md-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-md-push-19{left:79.16666667%}.ant-col-md-pull-19{right:79.16666667%}.ant-col-md-offset-19{margin-left:79.16666667%}.ant-col-md-order-19{order:19}.ant-col-md-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-md-push-18{left:75%}.ant-col-md-pull-18{right:75%}.ant-col-md-offset-18{margin-left:75%}.ant-col-md-order-18{order:18}.ant-col-md-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-md-push-17{left:70.83333333%}.ant-col-md-pull-17{right:70.83333333%}.ant-col-md-offset-17{margin-left:70.83333333%}.ant-col-md-order-17{order:17}.ant-col-md-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-md-push-16{left:66.66666667%}.ant-col-md-pull-16{right:66.66666667%}.ant-col-md-offset-16{margin-left:66.66666667%}.ant-col-md-order-16{order:16}.ant-col-md-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-md-push-15{left:62.5%}.ant-col-md-pull-15{right:62.5%}.ant-col-md-offset-15{margin-left:62.5%}.ant-col-md-order-15{order:15}.ant-col-md-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-md-push-14{left:58.33333333%}.ant-col-md-pull-14{right:58.33333333%}.ant-col-md-offset-14{margin-left:58.33333333%}.ant-col-md-order-14{order:14}.ant-col-md-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-md-push-13{left:54.16666667%}.ant-col-md-pull-13{right:54.16666667%}.ant-col-md-offset-13{margin-left:54.16666667%}.ant-col-md-order-13{order:13}.ant-col-md-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-md-push-12{left:50%}.ant-col-md-pull-12{right:50%}.ant-col-md-offset-12{margin-left:50%}.ant-col-md-order-12{order:12}.ant-col-md-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-md-push-11{left:45.83333333%}.ant-col-md-pull-11{right:45.83333333%}.ant-col-md-offset-11{margin-left:45.83333333%}.ant-col-md-order-11{order:11}.ant-col-md-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-md-push-10{left:41.66666667%}.ant-col-md-pull-10{right:41.66666667%}.ant-col-md-offset-10{margin-left:41.66666667%}.ant-col-md-order-10{order:10}.ant-col-md-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-md-push-9{left:37.5%}.ant-col-md-pull-9{right:37.5%}.ant-col-md-offset-9{margin-left:37.5%}.ant-col-md-order-9{order:9}.ant-col-md-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-md-push-8{left:33.33333333%}.ant-col-md-pull-8{right:33.33333333%}.ant-col-md-offset-8{margin-left:33.33333333%}.ant-col-md-order-8{order:8}.ant-col-md-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-md-push-7{left:29.16666667%}.ant-col-md-pull-7{right:29.16666667%}.ant-col-md-offset-7{margin-left:29.16666667%}.ant-col-md-order-7{order:7}.ant-col-md-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-md-push-6{left:25%}.ant-col-md-pull-6{right:25%}.ant-col-md-offset-6{margin-left:25%}.ant-col-md-order-6{order:6}.ant-col-md-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-md-push-5{left:20.83333333%}.ant-col-md-pull-5{right:20.83333333%}.ant-col-md-offset-5{margin-left:20.83333333%}.ant-col-md-order-5{order:5}.ant-col-md-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-md-push-4{left:16.66666667%}.ant-col-md-pull-4{right:16.66666667%}.ant-col-md-offset-4{margin-left:16.66666667%}.ant-col-md-order-4{order:4}.ant-col-md-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-md-push-3{left:12.5%}.ant-col-md-pull-3{right:12.5%}.ant-col-md-offset-3{margin-left:12.5%}.ant-col-md-order-3{order:3}.ant-col-md-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-md-push-2{left:8.33333333%}.ant-col-md-pull-2{right:8.33333333%}.ant-col-md-offset-2{margin-left:8.33333333%}.ant-col-md-order-2{order:2}.ant-col-md-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-md-push-1{left:4.16666667%}.ant-col-md-pull-1{right:4.16666667%}.ant-col-md-offset-1{margin-left:4.16666667%}.ant-col-md-order-1{order:1}.ant-col-md-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-md-push-0{left:auto}.ant-col-md-pull-0{right:auto}.ant-col-md-offset-0{margin-left:0}.ant-col-md-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-md-push-0.ant-col-rtl{right:auto}.ant-col-md-pull-0.ant-col-rtl{left:auto}.ant-col-md-offset-0.ant-col-rtl{margin-right:0}.ant-col-md-push-1.ant-col-rtl{right:4.16666667%;left:auto}.ant-col-md-pull-1.ant-col-rtl{right:auto;left:4.16666667%}.ant-col-md-offset-1.ant-col-rtl{margin-right:4.16666667%;margin-left:0}.ant-col-md-push-2.ant-col-rtl{right:8.33333333%;left:auto}.ant-col-md-pull-2.ant-col-rtl{right:auto;left:8.33333333%}.ant-col-md-offset-2.ant-col-rtl{margin-right:8.33333333%;margin-left:0}.ant-col-md-push-3.ant-col-rtl{right:12.5%;left:auto}.ant-col-md-pull-3.ant-col-rtl{right:auto;left:12.5%}.ant-col-md-offset-3.ant-col-rtl{margin-right:12.5%;margin-left:0}.ant-col-md-push-4.ant-col-rtl{right:16.66666667%;left:auto}.ant-col-md-pull-4.ant-col-rtl{right:auto;left:16.66666667%}.ant-col-md-offset-4.ant-col-rtl{margin-right:16.66666667%;margin-left:0}.ant-col-md-push-5.ant-col-rtl{right:20.83333333%;left:auto}.ant-col-md-pull-5.ant-col-rtl{right:auto;left:20.83333333%}.ant-col-md-offset-5.ant-col-rtl{margin-right:20.83333333%;margin-left:0}.ant-col-md-push-6.ant-col-rtl{right:25%;left:auto}.ant-col-md-pull-6.ant-col-rtl{right:auto;left:25%}.ant-col-md-offset-6.ant-col-rtl{margin-right:25%;margin-left:0}.ant-col-md-push-7.ant-col-rtl{right:29.16666667%;left:auto}.ant-col-md-pull-7.ant-col-rtl{right:auto;left:29.16666667%}.ant-col-md-offset-7.ant-col-rtl{margin-right:29.16666667%;margin-left:0}.ant-col-md-push-8.ant-col-rtl{right:33.33333333%;left:auto}.ant-col-md-pull-8.ant-col-rtl{right:auto;left:33.33333333%}.ant-col-md-offset-8.ant-col-rtl{margin-right:33.33333333%;margin-left:0}.ant-col-md-push-9.ant-col-rtl{right:37.5%;left:auto}.ant-col-md-pull-9.ant-col-rtl{right:auto;left:37.5%}.ant-col-md-offset-9.ant-col-rtl{margin-right:37.5%;margin-left:0}.ant-col-md-push-10.ant-col-rtl{right:41.66666667%;left:auto}.ant-col-md-pull-10.ant-col-rtl{right:auto;left:41.66666667%}.ant-col-md-offset-10.ant-col-rtl{margin-right:41.66666667%;margin-left:0}.ant-col-md-push-11.ant-col-rtl{right:45.83333333%;left:auto}.ant-col-md-pull-11.ant-col-rtl{right:auto;left:45.83333333%}.ant-col-md-offset-11.ant-col-rtl{margin-right:45.83333333%;margin-left:0}.ant-col-md-push-12.ant-col-rtl{right:50%;left:auto}.ant-col-md-pull-12.ant-col-rtl{right:auto;left:50%}.ant-col-md-offset-12.ant-col-rtl{margin-right:50%;margin-left:0}.ant-col-md-push-13.ant-col-rtl{right:54.16666667%;left:auto}.ant-col-md-pull-13.ant-col-rtl{right:auto;left:54.16666667%}.ant-col-md-offset-13.ant-col-rtl{margin-right:54.16666667%;margin-left:0}.ant-col-md-push-14.ant-col-rtl{right:58.33333333%;left:auto}.ant-col-md-pull-14.ant-col-rtl{right:auto;left:58.33333333%}.ant-col-md-offset-14.ant-col-rtl{margin-right:58.33333333%;margin-left:0}.ant-col-md-push-15.ant-col-rtl{right:62.5%;left:auto}.ant-col-md-pull-15.ant-col-rtl{right:auto;left:62.5%}.ant-col-md-offset-15.ant-col-rtl{margin-right:62.5%;margin-left:0}.ant-col-md-push-16.ant-col-rtl{right:66.66666667%;left:auto}.ant-col-md-pull-16.ant-col-rtl{right:auto;left:66.66666667%}.ant-col-md-offset-16.ant-col-rtl{margin-right:66.66666667%;margin-left:0}.ant-col-md-push-17.ant-col-rtl{right:70.83333333%;left:auto}.ant-col-md-pull-17.ant-col-rtl{right:auto;left:70.83333333%}.ant-col-md-offset-17.ant-col-rtl{margin-right:70.83333333%;margin-left:0}.ant-col-md-push-18.ant-col-rtl{right:75%;left:auto}.ant-col-md-pull-18.ant-col-rtl{right:auto;left:75%}.ant-col-md-offset-18.ant-col-rtl{margin-right:75%;margin-left:0}.ant-col-md-push-19.ant-col-rtl{right:79.16666667%;left:auto}.ant-col-md-pull-19.ant-col-rtl{right:auto;left:79.16666667%}.ant-col-md-offset-19.ant-col-rtl{margin-right:79.16666667%;margin-left:0}.ant-col-md-push-20.ant-col-rtl{right:83.33333333%;left:auto}.ant-col-md-pull-20.ant-col-rtl{right:auto;left:83.33333333%}.ant-col-md-offset-20.ant-col-rtl{margin-right:83.33333333%;margin-left:0}.ant-col-md-push-21.ant-col-rtl{right:87.5%;left:auto}.ant-col-md-pull-21.ant-col-rtl{right:auto;left:87.5%}.ant-col-md-offset-21.ant-col-rtl{margin-right:87.5%;margin-left:0}.ant-col-md-push-22.ant-col-rtl{right:91.66666667%;left:auto}.ant-col-md-pull-22.ant-col-rtl{right:auto;left:91.66666667%}.ant-col-md-offset-22.ant-col-rtl{margin-right:91.66666667%;margin-left:0}.ant-col-md-push-23.ant-col-rtl{right:95.83333333%;left:auto}.ant-col-md-pull-23.ant-col-rtl{right:auto;left:95.83333333%}.ant-col-md-offset-23.ant-col-rtl{margin-right:95.83333333%;margin-left:0}.ant-col-md-push-24.ant-col-rtl{right:100%;left:auto}.ant-col-md-pull-24.ant-col-rtl{right:auto;left:100%}.ant-col-md-offset-24.ant-col-rtl{margin-right:100%;margin-left:0}}@media (min-width: 992px){.ant-col-lg-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-lg-push-24{left:100%}.ant-col-lg-pull-24{right:100%}.ant-col-lg-offset-24{margin-left:100%}.ant-col-lg-order-24{order:24}.ant-col-lg-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-lg-push-23{left:95.83333333%}.ant-col-lg-pull-23{right:95.83333333%}.ant-col-lg-offset-23{margin-left:95.83333333%}.ant-col-lg-order-23{order:23}.ant-col-lg-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-lg-push-22{left:91.66666667%}.ant-col-lg-pull-22{right:91.66666667%}.ant-col-lg-offset-22{margin-left:91.66666667%}.ant-col-lg-order-22{order:22}.ant-col-lg-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-lg-push-21{left:87.5%}.ant-col-lg-pull-21{right:87.5%}.ant-col-lg-offset-21{margin-left:87.5%}.ant-col-lg-order-21{order:21}.ant-col-lg-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-lg-push-20{left:83.33333333%}.ant-col-lg-pull-20{right:83.33333333%}.ant-col-lg-offset-20{margin-left:83.33333333%}.ant-col-lg-order-20{order:20}.ant-col-lg-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-lg-push-19{left:79.16666667%}.ant-col-lg-pull-19{right:79.16666667%}.ant-col-lg-offset-19{margin-left:79.16666667%}.ant-col-lg-order-19{order:19}.ant-col-lg-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-lg-push-18{left:75%}.ant-col-lg-pull-18{right:75%}.ant-col-lg-offset-18{margin-left:75%}.ant-col-lg-order-18{order:18}.ant-col-lg-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-lg-push-17{left:70.83333333%}.ant-col-lg-pull-17{right:70.83333333%}.ant-col-lg-offset-17{margin-left:70.83333333%}.ant-col-lg-order-17{order:17}.ant-col-lg-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-lg-push-16{left:66.66666667%}.ant-col-lg-pull-16{right:66.66666667%}.ant-col-lg-offset-16{margin-left:66.66666667%}.ant-col-lg-order-16{order:16}.ant-col-lg-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-lg-push-15{left:62.5%}.ant-col-lg-pull-15{right:62.5%}.ant-col-lg-offset-15{margin-left:62.5%}.ant-col-lg-order-15{order:15}.ant-col-lg-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-lg-push-14{left:58.33333333%}.ant-col-lg-pull-14{right:58.33333333%}.ant-col-lg-offset-14{margin-left:58.33333333%}.ant-col-lg-order-14{order:14}.ant-col-lg-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-lg-push-13{left:54.16666667%}.ant-col-lg-pull-13{right:54.16666667%}.ant-col-lg-offset-13{margin-left:54.16666667%}.ant-col-lg-order-13{order:13}.ant-col-lg-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-lg-push-12{left:50%}.ant-col-lg-pull-12{right:50%}.ant-col-lg-offset-12{margin-left:50%}.ant-col-lg-order-12{order:12}.ant-col-lg-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-lg-push-11{left:45.83333333%}.ant-col-lg-pull-11{right:45.83333333%}.ant-col-lg-offset-11{margin-left:45.83333333%}.ant-col-lg-order-11{order:11}.ant-col-lg-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-lg-push-10{left:41.66666667%}.ant-col-lg-pull-10{right:41.66666667%}.ant-col-lg-offset-10{margin-left:41.66666667%}.ant-col-lg-order-10{order:10}.ant-col-lg-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-lg-push-9{left:37.5%}.ant-col-lg-pull-9{right:37.5%}.ant-col-lg-offset-9{margin-left:37.5%}.ant-col-lg-order-9{order:9}.ant-col-lg-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-lg-push-8{left:33.33333333%}.ant-col-lg-pull-8{right:33.33333333%}.ant-col-lg-offset-8{margin-left:33.33333333%}.ant-col-lg-order-8{order:8}.ant-col-lg-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-lg-push-7{left:29.16666667%}.ant-col-lg-pull-7{right:29.16666667%}.ant-col-lg-offset-7{margin-left:29.16666667%}.ant-col-lg-order-7{order:7}.ant-col-lg-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-lg-push-6{left:25%}.ant-col-lg-pull-6{right:25%}.ant-col-lg-offset-6{margin-left:25%}.ant-col-lg-order-6{order:6}.ant-col-lg-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-lg-push-5{left:20.83333333%}.ant-col-lg-pull-5{right:20.83333333%}.ant-col-lg-offset-5{margin-left:20.83333333%}.ant-col-lg-order-5{order:5}.ant-col-lg-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-lg-push-4{left:16.66666667%}.ant-col-lg-pull-4{right:16.66666667%}.ant-col-lg-offset-4{margin-left:16.66666667%}.ant-col-lg-order-4{order:4}.ant-col-lg-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-lg-push-3{left:12.5%}.ant-col-lg-pull-3{right:12.5%}.ant-col-lg-offset-3{margin-left:12.5%}.ant-col-lg-order-3{order:3}.ant-col-lg-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-lg-push-2{left:8.33333333%}.ant-col-lg-pull-2{right:8.33333333%}.ant-col-lg-offset-2{margin-left:8.33333333%}.ant-col-lg-order-2{order:2}.ant-col-lg-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-lg-push-1{left:4.16666667%}.ant-col-lg-pull-1{right:4.16666667%}.ant-col-lg-offset-1{margin-left:4.16666667%}.ant-col-lg-order-1{order:1}.ant-col-lg-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-lg-push-0{left:auto}.ant-col-lg-pull-0{right:auto}.ant-col-lg-offset-0{margin-left:0}.ant-col-lg-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-lg-push-0.ant-col-rtl{right:auto}.ant-col-lg-pull-0.ant-col-rtl{left:auto}.ant-col-lg-offset-0.ant-col-rtl{margin-right:0}.ant-col-lg-push-1.ant-col-rtl{right:4.16666667%;left:auto}.ant-col-lg-pull-1.ant-col-rtl{right:auto;left:4.16666667%}.ant-col-lg-offset-1.ant-col-rtl{margin-right:4.16666667%;margin-left:0}.ant-col-lg-push-2.ant-col-rtl{right:8.33333333%;left:auto}.ant-col-lg-pull-2.ant-col-rtl{right:auto;left:8.33333333%}.ant-col-lg-offset-2.ant-col-rtl{margin-right:8.33333333%;margin-left:0}.ant-col-lg-push-3.ant-col-rtl{right:12.5%;left:auto}.ant-col-lg-pull-3.ant-col-rtl{right:auto;left:12.5%}.ant-col-lg-offset-3.ant-col-rtl{margin-right:12.5%;margin-left:0}.ant-col-lg-push-4.ant-col-rtl{right:16.66666667%;left:auto}.ant-col-lg-pull-4.ant-col-rtl{right:auto;left:16.66666667%}.ant-col-lg-offset-4.ant-col-rtl{margin-right:16.66666667%;margin-left:0}.ant-col-lg-push-5.ant-col-rtl{right:20.83333333%;left:auto}.ant-col-lg-pull-5.ant-col-rtl{right:auto;left:20.83333333%}.ant-col-lg-offset-5.ant-col-rtl{margin-right:20.83333333%;margin-left:0}.ant-col-lg-push-6.ant-col-rtl{right:25%;left:auto}.ant-col-lg-pull-6.ant-col-rtl{right:auto;left:25%}.ant-col-lg-offset-6.ant-col-rtl{margin-right:25%;margin-left:0}.ant-col-lg-push-7.ant-col-rtl{right:29.16666667%;left:auto}.ant-col-lg-pull-7.ant-col-rtl{right:auto;left:29.16666667%}.ant-col-lg-offset-7.ant-col-rtl{margin-right:29.16666667%;margin-left:0}.ant-col-lg-push-8.ant-col-rtl{right:33.33333333%;left:auto}.ant-col-lg-pull-8.ant-col-rtl{right:auto;left:33.33333333%}.ant-col-lg-offset-8.ant-col-rtl{margin-right:33.33333333%;margin-left:0}.ant-col-lg-push-9.ant-col-rtl{right:37.5%;left:auto}.ant-col-lg-pull-9.ant-col-rtl{right:auto;left:37.5%}.ant-col-lg-offset-9.ant-col-rtl{margin-right:37.5%;margin-left:0}.ant-col-lg-push-10.ant-col-rtl{right:41.66666667%;left:auto}.ant-col-lg-pull-10.ant-col-rtl{right:auto;left:41.66666667%}.ant-col-lg-offset-10.ant-col-rtl{margin-right:41.66666667%;margin-left:0}.ant-col-lg-push-11.ant-col-rtl{right:45.83333333%;left:auto}.ant-col-lg-pull-11.ant-col-rtl{right:auto;left:45.83333333%}.ant-col-lg-offset-11.ant-col-rtl{margin-right:45.83333333%;margin-left:0}.ant-col-lg-push-12.ant-col-rtl{right:50%;left:auto}.ant-col-lg-pull-12.ant-col-rtl{right:auto;left:50%}.ant-col-lg-offset-12.ant-col-rtl{margin-right:50%;margin-left:0}.ant-col-lg-push-13.ant-col-rtl{right:54.16666667%;left:auto}.ant-col-lg-pull-13.ant-col-rtl{right:auto;left:54.16666667%}.ant-col-lg-offset-13.ant-col-rtl{margin-right:54.16666667%;margin-left:0}.ant-col-lg-push-14.ant-col-rtl{right:58.33333333%;left:auto}.ant-col-lg-pull-14.ant-col-rtl{right:auto;left:58.33333333%}.ant-col-lg-offset-14.ant-col-rtl{margin-right:58.33333333%;margin-left:0}.ant-col-lg-push-15.ant-col-rtl{right:62.5%;left:auto}.ant-col-lg-pull-15.ant-col-rtl{right:auto;left:62.5%}.ant-col-lg-offset-15.ant-col-rtl{margin-right:62.5%;margin-left:0}.ant-col-lg-push-16.ant-col-rtl{right:66.66666667%;left:auto}.ant-col-lg-pull-16.ant-col-rtl{right:auto;left:66.66666667%}.ant-col-lg-offset-16.ant-col-rtl{margin-right:66.66666667%;margin-left:0}.ant-col-lg-push-17.ant-col-rtl{right:70.83333333%;left:auto}.ant-col-lg-pull-17.ant-col-rtl{right:auto;left:70.83333333%}.ant-col-lg-offset-17.ant-col-rtl{margin-right:70.83333333%;margin-left:0}.ant-col-lg-push-18.ant-col-rtl{right:75%;left:auto}.ant-col-lg-pull-18.ant-col-rtl{right:auto;left:75%}.ant-col-lg-offset-18.ant-col-rtl{margin-right:75%;margin-left:0}.ant-col-lg-push-19.ant-col-rtl{right:79.16666667%;left:auto}.ant-col-lg-pull-19.ant-col-rtl{right:auto;left:79.16666667%}.ant-col-lg-offset-19.ant-col-rtl{margin-right:79.16666667%;margin-left:0}.ant-col-lg-push-20.ant-col-rtl{right:83.33333333%;left:auto}.ant-col-lg-pull-20.ant-col-rtl{right:auto;left:83.33333333%}.ant-col-lg-offset-20.ant-col-rtl{margin-right:83.33333333%;margin-left:0}.ant-col-lg-push-21.ant-col-rtl{right:87.5%;left:auto}.ant-col-lg-pull-21.ant-col-rtl{right:auto;left:87.5%}.ant-col-lg-offset-21.ant-col-rtl{margin-right:87.5%;margin-left:0}.ant-col-lg-push-22.ant-col-rtl{right:91.66666667%;left:auto}.ant-col-lg-pull-22.ant-col-rtl{right:auto;left:91.66666667%}.ant-col-lg-offset-22.ant-col-rtl{margin-right:91.66666667%;margin-left:0}.ant-col-lg-push-23.ant-col-rtl{right:95.83333333%;left:auto}.ant-col-lg-pull-23.ant-col-rtl{right:auto;left:95.83333333%}.ant-col-lg-offset-23.ant-col-rtl{margin-right:95.83333333%;margin-left:0}.ant-col-lg-push-24.ant-col-rtl{right:100%;left:auto}.ant-col-lg-pull-24.ant-col-rtl{right:auto;left:100%}.ant-col-lg-offset-24.ant-col-rtl{margin-right:100%;margin-left:0}}@media (min-width: 1200px){.ant-col-xl-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-xl-push-24{left:100%}.ant-col-xl-pull-24{right:100%}.ant-col-xl-offset-24{margin-left:100%}.ant-col-xl-order-24{order:24}.ant-col-xl-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-xl-push-23{left:95.83333333%}.ant-col-xl-pull-23{right:95.83333333%}.ant-col-xl-offset-23{margin-left:95.83333333%}.ant-col-xl-order-23{order:23}.ant-col-xl-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-xl-push-22{left:91.66666667%}.ant-col-xl-pull-22{right:91.66666667%}.ant-col-xl-offset-22{margin-left:91.66666667%}.ant-col-xl-order-22{order:22}.ant-col-xl-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-xl-push-21{left:87.5%}.ant-col-xl-pull-21{right:87.5%}.ant-col-xl-offset-21{margin-left:87.5%}.ant-col-xl-order-21{order:21}.ant-col-xl-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-xl-push-20{left:83.33333333%}.ant-col-xl-pull-20{right:83.33333333%}.ant-col-xl-offset-20{margin-left:83.33333333%}.ant-col-xl-order-20{order:20}.ant-col-xl-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-xl-push-19{left:79.16666667%}.ant-col-xl-pull-19{right:79.16666667%}.ant-col-xl-offset-19{margin-left:79.16666667%}.ant-col-xl-order-19{order:19}.ant-col-xl-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-xl-push-18{left:75%}.ant-col-xl-pull-18{right:75%}.ant-col-xl-offset-18{margin-left:75%}.ant-col-xl-order-18{order:18}.ant-col-xl-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-xl-push-17{left:70.83333333%}.ant-col-xl-pull-17{right:70.83333333%}.ant-col-xl-offset-17{margin-left:70.83333333%}.ant-col-xl-order-17{order:17}.ant-col-xl-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-xl-push-16{left:66.66666667%}.ant-col-xl-pull-16{right:66.66666667%}.ant-col-xl-offset-16{margin-left:66.66666667%}.ant-col-xl-order-16{order:16}.ant-col-xl-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-xl-push-15{left:62.5%}.ant-col-xl-pull-15{right:62.5%}.ant-col-xl-offset-15{margin-left:62.5%}.ant-col-xl-order-15{order:15}.ant-col-xl-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-xl-push-14{left:58.33333333%}.ant-col-xl-pull-14{right:58.33333333%}.ant-col-xl-offset-14{margin-left:58.33333333%}.ant-col-xl-order-14{order:14}.ant-col-xl-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-xl-push-13{left:54.16666667%}.ant-col-xl-pull-13{right:54.16666667%}.ant-col-xl-offset-13{margin-left:54.16666667%}.ant-col-xl-order-13{order:13}.ant-col-xl-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-xl-push-12{left:50%}.ant-col-xl-pull-12{right:50%}.ant-col-xl-offset-12{margin-left:50%}.ant-col-xl-order-12{order:12}.ant-col-xl-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-xl-push-11{left:45.83333333%}.ant-col-xl-pull-11{right:45.83333333%}.ant-col-xl-offset-11{margin-left:45.83333333%}.ant-col-xl-order-11{order:11}.ant-col-xl-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-xl-push-10{left:41.66666667%}.ant-col-xl-pull-10{right:41.66666667%}.ant-col-xl-offset-10{margin-left:41.66666667%}.ant-col-xl-order-10{order:10}.ant-col-xl-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-xl-push-9{left:37.5%}.ant-col-xl-pull-9{right:37.5%}.ant-col-xl-offset-9{margin-left:37.5%}.ant-col-xl-order-9{order:9}.ant-col-xl-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-xl-push-8{left:33.33333333%}.ant-col-xl-pull-8{right:33.33333333%}.ant-col-xl-offset-8{margin-left:33.33333333%}.ant-col-xl-order-8{order:8}.ant-col-xl-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-xl-push-7{left:29.16666667%}.ant-col-xl-pull-7{right:29.16666667%}.ant-col-xl-offset-7{margin-left:29.16666667%}.ant-col-xl-order-7{order:7}.ant-col-xl-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-xl-push-6{left:25%}.ant-col-xl-pull-6{right:25%}.ant-col-xl-offset-6{margin-left:25%}.ant-col-xl-order-6{order:6}.ant-col-xl-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-xl-push-5{left:20.83333333%}.ant-col-xl-pull-5{right:20.83333333%}.ant-col-xl-offset-5{margin-left:20.83333333%}.ant-col-xl-order-5{order:5}.ant-col-xl-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-xl-push-4{left:16.66666667%}.ant-col-xl-pull-4{right:16.66666667%}.ant-col-xl-offset-4{margin-left:16.66666667%}.ant-col-xl-order-4{order:4}.ant-col-xl-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-xl-push-3{left:12.5%}.ant-col-xl-pull-3{right:12.5%}.ant-col-xl-offset-3{margin-left:12.5%}.ant-col-xl-order-3{order:3}.ant-col-xl-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-xl-push-2{left:8.33333333%}.ant-col-xl-pull-2{right:8.33333333%}.ant-col-xl-offset-2{margin-left:8.33333333%}.ant-col-xl-order-2{order:2}.ant-col-xl-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-xl-push-1{left:4.16666667%}.ant-col-xl-pull-1{right:4.16666667%}.ant-col-xl-offset-1{margin-left:4.16666667%}.ant-col-xl-order-1{order:1}.ant-col-xl-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-xl-push-0{left:auto}.ant-col-xl-pull-0{right:auto}.ant-col-xl-offset-0{margin-left:0}.ant-col-xl-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-xl-push-0.ant-col-rtl{right:auto}.ant-col-xl-pull-0.ant-col-rtl{left:auto}.ant-col-xl-offset-0.ant-col-rtl{margin-right:0}.ant-col-xl-push-1.ant-col-rtl{right:4.16666667%;left:auto}.ant-col-xl-pull-1.ant-col-rtl{right:auto;left:4.16666667%}.ant-col-xl-offset-1.ant-col-rtl{margin-right:4.16666667%;margin-left:0}.ant-col-xl-push-2.ant-col-rtl{right:8.33333333%;left:auto}.ant-col-xl-pull-2.ant-col-rtl{right:auto;left:8.33333333%}.ant-col-xl-offset-2.ant-col-rtl{margin-right:8.33333333%;margin-left:0}.ant-col-xl-push-3.ant-col-rtl{right:12.5%;left:auto}.ant-col-xl-pull-3.ant-col-rtl{right:auto;left:12.5%}.ant-col-xl-offset-3.ant-col-rtl{margin-right:12.5%;margin-left:0}.ant-col-xl-push-4.ant-col-rtl{right:16.66666667%;left:auto}.ant-col-xl-pull-4.ant-col-rtl{right:auto;left:16.66666667%}.ant-col-xl-offset-4.ant-col-rtl{margin-right:16.66666667%;margin-left:0}.ant-col-xl-push-5.ant-col-rtl{right:20.83333333%;left:auto}.ant-col-xl-pull-5.ant-col-rtl{right:auto;left:20.83333333%}.ant-col-xl-offset-5.ant-col-rtl{margin-right:20.83333333%;margin-left:0}.ant-col-xl-push-6.ant-col-rtl{right:25%;left:auto}.ant-col-xl-pull-6.ant-col-rtl{right:auto;left:25%}.ant-col-xl-offset-6.ant-col-rtl{margin-right:25%;margin-left:0}.ant-col-xl-push-7.ant-col-rtl{right:29.16666667%;left:auto}.ant-col-xl-pull-7.ant-col-rtl{right:auto;left:29.16666667%}.ant-col-xl-offset-7.ant-col-rtl{margin-right:29.16666667%;margin-left:0}.ant-col-xl-push-8.ant-col-rtl{right:33.33333333%;left:auto}.ant-col-xl-pull-8.ant-col-rtl{right:auto;left:33.33333333%}.ant-col-xl-offset-8.ant-col-rtl{margin-right:33.33333333%;margin-left:0}.ant-col-xl-push-9.ant-col-rtl{right:37.5%;left:auto}.ant-col-xl-pull-9.ant-col-rtl{right:auto;left:37.5%}.ant-col-xl-offset-9.ant-col-rtl{margin-right:37.5%;margin-left:0}.ant-col-xl-push-10.ant-col-rtl{right:41.66666667%;left:auto}.ant-col-xl-pull-10.ant-col-rtl{right:auto;left:41.66666667%}.ant-col-xl-offset-10.ant-col-rtl{margin-right:41.66666667%;margin-left:0}.ant-col-xl-push-11.ant-col-rtl{right:45.83333333%;left:auto}.ant-col-xl-pull-11.ant-col-rtl{right:auto;left:45.83333333%}.ant-col-xl-offset-11.ant-col-rtl{margin-right:45.83333333%;margin-left:0}.ant-col-xl-push-12.ant-col-rtl{right:50%;left:auto}.ant-col-xl-pull-12.ant-col-rtl{right:auto;left:50%}.ant-col-xl-offset-12.ant-col-rtl{margin-right:50%;margin-left:0}.ant-col-xl-push-13.ant-col-rtl{right:54.16666667%;left:auto}.ant-col-xl-pull-13.ant-col-rtl{right:auto;left:54.16666667%}.ant-col-xl-offset-13.ant-col-rtl{margin-right:54.16666667%;margin-left:0}.ant-col-xl-push-14.ant-col-rtl{right:58.33333333%;left:auto}.ant-col-xl-pull-14.ant-col-rtl{right:auto;left:58.33333333%}.ant-col-xl-offset-14.ant-col-rtl{margin-right:58.33333333%;margin-left:0}.ant-col-xl-push-15.ant-col-rtl{right:62.5%;left:auto}.ant-col-xl-pull-15.ant-col-rtl{right:auto;left:62.5%}.ant-col-xl-offset-15.ant-col-rtl{margin-right:62.5%;margin-left:0}.ant-col-xl-push-16.ant-col-rtl{right:66.66666667%;left:auto}.ant-col-xl-pull-16.ant-col-rtl{right:auto;left:66.66666667%}.ant-col-xl-offset-16.ant-col-rtl{margin-right:66.66666667%;margin-left:0}.ant-col-xl-push-17.ant-col-rtl{right:70.83333333%;left:auto}.ant-col-xl-pull-17.ant-col-rtl{right:auto;left:70.83333333%}.ant-col-xl-offset-17.ant-col-rtl{margin-right:70.83333333%;margin-left:0}.ant-col-xl-push-18.ant-col-rtl{right:75%;left:auto}.ant-col-xl-pull-18.ant-col-rtl{right:auto;left:75%}.ant-col-xl-offset-18.ant-col-rtl{margin-right:75%;margin-left:0}.ant-col-xl-push-19.ant-col-rtl{right:79.16666667%;left:auto}.ant-col-xl-pull-19.ant-col-rtl{right:auto;left:79.16666667%}.ant-col-xl-offset-19.ant-col-rtl{margin-right:79.16666667%;margin-left:0}.ant-col-xl-push-20.ant-col-rtl{right:83.33333333%;left:auto}.ant-col-xl-pull-20.ant-col-rtl{right:auto;left:83.33333333%}.ant-col-xl-offset-20.ant-col-rtl{margin-right:83.33333333%;margin-left:0}.ant-col-xl-push-21.ant-col-rtl{right:87.5%;left:auto}.ant-col-xl-pull-21.ant-col-rtl{right:auto;left:87.5%}.ant-col-xl-offset-21.ant-col-rtl{margin-right:87.5%;margin-left:0}.ant-col-xl-push-22.ant-col-rtl{right:91.66666667%;left:auto}.ant-col-xl-pull-22.ant-col-rtl{right:auto;left:91.66666667%}.ant-col-xl-offset-22.ant-col-rtl{margin-right:91.66666667%;margin-left:0}.ant-col-xl-push-23.ant-col-rtl{right:95.83333333%;left:auto}.ant-col-xl-pull-23.ant-col-rtl{right:auto;left:95.83333333%}.ant-col-xl-offset-23.ant-col-rtl{margin-right:95.83333333%;margin-left:0}.ant-col-xl-push-24.ant-col-rtl{right:100%;left:auto}.ant-col-xl-pull-24.ant-col-rtl{right:auto;left:100%}.ant-col-xl-offset-24.ant-col-rtl{margin-right:100%;margin-left:0}}@media (min-width: 1600px){.ant-col-xxl-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-xxl-push-24{left:100%}.ant-col-xxl-pull-24{right:100%}.ant-col-xxl-offset-24{margin-left:100%}.ant-col-xxl-order-24{order:24}.ant-col-xxl-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-xxl-push-23{left:95.83333333%}.ant-col-xxl-pull-23{right:95.83333333%}.ant-col-xxl-offset-23{margin-left:95.83333333%}.ant-col-xxl-order-23{order:23}.ant-col-xxl-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-xxl-push-22{left:91.66666667%}.ant-col-xxl-pull-22{right:91.66666667%}.ant-col-xxl-offset-22{margin-left:91.66666667%}.ant-col-xxl-order-22{order:22}.ant-col-xxl-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-xxl-push-21{left:87.5%}.ant-col-xxl-pull-21{right:87.5%}.ant-col-xxl-offset-21{margin-left:87.5%}.ant-col-xxl-order-21{order:21}.ant-col-xxl-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-xxl-push-20{left:83.33333333%}.ant-col-xxl-pull-20{right:83.33333333%}.ant-col-xxl-offset-20{margin-left:83.33333333%}.ant-col-xxl-order-20{order:20}.ant-col-xxl-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-xxl-push-19{left:79.16666667%}.ant-col-xxl-pull-19{right:79.16666667%}.ant-col-xxl-offset-19{margin-left:79.16666667%}.ant-col-xxl-order-19{order:19}.ant-col-xxl-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-xxl-push-18{left:75%}.ant-col-xxl-pull-18{right:75%}.ant-col-xxl-offset-18{margin-left:75%}.ant-col-xxl-order-18{order:18}.ant-col-xxl-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-xxl-push-17{left:70.83333333%}.ant-col-xxl-pull-17{right:70.83333333%}.ant-col-xxl-offset-17{margin-left:70.83333333%}.ant-col-xxl-order-17{order:17}.ant-col-xxl-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-xxl-push-16{left:66.66666667%}.ant-col-xxl-pull-16{right:66.66666667%}.ant-col-xxl-offset-16{margin-left:66.66666667%}.ant-col-xxl-order-16{order:16}.ant-col-xxl-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-xxl-push-15{left:62.5%}.ant-col-xxl-pull-15{right:62.5%}.ant-col-xxl-offset-15{margin-left:62.5%}.ant-col-xxl-order-15{order:15}.ant-col-xxl-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-xxl-push-14{left:58.33333333%}.ant-col-xxl-pull-14{right:58.33333333%}.ant-col-xxl-offset-14{margin-left:58.33333333%}.ant-col-xxl-order-14{order:14}.ant-col-xxl-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-xxl-push-13{left:54.16666667%}.ant-col-xxl-pull-13{right:54.16666667%}.ant-col-xxl-offset-13{margin-left:54.16666667%}.ant-col-xxl-order-13{order:13}.ant-col-xxl-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-xxl-push-12{left:50%}.ant-col-xxl-pull-12{right:50%}.ant-col-xxl-offset-12{margin-left:50%}.ant-col-xxl-order-12{order:12}.ant-col-xxl-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-xxl-push-11{left:45.83333333%}.ant-col-xxl-pull-11{right:45.83333333%}.ant-col-xxl-offset-11{margin-left:45.83333333%}.ant-col-xxl-order-11{order:11}.ant-col-xxl-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-xxl-push-10{left:41.66666667%}.ant-col-xxl-pull-10{right:41.66666667%}.ant-col-xxl-offset-10{margin-left:41.66666667%}.ant-col-xxl-order-10{order:10}.ant-col-xxl-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-xxl-push-9{left:37.5%}.ant-col-xxl-pull-9{right:37.5%}.ant-col-xxl-offset-9{margin-left:37.5%}.ant-col-xxl-order-9{order:9}.ant-col-xxl-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-xxl-push-8{left:33.33333333%}.ant-col-xxl-pull-8{right:33.33333333%}.ant-col-xxl-offset-8{margin-left:33.33333333%}.ant-col-xxl-order-8{order:8}.ant-col-xxl-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-xxl-push-7{left:29.16666667%}.ant-col-xxl-pull-7{right:29.16666667%}.ant-col-xxl-offset-7{margin-left:29.16666667%}.ant-col-xxl-order-7{order:7}.ant-col-xxl-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-xxl-push-6{left:25%}.ant-col-xxl-pull-6{right:25%}.ant-col-xxl-offset-6{margin-left:25%}.ant-col-xxl-order-6{order:6}.ant-col-xxl-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-xxl-push-5{left:20.83333333%}.ant-col-xxl-pull-5{right:20.83333333%}.ant-col-xxl-offset-5{margin-left:20.83333333%}.ant-col-xxl-order-5{order:5}.ant-col-xxl-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-xxl-push-4{left:16.66666667%}.ant-col-xxl-pull-4{right:16.66666667%}.ant-col-xxl-offset-4{margin-left:16.66666667%}.ant-col-xxl-order-4{order:4}.ant-col-xxl-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-xxl-push-3{left:12.5%}.ant-col-xxl-pull-3{right:12.5%}.ant-col-xxl-offset-3{margin-left:12.5%}.ant-col-xxl-order-3{order:3}.ant-col-xxl-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-xxl-push-2{left:8.33333333%}.ant-col-xxl-pull-2{right:8.33333333%}.ant-col-xxl-offset-2{margin-left:8.33333333%}.ant-col-xxl-order-2{order:2}.ant-col-xxl-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-xxl-push-1{left:4.16666667%}.ant-col-xxl-pull-1{right:4.16666667%}.ant-col-xxl-offset-1{margin-left:4.16666667%}.ant-col-xxl-order-1{order:1}.ant-col-xxl-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-xxl-push-0{left:auto}.ant-col-xxl-pull-0{right:auto}.ant-col-xxl-offset-0{margin-left:0}.ant-col-xxl-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-xxl-push-0.ant-col-rtl{right:auto}.ant-col-xxl-pull-0.ant-col-rtl{left:auto}.ant-col-xxl-offset-0.ant-col-rtl{margin-right:0}.ant-col-xxl-push-1.ant-col-rtl{right:4.16666667%;left:auto}.ant-col-xxl-pull-1.ant-col-rtl{right:auto;left:4.16666667%}.ant-col-xxl-offset-1.ant-col-rtl{margin-right:4.16666667%;margin-left:0}.ant-col-xxl-push-2.ant-col-rtl{right:8.33333333%;left:auto}.ant-col-xxl-pull-2.ant-col-rtl{right:auto;left:8.33333333%}.ant-col-xxl-offset-2.ant-col-rtl{margin-right:8.33333333%;margin-left:0}.ant-col-xxl-push-3.ant-col-rtl{right:12.5%;left:auto}.ant-col-xxl-pull-3.ant-col-rtl{right:auto;left:12.5%}.ant-col-xxl-offset-3.ant-col-rtl{margin-right:12.5%;margin-left:0}.ant-col-xxl-push-4.ant-col-rtl{right:16.66666667%;left:auto}.ant-col-xxl-pull-4.ant-col-rtl{right:auto;left:16.66666667%}.ant-col-xxl-offset-4.ant-col-rtl{margin-right:16.66666667%;margin-left:0}.ant-col-xxl-push-5.ant-col-rtl{right:20.83333333%;left:auto}.ant-col-xxl-pull-5.ant-col-rtl{right:auto;left:20.83333333%}.ant-col-xxl-offset-5.ant-col-rtl{margin-right:20.83333333%;margin-left:0}.ant-col-xxl-push-6.ant-col-rtl{right:25%;left:auto}.ant-col-xxl-pull-6.ant-col-rtl{right:auto;left:25%}.ant-col-xxl-offset-6.ant-col-rtl{margin-right:25%;margin-left:0}.ant-col-xxl-push-7.ant-col-rtl{right:29.16666667%;left:auto}.ant-col-xxl-pull-7.ant-col-rtl{right:auto;left:29.16666667%}.ant-col-xxl-offset-7.ant-col-rtl{margin-right:29.16666667%;margin-left:0}.ant-col-xxl-push-8.ant-col-rtl{right:33.33333333%;left:auto}.ant-col-xxl-pull-8.ant-col-rtl{right:auto;left:33.33333333%}.ant-col-xxl-offset-8.ant-col-rtl{margin-right:33.33333333%;margin-left:0}.ant-col-xxl-push-9.ant-col-rtl{right:37.5%;left:auto}.ant-col-xxl-pull-9.ant-col-rtl{right:auto;left:37.5%}.ant-col-xxl-offset-9.ant-col-rtl{margin-right:37.5%;margin-left:0}.ant-col-xxl-push-10.ant-col-rtl{right:41.66666667%;left:auto}.ant-col-xxl-pull-10.ant-col-rtl{right:auto;left:41.66666667%}.ant-col-xxl-offset-10.ant-col-rtl{margin-right:41.66666667%;margin-left:0}.ant-col-xxl-push-11.ant-col-rtl{right:45.83333333%;left:auto}.ant-col-xxl-pull-11.ant-col-rtl{right:auto;left:45.83333333%}.ant-col-xxl-offset-11.ant-col-rtl{margin-right:45.83333333%;margin-left:0}.ant-col-xxl-push-12.ant-col-rtl{right:50%;left:auto}.ant-col-xxl-pull-12.ant-col-rtl{right:auto;left:50%}.ant-col-xxl-offset-12.ant-col-rtl{margin-right:50%;margin-left:0}.ant-col-xxl-push-13.ant-col-rtl{right:54.16666667%;left:auto}.ant-col-xxl-pull-13.ant-col-rtl{right:auto;left:54.16666667%}.ant-col-xxl-offset-13.ant-col-rtl{margin-right:54.16666667%;margin-left:0}.ant-col-xxl-push-14.ant-col-rtl{right:58.33333333%;left:auto}.ant-col-xxl-pull-14.ant-col-rtl{right:auto;left:58.33333333%}.ant-col-xxl-offset-14.ant-col-rtl{margin-right:58.33333333%;margin-left:0}.ant-col-xxl-push-15.ant-col-rtl{right:62.5%;left:auto}.ant-col-xxl-pull-15.ant-col-rtl{right:auto;left:62.5%}.ant-col-xxl-offset-15.ant-col-rtl{margin-right:62.5%;margin-left:0}.ant-col-xxl-push-16.ant-col-rtl{right:66.66666667%;left:auto}.ant-col-xxl-pull-16.ant-col-rtl{right:auto;left:66.66666667%}.ant-col-xxl-offset-16.ant-col-rtl{margin-right:66.66666667%;margin-left:0}.ant-col-xxl-push-17.ant-col-rtl{right:70.83333333%;left:auto}.ant-col-xxl-pull-17.ant-col-rtl{right:auto;left:70.83333333%}.ant-col-xxl-offset-17.ant-col-rtl{margin-right:70.83333333%;margin-left:0}.ant-col-xxl-push-18.ant-col-rtl{right:75%;left:auto}.ant-col-xxl-pull-18.ant-col-rtl{right:auto;left:75%}.ant-col-xxl-offset-18.ant-col-rtl{margin-right:75%;margin-left:0}.ant-col-xxl-push-19.ant-col-rtl{right:79.16666667%;left:auto}.ant-col-xxl-pull-19.ant-col-rtl{right:auto;left:79.16666667%}.ant-col-xxl-offset-19.ant-col-rtl{margin-right:79.16666667%;margin-left:0}.ant-col-xxl-push-20.ant-col-rtl{right:83.33333333%;left:auto}.ant-col-xxl-pull-20.ant-col-rtl{right:auto;left:83.33333333%}.ant-col-xxl-offset-20.ant-col-rtl{margin-right:83.33333333%;margin-left:0}.ant-col-xxl-push-21.ant-col-rtl{right:87.5%;left:auto}.ant-col-xxl-pull-21.ant-col-rtl{right:auto;left:87.5%}.ant-col-xxl-offset-21.ant-col-rtl{margin-right:87.5%;margin-left:0}.ant-col-xxl-push-22.ant-col-rtl{right:91.66666667%;left:auto}.ant-col-xxl-pull-22.ant-col-rtl{right:auto;left:91.66666667%}.ant-col-xxl-offset-22.ant-col-rtl{margin-right:91.66666667%;margin-left:0}.ant-col-xxl-push-23.ant-col-rtl{right:95.83333333%;left:auto}.ant-col-xxl-pull-23.ant-col-rtl{right:auto;left:95.83333333%}.ant-col-xxl-offset-23.ant-col-rtl{margin-right:95.83333333%;margin-left:0}.ant-col-xxl-push-24.ant-col-rtl{right:100%;left:auto}.ant-col-xxl-pull-24.ant-col-rtl{right:auto;left:100%}.ant-col-xxl-offset-24.ant-col-rtl{margin-right:100%;margin-left:0}}.ant-row-rtl{direction:rtl}.ant-collapse{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";background-color:#fafafa;border:1px solid #d9d9d9;border-bottom:0;border-radius:2px}.ant-collapse>.ant-collapse-item{border-bottom:1px solid #d9d9d9}.ant-collapse>.ant-collapse-item:last-child,.ant-collapse>.ant-collapse-item:last-child>.ant-collapse-header{border-radius:0 0 2px 2px}.ant-collapse>.ant-collapse-item>.ant-collapse-header{position:relative;display:flex;flex-wrap:nowrap;align-items:flex-start;padding:12px 16px;color:#000000d9;line-height:1.5715;cursor:pointer;transition:all .3s,visibility 0s}.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow{display:inline-block;margin-right:12px;font-size:12px;vertical-align:-1px}.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow svg{transition:transform .24s}.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-header-text{flex:auto}.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-extra{margin-left:auto}.ant-collapse>.ant-collapse-item>.ant-collapse-header:focus{outline:none}.ant-collapse>.ant-collapse-item .ant-collapse-header-collapsible-only{cursor:default}.ant-collapse>.ant-collapse-item .ant-collapse-header-collapsible-only .ant-collapse-header-text{flex:none;cursor:pointer}.ant-collapse>.ant-collapse-item .ant-collapse-icon-collapsible-only{cursor:default}.ant-collapse>.ant-collapse-item .ant-collapse-icon-collapsible-only .ant-collapse-expand-icon{cursor:pointer}.ant-collapse>.ant-collapse-item.ant-collapse-no-arrow>.ant-collapse-header{padding-left:12px}.ant-collapse-icon-position-end>.ant-collapse-item>.ant-collapse-header{position:relative;padding:12px 40px 12px 16px}.ant-collapse-icon-position-end>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow{position:absolute;top:50%;right:16px;left:auto;margin:0;transform:translateY(-50%)}.ant-collapse-content{color:#000000d9;background-color:#fff;border-top:1px solid #d9d9d9}.ant-collapse-content>.ant-collapse-content-box{padding:16px}.ant-collapse-content-hidden{display:none}.ant-collapse-item:last-child>.ant-collapse-content{border-radius:0 0 2px 2px}.ant-collapse-borderless{background-color:#fafafa;border:0}.ant-collapse-borderless>.ant-collapse-item{border-bottom:1px solid #d9d9d9}.ant-collapse-borderless>.ant-collapse-item:last-child,.ant-collapse-borderless>.ant-collapse-item:last-child .ant-collapse-header{border-radius:0}.ant-collapse-borderless>.ant-collapse-item:last-child{border-bottom:0}.ant-collapse-borderless>.ant-collapse-item>.ant-collapse-content{background-color:transparent;border-top:0}.ant-collapse-borderless>.ant-collapse-item>.ant-collapse-content>.ant-collapse-content-box{padding-top:4px}.ant-collapse-ghost{background-color:transparent;border:0}.ant-collapse-ghost>.ant-collapse-item{border-bottom:0}.ant-collapse-ghost>.ant-collapse-item>.ant-collapse-content{background-color:transparent;border-top:0}.ant-collapse-ghost>.ant-collapse-item>.ant-collapse-content>.ant-collapse-content-box{padding-top:12px;padding-bottom:12px}.ant-collapse .ant-collapse-item-disabled>.ant-collapse-header,.ant-collapse .ant-collapse-item-disabled>.ant-collapse-header>.arrow{color:#00000040;cursor:not-allowed}.ant-collapse-rtl{direction:rtl}.ant-collapse-rtl.ant-collapse.ant-collapse-icon-position-end>.ant-collapse-item>.ant-collapse-header{position:relative;padding:12px 16px 12px 40px}.ant-collapse-rtl.ant-collapse.ant-collapse-icon-position-end>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow{position:absolute;top:50%;right:auto;left:16px;margin:0;transform:translateY(-50%)}.ant-collapse-rtl .ant-collapse>.ant-collapse-item>.ant-collapse-header{padding:12px 40px 12px 16px}.ant-collapse-rtl.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow{margin-right:0;margin-left:12px}.ant-collapse-rtl.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow svg{transform:rotate(180deg)}.ant-collapse-rtl.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-extra{margin-right:auto;margin-left:0}.ant-collapse-rtl.ant-collapse>.ant-collapse-item.ant-collapse-no-arrow>.ant-collapse-header{padding-right:12px;padding-left:0}.ant-comment{position:relative;background-color:inherit}.ant-comment-inner{display:flex;padding:16px 0}.ant-comment-avatar{position:relative;flex-shrink:0;margin-right:12px;cursor:pointer}.ant-comment-avatar img{width:32px;height:32px;border-radius:50%}.ant-comment-content{position:relative;flex:1 1 auto;min-width:1px;font-size:14px;word-wrap:break-word}.ant-comment-content-author{display:flex;flex-wrap:wrap;justify-content:flex-start;margin-bottom:4px;font-size:14px}.ant-comment-content-author>a,.ant-comment-content-author>span{padding-right:8px;font-size:12px;line-height:18px}.ant-comment-content-author-name{color:#00000073;font-size:14px;transition:color .3s}.ant-comment-content-author-name>*{color:#00000073}.ant-comment-content-author-name>*:hover{color:#00000073}.ant-comment-content-author-time{color:#ccc;white-space:nowrap;cursor:auto}.ant-comment-content-detail p{margin-bottom:inherit;white-space:pre-wrap}.ant-comment-actions{margin-top:12px;margin-bottom:inherit;padding-left:0}.ant-comment-actions>li{display:inline-block;color:#00000073}.ant-comment-actions>li>span{margin-right:10px;color:#00000073;font-size:12px;cursor:pointer;transition:color .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-comment-actions>li>span:hover{color:#595959}.ant-comment-nested{margin-left:44px}.ant-comment-rtl{direction:rtl}.ant-comment-rtl .ant-comment-avatar{margin-right:0;margin-left:12px}.ant-comment-rtl .ant-comment-content-author>a,.ant-comment-rtl .ant-comment-content-author>span{padding-right:0;padding-left:8px}.ant-comment-rtl .ant-comment-actions{padding-right:0}.ant-comment-rtl .ant-comment-actions>li>span{margin-right:0;margin-left:10px}.ant-comment-rtl .ant-comment-nested{margin-right:44px;margin-left:0}.ant-descriptions-header{display:flex;align-items:center;margin-bottom:20px}.ant-descriptions-title{flex:auto;overflow:hidden;color:#000000d9;font-weight:700;font-size:16px;line-height:1.5715;white-space:nowrap;text-overflow:ellipsis}.ant-descriptions-extra{margin-left:auto;color:#000000d9;font-size:14px}.ant-descriptions-view{width:100%;border-radius:2px}.ant-descriptions-view table{width:100%;table-layout:fixed}.ant-descriptions-row>th,.ant-descriptions-row>td{padding-bottom:16px}.ant-descriptions-row:last-child{border-bottom:none}.ant-descriptions-item-label{color:#000000d9;font-weight:400;font-size:14px;line-height:1.5715;text-align:start}.ant-descriptions-item-label:after{content:":";position:relative;top:-.5px;margin:0 8px 0 2px}.ant-descriptions-item-label.ant-descriptions-item-no-colon:after{content:" "}.ant-descriptions-item-no-label:after{margin:0;content:""}.ant-descriptions-item-content{display:table-cell;flex:1;color:#000000d9;font-size:14px;line-height:1.5715;word-break:break-word;overflow-wrap:break-word}.ant-descriptions-item{padding-bottom:0;vertical-align:top}.ant-descriptions-item-container{display:flex}.ant-descriptions-item-container .ant-descriptions-item-label,.ant-descriptions-item-container .ant-descriptions-item-content{display:inline-flex;align-items:baseline}.ant-descriptions-middle .ant-descriptions-row>th,.ant-descriptions-middle .ant-descriptions-row>td{padding-bottom:12px}.ant-descriptions-small .ant-descriptions-row>th,.ant-descriptions-small .ant-descriptions-row>td{padding-bottom:8px}.ant-descriptions-bordered .ant-descriptions-view{border:1px solid #f0f0f0}.ant-descriptions-bordered .ant-descriptions-view>table{table-layout:auto;border-collapse:collapse}.ant-descriptions-bordered .ant-descriptions-item-label,.ant-descriptions-bordered .ant-descriptions-item-content{padding:16px 24px;border-right:1px solid #f0f0f0}.ant-descriptions-bordered .ant-descriptions-item-label:last-child,.ant-descriptions-bordered .ant-descriptions-item-content:last-child{border-right:none}.ant-descriptions-bordered .ant-descriptions-item-label{background-color:#fafafa}.ant-descriptions-bordered .ant-descriptions-item-label:after{display:none}.ant-descriptions-bordered .ant-descriptions-row{border-bottom:1px solid #f0f0f0}.ant-descriptions-bordered .ant-descriptions-row:last-child{border-bottom:none}.ant-descriptions-bordered.ant-descriptions-middle .ant-descriptions-item-label,.ant-descriptions-bordered.ant-descriptions-middle .ant-descriptions-item-content{padding:12px 24px}.ant-descriptions-bordered.ant-descriptions-small .ant-descriptions-item-label,.ant-descriptions-bordered.ant-descriptions-small .ant-descriptions-item-content{padding:8px 16px}.ant-descriptions-rtl{direction:rtl}.ant-descriptions-rtl .ant-descriptions-item-label:after{margin:0 2px 0 8px}.ant-descriptions-rtl.ant-descriptions-bordered .ant-descriptions-item-label,.ant-descriptions-rtl.ant-descriptions-bordered .ant-descriptions-item-content{border-right:none;border-left:1px solid #f0f0f0}.ant-descriptions-rtl.ant-descriptions-bordered .ant-descriptions-item-label:last-child,.ant-descriptions-rtl.ant-descriptions-bordered .ant-descriptions-item-content:last-child{border-left:none}.ant-divider{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";border-top:1px solid rgba(0,0,0,.06)}.ant-divider-vertical{position:relative;top:-.06em;display:inline-block;height:.9em;margin:0 8px;vertical-align:middle;border-top:0;border-left:1px solid rgba(0,0,0,.06)}.ant-divider-horizontal{display:flex;clear:both;width:100%;min-width:100%;margin:24px 0}.ant-divider-horizontal.ant-divider-with-text{display:flex;align-items:center;margin:16px 0;color:#000000d9;font-weight:500;font-size:16px;white-space:nowrap;text-align:center;border-top:0;border-top-color:#0000000f}.ant-divider-horizontal.ant-divider-with-text:before,.ant-divider-horizontal.ant-divider-with-text:after{position:relative;width:50%;border-top:1px solid transparent;border-top-color:inherit;border-bottom:0;transform:translateY(50%);content:""}.ant-divider-horizontal.ant-divider-with-text-left:before{width:5%}.ant-divider-horizontal.ant-divider-with-text-left:after{width:95%}.ant-divider-horizontal.ant-divider-with-text-right:before{width:95%}.ant-divider-horizontal.ant-divider-with-text-right:after{width:5%}.ant-divider-inner-text{display:inline-block;padding:0 1em}.ant-divider-dashed{background:none;border-color:#0000000f;border-style:dashed;border-width:1px 0 0}.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed:before,.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed:after{border-style:dashed none none}.ant-divider-vertical.ant-divider-dashed{border-width:0 0 0 1px}.ant-divider-plain.ant-divider-with-text{color:#000000d9;font-weight:400;font-size:14px}.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-no-default-orientation-margin-left:before{width:0}.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-no-default-orientation-margin-left:after{width:100%}.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-no-default-orientation-margin-left .ant-divider-inner-text{padding-left:0}.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-no-default-orientation-margin-right:before{width:100%}.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-no-default-orientation-margin-right:after{width:0}.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-no-default-orientation-margin-right .ant-divider-inner-text{padding-right:0}.ant-divider-rtl{direction:rtl}.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-left:before{width:95%}.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-left:after{width:5%}.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-right:before{width:5%}.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-right:after{width:95%}.ant-drawer{position:fixed;inset:0;z-index:1000;pointer-events:none}.ant-drawer-inline{position:absolute}.ant-drawer-mask{position:absolute;inset:0;z-index:1000;background:rgba(0,0,0,.45);pointer-events:auto}.ant-drawer-content-wrapper{position:absolute;z-index:1000;transition:all .3s}.ant-drawer-content-wrapper-hidden{display:none}.ant-drawer-left>.ant-drawer-content-wrapper{top:0;bottom:0;left:0;box-shadow:6px 0 16px -8px #00000014,9px 0 28px #0000000d,12px 0 48px 16px #00000008}.ant-drawer-right>.ant-drawer-content-wrapper{top:0;right:0;bottom:0;box-shadow:-6px 0 16px -8px #00000014,-9px 0 28px #0000000d,-12px 0 48px 16px #00000008}.ant-drawer-top>.ant-drawer-content-wrapper{top:0;right:0;left:0;box-shadow:0 6px 16px -8px #00000014,0 9px 28px #0000000d,0 12px 48px 16px #00000008}.ant-drawer-bottom>.ant-drawer-content-wrapper{right:0;bottom:0;left:0;box-shadow:0 -6px 16px -8px #00000014,0 -9px 28px #0000000d,0 -12px 48px 16px #00000008}.ant-drawer-content{width:100%;height:100%;overflow:auto;background:#fff;pointer-events:auto}.ant-drawer-wrapper-body{display:flex;flex-direction:column;width:100%;height:100%}.ant-drawer-header{display:flex;flex:0;align-items:center;padding:16px 24px;font-size:16px;line-height:22px;border-bottom:1px solid #f0f0f0}.ant-drawer-header-title{display:flex;flex:1;align-items:center;min-width:0;min-height:0}.ant-drawer-extra{flex:none}.ant-drawer-close{display:inline-block;margin-right:12px;color:#00000073;font-weight:700;font-size:16px;font-style:normal;line-height:1;text-align:center;text-transform:none;text-decoration:none;background:transparent;border:0;outline:0;cursor:pointer;transition:color .3s;text-rendering:auto}.ant-drawer-close:focus,.ant-drawer-close:hover{color:#000000bf;text-decoration:none}.ant-drawer-title{flex:1;margin:0;color:#000000d9;font-weight:500;font-size:16px;line-height:22px}.ant-drawer-body{flex:1;min-width:0;min-height:0;padding:24px;overflow:auto}.ant-drawer-footer{flex-shrink:0;padding:10px 16px;border-top:1px solid #f0f0f0}.panel-motion-enter-start,.panel-motion-appear-start,.panel-motion-leave-start{transition:none}.panel-motion-enter-active,.panel-motion-appear-active,.panel-motion-leave-active,.ant-drawer-mask-motion-enter-active,.ant-drawer-mask-motion-appear-active,.ant-drawer-mask-motion-leave-active{transition:all .3s}.ant-drawer-mask-motion-enter,.ant-drawer-mask-motion-appear{opacity:0}.ant-drawer-mask-motion-enter-active,.ant-drawer-mask-motion-appear-active,.ant-drawer-mask-motion-leave{opacity:1}.ant-drawer-mask-motion-leave-active{opacity:0}.ant-drawer-panel-motion-left-enter-start,.ant-drawer-panel-motion-left-appear-start,.ant-drawer-panel-motion-left-leave-start{transition:none}.ant-drawer-panel-motion-left-enter-active,.ant-drawer-panel-motion-left-appear-active,.ant-drawer-panel-motion-left-leave-active{transition:all .3s}.ant-drawer-panel-motion-left-enter-start,.ant-drawer-panel-motion-left-appear-start{transform:translate(-100%)!important}.ant-drawer-panel-motion-left-enter-active,.ant-drawer-panel-motion-left-appear-active,.ant-drawer-panel-motion-left-leave{transform:translate(0)}.ant-drawer-panel-motion-left-leave-active{transform:translate(-100%)}.ant-drawer-panel-motion-right-enter-start,.ant-drawer-panel-motion-right-appear-start,.ant-drawer-panel-motion-right-leave-start{transition:none}.ant-drawer-panel-motion-right-enter-active,.ant-drawer-panel-motion-right-appear-active,.ant-drawer-panel-motion-right-leave-active{transition:all .3s}.ant-drawer-panel-motion-right-enter-start,.ant-drawer-panel-motion-right-appear-start{transform:translate(100%)!important}.ant-drawer-panel-motion-right-enter-active,.ant-drawer-panel-motion-right-appear-active,.ant-drawer-panel-motion-right-leave{transform:translate(0)}.ant-drawer-panel-motion-right-leave-active{transform:translate(100%)}.ant-drawer-panel-motion-top-enter-start,.ant-drawer-panel-motion-top-appear-start,.ant-drawer-panel-motion-top-leave-start{transition:none}.ant-drawer-panel-motion-top-enter-active,.ant-drawer-panel-motion-top-appear-active,.ant-drawer-panel-motion-top-leave-active{transition:all .3s}.ant-drawer-panel-motion-top-enter-start,.ant-drawer-panel-motion-top-appear-start{transform:translateY(-100%)!important}.ant-drawer-panel-motion-top-enter-active,.ant-drawer-panel-motion-top-appear-active,.ant-drawer-panel-motion-top-leave{transform:translateY(0)}.ant-drawer-panel-motion-top-leave-active{transform:translateY(-100%)}.ant-drawer-panel-motion-bottom-enter-start,.ant-drawer-panel-motion-bottom-appear-start,.ant-drawer-panel-motion-bottom-leave-start{transition:none}.ant-drawer-panel-motion-bottom-enter-active,.ant-drawer-panel-motion-bottom-appear-active,.ant-drawer-panel-motion-bottom-leave-active{transition:all .3s}.ant-drawer-panel-motion-bottom-enter-start,.ant-drawer-panel-motion-bottom-appear-start{transform:translateY(100%)!important}.ant-drawer-panel-motion-bottom-enter-active,.ant-drawer-panel-motion-bottom-appear-active,.ant-drawer-panel-motion-bottom-leave{transform:translateY(0)}.ant-drawer-panel-motion-bottom-leave-active{transform:translateY(100%)}.ant-drawer-rtl{direction:rtl}.ant-drawer-rtl .ant-drawer-close{margin-right:0;margin-left:12px}.ant-form-item .ant-input-number+.ant-form-text{margin-left:8px}.ant-form-inline{display:flex;flex-wrap:wrap}.ant-form-inline .ant-form-item{flex:none;flex-wrap:nowrap;margin-right:16px;margin-bottom:0}.ant-form-inline .ant-form-item-with-help{margin-bottom:24px}.ant-form-inline .ant-form-item>.ant-form-item-label,.ant-form-inline .ant-form-item>.ant-form-item-control{display:inline-block;vertical-align:top}.ant-form-inline .ant-form-item>.ant-form-item-label{flex:none}.ant-form-inline .ant-form-item .ant-form-text,.ant-form-inline .ant-form-item .ant-form-item-has-feedback{display:inline-block}.ant-form-horizontal .ant-form-item-label{flex-grow:0}.ant-form-horizontal .ant-form-item-control{flex:1 1 0;min-width:0}.ant-form-horizontal .ant-form-item-label[class$="-24"]+.ant-form-item-control,.ant-form-horizontal .ant-form-item-label[class*="-24 "]+.ant-form-item-control{min-width:unset}.ant-form-vertical .ant-form-item-row{flex-direction:column}.ant-form-vertical .ant-form-item-label>label{height:auto}.ant-form-vertical .ant-form-item .ant-form-item-control{width:100%}.ant-form-vertical .ant-form-item-label,.ant-col-24.ant-form-item-label,.ant-col-xl-24.ant-form-item-label{padding:0 0 8px;line-height:1.5715;white-space:initial;text-align:left}.ant-form-vertical .ant-form-item-label>label,.ant-col-24.ant-form-item-label>label,.ant-col-xl-24.ant-form-item-label>label{margin:0}.ant-form-vertical .ant-form-item-label>label:after,.ant-col-24.ant-form-item-label>label:after,.ant-col-xl-24.ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-form-vertical .ant-form-item-label,.ant-form-rtl.ant-col-24.ant-form-item-label,.ant-form-rtl.ant-col-xl-24.ant-form-item-label{text-align:right}@media (max-width: 575px){.ant-form-item .ant-form-item-label{padding:0 0 8px;line-height:1.5715;white-space:initial;text-align:left}.ant-form-item .ant-form-item-label>label{margin:0}.ant-form-item .ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-form-item .ant-form-item-label{text-align:right}.ant-form .ant-form-item{flex-wrap:wrap}.ant-form .ant-form-item .ant-form-item-label,.ant-form .ant-form-item .ant-form-item-control{flex:0 0 100%;max-width:100%}.ant-col-xs-24.ant-form-item-label{padding:0 0 8px;line-height:1.5715;white-space:initial;text-align:left}.ant-col-xs-24.ant-form-item-label>label{margin:0}.ant-col-xs-24.ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-col-xs-24.ant-form-item-label{text-align:right}}@media (max-width: 767px){.ant-col-sm-24.ant-form-item-label{padding:0 0 8px;line-height:1.5715;white-space:initial;text-align:left}.ant-col-sm-24.ant-form-item-label>label{margin:0}.ant-col-sm-24.ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-col-sm-24.ant-form-item-label{text-align:right}}@media (max-width: 991px){.ant-col-md-24.ant-form-item-label{padding:0 0 8px;line-height:1.5715;white-space:initial;text-align:left}.ant-col-md-24.ant-form-item-label>label{margin:0}.ant-col-md-24.ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-col-md-24.ant-form-item-label{text-align:right}}@media (max-width: 1199px){.ant-col-lg-24.ant-form-item-label{padding:0 0 8px;line-height:1.5715;white-space:initial;text-align:left}.ant-col-lg-24.ant-form-item-label>label{margin:0}.ant-col-lg-24.ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-col-lg-24.ant-form-item-label{text-align:right}}@media (max-width: 1599px){.ant-col-xl-24.ant-form-item-label{padding:0 0 8px;line-height:1.5715;white-space:initial;text-align:left}.ant-col-xl-24.ant-form-item-label>label{margin:0}.ant-col-xl-24.ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-col-xl-24.ant-form-item-label{text-align:right}}.ant-form-item-explain-error{color:#ff4d4f}.ant-form-item-explain-warning{color:#faad14}.ant-form-item-has-feedback .ant-switch{margin:2px 0 4px}.ant-form-item-has-warning .ant-form-item-split{color:#faad14}.ant-form-item-has-error .ant-form-item-split{color:#ff4d4f}.ant-form{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum"}.ant-form legend{display:block;width:100%;margin-bottom:20px;padding:0;color:#00000073;font-size:16px;line-height:inherit;border:0;border-bottom:1px solid #d9d9d9}.ant-form label{font-size:14px}.ant-form input[type=search]{box-sizing:border-box}.ant-form input[type=radio],.ant-form input[type=checkbox]{line-height:normal}.ant-form input[type=file]{display:block}.ant-form input[type=range]{display:block;width:100%}.ant-form select[multiple],.ant-form select[size]{height:auto}.ant-form input[type=file]:focus,.ant-form input[type=radio]:focus,.ant-form input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.ant-form output{display:block;padding-top:15px;color:#000000d9;font-size:14px;line-height:1.5715}.ant-form .ant-form-text{display:inline-block;padding-right:8px}.ant-form-small .ant-form-item-label>label{height:24px}.ant-form-small .ant-form-item-control-input{min-height:24px}.ant-form-large .ant-form-item-label>label{height:40px}.ant-form-large .ant-form-item-control-input{min-height:40px}.ant-form-item{box-sizing:border-box;margin:0 0 24px;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";vertical-align:top}.ant-form-item-with-help{transition:none}.ant-form-item-hidden,.ant-form-item-hidden.ant-row{display:none}.ant-form-item-label{display:inline-block;flex-grow:0;overflow:hidden;white-space:nowrap;text-align:right;vertical-align:middle}.ant-form-item-label-left{text-align:left}.ant-form-item-label-wrap{overflow:unset;line-height:1.3215em;white-space:unset}.ant-form-item-label>label{position:relative;display:inline-flex;align-items:center;max-width:100%;height:32px;color:#000000d9;font-size:14px}.ant-form-item-label>label>.anticon{font-size:14px;vertical-align:top}.ant-form-item-label>label.ant-form-item-required:not(.ant-form-item-required-mark-optional):before{display:inline-block;margin-right:4px;color:#ff4d4f;font-size:14px;font-family:SimSun,sans-serif;line-height:1;content:"*"}.ant-form-hide-required-mark .ant-form-item-label>label.ant-form-item-required:not(.ant-form-item-required-mark-optional):before{display:none}.ant-form-item-label>label .ant-form-item-optional{display:inline-block;margin-left:4px;color:#00000073}.ant-form-hide-required-mark .ant-form-item-label>label .ant-form-item-optional{display:none}.ant-form-item-label>label .ant-form-item-tooltip{color:#00000073;cursor:help;-ms-writing-mode:lr-tb;writing-mode:horizontal-tb;-webkit-margin-start:4px;margin-inline-start:4px}.ant-form-item-label>label:after{content:":";position:relative;top:-.5px;margin:0 8px 0 2px}.ant-form-item-label>label.ant-form-item-no-colon:after{content:" "}.ant-form-item-control{display:flex;flex-direction:column;flex-grow:1}.ant-form-item-control:first-child:not([class^="ant-col-"]):not([class*=" ant-col-"]){width:100%}.ant-form-item-control-input{position:relative;display:flex;align-items:center;min-height:32px}.ant-form-item-control-input-content{flex:auto;max-width:100%}.ant-form-item-explain,.ant-form-item-extra{clear:both;color:#00000073;font-size:14px;line-height:1.5715;transition:color .3s cubic-bezier(.215,.61,.355,1)}.ant-form-item-explain-connected{width:100%}.ant-form-item-extra{min-height:24px}.ant-form-item-with-help .ant-form-item-explain{height:auto;opacity:1}.ant-form-item-feedback-icon{font-size:14px;text-align:center;visibility:visible;animation:zoomIn .3s cubic-bezier(.12,.4,.29,1.46);pointer-events:none}.ant-form-item-feedback-icon-success{color:#52c41a}.ant-form-item-feedback-icon-error{color:#ff4d4f}.ant-form-item-feedback-icon-warning{color:#faad14}.ant-form-item-feedback-icon-validating{color:#1890ff}.ant-show-help{transition:opacity .3s cubic-bezier(.645,.045,.355,1)}.ant-show-help-appear,.ant-show-help-enter{opacity:0}.ant-show-help-appear-active,.ant-show-help-enter-active,.ant-show-help-leave{opacity:1}.ant-show-help-leave-active{opacity:0}.ant-show-help-item{overflow:hidden;transition:height .3s cubic-bezier(.645,.045,.355,1),opacity .3s cubic-bezier(.645,.045,.355,1),transform .3s cubic-bezier(.645,.045,.355,1)!important}.ant-show-help-item-appear,.ant-show-help-item-enter{transform:translateY(-5px);opacity:0}.ant-show-help-item-appear-active,.ant-show-help-item-enter-active{transform:translateY(0);opacity:1}.ant-show-help-item-leave{transition:height .2s cubic-bezier(.645,.045,.355,1),opacity .2s cubic-bezier(.645,.045,.355,1),transform .2s cubic-bezier(.645,.045,.355,1)!important}.ant-show-help-item-leave-active{transform:translateY(-5px)}@keyframes diffZoomIn1{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}@keyframes diffZoomIn2{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}@keyframes diffZoomIn3{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}.ant-form-rtl{direction:rtl}.ant-form-rtl .ant-form-item-label{text-align:left}.ant-form-rtl .ant-form-item-label>label.ant-form-item-required:before{margin-right:0;margin-left:4px}.ant-form-rtl .ant-form-item-label>label:after{margin:0 2px 0 8px}.ant-form-rtl .ant-form-item-label>label .ant-form-item-optional{margin-right:4px;margin-left:0}.ant-col-rtl .ant-form-item-control:first-child{width:100%}.ant-form-rtl .ant-form-item-has-feedback .ant-input{padding-right:11px;padding-left:24px}.ant-form-rtl .ant-form-item-has-feedback .ant-input-affix-wrapper .ant-input-suffix{padding-right:11px;padding-left:18px}.ant-form-rtl .ant-form-item-has-feedback .ant-input-affix-wrapper .ant-input,.ant-form-rtl .ant-form-item-has-feedback .ant-input-number-affix-wrapper .ant-input-number{padding:0}.ant-form-rtl .ant-form-item-has-feedback .ant-input-search:not(.ant-input-search-enter-button) .ant-input-suffix{right:auto;left:28px}.ant-form-rtl .ant-form-item-has-feedback .ant-input-number{padding-left:18px}.ant-form-rtl .ant-form-item-has-feedback>.ant-select .ant-select-arrow,.ant-form-rtl .ant-form-item-has-feedback>.ant-select .ant-select-clear,.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-group-addon)>.ant-select .ant-select-arrow,.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-group-addon)>.ant-select .ant-select-clear,.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-number-group-addon)>.ant-select .ant-select-arrow,.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-number-group-addon)>.ant-select .ant-select-clear{right:auto;left:32px}.ant-form-rtl .ant-form-item-has-feedback>.ant-select .ant-select-selection-selected-value,.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-group-addon)>.ant-select .ant-select-selection-selected-value,.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-number-group-addon)>.ant-select .ant-select-selection-selected-value{padding-right:0;padding-left:42px}.ant-form-rtl .ant-form-item-has-feedback .ant-cascader-picker-arrow{margin-right:0;margin-left:19px}.ant-form-rtl .ant-form-item-has-feedback .ant-cascader-picker-clear{right:auto;left:32px}.ant-form-rtl .ant-form-item-has-feedback .ant-picker,.ant-form-rtl .ant-form-item-has-feedback .ant-picker-large{padding-right:11px;padding-left:29.2px}.ant-form-rtl .ant-form-item-has-feedback .ant-picker-small{padding-right:7px;padding-left:25.2px}.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-has-success .ant-form-item-children-icon,.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-has-warning .ant-form-item-children-icon,.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-has-error .ant-form-item-children-icon,.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-is-validating .ant-form-item-children-icon{right:auto;left:0}.ant-form-rtl.ant-form-inline .ant-form-item{margin-right:0;margin-left:16px}.ant-image{position:relative;display:inline-block}.ant-image-img{width:100%;height:auto;vertical-align:middle}.ant-image-img-placeholder{background-color:#f5f5f5;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTQuNSAyLjVoLTEzQS41LjUgMCAwIDAgMSAzdjEwYS41LjUgMCAwIDAgLjUuNWgxM2EuNS41IDAgMCAwIC41LS41VjNhLjUuNSAwIDAgMC0uNS0uNXpNNS4yODEgNC43NWExIDEgMCAwIDEgMCAyIDEgMSAwIDAgMSAwLTJ6bTguMDMgNi44M2EuMTI3LjEyNyAwIDAgMS0uMDgxLjAzSDIuNzY5YS4xMjUuMTI1IDAgMCAxLS4wOTYtLjIwN2wyLjY2MS0zLjE1NmEuMTI2LjEyNiAwIDAgMSAuMTc3LS4wMTZsLjAxNi4wMTZMNy4wOCAxMC4wOWwyLjQ3LTIuOTNhLjEyNi4xMjYgMCAwIDEgLjE3Ny0uMDE2bC4wMTUuMDE2IDMuNTg4IDQuMjQ0YS4xMjcuMTI3IDAgMCAxLS4wMi4xNzV6IiBmaWxsPSIjOEM4QzhDIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L3N2Zz4=);background-repeat:no-repeat;background-position:center center;background-size:30%}.ant-image-mask{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#fff;background:rgba(0,0,0,.5);cursor:pointer;opacity:0;transition:opacity .3s}.ant-image-mask-info{padding:0 4px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-image-mask-info .anticon{-webkit-margin-end:4px;margin-inline-end:4px}.ant-image-mask:hover{opacity:1}.ant-image-placeholder{position:absolute;inset:0}.ant-image-preview{pointer-events:none;height:100%;text-align:center}.ant-image-preview.ant-zoom-enter,.ant-image-preview.ant-zoom-appear{transform:none;opacity:0;animation-duration:.3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-image-preview-mask{position:fixed;inset:0;z-index:1000;height:100%;background-color:#00000073}.ant-image-preview-mask-hidden{display:none}.ant-image-preview-wrap{position:fixed;inset:0;overflow:auto;outline:0}.ant-image-preview-body{position:absolute;inset:0;overflow:hidden}.ant-image-preview-img{max-width:100%;max-height:100%;vertical-align:middle;transform:scaleZ(1);cursor:grab;transition:transform .3s cubic-bezier(.215,.61,.355,1) 0s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:auto}.ant-image-preview-img-wrapper{position:absolute;inset:0;transition:transform .3s cubic-bezier(.215,.61,.355,1) 0s}.ant-image-preview-img-wrapper:before{display:inline-block;width:1px;height:50%;margin-right:-1px;content:""}.ant-image-preview-moving .ant-image-preview-img{cursor:grabbing}.ant-image-preview-moving .ant-image-preview-img-wrapper{transition-duration:0s}.ant-image-preview-wrap{z-index:1080}.ant-image-preview-operations-wrapper{position:fixed;top:0;right:0;z-index:1081;width:100%}.ant-image-preview-operations{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;font-feature-settings:"tnum";display:flex;flex-direction:row-reverse;align-items:center;color:#ffffffd9;list-style:none;background:rgba(0,0,0,.1);pointer-events:auto}.ant-image-preview-operations-operation{margin-left:12px;padding:12px;cursor:pointer;transition:all .3s}.ant-image-preview-operations-operation:hover{background:rgba(0,0,0,.2)}.ant-image-preview-operations-operation-disabled{color:#ffffff40;pointer-events:none}.ant-image-preview-operations-operation:last-of-type{margin-left:0}.ant-image-preview-operations-progress{position:absolute;left:50%;transform:translate(-50%)}.ant-image-preview-operations-icon{font-size:18px}.ant-image-preview-switch-left,.ant-image-preview-switch-right{position:fixed;top:50%;right:8px;z-index:1081;display:flex;align-items:center;justify-content:center;width:44px;height:44px;color:#ffffffd9;background:rgba(0,0,0,.1);border-radius:50%;transform:translateY(-50%);cursor:pointer;transition:all .3s;pointer-events:auto}.ant-image-preview-switch-left:hover,.ant-image-preview-switch-right:hover{background:rgba(0,0,0,.2)}.ant-image-preview-switch-left-disabled,.ant-image-preview-switch-right-disabled,.ant-image-preview-switch-left-disabled:hover,.ant-image-preview-switch-right-disabled:hover{color:#ffffff40;background:rgba(0,0,0,.1);cursor:not-allowed}.ant-image-preview-switch-left-disabled>.anticon,.ant-image-preview-switch-right-disabled>.anticon,.ant-image-preview-switch-left-disabled:hover>.anticon,.ant-image-preview-switch-right-disabled:hover>.anticon{cursor:not-allowed}.ant-image-preview-switch-left>.anticon,.ant-image-preview-switch-right>.anticon{font-size:18px}.ant-image-preview-switch-left{left:8px}.ant-image-preview-switch-right{right:8px}.ant-input-number-affix-wrapper{display:inline-block;width:100%;min-width:0;color:#000000d9;font-size:14px;line-height:1.5715;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:2px;transition:all .3s;position:relative;display:inline-flex;width:90px;padding:0;-webkit-padding-start:11px;padding-inline-start:11px}.ant-input-number-affix-wrapper::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-input-number-affix-wrapper:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input-number-affix-wrapper::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input-number-affix-wrapper:-moz-placeholder-shown{text-overflow:ellipsis}.ant-input-number-affix-wrapper:-ms-input-placeholder{text-overflow:ellipsis}.ant-input-number-affix-wrapper:placeholder-shown{text-overflow:ellipsis}.ant-input-number-affix-wrapper:hover{border-color:#40a9ff;border-right-width:1px}.ant-input-number-affix-wrapper:focus,.ant-input-number-affix-wrapper-focused{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-input-number-affix-wrapper-disabled{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input-number-affix-wrapper-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-number-affix-wrapper[disabled]{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input-number-affix-wrapper[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-number-affix-wrapper-borderless,.ant-input-number-affix-wrapper-borderless:hover,.ant-input-number-affix-wrapper-borderless:focus,.ant-input-number-affix-wrapper-borderless-focused,.ant-input-number-affix-wrapper-borderless-disabled,.ant-input-number-affix-wrapper-borderless[disabled]{background-color:transparent;border:none;box-shadow:none}textarea.ant-input-number-affix-wrapper{max-width:100%;height:auto;min-height:32px;line-height:1.5715;vertical-align:bottom;transition:all .3s,height 0s}.ant-input-number-affix-wrapper-lg{padding:6.5px 11px;font-size:16px}.ant-input-number-affix-wrapper-sm{padding:0 7px}.ant-input-number-affix-wrapper:not(.ant-input-number-affix-wrapper-disabled):hover{border-color:#40a9ff;border-right-width:1px;z-index:1}.ant-input-number-affix-wrapper-focused,.ant-input-number-affix-wrapper:focus{z-index:1}.ant-input-number-affix-wrapper-disabled .ant-input-number[disabled]{background:transparent}.ant-input-number-affix-wrapper>div.ant-input-number{width:100%;border:none;outline:none}.ant-input-number-affix-wrapper>div.ant-input-number.ant-input-number-focused{box-shadow:none!important}.ant-input-number-affix-wrapper input.ant-input-number-input{padding:0}.ant-input-number-affix-wrapper:before{width:0;visibility:hidden;content:"\\a0"}.ant-input-number-affix-wrapper .ant-input-number-handler-wrap{z-index:2}.ant-input-number-prefix,.ant-input-number-suffix{display:flex;flex:none;align-items:center;pointer-events:none}.ant-input-number-prefix{-webkit-margin-end:4px;margin-inline-end:4px}.ant-input-number-suffix{position:absolute;top:0;right:0;z-index:1;height:100%;margin-right:11px;margin-left:4px}.ant-input-number-group-wrapper .ant-input-number-affix-wrapper{width:100%}.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number,.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:hover{background:#fff;border-color:#ff4d4f}.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:focus,.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number-focused{border-color:#ff7875;box-shadow:0 0 0 2px #ff4d4f33;border-right-width:1px;outline:0}.ant-input-number-status-error .ant-input-number-prefix{color:#ff4d4f}.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number,.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:hover{background:#fff;border-color:#faad14}.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:focus,.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number-focused{border-color:#ffc53d;box-shadow:0 0 0 2px #faad1433;border-right-width:1px;outline:0}.ant-input-number-status-warning .ant-input-number-prefix{color:#faad14}.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper,.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:hover{background:#fff;border-color:#ff4d4f}.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:focus,.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper-focused{border-color:#ff7875;box-shadow:0 0 0 2px #ff4d4f33;border-right-width:1px;outline:0}.ant-input-number-affix-wrapper-status-error .ant-input-number-prefix{color:#ff4d4f}.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper,.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:hover{background:#fff;border-color:#faad14}.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:focus,.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper-focused{border-color:#ffc53d;box-shadow:0 0 0 2px #faad1433;border-right-width:1px;outline:0}.ant-input-number-affix-wrapper-status-warning .ant-input-number-prefix{color:#faad14}.ant-input-number-group-wrapper-status-error .ant-input-number-group-addon{color:#ff4d4f;border-color:#ff4d4f}.ant-input-number-group-wrapper-status-warning .ant-input-number-group-addon{color:#faad14;border-color:#faad14}.ant-input-number{box-sizing:border-box;font-variant:tabular-nums;list-style:none;font-feature-settings:"tnum";position:relative;width:100%;min-width:0;color:#000000d9;font-size:14px;line-height:1.5715;background-color:#fff;background-image:none;transition:all .3s;display:inline-block;width:90px;margin:0;padding:0;border:1px solid #d9d9d9;border-radius:2px}.ant-input-number::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-input-number:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input-number::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input-number:-moz-placeholder-shown{text-overflow:ellipsis}.ant-input-number:-ms-input-placeholder{text-overflow:ellipsis}.ant-input-number:placeholder-shown{text-overflow:ellipsis}.ant-input-number:focus,.ant-input-number-focused{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-input-number[disabled]{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input-number[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-number-borderless,.ant-input-number-borderless:hover,.ant-input-number-borderless:focus,.ant-input-number-borderless-focused,.ant-input-number-borderless-disabled,.ant-input-number-borderless[disabled]{background-color:transparent;border:none;box-shadow:none}textarea.ant-input-number{max-width:100%;height:auto;min-height:32px;line-height:1.5715;vertical-align:bottom;transition:all .3s,height 0s}.ant-input-number-lg{padding:6.5px 11px;font-size:16px}.ant-input-number-sm{padding:0 7px}.ant-input-number-group{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;display:table;width:100%;border-collapse:separate;border-spacing:0}.ant-input-number-group[class*=col-]{float:none;padding-right:0;padding-left:0}.ant-input-number-group>[class*=col-]{padding-right:8px}.ant-input-number-group>[class*=col-]:last-child{padding-right:0}.ant-input-number-group-addon,.ant-input-number-group-wrap,.ant-input-number-group>.ant-input-number{display:table-cell}.ant-input-number-group-addon:not(:first-child):not(:last-child),.ant-input-number-group-wrap:not(:first-child):not(:last-child),.ant-input-number-group>.ant-input-number:not(:first-child):not(:last-child){border-radius:0}.ant-input-number-group-addon,.ant-input-number-group-wrap{width:1px;white-space:nowrap;vertical-align:middle}.ant-input-number-group-wrap>*{display:block!important}.ant-input-number-group .ant-input-number{float:left;width:100%;margin-bottom:0;text-align:inherit}.ant-input-number-group .ant-input-number:focus{z-index:1;border-right-width:1px}.ant-input-number-group .ant-input-number:hover{z-index:1;border-right-width:1px}.ant-input-search-with-button .ant-input-number-group .ant-input-number:hover{z-index:0}.ant-input-number-group-addon{position:relative;padding:0 11px;color:#000000d9;font-weight:400;font-size:14px;text-align:center;background-color:#fafafa;border:1px solid #d9d9d9;border-radius:2px;transition:all .3s}.ant-input-number-group-addon .ant-select{margin:-5px -11px}.ant-input-number-group-addon .ant-select.ant-select-single:not(.ant-select-customize-input) .ant-select-selector{background-color:inherit;border:1px solid transparent;box-shadow:none}.ant-input-number-group-addon .ant-select-open .ant-select-selector,.ant-input-number-group-addon .ant-select-focused .ant-select-selector{color:#1890ff}.ant-input-number-group-addon .ant-cascader-picker{margin:-9px -12px;background-color:transparent}.ant-input-number-group-addon .ant-cascader-picker .ant-cascader-input{text-align:left;border:0;box-shadow:none}.ant-input-number-group>.ant-input-number:first-child,.ant-input-number-group-addon:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-number-group>.ant-input-number:first-child .ant-select .ant-select-selector,.ant-input-number-group-addon:first-child .ant-select .ant-select-selector{border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-number-group>.ant-input-number-affix-wrapper:not(:first-child) .ant-input-number{border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-number-group>.ant-input-number-affix-wrapper:not(:last-child) .ant-input-number{border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-number-group-addon:first-child{border-right:0}.ant-input-number-group-addon:last-child{border-left:0}.ant-input-number-group>.ant-input-number:last-child,.ant-input-number-group-addon:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-number-group>.ant-input-number:last-child .ant-select .ant-select-selector,.ant-input-number-group-addon:last-child .ant-select .ant-select-selector{border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-number-group-lg .ant-input-number,.ant-input-number-group-lg>.ant-input-number-group-addon{padding:6.5px 11px;font-size:16px}.ant-input-number-group-sm .ant-input-number,.ant-input-number-group-sm>.ant-input-number-group-addon{padding:0 7px}.ant-input-number-group-lg .ant-select-single .ant-select-selector{height:40px}.ant-input-number-group-sm .ant-select-single .ant-select-selector{height:24px}.ant-input-number-group .ant-input-number-affix-wrapper:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-search .ant-input-number-group .ant-input-number-affix-wrapper:not(:last-child){border-top-left-radius:2px;border-bottom-left-radius:2px}.ant-input-number-group .ant-input-number-affix-wrapper:not(:first-child),.ant-input-search .ant-input-number-group .ant-input-number-affix-wrapper:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-number-group.ant-input-number-group-compact{display:block}.ant-input-number-group.ant-input-number-group-compact:before{display:table;content:""}.ant-input-number-group.ant-input-number-group-compact:after{display:table;clear:both;content:""}.ant-input-number-group.ant-input-number-group-compact-addon:not(:first-child):not(:last-child),.ant-input-number-group.ant-input-number-group-compact-wrap:not(:first-child):not(:last-child),.ant-input-number-group.ant-input-number-group-compact>.ant-input-number:not(:first-child):not(:last-child){border-right-width:1px}.ant-input-number-group.ant-input-number-group-compact-addon:not(:first-child):not(:last-child):hover,.ant-input-number-group.ant-input-number-group-compact-wrap:not(:first-child):not(:last-child):hover,.ant-input-number-group.ant-input-number-group-compact>.ant-input-number:not(:first-child):not(:last-child):hover{z-index:1}.ant-input-number-group.ant-input-number-group-compact-addon:not(:first-child):not(:last-child):focus,.ant-input-number-group.ant-input-number-group-compact-wrap:not(:first-child):not(:last-child):focus,.ant-input-number-group.ant-input-number-group-compact>.ant-input-number:not(:first-child):not(:last-child):focus{z-index:1}.ant-input-number-group.ant-input-number-group-compact>*{display:inline-block;float:none;vertical-align:top;border-radius:0}.ant-input-number-group.ant-input-number-group-compact>.ant-input-number-affix-wrapper{display:inline-flex}.ant-input-number-group.ant-input-number-group-compact>.ant-picker-range{display:inline-flex}.ant-input-number-group.ant-input-number-group-compact>*:not(:last-child){margin-right:-1px;border-right-width:1px}.ant-input-number-group.ant-input-number-group-compact .ant-input-number{float:none}.ant-input-number-group.ant-input-number-group-compact>.ant-select>.ant-select-selector,.ant-input-number-group.ant-input-number-group-compact>.ant-select-auto-complete .ant-input,.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker .ant-input,.ant-input-number-group.ant-input-number-group-compact>.ant-input-group-wrapper .ant-input{border-right-width:1px;border-radius:0}.ant-input-number-group.ant-input-number-group-compact>.ant-select>.ant-select-selector:hover,.ant-input-number-group.ant-input-number-group-compact>.ant-select-auto-complete .ant-input:hover,.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker .ant-input:hover,.ant-input-number-group.ant-input-number-group-compact>.ant-input-group-wrapper .ant-input:hover{z-index:1}.ant-input-number-group.ant-input-number-group-compact>.ant-select>.ant-select-selector:focus,.ant-input-number-group.ant-input-number-group-compact>.ant-select-auto-complete .ant-input:focus,.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker .ant-input:focus,.ant-input-number-group.ant-input-number-group-compact>.ant-input-group-wrapper .ant-input:focus{z-index:1}.ant-input-number-group.ant-input-number-group-compact>.ant-select-focused{z-index:1}.ant-input-number-group.ant-input-number-group-compact>.ant-select>.ant-select-arrow{z-index:1}.ant-input-number-group.ant-input-number-group-compact>*:first-child,.ant-input-number-group.ant-input-number-group-compact>.ant-select:first-child>.ant-select-selector,.ant-input-number-group.ant-input-number-group-compact>.ant-select-auto-complete:first-child .ant-input,.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker:first-child .ant-input{border-top-left-radius:2px;border-bottom-left-radius:2px}.ant-input-number-group.ant-input-number-group-compact>*:last-child,.ant-input-number-group.ant-input-number-group-compact>.ant-select:last-child>.ant-select-selector,.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker:last-child .ant-input,.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker-focused:last-child .ant-input{border-right-width:1px;border-top-right-radius:2px;border-bottom-right-radius:2px}.ant-input-number-group.ant-input-number-group-compact>.ant-select-auto-complete .ant-input{vertical-align:top}.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper+.ant-input-group-wrapper{margin-left:-1px}.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper+.ant-input-group-wrapper .ant-input-affix-wrapper{border-radius:0}.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search>.ant-input-group>.ant-input-group-addon>.ant-input-search-button{border-radius:0}.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search>.ant-input-group>.ant-input{border-radius:2px 0 0 2px}.ant-input-number-group>.ant-input-number-rtl:first-child{border-radius:0 2px 2px 0}.ant-input-number-group>.ant-input-number-rtl:last-child{border-radius:2px 0 0 2px}.ant-input-number-group-rtl .ant-input-number-group-addon:first-child{border-right:1px solid #d9d9d9;border-left:0;border-radius:0 2px 2px 0}.ant-input-number-group-rtl .ant-input-number-group-addon:last-child{border-right:0;border-left:1px solid #d9d9d9;border-radius:2px 0 0 2px}.ant-input-number-group-wrapper{display:inline-block;text-align:start;vertical-align:top}.ant-input-number-handler{position:relative;display:block;width:100%;height:50%;overflow:hidden;color:#00000073;font-weight:700;line-height:0;text-align:center;border-left:1px solid #d9d9d9;transition:all .1s linear}.ant-input-number-handler:active{background:#f4f4f4}.ant-input-number-handler:hover .ant-input-number-handler-up-inner,.ant-input-number-handler:hover .ant-input-number-handler-down-inner{color:#40a9ff}.ant-input-number-handler-up-inner,.ant-input-number-handler-down-inner{display:inline-block;color:inherit;font-style:normal;line-height:0;text-align:center;text-transform:none;vertical-align:-.125em;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:absolute;right:4px;width:12px;height:12px;color:#00000073;line-height:12px;transition:all .1s linear;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input-number-handler-up-inner>*,.ant-input-number-handler-down-inner>*{line-height:1}.ant-input-number-handler-up-inner svg,.ant-input-number-handler-down-inner svg{display:inline-block}.ant-input-number-handler-up-inner:before,.ant-input-number-handler-down-inner:before{display:none}.ant-input-number-handler-up-inner .ant-input-number-handler-up-inner-icon,.ant-input-number-handler-up-inner .ant-input-number-handler-down-inner-icon,.ant-input-number-handler-down-inner .ant-input-number-handler-up-inner-icon,.ant-input-number-handler-down-inner .ant-input-number-handler-down-inner-icon{display:block}.ant-input-number:hover{border-color:#40a9ff;border-right-width:1px}.ant-input-number:hover+.ant-form-item-children-icon{opacity:0;transition:opacity .24s linear .24s}.ant-input-number-focused{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-input-number-disabled{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input-number-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-number-disabled .ant-input-number-input{cursor:not-allowed}.ant-input-number-disabled .ant-input-number-handler-wrap,.ant-input-number-readonly .ant-input-number-handler-wrap{display:none}.ant-input-number-input{width:100%;height:30px;padding:0 11px;text-align:left;background-color:transparent;border:0;border-radius:2px;outline:0;transition:all .3s linear;-webkit-appearance:textfield!important;-moz-appearance:textfield!important;appearance:textfield!important}.ant-input-number-input::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-input-number-input:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input-number-input::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input-number-input:-moz-placeholder-shown{text-overflow:ellipsis}.ant-input-number-input:-ms-input-placeholder{text-overflow:ellipsis}.ant-input-number-input:placeholder-shown{text-overflow:ellipsis}.ant-input-number-input[type=number]::-webkit-inner-spin-button,.ant-input-number-input[type=number]::-webkit-outer-spin-button{margin:0;-webkit-appearance:none;appearance:none}.ant-input-number-lg{padding:0;font-size:16px}.ant-input-number-lg input{height:38px}.ant-input-number-sm{padding:0}.ant-input-number-sm input{height:22px;padding:0 7px}.ant-input-number-handler-wrap{position:absolute;top:0;right:0;width:22px;height:100%;background:#fff;border-radius:0 2px 2px 0;opacity:0;transition:opacity .24s linear .1s}.ant-input-number-handler-wrap .ant-input-number-handler .ant-input-number-handler-up-inner,.ant-input-number-handler-wrap .ant-input-number-handler .ant-input-number-handler-down-inner{display:flex;align-items:center;justify-content:center;min-width:auto;margin-right:0;font-size:7px}.ant-input-number-borderless .ant-input-number-handler-wrap{border-left-width:0}.ant-input-number-handler-wrap:hover .ant-input-number-handler{height:40%}.ant-input-number:hover .ant-input-number-handler-wrap,.ant-input-number-focused .ant-input-number-handler-wrap{opacity:1}.ant-input-number-handler-up{border-top-right-radius:2px;cursor:pointer}.ant-input-number-handler-up-inner{top:50%;margin-top:-5px;text-align:center}.ant-input-number-handler-up:hover{height:60%!important}.ant-input-number-handler-down{top:0;border-top:1px solid #d9d9d9;border-bottom-right-radius:2px;cursor:pointer}.ant-input-number-handler-down-inner{top:50%;text-align:center;transform:translateY(-50%)}.ant-input-number-handler-down:hover{height:60%!important}.ant-input-number-borderless .ant-input-number-handler-down{border-top-width:0}.ant-input-number:hover:not(.ant-input-number-borderless) .ant-input-number-handler-down,.ant-input-number-focused:not(.ant-input-number-borderless) .ant-input-number-handler-down{border-top:1px solid #d9d9d9}.ant-input-number-handler-up-disabled,.ant-input-number-handler-down-disabled{cursor:not-allowed}.ant-input-number-handler-up-disabled:hover .ant-input-number-handler-up-inner,.ant-input-number-handler-down-disabled:hover .ant-input-number-handler-down-inner{color:#00000040}.ant-input-number-borderless{box-shadow:none}.ant-input-number-out-of-range input{color:#ff4d4f}.ant-input-number-compact-item:not(.ant-input-number-compact-last-item):not(.ant-input-number-compact-item-rtl){margin-right:-1px}.ant-input-number-compact-item:not(.ant-input-number-compact-last-item).ant-input-number-compact-item-rtl{margin-left:-1px}.ant-input-number-compact-item:hover,.ant-input-number-compact-item:focus,.ant-input-number-compact-item:active{z-index:2}.ant-input-number-compact-item.ant-input-number-focused{z-index:2}.ant-input-number-compact-item[disabled]{z-index:0}.ant-input-number-compact-item:not(.ant-input-number-compact-first-item):not(.ant-input-number-compact-last-item).ant-input-number{border-radius:0}.ant-input-number-compact-item.ant-input-number.ant-input-number-compact-first-item:not(.ant-input-number-compact-last-item):not(.ant-input-number-compact-item-rtl){border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-number-compact-item.ant-input-number.ant-input-number-compact-last-item:not(.ant-input-number-compact-first-item):not(.ant-input-number-compact-item-rtl){border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-number-compact-item.ant-input-number.ant-input-number-compact-item-rtl.ant-input-number-compact-first-item:not(.ant-input-number-compact-last-item){border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-number-compact-item.ant-input-number.ant-input-number-compact-item-rtl.ant-input-number-compact-last-item:not(.ant-input-number-compact-first-item){border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-number-rtl{direction:rtl}.ant-input-number-rtl .ant-input-number-handler{border-right:1px solid #d9d9d9;border-left:0}.ant-input-number-rtl .ant-input-number-handler-wrap{right:auto;left:0}.ant-input-number-rtl.ant-input-number-borderless .ant-input-number-handler-wrap{border-right-width:0}.ant-input-number-rtl .ant-input-number-handler-up{border-top-right-radius:0}.ant-input-number-rtl .ant-input-number-handler-down{border-bottom-right-radius:0}.ant-input-number-rtl .ant-input-number-input{direction:ltr;text-align:right}.ant-input-affix-wrapper{position:relative;display:inline-block;width:100%;min-width:0;padding:4px 11px;color:#000000d9;font-size:14px;line-height:1.5715;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:2px;transition:all .3s;display:inline-flex}.ant-input-affix-wrapper::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-input-affix-wrapper:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input-affix-wrapper::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input-affix-wrapper:-moz-placeholder-shown{text-overflow:ellipsis}.ant-input-affix-wrapper:-ms-input-placeholder{text-overflow:ellipsis}.ant-input-affix-wrapper:placeholder-shown{text-overflow:ellipsis}.ant-input-affix-wrapper:hover{border-color:#40a9ff;border-right-width:1px}.ant-input-rtl .ant-input-affix-wrapper:hover{border-right-width:0;border-left-width:1px!important}.ant-input-affix-wrapper:focus,.ant-input-affix-wrapper-focused{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-input-rtl .ant-input-affix-wrapper:focus,.ant-input-rtl .ant-input-affix-wrapper-focused{border-right-width:0;border-left-width:1px!important}.ant-input-affix-wrapper-disabled{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input-affix-wrapper-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-affix-wrapper[disabled]{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input-affix-wrapper[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-affix-wrapper-borderless,.ant-input-affix-wrapper-borderless:hover,.ant-input-affix-wrapper-borderless:focus,.ant-input-affix-wrapper-borderless-focused,.ant-input-affix-wrapper-borderless-disabled,.ant-input-affix-wrapper-borderless[disabled]{background-color:transparent;border:none;box-shadow:none}textarea.ant-input-affix-wrapper{max-width:100%;height:auto;min-height:32px;line-height:1.5715;vertical-align:bottom;transition:all .3s,height 0s}.ant-input-affix-wrapper-lg{padding:6.5px 11px;font-size:16px}.ant-input-affix-wrapper-sm{padding:0 7px}.ant-input-affix-wrapper-rtl{direction:rtl}.ant-input-affix-wrapper:not(.ant-input-affix-wrapper-disabled):hover{border-color:#40a9ff;border-right-width:1px;z-index:1}.ant-input-rtl .ant-input-affix-wrapper:not(.ant-input-affix-wrapper-disabled):hover{border-right-width:0;border-left-width:1px!important}.ant-input-search-with-button .ant-input-affix-wrapper:not(.ant-input-affix-wrapper-disabled):hover{z-index:0}.ant-input-affix-wrapper-focused,.ant-input-affix-wrapper:focus{z-index:1}.ant-input-affix-wrapper-disabled .ant-input[disabled]{background:rgba(255,255,255,0)}.ant-input-affix-wrapper>.ant-input{font-size:inherit;border:none;outline:none}.ant-input-affix-wrapper>.ant-input:focus{box-shadow:none!important}.ant-input-affix-wrapper>.ant-input:not(textarea){padding:0}.ant-input-affix-wrapper:before{width:0;visibility:hidden;content:"\\a0"}.ant-input-prefix,.ant-input-suffix{display:flex;flex:none;align-items:center}.ant-input-prefix>*:not(:last-child),.ant-input-suffix>*:not(:last-child){margin-right:8px}.ant-input-show-count-suffix{color:#00000073}.ant-input-show-count-has-suffix{margin-right:2px}.ant-input-prefix{margin-right:4px}.ant-input-suffix{margin-left:4px}.anticon.ant-input-clear-icon,.ant-input-clear-icon{margin:0;color:#00000040;font-size:12px;vertical-align:-1px;cursor:pointer;transition:color .3s}.anticon.ant-input-clear-icon:hover,.ant-input-clear-icon:hover{color:#00000073}.anticon.ant-input-clear-icon:active,.ant-input-clear-icon:active{color:#000000d9}.anticon.ant-input-clear-icon-hidden,.ant-input-clear-icon-hidden{visibility:hidden}.anticon.ant-input-clear-icon-has-suffix,.ant-input-clear-icon-has-suffix{margin:0 4px}.ant-input-affix-wrapper.ant-input-affix-wrapper-textarea-with-clear-btn{padding:0}.ant-input-affix-wrapper.ant-input-affix-wrapper-textarea-with-clear-btn .ant-input-clear-icon{position:absolute;top:8px;right:8px;z-index:1}.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input,.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:hover{background:#fff;border-color:#ff4d4f}.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:focus,.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input-focused{border-color:#ff7875;box-shadow:0 0 0 2px #ff4d4f33;border-right-width:1px;outline:0}.ant-input-status-error .ant-input-prefix{color:#ff4d4f}.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input,.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:hover{background:#fff;border-color:#faad14}.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:focus,.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input-focused{border-color:#ffc53d;box-shadow:0 0 0 2px #faad1433;border-right-width:1px;outline:0}.ant-input-status-warning .ant-input-prefix{color:#faad14}.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper,.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:hover{background:#fff;border-color:#ff4d4f}.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:focus,.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper-focused{border-color:#ff7875;box-shadow:0 0 0 2px #ff4d4f33;border-right-width:1px;outline:0}.ant-input-affix-wrapper-status-error .ant-input-prefix{color:#ff4d4f}.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper,.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:hover{background:#fff;border-color:#faad14}.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:focus,.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper-focused{border-color:#ffc53d;box-shadow:0 0 0 2px #faad1433;border-right-width:1px;outline:0}.ant-input-affix-wrapper-status-warning .ant-input-prefix{color:#faad14}.ant-input-textarea-status-error.ant-input-textarea-has-feedback .ant-input,.ant-input-textarea-status-warning.ant-input-textarea-has-feedback .ant-input,.ant-input-textarea-status-success.ant-input-textarea-has-feedback .ant-input,.ant-input-textarea-status-validating.ant-input-textarea-has-feedback .ant-input{padding-right:24px}.ant-input-group-wrapper-status-error .ant-input-group-addon{color:#ff4d4f;border-color:#ff4d4f}.ant-input-group-wrapper-status-warning .ant-input-group-addon{color:#faad14;border-color:#faad14}.ant-input{box-sizing:border-box;margin:0;font-variant:tabular-nums;list-style:none;font-feature-settings:"tnum";position:relative;display:inline-block;width:100%;min-width:0;padding:4px 11px;color:#000000d9;font-size:14px;line-height:1.5715;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:2px;transition:all .3s}.ant-input::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-input:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input:-moz-placeholder-shown{text-overflow:ellipsis}.ant-input:-ms-input-placeholder{text-overflow:ellipsis}.ant-input:placeholder-shown{text-overflow:ellipsis}.ant-input:hover{border-color:#40a9ff;border-right-width:1px}.ant-input-rtl .ant-input:hover{border-right-width:0;border-left-width:1px!important}.ant-input:focus,.ant-input-focused{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-input-rtl .ant-input:focus,.ant-input-rtl .ant-input-focused{border-right-width:0;border-left-width:1px!important}.ant-input-disabled{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input[disabled]{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-borderless,.ant-input-borderless:hover,.ant-input-borderless:focus,.ant-input-borderless-focused,.ant-input-borderless-disabled,.ant-input-borderless[disabled]{background-color:transparent;border:none;box-shadow:none}textarea.ant-input{max-width:100%;height:auto;min-height:32px;line-height:1.5715;vertical-align:bottom;transition:all .3s,height 0s}.ant-input-lg{padding:6.5px 11px;font-size:16px}.ant-input-sm{padding:0 7px}.ant-input-rtl{direction:rtl}.ant-input-group{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;display:table;width:100%;border-collapse:separate;border-spacing:0}.ant-input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.ant-input-group>[class*=col-]{padding-right:8px}.ant-input-group>[class*=col-]:last-child{padding-right:0}.ant-input-group-addon,.ant-input-group-wrap,.ant-input-group>.ant-input{display:table-cell}.ant-input-group-addon:not(:first-child):not(:last-child),.ant-input-group-wrap:not(:first-child):not(:last-child),.ant-input-group>.ant-input:not(:first-child):not(:last-child){border-radius:0}.ant-input-group-addon,.ant-input-group-wrap{width:1px;white-space:nowrap;vertical-align:middle}.ant-input-group-wrap>*{display:block!important}.ant-input-group .ant-input{float:left;width:100%;margin-bottom:0;text-align:inherit}.ant-input-group .ant-input:focus{z-index:1;border-right-width:1px}.ant-input-group .ant-input:hover{z-index:1;border-right-width:1px}.ant-input-search-with-button .ant-input-group .ant-input:hover{z-index:0}.ant-input-group-addon{position:relative;padding:0 11px;color:#000000d9;font-weight:400;font-size:14px;text-align:center;background-color:#fafafa;border:1px solid #d9d9d9;border-radius:2px;transition:all .3s}.ant-input-group-addon .ant-select{margin:-5px -11px}.ant-input-group-addon .ant-select.ant-select-single:not(.ant-select-customize-input) .ant-select-selector{background-color:inherit;border:1px solid transparent;box-shadow:none}.ant-input-group-addon .ant-select-open .ant-select-selector,.ant-input-group-addon .ant-select-focused .ant-select-selector{color:#1890ff}.ant-input-group-addon .ant-cascader-picker{margin:-9px -12px;background-color:transparent}.ant-input-group-addon .ant-cascader-picker .ant-cascader-input{text-align:left;border:0;box-shadow:none}.ant-input-group>.ant-input:first-child,.ant-input-group-addon:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-group>.ant-input:first-child .ant-select .ant-select-selector,.ant-input-group-addon:first-child .ant-select .ant-select-selector{border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-group>.ant-input-affix-wrapper:not(:first-child) .ant-input{border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-group>.ant-input-affix-wrapper:not(:last-child) .ant-input{border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-group-addon:first-child{border-right:0}.ant-input-group-addon:last-child{border-left:0}.ant-input-group>.ant-input:last-child,.ant-input-group-addon:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-group>.ant-input:last-child .ant-select .ant-select-selector,.ant-input-group-addon:last-child .ant-select .ant-select-selector{border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-group-lg .ant-input,.ant-input-group-lg>.ant-input-group-addon{padding:6.5px 11px;font-size:16px}.ant-input-group-sm .ant-input,.ant-input-group-sm>.ant-input-group-addon{padding:0 7px}.ant-input-group-lg .ant-select-single .ant-select-selector{height:40px}.ant-input-group-sm .ant-select-single .ant-select-selector{height:24px}.ant-input-group .ant-input-affix-wrapper:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-search .ant-input-group .ant-input-affix-wrapper:not(:last-child){border-top-left-radius:2px;border-bottom-left-radius:2px}.ant-input-group .ant-input-affix-wrapper:not(:first-child),.ant-input-search .ant-input-group .ant-input-affix-wrapper:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-group.ant-input-group-compact{display:block}.ant-input-group.ant-input-group-compact:before{display:table;content:""}.ant-input-group.ant-input-group-compact:after{display:table;clear:both;content:""}.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child),.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child),.ant-input-group.ant-input-group-compact>.ant-input:not(:first-child):not(:last-child){border-right-width:1px}.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child):hover,.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child):hover,.ant-input-group.ant-input-group-compact>.ant-input:not(:first-child):not(:last-child):hover{z-index:1}.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child):focus,.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child):focus,.ant-input-group.ant-input-group-compact>.ant-input:not(:first-child):not(:last-child):focus{z-index:1}.ant-input-group.ant-input-group-compact>*{display:inline-block;float:none;vertical-align:top;border-radius:0}.ant-input-group.ant-input-group-compact>.ant-input-affix-wrapper{display:inline-flex}.ant-input-group.ant-input-group-compact>.ant-picker-range{display:inline-flex}.ant-input-group.ant-input-group-compact>*:not(:last-child){margin-right:-1px;border-right-width:1px}.ant-input-group.ant-input-group-compact .ant-input{float:none}.ant-input-group.ant-input-group-compact>.ant-select>.ant-select-selector,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete .ant-input,.ant-input-group.ant-input-group-compact>.ant-cascader-picker .ant-input,.ant-input-group.ant-input-group-compact>.ant-input-group-wrapper .ant-input{border-right-width:1px;border-radius:0}.ant-input-group.ant-input-group-compact>.ant-select>.ant-select-selector:hover,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete .ant-input:hover,.ant-input-group.ant-input-group-compact>.ant-cascader-picker .ant-input:hover,.ant-input-group.ant-input-group-compact>.ant-input-group-wrapper .ant-input:hover{z-index:1}.ant-input-group.ant-input-group-compact>.ant-select>.ant-select-selector:focus,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete .ant-input:focus,.ant-input-group.ant-input-group-compact>.ant-cascader-picker .ant-input:focus,.ant-input-group.ant-input-group-compact>.ant-input-group-wrapper .ant-input:focus{z-index:1}.ant-input-group.ant-input-group-compact>.ant-select-focused{z-index:1}.ant-input-group.ant-input-group-compact>.ant-select>.ant-select-arrow{z-index:1}.ant-input-group.ant-input-group-compact>*:first-child,.ant-input-group.ant-input-group-compact>.ant-select:first-child>.ant-select-selector,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete:first-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-cascader-picker:first-child .ant-input{border-top-left-radius:2px;border-bottom-left-radius:2px}.ant-input-group.ant-input-group-compact>*:last-child,.ant-input-group.ant-input-group-compact>.ant-select:last-child>.ant-select-selector,.ant-input-group.ant-input-group-compact>.ant-cascader-picker:last-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-cascader-picker-focused:last-child .ant-input{border-right-width:1px;border-top-right-radius:2px;border-bottom-right-radius:2px}.ant-input-group.ant-input-group-compact>.ant-select-auto-complete .ant-input{vertical-align:top}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper+.ant-input-group-wrapper{margin-left:-1px}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper+.ant-input-group-wrapper .ant-input-affix-wrapper{border-radius:0}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search>.ant-input-group>.ant-input-group-addon>.ant-input-search-button{border-radius:0}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search>.ant-input-group>.ant-input{border-radius:2px 0 0 2px}.ant-input-group>.ant-input-rtl:first-child,.ant-input-group-rtl .ant-input-group-addon:first-child{border-radius:0 2px 2px 0}.ant-input-group-rtl .ant-input-group-addon:first-child{border-right:1px solid #d9d9d9;border-left:0}.ant-input-group-rtl .ant-input-group-addon:last-child{border-right:0;border-left:1px solid #d9d9d9;border-radius:2px 0 0 2px}.ant-input-group-rtl.ant-input-group>.ant-input:last-child,.ant-input-group-rtl.ant-input-group-addon:last-child{border-radius:2px 0 0 2px}.ant-input-group-rtl.ant-input-group .ant-input-affix-wrapper:not(:first-child){border-radius:2px 0 0 2px}.ant-input-group-rtl.ant-input-group .ant-input-affix-wrapper:not(:last-child){border-radius:0 2px 2px 0}.ant-input-group-rtl.ant-input-group.ant-input-group-compact>*:not(:last-child){margin-right:0;margin-left:-1px;border-left-width:1px}.ant-input-group-rtl.ant-input-group.ant-input-group-compact>*:first-child,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-select:first-child>.ant-select-selector,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-select-auto-complete:first-child .ant-input,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-cascader-picker:first-child .ant-input{border-radius:0 2px 2px 0}.ant-input-group-rtl.ant-input-group.ant-input-group-compact>*:last-child,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-select:last-child>.ant-select-selector,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-select-auto-complete:last-child .ant-input,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-cascader-picker:last-child .ant-input,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-cascader-picker-focused:last-child .ant-input{border-left-width:1px;border-radius:2px 0 0 2px}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper-rtl+.ant-input-group-wrapper-rtl{margin-right:-1px;margin-left:0}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper-rtl:not(:last-child).ant-input-search>.ant-input-group>.ant-input{border-radius:0 2px 2px 0}.ant-input-group-wrapper{display:inline-block;width:100%;text-align:start;vertical-align:top}.ant-input-password-icon.anticon{color:#00000073;cursor:pointer;transition:all .3s}.ant-input-password-icon.anticon:hover{color:#000000d9}.ant-input[type=color]{height:32px}.ant-input[type=color].ant-input-lg{height:40px}.ant-input[type=color].ant-input-sm{height:24px;padding-top:3px;padding-bottom:3px}.ant-input-textarea-show-count>.ant-input{height:100%}.ant-input-textarea-show-count:after{float:right;color:#00000073;white-space:nowrap;content:attr(data-count);pointer-events:none}.ant-input-textarea-show-count.ant-input-textarea-in-form-item:after{margin-bottom:-22px}.ant-input-textarea-suffix{position:absolute;top:0;right:11px;bottom:0;z-index:1;display:inline-flex;align-items:center;margin:auto}.ant-input-compact-item:not(.ant-input-compact-last-item):not(.ant-input-compact-item-rtl){margin-right:-1px}.ant-input-compact-item:not(.ant-input-compact-last-item).ant-input-compact-item-rtl{margin-left:-1px}.ant-input-compact-item:hover,.ant-input-compact-item:focus,.ant-input-compact-item:active{z-index:2}.ant-input-compact-item[disabled]{z-index:0}.ant-input-compact-item:not(.ant-input-compact-first-item):not(.ant-input-compact-last-item).ant-input{border-radius:0}.ant-input-compact-item.ant-input.ant-input-compact-first-item:not(.ant-input-compact-last-item):not(.ant-input-compact-item-rtl){border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-compact-item.ant-input.ant-input-compact-last-item:not(.ant-input-compact-first-item):not(.ant-input-compact-item-rtl){border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-compact-item.ant-input.ant-input-compact-item-rtl.ant-input-compact-first-item:not(.ant-input-compact-last-item){border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-compact-item.ant-input.ant-input-compact-item-rtl.ant-input-compact-last-item:not(.ant-input-compact-first-item){border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-search .ant-input:hover,.ant-input-search .ant-input:focus{border-color:#40a9ff}.ant-input-search .ant-input:hover+.ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary),.ant-input-search .ant-input:focus+.ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary){border-left-color:#40a9ff}.ant-input-search .ant-input-affix-wrapper{border-radius:0}.ant-input-search .ant-input-lg{line-height:1.5713}.ant-input-search>.ant-input-group>.ant-input-group-addon:last-child{left:-1px;padding:0;border:0}.ant-input-search>.ant-input-group>.ant-input-group-addon:last-child .ant-input-search-button{padding-top:0;padding-bottom:0;border-radius:0 2px 2px 0}.ant-input-search>.ant-input-group>.ant-input-group-addon:last-child .ant-input-search-button:not(.ant-btn-primary){color:#00000073}.ant-input-search>.ant-input-group>.ant-input-group-addon:last-child .ant-input-search-button:not(.ant-btn-primary).ant-btn-loading:before{inset:0}.ant-input-search-button{height:32px}.ant-input-search-button:hover,.ant-input-search-button:focus{z-index:1}.ant-input-search-large .ant-input-search-button{height:40px}.ant-input-search-small .ant-input-search-button{height:24px}.ant-input-search.ant-input-compact-item:not(.ant-input-compact-item-rtl):not(.ant-input-compact-last-item) .ant-input-group-addon .ant-input-search-button{margin-right:-1px;border-radius:0}.ant-input-search.ant-input-compact-item:not(.ant-input-compact-first-item) .ant-input,.ant-input-search.ant-input-compact-item:not(.ant-input-compact-first-item) .ant-input-affix-wrapper{border-radius:0}.ant-input-search.ant-input-compact-item>.ant-input-group-addon .ant-input-search-button:hover,.ant-input-search.ant-input-compact-item>.ant-input:hover,.ant-input-search.ant-input-compact-item .ant-input-affix-wrapper:hover,.ant-input-search.ant-input-compact-item>.ant-input-group-addon .ant-input-search-button:focus,.ant-input-search.ant-input-compact-item>.ant-input:focus,.ant-input-search.ant-input-compact-item .ant-input-affix-wrapper:focus,.ant-input-search.ant-input-compact-item>.ant-input-group-addon .ant-input-search-button:active,.ant-input-search.ant-input-compact-item>.ant-input:active,.ant-input-search.ant-input-compact-item .ant-input-affix-wrapper:active{z-index:2}.ant-input-search.ant-input-compact-item>.ant-input-affix-wrapper-focused{z-index:2}.ant-input-search.ant-input-compact-item-rtl:not(.ant-input-compact-last-item) .ant-input-group-addon:last-child .ant-input-search-button{margin-left:-1px;border-radius:0}.ant-input-group-wrapper-rtl,.ant-input-group-rtl{direction:rtl}.ant-input-affix-wrapper.ant-input-affix-wrapper-rtl>input.ant-input{border:none;outline:none}.ant-input-affix-wrapper-rtl .ant-input-prefix{margin:0 0 0 4px}.ant-input-affix-wrapper-rtl .ant-input-suffix{margin:0 4px 0 0}.ant-input-textarea-rtl{direction:rtl}.ant-input-textarea-rtl.ant-input-textarea-show-count:after{text-align:left}.ant-input-affix-wrapper-rtl .ant-input-clear-icon-has-suffix{margin-right:0;margin-left:4px}.ant-input-affix-wrapper-rtl .ant-input-clear-icon{right:auto;left:8px}.ant-input-search-rtl{direction:rtl}.ant-input-search-rtl .ant-input:hover+.ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary),.ant-input-search-rtl .ant-input:focus+.ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary){border-left-color:#d9d9d9}.ant-input-search-rtl .ant-input:hover+.ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary):hover,.ant-input-search-rtl .ant-input:focus+.ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary):hover{border-left-color:#40a9ff}.ant-input-search-rtl>.ant-input-group>.ant-input-affix-wrapper:hover,.ant-input-search-rtl>.ant-input-group>.ant-input-affix-wrapper-focused{border-right-color:#40a9ff}.ant-input-search-rtl>.ant-input-group>.ant-input-group-addon:last-child{right:-1px;left:auto}.ant-input-search-rtl>.ant-input-group>.ant-input-group-addon:last-child .ant-input-search-button{border-radius:2px 0 0 2px}@media screen and (-ms-high-contrast: active),(-ms-high-contrast: none){.ant-input{height:32px}.ant-input-lg{height:40px}.ant-input-sm{height:24px}.ant-input-affix-wrapper>input.ant-input{height:auto}}.ant-layout{display:flex;flex:auto;flex-direction:column;min-height:0;background:#f0f2f5}.ant-layout,.ant-layout *{box-sizing:border-box}.ant-layout.ant-layout-has-sider{flex-direction:row}.ant-layout.ant-layout-has-sider>.ant-layout,.ant-layout.ant-layout-has-sider>.ant-layout-content{width:0}.ant-layout-header,.ant-layout-footer{flex:0 0 auto}.ant-layout-header{height:64px;padding:0 50px;color:#000000d9;line-height:64px;background:#001529}.ant-layout-footer{padding:24px 50px;color:#000000d9;font-size:14px;background:#f0f2f5}.ant-layout-content{flex:auto;min-height:0}.ant-layout-sider{position:relative;min-width:0;background:#001529;transition:all .2s}.ant-layout-sider-children{height:100%;margin-top:-.1px;padding-top:.1px}.ant-layout-sider-children .ant-menu.ant-menu-inline-collapsed{width:auto}.ant-layout-sider-has-trigger{padding-bottom:48px}.ant-layout-sider-right{order:1}.ant-layout-sider-trigger{position:fixed;bottom:0;z-index:1;height:48px;color:#fff;line-height:48px;text-align:center;background:#002140;cursor:pointer;transition:all .2s}.ant-layout-sider-zero-width>*{overflow:hidden}.ant-layout-sider-zero-width-trigger{position:absolute;top:64px;right:-36px;z-index:1;width:36px;height:42px;color:#fff;font-size:18px;line-height:42px;text-align:center;background:#001529;border-radius:0 2px 2px 0;cursor:pointer;transition:background .3s ease}.ant-layout-sider-zero-width-trigger:after{position:absolute;inset:0;background:transparent;transition:all .3s;content:""}.ant-layout-sider-zero-width-trigger:hover:after{background:rgba(255,255,255,.1)}.ant-layout-sider-zero-width-trigger-right{left:-36px;border-radius:2px 0 0 2px}.ant-layout-sider-light{background:#fff}.ant-layout-sider-light .ant-layout-sider-trigger,.ant-layout-sider-light .ant-layout-sider-zero-width-trigger{color:#000000d9;background:#fff}.ant-layout-rtl{direction:rtl}.ant-list{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative}.ant-list *{outline:none}.ant-list-pagination{margin-top:24px;text-align:right}.ant-list-pagination .ant-pagination-options{text-align:left}.ant-list-more{margin-top:12px;text-align:center}.ant-list-more button{padding-right:32px;padding-left:32px}.ant-list-spin{min-height:40px;text-align:center}.ant-list-empty-text{padding:16px;color:#00000040;font-size:14px;text-align:center}.ant-list-items{margin:0;padding:0;list-style:none}.ant-list-item{display:flex;align-items:center;justify-content:space-between;padding:12px 0;color:#000000d9}.ant-list-item-meta{display:flex;flex:1;align-items:flex-start;max-width:100%}.ant-list-item-meta-avatar{margin-right:16px}.ant-list-item-meta-content{flex:1 0;width:0;color:#000000d9}.ant-list-item-meta-title{margin-bottom:4px;color:#000000d9;font-size:14px;line-height:1.5715}.ant-list-item-meta-title>a{color:#000000d9;transition:all .3s}.ant-list-item-meta-title>a:hover{color:#1890ff}.ant-list-item-meta-description{color:#00000073;font-size:14px;line-height:1.5715}.ant-list-item-action{flex:0 0 auto;margin-left:48px;padding:0;font-size:0;list-style:none}.ant-list-item-action>li{position:relative;display:inline-block;padding:0 8px;color:#00000073;font-size:14px;line-height:1.5715;text-align:center}.ant-list-item-action>li:first-child{padding-left:0}.ant-list-item-action-split{position:absolute;top:50%;right:0;width:1px;height:14px;margin-top:-7px;background-color:#f0f0f0}.ant-list-header,.ant-list-footer{background:transparent}.ant-list-header,.ant-list-footer{padding-top:12px;padding-bottom:12px}.ant-list-empty{padding:16px 0;color:#00000073;font-size:12px;text-align:center}.ant-list-split .ant-list-item{border-bottom:1px solid #f0f0f0}.ant-list-split .ant-list-item:last-child{border-bottom:none}.ant-list-split .ant-list-header{border-bottom:1px solid #f0f0f0}.ant-list-split.ant-list-empty .ant-list-footer{border-top:1px solid #f0f0f0}.ant-list-loading .ant-list-spin-nested-loading{min-height:32px}.ant-list-split.ant-list-something-after-last-item .ant-spin-container>.ant-list-items>.ant-list-item:last-child{border-bottom:1px solid #f0f0f0}.ant-list-lg .ant-list-item{padding:16px 24px}.ant-list-sm .ant-list-item{padding:8px 16px}.ant-list-vertical .ant-list-item{align-items:initial}.ant-list-vertical .ant-list-item-main{display:block;flex:1}.ant-list-vertical .ant-list-item-extra{margin-left:40px}.ant-list-vertical .ant-list-item-meta{margin-bottom:16px}.ant-list-vertical .ant-list-item-meta-title{margin-bottom:12px;color:#000000d9;font-size:16px;line-height:24px}.ant-list-vertical .ant-list-item-action{margin-top:16px;margin-left:auto}.ant-list-vertical .ant-list-item-action>li{padding:0 16px}.ant-list-vertical .ant-list-item-action>li:first-child{padding-left:0}.ant-list-grid .ant-col>.ant-list-item{display:block;max-width:100%;margin-bottom:16px;padding-top:0;padding-bottom:0;border-bottom:none}.ant-list-item-no-flex{display:block}.ant-list:not(.ant-list-vertical) .ant-list-item-no-flex .ant-list-item-action{float:right}.ant-list-bordered{border:1px solid #d9d9d9;border-radius:2px}.ant-list-bordered .ant-list-header,.ant-list-bordered .ant-list-footer,.ant-list-bordered .ant-list-item{padding-right:24px;padding-left:24px}.ant-list-bordered .ant-list-pagination{margin:16px 24px}.ant-list-bordered.ant-list-sm .ant-list-item,.ant-list-bordered.ant-list-sm .ant-list-header,.ant-list-bordered.ant-list-sm .ant-list-footer{padding:8px 16px}.ant-list-bordered.ant-list-lg .ant-list-item,.ant-list-bordered.ant-list-lg .ant-list-header,.ant-list-bordered.ant-list-lg .ant-list-footer{padding:16px 24px}@media screen and (max-width: 768px){.ant-list-item-action,.ant-list-vertical .ant-list-item-extra{margin-left:24px}}@media screen and (max-width: 576px){.ant-list-item{flex-wrap:wrap}.ant-list-item-action{margin-left:12px}.ant-list-vertical .ant-list-item{flex-wrap:wrap-reverse}.ant-list-vertical .ant-list-item-main{min-width:220px}.ant-list-vertical .ant-list-item-extra{margin:auto auto 16px}}.ant-list-rtl{direction:rtl;text-align:right}.ant-list-rtl .ReactVirtualized__List .ant-list-item{direction:rtl}.ant-list-rtl .ant-list-pagination{text-align:left}.ant-list-rtl .ant-list-item-meta-avatar{margin-right:0;margin-left:16px}.ant-list-rtl .ant-list-item-action{margin-right:48px;margin-left:0}.ant-list.ant-list-rtl .ant-list-item-action>li:first-child{padding-right:0;padding-left:16px}.ant-list-rtl .ant-list-item-action-split{right:auto;left:0}.ant-list-rtl.ant-list-vertical .ant-list-item-extra{margin-right:40px;margin-left:0}.ant-list-rtl.ant-list-vertical .ant-list-item-action{margin-right:auto}.ant-list-rtl .ant-list-vertical .ant-list-item-action>li:first-child{padding-right:0;padding-left:16px}.ant-list-rtl .ant-list:not(.ant-list-vertical) .ant-list-item-no-flex .ant-list-item-action{float:left}@media screen and (max-width: 768px){.ant-list-rtl .ant-list-item-action,.ant-list-rtl .ant-list-vertical .ant-list-item-extra{margin-right:24px;margin-left:0}}@media screen and (max-width: 576px){.ant-list-rtl .ant-list-item-action{margin-right:22px;margin-left:0}.ant-list-rtl.ant-list-vertical .ant-list-item-extra{margin:auto auto 16px}}.ant-pagination{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum"}.ant-pagination ul,.ant-pagination ol{margin:0;padding:0;list-style:none}.ant-pagination:after{display:block;clear:both;height:0;overflow:hidden;visibility:hidden;content:" "}.ant-pagination-total-text{display:inline-block;height:32px;margin-right:8px;line-height:30px;vertical-align:middle}.ant-pagination-item{display:inline-block;min-width:32px;height:32px;margin-right:8px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:30px;text-align:center;vertical-align:middle;list-style:none;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;outline:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-pagination-item a{display:block;padding:0 6px;color:#000000d9;transition:none}.ant-pagination-item a:hover{text-decoration:none}.ant-pagination-item:hover{border-color:#1890ff;transition:all .3s}.ant-pagination-item:hover a{color:#1890ff}.ant-pagination-item:focus-visible{border-color:#1890ff;transition:all .3s}.ant-pagination-item:focus-visible a{color:#1890ff}.ant-pagination-item-active{font-weight:500;background:#fff;border-color:#1890ff}.ant-pagination-item-active a{color:#1890ff}.ant-pagination-item-active:hover{border-color:#40a9ff}.ant-pagination-item-active:focus-visible{border-color:#40a9ff}.ant-pagination-item-active:hover a{color:#40a9ff}.ant-pagination-item-active:focus-visible a{color:#40a9ff}.ant-pagination-jump-prev,.ant-pagination-jump-next{outline:0}.ant-pagination-jump-prev .ant-pagination-item-container,.ant-pagination-jump-next .ant-pagination-item-container{position:relative}.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon,.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon{color:#1890ff;font-size:12px;letter-spacing:-1px;opacity:0;transition:all .2s}.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon-svg,.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon-svg{inset:0;margin:auto}.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-ellipsis,.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-ellipsis{position:absolute;inset:0;display:block;margin:auto;color:#00000040;font-family:Arial,Helvetica,sans-serif;letter-spacing:2px;text-align:center;text-indent:.13em;opacity:1;transition:all .2s}.ant-pagination-jump-prev:hover .ant-pagination-item-link-icon,.ant-pagination-jump-next:hover .ant-pagination-item-link-icon{opacity:1}.ant-pagination-jump-prev:hover .ant-pagination-item-ellipsis,.ant-pagination-jump-next:hover .ant-pagination-item-ellipsis{opacity:0}.ant-pagination-jump-prev:focus-visible .ant-pagination-item-link-icon,.ant-pagination-jump-next:focus-visible .ant-pagination-item-link-icon{opacity:1}.ant-pagination-jump-prev:focus-visible .ant-pagination-item-ellipsis,.ant-pagination-jump-next:focus-visible .ant-pagination-item-ellipsis{opacity:0}.ant-pagination-prev,.ant-pagination-jump-prev,.ant-pagination-jump-next{margin-right:8px}.ant-pagination-prev,.ant-pagination-next,.ant-pagination-jump-prev,.ant-pagination-jump-next{display:inline-block;min-width:32px;height:32px;color:#000000d9;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:32px;text-align:center;vertical-align:middle;list-style:none;border-radius:2px;cursor:pointer;transition:all .3s}.ant-pagination-prev,.ant-pagination-next{font-family:Arial,Helvetica,sans-serif;outline:0}.ant-pagination-prev button,.ant-pagination-next button{color:#000000d9;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-pagination-prev:hover button,.ant-pagination-next:hover button{border-color:#40a9ff}.ant-pagination-prev .ant-pagination-item-link,.ant-pagination-next .ant-pagination-item-link{display:block;width:100%;height:100%;padding:0;font-size:12px;text-align:center;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;outline:none;transition:all .3s}.ant-pagination-prev:focus-visible .ant-pagination-item-link,.ant-pagination-next:focus-visible .ant-pagination-item-link{color:#1890ff;border-color:#1890ff}.ant-pagination-prev:hover .ant-pagination-item-link,.ant-pagination-next:hover .ant-pagination-item-link{color:#1890ff;border-color:#1890ff}.ant-pagination-disabled,.ant-pagination-disabled:hover{cursor:not-allowed}.ant-pagination-disabled .ant-pagination-item-link,.ant-pagination-disabled:hover .ant-pagination-item-link{color:#00000040;border-color:#d9d9d9;cursor:not-allowed}.ant-pagination-disabled:focus-visible{cursor:not-allowed}.ant-pagination-disabled:focus-visible .ant-pagination-item-link{color:#00000040;border-color:#d9d9d9;cursor:not-allowed}.ant-pagination-slash{margin:0 10px 0 5px}.ant-pagination-options{display:inline-block;margin-left:16px;vertical-align:middle}@media all and (-ms-high-contrast: none){.ant-pagination-options *::-ms-backdrop,.ant-pagination-options{vertical-align:top}}.ant-pagination-options-size-changer.ant-select{display:inline-block;width:auto}.ant-pagination-options-quick-jumper{display:inline-block;height:32px;margin-left:8px;line-height:32px;vertical-align:top}.ant-pagination-options-quick-jumper input{position:relative;display:inline-block;width:100%;min-width:0;padding:4px 11px;color:#000000d9;font-size:14px;line-height:1.5715;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:2px;transition:all .3s;width:50px;height:32px;margin:0 8px}.ant-pagination-options-quick-jumper input::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-pagination-options-quick-jumper input:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-pagination-options-quick-jumper input::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-pagination-options-quick-jumper input:-moz-placeholder-shown{text-overflow:ellipsis}.ant-pagination-options-quick-jumper input:-ms-input-placeholder{text-overflow:ellipsis}.ant-pagination-options-quick-jumper input:placeholder-shown{text-overflow:ellipsis}.ant-pagination-options-quick-jumper input:hover{border-color:#40a9ff;border-right-width:1px}.ant-pagination-options-quick-jumper input:focus,.ant-pagination-options-quick-jumper input-focused{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-pagination-options-quick-jumper input-disabled{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-pagination-options-quick-jumper input-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-pagination-options-quick-jumper input[disabled]{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-pagination-options-quick-jumper input[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-pagination-options-quick-jumper input-borderless,.ant-pagination-options-quick-jumper input-borderless:hover,.ant-pagination-options-quick-jumper input-borderless:focus,.ant-pagination-options-quick-jumper input-borderless-focused,.ant-pagination-options-quick-jumper input-borderless-disabled,.ant-pagination-options-quick-jumper input-borderless[disabled]{background-color:transparent;border:none;box-shadow:none}textarea.ant-pagination-options-quick-jumper input{max-width:100%;height:auto;min-height:32px;line-height:1.5715;vertical-align:bottom;transition:all .3s,height 0s}.ant-pagination-options-quick-jumper input-lg{padding:6.5px 11px;font-size:16px}.ant-pagination-options-quick-jumper input-sm{padding:0 7px}.ant-pagination-simple .ant-pagination-prev,.ant-pagination-simple .ant-pagination-next{height:24px;line-height:24px;vertical-align:top}.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link,.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link{height:24px;background-color:transparent;border:0}.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link:after,.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link:after{height:24px;line-height:24px}.ant-pagination-simple .ant-pagination-simple-pager{display:inline-block;height:24px;margin-right:8px}.ant-pagination-simple .ant-pagination-simple-pager input{box-sizing:border-box;height:100%;margin-right:8px;padding:0 6px;text-align:center;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;outline:none;transition:border-color .3s}.ant-pagination-simple .ant-pagination-simple-pager input:hover{border-color:#1890ff}.ant-pagination-simple .ant-pagination-simple-pager input:focus{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33}.ant-pagination-simple .ant-pagination-simple-pager input[disabled]{color:#00000040;background:#f5f5f5;border-color:#d9d9d9;cursor:not-allowed}.ant-pagination.ant-pagination-mini .ant-pagination-total-text,.ant-pagination.ant-pagination-mini .ant-pagination-simple-pager{height:24px;line-height:24px}.ant-pagination.ant-pagination-mini .ant-pagination-item{min-width:24px;height:24px;margin:0;line-height:22px}.ant-pagination.ant-pagination-mini .ant-pagination-item:not(.ant-pagination-item-active){background:transparent;border-color:transparent}.ant-pagination.ant-pagination-mini .ant-pagination-prev,.ant-pagination.ant-pagination-mini .ant-pagination-next{min-width:24px;height:24px;margin:0;line-height:24px}.ant-pagination.ant-pagination-mini .ant-pagination-prev .ant-pagination-item-link,.ant-pagination.ant-pagination-mini .ant-pagination-next .ant-pagination-item-link{background:transparent;border-color:transparent}.ant-pagination.ant-pagination-mini .ant-pagination-prev .ant-pagination-item-link:after,.ant-pagination.ant-pagination-mini .ant-pagination-next .ant-pagination-item-link:after{height:24px;line-height:24px}.ant-pagination.ant-pagination-mini .ant-pagination-jump-prev,.ant-pagination.ant-pagination-mini .ant-pagination-jump-next{height:24px;margin-right:0;line-height:24px}.ant-pagination.ant-pagination-mini .ant-pagination-options{margin-left:2px}.ant-pagination.ant-pagination-mini .ant-pagination-options-size-changer{top:0}.ant-pagination.ant-pagination-mini .ant-pagination-options-quick-jumper{height:24px;line-height:24px}.ant-pagination.ant-pagination-mini .ant-pagination-options-quick-jumper input{padding:0 7px;width:44px;height:24px}.ant-pagination.ant-pagination-disabled{cursor:not-allowed}.ant-pagination.ant-pagination-disabled .ant-pagination-item{background:#f5f5f5;border-color:#d9d9d9;cursor:not-allowed}.ant-pagination.ant-pagination-disabled .ant-pagination-item a{color:#00000040;background:transparent;border:none;cursor:not-allowed}.ant-pagination.ant-pagination-disabled .ant-pagination-item-active{background:#e6e6e6}.ant-pagination.ant-pagination-disabled .ant-pagination-item-active a{color:#00000040}.ant-pagination.ant-pagination-disabled .ant-pagination-item-link{color:#00000040;background:#f5f5f5;border-color:#d9d9d9;cursor:not-allowed}.ant-pagination-simple.ant-pagination.ant-pagination-disabled .ant-pagination-item-link{background:transparent}.ant-pagination.ant-pagination-disabled .ant-pagination-item-link-icon{opacity:0}.ant-pagination.ant-pagination-disabled .ant-pagination-item-ellipsis{opacity:1}.ant-pagination.ant-pagination-disabled .ant-pagination-simple-pager{color:#00000040}@media only screen and (max-width: 992px){.ant-pagination-item-after-jump-prev,.ant-pagination-item-before-jump-next{display:none}}@media only screen and (max-width: 576px){.ant-pagination-options{display:none}}.ant-pagination-rtl .ant-pagination-total-text,.ant-pagination-rtl .ant-pagination-item,.ant-pagination-rtl .ant-pagination-prev,.ant-pagination-rtl .ant-pagination-jump-prev,.ant-pagination-rtl .ant-pagination-jump-next{margin-right:0;margin-left:8px}.ant-pagination-rtl .ant-pagination-slash{margin:0 5px 0 10px}.ant-pagination-rtl .ant-pagination-options{margin-right:16px;margin-left:0}.ant-pagination-rtl .ant-pagination-options .ant-pagination-options-size-changer.ant-select{margin-right:0;margin-left:8px}.ant-pagination-rtl .ant-pagination-options .ant-pagination-options-quick-jumper{margin-left:0}.ant-pagination-rtl.ant-pagination-simple .ant-pagination-simple-pager,.ant-pagination-rtl.ant-pagination-simple .ant-pagination-simple-pager input{margin-right:0;margin-left:8px}.ant-pagination-rtl.ant-pagination.mini .ant-pagination-options{margin-right:2px;margin-left:0}.ant-spin{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:absolute;display:none;color:#1890ff;text-align:center;vertical-align:middle;opacity:0;transition:transform .3s cubic-bezier(.78,.14,.15,.86)}.ant-spin-spinning{position:static;display:inline-block;opacity:1}.ant-spin-nested-loading{position:relative}.ant-spin-nested-loading>div>.ant-spin{position:absolute;top:0;left:0;z-index:4;display:block;width:100%;height:100%;max-height:400px}.ant-spin-nested-loading>div>.ant-spin .ant-spin-dot{position:absolute;top:50%;left:50%;margin:-10px}.ant-spin-nested-loading>div>.ant-spin .ant-spin-text{position:absolute;top:50%;width:100%;padding-top:5px;text-shadow:0 1px 2px #fff}.ant-spin-nested-loading>div>.ant-spin.ant-spin-show-text .ant-spin-dot{margin-top:-20px}.ant-spin-nested-loading>div>.ant-spin-sm .ant-spin-dot{margin:-7px}.ant-spin-nested-loading>div>.ant-spin-sm .ant-spin-text{padding-top:2px}.ant-spin-nested-loading>div>.ant-spin-sm.ant-spin-show-text .ant-spin-dot{margin-top:-17px}.ant-spin-nested-loading>div>.ant-spin-lg .ant-spin-dot{margin:-16px}.ant-spin-nested-loading>div>.ant-spin-lg .ant-spin-text{padding-top:11px}.ant-spin-nested-loading>div>.ant-spin-lg.ant-spin-show-text .ant-spin-dot{margin-top:-26px}.ant-spin-container{position:relative;transition:opacity .3s}.ant-spin-container:after{position:absolute;inset:0;z-index:10;display:none \\ ;width:100%;height:100%;background:#fff;opacity:0;transition:all .3s;content:"";pointer-events:none}.ant-spin-blur{clear:both;opacity:.5;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}.ant-spin-blur:after{opacity:.4;pointer-events:auto}.ant-spin-tip{color:#00000073}.ant-spin-dot{position:relative;display:inline-block;font-size:20px;width:1em;height:1em}.ant-spin-dot-item{position:absolute;display:block;width:9px;height:9px;background-color:#1890ff;border-radius:100%;transform:scale(.75);transform-origin:50% 50%;opacity:.3;animation:antSpinMove 1s infinite linear alternate}.ant-spin-dot-item:nth-child(1){top:0;left:0}.ant-spin-dot-item:nth-child(2){top:0;right:0;animation-delay:.4s}.ant-spin-dot-item:nth-child(3){right:0;bottom:0;animation-delay:.8s}.ant-spin-dot-item:nth-child(4){bottom:0;left:0;animation-delay:1.2s}.ant-spin-dot-spin{transform:rotate(0);animation:antRotate 1.2s infinite linear}.ant-spin-sm .ant-spin-dot{font-size:14px}.ant-spin-sm .ant-spin-dot i{width:6px;height:6px}.ant-spin-lg .ant-spin-dot{font-size:32px}.ant-spin-lg .ant-spin-dot i{width:14px;height:14px}.ant-spin.ant-spin-show-text .ant-spin-text{display:block}@media all and (-ms-high-contrast: none),(-ms-high-contrast: active){.ant-spin-blur{background:#fff;opacity:.5}}@keyframes antSpinMove{to{opacity:1}}@keyframes antRotate{to{transform:rotate(360deg)}}.ant-spin-rtl{direction:rtl}.ant-spin-rtl .ant-spin-dot-spin{transform:rotate(-45deg);animation-name:antRotateRtl}@keyframes antRotateRtl{to{transform:rotate(-405deg)}}.ant-mentions-status-error:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions,.ant-mentions-status-error:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions:hover{background:#fff;border-color:#ff4d4f}.ant-mentions-status-error:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions:focus,.ant-mentions-status-error:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions-focused{border-color:#ff7875;box-shadow:0 0 0 2px #ff4d4f33;border-right-width:1px;outline:0}.ant-mentions-status-error .ant-input-prefix{color:#ff4d4f}.ant-mentions-status-warning:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions,.ant-mentions-status-warning:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions:hover{background:#fff;border-color:#faad14}.ant-mentions-status-warning:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions:focus,.ant-mentions-status-warning:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions-focused{border-color:#ffc53d;box-shadow:0 0 0 2px #faad1433;border-right-width:1px;outline:0}.ant-mentions-status-warning .ant-input-prefix{color:#faad14}.ant-mentions{box-sizing:border-box;margin:0;font-variant:tabular-nums;list-style:none;font-feature-settings:"tnum";width:100%;min-width:0;color:#000000d9;font-size:14px;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:2px;transition:all .3s;position:relative;display:inline-block;height:auto;padding:0;overflow:hidden;line-height:1.5715;white-space:pre-wrap;vertical-align:bottom}.ant-mentions::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-mentions:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-mentions::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-mentions:-moz-placeholder-shown{text-overflow:ellipsis}.ant-mentions:-ms-input-placeholder{text-overflow:ellipsis}.ant-mentions:placeholder-shown{text-overflow:ellipsis}.ant-mentions:hover{border-color:#40a9ff;border-right-width:1px}.ant-mentions:focus,.ant-mentions-focused{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-mentions-disabled{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-mentions-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-mentions[disabled]{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-mentions[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-mentions-borderless,.ant-mentions-borderless:hover,.ant-mentions-borderless:focus,.ant-mentions-borderless-focused,.ant-mentions-borderless-disabled,.ant-mentions-borderless[disabled]{background-color:transparent;border:none;box-shadow:none}textarea.ant-mentions{max-width:100%;height:auto;min-height:32px;line-height:1.5715;vertical-align:bottom;transition:all .3s,height 0s}.ant-mentions-lg{padding:6.5px 11px;font-size:16px}.ant-mentions-sm{padding:0 7px}.ant-mentions-disabled>textarea{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-mentions-disabled>textarea:hover{border-color:#d9d9d9;border-right-width:1px}.ant-mentions-focused{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-mentions>textarea,.ant-mentions-measure{min-height:30px;margin:0;padding:4px 11px;overflow:inherit;overflow-x:hidden;overflow-y:auto;font-weight:inherit;font-size:inherit;font-family:inherit;font-style:inherit;font-variant:inherit;font-size-adjust:inherit;font-stretch:inherit;line-height:inherit;direction:inherit;letter-spacing:inherit;white-space:inherit;text-align:inherit;vertical-align:top;word-wrap:break-word;word-break:inherit;-moz-tab-size:inherit;-o-tab-size:inherit;tab-size:inherit}.ant-mentions>textarea{width:100%;border:none;outline:none;resize:none}.ant-mentions>textarea::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-mentions>textarea:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-mentions>textarea::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-mentions>textarea:-moz-placeholder-shown{text-overflow:ellipsis}.ant-mentions>textarea:-ms-input-placeholder{text-overflow:ellipsis}.ant-mentions>textarea:placeholder-shown{text-overflow:ellipsis}.ant-mentions-measure{position:absolute;inset:0;z-index:-1;color:transparent;pointer-events:none}.ant-mentions-measure>span{display:inline-block;min-height:1em}.ant-mentions-dropdown{margin:0;padding:0;color:#000000d9;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:absolute;top:-9999px;left:-9999px;z-index:1050;box-sizing:border-box;font-size:14px;font-variant:initial;background-color:#fff;border-radius:2px;outline:none;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d}.ant-mentions-dropdown-hidden{display:none}.ant-mentions-dropdown-menu{max-height:250px;margin-bottom:0;padding-left:0;overflow:auto;list-style:none;outline:none}.ant-mentions-dropdown-menu-item{position:relative;display:block;min-width:100px;padding:5px 12px;overflow:hidden;color:#000000d9;font-weight:400;line-height:1.5715;white-space:nowrap;text-overflow:ellipsis;cursor:pointer;transition:background .3s ease}.ant-mentions-dropdown-menu-item:hover{background-color:#f5f5f5}.ant-mentions-dropdown-menu-item:first-child{border-radius:2px 2px 0 0}.ant-mentions-dropdown-menu-item:last-child{border-radius:0 0 2px 2px}.ant-mentions-dropdown-menu-item-disabled{color:#00000040;cursor:not-allowed}.ant-mentions-dropdown-menu-item-disabled:hover{color:#00000040;background-color:#fff;cursor:not-allowed}.ant-mentions-dropdown-menu-item-selected{color:#000000d9;font-weight:600;background-color:#fafafa}.ant-mentions-dropdown-menu-item-active{background-color:#f5f5f5}.ant-mentions-suffix{position:absolute;top:0;right:11px;bottom:0;z-index:1;display:inline-flex;align-items:center;margin:auto}.ant-mentions-rtl{direction:rtl}.ant-message{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:fixed;top:8px;left:0;z-index:1010;width:100%;pointer-events:none}.ant-message-notice{padding:8px;text-align:center}.ant-message-notice-content{display:inline-block;padding:10px 16px;background:#fff;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d;pointer-events:all}.ant-message-success .anticon{color:#52c41a}.ant-message-error .anticon{color:#ff4d4f}.ant-message-warning .anticon{color:#faad14}.ant-message-info .anticon,.ant-message-loading .anticon{color:#1890ff}.ant-message .anticon{position:relative;top:1px;margin-right:8px;font-size:16px}.ant-message-notice.ant-move-up-leave.ant-move-up-leave-active{animation-name:MessageMoveOut;animation-duration:.3s}@keyframes MessageMoveOut{0%{max-height:150px;padding:8px;opacity:1}to{max-height:0;padding:0;opacity:0}}.ant-message-rtl,.ant-message-rtl span{direction:rtl}.ant-message-rtl .anticon{margin-right:0;margin-left:8px}.ant-modal{box-sizing:border-box;padding:0 0 24px;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";pointer-events:none;position:relative;top:100px;width:auto;max-width:calc(100vw - 32px);margin:0 auto}.ant-modal.ant-zoom-enter,.ant-modal.ant-zoom-appear{transform:none;opacity:0;animation-duration:.3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-modal-mask{position:fixed;inset:0;z-index:1000;height:100%;background-color:#00000073}.ant-modal-mask-hidden{display:none}.ant-modal-wrap{position:fixed;inset:0;overflow:auto;outline:0}.ant-modal-wrap{z-index:1000}.ant-modal-title{margin:0;color:#000000d9;font-weight:500;font-size:16px;line-height:22px;word-wrap:break-word}.ant-modal-content{position:relative;background-color:#fff;background-clip:padding-box;border:0;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d;pointer-events:auto}.ant-modal-close{position:absolute;top:0;right:0;z-index:10;padding:0;color:#00000073;font-weight:700;line-height:1;text-decoration:none;background:transparent;border:0;outline:0;cursor:pointer;transition:color .3s}.ant-modal-close-x{display:block;width:54px;height:54px;font-size:16px;font-style:normal;line-height:54px;text-align:center;text-transform:none;text-rendering:auto}.ant-modal-close:focus,.ant-modal-close:hover{color:#000000bf;text-decoration:none}.ant-modal-header{padding:16px 24px;color:#000000d9;background:#fff;border-bottom:1px solid #f0f0f0;border-radius:2px 2px 0 0}.ant-modal-body{padding:24px;font-size:14px;line-height:1.5715;word-wrap:break-word}.ant-modal-footer{padding:10px 16px;text-align:right;background:transparent;border-top:1px solid #f0f0f0;border-radius:0 0 2px 2px}.ant-modal-footer .ant-btn+.ant-btn:not(.ant-dropdown-trigger){margin-bottom:0;margin-left:8px}.ant-modal-open{overflow:hidden}.ant-modal-centered{text-align:center}.ant-modal-centered:before{display:inline-block;width:0;height:100%;vertical-align:middle;content:""}.ant-modal-centered .ant-modal{top:0;display:inline-block;padding-bottom:0;text-align:left;vertical-align:middle}@media (max-width: 767px){.ant-modal{max-width:calc(100vw - 16px);margin:8px auto}.ant-modal-centered .ant-modal{flex:1}}.ant-modal-confirm .ant-modal-header{display:none}.ant-modal-confirm .ant-modal-body{padding:32px 32px 24px}.ant-modal-confirm-body-wrapper:before{display:table;content:""}.ant-modal-confirm-body-wrapper:after{display:table;clear:both;content:""}.ant-modal-confirm-body .ant-modal-confirm-title{display:block;overflow:hidden;color:#000000d9;font-weight:500;font-size:16px;line-height:1.4}.ant-modal-confirm-body .ant-modal-confirm-content{margin-top:8px;color:#000000d9;font-size:14px}.ant-modal-confirm-body>.anticon{float:left;margin-right:16px;font-size:22px}.ant-modal-confirm-body>.anticon+.ant-modal-confirm-title+.ant-modal-confirm-content{margin-left:38px}.ant-modal-confirm .ant-modal-confirm-btns{margin-top:24px;text-align:right}.ant-modal-confirm .ant-modal-confirm-btns .ant-btn+.ant-btn{margin-bottom:0;margin-left:8px}.ant-modal-confirm-error .ant-modal-confirm-body>.anticon{color:#ff4d4f}.ant-modal-confirm-warning .ant-modal-confirm-body>.anticon,.ant-modal-confirm-confirm .ant-modal-confirm-body>.anticon{color:#faad14}.ant-modal-confirm-info .ant-modal-confirm-body>.anticon{color:#1890ff}.ant-modal-confirm-success .ant-modal-confirm-body>.anticon{color:#52c41a}.ant-modal-confirm .ant-zoom-leave .ant-modal-confirm-btns{pointer-events:none}.ant-modal-wrap-rtl{direction:rtl}.ant-modal-wrap-rtl .ant-modal-close{right:initial;left:0}.ant-modal-wrap-rtl .ant-modal-footer{text-align:left}.ant-modal-wrap-rtl .ant-modal-footer .ant-btn+.ant-btn{margin-right:8px;margin-left:0}.ant-modal-wrap-rtl .ant-modal-confirm-body{direction:rtl}.ant-modal-wrap-rtl .ant-modal-confirm-body>.anticon{float:right;margin-right:0;margin-left:16px}.ant-modal-wrap-rtl .ant-modal-confirm-body>.anticon+.ant-modal-confirm-title+.ant-modal-confirm-content{margin-right:38px;margin-left:0}.ant-modal-wrap-rtl .ant-modal-confirm-btns{text-align:left}.ant-modal-wrap-rtl .ant-modal-confirm-btns .ant-btn+.ant-btn{margin-right:8px;margin-left:0}.ant-modal-wrap-rtl.ant-modal-centered .ant-modal{text-align:right}.ant-notification{box-sizing:border-box;margin:0 24px 0 0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:fixed;z-index:1010}.ant-notification-close-icon{font-size:14px;cursor:pointer}.ant-notification-hook-holder{position:relative}.ant-notification-notice{position:relative;width:384px;max-width:calc(100vw - 48px);margin-bottom:16px;margin-left:auto;padding:16px 24px;overflow:hidden;line-height:1.5715;word-wrap:break-word;background:#fff;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d}.ant-notification-top .ant-notification-notice,.ant-notification-bottom .ant-notification-notice{margin-right:auto;margin-left:auto}.ant-notification-topLeft .ant-notification-notice,.ant-notification-bottomLeft .ant-notification-notice{margin-right:auto;margin-left:0}.ant-notification-notice-message{margin-bottom:8px;color:#000000d9;font-size:16px;line-height:24px}.ant-notification-notice-message-single-line-auto-margin{display:block;width:calc(264px - 100%);max-width:4px;background-color:transparent;pointer-events:none}.ant-notification-notice-message-single-line-auto-margin:before{display:block;content:""}.ant-notification-notice-description{font-size:14px}.ant-notification-notice-closable .ant-notification-notice-message{padding-right:24px}.ant-notification-notice-with-icon .ant-notification-notice-message{margin-bottom:4px;margin-left:48px;font-size:16px}.ant-notification-notice-with-icon .ant-notification-notice-description{margin-left:48px;font-size:14px}.ant-notification-notice-icon{position:absolute;margin-left:4px;font-size:24px;line-height:24px}.anticon.ant-notification-notice-icon-success{color:#52c41a}.anticon.ant-notification-notice-icon-info{color:#1890ff}.anticon.ant-notification-notice-icon-warning{color:#faad14}.anticon.ant-notification-notice-icon-error{color:#ff4d4f}.ant-notification-notice-close{position:absolute;top:16px;right:22px;color:#00000073;outline:none}.ant-notification-notice-close:hover{color:#000000ab}.ant-notification-notice-btn{float:right;margin-top:16px}.ant-notification .notification-fade-effect{animation-duration:.24s;animation-timing-function:cubic-bezier(.645,.045,.355,1);animation-fill-mode:both}.ant-notification-fade-enter,.ant-notification-fade-appear{animation-duration:.24s;animation-timing-function:cubic-bezier(.645,.045,.355,1);animation-fill-mode:both;opacity:0;animation-play-state:paused}.ant-notification-fade-leave{animation-duration:.24s;animation-timing-function:cubic-bezier(.645,.045,.355,1);animation-fill-mode:both;animation-duration:.2s;animation-play-state:paused}.ant-notification-fade-enter.ant-notification-fade-enter-active,.ant-notification-fade-appear.ant-notification-fade-appear-active{animation-name:NotificationFadeIn;animation-play-state:running}.ant-notification-fade-leave.ant-notification-fade-leave-active{animation-name:NotificationFadeOut;animation-play-state:running}@keyframes NotificationFadeIn{0%{left:384px;opacity:0}to{left:0;opacity:1}}@keyframes NotificationFadeOut{0%{max-height:150px;margin-bottom:16px;opacity:1}to{max-height:0;margin-bottom:0;padding-top:0;padding-bottom:0;opacity:0}}.ant-notification-rtl{direction:rtl}.ant-notification-rtl .ant-notification-notice-closable .ant-notification-notice-message{padding-right:0;padding-left:24px}.ant-notification-rtl .ant-notification-notice-with-icon .ant-notification-notice-message,.ant-notification-rtl .ant-notification-notice-with-icon .ant-notification-notice-description{margin-right:48px;margin-left:0}.ant-notification-rtl .ant-notification-notice-icon{margin-right:4px;margin-left:0}.ant-notification-rtl .ant-notification-notice-close{right:auto;left:22px}.ant-notification-rtl .ant-notification-notice-btn{float:left}.ant-notification-top,.ant-notification-bottom{margin-right:0;margin-left:0}.ant-notification-top .ant-notification-fade-enter.ant-notification-fade-enter-active,.ant-notification-top .ant-notification-fade-appear.ant-notification-fade-appear-active{animation-name:NotificationTopFadeIn}.ant-notification-bottom .ant-notification-fade-enter.ant-notification-fade-enter-active,.ant-notification-bottom .ant-notification-fade-appear.ant-notification-fade-appear-active{animation-name:NotificationBottomFadeIn}.ant-notification-topLeft,.ant-notification-bottomLeft{margin-right:0;margin-left:24px}.ant-notification-topLeft .ant-notification-fade-enter.ant-notification-fade-enter-active,.ant-notification-bottomLeft .ant-notification-fade-enter.ant-notification-fade-enter-active,.ant-notification-topLeft .ant-notification-fade-appear.ant-notification-fade-appear-active,.ant-notification-bottomLeft .ant-notification-fade-appear.ant-notification-fade-appear-active{animation-name:NotificationLeftFadeIn}@keyframes NotificationTopFadeIn{0%{margin-top:-100%;opacity:0}to{margin-top:0;opacity:1}}@keyframes NotificationBottomFadeIn{0%{margin-bottom:-100%;opacity:0}to{margin-bottom:0;opacity:1}}@keyframes NotificationLeftFadeIn{0%{right:384px;opacity:0}to{right:0;opacity:1}}.ant-page-header{box-sizing:border-box;margin:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;padding:16px 24px;background-color:#fff}.ant-page-header-ghost{background-color:inherit}.ant-page-header.has-breadcrumb{padding-top:12px}.ant-page-header.has-footer{padding-bottom:0}.ant-page-header-back{margin-right:16px;font-size:16px;line-height:1}.ant-page-header-back-button{color:#1890ff;outline:none;cursor:pointer;transition:color .3s;color:#000}.ant-page-header-back-button:focus-visible,.ant-page-header-back-button:hover{color:#40a9ff}.ant-page-header-back-button:active{color:#096dd9}.ant-page-header .ant-divider-vertical{height:14px;margin:0 12px;vertical-align:middle}.ant-breadcrumb+.ant-page-header-heading{margin-top:8px}.ant-page-header-heading{display:flex;justify-content:space-between}.ant-page-header-heading-left{display:flex;align-items:center;margin:4px 0;overflow:hidden}.ant-page-header-heading-title{margin-right:12px;margin-bottom:0;color:#000000d9;font-weight:600;font-size:20px;line-height:32px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-page-header-heading .ant-avatar{margin-right:12px}.ant-page-header-heading-sub-title{margin-right:12px;color:#00000073;font-size:14px;line-height:1.5715;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-page-header-heading-extra{margin:4px 0;white-space:nowrap}.ant-page-header-heading-extra>*{white-space:unset}.ant-page-header-content{padding-top:12px}.ant-page-header-footer{margin-top:16px}.ant-page-header-footer .ant-tabs>.ant-tabs-nav{margin:0}.ant-page-header-footer .ant-tabs>.ant-tabs-nav:before{border:none}.ant-page-header-footer .ant-tabs .ant-tabs-tab{padding-top:8px;padding-bottom:8px;font-size:16px}.ant-page-header-compact .ant-page-header-heading{flex-wrap:wrap}.ant-page-header-rtl{direction:rtl}.ant-page-header-rtl .ant-page-header-back{float:right;margin-right:0;margin-left:16px}.ant-page-header-rtl .ant-page-header-heading-title,.ant-page-header-rtl .ant-page-header-heading .ant-avatar{margin-right:0;margin-left:12px}.ant-page-header-rtl .ant-page-header-heading-sub-title{float:right;margin-right:0;margin-left:12px}.ant-page-header-rtl .ant-page-header-heading-tags{float:right}.ant-page-header-rtl .ant-page-header-heading-extra{float:left}.ant-page-header-rtl .ant-page-header-heading-extra>*{margin-right:12px;margin-left:0}.ant-page-header-rtl .ant-page-header-heading-extra>*:first-child{margin-right:0}.ant-page-header-rtl .ant-page-header-footer .ant-tabs-bar .ant-tabs-nav{float:right}.ant-popconfirm{z-index:1060}.ant-progress{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-block}.ant-progress-line{position:relative;width:100%;font-size:14px}.ant-progress-steps{display:inline-block}.ant-progress-steps-outer{display:flex;flex-direction:row;align-items:center}.ant-progress-steps-item{flex-shrink:0;min-width:2px;margin-right:2px;background:#f3f3f3;transition:all .3s}.ant-progress-steps-item-active{background:#1890ff}.ant-progress-small.ant-progress-line,.ant-progress-small.ant-progress-line .ant-progress-text .anticon{font-size:12px}.ant-progress-outer{display:inline-block;width:100%;margin-right:0;padding-right:0}.ant-progress-show-info .ant-progress-outer{margin-right:calc(-2em - 8px);padding-right:calc(2em + 8px)}.ant-progress-inner{position:relative;display:inline-block;width:100%;overflow:hidden;vertical-align:middle;background-color:#f5f5f5;border-radius:100px}.ant-progress-circle-trail{stroke:#f5f5f5}.ant-progress-circle-path{animation:ant-progress-appear .3s}.ant-progress-inner:not(.ant-progress-circle-gradient) .ant-progress-circle-path{stroke:#1890ff}.ant-progress-success-bg,.ant-progress-bg{position:relative;background-color:#1890ff;border-radius:100px;transition:all .4s cubic-bezier(.08,.82,.17,1) 0s}.ant-progress-success-bg{position:absolute;top:0;left:0;background-color:#52c41a}.ant-progress-text{display:inline-block;width:2em;margin-left:8px;color:#000000d9;font-size:1em;line-height:1;white-space:nowrap;text-align:left;vertical-align:middle;word-break:normal}.ant-progress-text .anticon{font-size:14px}.ant-progress-status-active .ant-progress-bg:before{position:absolute;inset:0;background:#fff;border-radius:10px;opacity:0;animation:ant-progress-active 2.4s cubic-bezier(.23,1,.32,1) infinite;content:""}.ant-progress-status-exception .ant-progress-bg{background-color:#ff4d4f}.ant-progress-status-exception .ant-progress-text{color:#ff4d4f}.ant-progress-status-exception .ant-progress-inner:not(.ant-progress-circle-gradient) .ant-progress-circle-path{stroke:#ff4d4f}.ant-progress-status-success .ant-progress-bg{background-color:#52c41a}.ant-progress-status-success .ant-progress-text{color:#52c41a}.ant-progress-status-success .ant-progress-inner:not(.ant-progress-circle-gradient) .ant-progress-circle-path{stroke:#52c41a}.ant-progress-circle .ant-progress-inner{position:relative;line-height:1;background-color:transparent}.ant-progress-circle .ant-progress-text{position:absolute;top:50%;left:50%;width:100%;margin:0;padding:0;color:#000000d9;font-size:1em;line-height:1;white-space:normal;text-align:center;transform:translate(-50%,-50%)}.ant-progress-circle .ant-progress-text .anticon{font-size:1.16666667em}.ant-progress-circle.ant-progress-status-exception .ant-progress-text{color:#ff4d4f}.ant-progress-circle.ant-progress-status-success .ant-progress-text{color:#52c41a}@keyframes ant-progress-active{0%{transform:translate(-100%) scaleX(0);opacity:.1}20%{transform:translate(-100%) scaleX(0);opacity:.5}to{transform:translate(0) scaleX(1);opacity:0}}.ant-progress-rtl{direction:rtl}.ant-progress-rtl.ant-progress-show-info .ant-progress-outer{margin-right:0;margin-left:calc(-2em - 8px);padding-right:0;padding-left:calc(2em + 8px)}.ant-progress-rtl .ant-progress-success-bg{right:0;left:auto}.ant-progress-rtl.ant-progress-line .ant-progress-text,.ant-progress-rtl.ant-progress-steps .ant-progress-text{margin-right:8px;margin-left:0;text-align:right}.ant-rate{box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;font-feature-settings:"tnum";display:inline-block;margin:0;padding:0;color:#fadb14;font-size:20px;line-height:unset;list-style:none;outline:none}.ant-rate-disabled .ant-rate-star{cursor:default}.ant-rate-disabled .ant-rate-star>div:hover{transform:scale(1)}.ant-rate-star{position:relative;display:inline-block;color:inherit;cursor:pointer}.ant-rate-star:not(:last-child){margin-right:8px}.ant-rate-star>div{transition:all .3s,outline 0s}.ant-rate-star>div:hover{transform:scale(1.1)}.ant-rate-star>div:focus{outline:0}.ant-rate-star>div:focus-visible{outline:1px dashed #fadb14;transform:scale(1.1)}.ant-rate-star-first,.ant-rate-star-second{color:#f0f0f0;transition:all .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-rate-star-first .anticon,.ant-rate-star-second .anticon{vertical-align:middle}.ant-rate-star-first{position:absolute;top:0;left:0;width:50%;height:100%;overflow:hidden;opacity:0}.ant-rate-star-half .ant-rate-star-first,.ant-rate-star-half .ant-rate-star-second{opacity:1}.ant-rate-star-half .ant-rate-star-first,.ant-rate-star-full .ant-rate-star-second{color:inherit}.ant-rate-text{display:inline-block;margin:0 8px;font-size:14px}.ant-rate-rtl{direction:rtl}.ant-rate-rtl .ant-rate-star:not(:last-child){margin-right:0;margin-left:8px}.ant-rate-rtl .ant-rate-star-first{right:0;left:auto}.ant-result{padding:48px 32px}.ant-result-success .ant-result-icon>.anticon{color:#52c41a}.ant-result-error .ant-result-icon>.anticon{color:#ff4d4f}.ant-result-info .ant-result-icon>.anticon{color:#1890ff}.ant-result-warning .ant-result-icon>.anticon{color:#faad14}.ant-result-image{width:250px;height:295px;margin:auto}.ant-result-icon{margin-bottom:24px;text-align:center}.ant-result-icon>.anticon{font-size:72px}.ant-result-title{color:#000000d9;font-size:24px;line-height:1.8;text-align:center}.ant-result-subtitle{color:#00000073;font-size:14px;line-height:1.6;text-align:center}.ant-result-extra{margin:24px 0 0;text-align:center}.ant-result-extra>*{margin-right:8px}.ant-result-extra>*:last-child{margin-right:0}.ant-result-content{margin-top:24px;padding:24px 40px;background-color:#fafafa}.ant-result-rtl{direction:rtl}.ant-result-rtl .ant-result-extra>*{margin-right:0;margin-left:8px}.ant-result-rtl .ant-result-extra>*:last-child{margin-left:0}.segmented-disabled-item,.segmented-disabled-item:hover,.segmented-disabled-item:focus{color:#00000040;cursor:not-allowed}.segmented-item-selected{background-color:#fff;border-radius:2px;box-shadow:0 2px 8px -2px #0000000d,0 1px 4px -1px #00000012,0 0 1px #00000014}.segmented-text-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;word-break:keep-all}.ant-segmented{box-sizing:border-box;margin:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-block;padding:2px;color:#000000a6;background-color:#0000000a;border-radius:2px;transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-segmented-group{position:relative;display:flex;align-items:stretch;justify-items:flex-start;width:100%}.ant-segmented.ant-segmented-block{display:flex}.ant-segmented.ant-segmented-block .ant-segmented-item{flex:1;min-width:0}.ant-segmented:not(.ant-segmented-disabled):hover,.ant-segmented:not(.ant-segmented-disabled):focus{background-color:#0000000f}.ant-segmented-item{position:relative;text-align:center;cursor:pointer;transition:color .3s cubic-bezier(.645,.045,.355,1)}.ant-segmented-item-selected{background-color:#fff;border-radius:2px;box-shadow:0 2px 8px -2px #0000000d,0 1px 4px -1px #00000012,0 0 1px #00000014;color:#262626}.ant-segmented-item:hover,.ant-segmented-item:focus{color:#262626}.ant-segmented-item-label{min-height:28px;padding:0 11px;line-height:28px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;word-break:keep-all}.ant-segmented-item-icon+*{margin-left:6px}.ant-segmented-item-input{position:absolute;top:0;left:0;width:0;height:0;opacity:0;pointer-events:none}.ant-segmented.ant-segmented-lg .ant-segmented-item-label{min-height:36px;padding:0 11px;font-size:16px;line-height:36px}.ant-segmented.ant-segmented-sm .ant-segmented-item-label{min-height:20px;padding:0 7px;line-height:20px}.ant-segmented-item-disabled,.ant-segmented-item-disabled:hover,.ant-segmented-item-disabled:focus{color:#00000040;cursor:not-allowed}.ant-segmented-thumb{background-color:#fff;border-radius:2px;box-shadow:0 2px 8px -2px #0000000d,0 1px 4px -1px #00000012,0 0 1px #00000014;position:absolute;top:0;left:0;width:0;height:100%;padding:4px 0}.ant-segmented-thumb-motion-appear-active{transition:transform .3s cubic-bezier(.645,.045,.355,1),width .3s cubic-bezier(.645,.045,.355,1);will-change:transform,width}.ant-segmented.ant-segmented-rtl{direction:rtl}.ant-segmented.ant-segmented-rtl .ant-segmented-item-icon{margin-right:0;margin-left:6px}.ant-slider{box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;height:12px;margin:10px 6px;padding:4px 0;cursor:pointer;touch-action:none}.ant-slider-vertical{width:12px;height:100%;margin:6px 10px;padding:0 4px}.ant-slider-vertical .ant-slider-rail{width:4px;height:100%}.ant-slider-vertical .ant-slider-track{width:4px}.ant-slider-vertical .ant-slider-handle{margin-top:-6px;margin-left:-5px}.ant-slider-vertical .ant-slider-mark{top:0;left:12px;width:18px;height:100%}.ant-slider-vertical .ant-slider-mark-text{left:4px;white-space:nowrap}.ant-slider-vertical .ant-slider-step{width:4px;height:100%}.ant-slider-vertical .ant-slider-dot{top:auto;margin-left:-2px}.ant-slider-tooltip .ant-tooltip-inner{min-width:unset}.ant-slider-rtl.ant-slider-vertical .ant-slider-handle{margin-right:-5px;margin-left:0}.ant-slider-rtl.ant-slider-vertical .ant-slider-mark{right:12px;left:auto}.ant-slider-rtl.ant-slider-vertical .ant-slider-mark-text{right:4px;left:auto}.ant-slider-rtl.ant-slider-vertical .ant-slider-dot{right:2px;left:auto}.ant-slider-with-marks{margin-bottom:28px}.ant-slider-rail{position:absolute;width:100%;height:4px;background-color:#f5f5f5;border-radius:2px;transition:background-color .3s}.ant-slider-track{position:absolute;height:4px;background-color:#91d5ff;border-radius:2px;transition:background-color .3s}.ant-slider-handle{position:absolute;width:14px;height:14px;margin-top:-5px;background-color:#fff;border:solid 2px #91d5ff;border-radius:50%;box-shadow:0;cursor:pointer;transition:border-color .3s,box-shadow .6s,transform .3s cubic-bezier(.18,.89,.32,1.28)}.ant-slider-handle-dragging{z-index:1}.ant-slider-handle:focus{border-color:#46a6ff;outline:none;box-shadow:0 0 0 5px #1890ff1f}.ant-slider-handle.ant-tooltip-open{border-color:#1890ff}.ant-slider-handle:after{position:absolute;inset:-6px;content:""}.ant-slider:hover .ant-slider-rail{background-color:#e1e1e1}.ant-slider:hover .ant-slider-track{background-color:#69c0ff}.ant-slider:hover .ant-slider-handle:not(.ant-tooltip-open){border-color:#69c0ff}.ant-slider-mark{position:absolute;top:14px;left:0;width:100%;font-size:14px}.ant-slider-mark-text{position:absolute;display:inline-block;color:#00000073;text-align:center;word-break:keep-all;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-slider-mark-text-active{color:#000000d9}.ant-slider-step{position:absolute;width:100%;height:4px;background:transparent;pointer-events:none}.ant-slider-dot{position:absolute;top:-2px;width:8px;height:8px;background-color:#fff;border:2px solid #f0f0f0;border-radius:50%;cursor:pointer}.ant-slider-dot-active{border-color:#8cc8ff}.ant-slider-disabled{cursor:not-allowed}.ant-slider-disabled .ant-slider-rail{background-color:#f5f5f5!important}.ant-slider-disabled .ant-slider-track{background-color:#00000040!important}.ant-slider-disabled .ant-slider-handle,.ant-slider-disabled .ant-slider-dot{background-color:#fff;border-color:#00000040!important;box-shadow:none;cursor:not-allowed}.ant-slider-disabled .ant-slider-mark-text,.ant-slider-disabled .ant-slider-dot{cursor:not-allowed!important}.ant-slider-rtl{direction:rtl}.ant-slider-rtl .ant-slider-mark{right:0;left:auto}.ant-statistic{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum"}.ant-statistic-title{margin-bottom:4px;color:#00000073;font-size:14px}.ant-statistic-skeleton{padding-top:16px}.ant-statistic-content{color:#000000d9;font-size:24px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}.ant-statistic-content-value{display:inline-block;direction:ltr}.ant-statistic-content-prefix,.ant-statistic-content-suffix{display:inline-block}.ant-statistic-content-prefix{margin-right:4px}.ant-statistic-content-suffix{margin-left:4px}.ant-statistic-rtl{direction:rtl}.ant-statistic-rtl .ant-statistic-content-prefix{margin-right:0;margin-left:4px}.ant-statistic-rtl .ant-statistic-content-suffix{margin-right:4px;margin-left:0}.ant-steps{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:flex;width:100%;font-size:0;text-align:initial}.ant-steps-item{position:relative;display:inline-block;flex:1;overflow:hidden;vertical-align:top}.ant-steps-item-container{outline:none}.ant-steps-item:last-child{flex:none}.ant-steps-item:last-child>.ant-steps-item-container>.ant-steps-item-tail,.ant-steps-item:last-child>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after{display:none}.ant-steps-item-icon,.ant-steps-item-content{display:inline-block;vertical-align:top}.ant-steps-item-icon{width:32px;height:32px;margin:0 8px 0 0;font-size:16px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:32px;text-align:center;border:1px solid rgba(0,0,0,.25);border-radius:32px;transition:background-color .3s,border-color .3s}.ant-steps-item-icon .ant-steps-icon{position:relative;top:-.5px;color:#1890ff;line-height:1}.ant-steps-item-tail{position:absolute;top:12px;left:0;width:100%;padding:0 10px}.ant-steps-item-tail:after{display:inline-block;width:100%;height:1px;background:#f0f0f0;border-radius:1px;transition:background .3s;content:""}.ant-steps-item-title{position:relative;display:inline-block;padding-right:16px;color:#000000d9;font-size:16px;line-height:32px}.ant-steps-item-title:after{position:absolute;top:16px;left:100%;display:block;width:9999px;height:1px;background:#f0f0f0;content:""}.ant-steps-item-subtitle{display:inline;margin-left:8px;color:#00000073;font-weight:400;font-size:14px}.ant-steps-item-description{color:#00000073;font-size:14px}.ant-steps-item-wait .ant-steps-item-icon{background-color:#fff;border-color:#00000040}.ant-steps-item-wait .ant-steps-item-icon>.ant-steps-icon{color:#00000040}.ant-steps-item-wait .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:rgba(0,0,0,.25)}.ant-steps-item-wait>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title{color:#00000073}.ant-steps-item-wait>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#f0f0f0}.ant-steps-item-wait>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-description{color:#00000073}.ant-steps-item-wait>.ant-steps-item-container>.ant-steps-item-tail:after{background-color:#f0f0f0}.ant-steps-item-process .ant-steps-item-icon{background-color:#fff;border-color:#1890ff}.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon{color:#1890ff}.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:#1890ff}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title{color:#000000d9}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#f0f0f0}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-description{color:#000000d9}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-tail:after{background-color:#f0f0f0}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-icon{background:#1890ff}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-icon .ant-steps-icon{color:#fff}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-title{font-weight:500}.ant-steps-item-finish .ant-steps-item-icon{background-color:#fff;border-color:#1890ff}.ant-steps-item-finish .ant-steps-item-icon>.ant-steps-icon{color:#1890ff}.ant-steps-item-finish .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:#1890ff}.ant-steps-item-finish>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title{color:#000000d9}.ant-steps-item-finish>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#1890ff}.ant-steps-item-finish>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-description{color:#00000073}.ant-steps-item-finish>.ant-steps-item-container>.ant-steps-item-tail:after{background-color:#1890ff}.ant-steps-item-error .ant-steps-item-icon{background-color:#fff;border-color:#ff4d4f}.ant-steps-item-error .ant-steps-item-icon>.ant-steps-icon{color:#ff4d4f}.ant-steps-item-error .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:#ff4d4f}.ant-steps-item-error>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title{color:#ff4d4f}.ant-steps-item-error>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#f0f0f0}.ant-steps-item-error>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-description{color:#ff4d4f}.ant-steps-item-error>.ant-steps-item-container>.ant-steps-item-tail:after{background-color:#f0f0f0}.ant-steps-item.ant-steps-next-error .ant-steps-item-title:after{background:#ff4d4f}.ant-steps-item-disabled{cursor:not-allowed}.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button]{cursor:pointer}.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button] .ant-steps-item-title,.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button] .ant-steps-item-subtitle,.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button] .ant-steps-item-description,.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button] .ant-steps-item-icon .ant-steps-icon{transition:color .3s}.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button]:hover .ant-steps-item-title,.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button]:hover .ant-steps-item-subtitle,.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button]:hover .ant-steps-item-description{color:#1890ff}.ant-steps .ant-steps-item:not(.ant-steps-item-active):not(.ant-steps-item-process)>.ant-steps-item-container[role=button]:hover .ant-steps-item-icon{border-color:#1890ff}.ant-steps .ant-steps-item:not(.ant-steps-item-active):not(.ant-steps-item-process)>.ant-steps-item-container[role=button]:hover .ant-steps-item-icon .ant-steps-icon{color:#1890ff}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item{padding-left:16px;white-space:nowrap}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child{padding-left:0}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child .ant-steps-item-title{padding-right:0}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item-tail{display:none}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item-description{max-width:140px;white-space:normal}.ant-steps-item-custom>.ant-steps-item-container>.ant-steps-item-icon{height:auto;background:none;border:0}.ant-steps-item-custom>.ant-steps-item-container>.ant-steps-item-icon>.ant-steps-icon{top:0;left:.5px;width:32px;height:32px;font-size:24px;line-height:32px}.ant-steps-item-custom.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon{color:#1890ff}.ant-steps:not(.ant-steps-vertical) .ant-steps-item-custom .ant-steps-item-icon{width:auto;background:none}.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item{padding-left:12px}.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child{padding-left:0}.ant-steps-small .ant-steps-item-icon{width:24px;height:24px;margin:0 8px 0 0;font-size:12px;line-height:24px;text-align:center;border-radius:24px}.ant-steps-small .ant-steps-item-title{padding-right:12px;font-size:14px;line-height:24px}.ant-steps-small .ant-steps-item-title:after{top:12px}.ant-steps-small .ant-steps-item-description{color:#00000073;font-size:14px}.ant-steps-small .ant-steps-item-tail{top:8px}.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon{width:inherit;height:inherit;line-height:inherit;background:none;border:0;border-radius:0}.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon>.ant-steps-icon{font-size:24px;line-height:24px;transform:none}.ant-steps-vertical{display:flex;flex-direction:column}.ant-steps-vertical>.ant-steps-item{display:block;flex:1 0 auto;padding-left:0;overflow:visible}.ant-steps-vertical>.ant-steps-item .ant-steps-item-icon{float:left;margin-right:16px}.ant-steps-vertical>.ant-steps-item .ant-steps-item-content{display:block;min-height:48px;overflow:hidden}.ant-steps-vertical>.ant-steps-item .ant-steps-item-title{line-height:32px}.ant-steps-vertical>.ant-steps-item .ant-steps-item-description{padding-bottom:12px}.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{position:absolute;top:0;left:15px;width:1px;height:100%;padding:38px 0 6px}.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail:after{width:1px;height:100%}.ant-steps-vertical>.ant-steps-item:not(:last-child)>.ant-steps-item-container>.ant-steps-item-tail{display:block}.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after{display:none}.ant-steps-vertical.ant-steps-small .ant-steps-item-container .ant-steps-item-tail{position:absolute;top:0;left:11px;padding:30px 0 6px}.ant-steps-vertical.ant-steps-small .ant-steps-item-container .ant-steps-item-title{line-height:24px}.ant-steps-label-vertical .ant-steps-item{overflow:visible}.ant-steps-label-vertical .ant-steps-item-tail{margin-left:58px;padding:3.5px 24px}.ant-steps-label-vertical .ant-steps-item-content{display:block;width:116px;margin-top:8px;text-align:center}.ant-steps-label-vertical .ant-steps-item-icon{display:inline-block;margin-left:42px}.ant-steps-label-vertical .ant-steps-item-title{padding-right:0;padding-left:0}.ant-steps-label-vertical .ant-steps-item-title:after{display:none}.ant-steps-label-vertical .ant-steps-item-subtitle{display:block;margin-bottom:4px;margin-left:0;line-height:1.5715}.ant-steps-label-vertical.ant-steps-small:not(.ant-steps-dot) .ant-steps-item-icon{margin-left:46px}.ant-steps-dot .ant-steps-item-title,.ant-steps-dot.ant-steps-small .ant-steps-item-title{line-height:1.5715}.ant-steps-dot .ant-steps-item-tail,.ant-steps-dot.ant-steps-small .ant-steps-item-tail{top:2px;width:100%;margin:0 0 0 70px;padding:0}.ant-steps-dot .ant-steps-item-tail:after,.ant-steps-dot.ant-steps-small .ant-steps-item-tail:after{width:calc(100% - 20px);height:3px;margin-left:12px}.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot,.ant-steps-dot.ant-steps-small .ant-steps-item:first-child .ant-steps-icon-dot{left:2px}.ant-steps-dot .ant-steps-item-icon,.ant-steps-dot.ant-steps-small .ant-steps-item-icon{width:8px;height:8px;margin-left:67px;padding-right:0;line-height:8px;background:transparent;border:0}.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot,.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot{position:relative;float:left;width:100%;height:100%;border-radius:100px;transition:all .3s}.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot:after,.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot:after{position:absolute;top:-12px;left:-26px;width:60px;height:32px;background:rgba(0,0,0,.001);content:""}.ant-steps-dot .ant-steps-item-content,.ant-steps-dot.ant-steps-small .ant-steps-item-content{width:140px}.ant-steps-dot .ant-steps-item-process .ant-steps-item-icon,.ant-steps-dot.ant-steps-small .ant-steps-item-process .ant-steps-item-icon{position:relative;top:-1px;width:10px;height:10px;line-height:10px;background:none}.ant-steps-dot .ant-steps-item-process .ant-steps-icon:first-child .ant-steps-icon-dot,.ant-steps-dot.ant-steps-small .ant-steps-item-process .ant-steps-icon:first-child .ant-steps-icon-dot{left:0}.ant-steps-vertical.ant-steps-dot .ant-steps-item-icon{margin-top:13px;margin-left:0;background:none}.ant-steps-vertical.ant-steps-dot .ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{top:6.5px;left:-9px;margin:0;padding:22px 0 4px}.ant-steps-vertical.ant-steps-dot.ant-steps-small .ant-steps-item-icon{margin-top:10px}.ant-steps-vertical.ant-steps-dot.ant-steps-small .ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{top:3.5px}.ant-steps-vertical.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot{left:0}.ant-steps-vertical.ant-steps-dot .ant-steps-item-content{width:inherit}.ant-steps-vertical.ant-steps-dot .ant-steps-item-process .ant-steps-item-container .ant-steps-item-icon .ant-steps-icon-dot{top:-1px;left:-1px}.ant-steps-navigation{padding-top:12px}.ant-steps-navigation.ant-steps-small .ant-steps-item-container{margin-left:-12px}.ant-steps-navigation .ant-steps-item{overflow:visible;text-align:center}.ant-steps-navigation .ant-steps-item-container{display:inline-block;height:100%;margin-left:-16px;padding-bottom:12px;text-align:left;transition:opacity .3s}.ant-steps-navigation .ant-steps-item-container .ant-steps-item-content{max-width:auto}.ant-steps-navigation .ant-steps-item-container .ant-steps-item-title{max-width:100%;padding-right:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-steps-navigation .ant-steps-item-container .ant-steps-item-title:after{display:none}.ant-steps-navigation .ant-steps-item:not(.ant-steps-item-active) .ant-steps-item-container[role=button]{cursor:pointer}.ant-steps-navigation .ant-steps-item:not(.ant-steps-item-active) .ant-steps-item-container[role=button]:hover{opacity:.85}.ant-steps-navigation .ant-steps-item:last-child{flex:1}.ant-steps-navigation .ant-steps-item:last-child:after{display:none}.ant-steps-navigation .ant-steps-item:after{position:absolute;top:50%;left:100%;display:inline-block;width:12px;height:12px;margin-top:-14px;margin-left:-2px;border:1px solid rgba(0,0,0,.25);border-bottom:none;border-left:none;transform:rotate(45deg);content:""}.ant-steps-navigation .ant-steps-item:before{position:absolute;bottom:0;left:50%;display:inline-block;width:0;height:2px;background-color:#1890ff;transition:width .3s,left .3s;transition-timing-function:ease-out;content:""}.ant-steps-navigation .ant-steps-item.ant-steps-item-active:before{left:0;width:100%}.ant-steps-navigation.ant-steps-vertical>.ant-steps-item{margin-right:0!important}.ant-steps-navigation.ant-steps-vertical>.ant-steps-item:before{display:none}.ant-steps-navigation.ant-steps-vertical>.ant-steps-item.ant-steps-item-active:before{top:0;right:0;left:unset;display:block;width:3px;height:calc(100% - 24px)}.ant-steps-navigation.ant-steps-vertical>.ant-steps-item:after{position:relative;top:-2px;left:50%;display:block;width:8px;height:8px;margin-bottom:8px;text-align:center;transform:rotate(135deg)}.ant-steps-navigation.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{visibility:hidden}.ant-steps-navigation.ant-steps-horizontal>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{visibility:hidden}.ant-steps-rtl{direction:rtl}.ant-steps.ant-steps-rtl .ant-steps-item-icon{margin-right:0;margin-left:8px}.ant-steps-rtl .ant-steps-item-tail{right:0;left:auto}.ant-steps-rtl .ant-steps-item-title{padding-right:0;padding-left:16px}.ant-steps-rtl .ant-steps-item-title .ant-steps-item-subtitle{float:left;margin-right:8px;margin-left:0}.ant-steps-rtl .ant-steps-item-title:after{right:100%;left:auto}.ant-steps-rtl.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item{padding-right:16px;padding-left:0}.ant-steps-rtl.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child{padding-right:0}.ant-steps-rtl.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child .ant-steps-item-title{padding-left:0}.ant-steps-rtl .ant-steps-item-custom .ant-steps-item-icon>.ant-steps-icon{right:.5px;left:auto}.ant-steps-rtl.ant-steps-navigation.ant-steps-small .ant-steps-item-container{margin-right:-12px;margin-left:0}.ant-steps-rtl.ant-steps-navigation .ant-steps-item-container{margin-right:-16px;margin-left:0;text-align:right}.ant-steps-rtl.ant-steps-navigation .ant-steps-item-container .ant-steps-item-title{padding-left:0}.ant-steps-rtl.ant-steps-navigation .ant-steps-item:after{right:100%;left:auto;margin-right:-2px;margin-left:0;transform:rotate(225deg)}.ant-steps-rtl.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item{padding-right:12px;padding-left:0}.ant-steps-rtl.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child{padding-right:0}.ant-steps-rtl.ant-steps-small .ant-steps-item-title{padding-right:0;padding-left:12px}.ant-steps-rtl.ant-steps-vertical>.ant-steps-item .ant-steps-item-icon{float:right;margin-right:0;margin-left:16px}.ant-steps-rtl.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{right:16px;left:auto}.ant-steps-rtl.ant-steps-vertical.ant-steps-small .ant-steps-item-container .ant-steps-item-tail{right:12px;left:auto}.ant-steps-rtl.ant-steps-label-vertical .ant-steps-item-title{padding-left:0}.ant-steps-rtl.ant-steps-dot .ant-steps-item-tail,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-tail{margin:0 70px 0 0}.ant-steps-rtl.ant-steps-dot .ant-steps-item-tail:after,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-tail:after{margin-right:12px;margin-left:0}.ant-steps-rtl.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item:first-child .ant-steps-icon-dot{right:2px;left:auto}.ant-steps-rtl.ant-steps-dot .ant-steps-item-icon,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-icon{margin-right:67px;margin-left:0}.ant-steps-rtl.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot{float:right}.ant-steps-rtl.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot:after,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot:after{right:-26px;left:auto}.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item-icon{margin-right:0;margin-left:16px}.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{right:-9px;left:auto}.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot{right:0;left:auto}.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item-process .ant-steps-icon-dot{right:-2px;left:auto}.ant-steps-rtl.ant-steps-with-progress.ant-steps-vertical>.ant-steps-item{padding-right:4px}.ant-steps-rtl.ant-steps-with-progress.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{right:19px}.ant-steps-rtl.ant-steps-with-progress.ant-steps-small.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{right:15px}.ant-steps-rtl.ant-steps-with-progress.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item:first-child{padding-right:4px;padding-left:0}.ant-steps-rtl.ant-steps-with-progress.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item:first-child.ant-steps-item-active{padding-right:4px}.ant-steps-with-progress .ant-steps-item{padding-top:4px}.ant-steps-with-progress .ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{top:4px;left:19px}.ant-steps-with-progress.ant-steps-horizontal .ant-steps-item:first-child,.ant-steps-with-progress.ant-steps-small.ant-steps-horizontal .ant-steps-item:first-child{padding-bottom:4px;padding-left:4px}.ant-steps-with-progress.ant-steps-small>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{left:15px}.ant-steps-with-progress.ant-steps-vertical .ant-steps-item{padding-left:4px}.ant-steps-with-progress.ant-steps-label-vertical .ant-steps-item .ant-steps-item-tail{top:14px!important}.ant-steps-with-progress .ant-steps-item-icon{position:relative}.ant-steps-with-progress .ant-steps-item-icon .ant-progress{position:absolute;inset:-5px}.ant-switch{margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;display:inline-block;box-sizing:border-box;min-width:44px;height:22px;line-height:22px;vertical-align:middle;background-color:#00000040;border:0;border-radius:100px;cursor:pointer;transition:all .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-switch:focus{outline:0;box-shadow:0 0 0 2px #0000001a}.ant-switch-checked:focus{box-shadow:0 0 0 2px #e6f7ff}.ant-switch:focus:hover{box-shadow:none}.ant-switch-checked{background-color:#1890ff}.ant-switch-loading,.ant-switch-disabled{cursor:not-allowed;opacity:.4}.ant-switch-loading *,.ant-switch-disabled *{box-shadow:none;cursor:not-allowed}.ant-switch-inner{display:block;margin:0 7px 0 25px;color:#fff;font-size:12px;transition:margin .2s}.ant-switch-checked .ant-switch-inner{margin:0 25px 0 7px}.ant-switch-handle{position:absolute;top:2px;left:2px;width:18px;height:18px;transition:all .2s ease-in-out}.ant-switch-handle:before{position:absolute;inset:0;background-color:#fff;border-radius:9px;box-shadow:0 2px 4px #00230b33;transition:all .2s ease-in-out;content:""}.ant-switch-checked .ant-switch-handle{left:calc(100% - 20px)}.ant-switch:not(.ant-switch-disabled):active .ant-switch-handle:before{right:-30%;left:0}.ant-switch:not(.ant-switch-disabled):active.ant-switch-checked .ant-switch-handle:before{right:0;left:-30%}.ant-switch-loading-icon.anticon{position:relative;top:2px;color:#000000a6;vertical-align:top}.ant-switch-checked .ant-switch-loading-icon{color:#1890ff}.ant-switch-small{min-width:28px;height:16px;line-height:16px}.ant-switch-small .ant-switch-inner{margin:0 5px 0 18px;font-size:12px}.ant-switch-small .ant-switch-handle{width:12px;height:12px}.ant-switch-small .ant-switch-loading-icon{top:1.5px;font-size:9px}.ant-switch-small.ant-switch-checked .ant-switch-inner{margin:0 18px 0 5px}.ant-switch-small.ant-switch-checked .ant-switch-handle{left:calc(100% - 14px)}.ant-switch-rtl{direction:rtl}.ant-switch-rtl .ant-switch-inner{margin:0 25px 0 7px}.ant-switch-rtl .ant-switch-handle{right:2px;left:auto}.ant-switch-rtl:not(.ant-switch-rtl-disabled):active .ant-switch-handle:before{right:0;left:-30%}.ant-switch-rtl:not(.ant-switch-rtl-disabled):active.ant-switch-checked .ant-switch-handle:before{right:-30%;left:0}.ant-switch-rtl.ant-switch-checked .ant-switch-inner{margin:0 7px 0 25px}.ant-switch-rtl.ant-switch-checked .ant-switch-handle{right:calc(100% - 20px)}.ant-switch-rtl.ant-switch-small.ant-switch-checked .ant-switch-handle{right:calc(100% - 14px)}.ant-table.ant-table-middle{font-size:14px}.ant-table.ant-table-middle .ant-table-title,.ant-table.ant-table-middle .ant-table-footer,.ant-table.ant-table-middle .ant-table-thead>tr>th,.ant-table.ant-table-middle .ant-table-tbody>tr>td,.ant-table.ant-table-middle tfoot>tr>th,.ant-table.ant-table-middle tfoot>tr>td{padding:12px 8px}.ant-table.ant-table-middle .ant-table-filter-trigger{margin-right:-4px}.ant-table.ant-table-middle .ant-table-expanded-row-fixed{margin:-12px -8px}.ant-table.ant-table-middle .ant-table-tbody .ant-table-wrapper:only-child .ant-table{margin:-12px -8px -12px 40px}.ant-table.ant-table-middle .ant-table-selection-column{-webkit-padding-start:2px;padding-inline-start:2px}.ant-table.ant-table-small{font-size:14px}.ant-table.ant-table-small .ant-table-title,.ant-table.ant-table-small .ant-table-footer,.ant-table.ant-table-small .ant-table-thead>tr>th,.ant-table.ant-table-small .ant-table-tbody>tr>td,.ant-table.ant-table-small tfoot>tr>th,.ant-table.ant-table-small tfoot>tr>td{padding:8px}.ant-table.ant-table-small .ant-table-filter-trigger{margin-right:-4px}.ant-table.ant-table-small .ant-table-expanded-row-fixed{margin:-8px}.ant-table.ant-table-small .ant-table-tbody .ant-table-wrapper:only-child .ant-table{margin:-8px -8px -8px 40px}.ant-table.ant-table-small .ant-table-selection-column{-webkit-padding-start:2px;padding-inline-start:2px}.ant-table.ant-table-bordered>.ant-table-title{border:1px solid #f0f0f0;border-bottom:0}.ant-table.ant-table-bordered>.ant-table-container{border-left:1px solid #f0f0f0}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>thead>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>thead>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>thead>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tbody>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tbody>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tbody>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tbody>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tfoot>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tfoot>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tfoot>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tfoot>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tfoot>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tfoot>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tfoot>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tfoot>tr>td{border-right:1px solid #f0f0f0}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr:not(:last-child)>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>thead>tr:not(:last-child)>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>thead>tr:not(:last-child)>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>thead>tr:not(:last-child)>th{border-bottom:1px solid #f0f0f0}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr>th:before,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>thead>tr>th:before,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>thead>tr>th:before,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>thead>tr>th:before{background-color:transparent!important}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>thead>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>thead>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>thead>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tbody>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tbody>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tbody>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tbody>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tfoot>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tfoot>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tfoot>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tfoot>tr>.ant-table-cell-fix-right-first:after{border-right:1px solid #f0f0f0}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tbody>tr>td>.ant-table-expanded-row-fixed,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tbody>tr>td>.ant-table-expanded-row-fixed,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tbody>tr>td>.ant-table-expanded-row-fixed,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tbody>tr>td>.ant-table-expanded-row-fixed{margin:-16px -17px}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tbody>tr>td>.ant-table-expanded-row-fixed:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tbody>tr>td>.ant-table-expanded-row-fixed:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tbody>tr>td>.ant-table-expanded-row-fixed:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tbody>tr>td>.ant-table-expanded-row-fixed:after{position:absolute;top:0;right:1px;bottom:0;border-right:1px solid #f0f0f0;content:""}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table{border-top:1px solid #f0f0f0}.ant-table.ant-table-bordered.ant-table-scroll-horizontal>.ant-table-container>.ant-table-body>table>tbody>tr.ant-table-expanded-row>td,.ant-table.ant-table-bordered.ant-table-scroll-horizontal>.ant-table-container>.ant-table-body>table>tbody>tr.ant-table-placeholder>td{border-right:0}.ant-table.ant-table-bordered.ant-table-middle>.ant-table-container>.ant-table-content>table>tbody>tr>td>.ant-table-expanded-row-fixed,.ant-table.ant-table-bordered.ant-table-middle>.ant-table-container>.ant-table-body>table>tbody>tr>td>.ant-table-expanded-row-fixed{margin:-12px -9px}.ant-table.ant-table-bordered.ant-table-small>.ant-table-container>.ant-table-content>table>tbody>tr>td>.ant-table-expanded-row-fixed,.ant-table.ant-table-bordered.ant-table-small>.ant-table-container>.ant-table-body>table>tbody>tr>td>.ant-table-expanded-row-fixed{margin:-8px -9px}.ant-table.ant-table-bordered>.ant-table-footer{border:1px solid #f0f0f0;border-top:0}.ant-table-cell .ant-table-container:first-child{border-top:0}.ant-table-cell-scrollbar:not([rowspan]){box-shadow:0 1px 0 1px #fafafa}.ant-table-wrapper{clear:both;max-width:100%}.ant-table-wrapper:before{display:table;content:""}.ant-table-wrapper:after{display:table;clear:both;content:""}.ant-table{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;font-size:14px;background:#fff;border-radius:2px}.ant-table table{width:100%;text-align:left;border-radius:2px 2px 0 0;border-collapse:separate;border-spacing:0}.ant-table-thead>tr>th,.ant-table-tbody>tr>td,.ant-table tfoot>tr>th,.ant-table tfoot>tr>td{position:relative;padding:16px;overflow-wrap:break-word}.ant-table-cell-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;word-break:keep-all}.ant-table-cell-ellipsis.ant-table-cell-fix-left-last,.ant-table-cell-ellipsis.ant-table-cell-fix-right-first{overflow:visible}.ant-table-cell-ellipsis.ant-table-cell-fix-left-last .ant-table-cell-content,.ant-table-cell-ellipsis.ant-table-cell-fix-right-first .ant-table-cell-content{display:block;overflow:hidden;text-overflow:ellipsis}.ant-table-cell-ellipsis .ant-table-column-title{overflow:hidden;text-overflow:ellipsis;word-break:keep-all}.ant-table-title{padding:16px}.ant-table-footer{padding:16px;color:#000000d9;background:#fafafa}.ant-table-thead>tr>th{position:relative;color:#000000d9;font-weight:500;text-align:left;background:#fafafa;border-bottom:1px solid #f0f0f0;transition:background .3s ease}.ant-table-thead>tr>th[colspan]:not([colspan="1"]){text-align:center}.ant-table-thead>tr>th:not(:last-child):not(.ant-table-selection-column):not(.ant-table-row-expand-icon-cell):not([colspan]):before{position:absolute;top:50%;right:0;width:1px;height:1.6em;background-color:#0000000f;transform:translateY(-50%);transition:background-color .3s;content:""}.ant-table-thead>tr:not(:last-child)>th[colspan]{border-bottom:0}.ant-table-tbody>tr>td{border-bottom:1px solid #f0f0f0;transition:background .3s}.ant-table-tbody>tr>td>.ant-table-wrapper:only-child .ant-table,.ant-table-tbody>tr>td>.ant-table-expanded-row-fixed>.ant-table-wrapper:only-child .ant-table{margin:-16px -16px -16px 32px}.ant-table-tbody>tr>td>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td,.ant-table-tbody>tr>td>.ant-table-expanded-row-fixed>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td{border-bottom:0}.ant-table-tbody>tr>td>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td:first-child,.ant-table-tbody>tr>td>.ant-table-expanded-row-fixed>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td:first-child,.ant-table-tbody>tr>td>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td:last-child,.ant-table-tbody>tr>td>.ant-table-expanded-row-fixed>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td:last-child{border-radius:0}.ant-table-tbody>tr.ant-table-row:hover>td,.ant-table-tbody>tr>td.ant-table-cell-row-hover{background:#fafafa}.ant-table-tbody>tr.ant-table-row-selected>td{background:#e6f7ff;border-color:#00000008}.ant-table-tbody>tr.ant-table-row-selected:hover>td{background:#dcf4ff}.ant-table-summary{position:relative;z-index:2;background:#fff}div.ant-table-summary{box-shadow:0 -1px #f0f0f0}.ant-table-summary>tr>th,.ant-table-summary>tr>td{border-bottom:1px solid #f0f0f0}.ant-table-pagination.ant-pagination{margin:16px 0}.ant-table-pagination{display:flex;flex-wrap:wrap;row-gap:8px}.ant-table-pagination>*{flex:none}.ant-table-pagination-left{justify-content:flex-start}.ant-table-pagination-center{justify-content:center}.ant-table-pagination-right{justify-content:flex-end}.ant-table-thead th.ant-table-column-has-sorters{outline:none;cursor:pointer;transition:all .3s}.ant-table-thead th.ant-table-column-has-sorters:hover{background:rgba(0,0,0,.04)}.ant-table-thead th.ant-table-column-has-sorters:hover:before{background-color:transparent!important}.ant-table-thead th.ant-table-column-has-sorters:focus-visible{color:#1890ff}.ant-table-thead th.ant-table-column-has-sorters.ant-table-cell-fix-left:hover,.ant-table-thead th.ant-table-column-has-sorters.ant-table-cell-fix-right:hover,.ant-table-thead th.ant-table-column-sort{background:#f5f5f5}.ant-table-thead th.ant-table-column-sort:before{background-color:transparent!important}td.ant-table-column-sort{background:#fafafa}.ant-table-column-title{position:relative;z-index:1;flex:1}.ant-table-column-sorters{display:flex;flex:auto;align-items:center;justify-content:space-between}.ant-table-column-sorters:after{position:absolute;inset:0;width:100%;height:100%;content:""}.ant-table-column-sorter{margin-left:4px;color:#bfbfbf;font-size:0;transition:color .3s}.ant-table-column-sorter-inner{display:inline-flex;flex-direction:column;align-items:center}.ant-table-column-sorter-up,.ant-table-column-sorter-down{font-size:11px}.ant-table-column-sorter-up.active,.ant-table-column-sorter-down.active{color:#1890ff}.ant-table-column-sorter-up+.ant-table-column-sorter-down{margin-top:-.3em}.ant-table-column-sorters:hover .ant-table-column-sorter{color:#a6a6a6}.ant-table-filter-column{display:flex;justify-content:space-between}.ant-table-filter-trigger{position:relative;display:flex;align-items:center;margin:-4px -8px -4px 4px;padding:0 4px;color:#bfbfbf;font-size:12px;border-radius:2px;cursor:pointer;transition:all .3s}.ant-table-filter-trigger:hover{color:#00000073;background:rgba(0,0,0,.04)}.ant-table-filter-trigger.active{color:#1890ff}.ant-table-filter-dropdown{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";min-width:120px;background-color:#fff;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d}.ant-table-filter-dropdown .ant-dropdown-menu{max-height:264px;overflow-x:hidden;border:0;box-shadow:none}.ant-table-filter-dropdown .ant-dropdown-menu:empty:after{display:block;padding:8px 0;color:#00000040;font-size:12px;text-align:center;content:"Not Found"}.ant-table-filter-dropdown-tree{padding:8px 8px 0}.ant-table-filter-dropdown-tree .ant-tree-treenode .ant-tree-node-content-wrapper:hover{background-color:#f5f5f5}.ant-table-filter-dropdown-tree .ant-tree-treenode-checkbox-checked .ant-tree-node-content-wrapper,.ant-table-filter-dropdown-tree .ant-tree-treenode-checkbox-checked .ant-tree-node-content-wrapper:hover{background-color:#bae7ff}.ant-table-filter-dropdown-search{padding:8px;border-bottom:1px #f0f0f0 solid}.ant-table-filter-dropdown-search-input input{min-width:140px}.ant-table-filter-dropdown-search-input .anticon{color:#00000040}.ant-table-filter-dropdown-checkall{width:100%;margin-bottom:4px;margin-left:4px}.ant-table-filter-dropdown-submenu>ul{max-height:calc(100vh - 130px);overflow-x:hidden;overflow-y:auto}.ant-table-filter-dropdown .ant-checkbox-wrapper+span,.ant-table-filter-dropdown-submenu .ant-checkbox-wrapper+span{padding-left:8px}.ant-table-filter-dropdown-btns{display:flex;justify-content:space-between;padding:7px 8px;overflow:hidden;background-color:inherit;border-top:1px solid #f0f0f0}.ant-table-selection-col{width:32px}.ant-table-bordered .ant-table-selection-col{width:50px}table tr th.ant-table-selection-column,table tr td.ant-table-selection-column{padding-right:8px;padding-left:8px;text-align:center}table tr th.ant-table-selection-column .ant-radio-wrapper,table tr td.ant-table-selection-column .ant-radio-wrapper{margin-right:0}table tr th.ant-table-selection-column.ant-table-cell-fix-left{z-index:3}table tr th.ant-table-selection-column:after{background-color:transparent!important}.ant-table-selection{position:relative;display:inline-flex;flex-direction:column}.ant-table-selection-extra{position:absolute;top:0;z-index:1;cursor:pointer;transition:all .3s;-webkit-margin-start:100%;margin-inline-start:100%;-webkit-padding-start:4px;padding-inline-start:4px}.ant-table-selection-extra .anticon{color:#bfbfbf;font-size:10px}.ant-table-selection-extra .anticon:hover{color:#a6a6a6}.ant-table-expand-icon-col{width:48px}.ant-table-row-expand-icon-cell{text-align:center}.ant-table-row-expand-icon-cell .ant-table-row-expand-icon{display:inline-flex;float:none;vertical-align:sub}.ant-table-row-indent{float:left;height:1px}.ant-table-row-expand-icon{color:#1890ff;outline:none;cursor:pointer;transition:color .3s;position:relative;float:left;box-sizing:border-box;width:17px;height:17px;padding:0;color:inherit;line-height:17px;background:#fff;border:1px solid #f0f0f0;border-radius:2px;transform:scale(.94117647);transition:all .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-table-row-expand-icon:focus-visible,.ant-table-row-expand-icon:hover{color:#40a9ff}.ant-table-row-expand-icon:active{color:#096dd9}.ant-table-row-expand-icon:focus,.ant-table-row-expand-icon:hover,.ant-table-row-expand-icon:active{border-color:currentcolor}.ant-table-row-expand-icon:before,.ant-table-row-expand-icon:after{position:absolute;background:currentcolor;transition:transform .3s ease-out;content:""}.ant-table-row-expand-icon:before{top:7px;right:3px;left:3px;height:1px}.ant-table-row-expand-icon:after{top:3px;bottom:3px;left:7px;width:1px;transform:rotate(90deg)}.ant-table-row-expand-icon-collapsed:before{transform:rotate(-180deg)}.ant-table-row-expand-icon-collapsed:after{transform:rotate(0)}.ant-table-row-expand-icon-spaced{background:transparent;border:0;visibility:hidden}.ant-table-row-expand-icon-spaced:before,.ant-table-row-expand-icon-spaced:after{display:none;content:none}.ant-table-row-indent+.ant-table-row-expand-icon{margin-top:2.5005px;margin-right:8px}tr.ant-table-expanded-row>td,tr.ant-table-expanded-row:hover>td{background:#fbfbfb}tr.ant-table-expanded-row .ant-descriptions-view{display:flex}tr.ant-table-expanded-row .ant-descriptions-view table{flex:auto;width:auto}.ant-table .ant-table-expanded-row-fixed{position:relative;margin:-16px;padding:16px}.ant-table-tbody>tr.ant-table-placeholder{text-align:center}.ant-table-empty .ant-table-tbody>tr.ant-table-placeholder{color:#00000040}.ant-table-tbody>tr.ant-table-placeholder:hover>td{background:#fff}.ant-table-cell-fix-left,.ant-table-cell-fix-right{position:sticky!important;z-index:2;background:#fff}.ant-table-cell-fix-left-first:after,.ant-table-cell-fix-left-last:after{position:absolute;top:0;right:0;bottom:-1px;width:30px;transform:translate(100%);transition:box-shadow .3s;content:"";pointer-events:none}.ant-table-cell-fix-left-all:after{display:none}.ant-table-cell-fix-right-first:after,.ant-table-cell-fix-right-last:after{position:absolute;top:0;bottom:-1px;left:0;width:30px;transform:translate(-100%);transition:box-shadow .3s;content:"";pointer-events:none}.ant-table .ant-table-container:before,.ant-table .ant-table-container:after{position:absolute;top:0;bottom:0;z-index:4;width:30px;transition:box-shadow .3s;content:"";pointer-events:none}.ant-table .ant-table-container:before{left:0}.ant-table .ant-table-container:after{right:0}.ant-table-ping-left:not(.ant-table-has-fix-left)>.ant-table-container{position:relative}.ant-table-ping-left:not(.ant-table-has-fix-left)>.ant-table-container:before{box-shadow:inset 10px 0 8px -8px #00000026}.ant-table-ping-left .ant-table-cell-fix-left-first:after,.ant-table-ping-left .ant-table-cell-fix-left-last:after{box-shadow:inset 10px 0 8px -8px #00000026}.ant-table-ping-left .ant-table-cell-fix-left-last:before{background-color:transparent!important}.ant-table-ping-right:not(.ant-table-has-fix-right)>.ant-table-container{position:relative}.ant-table-ping-right:not(.ant-table-has-fix-right)>.ant-table-container:after{box-shadow:inset -10px 0 8px -8px #00000026}.ant-table-ping-right .ant-table-cell-fix-right-first:after,.ant-table-ping-right .ant-table-cell-fix-right-last:after{box-shadow:inset -10px 0 8px -8px #00000026}.ant-table-sticky-holder{position:sticky;z-index:3;background:#fff}.ant-table-sticky-scroll{position:sticky;bottom:0;z-index:3;display:flex;align-items:center;background:#ffffff;border-top:1px solid #f0f0f0;opacity:.6}.ant-table-sticky-scroll:hover{transform-origin:center bottom}.ant-table-sticky-scroll-bar{height:8px;background-color:#00000059;border-radius:4px}.ant-table-sticky-scroll-bar:hover,.ant-table-sticky-scroll-bar-active{background-color:#000c}@media all and (-ms-high-contrast: none){.ant-table-ping-left .ant-table-cell-fix-left-last:after{box-shadow:none!important}.ant-table-ping-right .ant-table-cell-fix-right-first:after{box-shadow:none!important}}.ant-table-title{border-radius:2px 2px 0 0}.ant-table-title+.ant-table-container{border-top-left-radius:0;border-top-right-radius:0}.ant-table-title+.ant-table-container table{border-radius:0}.ant-table-title+.ant-table-container table>thead>tr:first-child th:first-child{border-radius:0}.ant-table-title+.ant-table-container table>thead>tr:first-child th:last-child{border-radius:0}.ant-table-container{border-top-left-radius:2px;border-top-right-radius:2px}.ant-table-container table>thead>tr:first-child th:first-child{border-top-left-radius:2px}.ant-table-container table>thead>tr:first-child th:last-child{border-top-right-radius:2px}.ant-table-footer{border-radius:0 0 2px 2px}.ant-table-wrapper-rtl,.ant-table-rtl{direction:rtl}.ant-table-wrapper-rtl .ant-table table{text-align:right}.ant-table-wrapper-rtl .ant-table-thead>tr>th[colspan]:not([colspan="1"]){text-align:center}.ant-table-wrapper-rtl .ant-table-thead>tr>th:not(:last-child):not(.ant-table-selection-column):not(.ant-table-row-expand-icon-cell):not([colspan]):before{right:auto;left:0}.ant-table-wrapper-rtl .ant-table-thead>tr>th{text-align:right}.ant-table-tbody>tr .ant-table-wrapper:only-child .ant-table.ant-table-rtl{margin:-16px 33px -16px -16px}.ant-table-wrapper.ant-table-wrapper-rtl .ant-table-pagination-left{justify-content:flex-end}.ant-table-wrapper.ant-table-wrapper-rtl .ant-table-pagination-right{justify-content:flex-start}.ant-table-wrapper-rtl .ant-table-column-sorter{margin-right:4px;margin-left:0}.ant-table-wrapper-rtl .ant-table-filter-column-title{padding:16px 16px 16px 2.3em}.ant-table-rtl .ant-table-thead tr th.ant-table-column-has-sorters .ant-table-filter-column-title{padding:0 0 0 2.3em}.ant-table-wrapper-rtl .ant-table-filter-trigger{margin:-4px 4px -4px -8px}.ant-dropdown-rtl .ant-table-filter-dropdown .ant-checkbox-wrapper+span,.ant-dropdown-rtl .ant-table-filter-dropdown-submenu .ant-checkbox-wrapper+span,.ant-dropdown-menu-submenu-rtl.ant-table-filter-dropdown .ant-checkbox-wrapper+span,.ant-dropdown-menu-submenu-rtl.ant-table-filter-dropdown-submenu .ant-checkbox-wrapper+span{padding-right:8px;padding-left:0}.ant-table-wrapper-rtl .ant-table-selection{text-align:center}.ant-table-wrapper-rtl .ant-table-row-indent,.ant-table-wrapper-rtl .ant-table-row-expand-icon{float:right}.ant-table-wrapper-rtl .ant-table-row-indent+.ant-table-row-expand-icon{margin-right:0;margin-left:8px}.ant-table-wrapper-rtl .ant-table-row-expand-icon:after{transform:rotate(-90deg)}.ant-table-wrapper-rtl .ant-table-row-expand-icon-collapsed:before{transform:rotate(180deg)}.ant-table-wrapper-rtl .ant-table-row-expand-icon-collapsed:after{transform:rotate(0)}.ant-tree.ant-tree-directory .ant-tree-treenode{position:relative}.ant-tree.ant-tree-directory .ant-tree-treenode:before{position:absolute;inset:0 0 4px;transition:background-color .3s;content:"";pointer-events:none}.ant-tree.ant-tree-directory .ant-tree-treenode:hover:before{background:#f5f5f5}.ant-tree.ant-tree-directory .ant-tree-treenode>*{z-index:1}.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-switcher{transition:color .3s}.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper{border-radius:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper:hover{background:transparent}.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper.ant-tree-node-selected{color:#fff;background:transparent}.ant-tree.ant-tree-directory .ant-tree-treenode-selected:hover:before,.ant-tree.ant-tree-directory .ant-tree-treenode-selected:before{background:#1890ff}.ant-tree.ant-tree-directory .ant-tree-treenode-selected .ant-tree-switcher{color:#fff}.ant-tree.ant-tree-directory .ant-tree-treenode-selected .ant-tree-node-content-wrapper{color:#fff;background:transparent}.ant-tree-checkbox{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;top:.2em;line-height:1;white-space:nowrap;outline:none;cursor:pointer}.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-inner,.ant-tree-checkbox:hover .ant-tree-checkbox-inner,.ant-tree-checkbox-input:focus+.ant-tree-checkbox-inner{border-color:#1890ff}.ant-tree-checkbox-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid #1890ff;border-radius:2px;visibility:hidden;animation:antCheckboxEffect .36s ease-in-out;animation-fill-mode:backwards;content:""}.ant-tree-checkbox:hover:after,.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox:after{visibility:visible}.ant-tree-checkbox-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;direction:ltr;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;border-collapse:separate;transition:all .3s}.ant-tree-checkbox-inner:after{position:absolute;top:50%;left:21.5%;display:table;width:5.71428571px;height:9.14285714px;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(0) translate(-50%,-50%);opacity:0;transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;content:" "}.ant-tree-checkbox-input{position:absolute;inset:0;z-index:1;width:100%;height:100%;cursor:pointer;opacity:0}.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after{position:absolute;display:table;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(1) translate(-50%,-50%);opacity:1;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;content:" "}.ant-tree-checkbox-checked .ant-tree-checkbox-inner{background-color:#1890ff;border-color:#1890ff}.ant-tree-checkbox-disabled{cursor:not-allowed}.ant-tree-checkbox-disabled.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after{border-color:#00000040;animation-name:none}.ant-tree-checkbox-disabled .ant-tree-checkbox-input{cursor:not-allowed;pointer-events:none}.ant-tree-checkbox-disabled .ant-tree-checkbox-inner{background-color:#f5f5f5;border-color:#d9d9d9!important}.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after{border-color:#f5f5f5;border-collapse:separate;animation-name:none}.ant-tree-checkbox-disabled+span{color:#00000040;cursor:not-allowed}.ant-tree-checkbox-disabled:hover:after,.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-disabled:after{visibility:hidden}.ant-tree-checkbox-wrapper{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-flex;align-items:baseline;line-height:unset;cursor:pointer}.ant-tree-checkbox-wrapper:after{display:inline-block;width:0;overflow:hidden;content:"\\a0"}.ant-tree-checkbox-wrapper.ant-tree-checkbox-wrapper-disabled{cursor:not-allowed}.ant-tree-checkbox-wrapper+.ant-tree-checkbox-wrapper{margin-left:8px}.ant-tree-checkbox-wrapper.ant-tree-checkbox-wrapper-in-form-item input[type=checkbox]{width:14px;height:14px}.ant-tree-checkbox+span{padding-right:8px;padding-left:8px}.ant-tree-checkbox-group{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-block}.ant-tree-checkbox-group-item{margin-right:8px}.ant-tree-checkbox-group-item:last-child{margin-right:0}.ant-tree-checkbox-group-item+.ant-tree-checkbox-group-item{margin-left:0}.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner{background-color:#fff;border-color:#d9d9d9}.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner:after{top:50%;left:50%;width:8px;height:8px;background-color:#1890ff;border:0;transform:translate(-50%,-50%) scale(1);opacity:1;content:" "}.ant-tree-checkbox-indeterminate.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after{background-color:#00000040;border-color:#00000040}.ant-tree{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";background:#fff;border-radius:2px;transition:background-color .3s}.ant-tree-focused:not(:hover):not(.ant-tree-active-focused){background:#e6f7ff}.ant-tree-list-holder-inner{align-items:flex-start}.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner{align-items:stretch}.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-node-content-wrapper{flex:auto}.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-treenode.dragging{position:relative}.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-treenode.dragging:after{position:absolute;inset:0 0 4px;border:1px solid #1890ff;opacity:0;animation:ant-tree-node-fx-do-not-use .3s;animation-play-state:running;animation-fill-mode:forwards;content:"";pointer-events:none}.ant-tree .ant-tree-treenode{display:flex;align-items:flex-start;padding:0 0 4px;outline:none}.ant-tree .ant-tree-treenode-disabled .ant-tree-node-content-wrapper{color:#00000040;cursor:not-allowed}.ant-tree .ant-tree-treenode-disabled .ant-tree-node-content-wrapper:hover{background:transparent}.ant-tree .ant-tree-treenode-active .ant-tree-node-content-wrapper{background:#f5f5f5}.ant-tree .ant-tree-treenode:not(.ant-tree .ant-tree-treenode-disabled).filter-node .ant-tree-title{color:inherit;font-weight:500}.ant-tree .ant-tree-treenode-draggable .ant-tree-draggable-icon{width:24px;line-height:24px;text-align:center;visibility:visible;opacity:.2;transition:opacity .3s}.ant-tree-treenode:hover .ant-tree .ant-tree-treenode-draggable .ant-tree-draggable-icon{opacity:.45}.ant-tree .ant-tree-treenode-draggable.ant-tree-treenode-disabled .ant-tree-draggable-icon{visibility:hidden}.ant-tree-indent{align-self:stretch;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-tree-indent-unit{display:inline-block;width:24px}.ant-tree-draggable-icon{visibility:hidden}.ant-tree-switcher{position:relative;flex:none;align-self:stretch;width:24px;margin:0;line-height:24px;text-align:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-tree-switcher .ant-tree-switcher-icon,.ant-tree-switcher .ant-select-tree-switcher-icon{display:inline-block;font-size:10px;vertical-align:baseline}.ant-tree-switcher .ant-tree-switcher-icon svg,.ant-tree-switcher .ant-select-tree-switcher-icon svg{transition:transform .3s}.ant-tree-switcher-noop{cursor:default}.ant-tree-switcher_close .ant-tree-switcher-icon svg{transform:rotate(-90deg)}.ant-tree-switcher-loading-icon{color:#1890ff}.ant-tree-switcher-leaf-line{position:relative;z-index:1;display:inline-block;width:100%;height:100%}.ant-tree-switcher-leaf-line:before{position:absolute;top:0;right:12px;bottom:-4px;margin-left:-1px;border-right:1px solid #d9d9d9;content:" "}.ant-tree-switcher-leaf-line:after{position:absolute;width:10px;height:14px;border-bottom:1px solid #d9d9d9;content:" "}.ant-tree-checkbox{top:initial;margin:4px 8px 0 0}.ant-tree .ant-tree-node-content-wrapper{position:relative;z-index:auto;min-height:24px;margin:0;padding:0 4px;color:inherit;line-height:24px;background:transparent;border-radius:2px;cursor:pointer;transition:all .3s,border 0s,line-height 0s,box-shadow 0s}.ant-tree .ant-tree-node-content-wrapper:hover{background-color:#f5f5f5}.ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected{background-color:#bae7ff}.ant-tree .ant-tree-node-content-wrapper .ant-tree-iconEle{display:inline-block;width:24px;height:24px;line-height:24px;text-align:center;vertical-align:top}.ant-tree .ant-tree-node-content-wrapper .ant-tree-iconEle:empty{display:none}.ant-tree-unselectable .ant-tree-node-content-wrapper:hover{background-color:transparent}.ant-tree-node-content-wrapper{line-height:24px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-tree-node-content-wrapper .ant-tree-drop-indicator{position:absolute;z-index:1;height:2px;background-color:#1890ff;border-radius:1px;pointer-events:none}.ant-tree-node-content-wrapper .ant-tree-drop-indicator:after{position:absolute;top:-3px;left:-6px;width:8px;height:8px;background-color:transparent;border:2px solid #1890ff;border-radius:50%;content:""}.ant-tree .ant-tree-treenode.drop-container>[draggable]{box-shadow:0 0 0 2px #1890ff}.ant-tree-show-line .ant-tree-indent-unit{position:relative;height:100%}.ant-tree-show-line .ant-tree-indent-unit:before{position:absolute;top:0;right:12px;bottom:-4px;border-right:1px solid #d9d9d9;content:""}.ant-tree-show-line .ant-tree-indent-unit-end:before{display:none}.ant-tree-show-line .ant-tree-switcher{background:#fff}.ant-tree-show-line .ant-tree-switcher-line-icon{vertical-align:-.15em}.ant-tree .ant-tree-treenode-leaf-last .ant-tree-switcher-leaf-line:before{top:auto!important;bottom:auto!important;height:14px!important}.ant-tree-rtl{direction:rtl}.ant-tree-rtl .ant-tree-node-content-wrapper[draggable=true] .ant-tree-drop-indicator:after{right:-6px;left:unset}.ant-tree .ant-tree-treenode-rtl{direction:rtl}.ant-tree-rtl .ant-tree-switcher_close .ant-tree-switcher-icon svg{transform:rotate(90deg)}.ant-tree-rtl.ant-tree-show-line .ant-tree-indent-unit:before{right:auto;left:-13px;border-right:none;border-left:1px solid #d9d9d9}.ant-tree-rtl .ant-tree-checkbox,.ant-tree-select-dropdown-rtl .ant-select-tree-checkbox{margin:4px 0 0 8px}.ant-timeline{box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;font-feature-settings:"tnum";margin:0;padding:0;list-style:none}.ant-timeline-item{position:relative;margin:0;padding-bottom:20px;font-size:14px;list-style:none}.ant-timeline-item-tail{position:absolute;top:10px;left:4px;height:calc(100% - 10px);border-left:2px solid #f0f0f0}.ant-timeline-item-pending .ant-timeline-item-head{font-size:12px;background-color:transparent}.ant-timeline-item-pending .ant-timeline-item-tail{display:none}.ant-timeline-item-head{position:absolute;width:10px;height:10px;background-color:#fff;border:2px solid transparent;border-radius:100px}.ant-timeline-item-head-blue{color:#1890ff;border-color:#1890ff}.ant-timeline-item-head-red{color:#ff4d4f;border-color:#ff4d4f}.ant-timeline-item-head-green{color:#52c41a;border-color:#52c41a}.ant-timeline-item-head-gray{color:#00000040;border-color:#00000040}.ant-timeline-item-head-custom{position:absolute;top:5.5px;left:5px;width:auto;height:auto;margin-top:0;padding:3px 1px;line-height:1;text-align:center;border:0;border-radius:0;transform:translate(-50%,-50%)}.ant-timeline-item-content{position:relative;top:-7.001px;margin:0 0 0 26px;word-break:break-word}.ant-timeline-item-last>.ant-timeline-item-tail{display:none}.ant-timeline-item-last>.ant-timeline-item-content{min-height:48px}.ant-timeline.ant-timeline-alternate .ant-timeline-item-tail,.ant-timeline.ant-timeline-right .ant-timeline-item-tail,.ant-timeline.ant-timeline-label .ant-timeline-item-tail,.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,.ant-timeline.ant-timeline-right .ant-timeline-item-head,.ant-timeline.ant-timeline-label .ant-timeline-item-head,.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom,.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom{left:50%}.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,.ant-timeline.ant-timeline-right .ant-timeline-item-head,.ant-timeline.ant-timeline-label .ant-timeline-item-head{margin-left:-4px}.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom,.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom{margin-left:1px}.ant-timeline.ant-timeline-alternate .ant-timeline-item-left .ant-timeline-item-content,.ant-timeline.ant-timeline-right .ant-timeline-item-left .ant-timeline-item-content,.ant-timeline.ant-timeline-label .ant-timeline-item-left .ant-timeline-item-content{left:calc(50% - 4px);width:calc(50% - 14px);text-align:left}.ant-timeline.ant-timeline-alternate .ant-timeline-item-right .ant-timeline-item-content,.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content,.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-content{width:calc(50% - 12px);margin:0;text-align:right}.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-tail,.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head,.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head-custom{left:calc(100% - 6px)}.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content{width:calc(100% - 18px)}.ant-timeline.ant-timeline-pending .ant-timeline-item-last .ant-timeline-item-tail{display:block;height:calc(100% - 14px);border-left:2px dotted #f0f0f0}.ant-timeline.ant-timeline-reverse .ant-timeline-item-last .ant-timeline-item-tail{display:none}.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-tail{top:15px;display:block;height:calc(100% - 15px);border-left:2px dotted #f0f0f0}.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-content{min-height:48px}.ant-timeline.ant-timeline-label .ant-timeline-item-label{position:absolute;top:-7.001px;width:calc(50% - 12px);text-align:right}.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-label{left:calc(50% + 14px);width:calc(50% - 14px);text-align:left}.ant-timeline-rtl{direction:rtl}.ant-timeline-rtl .ant-timeline-item-tail{right:4px;left:auto;border-right:2px solid #f0f0f0;border-left:none}.ant-timeline-rtl .ant-timeline-item-head-custom{right:5px;left:auto;transform:translate(50%,-50%)}.ant-timeline-rtl .ant-timeline-item-content{margin:0 18px 0 0}.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-tail,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-tail,.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-tail,.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head,.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head,.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom,.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom{right:50%;left:auto}.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head,.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head{margin-right:-4px;margin-left:0}.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom,.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom{margin-right:1px;margin-left:0}.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-left .ant-timeline-item-content,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-left .ant-timeline-item-content,.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-left .ant-timeline-item-content{right:calc(50% - 4px);left:auto;text-align:right}.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-right .ant-timeline-item-content,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content,.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-content{text-align:left}.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-tail,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head-custom{right:0;left:auto}.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content{width:100%;margin-right:18px;text-align:right}.ant-timeline-rtl.ant-timeline.ant-timeline-pending .ant-timeline-item-last .ant-timeline-item-tail,.ant-timeline-rtl.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-tail{border-right:2px dotted #f0f0f0;border-left:none}.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-label{text-align:left}.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-label{right:calc(50% + 14px);text-align:right}.ant-transfer-customize-list .ant-transfer-list{flex:1 1 50%;width:auto;height:auto;min-height:200px}.ant-transfer-customize-list .ant-table-wrapper .ant-table-small{border:0;border-radius:0}.ant-transfer-customize-list .ant-table-wrapper .ant-table-small .ant-table-selection-column{width:40px;min-width:40px}.ant-transfer-customize-list .ant-table-wrapper .ant-table-small>.ant-table-content>.ant-table-body>table>.ant-table-thead>tr>th{background:#fafafa}.ant-transfer-customize-list .ant-table-wrapper .ant-table-small>.ant-table-content .ant-table-row:last-child td{border-bottom:1px solid #f0f0f0}.ant-transfer-customize-list .ant-table-wrapper .ant-table-small .ant-table-body{margin:0}.ant-transfer-customize-list .ant-table-wrapper .ant-table-pagination.ant-pagination{margin:16px 0 4px}.ant-transfer-customize-list .ant-input[disabled]{background-color:transparent}.ant-transfer-status-error .ant-transfer-list{border-color:#ff4d4f}.ant-transfer-status-error .ant-transfer-list-search:not([disabled]){border-color:#d9d9d9}.ant-transfer-status-error .ant-transfer-list-search:not([disabled]):hover{border-color:#40a9ff;border-right-width:1px}.ant-transfer-status-error .ant-transfer-list-search:not([disabled]):focus{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-transfer-status-warning .ant-transfer-list{border-color:#faad14}.ant-transfer-status-warning .ant-transfer-list-search:not([disabled]){border-color:#d9d9d9}.ant-transfer-status-warning .ant-transfer-list-search:not([disabled]):hover{border-color:#40a9ff;border-right-width:1px}.ant-transfer-status-warning .ant-transfer-list-search:not([disabled]):focus{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-transfer{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;display:flex;align-items:stretch}.ant-transfer-disabled .ant-transfer-list{background:#f5f5f5}.ant-transfer-list{display:flex;flex-direction:column;width:180px;height:200px;border:1px solid #d9d9d9;border-radius:2px}.ant-transfer-list-with-pagination{width:250px;height:auto}.ant-transfer-list-search .anticon-search{color:#00000040}.ant-transfer-list-header{display:flex;flex:none;align-items:center;height:40px;padding:8px 12px 9px;color:#000000d9;background:#fff;border-bottom:1px solid #f0f0f0;border-radius:2px 2px 0 0}.ant-transfer-list-header>*:not(:last-child){margin-right:4px}.ant-transfer-list-header>*{flex:none}.ant-transfer-list-header-title{flex:auto;overflow:hidden;white-space:nowrap;text-align:right;text-overflow:ellipsis}.ant-transfer-list-header-dropdown{font-size:10px;transform:translateY(10%);cursor:pointer}.ant-transfer-list-header-dropdown[disabled]{cursor:not-allowed}.ant-transfer-list-body{display:flex;flex:auto;flex-direction:column;overflow:hidden;font-size:14px}.ant-transfer-list-body-search-wrapper{position:relative;flex:none;padding:12px}.ant-transfer-list-content{flex:auto;margin:0;padding:0;overflow:auto;list-style:none}.ant-transfer-list-content-item{display:flex;align-items:center;min-height:32px;padding:6px 12px;line-height:20px;transition:all .3s}.ant-transfer-list-content-item>*:not(:last-child){margin-right:8px}.ant-transfer-list-content-item>*{flex:none}.ant-transfer-list-content-item-text{flex:auto;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-transfer-list-content-item-remove{position:relative;color:#d9d9d9;cursor:pointer;transition:all .3s}.ant-transfer-list-content-item-remove:hover{color:#40a9ff}.ant-transfer-list-content-item-remove:after{position:absolute;inset:-6px -50%;content:""}.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover{background-color:#f5f5f5;cursor:pointer}.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled).ant-transfer-list-content-item-checked:hover{background-color:#dcf4ff}.ant-transfer-list-content-show-remove .ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover{background:transparent;cursor:default}.ant-transfer-list-content-item-checked{background-color:#e6f7ff}.ant-transfer-list-content-item-disabled{color:#00000040;cursor:not-allowed}.ant-transfer-list-pagination{padding:8px 0;text-align:right;border-top:1px solid #f0f0f0}.ant-transfer-list-body-not-found{flex:none;width:100%;margin:auto 0;color:#00000040;text-align:center}.ant-transfer-list-footer{border-top:1px solid #f0f0f0}.ant-transfer-operation{display:flex;flex:none;flex-direction:column;align-self:center;margin:0 8px;vertical-align:middle}.ant-transfer-operation .ant-btn{display:block}.ant-transfer-operation .ant-btn:first-child{margin-bottom:4px}.ant-transfer-operation .ant-btn .anticon{font-size:12px}.ant-transfer .ant-empty-image{max-height:-2px}.ant-transfer-rtl{direction:rtl}.ant-transfer-rtl .ant-transfer-list-search{padding-right:8px;padding-left:24px}.ant-transfer-rtl .ant-transfer-list-search-action{right:auto;left:12px}.ant-transfer-rtl .ant-transfer-list-header>*:not(:last-child){margin-right:0;margin-left:4px}.ant-transfer-rtl .ant-transfer-list-header{right:0;left:auto}.ant-transfer-rtl .ant-transfer-list-header-title{text-align:left}.ant-transfer-rtl .ant-transfer-list-content-item>*:not(:last-child){margin-right:0;margin-left:8px}.ant-transfer-rtl .ant-transfer-list-pagination{text-align:left}.ant-transfer-rtl .ant-transfer-list-footer{right:0;left:auto}@keyframes ant-tree-node-fx-do-not-use{0%{opacity:0}to{opacity:1}}@keyframes antCheckboxEffect{0%{transform:scale(1);opacity:.5}to{transform:scale(1.6);opacity:0}}.ant-select-tree-checkbox{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;top:.2em;line-height:1;white-space:nowrap;outline:none;cursor:pointer}.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-inner,.ant-select-tree-checkbox:hover .ant-select-tree-checkbox-inner,.ant-select-tree-checkbox-input:focus+.ant-select-tree-checkbox-inner{border-color:#1890ff}.ant-select-tree-checkbox-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid #1890ff;border-radius:2px;visibility:hidden;animation:antCheckboxEffect .36s ease-in-out;animation-fill-mode:backwards;content:""}.ant-select-tree-checkbox:hover:after,.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox:after{visibility:visible}.ant-select-tree-checkbox-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;direction:ltr;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;border-collapse:separate;transition:all .3s}.ant-select-tree-checkbox-inner:after{position:absolute;top:50%;left:21.5%;display:table;width:5.71428571px;height:9.14285714px;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(0) translate(-50%,-50%);opacity:0;transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;content:" "}.ant-select-tree-checkbox-input{position:absolute;inset:0;z-index:1;width:100%;height:100%;cursor:pointer;opacity:0}.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after{position:absolute;display:table;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(1) translate(-50%,-50%);opacity:1;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;content:" "}.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner{background-color:#1890ff;border-color:#1890ff}.ant-select-tree-checkbox-disabled{cursor:not-allowed}.ant-select-tree-checkbox-disabled.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after{border-color:#00000040;animation-name:none}.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-input{cursor:not-allowed;pointer-events:none}.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner{background-color:#f5f5f5;border-color:#d9d9d9!important}.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner:after{border-color:#f5f5f5;border-collapse:separate;animation-name:none}.ant-select-tree-checkbox-disabled+span{color:#00000040;cursor:not-allowed}.ant-select-tree-checkbox-disabled:hover:after,.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-disabled:after{visibility:hidden}.ant-select-tree-checkbox-wrapper{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-flex;align-items:baseline;line-height:unset;cursor:pointer}.ant-select-tree-checkbox-wrapper:after{display:inline-block;width:0;overflow:hidden;content:"\\a0"}.ant-select-tree-checkbox-wrapper.ant-select-tree-checkbox-wrapper-disabled{cursor:not-allowed}.ant-select-tree-checkbox-wrapper+.ant-select-tree-checkbox-wrapper{margin-left:8px}.ant-select-tree-checkbox-wrapper.ant-select-tree-checkbox-wrapper-in-form-item input[type=checkbox]{width:14px;height:14px}.ant-select-tree-checkbox+span{padding-right:8px;padding-left:8px}.ant-select-tree-checkbox-group{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-block}.ant-select-tree-checkbox-group-item{margin-right:8px}.ant-select-tree-checkbox-group-item:last-child{margin-right:0}.ant-select-tree-checkbox-group-item+.ant-select-tree-checkbox-group-item{margin-left:0}.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner{background-color:#fff;border-color:#d9d9d9}.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner:after{top:50%;left:50%;width:8px;height:8px;background-color:#1890ff;border:0;transform:translate(-50%,-50%) scale(1);opacity:1;content:" "}.ant-select-tree-checkbox-indeterminate.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner:after{background-color:#00000040;border-color:#00000040}.ant-tree-select-dropdown{padding:8px 4px}.ant-tree-select-dropdown-rtl{direction:rtl}.ant-tree-select-dropdown .ant-select-tree{border-radius:0}.ant-tree-select-dropdown .ant-select-tree-list-holder-inner{align-items:stretch}.ant-tree-select-dropdown .ant-select-tree-list-holder-inner .ant-select-tree-treenode .ant-select-tree-node-content-wrapper{flex:auto}.ant-select-tree{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";background:#fff;border-radius:2px;transition:background-color .3s}.ant-select-tree-focused:not(:hover):not(.ant-select-tree-active-focused){background:#e6f7ff}.ant-select-tree-list-holder-inner{align-items:flex-start}.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner{align-items:stretch}.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-node-content-wrapper{flex:auto}.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-treenode.dragging{position:relative}.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-treenode.dragging:after{position:absolute;inset:0 0 4px;border:1px solid #1890ff;opacity:0;animation:ant-tree-node-fx-do-not-use .3s;animation-play-state:running;animation-fill-mode:forwards;content:"";pointer-events:none}.ant-select-tree .ant-select-tree-treenode{display:flex;align-items:flex-start;padding:0 0 4px;outline:none}.ant-select-tree .ant-select-tree-treenode-disabled .ant-select-tree-node-content-wrapper{color:#00000040;cursor:not-allowed}.ant-select-tree .ant-select-tree-treenode-disabled .ant-select-tree-node-content-wrapper:hover{background:transparent}.ant-select-tree .ant-select-tree-treenode-active .ant-select-tree-node-content-wrapper{background:#f5f5f5}.ant-select-tree .ant-select-tree-treenode:not(.ant-select-tree .ant-select-tree-treenode-disabled).filter-node .ant-select-tree-title{color:inherit;font-weight:500}.ant-select-tree .ant-select-tree-treenode-draggable .ant-select-tree-draggable-icon{width:24px;line-height:24px;text-align:center;visibility:visible;opacity:.2;transition:opacity .3s}.ant-select-tree-treenode:hover .ant-select-tree .ant-select-tree-treenode-draggable .ant-select-tree-draggable-icon{opacity:.45}.ant-select-tree .ant-select-tree-treenode-draggable.ant-select-tree-treenode-disabled .ant-select-tree-draggable-icon{visibility:hidden}.ant-select-tree-indent{align-self:stretch;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-select-tree-indent-unit{display:inline-block;width:24px}.ant-select-tree-draggable-icon{visibility:hidden}.ant-select-tree-switcher{position:relative;flex:none;align-self:stretch;width:24px;margin:0;line-height:24px;text-align:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-select-tree-switcher .ant-tree-switcher-icon,.ant-select-tree-switcher .ant-select-tree-switcher-icon{display:inline-block;font-size:10px;vertical-align:baseline}.ant-select-tree-switcher .ant-tree-switcher-icon svg,.ant-select-tree-switcher .ant-select-tree-switcher-icon svg{transition:transform .3s}.ant-select-tree-switcher-noop{cursor:default}.ant-select-tree-switcher_close .ant-select-tree-switcher-icon svg{transform:rotate(-90deg)}.ant-select-tree-switcher-loading-icon{color:#1890ff}.ant-select-tree-switcher-leaf-line{position:relative;z-index:1;display:inline-block;width:100%;height:100%}.ant-select-tree-switcher-leaf-line:before{position:absolute;top:0;right:12px;bottom:-4px;margin-left:-1px;border-right:1px solid #d9d9d9;content:" "}.ant-select-tree-switcher-leaf-line:after{position:absolute;width:10px;height:14px;border-bottom:1px solid #d9d9d9;content:" "}.ant-select-tree-checkbox{top:initial;margin:4px 8px 0 0}.ant-select-tree .ant-select-tree-node-content-wrapper{position:relative;z-index:auto;min-height:24px;margin:0;padding:0 4px;color:inherit;line-height:24px;background:transparent;border-radius:2px;cursor:pointer;transition:all .3s,border 0s,line-height 0s,box-shadow 0s}.ant-select-tree .ant-select-tree-node-content-wrapper:hover{background-color:#f5f5f5}.ant-select-tree .ant-select-tree-node-content-wrapper.ant-select-tree-node-selected{background-color:#bae7ff}.ant-select-tree .ant-select-tree-node-content-wrapper .ant-select-tree-iconEle{display:inline-block;width:24px;height:24px;line-height:24px;text-align:center;vertical-align:top}.ant-select-tree .ant-select-tree-node-content-wrapper .ant-select-tree-iconEle:empty{display:none}.ant-select-tree-unselectable .ant-select-tree-node-content-wrapper:hover{background-color:transparent}.ant-select-tree-node-content-wrapper{line-height:24px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-select-tree-node-content-wrapper .ant-tree-drop-indicator{position:absolute;z-index:1;height:2px;background-color:#1890ff;border-radius:1px;pointer-events:none}.ant-select-tree-node-content-wrapper .ant-tree-drop-indicator:after{position:absolute;top:-3px;left:-6px;width:8px;height:8px;background-color:transparent;border:2px solid #1890ff;border-radius:50%;content:""}.ant-select-tree .ant-select-tree-treenode.drop-container>[draggable]{box-shadow:0 0 0 2px #1890ff}.ant-select-tree-show-line .ant-select-tree-indent-unit{position:relative;height:100%}.ant-select-tree-show-line .ant-select-tree-indent-unit:before{position:absolute;top:0;right:12px;bottom:-4px;border-right:1px solid #d9d9d9;content:""}.ant-select-tree-show-line .ant-select-tree-indent-unit-end:before{display:none}.ant-select-tree-show-line .ant-select-tree-switcher{background:#fff}.ant-select-tree-show-line .ant-select-tree-switcher-line-icon{vertical-align:-.15em}.ant-select-tree .ant-select-tree-treenode-leaf-last .ant-select-tree-switcher-leaf-line:before{top:auto!important;bottom:auto!important;height:14px!important}.ant-tree-select-dropdown-rtl .ant-select-tree .ant-select-tree-switcher_close .ant-select-tree-switcher-icon svg{transform:rotate(90deg)}.ant-tree-select-dropdown-rtl .ant-select-tree .ant-select-tree-switcher-loading-icon{transform:scaleY(-1)}.ant-typography{color:#000000d9;word-break:break-word}.ant-typography.ant-typography-secondary{color:#00000073}.ant-typography.ant-typography-success{color:#52c41a}.ant-typography.ant-typography-warning{color:#faad14}.ant-typography.ant-typography-danger{color:#ff4d4f}a.ant-typography.ant-typography-danger:active,a.ant-typography.ant-typography-danger:focus{color:#d9363e}a.ant-typography.ant-typography-danger:hover{color:#ff7875}.ant-typography.ant-typography-disabled{color:#00000040;cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.ant-typography,.ant-typography p{margin-bottom:1em}h1.ant-typography,div.ant-typography-h1,div.ant-typography-h1>textarea,.ant-typography h1{margin-bottom:.5em;color:#000000d9;font-weight:600;font-size:38px;line-height:1.23}h2.ant-typography,div.ant-typography-h2,div.ant-typography-h2>textarea,.ant-typography h2{margin-bottom:.5em;color:#000000d9;font-weight:600;font-size:30px;line-height:1.35}h3.ant-typography,div.ant-typography-h3,div.ant-typography-h3>textarea,.ant-typography h3{margin-bottom:.5em;color:#000000d9;font-weight:600;font-size:24px;line-height:1.35}h4.ant-typography,div.ant-typography-h4,div.ant-typography-h4>textarea,.ant-typography h4{margin-bottom:.5em;color:#000000d9;font-weight:600;font-size:20px;line-height:1.4}h5.ant-typography,div.ant-typography-h5,div.ant-typography-h5>textarea,.ant-typography h5{margin-bottom:.5em;color:#000000d9;font-weight:600;font-size:16px;line-height:1.5}.ant-typography+h1.ant-typography,.ant-typography+h2.ant-typography,.ant-typography+h3.ant-typography,.ant-typography+h4.ant-typography,.ant-typography+h5.ant-typography{margin-top:1.2em}.ant-typography div+h1,.ant-typography ul+h1,.ant-typography li+h1,.ant-typography p+h1,.ant-typography h1+h1,.ant-typography h2+h1,.ant-typography h3+h1,.ant-typography h4+h1,.ant-typography h5+h1,.ant-typography div+h2,.ant-typography ul+h2,.ant-typography li+h2,.ant-typography p+h2,.ant-typography h1+h2,.ant-typography h2+h2,.ant-typography h3+h2,.ant-typography h4+h2,.ant-typography h5+h2,.ant-typography div+h3,.ant-typography ul+h3,.ant-typography li+h3,.ant-typography p+h3,.ant-typography h1+h3,.ant-typography h2+h3,.ant-typography h3+h3,.ant-typography h4+h3,.ant-typography h5+h3,.ant-typography div+h4,.ant-typography ul+h4,.ant-typography li+h4,.ant-typography p+h4,.ant-typography h1+h4,.ant-typography h2+h4,.ant-typography h3+h4,.ant-typography h4+h4,.ant-typography h5+h4,.ant-typography div+h5,.ant-typography ul+h5,.ant-typography li+h5,.ant-typography p+h5,.ant-typography h1+h5,.ant-typography h2+h5,.ant-typography h3+h5,.ant-typography h4+h5,.ant-typography h5+h5{margin-top:1.2em}a.ant-typography-ellipsis,span.ant-typography-ellipsis{display:inline-block;max-width:100%}a.ant-typography,.ant-typography a{color:#1890ff;outline:none;cursor:pointer;transition:color .3s;text-decoration:none}a.ant-typography:focus-visible,.ant-typography a:focus-visible,a.ant-typography:hover,.ant-typography a:hover{color:#40a9ff}a.ant-typography:active,.ant-typography a:active{color:#096dd9}a.ant-typography:active,.ant-typography a:active,a.ant-typography:hover,.ant-typography a:hover{text-decoration:none}a.ant-typography[disabled],.ant-typography a[disabled],a.ant-typography.ant-typography-disabled,.ant-typography a.ant-typography-disabled{color:#00000040;cursor:not-allowed}a.ant-typography[disabled]:active,.ant-typography a[disabled]:active,a.ant-typography.ant-typography-disabled:active,.ant-typography a.ant-typography-disabled:active,a.ant-typography[disabled]:hover,.ant-typography a[disabled]:hover,a.ant-typography.ant-typography-disabled:hover,.ant-typography a.ant-typography-disabled:hover{color:#00000040}a.ant-typography[disabled]:active,.ant-typography a[disabled]:active,a.ant-typography.ant-typography-disabled:active,.ant-typography a.ant-typography-disabled:active{pointer-events:none}.ant-typography code{margin:0 .2em;padding:.2em .4em .1em;font-size:85%;background:rgba(150,150,150,.1);border:1px solid rgba(100,100,100,.2);border-radius:3px}.ant-typography kbd{margin:0 .2em;padding:.15em .4em .1em;font-size:90%;background:rgba(150,150,150,.06);border:1px solid rgba(100,100,100,.2);border-bottom-width:2px;border-radius:3px}.ant-typography mark{padding:0;background-color:#ffe58f}.ant-typography u,.ant-typography ins{text-decoration:underline;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto}.ant-typography s,.ant-typography del{text-decoration:line-through}.ant-typography strong{font-weight:600}.ant-typography-expand,.ant-typography-edit,.ant-typography-copy{color:#1890ff;outline:none;cursor:pointer;transition:color .3s;margin-left:4px}.ant-typography-expand:focus-visible,.ant-typography-edit:focus-visible,.ant-typography-copy:focus-visible,.ant-typography-expand:hover,.ant-typography-edit:hover,.ant-typography-copy:hover{color:#40a9ff}.ant-typography-expand:active,.ant-typography-edit:active,.ant-typography-copy:active{color:#096dd9}.ant-typography-copy-success,.ant-typography-copy-success:hover,.ant-typography-copy-success:focus{color:#52c41a}.ant-typography-edit-content{position:relative}div.ant-typography-edit-content{left:-12px;margin-top:-5px;margin-bottom:calc(1em - 5px)}.ant-typography-edit-content-confirm{position:absolute;right:10px;bottom:8px;color:#00000073;font-weight:400;font-size:14px;font-style:normal;pointer-events:none}.ant-typography-edit-content textarea{height:1em;margin:0!important;-moz-transition:none}.ant-typography ul,.ant-typography ol{margin:0 0 1em;padding:0}.ant-typography ul li,.ant-typography ol li{margin:0 0 0 20px;padding:0 0 0 4px}.ant-typography ul{list-style-type:circle}.ant-typography ul ul{list-style-type:disc}.ant-typography ol{list-style-type:decimal}.ant-typography pre,.ant-typography blockquote{margin:1em 0}.ant-typography pre{padding:.4em .6em;white-space:pre-wrap;word-wrap:break-word;background:rgba(150,150,150,.1);border:1px solid rgba(100,100,100,.2);border-radius:3px}.ant-typography pre code{display:inline;margin:0;padding:0;font-size:inherit;font-family:inherit;background:transparent;border:0}.ant-typography blockquote{padding:0 0 0 .6em;border-left:4px solid rgba(100,100,100,.2);opacity:.85}.ant-typography-single-line{white-space:nowrap}.ant-typography-ellipsis-single-line{overflow:hidden;text-overflow:ellipsis}a.ant-typography-ellipsis-single-line,span.ant-typography-ellipsis-single-line{vertical-align:bottom}.ant-typography-ellipsis-multiple-line{display:-webkit-box;overflow:hidden;-webkit-line-clamp:3;-webkit-box-orient:vertical}.ant-typography-rtl{direction:rtl}.ant-typography-rtl .ant-typography-expand,.ant-typography-rtl .ant-typography-edit,.ant-typography-rtl .ant-typography-copy{margin-right:4px;margin-left:0}.ant-typography-rtl .ant-typography-expand{float:left}div.ant-typography-edit-content.ant-typography-rtl{right:-12px;left:auto}.ant-typography-rtl .ant-typography-edit-content-confirm{right:auto;left:10px}.ant-typography-rtl.ant-typography ul li,.ant-typography-rtl.ant-typography ol li{margin:0 20px 0 0;padding:0 4px 0 0}.ant-upload{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";outline:0}.ant-upload p{margin:0}.ant-upload-btn{display:block;width:100%;outline:none}.ant-upload input[type=file]{cursor:pointer}.ant-upload.ant-upload-select{display:inline-block}.ant-upload.ant-upload-disabled{color:#00000040;cursor:not-allowed}.ant-upload.ant-upload-select-picture-card{width:104px;height:104px;margin-right:8px;margin-bottom:8px;text-align:center;vertical-align:top;background-color:#fafafa;border:1px dashed #d9d9d9;border-radius:2px;cursor:pointer;transition:border-color .3s}.ant-upload.ant-upload-select-picture-card>.ant-upload{display:flex;align-items:center;justify-content:center;height:100%;text-align:center}.ant-upload.ant-upload-select-picture-card:hover{border-color:#1890ff}.ant-upload-disabled.ant-upload.ant-upload-select-picture-card:hover{border-color:#d9d9d9}.ant-upload.ant-upload-drag{position:relative;width:100%;height:100%;text-align:center;background:#fafafa;border:1px dashed #d9d9d9;border-radius:2px;cursor:pointer;transition:border-color .3s}.ant-upload.ant-upload-drag .ant-upload{padding:16px 0}.ant-upload.ant-upload-drag.ant-upload-drag-hover:not(.ant-upload-disabled){border-color:#096dd9}.ant-upload.ant-upload-drag.ant-upload-disabled{cursor:not-allowed}.ant-upload.ant-upload-drag .ant-upload-btn{display:table;height:100%}.ant-upload.ant-upload-drag .ant-upload-drag-container{display:table-cell;vertical-align:middle}.ant-upload.ant-upload-drag:not(.ant-upload-disabled):hover{border-color:#40a9ff}.ant-upload.ant-upload-drag p.ant-upload-drag-icon{margin-bottom:20px}.ant-upload.ant-upload-drag p.ant-upload-drag-icon .anticon{color:#40a9ff;font-size:48px}.ant-upload.ant-upload-drag p.ant-upload-text{margin:0 0 4px;color:#000000d9;font-size:16px}.ant-upload.ant-upload-drag p.ant-upload-hint{color:#00000073;font-size:14px}.ant-upload.ant-upload-drag .anticon-plus{color:#00000040;font-size:30px;transition:all .3s}.ant-upload.ant-upload-drag .anticon-plus:hover,.ant-upload.ant-upload-drag:hover .anticon-plus{color:#00000073}.ant-upload-picture-card-wrapper{display:inline-block;width:100%}.ant-upload-picture-card-wrapper:before{display:table;content:""}.ant-upload-picture-card-wrapper:after{display:table;clear:both;content:""}.ant-upload-list{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;list-style:none;font-feature-settings:"tnum";line-height:1.5715}.ant-upload-list:before{display:table;content:""}.ant-upload-list:after{display:table;clear:both;content:""}.ant-upload-list-item{position:relative;height:22.001px;margin-top:8px;font-size:14px}.ant-upload-list-item-name{display:inline-block;width:100%;padding-left:22px;overflow:hidden;line-height:1.5715;white-space:nowrap;text-overflow:ellipsis}.ant-upload-list-item-card-actions{position:absolute;right:0}.ant-upload-list-item-card-actions-btn{opacity:0}.ant-upload-list-item-card-actions-btn.ant-btn-sm{height:22.001px;line-height:1;vertical-align:top}.ant-upload-list-item-card-actions.picture{top:22px;line-height:0}.ant-upload-list-item-card-actions-btn:focus,.ant-upload-list-item-card-actions.picture .ant-upload-list-item-card-actions-btn{opacity:1}.ant-upload-list-item-card-actions .anticon{color:#00000073;transition:all .3s}.ant-upload-list-item-card-actions:hover .anticon{color:#000000d9}.ant-upload-list-item-info{height:100%;transition:background-color .3s}.ant-upload-list-item-info>span{display:block;width:100%;height:100%}.ant-upload-list-item-info .anticon-loading .anticon,.ant-upload-list-item-info .ant-upload-text-icon .anticon{position:absolute;top:5px;color:#00000073;font-size:14px}.ant-upload-list-item:hover .ant-upload-list-item-info{background-color:#f5f5f5}.ant-upload-list-item:hover .ant-upload-list-item-card-actions-btn{opacity:1}.ant-upload-list-item-error,.ant-upload-list-item-error .ant-upload-text-icon>.anticon,.ant-upload-list-item-error .ant-upload-list-item-name{color:#ff4d4f}.ant-upload-list-item-error .ant-upload-list-item-card-actions .anticon{color:#ff4d4f}.ant-upload-list-item-error .ant-upload-list-item-card-actions-btn{opacity:1}.ant-upload-list-item-progress{position:absolute;bottom:-12px;width:100%;padding-left:26px;font-size:14px;line-height:0}.ant-upload-list-picture .ant-upload-list-item,.ant-upload-list-picture-card .ant-upload-list-item{position:relative;height:66px;padding:8px;border:1px solid #d9d9d9;border-radius:2px}.ant-upload-list-picture .ant-upload-list-item:hover,.ant-upload-list-picture-card .ant-upload-list-item:hover{background:transparent}.ant-upload-list-picture .ant-upload-list-item-error,.ant-upload-list-picture-card .ant-upload-list-item-error{border-color:#ff4d4f}.ant-upload-list-picture .ant-upload-list-item:hover .ant-upload-list-item-info,.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info{background:transparent}.ant-upload-list-picture .ant-upload-list-item-uploading,.ant-upload-list-picture-card .ant-upload-list-item-uploading{border-style:dashed}.ant-upload-list-picture .ant-upload-list-item-thumbnail,.ant-upload-list-picture-card .ant-upload-list-item-thumbnail{width:48px;height:48px;line-height:60px;text-align:center;opacity:.8}.ant-upload-list-picture .ant-upload-list-item-thumbnail .anticon,.ant-upload-list-picture-card .ant-upload-list-item-thumbnail .anticon{font-size:26px}.ant-upload-list-picture .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill="#e6f7ff"],.ant-upload-list-picture-card .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill="#e6f7ff"]{fill:#fff2f0}.ant-upload-list-picture .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill="#1890ff"],.ant-upload-list-picture-card .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill="#1890ff"]{fill:#ff4d4f}.ant-upload-list-picture .ant-upload-list-item-icon,.ant-upload-list-picture-card .ant-upload-list-item-icon{position:absolute;top:50%;left:50%;font-size:26px;transform:translate(-50%,-50%)}.ant-upload-list-picture .ant-upload-list-item-icon .anticon,.ant-upload-list-picture-card .ant-upload-list-item-icon .anticon{font-size:26px}.ant-upload-list-picture .ant-upload-list-item-image,.ant-upload-list-picture-card .ant-upload-list-item-image{max-width:100%}.ant-upload-list-picture .ant-upload-list-item-thumbnail img,.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img{display:block;width:48px;height:48px;overflow:hidden}.ant-upload-list-picture .ant-upload-list-item-name,.ant-upload-list-picture-card .ant-upload-list-item-name{display:inline-block;box-sizing:border-box;max-width:100%;margin:0 0 0 8px;padding-right:8px;padding-left:48px;overflow:hidden;line-height:44px;white-space:nowrap;text-overflow:ellipsis;transition:all .3s}.ant-upload-list-picture .ant-upload-list-item-uploading .ant-upload-list-item-name,.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-name{margin-bottom:12px}.ant-upload-list-picture .ant-upload-list-item-progress,.ant-upload-list-picture-card .ant-upload-list-item-progress{bottom:14px;width:calc(100% - 24px);margin-top:0;padding-left:56px}.ant-upload-list-picture-card-container{display:inline-block;width:104px;height:104px;margin:0 8px 8px 0;vertical-align:top}.ant-upload-list-picture-card .ant-upload-list-item{height:100%;margin:0}.ant-upload-list-picture-card .ant-upload-list-item-info{position:relative;height:100%;overflow:hidden}.ant-upload-list-picture-card .ant-upload-list-item-info:before{position:absolute;z-index:1;width:100%;height:100%;background-color:#00000080;opacity:0;transition:all .3s;content:" "}.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info:before{opacity:1}.ant-upload-list-picture-card .ant-upload-list-item-actions{position:absolute;top:50%;left:50%;z-index:10;white-space:nowrap;transform:translate(-50%,-50%);opacity:0;transition:all .3s}.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye,.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-download,.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete{z-index:10;width:16px;margin:0 4px;color:#ffffffd9;font-size:16px;cursor:pointer;transition:all .3s}.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye:hover,.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-download:hover,.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete:hover{color:#fff}.ant-upload-list-picture-card .ant-upload-list-item-info:hover+.ant-upload-list-item-actions,.ant-upload-list-picture-card .ant-upload-list-item-actions:hover{opacity:1}.ant-upload-list-picture-card .ant-upload-list-item-thumbnail,.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img{position:static;display:block;width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.ant-upload-list-picture-card .ant-upload-list-item-name{display:none;margin:8px 0 0;padding:0;line-height:1.5715;text-align:center}.ant-upload-list-picture-card .ant-upload-list-item-file+.ant-upload-list-item-name{position:absolute;bottom:10px;display:block}.ant-upload-list-picture-card .ant-upload-list-item-uploading.ant-upload-list-item{background-color:#fafafa}.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info{height:auto}.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info:before,.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info .anticon-eye,.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info .anticon-delete{display:none}.ant-upload-list-picture-card .ant-upload-list-item-progress{bottom:32px;width:calc(100% - 14px);padding-left:0}.ant-upload-list-text-container,.ant-upload-list-picture-container{transition:opacity .3s,height .3s}.ant-upload-list-text-container:before,.ant-upload-list-picture-container:before{display:table;width:0;height:0;content:""}.ant-upload-list-text-container .ant-upload-span,.ant-upload-list-picture-container .ant-upload-span{display:block;flex:auto}.ant-upload-list-text .ant-upload-span,.ant-upload-list-picture .ant-upload-span{display:flex;align-items:center}.ant-upload-list-text .ant-upload-span>*,.ant-upload-list-picture .ant-upload-span>*{flex:none}.ant-upload-list-text .ant-upload-list-item-name,.ant-upload-list-picture .ant-upload-list-item-name{flex:auto;margin:0;padding:0 8px}.ant-upload-list-text .ant-upload-list-item-card-actions,.ant-upload-list-picture .ant-upload-list-item-card-actions,.ant-upload-list-text .ant-upload-text-icon .anticon{position:static}.ant-upload-list .ant-upload-animate-inline-appear,.ant-upload-list .ant-upload-animate-inline-enter,.ant-upload-list .ant-upload-animate-inline-leave{animation-duration:.3s;animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-fill-mode:forwards}.ant-upload-list .ant-upload-animate-inline-appear,.ant-upload-list .ant-upload-animate-inline-enter{animation-name:uploadAnimateInlineIn}.ant-upload-list .ant-upload-animate-inline-leave{animation-name:uploadAnimateInlineOut}@keyframes uploadAnimateInlineIn{0%{width:0;height:0;margin:0;padding:0;opacity:0}}@keyframes uploadAnimateInlineOut{to{width:0;height:0;margin:0;padding:0;opacity:0}}.ant-upload-rtl{direction:rtl}.ant-upload-rtl.ant-upload.ant-upload-select-picture-card{margin-right:auto;margin-left:8px}.ant-upload-list-rtl{direction:rtl}.ant-upload-list-rtl .ant-upload-list-item-list-type-text:hover .ant-upload-list-item-name-icon-count-1{padding-right:22px;padding-left:14px}.ant-upload-list-rtl .ant-upload-list-item-list-type-text:hover .ant-upload-list-item-name-icon-count-2{padding-right:22px;padding-left:28px}.ant-upload-list-rtl .ant-upload-list-item-name{padding-right:22px;padding-left:0}.ant-upload-list-rtl .ant-upload-list-item-name-icon-count-1{padding-left:14px}.ant-upload-list-rtl .ant-upload-list-item-card-actions{right:auto;left:0}.ant-upload-list-rtl .ant-upload-list-item-card-actions .anticon{padding-right:0;padding-left:5px}.ant-upload-list-rtl .ant-upload-list-item-info{padding:0 4px 0 12px}.ant-upload-list-rtl .ant-upload-list-item-error .ant-upload-list-item-card-actions .anticon{padding-right:0;padding-left:5px}.ant-upload-list-rtl .ant-upload-list-item-progress{padding-right:26px;padding-left:0}.ant-upload-list-picture .ant-upload-list-item-info,.ant-upload-list-picture-card .ant-upload-list-item-info{padding:0}.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-thumbnail,.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-thumbnail{right:8px;left:auto}.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-icon,.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-icon{right:50%;left:auto;transform:translate(50%,-50%)}.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-name,.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-name{margin:0 8px 0 0;padding-right:48px;padding-left:8px}.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-name-icon-count-1,.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-name-icon-count-1{padding-right:48px;padding-left:18px}.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-name-icon-count-2,.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-name-icon-count-2{padding-right:48px;padding-left:36px}.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-progress,.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-progress{padding-right:0;padding-left:0}.ant-upload-list-rtl .ant-upload-list-picture-card-container{margin:0 0 8px 8px}.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-actions{right:50%;left:auto;transform:translate(50%,-50%)}.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-file+.ant-upload-list-item-name{margin:8px 0 0;padding:0}.imgGray{filter:grayscale(100%)!important}.imgOrigin{filter:grayscale(0)!important}.upList{position:fixed;top:80px;left:5px;width:200px;z-index:999;opacity:.8}');
(function(React$a, ReactDOM2) {
"use strict";
const _interopDefaultLegacy = (e2) => e2 && typeof e2 === "object" && "default" in e2 ? e2 : { default: e2 };
function _interopNamespace(e2) {
if (e2 && e2.__esModule)
return e2;
const n2 = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
if (e2) {
for (const k2 in e2) {
if (k2 !== "default") {
const d2 = Object.getOwnPropertyDescriptor(e2, k2);
Object.defineProperty(n2, k2, d2.get ? d2 : {
enumerable: true,
get: () => e2[k2]
});
}
}
}
n2.default = e2;
return Object.freeze(n2);
}
const React__default = /* @__PURE__ */ _interopDefaultLegacy(React$a);
const React__namespace = /* @__PURE__ */ _interopNamespace(React$a);
const ReactDOM__default = /* @__PURE__ */ _interopDefaultLegacy(ReactDOM2);
const ReactDOM__namespace = /* @__PURE__ */ _interopNamespace(ReactDOM2);
var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
function getDefaultExportFromCjs(x2) {
return x2 && x2.__esModule && Object.prototype.hasOwnProperty.call(x2, "default") ? x2["default"] : x2;
}
function getAugmentedNamespace(n2) {
var f2 = n2.default;
if (typeof f2 == "function") {
var a = function() {
return f2.apply(this, arguments);
};
a.prototype = f2.prototype;
} else
a = {};
Object.defineProperty(a, "__esModule", { value: true });
Object.keys(n2).forEach(function(k2) {
var d2 = Object.getOwnPropertyDescriptor(n2, k2);
Object.defineProperty(a, k2, d2.get ? d2 : {
enumerable: true,
get: function() {
return n2[k2];
}
});
});
return a;
}
var client = {};
var m$3 = ReactDOM__default.default;
{
client.createRoot = m$3.createRoot;
client.hydrateRoot = m$3.hydrateRoot;
}
function _extends$3() {
_extends$3 = Object.assign ? Object.assign.bind() : function(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = arguments[i2];
for (var key2 in source) {
if (Object.prototype.hasOwnProperty.call(source, key2)) {
target[key2] = source[key2];
}
}
}
return target;
};
return _extends$3.apply(this, arguments);
}
function _typeof$q(obj) {
"@babel/helpers - typeof";
return _typeof$q = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$q(obj);
}
function _toPrimitive$8(input, hint) {
if (_typeof$q(input) !== "object" || input === null)
return input;
var prim = input[Symbol.toPrimitive];
if (prim !== void 0) {
var res = prim.call(input, hint || "default");
if (_typeof$q(res) !== "object")
return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
function _toPropertyKey$7(arg) {
var key2 = _toPrimitive$8(arg, "string");
return _typeof$q(key2) === "symbol" ? key2 : String(key2);
}
function _defineProperty$b(obj, key2, value) {
key2 = _toPropertyKey$7(key2);
if (key2 in obj) {
Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key2] = value;
}
return obj;
}
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _defineProperties(target, props) {
for (var i2 = 0; i2 < props.length; i2++) {
var descriptor2 = props[i2];
descriptor2.enumerable = descriptor2.enumerable || false;
descriptor2.configurable = true;
if ("value" in descriptor2)
descriptor2.writable = true;
Object.defineProperty(target, _toPropertyKey$7(descriptor2.key), descriptor2);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps)
_defineProperties(Constructor.prototype, protoProps);
if (staticProps)
_defineProperties(Constructor, staticProps);
Object.defineProperty(Constructor, "prototype", {
writable: false
});
return Constructor;
}
function _setPrototypeOf$2(o, p2) {
_setPrototypeOf$2 = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf3(o2, p3) {
o2.__proto__ = p3;
return o2;
};
return _setPrototypeOf$2(o, p2);
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function");
}
subClass.prototype = Object.create(superClass && superClass.prototype, {
constructor: {
value: subClass,
writable: true,
configurable: true
}
});
Object.defineProperty(subClass, "prototype", {
writable: false
});
if (superClass)
_setPrototypeOf$2(subClass, superClass);
}
function _getPrototypeOf$1(o) {
_getPrototypeOf$1 = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf2(o2) {
return o2.__proto__ || Object.getPrototypeOf(o2);
};
return _getPrototypeOf$1(o);
}
function _isNativeReflectConstruct$1() {
if (typeof Reflect === "undefined" || !Reflect.construct)
return false;
if (Reflect.construct.sham)
return false;
if (typeof Proxy === "function")
return true;
try {
Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {
}));
return true;
} catch (e2) {
return false;
}
}
function _assertThisInitialized(self2) {
if (self2 === void 0) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return self2;
}
function _possibleConstructorReturn(self2, call2) {
if (call2 && (_typeof$q(call2) === "object" || typeof call2 === "function")) {
return call2;
} else if (call2 !== void 0) {
throw new TypeError("Derived constructors may only return object or undefined");
}
return _assertThisInitialized(self2);
}
function _createSuper(Derived) {
var hasNativeReflectConstruct = _isNativeReflectConstruct$1();
return function _createSuperInternal() {
var Super = _getPrototypeOf$1(Derived), result;
if (hasNativeReflectConstruct) {
var NewTarget = _getPrototypeOf$1(this).constructor;
result = Reflect.construct(Super, arguments, NewTarget);
} else {
result = Super.apply(this, arguments);
}
return _possibleConstructorReturn(this, result);
};
}
var classnames$1 = { exports: {} };
/*!
Copyright (c) 2018 Jed Watson.
Licensed under the MIT License (MIT), see
http://jedwatson.github.io/classnames
*/
(function(module2) {
(function() {
var hasOwn = {}.hasOwnProperty;
function classNames() {
var classes = [];
for (var i2 = 0; i2 < arguments.length; i2++) {
var arg = arguments[i2];
if (!arg)
continue;
var argType = typeof arg;
if (argType === "string" || argType === "number") {
classes.push(arg);
} else if (Array.isArray(arg)) {
if (arg.length) {
var inner = classNames.apply(null, arg);
if (inner) {
classes.push(inner);
}
}
} else if (argType === "object") {
if (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes("[native code]")) {
classes.push(arg.toString());
continue;
}
for (var key2 in arg) {
if (hasOwn.call(arg, key2) && arg[key2]) {
classes.push(key2);
}
}
}
}
return classes.join(" ");
}
if (module2.exports) {
classNames.default = classNames;
module2.exports = classNames;
} else {
window.classNames = classNames;
}
})();
})(classnames$1);
const classnames = classnames$1.exports;
var reactIs = { exports: {} };
var reactIs_production_min = {};
/** @license React v16.13.1
* react-is.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var b = "function" === typeof Symbol && Symbol.for, c = b ? Symbol.for("react.element") : 60103, d = b ? Symbol.for("react.portal") : 60106, e$2 = b ? Symbol.for("react.fragment") : 60107, f$1 = b ? Symbol.for("react.strict_mode") : 60108, g = b ? Symbol.for("react.profiler") : 60114, h$2 = b ? Symbol.for("react.provider") : 60109, k$3 = b ? Symbol.for("react.context") : 60110, l$2 = b ? Symbol.for("react.async_mode") : 60111, m$2 = b ? Symbol.for("react.concurrent_mode") : 60111, n$4 = b ? Symbol.for("react.forward_ref") : 60112, p$3 = b ? Symbol.for("react.suspense") : 60113, q$3 = b ? Symbol.for("react.suspense_list") : 60120, r$3 = b ? Symbol.for("react.memo") : 60115, t$3 = b ? Symbol.for("react.lazy") : 60116, v$1 = b ? Symbol.for("react.block") : 60121, w$1 = b ? Symbol.for("react.fundamental") : 60117, x = b ? Symbol.for("react.responder") : 60118, y = b ? Symbol.for("react.scope") : 60119;
function z(a) {
if ("object" === typeof a && null !== a) {
var u2 = a.$$typeof;
switch (u2) {
case c:
switch (a = a.type, a) {
case l$2:
case m$2:
case e$2:
case g:
case f$1:
case p$3:
return a;
default:
switch (a = a && a.$$typeof, a) {
case k$3:
case n$4:
case t$3:
case r$3:
case h$2:
return a;
default:
return u2;
}
}
case d:
return u2;
}
}
}
function A(a) {
return z(a) === m$2;
}
reactIs_production_min.AsyncMode = l$2;
reactIs_production_min.ConcurrentMode = m$2;
reactIs_production_min.ContextConsumer = k$3;
reactIs_production_min.ContextProvider = h$2;
reactIs_production_min.Element = c;
reactIs_production_min.ForwardRef = n$4;
reactIs_production_min.Fragment = e$2;
reactIs_production_min.Lazy = t$3;
reactIs_production_min.Memo = r$3;
reactIs_production_min.Portal = d;
reactIs_production_min.Profiler = g;
reactIs_production_min.StrictMode = f$1;
reactIs_production_min.Suspense = p$3;
reactIs_production_min.isAsyncMode = function(a) {
return A(a) || z(a) === l$2;
};
reactIs_production_min.isConcurrentMode = A;
reactIs_production_min.isContextConsumer = function(a) {
return z(a) === k$3;
};
reactIs_production_min.isContextProvider = function(a) {
return z(a) === h$2;
};
reactIs_production_min.isElement = function(a) {
return "object" === typeof a && null !== a && a.$$typeof === c;
};
reactIs_production_min.isForwardRef = function(a) {
return z(a) === n$4;
};
reactIs_production_min.isFragment = function(a) {
return z(a) === e$2;
};
reactIs_production_min.isLazy = function(a) {
return z(a) === t$3;
};
reactIs_production_min.isMemo = function(a) {
return z(a) === r$3;
};
reactIs_production_min.isPortal = function(a) {
return z(a) === d;
};
reactIs_production_min.isProfiler = function(a) {
return z(a) === g;
};
reactIs_production_min.isStrictMode = function(a) {
return z(a) === f$1;
};
reactIs_production_min.isSuspense = function(a) {
return z(a) === p$3;
};
reactIs_production_min.isValidElementType = function(a) {
return "string" === typeof a || "function" === typeof a || a === e$2 || a === m$2 || a === g || a === f$1 || a === p$3 || a === q$3 || "object" === typeof a && null !== a && (a.$$typeof === t$3 || a.$$typeof === r$3 || a.$$typeof === h$2 || a.$$typeof === k$3 || a.$$typeof === n$4 || a.$$typeof === w$1 || a.$$typeof === x || a.$$typeof === y || a.$$typeof === v$1);
};
reactIs_production_min.typeOf = z;
(function(module2) {
{
module2.exports = reactIs_production_min;
}
})(reactIs);
function toArray$9(children) {
var option = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var ret = [];
React__default.default.Children.forEach(children, function(child) {
if ((child === void 0 || child === null) && !option.keepEmpty) {
return;
}
if (Array.isArray(child)) {
ret = ret.concat(toArray$9(child));
} else if (reactIs.exports.isFragment(child) && child.props) {
ret = ret.concat(toArray$9(child.props.children, option));
} else {
ret.push(child);
}
});
return ret;
}
var warned = {};
var preMessage = function preMessage2(fn) {
};
function warning$3(valid, message) {
}
function note(valid, message) {
}
function resetWarned() {
warned = {};
}
function call(method2, valid, message) {
if (!valid && !warned[message]) {
method2(false, message);
warned[message] = true;
}
}
function warningOnce(valid, message) {
call(warning$3, valid, message);
}
function noteOnce(valid, message) {
call(note, valid, message);
}
warningOnce.preMessage = preMessage;
warningOnce.resetWarned = resetWarned;
warningOnce.noteOnce = noteOnce;
function ownKeys$3(object2, enumerableOnly) {
var keys2 = Object.keys(object2);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object2);
enumerableOnly && (symbols = symbols.filter(function(sym) {
return Object.getOwnPropertyDescriptor(object2, sym).enumerable;
})), keys2.push.apply(keys2, symbols);
}
return keys2;
}
function _objectSpread2$a(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = null != arguments[i2] ? arguments[i2] : {};
i2 % 2 ? ownKeys$3(Object(source), true).forEach(function(key2) {
_defineProperty$b(target, key2, source[key2]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$3(Object(source)).forEach(function(key2) {
Object.defineProperty(target, key2, Object.getOwnPropertyDescriptor(source, key2));
});
}
return target;
}
function useMemo(getValue2, condition, shouldUpdate) {
var cacheRef = React__namespace.useRef({});
if (!("value" in cacheRef.current) || shouldUpdate(cacheRef.current.condition, condition)) {
cacheRef.current.value = getValue2();
cacheRef.current.condition = condition;
}
return cacheRef.current.value;
}
function fillRef(ref, node) {
if (typeof ref === "function") {
ref(node);
} else if (_typeof$q(ref) === "object" && ref && "current" in ref) {
ref.current = node;
}
}
function composeRef() {
for (var _len = arguments.length, refs = new Array(_len), _key = 0; _key < _len; _key++) {
refs[_key] = arguments[_key];
}
var refList = refs.filter(function(ref) {
return ref;
});
if (refList.length <= 1) {
return refList[0];
}
return function(node) {
refs.forEach(function(ref) {
fillRef(ref, node);
});
};
}
function useComposeRef() {
for (var _len2 = arguments.length, refs = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
refs[_key2] = arguments[_key2];
}
return useMemo(function() {
return composeRef.apply(void 0, refs);
}, refs, function(prev, next) {
return prev.length === next.length && prev.every(function(ref, i2) {
return ref === next[i2];
});
});
}
function supportRef(nodeOrComponent) {
var _type$prototype, _nodeOrComponent$prot;
var type2 = reactIs.exports.isMemo(nodeOrComponent) ? nodeOrComponent.type.type : nodeOrComponent.type;
if (typeof type2 === "function" && !((_type$prototype = type2.prototype) !== null && _type$prototype !== void 0 && _type$prototype.render)) {
return false;
}
if (typeof nodeOrComponent === "function" && !((_nodeOrComponent$prot = nodeOrComponent.prototype) !== null && _nodeOrComponent$prot !== void 0 && _nodeOrComponent$prot.render)) {
return false;
}
return true;
}
function isDOM(node) {
return node instanceof HTMLElement || node instanceof SVGElement;
}
function findDOMNode(node) {
if (isDOM(node)) {
return node;
}
if (node instanceof React__default.default.Component) {
return ReactDOM__default.default.findDOMNode(node);
}
return null;
}
var MapShim = function() {
if (typeof Map !== "undefined") {
return Map;
}
function getIndex2(arr, key2) {
var result = -1;
arr.some(function(entry, index2) {
if (entry[0] === key2) {
result = index2;
return true;
}
return false;
});
return result;
}
return function() {
function class_1() {
this.__entries__ = [];
}
Object.defineProperty(class_1.prototype, "size", {
get: function() {
return this.__entries__.length;
},
enumerable: true,
configurable: true
});
class_1.prototype.get = function(key2) {
var index2 = getIndex2(this.__entries__, key2);
var entry = this.__entries__[index2];
return entry && entry[1];
};
class_1.prototype.set = function(key2, value) {
var index2 = getIndex2(this.__entries__, key2);
if (~index2) {
this.__entries__[index2][1] = value;
} else {
this.__entries__.push([key2, value]);
}
};
class_1.prototype.delete = function(key2) {
var entries = this.__entries__;
var index2 = getIndex2(entries, key2);
if (~index2) {
entries.splice(index2, 1);
}
};
class_1.prototype.has = function(key2) {
return !!~getIndex2(this.__entries__, key2);
};
class_1.prototype.clear = function() {
this.__entries__.splice(0);
};
class_1.prototype.forEach = function(callback, ctx2) {
if (ctx2 === void 0) {
ctx2 = null;
}
for (var _i = 0, _a = this.__entries__; _i < _a.length; _i++) {
var entry = _a[_i];
callback.call(ctx2, entry[1], entry[0]);
}
};
return class_1;
}();
}();
var isBrowser = typeof window !== "undefined" && typeof document !== "undefined" && window.document === document;
var global$1$1 = function() {
if (typeof global !== "undefined" && global.Math === Math) {
return global;
}
if (typeof self !== "undefined" && self.Math === Math) {
return self;
}
if (typeof window !== "undefined" && window.Math === Math) {
return window;
}
return Function("return this")();
}();
var requestAnimationFrame$1 = function() {
if (typeof requestAnimationFrame === "function") {
return requestAnimationFrame.bind(global$1$1);
}
return function(callback) {
return setTimeout(function() {
return callback(Date.now());
}, 1e3 / 60);
};
}();
var trailingTimeout = 2;
function throttle(callback, delay) {
var leadingCall = false, trailingCall = false, lastCallTime = 0;
function resolvePending() {
if (leadingCall) {
leadingCall = false;
callback();
}
if (trailingCall) {
proxy();
}
}
function timeoutCallback() {
requestAnimationFrame$1(resolvePending);
}
function proxy() {
var timeStamp = Date.now();
if (leadingCall) {
if (timeStamp - lastCallTime < trailingTimeout) {
return;
}
trailingCall = true;
} else {
leadingCall = true;
trailingCall = false;
setTimeout(timeoutCallback, delay);
}
lastCallTime = timeStamp;
}
return proxy;
}
var REFRESH_DELAY = 20;
var transitionKeys = ["top", "right", "bottom", "left", "width", "height", "size", "weight"];
var mutationObserverSupported = typeof MutationObserver !== "undefined";
var ResizeObserverController = function() {
function ResizeObserverController2() {
this.connected_ = false;
this.mutationEventsAdded_ = false;
this.mutationsObserver_ = null;
this.observers_ = [];
this.onTransitionEnd_ = this.onTransitionEnd_.bind(this);
this.refresh = throttle(this.refresh.bind(this), REFRESH_DELAY);
}
ResizeObserverController2.prototype.addObserver = function(observer) {
if (!~this.observers_.indexOf(observer)) {
this.observers_.push(observer);
}
if (!this.connected_) {
this.connect_();
}
};
ResizeObserverController2.prototype.removeObserver = function(observer) {
var observers2 = this.observers_;
var index2 = observers2.indexOf(observer);
if (~index2) {
observers2.splice(index2, 1);
}
if (!observers2.length && this.connected_) {
this.disconnect_();
}
};
ResizeObserverController2.prototype.refresh = function() {
var changesDetected = this.updateObservers_();
if (changesDetected) {
this.refresh();
}
};
ResizeObserverController2.prototype.updateObservers_ = function() {
var activeObservers = this.observers_.filter(function(observer) {
return observer.gatherActive(), observer.hasActive();
});
activeObservers.forEach(function(observer) {
return observer.broadcastActive();
});
return activeObservers.length > 0;
};
ResizeObserverController2.prototype.connect_ = function() {
if (!isBrowser || this.connected_) {
return;
}
document.addEventListener("transitionend", this.onTransitionEnd_);
window.addEventListener("resize", this.refresh);
if (mutationObserverSupported) {
this.mutationsObserver_ = new MutationObserver(this.refresh);
this.mutationsObserver_.observe(document, {
attributes: true,
childList: true,
characterData: true,
subtree: true
});
} else {
document.addEventListener("DOMSubtreeModified", this.refresh);
this.mutationEventsAdded_ = true;
}
this.connected_ = true;
};
ResizeObserverController2.prototype.disconnect_ = function() {
if (!isBrowser || !this.connected_) {
return;
}
document.removeEventListener("transitionend", this.onTransitionEnd_);
window.removeEventListener("resize", this.refresh);
if (this.mutationsObserver_) {
this.mutationsObserver_.disconnect();
}
if (this.mutationEventsAdded_) {
document.removeEventListener("DOMSubtreeModified", this.refresh);
}
this.mutationsObserver_ = null;
this.mutationEventsAdded_ = false;
this.connected_ = false;
};
ResizeObserverController2.prototype.onTransitionEnd_ = function(_a) {
var _b = _a.propertyName, propertyName = _b === void 0 ? "" : _b;
var isReflowProperty = transitionKeys.some(function(key2) {
return !!~propertyName.indexOf(key2);
});
if (isReflowProperty) {
this.refresh();
}
};
ResizeObserverController2.getInstance = function() {
if (!this.instance_) {
this.instance_ = new ResizeObserverController2();
}
return this.instance_;
};
ResizeObserverController2.instance_ = null;
return ResizeObserverController2;
}();
var defineConfigurable = function(target, props) {
for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) {
var key2 = _a[_i];
Object.defineProperty(target, key2, {
value: props[key2],
enumerable: false,
writable: false,
configurable: true
});
}
return target;
};
var getWindowOf = function(target) {
var ownerGlobal = target && target.ownerDocument && target.ownerDocument.defaultView;
return ownerGlobal || global$1$1;
};
var emptyRect = createRectInit(0, 0, 0, 0);
function toFloat(value) {
return parseFloat(value) || 0;
}
function getBordersSize(styles) {
var positions = [];
for (var _i = 1; _i < arguments.length; _i++) {
positions[_i - 1] = arguments[_i];
}
return positions.reduce(function(size, position) {
var value = styles["border-" + position + "-width"];
return size + toFloat(value);
}, 0);
}
function getPaddings(styles) {
var positions = ["top", "right", "bottom", "left"];
var paddings = {};
for (var _i = 0, positions_1 = positions; _i < positions_1.length; _i++) {
var position = positions_1[_i];
var value = styles["padding-" + position];
paddings[position] = toFloat(value);
}
return paddings;
}
function getSVGContentRect(target) {
var bbox = target.getBBox();
return createRectInit(0, 0, bbox.width, bbox.height);
}
function getHTMLElementContentRect(target) {
var clientWidth = target.clientWidth, clientHeight = target.clientHeight;
if (!clientWidth && !clientHeight) {
return emptyRect;
}
var styles = getWindowOf(target).getComputedStyle(target);
var paddings = getPaddings(styles);
var horizPad = paddings.left + paddings.right;
var vertPad = paddings.top + paddings.bottom;
var width = toFloat(styles.width), height = toFloat(styles.height);
if (styles.boxSizing === "border-box") {
if (Math.round(width + horizPad) !== clientWidth) {
width -= getBordersSize(styles, "left", "right") + horizPad;
}
if (Math.round(height + vertPad) !== clientHeight) {
height -= getBordersSize(styles, "top", "bottom") + vertPad;
}
}
if (!isDocumentElement(target)) {
var vertScrollbar = Math.round(width + horizPad) - clientWidth;
var horizScrollbar = Math.round(height + vertPad) - clientHeight;
if (Math.abs(vertScrollbar) !== 1) {
width -= vertScrollbar;
}
if (Math.abs(horizScrollbar) !== 1) {
height -= horizScrollbar;
}
}
return createRectInit(paddings.left, paddings.top, width, height);
}
var isSVGGraphicsElement = function() {
if (typeof SVGGraphicsElement !== "undefined") {
return function(target) {
return target instanceof getWindowOf(target).SVGGraphicsElement;
};
}
return function(target) {
return target instanceof getWindowOf(target).SVGElement && typeof target.getBBox === "function";
};
}();
function isDocumentElement(target) {
return target === getWindowOf(target).document.documentElement;
}
function getContentRect(target) {
if (!isBrowser) {
return emptyRect;
}
if (isSVGGraphicsElement(target)) {
return getSVGContentRect(target);
}
return getHTMLElementContentRect(target);
}
function createReadOnlyRect(_a) {
var x2 = _a.x, y2 = _a.y, width = _a.width, height = _a.height;
var Constr = typeof DOMRectReadOnly !== "undefined" ? DOMRectReadOnly : Object;
var rect = Object.create(Constr.prototype);
defineConfigurable(rect, {
x: x2,
y: y2,
width,
height,
top: y2,
right: x2 + width,
bottom: height + y2,
left: x2
});
return rect;
}
function createRectInit(x2, y2, width, height) {
return { x: x2, y: y2, width, height };
}
var ResizeObservation = function() {
function ResizeObservation2(target) {
this.broadcastWidth = 0;
this.broadcastHeight = 0;
this.contentRect_ = createRectInit(0, 0, 0, 0);
this.target = target;
}
ResizeObservation2.prototype.isActive = function() {
var rect = getContentRect(this.target);
this.contentRect_ = rect;
return rect.width !== this.broadcastWidth || rect.height !== this.broadcastHeight;
};
ResizeObservation2.prototype.broadcastRect = function() {
var rect = this.contentRect_;
this.broadcastWidth = rect.width;
this.broadcastHeight = rect.height;
return rect;
};
return ResizeObservation2;
}();
var ResizeObserverEntry = function() {
function ResizeObserverEntry2(target, rectInit) {
var contentRect = createReadOnlyRect(rectInit);
defineConfigurable(this, { target, contentRect });
}
return ResizeObserverEntry2;
}();
var ResizeObserverSPI = function() {
function ResizeObserverSPI2(callback, controller, callbackCtx) {
this.activeObservations_ = [];
this.observations_ = new MapShim();
if (typeof callback !== "function") {
throw new TypeError("The callback provided as parameter 1 is not a function.");
}
this.callback_ = callback;
this.controller_ = controller;
this.callbackCtx_ = callbackCtx;
}
ResizeObserverSPI2.prototype.observe = function(target) {
if (!arguments.length) {
throw new TypeError("1 argument required, but only 0 present.");
}
if (typeof Element === "undefined" || !(Element instanceof Object)) {
return;
}
if (!(target instanceof getWindowOf(target).Element)) {
throw new TypeError('parameter 1 is not of type "Element".');
}
var observations = this.observations_;
if (observations.has(target)) {
return;
}
observations.set(target, new ResizeObservation(target));
this.controller_.addObserver(this);
this.controller_.refresh();
};
ResizeObserverSPI2.prototype.unobserve = function(target) {
if (!arguments.length) {
throw new TypeError("1 argument required, but only 0 present.");
}
if (typeof Element === "undefined" || !(Element instanceof Object)) {
return;
}
if (!(target instanceof getWindowOf(target).Element)) {
throw new TypeError('parameter 1 is not of type "Element".');
}
var observations = this.observations_;
if (!observations.has(target)) {
return;
}
observations.delete(target);
if (!observations.size) {
this.controller_.removeObserver(this);
}
};
ResizeObserverSPI2.prototype.disconnect = function() {
this.clearActive();
this.observations_.clear();
this.controller_.removeObserver(this);
};
ResizeObserverSPI2.prototype.gatherActive = function() {
var _this2 = this;
this.clearActive();
this.observations_.forEach(function(observation) {
if (observation.isActive()) {
_this2.activeObservations_.push(observation);
}
});
};
ResizeObserverSPI2.prototype.broadcastActive = function() {
if (!this.hasActive()) {
return;
}
var ctx2 = this.callbackCtx_;
var entries = this.activeObservations_.map(function(observation) {
return new ResizeObserverEntry(observation.target, observation.broadcastRect());
});
this.callback_.call(ctx2, entries, ctx2);
this.clearActive();
};
ResizeObserverSPI2.prototype.clearActive = function() {
this.activeObservations_.splice(0);
};
ResizeObserverSPI2.prototype.hasActive = function() {
return this.activeObservations_.length > 0;
};
return ResizeObserverSPI2;
}();
var observers = typeof WeakMap !== "undefined" ? /* @__PURE__ */ new WeakMap() : new MapShim();
var ResizeObserver$1 = function() {
function ResizeObserver2(callback) {
if (!(this instanceof ResizeObserver2)) {
throw new TypeError("Cannot call a class as a function.");
}
if (!arguments.length) {
throw new TypeError("1 argument required, but only 0 present.");
}
var controller = ResizeObserverController.getInstance();
var observer = new ResizeObserverSPI(callback, controller, this);
observers.set(this, observer);
}
return ResizeObserver2;
}();
[
"observe",
"unobserve",
"disconnect"
].forEach(function(method2) {
ResizeObserver$1.prototype[method2] = function() {
var _a;
return (_a = observers.get(this))[method2].apply(_a, arguments);
};
});
var index$Z = function() {
if (typeof global$1$1.ResizeObserver !== "undefined") {
return global$1$1.ResizeObserver;
}
return ResizeObserver$1;
}();
var elementListeners = /* @__PURE__ */ new Map();
function onResize(entities) {
entities.forEach(function(entity) {
var _elementListeners$get;
var target = entity.target;
(_elementListeners$get = elementListeners.get(target)) === null || _elementListeners$get === void 0 ? void 0 : _elementListeners$get.forEach(function(listener) {
return listener(target);
});
});
}
var resizeObserver = new index$Z(onResize);
function observe(element, callback) {
if (!elementListeners.has(element)) {
elementListeners.set(element, /* @__PURE__ */ new Set());
resizeObserver.observe(element);
}
elementListeners.get(element).add(callback);
}
function unobserve(element, callback) {
if (elementListeners.has(element)) {
elementListeners.get(element).delete(callback);
if (!elementListeners.get(element).size) {
resizeObserver.unobserve(element);
elementListeners.delete(element);
}
}
}
var DomWrapper$1 = /* @__PURE__ */ function(_React$Component) {
_inherits(DomWrapper2, _React$Component);
var _super = _createSuper(DomWrapper2);
function DomWrapper2() {
_classCallCheck(this, DomWrapper2);
return _super.apply(this, arguments);
}
_createClass(DomWrapper2, [{
key: "render",
value: function render2() {
return this.props.children;
}
}]);
return DomWrapper2;
}(React__namespace.Component);
var jsxRuntime = { exports: {} };
var reactJsxRuntime_production_min = {};
/**
* @license React
* react-jsx-runtime.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var f = React__default.default, k$2 = Symbol.for("react.element"), l$1 = Symbol.for("react.fragment"), m$1 = Object.prototype.hasOwnProperty, n$3 = f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, p$2 = { key: true, ref: true, __self: true, __source: true };
function q$2(c2, a, g2) {
var b2, d2 = {}, e2 = null, h2 = null;
void 0 !== g2 && (e2 = "" + g2);
void 0 !== a.key && (e2 = "" + a.key);
void 0 !== a.ref && (h2 = a.ref);
for (b2 in a)
m$1.call(a, b2) && !p$2.hasOwnProperty(b2) && (d2[b2] = a[b2]);
if (c2 && c2.defaultProps)
for (b2 in a = c2.defaultProps, a)
void 0 === d2[b2] && (d2[b2] = a[b2]);
return { $$typeof: k$2, type: c2, key: e2, ref: h2, props: d2, _owner: n$3.current };
}
reactJsxRuntime_production_min.Fragment = l$1;
reactJsxRuntime_production_min.jsx = q$2;
reactJsxRuntime_production_min.jsxs = q$2;
(function(module2) {
{
module2.exports = reactJsxRuntime_production_min;
}
})(jsxRuntime);
const Fragment = jsxRuntime.exports.Fragment;
const jsx = jsxRuntime.exports.jsx;
const jsxs = jsxRuntime.exports.jsxs;
var CollectionContext = /* @__PURE__ */ React__namespace.createContext(null);
function Collection$1(_ref) {
var children = _ref.children, onBatchResize = _ref.onBatchResize;
var resizeIdRef = React__namespace.useRef(0);
var resizeInfosRef = React__namespace.useRef([]);
var onCollectionResize = React__namespace.useContext(CollectionContext);
var onResize2 = React__namespace.useCallback(function(size, element, data) {
resizeIdRef.current += 1;
var currentId = resizeIdRef.current;
resizeInfosRef.current.push({
size,
element,
data
});
Promise.resolve().then(function() {
if (currentId === resizeIdRef.current) {
onBatchResize === null || onBatchResize === void 0 ? void 0 : onBatchResize(resizeInfosRef.current);
resizeInfosRef.current = [];
}
});
onCollectionResize === null || onCollectionResize === void 0 ? void 0 : onCollectionResize(size, element, data);
}, [onBatchResize, onCollectionResize]);
return /* @__PURE__ */ jsx(CollectionContext.Provider, {
value: onResize2,
children
});
}
function SingleObserver(props, ref) {
var children = props.children, disabled = props.disabled;
var elementRef = React__namespace.useRef(null);
var wrapperRef = React__namespace.useRef(null);
var onCollectionResize = React__namespace.useContext(CollectionContext);
var isRenderProps = typeof children === "function";
var mergedChildren = isRenderProps ? children(elementRef) : children;
var sizeRef = React__namespace.useRef({
width: -1,
height: -1,
offsetWidth: -1,
offsetHeight: -1
});
var canRef = !isRenderProps && /* @__PURE__ */ React__namespace.isValidElement(mergedChildren) && supportRef(mergedChildren);
var originRef = canRef ? mergedChildren.ref : null;
var mergedRef = React__namespace.useMemo(function() {
return composeRef(originRef, elementRef);
}, [originRef, elementRef]);
var getDom = function getDom2() {
return findDOMNode(elementRef.current) || findDOMNode(wrapperRef.current);
};
React__namespace.useImperativeHandle(ref, function() {
return getDom();
});
var propsRef = React__namespace.useRef(props);
propsRef.current = props;
var onInternalResize = React__namespace.useCallback(function(target) {
var _propsRef$current = propsRef.current, onResize2 = _propsRef$current.onResize, data = _propsRef$current.data;
var _target$getBoundingCl = target.getBoundingClientRect(), width = _target$getBoundingCl.width, height = _target$getBoundingCl.height;
var offsetWidth = target.offsetWidth, offsetHeight = target.offsetHeight;
var fixedWidth = Math.floor(width);
var fixedHeight = Math.floor(height);
if (sizeRef.current.width !== fixedWidth || sizeRef.current.height !== fixedHeight || sizeRef.current.offsetWidth !== offsetWidth || sizeRef.current.offsetHeight !== offsetHeight) {
var size = {
width: fixedWidth,
height: fixedHeight,
offsetWidth,
offsetHeight
};
sizeRef.current = size;
var mergedOffsetWidth = offsetWidth === Math.round(width) ? width : offsetWidth;
var mergedOffsetHeight = offsetHeight === Math.round(height) ? height : offsetHeight;
var sizeInfo = _objectSpread2$a(_objectSpread2$a({}, size), {}, {
offsetWidth: mergedOffsetWidth,
offsetHeight: mergedOffsetHeight
});
onCollectionResize === null || onCollectionResize === void 0 ? void 0 : onCollectionResize(sizeInfo, target, data);
if (onResize2) {
Promise.resolve().then(function() {
onResize2(sizeInfo, target);
});
}
}
}, []);
React__namespace.useEffect(function() {
var currentElement = getDom();
if (currentElement && !disabled) {
observe(currentElement, onInternalResize);
}
return function() {
return unobserve(currentElement, onInternalResize);
};
}, [elementRef.current, disabled]);
return /* @__PURE__ */ jsx(DomWrapper$1, {
ref: wrapperRef,
children: canRef ? /* @__PURE__ */ React__namespace.cloneElement(mergedChildren, {
ref: mergedRef
}) : mergedChildren
});
}
var RefSingleObserver = /* @__PURE__ */ React__namespace.forwardRef(SingleObserver);
var INTERNAL_PREFIX_KEY = "rc-observer-key";
function ResizeObserver(props, ref) {
var children = props.children;
var childNodes = typeof children === "function" ? [children] : toArray$9(children);
return childNodes.map(function(child, index2) {
var key2 = (child === null || child === void 0 ? void 0 : child.key) || "".concat(INTERNAL_PREFIX_KEY, "-").concat(index2);
return /* @__PURE__ */ React$a.createElement(RefSingleObserver, {
...props,
key: key2,
ref: index2 === 0 ? ref : void 0
}, child);
});
}
var RefResizeObserver = /* @__PURE__ */ React__namespace.forwardRef(ResizeObserver);
RefResizeObserver.Collection = Collection$1;
function omit(obj, fields) {
var clone = _objectSpread2$a({}, obj);
if (Array.isArray(fields)) {
fields.forEach(function(key2) {
delete clone[key2];
});
}
return clone;
}
var IconContext = /* @__PURE__ */ React$a.createContext({});
const IconContext$1 = IconContext;
function _objectWithoutPropertiesLoose$1(source, excluded) {
if (source == null)
return {};
var target = {};
var sourceKeys = Object.keys(source);
var key2, i2;
for (i2 = 0; i2 < sourceKeys.length; i2++) {
key2 = sourceKeys[i2];
if (excluded.indexOf(key2) >= 0)
continue;
target[key2] = source[key2];
}
return target;
}
function _objectWithoutProperties$1(source, excluded) {
if (source == null)
return {};
var target = _objectWithoutPropertiesLoose$1(source, excluded);
var key2, i2;
if (Object.getOwnPropertySymbols) {
var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
for (i2 = 0; i2 < sourceSymbolKeys.length; i2++) {
key2 = sourceSymbolKeys[i2];
if (excluded.indexOf(key2) >= 0)
continue;
if (!Object.prototype.propertyIsEnumerable.call(source, key2))
continue;
target[key2] = source[key2];
}
}
return target;
}
function _arrayLikeToArray$l(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _arrayWithoutHoles$c(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$l(arr);
}
function _iterableToArray$c(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _unsupportedIterableToArray$l(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$l(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$l(o, minLen);
}
function _nonIterableSpread$c() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _toConsumableArray$c(arr) {
return _arrayWithoutHoles$c(arr) || _iterableToArray$c(arr) || _unsupportedIterableToArray$l(arr) || _nonIterableSpread$c();
}
var HOOK_MARK = "RC_FORM_INTERNAL_HOOKS";
var warningFunc = function warningFunc2() {
warningOnce(false, "Can not find FormContext. Please make sure you wrap Field under Form.");
};
var Context$2 = /* @__PURE__ */ React__namespace.createContext({
getFieldValue: warningFunc,
getFieldsValue: warningFunc,
getFieldError: warningFunc,
getFieldWarning: warningFunc,
getFieldsError: warningFunc,
isFieldsTouched: warningFunc,
isFieldTouched: warningFunc,
isFieldValidating: warningFunc,
isFieldsValidating: warningFunc,
resetFields: warningFunc,
setFields: warningFunc,
setFieldValue: warningFunc,
setFieldsValue: warningFunc,
validateFields: warningFunc,
submit: warningFunc,
getInternalHooks: function getInternalHooks() {
warningFunc();
return {
dispatch: warningFunc,
initEntityValue: warningFunc,
registerField: warningFunc,
useSubscribe: warningFunc,
setInitialValues: warningFunc,
destroyForm: warningFunc,
setCallbacks: warningFunc,
registerWatch: warningFunc,
getFields: warningFunc,
setValidateMessages: warningFunc,
setPreserve: warningFunc,
getInitialValue: warningFunc
};
}
});
function toArray$8(value) {
if (value === void 0 || value === null) {
return [];
}
return Array.isArray(value) ? value : [value];
}
function _regeneratorRuntime$3() {
_regeneratorRuntime$3 = function _regeneratorRuntime2() {
return exports2;
};
var exports2 = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty2 = Object.defineProperty || function(obj, key2, desc) {
obj[key2] = desc.value;
}, $Symbol2 = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol2.iterator || "@@iterator", asyncIteratorSymbol = $Symbol2.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol2.toStringTag || "@@toStringTag";
function define(obj, key2, value) {
return Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
}), obj[key2];
}
try {
define({}, "");
} catch (err) {
define = function define2(obj, key2, value) {
return obj[key2] = value;
};
}
function wrap2(innerFn, outerFn, self2, tryLocsList) {
var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context2 = new Context2(tryLocsList || []);
return defineProperty2(generator, "_invoke", {
value: makeInvokeMethod(innerFn, self2, context2)
}), generator;
}
function tryCatch(fn, obj, arg) {
try {
return {
type: "normal",
arg: fn.call(obj, arg)
};
} catch (err) {
return {
type: "throw",
arg: err
};
}
}
exports2.wrap = wrap2;
var ContinueSentinel = {};
function Generator() {
}
function GeneratorFunction() {
}
function GeneratorFunctionPrototype() {
}
var IteratorPrototype2 = {};
define(IteratorPrototype2, iteratorSymbol, function() {
return this;
});
var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([])));
NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype2 = NativeIteratorPrototype);
var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype2);
function defineIteratorMethods(prototype2) {
["next", "throw", "return"].forEach(function(method2) {
define(prototype2, method2, function(arg) {
return this._invoke(method2, arg);
});
});
}
function AsyncIterator(generator, PromiseImpl) {
function invoke(method2, arg, resolve, reject) {
var record = tryCatch(generator[method2], generator, arg);
if ("throw" !== record.type) {
var result = record.arg, value = result.value;
return value && "object" == _typeof$q(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function(value2) {
invoke("next", value2, resolve, reject);
}, function(err) {
invoke("throw", err, resolve, reject);
}) : PromiseImpl.resolve(value).then(function(unwrapped) {
result.value = unwrapped, resolve(result);
}, function(error) {
return invoke("throw", error, resolve, reject);
});
}
reject(record.arg);
}
var previousPromise;
defineProperty2(this, "_invoke", {
value: function value(method2, arg) {
function callInvokeWithMethodAndArg() {
return new PromiseImpl(function(resolve, reject) {
invoke(method2, arg, resolve, reject);
});
}
return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
}
});
}
function makeInvokeMethod(innerFn, self2, context2) {
var state = "suspendedStart";
return function(method2, arg) {
if ("executing" === state)
throw new Error("Generator is already running");
if ("completed" === state) {
if ("throw" === method2)
throw arg;
return doneResult();
}
for (context2.method = method2, context2.arg = arg; ; ) {
var delegate = context2.delegate;
if (delegate) {
var delegateResult = maybeInvokeDelegate(delegate, context2);
if (delegateResult) {
if (delegateResult === ContinueSentinel)
continue;
return delegateResult;
}
}
if ("next" === context2.method)
context2.sent = context2._sent = context2.arg;
else if ("throw" === context2.method) {
if ("suspendedStart" === state)
throw state = "completed", context2.arg;
context2.dispatchException(context2.arg);
} else
"return" === context2.method && context2.abrupt("return", context2.arg);
state = "executing";
var record = tryCatch(innerFn, self2, context2);
if ("normal" === record.type) {
if (state = context2.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel)
continue;
return {
value: record.arg,
done: context2.done
};
}
"throw" === record.type && (state = "completed", context2.method = "throw", context2.arg = record.arg);
}
};
}
function maybeInvokeDelegate(delegate, context2) {
var methodName = context2.method, method2 = delegate.iterator[methodName];
if (void 0 === method2)
return context2.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context2.method = "return", context2.arg = void 0, maybeInvokeDelegate(delegate, context2), "throw" === context2.method) || "return" !== methodName && (context2.method = "throw", context2.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel;
var record = tryCatch(method2, delegate.iterator, context2.arg);
if ("throw" === record.type)
return context2.method = "throw", context2.arg = record.arg, context2.delegate = null, ContinueSentinel;
var info = record.arg;
return info ? info.done ? (context2[delegate.resultName] = info.value, context2.next = delegate.nextLoc, "return" !== context2.method && (context2.method = "next", context2.arg = void 0), context2.delegate = null, ContinueSentinel) : info : (context2.method = "throw", context2.arg = new TypeError("iterator result is not an object"), context2.delegate = null, ContinueSentinel);
}
function pushTryEntry(locs) {
var entry = {
tryLoc: locs[0]
};
1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);
}
function resetTryEntry(entry) {
var record = entry.completion || {};
record.type = "normal", delete record.arg, entry.completion = record;
}
function Context2(tryLocsList) {
this.tryEntries = [{
tryLoc: "root"
}], tryLocsList.forEach(pushTryEntry, this), this.reset(true);
}
function values(iterable) {
if (iterable) {
var iteratorMethod = iterable[iteratorSymbol];
if (iteratorMethod)
return iteratorMethod.call(iterable);
if ("function" == typeof iterable.next)
return iterable;
if (!isNaN(iterable.length)) {
var i2 = -1, next = function next2() {
for (; ++i2 < iterable.length; )
if (hasOwn.call(iterable, i2))
return next2.value = iterable[i2], next2.done = false, next2;
return next2.value = void 0, next2.done = true, next2;
};
return next.next = next;
}
}
return {
next: doneResult
};
}
function doneResult() {
return {
value: void 0,
done: true
};
}
return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty2(Gp, "constructor", {
value: GeneratorFunctionPrototype,
configurable: true
}), defineProperty2(GeneratorFunctionPrototype, "constructor", {
value: GeneratorFunction,
configurable: true
}), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports2.isGeneratorFunction = function(genFun) {
var ctor = "function" == typeof genFun && genFun.constructor;
return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name));
}, exports2.mark = function(genFun) {
return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun;
}, exports2.awrap = function(arg) {
return {
__await: arg
};
}, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function() {
return this;
}), exports2.AsyncIterator = AsyncIterator, exports2.async = function(innerFn, outerFn, self2, tryLocsList, PromiseImpl) {
void 0 === PromiseImpl && (PromiseImpl = Promise);
var iter = new AsyncIterator(wrap2(innerFn, outerFn, self2, tryLocsList), PromiseImpl);
return exports2.isGeneratorFunction(outerFn) ? iter : iter.next().then(function(result) {
return result.done ? result.value : iter.next();
});
}, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function() {
return this;
}), define(Gp, "toString", function() {
return "[object Generator]";
}), exports2.keys = function(val) {
var object2 = Object(val), keys2 = [];
for (var key2 in object2)
keys2.push(key2);
return keys2.reverse(), function next() {
for (; keys2.length; ) {
var key3 = keys2.pop();
if (key3 in object2)
return next.value = key3, next.done = false, next;
}
return next.done = true, next;
};
}, exports2.values = values, Context2.prototype = {
constructor: Context2,
reset: function reset(skipTempReset) {
if (this.prev = 0, this.next = 0, this.sent = this._sent = void 0, this.done = false, this.delegate = null, this.method = "next", this.arg = void 0, this.tryEntries.forEach(resetTryEntry), !skipTempReset)
for (var name2 in this)
"t" === name2.charAt(0) && hasOwn.call(this, name2) && !isNaN(+name2.slice(1)) && (this[name2] = void 0);
},
stop: function stop() {
this.done = true;
var rootRecord = this.tryEntries[0].completion;
if ("throw" === rootRecord.type)
throw rootRecord.arg;
return this.rval;
},
dispatchException: function dispatchException(exception) {
if (this.done)
throw exception;
var context2 = this;
function handle(loc, caught) {
return record.type = "throw", record.arg = exception, context2.next = loc, caught && (context2.method = "next", context2.arg = void 0), !!caught;
}
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2], record = entry.completion;
if ("root" === entry.tryLoc)
return handle("end");
if (entry.tryLoc <= this.prev) {
var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc");
if (hasCatch && hasFinally) {
if (this.prev < entry.catchLoc)
return handle(entry.catchLoc, true);
if (this.prev < entry.finallyLoc)
return handle(entry.finallyLoc);
} else if (hasCatch) {
if (this.prev < entry.catchLoc)
return handle(entry.catchLoc, true);
} else {
if (!hasFinally)
throw new Error("try statement without catch or finally");
if (this.prev < entry.finallyLoc)
return handle(entry.finallyLoc);
}
}
}
},
abrupt: function abrupt(type2, arg) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
var finallyEntry = entry;
break;
}
}
finallyEntry && ("break" === type2 || "continue" === type2) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);
var record = finallyEntry ? finallyEntry.completion : {};
return record.type = type2, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);
},
complete: function complete(record, afterLoc) {
if ("throw" === record.type)
throw record.arg;
return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;
},
finish: function finish(finallyLoc) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.finallyLoc === finallyLoc)
return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;
}
},
"catch": function _catch(tryLoc) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.tryLoc === tryLoc) {
var record = entry.completion;
if ("throw" === record.type) {
var thrown = record.arg;
resetTryEntry(entry);
}
return thrown;
}
}
throw new Error("illegal catch attempt");
},
delegateYield: function delegateYield(iterable, resultName, nextLoc) {
return this.delegate = {
iterator: values(iterable),
resultName,
nextLoc
}, "next" === this.method && (this.arg = void 0), ContinueSentinel;
}
}, exports2;
}
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key2, arg) {
try {
var info = gen[key2](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator(fn) {
return function() {
var self2 = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self2, args);
function _next(value) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(void 0);
});
};
}
function _extends$2() {
_extends$2 = Object.assign ? Object.assign.bind() : function(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = arguments[i2];
for (var key2 in source) {
if (Object.prototype.hasOwnProperty.call(source, key2)) {
target[key2] = source[key2];
}
}
}
return target;
};
return _extends$2.apply(this, arguments);
}
function _inheritsLoose(subClass, superClass) {
subClass.prototype = Object.create(superClass.prototype);
subClass.prototype.constructor = subClass;
_setPrototypeOf$1(subClass, superClass);
}
function _getPrototypeOf(o) {
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf2(o2) {
return o2.__proto__ || Object.getPrototypeOf(o2);
};
return _getPrototypeOf(o);
}
function _setPrototypeOf$1(o, p2) {
_setPrototypeOf$1 = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf3(o2, p3) {
o2.__proto__ = p3;
return o2;
};
return _setPrototypeOf$1(o, p2);
}
function _isNativeReflectConstruct() {
if (typeof Reflect === "undefined" || !Reflect.construct)
return false;
if (Reflect.construct.sham)
return false;
if (typeof Proxy === "function")
return true;
try {
Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {
}));
return true;
} catch (e2) {
return false;
}
}
function _construct(Parent, args, Class) {
if (_isNativeReflectConstruct()) {
_construct = Reflect.construct.bind();
} else {
_construct = function _construct2(Parent2, args2, Class2) {
var a = [null];
a.push.apply(a, args2);
var Constructor = Function.bind.apply(Parent2, a);
var instance = new Constructor();
if (Class2)
_setPrototypeOf$1(instance, Class2.prototype);
return instance;
};
}
return _construct.apply(null, arguments);
}
function _isNativeFunction(fn) {
return Function.toString.call(fn).indexOf("[native code]") !== -1;
}
function _wrapNativeSuper(Class) {
var _cache = typeof Map === "function" ? /* @__PURE__ */ new Map() : void 0;
_wrapNativeSuper = function _wrapNativeSuper2(Class2) {
if (Class2 === null || !_isNativeFunction(Class2))
return Class2;
if (typeof Class2 !== "function") {
throw new TypeError("Super expression must either be null or a function");
}
if (typeof _cache !== "undefined") {
if (_cache.has(Class2))
return _cache.get(Class2);
_cache.set(Class2, Wrapper);
}
function Wrapper() {
return _construct(Class2, arguments, _getPrototypeOf(this).constructor);
}
Wrapper.prototype = Object.create(Class2.prototype, {
constructor: {
value: Wrapper,
enumerable: false,
writable: true,
configurable: true
}
});
return _setPrototypeOf$1(Wrapper, Class2);
};
return _wrapNativeSuper(Class);
}
var formatRegExp = /%[sdj%]/g;
var warning$2 = function warning2() {
};
if (typeof process !== "undefined" && process.env && false) {
warning$2 = function warning2(type2, errors) {
if (typeof console !== "undefined" && console.warn && typeof ASYNC_VALIDATOR_NO_WARNING === "undefined") {
if (errors.every(function(e2) {
return typeof e2 === "string";
})) {
console.warn(type2, errors);
}
}
};
}
function convertFieldsError(errors) {
if (!errors || !errors.length)
return null;
var fields = {};
errors.forEach(function(error) {
var field = error.field;
fields[field] = fields[field] || [];
fields[field].push(error);
});
return fields;
}
function format(template) {
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
var i2 = 0;
var len = args.length;
if (typeof template === "function") {
return template.apply(null, args);
}
if (typeof template === "string") {
var str = template.replace(formatRegExp, function(x2) {
if (x2 === "%%") {
return "%";
}
if (i2 >= len) {
return x2;
}
switch (x2) {
case "%s":
return String(args[i2++]);
case "%d":
return Number(args[i2++]);
case "%j":
try {
return JSON.stringify(args[i2++]);
} catch (_) {
return "[Circular]";
}
break;
default:
return x2;
}
});
return str;
}
return template;
}
function isNativeStringType(type2) {
return type2 === "string" || type2 === "url" || type2 === "hex" || type2 === "email" || type2 === "date" || type2 === "pattern";
}
function isEmptyValue(value, type2) {
if (value === void 0 || value === null) {
return true;
}
if (type2 === "array" && Array.isArray(value) && !value.length) {
return true;
}
if (isNativeStringType(type2) && typeof value === "string" && !value) {
return true;
}
return false;
}
function asyncParallelArray(arr, func, callback) {
var results = [];
var total = 0;
var arrLength = arr.length;
function count(errors) {
results.push.apply(results, errors || []);
total++;
if (total === arrLength) {
callback(results);
}
}
arr.forEach(function(a) {
func(a, count);
});
}
function asyncSerialArray(arr, func, callback) {
var index2 = 0;
var arrLength = arr.length;
function next(errors) {
if (errors && errors.length) {
callback(errors);
return;
}
var original = index2;
index2 = index2 + 1;
if (original < arrLength) {
func(arr[original], next);
} else {
callback([]);
}
}
next([]);
}
function flattenObjArr(objArr) {
var ret = [];
Object.keys(objArr).forEach(function(k2) {
ret.push.apply(ret, objArr[k2] || []);
});
return ret;
}
var AsyncValidationError = /* @__PURE__ */ function(_Error) {
_inheritsLoose(AsyncValidationError2, _Error);
function AsyncValidationError2(errors, fields) {
var _this2;
_this2 = _Error.call(this, "Async Validation Error") || this;
_this2.errors = errors;
_this2.fields = fields;
return _this2;
}
return AsyncValidationError2;
}(/* @__PURE__ */ _wrapNativeSuper(Error));
function asyncMap(objArr, option, func, callback, source) {
if (option.first) {
var _pending = new Promise(function(resolve, reject) {
var next = function next2(errors) {
callback(errors);
return errors.length ? reject(new AsyncValidationError(errors, convertFieldsError(errors))) : resolve(source);
};
var flattenArr = flattenObjArr(objArr);
asyncSerialArray(flattenArr, func, next);
});
_pending["catch"](function(e2) {
return e2;
});
return _pending;
}
var firstFields = option.firstFields === true ? Object.keys(objArr) : option.firstFields || [];
var objArrKeys = Object.keys(objArr);
var objArrLength = objArrKeys.length;
var total = 0;
var results = [];
var pending = new Promise(function(resolve, reject) {
var next = function next2(errors) {
results.push.apply(results, errors);
total++;
if (total === objArrLength) {
callback(results);
return results.length ? reject(new AsyncValidationError(results, convertFieldsError(results))) : resolve(source);
}
};
if (!objArrKeys.length) {
callback(results);
resolve(source);
}
objArrKeys.forEach(function(key2) {
var arr = objArr[key2];
if (firstFields.indexOf(key2) !== -1) {
asyncSerialArray(arr, func, next);
} else {
asyncParallelArray(arr, func, next);
}
});
});
pending["catch"](function(e2) {
return e2;
});
return pending;
}
function isErrorObj(obj) {
return !!(obj && obj.message !== void 0);
}
function getValue$6(value, path2) {
var v2 = value;
for (var i2 = 0; i2 < path2.length; i2++) {
if (v2 == void 0) {
return v2;
}
v2 = v2[path2[i2]];
}
return v2;
}
function complementError(rule, source) {
return function(oe) {
var fieldValue;
if (rule.fullFields) {
fieldValue = getValue$6(source, rule.fullFields);
} else {
fieldValue = source[oe.field || rule.fullField];
}
if (isErrorObj(oe)) {
oe.field = oe.field || rule.fullField;
oe.fieldValue = fieldValue;
return oe;
}
return {
message: typeof oe === "function" ? oe() : oe,
fieldValue,
field: oe.field || rule.fullField
};
};
}
function deepMerge(target, source) {
if (source) {
for (var s in source) {
if (source.hasOwnProperty(s)) {
var value = source[s];
if (typeof value === "object" && typeof target[s] === "object") {
target[s] = _extends$2({}, target[s], value);
} else {
target[s] = value;
}
}
}
}
return target;
}
var required$1 = function required2(rule, value, source, errors, options, type2) {
if (rule.required && (!source.hasOwnProperty(rule.field) || isEmptyValue(value, type2 || rule.type))) {
errors.push(format(options.messages.required, rule.fullField));
}
};
var whitespace = function whitespace2(rule, value, source, errors, options) {
if (/^\s+$/.test(value) || value === "") {
errors.push(format(options.messages.whitespace, rule.fullField));
}
};
var urlReg;
var getUrlRegex = function() {
if (urlReg) {
return urlReg;
}
var word = "[a-fA-F\\d:]";
var b2 = function b3(options) {
return options && options.includeBoundaries ? "(?:(?<=\\s|^)(?=" + word + ")|(?<=" + word + ")(?=\\s|$))" : "";
};
var v4 = "(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}";
var v6seg = "[a-fA-F\\d]{1,4}";
var v6 = ("\n(?:\n(?:" + v6seg + ":){7}(?:" + v6seg + "|:)| // 1:2:3:4:5:6:7:: 1:2:3:4:5:6:7:8\n(?:" + v6seg + ":){6}(?:" + v4 + "|:" + v6seg + "|:)| // 1:2:3:4:5:6:: 1:2:3:4:5:6::8 1:2:3:4:5:6::8 1:2:3:4:5:6::1.2.3.4\n(?:" + v6seg + ":){5}(?::" + v4 + "|(?::" + v6seg + "){1,2}|:)| // 1:2:3:4:5:: 1:2:3:4:5::7:8 1:2:3:4:5::8 1:2:3:4:5::7:1.2.3.4\n(?:" + v6seg + ":){4}(?:(?::" + v6seg + "){0,1}:" + v4 + "|(?::" + v6seg + "){1,3}|:)| // 1:2:3:4:: 1:2:3:4::6:7:8 1:2:3:4::8 1:2:3:4::6:7:1.2.3.4\n(?:" + v6seg + ":){3}(?:(?::" + v6seg + "){0,2}:" + v4 + "|(?::" + v6seg + "){1,4}|:)| // 1:2:3:: 1:2:3::5:6:7:8 1:2:3::8 1:2:3::5:6:7:1.2.3.4\n(?:" + v6seg + ":){2}(?:(?::" + v6seg + "){0,3}:" + v4 + "|(?::" + v6seg + "){1,5}|:)| // 1:2:: 1:2::4:5:6:7:8 1:2::8 1:2::4:5:6:7:1.2.3.4\n(?:" + v6seg + ":){1}(?:(?::" + v6seg + "){0,4}:" + v4 + "|(?::" + v6seg + "){1,6}|:)| // 1:: 1::3:4:5:6:7:8 1::8 1::3:4:5:6:7:1.2.3.4\n(?::(?:(?::" + v6seg + "){0,5}:" + v4 + "|(?::" + v6seg + "){1,7}|:)) // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::1.2.3.4\n)(?:%[0-9a-zA-Z]{1,})? // %eth0 %1\n").replace(/\s*\/\/.*$/gm, "").replace(/\n/g, "").trim();
var v46Exact = new RegExp("(?:^" + v4 + "$)|(?:^" + v6 + "$)");
var v4exact = new RegExp("^" + v4 + "$");
var v6exact = new RegExp("^" + v6 + "$");
var ip = function ip2(options) {
return options && options.exact ? v46Exact : new RegExp("(?:" + b2(options) + v4 + b2(options) + ")|(?:" + b2(options) + v6 + b2(options) + ")", "g");
};
ip.v4 = function(options) {
return options && options.exact ? v4exact : new RegExp("" + b2(options) + v4 + b2(options), "g");
};
ip.v6 = function(options) {
return options && options.exact ? v6exact : new RegExp("" + b2(options) + v6 + b2(options), "g");
};
var protocol = "(?:(?:[a-z]+:)?//)";
var auth = "(?:\\S+(?::\\S*)?@)?";
var ipv4 = ip.v4().source;
var ipv6 = ip.v6().source;
var host = "(?:(?:[a-z\\u00a1-\\uffff0-9][-_]*)*[a-z\\u00a1-\\uffff0-9]+)";
var domain = "(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*";
var tld = "(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))";
var port = "(?::\\d{2,5})?";
var path2 = '(?:[/?#][^\\s"]*)?';
var regex = "(?:" + protocol + "|www\\.)" + auth + "(?:localhost|" + ipv4 + "|" + ipv6 + "|" + host + domain + tld + ")" + port + path2;
urlReg = new RegExp("(?:^" + regex + "$)", "i");
return urlReg;
};
var pattern$2 = {
email: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+\.)+[a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{2,}))$/,
hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i
};
var types = {
integer: function integer2(value) {
return types.number(value) && parseInt(value, 10) === value;
},
"float": function float(value) {
return types.number(value) && !types.integer(value);
},
array: function array2(value) {
return Array.isArray(value);
},
regexp: function regexp2(value) {
if (value instanceof RegExp) {
return true;
}
try {
return !!new RegExp(value);
} catch (e2) {
return false;
}
},
date: function date2(value) {
return typeof value.getTime === "function" && typeof value.getMonth === "function" && typeof value.getYear === "function" && !isNaN(value.getTime());
},
number: function number2(value) {
if (isNaN(value)) {
return false;
}
return typeof value === "number";
},
object: function object2(value) {
return typeof value === "object" && !types.array(value);
},
method: function method2(value) {
return typeof value === "function";
},
email: function email(value) {
return typeof value === "string" && value.length <= 320 && !!value.match(pattern$2.email);
},
url: function url(value) {
return typeof value === "string" && value.length <= 2048 && !!value.match(getUrlRegex());
},
hex: function hex(value) {
return typeof value === "string" && !!value.match(pattern$2.hex);
}
};
var type$1 = function type2(rule, value, source, errors, options) {
if (rule.required && value === void 0) {
required$1(rule, value, source, errors, options);
return;
}
var custom = ["integer", "float", "array", "regexp", "object", "method", "email", "number", "date", "url", "hex"];
var ruleType = rule.type;
if (custom.indexOf(ruleType) > -1) {
if (!types[ruleType](value)) {
errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));
}
} else if (ruleType && typeof value !== rule.type) {
errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));
}
};
var range = function range2(rule, value, source, errors, options) {
var len = typeof rule.len === "number";
var min = typeof rule.min === "number";
var max = typeof rule.max === "number";
var spRegexp = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
var val = value;
var key2 = null;
var num = typeof value === "number";
var str = typeof value === "string";
var arr = Array.isArray(value);
if (num) {
key2 = "number";
} else if (str) {
key2 = "string";
} else if (arr) {
key2 = "array";
}
if (!key2) {
return false;
}
if (arr) {
val = value.length;
}
if (str) {
val = value.replace(spRegexp, "_").length;
}
if (len) {
if (val !== rule.len) {
errors.push(format(options.messages[key2].len, rule.fullField, rule.len));
}
} else if (min && !max && val < rule.min) {
errors.push(format(options.messages[key2].min, rule.fullField, rule.min));
} else if (max && !min && val > rule.max) {
errors.push(format(options.messages[key2].max, rule.fullField, rule.max));
} else if (min && max && (val < rule.min || val > rule.max)) {
errors.push(format(options.messages[key2].range, rule.fullField, rule.min, rule.max));
}
};
var ENUM$1 = "enum";
var enumerable$1 = function enumerable2(rule, value, source, errors, options) {
rule[ENUM$1] = Array.isArray(rule[ENUM$1]) ? rule[ENUM$1] : [];
if (rule[ENUM$1].indexOf(value) === -1) {
errors.push(format(options.messages[ENUM$1], rule.fullField, rule[ENUM$1].join(", ")));
}
};
var pattern$1 = function pattern2(rule, value, source, errors, options) {
if (rule.pattern) {
if (rule.pattern instanceof RegExp) {
rule.pattern.lastIndex = 0;
if (!rule.pattern.test(value)) {
errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));
}
} else if (typeof rule.pattern === "string") {
var _pattern = new RegExp(rule.pattern);
if (!_pattern.test(value)) {
errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));
}
}
}
};
var rules = {
required: required$1,
whitespace,
type: type$1,
range,
"enum": enumerable$1,
pattern: pattern$1
};
var string = function string2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value, "string") && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options, "string");
if (!isEmptyValue(value, "string")) {
rules.type(rule, value, source, errors, options);
rules.range(rule, value, source, errors, options);
rules.pattern(rule, value, source, errors, options);
if (rule.whitespace === true) {
rules.whitespace(rule, value, source, errors, options);
}
}
}
callback(errors);
};
var method = function method2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value) && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options);
if (value !== void 0) {
rules.type(rule, value, source, errors, options);
}
}
callback(errors);
};
var number = function number2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (value === "") {
value = void 0;
}
if (isEmptyValue(value) && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options);
if (value !== void 0) {
rules.type(rule, value, source, errors, options);
rules.range(rule, value, source, errors, options);
}
}
callback(errors);
};
var _boolean = function _boolean2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value) && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options);
if (value !== void 0) {
rules.type(rule, value, source, errors, options);
}
}
callback(errors);
};
var regexp = function regexp2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value) && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options);
if (!isEmptyValue(value)) {
rules.type(rule, value, source, errors, options);
}
}
callback(errors);
};
var integer = function integer2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value) && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options);
if (value !== void 0) {
rules.type(rule, value, source, errors, options);
rules.range(rule, value, source, errors, options);
}
}
callback(errors);
};
var floatFn = function floatFn2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value) && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options);
if (value !== void 0) {
rules.type(rule, value, source, errors, options);
rules.range(rule, value, source, errors, options);
}
}
callback(errors);
};
var array = function array2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if ((value === void 0 || value === null) && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options, "array");
if (value !== void 0 && value !== null) {
rules.type(rule, value, source, errors, options);
rules.range(rule, value, source, errors, options);
}
}
callback(errors);
};
var object = function object2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value) && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options);
if (value !== void 0) {
rules.type(rule, value, source, errors, options);
}
}
callback(errors);
};
var ENUM = "enum";
var enumerable = function enumerable2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value) && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options);
if (value !== void 0) {
rules[ENUM](rule, value, source, errors, options);
}
}
callback(errors);
};
var pattern = function pattern2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value, "string") && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options);
if (!isEmptyValue(value, "string")) {
rules.pattern(rule, value, source, errors, options);
}
}
callback(errors);
};
var date = function date2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value, "date") && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options);
if (!isEmptyValue(value, "date")) {
var dateObject;
if (value instanceof Date) {
dateObject = value;
} else {
dateObject = new Date(value);
}
rules.type(rule, dateObject, source, errors, options);
if (dateObject) {
rules.range(rule, dateObject.getTime(), source, errors, options);
}
}
}
callback(errors);
};
var required = function required2(rule, value, callback, source, options) {
var errors = [];
var type2 = Array.isArray(value) ? "array" : typeof value;
rules.required(rule, value, source, errors, options, type2);
callback(errors);
};
var type = function type2(rule, value, callback, source, options) {
var ruleType = rule.type;
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value, ruleType) && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options, ruleType);
if (!isEmptyValue(value, ruleType)) {
rules.type(rule, value, source, errors, options);
}
}
callback(errors);
};
var any = function any2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value) && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options);
}
callback(errors);
};
var validators$2 = {
string,
method,
number,
"boolean": _boolean,
regexp,
integer,
"float": floatFn,
array,
object,
"enum": enumerable,
pattern,
date,
url: type,
hex: type,
email: type,
required,
any
};
function newMessages() {
return {
"default": "Validation error on field %s",
required: "%s is required",
"enum": "%s must be one of %s",
whitespace: "%s cannot be empty",
date: {
format: "%s date %s is invalid for format %s",
parse: "%s date could not be parsed, %s is invalid ",
invalid: "%s date %s is invalid"
},
types: {
string: "%s is not a %s",
method: "%s is not a %s (function)",
array: "%s is not an %s",
object: "%s is not an %s",
number: "%s is not a %s",
date: "%s is not a %s",
"boolean": "%s is not a %s",
integer: "%s is not an %s",
"float": "%s is not a %s",
regexp: "%s is not a valid %s",
email: "%s is not a valid %s",
url: "%s is not a valid %s",
hex: "%s is not a valid %s"
},
string: {
len: "%s must be exactly %s characters",
min: "%s must be at least %s characters",
max: "%s cannot be longer than %s characters",
range: "%s must be between %s and %s characters"
},
number: {
len: "%s must equal %s",
min: "%s cannot be less than %s",
max: "%s cannot be greater than %s",
range: "%s must be between %s and %s"
},
array: {
len: "%s must be exactly %s in length",
min: "%s cannot be less than %s in length",
max: "%s cannot be greater than %s in length",
range: "%s must be between %s and %s in length"
},
pattern: {
mismatch: "%s value %s does not match pattern %s"
},
clone: function clone() {
var cloned = JSON.parse(JSON.stringify(this));
cloned.clone = this.clone;
return cloned;
}
};
}
var messages = newMessages();
var Schema = /* @__PURE__ */ function() {
function Schema2(descriptor2) {
this.rules = null;
this._messages = messages;
this.define(descriptor2);
}
var _proto = Schema2.prototype;
_proto.define = function define(rules2) {
var _this2 = this;
if (!rules2) {
throw new Error("Cannot configure a schema with no rules");
}
if (typeof rules2 !== "object" || Array.isArray(rules2)) {
throw new Error("Rules must be an object");
}
this.rules = {};
Object.keys(rules2).forEach(function(name2) {
var item = rules2[name2];
_this2.rules[name2] = Array.isArray(item) ? item : [item];
});
};
_proto.messages = function messages2(_messages) {
if (_messages) {
this._messages = deepMerge(newMessages(), _messages);
}
return this._messages;
};
_proto.validate = function validate(source_, o, oc) {
var _this2 = this;
if (o === void 0) {
o = {};
}
if (oc === void 0) {
oc = function oc2() {
};
}
var source = source_;
var options = o;
var callback = oc;
if (typeof options === "function") {
callback = options;
options = {};
}
if (!this.rules || Object.keys(this.rules).length === 0) {
if (callback) {
callback(null, source);
}
return Promise.resolve(source);
}
function complete(results) {
var errors = [];
var fields = {};
function add(e2) {
if (Array.isArray(e2)) {
var _errors;
errors = (_errors = errors).concat.apply(_errors, e2);
} else {
errors.push(e2);
}
}
for (var i2 = 0; i2 < results.length; i2++) {
add(results[i2]);
}
if (!errors.length) {
callback(null, source);
} else {
fields = convertFieldsError(errors);
callback(errors, fields);
}
}
if (options.messages) {
var messages$1 = this.messages();
if (messages$1 === messages) {
messages$1 = newMessages();
}
deepMerge(messages$1, options.messages);
options.messages = messages$1;
} else {
options.messages = this.messages();
}
var series = {};
var keys2 = options.keys || Object.keys(this.rules);
keys2.forEach(function(z2) {
var arr = _this2.rules[z2];
var value = source[z2];
arr.forEach(function(r2) {
var rule = r2;
if (typeof rule.transform === "function") {
if (source === source_) {
source = _extends$2({}, source);
}
value = source[z2] = rule.transform(value);
}
if (typeof rule === "function") {
rule = {
validator: rule
};
} else {
rule = _extends$2({}, rule);
}
rule.validator = _this2.getValidationMethod(rule);
if (!rule.validator) {
return;
}
rule.field = z2;
rule.fullField = rule.fullField || z2;
rule.type = _this2.getType(rule);
series[z2] = series[z2] || [];
series[z2].push({
rule,
value,
source,
field: z2
});
});
});
var errorFields = {};
return asyncMap(series, options, function(data, doIt) {
var rule = data.rule;
var deep = (rule.type === "object" || rule.type === "array") && (typeof rule.fields === "object" || typeof rule.defaultField === "object");
deep = deep && (rule.required || !rule.required && data.value);
rule.field = data.field;
function addFullField(key2, schema2) {
return _extends$2({}, schema2, {
fullField: rule.fullField + "." + key2,
fullFields: rule.fullFields ? [].concat(rule.fullFields, [key2]) : [key2]
});
}
function cb(e2) {
if (e2 === void 0) {
e2 = [];
}
var errorList = Array.isArray(e2) ? e2 : [e2];
if (!options.suppressWarning && errorList.length) {
Schema2.warning("async-validator:", errorList);
}
if (errorList.length && rule.message !== void 0) {
errorList = [].concat(rule.message);
}
var filledErrors = errorList.map(complementError(rule, source));
if (options.first && filledErrors.length) {
errorFields[rule.field] = 1;
return doIt(filledErrors);
}
if (!deep) {
doIt(filledErrors);
} else {
if (rule.required && !data.value) {
if (rule.message !== void 0) {
filledErrors = [].concat(rule.message).map(complementError(rule, source));
} else if (options.error) {
filledErrors = [options.error(rule, format(options.messages.required, rule.field))];
}
return doIt(filledErrors);
}
var fieldsSchema = {};
if (rule.defaultField) {
Object.keys(data.value).map(function(key2) {
fieldsSchema[key2] = rule.defaultField;
});
}
fieldsSchema = _extends$2({}, fieldsSchema, data.rule.fields);
var paredFieldsSchema = {};
Object.keys(fieldsSchema).forEach(function(field) {
var fieldSchema = fieldsSchema[field];
var fieldSchemaList = Array.isArray(fieldSchema) ? fieldSchema : [fieldSchema];
paredFieldsSchema[field] = fieldSchemaList.map(addFullField.bind(null, field));
});
var schema2 = new Schema2(paredFieldsSchema);
schema2.messages(options.messages);
if (data.rule.options) {
data.rule.options.messages = options.messages;
data.rule.options.error = options.error;
}
schema2.validate(data.value, data.rule.options || options, function(errs) {
var finalErrors = [];
if (filledErrors && filledErrors.length) {
finalErrors.push.apply(finalErrors, filledErrors);
}
if (errs && errs.length) {
finalErrors.push.apply(finalErrors, errs);
}
doIt(finalErrors.length ? finalErrors : null);
});
}
}
var res;
if (rule.asyncValidator) {
res = rule.asyncValidator(rule, data.value, cb, data.source, options);
} else if (rule.validator) {
try {
res = rule.validator(rule, data.value, cb, data.source, options);
} catch (error) {
console.error == null ? void 0 : console.error(error);
if (!options.suppressValidatorError) {
setTimeout(function() {
throw error;
}, 0);
}
cb(error.message);
}
if (res === true) {
cb();
} else if (res === false) {
cb(typeof rule.message === "function" ? rule.message(rule.fullField || rule.field) : rule.message || (rule.fullField || rule.field) + " fails");
} else if (res instanceof Array) {
cb(res);
} else if (res instanceof Error) {
cb(res.message);
}
}
if (res && res.then) {
res.then(function() {
return cb();
}, function(e2) {
return cb(e2);
});
}
}, function(results) {
complete(results);
}, source);
};
_proto.getType = function getType(rule) {
if (rule.type === void 0 && rule.pattern instanceof RegExp) {
rule.type = "pattern";
}
if (typeof rule.validator !== "function" && rule.type && !validators$2.hasOwnProperty(rule.type)) {
throw new Error(format("Unknown rule type %s", rule.type));
}
return rule.type || "string";
};
_proto.getValidationMethod = function getValidationMethod(rule) {
if (typeof rule.validator === "function") {
return rule.validator;
}
var keys2 = Object.keys(rule);
var messageIndex = keys2.indexOf("message");
if (messageIndex !== -1) {
keys2.splice(messageIndex, 1);
}
if (keys2.length === 1 && keys2[0] === "required") {
return validators$2.required;
}
return validators$2[this.getType(rule)] || void 0;
};
return Schema2;
}();
Schema.register = function register(type2, validator2) {
if (typeof validator2 !== "function") {
throw new Error("Cannot register a validator by type, validator is not a function");
}
validators$2[type2] = validator2;
};
Schema.warning = warning$2;
Schema.messages = messages;
Schema.validators = validators$2;
var typeTemplate$2 = "'${name}' is not a valid ${type}";
var defaultValidateMessages = {
default: "Validation error on field '${name}'",
required: "'${name}' is required",
enum: "'${name}' must be one of [${enum}]",
whitespace: "'${name}' cannot be empty",
date: {
format: "'${name}' is invalid for format date",
parse: "'${name}' could not be parsed as date",
invalid: "'${name}' is invalid date"
},
types: {
string: typeTemplate$2,
method: typeTemplate$2,
array: typeTemplate$2,
object: typeTemplate$2,
number: typeTemplate$2,
date: typeTemplate$2,
boolean: typeTemplate$2,
integer: typeTemplate$2,
float: typeTemplate$2,
regexp: typeTemplate$2,
email: typeTemplate$2,
url: typeTemplate$2,
hex: typeTemplate$2
},
string: {
len: "'${name}' must be exactly ${len} characters",
min: "'${name}' must be at least ${min} characters",
max: "'${name}' cannot be longer than ${max} characters",
range: "'${name}' must be between ${min} and ${max} characters"
},
number: {
len: "'${name}' must equal ${len}",
min: "'${name}' cannot be less than ${min}",
max: "'${name}' cannot be greater than ${max}",
range: "'${name}' must be between ${min} and ${max}"
},
array: {
len: "'${name}' must be exactly ${len} in length",
min: "'${name}' cannot be less than ${min} in length",
max: "'${name}' cannot be greater than ${max} in length",
range: "'${name}' must be between ${min} and ${max} in length"
},
pattern: {
mismatch: "'${name}' does not match pattern ${pattern}"
}
};
function get$1(entity, path2) {
var current = entity;
for (var i2 = 0; i2 < path2.length; i2 += 1) {
if (current === null || current === void 0) {
return void 0;
}
current = current[path2[i2]];
}
return current;
}
function _arrayWithHoles$f(arr) {
if (Array.isArray(arr))
return arr;
}
function _nonIterableRest$f() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _toArray$1(arr) {
return _arrayWithHoles$f(arr) || _iterableToArray$c(arr) || _unsupportedIterableToArray$l(arr) || _nonIterableRest$f();
}
function internalSet(entity, paths, value, removeIfUndefined) {
if (!paths.length) {
return value;
}
var _paths = _toArray$1(paths), path2 = _paths[0], restPath = _paths.slice(1);
var clone;
if (!entity && typeof path2 === "number") {
clone = [];
} else if (Array.isArray(entity)) {
clone = _toConsumableArray$c(entity);
} else {
clone = _objectSpread2$a({}, entity);
}
if (removeIfUndefined && value === void 0 && restPath.length === 1) {
delete clone[path2][restPath[0]];
} else {
clone[path2] = internalSet(clone[path2], restPath, value, removeIfUndefined);
}
return clone;
}
function set$1(entity, paths, value) {
var removeIfUndefined = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : false;
if (paths.length && removeIfUndefined && value === void 0 && !get$1(entity, paths.slice(0, -1))) {
return entity;
}
return internalSet(entity, paths, value, removeIfUndefined);
}
function cloneDeep$1(val) {
if (Array.isArray(val)) {
return cloneArrayDeep(val);
} else if (_typeof$q(val) === "object" && val !== null) {
return cloneObjectDeep(val);
}
return val;
}
function cloneObjectDeep(val) {
if (Object.getPrototypeOf(val) === Object.prototype) {
var res = {};
for (var key2 in val) {
res[key2] = cloneDeep$1(val[key2]);
}
return res;
}
return val;
}
function cloneArrayDeep(val) {
return val.map(function(item) {
return cloneDeep$1(item);
});
}
function getNamePath(path2) {
return toArray$8(path2);
}
function getValue$5(store2, namePath) {
var value = get$1(store2, namePath);
return value;
}
function setValue(store2, namePath, value) {
var removeIfUndefined = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : false;
var newStore = set$1(store2, namePath, value, removeIfUndefined);
return newStore;
}
function cloneByNamePathList(store2, namePathList) {
var newStore = {};
namePathList.forEach(function(namePath) {
var value = getValue$5(store2, namePath);
newStore = setValue(newStore, namePath, value);
});
return newStore;
}
function containsNamePath(namePathList, namePath) {
return namePathList && namePathList.some(function(path2) {
return matchNamePath(path2, namePath);
});
}
function isObject$c(obj) {
return _typeof$q(obj) === "object" && obj !== null && Object.getPrototypeOf(obj) === Object.prototype;
}
function internalSetValues(store2, values) {
var newStore = Array.isArray(store2) ? _toConsumableArray$c(store2) : _objectSpread2$a({}, store2);
if (!values) {
return newStore;
}
Object.keys(values).forEach(function(key2) {
var prevValue = newStore[key2];
var value = values[key2];
var recursive = isObject$c(prevValue) && isObject$c(value);
newStore[key2] = recursive ? internalSetValues(prevValue, value || {}) : cloneDeep$1(value);
});
return newStore;
}
function setValues(store2) {
for (var _len = arguments.length, restValues = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
restValues[_key - 1] = arguments[_key];
}
return restValues.reduce(function(current, newStore) {
return internalSetValues(current, newStore);
}, store2);
}
function matchNamePath(namePath, changedNamePath) {
if (!namePath || !changedNamePath || namePath.length !== changedNamePath.length) {
return false;
}
return namePath.every(function(nameUnit, i2) {
return changedNamePath[i2] === nameUnit;
});
}
function isSimilar(source, target) {
if (source === target) {
return true;
}
if (!source && target || source && !target) {
return false;
}
if (!source || !target || _typeof$q(source) !== "object" || _typeof$q(target) !== "object") {
return false;
}
var sourceKeys = Object.keys(source);
var targetKeys = Object.keys(target);
var keys2 = new Set([].concat(sourceKeys, targetKeys));
return _toConsumableArray$c(keys2).every(function(key2) {
var sourceValue = source[key2];
var targetValue = target[key2];
if (typeof sourceValue === "function" && typeof targetValue === "function") {
return true;
}
return sourceValue === targetValue;
});
}
function defaultGetValueFromEvent(valuePropName) {
var event = arguments.length <= 1 ? void 0 : arguments[1];
if (event && event.target && _typeof$q(event.target) === "object" && valuePropName in event.target) {
return event.target[valuePropName];
}
return event;
}
function move(array2, moveIndex, toIndex) {
var length = array2.length;
if (moveIndex < 0 || moveIndex >= length || toIndex < 0 || toIndex >= length) {
return array2;
}
var item = array2[moveIndex];
var diff = moveIndex - toIndex;
if (diff > 0) {
return [].concat(_toConsumableArray$c(array2.slice(0, toIndex)), [item], _toConsumableArray$c(array2.slice(toIndex, moveIndex)), _toConsumableArray$c(array2.slice(moveIndex + 1, length)));
}
if (diff < 0) {
return [].concat(_toConsumableArray$c(array2.slice(0, moveIndex)), _toConsumableArray$c(array2.slice(moveIndex + 1, toIndex + 1)), [item], _toConsumableArray$c(array2.slice(toIndex + 1, length)));
}
return array2;
}
var AsyncValidator = Schema;
function replaceMessage(template, kv) {
return template.replace(/\$\{\w+\}/g, function(str) {
var key2 = str.slice(2, -1);
return kv[key2];
});
}
var CODE_LOGIC_ERROR = "CODE_LOGIC_ERROR";
function validateRule(_x, _x2, _x3, _x4, _x5) {
return _validateRule.apply(this, arguments);
}
function _validateRule() {
_validateRule = _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime$3().mark(function _callee2(name2, value, rule, options, messageVariables) {
var cloneRule, originValidator, subRuleField, validator2, messages2, result, subResults, kv, fillVariableResult;
return _regeneratorRuntime$3().wrap(function _callee2$(_context2) {
while (1)
switch (_context2.prev = _context2.next) {
case 0:
cloneRule = _objectSpread2$a({}, rule);
delete cloneRule.ruleIndex;
if (cloneRule.validator) {
originValidator = cloneRule.validator;
cloneRule.validator = function() {
try {
return originValidator.apply(void 0, arguments);
} catch (error) {
console.error(error);
return Promise.reject(CODE_LOGIC_ERROR);
}
};
}
subRuleField = null;
if (cloneRule && cloneRule.type === "array" && cloneRule.defaultField) {
subRuleField = cloneRule.defaultField;
delete cloneRule.defaultField;
}
validator2 = new AsyncValidator(_defineProperty$b({}, name2, [cloneRule]));
messages2 = setValues({}, defaultValidateMessages, options.validateMessages);
validator2.messages(messages2);
result = [];
_context2.prev = 9;
_context2.next = 12;
return Promise.resolve(validator2.validate(_defineProperty$b({}, name2, value), _objectSpread2$a({}, options)));
case 12:
_context2.next = 17;
break;
case 14:
_context2.prev = 14;
_context2.t0 = _context2["catch"](9);
if (_context2.t0.errors) {
result = _context2.t0.errors.map(function(_ref4, index2) {
var message = _ref4.message;
var mergedMessage = message === CODE_LOGIC_ERROR ? messages2.default : message;
return /* @__PURE__ */ React__namespace.isValidElement(mergedMessage) ? /* @__PURE__ */ React__namespace.cloneElement(mergedMessage, {
key: "error_".concat(index2)
}) : mergedMessage;
});
}
case 17:
if (!(!result.length && subRuleField)) {
_context2.next = 22;
break;
}
_context2.next = 20;
return Promise.all(value.map(function(subValue, i2) {
return validateRule("".concat(name2, ".").concat(i2), subValue, subRuleField, options, messageVariables);
}));
case 20:
subResults = _context2.sent;
return _context2.abrupt("return", subResults.reduce(function(prev, errors) {
return [].concat(_toConsumableArray$c(prev), _toConsumableArray$c(errors));
}, []));
case 22:
kv = _objectSpread2$a(_objectSpread2$a({}, rule), {}, {
name: name2,
enum: (rule.enum || []).join(", ")
}, messageVariables);
fillVariableResult = result.map(function(error) {
if (typeof error === "string") {
return replaceMessage(error, kv);
}
return error;
});
return _context2.abrupt("return", fillVariableResult);
case 25:
case "end":
return _context2.stop();
}
}, _callee2, null, [[9, 14]]);
}));
return _validateRule.apply(this, arguments);
}
function validateRules(namePath, value, rules2, options, validateFirst, messageVariables) {
var name2 = namePath.join(".");
var filledRules = rules2.map(function(currentRule, ruleIndex) {
var originValidatorFunc = currentRule.validator;
var cloneRule = _objectSpread2$a(_objectSpread2$a({}, currentRule), {}, {
ruleIndex
});
if (originValidatorFunc) {
cloneRule.validator = function(rule, val, callback) {
var hasPromise = false;
var wrappedCallback = function wrappedCallback2() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
Promise.resolve().then(function() {
warningOnce(!hasPromise, "Your validator function has already return a promise. `callback` will be ignored.");
if (!hasPromise) {
callback.apply(void 0, args);
}
});
};
var promise = originValidatorFunc(rule, val, wrappedCallback);
hasPromise = promise && typeof promise.then === "function" && typeof promise.catch === "function";
warningOnce(hasPromise, "`callback` is deprecated. Please return a promise instead.");
if (hasPromise) {
promise.then(function() {
callback();
}).catch(function(err) {
callback(err || " ");
});
}
};
}
return cloneRule;
}).sort(function(_ref, _ref2) {
var w1 = _ref.warningOnly, i1 = _ref.ruleIndex;
var w2 = _ref2.warningOnly, i2 = _ref2.ruleIndex;
if (!!w1 === !!w2) {
return i1 - i2;
}
if (w1) {
return 1;
}
return -1;
});
var summaryPromise;
if (validateFirst === true) {
summaryPromise = new Promise(/* @__PURE__ */ function() {
var _ref3 = _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime$3().mark(function _callee(resolve, reject) {
var i2, rule, errors;
return _regeneratorRuntime$3().wrap(function _callee$(_context) {
while (1)
switch (_context.prev = _context.next) {
case 0:
i2 = 0;
case 1:
if (!(i2 < filledRules.length)) {
_context.next = 12;
break;
}
rule = filledRules[i2];
_context.next = 5;
return validateRule(name2, value, rule, options, messageVariables);
case 5:
errors = _context.sent;
if (!errors.length) {
_context.next = 9;
break;
}
reject([{
errors,
rule
}]);
return _context.abrupt("return");
case 9:
i2 += 1;
_context.next = 1;
break;
case 12:
resolve([]);
case 13:
case "end":
return _context.stop();
}
}, _callee);
}));
return function(_x6, _x7) {
return _ref3.apply(this, arguments);
};
}());
} else {
var rulePromises = filledRules.map(function(rule) {
return validateRule(name2, value, rule, options, messageVariables).then(function(errors) {
return {
errors,
rule
};
});
});
summaryPromise = (validateFirst ? finishOnFirstFailed(rulePromises) : finishOnAllFailed(rulePromises)).then(function(errors) {
return Promise.reject(errors);
});
}
summaryPromise.catch(function(e2) {
return e2;
});
return summaryPromise;
}
function finishOnAllFailed(_x8) {
return _finishOnAllFailed.apply(this, arguments);
}
function _finishOnAllFailed() {
_finishOnAllFailed = _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime$3().mark(function _callee3(rulePromises) {
return _regeneratorRuntime$3().wrap(function _callee3$(_context3) {
while (1)
switch (_context3.prev = _context3.next) {
case 0:
return _context3.abrupt("return", Promise.all(rulePromises).then(function(errorsList) {
var _ref5;
var errors = (_ref5 = []).concat.apply(_ref5, _toConsumableArray$c(errorsList));
return errors;
}));
case 1:
case "end":
return _context3.stop();
}
}, _callee3);
}));
return _finishOnAllFailed.apply(this, arguments);
}
function finishOnFirstFailed(_x9) {
return _finishOnFirstFailed.apply(this, arguments);
}
function _finishOnFirstFailed() {
_finishOnFirstFailed = _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime$3().mark(function _callee4(rulePromises) {
var count;
return _regeneratorRuntime$3().wrap(function _callee4$(_context4) {
while (1)
switch (_context4.prev = _context4.next) {
case 0:
count = 0;
return _context4.abrupt("return", new Promise(function(resolve) {
rulePromises.forEach(function(promise) {
promise.then(function(ruleError) {
if (ruleError.errors.length) {
resolve([ruleError]);
}
count += 1;
if (count === rulePromises.length) {
resolve([]);
}
});
});
}));
case 2:
case "end":
return _context4.stop();
}
}, _callee4);
}));
return _finishOnFirstFailed.apply(this, arguments);
}
var _excluded$Q = ["name"];
var EMPTY_ERRORS = [];
function requireUpdate(shouldUpdate, prev, next, prevValue, nextValue, info) {
if (typeof shouldUpdate === "function") {
return shouldUpdate(prev, next, "source" in info ? {
source: info.source
} : {});
}
return prevValue !== nextValue;
}
var Field = /* @__PURE__ */ function(_React$Component) {
_inherits(Field2, _React$Component);
var _super = _createSuper(Field2);
function Field2(props) {
var _this2;
_classCallCheck(this, Field2);
_this2 = _super.call(this, props);
_this2.state = {
resetCount: 0
};
_this2.cancelRegisterFunc = null;
_this2.mounted = false;
_this2.touched = false;
_this2.dirty = false;
_this2.validatePromise = null;
_this2.prevValidating = void 0;
_this2.errors = EMPTY_ERRORS;
_this2.warnings = EMPTY_ERRORS;
_this2.cancelRegister = function() {
var _this$props = _this2.props, preserve = _this$props.preserve, isListField = _this$props.isListField, name2 = _this$props.name;
if (_this2.cancelRegisterFunc) {
_this2.cancelRegisterFunc(isListField, preserve, getNamePath(name2));
}
_this2.cancelRegisterFunc = null;
};
_this2.getNamePath = function() {
var _this$props2 = _this2.props, name2 = _this$props2.name, fieldContext = _this$props2.fieldContext;
var _fieldContext$prefixN = fieldContext.prefixName, prefixName = _fieldContext$prefixN === void 0 ? [] : _fieldContext$prefixN;
return name2 !== void 0 ? [].concat(_toConsumableArray$c(prefixName), _toConsumableArray$c(name2)) : [];
};
_this2.getRules = function() {
var _this$props3 = _this2.props, _this$props3$rules = _this$props3.rules, rules2 = _this$props3$rules === void 0 ? [] : _this$props3$rules, fieldContext = _this$props3.fieldContext;
return rules2.map(function(rule) {
if (typeof rule === "function") {
return rule(fieldContext);
}
return rule;
});
};
_this2.refresh = function() {
if (!_this2.mounted)
return;
_this2.setState(function(_ref) {
var resetCount = _ref.resetCount;
return {
resetCount: resetCount + 1
};
});
};
_this2.triggerMetaEvent = function(destroy) {
var onMetaChange = _this2.props.onMetaChange;
onMetaChange === null || onMetaChange === void 0 ? void 0 : onMetaChange(_objectSpread2$a(_objectSpread2$a({}, _this2.getMeta()), {}, {
destroy
}));
};
_this2.onStoreChange = function(prevStore, namePathList, info) {
var _this$props4 = _this2.props, shouldUpdate = _this$props4.shouldUpdate, _this$props4$dependen = _this$props4.dependencies, dependencies = _this$props4$dependen === void 0 ? [] : _this$props4$dependen, onReset = _this$props4.onReset;
var store2 = info.store;
var namePath = _this2.getNamePath();
var prevValue = _this2.getValue(prevStore);
var curValue = _this2.getValue(store2);
var namePathMatch = namePathList && containsNamePath(namePathList, namePath);
if (info.type === "valueUpdate" && info.source === "external" && prevValue !== curValue) {
_this2.touched = true;
_this2.dirty = true;
_this2.validatePromise = null;
_this2.errors = EMPTY_ERRORS;
_this2.warnings = EMPTY_ERRORS;
_this2.triggerMetaEvent();
}
switch (info.type) {
case "reset":
if (!namePathList || namePathMatch) {
_this2.touched = false;
_this2.dirty = false;
_this2.validatePromise = null;
_this2.errors = EMPTY_ERRORS;
_this2.warnings = EMPTY_ERRORS;
_this2.triggerMetaEvent();
onReset === null || onReset === void 0 ? void 0 : onReset();
_this2.refresh();
return;
}
break;
case "remove": {
if (shouldUpdate) {
_this2.reRender();
return;
}
break;
}
case "setField": {
if (namePathMatch) {
var data = info.data;
if ("touched" in data) {
_this2.touched = data.touched;
}
if ("validating" in data && !("originRCField" in data)) {
_this2.validatePromise = data.validating ? Promise.resolve([]) : null;
}
if ("errors" in data) {
_this2.errors = data.errors || EMPTY_ERRORS;
}
if ("warnings" in data) {
_this2.warnings = data.warnings || EMPTY_ERRORS;
}
_this2.dirty = true;
_this2.triggerMetaEvent();
_this2.reRender();
return;
}
if (shouldUpdate && !namePath.length && requireUpdate(shouldUpdate, prevStore, store2, prevValue, curValue, info)) {
_this2.reRender();
return;
}
break;
}
case "dependenciesUpdate": {
var dependencyList = dependencies.map(getNamePath);
if (dependencyList.some(function(dependency) {
return containsNamePath(info.relatedFields, dependency);
})) {
_this2.reRender();
return;
}
break;
}
default:
if (namePathMatch || (!dependencies.length || namePath.length || shouldUpdate) && requireUpdate(shouldUpdate, prevStore, store2, prevValue, curValue, info)) {
_this2.reRender();
return;
}
break;
}
if (shouldUpdate === true) {
_this2.reRender();
}
};
_this2.validateRules = function(options) {
var namePath = _this2.getNamePath();
var currentValue = _this2.getValue();
var rootPromise = Promise.resolve().then(function() {
if (!_this2.mounted) {
return [];
}
var _this$props5 = _this2.props, _this$props5$validate = _this$props5.validateFirst, validateFirst = _this$props5$validate === void 0 ? false : _this$props5$validate, messageVariables = _this$props5.messageVariables;
var _ref2 = options || {}, triggerName = _ref2.triggerName;
var filteredRules = _this2.getRules();
if (triggerName) {
filteredRules = filteredRules.filter(function(rule) {
return rule;
}).filter(function(rule) {
var validateTrigger = rule.validateTrigger;
if (!validateTrigger) {
return true;
}
var triggerList = toArray$8(validateTrigger);
return triggerList.includes(triggerName);
});
}
var promise = validateRules(namePath, currentValue, filteredRules, options, validateFirst, messageVariables);
promise.catch(function(e2) {
return e2;
}).then(function() {
var ruleErrors = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : EMPTY_ERRORS;
if (_this2.validatePromise === rootPromise) {
var _ruleErrors$forEach;
_this2.validatePromise = null;
var nextErrors = [];
var nextWarnings = [];
(_ruleErrors$forEach = ruleErrors.forEach) === null || _ruleErrors$forEach === void 0 ? void 0 : _ruleErrors$forEach.call(ruleErrors, function(_ref3) {
var warningOnly = _ref3.rule.warningOnly, _ref3$errors = _ref3.errors, errors = _ref3$errors === void 0 ? EMPTY_ERRORS : _ref3$errors;
if (warningOnly) {
nextWarnings.push.apply(nextWarnings, _toConsumableArray$c(errors));
} else {
nextErrors.push.apply(nextErrors, _toConsumableArray$c(errors));
}
});
_this2.errors = nextErrors;
_this2.warnings = nextWarnings;
_this2.triggerMetaEvent();
_this2.reRender();
}
});
return promise;
});
_this2.validatePromise = rootPromise;
_this2.dirty = true;
_this2.errors = EMPTY_ERRORS;
_this2.warnings = EMPTY_ERRORS;
_this2.triggerMetaEvent();
_this2.reRender();
return rootPromise;
};
_this2.isFieldValidating = function() {
return !!_this2.validatePromise;
};
_this2.isFieldTouched = function() {
return _this2.touched;
};
_this2.isFieldDirty = function() {
if (_this2.dirty || _this2.props.initialValue !== void 0) {
return true;
}
var fieldContext = _this2.props.fieldContext;
var _fieldContext$getInte = fieldContext.getInternalHooks(HOOK_MARK), getInitialValue = _fieldContext$getInte.getInitialValue;
if (getInitialValue(_this2.getNamePath()) !== void 0) {
return true;
}
return false;
};
_this2.getErrors = function() {
return _this2.errors;
};
_this2.getWarnings = function() {
return _this2.warnings;
};
_this2.isListField = function() {
return _this2.props.isListField;
};
_this2.isList = function() {
return _this2.props.isList;
};
_this2.isPreserve = function() {
return _this2.props.preserve;
};
_this2.getMeta = function() {
_this2.prevValidating = _this2.isFieldValidating();
var meta2 = {
touched: _this2.isFieldTouched(),
validating: _this2.prevValidating,
errors: _this2.errors,
warnings: _this2.warnings,
name: _this2.getNamePath()
};
return meta2;
};
_this2.getOnlyChild = function(children) {
if (typeof children === "function") {
var meta2 = _this2.getMeta();
return _objectSpread2$a(_objectSpread2$a({}, _this2.getOnlyChild(children(_this2.getControlled(), meta2, _this2.props.fieldContext))), {}, {
isFunction: true
});
}
var childList = toArray$9(children);
if (childList.length !== 1 || !/* @__PURE__ */ React__namespace.isValidElement(childList[0])) {
return {
child: childList,
isFunction: false
};
}
return {
child: childList[0],
isFunction: false
};
};
_this2.getValue = function(store2) {
var getFieldsValue = _this2.props.fieldContext.getFieldsValue;
var namePath = _this2.getNamePath();
return getValue$5(store2 || getFieldsValue(true), namePath);
};
_this2.getControlled = function() {
var childProps = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
var _this$props6 = _this2.props, trigger = _this$props6.trigger, validateTrigger = _this$props6.validateTrigger, getValueFromEvent = _this$props6.getValueFromEvent, normalize2 = _this$props6.normalize, valuePropName = _this$props6.valuePropName, getValueProps = _this$props6.getValueProps, fieldContext = _this$props6.fieldContext;
var mergedValidateTrigger = validateTrigger !== void 0 ? validateTrigger : fieldContext.validateTrigger;
var namePath = _this2.getNamePath();
var getInternalHooks2 = fieldContext.getInternalHooks, getFieldsValue = fieldContext.getFieldsValue;
var _getInternalHooks = getInternalHooks2(HOOK_MARK), dispatch = _getInternalHooks.dispatch;
var value = _this2.getValue();
var mergedGetValueProps = getValueProps || function(val) {
return _defineProperty$b({}, valuePropName, val);
};
var originTriggerFunc = childProps[trigger];
var control = _objectSpread2$a(_objectSpread2$a({}, childProps), mergedGetValueProps(value));
control[trigger] = function() {
_this2.touched = true;
_this2.dirty = true;
_this2.triggerMetaEvent();
var newValue;
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
if (getValueFromEvent) {
newValue = getValueFromEvent.apply(void 0, args);
} else {
newValue = defaultGetValueFromEvent.apply(void 0, [valuePropName].concat(args));
}
if (normalize2) {
newValue = normalize2(newValue, value, getFieldsValue(true));
}
dispatch({
type: "updateValue",
namePath,
value: newValue
});
if (originTriggerFunc) {
originTriggerFunc.apply(void 0, args);
}
};
var validateTriggerList = toArray$8(mergedValidateTrigger || []);
validateTriggerList.forEach(function(triggerName) {
var originTrigger = control[triggerName];
control[triggerName] = function() {
if (originTrigger) {
originTrigger.apply(void 0, arguments);
}
var rules2 = _this2.props.rules;
if (rules2 && rules2.length) {
dispatch({
type: "validateField",
namePath,
triggerName
});
}
};
});
return control;
};
if (props.fieldContext) {
var getInternalHooks = props.fieldContext.getInternalHooks;
var _getInternalHooks2 = getInternalHooks(HOOK_MARK), initEntityValue = _getInternalHooks2.initEntityValue;
initEntityValue(_assertThisInitialized(_this2));
}
return _this2;
}
_createClass(Field2, [{
key: "componentDidMount",
value: function componentDidMount() {
var _this$props7 = this.props, shouldUpdate = _this$props7.shouldUpdate, fieldContext = _this$props7.fieldContext;
this.mounted = true;
if (fieldContext) {
var getInternalHooks = fieldContext.getInternalHooks;
var _getInternalHooks3 = getInternalHooks(HOOK_MARK), registerField = _getInternalHooks3.registerField;
this.cancelRegisterFunc = registerField(this);
}
if (shouldUpdate === true) {
this.reRender();
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this.cancelRegister();
this.triggerMetaEvent(true);
this.mounted = false;
}
}, {
key: "reRender",
value: function reRender() {
if (!this.mounted)
return;
this.forceUpdate();
}
}, {
key: "render",
value: function render2() {
this.state.resetCount;
var children = this.props.children;
var _this$getOnlyChild = this.getOnlyChild(children), child = _this$getOnlyChild.child, isFunction2 = _this$getOnlyChild.isFunction;
var returnChildNode;
if (isFunction2) {
returnChildNode = child;
} else if (/* @__PURE__ */ React__namespace.isValidElement(child)) {
returnChildNode = /* @__PURE__ */ React__namespace.cloneElement(child, this.getControlled(child.props));
} else {
warningOnce(!child, "`children` of Field is not validate ReactElement.");
returnChildNode = child;
}
return /* @__PURE__ */ jsx(Fragment, {
children: returnChildNode
});
}
}]);
return Field2;
}(React__namespace.Component);
Field.contextType = Context$2;
Field.defaultProps = {
trigger: "onChange",
valuePropName: "value"
};
function WrapperField(_ref5) {
var name2 = _ref5.name, restProps = _objectWithoutProperties$1(_ref5, _excluded$Q);
var fieldContext = React__namespace.useContext(Context$2);
var namePath = name2 !== void 0 ? getNamePath(name2) : void 0;
var key2 = "keep";
if (!restProps.isListField) {
key2 = "_".concat((namePath || []).join("_"));
}
return /* @__PURE__ */ jsx(Field, {
name: namePath,
...restProps,
fieldContext
}, key2);
}
var ListContext = /* @__PURE__ */ React__namespace.createContext(null);
var List$2 = function List2(_ref) {
var name2 = _ref.name, initialValue = _ref.initialValue, children = _ref.children, rules2 = _ref.rules, validateTrigger = _ref.validateTrigger;
var context2 = React__namespace.useContext(Context$2);
var keyRef = React__namespace.useRef({
keys: [],
id: 0
});
var keyManager = keyRef.current;
var prefixName = React__namespace.useMemo(function() {
var parentPrefixName = getNamePath(context2.prefixName) || [];
return [].concat(_toConsumableArray$c(parentPrefixName), _toConsumableArray$c(getNamePath(name2)));
}, [context2.prefixName, name2]);
var fieldContext = React__namespace.useMemo(function() {
return _objectSpread2$a(_objectSpread2$a({}, context2), {}, {
prefixName
});
}, [context2, prefixName]);
var listContext = React__namespace.useMemo(function() {
return {
getKey: function getKey2(namePath) {
var len = prefixName.length;
var pathName = namePath[len];
return [keyManager.keys[pathName], namePath.slice(len + 1)];
}
};
}, [prefixName]);
if (typeof children !== "function") {
warningOnce(false, "Form.List only accepts function as children.");
return null;
}
var shouldUpdate = function shouldUpdate2(prevValue, nextValue, _ref2) {
var source = _ref2.source;
if (source === "internal") {
return false;
}
return prevValue !== nextValue;
};
return /* @__PURE__ */ jsx(ListContext.Provider, {
value: listContext,
children: /* @__PURE__ */ jsx(Context$2.Provider, {
value: fieldContext,
children: /* @__PURE__ */ jsx(WrapperField, {
name: [],
shouldUpdate,
rules: rules2,
validateTrigger,
initialValue,
isList: true,
children: function(_ref3, meta2) {
var _ref3$value = _ref3.value, value = _ref3$value === void 0 ? [] : _ref3$value, onChange = _ref3.onChange;
var getFieldValue = context2.getFieldValue;
var getNewValue = function getNewValue2() {
var values = getFieldValue(prefixName || []);
return values || [];
};
var operations = {
add: function add(defaultValue, index2) {
var newValue = getNewValue();
if (index2 >= 0 && index2 <= newValue.length) {
keyManager.keys = [].concat(_toConsumableArray$c(keyManager.keys.slice(0, index2)), [keyManager.id], _toConsumableArray$c(keyManager.keys.slice(index2)));
onChange([].concat(_toConsumableArray$c(newValue.slice(0, index2)), [defaultValue], _toConsumableArray$c(newValue.slice(index2))));
} else {
keyManager.keys = [].concat(_toConsumableArray$c(keyManager.keys), [keyManager.id]);
onChange([].concat(_toConsumableArray$c(newValue), [defaultValue]));
}
keyManager.id += 1;
},
remove: function remove(index2) {
var newValue = getNewValue();
var indexSet = new Set(Array.isArray(index2) ? index2 : [index2]);
if (indexSet.size <= 0) {
return;
}
keyManager.keys = keyManager.keys.filter(function(_, keysIndex) {
return !indexSet.has(keysIndex);
});
onChange(newValue.filter(function(_, valueIndex) {
return !indexSet.has(valueIndex);
}));
},
move: function move$1(from, to) {
if (from === to) {
return;
}
var newValue = getNewValue();
if (from < 0 || from >= newValue.length || to < 0 || to >= newValue.length) {
return;
}
keyManager.keys = move(keyManager.keys, from, to);
onChange(move(newValue, from, to));
}
};
var listValue = value || [];
if (!Array.isArray(listValue)) {
listValue = [];
}
return children(listValue.map(function(__, index2) {
var key2 = keyManager.keys[index2];
if (key2 === void 0) {
keyManager.keys[index2] = keyManager.id;
key2 = keyManager.keys[index2];
keyManager.id += 1;
}
return {
name: index2,
key: key2,
isListField: true
};
}), operations, meta2);
}
})
})
});
};
function _iterableToArrayLimit$e(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _slicedToArray$e(arr, i2) {
return _arrayWithHoles$f(arr) || _iterableToArrayLimit$e(arr, i2) || _unsupportedIterableToArray$l(arr, i2) || _nonIterableRest$f();
}
function allPromiseFinish(promiseList) {
var hasError = false;
var count = promiseList.length;
var results = [];
if (!promiseList.length) {
return Promise.resolve([]);
}
return new Promise(function(resolve, reject) {
promiseList.forEach(function(promise, index2) {
promise.catch(function(e2) {
hasError = true;
return e2;
}).then(function(result) {
count -= 1;
results[index2] = result;
if (count > 0) {
return;
}
if (hasError) {
reject(results);
}
resolve(results);
});
});
});
}
var SPLIT = "__@field_split__";
function normalize(namePath) {
return namePath.map(function(cell) {
return "".concat(_typeof$q(cell), ":").concat(cell);
}).join(SPLIT);
}
var NameMap = /* @__PURE__ */ function() {
function NameMap2() {
_classCallCheck(this, NameMap2);
this.kvs = /* @__PURE__ */ new Map();
}
_createClass(NameMap2, [{
key: "set",
value: function set2(key2, value) {
this.kvs.set(normalize(key2), value);
}
}, {
key: "get",
value: function get2(key2) {
return this.kvs.get(normalize(key2));
}
}, {
key: "update",
value: function update(key2, updater) {
var origin = this.get(key2);
var next = updater(origin);
if (!next) {
this.delete(key2);
} else {
this.set(key2, next);
}
}
}, {
key: "delete",
value: function _delete(key2) {
this.kvs.delete(normalize(key2));
}
}, {
key: "map",
value: function map(callback) {
return _toConsumableArray$c(this.kvs.entries()).map(function(_ref) {
var _ref2 = _slicedToArray$e(_ref, 2), key2 = _ref2[0], value = _ref2[1];
var cells = key2.split(SPLIT);
return callback({
key: cells.map(function(cell) {
var _cell$match = cell.match(/^([^:]*):(.*)$/), _cell$match2 = _slicedToArray$e(_cell$match, 3), type2 = _cell$match2[1], unit = _cell$match2[2];
return type2 === "number" ? Number(unit) : unit;
}),
value
});
});
}
}, {
key: "toJSON",
value: function toJSON() {
var json = {};
this.map(function(_ref3) {
var key2 = _ref3.key, value = _ref3.value;
json[key2.join(".")] = value;
return null;
});
return json;
}
}]);
return NameMap2;
}();
var _excluded$P = ["name", "errors"];
var FormStore = /* @__PURE__ */ _createClass(function FormStore2(forceRootUpdate) {
var _this2 = this;
_classCallCheck(this, FormStore2);
this.formHooked = false;
this.forceRootUpdate = void 0;
this.subscribable = true;
this.store = {};
this.fieldEntities = [];
this.initialValues = {};
this.callbacks = {};
this.validateMessages = null;
this.preserve = null;
this.lastValidatePromise = null;
this.getForm = function() {
return {
getFieldValue: _this2.getFieldValue,
getFieldsValue: _this2.getFieldsValue,
getFieldError: _this2.getFieldError,
getFieldWarning: _this2.getFieldWarning,
getFieldsError: _this2.getFieldsError,
isFieldsTouched: _this2.isFieldsTouched,
isFieldTouched: _this2.isFieldTouched,
isFieldValidating: _this2.isFieldValidating,
isFieldsValidating: _this2.isFieldsValidating,
resetFields: _this2.resetFields,
setFields: _this2.setFields,
setFieldValue: _this2.setFieldValue,
setFieldsValue: _this2.setFieldsValue,
validateFields: _this2.validateFields,
submit: _this2.submit,
_init: true,
getInternalHooks: _this2.getInternalHooks
};
};
this.getInternalHooks = function(key2) {
if (key2 === HOOK_MARK) {
_this2.formHooked = true;
return {
dispatch: _this2.dispatch,
initEntityValue: _this2.initEntityValue,
registerField: _this2.registerField,
useSubscribe: _this2.useSubscribe,
setInitialValues: _this2.setInitialValues,
destroyForm: _this2.destroyForm,
setCallbacks: _this2.setCallbacks,
setValidateMessages: _this2.setValidateMessages,
getFields: _this2.getFields,
setPreserve: _this2.setPreserve,
getInitialValue: _this2.getInitialValue,
registerWatch: _this2.registerWatch
};
}
warningOnce(false, "`getInternalHooks` is internal usage. Should not call directly.");
return null;
};
this.useSubscribe = function(subscribable) {
_this2.subscribable = subscribable;
};
this.prevWithoutPreserves = null;
this.setInitialValues = function(initialValues, init2) {
_this2.initialValues = initialValues || {};
if (init2) {
var _this$prevWithoutPres;
var nextStore = setValues({}, initialValues, _this2.store);
(_this$prevWithoutPres = _this2.prevWithoutPreserves) === null || _this$prevWithoutPres === void 0 ? void 0 : _this$prevWithoutPres.map(function(_ref) {
var namePath = _ref.key;
nextStore = setValue(nextStore, namePath, getValue$5(initialValues, namePath));
});
_this2.prevWithoutPreserves = null;
_this2.updateStore(nextStore);
}
};
this.destroyForm = function() {
var prevWithoutPreserves = new NameMap();
_this2.getFieldEntities(true).forEach(function(entity) {
if (!_this2.isMergedPreserve(entity.isPreserve())) {
prevWithoutPreserves.set(entity.getNamePath(), true);
}
});
_this2.prevWithoutPreserves = prevWithoutPreserves;
};
this.getInitialValue = function(namePath) {
var initValue = getValue$5(_this2.initialValues, namePath);
return namePath.length ? cloneDeep$1(initValue) : initValue;
};
this.setCallbacks = function(callbacks) {
_this2.callbacks = callbacks;
};
this.setValidateMessages = function(validateMessages) {
_this2.validateMessages = validateMessages;
};
this.setPreserve = function(preserve) {
_this2.preserve = preserve;
};
this.watchList = [];
this.registerWatch = function(callback) {
_this2.watchList.push(callback);
return function() {
_this2.watchList = _this2.watchList.filter(function(fn) {
return fn !== callback;
});
};
};
this.notifyWatch = function() {
var namePath = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [];
if (_this2.watchList.length) {
var values = _this2.getFieldsValue();
_this2.watchList.forEach(function(callback) {
callback(values, namePath);
});
}
};
this.timeoutId = null;
this.warningUnhooked = function() {
};
this.updateStore = function(nextStore) {
_this2.store = nextStore;
};
this.getFieldEntities = function() {
var pure = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
if (!pure) {
return _this2.fieldEntities;
}
return _this2.fieldEntities.filter(function(field) {
return field.getNamePath().length;
});
};
this.getFieldsMap = function() {
var pure = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
var cache = new NameMap();
_this2.getFieldEntities(pure).forEach(function(field) {
var namePath = field.getNamePath();
cache.set(namePath, field);
});
return cache;
};
this.getFieldEntitiesForNamePathList = function(nameList) {
if (!nameList) {
return _this2.getFieldEntities(true);
}
var cache = _this2.getFieldsMap(true);
return nameList.map(function(name2) {
var namePath = getNamePath(name2);
return cache.get(namePath) || {
INVALIDATE_NAME_PATH: getNamePath(name2)
};
});
};
this.getFieldsValue = function(nameList, filterFunc) {
_this2.warningUnhooked();
if (nameList === true && !filterFunc) {
return _this2.store;
}
var fieldEntities = _this2.getFieldEntitiesForNamePathList(Array.isArray(nameList) ? nameList : null);
var filteredNameList = [];
fieldEntities.forEach(function(entity) {
var _entity$isListField;
var namePath = "INVALIDATE_NAME_PATH" in entity ? entity.INVALIDATE_NAME_PATH : entity.getNamePath();
if (!nameList && ((_entity$isListField = entity.isListField) === null || _entity$isListField === void 0 ? void 0 : _entity$isListField.call(entity))) {
return;
}
if (!filterFunc) {
filteredNameList.push(namePath);
} else {
var meta2 = "getMeta" in entity ? entity.getMeta() : null;
if (filterFunc(meta2)) {
filteredNameList.push(namePath);
}
}
});
return cloneByNamePathList(_this2.store, filteredNameList.map(getNamePath));
};
this.getFieldValue = function(name2) {
_this2.warningUnhooked();
var namePath = getNamePath(name2);
return getValue$5(_this2.store, namePath);
};
this.getFieldsError = function(nameList) {
_this2.warningUnhooked();
var fieldEntities = _this2.getFieldEntitiesForNamePathList(nameList);
return fieldEntities.map(function(entity, index2) {
if (entity && !("INVALIDATE_NAME_PATH" in entity)) {
return {
name: entity.getNamePath(),
errors: entity.getErrors(),
warnings: entity.getWarnings()
};
}
return {
name: getNamePath(nameList[index2]),
errors: [],
warnings: []
};
});
};
this.getFieldError = function(name2) {
_this2.warningUnhooked();
var namePath = getNamePath(name2);
var fieldError = _this2.getFieldsError([namePath])[0];
return fieldError.errors;
};
this.getFieldWarning = function(name2) {
_this2.warningUnhooked();
var namePath = getNamePath(name2);
var fieldError = _this2.getFieldsError([namePath])[0];
return fieldError.warnings;
};
this.isFieldsTouched = function() {
_this2.warningUnhooked();
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var arg0 = args[0], arg1 = args[1];
var namePathList;
var isAllFieldsTouched = false;
if (args.length === 0) {
namePathList = null;
} else if (args.length === 1) {
if (Array.isArray(arg0)) {
namePathList = arg0.map(getNamePath);
isAllFieldsTouched = false;
} else {
namePathList = null;
isAllFieldsTouched = arg0;
}
} else {
namePathList = arg0.map(getNamePath);
isAllFieldsTouched = arg1;
}
var fieldEntities = _this2.getFieldEntities(true);
var isFieldTouched = function isFieldTouched2(field) {
return field.isFieldTouched();
};
if (!namePathList) {
return isAllFieldsTouched ? fieldEntities.every(isFieldTouched) : fieldEntities.some(isFieldTouched);
}
var map = new NameMap();
namePathList.forEach(function(shortNamePath) {
map.set(shortNamePath, []);
});
fieldEntities.forEach(function(field) {
var fieldNamePath = field.getNamePath();
namePathList.forEach(function(shortNamePath) {
if (shortNamePath.every(function(nameUnit, i2) {
return fieldNamePath[i2] === nameUnit;
})) {
map.update(shortNamePath, function(list) {
return [].concat(_toConsumableArray$c(list), [field]);
});
}
});
});
var isNamePathListTouched = function isNamePathListTouched2(entities) {
return entities.some(isFieldTouched);
};
var namePathListEntities = map.map(function(_ref2) {
var value = _ref2.value;
return value;
});
return isAllFieldsTouched ? namePathListEntities.every(isNamePathListTouched) : namePathListEntities.some(isNamePathListTouched);
};
this.isFieldTouched = function(name2) {
_this2.warningUnhooked();
return _this2.isFieldsTouched([name2]);
};
this.isFieldsValidating = function(nameList) {
_this2.warningUnhooked();
var fieldEntities = _this2.getFieldEntities();
if (!nameList) {
return fieldEntities.some(function(testField) {
return testField.isFieldValidating();
});
}
var namePathList = nameList.map(getNamePath);
return fieldEntities.some(function(testField) {
var fieldNamePath = testField.getNamePath();
return containsNamePath(namePathList, fieldNamePath) && testField.isFieldValidating();
});
};
this.isFieldValidating = function(name2) {
_this2.warningUnhooked();
return _this2.isFieldsValidating([name2]);
};
this.resetWithFieldInitialValue = function() {
var info = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
var cache = new NameMap();
var fieldEntities = _this2.getFieldEntities(true);
fieldEntities.forEach(function(field) {
var initialValue = field.props.initialValue;
var namePath = field.getNamePath();
if (initialValue !== void 0) {
var records = cache.get(namePath) || /* @__PURE__ */ new Set();
records.add({
entity: field,
value: initialValue
});
cache.set(namePath, records);
}
});
var resetWithFields = function resetWithFields2(entities) {
entities.forEach(function(field) {
var initialValue = field.props.initialValue;
if (initialValue !== void 0) {
var namePath = field.getNamePath();
var formInitialValue = _this2.getInitialValue(namePath);
if (formInitialValue !== void 0) {
warningOnce(false, "Form already set 'initialValues' with path '".concat(namePath.join("."), "'. Field can not overwrite it."));
} else {
var records = cache.get(namePath);
if (records && records.size > 1) {
warningOnce(false, "Multiple Field with path '".concat(namePath.join("."), "' set 'initialValue'. Can not decide which one to pick."));
} else if (records) {
var originValue = _this2.getFieldValue(namePath);
if (!info.skipExist || originValue === void 0) {
_this2.updateStore(setValue(_this2.store, namePath, _toConsumableArray$c(records)[0].value));
}
}
}
}
});
};
var requiredFieldEntities;
if (info.entities) {
requiredFieldEntities = info.entities;
} else if (info.namePathList) {
requiredFieldEntities = [];
info.namePathList.forEach(function(namePath) {
var records = cache.get(namePath);
if (records) {
var _requiredFieldEntitie;
(_requiredFieldEntitie = requiredFieldEntities).push.apply(_requiredFieldEntitie, _toConsumableArray$c(_toConsumableArray$c(records).map(function(r2) {
return r2.entity;
})));
}
});
} else {
requiredFieldEntities = fieldEntities;
}
resetWithFields(requiredFieldEntities);
};
this.resetFields = function(nameList) {
_this2.warningUnhooked();
var prevStore = _this2.store;
if (!nameList) {
_this2.updateStore(setValues({}, _this2.initialValues));
_this2.resetWithFieldInitialValue();
_this2.notifyObservers(prevStore, null, {
type: "reset"
});
_this2.notifyWatch();
return;
}
var namePathList = nameList.map(getNamePath);
namePathList.forEach(function(namePath) {
var initialValue = _this2.getInitialValue(namePath);
_this2.updateStore(setValue(_this2.store, namePath, initialValue));
});
_this2.resetWithFieldInitialValue({
namePathList
});
_this2.notifyObservers(prevStore, namePathList, {
type: "reset"
});
_this2.notifyWatch(namePathList);
};
this.setFields = function(fields) {
_this2.warningUnhooked();
var prevStore = _this2.store;
var namePathList = [];
fields.forEach(function(fieldData) {
var name2 = fieldData.name;
fieldData.errors;
var data = _objectWithoutProperties$1(fieldData, _excluded$P);
var namePath = getNamePath(name2);
namePathList.push(namePath);
if ("value" in data) {
_this2.updateStore(setValue(_this2.store, namePath, data.value));
}
_this2.notifyObservers(prevStore, [namePath], {
type: "setField",
data: fieldData
});
});
_this2.notifyWatch(namePathList);
};
this.getFields = function() {
var entities = _this2.getFieldEntities(true);
var fields = entities.map(function(field) {
var namePath = field.getNamePath();
var meta2 = field.getMeta();
var fieldData = _objectSpread2$a(_objectSpread2$a({}, meta2), {}, {
name: namePath,
value: _this2.getFieldValue(namePath)
});
Object.defineProperty(fieldData, "originRCField", {
value: true
});
return fieldData;
});
return fields;
};
this.initEntityValue = function(entity) {
var initialValue = entity.props.initialValue;
if (initialValue !== void 0) {
var namePath = entity.getNamePath();
var prevValue = getValue$5(_this2.store, namePath);
if (prevValue === void 0) {
_this2.updateStore(setValue(_this2.store, namePath, initialValue));
}
}
};
this.isMergedPreserve = function(fieldPreserve) {
var mergedPreserve = fieldPreserve !== void 0 ? fieldPreserve : _this2.preserve;
return mergedPreserve !== null && mergedPreserve !== void 0 ? mergedPreserve : true;
};
this.registerField = function(entity) {
_this2.fieldEntities.push(entity);
var namePath = entity.getNamePath();
_this2.notifyWatch([namePath]);
if (entity.props.initialValue !== void 0) {
var prevStore = _this2.store;
_this2.resetWithFieldInitialValue({
entities: [entity],
skipExist: true
});
_this2.notifyObservers(prevStore, [entity.getNamePath()], {
type: "valueUpdate",
source: "internal"
});
}
return function(isListField, preserve) {
var subNamePath = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : [];
_this2.fieldEntities = _this2.fieldEntities.filter(function(item) {
return item !== entity;
});
if (!_this2.isMergedPreserve(preserve) && (!isListField || subNamePath.length > 1)) {
var defaultValue = isListField ? void 0 : _this2.getInitialValue(namePath);
if (namePath.length && _this2.getFieldValue(namePath) !== defaultValue && _this2.fieldEntities.every(function(field) {
return !matchNamePath(field.getNamePath(), namePath);
})) {
var _prevStore = _this2.store;
_this2.updateStore(setValue(_prevStore, namePath, defaultValue, true));
_this2.notifyObservers(_prevStore, [namePath], {
type: "remove"
});
_this2.triggerDependenciesUpdate(_prevStore, namePath);
}
}
_this2.notifyWatch([namePath]);
};
};
this.dispatch = function(action) {
switch (action.type) {
case "updateValue": {
var namePath = action.namePath, value = action.value;
_this2.updateValue(namePath, value);
break;
}
case "validateField": {
var _namePath = action.namePath, triggerName = action.triggerName;
_this2.validateFields([_namePath], {
triggerName
});
break;
}
}
};
this.notifyObservers = function(prevStore, namePathList, info) {
if (_this2.subscribable) {
var mergedInfo = _objectSpread2$a(_objectSpread2$a({}, info), {}, {
store: _this2.getFieldsValue(true)
});
_this2.getFieldEntities().forEach(function(_ref3) {
var onStoreChange = _ref3.onStoreChange;
onStoreChange(prevStore, namePathList, mergedInfo);
});
} else {
_this2.forceRootUpdate();
}
};
this.triggerDependenciesUpdate = function(prevStore, namePath) {
var childrenFields = _this2.getDependencyChildrenFields(namePath);
if (childrenFields.length) {
_this2.validateFields(childrenFields);
}
_this2.notifyObservers(prevStore, childrenFields, {
type: "dependenciesUpdate",
relatedFields: [namePath].concat(_toConsumableArray$c(childrenFields))
});
return childrenFields;
};
this.updateValue = function(name2, value) {
var namePath = getNamePath(name2);
var prevStore = _this2.store;
_this2.updateStore(setValue(_this2.store, namePath, value));
_this2.notifyObservers(prevStore, [namePath], {
type: "valueUpdate",
source: "internal"
});
_this2.notifyWatch([namePath]);
var childrenFields = _this2.triggerDependenciesUpdate(prevStore, namePath);
var onValuesChange = _this2.callbacks.onValuesChange;
if (onValuesChange) {
var changedValues = cloneByNamePathList(_this2.store, [namePath]);
onValuesChange(changedValues, _this2.getFieldsValue());
}
_this2.triggerOnFieldsChange([namePath].concat(_toConsumableArray$c(childrenFields)));
};
this.setFieldsValue = function(store2) {
_this2.warningUnhooked();
var prevStore = _this2.store;
if (store2) {
var nextStore = setValues(_this2.store, store2);
_this2.updateStore(nextStore);
}
_this2.notifyObservers(prevStore, null, {
type: "valueUpdate",
source: "external"
});
_this2.notifyWatch();
};
this.setFieldValue = function(name2, value) {
_this2.setFields([{
name: name2,
value
}]);
};
this.getDependencyChildrenFields = function(rootNamePath) {
var children = /* @__PURE__ */ new Set();
var childrenFields = [];
var dependencies2fields = new NameMap();
_this2.getFieldEntities().forEach(function(field) {
var dependencies = field.props.dependencies;
(dependencies || []).forEach(function(dependency) {
var dependencyNamePath = getNamePath(dependency);
dependencies2fields.update(dependencyNamePath, function() {
var fields = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : /* @__PURE__ */ new Set();
fields.add(field);
return fields;
});
});
});
var fillChildren = function fillChildren2(namePath) {
var fields = dependencies2fields.get(namePath) || /* @__PURE__ */ new Set();
fields.forEach(function(field) {
if (!children.has(field)) {
children.add(field);
var fieldNamePath = field.getNamePath();
if (field.isFieldDirty() && fieldNamePath.length) {
childrenFields.push(fieldNamePath);
fillChildren2(fieldNamePath);
}
}
});
};
fillChildren(rootNamePath);
return childrenFields;
};
this.triggerOnFieldsChange = function(namePathList, filedErrors) {
var onFieldsChange = _this2.callbacks.onFieldsChange;
if (onFieldsChange) {
var fields = _this2.getFields();
if (filedErrors) {
var cache = new NameMap();
filedErrors.forEach(function(_ref4) {
var name2 = _ref4.name, errors = _ref4.errors;
cache.set(name2, errors);
});
fields.forEach(function(field) {
field.errors = cache.get(field.name) || field.errors;
});
}
var changedFields = fields.filter(function(_ref5) {
var fieldName = _ref5.name;
return containsNamePath(namePathList, fieldName);
});
onFieldsChange(changedFields, fields);
}
};
this.validateFields = function(nameList, options) {
_this2.warningUnhooked();
var provideNameList = !!nameList;
var namePathList = provideNameList ? nameList.map(getNamePath) : [];
var promiseList = [];
_this2.getFieldEntities(true).forEach(function(field) {
if (!provideNameList) {
namePathList.push(field.getNamePath());
}
if ((options === null || options === void 0 ? void 0 : options.recursive) && provideNameList) {
var namePath = field.getNamePath();
if (namePath.every(function(nameUnit, i2) {
return nameList[i2] === nameUnit || nameList[i2] === void 0;
})) {
namePathList.push(namePath);
}
}
if (!field.props.rules || !field.props.rules.length) {
return;
}
var fieldNamePath = field.getNamePath();
if (!provideNameList || containsNamePath(namePathList, fieldNamePath)) {
var promise = field.validateRules(_objectSpread2$a({
validateMessages: _objectSpread2$a(_objectSpread2$a({}, defaultValidateMessages), _this2.validateMessages)
}, options));
promiseList.push(promise.then(function() {
return {
name: fieldNamePath,
errors: [],
warnings: []
};
}).catch(function(ruleErrors) {
var _ruleErrors$forEach;
var mergedErrors = [];
var mergedWarnings = [];
(_ruleErrors$forEach = ruleErrors.forEach) === null || _ruleErrors$forEach === void 0 ? void 0 : _ruleErrors$forEach.call(ruleErrors, function(_ref6) {
var warningOnly = _ref6.rule.warningOnly, errors = _ref6.errors;
if (warningOnly) {
mergedWarnings.push.apply(mergedWarnings, _toConsumableArray$c(errors));
} else {
mergedErrors.push.apply(mergedErrors, _toConsumableArray$c(errors));
}
});
if (mergedErrors.length) {
return Promise.reject({
name: fieldNamePath,
errors: mergedErrors,
warnings: mergedWarnings
});
}
return {
name: fieldNamePath,
errors: mergedErrors,
warnings: mergedWarnings
};
}));
}
});
var summaryPromise = allPromiseFinish(promiseList);
_this2.lastValidatePromise = summaryPromise;
summaryPromise.catch(function(results) {
return results;
}).then(function(results) {
var resultNamePathList = results.map(function(_ref7) {
var name2 = _ref7.name;
return name2;
});
_this2.notifyObservers(_this2.store, resultNamePathList, {
type: "validateFinish"
});
_this2.triggerOnFieldsChange(resultNamePathList, results);
});
var returnPromise = summaryPromise.then(function() {
if (_this2.lastValidatePromise === summaryPromise) {
return Promise.resolve(_this2.getFieldsValue(namePathList));
}
return Promise.reject([]);
}).catch(function(results) {
var errorList = results.filter(function(result) {
return result && result.errors.length;
});
return Promise.reject({
values: _this2.getFieldsValue(namePathList),
errorFields: errorList,
outOfDate: _this2.lastValidatePromise !== summaryPromise
});
});
returnPromise.catch(function(e2) {
return e2;
});
return returnPromise;
};
this.submit = function() {
_this2.warningUnhooked();
_this2.validateFields().then(function(values) {
var onFinish = _this2.callbacks.onFinish;
if (onFinish) {
try {
onFinish(values);
} catch (err) {
console.error(err);
}
}
}).catch(function(e2) {
var onFinishFailed = _this2.callbacks.onFinishFailed;
if (onFinishFailed) {
onFinishFailed(e2);
}
});
};
this.forceRootUpdate = forceRootUpdate;
});
function useForm$2(form) {
var formRef = React__namespace.useRef();
var _React$useState = React__namespace.useState({}), _React$useState2 = _slicedToArray$e(_React$useState, 2), forceUpdate = _React$useState2[1];
if (!formRef.current) {
if (form) {
formRef.current = form;
} else {
var forceReRender = function forceReRender2() {
forceUpdate({});
};
var formStore = new FormStore(forceReRender);
formRef.current = formStore.getForm();
}
}
return [formRef.current];
}
var FormContext$1 = /* @__PURE__ */ React__namespace.createContext({
triggerFormChange: function triggerFormChange() {
},
triggerFormFinish: function triggerFormFinish() {
},
registerForm: function registerForm() {
},
unregisterForm: function unregisterForm() {
}
});
var FormProvider$1 = function FormProvider2(_ref) {
var validateMessages = _ref.validateMessages, onFormChange = _ref.onFormChange, onFormFinish = _ref.onFormFinish, children = _ref.children;
var formContext = React__namespace.useContext(FormContext$1);
var formsRef = React__namespace.useRef({});
return /* @__PURE__ */ jsx(FormContext$1.Provider, {
value: _objectSpread2$a(_objectSpread2$a({}, formContext), {}, {
validateMessages: _objectSpread2$a(_objectSpread2$a({}, formContext.validateMessages), validateMessages),
triggerFormChange: function triggerFormChange(name2, changedFields) {
if (onFormChange) {
onFormChange(name2, {
changedFields,
forms: formsRef.current
});
}
formContext.triggerFormChange(name2, changedFields);
},
triggerFormFinish: function triggerFormFinish(name2, values) {
if (onFormFinish) {
onFormFinish(name2, {
values,
forms: formsRef.current
});
}
formContext.triggerFormFinish(name2, values);
},
registerForm: function registerForm(name2, form) {
if (name2) {
formsRef.current = _objectSpread2$a(_objectSpread2$a({}, formsRef.current), {}, _defineProperty$b({}, name2, form));
}
formContext.registerForm(name2, form);
},
unregisterForm: function unregisterForm(name2) {
var newForms = _objectSpread2$a({}, formsRef.current);
delete newForms[name2];
formsRef.current = newForms;
formContext.unregisterForm(name2);
}
}),
children
});
};
var _excluded$O = ["name", "initialValues", "fields", "form", "preserve", "children", "component", "validateMessages", "validateTrigger", "onValuesChange", "onFieldsChange", "onFinish", "onFinishFailed"];
var Form$2 = function Form2(_ref, ref) {
var name2 = _ref.name, initialValues = _ref.initialValues, fields = _ref.fields, form = _ref.form, preserve = _ref.preserve, children = _ref.children, _ref$component = _ref.component, Component = _ref$component === void 0 ? "form" : _ref$component, validateMessages = _ref.validateMessages, _ref$validateTrigger = _ref.validateTrigger, validateTrigger = _ref$validateTrigger === void 0 ? "onChange" : _ref$validateTrigger, onValuesChange = _ref.onValuesChange, _onFieldsChange = _ref.onFieldsChange, _onFinish = _ref.onFinish, onFinishFailed = _ref.onFinishFailed, restProps = _objectWithoutProperties$1(_ref, _excluded$O);
var formContext = React__namespace.useContext(FormContext$1);
var _useForm = useForm$2(form), _useForm2 = _slicedToArray$e(_useForm, 1), formInstance = _useForm2[0];
var _formInstance$getInte = formInstance.getInternalHooks(HOOK_MARK), useSubscribe = _formInstance$getInte.useSubscribe, setInitialValues = _formInstance$getInte.setInitialValues, setCallbacks = _formInstance$getInte.setCallbacks, setValidateMessages = _formInstance$getInte.setValidateMessages, setPreserve = _formInstance$getInte.setPreserve, destroyForm = _formInstance$getInte.destroyForm;
React__namespace.useImperativeHandle(ref, function() {
return formInstance;
});
React__namespace.useEffect(function() {
formContext.registerForm(name2, formInstance);
return function() {
formContext.unregisterForm(name2);
};
}, [formContext, formInstance, name2]);
setValidateMessages(_objectSpread2$a(_objectSpread2$a({}, formContext.validateMessages), validateMessages));
setCallbacks({
onValuesChange,
onFieldsChange: function onFieldsChange(changedFields) {
formContext.triggerFormChange(name2, changedFields);
if (_onFieldsChange) {
for (var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
rest[_key - 1] = arguments[_key];
}
_onFieldsChange.apply(void 0, [changedFields].concat(rest));
}
},
onFinish: function onFinish(values2) {
formContext.triggerFormFinish(name2, values2);
if (_onFinish) {
_onFinish(values2);
}
},
onFinishFailed
});
setPreserve(preserve);
var mountRef = React__namespace.useRef(null);
setInitialValues(initialValues, !mountRef.current);
if (!mountRef.current) {
mountRef.current = true;
}
React__namespace.useEffect(
function() {
return destroyForm;
},
[]
);
var childrenNode;
var childrenRenderProps = typeof children === "function";
if (childrenRenderProps) {
var values = formInstance.getFieldsValue(true);
childrenNode = children(values, formInstance);
} else {
childrenNode = children;
}
useSubscribe(!childrenRenderProps);
var prevFieldsRef = React__namespace.useRef();
React__namespace.useEffect(function() {
if (!isSimilar(prevFieldsRef.current || [], fields || [])) {
formInstance.setFields(fields || []);
}
prevFieldsRef.current = fields;
}, [fields, formInstance]);
var formContextValue = React__namespace.useMemo(function() {
return _objectSpread2$a(_objectSpread2$a({}, formInstance), {}, {
validateTrigger
});
}, [formInstance, validateTrigger]);
var wrapperNode = /* @__PURE__ */ jsx(Context$2.Provider, {
value: formContextValue,
children: childrenNode
});
if (Component === false) {
return wrapperNode;
}
return /* @__PURE__ */ jsx(Component, {
...restProps,
onSubmit: function onSubmit(event) {
event.preventDefault();
event.stopPropagation();
formInstance.submit();
},
onReset: function onReset(event) {
var _restProps$onReset;
event.preventDefault();
formInstance.resetFields();
(_restProps$onReset = restProps.onReset) === null || _restProps$onReset === void 0 ? void 0 : _restProps$onReset.call(restProps, event);
},
children: wrapperNode
});
};
function stringify$1(value) {
try {
return JSON.stringify(value);
} catch (err) {
return Math.random();
}
}
function useWatch() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var _args$ = args[0], dependencies = _args$ === void 0 ? [] : _args$, form = args[1];
var _useState = React$a.useState(), _useState2 = _slicedToArray$e(_useState, 2), value = _useState2[0], setValue2 = _useState2[1];
var valueStr = React$a.useMemo(function() {
return stringify$1(value);
}, [value]);
var valueStrRef = React$a.useRef(valueStr);
valueStrRef.current = valueStr;
var fieldContext = React$a.useContext(Context$2);
var formInstance = form || fieldContext;
var isValidForm = formInstance && formInstance._init;
var namePath = getNamePath(dependencies);
var namePathRef = React$a.useRef(namePath);
namePathRef.current = namePath;
React$a.useEffect(
function() {
if (!isValidForm) {
return;
}
var getFieldsValue = formInstance.getFieldsValue, getInternalHooks = formInstance.getInternalHooks;
var _getInternalHooks = getInternalHooks(HOOK_MARK), registerWatch = _getInternalHooks.registerWatch;
var cancelRegister = registerWatch(function(store2) {
var newValue = getValue$5(store2, namePathRef.current);
var nextValueStr = stringify$1(newValue);
if (valueStrRef.current !== nextValueStr) {
valueStrRef.current = nextValueStr;
setValue2(newValue);
}
});
var initialValue = getValue$5(getFieldsValue(), namePathRef.current);
setValue2(initialValue);
return cancelRegister;
},
[isValidForm]
);
return value;
}
var InternalForm$2 = /* @__PURE__ */ React__namespace.forwardRef(Form$2);
var RefForm = InternalForm$2;
RefForm.FormProvider = FormProvider$1;
RefForm.Field = WrapperField;
RefForm.List = List$2;
RefForm.useForm = useForm$2;
RefForm.useWatch = useWatch;
const enUS$3 = {
items_per_page: "/ page",
jump_to: "Go to",
jump_to_confirm: "confirm",
page: "Page",
prev_page: "Previous Page",
next_page: "Next Page",
prev_5: "Previous 5 Pages",
next_5: "Next 5 Pages",
prev_3: "Previous 3 Pages",
next_3: "Next 3 Pages",
page_size: "Page Size"
};
var locale$4 = {
locale: "en_US",
today: "Today",
now: "Now",
backToToday: "Back to today",
ok: "OK",
clear: "Clear",
month: "Month",
year: "Year",
timeSelect: "select time",
dateSelect: "select date",
weekSelect: "Choose a week",
monthSelect: "Choose a month",
yearSelect: "Choose a year",
decadeSelect: "Choose a decade",
yearFormat: "YYYY",
dateFormat: "M/D/YYYY",
dayFormat: "D",
dateTimeFormat: "M/D/YYYY HH:mm:ss",
monthBeforeYear: true,
previousMonth: "Previous month (PageUp)",
nextMonth: "Next month (PageDown)",
previousYear: "Last year (Control + left)",
nextYear: "Next year (Control + right)",
previousDecade: "Last decade",
nextDecade: "Next decade",
previousCentury: "Last century",
nextCentury: "Next century"
};
var locale$3 = {
placeholder: "Select time",
rangePlaceholder: ["Start time", "End time"]
};
const TimePicker$2 = locale$3;
var locale$2 = {
lang: _extends$3({
placeholder: "Select date",
yearPlaceholder: "Select year",
quarterPlaceholder: "Select quarter",
monthPlaceholder: "Select month",
weekPlaceholder: "Select week",
rangePlaceholder: ["Start date", "End date"],
rangeYearPlaceholder: ["Start year", "End year"],
rangeQuarterPlaceholder: ["Start quarter", "End quarter"],
rangeMonthPlaceholder: ["Start month", "End month"],
rangeWeekPlaceholder: ["Start week", "End week"]
}, locale$4),
timePickerLocale: _extends$3({}, TimePicker$2)
};
const enUS$2 = locale$2;
var typeTemplate$1 = "${label} is not a valid ${type}";
var localeValues = {
locale: "en",
Pagination: enUS$3,
DatePicker: enUS$2,
TimePicker: TimePicker$2,
Calendar: enUS$2,
global: {
placeholder: "Please select"
},
Table: {
filterTitle: "Filter menu",
filterConfirm: "OK",
filterReset: "Reset",
filterEmptyText: "No filters",
filterCheckall: "Select all items",
filterSearchPlaceholder: "Search in filters",
emptyText: "No data",
selectAll: "Select current page",
selectInvert: "Invert current page",
selectNone: "Clear all data",
selectionAll: "Select all data",
sortTitle: "Sort",
expand: "Expand row",
collapse: "Collapse row",
triggerDesc: "Click to sort descending",
triggerAsc: "Click to sort ascending",
cancelSort: "Click to cancel sorting"
},
Modal: {
okText: "OK",
cancelText: "Cancel",
justOkText: "OK"
},
Popconfirm: {
okText: "OK",
cancelText: "Cancel"
},
Transfer: {
titles: ["", ""],
searchPlaceholder: "Search here",
itemUnit: "item",
itemsUnit: "items",
remove: "Remove",
selectCurrent: "Select current page",
removeCurrent: "Remove current page",
selectAll: "Select all data",
removeAll: "Remove all data",
selectInvert: "Invert current page"
},
Upload: {
uploading: "Uploading...",
removeFile: "Remove file",
uploadError: "Upload error",
previewFile: "Preview file",
downloadFile: "Download file"
},
Empty: {
description: "No data"
},
Icon: {
icon: "icon"
},
Text: {
edit: "Edit",
copy: "Copy",
copied: "Copied",
expand: "Expand"
},
PageHeader: {
back: "Back"
},
Form: {
optional: "(optional)",
defaultValidateMessages: {
"default": "Field validation error for ${label}",
required: "Please enter ${label}",
"enum": "${label} must be one of [${enum}]",
whitespace: "${label} cannot be a blank character",
date: {
format: "${label} date format is invalid",
parse: "${label} cannot be converted to a date",
invalid: "${label} is an invalid date"
},
types: {
string: typeTemplate$1,
method: typeTemplate$1,
array: typeTemplate$1,
object: typeTemplate$1,
number: typeTemplate$1,
date: typeTemplate$1,
"boolean": typeTemplate$1,
integer: typeTemplate$1,
"float": typeTemplate$1,
regexp: typeTemplate$1,
email: typeTemplate$1,
url: typeTemplate$1,
hex: typeTemplate$1
},
string: {
len: "${label} must be ${len} characters",
min: "${label} must be at least ${min} characters",
max: "${label} must be up to ${max} characters",
range: "${label} must be between ${min}-${max} characters"
},
number: {
len: "${label} must be equal to ${len}",
min: "${label} must be minimum ${min}",
max: "${label} must be maximum ${max}",
range: "${label} must be between ${min}-${max}"
},
array: {
len: "Must be ${len} ${label}",
min: "At least ${min} ${label}",
max: "At most ${max} ${label}",
range: "The amount of ${label} must be between ${min}-${max}"
},
pattern: {
mismatch: "${label} does not match the pattern ${pattern}"
}
}
},
Image: {
preview: "Preview"
}
};
const defaultLocale = localeValues;
var runtimeLocale = _extends$3({}, defaultLocale.Modal);
function changeConfirmLocale(newLocale) {
if (newLocale) {
runtimeLocale = _extends$3(_extends$3({}, runtimeLocale), newLocale);
} else {
runtimeLocale = _extends$3({}, defaultLocale.Modal);
}
}
var LocaleContext = /* @__PURE__ */ React$a.createContext(void 0);
const LocaleContext$1 = LocaleContext;
var ANT_MARK = "internalMark";
var LocaleProvider = function LocaleProvider2(props) {
var _props$locale = props.locale, locale2 = _props$locale === void 0 ? {} : _props$locale, children = props.children;
props._ANT_MARK__;
React__namespace.useEffect(function() {
changeConfirmLocale(locale2 && locale2.Modal);
return function() {
changeConfirmLocale();
};
}, [locale2]);
var getMemoizedContextValue = React__namespace.useMemo(function() {
return _extends$3(_extends$3({}, locale2), {
exist: true
});
}, [locale2]);
return /* @__PURE__ */ jsx(LocaleContext$1.Provider, {
value: getMemoizedContextValue,
children
});
};
const LocaleProvider$1 = LocaleProvider;
var LocaleReceiver = function LocaleReceiver2(props) {
var _props$componentName = props.componentName, componentName = _props$componentName === void 0 ? "global" : _props$componentName, defaultLocale$1 = props.defaultLocale, children = props.children;
var antLocale = React__namespace.useContext(LocaleContext$1);
var getLocale = React__namespace.useMemo(function() {
var _a;
var locale2 = defaultLocale$1 || defaultLocale[componentName];
var localeFromContext = (_a = antLocale === null || antLocale === void 0 ? void 0 : antLocale[componentName]) !== null && _a !== void 0 ? _a : {};
return _extends$3(_extends$3({}, locale2 instanceof Function ? locale2() : locale2), localeFromContext || {});
}, [componentName, defaultLocale$1, antLocale]);
var getLocaleCode = React__namespace.useMemo(function() {
var localeCode = antLocale && antLocale.locale;
if (antLocale && antLocale.exist && !localeCode) {
return defaultLocale.locale;
}
return localeCode;
}, [antLocale]);
return children(getLocale, getLocaleCode, antLocale);
};
const LocaleReceiver$1 = LocaleReceiver;
var useLocaleReceiver = function useLocaleReceiver2(componentName, defaultLocale$1) {
var antLocale = React__namespace.useContext(LocaleContext$1);
var getLocale = React__namespace.useMemo(function() {
var _a;
var locale2 = defaultLocale$1 || defaultLocale[componentName];
var localeFromContext = (_a = antLocale === null || antLocale === void 0 ? void 0 : antLocale[componentName]) !== null && _a !== void 0 ? _a : {};
return _extends$3(_extends$3({}, typeof locale2 === "function" ? locale2() : locale2), localeFromContext || {});
}, [componentName, defaultLocale$1, antLocale]);
return [getLocale];
};
var CheckCircleFilled$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm193.5 301.7l-210.6 292a31.8 31.8 0 01-51.7 0L318.5 484.9c-3.8-5.3 0-12.7 6.5-12.7h46.9c10.2 0 19.9 4.9 25.9 13.3l71.2 98.8 157.2-218c6-8.3 15.6-13.3 25.9-13.3H699c6.5 0 10.3 7.4 6.5 12.7z" } }] }, "name": "check-circle", "theme": "filled" };
const CheckCircleFilledSvg = CheckCircleFilled$2;
function bound01(n2, max) {
if (isOnePointZero(n2)) {
n2 = "100%";
}
var isPercent = isPercentage(n2);
n2 = max === 360 ? n2 : Math.min(max, Math.max(0, parseFloat(n2)));
if (isPercent) {
n2 = parseInt(String(n2 * max), 10) / 100;
}
if (Math.abs(n2 - max) < 1e-6) {
return 1;
}
if (max === 360) {
n2 = (n2 < 0 ? n2 % max + max : n2 % max) / parseFloat(String(max));
} else {
n2 = n2 % max / parseFloat(String(max));
}
return n2;
}
function clamp01(val) {
return Math.min(1, Math.max(0, val));
}
function isOnePointZero(n2) {
return typeof n2 === "string" && n2.indexOf(".") !== -1 && parseFloat(n2) === 1;
}
function isPercentage(n2) {
return typeof n2 === "string" && n2.indexOf("%") !== -1;
}
function boundAlpha(a) {
a = parseFloat(a);
if (isNaN(a) || a < 0 || a > 1) {
a = 1;
}
return a;
}
function convertToPercentage(n2) {
if (n2 <= 1) {
return "".concat(Number(n2) * 100, "%");
}
return n2;
}
function pad2(c2) {
return c2.length === 1 ? "0" + c2 : String(c2);
}
function rgbToRgb(r2, g2, b2) {
return {
r: bound01(r2, 255) * 255,
g: bound01(g2, 255) * 255,
b: bound01(b2, 255) * 255
};
}
function rgbToHsl(r2, g2, b2) {
r2 = bound01(r2, 255);
g2 = bound01(g2, 255);
b2 = bound01(b2, 255);
var max = Math.max(r2, g2, b2);
var min = Math.min(r2, g2, b2);
var h2 = 0;
var s = 0;
var l2 = (max + min) / 2;
if (max === min) {
s = 0;
h2 = 0;
} else {
var d2 = max - min;
s = l2 > 0.5 ? d2 / (2 - max - min) : d2 / (max + min);
switch (max) {
case r2:
h2 = (g2 - b2) / d2 + (g2 < b2 ? 6 : 0);
break;
case g2:
h2 = (b2 - r2) / d2 + 2;
break;
case b2:
h2 = (r2 - g2) / d2 + 4;
break;
}
h2 /= 6;
}
return { h: h2, s, l: l2 };
}
function hue2rgb(p2, q2, t2) {
if (t2 < 0) {
t2 += 1;
}
if (t2 > 1) {
t2 -= 1;
}
if (t2 < 1 / 6) {
return p2 + (q2 - p2) * (6 * t2);
}
if (t2 < 1 / 2) {
return q2;
}
if (t2 < 2 / 3) {
return p2 + (q2 - p2) * (2 / 3 - t2) * 6;
}
return p2;
}
function hslToRgb(h2, s, l2) {
var r2;
var g2;
var b2;
h2 = bound01(h2, 360);
s = bound01(s, 100);
l2 = bound01(l2, 100);
if (s === 0) {
g2 = l2;
b2 = l2;
r2 = l2;
} else {
var q2 = l2 < 0.5 ? l2 * (1 + s) : l2 + s - l2 * s;
var p2 = 2 * l2 - q2;
r2 = hue2rgb(p2, q2, h2 + 1 / 3);
g2 = hue2rgb(p2, q2, h2);
b2 = hue2rgb(p2, q2, h2 - 1 / 3);
}
return { r: r2 * 255, g: g2 * 255, b: b2 * 255 };
}
function rgbToHsv(r2, g2, b2) {
r2 = bound01(r2, 255);
g2 = bound01(g2, 255);
b2 = bound01(b2, 255);
var max = Math.max(r2, g2, b2);
var min = Math.min(r2, g2, b2);
var h2 = 0;
var v2 = max;
var d2 = max - min;
var s = max === 0 ? 0 : d2 / max;
if (max === min) {
h2 = 0;
} else {
switch (max) {
case r2:
h2 = (g2 - b2) / d2 + (g2 < b2 ? 6 : 0);
break;
case g2:
h2 = (b2 - r2) / d2 + 2;
break;
case b2:
h2 = (r2 - g2) / d2 + 4;
break;
}
h2 /= 6;
}
return { h: h2, s, v: v2 };
}
function hsvToRgb(h2, s, v2) {
h2 = bound01(h2, 360) * 6;
s = bound01(s, 100);
v2 = bound01(v2, 100);
var i2 = Math.floor(h2);
var f2 = h2 - i2;
var p2 = v2 * (1 - s);
var q2 = v2 * (1 - f2 * s);
var t2 = v2 * (1 - (1 - f2) * s);
var mod = i2 % 6;
var r2 = [v2, q2, p2, p2, t2, v2][mod];
var g2 = [t2, v2, v2, q2, p2, p2][mod];
var b2 = [p2, p2, t2, v2, v2, q2][mod];
return { r: r2 * 255, g: g2 * 255, b: b2 * 255 };
}
function rgbToHex(r2, g2, b2, allow3Char) {
var hex = [
pad2(Math.round(r2).toString(16)),
pad2(Math.round(g2).toString(16)),
pad2(Math.round(b2).toString(16))
];
if (allow3Char && hex[0].startsWith(hex[0].charAt(1)) && hex[1].startsWith(hex[1].charAt(1)) && hex[2].startsWith(hex[2].charAt(1))) {
return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);
}
return hex.join("");
}
function rgbaToHex(r2, g2, b2, a, allow4Char) {
var hex = [
pad2(Math.round(r2).toString(16)),
pad2(Math.round(g2).toString(16)),
pad2(Math.round(b2).toString(16)),
pad2(convertDecimalToHex(a))
];
if (allow4Char && hex[0].startsWith(hex[0].charAt(1)) && hex[1].startsWith(hex[1].charAt(1)) && hex[2].startsWith(hex[2].charAt(1)) && hex[3].startsWith(hex[3].charAt(1))) {
return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);
}
return hex.join("");
}
function convertDecimalToHex(d2) {
return Math.round(parseFloat(d2) * 255).toString(16);
}
function convertHexToDecimal(h2) {
return parseIntFromHex(h2) / 255;
}
function parseIntFromHex(val) {
return parseInt(val, 16);
}
function numberInputToObject(color2) {
return {
r: color2 >> 16,
g: (color2 & 65280) >> 8,
b: color2 & 255
};
}
var names = {
aliceblue: "#f0f8ff",
antiquewhite: "#faebd7",
aqua: "#00ffff",
aquamarine: "#7fffd4",
azure: "#f0ffff",
beige: "#f5f5dc",
bisque: "#ffe4c4",
black: "#000000",
blanchedalmond: "#ffebcd",
blue: "#0000ff",
blueviolet: "#8a2be2",
brown: "#a52a2a",
burlywood: "#deb887",
cadetblue: "#5f9ea0",
chartreuse: "#7fff00",
chocolate: "#d2691e",
coral: "#ff7f50",
cornflowerblue: "#6495ed",
cornsilk: "#fff8dc",
crimson: "#dc143c",
cyan: "#00ffff",
darkblue: "#00008b",
darkcyan: "#008b8b",
darkgoldenrod: "#b8860b",
darkgray: "#a9a9a9",
darkgreen: "#006400",
darkgrey: "#a9a9a9",
darkkhaki: "#bdb76b",
darkmagenta: "#8b008b",
darkolivegreen: "#556b2f",
darkorange: "#ff8c00",
darkorchid: "#9932cc",
darkred: "#8b0000",
darksalmon: "#e9967a",
darkseagreen: "#8fbc8f",
darkslateblue: "#483d8b",
darkslategray: "#2f4f4f",
darkslategrey: "#2f4f4f",
darkturquoise: "#00ced1",
darkviolet: "#9400d3",
deeppink: "#ff1493",
deepskyblue: "#00bfff",
dimgray: "#696969",
dimgrey: "#696969",
dodgerblue: "#1e90ff",
firebrick: "#b22222",
floralwhite: "#fffaf0",
forestgreen: "#228b22",
fuchsia: "#ff00ff",
gainsboro: "#dcdcdc",
ghostwhite: "#f8f8ff",
goldenrod: "#daa520",
gold: "#ffd700",
gray: "#808080",
green: "#008000",
greenyellow: "#adff2f",
grey: "#808080",
honeydew: "#f0fff0",
hotpink: "#ff69b4",
indianred: "#cd5c5c",
indigo: "#4b0082",
ivory: "#fffff0",
khaki: "#f0e68c",
lavenderblush: "#fff0f5",
lavender: "#e6e6fa",
lawngreen: "#7cfc00",
lemonchiffon: "#fffacd",
lightblue: "#add8e6",
lightcoral: "#f08080",
lightcyan: "#e0ffff",
lightgoldenrodyellow: "#fafad2",
lightgray: "#d3d3d3",
lightgreen: "#90ee90",
lightgrey: "#d3d3d3",
lightpink: "#ffb6c1",
lightsalmon: "#ffa07a",
lightseagreen: "#20b2aa",
lightskyblue: "#87cefa",
lightslategray: "#778899",
lightslategrey: "#778899",
lightsteelblue: "#b0c4de",
lightyellow: "#ffffe0",
lime: "#00ff00",
limegreen: "#32cd32",
linen: "#faf0e6",
magenta: "#ff00ff",
maroon: "#800000",
mediumaquamarine: "#66cdaa",
mediumblue: "#0000cd",
mediumorchid: "#ba55d3",
mediumpurple: "#9370db",
mediumseagreen: "#3cb371",
mediumslateblue: "#7b68ee",
mediumspringgreen: "#00fa9a",
mediumturquoise: "#48d1cc",
mediumvioletred: "#c71585",
midnightblue: "#191970",
mintcream: "#f5fffa",
mistyrose: "#ffe4e1",
moccasin: "#ffe4b5",
navajowhite: "#ffdead",
navy: "#000080",
oldlace: "#fdf5e6",
olive: "#808000",
olivedrab: "#6b8e23",
orange: "#ffa500",
orangered: "#ff4500",
orchid: "#da70d6",
palegoldenrod: "#eee8aa",
palegreen: "#98fb98",
paleturquoise: "#afeeee",
palevioletred: "#db7093",
papayawhip: "#ffefd5",
peachpuff: "#ffdab9",
peru: "#cd853f",
pink: "#ffc0cb",
plum: "#dda0dd",
powderblue: "#b0e0e6",
purple: "#800080",
rebeccapurple: "#663399",
red: "#ff0000",
rosybrown: "#bc8f8f",
royalblue: "#4169e1",
saddlebrown: "#8b4513",
salmon: "#fa8072",
sandybrown: "#f4a460",
seagreen: "#2e8b57",
seashell: "#fff5ee",
sienna: "#a0522d",
silver: "#c0c0c0",
skyblue: "#87ceeb",
slateblue: "#6a5acd",
slategray: "#708090",
slategrey: "#708090",
snow: "#fffafa",
springgreen: "#00ff7f",
steelblue: "#4682b4",
tan: "#d2b48c",
teal: "#008080",
thistle: "#d8bfd8",
tomato: "#ff6347",
turquoise: "#40e0d0",
violet: "#ee82ee",
wheat: "#f5deb3",
white: "#ffffff",
whitesmoke: "#f5f5f5",
yellow: "#ffff00",
yellowgreen: "#9acd32"
};
function inputToRGB(color2) {
var rgb = { r: 0, g: 0, b: 0 };
var a = 1;
var s = null;
var v2 = null;
var l2 = null;
var ok = false;
var format2 = false;
if (typeof color2 === "string") {
color2 = stringInputToObject(color2);
}
if (typeof color2 === "object") {
if (isValidCSSUnit(color2.r) && isValidCSSUnit(color2.g) && isValidCSSUnit(color2.b)) {
rgb = rgbToRgb(color2.r, color2.g, color2.b);
ok = true;
format2 = String(color2.r).substr(-1) === "%" ? "prgb" : "rgb";
} else if (isValidCSSUnit(color2.h) && isValidCSSUnit(color2.s) && isValidCSSUnit(color2.v)) {
s = convertToPercentage(color2.s);
v2 = convertToPercentage(color2.v);
rgb = hsvToRgb(color2.h, s, v2);
ok = true;
format2 = "hsv";
} else if (isValidCSSUnit(color2.h) && isValidCSSUnit(color2.s) && isValidCSSUnit(color2.l)) {
s = convertToPercentage(color2.s);
l2 = convertToPercentage(color2.l);
rgb = hslToRgb(color2.h, s, l2);
ok = true;
format2 = "hsl";
}
if (Object.prototype.hasOwnProperty.call(color2, "a")) {
a = color2.a;
}
}
a = boundAlpha(a);
return {
ok,
format: color2.format || format2,
r: Math.min(255, Math.max(rgb.r, 0)),
g: Math.min(255, Math.max(rgb.g, 0)),
b: Math.min(255, Math.max(rgb.b, 0)),
a
};
}
var CSS_INTEGER = "[-\\+]?\\d+%?";
var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?";
var CSS_UNIT = "(?:".concat(CSS_NUMBER, ")|(?:").concat(CSS_INTEGER, ")");
var PERMISSIVE_MATCH3 = "[\\s|\\(]+(".concat(CSS_UNIT, ")[,|\\s]+(").concat(CSS_UNIT, ")[,|\\s]+(").concat(CSS_UNIT, ")\\s*\\)?");
var PERMISSIVE_MATCH4 = "[\\s|\\(]+(".concat(CSS_UNIT, ")[,|\\s]+(").concat(CSS_UNIT, ")[,|\\s]+(").concat(CSS_UNIT, ")[,|\\s]+(").concat(CSS_UNIT, ")\\s*\\)?");
var matchers = {
CSS_UNIT: new RegExp(CSS_UNIT),
rgb: new RegExp("rgb" + PERMISSIVE_MATCH3),
rgba: new RegExp("rgba" + PERMISSIVE_MATCH4),
hsl: new RegExp("hsl" + PERMISSIVE_MATCH3),
hsla: new RegExp("hsla" + PERMISSIVE_MATCH4),
hsv: new RegExp("hsv" + PERMISSIVE_MATCH3),
hsva: new RegExp("hsva" + PERMISSIVE_MATCH4),
hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,
hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
};
function stringInputToObject(color2) {
color2 = color2.trim().toLowerCase();
if (color2.length === 0) {
return false;
}
var named = false;
if (names[color2]) {
color2 = names[color2];
named = true;
} else if (color2 === "transparent") {
return { r: 0, g: 0, b: 0, a: 0, format: "name" };
}
var match2 = matchers.rgb.exec(color2);
if (match2) {
return { r: match2[1], g: match2[2], b: match2[3] };
}
match2 = matchers.rgba.exec(color2);
if (match2) {
return { r: match2[1], g: match2[2], b: match2[3], a: match2[4] };
}
match2 = matchers.hsl.exec(color2);
if (match2) {
return { h: match2[1], s: match2[2], l: match2[3] };
}
match2 = matchers.hsla.exec(color2);
if (match2) {
return { h: match2[1], s: match2[2], l: match2[3], a: match2[4] };
}
match2 = matchers.hsv.exec(color2);
if (match2) {
return { h: match2[1], s: match2[2], v: match2[3] };
}
match2 = matchers.hsva.exec(color2);
if (match2) {
return { h: match2[1], s: match2[2], v: match2[3], a: match2[4] };
}
match2 = matchers.hex8.exec(color2);
if (match2) {
return {
r: parseIntFromHex(match2[1]),
g: parseIntFromHex(match2[2]),
b: parseIntFromHex(match2[3]),
a: convertHexToDecimal(match2[4]),
format: named ? "name" : "hex8"
};
}
match2 = matchers.hex6.exec(color2);
if (match2) {
return {
r: parseIntFromHex(match2[1]),
g: parseIntFromHex(match2[2]),
b: parseIntFromHex(match2[3]),
format: named ? "name" : "hex"
};
}
match2 = matchers.hex4.exec(color2);
if (match2) {
return {
r: parseIntFromHex(match2[1] + match2[1]),
g: parseIntFromHex(match2[2] + match2[2]),
b: parseIntFromHex(match2[3] + match2[3]),
a: convertHexToDecimal(match2[4] + match2[4]),
format: named ? "name" : "hex8"
};
}
match2 = matchers.hex3.exec(color2);
if (match2) {
return {
r: parseIntFromHex(match2[1] + match2[1]),
g: parseIntFromHex(match2[2] + match2[2]),
b: parseIntFromHex(match2[3] + match2[3]),
format: named ? "name" : "hex"
};
}
return false;
}
function isValidCSSUnit(color2) {
return Boolean(matchers.CSS_UNIT.exec(String(color2)));
}
var TinyColor = function() {
function TinyColor2(color2, opts) {
if (color2 === void 0) {
color2 = "";
}
if (opts === void 0) {
opts = {};
}
var _a;
if (color2 instanceof TinyColor2) {
return color2;
}
if (typeof color2 === "number") {
color2 = numberInputToObject(color2);
}
this.originalInput = color2;
var rgb = inputToRGB(color2);
this.originalInput = color2;
this.r = rgb.r;
this.g = rgb.g;
this.b = rgb.b;
this.a = rgb.a;
this.roundA = Math.round(100 * this.a) / 100;
this.format = (_a = opts.format) !== null && _a !== void 0 ? _a : rgb.format;
this.gradientType = opts.gradientType;
if (this.r < 1) {
this.r = Math.round(this.r);
}
if (this.g < 1) {
this.g = Math.round(this.g);
}
if (this.b < 1) {
this.b = Math.round(this.b);
}
this.isValid = rgb.ok;
}
TinyColor2.prototype.isDark = function() {
return this.getBrightness() < 128;
};
TinyColor2.prototype.isLight = function() {
return !this.isDark();
};
TinyColor2.prototype.getBrightness = function() {
var rgb = this.toRgb();
return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1e3;
};
TinyColor2.prototype.getLuminance = function() {
var rgb = this.toRgb();
var R;
var G;
var B;
var RsRGB = rgb.r / 255;
var GsRGB = rgb.g / 255;
var BsRGB = rgb.b / 255;
if (RsRGB <= 0.03928) {
R = RsRGB / 12.92;
} else {
R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);
}
if (GsRGB <= 0.03928) {
G = GsRGB / 12.92;
} else {
G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);
}
if (BsRGB <= 0.03928) {
B = BsRGB / 12.92;
} else {
B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);
}
return 0.2126 * R + 0.7152 * G + 0.0722 * B;
};
TinyColor2.prototype.getAlpha = function() {
return this.a;
};
TinyColor2.prototype.setAlpha = function(alpha) {
this.a = boundAlpha(alpha);
this.roundA = Math.round(100 * this.a) / 100;
return this;
};
TinyColor2.prototype.isMonochrome = function() {
var s = this.toHsl().s;
return s === 0;
};
TinyColor2.prototype.toHsv = function() {
var hsv = rgbToHsv(this.r, this.g, this.b);
return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this.a };
};
TinyColor2.prototype.toHsvString = function() {
var hsv = rgbToHsv(this.r, this.g, this.b);
var h2 = Math.round(hsv.h * 360);
var s = Math.round(hsv.s * 100);
var v2 = Math.round(hsv.v * 100);
return this.a === 1 ? "hsv(".concat(h2, ", ").concat(s, "%, ").concat(v2, "%)") : "hsva(".concat(h2, ", ").concat(s, "%, ").concat(v2, "%, ").concat(this.roundA, ")");
};
TinyColor2.prototype.toHsl = function() {
var hsl = rgbToHsl(this.r, this.g, this.b);
return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this.a };
};
TinyColor2.prototype.toHslString = function() {
var hsl = rgbToHsl(this.r, this.g, this.b);
var h2 = Math.round(hsl.h * 360);
var s = Math.round(hsl.s * 100);
var l2 = Math.round(hsl.l * 100);
return this.a === 1 ? "hsl(".concat(h2, ", ").concat(s, "%, ").concat(l2, "%)") : "hsla(".concat(h2, ", ").concat(s, "%, ").concat(l2, "%, ").concat(this.roundA, ")");
};
TinyColor2.prototype.toHex = function(allow3Char) {
if (allow3Char === void 0) {
allow3Char = false;
}
return rgbToHex(this.r, this.g, this.b, allow3Char);
};
TinyColor2.prototype.toHexString = function(allow3Char) {
if (allow3Char === void 0) {
allow3Char = false;
}
return "#" + this.toHex(allow3Char);
};
TinyColor2.prototype.toHex8 = function(allow4Char) {
if (allow4Char === void 0) {
allow4Char = false;
}
return rgbaToHex(this.r, this.g, this.b, this.a, allow4Char);
};
TinyColor2.prototype.toHex8String = function(allow4Char) {
if (allow4Char === void 0) {
allow4Char = false;
}
return "#" + this.toHex8(allow4Char);
};
TinyColor2.prototype.toHexShortString = function(allowShortChar) {
if (allowShortChar === void 0) {
allowShortChar = false;
}
return this.a === 1 ? this.toHexString(allowShortChar) : this.toHex8String(allowShortChar);
};
TinyColor2.prototype.toRgb = function() {
return {
r: Math.round(this.r),
g: Math.round(this.g),
b: Math.round(this.b),
a: this.a
};
};
TinyColor2.prototype.toRgbString = function() {
var r2 = Math.round(this.r);
var g2 = Math.round(this.g);
var b2 = Math.round(this.b);
return this.a === 1 ? "rgb(".concat(r2, ", ").concat(g2, ", ").concat(b2, ")") : "rgba(".concat(r2, ", ").concat(g2, ", ").concat(b2, ", ").concat(this.roundA, ")");
};
TinyColor2.prototype.toPercentageRgb = function() {
var fmt = function(x2) {
return "".concat(Math.round(bound01(x2, 255) * 100), "%");
};
return {
r: fmt(this.r),
g: fmt(this.g),
b: fmt(this.b),
a: this.a
};
};
TinyColor2.prototype.toPercentageRgbString = function() {
var rnd = function(x2) {
return Math.round(bound01(x2, 255) * 100);
};
return this.a === 1 ? "rgb(".concat(rnd(this.r), "%, ").concat(rnd(this.g), "%, ").concat(rnd(this.b), "%)") : "rgba(".concat(rnd(this.r), "%, ").concat(rnd(this.g), "%, ").concat(rnd(this.b), "%, ").concat(this.roundA, ")");
};
TinyColor2.prototype.toName = function() {
if (this.a === 0) {
return "transparent";
}
if (this.a < 1) {
return false;
}
var hex = "#" + rgbToHex(this.r, this.g, this.b, false);
for (var _i = 0, _a = Object.entries(names); _i < _a.length; _i++) {
var _b = _a[_i], key2 = _b[0], value = _b[1];
if (hex === value) {
return key2;
}
}
return false;
};
TinyColor2.prototype.toString = function(format2) {
var formatSet = Boolean(format2);
format2 = format2 !== null && format2 !== void 0 ? format2 : this.format;
var formattedString = false;
var hasAlpha = this.a < 1 && this.a >= 0;
var needsAlphaFormat = !formatSet && hasAlpha && (format2.startsWith("hex") || format2 === "name");
if (needsAlphaFormat) {
if (format2 === "name" && this.a === 0) {
return this.toName();
}
return this.toRgbString();
}
if (format2 === "rgb") {
formattedString = this.toRgbString();
}
if (format2 === "prgb") {
formattedString = this.toPercentageRgbString();
}
if (format2 === "hex" || format2 === "hex6") {
formattedString = this.toHexString();
}
if (format2 === "hex3") {
formattedString = this.toHexString(true);
}
if (format2 === "hex4") {
formattedString = this.toHex8String(true);
}
if (format2 === "hex8") {
formattedString = this.toHex8String();
}
if (format2 === "name") {
formattedString = this.toName();
}
if (format2 === "hsl") {
formattedString = this.toHslString();
}
if (format2 === "hsv") {
formattedString = this.toHsvString();
}
return formattedString || this.toHexString();
};
TinyColor2.prototype.toNumber = function() {
return (Math.round(this.r) << 16) + (Math.round(this.g) << 8) + Math.round(this.b);
};
TinyColor2.prototype.clone = function() {
return new TinyColor2(this.toString());
};
TinyColor2.prototype.lighten = function(amount) {
if (amount === void 0) {
amount = 10;
}
var hsl = this.toHsl();
hsl.l += amount / 100;
hsl.l = clamp01(hsl.l);
return new TinyColor2(hsl);
};
TinyColor2.prototype.brighten = function(amount) {
if (amount === void 0) {
amount = 10;
}
var rgb = this.toRgb();
rgb.r = Math.max(0, Math.min(255, rgb.r - Math.round(255 * -(amount / 100))));
rgb.g = Math.max(0, Math.min(255, rgb.g - Math.round(255 * -(amount / 100))));
rgb.b = Math.max(0, Math.min(255, rgb.b - Math.round(255 * -(amount / 100))));
return new TinyColor2(rgb);
};
TinyColor2.prototype.darken = function(amount) {
if (amount === void 0) {
amount = 10;
}
var hsl = this.toHsl();
hsl.l -= amount / 100;
hsl.l = clamp01(hsl.l);
return new TinyColor2(hsl);
};
TinyColor2.prototype.tint = function(amount) {
if (amount === void 0) {
amount = 10;
}
return this.mix("white", amount);
};
TinyColor2.prototype.shade = function(amount) {
if (amount === void 0) {
amount = 10;
}
return this.mix("black", amount);
};
TinyColor2.prototype.desaturate = function(amount) {
if (amount === void 0) {
amount = 10;
}
var hsl = this.toHsl();
hsl.s -= amount / 100;
hsl.s = clamp01(hsl.s);
return new TinyColor2(hsl);
};
TinyColor2.prototype.saturate = function(amount) {
if (amount === void 0) {
amount = 10;
}
var hsl = this.toHsl();
hsl.s += amount / 100;
hsl.s = clamp01(hsl.s);
return new TinyColor2(hsl);
};
TinyColor2.prototype.greyscale = function() {
return this.desaturate(100);
};
TinyColor2.prototype.spin = function(amount) {
var hsl = this.toHsl();
var hue = (hsl.h + amount) % 360;
hsl.h = hue < 0 ? 360 + hue : hue;
return new TinyColor2(hsl);
};
TinyColor2.prototype.mix = function(color2, amount) {
if (amount === void 0) {
amount = 50;
}
var rgb1 = this.toRgb();
var rgb2 = new TinyColor2(color2).toRgb();
var p2 = amount / 100;
var rgba = {
r: (rgb2.r - rgb1.r) * p2 + rgb1.r,
g: (rgb2.g - rgb1.g) * p2 + rgb1.g,
b: (rgb2.b - rgb1.b) * p2 + rgb1.b,
a: (rgb2.a - rgb1.a) * p2 + rgb1.a
};
return new TinyColor2(rgba);
};
TinyColor2.prototype.analogous = function(results, slices) {
if (results === void 0) {
results = 6;
}
if (slices === void 0) {
slices = 30;
}
var hsl = this.toHsl();
var part = 360 / slices;
var ret = [this];
for (hsl.h = (hsl.h - (part * results >> 1) + 720) % 360; --results; ) {
hsl.h = (hsl.h + part) % 360;
ret.push(new TinyColor2(hsl));
}
return ret;
};
TinyColor2.prototype.complement = function() {
var hsl = this.toHsl();
hsl.h = (hsl.h + 180) % 360;
return new TinyColor2(hsl);
};
TinyColor2.prototype.monochromatic = function(results) {
if (results === void 0) {
results = 6;
}
var hsv = this.toHsv();
var h2 = hsv.h;
var s = hsv.s;
var v2 = hsv.v;
var res = [];
var modification = 1 / results;
while (results--) {
res.push(new TinyColor2({ h: h2, s, v: v2 }));
v2 = (v2 + modification) % 1;
}
return res;
};
TinyColor2.prototype.splitcomplement = function() {
var hsl = this.toHsl();
var h2 = hsl.h;
return [
this,
new TinyColor2({ h: (h2 + 72) % 360, s: hsl.s, l: hsl.l }),
new TinyColor2({ h: (h2 + 216) % 360, s: hsl.s, l: hsl.l })
];
};
TinyColor2.prototype.onBackground = function(background) {
var fg = this.toRgb();
var bg = new TinyColor2(background).toRgb();
var alpha = fg.a + bg.a * (1 - fg.a);
return new TinyColor2({
r: (fg.r * fg.a + bg.r * bg.a * (1 - fg.a)) / alpha,
g: (fg.g * fg.a + bg.g * bg.a * (1 - fg.a)) / alpha,
b: (fg.b * fg.a + bg.b * bg.a * (1 - fg.a)) / alpha,
a: alpha
});
};
TinyColor2.prototype.triad = function() {
return this.polyad(3);
};
TinyColor2.prototype.tetrad = function() {
return this.polyad(4);
};
TinyColor2.prototype.polyad = function(n2) {
var hsl = this.toHsl();
var h2 = hsl.h;
var result = [this];
var increment = 360 / n2;
for (var i2 = 1; i2 < n2; i2++) {
result.push(new TinyColor2({ h: (h2 + i2 * increment) % 360, s: hsl.s, l: hsl.l }));
}
return result;
};
TinyColor2.prototype.equals = function(color2) {
return this.toRgbString() === new TinyColor2(color2).toRgbString();
};
return TinyColor2;
}();
var hueStep = 2;
var saturationStep = 0.16;
var saturationStep2 = 0.05;
var brightnessStep1 = 0.05;
var brightnessStep2 = 0.15;
var lightColorCount = 5;
var darkColorCount = 4;
var darkColorMap = [{
index: 7,
opacity: 0.15
}, {
index: 6,
opacity: 0.25
}, {
index: 5,
opacity: 0.3
}, {
index: 5,
opacity: 0.45
}, {
index: 5,
opacity: 0.65
}, {
index: 5,
opacity: 0.85
}, {
index: 4,
opacity: 0.9
}, {
index: 3,
opacity: 0.95
}, {
index: 2,
opacity: 0.97
}, {
index: 1,
opacity: 0.98
}];
function toHsv(_ref) {
var r2 = _ref.r, g2 = _ref.g, b2 = _ref.b;
var hsv = rgbToHsv(r2, g2, b2);
return {
h: hsv.h * 360,
s: hsv.s,
v: hsv.v
};
}
function toHex(_ref2) {
var r2 = _ref2.r, g2 = _ref2.g, b2 = _ref2.b;
return "#".concat(rgbToHex(r2, g2, b2, false));
}
function mix$1(rgb1, rgb2, amount) {
var p2 = amount / 100;
var rgb = {
r: (rgb2.r - rgb1.r) * p2 + rgb1.r,
g: (rgb2.g - rgb1.g) * p2 + rgb1.g,
b: (rgb2.b - rgb1.b) * p2 + rgb1.b
};
return rgb;
}
function getHue(hsv, i2, light) {
var hue;
if (Math.round(hsv.h) >= 60 && Math.round(hsv.h) <= 240) {
hue = light ? Math.round(hsv.h) - hueStep * i2 : Math.round(hsv.h) + hueStep * i2;
} else {
hue = light ? Math.round(hsv.h) + hueStep * i2 : Math.round(hsv.h) - hueStep * i2;
}
if (hue < 0) {
hue += 360;
} else if (hue >= 360) {
hue -= 360;
}
return hue;
}
function getSaturation(hsv, i2, light) {
if (hsv.h === 0 && hsv.s === 0) {
return hsv.s;
}
var saturation;
if (light) {
saturation = hsv.s - saturationStep * i2;
} else if (i2 === darkColorCount) {
saturation = hsv.s + saturationStep;
} else {
saturation = hsv.s + saturationStep2 * i2;
}
if (saturation > 1) {
saturation = 1;
}
if (light && i2 === lightColorCount && saturation > 0.1) {
saturation = 0.1;
}
if (saturation < 0.06) {
saturation = 0.06;
}
return Number(saturation.toFixed(2));
}
function getValue$4(hsv, i2, light) {
var value;
if (light) {
value = hsv.v + brightnessStep1 * i2;
} else {
value = hsv.v - brightnessStep2 * i2;
}
if (value > 1) {
value = 1;
}
return Number(value.toFixed(2));
}
function generate$1(color2) {
var opts = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var patterns = [];
var pColor = inputToRGB(color2);
for (var i2 = lightColorCount; i2 > 0; i2 -= 1) {
var hsv = toHsv(pColor);
var colorString2 = toHex(inputToRGB({
h: getHue(hsv, i2, true),
s: getSaturation(hsv, i2, true),
v: getValue$4(hsv, i2, true)
}));
patterns.push(colorString2);
}
patterns.push(toHex(pColor));
for (var _i = 1; _i <= darkColorCount; _i += 1) {
var _hsv = toHsv(pColor);
var _colorString = toHex(inputToRGB({
h: getHue(_hsv, _i),
s: getSaturation(_hsv, _i),
v: getValue$4(_hsv, _i)
}));
patterns.push(_colorString);
}
if (opts.theme === "dark") {
return darkColorMap.map(function(_ref3) {
var index2 = _ref3.index, opacity = _ref3.opacity;
var darkColorString = toHex(mix$1(inputToRGB(opts.backgroundColor || "#141414"), inputToRGB(patterns[index2]), opacity * 100));
return darkColorString;
});
}
return patterns;
}
var presetPrimaryColors = {
red: "#F5222D",
volcano: "#FA541C",
orange: "#FA8C16",
gold: "#FAAD14",
yellow: "#FADB14",
lime: "#A0D911",
green: "#52C41A",
cyan: "#13C2C2",
blue: "#1890FF",
geekblue: "#2F54EB",
purple: "#722ED1",
magenta: "#EB2F96",
grey: "#666666"
};
var presetPalettes = {};
var presetDarkPalettes = {};
Object.keys(presetPrimaryColors).forEach(function(key2) {
presetPalettes[key2] = generate$1(presetPrimaryColors[key2]);
presetPalettes[key2].primary = presetPalettes[key2][5];
presetDarkPalettes[key2] = generate$1(presetPrimaryColors[key2], {
theme: "dark",
backgroundColor: "#141414"
});
presetDarkPalettes[key2].primary = presetDarkPalettes[key2][5];
});
var red = presetPalettes.red;
var volcano = presetPalettes.volcano;
var gold = presetPalettes.gold;
var orange = presetPalettes.orange;
var yellow = presetPalettes.yellow;
var lime = presetPalettes.lime;
var green = presetPalettes.green;
var cyan = presetPalettes.cyan;
var blue = presetPalettes.blue;
var geekblue = presetPalettes.geekblue;
var purple = presetPalettes.purple;
var magenta = presetPalettes.magenta;
var grey = presetPalettes.grey;
const index_esm = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
blue,
cyan,
geekblue,
generate: generate$1,
gold,
green,
grey,
lime,
magenta,
orange,
presetDarkPalettes,
presetPalettes,
presetPrimaryColors,
purple,
red,
volcano,
yellow
}, Symbol.toStringTag, { value: "Module" }));
function canUseDom$1() {
return !!(typeof window !== "undefined" && window.document && window.document.createElement);
}
function contains$2(root2, n2) {
if (!root2) {
return false;
}
if (root2.contains) {
return root2.contains(n2);
}
var node = n2;
while (node) {
if (node === root2) {
return true;
}
node = node.parentNode;
}
return false;
}
var APPEND_ORDER = "data-rc-order";
var MARK_KEY = "rc-util-key";
var containerCache = /* @__PURE__ */ new Map();
function getMark() {
var _ref = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, mark = _ref.mark;
if (mark) {
return mark.startsWith("data-") ? mark : "data-".concat(mark);
}
return MARK_KEY;
}
function getContainer$1(option) {
if (option.attachTo) {
return option.attachTo;
}
var head = document.querySelector("head");
return head || document.body;
}
function getOrder(prepend) {
if (prepend === "queue") {
return "prependQueue";
}
return prepend ? "prepend" : "append";
}
function findStyles(container) {
return Array.from((containerCache.get(container) || container).children).filter(function(node) {
return node.tagName === "STYLE";
});
}
function injectCSS(css2) {
var option = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
if (!canUseDom$1()) {
return null;
}
var csp = option.csp, prepend = option.prepend;
var styleNode = document.createElement("style");
styleNode.setAttribute(APPEND_ORDER, getOrder(prepend));
if (csp !== null && csp !== void 0 && csp.nonce) {
styleNode.nonce = csp === null || csp === void 0 ? void 0 : csp.nonce;
}
styleNode.innerHTML = css2;
var container = getContainer$1(option);
var firstChild = container.firstChild;
if (prepend) {
if (prepend === "queue") {
var existStyle = findStyles(container).filter(function(node) {
return ["prepend", "prependQueue"].includes(node.getAttribute(APPEND_ORDER));
});
if (existStyle.length) {
container.insertBefore(styleNode, existStyle[existStyle.length - 1].nextSibling);
return styleNode;
}
}
container.insertBefore(styleNode, firstChild);
} else {
container.appendChild(styleNode);
}
return styleNode;
}
function findExistNode(key2) {
var option = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var container = getContainer$1(option);
return findStyles(container).find(function(node) {
return node.getAttribute(getMark(option)) === key2;
});
}
function removeCSS(key2) {
var option = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var existNode = findExistNode(key2, option);
if (existNode) {
var container = getContainer$1(option);
container.removeChild(existNode);
}
}
function syncRealContainer(container, option) {
var cachedRealContainer = containerCache.get(container);
if (!cachedRealContainer || !contains$2(document, cachedRealContainer)) {
var placeholderStyle = injectCSS("", option);
var parentNode = placeholderStyle.parentNode;
containerCache.set(container, parentNode);
container.removeChild(placeholderStyle);
}
}
function updateCSS(css2, key2) {
var option = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
var container = getContainer$1(option);
syncRealContainer(container, option);
var existNode = findExistNode(key2, option);
if (existNode) {
var _option$csp, _option$csp2;
if ((_option$csp = option.csp) !== null && _option$csp !== void 0 && _option$csp.nonce && existNode.nonce !== ((_option$csp2 = option.csp) === null || _option$csp2 === void 0 ? void 0 : _option$csp2.nonce)) {
var _option$csp3;
existNode.nonce = (_option$csp3 = option.csp) === null || _option$csp3 === void 0 ? void 0 : _option$csp3.nonce;
}
if (existNode.innerHTML !== css2) {
existNode.innerHTML = css2;
}
return existNode;
}
var newNode = injectCSS(css2, option);
newNode.setAttribute(getMark(option), key2);
return newNode;
}
function warning$1(valid, message) {
warningOnce(valid, "[@ant-design/icons] ".concat(message));
}
function isIconDefinition(target) {
return _typeof$q(target) === "object" && typeof target.name === "string" && typeof target.theme === "string" && (_typeof$q(target.icon) === "object" || typeof target.icon === "function");
}
function normalizeAttrs() {
var attrs = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
return Object.keys(attrs).reduce(function(acc, key2) {
var val = attrs[key2];
switch (key2) {
case "class":
acc.className = val;
delete acc.class;
break;
default:
acc[key2] = val;
}
return acc;
}, {});
}
function generate(node, key2, rootProps) {
if (!rootProps) {
return /* @__PURE__ */ React__default.default.createElement(node.tag, _objectSpread2$a({
key: key2
}, normalizeAttrs(node.attrs)), (node.children || []).map(function(child, index2) {
return generate(child, "".concat(key2, "-").concat(node.tag, "-").concat(index2));
}));
}
return /* @__PURE__ */ React__default.default.createElement(node.tag, _objectSpread2$a(_objectSpread2$a({
key: key2
}, normalizeAttrs(node.attrs)), rootProps), (node.children || []).map(function(child, index2) {
return generate(child, "".concat(key2, "-").concat(node.tag, "-").concat(index2));
}));
}
function getSecondaryColor(primaryColor) {
return generate$1(primaryColor)[0];
}
function normalizeTwoToneColors(twoToneColor) {
if (!twoToneColor) {
return [];
}
return Array.isArray(twoToneColor) ? twoToneColor : [twoToneColor];
}
var iconStyles = "\n.anticon {\n display: inline-block;\n color: inherit;\n font-style: normal;\n line-height: 0;\n text-align: center;\n text-transform: none;\n vertical-align: -0.125em;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.anticon > * {\n line-height: 1;\n}\n\n.anticon svg {\n display: inline-block;\n}\n\n.anticon::before {\n display: none;\n}\n\n.anticon .anticon-icon {\n display: block;\n}\n\n.anticon[tabindex] {\n cursor: pointer;\n}\n\n.anticon-spin::before,\n.anticon-spin {\n display: inline-block;\n -webkit-animation: loadingCircle 1s infinite linear;\n animation: loadingCircle 1s infinite linear;\n}\n\n@-webkit-keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n@keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n";
var useInsertStyles = function useInsertStyles2() {
var styleStr = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : iconStyles;
var _useContext = React$a.useContext(IconContext$1), csp = _useContext.csp;
React$a.useEffect(function() {
updateCSS(styleStr, "@ant-design-icons", {
prepend: true,
csp
});
}, []);
};
var _excluded$N = ["icon", "className", "onClick", "style", "primaryColor", "secondaryColor"];
var twoToneColorPalette = {
primaryColor: "#333",
secondaryColor: "#E6E6E6",
calculated: false
};
function setTwoToneColors(_ref) {
var primaryColor = _ref.primaryColor, secondaryColor = _ref.secondaryColor;
twoToneColorPalette.primaryColor = primaryColor;
twoToneColorPalette.secondaryColor = secondaryColor || getSecondaryColor(primaryColor);
twoToneColorPalette.calculated = !!secondaryColor;
}
function getTwoToneColors() {
return _objectSpread2$a({}, twoToneColorPalette);
}
var IconBase$1 = function IconBase2(props) {
var icon = props.icon, className = props.className, onClick = props.onClick, style2 = props.style, primaryColor = props.primaryColor, secondaryColor = props.secondaryColor, restProps = _objectWithoutProperties$1(props, _excluded$N);
var colors = twoToneColorPalette;
if (primaryColor) {
colors = {
primaryColor,
secondaryColor: secondaryColor || getSecondaryColor(primaryColor)
};
}
useInsertStyles();
warning$1(isIconDefinition(icon), "icon should be icon definiton, but got ".concat(icon));
if (!isIconDefinition(icon)) {
return null;
}
var target = icon;
if (target && typeof target.icon === "function") {
target = _objectSpread2$a(_objectSpread2$a({}, target), {}, {
icon: target.icon(colors.primaryColor, colors.secondaryColor)
});
}
return generate(target.icon, "svg-".concat(target.name), _objectSpread2$a({
className,
onClick,
style: style2,
"data-icon": target.name,
width: "1em",
height: "1em",
fill: "currentColor",
"aria-hidden": "true"
}, restProps));
};
IconBase$1.displayName = "IconReact";
IconBase$1.getTwoToneColors = getTwoToneColors;
IconBase$1.setTwoToneColors = setTwoToneColors;
const ReactIcon = IconBase$1;
function setTwoToneColor(twoToneColor) {
var _normalizeTwoToneColo = normalizeTwoToneColors(twoToneColor), _normalizeTwoToneColo2 = _slicedToArray$e(_normalizeTwoToneColo, 2), primaryColor = _normalizeTwoToneColo2[0], secondaryColor = _normalizeTwoToneColo2[1];
return ReactIcon.setTwoToneColors({
primaryColor,
secondaryColor
});
}
function getTwoToneColor() {
var colors = ReactIcon.getTwoToneColors();
if (!colors.calculated) {
return colors.primaryColor;
}
return [colors.primaryColor, colors.secondaryColor];
}
var _excluded$M = ["className", "icon", "spin", "rotate", "tabIndex", "onClick", "twoToneColor"];
setTwoToneColor("#1890ff");
var Icon$1 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames;
var className = props.className, icon = props.icon, spin = props.spin, rotate = props.rotate, tabIndex = props.tabIndex, onClick = props.onClick, twoToneColor = props.twoToneColor, restProps = _objectWithoutProperties$1(props, _excluded$M);
var _React$useContext = React__namespace.useContext(IconContext$1), _React$useContext$pre = _React$useContext.prefixCls, prefixCls = _React$useContext$pre === void 0 ? "anticon" : _React$useContext$pre, rootClassName = _React$useContext.rootClassName;
var classString = classnames(rootClassName, prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(icon.name), !!icon.name), _defineProperty$b(_classNames, "".concat(prefixCls, "-spin"), !!spin || icon.name === "loading"), _classNames), className);
var iconTabIndex = tabIndex;
if (iconTabIndex === void 0 && onClick) {
iconTabIndex = -1;
}
var svgStyle = rotate ? {
msTransform: "rotate(".concat(rotate, "deg)"),
transform: "rotate(".concat(rotate, "deg)")
} : void 0;
var _normalizeTwoToneColo = normalizeTwoToneColors(twoToneColor), _normalizeTwoToneColo2 = _slicedToArray$e(_normalizeTwoToneColo, 2), primaryColor = _normalizeTwoToneColo2[0], secondaryColor = _normalizeTwoToneColo2[1];
return /* @__PURE__ */ jsx("span", {
..._objectSpread2$a(_objectSpread2$a({
role: "img",
"aria-label": icon.name
}, restProps), {}, {
ref,
tabIndex: iconTabIndex,
onClick,
className: classString
}),
children: /* @__PURE__ */ jsx(ReactIcon, {
icon,
primaryColor,
secondaryColor,
style: svgStyle
})
});
});
Icon$1.displayName = "AntdIcon";
Icon$1.getTwoToneColor = getTwoToneColor;
Icon$1.setTwoToneColor = setTwoToneColor;
const AntdIcon$1 = Icon$1;
var CheckCircleFilled = function CheckCircleFilled2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: CheckCircleFilledSvg
})
});
};
CheckCircleFilled.displayName = "CheckCircleFilled";
const CheckCircleFilled$1 = /* @__PURE__ */ React__namespace.forwardRef(CheckCircleFilled);
var CloseCircleFilled$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm165.4 618.2l-66-.3L512 563.4l-99.3 118.4-66.1.3c-4.4 0-8-3.5-8-8 0-1.9.7-3.7 1.9-5.2l130.1-155L340.5 359a8.32 8.32 0 01-1.9-5.2c0-4.4 3.6-8 8-8l66.1.3L512 464.6l99.3-118.4 66-.3c4.4 0 8 3.5 8 8 0 1.9-.7 3.7-1.9 5.2L553.5 514l130 155c1.2 1.5 1.9 3.3 1.9 5.2 0 4.4-3.6 8-8 8z" } }] }, "name": "close-circle", "theme": "filled" };
const CloseCircleFilledSvg = CloseCircleFilled$2;
var CloseCircleFilled = function CloseCircleFilled2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: CloseCircleFilledSvg
})
});
};
CloseCircleFilled.displayName = "CloseCircleFilled";
const CloseCircleFilled$1 = /* @__PURE__ */ React__namespace.forwardRef(CloseCircleFilled);
var ExclamationCircleFilled$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm-32 232c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V296zm32 440a48.01 48.01 0 010-96 48.01 48.01 0 010 96z" } }] }, "name": "exclamation-circle", "theme": "filled" };
const ExclamationCircleFilledSvg = ExclamationCircleFilled$2;
var ExclamationCircleFilled = function ExclamationCircleFilled2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: ExclamationCircleFilledSvg
})
});
};
ExclamationCircleFilled.displayName = "ExclamationCircleFilled";
const ExclamationCircleFilled$1 = /* @__PURE__ */ React__namespace.forwardRef(ExclamationCircleFilled);
var InfoCircleFilled$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm32 664c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V456c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272zm-32-344a48.01 48.01 0 010-96 48.01 48.01 0 010 96z" } }] }, "name": "info-circle", "theme": "filled" };
const InfoCircleFilledSvg = InfoCircleFilled$2;
var InfoCircleFilled = function InfoCircleFilled2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: InfoCircleFilledSvg
})
});
};
InfoCircleFilled.displayName = "InfoCircleFilled";
const InfoCircleFilled$1 = /* @__PURE__ */ React__namespace.forwardRef(InfoCircleFilled);
var LoadingOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "0 0 1024 1024", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M988 548c-19.9 0-36-16.1-36-36 0-59.4-11.6-117-34.6-171.3a440.45 440.45 0 00-94.3-139.9 437.71 437.71 0 00-139.9-94.3C629 83.6 571.4 72 512 72c-19.9 0-36-16.1-36-36s16.1-36 36-36c69.1 0 136.2 13.5 199.3 40.3C772.3 66 827 103 874 150c47 47 83.9 101.8 109.7 162.7 26.7 63.1 40.2 130.2 40.2 199.3.1 19.9-16 36-35.9 36z" } }] }, "name": "loading", "theme": "outlined" };
const LoadingOutlinedSvg = LoadingOutlined$2;
var LoadingOutlined = function LoadingOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: LoadingOutlinedSvg
})
});
};
LoadingOutlined.displayName = "LoadingOutlined";
const LoadingOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(LoadingOutlined);
var fullClone = _objectSpread2$a({}, ReactDOM__namespace);
var version = fullClone.version, reactRender = fullClone.render, unmountComponentAtNode = fullClone.unmountComponentAtNode;
var createRoot;
try {
var mainVersion = Number((version || "").split(".")[0]);
if (mainVersion >= 18) {
createRoot = fullClone.createRoot;
}
} catch (e2) {
}
function toggleWarning(skip) {
var __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = fullClone.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
if (__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED && _typeof$q(__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED) === "object") {
__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint = skip;
}
}
var MARK = "__rc_react_root__";
function modernRender(node, container) {
toggleWarning(true);
var root2 = container[MARK] || createRoot(container);
toggleWarning(false);
root2.render(node);
container[MARK] = root2;
}
function legacyRender(node, container) {
reactRender(node, container);
}
function render(node, container) {
if (createRoot) {
modernRender(node, container);
return;
}
legacyRender(node, container);
}
function modernUnmount(_x) {
return _modernUnmount.apply(this, arguments);
}
function _modernUnmount() {
_modernUnmount = _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime$3().mark(function _callee(container) {
return _regeneratorRuntime$3().wrap(function _callee$(_context) {
while (1)
switch (_context.prev = _context.next) {
case 0:
return _context.abrupt("return", Promise.resolve().then(function() {
var _container$MARK;
(_container$MARK = container[MARK]) === null || _container$MARK === void 0 ? void 0 : _container$MARK.unmount();
delete container[MARK];
}));
case 1:
case "end":
return _context.stop();
}
}, _callee);
}));
return _modernUnmount.apply(this, arguments);
}
function legacyUnmount(container) {
unmountComponentAtNode(container);
}
function unmount(_x2) {
return _unmount.apply(this, arguments);
}
function _unmount() {
_unmount = _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime$3().mark(function _callee2(container) {
return _regeneratorRuntime$3().wrap(function _callee2$(_context2) {
while (1)
switch (_context2.prev = _context2.next) {
case 0:
if (!(createRoot !== void 0)) {
_context2.next = 2;
break;
}
return _context2.abrupt("return", modernUnmount(container));
case 2:
legacyUnmount(container);
case 3:
case "end":
return _context2.stop();
}
}, _callee2);
}));
return _unmount.apply(this, arguments);
}
var Context$1 = /* @__PURE__ */ React__namespace.createContext({});
var DomWrapper = /* @__PURE__ */ function(_React$Component) {
_inherits(DomWrapper2, _React$Component);
var _super = _createSuper(DomWrapper2);
function DomWrapper2() {
_classCallCheck(this, DomWrapper2);
return _super.apply(this, arguments);
}
_createClass(DomWrapper2, [{
key: "render",
value: function render2() {
return this.props.children;
}
}]);
return DomWrapper2;
}(React__namespace.Component);
function useSafeState(defaultValue) {
var destroyRef = React__namespace.useRef(false);
var _React$useState = React__namespace.useState(defaultValue), _React$useState2 = _slicedToArray$e(_React$useState, 2), value = _React$useState2[0], setValue2 = _React$useState2[1];
React__namespace.useEffect(function() {
destroyRef.current = false;
return function() {
destroyRef.current = true;
};
}, []);
function safeSetState(updater, ignoreDestroy) {
if (ignoreDestroy && destroyRef.current) {
return;
}
setValue2(updater);
}
return [value, safeSetState];
}
var STATUS_NONE = "none";
var STATUS_APPEAR = "appear";
var STATUS_ENTER = "enter";
var STATUS_LEAVE = "leave";
var STEP_NONE = "none";
var STEP_PREPARE = "prepare";
var STEP_START = "start";
var STEP_ACTIVE = "active";
var STEP_ACTIVATED = "end";
var STEP_PREPARED = "prepared";
function makePrefixMap(styleProp, eventName) {
var prefixes2 = {};
prefixes2[styleProp.toLowerCase()] = eventName.toLowerCase();
prefixes2["Webkit".concat(styleProp)] = "webkit".concat(eventName);
prefixes2["Moz".concat(styleProp)] = "moz".concat(eventName);
prefixes2["ms".concat(styleProp)] = "MS".concat(eventName);
prefixes2["O".concat(styleProp)] = "o".concat(eventName.toLowerCase());
return prefixes2;
}
function getVendorPrefixes(domSupport, win) {
var prefixes2 = {
animationend: makePrefixMap("Animation", "AnimationEnd"),
transitionend: makePrefixMap("Transition", "TransitionEnd")
};
if (domSupport) {
if (!("AnimationEvent" in win)) {
delete prefixes2.animationend.animation;
}
if (!("TransitionEvent" in win)) {
delete prefixes2.transitionend.transition;
}
}
return prefixes2;
}
var vendorPrefixes = getVendorPrefixes(canUseDom$1(), typeof window !== "undefined" ? window : {});
var style = {};
if (canUseDom$1()) {
var _document$createEleme = document.createElement("div");
style = _document$createEleme.style;
}
var prefixedEventNames = {};
function getVendorPrefixedEventName(eventName) {
if (prefixedEventNames[eventName]) {
return prefixedEventNames[eventName];
}
var prefixMap = vendorPrefixes[eventName];
if (prefixMap) {
var stylePropList = Object.keys(prefixMap);
var len = stylePropList.length;
for (var i2 = 0; i2 < len; i2 += 1) {
var styleProp = stylePropList[i2];
if (Object.prototype.hasOwnProperty.call(prefixMap, styleProp) && styleProp in style) {
prefixedEventNames[eventName] = prefixMap[styleProp];
return prefixedEventNames[eventName];
}
}
}
return "";
}
var internalAnimationEndName = getVendorPrefixedEventName("animationend");
var internalTransitionEndName = getVendorPrefixedEventName("transitionend");
var supportTransition = !!(internalAnimationEndName && internalTransitionEndName);
var animationEndName = internalAnimationEndName || "animationend";
var transitionEndName = internalTransitionEndName || "transitionend";
function getTransitionName$2(transitionName2, transitionType) {
if (!transitionName2)
return null;
if (_typeof$q(transitionName2) === "object") {
var type2 = transitionType.replace(/-\w/g, function(match2) {
return match2[1].toUpperCase();
});
return transitionName2[type2];
}
return "".concat(transitionName2, "-").concat(transitionType);
}
const useDomMotionEvents = function(callback) {
var cacheElementRef = React$a.useRef();
var callbackRef = React$a.useRef(callback);
callbackRef.current = callback;
var onInternalMotionEnd = React__namespace.useCallback(function(event) {
callbackRef.current(event);
}, []);
function removeMotionEvents(element) {
if (element) {
element.removeEventListener(transitionEndName, onInternalMotionEnd);
element.removeEventListener(animationEndName, onInternalMotionEnd);
}
}
function patchMotionEvents(element) {
if (cacheElementRef.current && cacheElementRef.current !== element) {
removeMotionEvents(cacheElementRef.current);
}
if (element && element !== cacheElementRef.current) {
element.addEventListener(transitionEndName, onInternalMotionEnd);
element.addEventListener(animationEndName, onInternalMotionEnd);
cacheElementRef.current = element;
}
}
React__namespace.useEffect(function() {
return function() {
removeMotionEvents(cacheElementRef.current);
};
}, []);
return [patchMotionEvents, removeMotionEvents];
};
var useIsomorphicLayoutEffect = canUseDom$1() ? React$a.useLayoutEffect : React$a.useEffect;
var raf = function raf2(callback) {
return +setTimeout(callback, 16);
};
var caf = function caf2(num) {
return clearTimeout(num);
};
if (typeof window !== "undefined" && "requestAnimationFrame" in window) {
raf = function raf2(callback) {
return window.requestAnimationFrame(callback);
};
caf = function caf2(handle) {
return window.cancelAnimationFrame(handle);
};
}
var rafUUID = 0;
var rafIds = /* @__PURE__ */ new Map();
function cleanup(id2) {
rafIds.delete(id2);
}
var wrapperRaf$1 = function wrapperRaf2(callback) {
var times = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 1;
rafUUID += 1;
var id2 = rafUUID;
function callRef(leftTimes) {
if (leftTimes === 0) {
cleanup(id2);
callback();
} else {
var realId = raf(function() {
callRef(leftTimes - 1);
});
rafIds.set(id2, realId);
}
}
callRef(times);
return id2;
};
wrapperRaf$1.cancel = function(id2) {
var realId = rafIds.get(id2);
cleanup(realId);
return caf(realId);
};
const useNextFrame = function() {
var nextFrameRef = React__namespace.useRef(null);
function cancelNextFrame() {
wrapperRaf$1.cancel(nextFrameRef.current);
}
function nextFrame(callback) {
var delay = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 2;
cancelNextFrame();
var nextFrameId = wrapperRaf$1(function() {
if (delay <= 1) {
callback({
isCanceled: function isCanceled() {
return nextFrameId !== nextFrameRef.current;
}
});
} else {
nextFrame(callback, delay - 1);
}
});
nextFrameRef.current = nextFrameId;
}
React__namespace.useEffect(function() {
return function() {
cancelNextFrame();
};
}, []);
return [nextFrame, cancelNextFrame];
};
var FULL_STEP_QUEUE = [STEP_PREPARE, STEP_START, STEP_ACTIVE, STEP_ACTIVATED];
var SIMPLE_STEP_QUEUE = [STEP_PREPARE, STEP_PREPARED];
var SkipStep = false;
var DoStep = true;
function isActive(step2) {
return step2 === STEP_ACTIVE || step2 === STEP_ACTIVATED;
}
const useStepQueue = function(status, prepareOnly, callback) {
var _useState = useSafeState(STEP_NONE), _useState2 = _slicedToArray$e(_useState, 2), step2 = _useState2[0], setStep = _useState2[1];
var _useNextFrame = useNextFrame(), _useNextFrame2 = _slicedToArray$e(_useNextFrame, 2), nextFrame = _useNextFrame2[0], cancelNextFrame = _useNextFrame2[1];
function startQueue() {
setStep(STEP_PREPARE, true);
}
var STEP_QUEUE = prepareOnly ? SIMPLE_STEP_QUEUE : FULL_STEP_QUEUE;
useIsomorphicLayoutEffect(function() {
if (step2 !== STEP_NONE && step2 !== STEP_ACTIVATED) {
var index2 = STEP_QUEUE.indexOf(step2);
var nextStep = STEP_QUEUE[index2 + 1];
var result = callback(step2);
if (result === SkipStep) {
setStep(nextStep, true);
} else if (nextStep) {
nextFrame(function(info) {
function doNext() {
if (info.isCanceled())
return;
setStep(nextStep, true);
}
if (result === true) {
doNext();
} else {
Promise.resolve(result).then(doNext);
}
});
}
}
}, [status, step2]);
React__namespace.useEffect(function() {
return function() {
cancelNextFrame();
};
}, []);
return [startQueue, step2];
};
function useStatus(supportMotion, visible, getElement2, _ref) {
var _ref$motionEnter = _ref.motionEnter, motionEnter = _ref$motionEnter === void 0 ? true : _ref$motionEnter, _ref$motionAppear = _ref.motionAppear, motionAppear = _ref$motionAppear === void 0 ? true : _ref$motionAppear, _ref$motionLeave = _ref.motionLeave, motionLeave = _ref$motionLeave === void 0 ? true : _ref$motionLeave, motionDeadline = _ref.motionDeadline, motionLeaveImmediately = _ref.motionLeaveImmediately, onAppearPrepare = _ref.onAppearPrepare, onEnterPrepare = _ref.onEnterPrepare, onLeavePrepare = _ref.onLeavePrepare, onAppearStart = _ref.onAppearStart, onEnterStart = _ref.onEnterStart, onLeaveStart = _ref.onLeaveStart, onAppearActive = _ref.onAppearActive, onEnterActive = _ref.onEnterActive, onLeaveActive = _ref.onLeaveActive, onAppearEnd = _ref.onAppearEnd, onEnterEnd = _ref.onEnterEnd, onLeaveEnd = _ref.onLeaveEnd, onVisibleChanged = _ref.onVisibleChanged;
var _useState = useSafeState(), _useState2 = _slicedToArray$e(_useState, 2), asyncVisible = _useState2[0], setAsyncVisible = _useState2[1];
var _useState3 = useSafeState(STATUS_NONE), _useState4 = _slicedToArray$e(_useState3, 2), status = _useState4[0], setStatus = _useState4[1];
var _useState5 = useSafeState(null), _useState6 = _slicedToArray$e(_useState5, 2), style2 = _useState6[0], setStyle = _useState6[1];
var mountedRef = React$a.useRef(false);
var deadlineRef = React$a.useRef(null);
function getDomElement() {
return getElement2();
}
var activeRef = React$a.useRef(false);
function updateMotionEndStatus() {
setStatus(STATUS_NONE, true);
setStyle(null, true);
}
function onInternalMotionEnd(event) {
var element = getDomElement();
if (event && !event.deadline && event.target !== element) {
return;
}
var currentActive = activeRef.current;
var canEnd;
if (status === STATUS_APPEAR && currentActive) {
canEnd = onAppearEnd === null || onAppearEnd === void 0 ? void 0 : onAppearEnd(element, event);
} else if (status === STATUS_ENTER && currentActive) {
canEnd = onEnterEnd === null || onEnterEnd === void 0 ? void 0 : onEnterEnd(element, event);
} else if (status === STATUS_LEAVE && currentActive) {
canEnd = onLeaveEnd === null || onLeaveEnd === void 0 ? void 0 : onLeaveEnd(element, event);
}
if (status !== STATUS_NONE && currentActive && canEnd !== false) {
updateMotionEndStatus();
}
}
var _useDomMotionEvents = useDomMotionEvents(onInternalMotionEnd), _useDomMotionEvents2 = _slicedToArray$e(_useDomMotionEvents, 1), patchMotionEvents = _useDomMotionEvents2[0];
var getEventHandlers = function getEventHandlers2(targetStatus) {
var _ref2, _ref3, _ref4;
switch (targetStatus) {
case STATUS_APPEAR:
return _ref2 = {}, _defineProperty$b(_ref2, STEP_PREPARE, onAppearPrepare), _defineProperty$b(_ref2, STEP_START, onAppearStart), _defineProperty$b(_ref2, STEP_ACTIVE, onAppearActive), _ref2;
case STATUS_ENTER:
return _ref3 = {}, _defineProperty$b(_ref3, STEP_PREPARE, onEnterPrepare), _defineProperty$b(_ref3, STEP_START, onEnterStart), _defineProperty$b(_ref3, STEP_ACTIVE, onEnterActive), _ref3;
case STATUS_LEAVE:
return _ref4 = {}, _defineProperty$b(_ref4, STEP_PREPARE, onLeavePrepare), _defineProperty$b(_ref4, STEP_START, onLeaveStart), _defineProperty$b(_ref4, STEP_ACTIVE, onLeaveActive), _ref4;
default:
return {};
}
};
var eventHandlers = React__namespace.useMemo(function() {
return getEventHandlers(status);
}, [status]);
var _useStepQueue = useStepQueue(status, !supportMotion, function(newStep) {
if (newStep === STEP_PREPARE) {
var onPrepare = eventHandlers[STEP_PREPARE];
if (!onPrepare) {
return SkipStep;
}
return onPrepare(getDomElement());
}
if (step2 in eventHandlers) {
var _eventHandlers$step;
setStyle(((_eventHandlers$step = eventHandlers[step2]) === null || _eventHandlers$step === void 0 ? void 0 : _eventHandlers$step.call(eventHandlers, getDomElement(), null)) || null);
}
if (step2 === STEP_ACTIVE) {
patchMotionEvents(getDomElement());
if (motionDeadline > 0) {
clearTimeout(deadlineRef.current);
deadlineRef.current = setTimeout(function() {
onInternalMotionEnd({
deadline: true
});
}, motionDeadline);
}
}
if (step2 === STEP_PREPARED) {
updateMotionEndStatus();
}
return DoStep;
}), _useStepQueue2 = _slicedToArray$e(_useStepQueue, 2), startStep = _useStepQueue2[0], step2 = _useStepQueue2[1];
var active = isActive(step2);
activeRef.current = active;
useIsomorphicLayoutEffect(function() {
setAsyncVisible(visible);
var isMounted = mountedRef.current;
mountedRef.current = true;
var nextStatus;
if (!isMounted && visible && motionAppear) {
nextStatus = STATUS_APPEAR;
}
if (isMounted && visible && motionEnter) {
nextStatus = STATUS_ENTER;
}
if (isMounted && !visible && motionLeave || !isMounted && motionLeaveImmediately && !visible && motionLeave) {
nextStatus = STATUS_LEAVE;
}
var nextEventHandlers = getEventHandlers(nextStatus);
if (nextStatus && (supportMotion || nextEventHandlers[STEP_PREPARE])) {
setStatus(nextStatus);
startStep();
} else {
setStatus(STATUS_NONE);
}
}, [visible]);
React$a.useEffect(function() {
if (status === STATUS_APPEAR && !motionAppear || status === STATUS_ENTER && !motionEnter || status === STATUS_LEAVE && !motionLeave) {
setStatus(STATUS_NONE);
}
}, [motionAppear, motionEnter, motionLeave]);
React$a.useEffect(function() {
return function() {
mountedRef.current = false;
clearTimeout(deadlineRef.current);
};
}, []);
var firstMountChangeRef = React__namespace.useRef(false);
React$a.useEffect(function() {
if (asyncVisible) {
firstMountChangeRef.current = true;
}
if (asyncVisible !== void 0 && status === STATUS_NONE) {
if (firstMountChangeRef.current || asyncVisible) {
onVisibleChanged === null || onVisibleChanged === void 0 ? void 0 : onVisibleChanged(asyncVisible);
}
firstMountChangeRef.current = true;
}
}, [asyncVisible, status]);
var mergedStyle = style2;
if (eventHandlers[STEP_PREPARE] && step2 === STEP_START) {
mergedStyle = _objectSpread2$a({
transition: "none"
}, mergedStyle);
}
return [status, step2, mergedStyle, asyncVisible !== null && asyncVisible !== void 0 ? asyncVisible : visible];
}
function genCSSMotion(config) {
var transitionSupport = config;
if (_typeof$q(config) === "object") {
transitionSupport = config.transitionSupport;
}
function isSupportTransition(props, contextMotion) {
return !!(props.motionName && transitionSupport && contextMotion !== false);
}
var CSSMotion2 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _props$visible = props.visible, visible = _props$visible === void 0 ? true : _props$visible, _props$removeOnLeave = props.removeOnLeave, removeOnLeave = _props$removeOnLeave === void 0 ? true : _props$removeOnLeave, forceRender = props.forceRender, children = props.children, motionName = props.motionName, leavedClassName = props.leavedClassName, eventProps = props.eventProps;
var _React$useContext = React__namespace.useContext(Context$1), contextMotion = _React$useContext.motion;
var supportMotion = isSupportTransition(props, contextMotion);
var nodeRef = React$a.useRef();
var wrapperNodeRef = React$a.useRef();
function getDomElement() {
try {
return nodeRef.current instanceof HTMLElement ? nodeRef.current : findDOMNode(wrapperNodeRef.current);
} catch (e2) {
return null;
}
}
var _useStatus = useStatus(supportMotion, visible, getDomElement, props), _useStatus2 = _slicedToArray$e(_useStatus, 4), status = _useStatus2[0], statusStep = _useStatus2[1], statusStyle = _useStatus2[2], mergedVisible = _useStatus2[3];
var renderedRef = React__namespace.useRef(mergedVisible);
if (mergedVisible) {
renderedRef.current = true;
}
var setNodeRef = React__namespace.useCallback(function(node) {
nodeRef.current = node;
fillRef(ref, node);
}, [ref]);
var motionChildren;
var mergedProps = _objectSpread2$a(_objectSpread2$a({}, eventProps), {}, {
visible
});
if (!children) {
motionChildren = null;
} else if (status === STATUS_NONE) {
if (mergedVisible) {
motionChildren = children(_objectSpread2$a({}, mergedProps), setNodeRef);
} else if (!removeOnLeave && renderedRef.current && leavedClassName) {
motionChildren = children(_objectSpread2$a(_objectSpread2$a({}, mergedProps), {}, {
className: leavedClassName
}), setNodeRef);
} else if (forceRender || !removeOnLeave && !leavedClassName) {
motionChildren = children(_objectSpread2$a(_objectSpread2$a({}, mergedProps), {}, {
style: {
display: "none"
}
}), setNodeRef);
} else {
motionChildren = null;
}
} else {
var _classNames;
var statusSuffix;
if (statusStep === STEP_PREPARE) {
statusSuffix = "prepare";
} else if (isActive(statusStep)) {
statusSuffix = "active";
} else if (statusStep === STEP_START) {
statusSuffix = "start";
}
var motionCls = getTransitionName$2(motionName, "".concat(status, "-").concat(statusSuffix));
motionChildren = children(_objectSpread2$a(_objectSpread2$a({}, mergedProps), {}, {
className: classnames(getTransitionName$2(motionName, status), (_classNames = {}, _defineProperty$b(_classNames, motionCls, motionCls && statusSuffix), _defineProperty$b(_classNames, motionName, typeof motionName === "string"), _classNames)),
style: statusStyle
}), setNodeRef);
}
if (/* @__PURE__ */ React__namespace.isValidElement(motionChildren) && supportRef(motionChildren)) {
var _ref = motionChildren, originNodeRef = _ref.ref;
if (!originNodeRef) {
motionChildren = /* @__PURE__ */ React__namespace.cloneElement(motionChildren, {
ref: setNodeRef
});
}
}
return /* @__PURE__ */ jsx(DomWrapper, {
ref: wrapperNodeRef,
children: motionChildren
});
});
CSSMotion2.displayName = "CSSMotion";
return CSSMotion2;
}
const CSSMotion = genCSSMotion(supportTransition);
var STATUS_ADD = "add";
var STATUS_KEEP = "keep";
var STATUS_REMOVE = "remove";
var STATUS_REMOVED = "removed";
function wrapKeyToObject(key2) {
var keyObj;
if (key2 && _typeof$q(key2) === "object" && "key" in key2) {
keyObj = key2;
} else {
keyObj = {
key: key2
};
}
return _objectSpread2$a(_objectSpread2$a({}, keyObj), {}, {
key: String(keyObj.key)
});
}
function parseKeys() {
var keys2 = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [];
return keys2.map(wrapKeyToObject);
}
function diffKeys() {
var prevKeys = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [];
var currentKeys = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
var list = [];
var currentIndex = 0;
var currentLen = currentKeys.length;
var prevKeyObjects = parseKeys(prevKeys);
var currentKeyObjects = parseKeys(currentKeys);
prevKeyObjects.forEach(function(keyObj) {
var hit = false;
for (var i2 = currentIndex; i2 < currentLen; i2 += 1) {
var currentKeyObj = currentKeyObjects[i2];
if (currentKeyObj.key === keyObj.key) {
if (currentIndex < i2) {
list = list.concat(currentKeyObjects.slice(currentIndex, i2).map(function(obj) {
return _objectSpread2$a(_objectSpread2$a({}, obj), {}, {
status: STATUS_ADD
});
}));
currentIndex = i2;
}
list.push(_objectSpread2$a(_objectSpread2$a({}, currentKeyObj), {}, {
status: STATUS_KEEP
}));
currentIndex += 1;
hit = true;
break;
}
}
if (!hit) {
list.push(_objectSpread2$a(_objectSpread2$a({}, keyObj), {}, {
status: STATUS_REMOVE
}));
}
});
if (currentIndex < currentLen) {
list = list.concat(currentKeyObjects.slice(currentIndex).map(function(obj) {
return _objectSpread2$a(_objectSpread2$a({}, obj), {}, {
status: STATUS_ADD
});
}));
}
var keys2 = {};
list.forEach(function(_ref) {
var key2 = _ref.key;
keys2[key2] = (keys2[key2] || 0) + 1;
});
var duplicatedKeys = Object.keys(keys2).filter(function(key2) {
return keys2[key2] > 1;
});
duplicatedKeys.forEach(function(matchKey) {
list = list.filter(function(_ref2) {
var key2 = _ref2.key, status = _ref2.status;
return key2 !== matchKey || status !== STATUS_REMOVE;
});
list.forEach(function(node) {
if (node.key === matchKey) {
node.status = STATUS_KEEP;
}
});
});
return list;
}
var _excluded$L = ["component", "children", "onVisibleChanged", "onAllRemoved"], _excluded2$9 = ["status"];
var MOTION_PROP_NAMES = ["eventProps", "visible", "children", "motionName", "motionAppear", "motionEnter", "motionLeave", "motionLeaveImmediately", "motionDeadline", "removeOnLeave", "leavedClassName", "onAppearStart", "onAppearActive", "onAppearEnd", "onEnterStart", "onEnterActive", "onEnterEnd", "onLeaveStart", "onLeaveActive", "onLeaveEnd"];
function genCSSMotionList(transitionSupport) {
var CSSMotion$1 = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : CSSMotion;
var CSSMotionList2 = /* @__PURE__ */ function(_React$Component) {
_inherits(CSSMotionList3, _React$Component);
var _super = _createSuper(CSSMotionList3);
function CSSMotionList3() {
var _this2;
_classCallCheck(this, CSSMotionList3);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_defineProperty$b(_assertThisInitialized(_this2), "state", {
keyEntities: []
});
_defineProperty$b(_assertThisInitialized(_this2), "removeKey", function(removeKey) {
var keyEntities = _this2.state.keyEntities;
var nextKeyEntities = keyEntities.map(function(entity) {
if (entity.key !== removeKey)
return entity;
return _objectSpread2$a(_objectSpread2$a({}, entity), {}, {
status: STATUS_REMOVED
});
});
_this2.setState({
keyEntities: nextKeyEntities
});
return nextKeyEntities.filter(function(_ref) {
var status = _ref.status;
return status !== STATUS_REMOVED;
}).length;
});
return _this2;
}
_createClass(CSSMotionList3, [{
key: "render",
value: function render2() {
var _this2 = this;
var keyEntities = this.state.keyEntities;
var _this$props = this.props, component = _this$props.component, children = _this$props.children, _onVisibleChanged = _this$props.onVisibleChanged, onAllRemoved = _this$props.onAllRemoved, restProps = _objectWithoutProperties$1(_this$props, _excluded$L);
var Component = component || React__namespace.Fragment;
var motionProps = {};
MOTION_PROP_NAMES.forEach(function(prop) {
motionProps[prop] = restProps[prop];
delete restProps[prop];
});
delete restProps.keys;
return /* @__PURE__ */ jsx(Component, {
...restProps,
children: keyEntities.map(function(_ref2) {
var status = _ref2.status, eventProps = _objectWithoutProperties$1(_ref2, _excluded2$9);
var visible = status === STATUS_ADD || status === STATUS_KEEP;
return /* @__PURE__ */ React$a.createElement(CSSMotion$1, {
...motionProps,
key: eventProps.key,
visible,
eventProps,
onVisibleChanged: function onVisibleChanged(changedVisible) {
_onVisibleChanged === null || _onVisibleChanged === void 0 ? void 0 : _onVisibleChanged(changedVisible, {
key: eventProps.key
});
if (!changedVisible) {
var restKeysCount = _this2.removeKey(eventProps.key);
if (restKeysCount === 0 && onAllRemoved) {
onAllRemoved();
}
}
}
}, children);
})
});
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(_ref3, _ref4) {
var keys2 = _ref3.keys;
var keyEntities = _ref4.keyEntities;
var parsedKeyObjects = parseKeys(keys2);
var mixedKeyEntities = diffKeys(keyEntities, parsedKeyObjects);
return {
keyEntities: mixedKeyEntities.filter(function(entity) {
var prevEntity = keyEntities.find(function(_ref5) {
var key2 = _ref5.key;
return entity.key === key2;
});
if (prevEntity && prevEntity.status === STATUS_REMOVED && entity.status === STATUS_REMOVE) {
return false;
}
return true;
})
};
}
}]);
return CSSMotionList3;
}(React__namespace.Component);
_defineProperty$b(CSSMotionList2, "defaultProps", {
component: "div"
});
return CSSMotionList2;
}
const CSSMotionList = genCSSMotionList(supportTransition);
var Notice = /* @__PURE__ */ function(_Component) {
_inherits(Notice2, _Component);
var _super = _createSuper(Notice2);
function Notice2() {
var _this2;
_classCallCheck(this, Notice2);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_this2.closeTimer = null;
_this2.close = function(e2) {
if (e2) {
e2.stopPropagation();
}
_this2.clearCloseTimer();
var _this$props = _this2.props, onClose = _this$props.onClose, noticeKey = _this$props.noticeKey;
if (onClose) {
onClose(noticeKey);
}
};
_this2.startCloseTimer = function() {
if (_this2.props.duration) {
_this2.closeTimer = window.setTimeout(function() {
_this2.close();
}, _this2.props.duration * 1e3);
}
};
_this2.clearCloseTimer = function() {
if (_this2.closeTimer) {
clearTimeout(_this2.closeTimer);
_this2.closeTimer = null;
}
};
return _this2;
}
_createClass(Notice2, [{
key: "componentDidMount",
value: function componentDidMount() {
this.startCloseTimer();
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps) {
if (this.props.duration !== prevProps.duration || this.props.updateMark !== prevProps.updateMark || this.props.visible !== prevProps.visible && this.props.visible) {
this.restartCloseTimer();
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this.clearCloseTimer();
}
}, {
key: "restartCloseTimer",
value: function restartCloseTimer() {
this.clearCloseTimer();
this.startCloseTimer();
}
}, {
key: "render",
value: function render2() {
var _this2 = this;
var _this$props2 = this.props, prefixCls = _this$props2.prefixCls, className = _this$props2.className, closable = _this$props2.closable, closeIcon = _this$props2.closeIcon, style2 = _this$props2.style, onClick = _this$props2.onClick, children = _this$props2.children, holder = _this$props2.holder;
var componentClass = "".concat(prefixCls, "-notice");
var dataOrAriaAttributeProps = Object.keys(this.props).reduce(function(acc, key2) {
if (key2.substr(0, 5) === "data-" || key2.substr(0, 5) === "aria-" || key2 === "role") {
acc[key2] = _this2.props[key2];
}
return acc;
}, {});
var node = /* @__PURE__ */ jsxs("div", {
className: classnames(componentClass, className, _defineProperty$b({}, "".concat(componentClass, "-closable"), closable)),
style: style2,
onMouseEnter: this.clearCloseTimer,
onMouseLeave: this.startCloseTimer,
onClick,
...dataOrAriaAttributeProps,
children: [/* @__PURE__ */ jsx("div", {
className: "".concat(componentClass, "-content"),
children
}), closable ? /* @__PURE__ */ jsx("a", {
tabIndex: 0,
onClick: this.close,
className: "".concat(componentClass, "-close"),
children: closeIcon || /* @__PURE__ */ jsx("span", {
className: "".concat(componentClass, "-close-x")
})
}) : null]
});
if (holder) {
return /* @__PURE__ */ ReactDOM__default.default.createPortal(node, holder);
}
return node;
}
}]);
return Notice2;
}(React$a.Component);
Notice.defaultProps = {
onClose: function onClose() {
},
duration: 1.5
};
function useNotification(notificationInstance2) {
var createdRef = React__namespace.useRef({});
var _React$useState = React__namespace.useState([]), _React$useState2 = _slicedToArray$e(_React$useState, 2), elements = _React$useState2[0], setElements = _React$useState2[1];
function notify(noticeProps) {
var firstMount = true;
notificationInstance2.add(noticeProps, function(div, props) {
var key2 = props.key;
if (div && (!createdRef.current[key2] || firstMount)) {
var noticeEle = /* @__PURE__ */ jsx(Notice, {
...props,
holder: div
});
createdRef.current[key2] = noticeEle;
setElements(function(originElements) {
var index2 = originElements.findIndex(function(ele) {
return ele.key === props.key;
});
if (index2 === -1) {
return [].concat(_toConsumableArray$c(originElements), [noticeEle]);
}
var cloneList = _toConsumableArray$c(originElements);
cloneList[index2] = noticeEle;
return cloneList;
});
}
firstMount = false;
});
}
return [
notify,
/* @__PURE__ */ jsx(Fragment, {
children: elements
})
];
}
var _excluded$K = ["getContainer"];
var seed = 0;
var now$3 = Date.now();
function getUuid() {
var id2 = seed;
seed += 1;
return "rcNotification_".concat(now$3, "_").concat(id2);
}
var Notification = /* @__PURE__ */ function(_Component) {
_inherits(Notification2, _Component);
var _super = _createSuper(Notification2);
function Notification2() {
var _this2;
_classCallCheck(this, Notification2);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_this2.state = {
notices: []
};
_this2.hookRefs = /* @__PURE__ */ new Map();
_this2.add = function(originNotice, holderCallback) {
var _originNotice$key;
var key2 = (_originNotice$key = originNotice.key) !== null && _originNotice$key !== void 0 ? _originNotice$key : getUuid();
var notice2 = _objectSpread2$a(_objectSpread2$a({}, originNotice), {}, {
key: key2
});
var maxCount2 = _this2.props.maxCount;
_this2.setState(function(previousState) {
var notices = previousState.notices;
var noticeIndex = notices.map(function(v2) {
return v2.notice.key;
}).indexOf(key2);
var updatedNotices = notices.concat();
if (noticeIndex !== -1) {
updatedNotices.splice(noticeIndex, 1, {
notice: notice2,
holderCallback
});
} else {
if (maxCount2 && notices.length >= maxCount2) {
notice2.key = updatedNotices[0].notice.key;
notice2.updateMark = getUuid();
notice2.userPassKey = key2;
updatedNotices.shift();
}
updatedNotices.push({
notice: notice2,
holderCallback
});
}
return {
notices: updatedNotices
};
});
};
_this2.remove = function(removeKey) {
_this2.setState(function(_ref) {
var notices = _ref.notices;
return {
notices: notices.filter(function(_ref2) {
var _ref2$notice = _ref2.notice, key2 = _ref2$notice.key, userPassKey = _ref2$notice.userPassKey;
var mergedKey = userPassKey !== null && userPassKey !== void 0 ? userPassKey : key2;
return mergedKey !== removeKey;
})
};
});
};
_this2.noticePropsMap = {};
return _this2;
}
_createClass(Notification2, [{
key: "getTransitionName",
value: function getTransitionName2() {
var _this$props = this.props, prefixCls = _this$props.prefixCls, animation = _this$props.animation;
var transitionName2 = this.props.transitionName;
if (!transitionName2 && animation) {
transitionName2 = "".concat(prefixCls, "-").concat(animation);
}
return transitionName2;
}
}, {
key: "render",
value: function render2() {
var _this2 = this;
var notices = this.state.notices;
var _this$props2 = this.props, prefixCls = _this$props2.prefixCls, className = _this$props2.className, closeIcon = _this$props2.closeIcon, style2 = _this$props2.style;
var noticeKeys = [];
notices.forEach(function(_ref3, index2) {
var notice2 = _ref3.notice, holderCallback = _ref3.holderCallback;
var updateMark = index2 === notices.length - 1 ? notice2.updateMark : void 0;
var key2 = notice2.key, userPassKey = notice2.userPassKey;
var noticeProps = _objectSpread2$a(_objectSpread2$a(_objectSpread2$a({
prefixCls,
closeIcon
}, notice2), notice2.props), {}, {
key: key2,
noticeKey: userPassKey || key2,
updateMark,
onClose: function onClose(noticeKey) {
var _notice$onClose;
_this2.remove(noticeKey);
(_notice$onClose = notice2.onClose) === null || _notice$onClose === void 0 ? void 0 : _notice$onClose.call(notice2);
},
onClick: notice2.onClick,
children: notice2.content
});
noticeKeys.push(key2);
_this2.noticePropsMap[key2] = {
props: noticeProps,
holderCallback
};
});
return /* @__PURE__ */ jsx("div", {
className: classnames(prefixCls, className),
style: style2,
children: /* @__PURE__ */ jsx(CSSMotionList, {
keys: noticeKeys,
motionName: this.getTransitionName(),
onVisibleChanged: function onVisibleChanged(changedVisible, _ref4) {
var key2 = _ref4.key;
if (!changedVisible) {
delete _this2.noticePropsMap[key2];
}
},
children: function(_ref5) {
var key2 = _ref5.key, motionClassName = _ref5.className, motionStyle = _ref5.style, visible = _ref5.visible;
var _this2$noticePropsMap = _this2.noticePropsMap[key2], noticeProps = _this2$noticePropsMap.props, holderCallback = _this2$noticePropsMap.holderCallback;
if (holderCallback) {
return /* @__PURE__ */ jsx("div", {
className: classnames(motionClassName, "".concat(prefixCls, "-hook-holder")),
style: _objectSpread2$a({}, motionStyle),
ref: function ref(div) {
if (typeof key2 === "undefined") {
return;
}
if (div) {
_this2.hookRefs.set(key2, div);
holderCallback(div, noticeProps);
} else {
_this2.hookRefs.delete(key2);
}
}
}, key2);
}
return /* @__PURE__ */ jsx(Notice, {
...noticeProps,
className: classnames(motionClassName, noticeProps === null || noticeProps === void 0 ? void 0 : noticeProps.className),
style: _objectSpread2$a(_objectSpread2$a({}, motionStyle), noticeProps === null || noticeProps === void 0 ? void 0 : noticeProps.style),
visible
});
}
})
});
}
}]);
return Notification2;
}(React$a.Component);
Notification.newInstance = void 0;
Notification.defaultProps = {
prefixCls: "rc-notification",
animation: "fade",
style: {
top: 65,
left: "50%"
}
};
Notification.newInstance = function newNotificationInstance(properties, callback) {
var _ref6 = properties || {}, getContainer2 = _ref6.getContainer, props = _objectWithoutProperties$1(_ref6, _excluded$K);
var div = document.createElement("div");
if (getContainer2) {
var root2 = getContainer2();
root2.appendChild(div);
} else {
document.body.appendChild(div);
}
var called = false;
function ref(notification2) {
if (called) {
return;
}
called = true;
callback({
notice: function notice2(noticeProps) {
notification2.add(noticeProps);
},
removeNotice: function removeNotice(key2) {
notification2.remove(key2);
},
component: notification2,
destroy: function destroy() {
unmount(div);
if (div.parentNode) {
div.parentNode.removeChild(div);
}
},
useNotification: function useNotification$1() {
return useNotification(notification2);
}
});
}
render(
/* @__PURE__ */ jsx(Notification, {
...props,
ref
}),
div
);
};
function createUseMessage(getRcNotificationInstance, getRCNoticeProps2) {
var useMessage = function useMessage2() {
var getPrefixCls;
var getPopupContainer;
var innerInstance = null;
var proxy = {
add: function add(noticeProps, holderCallback) {
innerInstance === null || innerInstance === void 0 ? void 0 : innerInstance.component.add(noticeProps, holderCallback);
}
};
var _useRCNotification = useNotification(proxy), _useRCNotification2 = _slicedToArray$e(_useRCNotification, 2), hookNotify = _useRCNotification2[0], holder = _useRCNotification2[1];
function notify(args) {
var customizePrefixCls = args.prefixCls;
var mergedPrefixCls = getPrefixCls("message", customizePrefixCls);
var rootPrefixCls = getPrefixCls();
var target = args.key || getKeyThenIncreaseKey();
var closePromise = new Promise(function(resolve) {
var callback = function callback2() {
if (typeof args.onClose === "function") {
args.onClose();
}
return resolve(true);
};
getRcNotificationInstance(_extends$3(_extends$3({}, args), {
prefixCls: mergedPrefixCls,
rootPrefixCls,
getPopupContainer
}), function(_ref) {
var prefixCls = _ref.prefixCls, instance = _ref.instance;
innerInstance = instance;
hookNotify(getRCNoticeProps2(_extends$3(_extends$3({}, args), {
key: target,
onClose: callback
}), prefixCls));
});
});
var result = function result2() {
if (innerInstance) {
innerInstance.removeNotice(target);
}
};
result.then = function(filled, rejected) {
return closePromise.then(filled, rejected);
};
result.promise = closePromise;
return result;
}
var hookApiRef = React__namespace.useRef({});
hookApiRef.current.open = notify;
typeList.forEach(function(type2) {
return attachTypeApi(hookApiRef.current, type2);
});
return [
hookApiRef.current,
/* @__PURE__ */ jsx(ConfigConsumer, {
children: function(context2) {
getPrefixCls = context2.getPrefixCls;
getPopupContainer = context2.getPopupContainer;
return holder;
}
}, "holder")
];
};
return useMessage;
}
var messageInstance;
var defaultDuration$1 = 3;
var defaultTop$1;
var key$1 = 1;
var localPrefixCls = "";
var transitionName = "move-up";
var hasTransitionName = false;
var getContainer;
var maxCount$1;
var rtl$1 = false;
function getKeyThenIncreaseKey() {
return key$1++;
}
function setMessageConfig(options) {
if (options.top !== void 0) {
defaultTop$1 = options.top;
messageInstance = null;
}
if (options.duration !== void 0) {
defaultDuration$1 = options.duration;
}
if (options.prefixCls !== void 0) {
localPrefixCls = options.prefixCls;
}
if (options.getContainer !== void 0) {
getContainer = options.getContainer;
messageInstance = null;
}
if (options.transitionName !== void 0) {
transitionName = options.transitionName;
messageInstance = null;
hasTransitionName = true;
}
if (options.maxCount !== void 0) {
maxCount$1 = options.maxCount;
messageInstance = null;
}
if (options.rtl !== void 0) {
rtl$1 = options.rtl;
}
}
function getRCNotificationInstance(args, callback) {
var customizePrefixCls = args.prefixCls, getContextPopupContainer = args.getPopupContainer;
var _globalConfig = globalConfig(), getPrefixCls = _globalConfig.getPrefixCls, getRootPrefixCls = _globalConfig.getRootPrefixCls, getIconPrefixCls = _globalConfig.getIconPrefixCls;
var prefixCls = getPrefixCls("message", customizePrefixCls || localPrefixCls);
var rootPrefixCls = getRootPrefixCls(args.rootPrefixCls, prefixCls);
var iconPrefixCls = getIconPrefixCls();
if (messageInstance) {
callback({
prefixCls,
rootPrefixCls,
iconPrefixCls,
instance: messageInstance
});
return;
}
var instanceConfig = {
prefixCls,
transitionName: hasTransitionName ? transitionName : "".concat(rootPrefixCls, "-").concat(transitionName),
style: {
top: defaultTop$1
},
getContainer: getContainer || getContextPopupContainer,
maxCount: maxCount$1
};
Notification.newInstance(instanceConfig, function(instance) {
if (messageInstance) {
callback({
prefixCls,
rootPrefixCls,
iconPrefixCls,
instance: messageInstance
});
return;
}
messageInstance = instance;
callback({
prefixCls,
rootPrefixCls,
iconPrefixCls,
instance
});
});
}
var typeToIcon$1 = {
info: InfoCircleFilled$1,
success: CheckCircleFilled$1,
error: CloseCircleFilled$1,
warning: ExclamationCircleFilled$1,
loading: LoadingOutlined$1
};
var typeList = Object.keys(typeToIcon$1);
function getRCNoticeProps$1(args, prefixCls, iconPrefixCls) {
var _classNames;
var duration = args.duration !== void 0 ? args.duration : defaultDuration$1;
var IconComponent = typeToIcon$1[args.type];
var messageClass = classnames("".concat(prefixCls, "-custom-content"), (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(args.type), args.type), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), rtl$1 === true), _classNames));
return {
key: args.key,
duration,
style: args.style || {},
className: args.className,
content: /* @__PURE__ */ jsx(_ConfigProvider, {
iconPrefixCls,
children: /* @__PURE__ */ jsxs("div", {
className: messageClass,
children: [args.icon || IconComponent && /* @__PURE__ */ jsx(IconComponent, {}), /* @__PURE__ */ jsx("span", {
children: args.content
})]
})
}),
onClose: args.onClose,
onClick: args.onClick
};
}
function notice$1(args) {
var target = args.key || getKeyThenIncreaseKey();
var closePromise = new Promise(function(resolve) {
var callback = function callback2() {
if (typeof args.onClose === "function") {
args.onClose();
}
return resolve(true);
};
getRCNotificationInstance(args, function(_ref) {
var prefixCls = _ref.prefixCls, iconPrefixCls = _ref.iconPrefixCls, instance = _ref.instance;
instance.notice(getRCNoticeProps$1(_extends$3(_extends$3({}, args), {
key: target,
onClose: callback
}), prefixCls, iconPrefixCls));
});
});
var result = function result2() {
var _a;
if (messageInstance) {
messageInstance.removeNotice(target);
(_a = args.onClose) === null || _a === void 0 ? void 0 : _a.call(args);
}
};
result.then = function(filled, rejected) {
return closePromise.then(filled, rejected);
};
result.promise = closePromise;
return result;
}
function isArgsProps(content) {
return Object.prototype.toString.call(content) === "[object Object]" && !!content.content;
}
var api$1 = {
open: notice$1,
config: setMessageConfig,
destroy: function destroy(messageKey) {
if (messageInstance) {
if (messageKey) {
var _messageInstance = messageInstance, removeNotice = _messageInstance.removeNotice;
removeNotice(messageKey);
} else {
var _messageInstance2 = messageInstance, destroy2 = _messageInstance2.destroy;
destroy2();
messageInstance = null;
}
}
}
};
function attachTypeApi(originalApi, type2) {
originalApi[type2] = function(content, duration, onClose) {
if (isArgsProps(content)) {
return originalApi.open(_extends$3(_extends$3({}, content), {
type: type2
}));
}
if (typeof duration === "function") {
onClose = duration;
duration = void 0;
}
return originalApi.open({
content,
duration,
type: type2,
onClose
});
};
}
typeList.forEach(function(type2) {
return attachTypeApi(api$1, type2);
});
api$1.warn = api$1.warning;
api$1.useMessage = createUseMessage(getRCNotificationInstance, getRCNoticeProps$1);
const _message = api$1;
var CheckCircleOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M699 353h-46.9c-10.2 0-19.9 4.9-25.9 13.3L469 584.3l-71.2-98.8c-6-8.3-15.6-13.3-25.9-13.3H325c-6.5 0-10.3 7.4-6.5 12.7l124.6 172.8a31.8 31.8 0 0051.7 0l210.6-292c3.9-5.3.1-12.7-6.4-12.7z" } }, { "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z" } }] }, "name": "check-circle", "theme": "outlined" };
const CheckCircleOutlinedSvg = CheckCircleOutlined$2;
var CheckCircleOutlined = function CheckCircleOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: CheckCircleOutlinedSvg
})
});
};
CheckCircleOutlined.displayName = "CheckCircleOutlined";
const CheckCircleOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(CheckCircleOutlined);
var CloseCircleOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M685.4 354.8c0-4.4-3.6-8-8-8l-66 .3L512 465.6l-99.3-118.4-66.1-.3c-4.4 0-8 3.5-8 8 0 1.9.7 3.7 1.9 5.2l130.1 155L340.5 670a8.32 8.32 0 00-1.9 5.2c0 4.4 3.6 8 8 8l66.1-.3L512 564.4l99.3 118.4 66 .3c4.4 0 8-3.5 8-8 0-1.9-.7-3.7-1.9-5.2L553.5 515l130.1-155c1.2-1.4 1.8-3.3 1.8-5.2z" } }, { "tag": "path", "attrs": { "d": "M512 65C264.6 65 64 265.6 64 513s200.6 448 448 448 448-200.6 448-448S759.4 65 512 65zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z" } }] }, "name": "close-circle", "theme": "outlined" };
const CloseCircleOutlinedSvg = CloseCircleOutlined$2;
var CloseCircleOutlined = function CloseCircleOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: CloseCircleOutlinedSvg
})
});
};
CloseCircleOutlined.displayName = "CloseCircleOutlined";
const CloseCircleOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(CloseCircleOutlined);
var CloseOutlined$5 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z" } }] }, "name": "close", "theme": "outlined" };
const CloseOutlinedSvg = CloseOutlined$5;
var CloseOutlined$3 = function CloseOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: CloseOutlinedSvg
})
});
};
CloseOutlined$3.displayName = "CloseOutlined";
const CloseOutlined$4 = /* @__PURE__ */ React__namespace.forwardRef(CloseOutlined$3);
var ExclamationCircleOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z" } }, { "tag": "path", "attrs": { "d": "M464 688a48 48 0 1096 0 48 48 0 10-96 0zm24-112h48c4.4 0 8-3.6 8-8V296c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8z" } }] }, "name": "exclamation-circle", "theme": "outlined" };
const ExclamationCircleOutlinedSvg = ExclamationCircleOutlined$2;
var ExclamationCircleOutlined = function ExclamationCircleOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: ExclamationCircleOutlinedSvg
})
});
};
ExclamationCircleOutlined.displayName = "ExclamationCircleOutlined";
const ExclamationCircleOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(ExclamationCircleOutlined);
var InfoCircleOutlined$5 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z" } }, { "tag": "path", "attrs": { "d": "M464 336a48 48 0 1096 0 48 48 0 10-96 0zm72 112h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V456c0-4.4-3.6-8-8-8z" } }] }, "name": "info-circle", "theme": "outlined" };
const InfoCircleOutlinedSvg = InfoCircleOutlined$5;
var InfoCircleOutlined$3 = function InfoCircleOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: InfoCircleOutlinedSvg
})
});
};
InfoCircleOutlined$3.displayName = "InfoCircleOutlined";
const InfoCircleOutlined$4 = /* @__PURE__ */ React__namespace.forwardRef(InfoCircleOutlined$3);
function createUseNotification(getNotificationInstance2, getRCNoticeProps2) {
var useNotification$1 = function useNotification$12() {
var getPrefixCls;
var innerInstance = null;
var proxy = {
add: function add(noticeProps, holderCallback) {
innerInstance === null || innerInstance === void 0 ? void 0 : innerInstance.component.add(noticeProps, holderCallback);
}
};
var _useRCNotification = useNotification(proxy), _useRCNotification2 = _slicedToArray$e(_useRCNotification, 2), hookNotify = _useRCNotification2[0], holder = _useRCNotification2[1];
function notify(args) {
var customizePrefixCls = args.prefixCls;
var mergedPrefixCls = getPrefixCls("notification", customizePrefixCls);
getNotificationInstance2(_extends$3(_extends$3({}, args), {
prefixCls: mergedPrefixCls
}), function(_ref) {
var prefixCls = _ref.prefixCls, instance = _ref.instance;
innerInstance = instance;
hookNotify(getRCNoticeProps2(args, prefixCls));
});
}
var hookApiRef = React__namespace.useRef({});
hookApiRef.current.open = notify;
["success", "info", "warning", "error"].forEach(function(type2) {
hookApiRef.current[type2] = function(args) {
return hookApiRef.current.open(_extends$3(_extends$3({}, args), {
type: type2
}));
};
});
return [
hookApiRef.current,
/* @__PURE__ */ jsx(ConfigConsumer, {
children: function(context2) {
getPrefixCls = context2.getPrefixCls;
return holder;
}
}, "holder")
];
};
return useNotification$1;
}
globalThis && globalThis.__awaiter || function(thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P ? value : new P(function(resolve) {
resolve(value);
});
}
return new (P || (P = Promise))(function(resolve, reject) {
function fulfilled(value) {
try {
step2(generator.next(value));
} catch (e2) {
reject(e2);
}
}
function rejected(value) {
try {
step2(generator["throw"](value));
} catch (e2) {
reject(e2);
}
}
function step2(result) {
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
}
step2((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var notificationInstance = {};
var defaultDuration = 4.5;
var defaultTop = 24;
var defaultBottom = 24;
var defaultPrefixCls$1 = "";
var defaultPlacement = "topRight";
var defaultGetContainer$1;
var defaultCloseIcon;
var rtl = false;
var maxCount;
function setNotificationConfig(options) {
var duration = options.duration, placement = options.placement, bottom = options.bottom, top = options.top, getContainer2 = options.getContainer, closeIcon = options.closeIcon, prefixCls = options.prefixCls;
if (prefixCls !== void 0) {
defaultPrefixCls$1 = prefixCls;
}
if (duration !== void 0) {
defaultDuration = duration;
}
if (placement !== void 0) {
defaultPlacement = placement;
} else if (options.rtl) {
defaultPlacement = "topLeft";
}
if (bottom !== void 0) {
defaultBottom = bottom;
}
if (top !== void 0) {
defaultTop = top;
}
if (getContainer2 !== void 0) {
defaultGetContainer$1 = getContainer2;
}
if (closeIcon !== void 0) {
defaultCloseIcon = closeIcon;
}
if (options.rtl !== void 0) {
rtl = options.rtl;
}
if (options.maxCount !== void 0) {
maxCount = options.maxCount;
}
}
function getPlacementStyle(placement) {
var top = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : defaultTop;
var bottom = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : defaultBottom;
var style2;
switch (placement) {
case "top":
style2 = {
left: "50%",
transform: "translateX(-50%)",
right: "auto",
top,
bottom: "auto"
};
break;
case "topLeft":
style2 = {
left: 0,
top,
bottom: "auto"
};
break;
case "topRight":
style2 = {
right: 0,
top,
bottom: "auto"
};
break;
case "bottom":
style2 = {
left: "50%",
transform: "translateX(-50%)",
right: "auto",
top: "auto",
bottom
};
break;
case "bottomLeft":
style2 = {
left: 0,
top: "auto",
bottom
};
break;
default:
style2 = {
right: 0,
top: "auto",
bottom
};
break;
}
return style2;
}
function getNotificationInstance(args, callback) {
var _args$placement = args.placement, placement = _args$placement === void 0 ? defaultPlacement : _args$placement, top = args.top, bottom = args.bottom, _args$getContainer = args.getContainer, getContainer2 = _args$getContainer === void 0 ? defaultGetContainer$1 : _args$getContainer, customizePrefixCls = args.prefixCls;
var _globalConfig = globalConfig(), getPrefixCls = _globalConfig.getPrefixCls, getIconPrefixCls = _globalConfig.getIconPrefixCls;
var prefixCls = getPrefixCls("notification", customizePrefixCls || defaultPrefixCls$1);
var iconPrefixCls = getIconPrefixCls();
var cacheKey = "".concat(prefixCls, "-").concat(placement);
var cacheInstance = notificationInstance[cacheKey];
if (cacheInstance) {
Promise.resolve(cacheInstance).then(function(instance) {
callback({
prefixCls: "".concat(prefixCls, "-notice"),
iconPrefixCls,
instance
});
});
return;
}
var notificationClass = classnames("".concat(prefixCls, "-").concat(placement), _defineProperty$b({}, "".concat(prefixCls, "-rtl"), rtl === true));
notificationInstance[cacheKey] = new Promise(function(resolve) {
Notification.newInstance({
prefixCls,
className: notificationClass,
style: getPlacementStyle(placement, top, bottom),
getContainer: getContainer2,
maxCount
}, function(notification2) {
resolve(notification2);
callback({
prefixCls: "".concat(prefixCls, "-notice"),
iconPrefixCls,
instance: notification2
});
});
});
}
var typeToIcon = {
success: CheckCircleOutlined$1,
info: InfoCircleOutlined$4,
error: CloseCircleOutlined$1,
warning: ExclamationCircleOutlined$1
};
function getRCNoticeProps(args, prefixCls, iconPrefixCls) {
var durationArg = args.duration, icon = args.icon, type2 = args.type, description = args.description, message = args.message, btn = args.btn, onClose = args.onClose, onClick = args.onClick, key2 = args.key, style2 = args.style, className = args.className, _args$closeIcon = args.closeIcon, closeIcon = _args$closeIcon === void 0 ? defaultCloseIcon : _args$closeIcon, props = args.props;
var duration = durationArg === void 0 ? defaultDuration : durationArg;
var iconNode = null;
if (icon) {
iconNode = /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-icon"),
children: args.icon
});
} else if (type2) {
iconNode = /* @__PURE__ */ React__namespace.createElement(typeToIcon[type2] || null, {
className: "".concat(prefixCls, "-icon ").concat(prefixCls, "-icon-").concat(type2)
});
}
var closeIconToRender = /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-close-x"),
children: closeIcon || /* @__PURE__ */ jsx(CloseOutlined$4, {
className: "".concat(prefixCls, "-close-icon")
})
});
var autoMarginTag = !description && iconNode ? /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-message-single-line-auto-margin")
}) : null;
return {
content: /* @__PURE__ */ jsx(_ConfigProvider, {
iconPrefixCls,
children: /* @__PURE__ */ jsxs("div", {
className: iconNode ? "".concat(prefixCls, "-with-icon") : "",
role: "alert",
children: [iconNode, /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-message"),
children: [autoMarginTag, message]
}), /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-description"),
children: description
}), btn ? /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-btn"),
children: btn
}) : null]
})
}),
duration,
closable: true,
closeIcon: closeIconToRender,
onClose,
onClick,
key: key2,
style: style2 || {},
className: classnames(className, _defineProperty$b({}, "".concat(prefixCls, "-").concat(type2), !!type2)),
props
};
}
function notice(args) {
getNotificationInstance(args, function(_ref) {
var prefixCls = _ref.prefixCls, iconPrefixCls = _ref.iconPrefixCls, instance = _ref.instance;
instance.notice(getRCNoticeProps(args, prefixCls, iconPrefixCls));
});
}
var api = {
open: notice,
close: function close(key2) {
Object.keys(notificationInstance).forEach(function(cacheKey) {
return Promise.resolve(notificationInstance[cacheKey]).then(function(instance) {
instance.removeNotice(key2);
});
});
},
config: setNotificationConfig,
destroy: function destroy() {
Object.keys(notificationInstance).forEach(function(cacheKey) {
Promise.resolve(notificationInstance[cacheKey]).then(function(instance) {
instance.destroy();
});
delete notificationInstance[cacheKey];
});
}
};
["success", "info", "warning", "error"].forEach(function(type2) {
api[type2] = function(args) {
return api.open(_extends$3(_extends$3({}, args), {
type: type2
}));
};
});
api.warn = api.warning;
api.useNotification = createUseNotification(getNotificationInstance, getRCNoticeProps);
const notification = api;
var defaultGetPrefixCls = function defaultGetPrefixCls2(suffixCls, customizePrefixCls) {
if (customizePrefixCls)
return customizePrefixCls;
return suffixCls ? "ant-".concat(suffixCls) : "ant";
};
var ConfigContext$1 = /* @__PURE__ */ React__namespace.createContext({
getPrefixCls: defaultGetPrefixCls
});
var ConfigConsumer = ConfigContext$1.Consumer;
var dynamicStyleMark = "-ant-".concat(Date.now(), "-").concat(Math.random());
function getStyle(globalPrefixCls2, theme) {
var variables = {};
var formatColor = function formatColor2(color2, updater) {
var clone = color2.clone();
clone = (updater === null || updater === void 0 ? void 0 : updater(clone)) || clone;
return clone.toRgbString();
};
var fillColor = function fillColor2(colorVal, type2) {
var baseColor = new TinyColor(colorVal);
var colorPalettes = generate$1(baseColor.toRgbString());
variables["".concat(type2, "-color")] = formatColor(baseColor);
variables["".concat(type2, "-color-disabled")] = colorPalettes[1];
variables["".concat(type2, "-color-hover")] = colorPalettes[4];
variables["".concat(type2, "-color-active")] = colorPalettes[6];
variables["".concat(type2, "-color-outline")] = baseColor.clone().setAlpha(0.2).toRgbString();
variables["".concat(type2, "-color-deprecated-bg")] = colorPalettes[0];
variables["".concat(type2, "-color-deprecated-border")] = colorPalettes[2];
};
if (theme.primaryColor) {
fillColor(theme.primaryColor, "primary");
var primaryColor = new TinyColor(theme.primaryColor);
var primaryColors = generate$1(primaryColor.toRgbString());
primaryColors.forEach(function(color2, index2) {
variables["primary-".concat(index2 + 1)] = color2;
});
variables["primary-color-deprecated-l-35"] = formatColor(primaryColor, function(c2) {
return c2.lighten(35);
});
variables["primary-color-deprecated-l-20"] = formatColor(primaryColor, function(c2) {
return c2.lighten(20);
});
variables["primary-color-deprecated-t-20"] = formatColor(primaryColor, function(c2) {
return c2.tint(20);
});
variables["primary-color-deprecated-t-50"] = formatColor(primaryColor, function(c2) {
return c2.tint(50);
});
variables["primary-color-deprecated-f-12"] = formatColor(primaryColor, function(c2) {
return c2.setAlpha(c2.getAlpha() * 0.12);
});
var primaryActiveColor = new TinyColor(primaryColors[0]);
variables["primary-color-active-deprecated-f-30"] = formatColor(primaryActiveColor, function(c2) {
return c2.setAlpha(c2.getAlpha() * 0.3);
});
variables["primary-color-active-deprecated-d-02"] = formatColor(primaryActiveColor, function(c2) {
return c2.darken(2);
});
}
if (theme.successColor) {
fillColor(theme.successColor, "success");
}
if (theme.warningColor) {
fillColor(theme.warningColor, "warning");
}
if (theme.errorColor) {
fillColor(theme.errorColor, "error");
}
if (theme.infoColor) {
fillColor(theme.infoColor, "info");
}
var cssList = Object.keys(variables).map(function(key2) {
return "--".concat(globalPrefixCls2, "-").concat(key2, ": ").concat(variables[key2], ";");
});
return "\n :root {\n ".concat(cssList.join("\n"), "\n }\n ").trim();
}
function registerTheme(globalPrefixCls2, theme) {
var style2 = getStyle(globalPrefixCls2, theme);
if (canUseDom$1()) {
updateCSS(style2, "".concat(dynamicStyleMark, "-dynamic-theme"));
}
}
var DisabledContext = /* @__PURE__ */ React__namespace.createContext(false);
var DisabledContextProvider = function DisabledContextProvider2(_ref) {
var children = _ref.children, disabled = _ref.disabled;
var originDisabled = React__namespace.useContext(DisabledContext);
return /* @__PURE__ */ jsx(DisabledContext.Provider, {
value: disabled !== null && disabled !== void 0 ? disabled : originDisabled,
children
});
};
const DisabledContext$1 = DisabledContext;
var SizeContext = /* @__PURE__ */ React__namespace.createContext(void 0);
var SizeContextProvider = function SizeContextProvider2(_ref) {
var children = _ref.children, size = _ref.size;
return /* @__PURE__ */ jsx(SizeContext.Consumer, {
children: function(originSize) {
return /* @__PURE__ */ jsx(SizeContext.Provider, {
value: size || originSize,
children
});
}
});
};
const SizeContext$1 = SizeContext;
var PASSED_PROPS = ["getTargetContainer", "getPopupContainer", "renderEmpty", "pageHeader", "input", "pagination", "form"];
var defaultPrefixCls = "ant";
var defaultIconPrefixCls = "anticon";
var globalPrefixCls;
var globalIconPrefixCls;
function getGlobalPrefixCls() {
return globalPrefixCls || defaultPrefixCls;
}
function getGlobalIconPrefixCls() {
return globalIconPrefixCls || defaultIconPrefixCls;
}
var setGlobalConfig = function setGlobalConfig2(_ref) {
var prefixCls = _ref.prefixCls, iconPrefixCls = _ref.iconPrefixCls, theme = _ref.theme;
if (prefixCls !== void 0) {
globalPrefixCls = prefixCls;
}
if (iconPrefixCls !== void 0) {
globalIconPrefixCls = iconPrefixCls;
}
if (theme) {
registerTheme(getGlobalPrefixCls(), theme);
}
};
var globalConfig = function globalConfig2() {
return {
getPrefixCls: function getPrefixCls(suffixCls, customizePrefixCls) {
if (customizePrefixCls)
return customizePrefixCls;
return suffixCls ? "".concat(getGlobalPrefixCls(), "-").concat(suffixCls) : getGlobalPrefixCls();
},
getIconPrefixCls: getGlobalIconPrefixCls,
getRootPrefixCls: function getRootPrefixCls(rootPrefixCls, customizePrefixCls) {
if (rootPrefixCls) {
return rootPrefixCls;
}
if (globalPrefixCls) {
return globalPrefixCls;
}
if (customizePrefixCls && customizePrefixCls.includes("-")) {
return customizePrefixCls.replace(/^(.*)-[^-]*$/, "$1");
}
return getGlobalPrefixCls();
}
};
};
var ProviderChildren = function ProviderChildren2(props) {
var _a, _b;
var children = props.children, csp = props.csp, autoInsertSpaceInButton = props.autoInsertSpaceInButton, form = props.form, locale2 = props.locale, componentSize = props.componentSize, direction = props.direction, space = props.space, virtual = props.virtual, dropdownMatchSelectWidth = props.dropdownMatchSelectWidth, legacyLocale = props.legacyLocale, parentContext = props.parentContext, iconPrefixCls = props.iconPrefixCls, componentDisabled = props.componentDisabled;
var getPrefixCls = React__namespace.useCallback(function(suffixCls, customizePrefixCls) {
var prefixCls = props.prefixCls;
if (customizePrefixCls)
return customizePrefixCls;
var mergedPrefixCls = prefixCls || parentContext.getPrefixCls("");
return suffixCls ? "".concat(mergedPrefixCls, "-").concat(suffixCls) : mergedPrefixCls;
}, [parentContext.getPrefixCls, props.prefixCls]);
var config = _extends$3(_extends$3({}, parentContext), {
csp,
autoInsertSpaceInButton,
locale: locale2 || legacyLocale,
direction,
space,
virtual,
dropdownMatchSelectWidth,
getPrefixCls
});
PASSED_PROPS.forEach(function(propName) {
var propValue = props[propName];
if (propValue) {
config[propName] = propValue;
}
});
var memoedConfig = useMemo(function() {
return config;
}, config, function(prevConfig, currentConfig) {
var prevKeys = Object.keys(prevConfig);
var currentKeys = Object.keys(currentConfig);
return prevKeys.length !== currentKeys.length || prevKeys.some(function(key2) {
return prevConfig[key2] !== currentConfig[key2];
});
});
var memoIconContextValue = React__namespace.useMemo(function() {
return {
prefixCls: iconPrefixCls,
csp
};
}, [iconPrefixCls, csp]);
var childNode = children;
var validateMessages = {};
if (locale2) {
validateMessages = ((_a = locale2.Form) === null || _a === void 0 ? void 0 : _a.defaultValidateMessages) || ((_b = defaultLocale.Form) === null || _b === void 0 ? void 0 : _b.defaultValidateMessages) || {};
}
if (form && form.validateMessages) {
validateMessages = _extends$3(_extends$3({}, validateMessages), form.validateMessages);
}
if (Object.keys(validateMessages).length > 0) {
childNode = /* @__PURE__ */ jsx(FormProvider$1, {
validateMessages,
children
});
}
if (locale2) {
childNode = /* @__PURE__ */ jsx(LocaleProvider$1, {
locale: locale2,
_ANT_MARK__: ANT_MARK,
children: childNode
});
}
if (iconPrefixCls || csp) {
childNode = /* @__PURE__ */ jsx(IconContext$1.Provider, {
value: memoIconContextValue,
children: childNode
});
}
if (componentSize) {
childNode = /* @__PURE__ */ jsx(SizeContextProvider, {
size: componentSize,
children: childNode
});
}
if (componentDisabled !== void 0) {
childNode = /* @__PURE__ */ jsx(DisabledContextProvider, {
disabled: componentDisabled,
children: childNode
});
}
return /* @__PURE__ */ jsx(ConfigContext$1.Provider, {
value: memoedConfig,
children: childNode
});
};
var ConfigProvider = function ConfigProvider2(props) {
React__namespace.useEffect(function() {
if (props.direction) {
_message.config({
rtl: props.direction === "rtl"
});
notification.config({
rtl: props.direction === "rtl"
});
}
}, [props.direction]);
return /* @__PURE__ */ jsx(LocaleReceiver$1, {
children: function(_, __, legacyLocale) {
return /* @__PURE__ */ jsx(ConfigConsumer, {
children: function(context2) {
return /* @__PURE__ */ jsx(ProviderChildren, {
parentContext: context2,
legacyLocale,
...props
});
}
});
}
});
};
ConfigProvider.ConfigContext = ConfigContext$1;
ConfigProvider.SizeContext = SizeContext$1;
ConfigProvider.config = setGlobalConfig;
const _ConfigProvider = ConfigProvider;
function addEventListenerWrap$2(target, eventType, cb, option) {
var callback = ReactDOM__default.default.unstable_batchedUpdates ? function run(e2) {
ReactDOM__default.default.unstable_batchedUpdates(cb, e2);
} : cb;
if (target !== null && target !== void 0 && target.addEventListener) {
target.addEventListener(eventType, callback, option);
}
return {
remove: function remove() {
if (target !== null && target !== void 0 && target.removeEventListener) {
target.removeEventListener(eventType, callback, option);
}
}
};
}
function getDataOrAriaProps$1(props) {
return Object.keys(props).reduce(function(prev, key2) {
if ((key2.startsWith("data-") || key2.startsWith("aria-") || key2 === "role") && !key2.startsWith("data-__")) {
prev[key2] = props[key2];
}
return prev;
}, {});
}
var isValidElement = React__namespace.isValidElement;
function isFragment(child) {
return child && isValidElement(child) && child.type === React__namespace.Fragment;
}
function replaceElement(element, replacement, props) {
if (!isValidElement(element)) {
return replacement;
}
return /* @__PURE__ */ React__namespace.cloneElement(element, typeof props === "function" ? props(element.props || {}) : props);
}
function cloneElement(element, props) {
return replaceElement(element, element, props);
}
function isWindow$2(obj) {
return obj !== null && obj !== void 0 && obj === obj.window;
}
function getScroll$3(target, top) {
var _a, _b;
if (typeof window === "undefined") {
return 0;
}
var method2 = top ? "scrollTop" : "scrollLeft";
var result = 0;
if (isWindow$2(target)) {
result = target[top ? "pageYOffset" : "pageXOffset"];
} else if (target instanceof Document) {
result = target.documentElement[method2];
} else if (target instanceof HTMLElement) {
result = target[method2];
} else if (target) {
result = target[method2];
}
if (target && !isWindow$2(target) && typeof result !== "number") {
result = (_b = ((_a = target.ownerDocument) !== null && _a !== void 0 ? _a : target).documentElement) === null || _b === void 0 ? void 0 : _b[method2];
}
return result;
}
function easeInOutCubic(t2, b2, c2, d2) {
var cc = c2 - b2;
t2 /= d2 / 2;
if (t2 < 1) {
return cc / 2 * t2 * t2 * t2 + b2;
}
return cc / 2 * ((t2 -= 2) * t2 * t2 + 2) + b2;
}
function scrollTo$1(y2) {
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var _options$getContainer = options.getContainer, getContainer2 = _options$getContainer === void 0 ? function() {
return window;
} : _options$getContainer, callback = options.callback, _options$duration = options.duration, duration = _options$duration === void 0 ? 450 : _options$duration;
var container = getContainer2();
var scrollTop = getScroll$3(container, true);
var startTime = Date.now();
var frameFunc = function frameFunc2() {
var timestamp = Date.now();
var time = timestamp - startTime;
var nextScrollTop = easeInOutCubic(time > duration ? duration : time, scrollTop, y2, duration);
if (isWindow$2(container)) {
container.scrollTo(window.pageXOffset, nextScrollTop);
} else if (container instanceof Document || container.constructor.name === "HTMLDocument") {
container.documentElement.scrollTop = nextScrollTop;
} else {
container.scrollTop = nextScrollTop;
}
if (time < duration) {
wrapperRaf$1(frameFunc2);
} else if (typeof callback === "function") {
callback();
}
};
wrapperRaf$1(frameFunc);
}
function useEvent(callback) {
var fnRef = React__namespace.useRef();
fnRef.current = callback;
var memoFn = React__namespace.useCallback(function() {
var _fnRef$current;
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return (_fnRef$current = fnRef.current) === null || _fnRef$current === void 0 ? void 0 : _fnRef$current.call.apply(_fnRef$current, [fnRef].concat(args));
}, []);
return memoFn;
}
var useInternalLayoutEffect = canUseDom$1() ? React__namespace.useLayoutEffect : React__namespace.useEffect;
var useLayoutEffect$1 = function useLayoutEffect2(callback, deps) {
var firstMountRef = React__namespace.useRef(true);
useInternalLayoutEffect(function() {
return callback(firstMountRef.current);
}, deps);
useInternalLayoutEffect(function() {
firstMountRef.current = false;
return function() {
firstMountRef.current = true;
};
}, []);
};
var useLayoutUpdateEffect = function useLayoutUpdateEffect2(callback, deps) {
useLayoutEffect$1(function(firstMount) {
if (!firstMount) {
return callback();
}
}, deps);
};
function hasValue$1(value) {
return value !== void 0;
}
function useMergedState(defaultStateValue, option) {
var _ref = option || {}, defaultValue = _ref.defaultValue, value = _ref.value, onChange = _ref.onChange, postState = _ref.postState;
var _useState = useSafeState(function() {
if (hasValue$1(value)) {
return value;
} else if (hasValue$1(defaultValue)) {
return typeof defaultValue === "function" ? defaultValue() : defaultValue;
} else {
return typeof defaultStateValue === "function" ? defaultStateValue() : defaultStateValue;
}
}), _useState2 = _slicedToArray$e(_useState, 2), innerValue = _useState2[0], setInnerValue = _useState2[1];
var mergedValue = value !== void 0 ? value : innerValue;
var postMergedValue = postState ? postState(mergedValue) : mergedValue;
var onChangeFn = useEvent(onChange);
var _useState3 = useSafeState([mergedValue]), _useState4 = _slicedToArray$e(_useState3, 2), prevValue = _useState4[0], setPrevValue = _useState4[1];
useLayoutUpdateEffect(function() {
var prev = prevValue[0];
if (innerValue !== prev) {
onChangeFn(innerValue, prev);
}
}, [prevValue]);
useLayoutUpdateEffect(function() {
if (!hasValue$1(value)) {
setInnerValue(value);
}
}, [value]);
var triggerChange = useEvent(function(updater, ignoreDestroy) {
setInnerValue(updater, ignoreDestroy);
setPrevValue([mergedValue], ignoreDestroy);
});
return [postMergedValue, triggerChange];
}
const isMobile$1 = function() {
if (typeof navigator === "undefined" || typeof window === "undefined") {
return false;
}
var agent = navigator.userAgent || navigator.vendor || window.opera;
return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(agent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(agent === null || agent === void 0 ? void 0 : agent.substr(0, 4));
};
var KeyCode = {
MAC_ENTER: 3,
BACKSPACE: 8,
TAB: 9,
NUM_CENTER: 12,
ENTER: 13,
SHIFT: 16,
CTRL: 17,
ALT: 18,
PAUSE: 19,
CAPS_LOCK: 20,
ESC: 27,
SPACE: 32,
PAGE_UP: 33,
PAGE_DOWN: 34,
END: 35,
HOME: 36,
LEFT: 37,
UP: 38,
RIGHT: 39,
DOWN: 40,
PRINT_SCREEN: 44,
INSERT: 45,
DELETE: 46,
ZERO: 48,
ONE: 49,
TWO: 50,
THREE: 51,
FOUR: 52,
FIVE: 53,
SIX: 54,
SEVEN: 55,
EIGHT: 56,
NINE: 57,
QUESTION_MARK: 63,
A: 65,
B: 66,
C: 67,
D: 68,
E: 69,
F: 70,
G: 71,
H: 72,
I: 73,
J: 74,
K: 75,
L: 76,
M: 77,
N: 78,
O: 79,
P: 80,
Q: 81,
R: 82,
S: 83,
T: 84,
U: 85,
V: 86,
W: 87,
X: 88,
Y: 89,
Z: 90,
META: 91,
WIN_KEY_RIGHT: 92,
CONTEXT_MENU: 93,
NUM_ZERO: 96,
NUM_ONE: 97,
NUM_TWO: 98,
NUM_THREE: 99,
NUM_FOUR: 100,
NUM_FIVE: 101,
NUM_SIX: 102,
NUM_SEVEN: 103,
NUM_EIGHT: 104,
NUM_NINE: 105,
NUM_MULTIPLY: 106,
NUM_PLUS: 107,
NUM_MINUS: 109,
NUM_PERIOD: 110,
NUM_DIVISION: 111,
F1: 112,
F2: 113,
F3: 114,
F4: 115,
F5: 116,
F6: 117,
F7: 118,
F8: 119,
F9: 120,
F10: 121,
F11: 122,
F12: 123,
NUMLOCK: 144,
SEMICOLON: 186,
DASH: 189,
EQUALS: 187,
COMMA: 188,
PERIOD: 190,
SLASH: 191,
APOSTROPHE: 192,
SINGLE_QUOTE: 222,
OPEN_SQUARE_BRACKET: 219,
BACKSLASH: 220,
CLOSE_SQUARE_BRACKET: 221,
WIN_KEY: 224,
MAC_FF_META: 224,
WIN_IME: 229,
isTextModifyingKeyEvent: function isTextModifyingKeyEvent(e2) {
var keyCode = e2.keyCode;
if (e2.altKey && !e2.ctrlKey || e2.metaKey || keyCode >= KeyCode.F1 && keyCode <= KeyCode.F12) {
return false;
}
switch (keyCode) {
case KeyCode.ALT:
case KeyCode.CAPS_LOCK:
case KeyCode.CONTEXT_MENU:
case KeyCode.CTRL:
case KeyCode.DOWN:
case KeyCode.END:
case KeyCode.ESC:
case KeyCode.HOME:
case KeyCode.INSERT:
case KeyCode.LEFT:
case KeyCode.MAC_FF_META:
case KeyCode.META:
case KeyCode.NUMLOCK:
case KeyCode.NUM_CENTER:
case KeyCode.PAGE_DOWN:
case KeyCode.PAGE_UP:
case KeyCode.PAUSE:
case KeyCode.PRINT_SCREEN:
case KeyCode.RIGHT:
case KeyCode.SHIFT:
case KeyCode.UP:
case KeyCode.WIN_KEY:
case KeyCode.WIN_KEY_RIGHT:
return false;
default:
return true;
}
},
isCharacterKey: function isCharacterKey(keyCode) {
if (keyCode >= KeyCode.ZERO && keyCode <= KeyCode.NINE) {
return true;
}
if (keyCode >= KeyCode.NUM_ZERO && keyCode <= KeyCode.NUM_MULTIPLY) {
return true;
}
if (keyCode >= KeyCode.A && keyCode <= KeyCode.Z) {
return true;
}
if (window.navigator.userAgent.indexOf("WebKit") !== -1 && keyCode === 0) {
return true;
}
switch (keyCode) {
case KeyCode.SPACE:
case KeyCode.QUESTION_MARK:
case KeyCode.NUM_PLUS:
case KeyCode.NUM_MINUS:
case KeyCode.NUM_PERIOD:
case KeyCode.NUM_DIVISION:
case KeyCode.SEMICOLON:
case KeyCode.DASH:
case KeyCode.EQUALS:
case KeyCode.COMMA:
case KeyCode.PERIOD:
case KeyCode.SLASH:
case KeyCode.APOSTROPHE:
case KeyCode.SINGLE_QUOTE:
case KeyCode.OPEN_SQUARE_BRACKET:
case KeyCode.BACKSLASH:
case KeyCode.CLOSE_SQUARE_BRACKET:
return true;
default:
return false;
}
}
};
var BaseSelectContext = /* @__PURE__ */ React__namespace.createContext(null);
function useBaseProps() {
return React__namespace.useContext(BaseSelectContext);
}
function useDelayReset() {
var timeout = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 10;
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), bool = _React$useState2[0], setBool = _React$useState2[1];
var delayRef = React__namespace.useRef(null);
var cancelLatest = function cancelLatest2() {
window.clearTimeout(delayRef.current);
};
React__namespace.useEffect(function() {
return cancelLatest;
}, []);
var delaySetBool = function delaySetBool2(value, callback) {
cancelLatest();
delayRef.current = window.setTimeout(function() {
setBool(value);
if (callback) {
callback();
}
}, timeout);
};
return [bool, delaySetBool, cancelLatest];
}
function useLock() {
var duration = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 250;
var lockRef = React__namespace.useRef(null);
var timeoutRef = React__namespace.useRef(null);
React__namespace.useEffect(function() {
return function() {
window.clearTimeout(timeoutRef.current);
};
}, []);
function doLock(locked) {
if (locked || lockRef.current === null) {
lockRef.current = locked;
}
window.clearTimeout(timeoutRef.current);
timeoutRef.current = window.setTimeout(function() {
lockRef.current = null;
}, duration);
}
return [function() {
return lockRef.current;
}, doLock];
}
function useSelectTriggerControl(elements, open, triggerOpen, customizedTrigger) {
var propsRef = React__namespace.useRef(null);
propsRef.current = {
open,
triggerOpen,
customizedTrigger
};
React__namespace.useEffect(function() {
function onGlobalMouseDown(event) {
var _propsRef$current;
if ((_propsRef$current = propsRef.current) !== null && _propsRef$current !== void 0 && _propsRef$current.customizedTrigger) {
return;
}
var target = event.target;
if (target.shadowRoot && event.composed) {
target = event.composedPath()[0] || target;
}
if (propsRef.current.open && elements().filter(function(element) {
return element;
}).every(function(element) {
return !element.contains(target) && element !== target;
})) {
propsRef.current.triggerOpen(false);
}
}
window.addEventListener("mousedown", onGlobalMouseDown);
return function() {
return window.removeEventListener("mousedown", onGlobalMouseDown);
};
}, []);
}
var attributes = "accept acceptCharset accessKey action allowFullScreen allowTransparency\n alt async autoComplete autoFocus autoPlay capture cellPadding cellSpacing challenge\n charSet checked classID className colSpan cols content contentEditable contextMenu\n controls coords crossOrigin data dateTime default defer dir disabled download draggable\n encType form formAction formEncType formMethod formNoValidate formTarget frameBorder\n headers height hidden high href hrefLang htmlFor httpEquiv icon id inputMode integrity\n is keyParams keyType kind label lang list loop low manifest marginHeight marginWidth max maxLength media\n mediaGroup method min minLength multiple muted name noValidate nonce open\n optimum pattern placeholder poster preload radioGroup readOnly rel required\n reversed role rowSpan rows sandbox scope scoped scrolling seamless selected\n shape size sizes span spellCheck src srcDoc srcLang srcSet start step style\n summary tabIndex target title type useMap value width wmode wrap";
var eventsName = "onCopy onCut onPaste onCompositionEnd onCompositionStart onCompositionUpdate onKeyDown\n onKeyPress onKeyUp onFocus onBlur onChange onInput onSubmit onClick onContextMenu onDoubleClick\n onDrag onDragEnd onDragEnter onDragExit onDragLeave onDragOver onDragStart onDrop onMouseDown\n onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver onMouseUp onSelect onTouchCancel\n onTouchEnd onTouchMove onTouchStart onScroll onWheel onAbort onCanPlay onCanPlayThrough\n onDurationChange onEmptied onEncrypted onEnded onError onLoadedData onLoadedMetadata\n onLoadStart onPause onPlay onPlaying onProgress onRateChange onSeeked onSeeking onStalled onSuspend onTimeUpdate onVolumeChange onWaiting onLoad onError";
var propList = "".concat(attributes, " ").concat(eventsName).split(/[\s\n]+/);
var ariaPrefix = "aria-";
var dataPrefix = "data-";
function match(key2, prefix) {
return key2.indexOf(prefix) === 0;
}
function pickAttrs(props) {
var ariaOnly = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
var mergedConfig;
if (ariaOnly === false) {
mergedConfig = {
aria: true,
data: true,
attr: true
};
} else if (ariaOnly === true) {
mergedConfig = {
aria: true
};
} else {
mergedConfig = _objectSpread2$a({}, ariaOnly);
}
var attrs = {};
Object.keys(props).forEach(function(key2) {
if (mergedConfig.aria && (key2 === "role" || match(key2, ariaPrefix)) || mergedConfig.data && match(key2, dataPrefix) || mergedConfig.attr && propList.includes(key2)) {
attrs[key2] = props[key2];
}
});
return attrs;
}
var _excluded$J = ["prefixCls", "invalidate", "item", "renderItem", "responsive", "responsiveDisabled", "registerSize", "itemKey", "className", "style", "children", "display", "order", "component"];
var UNDEFINED = void 0;
function InternalItem(props, ref) {
var prefixCls = props.prefixCls, invalidate = props.invalidate, item = props.item, renderItem2 = props.renderItem, responsive = props.responsive, responsiveDisabled = props.responsiveDisabled, registerSize = props.registerSize, itemKey2 = props.itemKey, className = props.className, style2 = props.style, children = props.children, display = props.display, order = props.order, _props$component = props.component, Component = _props$component === void 0 ? "div" : _props$component, restProps = _objectWithoutProperties$1(props, _excluded$J);
var mergedHidden = responsive && !display;
function internalRegisterSize(width) {
registerSize(itemKey2, width);
}
React__namespace.useEffect(function() {
return function() {
internalRegisterSize(null);
};
}, []);
var childNode = renderItem2 && item !== UNDEFINED ? renderItem2(item) : children;
var overflowStyle;
if (!invalidate) {
overflowStyle = {
opacity: mergedHidden ? 0 : 1,
height: mergedHidden ? 0 : UNDEFINED,
overflowY: mergedHidden ? "hidden" : UNDEFINED,
order: responsive ? order : UNDEFINED,
pointerEvents: mergedHidden ? "none" : UNDEFINED,
position: mergedHidden ? "absolute" : UNDEFINED
};
}
var overflowProps = {};
if (mergedHidden) {
overflowProps["aria-hidden"] = true;
}
var itemNode = /* @__PURE__ */ jsx(Component, {
className: classnames(!invalidate && prefixCls, className),
style: _objectSpread2$a(_objectSpread2$a({}, overflowStyle), style2),
...overflowProps,
...restProps,
ref,
children: childNode
});
if (responsive) {
itemNode = /* @__PURE__ */ jsx(RefResizeObserver, {
onResize: function onResize2(_ref) {
var offsetWidth = _ref.offsetWidth;
internalRegisterSize(offsetWidth);
},
disabled: responsiveDisabled,
children: itemNode
});
}
return itemNode;
}
var Item$3 = /* @__PURE__ */ React__namespace.forwardRef(InternalItem);
Item$3.displayName = "Item";
function channelUpdate(callback) {
if (typeof MessageChannel === "undefined") {
wrapperRaf$1(callback);
} else {
var channel = new MessageChannel();
channel.port1.onmessage = function() {
return callback();
};
channel.port2.postMessage(void 0);
}
}
function useBatcher() {
var updateFuncRef = React__namespace.useRef(null);
var notifyEffectUpdate = function notifyEffectUpdate2(callback) {
if (!updateFuncRef.current) {
updateFuncRef.current = [];
channelUpdate(function() {
ReactDOM2.unstable_batchedUpdates(function() {
updateFuncRef.current.forEach(function(fn) {
fn();
});
updateFuncRef.current = null;
});
});
}
updateFuncRef.current.push(callback);
};
return notifyEffectUpdate;
}
function useEffectState(notifyEffectUpdate, defaultValue) {
var _React$useState = React__namespace.useState(defaultValue), _React$useState2 = _slicedToArray$e(_React$useState, 2), stateValue = _React$useState2[0], setStateValue = _React$useState2[1];
var setEffectVal = useEvent(function(nextValue) {
notifyEffectUpdate(function() {
setStateValue(nextValue);
});
});
return [stateValue, setEffectVal];
}
var OverflowContext = /* @__PURE__ */ React__default.default.createContext(null);
var _excluded$I = ["component"], _excluded2$8 = ["className"], _excluded3$1 = ["className"];
var InternalRawItem = function InternalRawItem2(props, ref) {
var context2 = React__namespace.useContext(OverflowContext);
if (!context2) {
var _props$component = props.component, Component = _props$component === void 0 ? "div" : _props$component, _restProps = _objectWithoutProperties$1(props, _excluded$I);
return /* @__PURE__ */ jsx(Component, {
..._restProps,
ref
});
}
var contextClassName = context2.className, restContext = _objectWithoutProperties$1(context2, _excluded2$8);
var className = props.className, restProps = _objectWithoutProperties$1(props, _excluded3$1);
return /* @__PURE__ */ jsx(OverflowContext.Provider, {
value: null,
children: /* @__PURE__ */ jsx(Item$3, {
ref,
className: classnames(contextClassName, className),
...restContext,
...restProps
})
});
};
var RawItem = /* @__PURE__ */ React__namespace.forwardRef(InternalRawItem);
RawItem.displayName = "RawItem";
var _excluded$H = ["prefixCls", "data", "renderItem", "renderRawItem", "itemKey", "itemWidth", "ssr", "style", "className", "maxCount", "renderRest", "renderRawRest", "suffix", "component", "itemComponent", "onVisibleChange"];
var RESPONSIVE = "responsive";
var INVALIDATE = "invalidate";
function defaultRenderRest(omittedItems) {
return "+ ".concat(omittedItems.length, " ...");
}
function Overflow(props, ref) {
var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-overflow" : _props$prefixCls, _props$data = props.data, data = _props$data === void 0 ? [] : _props$data, renderItem2 = props.renderItem, renderRawItem = props.renderRawItem, itemKey2 = props.itemKey, _props$itemWidth = props.itemWidth, itemWidth = _props$itemWidth === void 0 ? 10 : _props$itemWidth, ssr = props.ssr, style2 = props.style, className = props.className, maxCount2 = props.maxCount, renderRest = props.renderRest, renderRawRest = props.renderRawRest, suffix = props.suffix, _props$component = props.component, Component = _props$component === void 0 ? "div" : _props$component, itemComponent = props.itemComponent, onVisibleChange = props.onVisibleChange, restProps = _objectWithoutProperties$1(props, _excluded$H);
var fullySSR = ssr === "full";
var notifyEffectUpdate = useBatcher();
var _useEffectState = useEffectState(notifyEffectUpdate, null), _useEffectState2 = _slicedToArray$e(_useEffectState, 2), containerWidth = _useEffectState2[0], setContainerWidth = _useEffectState2[1];
var mergedContainerWidth = containerWidth || 0;
var _useEffectState3 = useEffectState(notifyEffectUpdate, /* @__PURE__ */ new Map()), _useEffectState4 = _slicedToArray$e(_useEffectState3, 2), itemWidths = _useEffectState4[0], setItemWidths = _useEffectState4[1];
var _useEffectState5 = useEffectState(notifyEffectUpdate, 0), _useEffectState6 = _slicedToArray$e(_useEffectState5, 2), prevRestWidth = _useEffectState6[0], setPrevRestWidth = _useEffectState6[1];
var _useEffectState7 = useEffectState(notifyEffectUpdate, 0), _useEffectState8 = _slicedToArray$e(_useEffectState7, 2), restWidth = _useEffectState8[0], setRestWidth = _useEffectState8[1];
var _useEffectState9 = useEffectState(notifyEffectUpdate, 0), _useEffectState10 = _slicedToArray$e(_useEffectState9, 2), suffixWidth = _useEffectState10[0], setSuffixWidth = _useEffectState10[1];
var _useState = React$a.useState(null), _useState2 = _slicedToArray$e(_useState, 2), suffixFixedStart = _useState2[0], setSuffixFixedStart = _useState2[1];
var _useState3 = React$a.useState(null), _useState4 = _slicedToArray$e(_useState3, 2), displayCount = _useState4[0], setDisplayCount = _useState4[1];
var mergedDisplayCount = React__namespace.useMemo(function() {
if (displayCount === null && fullySSR) {
return Number.MAX_SAFE_INTEGER;
}
return displayCount || 0;
}, [displayCount, containerWidth]);
var _useState5 = React$a.useState(false), _useState6 = _slicedToArray$e(_useState5, 2), restReady = _useState6[0], setRestReady = _useState6[1];
var itemPrefixCls = "".concat(prefixCls, "-item");
var mergedRestWidth = Math.max(prevRestWidth, restWidth);
var isResponsive = maxCount2 === RESPONSIVE;
var shouldResponsive = data.length && isResponsive;
var invalidate = maxCount2 === INVALIDATE;
var showRest = shouldResponsive || typeof maxCount2 === "number" && data.length > maxCount2;
var mergedData = React$a.useMemo(function() {
var items = data;
if (shouldResponsive) {
if (containerWidth === null && fullySSR) {
items = data;
} else {
items = data.slice(0, Math.min(data.length, mergedContainerWidth / itemWidth));
}
} else if (typeof maxCount2 === "number") {
items = data.slice(0, maxCount2);
}
return items;
}, [data, itemWidth, containerWidth, maxCount2, shouldResponsive]);
var omittedItems = React$a.useMemo(function() {
if (shouldResponsive) {
return data.slice(mergedDisplayCount + 1);
}
return data.slice(mergedData.length);
}, [data, mergedData, shouldResponsive, mergedDisplayCount]);
var getKey2 = React$a.useCallback(function(item, index2) {
var _ref;
if (typeof itemKey2 === "function") {
return itemKey2(item);
}
return (_ref = itemKey2 && (item === null || item === void 0 ? void 0 : item[itemKey2])) !== null && _ref !== void 0 ? _ref : index2;
}, [itemKey2]);
var mergedRenderItem = React$a.useCallback(renderItem2 || function(item) {
return item;
}, [renderItem2]);
function updateDisplayCount(count, suffixFixedStartVal, notReady) {
if (displayCount === count && (suffixFixedStartVal === void 0 || suffixFixedStartVal === suffixFixedStart)) {
return;
}
setDisplayCount(count);
if (!notReady) {
setRestReady(count < data.length - 1);
onVisibleChange === null || onVisibleChange === void 0 ? void 0 : onVisibleChange(count);
}
if (suffixFixedStartVal !== void 0) {
setSuffixFixedStart(suffixFixedStartVal);
}
}
function onOverflowResize(_, element) {
setContainerWidth(element.clientWidth);
}
function registerSize(key2, width) {
setItemWidths(function(origin) {
var clone = new Map(origin);
if (width === null) {
clone.delete(key2);
} else {
clone.set(key2, width);
}
return clone;
});
}
function registerOverflowSize(_, width) {
setRestWidth(width);
setPrevRestWidth(restWidth);
}
function registerSuffixSize(_, width) {
setSuffixWidth(width);
}
function getItemWidth(index2) {
return itemWidths.get(getKey2(mergedData[index2], index2));
}
useLayoutEffect$1(function() {
if (mergedContainerWidth && typeof mergedRestWidth === "number" && mergedData) {
var totalWidth = suffixWidth;
var len = mergedData.length;
var lastIndex = len - 1;
if (!len) {
updateDisplayCount(0, null);
return;
}
for (var i2 = 0; i2 < len; i2 += 1) {
var currentItemWidth = getItemWidth(i2);
if (fullySSR) {
currentItemWidth = currentItemWidth || 0;
}
if (currentItemWidth === void 0) {
updateDisplayCount(i2 - 1, void 0, true);
break;
}
totalWidth += currentItemWidth;
if (lastIndex === 0 && totalWidth <= mergedContainerWidth || i2 === lastIndex - 1 && totalWidth + getItemWidth(lastIndex) <= mergedContainerWidth) {
updateDisplayCount(lastIndex, null);
break;
} else if (totalWidth + mergedRestWidth > mergedContainerWidth) {
updateDisplayCount(i2 - 1, totalWidth - currentItemWidth - suffixWidth + restWidth);
break;
}
}
if (suffix && getItemWidth(0) + suffixWidth > mergedContainerWidth) {
setSuffixFixedStart(null);
}
}
}, [mergedContainerWidth, itemWidths, restWidth, suffixWidth, getKey2, mergedData]);
var displayRest = restReady && !!omittedItems.length;
var suffixStyle = {};
if (suffixFixedStart !== null && shouldResponsive) {
suffixStyle = {
position: "absolute",
left: suffixFixedStart,
top: 0
};
}
var itemSharedProps = {
prefixCls: itemPrefixCls,
responsive: shouldResponsive,
component: itemComponent,
invalidate
};
var internalRenderItemNode = renderRawItem ? function(item, index2) {
var key2 = getKey2(item, index2);
return /* @__PURE__ */ jsx(OverflowContext.Provider, {
value: _objectSpread2$a(_objectSpread2$a({}, itemSharedProps), {}, {
order: index2,
item,
itemKey: key2,
registerSize,
display: index2 <= mergedDisplayCount
}),
children: renderRawItem(item, index2)
}, key2);
} : function(item, index2) {
var key2 = getKey2(item, index2);
return /* @__PURE__ */ React$a.createElement(Item$3, {
...itemSharedProps,
order: index2,
key: key2,
item,
renderItem: mergedRenderItem,
itemKey: key2,
registerSize,
display: index2 <= mergedDisplayCount
});
};
var restNode;
var restContextProps = {
order: displayRest ? mergedDisplayCount : Number.MAX_SAFE_INTEGER,
className: "".concat(itemPrefixCls, "-rest"),
registerSize: registerOverflowSize,
display: displayRest
};
if (!renderRawRest) {
var mergedRenderRest = renderRest || defaultRenderRest;
restNode = /* @__PURE__ */ jsx(Item$3, {
...itemSharedProps,
...restContextProps,
children: typeof mergedRenderRest === "function" ? mergedRenderRest(omittedItems) : mergedRenderRest
});
} else if (renderRawRest) {
restNode = /* @__PURE__ */ jsx(OverflowContext.Provider, {
value: _objectSpread2$a(_objectSpread2$a({}, itemSharedProps), restContextProps),
children: renderRawRest(omittedItems)
});
}
var overflowNode = /* @__PURE__ */ jsxs(Component, {
className: classnames(!invalidate && prefixCls, className),
style: style2,
ref,
...restProps,
children: [mergedData.map(internalRenderItemNode), showRest ? restNode : null, suffix && /* @__PURE__ */ jsx(Item$3, {
...itemSharedProps,
responsive: isResponsive,
responsiveDisabled: !shouldResponsive,
order: mergedDisplayCount,
className: "".concat(itemPrefixCls, "-suffix"),
registerSize: registerSuffixSize,
display: true,
style: suffixStyle,
children: suffix
})]
});
if (isResponsive) {
overflowNode = /* @__PURE__ */ jsx(RefResizeObserver, {
onResize: onOverflowResize,
disabled: !shouldResponsive,
children: overflowNode
});
}
return overflowNode;
}
var ForwardOverflow = /* @__PURE__ */ React__namespace.forwardRef(Overflow);
ForwardOverflow.displayName = "Overflow";
ForwardOverflow.Item = RawItem;
ForwardOverflow.RESPONSIVE = RESPONSIVE;
ForwardOverflow.INVALIDATE = INVALIDATE;
var TransBtn = function TransBtn2(_ref) {
var className = _ref.className, customizeIcon = _ref.customizeIcon, customizeIconProps = _ref.customizeIconProps, _onMouseDown = _ref.onMouseDown, onClick = _ref.onClick, children = _ref.children;
var icon;
if (typeof customizeIcon === "function") {
icon = customizeIcon(customizeIconProps);
} else {
icon = customizeIcon;
}
return /* @__PURE__ */ jsx("span", {
className,
onMouseDown: function onMouseDown(event) {
event.preventDefault();
if (_onMouseDown) {
_onMouseDown(event);
}
},
style: {
userSelect: "none",
WebkitUserSelect: "none"
},
unselectable: "on",
onClick,
"aria-hidden": true,
children: icon !== void 0 ? icon : /* @__PURE__ */ jsx("span", {
className: classnames(className.split(/\s+/).map(function(cls) {
return "".concat(cls, "-icon");
})),
children
})
});
};
var Input$5 = function Input2(_ref, ref) {
var _inputNode2, _inputNode2$props;
var prefixCls = _ref.prefixCls, id2 = _ref.id, inputElement = _ref.inputElement, disabled = _ref.disabled, tabIndex = _ref.tabIndex, autoFocus = _ref.autoFocus, autoComplete = _ref.autoComplete, editable = _ref.editable, activeDescendantId = _ref.activeDescendantId, value = _ref.value, maxLength = _ref.maxLength, _onKeyDown = _ref.onKeyDown, _onMouseDown = _ref.onMouseDown, _onChange = _ref.onChange, onPaste = _ref.onPaste, _onCompositionStart = _ref.onCompositionStart, _onCompositionEnd = _ref.onCompositionEnd, open = _ref.open, attrs = _ref.attrs;
var inputNode = inputElement || /* @__PURE__ */ jsx("input", {});
var _inputNode = inputNode, originRef = _inputNode.ref, originProps = _inputNode.props;
var onOriginKeyDown = originProps.onKeyDown, onOriginChange = originProps.onChange, onOriginMouseDown = originProps.onMouseDown, onOriginCompositionStart = originProps.onCompositionStart, onOriginCompositionEnd = originProps.onCompositionEnd, style2 = originProps.style;
warning$3(!("maxLength" in inputNode.props));
inputNode = /* @__PURE__ */ React__namespace.cloneElement(inputNode, _objectSpread2$a(_objectSpread2$a(_objectSpread2$a({
type: "search"
}, originProps), {}, {
id: id2,
ref: composeRef(ref, originRef),
disabled,
tabIndex,
autoComplete: autoComplete || "off",
autoFocus,
className: classnames("".concat(prefixCls, "-selection-search-input"), (_inputNode2 = inputNode) === null || _inputNode2 === void 0 ? void 0 : (_inputNode2$props = _inputNode2.props) === null || _inputNode2$props === void 0 ? void 0 : _inputNode2$props.className),
role: "combobox",
"aria-expanded": open,
"aria-haspopup": "listbox",
"aria-owns": "".concat(id2, "_list"),
"aria-autocomplete": "list",
"aria-controls": "".concat(id2, "_list"),
"aria-activedescendant": activeDescendantId
}, attrs), {}, {
value: editable ? value : "",
maxLength,
readOnly: !editable,
unselectable: !editable ? "on" : null,
style: _objectSpread2$a(_objectSpread2$a({}, style2), {}, {
opacity: editable ? null : 0
}),
onKeyDown: function onKeyDown2(event) {
_onKeyDown(event);
if (onOriginKeyDown) {
onOriginKeyDown(event);
}
},
onMouseDown: function onMouseDown(event) {
_onMouseDown(event);
if (onOriginMouseDown) {
onOriginMouseDown(event);
}
},
onChange: function onChange(event) {
_onChange(event);
if (onOriginChange) {
onOriginChange(event);
}
},
onCompositionStart: function onCompositionStart(event) {
_onCompositionStart(event);
if (onOriginCompositionStart) {
onOriginCompositionStart(event);
}
},
onCompositionEnd: function onCompositionEnd(event) {
_onCompositionEnd(event);
if (onOriginCompositionEnd) {
onOriginCompositionEnd(event);
}
},
onPaste
}));
return inputNode;
};
var RefInput = /* @__PURE__ */ React__namespace.forwardRef(Input$5);
RefInput.displayName = "Input";
function toArray$7(value) {
if (Array.isArray(value)) {
return value;
}
return value !== void 0 ? [value] : [];
}
var isClient = typeof window !== "undefined" && window.document && window.document.documentElement;
var isBrowserClient$2 = isClient;
function hasValue(value) {
return value !== void 0 && value !== null;
}
function isTitleType$1(title) {
return ["string", "number"].includes(_typeof$q(title));
}
function getTitle(item) {
var title = void 0;
if (item) {
if (isTitleType$1(item.title)) {
title = item.title.toString();
} else if (isTitleType$1(item.label)) {
title = item.label.toString();
}
}
return title;
}
function useLayoutEffect(effect, deps) {
if (isBrowserClient$2) {
React__namespace.useLayoutEffect(effect, deps);
} else {
React__namespace.useEffect(effect, deps);
}
}
function itemKey$1(value) {
var _value$key;
return (_value$key = value.key) !== null && _value$key !== void 0 ? _value$key : value.value;
}
var onPreventMouseDown = function onPreventMouseDown2(event) {
event.preventDefault();
event.stopPropagation();
};
var SelectSelector = function SelectSelector2(props) {
var id2 = props.id, prefixCls = props.prefixCls, values = props.values, open = props.open, searchValue = props.searchValue, autoClearSearchValue = props.autoClearSearchValue, inputRef = props.inputRef, placeholder = props.placeholder, disabled = props.disabled, mode = props.mode, showSearch = props.showSearch, autoFocus = props.autoFocus, autoComplete = props.autoComplete, activeDescendantId = props.activeDescendantId, tabIndex = props.tabIndex, removeIcon = props.removeIcon, maxTagCount = props.maxTagCount, maxTagTextLength = props.maxTagTextLength, _props$maxTagPlacehol = props.maxTagPlaceholder, maxTagPlaceholder = _props$maxTagPlacehol === void 0 ? function(omittedValues) {
return "+ ".concat(omittedValues.length, " ...");
} : _props$maxTagPlacehol, tagRender = props.tagRender, onToggleOpen = props.onToggleOpen, onRemove = props.onRemove, onInputChange = props.onInputChange, onInputPaste = props.onInputPaste, onInputKeyDown = props.onInputKeyDown, onInputMouseDown = props.onInputMouseDown, onInputCompositionStart = props.onInputCompositionStart, onInputCompositionEnd = props.onInputCompositionEnd;
var measureRef = React__namespace.useRef(null);
var _useState = React$a.useState(0), _useState2 = _slicedToArray$e(_useState, 2), inputWidth = _useState2[0], setInputWidth = _useState2[1];
var _useState3 = React$a.useState(false), _useState4 = _slicedToArray$e(_useState3, 2), focused = _useState4[0], setFocused = _useState4[1];
var selectionPrefixCls = "".concat(prefixCls, "-selection");
var inputValue = open || mode === "multiple" && autoClearSearchValue === false || mode === "tags" ? searchValue : "";
var inputEditable = mode === "tags" || mode === "multiple" && autoClearSearchValue === false || showSearch && (open || focused);
useLayoutEffect(function() {
setInputWidth(measureRef.current.scrollWidth);
}, [inputValue]);
function defaultRenderSelector(item, content, itemDisabled, closable, onClose) {
return /* @__PURE__ */ jsxs("span", {
className: classnames("".concat(selectionPrefixCls, "-item"), _defineProperty$b({}, "".concat(selectionPrefixCls, "-item-disabled"), itemDisabled)),
title: getTitle(item),
children: [/* @__PURE__ */ jsx("span", {
className: "".concat(selectionPrefixCls, "-item-content"),
children: content
}), closable && /* @__PURE__ */ jsx(TransBtn, {
className: "".concat(selectionPrefixCls, "-item-remove"),
onMouseDown: onPreventMouseDown,
onClick: onClose,
customizeIcon: removeIcon,
children: "\xD7"
})]
});
}
function customizeRenderSelector(value, content, itemDisabled, closable, onClose) {
var onMouseDown = function onMouseDown2(e2) {
onPreventMouseDown(e2);
onToggleOpen(!open);
};
return /* @__PURE__ */ jsx("span", {
onMouseDown,
children: tagRender({
label: content,
value,
disabled: itemDisabled,
closable,
onClose
})
});
}
function renderItem2(valueItem) {
var itemDisabled = valueItem.disabled, label = valueItem.label, value = valueItem.value;
var closable = !disabled && !itemDisabled;
var displayLabel = label;
if (typeof maxTagTextLength === "number") {
if (typeof label === "string" || typeof label === "number") {
var strLabel = String(displayLabel);
if (strLabel.length > maxTagTextLength) {
displayLabel = "".concat(strLabel.slice(0, maxTagTextLength), "...");
}
}
}
var onClose = function onClose2(event) {
if (event)
event.stopPropagation();
onRemove(valueItem);
};
return typeof tagRender === "function" ? customizeRenderSelector(value, displayLabel, itemDisabled, closable, onClose) : defaultRenderSelector(valueItem, displayLabel, itemDisabled, closable, onClose);
}
function renderRest(omittedValues) {
var content = typeof maxTagPlaceholder === "function" ? maxTagPlaceholder(omittedValues) : maxTagPlaceholder;
return defaultRenderSelector({
title: content
}, content, false);
}
var inputNode = /* @__PURE__ */ jsxs("div", {
className: "".concat(selectionPrefixCls, "-search"),
style: {
width: inputWidth
},
onFocus: function onFocus() {
setFocused(true);
},
onBlur: function onBlur() {
setFocused(false);
},
children: [/* @__PURE__ */ jsx(RefInput, {
ref: inputRef,
open,
prefixCls,
id: id2,
inputElement: null,
disabled,
autoFocus,
autoComplete,
editable: inputEditable,
activeDescendantId,
value: inputValue,
onKeyDown: onInputKeyDown,
onMouseDown: onInputMouseDown,
onChange: onInputChange,
onPaste: onInputPaste,
onCompositionStart: onInputCompositionStart,
onCompositionEnd: onInputCompositionEnd,
tabIndex,
attrs: pickAttrs(props, true)
}), /* @__PURE__ */ jsxs("span", {
ref: measureRef,
className: "".concat(selectionPrefixCls, "-search-mirror"),
"aria-hidden": true,
children: [inputValue, "\xA0"]
})]
});
var selectionNode = /* @__PURE__ */ jsx(ForwardOverflow, {
prefixCls: "".concat(selectionPrefixCls, "-overflow"),
data: values,
renderItem: renderItem2,
renderRest,
suffix: inputNode,
itemKey: itemKey$1,
maxCount: maxTagCount
});
return /* @__PURE__ */ jsxs(Fragment, {
children: [selectionNode, !values.length && !inputValue && /* @__PURE__ */ jsx("span", {
className: "".concat(selectionPrefixCls, "-placeholder"),
children: placeholder
})]
});
};
var SingleSelector = function SingleSelector2(props) {
var inputElement = props.inputElement, prefixCls = props.prefixCls, id2 = props.id, inputRef = props.inputRef, disabled = props.disabled, autoFocus = props.autoFocus, autoComplete = props.autoComplete, activeDescendantId = props.activeDescendantId, mode = props.mode, open = props.open, values = props.values, placeholder = props.placeholder, tabIndex = props.tabIndex, showSearch = props.showSearch, searchValue = props.searchValue, activeValue = props.activeValue, maxLength = props.maxLength, onInputKeyDown = props.onInputKeyDown, onInputMouseDown = props.onInputMouseDown, onInputChange = props.onInputChange, onInputPaste = props.onInputPaste, onInputCompositionStart = props.onInputCompositionStart, onInputCompositionEnd = props.onInputCompositionEnd;
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), inputChanged = _React$useState2[0], setInputChanged = _React$useState2[1];
var combobox = mode === "combobox";
var inputEditable = combobox || showSearch;
var item = values[0];
var inputValue = searchValue || "";
if (combobox && activeValue && !inputChanged) {
inputValue = activeValue;
}
React__namespace.useEffect(function() {
if (combobox) {
setInputChanged(false);
}
}, [combobox, activeValue]);
var hasTextInput = mode !== "combobox" && !open && !showSearch ? false : !!inputValue;
var title = getTitle(item);
var renderPlaceholder = function renderPlaceholder2() {
if (item) {
return null;
}
var hiddenStyle = hasTextInput ? {
visibility: "hidden"
} : void 0;
return /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-selection-placeholder"),
style: hiddenStyle,
children: placeholder
});
};
return /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-selection-search"),
children: /* @__PURE__ */ jsx(RefInput, {
ref: inputRef,
prefixCls,
id: id2,
open,
inputElement,
disabled,
autoFocus,
autoComplete,
editable: inputEditable,
activeDescendantId,
value: inputValue,
onKeyDown: onInputKeyDown,
onMouseDown: onInputMouseDown,
onChange: function onChange(e2) {
setInputChanged(true);
onInputChange(e2);
},
onPaste: onInputPaste,
onCompositionStart: onInputCompositionStart,
onCompositionEnd: onInputCompositionEnd,
tabIndex,
attrs: pickAttrs(props, true),
maxLength: combobox ? maxLength : void 0
})
}), !combobox && item ? /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-selection-item"),
title,
style: hasTextInput ? {
visibility: "hidden"
} : void 0,
children: item.label
}) : null, renderPlaceholder()]
});
};
function isValidateOpenKey(currentKeyCode) {
return ![
KeyCode.ESC,
KeyCode.SHIFT,
KeyCode.BACKSPACE,
KeyCode.TAB,
KeyCode.WIN_KEY,
KeyCode.ALT,
KeyCode.META,
KeyCode.WIN_KEY_RIGHT,
KeyCode.CTRL,
KeyCode.SEMICOLON,
KeyCode.EQUALS,
KeyCode.CAPS_LOCK,
KeyCode.CONTEXT_MENU,
KeyCode.F1,
KeyCode.F2,
KeyCode.F3,
KeyCode.F4,
KeyCode.F5,
KeyCode.F6,
KeyCode.F7,
KeyCode.F8,
KeyCode.F9,
KeyCode.F10,
KeyCode.F11,
KeyCode.F12
].includes(currentKeyCode);
}
var Selector = function Selector2(props, ref) {
var inputRef = React$a.useRef(null);
var compositionStatusRef = React$a.useRef(false);
var prefixCls = props.prefixCls, open = props.open, mode = props.mode, showSearch = props.showSearch, tokenWithEnter = props.tokenWithEnter, autoClearSearchValue = props.autoClearSearchValue, onSearch = props.onSearch, onSearchSubmit = props.onSearchSubmit, onToggleOpen = props.onToggleOpen, onInputKeyDown = props.onInputKeyDown, domRef = props.domRef;
React__namespace.useImperativeHandle(ref, function() {
return {
focus: function focus() {
inputRef.current.focus();
},
blur: function blur() {
inputRef.current.blur();
}
};
});
var _useLock = useLock(0), _useLock2 = _slicedToArray$e(_useLock, 2), getInputMouseDown = _useLock2[0], setInputMouseDown = _useLock2[1];
var onInternalInputKeyDown = function onInternalInputKeyDown2(event) {
var which = event.which;
if (which === KeyCode.UP || which === KeyCode.DOWN) {
event.preventDefault();
}
if (onInputKeyDown) {
onInputKeyDown(event);
}
if (which === KeyCode.ENTER && mode === "tags" && !compositionStatusRef.current && !open) {
onSearchSubmit === null || onSearchSubmit === void 0 ? void 0 : onSearchSubmit(event.target.value);
}
if (isValidateOpenKey(which)) {
onToggleOpen(true);
}
};
var onInternalInputMouseDown = function onInternalInputMouseDown2() {
setInputMouseDown(true);
};
var pastedTextRef = React$a.useRef(null);
var triggerOnSearch = function triggerOnSearch2(value) {
if (onSearch(value, true, compositionStatusRef.current) !== false) {
onToggleOpen(true);
}
};
var onInputCompositionStart = function onInputCompositionStart2() {
compositionStatusRef.current = true;
};
var onInputCompositionEnd = function onInputCompositionEnd2(e2) {
compositionStatusRef.current = false;
if (mode !== "combobox") {
triggerOnSearch(e2.target.value);
}
};
var onInputChange = function onInputChange2(event) {
var value = event.target.value;
if (tokenWithEnter && pastedTextRef.current && /[\r\n]/.test(pastedTextRef.current)) {
var replacedText = pastedTextRef.current.replace(/[\r\n]+$/, "").replace(/\r\n/g, " ").replace(/[\r\n]/g, " ");
value = value.replace(replacedText, pastedTextRef.current);
}
pastedTextRef.current = null;
triggerOnSearch(value);
};
var onInputPaste = function onInputPaste2(e2) {
var clipboardData = e2.clipboardData;
var value = clipboardData.getData("text");
pastedTextRef.current = value;
};
var onClick = function onClick2(_ref) {
var target = _ref.target;
if (target !== inputRef.current) {
var isIE = document.body.style.msTouchAction !== void 0;
if (isIE) {
setTimeout(function() {
inputRef.current.focus();
});
} else {
inputRef.current.focus();
}
}
};
var onMouseDown = function onMouseDown2(event) {
var inputMouseDown = getInputMouseDown();
if (event.target !== inputRef.current && !inputMouseDown && mode !== "combobox") {
event.preventDefault();
}
if (mode !== "combobox" && (!showSearch || !inputMouseDown) || !open) {
if (open && autoClearSearchValue !== false) {
onSearch("", true, false);
}
onToggleOpen();
}
};
var sharedProps = {
inputRef,
onInputKeyDown: onInternalInputKeyDown,
onInputMouseDown: onInternalInputMouseDown,
onInputChange,
onInputPaste,
onInputCompositionStart,
onInputCompositionEnd
};
var selectNode = mode === "multiple" || mode === "tags" ? /* @__PURE__ */ jsx(SelectSelector, {
...props,
...sharedProps
}) : /* @__PURE__ */ jsx(SingleSelector, {
...props,
...sharedProps
});
return /* @__PURE__ */ jsx("div", {
ref: domRef,
className: "".concat(prefixCls, "-selector"),
onClick,
onMouseDown,
children: selectNode
});
};
var ForwardSelector = /* @__PURE__ */ React__namespace.forwardRef(Selector);
ForwardSelector.displayName = "Selector";
var Portal$1 = /* @__PURE__ */ React$a.forwardRef(function(props, ref) {
var didUpdate = props.didUpdate, getContainer2 = props.getContainer, children = props.children;
var parentRef = React$a.useRef();
var containerRef = React$a.useRef();
React$a.useImperativeHandle(ref, function() {
return {};
});
var initRef = React$a.useRef(false);
if (!initRef.current && canUseDom$1()) {
containerRef.current = getContainer2();
parentRef.current = containerRef.current.parentNode;
initRef.current = true;
}
React$a.useEffect(function() {
didUpdate === null || didUpdate === void 0 ? void 0 : didUpdate(props);
});
React$a.useEffect(function() {
if (containerRef.current.parentNode === null && parentRef.current !== null) {
parentRef.current.appendChild(containerRef.current);
}
return function() {
var _containerRef$current, _containerRef$current2;
(_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 ? void 0 : (_containerRef$current2 = _containerRef$current.parentNode) === null || _containerRef$current2 === void 0 ? void 0 : _containerRef$current2.removeChild(containerRef.current);
};
}, []);
return containerRef.current ? /* @__PURE__ */ ReactDOM__default.default.createPortal(children, containerRef.current) : null;
});
function isPointsEq$1(a1, a2, isAlignPoint) {
if (isAlignPoint) {
return a1[0] === a2[0];
}
return a1[0] === a2[0] && a1[1] === a2[1];
}
function getAlignFromPlacement$1(builtinPlacements, placementStr, align) {
var baseAlign = builtinPlacements[placementStr] || {};
return _objectSpread2$a(_objectSpread2$a({}, baseAlign), align);
}
function getAlignPopupClassName(builtinPlacements, prefixCls, align, isAlignPoint) {
var points = align.points;
var placements2 = Object.keys(builtinPlacements);
for (var i2 = 0; i2 < placements2.length; i2 += 1) {
var placement = placements2[i2];
if (isPointsEq$1(builtinPlacements[placement].points, points, isAlignPoint)) {
return "".concat(prefixCls, "-placement-").concat(placement);
}
}
return "";
}
function getMotion$1(_ref) {
var prefixCls = _ref.prefixCls, motion2 = _ref.motion, animation = _ref.animation, transitionName2 = _ref.transitionName;
if (motion2) {
return motion2;
}
if (animation) {
return {
motionName: "".concat(prefixCls, "-").concat(animation)
};
}
if (transitionName2) {
return {
motionName: transitionName2
};
}
return null;
}
function Mask$1(props) {
var prefixCls = props.prefixCls, visible = props.visible, zIndex = props.zIndex, mask = props.mask, maskMotion = props.maskMotion, maskAnimation = props.maskAnimation, maskTransitionName = props.maskTransitionName;
if (!mask) {
return null;
}
var motion2 = {};
if (maskMotion || maskTransitionName || maskAnimation) {
motion2 = _objectSpread2$a({
motionAppear: true
}, getMotion$1({
motion: maskMotion,
prefixCls,
transitionName: maskTransitionName,
animation: maskAnimation
}));
}
return /* @__PURE__ */ jsx(CSSMotion, {
...motion2,
visible,
removeOnLeave: true,
children: function(_ref) {
var className = _ref.className;
return /* @__PURE__ */ jsx("div", {
style: {
zIndex
},
className: classnames("".concat(prefixCls, "-mask"), className)
});
}
});
}
function ownKeys$2(object2, enumerableOnly) {
var keys2 = Object.keys(object2);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object2);
enumerableOnly && (symbols = symbols.filter(function(sym) {
return Object.getOwnPropertyDescriptor(object2, sym).enumerable;
})), keys2.push.apply(keys2, symbols);
}
return keys2;
}
function _objectSpread2$9(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = null != arguments[i2] ? arguments[i2] : {};
i2 % 2 ? ownKeys$2(Object(source), true).forEach(function(key2) {
_defineProperty$a(target, key2, source[key2]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$2(Object(source)).forEach(function(key2) {
Object.defineProperty(target, key2, Object.getOwnPropertyDescriptor(source, key2));
});
}
return target;
}
function _typeof$p(obj) {
"@babel/helpers - typeof";
return _typeof$p = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$p(obj);
}
function _defineProperty$a(obj, key2, value) {
if (key2 in obj) {
Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key2] = value;
}
return obj;
}
var vendorPrefix;
var jsCssMap = {
Webkit: "-webkit-",
Moz: "-moz-",
ms: "-ms-",
O: "-o-"
};
function getVendorPrefix() {
if (vendorPrefix !== void 0) {
return vendorPrefix;
}
vendorPrefix = "";
var style2 = document.createElement("p").style;
var testProp = "Transform";
for (var key2 in jsCssMap) {
if (key2 + testProp in style2) {
vendorPrefix = key2;
}
}
return vendorPrefix;
}
function getTransitionName$1() {
return getVendorPrefix() ? "".concat(getVendorPrefix(), "TransitionProperty") : "transitionProperty";
}
function getTransformName() {
return getVendorPrefix() ? "".concat(getVendorPrefix(), "Transform") : "transform";
}
function setTransitionProperty(node, value) {
var name2 = getTransitionName$1();
if (name2) {
node.style[name2] = value;
if (name2 !== "transitionProperty") {
node.style.transitionProperty = value;
}
}
}
function setTransform(node, value) {
var name2 = getTransformName();
if (name2) {
node.style[name2] = value;
if (name2 !== "transform") {
node.style.transform = value;
}
}
}
function getTransitionProperty(node) {
return node.style.transitionProperty || node.style[getTransitionName$1()];
}
function getTransformXY(node) {
var style2 = window.getComputedStyle(node, null);
var transform = style2.getPropertyValue("transform") || style2.getPropertyValue(getTransformName());
if (transform && transform !== "none") {
var matrix = transform.replace(/[^0-9\-.,]/g, "").split(",");
return {
x: parseFloat(matrix[12] || matrix[4], 0),
y: parseFloat(matrix[13] || matrix[5], 0)
};
}
return {
x: 0,
y: 0
};
}
var matrix2d = /matrix\((.*)\)/;
var matrix3d = /matrix3d\((.*)\)/;
function setTransformXY(node, xy) {
var style2 = window.getComputedStyle(node, null);
var transform = style2.getPropertyValue("transform") || style2.getPropertyValue(getTransformName());
if (transform && transform !== "none") {
var arr;
var match2d = transform.match(matrix2d);
if (match2d) {
match2d = match2d[1];
arr = match2d.split(",").map(function(item) {
return parseFloat(item, 10);
});
arr[4] = xy.x;
arr[5] = xy.y;
setTransform(node, "matrix(".concat(arr.join(","), ")"));
} else {
var match3d = transform.match(matrix3d)[1];
arr = match3d.split(",").map(function(item) {
return parseFloat(item, 10);
});
arr[12] = xy.x;
arr[13] = xy.y;
setTransform(node, "matrix3d(".concat(arr.join(","), ")"));
}
} else {
setTransform(node, "translateX(".concat(xy.x, "px) translateY(").concat(xy.y, "px) translateZ(0)"));
}
}
var RE_NUM = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source;
var getComputedStyleX;
function forceRelayout(elem) {
var originalStyle = elem.style.display;
elem.style.display = "none";
elem.offsetHeight;
elem.style.display = originalStyle;
}
function css(el, name2, v2) {
var value = v2;
if (_typeof$p(name2) === "object") {
for (var i2 in name2) {
if (name2.hasOwnProperty(i2)) {
css(el, i2, name2[i2]);
}
}
return void 0;
}
if (typeof value !== "undefined") {
if (typeof value === "number") {
value = "".concat(value, "px");
}
el.style[name2] = value;
return void 0;
}
return getComputedStyleX(el, name2);
}
function getClientPosition$1(elem) {
var box;
var x2;
var y2;
var doc = elem.ownerDocument;
var body = doc.body;
var docElem = doc && doc.documentElement;
box = elem.getBoundingClientRect();
x2 = Math.floor(box.left);
y2 = Math.floor(box.top);
x2 -= docElem.clientLeft || body.clientLeft || 0;
y2 -= docElem.clientTop || body.clientTop || 0;
return {
left: x2,
top: y2
};
}
function getScroll$2(w2, top) {
var ret = w2["page".concat(top ? "Y" : "X", "Offset")];
var method2 = "scroll".concat(top ? "Top" : "Left");
if (typeof ret !== "number") {
var d2 = w2.document;
ret = d2.documentElement[method2];
if (typeof ret !== "number") {
ret = d2.body[method2];
}
}
return ret;
}
function getScrollLeft(w2) {
return getScroll$2(w2);
}
function getScrollTop(w2) {
return getScroll$2(w2, true);
}
function getOffset$3(el) {
var pos = getClientPosition$1(el);
var doc = el.ownerDocument;
var w2 = doc.defaultView || doc.parentWindow;
pos.left += getScrollLeft(w2);
pos.top += getScrollTop(w2);
return pos;
}
function isWindow$1(obj) {
return obj !== null && obj !== void 0 && obj == obj.window;
}
function getDocument(node) {
if (isWindow$1(node)) {
return node.document;
}
if (node.nodeType === 9) {
return node;
}
return node.ownerDocument;
}
function _getComputedStyle(elem, name2, cs2) {
var computedStyle = cs2;
var val = "";
var d2 = getDocument(elem);
computedStyle = computedStyle || d2.defaultView.getComputedStyle(elem, null);
if (computedStyle) {
val = computedStyle.getPropertyValue(name2) || computedStyle[name2];
}
return val;
}
var _RE_NUM_NO_PX = new RegExp("^(".concat(RE_NUM, ")(?!px)[a-z%]+$"), "i");
var RE_POS = /^(top|right|bottom|left)$/;
var CURRENT_STYLE = "currentStyle";
var RUNTIME_STYLE = "runtimeStyle";
var LEFT$1 = "left";
var PX = "px";
function _getComputedStyleIE(elem, name2) {
var ret = elem[CURRENT_STYLE] && elem[CURRENT_STYLE][name2];
if (_RE_NUM_NO_PX.test(ret) && !RE_POS.test(name2)) {
var style2 = elem.style;
var left = style2[LEFT$1];
var rsLeft = elem[RUNTIME_STYLE][LEFT$1];
elem[RUNTIME_STYLE][LEFT$1] = elem[CURRENT_STYLE][LEFT$1];
style2[LEFT$1] = name2 === "fontSize" ? "1em" : ret || 0;
ret = style2.pixelLeft + PX;
style2[LEFT$1] = left;
elem[RUNTIME_STYLE][LEFT$1] = rsLeft;
}
return ret === "" ? "auto" : ret;
}
if (typeof window !== "undefined") {
getComputedStyleX = window.getComputedStyle ? _getComputedStyle : _getComputedStyleIE;
}
function getOffsetDirection(dir, option) {
if (dir === "left") {
return option.useCssRight ? "right" : dir;
}
return option.useCssBottom ? "bottom" : dir;
}
function oppositeOffsetDirection(dir) {
if (dir === "left") {
return "right";
} else if (dir === "right") {
return "left";
} else if (dir === "top") {
return "bottom";
} else if (dir === "bottom") {
return "top";
}
}
function setLeftTop(elem, offset2, option) {
if (css(elem, "position") === "static") {
elem.style.position = "relative";
}
var presetH = -999;
var presetV = -999;
var horizontalProperty = getOffsetDirection("left", option);
var verticalProperty = getOffsetDirection("top", option);
var oppositeHorizontalProperty = oppositeOffsetDirection(horizontalProperty);
var oppositeVerticalProperty = oppositeOffsetDirection(verticalProperty);
if (horizontalProperty !== "left") {
presetH = 999;
}
if (verticalProperty !== "top") {
presetV = 999;
}
var originalTransition = "";
var originalOffset = getOffset$3(elem);
if ("left" in offset2 || "top" in offset2) {
originalTransition = getTransitionProperty(elem) || "";
setTransitionProperty(elem, "none");
}
if ("left" in offset2) {
elem.style[oppositeHorizontalProperty] = "";
elem.style[horizontalProperty] = "".concat(presetH, "px");
}
if ("top" in offset2) {
elem.style[oppositeVerticalProperty] = "";
elem.style[verticalProperty] = "".concat(presetV, "px");
}
forceRelayout(elem);
var old = getOffset$3(elem);
var originalStyle = {};
for (var key2 in offset2) {
if (offset2.hasOwnProperty(key2)) {
var dir = getOffsetDirection(key2, option);
var preset = key2 === "left" ? presetH : presetV;
var off = originalOffset[key2] - old[key2];
if (dir === key2) {
originalStyle[dir] = preset + off;
} else {
originalStyle[dir] = preset - off;
}
}
}
css(elem, originalStyle);
forceRelayout(elem);
if ("left" in offset2 || "top" in offset2) {
setTransitionProperty(elem, originalTransition);
}
var ret = {};
for (var _key in offset2) {
if (offset2.hasOwnProperty(_key)) {
var _dir = getOffsetDirection(_key, option);
var _off = offset2[_key] - originalOffset[_key];
if (_key === _dir) {
ret[_dir] = originalStyle[_dir] + _off;
} else {
ret[_dir] = originalStyle[_dir] - _off;
}
}
}
css(elem, ret);
}
function setTransform$1(elem, offset2) {
var originalOffset = getOffset$3(elem);
var originalXY = getTransformXY(elem);
var resultXY = {
x: originalXY.x,
y: originalXY.y
};
if ("left" in offset2) {
resultXY.x = originalXY.x + offset2.left - originalOffset.left;
}
if ("top" in offset2) {
resultXY.y = originalXY.y + offset2.top - originalOffset.top;
}
setTransformXY(elem, resultXY);
}
function setOffset(elem, offset2, option) {
if (option.ignoreShake) {
var oriOffset = getOffset$3(elem);
var oLeft = oriOffset.left.toFixed(0);
var oTop = oriOffset.top.toFixed(0);
var tLeft = offset2.left.toFixed(0);
var tTop = offset2.top.toFixed(0);
if (oLeft === tLeft && oTop === tTop) {
return;
}
}
if (option.useCssRight || option.useCssBottom) {
setLeftTop(elem, offset2, option);
} else if (option.useCssTransform && getTransformName() in document.body.style) {
setTransform$1(elem, offset2);
} else {
setLeftTop(elem, offset2, option);
}
}
function each(arr, fn) {
for (var i2 = 0; i2 < arr.length; i2++) {
fn(arr[i2]);
}
}
function isBorderBoxFn(elem) {
return getComputedStyleX(elem, "boxSizing") === "border-box";
}
var BOX_MODELS = ["margin", "border", "padding"];
var CONTENT_INDEX = -1;
var PADDING_INDEX = 2;
var BORDER_INDEX = 1;
var MARGIN_INDEX = 0;
function swap(elem, options, callback) {
var old = {};
var style2 = elem.style;
var name2;
for (name2 in options) {
if (options.hasOwnProperty(name2)) {
old[name2] = style2[name2];
style2[name2] = options[name2];
}
}
callback.call(elem);
for (name2 in options) {
if (options.hasOwnProperty(name2)) {
style2[name2] = old[name2];
}
}
}
function getPBMWidth(elem, props, which) {
var value = 0;
var prop;
var j2;
var i2;
for (j2 = 0; j2 < props.length; j2++) {
prop = props[j2];
if (prop) {
for (i2 = 0; i2 < which.length; i2++) {
var cssProp = void 0;
if (prop === "border") {
cssProp = "".concat(prop).concat(which[i2], "Width");
} else {
cssProp = prop + which[i2];
}
value += parseFloat(getComputedStyleX(elem, cssProp)) || 0;
}
}
}
return value;
}
var domUtils = {
getParent: function getParent2(element) {
var parent2 = element;
do {
if (parent2.nodeType === 11 && parent2.host) {
parent2 = parent2.host;
} else {
parent2 = parent2.parentNode;
}
} while (parent2 && parent2.nodeType !== 1 && parent2.nodeType !== 9);
return parent2;
}
};
each(["Width", "Height"], function(name2) {
domUtils["doc".concat(name2)] = function(refWin) {
var d2 = refWin.document;
return Math.max(
d2.documentElement["scroll".concat(name2)],
d2.body["scroll".concat(name2)],
domUtils["viewport".concat(name2)](d2)
);
};
domUtils["viewport".concat(name2)] = function(win) {
var prop = "client".concat(name2);
var doc = win.document;
var body = doc.body;
var documentElement = doc.documentElement;
var documentElementProp = documentElement[prop];
return doc.compatMode === "CSS1Compat" && documentElementProp || body && body[prop] || documentElementProp;
};
});
function getWH(elem, name2, ex) {
var extra = ex;
if (isWindow$1(elem)) {
return name2 === "width" ? domUtils.viewportWidth(elem) : domUtils.viewportHeight(elem);
} else if (elem.nodeType === 9) {
return name2 === "width" ? domUtils.docWidth(elem) : domUtils.docHeight(elem);
}
var which = name2 === "width" ? ["Left", "Right"] : ["Top", "Bottom"];
var borderBoxValue = name2 === "width" ? Math.floor(elem.getBoundingClientRect().width) : Math.floor(elem.getBoundingClientRect().height);
var isBorderBox = isBorderBoxFn(elem);
var cssBoxValue = 0;
if (borderBoxValue === null || borderBoxValue === void 0 || borderBoxValue <= 0) {
borderBoxValue = void 0;
cssBoxValue = getComputedStyleX(elem, name2);
if (cssBoxValue === null || cssBoxValue === void 0 || Number(cssBoxValue) < 0) {
cssBoxValue = elem.style[name2] || 0;
}
cssBoxValue = Math.floor(parseFloat(cssBoxValue)) || 0;
}
if (extra === void 0) {
extra = isBorderBox ? BORDER_INDEX : CONTENT_INDEX;
}
var borderBoxValueOrIsBorderBox = borderBoxValue !== void 0 || isBorderBox;
var val = borderBoxValue || cssBoxValue;
if (extra === CONTENT_INDEX) {
if (borderBoxValueOrIsBorderBox) {
return val - getPBMWidth(elem, ["border", "padding"], which);
}
return cssBoxValue;
} else if (borderBoxValueOrIsBorderBox) {
if (extra === BORDER_INDEX) {
return val;
}
return val + (extra === PADDING_INDEX ? -getPBMWidth(elem, ["border"], which) : getPBMWidth(elem, ["margin"], which));
}
return cssBoxValue + getPBMWidth(elem, BOX_MODELS.slice(extra), which);
}
var cssShow = {
position: "absolute",
visibility: "hidden",
display: "block"
};
function getWHIgnoreDisplay() {
for (var _len = arguments.length, args = new Array(_len), _key2 = 0; _key2 < _len; _key2++) {
args[_key2] = arguments[_key2];
}
var val;
var elem = args[0];
if (elem.offsetWidth !== 0) {
val = getWH.apply(void 0, args);
} else {
swap(elem, cssShow, function() {
val = getWH.apply(void 0, args);
});
}
return val;
}
each(["width", "height"], function(name2) {
var first = name2.charAt(0).toUpperCase() + name2.slice(1);
domUtils["outer".concat(first)] = function(el, includeMargin) {
return el && getWHIgnoreDisplay(el, name2, includeMargin ? MARGIN_INDEX : BORDER_INDEX);
};
var which = name2 === "width" ? ["Left", "Right"] : ["Top", "Bottom"];
domUtils[name2] = function(elem, v2) {
var val = v2;
if (val !== void 0) {
if (elem) {
var isBorderBox = isBorderBoxFn(elem);
if (isBorderBox) {
val += getPBMWidth(elem, ["padding", "border"], which);
}
return css(elem, name2, val);
}
return void 0;
}
return elem && getWHIgnoreDisplay(elem, name2, CONTENT_INDEX);
};
});
function mix(to, from) {
for (var i2 in from) {
if (from.hasOwnProperty(i2)) {
to[i2] = from[i2];
}
}
return to;
}
var utils$2 = {
getWindow: function getWindow(node) {
if (node && node.document && node.setTimeout) {
return node;
}
var doc = node.ownerDocument || node;
return doc.defaultView || doc.parentWindow;
},
getDocument,
offset: function offset2(el, value, option) {
if (typeof value !== "undefined") {
setOffset(el, value, option || {});
} else {
return getOffset$3(el);
}
},
isWindow: isWindow$1,
each,
css,
clone: function clone(obj) {
var i2;
var ret = {};
for (i2 in obj) {
if (obj.hasOwnProperty(i2)) {
ret[i2] = obj[i2];
}
}
var overflow = obj.overflow;
if (overflow) {
for (i2 in obj) {
if (obj.hasOwnProperty(i2)) {
ret.overflow[i2] = obj.overflow[i2];
}
}
}
return ret;
},
mix,
getWindowScrollLeft: function getWindowScrollLeft(w2) {
return getScrollLeft(w2);
},
getWindowScrollTop: function getWindowScrollTop(w2) {
return getScrollTop(w2);
},
merge: function merge2() {
var ret = {};
for (var i2 = 0; i2 < arguments.length; i2++) {
utils$2.mix(ret, i2 < 0 || arguments.length <= i2 ? void 0 : arguments[i2]);
}
return ret;
},
viewportWidth: 0,
viewportHeight: 0
};
mix(utils$2, domUtils);
var getParent = utils$2.getParent;
function getOffsetParent(element) {
if (utils$2.isWindow(element) || element.nodeType === 9) {
return null;
}
var doc = utils$2.getDocument(element);
var body = doc.body;
var parent2;
var positionStyle = utils$2.css(element, "position");
var skipStatic = positionStyle === "fixed" || positionStyle === "absolute";
if (!skipStatic) {
return element.nodeName.toLowerCase() === "html" ? null : getParent(element);
}
for (parent2 = getParent(element); parent2 && parent2 !== body && parent2.nodeType !== 9; parent2 = getParent(parent2)) {
positionStyle = utils$2.css(parent2, "position");
if (positionStyle !== "static") {
return parent2;
}
}
return null;
}
var getParent$1 = utils$2.getParent;
function isAncestorFixed(element) {
if (utils$2.isWindow(element) || element.nodeType === 9) {
return false;
}
var doc = utils$2.getDocument(element);
var body = doc.body;
var parent2 = null;
for (parent2 = getParent$1(element); parent2 && parent2 !== body && parent2 !== doc; parent2 = getParent$1(parent2)) {
var positionStyle = utils$2.css(parent2, "position");
if (positionStyle === "fixed") {
return true;
}
}
return false;
}
function getVisibleRectForElement(element, alwaysByViewport) {
var visibleRect = {
left: 0,
right: Infinity,
top: 0,
bottom: Infinity
};
var el = getOffsetParent(element);
var doc = utils$2.getDocument(element);
var win = doc.defaultView || doc.parentWindow;
var body = doc.body;
var documentElement = doc.documentElement;
while (el) {
if ((navigator.userAgent.indexOf("MSIE") === -1 || el.clientWidth !== 0) && el !== body && el !== documentElement && utils$2.css(el, "overflow") !== "visible") {
var pos = utils$2.offset(el);
pos.left += el.clientLeft;
pos.top += el.clientTop;
visibleRect.top = Math.max(visibleRect.top, pos.top);
visibleRect.right = Math.min(
visibleRect.right,
pos.left + el.clientWidth
);
visibleRect.bottom = Math.min(visibleRect.bottom, pos.top + el.clientHeight);
visibleRect.left = Math.max(visibleRect.left, pos.left);
} else if (el === body || el === documentElement) {
break;
}
el = getOffsetParent(el);
}
var originalPosition = null;
if (!utils$2.isWindow(element) && element.nodeType !== 9) {
originalPosition = element.style.position;
var position = utils$2.css(element, "position");
if (position === "absolute") {
element.style.position = "fixed";
}
}
var scrollX = utils$2.getWindowScrollLeft(win);
var scrollY = utils$2.getWindowScrollTop(win);
var viewportWidth = utils$2.viewportWidth(win);
var viewportHeight = utils$2.viewportHeight(win);
var documentWidth = documentElement.scrollWidth;
var documentHeight = documentElement.scrollHeight;
var bodyStyle = window.getComputedStyle(body);
if (bodyStyle.overflowX === "hidden") {
documentWidth = win.innerWidth;
}
if (bodyStyle.overflowY === "hidden") {
documentHeight = win.innerHeight;
}
if (element.style) {
element.style.position = originalPosition;
}
if (alwaysByViewport || isAncestorFixed(element)) {
visibleRect.left = Math.max(visibleRect.left, scrollX);
visibleRect.top = Math.max(visibleRect.top, scrollY);
visibleRect.right = Math.min(visibleRect.right, scrollX + viewportWidth);
visibleRect.bottom = Math.min(visibleRect.bottom, scrollY + viewportHeight);
} else {
var maxVisibleWidth = Math.max(documentWidth, scrollX + viewportWidth);
visibleRect.right = Math.min(visibleRect.right, maxVisibleWidth);
var maxVisibleHeight = Math.max(documentHeight, scrollY + viewportHeight);
visibleRect.bottom = Math.min(visibleRect.bottom, maxVisibleHeight);
}
return visibleRect.top >= 0 && visibleRect.left >= 0 && visibleRect.bottom > visibleRect.top && visibleRect.right > visibleRect.left ? visibleRect : null;
}
function adjustForViewport(elFuturePos, elRegion, visibleRect, overflow) {
var pos = utils$2.clone(elFuturePos);
var size = {
width: elRegion.width,
height: elRegion.height
};
if (overflow.adjustX && pos.left < visibleRect.left) {
pos.left = visibleRect.left;
}
if (overflow.resizeWidth && pos.left >= visibleRect.left && pos.left + size.width > visibleRect.right) {
size.width -= pos.left + size.width - visibleRect.right;
}
if (overflow.adjustX && pos.left + size.width > visibleRect.right) {
pos.left = Math.max(visibleRect.right - size.width, visibleRect.left);
}
if (overflow.adjustY && pos.top < visibleRect.top) {
pos.top = visibleRect.top;
}
if (overflow.resizeHeight && pos.top >= visibleRect.top && pos.top + size.height > visibleRect.bottom) {
size.height -= pos.top + size.height - visibleRect.bottom;
}
if (overflow.adjustY && pos.top + size.height > visibleRect.bottom) {
pos.top = Math.max(visibleRect.bottom - size.height, visibleRect.top);
}
return utils$2.mix(pos, size);
}
function getRegion(node) {
var offset2;
var w2;
var h2;
if (!utils$2.isWindow(node) && node.nodeType !== 9) {
offset2 = utils$2.offset(node);
w2 = utils$2.outerWidth(node);
h2 = utils$2.outerHeight(node);
} else {
var win = utils$2.getWindow(node);
offset2 = {
left: utils$2.getWindowScrollLeft(win),
top: utils$2.getWindowScrollTop(win)
};
w2 = utils$2.viewportWidth(win);
h2 = utils$2.viewportHeight(win);
}
offset2.width = w2;
offset2.height = h2;
return offset2;
}
function getAlignOffset(region, align) {
var V = align.charAt(0);
var H = align.charAt(1);
var w2 = region.width;
var h2 = region.height;
var x2 = region.left;
var y2 = region.top;
if (V === "c") {
y2 += h2 / 2;
} else if (V === "b") {
y2 += h2;
}
if (H === "c") {
x2 += w2 / 2;
} else if (H === "r") {
x2 += w2;
}
return {
left: x2,
top: y2
};
}
function getElFuturePos(elRegion, refNodeRegion, points, offset2, targetOffset2) {
var p1 = getAlignOffset(refNodeRegion, points[1]);
var p2 = getAlignOffset(elRegion, points[0]);
var diff = [p2.left - p1.left, p2.top - p1.top];
return {
left: Math.round(elRegion.left - diff[0] + offset2[0] - targetOffset2[0]),
top: Math.round(elRegion.top - diff[1] + offset2[1] - targetOffset2[1])
};
}
function isFailX(elFuturePos, elRegion, visibleRect) {
return elFuturePos.left < visibleRect.left || elFuturePos.left + elRegion.width > visibleRect.right;
}
function isFailY(elFuturePos, elRegion, visibleRect) {
return elFuturePos.top < visibleRect.top || elFuturePos.top + elRegion.height > visibleRect.bottom;
}
function isCompleteFailX(elFuturePos, elRegion, visibleRect) {
return elFuturePos.left > visibleRect.right || elFuturePos.left + elRegion.width < visibleRect.left;
}
function isCompleteFailY(elFuturePos, elRegion, visibleRect) {
return elFuturePos.top > visibleRect.bottom || elFuturePos.top + elRegion.height < visibleRect.top;
}
function flip(points, reg, map) {
var ret = [];
utils$2.each(points, function(p2) {
ret.push(p2.replace(reg, function(m2) {
return map[m2];
}));
});
return ret;
}
function flipOffset(offset2, index2) {
offset2[index2] = -offset2[index2];
return offset2;
}
function convertOffset(str, offsetLen) {
var n2;
if (/%$/.test(str)) {
n2 = parseInt(str.substring(0, str.length - 1), 10) / 100 * offsetLen;
} else {
n2 = parseInt(str, 10);
}
return n2 || 0;
}
function normalizeOffset(offset2, el) {
offset2[0] = convertOffset(offset2[0], el.width);
offset2[1] = convertOffset(offset2[1], el.height);
}
function doAlign(el, tgtRegion, align, isTgtRegionVisible) {
var points = align.points;
var offset2 = align.offset || [0, 0];
var targetOffset2 = align.targetOffset || [0, 0];
var overflow = align.overflow;
var source = align.source || el;
offset2 = [].concat(offset2);
targetOffset2 = [].concat(targetOffset2);
overflow = overflow || {};
var newOverflowCfg = {};
var fail = 0;
var alwaysByViewport = !!(overflow && overflow.alwaysByViewport);
var visibleRect = getVisibleRectForElement(source, alwaysByViewport);
var elRegion = getRegion(source);
normalizeOffset(offset2, elRegion);
normalizeOffset(targetOffset2, tgtRegion);
var elFuturePos = getElFuturePos(elRegion, tgtRegion, points, offset2, targetOffset2);
var newElRegion = utils$2.merge(elRegion, elFuturePos);
if (visibleRect && (overflow.adjustX || overflow.adjustY) && isTgtRegionVisible) {
if (overflow.adjustX) {
if (isFailX(elFuturePos, elRegion, visibleRect)) {
var newPoints = flip(points, /[lr]/gi, {
l: "r",
r: "l"
});
var newOffset = flipOffset(offset2, 0);
var newTargetOffset = flipOffset(targetOffset2, 0);
var newElFuturePos = getElFuturePos(elRegion, tgtRegion, newPoints, newOffset, newTargetOffset);
if (!isCompleteFailX(newElFuturePos, elRegion, visibleRect)) {
fail = 1;
points = newPoints;
offset2 = newOffset;
targetOffset2 = newTargetOffset;
}
}
}
if (overflow.adjustY) {
if (isFailY(elFuturePos, elRegion, visibleRect)) {
var _newPoints = flip(points, /[tb]/gi, {
t: "b",
b: "t"
});
var _newOffset = flipOffset(offset2, 1);
var _newTargetOffset = flipOffset(targetOffset2, 1);
var _newElFuturePos = getElFuturePos(elRegion, tgtRegion, _newPoints, _newOffset, _newTargetOffset);
if (!isCompleteFailY(_newElFuturePos, elRegion, visibleRect)) {
fail = 1;
points = _newPoints;
offset2 = _newOffset;
targetOffset2 = _newTargetOffset;
}
}
}
if (fail) {
elFuturePos = getElFuturePos(elRegion, tgtRegion, points, offset2, targetOffset2);
utils$2.mix(newElRegion, elFuturePos);
}
var isStillFailX = isFailX(elFuturePos, elRegion, visibleRect);
var isStillFailY = isFailY(elFuturePos, elRegion, visibleRect);
if (isStillFailX || isStillFailY) {
var _newPoints2 = points;
if (isStillFailX) {
_newPoints2 = flip(points, /[lr]/gi, {
l: "r",
r: "l"
});
}
if (isStillFailY) {
_newPoints2 = flip(points, /[tb]/gi, {
t: "b",
b: "t"
});
}
points = _newPoints2;
offset2 = align.offset || [0, 0];
targetOffset2 = align.targetOffset || [0, 0];
}
newOverflowCfg.adjustX = overflow.adjustX && isStillFailX;
newOverflowCfg.adjustY = overflow.adjustY && isStillFailY;
if (newOverflowCfg.adjustX || newOverflowCfg.adjustY) {
newElRegion = adjustForViewport(elFuturePos, elRegion, visibleRect, newOverflowCfg);
}
}
if (newElRegion.width !== elRegion.width) {
utils$2.css(source, "width", utils$2.width(source) + newElRegion.width - elRegion.width);
}
if (newElRegion.height !== elRegion.height) {
utils$2.css(source, "height", utils$2.height(source) + newElRegion.height - elRegion.height);
}
utils$2.offset(source, {
left: newElRegion.left,
top: newElRegion.top
}, {
useCssRight: align.useCssRight,
useCssBottom: align.useCssBottom,
useCssTransform: align.useCssTransform,
ignoreShake: align.ignoreShake
});
return {
points,
offset: offset2,
targetOffset: targetOffset2,
overflow: newOverflowCfg
};
}
function isOutOfVisibleRect(target, alwaysByViewport) {
var visibleRect = getVisibleRectForElement(target, alwaysByViewport);
var targetRegion = getRegion(target);
return !visibleRect || targetRegion.left + targetRegion.width <= visibleRect.left || targetRegion.top + targetRegion.height <= visibleRect.top || targetRegion.left >= visibleRect.right || targetRegion.top >= visibleRect.bottom;
}
function alignElement(el, refNode, align) {
var target = align.target || refNode;
var refNodeRegion = getRegion(target);
var isTargetNotOutOfVisible = !isOutOfVisibleRect(target, align.overflow && align.overflow.alwaysByViewport);
return doAlign(el, refNodeRegion, align, isTargetNotOutOfVisible);
}
alignElement.__getOffsetParent = getOffsetParent;
alignElement.__getVisibleRectForElement = getVisibleRectForElement;
function alignPoint(el, tgtPoint, align) {
var pageX;
var pageY;
var doc = utils$2.getDocument(el);
var win = doc.defaultView || doc.parentWindow;
var scrollX = utils$2.getWindowScrollLeft(win);
var scrollY = utils$2.getWindowScrollTop(win);
var viewportWidth = utils$2.viewportWidth(win);
var viewportHeight = utils$2.viewportHeight(win);
if ("pageX" in tgtPoint) {
pageX = tgtPoint.pageX;
} else {
pageX = scrollX + tgtPoint.clientX;
}
if ("pageY" in tgtPoint) {
pageY = tgtPoint.pageY;
} else {
pageY = scrollY + tgtPoint.clientY;
}
var tgtRegion = {
left: pageX,
top: pageY,
width: 0,
height: 0
};
var pointInView = pageX >= 0 && pageX <= scrollX + viewportWidth && pageY >= 0 && pageY <= scrollY + viewportHeight;
var points = [align.points[0], "cc"];
return doAlign(el, tgtRegion, _objectSpread2$9(_objectSpread2$9({}, align), {}, {
points
}), pointInView);
}
function isEqual$2(obj1, obj2) {
var shallow = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : false;
var refSet = /* @__PURE__ */ new Set();
function deepEqual(a, b2) {
var level = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 1;
var circular = refSet.has(a);
warningOnce(!circular, "Warning: There may be circular references");
if (circular) {
return false;
}
if (a === b2) {
return true;
}
if (shallow && level > 1) {
return false;
}
refSet.add(a);
var newLevel = level + 1;
if (Array.isArray(a)) {
if (!Array.isArray(b2) || a.length !== b2.length) {
return false;
}
for (var i2 = 0; i2 < a.length; i2++) {
if (!deepEqual(a[i2], b2[i2], newLevel)) {
return false;
}
}
return true;
}
if (a && b2 && _typeof$q(a) === "object" && _typeof$q(b2) === "object") {
var keys2 = Object.keys(a);
if (keys2.length !== Object.keys(b2).length) {
return false;
}
return keys2.every(function(key2) {
return deepEqual(a[key2], b2[key2], newLevel);
});
}
return false;
}
return deepEqual(obj1, obj2);
}
const isVisible = function(element) {
if (!element) {
return false;
}
if (element instanceof Element) {
if (element.offsetParent) {
return true;
}
if (element.getBBox) {
var _getBBox = element.getBBox(), width = _getBBox.width, height = _getBBox.height;
if (width || height) {
return true;
}
}
if (element.getBoundingClientRect) {
var _element$getBoundingC = element.getBoundingClientRect(), _width = _element$getBoundingC.width, _height = _element$getBoundingC.height;
if (_width || _height) {
return true;
}
}
}
return false;
};
const useBuffer = function(callback, buffer2) {
var calledRef = React__default.default.useRef(false);
var timeoutRef = React__default.default.useRef(null);
function cancelTrigger() {
window.clearTimeout(timeoutRef.current);
}
function trigger(force) {
cancelTrigger();
if (!calledRef.current || force === true) {
if (callback(force) === false) {
return;
}
calledRef.current = true;
timeoutRef.current = window.setTimeout(function() {
calledRef.current = false;
}, buffer2);
} else {
timeoutRef.current = window.setTimeout(function() {
calledRef.current = false;
trigger();
}, buffer2);
}
}
return [trigger, function() {
calledRef.current = false;
cancelTrigger();
}];
};
function isSamePoint$1(prev, next) {
if (prev === next)
return true;
if (!prev || !next)
return false;
if ("pageX" in next && "pageY" in next) {
return prev.pageX === next.pageX && prev.pageY === next.pageY;
}
if ("clientX" in next && "clientY" in next) {
return prev.clientX === next.clientX && prev.clientY === next.clientY;
}
return false;
}
function restoreFocus$1(activeElement, container) {
if (activeElement !== document.activeElement && contains$2(container, activeElement) && typeof activeElement.focus === "function") {
activeElement.focus();
}
}
function monitorResize(element, callback) {
var prevWidth = null;
var prevHeight = null;
function onResize2(_ref) {
var _ref2 = _slicedToArray$e(_ref, 1), target = _ref2[0].target;
if (!document.documentElement.contains(target))
return;
var _target$getBoundingCl = target.getBoundingClientRect(), width = _target$getBoundingCl.width, height = _target$getBoundingCl.height;
var fixedWidth = Math.floor(width);
var fixedHeight = Math.floor(height);
if (prevWidth !== fixedWidth || prevHeight !== fixedHeight) {
Promise.resolve().then(function() {
callback({
width: fixedWidth,
height: fixedHeight
});
});
}
prevWidth = fixedWidth;
prevHeight = fixedHeight;
}
var resizeObserver2 = new index$Z(onResize2);
if (element) {
resizeObserver2.observe(element);
}
return function() {
resizeObserver2.disconnect();
};
}
function getElement$1(func) {
if (typeof func !== "function")
return null;
return func();
}
function getPoint$1(point) {
if (_typeof$q(point) !== "object" || !point)
return null;
return point;
}
var Align$1 = function Align2(_ref, ref) {
var children = _ref.children, disabled = _ref.disabled, target = _ref.target, align = _ref.align, onAlign = _ref.onAlign, monitorWindowResize = _ref.monitorWindowResize, _ref$monitorBufferTim = _ref.monitorBufferTime, monitorBufferTime = _ref$monitorBufferTim === void 0 ? 0 : _ref$monitorBufferTim;
var cacheRef = React__default.default.useRef({});
var nodeRef = React__default.default.useRef();
var childNode = React__default.default.Children.only(children);
var forceAlignPropsRef = React__default.default.useRef({});
forceAlignPropsRef.current.disabled = disabled;
forceAlignPropsRef.current.target = target;
forceAlignPropsRef.current.align = align;
forceAlignPropsRef.current.onAlign = onAlign;
var _useBuffer = useBuffer(function() {
var _forceAlignPropsRef$c = forceAlignPropsRef.current, latestDisabled = _forceAlignPropsRef$c.disabled, latestTarget = _forceAlignPropsRef$c.target, latestAlign = _forceAlignPropsRef$c.align, latestOnAlign = _forceAlignPropsRef$c.onAlign;
var source = nodeRef.current;
if (!latestDisabled && latestTarget && source) {
var _result;
var _element = getElement$1(latestTarget);
var _point = getPoint$1(latestTarget);
cacheRef.current.element = _element;
cacheRef.current.point = _point;
cacheRef.current.align = latestAlign;
var _document = document, activeElement = _document.activeElement;
if (_element && isVisible(_element)) {
_result = alignElement(source, _element, latestAlign);
} else if (_point) {
_result = alignPoint(source, _point, latestAlign);
}
restoreFocus$1(activeElement, source);
if (latestOnAlign && _result) {
latestOnAlign(source, _result);
}
return true;
}
return false;
}, monitorBufferTime), _useBuffer2 = _slicedToArray$e(_useBuffer, 2), _forceAlign = _useBuffer2[0], cancelForceAlign = _useBuffer2[1];
var _React$useState = React__default.default.useState(), _React$useState2 = _slicedToArray$e(_React$useState, 2), element = _React$useState2[0], setElement = _React$useState2[1];
var _React$useState3 = React__default.default.useState(), _React$useState4 = _slicedToArray$e(_React$useState3, 2), point = _React$useState4[0], setPoint = _React$useState4[1];
useLayoutEffect$1(function() {
setElement(getElement$1(target));
setPoint(getPoint$1(target));
});
React__default.default.useEffect(function() {
if (cacheRef.current.element !== element || !isSamePoint$1(cacheRef.current.point, point) || !isEqual$2(cacheRef.current.align, align)) {
_forceAlign();
}
});
React__default.default.useEffect(function() {
var cancelFn = monitorResize(nodeRef.current, _forceAlign);
return cancelFn;
}, [nodeRef.current]);
React__default.default.useEffect(function() {
var cancelFn = monitorResize(element, _forceAlign);
return cancelFn;
}, [element]);
React__default.default.useEffect(function() {
if (!disabled) {
_forceAlign();
} else {
cancelForceAlign();
}
}, [disabled]);
React__default.default.useEffect(function() {
if (monitorWindowResize) {
var cancelFn = addEventListenerWrap$2(window, "resize", _forceAlign);
return cancelFn.remove;
}
}, [monitorWindowResize]);
React__default.default.useEffect(function() {
return function() {
cancelForceAlign();
};
}, []);
React__default.default.useImperativeHandle(ref, function() {
return {
forceAlign: function forceAlign() {
return _forceAlign(true);
}
};
});
if (/* @__PURE__ */ React__default.default.isValidElement(childNode)) {
childNode = /* @__PURE__ */ React__default.default.cloneElement(childNode, {
ref: composeRef(childNode.ref, nodeRef)
});
}
return childNode;
};
var RcAlign = /* @__PURE__ */ React__default.default.forwardRef(Align$1);
RcAlign.displayName = "Align";
var StatusQueue = ["measure", "alignPre", "align", null, "motion"];
const useVisibleStatus = function(visible, doMeasure) {
var _useState = useSafeState(null), _useState2 = _slicedToArray$e(_useState, 2), status = _useState2[0], setInternalStatus = _useState2[1];
var rafRef = React$a.useRef();
function setStatus(nextStatus) {
setInternalStatus(nextStatus, true);
}
function cancelRaf() {
wrapperRaf$1.cancel(rafRef.current);
}
function goNextStatus(callback) {
cancelRaf();
rafRef.current = wrapperRaf$1(function() {
setStatus(function(prev) {
switch (status) {
case "align":
return "motion";
case "motion":
return "stable";
}
return prev;
});
callback === null || callback === void 0 ? void 0 : callback();
});
}
React$a.useEffect(function() {
setStatus("measure");
}, [visible]);
React$a.useEffect(function() {
switch (status) {
case "measure":
doMeasure();
break;
}
if (status) {
rafRef.current = wrapperRaf$1(/* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime$3().mark(function _callee() {
var index2, nextStatus;
return _regeneratorRuntime$3().wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
index2 = StatusQueue.indexOf(status);
nextStatus = StatusQueue[index2 + 1];
if (nextStatus && index2 !== -1) {
setStatus(nextStatus);
}
case 3:
case "end":
return _context.stop();
}
}
}, _callee);
})));
}
}, [status]);
React$a.useEffect(function() {
return function() {
cancelRaf();
};
}, []);
return [status, goNextStatus];
};
const useStretchStyle = function(stretch) {
var _React$useState = React__namespace.useState({
width: 0,
height: 0
}), _React$useState2 = _slicedToArray$e(_React$useState, 2), targetSize = _React$useState2[0], setTargetSize = _React$useState2[1];
function measureStretch(element) {
var tgtWidth = element.offsetWidth, tgtHeight = element.offsetHeight;
var _element$getBoundingC = element.getBoundingClientRect(), width = _element$getBoundingC.width, height = _element$getBoundingC.height;
if (Math.abs(tgtWidth - width) < 1 && Math.abs(tgtHeight - height) < 1) {
tgtWidth = width;
tgtHeight = height;
}
setTargetSize({
width: tgtWidth,
height: tgtHeight
});
}
var style2 = React__namespace.useMemo(function() {
var sizeStyle = {};
if (stretch) {
var width = targetSize.width, height = targetSize.height;
if (stretch.indexOf("height") !== -1 && height) {
sizeStyle.height = height;
} else if (stretch.indexOf("minHeight") !== -1 && height) {
sizeStyle.minHeight = height;
}
if (stretch.indexOf("width") !== -1 && width) {
sizeStyle.width = width;
} else if (stretch.indexOf("minWidth") !== -1 && width) {
sizeStyle.minWidth = width;
}
}
return sizeStyle;
}, [stretch, targetSize]);
return [style2, measureStretch];
};
var PopupInner$1 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var visible = props.visible, prefixCls = props.prefixCls, className = props.className, style2 = props.style, children = props.children, zIndex = props.zIndex, stretch = props.stretch, destroyPopupOnHide = props.destroyPopupOnHide, forceRender = props.forceRender, align = props.align, point = props.point, getRootDomNode = props.getRootDomNode, getClassNameFromAlign = props.getClassNameFromAlign, onAlign = props.onAlign, onMouseEnter = props.onMouseEnter, onMouseLeave = props.onMouseLeave, onMouseDown = props.onMouseDown, onTouchStart = props.onTouchStart, onClick = props.onClick;
var alignRef = React$a.useRef();
var elementRef = React$a.useRef();
var _useState = React$a.useState(), _useState2 = _slicedToArray$e(_useState, 2), alignedClassName = _useState2[0], setAlignedClassName = _useState2[1];
var _useStretchStyle = useStretchStyle(stretch), _useStretchStyle2 = _slicedToArray$e(_useStretchStyle, 2), stretchStyle = _useStretchStyle2[0], measureStretchStyle = _useStretchStyle2[1];
function doMeasure() {
if (stretch) {
measureStretchStyle(getRootDomNode());
}
}
var _useVisibleStatus = useVisibleStatus(visible, doMeasure), _useVisibleStatus2 = _slicedToArray$e(_useVisibleStatus, 2), status = _useVisibleStatus2[0], goNextStatus = _useVisibleStatus2[1];
var _useState3 = React$a.useState(0), _useState4 = _slicedToArray$e(_useState3, 2), alignTimes = _useState4[0], setAlignTimes = _useState4[1];
var prepareResolveRef = React$a.useRef();
useLayoutEffect$1(function() {
if (status === "alignPre") {
setAlignTimes(0);
}
}, [status]);
function getAlignTarget() {
if (point) {
return point;
}
return getRootDomNode;
}
function forceAlign() {
var _alignRef$current;
(_alignRef$current = alignRef.current) === null || _alignRef$current === void 0 ? void 0 : _alignRef$current.forceAlign();
}
function onInternalAlign(popupDomNode, matchAlign) {
var nextAlignedClassName = getClassNameFromAlign(matchAlign);
if (alignedClassName !== nextAlignedClassName) {
setAlignedClassName(nextAlignedClassName);
}
setAlignTimes(function(val) {
return val + 1;
});
if (status === "align") {
onAlign === null || onAlign === void 0 ? void 0 : onAlign(popupDomNode, matchAlign);
}
}
useLayoutEffect$1(function() {
if (status === "align") {
if (alignTimes < 3) {
forceAlign();
} else {
goNextStatus(function() {
var _prepareResolveRef$cu;
(_prepareResolveRef$cu = prepareResolveRef.current) === null || _prepareResolveRef$cu === void 0 ? void 0 : _prepareResolveRef$cu.call(prepareResolveRef);
});
}
}
}, [alignTimes]);
var motion2 = _objectSpread2$a({}, getMotion$1(props));
["onAppearEnd", "onEnterEnd", "onLeaveEnd"].forEach(function(eventName) {
var originHandler = motion2[eventName];
motion2[eventName] = function(element, event) {
goNextStatus();
return originHandler === null || originHandler === void 0 ? void 0 : originHandler(element, event);
};
});
function onShowPrepare() {
return new Promise(function(resolve) {
prepareResolveRef.current = resolve;
});
}
React__namespace.useEffect(function() {
if (!motion2.motionName && status === "motion") {
goNextStatus();
}
}, [motion2.motionName, status]);
React__namespace.useImperativeHandle(ref, function() {
return {
forceAlign,
getElement: function getElement2() {
return elementRef.current;
}
};
});
var mergedStyle = _objectSpread2$a(_objectSpread2$a({}, stretchStyle), {}, {
zIndex,
opacity: status === "motion" || status === "stable" || !visible ? void 0 : 0,
pointerEvents: !visible && status !== "stable" ? "none" : void 0
}, style2);
var alignDisabled = true;
if (align !== null && align !== void 0 && align.points && (status === "align" || status === "stable")) {
alignDisabled = false;
}
var childNode = children;
if (React__namespace.Children.count(children) > 1) {
childNode = /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-content"),
children
});
}
return /* @__PURE__ */ jsx(CSSMotion, {
visible,
ref: elementRef,
leavedClassName: "".concat(prefixCls, "-hidden"),
...motion2,
onAppearPrepare: onShowPrepare,
onEnterPrepare: onShowPrepare,
removeOnLeave: destroyPopupOnHide,
forceRender,
children: function(_ref, motionRef) {
var motionClassName = _ref.className, motionStyle = _ref.style;
var mergedClassName = classnames(prefixCls, className, alignedClassName, motionClassName);
return /* @__PURE__ */ jsx(RcAlign, {
target: getAlignTarget(),
ref: alignRef,
monitorWindowResize: true,
disabled: alignDisabled,
align,
onAlign: onInternalAlign,
children: /* @__PURE__ */ jsx("div", {
ref: motionRef,
className: mergedClassName,
onMouseEnter,
onMouseLeave,
onMouseDownCapture: onMouseDown,
onTouchStartCapture: onTouchStart,
onClick,
style: _objectSpread2$a(_objectSpread2$a({}, motionStyle), mergedStyle),
children: childNode
})
}, "popup");
}
});
});
PopupInner$1.displayName = "PopupInner";
var MobilePopupInner = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var prefixCls = props.prefixCls, visible = props.visible, zIndex = props.zIndex, children = props.children, _props$mobile = props.mobile;
_props$mobile = _props$mobile === void 0 ? {} : _props$mobile;
var popupClassName = _props$mobile.popupClassName, popupStyle = _props$mobile.popupStyle, _props$mobile$popupMo = _props$mobile.popupMotion, popupMotion = _props$mobile$popupMo === void 0 ? {} : _props$mobile$popupMo, popupRender = _props$mobile.popupRender, onClick = props.onClick;
var elementRef = React__namespace.useRef();
React__namespace.useImperativeHandle(ref, function() {
return {
forceAlign: function forceAlign() {
},
getElement: function getElement2() {
return elementRef.current;
}
};
});
var mergedStyle = _objectSpread2$a({
zIndex
}, popupStyle);
var childNode = children;
if (React__namespace.Children.count(children) > 1) {
childNode = /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-content"),
children
});
}
if (popupRender) {
childNode = popupRender(childNode);
}
return /* @__PURE__ */ jsx(CSSMotion, {
visible,
ref: elementRef,
removeOnLeave: true,
...popupMotion,
children: function(_ref, motionRef) {
var motionClassName = _ref.className, motionStyle = _ref.style;
var mergedClassName = classnames(prefixCls, popupClassName, motionClassName);
return /* @__PURE__ */ jsx("div", {
ref: motionRef,
className: mergedClassName,
onClick,
style: _objectSpread2$a(_objectSpread2$a({}, motionStyle), mergedStyle),
children: childNode
});
}
});
});
MobilePopupInner.displayName = "MobilePopupInner";
var _excluded$G = ["visible", "mobile"];
var Popup$2 = /* @__PURE__ */ React__namespace.forwardRef(function(_ref, ref) {
var visible = _ref.visible, mobile = _ref.mobile, props = _objectWithoutProperties$1(_ref, _excluded$G);
var _useState = React$a.useState(visible), _useState2 = _slicedToArray$e(_useState, 2), innerVisible = _useState2[0], serInnerVisible = _useState2[1];
var _useState3 = React$a.useState(false), _useState4 = _slicedToArray$e(_useState3, 2), inMobile = _useState4[0], setInMobile = _useState4[1];
var cloneProps = _objectSpread2$a(_objectSpread2$a({}, props), {}, {
visible: innerVisible
});
React$a.useEffect(function() {
serInnerVisible(visible);
if (visible && mobile) {
setInMobile(isMobile$1());
}
}, [visible, mobile]);
var popupNode = inMobile ? /* @__PURE__ */ jsx(MobilePopupInner, {
...cloneProps,
mobile,
ref
}) : /* @__PURE__ */ jsx(PopupInner$1, {
...cloneProps,
ref
});
return /* @__PURE__ */ jsxs("div", {
children: [/* @__PURE__ */ jsx(Mask$1, {
...cloneProps
}), popupNode]
});
});
Popup$2.displayName = "Popup";
var TriggerContext = /* @__PURE__ */ React__namespace.createContext(null);
function noop$6() {
}
function returnEmptyString$1() {
return "";
}
function returnDocument$1(element) {
if (element) {
return element.ownerDocument;
}
return window.document;
}
var ALL_HANDLERS$1 = ["onClick", "onMouseDown", "onTouchStart", "onMouseEnter", "onMouseLeave", "onFocus", "onBlur", "onContextMenu"];
function generateTrigger(PortalComponent) {
var Trigger2 = /* @__PURE__ */ function(_React$Component) {
_inherits(Trigger3, _React$Component);
var _super = _createSuper(Trigger3);
function Trigger3(props) {
var _this2;
_classCallCheck(this, Trigger3);
_this2 = _super.call(this, props);
_defineProperty$b(_assertThisInitialized(_this2), "popupRef", /* @__PURE__ */ React__namespace.createRef());
_defineProperty$b(_assertThisInitialized(_this2), "triggerRef", /* @__PURE__ */ React__namespace.createRef());
_defineProperty$b(_assertThisInitialized(_this2), "portalContainer", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "attachId", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "clickOutsideHandler", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "touchOutsideHandler", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "contextMenuOutsideHandler1", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "contextMenuOutsideHandler2", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "mouseDownTimeout", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "focusTime", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "preClickTime", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "preTouchTime", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "delayTimer", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "hasPopupMouseDown", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "onMouseEnter", function(e2) {
var mouseEnterDelay = _this2.props.mouseEnterDelay;
_this2.fireEvents("onMouseEnter", e2);
_this2.delaySetPopupVisible(true, mouseEnterDelay, mouseEnterDelay ? null : e2);
});
_defineProperty$b(_assertThisInitialized(_this2), "onMouseMove", function(e2) {
_this2.fireEvents("onMouseMove", e2);
_this2.setPoint(e2);
});
_defineProperty$b(_assertThisInitialized(_this2), "onMouseLeave", function(e2) {
_this2.fireEvents("onMouseLeave", e2);
_this2.delaySetPopupVisible(false, _this2.props.mouseLeaveDelay);
});
_defineProperty$b(_assertThisInitialized(_this2), "onPopupMouseEnter", function() {
_this2.clearDelayTimer();
});
_defineProperty$b(_assertThisInitialized(_this2), "onPopupMouseLeave", function(e2) {
var _this$popupRef$curren;
if (e2.relatedTarget && !e2.relatedTarget.setTimeout && contains$2((_this$popupRef$curren = _this2.popupRef.current) === null || _this$popupRef$curren === void 0 ? void 0 : _this$popupRef$curren.getElement(), e2.relatedTarget)) {
return;
}
_this2.delaySetPopupVisible(false, _this2.props.mouseLeaveDelay);
});
_defineProperty$b(_assertThisInitialized(_this2), "onFocus", function(e2) {
_this2.fireEvents("onFocus", e2);
_this2.clearDelayTimer();
if (_this2.isFocusToShow()) {
_this2.focusTime = Date.now();
_this2.delaySetPopupVisible(true, _this2.props.focusDelay);
}
});
_defineProperty$b(_assertThisInitialized(_this2), "onMouseDown", function(e2) {
_this2.fireEvents("onMouseDown", e2);
_this2.preClickTime = Date.now();
});
_defineProperty$b(_assertThisInitialized(_this2), "onTouchStart", function(e2) {
_this2.fireEvents("onTouchStart", e2);
_this2.preTouchTime = Date.now();
});
_defineProperty$b(_assertThisInitialized(_this2), "onBlur", function(e2) {
_this2.fireEvents("onBlur", e2);
_this2.clearDelayTimer();
if (_this2.isBlurToHide()) {
_this2.delaySetPopupVisible(false, _this2.props.blurDelay);
}
});
_defineProperty$b(_assertThisInitialized(_this2), "onContextMenu", function(e2) {
e2.preventDefault();
_this2.fireEvents("onContextMenu", e2);
_this2.setPopupVisible(true, e2);
});
_defineProperty$b(_assertThisInitialized(_this2), "onContextMenuClose", function() {
if (_this2.isContextMenuToShow()) {
_this2.close();
}
});
_defineProperty$b(_assertThisInitialized(_this2), "onClick", function(event) {
_this2.fireEvents("onClick", event);
if (_this2.focusTime) {
var preTime;
if (_this2.preClickTime && _this2.preTouchTime) {
preTime = Math.min(_this2.preClickTime, _this2.preTouchTime);
} else if (_this2.preClickTime) {
preTime = _this2.preClickTime;
} else if (_this2.preTouchTime) {
preTime = _this2.preTouchTime;
}
if (Math.abs(preTime - _this2.focusTime) < 20) {
return;
}
_this2.focusTime = 0;
}
_this2.preClickTime = 0;
_this2.preTouchTime = 0;
if (_this2.isClickToShow() && (_this2.isClickToHide() || _this2.isBlurToHide()) && event && event.preventDefault) {
event.preventDefault();
}
var nextVisible = !_this2.state.popupVisible;
if (_this2.isClickToHide() && !nextVisible || nextVisible && _this2.isClickToShow()) {
_this2.setPopupVisible(!_this2.state.popupVisible, event);
}
});
_defineProperty$b(_assertThisInitialized(_this2), "onPopupMouseDown", function() {
_this2.hasPopupMouseDown = true;
clearTimeout(_this2.mouseDownTimeout);
_this2.mouseDownTimeout = window.setTimeout(function() {
_this2.hasPopupMouseDown = false;
}, 0);
if (_this2.context) {
var _this$context;
(_this$context = _this2.context).onPopupMouseDown.apply(_this$context, arguments);
}
});
_defineProperty$b(_assertThisInitialized(_this2), "onDocumentClick", function(event) {
if (_this2.props.mask && !_this2.props.maskClosable) {
return;
}
var target = event.target;
var root2 = _this2.getRootDomNode();
var popupNode = _this2.getPopupDomNode();
if ((!contains$2(root2, target) || _this2.isContextMenuOnly()) && !contains$2(popupNode, target) && !_this2.hasPopupMouseDown) {
_this2.close();
}
});
_defineProperty$b(_assertThisInitialized(_this2), "getRootDomNode", function() {
var getTriggerDOMNode = _this2.props.getTriggerDOMNode;
if (getTriggerDOMNode) {
return getTriggerDOMNode(_this2.triggerRef.current);
}
try {
var domNode = findDOMNode(_this2.triggerRef.current);
if (domNode) {
return domNode;
}
} catch (err) {
}
return ReactDOM__default.default.findDOMNode(_assertThisInitialized(_this2));
});
_defineProperty$b(_assertThisInitialized(_this2), "getPopupClassNameFromAlign", function(align) {
var className = [];
var _this$props = _this2.props, popupPlacement = _this$props.popupPlacement, builtinPlacements = _this$props.builtinPlacements, prefixCls = _this$props.prefixCls, alignPoint2 = _this$props.alignPoint, getPopupClassNameFromAlign2 = _this$props.getPopupClassNameFromAlign;
if (popupPlacement && builtinPlacements) {
className.push(getAlignPopupClassName(builtinPlacements, prefixCls, align, alignPoint2));
}
if (getPopupClassNameFromAlign2) {
className.push(getPopupClassNameFromAlign2(align));
}
return className.join(" ");
});
_defineProperty$b(_assertThisInitialized(_this2), "getComponent", function() {
var _this$props2 = _this2.props, prefixCls = _this$props2.prefixCls, destroyPopupOnHide = _this$props2.destroyPopupOnHide, popupClassName = _this$props2.popupClassName, onPopupAlign = _this$props2.onPopupAlign, popupMotion = _this$props2.popupMotion, popupAnimation = _this$props2.popupAnimation, popupTransitionName = _this$props2.popupTransitionName, popupStyle = _this$props2.popupStyle, mask = _this$props2.mask, maskAnimation = _this$props2.maskAnimation, maskTransitionName = _this$props2.maskTransitionName, maskMotion = _this$props2.maskMotion, zIndex = _this$props2.zIndex, popup = _this$props2.popup, stretch = _this$props2.stretch, alignPoint2 = _this$props2.alignPoint, mobile = _this$props2.mobile, forceRender = _this$props2.forceRender, onPopupClick = _this$props2.onPopupClick;
var _this$state = _this2.state, popupVisible = _this$state.popupVisible, point = _this$state.point;
var align = _this2.getPopupAlign();
var mouseProps = {};
if (_this2.isMouseEnterToShow()) {
mouseProps.onMouseEnter = _this2.onPopupMouseEnter;
}
if (_this2.isMouseLeaveToHide()) {
mouseProps.onMouseLeave = _this2.onPopupMouseLeave;
}
mouseProps.onMouseDown = _this2.onPopupMouseDown;
mouseProps.onTouchStart = _this2.onPopupMouseDown;
return /* @__PURE__ */ jsx(Popup$2, {
prefixCls,
destroyPopupOnHide,
visible: popupVisible,
point: alignPoint2 && point,
className: popupClassName,
align,
onAlign: onPopupAlign,
animation: popupAnimation,
getClassNameFromAlign: _this2.getPopupClassNameFromAlign,
...mouseProps,
stretch,
getRootDomNode: _this2.getRootDomNode,
style: popupStyle,
mask,
zIndex,
transitionName: popupTransitionName,
maskAnimation,
maskTransitionName,
maskMotion,
ref: _this2.popupRef,
motion: popupMotion,
mobile,
forceRender,
onClick: onPopupClick,
children: typeof popup === "function" ? popup() : popup
});
});
_defineProperty$b(_assertThisInitialized(_this2), "attachParent", function(popupContainer) {
wrapperRaf$1.cancel(_this2.attachId);
var _this$props3 = _this2.props, getPopupContainer = _this$props3.getPopupContainer, getDocument2 = _this$props3.getDocument;
var domNode = _this2.getRootDomNode();
var mountNode;
if (!getPopupContainer) {
mountNode = getDocument2(_this2.getRootDomNode()).body;
} else if (domNode || getPopupContainer.length === 0) {
mountNode = getPopupContainer(domNode);
}
if (mountNode) {
mountNode.appendChild(popupContainer);
} else {
_this2.attachId = wrapperRaf$1(function() {
_this2.attachParent(popupContainer);
});
}
});
_defineProperty$b(_assertThisInitialized(_this2), "getContainer", function() {
if (!_this2.portalContainer) {
var getDocument2 = _this2.props.getDocument;
var popupContainer = getDocument2(_this2.getRootDomNode()).createElement("div");
popupContainer.style.position = "absolute";
popupContainer.style.top = "0";
popupContainer.style.left = "0";
popupContainer.style.width = "100%";
_this2.portalContainer = popupContainer;
}
_this2.attachParent(_this2.portalContainer);
return _this2.portalContainer;
});
_defineProperty$b(_assertThisInitialized(_this2), "setPoint", function(point) {
var alignPoint2 = _this2.props.alignPoint;
if (!alignPoint2 || !point)
return;
_this2.setState({
point: {
pageX: point.pageX,
pageY: point.pageY
}
});
});
_defineProperty$b(_assertThisInitialized(_this2), "handlePortalUpdate", function() {
if (_this2.state.prevPopupVisible !== _this2.state.popupVisible) {
_this2.props.afterPopupVisibleChange(_this2.state.popupVisible);
}
});
_defineProperty$b(_assertThisInitialized(_this2), "triggerContextValue", {
onPopupMouseDown: _this2.onPopupMouseDown
});
var _popupVisible;
if ("popupVisible" in props) {
_popupVisible = !!props.popupVisible;
} else {
_popupVisible = !!props.defaultPopupVisible;
}
_this2.state = {
prevPopupVisible: _popupVisible,
popupVisible: _popupVisible
};
ALL_HANDLERS$1.forEach(function(h2) {
_this2["fire".concat(h2)] = function(e2) {
_this2.fireEvents(h2, e2);
};
});
return _this2;
}
_createClass(Trigger3, [{
key: "componentDidMount",
value: function componentDidMount() {
this.componentDidUpdate();
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate() {
var props = this.props;
var state = this.state;
if (state.popupVisible) {
var currentDocument;
if (!this.clickOutsideHandler && (this.isClickToHide() || this.isContextMenuToShow())) {
currentDocument = props.getDocument(this.getRootDomNode());
this.clickOutsideHandler = addEventListenerWrap$2(currentDocument, "mousedown", this.onDocumentClick);
}
if (!this.touchOutsideHandler) {
currentDocument = currentDocument || props.getDocument(this.getRootDomNode());
this.touchOutsideHandler = addEventListenerWrap$2(currentDocument, "touchstart", this.onDocumentClick);
}
if (!this.contextMenuOutsideHandler1 && this.isContextMenuToShow()) {
currentDocument = currentDocument || props.getDocument(this.getRootDomNode());
this.contextMenuOutsideHandler1 = addEventListenerWrap$2(currentDocument, "scroll", this.onContextMenuClose);
}
if (!this.contextMenuOutsideHandler2 && this.isContextMenuToShow()) {
this.contextMenuOutsideHandler2 = addEventListenerWrap$2(window, "blur", this.onContextMenuClose);
}
return;
}
this.clearOutsideHandler();
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this.clearDelayTimer();
this.clearOutsideHandler();
clearTimeout(this.mouseDownTimeout);
wrapperRaf$1.cancel(this.attachId);
}
}, {
key: "getPopupDomNode",
value: function getPopupDomNode() {
var _this$popupRef$curren2;
return ((_this$popupRef$curren2 = this.popupRef.current) === null || _this$popupRef$curren2 === void 0 ? void 0 : _this$popupRef$curren2.getElement()) || null;
}
}, {
key: "getPopupAlign",
value: function getPopupAlign() {
var props = this.props;
var popupPlacement = props.popupPlacement, popupAlign = props.popupAlign, builtinPlacements = props.builtinPlacements;
if (popupPlacement && builtinPlacements) {
return getAlignFromPlacement$1(builtinPlacements, popupPlacement, popupAlign);
}
return popupAlign;
}
}, {
key: "setPopupVisible",
value: function setPopupVisible(popupVisible, event) {
var alignPoint2 = this.props.alignPoint;
var prevPopupVisible = this.state.popupVisible;
this.clearDelayTimer();
if (prevPopupVisible !== popupVisible) {
if (!("popupVisible" in this.props)) {
this.setState({
popupVisible,
prevPopupVisible
});
}
this.props.onPopupVisibleChange(popupVisible);
}
if (alignPoint2 && event && popupVisible) {
this.setPoint(event);
}
}
}, {
key: "delaySetPopupVisible",
value: function delaySetPopupVisible(visible, delayS, event) {
var _this2 = this;
var delay = delayS * 1e3;
this.clearDelayTimer();
if (delay) {
var point = event ? {
pageX: event.pageX,
pageY: event.pageY
} : null;
this.delayTimer = window.setTimeout(function() {
_this2.setPopupVisible(visible, point);
_this2.clearDelayTimer();
}, delay);
} else {
this.setPopupVisible(visible, event);
}
}
}, {
key: "clearDelayTimer",
value: function clearDelayTimer() {
if (this.delayTimer) {
clearTimeout(this.delayTimer);
this.delayTimer = null;
}
}
}, {
key: "clearOutsideHandler",
value: function clearOutsideHandler() {
if (this.clickOutsideHandler) {
this.clickOutsideHandler.remove();
this.clickOutsideHandler = null;
}
if (this.contextMenuOutsideHandler1) {
this.contextMenuOutsideHandler1.remove();
this.contextMenuOutsideHandler1 = null;
}
if (this.contextMenuOutsideHandler2) {
this.contextMenuOutsideHandler2.remove();
this.contextMenuOutsideHandler2 = null;
}
if (this.touchOutsideHandler) {
this.touchOutsideHandler.remove();
this.touchOutsideHandler = null;
}
}
}, {
key: "createTwoChains",
value: function createTwoChains(event) {
var childPros = this.props.children.props;
var props = this.props;
if (childPros[event] && props[event]) {
return this["fire".concat(event)];
}
return childPros[event] || props[event];
}
}, {
key: "isClickToShow",
value: function isClickToShow() {
var _this$props4 = this.props, action = _this$props4.action, showAction = _this$props4.showAction;
return action.indexOf("click") !== -1 || showAction.indexOf("click") !== -1;
}
}, {
key: "isContextMenuOnly",
value: function isContextMenuOnly() {
var action = this.props.action;
return action === "contextMenu" || action.length === 1 && action[0] === "contextMenu";
}
}, {
key: "isContextMenuToShow",
value: function isContextMenuToShow() {
var _this$props5 = this.props, action = _this$props5.action, showAction = _this$props5.showAction;
return action.indexOf("contextMenu") !== -1 || showAction.indexOf("contextMenu") !== -1;
}
}, {
key: "isClickToHide",
value: function isClickToHide() {
var _this$props6 = this.props, action = _this$props6.action, hideAction = _this$props6.hideAction;
return action.indexOf("click") !== -1 || hideAction.indexOf("click") !== -1;
}
}, {
key: "isMouseEnterToShow",
value: function isMouseEnterToShow() {
var _this$props7 = this.props, action = _this$props7.action, showAction = _this$props7.showAction;
return action.indexOf("hover") !== -1 || showAction.indexOf("mouseEnter") !== -1;
}
}, {
key: "isMouseLeaveToHide",
value: function isMouseLeaveToHide() {
var _this$props8 = this.props, action = _this$props8.action, hideAction = _this$props8.hideAction;
return action.indexOf("hover") !== -1 || hideAction.indexOf("mouseLeave") !== -1;
}
}, {
key: "isFocusToShow",
value: function isFocusToShow() {
var _this$props9 = this.props, action = _this$props9.action, showAction = _this$props9.showAction;
return action.indexOf("focus") !== -1 || showAction.indexOf("focus") !== -1;
}
}, {
key: "isBlurToHide",
value: function isBlurToHide() {
var _this$props10 = this.props, action = _this$props10.action, hideAction = _this$props10.hideAction;
return action.indexOf("focus") !== -1 || hideAction.indexOf("blur") !== -1;
}
}, {
key: "forcePopupAlign",
value: function forcePopupAlign() {
if (this.state.popupVisible) {
var _this$popupRef$curren3;
(_this$popupRef$curren3 = this.popupRef.current) === null || _this$popupRef$curren3 === void 0 ? void 0 : _this$popupRef$curren3.forceAlign();
}
}
}, {
key: "fireEvents",
value: function fireEvents(type2, e2) {
var childCallback = this.props.children.props[type2];
if (childCallback) {
childCallback(e2);
}
var callback = this.props[type2];
if (callback) {
callback(e2);
}
}
}, {
key: "close",
value: function close() {
this.setPopupVisible(false);
}
}, {
key: "render",
value: function render2() {
var popupVisible = this.state.popupVisible;
var _this$props11 = this.props, children = _this$props11.children, forceRender = _this$props11.forceRender, alignPoint2 = _this$props11.alignPoint, className = _this$props11.className, autoDestroy = _this$props11.autoDestroy;
var child = React__namespace.Children.only(children);
var newChildProps = {
key: "trigger"
};
if (this.isContextMenuToShow()) {
newChildProps.onContextMenu = this.onContextMenu;
} else {
newChildProps.onContextMenu = this.createTwoChains("onContextMenu");
}
if (this.isClickToHide() || this.isClickToShow()) {
newChildProps.onClick = this.onClick;
newChildProps.onMouseDown = this.onMouseDown;
newChildProps.onTouchStart = this.onTouchStart;
} else {
newChildProps.onClick = this.createTwoChains("onClick");
newChildProps.onMouseDown = this.createTwoChains("onMouseDown");
newChildProps.onTouchStart = this.createTwoChains("onTouchStart");
}
if (this.isMouseEnterToShow()) {
newChildProps.onMouseEnter = this.onMouseEnter;
if (alignPoint2) {
newChildProps.onMouseMove = this.onMouseMove;
}
} else {
newChildProps.onMouseEnter = this.createTwoChains("onMouseEnter");
}
if (this.isMouseLeaveToHide()) {
newChildProps.onMouseLeave = this.onMouseLeave;
} else {
newChildProps.onMouseLeave = this.createTwoChains("onMouseLeave");
}
if (this.isFocusToShow() || this.isBlurToHide()) {
newChildProps.onFocus = this.onFocus;
newChildProps.onBlur = this.onBlur;
} else {
newChildProps.onFocus = this.createTwoChains("onFocus");
newChildProps.onBlur = this.createTwoChains("onBlur");
}
var childrenClassName = classnames(child && child.props && child.props.className, className);
if (childrenClassName) {
newChildProps.className = childrenClassName;
}
var cloneProps = _objectSpread2$a({}, newChildProps);
if (supportRef(child)) {
cloneProps.ref = composeRef(this.triggerRef, child.ref);
}
var trigger = /* @__PURE__ */ React__namespace.cloneElement(child, cloneProps);
var portal;
if (popupVisible || this.popupRef.current || forceRender) {
portal = /* @__PURE__ */ jsx(PortalComponent, {
getContainer: this.getContainer,
didUpdate: this.handlePortalUpdate,
children: this.getComponent()
}, "portal");
}
if (!popupVisible && autoDestroy) {
portal = null;
}
return /* @__PURE__ */ jsxs(TriggerContext.Provider, {
value: this.triggerContextValue,
children: [trigger, portal]
});
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(_ref, prevState) {
var popupVisible = _ref.popupVisible;
var newState = {};
if (popupVisible !== void 0 && prevState.popupVisible !== popupVisible) {
newState.popupVisible = popupVisible;
newState.prevPopupVisible = prevState.popupVisible;
}
return newState;
}
}]);
return Trigger3;
}(React__namespace.Component);
_defineProperty$b(Trigger2, "contextType", TriggerContext);
_defineProperty$b(Trigger2, "defaultProps", {
prefixCls: "rc-trigger-popup",
getPopupClassNameFromAlign: returnEmptyString$1,
getDocument: returnDocument$1,
onPopupVisibleChange: noop$6,
afterPopupVisibleChange: noop$6,
onPopupAlign: noop$6,
popupClassName: "",
mouseEnterDelay: 0,
mouseLeaveDelay: 0.1,
focusDelay: 0,
blurDelay: 0.15,
popupStyle: {},
destroyPopupOnHide: false,
popupAlign: {},
defaultPopupVisible: false,
mask: false,
maskClosable: true,
action: [],
showAction: [],
hideAction: [],
autoDestroy: false
});
return Trigger2;
}
const Trigger$1 = generateTrigger(Portal$1);
var _excluded$F = ["prefixCls", "disabled", "visible", "children", "popupElement", "containerWidth", "animation", "transitionName", "dropdownStyle", "dropdownClassName", "direction", "placement", "dropdownMatchSelectWidth", "dropdownRender", "dropdownAlign", "getPopupContainer", "empty", "getTriggerDOMNode", "onPopupVisibleChange", "onPopupMouseEnter"];
var getBuiltInPlacements = function getBuiltInPlacements2(dropdownMatchSelectWidth) {
var adjustX = dropdownMatchSelectWidth === true ? 0 : 1;
return {
bottomLeft: {
points: ["tl", "bl"],
offset: [0, 4],
overflow: {
adjustX,
adjustY: 1
}
},
bottomRight: {
points: ["tr", "br"],
offset: [0, 4],
overflow: {
adjustX,
adjustY: 1
}
},
topLeft: {
points: ["bl", "tl"],
offset: [0, -4],
overflow: {
adjustX,
adjustY: 1
}
},
topRight: {
points: ["br", "tr"],
offset: [0, -4],
overflow: {
adjustX,
adjustY: 1
}
}
};
};
var SelectTrigger = function SelectTrigger2(props, ref) {
var prefixCls = props.prefixCls;
props.disabled;
var visible = props.visible, children = props.children, popupElement = props.popupElement, containerWidth = props.containerWidth, animation = props.animation, transitionName2 = props.transitionName, dropdownStyle = props.dropdownStyle, dropdownClassName = props.dropdownClassName, _props$direction = props.direction, direction = _props$direction === void 0 ? "ltr" : _props$direction, placement = props.placement, dropdownMatchSelectWidth = props.dropdownMatchSelectWidth, dropdownRender = props.dropdownRender, dropdownAlign = props.dropdownAlign, getPopupContainer = props.getPopupContainer, empty2 = props.empty, getTriggerDOMNode = props.getTriggerDOMNode, onPopupVisibleChange = props.onPopupVisibleChange, onPopupMouseEnter = props.onPopupMouseEnter, restProps = _objectWithoutProperties$1(props, _excluded$F);
var dropdownPrefixCls = "".concat(prefixCls, "-dropdown");
var popupNode = popupElement;
if (dropdownRender) {
popupNode = dropdownRender(popupElement);
}
var builtInPlacements = React__namespace.useMemo(function() {
return getBuiltInPlacements(dropdownMatchSelectWidth);
}, [dropdownMatchSelectWidth]);
var mergedTransitionName = animation ? "".concat(dropdownPrefixCls, "-").concat(animation) : transitionName2;
var popupRef = React__namespace.useRef(null);
React__namespace.useImperativeHandle(ref, function() {
return {
getPopupElement: function getPopupElement() {
return popupRef.current;
}
};
});
var popupStyle = _objectSpread2$a({
minWidth: containerWidth
}, dropdownStyle);
if (typeof dropdownMatchSelectWidth === "number") {
popupStyle.width = dropdownMatchSelectWidth;
} else if (dropdownMatchSelectWidth) {
popupStyle.width = containerWidth;
}
return /* @__PURE__ */ jsx(Trigger$1, {
...restProps,
showAction: onPopupVisibleChange ? ["click"] : [],
hideAction: onPopupVisibleChange ? ["click"] : [],
popupPlacement: placement || (direction === "rtl" ? "bottomRight" : "bottomLeft"),
builtinPlacements: builtInPlacements,
prefixCls: dropdownPrefixCls,
popupTransitionName: mergedTransitionName,
popup: /* @__PURE__ */ jsx("div", {
ref: popupRef,
onMouseEnter: onPopupMouseEnter,
children: popupNode
}),
popupAlign: dropdownAlign,
popupVisible: visible,
getPopupContainer,
popupClassName: classnames(dropdownClassName, _defineProperty$b({}, "".concat(dropdownPrefixCls, "-empty"), empty2)),
popupStyle,
getTriggerDOMNode,
onPopupVisibleChange,
children
});
};
var RefSelectTrigger = /* @__PURE__ */ React__namespace.forwardRef(SelectTrigger);
RefSelectTrigger.displayName = "SelectTrigger";
function getKey$1(data, index2) {
var key2 = data.key;
var value;
if ("value" in data) {
value = data.value;
}
if (key2 !== null && key2 !== void 0) {
return key2;
}
if (value !== void 0) {
return value;
}
return "rc-index-key-".concat(index2);
}
function fillFieldNames$2(fieldNames, childrenAsData) {
var _ref = fieldNames || {}, label = _ref.label, value = _ref.value, options = _ref.options;
return {
label: label || (childrenAsData ? "children" : "label"),
value: value || "value",
options: options || "options"
};
}
function flattenOptions(options) {
var _ref2 = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, fieldNames = _ref2.fieldNames, childrenAsData = _ref2.childrenAsData;
var flattenList = [];
var _fillFieldNames = fillFieldNames$2(fieldNames, false), fieldLabel = _fillFieldNames.label, fieldValue = _fillFieldNames.value, fieldOptions = _fillFieldNames.options;
function dig(list, isGroupOption) {
list.forEach(function(data) {
var label = data[fieldLabel];
if (isGroupOption || !(fieldOptions in data)) {
var value = data[fieldValue];
flattenList.push({
key: getKey$1(data, flattenList.length),
groupOption: isGroupOption,
data,
label,
value
});
} else {
var grpLabel = label;
if (grpLabel === void 0 && childrenAsData) {
grpLabel = data.label;
}
flattenList.push({
key: getKey$1(data, flattenList.length),
group: true,
data,
label: grpLabel
});
dig(data[fieldOptions], true);
}
});
}
dig(options, false);
return flattenList;
}
function injectPropsWithOption(option) {
var newOption = _objectSpread2$a({}, option);
if (!("props" in newOption)) {
Object.defineProperty(newOption, "props", {
get: function get2() {
warningOnce(false, "Return type is option instead of Option instance. Please read value directly instead of reading from `props`.");
return newOption;
}
});
}
return newOption;
}
function getSeparatedContent(text, tokens) {
if (!tokens || !tokens.length) {
return null;
}
var match2 = false;
function separate(str, _ref3) {
var _ref4 = _toArray$1(_ref3), token = _ref4[0], restTokens = _ref4.slice(1);
if (!token) {
return [str];
}
var list2 = str.split(token);
match2 = match2 || list2.length > 1;
return list2.reduce(function(prevList, unitStr) {
return [].concat(_toConsumableArray$c(prevList), _toConsumableArray$c(separate(unitStr, restTokens)));
}, []).filter(function(unit) {
return unit;
});
}
var list = separate(text, tokens);
return match2 ? list : null;
}
var _excluded$E = ["id", "prefixCls", "className", "showSearch", "tagRender", "direction", "omitDomProps", "displayValues", "onDisplayValuesChange", "emptyOptions", "notFoundContent", "onClear", "mode", "disabled", "loading", "getInputElement", "getRawInputElement", "open", "defaultOpen", "onDropdownVisibleChange", "activeValue", "onActiveValueChange", "activeDescendantId", "searchValue", "autoClearSearchValue", "onSearch", "onSearchSplit", "tokenSeparators", "allowClear", "showArrow", "inputIcon", "clearIcon", "OptionList", "animation", "transitionName", "dropdownStyle", "dropdownClassName", "dropdownMatchSelectWidth", "dropdownRender", "dropdownAlign", "placement", "getPopupContainer", "showAction", "onFocus", "onBlur", "onKeyUp", "onKeyDown", "onMouseDown"];
var DEFAULT_OMIT_PROPS = ["value", "onChange", "removeIcon", "placeholder", "autoFocus", "maxTagCount", "maxTagTextLength", "maxTagPlaceholder", "choiceTransitionName", "onInputKeyDown", "onPopupScroll", "tabIndex"];
function isMultiple(mode) {
return mode === "tags" || mode === "multiple";
}
var BaseSelect = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _customizeRawInputEle, _classNames2;
var id2 = props.id, prefixCls = props.prefixCls, className = props.className, showSearch = props.showSearch, tagRender = props.tagRender, direction = props.direction, omitDomProps = props.omitDomProps, displayValues = props.displayValues, onDisplayValuesChange = props.onDisplayValuesChange, emptyOptions = props.emptyOptions, _props$notFoundConten = props.notFoundContent, notFoundContent = _props$notFoundConten === void 0 ? "Not Found" : _props$notFoundConten, onClear = props.onClear, mode = props.mode, disabled = props.disabled, loading = props.loading, getInputElement = props.getInputElement, getRawInputElement = props.getRawInputElement, open = props.open, defaultOpen = props.defaultOpen, onDropdownVisibleChange = props.onDropdownVisibleChange, activeValue = props.activeValue, onActiveValueChange = props.onActiveValueChange, activeDescendantId = props.activeDescendantId, searchValue = props.searchValue, autoClearSearchValue = props.autoClearSearchValue, onSearch = props.onSearch, onSearchSplit = props.onSearchSplit, tokenSeparators = props.tokenSeparators, allowClear = props.allowClear, showArrow = props.showArrow, inputIcon = props.inputIcon, clearIcon = props.clearIcon, OptionList2 = props.OptionList, animation = props.animation, transitionName2 = props.transitionName, dropdownStyle = props.dropdownStyle, dropdownClassName = props.dropdownClassName, dropdownMatchSelectWidth = props.dropdownMatchSelectWidth, dropdownRender = props.dropdownRender, dropdownAlign = props.dropdownAlign, placement = props.placement, getPopupContainer = props.getPopupContainer, _props$showAction = props.showAction, showAction = _props$showAction === void 0 ? [] : _props$showAction, onFocus = props.onFocus, onBlur = props.onBlur, onKeyUp = props.onKeyUp, onKeyDown2 = props.onKeyDown, onMouseDown = props.onMouseDown, restProps = _objectWithoutProperties$1(props, _excluded$E);
var multiple = isMultiple(mode);
var mergedShowSearch = (showSearch !== void 0 ? showSearch : multiple) || mode === "combobox";
var domProps = _objectSpread2$a({}, restProps);
DEFAULT_OMIT_PROPS.forEach(function(propName) {
delete domProps[propName];
});
omitDomProps === null || omitDomProps === void 0 ? void 0 : omitDomProps.forEach(function(propName) {
delete domProps[propName];
});
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), mobile = _React$useState2[0], setMobile = _React$useState2[1];
React__namespace.useEffect(function() {
setMobile(isMobile$1());
}, []);
var containerRef = React__namespace.useRef(null);
var selectorDomRef = React__namespace.useRef(null);
var triggerRef = React__namespace.useRef(null);
var selectorRef = React__namespace.useRef(null);
var listRef = React__namespace.useRef(null);
var _useDelayReset = useDelayReset(), _useDelayReset2 = _slicedToArray$e(_useDelayReset, 3), mockFocused = _useDelayReset2[0], setMockFocused = _useDelayReset2[1], cancelSetMockFocused = _useDelayReset2[2];
React__namespace.useImperativeHandle(ref, function() {
var _selectorRef$current, _selectorRef$current2;
return {
focus: (_selectorRef$current = selectorRef.current) === null || _selectorRef$current === void 0 ? void 0 : _selectorRef$current.focus,
blur: (_selectorRef$current2 = selectorRef.current) === null || _selectorRef$current2 === void 0 ? void 0 : _selectorRef$current2.blur,
scrollTo: function scrollTo2(arg) {
var _listRef$current;
return (_listRef$current = listRef.current) === null || _listRef$current === void 0 ? void 0 : _listRef$current.scrollTo(arg);
}
};
});
var mergedSearchValue = React__namespace.useMemo(function() {
var _displayValues$;
if (mode !== "combobox") {
return searchValue;
}
var val = (_displayValues$ = displayValues[0]) === null || _displayValues$ === void 0 ? void 0 : _displayValues$.value;
return typeof val === "string" || typeof val === "number" ? String(val) : "";
}, [searchValue, mode, displayValues]);
var customizeInputElement = mode === "combobox" && typeof getInputElement === "function" && getInputElement() || null;
var customizeRawInputElement = typeof getRawInputElement === "function" && getRawInputElement();
var customizeRawInputRef = useComposeRef(selectorDomRef, customizeRawInputElement === null || customizeRawInputElement === void 0 ? void 0 : (_customizeRawInputEle = customizeRawInputElement.props) === null || _customizeRawInputEle === void 0 ? void 0 : _customizeRawInputEle.ref);
var _useMergedState = useMergedState(void 0, {
defaultValue: defaultOpen,
value: open
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), innerOpen = _useMergedState2[0], setInnerOpen = _useMergedState2[1];
var mergedOpen = innerOpen;
var emptyListContent = !notFoundContent && emptyOptions;
if (disabled || emptyListContent && mergedOpen && mode === "combobox") {
mergedOpen = false;
}
var triggerOpen = emptyListContent ? false : mergedOpen;
var onToggleOpen = React__namespace.useCallback(function(newOpen) {
var nextOpen = newOpen !== void 0 ? newOpen : !mergedOpen;
if (!disabled) {
setInnerOpen(nextOpen);
if (mergedOpen !== nextOpen) {
onDropdownVisibleChange === null || onDropdownVisibleChange === void 0 ? void 0 : onDropdownVisibleChange(nextOpen);
}
}
}, [disabled, mergedOpen, setInnerOpen, onDropdownVisibleChange]);
var tokenWithEnter = React__namespace.useMemo(function() {
return (tokenSeparators || []).some(function(tokenSeparator) {
return ["\n", "\r\n"].includes(tokenSeparator);
});
}, [tokenSeparators]);
var onInternalSearch = function onInternalSearch2(searchText, fromTyping, isCompositing) {
var ret = true;
var newSearchText = searchText;
onActiveValueChange === null || onActiveValueChange === void 0 ? void 0 : onActiveValueChange(null);
var patchLabels = isCompositing ? null : getSeparatedContent(searchText, tokenSeparators);
if (mode !== "combobox" && patchLabels) {
newSearchText = "";
onSearchSplit === null || onSearchSplit === void 0 ? void 0 : onSearchSplit(patchLabels);
onToggleOpen(false);
ret = false;
}
if (onSearch && mergedSearchValue !== newSearchText) {
onSearch(newSearchText, {
source: fromTyping ? "typing" : "effect"
});
}
return ret;
};
var onInternalSearchSubmit = function onInternalSearchSubmit2(searchText) {
if (!searchText || !searchText.trim()) {
return;
}
onSearch(searchText, {
source: "submit"
});
};
React__namespace.useEffect(function() {
if (!mergedOpen && !multiple && mode !== "combobox") {
onInternalSearch("", false, false);
}
}, [mergedOpen]);
React__namespace.useEffect(function() {
if (innerOpen && disabled) {
setInnerOpen(false);
}
if (disabled) {
setMockFocused(false);
}
}, [disabled]);
var _useLock = useLock(), _useLock2 = _slicedToArray$e(_useLock, 2), getClearLock = _useLock2[0], setClearLock = _useLock2[1];
var onInternalKeyDown = function onInternalKeyDown2(event) {
var clearLock = getClearLock();
var which = event.which;
if (which === KeyCode.ENTER) {
if (mode !== "combobox") {
event.preventDefault();
}
if (!mergedOpen) {
onToggleOpen(true);
}
}
setClearLock(!!mergedSearchValue);
if (which === KeyCode.BACKSPACE && !clearLock && multiple && !mergedSearchValue && displayValues.length) {
var cloneDisplayValues = _toConsumableArray$c(displayValues);
var removedDisplayValue = null;
for (var i2 = cloneDisplayValues.length - 1; i2 >= 0; i2 -= 1) {
var current = cloneDisplayValues[i2];
if (!current.disabled) {
cloneDisplayValues.splice(i2, 1);
removedDisplayValue = current;
break;
}
}
if (removedDisplayValue) {
onDisplayValuesChange(cloneDisplayValues, {
type: "remove",
values: [removedDisplayValue]
});
}
}
for (var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
rest[_key - 1] = arguments[_key];
}
if (mergedOpen && listRef.current) {
var _listRef$current2;
(_listRef$current2 = listRef.current).onKeyDown.apply(_listRef$current2, [event].concat(rest));
}
onKeyDown2 === null || onKeyDown2 === void 0 ? void 0 : onKeyDown2.apply(void 0, [event].concat(rest));
};
var onInternalKeyUp = function onInternalKeyUp2(event) {
for (var _len2 = arguments.length, rest = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
rest[_key2 - 1] = arguments[_key2];
}
if (mergedOpen && listRef.current) {
var _listRef$current3;
(_listRef$current3 = listRef.current).onKeyUp.apply(_listRef$current3, [event].concat(rest));
}
onKeyUp === null || onKeyUp === void 0 ? void 0 : onKeyUp.apply(void 0, [event].concat(rest));
};
var onSelectorRemove = function onSelectorRemove2(val) {
var newValues = displayValues.filter(function(i2) {
return i2 !== val;
});
onDisplayValuesChange(newValues, {
type: "remove",
values: [val]
});
};
var focusRef = React__namespace.useRef(false);
var onContainerFocus = function onContainerFocus2() {
setMockFocused(true);
if (!disabled) {
if (onFocus && !focusRef.current) {
onFocus.apply(void 0, arguments);
}
if (showAction.includes("focus")) {
onToggleOpen(true);
}
}
focusRef.current = true;
};
var onContainerBlur = function onContainerBlur2() {
setMockFocused(false, function() {
focusRef.current = false;
onToggleOpen(false);
});
if (disabled) {
return;
}
if (mergedSearchValue) {
if (mode === "tags") {
onSearch(mergedSearchValue, {
source: "submit"
});
} else if (mode === "multiple") {
onSearch("", {
source: "blur"
});
}
}
if (onBlur) {
onBlur.apply(void 0, arguments);
}
};
var activeTimeoutIds = [];
React__namespace.useEffect(function() {
return function() {
activeTimeoutIds.forEach(function(timeoutId) {
return clearTimeout(timeoutId);
});
activeTimeoutIds.splice(0, activeTimeoutIds.length);
};
}, []);
var onInternalMouseDown = function onInternalMouseDown2(event) {
var _triggerRef$current;
var target = event.target;
var popupElement = (_triggerRef$current = triggerRef.current) === null || _triggerRef$current === void 0 ? void 0 : _triggerRef$current.getPopupElement();
if (popupElement && popupElement.contains(target)) {
var timeoutId = setTimeout(function() {
var index2 = activeTimeoutIds.indexOf(timeoutId);
if (index2 !== -1) {
activeTimeoutIds.splice(index2, 1);
}
cancelSetMockFocused();
if (!mobile && !popupElement.contains(document.activeElement)) {
var _selectorRef$current3;
(_selectorRef$current3 = selectorRef.current) === null || _selectorRef$current3 === void 0 ? void 0 : _selectorRef$current3.focus();
}
});
activeTimeoutIds.push(timeoutId);
}
for (var _len3 = arguments.length, restArgs = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
restArgs[_key3 - 1] = arguments[_key3];
}
onMouseDown === null || onMouseDown === void 0 ? void 0 : onMouseDown.apply(void 0, [event].concat(restArgs));
};
var _React$useState3 = React__namespace.useState(null), _React$useState4 = _slicedToArray$e(_React$useState3, 2), containerWidth = _React$useState4[0], setContainerWidth = _React$useState4[1];
var _React$useState5 = React__namespace.useState({}), _React$useState6 = _slicedToArray$e(_React$useState5, 2), forceUpdate = _React$useState6[1];
function onPopupMouseEnter() {
forceUpdate({});
}
useLayoutEffect$1(function() {
if (triggerOpen) {
var _containerRef$current;
var newWidth = Math.ceil((_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 ? void 0 : _containerRef$current.offsetWidth);
if (containerWidth !== newWidth && !Number.isNaN(newWidth)) {
setContainerWidth(newWidth);
}
}
}, [triggerOpen]);
var onTriggerVisibleChange;
if (customizeRawInputElement) {
onTriggerVisibleChange = function onTriggerVisibleChange2(newOpen) {
onToggleOpen(newOpen);
};
}
useSelectTriggerControl(function() {
var _triggerRef$current2;
return [containerRef.current, (_triggerRef$current2 = triggerRef.current) === null || _triggerRef$current2 === void 0 ? void 0 : _triggerRef$current2.getPopupElement()];
}, triggerOpen, onToggleOpen, !!customizeRawInputElement);
var baseSelectContext = React__namespace.useMemo(function() {
return _objectSpread2$a(_objectSpread2$a({}, props), {}, {
notFoundContent,
open: mergedOpen,
triggerOpen,
id: id2,
showSearch: mergedShowSearch,
multiple,
toggleOpen: onToggleOpen
});
}, [props, notFoundContent, triggerOpen, mergedOpen, id2, mergedShowSearch, multiple, onToggleOpen]);
var mergedShowArrow = showArrow !== void 0 ? showArrow : loading || !multiple && mode !== "combobox";
var arrowNode;
if (mergedShowArrow) {
arrowNode = /* @__PURE__ */ jsx(TransBtn, {
className: classnames("".concat(prefixCls, "-arrow"), _defineProperty$b({}, "".concat(prefixCls, "-arrow-loading"), loading)),
customizeIcon: inputIcon,
customizeIconProps: {
loading,
searchValue: mergedSearchValue,
open: mergedOpen,
focused: mockFocused,
showSearch: mergedShowSearch
}
});
}
var clearNode;
var onClearMouseDown = function onClearMouseDown2() {
var _selectorRef$current4;
onClear === null || onClear === void 0 ? void 0 : onClear();
(_selectorRef$current4 = selectorRef.current) === null || _selectorRef$current4 === void 0 ? void 0 : _selectorRef$current4.focus();
onDisplayValuesChange([], {
type: "clear",
values: displayValues
});
onInternalSearch("", false, false);
};
if (!disabled && allowClear && (displayValues.length || mergedSearchValue) && !(mode === "combobox" && mergedSearchValue === "")) {
clearNode = /* @__PURE__ */ jsx(TransBtn, {
className: "".concat(prefixCls, "-clear"),
onMouseDown: onClearMouseDown,
customizeIcon: clearIcon,
children: "\xD7"
});
}
var optionList = /* @__PURE__ */ jsx(OptionList2, {
ref: listRef
});
var mergedClassName = classnames(prefixCls, className, (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-focused"), mockFocused), _defineProperty$b(_classNames2, "".concat(prefixCls, "-multiple"), multiple), _defineProperty$b(_classNames2, "".concat(prefixCls, "-single"), !multiple), _defineProperty$b(_classNames2, "".concat(prefixCls, "-allow-clear"), allowClear), _defineProperty$b(_classNames2, "".concat(prefixCls, "-show-arrow"), mergedShowArrow), _defineProperty$b(_classNames2, "".concat(prefixCls, "-disabled"), disabled), _defineProperty$b(_classNames2, "".concat(prefixCls, "-loading"), loading), _defineProperty$b(_classNames2, "".concat(prefixCls, "-open"), mergedOpen), _defineProperty$b(_classNames2, "".concat(prefixCls, "-customize-input"), customizeInputElement), _defineProperty$b(_classNames2, "".concat(prefixCls, "-show-search"), mergedShowSearch), _classNames2));
var selectorNode = /* @__PURE__ */ jsx(RefSelectTrigger, {
ref: triggerRef,
disabled,
prefixCls,
visible: triggerOpen,
popupElement: optionList,
containerWidth,
animation,
transitionName: transitionName2,
dropdownStyle,
dropdownClassName,
direction,
dropdownMatchSelectWidth,
dropdownRender,
dropdownAlign,
placement,
getPopupContainer,
empty: emptyOptions,
getTriggerDOMNode: function getTriggerDOMNode() {
return selectorDomRef.current;
},
onPopupVisibleChange: onTriggerVisibleChange,
onPopupMouseEnter,
children: customizeRawInputElement ? /* @__PURE__ */ React__namespace.cloneElement(customizeRawInputElement, {
ref: customizeRawInputRef
}) : /* @__PURE__ */ jsx(ForwardSelector, {
...props,
domRef: selectorDomRef,
prefixCls,
inputElement: customizeInputElement,
ref: selectorRef,
id: id2,
showSearch: mergedShowSearch,
autoClearSearchValue,
mode,
activeDescendantId,
tagRender,
values: displayValues,
open: mergedOpen,
onToggleOpen,
activeValue,
searchValue: mergedSearchValue,
onSearch: onInternalSearch,
onSearchSubmit: onInternalSearchSubmit,
onRemove: onSelectorRemove,
tokenWithEnter
})
});
var renderNode;
if (customizeRawInputElement) {
renderNode = selectorNode;
} else {
renderNode = /* @__PURE__ */ jsxs("div", {
className: mergedClassName,
...domProps,
ref: containerRef,
onMouseDown: onInternalMouseDown,
onKeyDown: onInternalKeyDown,
onKeyUp: onInternalKeyUp,
onFocus: onContainerFocus,
onBlur: onContainerBlur,
children: [mockFocused && !mergedOpen && /* @__PURE__ */ jsx("span", {
style: {
width: 0,
height: 0,
position: "absolute",
overflow: "hidden",
opacity: 0
},
"aria-live": "polite",
children: "".concat(displayValues.map(function(_ref) {
var label = _ref.label, value = _ref.value;
return ["number", "string"].includes(_typeof$q(label)) ? label : value;
}).join(", "))
}), selectorNode, arrowNode, clearNode]
});
}
return /* @__PURE__ */ jsx(BaseSelectContext.Provider, {
value: baseSelectContext,
children: renderNode
});
});
const useCache$1 = function(labeledValues, valueOptions) {
var cacheRef = React__namespace.useRef({
values: /* @__PURE__ */ new Map(),
options: /* @__PURE__ */ new Map()
});
var filledLabeledValues = React__namespace.useMemo(function() {
var _cacheRef$current = cacheRef.current, prevValueCache = _cacheRef$current.values, prevOptionCache = _cacheRef$current.options;
var patchedValues = labeledValues.map(function(item) {
if (item.label === void 0) {
var _prevValueCache$get;
return _objectSpread2$a(_objectSpread2$a({}, item), {}, {
label: (_prevValueCache$get = prevValueCache.get(item.value)) === null || _prevValueCache$get === void 0 ? void 0 : _prevValueCache$get.label
});
}
return item;
});
var valueCache = /* @__PURE__ */ new Map();
var optionCache = /* @__PURE__ */ new Map();
patchedValues.forEach(function(item) {
valueCache.set(item.value, item);
optionCache.set(item.value, valueOptions.get(item.value) || prevOptionCache.get(item.value));
});
cacheRef.current.values = valueCache;
cacheRef.current.options = optionCache;
return patchedValues;
}, [labeledValues, valueOptions]);
var getOption = React__namespace.useCallback(function(val) {
return valueOptions.get(val) || cacheRef.current.options.get(val);
}, [valueOptions]);
return [filledLabeledValues, getOption];
};
function includes(test, search) {
return toArray$7(test).join("").toUpperCase().includes(search);
}
const useFilterOptions = function(options, fieldNames, searchValue, filterOption, optionFilterProp) {
return React__namespace.useMemo(function() {
if (!searchValue || filterOption === false) {
return options;
}
var fieldOptions = fieldNames.options, fieldLabel = fieldNames.label, fieldValue = fieldNames.value;
var filteredOptions = [];
var customizeFilter = typeof filterOption === "function";
var upperSearch = searchValue.toUpperCase();
var filterFunc = customizeFilter ? filterOption : function(_, option) {
if (optionFilterProp) {
return includes(option[optionFilterProp], upperSearch);
}
if (option[fieldOptions]) {
return includes(option[fieldLabel !== "children" ? fieldLabel : "label"], upperSearch);
}
return includes(option[fieldValue], upperSearch);
};
var wrapOption = customizeFilter ? function(opt) {
return injectPropsWithOption(opt);
} : function(opt) {
return opt;
};
options.forEach(function(item) {
if (item[fieldOptions]) {
var matchGroup = filterFunc(searchValue, wrapOption(item));
if (matchGroup) {
filteredOptions.push(item);
} else {
var subOptions = item[fieldOptions].filter(function(subItem) {
return filterFunc(searchValue, wrapOption(subItem));
});
if (subOptions.length) {
filteredOptions.push(_objectSpread2$a(_objectSpread2$a({}, item), {}, _defineProperty$b({}, fieldOptions, subOptions)));
}
}
return;
}
if (filterFunc(searchValue, wrapOption(item))) {
filteredOptions.push(item);
}
});
return filteredOptions;
}, [options, filterOption, optionFilterProp, searchValue, fieldNames]);
};
var uuid$5 = 0;
var isBrowserClient$1 = canUseDom$1();
function getUUID$1() {
var retId;
if (isBrowserClient$1) {
retId = uuid$5;
uuid$5 += 1;
} else {
retId = "TEST_OR_SSR";
}
return retId;
}
function useId$2(id2) {
var _React$useState = React__namespace.useState(), _React$useState2 = _slicedToArray$e(_React$useState, 2), innerId = _React$useState2[0], setInnerId = _React$useState2[1];
React__namespace.useEffect(function() {
setInnerId("rc_select_".concat(getUUID$1()));
}, []);
return id2 || innerId;
}
var _excluded$D = ["children", "value"], _excluded2$7 = ["children"];
function convertNodeToOption(node) {
var _ref = node, key2 = _ref.key, _ref$props = _ref.props, children = _ref$props.children, value = _ref$props.value, restProps = _objectWithoutProperties$1(_ref$props, _excluded$D);
return _objectSpread2$a({
key: key2,
value: value !== void 0 ? value : key2,
children
}, restProps);
}
function convertChildrenToData$1(nodes) {
var optionOnly = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
return toArray$9(nodes).map(function(node, index2) {
if (!/* @__PURE__ */ React__namespace.isValidElement(node) || !node.type) {
return null;
}
var _ref2 = node, isSelectOptGroup = _ref2.type.isSelectOptGroup, key2 = _ref2.key, _ref2$props = _ref2.props, children = _ref2$props.children, restProps = _objectWithoutProperties$1(_ref2$props, _excluded2$7);
if (optionOnly || !isSelectOptGroup) {
return convertNodeToOption(node);
}
return _objectSpread2$a(_objectSpread2$a({
key: "__RC_SELECT_GRP__".concat(key2 === null ? index2 : key2, "__"),
label: key2
}, restProps), {}, {
options: convertChildrenToData$1(children)
});
}).filter(function(data) {
return data;
});
}
function useOptions(options, children, fieldNames, optionFilterProp, optionLabelProp) {
return React__namespace.useMemo(function() {
var mergedOptions = options;
var childrenAsData = !options;
if (childrenAsData) {
mergedOptions = convertChildrenToData$1(children);
}
var valueOptions = /* @__PURE__ */ new Map();
var labelOptions = /* @__PURE__ */ new Map();
var setLabelOptions = function setLabelOptions2(labelOptionsMap, option, key2) {
if (key2 && typeof key2 === "string") {
labelOptionsMap.set(option[key2], option);
}
};
function dig(optionList) {
var isChildren = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
for (var i2 = 0; i2 < optionList.length; i2 += 1) {
var option = optionList[i2];
if (!option[fieldNames.options] || isChildren) {
valueOptions.set(option[fieldNames.value], option);
setLabelOptions(labelOptions, option, fieldNames.label);
setLabelOptions(labelOptions, option, optionFilterProp);
setLabelOptions(labelOptions, option, optionLabelProp);
} else {
dig(option[fieldNames.options], true);
}
}
}
dig(mergedOptions);
return {
options: mergedOptions,
valueOptions,
labelOptions
};
}, [options, children, fieldNames, optionFilterProp, optionLabelProp]);
}
function useRefFunc$1(callback) {
var funcRef = React__namespace.useRef();
funcRef.current = callback;
var cacheFn = React__namespace.useCallback(function() {
return funcRef.current.apply(funcRef, arguments);
}, []);
return cacheFn;
}
var OptGroup = function OptGroup2() {
return null;
};
OptGroup.isSelectOptGroup = true;
var Option = function Option2() {
return null;
};
Option.isSelectOption = true;
var Filler = /* @__PURE__ */ React__namespace.forwardRef(function(_ref, ref) {
var height = _ref.height, offset2 = _ref.offset, children = _ref.children, prefixCls = _ref.prefixCls, onInnerResize = _ref.onInnerResize, innerProps = _ref.innerProps;
var outerStyle = {};
var innerStyle = {
display: "flex",
flexDirection: "column"
};
if (offset2 !== void 0) {
outerStyle = {
height,
position: "relative",
overflow: "hidden"
};
innerStyle = _objectSpread2$a(_objectSpread2$a({}, innerStyle), {}, {
transform: "translateY(".concat(offset2, "px)"),
position: "absolute",
left: 0,
right: 0,
top: 0
});
}
return /* @__PURE__ */ jsx("div", {
style: outerStyle,
children: /* @__PURE__ */ jsx(RefResizeObserver, {
onResize: function onResize2(_ref2) {
var offsetHeight = _ref2.offsetHeight;
if (offsetHeight && onInnerResize) {
onInnerResize();
}
},
children: /* @__PURE__ */ jsx("div", {
style: innerStyle,
className: classnames(_defineProperty$b({}, "".concat(prefixCls, "-holder-inner"), prefixCls)),
ref,
...innerProps,
children
})
})
});
});
Filler.displayName = "Filler";
var MIN_SIZE = 20;
function getPageY(e2) {
return "touches" in e2 ? e2.touches[0].pageY : e2.pageY;
}
var ScrollBar = /* @__PURE__ */ function(_React$Component) {
_inherits(ScrollBar2, _React$Component);
var _super = _createSuper(ScrollBar2);
function ScrollBar2() {
var _this2;
_classCallCheck(this, ScrollBar2);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_this2.moveRaf = null;
_this2.scrollbarRef = /* @__PURE__ */ React__namespace.createRef();
_this2.thumbRef = /* @__PURE__ */ React__namespace.createRef();
_this2.visibleTimeout = null;
_this2.state = {
dragging: false,
pageY: null,
startTop: null,
visible: false
};
_this2.delayHidden = function() {
clearTimeout(_this2.visibleTimeout);
_this2.setState({
visible: true
});
_this2.visibleTimeout = setTimeout(function() {
_this2.setState({
visible: false
});
}, 2e3);
};
_this2.onScrollbarTouchStart = function(e2) {
e2.preventDefault();
};
_this2.onContainerMouseDown = function(e2) {
e2.stopPropagation();
e2.preventDefault();
};
_this2.patchEvents = function() {
window.addEventListener("mousemove", _this2.onMouseMove);
window.addEventListener("mouseup", _this2.onMouseUp);
_this2.thumbRef.current.addEventListener("touchmove", _this2.onMouseMove);
_this2.thumbRef.current.addEventListener("touchend", _this2.onMouseUp);
};
_this2.removeEvents = function() {
var _this$scrollbarRef$cu;
window.removeEventListener("mousemove", _this2.onMouseMove);
window.removeEventListener("mouseup", _this2.onMouseUp);
(_this$scrollbarRef$cu = _this2.scrollbarRef.current) === null || _this$scrollbarRef$cu === void 0 ? void 0 : _this$scrollbarRef$cu.removeEventListener("touchstart", _this2.onScrollbarTouchStart);
if (_this2.thumbRef.current) {
_this2.thumbRef.current.removeEventListener("touchstart", _this2.onMouseDown);
_this2.thumbRef.current.removeEventListener("touchmove", _this2.onMouseMove);
_this2.thumbRef.current.removeEventListener("touchend", _this2.onMouseUp);
}
wrapperRaf$1.cancel(_this2.moveRaf);
};
_this2.onMouseDown = function(e2) {
var onStartMove = _this2.props.onStartMove;
_this2.setState({
dragging: true,
pageY: getPageY(e2),
startTop: _this2.getTop()
});
onStartMove();
_this2.patchEvents();
e2.stopPropagation();
e2.preventDefault();
};
_this2.onMouseMove = function(e2) {
var _this$state = _this2.state, dragging = _this$state.dragging, pageY = _this$state.pageY, startTop = _this$state.startTop;
var onScroll = _this2.props.onScroll;
wrapperRaf$1.cancel(_this2.moveRaf);
if (dragging) {
var offsetY = getPageY(e2) - pageY;
var newTop = startTop + offsetY;
var enableScrollRange = _this2.getEnableScrollRange();
var enableHeightRange = _this2.getEnableHeightRange();
var ptg = enableHeightRange ? newTop / enableHeightRange : 0;
var newScrollTop = Math.ceil(ptg * enableScrollRange);
_this2.moveRaf = wrapperRaf$1(function() {
onScroll(newScrollTop);
});
}
};
_this2.onMouseUp = function() {
var onStopMove = _this2.props.onStopMove;
_this2.setState({
dragging: false
});
onStopMove();
_this2.removeEvents();
};
_this2.getSpinHeight = function() {
var _this$props = _this2.props, height = _this$props.height, count = _this$props.count;
var baseHeight = height / count * 10;
baseHeight = Math.max(baseHeight, MIN_SIZE);
baseHeight = Math.min(baseHeight, height / 2);
return Math.floor(baseHeight);
};
_this2.getEnableScrollRange = function() {
var _this$props2 = _this2.props, scrollHeight = _this$props2.scrollHeight, height = _this$props2.height;
return scrollHeight - height || 0;
};
_this2.getEnableHeightRange = function() {
var height = _this2.props.height;
var spinHeight = _this2.getSpinHeight();
return height - spinHeight || 0;
};
_this2.getTop = function() {
var scrollTop = _this2.props.scrollTop;
var enableScrollRange = _this2.getEnableScrollRange();
var enableHeightRange = _this2.getEnableHeightRange();
if (scrollTop === 0 || enableScrollRange === 0) {
return 0;
}
var ptg = scrollTop / enableScrollRange;
return ptg * enableHeightRange;
};
_this2.showScroll = function() {
var _this$props3 = _this2.props, height = _this$props3.height, scrollHeight = _this$props3.scrollHeight;
return scrollHeight > height;
};
return _this2;
}
_createClass(ScrollBar2, [{
key: "componentDidMount",
value: function componentDidMount() {
this.scrollbarRef.current.addEventListener("touchstart", this.onScrollbarTouchStart);
this.thumbRef.current.addEventListener("touchstart", this.onMouseDown);
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps) {
if (prevProps.scrollTop !== this.props.scrollTop) {
this.delayHidden();
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this.removeEvents();
clearTimeout(this.visibleTimeout);
}
}, {
key: "render",
value: function render2() {
var _this$state2 = this.state, dragging = _this$state2.dragging, visible = _this$state2.visible;
var _this$props4 = this.props, prefixCls = _this$props4.prefixCls, direction = _this$props4.direction;
var spinHeight = this.getSpinHeight();
var top = this.getTop();
var canScroll = this.showScroll();
var mergedVisible = canScroll && visible;
var scrollBarDirection = direction === "rtl" ? {
left: 0
} : {
right: 0
};
return /* @__PURE__ */ jsx("div", {
ref: this.scrollbarRef,
className: classnames("".concat(prefixCls, "-scrollbar"), _defineProperty$b({}, "".concat(prefixCls, "-scrollbar-show"), canScroll)),
style: _objectSpread2$a(_objectSpread2$a({
width: 8,
top: 0,
bottom: 0
}, scrollBarDirection), {}, {
position: "absolute",
display: mergedVisible ? null : "none"
}),
onMouseDown: this.onContainerMouseDown,
onMouseMove: this.delayHidden,
children: /* @__PURE__ */ jsx("div", {
ref: this.thumbRef,
className: classnames("".concat(prefixCls, "-scrollbar-thumb"), _defineProperty$b({}, "".concat(prefixCls, "-scrollbar-thumb-moving"), dragging)),
style: {
width: "100%",
height: spinHeight,
top,
left: 0,
position: "absolute",
background: "rgba(0, 0, 0, 0.5)",
borderRadius: 99,
cursor: "pointer",
userSelect: "none"
},
onMouseDown: this.onMouseDown
})
});
}
}]);
return ScrollBar2;
}(React__namespace.Component);
function Item$2(_ref) {
var children = _ref.children, setRef = _ref.setRef;
var refFunc = React__namespace.useCallback(function(node) {
setRef(node);
}, []);
return /* @__PURE__ */ React__namespace.cloneElement(children, {
ref: refFunc
});
}
function useChildren(list, startIndex, endIndex, setNodeRef, renderFunc, _ref) {
var getKey2 = _ref.getKey;
return list.slice(startIndex, endIndex + 1).map(function(item, index2) {
var eleIndex = startIndex + index2;
var node = renderFunc(item, eleIndex, {});
var key2 = getKey2(item);
return /* @__PURE__ */ jsx(Item$2, {
setRef: function setRef(ele) {
return setNodeRef(item, ele);
},
children: node
}, key2);
});
}
var CacheMap = /* @__PURE__ */ function() {
function CacheMap2() {
_classCallCheck(this, CacheMap2);
this.maps = void 0;
this.maps = /* @__PURE__ */ Object.create(null);
}
_createClass(CacheMap2, [{
key: "set",
value: function set2(key2, value) {
this.maps[key2] = value;
}
}, {
key: "get",
value: function get2(key2) {
return this.maps[key2];
}
}]);
return CacheMap2;
}();
function useHeights(getKey2, onItemAdd, onItemRemove) {
var _React$useState = React__namespace.useState(0), _React$useState2 = _slicedToArray$e(_React$useState, 2), updatedMark = _React$useState2[0], setUpdatedMark = _React$useState2[1];
var instanceRef = React$a.useRef(/* @__PURE__ */ new Map());
var heightsRef = React$a.useRef(new CacheMap());
var collectRafRef = React$a.useRef();
function cancelRaf() {
wrapperRaf$1.cancel(collectRafRef.current);
}
function collectHeight() {
cancelRaf();
collectRafRef.current = wrapperRaf$1(function() {
instanceRef.current.forEach(function(element, key2) {
if (element && element.offsetParent) {
var htmlElement = findDOMNode(element);
var offsetHeight = htmlElement.offsetHeight;
if (heightsRef.current.get(key2) !== offsetHeight) {
heightsRef.current.set(key2, htmlElement.offsetHeight);
}
}
});
setUpdatedMark(function(c2) {
return c2 + 1;
});
});
}
function setInstanceRef(item, instance) {
var key2 = getKey2(item);
var origin = instanceRef.current.get(key2);
if (instance) {
instanceRef.current.set(key2, instance);
collectHeight();
} else {
instanceRef.current.delete(key2);
}
if (!origin !== !instance) {
if (instance) {
onItemAdd === null || onItemAdd === void 0 ? void 0 : onItemAdd(item);
} else {
onItemRemove === null || onItemRemove === void 0 ? void 0 : onItemRemove(item);
}
}
}
React$a.useEffect(function() {
return cancelRaf;
}, []);
return [setInstanceRef, collectHeight, heightsRef.current, updatedMark];
}
function useScrollTo(containerRef, data, heights, itemHeight, getKey2, collectHeight, syncScrollTop, triggerFlash) {
var scrollRef = React__namespace.useRef();
return function(arg) {
if (arg === null || arg === void 0) {
triggerFlash();
return;
}
wrapperRaf$1.cancel(scrollRef.current);
if (typeof arg === "number") {
syncScrollTop(arg);
} else if (arg && _typeof$q(arg) === "object") {
var index2;
var align = arg.align;
if ("index" in arg) {
index2 = arg.index;
} else {
index2 = data.findIndex(function(item) {
return getKey2(item) === arg.key;
});
}
var _arg$offset = arg.offset, offset2 = _arg$offset === void 0 ? 0 : _arg$offset;
var syncScroll = function syncScroll2(times, targetAlign) {
if (times < 0 || !containerRef.current)
return;
var height = containerRef.current.clientHeight;
var needCollectHeight = false;
var newTargetAlign = targetAlign;
if (height) {
var mergedAlign = targetAlign || align;
var stackTop = 0;
var itemTop = 0;
var itemBottom = 0;
var maxLen = Math.min(data.length, index2);
for (var i2 = 0; i2 <= maxLen; i2 += 1) {
var key2 = getKey2(data[i2]);
itemTop = stackTop;
var cacheHeight = heights.get(key2);
itemBottom = itemTop + (cacheHeight === void 0 ? itemHeight : cacheHeight);
stackTop = itemBottom;
if (i2 === index2 && cacheHeight === void 0) {
needCollectHeight = true;
}
}
var targetTop = null;
switch (mergedAlign) {
case "top":
targetTop = itemTop - offset2;
break;
case "bottom":
targetTop = itemBottom - height + offset2;
break;
default: {
var scrollTop = containerRef.current.scrollTop;
var scrollBottom = scrollTop + height;
if (itemTop < scrollTop) {
newTargetAlign = "top";
} else if (itemBottom > scrollBottom) {
newTargetAlign = "bottom";
}
}
}
if (targetTop !== null && targetTop !== containerRef.current.scrollTop) {
syncScrollTop(targetTop);
}
}
scrollRef.current = wrapperRaf$1(function() {
if (needCollectHeight) {
collectHeight();
}
syncScroll2(times - 1, newTargetAlign);
}, 2);
};
syncScroll(3);
}
};
}
function findListDiffIndex(originList, targetList, getKey2) {
var originLen = originList.length;
var targetLen = targetList.length;
var shortList;
var longList;
if (originLen === 0 && targetLen === 0) {
return null;
}
if (originLen < targetLen) {
shortList = originList;
longList = targetList;
} else {
shortList = targetList;
longList = originList;
}
var notExistKey = {
__EMPTY_ITEM__: true
};
function getItemKey(item) {
if (item !== void 0) {
return getKey2(item);
}
return notExistKey;
}
var diffIndex = null;
var multiple = Math.abs(originLen - targetLen) !== 1;
for (var i2 = 0; i2 < longList.length; i2 += 1) {
var shortKey = getItemKey(shortList[i2]);
var longKey = getItemKey(longList[i2]);
if (shortKey !== longKey) {
diffIndex = i2;
multiple = multiple || shortKey !== getItemKey(longList[i2 + 1]);
break;
}
}
return diffIndex === null ? null : {
index: diffIndex,
multiple
};
}
function useDiffItem(data, getKey2, onDiff) {
var _React$useState = React__namespace.useState(data), _React$useState2 = _slicedToArray$e(_React$useState, 2), prevData = _React$useState2[0], setPrevData = _React$useState2[1];
var _React$useState3 = React__namespace.useState(null), _React$useState4 = _slicedToArray$e(_React$useState3, 2), diffItem = _React$useState4[0], setDiffItem = _React$useState4[1];
React__namespace.useEffect(function() {
var diff = findListDiffIndex(prevData || [], data || [], getKey2);
if ((diff === null || diff === void 0 ? void 0 : diff.index) !== void 0) {
onDiff === null || onDiff === void 0 ? void 0 : onDiff(diff.index);
setDiffItem(data[diff.index]);
}
setPrevData(data);
}, [data]);
return [diffItem];
}
var isFF = (typeof navigator === "undefined" ? "undefined" : _typeof$q(navigator)) === "object" && /Firefox/i.test(navigator.userAgent);
const useOriginScroll = function(isScrollAtTop, isScrollAtBottom) {
var lockRef = React$a.useRef(false);
var lockTimeoutRef = React$a.useRef(null);
function lockScroll() {
clearTimeout(lockTimeoutRef.current);
lockRef.current = true;
lockTimeoutRef.current = setTimeout(function() {
lockRef.current = false;
}, 50);
}
var scrollPingRef = React$a.useRef({
top: isScrollAtTop,
bottom: isScrollAtBottom
});
scrollPingRef.current.top = isScrollAtTop;
scrollPingRef.current.bottom = isScrollAtBottom;
return function(deltaY) {
var smoothOffset = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
var originScroll = deltaY < 0 && scrollPingRef.current.top || deltaY > 0 && scrollPingRef.current.bottom;
if (smoothOffset && originScroll) {
clearTimeout(lockTimeoutRef.current);
lockRef.current = false;
} else if (!originScroll || lockRef.current) {
lockScroll();
}
return !lockRef.current && originScroll;
};
};
function useFrameWheel(inVirtual, isScrollAtTop, isScrollAtBottom, onWheelDelta) {
var offsetRef = React$a.useRef(0);
var nextFrameRef = React$a.useRef(null);
var wheelValueRef = React$a.useRef(null);
var isMouseScrollRef = React$a.useRef(false);
var originScroll = useOriginScroll(isScrollAtTop, isScrollAtBottom);
function onWheel(event) {
if (!inVirtual)
return;
wrapperRaf$1.cancel(nextFrameRef.current);
var deltaY = event.deltaY;
offsetRef.current += deltaY;
wheelValueRef.current = deltaY;
if (originScroll(deltaY))
return;
if (!isFF) {
event.preventDefault();
}
nextFrameRef.current = wrapperRaf$1(function() {
var patchMultiple = isMouseScrollRef.current ? 10 : 1;
onWheelDelta(offsetRef.current * patchMultiple);
offsetRef.current = 0;
});
}
function onFireFoxScroll(event) {
if (!inVirtual)
return;
isMouseScrollRef.current = event.detail === wheelValueRef.current;
}
return [onWheel, onFireFoxScroll];
}
var SMOOTH_PTG = 14 / 15;
function useMobileTouchMove(inVirtual, listRef, callback) {
var touchedRef = React$a.useRef(false);
var touchYRef = React$a.useRef(0);
var elementRef = React$a.useRef(null);
var intervalRef = React$a.useRef(null);
var cleanUpEvents;
var onTouchMove = function onTouchMove2(e2) {
if (touchedRef.current) {
var currentY = Math.ceil(e2.touches[0].pageY);
var offsetY = touchYRef.current - currentY;
touchYRef.current = currentY;
if (callback(offsetY)) {
e2.preventDefault();
}
clearInterval(intervalRef.current);
intervalRef.current = setInterval(function() {
offsetY *= SMOOTH_PTG;
if (!callback(offsetY, true) || Math.abs(offsetY) <= 0.1) {
clearInterval(intervalRef.current);
}
}, 16);
}
};
var onTouchEnd = function onTouchEnd2() {
touchedRef.current = false;
cleanUpEvents();
};
var onTouchStart = function onTouchStart2(e2) {
cleanUpEvents();
if (e2.touches.length === 1 && !touchedRef.current) {
touchedRef.current = true;
touchYRef.current = Math.ceil(e2.touches[0].pageY);
elementRef.current = e2.target;
elementRef.current.addEventListener("touchmove", onTouchMove);
elementRef.current.addEventListener("touchend", onTouchEnd);
}
};
cleanUpEvents = function cleanUpEvents2() {
if (elementRef.current) {
elementRef.current.removeEventListener("touchmove", onTouchMove);
elementRef.current.removeEventListener("touchend", onTouchEnd);
}
};
useLayoutEffect$1(function() {
if (inVirtual) {
listRef.current.addEventListener("touchstart", onTouchStart);
}
return function() {
var _listRef$current;
(_listRef$current = listRef.current) === null || _listRef$current === void 0 ? void 0 : _listRef$current.removeEventListener("touchstart", onTouchStart);
cleanUpEvents();
clearInterval(intervalRef.current);
};
}, [inVirtual]);
}
var _excluded$C = ["prefixCls", "className", "height", "itemHeight", "fullHeight", "style", "data", "children", "itemKey", "virtual", "direction", "component", "onScroll", "onVisibleChange", "innerProps"];
var EMPTY_DATA$1 = [];
var ScrollStyle = {
overflowY: "auto",
overflowAnchor: "none"
};
function RawList(props, ref) {
var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-virtual-list" : _props$prefixCls, className = props.className, height = props.height, itemHeight = props.itemHeight, _props$fullHeight = props.fullHeight, fullHeight = _props$fullHeight === void 0 ? true : _props$fullHeight, style2 = props.style, data = props.data, children = props.children, itemKey2 = props.itemKey, virtual = props.virtual, direction = props.direction, _props$component = props.component, Component = _props$component === void 0 ? "div" : _props$component, onScroll = props.onScroll, onVisibleChange = props.onVisibleChange, innerProps = props.innerProps, restProps = _objectWithoutProperties$1(props, _excluded$C);
var useVirtual = !!(virtual !== false && height && itemHeight);
var inVirtual = useVirtual && data && itemHeight * data.length > height;
var _useState = React$a.useState(0), _useState2 = _slicedToArray$e(_useState, 2), scrollTop = _useState2[0], setScrollTop = _useState2[1];
var _useState3 = React$a.useState(false), _useState4 = _slicedToArray$e(_useState3, 2), scrollMoving = _useState4[0], setScrollMoving = _useState4[1];
var mergedClassName = classnames(prefixCls, _defineProperty$b({}, "".concat(prefixCls, "-rtl"), direction === "rtl"), className);
var mergedData = data || EMPTY_DATA$1;
var componentRef = React$a.useRef();
var fillerInnerRef = React$a.useRef();
var scrollBarRef = React$a.useRef();
var getKey2 = React__namespace.useCallback(function(item) {
if (typeof itemKey2 === "function") {
return itemKey2(item);
}
return item === null || item === void 0 ? void 0 : item[itemKey2];
}, [itemKey2]);
var sharedConfig = {
getKey: getKey2
};
function syncScrollTop(newTop) {
setScrollTop(function(origin) {
var value;
if (typeof newTop === "function") {
value = newTop(origin);
} else {
value = newTop;
}
var alignedTop = keepInRange(value);
componentRef.current.scrollTop = alignedTop;
return alignedTop;
});
}
var rangeRef = React$a.useRef({
start: 0,
end: mergedData.length
});
var diffItemRef = React$a.useRef();
var _useDiffItem = useDiffItem(mergedData, getKey2), _useDiffItem2 = _slicedToArray$e(_useDiffItem, 1), diffItem = _useDiffItem2[0];
diffItemRef.current = diffItem;
var _useHeights = useHeights(getKey2, null, null), _useHeights2 = _slicedToArray$e(_useHeights, 4), setInstanceRef = _useHeights2[0], collectHeight = _useHeights2[1], heights = _useHeights2[2], heightUpdatedMark = _useHeights2[3];
var _React$useMemo = React__namespace.useMemo(function() {
if (!useVirtual) {
return {
scrollHeight: void 0,
start: 0,
end: mergedData.length - 1,
offset: void 0
};
}
if (!inVirtual) {
var _fillerInnerRef$curre;
return {
scrollHeight: ((_fillerInnerRef$curre = fillerInnerRef.current) === null || _fillerInnerRef$curre === void 0 ? void 0 : _fillerInnerRef$curre.offsetHeight) || 0,
start: 0,
end: mergedData.length - 1,
offset: void 0
};
}
var itemTop = 0;
var startIndex;
var startOffset;
var endIndex;
var dataLen = mergedData.length;
for (var i2 = 0; i2 < dataLen; i2 += 1) {
var item = mergedData[i2];
var key2 = getKey2(item);
var cacheHeight = heights.get(key2);
var currentItemBottom = itemTop + (cacheHeight === void 0 ? itemHeight : cacheHeight);
if (currentItemBottom >= scrollTop && startIndex === void 0) {
startIndex = i2;
startOffset = itemTop;
}
if (currentItemBottom > scrollTop + height && endIndex === void 0) {
endIndex = i2;
}
itemTop = currentItemBottom;
}
if (startIndex === void 0) {
startIndex = 0;
startOffset = 0;
endIndex = Math.ceil(height / itemHeight);
}
if (endIndex === void 0) {
endIndex = mergedData.length - 1;
}
endIndex = Math.min(endIndex + 1, mergedData.length);
return {
scrollHeight: itemTop,
start: startIndex,
end: endIndex,
offset: startOffset
};
}, [inVirtual, useVirtual, scrollTop, mergedData, heightUpdatedMark, height]), scrollHeight = _React$useMemo.scrollHeight, start = _React$useMemo.start, end = _React$useMemo.end, offset2 = _React$useMemo.offset;
rangeRef.current.start = start;
rangeRef.current.end = end;
var maxScrollHeight = scrollHeight - height;
var maxScrollHeightRef = React$a.useRef(maxScrollHeight);
maxScrollHeightRef.current = maxScrollHeight;
function keepInRange(newScrollTop) {
var newTop = newScrollTop;
if (!Number.isNaN(maxScrollHeightRef.current)) {
newTop = Math.min(newTop, maxScrollHeightRef.current);
}
newTop = Math.max(newTop, 0);
return newTop;
}
var isScrollAtTop = scrollTop <= 0;
var isScrollAtBottom = scrollTop >= maxScrollHeight;
var originScroll = useOriginScroll(isScrollAtTop, isScrollAtBottom);
function onScrollBar(newScrollTop) {
var newTop = newScrollTop;
syncScrollTop(newTop);
}
function onFallbackScroll(e2) {
var newScrollTop = e2.currentTarget.scrollTop;
if (newScrollTop !== scrollTop) {
syncScrollTop(newScrollTop);
}
onScroll === null || onScroll === void 0 ? void 0 : onScroll(e2);
}
var _useFrameWheel = useFrameWheel(useVirtual, isScrollAtTop, isScrollAtBottom, function(offsetY) {
syncScrollTop(function(top) {
var newTop = top + offsetY;
return newTop;
});
}), _useFrameWheel2 = _slicedToArray$e(_useFrameWheel, 2), onRawWheel = _useFrameWheel2[0], onFireFoxScroll = _useFrameWheel2[1];
useMobileTouchMove(useVirtual, componentRef, function(deltaY, smoothOffset) {
if (originScroll(deltaY, smoothOffset)) {
return false;
}
onRawWheel({
preventDefault: function preventDefault() {
},
deltaY
});
return true;
});
useLayoutEffect$1(function() {
function onMozMousePixelScroll(e2) {
if (useVirtual) {
e2.preventDefault();
}
}
componentRef.current.addEventListener("wheel", onRawWheel);
componentRef.current.addEventListener("DOMMouseScroll", onFireFoxScroll);
componentRef.current.addEventListener("MozMousePixelScroll", onMozMousePixelScroll);
return function() {
if (componentRef.current) {
componentRef.current.removeEventListener("wheel", onRawWheel);
componentRef.current.removeEventListener("DOMMouseScroll", onFireFoxScroll);
componentRef.current.removeEventListener("MozMousePixelScroll", onMozMousePixelScroll);
}
};
}, [useVirtual]);
var scrollTo2 = useScrollTo(componentRef, mergedData, heights, itemHeight, getKey2, collectHeight, syncScrollTop, function() {
var _scrollBarRef$current;
(_scrollBarRef$current = scrollBarRef.current) === null || _scrollBarRef$current === void 0 ? void 0 : _scrollBarRef$current.delayHidden();
});
React__namespace.useImperativeHandle(ref, function() {
return {
scrollTo: scrollTo2
};
});
useLayoutEffect$1(function() {
if (onVisibleChange) {
var renderList = mergedData.slice(start, end + 1);
onVisibleChange(renderList, mergedData);
}
}, [start, end, mergedData]);
var listChildren = useChildren(mergedData, start, end, setInstanceRef, children, sharedConfig);
var componentStyle = null;
if (height) {
componentStyle = _objectSpread2$a(_defineProperty$b({}, fullHeight ? "height" : "maxHeight", height), ScrollStyle);
if (useVirtual) {
componentStyle.overflowY = "hidden";
if (scrollMoving) {
componentStyle.pointerEvents = "none";
}
}
}
return /* @__PURE__ */ jsxs("div", {
style: _objectSpread2$a(_objectSpread2$a({}, style2), {}, {
position: "relative"
}),
className: mergedClassName,
...restProps,
children: [/* @__PURE__ */ jsx(Component, {
className: "".concat(prefixCls, "-holder"),
style: componentStyle,
ref: componentRef,
onScroll: onFallbackScroll,
children: /* @__PURE__ */ jsx(Filler, {
prefixCls,
height: scrollHeight,
offset: offset2,
onInnerResize: collectHeight,
ref: fillerInnerRef,
innerProps,
children: listChildren
})
}), useVirtual && /* @__PURE__ */ jsx(ScrollBar, {
ref: scrollBarRef,
prefixCls,
scrollTop,
height,
scrollHeight,
count: mergedData.length,
direction,
onScroll: onScrollBar,
onStartMove: function onStartMove() {
setScrollMoving(true);
},
onStopMove: function onStopMove() {
setScrollMoving(false);
}
})]
});
}
var List$1 = /* @__PURE__ */ React__namespace.forwardRef(RawList);
List$1.displayName = "List";
function isPlatformMac() {
return /(mac\sos|macintosh)/i.test(navigator.appVersion);
}
var SelectContext = /* @__PURE__ */ React__namespace.createContext(null);
var _excluded$B = ["disabled", "title", "children", "style", "className"];
function isTitleType(content) {
return typeof content === "string" || typeof content === "number";
}
var OptionList$1 = function OptionList2(_, ref) {
var _useBaseProps = useBaseProps(), prefixCls = _useBaseProps.prefixCls, id2 = _useBaseProps.id, open = _useBaseProps.open, multiple = _useBaseProps.multiple, mode = _useBaseProps.mode, searchValue = _useBaseProps.searchValue, toggleOpen = _useBaseProps.toggleOpen, notFoundContent = _useBaseProps.notFoundContent, onPopupScroll = _useBaseProps.onPopupScroll;
var _React$useContext = React__namespace.useContext(SelectContext), flattenOptions2 = _React$useContext.flattenOptions, onActiveValue = _React$useContext.onActiveValue, defaultActiveFirstOption = _React$useContext.defaultActiveFirstOption, onSelect = _React$useContext.onSelect, menuItemSelectedIcon = _React$useContext.menuItemSelectedIcon, rawValues = _React$useContext.rawValues, fieldNames = _React$useContext.fieldNames, virtual = _React$useContext.virtual, listHeight = _React$useContext.listHeight, listItemHeight = _React$useContext.listItemHeight;
var itemPrefixCls = "".concat(prefixCls, "-item");
var memoFlattenOptions = useMemo(function() {
return flattenOptions2;
}, [open, flattenOptions2], function(prev, next) {
return next[0] && prev[1] !== next[1];
});
var listRef = React__namespace.useRef(null);
var onListMouseDown = function onListMouseDown2(event) {
event.preventDefault();
};
var scrollIntoView2 = function scrollIntoView3(args) {
if (listRef.current) {
listRef.current.scrollTo(typeof args === "number" ? {
index: args
} : args);
}
};
var getEnabledActiveIndex = function getEnabledActiveIndex2(index2) {
var offset2 = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 1;
var len = memoFlattenOptions.length;
for (var i2 = 0; i2 < len; i2 += 1) {
var current = (index2 + i2 * offset2 + len) % len;
var _memoFlattenOptions$c = memoFlattenOptions[current], group = _memoFlattenOptions$c.group, data = _memoFlattenOptions$c.data;
if (!group && !data.disabled) {
return current;
}
}
return -1;
};
var _React$useState = React__namespace.useState(function() {
return getEnabledActiveIndex(0);
}), _React$useState2 = _slicedToArray$e(_React$useState, 2), activeIndex = _React$useState2[0], setActiveIndex = _React$useState2[1];
var setActive = function setActive2(index2) {
var fromKeyboard = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
setActiveIndex(index2);
var info = {
source: fromKeyboard ? "keyboard" : "mouse"
};
var flattenItem = memoFlattenOptions[index2];
if (!flattenItem) {
onActiveValue(null, -1, info);
return;
}
onActiveValue(flattenItem.value, index2, info);
};
React$a.useEffect(function() {
setActive(defaultActiveFirstOption !== false ? getEnabledActiveIndex(0) : -1);
}, [memoFlattenOptions.length, searchValue]);
var isSelected = React__namespace.useCallback(function(value) {
return rawValues.has(value) && mode !== "combobox";
}, [mode, _toConsumableArray$c(rawValues).toString(), rawValues.size]);
React$a.useEffect(function() {
var timeoutId = setTimeout(function() {
if (!multiple && open && rawValues.size === 1) {
var value = Array.from(rawValues)[0];
var index2 = memoFlattenOptions.findIndex(function(_ref) {
var data = _ref.data;
return data.value === value;
});
if (index2 !== -1) {
setActive(index2);
scrollIntoView2(index2);
}
}
});
if (open) {
var _listRef$current;
(_listRef$current = listRef.current) === null || _listRef$current === void 0 ? void 0 : _listRef$current.scrollTo(void 0);
}
return function() {
return clearTimeout(timeoutId);
};
}, [open, searchValue]);
var onSelectValue = function onSelectValue2(value) {
if (value !== void 0) {
onSelect(value, {
selected: !rawValues.has(value)
});
}
if (!multiple) {
toggleOpen(false);
}
};
React__namespace.useImperativeHandle(ref, function() {
return {
onKeyDown: function onKeyDown2(event) {
var which = event.which, ctrlKey = event.ctrlKey;
switch (which) {
case KeyCode.N:
case KeyCode.P:
case KeyCode.UP:
case KeyCode.DOWN: {
var offset2 = 0;
if (which === KeyCode.UP) {
offset2 = -1;
} else if (which === KeyCode.DOWN) {
offset2 = 1;
} else if (isPlatformMac() && ctrlKey) {
if (which === KeyCode.N) {
offset2 = 1;
} else if (which === KeyCode.P) {
offset2 = -1;
}
}
if (offset2 !== 0) {
var nextActiveIndex = getEnabledActiveIndex(activeIndex + offset2, offset2);
scrollIntoView2(nextActiveIndex);
setActive(nextActiveIndex, true);
}
break;
}
case KeyCode.ENTER: {
var item = memoFlattenOptions[activeIndex];
if (item && !item.data.disabled) {
onSelectValue(item.value);
} else {
onSelectValue(void 0);
}
if (open) {
event.preventDefault();
}
break;
}
case KeyCode.ESC: {
toggleOpen(false);
if (open) {
event.stopPropagation();
}
}
}
},
onKeyUp: function onKeyUp() {
},
scrollTo: function scrollTo2(index2) {
scrollIntoView2(index2);
}
};
});
if (memoFlattenOptions.length === 0) {
return /* @__PURE__ */ jsx("div", {
role: "listbox",
id: "".concat(id2, "_list"),
className: "".concat(itemPrefixCls, "-empty"),
onMouseDown: onListMouseDown,
children: notFoundContent
});
}
var omitFieldNameList = Object.keys(fieldNames).map(function(key2) {
return fieldNames[key2];
});
var getLabel2 = function getLabel3(item) {
return item.label;
};
var renderItem2 = function renderItem3(index2) {
var item = memoFlattenOptions[index2];
if (!item)
return null;
var itemData = item.data || {};
var value = itemData.value;
var group = item.group;
var attrs = pickAttrs(itemData, true);
var mergedLabel = getLabel2(item);
return item ? /* @__PURE__ */ React$a.createElement("div", {
"aria-label": typeof mergedLabel === "string" && !group ? mergedLabel : null,
...attrs,
key: index2,
role: group ? "presentation" : "option",
id: "".concat(id2, "_list_").concat(index2),
"aria-selected": isSelected(value)
}, value) : null;
};
return /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsxs("div", {
role: "listbox",
id: "".concat(id2, "_list"),
style: {
height: 0,
width: 0,
overflow: "hidden"
},
children: [renderItem2(activeIndex - 1), renderItem2(activeIndex), renderItem2(activeIndex + 1)]
}), /* @__PURE__ */ jsx(List$1, {
itemKey: "key",
ref: listRef,
data: memoFlattenOptions,
height: listHeight,
itemHeight: listItemHeight,
fullHeight: false,
onMouseDown: onListMouseDown,
onScroll: onPopupScroll,
virtual,
children: function(item, itemIndex) {
var _classNames;
var group = item.group, groupOption = item.groupOption, data = item.data, label = item.label, value = item.value;
var key2 = data.key;
if (group) {
var _data$title;
var groupTitle = (_data$title = data.title) !== null && _data$title !== void 0 ? _data$title : isTitleType(label) ? label.toString() : void 0;
return /* @__PURE__ */ jsx("div", {
className: classnames(itemPrefixCls, "".concat(itemPrefixCls, "-group")),
title: groupTitle,
children: label !== void 0 ? label : key2
});
}
var disabled = data.disabled, title = data.title;
data.children;
var style2 = data.style, className = data.className, otherProps = _objectWithoutProperties$1(data, _excluded$B);
var passedProps = omit(otherProps, omitFieldNameList);
var selected = isSelected(value);
var optionPrefixCls = "".concat(itemPrefixCls, "-option");
var optionClassName = classnames(itemPrefixCls, optionPrefixCls, className, (_classNames = {}, _defineProperty$b(_classNames, "".concat(optionPrefixCls, "-grouped"), groupOption), _defineProperty$b(_classNames, "".concat(optionPrefixCls, "-active"), activeIndex === itemIndex && !disabled), _defineProperty$b(_classNames, "".concat(optionPrefixCls, "-disabled"), disabled), _defineProperty$b(_classNames, "".concat(optionPrefixCls, "-selected"), selected), _classNames));
var mergedLabel = getLabel2(item);
var iconVisible = !menuItemSelectedIcon || typeof menuItemSelectedIcon === "function" || selected;
var content = typeof mergedLabel === "number" ? mergedLabel : mergedLabel || value;
var optionTitle = isTitleType(content) ? content.toString() : void 0;
if (title !== void 0) {
optionTitle = title;
}
return /* @__PURE__ */ jsxs("div", {
...pickAttrs(passedProps),
"aria-selected": selected,
className: optionClassName,
title: optionTitle,
onMouseMove: function onMouseMove() {
if (activeIndex === itemIndex || disabled) {
return;
}
setActive(itemIndex);
},
onClick: function onClick() {
if (!disabled) {
onSelectValue(value);
}
},
style: style2,
children: [/* @__PURE__ */ jsx("div", {
className: "".concat(optionPrefixCls, "-content"),
children: content
}), /* @__PURE__ */ React__namespace.isValidElement(menuItemSelectedIcon) || selected, iconVisible && /* @__PURE__ */ jsx(TransBtn, {
className: "".concat(itemPrefixCls, "-option-state"),
customizeIcon: menuItemSelectedIcon,
customizeIconProps: {
isSelected: selected
},
children: selected ? "\u2713" : null
})]
});
}
})]
});
};
var RefOptionList$1 = /* @__PURE__ */ React__namespace.forwardRef(OptionList$1);
RefOptionList$1.displayName = "OptionList";
var _excluded$A = ["id", "mode", "prefixCls", "backfill", "fieldNames", "inputValue", "searchValue", "onSearch", "autoClearSearchValue", "onSelect", "onDeselect", "dropdownMatchSelectWidth", "filterOption", "filterSort", "optionFilterProp", "optionLabelProp", "options", "children", "defaultActiveFirstOption", "menuItemSelectedIcon", "virtual", "listHeight", "listItemHeight", "value", "defaultValue", "labelInValue", "onChange"];
var OMIT_DOM_PROPS = ["inputValue"];
function isRawValue$1(value) {
return !value || _typeof$q(value) !== "object";
}
var Select$1 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var id2 = props.id, mode = props.mode, _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-select" : _props$prefixCls, backfill = props.backfill, fieldNames = props.fieldNames, inputValue = props.inputValue, searchValue = props.searchValue, onSearch = props.onSearch, _props$autoClearSearc = props.autoClearSearchValue, autoClearSearchValue = _props$autoClearSearc === void 0 ? true : _props$autoClearSearc, onSelect = props.onSelect, onDeselect = props.onDeselect, _props$dropdownMatchS = props.dropdownMatchSelectWidth, dropdownMatchSelectWidth = _props$dropdownMatchS === void 0 ? true : _props$dropdownMatchS, filterOption = props.filterOption, filterSort = props.filterSort, optionFilterProp = props.optionFilterProp, optionLabelProp = props.optionLabelProp, options = props.options, children = props.children, defaultActiveFirstOption = props.defaultActiveFirstOption, menuItemSelectedIcon = props.menuItemSelectedIcon, virtual = props.virtual, _props$listHeight = props.listHeight, listHeight = _props$listHeight === void 0 ? 200 : _props$listHeight, _props$listItemHeight = props.listItemHeight, listItemHeight = _props$listItemHeight === void 0 ? 20 : _props$listItemHeight, value = props.value, defaultValue = props.defaultValue, labelInValue = props.labelInValue, onChange = props.onChange, restProps = _objectWithoutProperties$1(props, _excluded$A);
var mergedId = useId$2(id2);
var multiple = isMultiple(mode);
var childrenAsData = !!(!options && children);
var mergedFilterOption = React__namespace.useMemo(function() {
if (filterOption === void 0 && mode === "combobox") {
return false;
}
return filterOption;
}, [filterOption, mode]);
var mergedFieldNames = React__namespace.useMemo(
function() {
return fillFieldNames$2(fieldNames, childrenAsData);
},
[
JSON.stringify(fieldNames),
childrenAsData
]
);
var _useMergedState = useMergedState("", {
value: searchValue !== void 0 ? searchValue : inputValue,
postState: function postState(search) {
return search || "";
}
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), mergedSearchValue = _useMergedState2[0], setSearchValue = _useMergedState2[1];
var parsedOptions = useOptions(options, children, mergedFieldNames, optionFilterProp, optionLabelProp);
var valueOptions = parsedOptions.valueOptions, labelOptions = parsedOptions.labelOptions, mergedOptions = parsedOptions.options;
var convert2LabelValues = React__namespace.useCallback(function(draftValues) {
var valueList = toArray$7(draftValues);
return valueList.map(function(val) {
var rawValue;
var rawLabel;
var rawKey;
var rawDisabled;
var rawTitle;
if (isRawValue$1(val)) {
rawValue = val;
} else {
var _val$value;
rawKey = val.key;
rawLabel = val.label;
rawValue = (_val$value = val.value) !== null && _val$value !== void 0 ? _val$value : rawKey;
}
var option = valueOptions.get(rawValue);
if (option) {
var _option$key;
if (rawLabel === void 0)
rawLabel = option === null || option === void 0 ? void 0 : option[optionLabelProp || mergedFieldNames.label];
if (rawKey === void 0)
rawKey = (_option$key = option === null || option === void 0 ? void 0 : option.key) !== null && _option$key !== void 0 ? _option$key : rawValue;
rawDisabled = option === null || option === void 0 ? void 0 : option.disabled;
rawTitle = option === null || option === void 0 ? void 0 : option.title;
}
return {
label: rawLabel,
value: rawValue,
key: rawKey,
disabled: rawDisabled,
title: rawTitle
};
});
}, [mergedFieldNames, optionLabelProp, valueOptions]);
var _useMergedState3 = useMergedState(defaultValue, {
value
}), _useMergedState4 = _slicedToArray$e(_useMergedState3, 2), internalValue = _useMergedState4[0], setInternalValue = _useMergedState4[1];
var rawLabeledValues = React__namespace.useMemo(function() {
var _values$;
var values = convert2LabelValues(internalValue);
if (mode === "combobox" && !((_values$ = values[0]) !== null && _values$ !== void 0 && _values$.value)) {
return [];
}
return values;
}, [internalValue, convert2LabelValues, mode]);
var _useCache = useCache$1(rawLabeledValues, valueOptions), _useCache2 = _slicedToArray$e(_useCache, 2), mergedValues = _useCache2[0], getMixedOption = _useCache2[1];
var displayValues = React__namespace.useMemo(function() {
if (!mode && mergedValues.length === 1) {
var firstValue = mergedValues[0];
if (firstValue.value === null && (firstValue.label === null || firstValue.label === void 0)) {
return [];
}
}
return mergedValues.map(function(item) {
var _item$label;
return _objectSpread2$a(_objectSpread2$a({}, item), {}, {
label: (_item$label = item.label) !== null && _item$label !== void 0 ? _item$label : item.value
});
});
}, [mode, mergedValues]);
var rawValues = React__namespace.useMemo(function() {
return new Set(mergedValues.map(function(val) {
return val.value;
}));
}, [mergedValues]);
React__namespace.useEffect(function() {
if (mode === "combobox") {
var _mergedValues$;
var strValue = (_mergedValues$ = mergedValues[0]) === null || _mergedValues$ === void 0 ? void 0 : _mergedValues$.value;
setSearchValue(hasValue(strValue) ? String(strValue) : "");
}
}, [mergedValues]);
var createTagOption = useRefFunc$1(function(val, label) {
var _ref;
var mergedLabel = label !== null && label !== void 0 ? label : val;
return _ref = {}, _defineProperty$b(_ref, mergedFieldNames.value, val), _defineProperty$b(_ref, mergedFieldNames.label, mergedLabel), _ref;
});
var filledTagOptions = React__namespace.useMemo(function() {
if (mode !== "tags") {
return mergedOptions;
}
var cloneOptions = _toConsumableArray$c(mergedOptions);
var existOptions = function existOptions2(val) {
return valueOptions.has(val);
};
_toConsumableArray$c(mergedValues).sort(function(a, b2) {
return a.value < b2.value ? -1 : 1;
}).forEach(function(item) {
var val = item.value;
if (!existOptions(val)) {
cloneOptions.push(createTagOption(val, item.label));
}
});
return cloneOptions;
}, [createTagOption, mergedOptions, valueOptions, mergedValues, mode]);
var filteredOptions = useFilterOptions(filledTagOptions, mergedFieldNames, mergedSearchValue, mergedFilterOption, optionFilterProp);
var filledSearchOptions = React__namespace.useMemo(function() {
if (mode !== "tags" || !mergedSearchValue || filteredOptions.some(function(item) {
return item[optionFilterProp || "value"] === mergedSearchValue;
})) {
return filteredOptions;
}
return [createTagOption(mergedSearchValue)].concat(_toConsumableArray$c(filteredOptions));
}, [createTagOption, optionFilterProp, mode, filteredOptions, mergedSearchValue]);
var orderedFilteredOptions = React__namespace.useMemo(function() {
if (!filterSort) {
return filledSearchOptions;
}
return _toConsumableArray$c(filledSearchOptions).sort(function(a, b2) {
return filterSort(a, b2);
});
}, [filledSearchOptions, filterSort]);
var displayOptions = React__namespace.useMemo(function() {
return flattenOptions(orderedFilteredOptions, {
fieldNames: mergedFieldNames,
childrenAsData
});
}, [orderedFilteredOptions, mergedFieldNames, childrenAsData]);
var triggerChange = function triggerChange2(values) {
var labeledValues = convert2LabelValues(values);
setInternalValue(labeledValues);
if (onChange && (labeledValues.length !== mergedValues.length || labeledValues.some(function(newVal, index2) {
var _mergedValues$index;
return ((_mergedValues$index = mergedValues[index2]) === null || _mergedValues$index === void 0 ? void 0 : _mergedValues$index.value) !== (newVal === null || newVal === void 0 ? void 0 : newVal.value);
}))) {
var returnValues = labelInValue ? labeledValues : labeledValues.map(function(v2) {
return v2.value;
});
var returnOptions = labeledValues.map(function(v2) {
return injectPropsWithOption(getMixedOption(v2.value));
});
onChange(
multiple ? returnValues : returnValues[0],
multiple ? returnOptions : returnOptions[0]
);
}
};
var _React$useState = React__namespace.useState(null), _React$useState2 = _slicedToArray$e(_React$useState, 2), activeValue = _React$useState2[0], setActiveValue = _React$useState2[1];
var _React$useState3 = React__namespace.useState(0), _React$useState4 = _slicedToArray$e(_React$useState3, 2), accessibilityIndex = _React$useState4[0], setAccessibilityIndex = _React$useState4[1];
var mergedDefaultActiveFirstOption = defaultActiveFirstOption !== void 0 ? defaultActiveFirstOption : mode !== "combobox";
var onActiveValue = React__namespace.useCallback(function(active, index2) {
var _ref2 = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}, _ref2$source = _ref2.source, source = _ref2$source === void 0 ? "keyboard" : _ref2$source;
setAccessibilityIndex(index2);
if (backfill && mode === "combobox" && active !== null && source === "keyboard") {
setActiveValue(String(active));
}
}, [backfill, mode]);
var triggerSelect = function triggerSelect2(val, selected, type2) {
var getSelectEnt = function getSelectEnt2() {
var _option$key2;
var option = getMixedOption(val);
return [labelInValue ? {
label: option === null || option === void 0 ? void 0 : option[mergedFieldNames.label],
value: val,
key: (_option$key2 = option === null || option === void 0 ? void 0 : option.key) !== null && _option$key2 !== void 0 ? _option$key2 : val
} : val, injectPropsWithOption(option)];
};
if (selected && onSelect) {
var _getSelectEnt = getSelectEnt(), _getSelectEnt2 = _slicedToArray$e(_getSelectEnt, 2), wrappedValue = _getSelectEnt2[0], _option = _getSelectEnt2[1];
onSelect(wrappedValue, _option);
} else if (!selected && onDeselect && type2 !== "clear") {
var _getSelectEnt3 = getSelectEnt(), _getSelectEnt4 = _slicedToArray$e(_getSelectEnt3, 2), _wrappedValue = _getSelectEnt4[0], _option2 = _getSelectEnt4[1];
onDeselect(_wrappedValue, _option2);
}
};
var onInternalSelect = useRefFunc$1(function(val, info) {
var cloneValues;
var mergedSelect = multiple ? info.selected : true;
if (mergedSelect) {
cloneValues = multiple ? [].concat(_toConsumableArray$c(mergedValues), [val]) : [val];
} else {
cloneValues = mergedValues.filter(function(v2) {
return v2.value !== val;
});
}
triggerChange(cloneValues);
triggerSelect(val, mergedSelect);
if (mode === "combobox") {
setActiveValue("");
} else if (!isMultiple || autoClearSearchValue) {
setSearchValue("");
setActiveValue("");
}
});
var onDisplayValuesChange = function onDisplayValuesChange2(nextValues, info) {
triggerChange(nextValues);
var type2 = info.type, values = info.values;
if (type2 === "remove" || type2 === "clear") {
values.forEach(function(item) {
triggerSelect(item.value, false, type2);
});
}
};
var onInternalSearch = function onInternalSearch2(searchText, info) {
setSearchValue(searchText);
setActiveValue(null);
if (info.source === "submit") {
var formatted = (searchText || "").trim();
if (formatted) {
var newRawValues = Array.from(new Set([].concat(_toConsumableArray$c(rawValues), [formatted])));
triggerChange(newRawValues);
triggerSelect(formatted, true);
setSearchValue("");
}
return;
}
if (info.source !== "blur") {
if (mode === "combobox") {
triggerChange(searchText);
}
onSearch === null || onSearch === void 0 ? void 0 : onSearch(searchText);
}
};
var onInternalSearchSplit = function onInternalSearchSplit2(words) {
var patchValues = words;
if (mode !== "tags") {
patchValues = words.map(function(word) {
var opt = labelOptions.get(word);
return opt === null || opt === void 0 ? void 0 : opt.value;
}).filter(function(val) {
return val !== void 0;
});
}
var newRawValues = Array.from(new Set([].concat(_toConsumableArray$c(rawValues), _toConsumableArray$c(patchValues))));
triggerChange(newRawValues);
newRawValues.forEach(function(newRawValue) {
triggerSelect(newRawValue, true);
});
};
var selectContext = React__namespace.useMemo(function() {
var realVirtual = virtual !== false && dropdownMatchSelectWidth !== false;
return _objectSpread2$a(_objectSpread2$a({}, parsedOptions), {}, {
flattenOptions: displayOptions,
onActiveValue,
defaultActiveFirstOption: mergedDefaultActiveFirstOption,
onSelect: onInternalSelect,
menuItemSelectedIcon,
rawValues,
fieldNames: mergedFieldNames,
virtual: realVirtual,
listHeight,
listItemHeight,
childrenAsData
});
}, [parsedOptions, displayOptions, onActiveValue, mergedDefaultActiveFirstOption, onInternalSelect, menuItemSelectedIcon, rawValues, mergedFieldNames, virtual, dropdownMatchSelectWidth, listHeight, listItemHeight, childrenAsData]);
return /* @__PURE__ */ jsx(SelectContext.Provider, {
value: selectContext,
children: /* @__PURE__ */ jsx(BaseSelect, {
...restProps,
id: mergedId,
prefixCls,
ref,
omitDomProps: OMIT_DOM_PROPS,
mode,
displayValues,
onDisplayValuesChange,
searchValue: mergedSearchValue,
onSearch: onInternalSearch,
autoClearSearchValue,
onSearchSplit: onInternalSearchSplit,
dropdownMatchSelectWidth,
OptionList: RefOptionList$1,
emptyOptions: !displayOptions.length,
activeValue,
activeDescendantId: "".concat(mergedId, "_list_").concat(accessibilityIndex)
})
});
});
var TypedSelect = Select$1;
TypedSelect.Option = Option;
TypedSelect.OptGroup = OptGroup;
var Empty$3 = function Empty2() {
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls("empty-img-default");
return /* @__PURE__ */ jsx("svg", {
className: prefixCls,
width: "184",
height: "152",
viewBox: "0 0 184 152",
xmlns: "http://www.w3.org/2000/svg",
children: /* @__PURE__ */ jsxs("g", {
fill: "none",
fillRule: "evenodd",
children: [/* @__PURE__ */ jsxs("g", {
transform: "translate(24 31.67)",
children: [/* @__PURE__ */ jsx("ellipse", {
className: "".concat(prefixCls, "-ellipse"),
cx: "67.797",
cy: "106.89",
rx: "67.797",
ry: "12.668"
}), /* @__PURE__ */ jsx("path", {
className: "".concat(prefixCls, "-path-1"),
d: "M122.034 69.674L98.109 40.229c-1.148-1.386-2.826-2.225-4.593-2.225h-51.44c-1.766 0-3.444.839-4.592 2.225L13.56 69.674v15.383h108.475V69.674z"
}), /* @__PURE__ */ jsx("path", {
className: "".concat(prefixCls, "-path-2"),
d: "M101.537 86.214L80.63 61.102c-1.001-1.207-2.507-1.867-4.048-1.867H31.724c-1.54 0-3.047.66-4.048 1.867L6.769 86.214v13.792h94.768V86.214z",
transform: "translate(13.56)"
}), /* @__PURE__ */ jsx("path", {
className: "".concat(prefixCls, "-path-3"),
d: "M33.83 0h67.933a4 4 0 0 1 4 4v93.344a4 4 0 0 1-4 4H33.83a4 4 0 0 1-4-4V4a4 4 0 0 1 4-4z"
}), /* @__PURE__ */ jsx("path", {
className: "".concat(prefixCls, "-path-4"),
d: "M42.678 9.953h50.237a2 2 0 0 1 2 2V36.91a2 2 0 0 1-2 2H42.678a2 2 0 0 1-2-2V11.953a2 2 0 0 1 2-2zM42.94 49.767h49.713a2.262 2.262 0 1 1 0 4.524H42.94a2.262 2.262 0 0 1 0-4.524zM42.94 61.53h49.713a2.262 2.262 0 1 1 0 4.525H42.94a2.262 2.262 0 0 1 0-4.525zM121.813 105.032c-.775 3.071-3.497 5.36-6.735 5.36H20.515c-3.238 0-5.96-2.29-6.734-5.36a7.309 7.309 0 0 1-.222-1.79V69.675h26.318c2.907 0 5.25 2.448 5.25 5.42v.04c0 2.971 2.37 5.37 5.277 5.37h34.785c2.907 0 5.277-2.421 5.277-5.393V75.1c0-2.972 2.343-5.426 5.25-5.426h26.318v33.569c0 .617-.077 1.216-.221 1.789z"
})]
}), /* @__PURE__ */ jsx("path", {
className: "".concat(prefixCls, "-path-5"),
d: "M149.121 33.292l-6.83 2.65a1 1 0 0 1-1.317-1.23l1.937-6.207c-2.589-2.944-4.109-6.534-4.109-10.408C138.802 8.102 148.92 0 161.402 0 173.881 0 184 8.102 184 18.097c0 9.995-10.118 18.097-22.599 18.097-4.528 0-8.744-1.066-12.28-2.902z"
}), /* @__PURE__ */ jsxs("g", {
className: "".concat(prefixCls, "-g"),
transform: "translate(149.65 15.383)",
children: [/* @__PURE__ */ jsx("ellipse", {
cx: "20.654",
cy: "3.167",
rx: "2.849",
ry: "2.815"
}), /* @__PURE__ */ jsx("path", {
d: "M5.698 5.63H0L2.898.704zM9.259.704h4.985V5.63H9.259z"
})]
})]
})
});
};
const DefaultEmptyImg = Empty$3;
var Simple = function Simple2() {
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls("empty-img-simple");
return /* @__PURE__ */ jsx("svg", {
className: prefixCls,
width: "64",
height: "41",
viewBox: "0 0 64 41",
xmlns: "http://www.w3.org/2000/svg",
children: /* @__PURE__ */ jsxs("g", {
transform: "translate(0 1)",
fill: "none",
fillRule: "evenodd",
children: [/* @__PURE__ */ jsx("ellipse", {
className: "".concat(prefixCls, "-ellipse"),
cx: "32",
cy: "33",
rx: "32",
ry: "7"
}), /* @__PURE__ */ jsxs("g", {
className: "".concat(prefixCls, "-g"),
fillRule: "nonzero",
children: [/* @__PURE__ */ jsx("path", {
d: "M55 12.76L44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46v-9.24z"
}), /* @__PURE__ */ jsx("path", {
d: "M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35h-40.1C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z",
className: "".concat(prefixCls, "-path")
})]
})]
})
});
};
const SimpleEmptyImg = Simple;
var __rest$S = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var defaultEmptyImg = /* @__PURE__ */ jsx(DefaultEmptyImg, {});
var simpleEmptyImg = /* @__PURE__ */ jsx(SimpleEmptyImg, {});
var Empty$1 = function Empty2(_a) {
var className = _a.className, customizePrefixCls = _a.prefixCls, _a$image = _a.image, image = _a$image === void 0 ? defaultEmptyImg : _a$image, description = _a.description, children = _a.children, imageStyle = _a.imageStyle, restProps = __rest$S(_a, ["className", "prefixCls", "image", "description", "children", "imageStyle"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
return /* @__PURE__ */ jsx(LocaleReceiver$1, {
componentName: "Empty",
children: function(contextLocale) {
var _classNames;
var prefixCls = getPrefixCls("empty", customizePrefixCls);
var des = typeof description !== "undefined" ? description : contextLocale.description;
var alt = typeof des === "string" ? des : "empty";
var imageNode = null;
if (typeof image === "string") {
imageNode = /* @__PURE__ */ jsx("img", {
alt,
src: image
});
} else {
imageNode = image;
}
return /* @__PURE__ */ jsxs("div", {
className: classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-normal"), image === simpleEmptyImg), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className),
...restProps,
children: [/* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-image"),
style: imageStyle,
children: imageNode
}), des && /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-description"),
children: des
}), children && /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-footer"),
children
})]
});
}
});
};
Empty$1.PRESENTED_IMAGE_DEFAULT = defaultEmptyImg;
Empty$1.PRESENTED_IMAGE_SIMPLE = simpleEmptyImg;
const Empty$2 = Empty$1;
var defaultRenderEmpty = function defaultRenderEmpty2(componentName) {
return /* @__PURE__ */ jsx(ConfigConsumer, {
children: function(_ref) {
var getPrefixCls = _ref.getPrefixCls;
var prefix = getPrefixCls("empty");
switch (componentName) {
case "Table":
case "List":
return /* @__PURE__ */ jsx(Empty$2, {
image: Empty$2.PRESENTED_IMAGE_SIMPLE
});
case "Select":
case "TreeSelect":
case "Cascader":
case "Transfer":
case "Mentions":
return /* @__PURE__ */ jsx(Empty$2, {
image: Empty$2.PRESENTED_IMAGE_SIMPLE,
className: "".concat(prefix, "-small")
});
default:
return /* @__PURE__ */ jsx(Empty$2, {});
}
}
});
};
const defaultRenderEmpty$1 = defaultRenderEmpty;
var FormContext = /* @__PURE__ */ React__namespace.createContext({
labelAlign: "right",
vertical: false,
itemRef: function itemRef() {
}
});
var NoStyleItemContext = /* @__PURE__ */ React__namespace.createContext(null);
var FormProvider = function FormProvider2(props) {
var providerProps = omit(props, ["prefixCls"]);
return /* @__PURE__ */ jsx(FormProvider$1, {
...providerProps
});
};
var FormItemPrefixContext = /* @__PURE__ */ React__namespace.createContext({
prefixCls: ""
});
var FormItemInputContext = /* @__PURE__ */ React__namespace.createContext({});
var NoFormStyle = function NoFormStyle2(_ref) {
var children = _ref.children, status = _ref.status, override = _ref.override;
var formItemInputContext = React$a.useContext(FormItemInputContext);
var newFormItemInputContext = React$a.useMemo(function() {
var newContext = _extends$3({}, formItemInputContext);
if (override) {
delete newContext.isFormItemInput;
}
if (status) {
delete newContext.status;
delete newContext.hasFeedback;
delete newContext.feedbackIcon;
}
return newContext;
}, [status, override, formItemInputContext]);
return /* @__PURE__ */ jsx(FormItemInputContext.Provider, {
value: newFormItemInputContext,
children
});
};
var tuple$1 = function tuple2() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return args;
};
var getCollapsedHeight = function getCollapsedHeight2() {
return {
height: 0,
opacity: 0
};
};
var getRealHeight = function getRealHeight2(node) {
var scrollHeight = node.scrollHeight;
return {
height: scrollHeight,
opacity: 1
};
};
var getCurrentHeight = function getCurrentHeight2(node) {
return {
height: node ? node.offsetHeight : 0
};
};
var skipOpacityTransition = function skipOpacityTransition2(_, event) {
return (event === null || event === void 0 ? void 0 : event.deadline) === true || event.propertyName === "height";
};
var collapseMotion = {
motionName: "ant-motion-collapse",
onAppearStart: getCollapsedHeight,
onEnterStart: getCollapsedHeight,
onAppearActive: getRealHeight,
onEnterActive: getRealHeight,
onLeaveStart: getCurrentHeight,
onLeaveActive: getCollapsedHeight,
onAppearEnd: skipOpacityTransition,
onEnterEnd: skipOpacityTransition,
onLeaveEnd: skipOpacityTransition,
motionDeadline: 500
};
tuple$1("bottomLeft", "bottomRight", "topLeft", "topRight");
var getTransitionDirection = function getTransitionDirection2(placement) {
if (placement !== void 0 && (placement === "topLeft" || placement === "topRight")) {
return "slide-down";
}
return "slide-up";
};
var getTransitionName = function getTransitionName2(rootPrefixCls, motion2, transitionName2) {
if (transitionName2 !== void 0) {
return transitionName2;
}
return "".concat(rootPrefixCls, "-").concat(motion2);
};
const collapseMotion$1 = collapseMotion;
tuple$1("warning", "error", "");
function getStatusClassNames(prefixCls, status, hasFeedback) {
var _classNames;
return classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-status-success"), status === "success"), _defineProperty$b(_classNames, "".concat(prefixCls, "-status-warning"), status === "warning"), _defineProperty$b(_classNames, "".concat(prefixCls, "-status-error"), status === "error"), _defineProperty$b(_classNames, "".concat(prefixCls, "-status-validating"), status === "validating"), _defineProperty$b(_classNames, "".concat(prefixCls, "-has-feedback"), hasFeedback), _classNames));
}
var getMergedStatus = function getMergedStatus2(contextStatus, customStatus) {
return customStatus || contextStatus;
};
var CheckOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 00-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z" } }] }, "name": "check", "theme": "outlined" };
const CheckOutlinedSvg = CheckOutlined$2;
var CheckOutlined = function CheckOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: CheckOutlinedSvg
})
});
};
CheckOutlined.displayName = "CheckOutlined";
const CheckOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(CheckOutlined);
var DownOutlined$5 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z" } }] }, "name": "down", "theme": "outlined" };
const DownOutlinedSvg = DownOutlined$5;
var DownOutlined$3 = function DownOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: DownOutlinedSvg
})
});
};
DownOutlined$3.displayName = "DownOutlined";
const DownOutlined$4 = /* @__PURE__ */ React__namespace.forwardRef(DownOutlined$3);
var SearchOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M909.6 854.5L649.9 594.8C690.2 542.7 712 479 712 412c0-80.2-31.3-155.4-87.9-212.1-56.6-56.7-132-87.9-212.1-87.9s-155.5 31.3-212.1 87.9C143.2 256.5 112 331.8 112 412c0 80.1 31.3 155.5 87.9 212.1C256.5 680.8 331.8 712 412 712c67 0 130.6-21.8 182.7-62l259.7 259.6a8.2 8.2 0 0011.6 0l43.6-43.5a8.2 8.2 0 000-11.6zM570.4 570.4C528 612.7 471.8 636 412 636s-116-23.3-158.4-65.6C211.3 528 188 471.8 188 412s23.3-116.1 65.6-158.4C296 211.3 352.2 188 412 188s116.1 23.2 158.4 65.6S636 352.2 636 412s-23.3 116.1-65.6 158.4z" } }] }, "name": "search", "theme": "outlined" };
const SearchOutlinedSvg = SearchOutlined$2;
var SearchOutlined = function SearchOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: SearchOutlinedSvg
})
});
};
SearchOutlined.displayName = "SearchOutlined";
const SearchOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(SearchOutlined);
function getIcons(_ref) {
var suffixIcon = _ref.suffixIcon, clearIcon = _ref.clearIcon, menuItemSelectedIcon = _ref.menuItemSelectedIcon, removeIcon = _ref.removeIcon, loading = _ref.loading, multiple = _ref.multiple, hasFeedback = _ref.hasFeedback, prefixCls = _ref.prefixCls, showArrow = _ref.showArrow, feedbackIcon = _ref.feedbackIcon;
var mergedClearIcon = clearIcon !== null && clearIcon !== void 0 ? clearIcon : /* @__PURE__ */ jsx(CloseCircleFilled$1, {});
var getSuffixIconNode = function getSuffixIconNode2(arrowIcon) {
return /* @__PURE__ */ jsxs(Fragment, {
children: [showArrow !== false && arrowIcon, hasFeedback && feedbackIcon]
});
};
var mergedSuffixIcon = null;
if (suffixIcon !== void 0) {
mergedSuffixIcon = getSuffixIconNode(suffixIcon);
} else if (loading) {
mergedSuffixIcon = getSuffixIconNode(
/* @__PURE__ */ jsx(LoadingOutlined$1, {
spin: true
})
);
} else {
var iconCls = "".concat(prefixCls, "-suffix");
mergedSuffixIcon = function mergedSuffixIcon2(_ref2) {
var open = _ref2.open, showSearch = _ref2.showSearch;
if (open && showSearch) {
return getSuffixIconNode(
/* @__PURE__ */ jsx(SearchOutlined$1, {
className: iconCls
})
);
}
return getSuffixIconNode(
/* @__PURE__ */ jsx(DownOutlined$4, {
className: iconCls
})
);
};
}
var mergedItemIcon = null;
if (menuItemSelectedIcon !== void 0) {
mergedItemIcon = menuItemSelectedIcon;
} else if (multiple) {
mergedItemIcon = /* @__PURE__ */ jsx(CheckOutlined$1, {});
} else {
mergedItemIcon = null;
}
var mergedRemoveIcon = null;
if (removeIcon !== void 0) {
mergedRemoveIcon = removeIcon;
} else {
mergedRemoveIcon = /* @__PURE__ */ jsx(CloseOutlined$4, {});
}
return {
clearIcon: mergedClearIcon,
suffixIcon: mergedSuffixIcon,
itemIcon: mergedItemIcon,
removeIcon: mergedRemoveIcon
};
}
var __rest$R = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var SpaceCompactItemContext = /* @__PURE__ */ React__namespace.createContext(null);
var useCompactItemContext = function useCompactItemContext2(prefixCls, direction) {
var compactItemContext = React__namespace.useContext(SpaceCompactItemContext);
var compactItemClassnames = React__namespace.useMemo(function() {
var _classNames;
if (!compactItemContext)
return "";
var compactDirection = compactItemContext.compactDirection, isFirstItem = compactItemContext.isFirstItem, isLastItem = compactItemContext.isLastItem;
var separator = compactDirection === "vertical" ? "-vertical-" : "-";
return classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-compact").concat(separator, "item"), true), _defineProperty$b(_classNames, "".concat(prefixCls, "-compact").concat(separator, "first-item"), isFirstItem), _defineProperty$b(_classNames, "".concat(prefixCls, "-compact").concat(separator, "last-item"), isLastItem), _defineProperty$b(_classNames, "".concat(prefixCls, "-compact").concat(separator, "item-rtl"), direction === "rtl"), _classNames));
}, [prefixCls, direction, compactItemContext]);
return {
compactSize: compactItemContext === null || compactItemContext === void 0 ? void 0 : compactItemContext.compactSize,
compactDirection: compactItemContext === null || compactItemContext === void 0 ? void 0 : compactItemContext.compactDirection,
compactItemClassnames
};
};
var NoCompactStyle = function NoCompactStyle2(_ref) {
var children = _ref.children;
return /* @__PURE__ */ jsx(SpaceCompactItemContext.Provider, {
value: null,
children
});
};
var CompactItem = function CompactItem2(_a) {
var children = _a.children, otherProps = __rest$R(_a, ["children"]);
return /* @__PURE__ */ jsx(SpaceCompactItemContext.Provider, {
value: otherProps,
children
});
};
var Compact = function Compact2(props) {
var _classNames2;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, directionConfig = _React$useContext.direction;
var _props$size = props.size, size = _props$size === void 0 ? "middle" : _props$size, direction = props.direction, block = props.block, customizePrefixCls = props.prefixCls, className = props.className, children = props.children, restProps = __rest$R(props, ["size", "direction", "block", "prefixCls", "className", "children"]);
var prefixCls = getPrefixCls("space-compact", customizePrefixCls);
var clx = classnames(prefixCls, (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-rtl"), directionConfig === "rtl"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-block"), block), _defineProperty$b(_classNames2, "".concat(prefixCls, "-vertical"), direction === "vertical"), _classNames2), className);
var compactItemContext = React__namespace.useContext(SpaceCompactItemContext);
var childNodes = toArray$9(children);
var nodes = React__namespace.useMemo(function() {
return childNodes.map(function(child, i2) {
var key2 = child && child.key || "".concat(prefixCls, "-item-").concat(i2);
return /* @__PURE__ */ jsx(CompactItem, {
compactSize: size,
compactDirection: direction,
isFirstItem: i2 === 0 && (!compactItemContext || (compactItemContext === null || compactItemContext === void 0 ? void 0 : compactItemContext.isFirstItem)),
isLastItem: i2 === childNodes.length - 1 && (!compactItemContext || (compactItemContext === null || compactItemContext === void 0 ? void 0 : compactItemContext.isLastItem)),
children: child
}, key2);
});
}, [size, childNodes, compactItemContext]);
if (childNodes.length === 0) {
return null;
}
return /* @__PURE__ */ jsx("div", {
className: clx,
...restProps,
children: nodes
});
};
var __rest$Q = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var SECRET_COMBOBOX_MODE_DO_NOT_USE = "SECRET_COMBOBOX_MODE_DO_NOT_USE";
var InternalSelect = function InternalSelect2(_a, ref) {
var _classNames2;
var customizePrefixCls = _a.prefixCls, _a$bordered = _a.bordered, bordered = _a$bordered === void 0 ? true : _a$bordered, className = _a.className, getPopupContainer = _a.getPopupContainer, dropdownClassName = _a.dropdownClassName, popupClassName = _a.popupClassName, _a$listHeight = _a.listHeight, listHeight = _a$listHeight === void 0 ? 256 : _a$listHeight, placement = _a.placement, _a$listItemHeight = _a.listItemHeight, listItemHeight = _a$listItemHeight === void 0 ? 24 : _a$listItemHeight, customizeSize = _a.size, customDisabled = _a.disabled, notFoundContent = _a.notFoundContent, customStatus = _a.status, showArrow = _a.showArrow, props = __rest$Q(_a, ["prefixCls", "bordered", "className", "getPopupContainer", "dropdownClassName", "popupClassName", "listHeight", "placement", "listItemHeight", "size", "disabled", "notFoundContent", "status", "showArrow"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getContextPopupContainer = _React$useContext.getPopupContainer, getPrefixCls = _React$useContext.getPrefixCls, renderEmpty = _React$useContext.renderEmpty, direction = _React$useContext.direction, virtual = _React$useContext.virtual, dropdownMatchSelectWidth = _React$useContext.dropdownMatchSelectWidth;
var size = React__namespace.useContext(SizeContext$1);
var prefixCls = getPrefixCls("select", customizePrefixCls);
var rootPrefixCls = getPrefixCls();
var _useCompactItemContex = useCompactItemContext(prefixCls, direction), compactSize = _useCompactItemContex.compactSize, compactItemClassnames = _useCompactItemContex.compactItemClassnames;
var mode = React__namespace.useMemo(function() {
var m2 = props.mode;
if (m2 === "combobox") {
return void 0;
}
if (m2 === SECRET_COMBOBOX_MODE_DO_NOT_USE) {
return "combobox";
}
return m2;
}, [props.mode]);
var isMultiple2 = mode === "multiple" || mode === "tags";
var mergedShowArrow = showArrow !== void 0 ? showArrow : props.loading || !(isMultiple2 || mode === "combobox");
var _useContext = React$a.useContext(FormItemInputContext), contextStatus = _useContext.status, hasFeedback = _useContext.hasFeedback, isFormItemInput = _useContext.isFormItemInput, feedbackIcon = _useContext.feedbackIcon;
var mergedStatus = getMergedStatus(contextStatus, customStatus);
var mergedNotFound;
if (notFoundContent !== void 0) {
mergedNotFound = notFoundContent;
} else if (mode === "combobox") {
mergedNotFound = null;
} else {
mergedNotFound = (renderEmpty || defaultRenderEmpty$1)("Select");
}
var _getIcons = getIcons(_extends$3(_extends$3({}, props), {
multiple: isMultiple2,
hasFeedback,
feedbackIcon,
showArrow: mergedShowArrow,
prefixCls
})), suffixIcon = _getIcons.suffixIcon, itemIcon = _getIcons.itemIcon, removeIcon = _getIcons.removeIcon, clearIcon = _getIcons.clearIcon;
var selectProps = omit(props, ["suffixIcon", "itemIcon"]);
var rcSelectRtlDropdownClassName = classnames(popupClassName || dropdownClassName, _defineProperty$b({}, "".concat(prefixCls, "-dropdown-").concat(direction), direction === "rtl"));
var mergedSize = compactSize || customizeSize || size;
var disabled = React__namespace.useContext(DisabledContext$1);
var mergedDisabled = customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled;
var mergedClassName = classnames((_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-lg"), mergedSize === "large"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-sm"), mergedSize === "small"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-borderless"), !bordered), _defineProperty$b(_classNames2, "".concat(prefixCls, "-in-form-item"), isFormItemInput), _classNames2), getStatusClassNames(prefixCls, mergedStatus, hasFeedback), compactItemClassnames, className);
var getPlacement = function getPlacement2() {
if (placement !== void 0) {
return placement;
}
return direction === "rtl" ? "bottomRight" : "bottomLeft";
};
return /* @__PURE__ */ jsx(TypedSelect, {
ref,
virtual,
dropdownMatchSelectWidth,
...selectProps,
transitionName: getTransitionName(rootPrefixCls, getTransitionDirection(placement), props.transitionName),
listHeight,
listItemHeight,
mode,
prefixCls,
placement: getPlacement(),
direction,
inputIcon: suffixIcon,
menuItemSelectedIcon: itemIcon,
removeIcon,
clearIcon,
notFoundContent: mergedNotFound,
className: mergedClassName,
getPopupContainer: getPopupContainer || getContextPopupContainer,
dropdownClassName: rcSelectRtlDropdownClassName,
showArrow: hasFeedback || showArrow,
disabled: mergedDisabled
});
};
var Select = /* @__PURE__ */ React__namespace.forwardRef(InternalSelect);
Select.SECRET_COMBOBOX_MODE_DO_NOT_USE = SECRET_COMBOBOX_MODE_DO_NOT_USE;
Select.Option = Option;
Select.OptGroup = OptGroup;
const _Select = Select;
function useForceUpdate() {
var _React$useReducer = React__namespace.useReducer(function(x2) {
return x2 + 1;
}, 0), _React$useReducer2 = _slicedToArray$e(_React$useReducer, 2), forceUpdate = _React$useReducer2[1];
return forceUpdate;
}
var responsiveArray = ["xxl", "xl", "lg", "md", "sm", "xs"];
var responsiveMap = {
xs: "(max-width: 575px)",
sm: "(min-width: 576px)",
md: "(min-width: 768px)",
lg: "(min-width: 992px)",
xl: "(min-width: 1200px)",
xxl: "(min-width: 1600px)"
};
var subscribers = /* @__PURE__ */ new Map();
var subUid = -1;
var screens = {};
var responsiveObserve = {
matchHandlers: {},
dispatch: function dispatch(pointMap) {
screens = pointMap;
subscribers.forEach(function(func) {
return func(screens);
});
return subscribers.size >= 1;
},
subscribe: function subscribe(func) {
if (!subscribers.size)
this.register();
subUid += 1;
subscribers.set(subUid, func);
func(screens);
return subUid;
},
unsubscribe: function unsubscribe(token) {
subscribers["delete"](token);
if (!subscribers.size)
this.unregister();
},
unregister: function unregister() {
var _this2 = this;
Object.keys(responsiveMap).forEach(function(screen) {
var matchMediaQuery = responsiveMap[screen];
var handler = _this2.matchHandlers[matchMediaQuery];
handler === null || handler === void 0 ? void 0 : handler.mql.removeListener(handler === null || handler === void 0 ? void 0 : handler.listener);
});
subscribers.clear();
},
register: function register() {
var _this2 = this;
Object.keys(responsiveMap).forEach(function(screen) {
var matchMediaQuery = responsiveMap[screen];
var listener = function listener2(_ref) {
var matches = _ref.matches;
_this2.dispatch(_extends$3(_extends$3({}, screens), _defineProperty$b({}, screen, matches)));
};
var mql = window.matchMedia(matchMediaQuery);
mql.addListener(listener);
_this2.matchHandlers[matchMediaQuery] = {
mql,
listener
};
listener(mql);
});
}
};
const ResponsiveObserve = responsiveObserve;
function useBreakpoint() {
var refreshOnChange = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
var screensRef = React$a.useRef({});
var forceUpdate = useForceUpdate();
React$a.useEffect(function() {
var token = ResponsiveObserve.subscribe(function(supportScreens) {
screensRef.current = supportScreens;
if (refreshOnChange) {
forceUpdate();
}
});
return function() {
return ResponsiveObserve.unsubscribe(token);
};
}, []);
return screensRef.current;
}
var autoAdjustOverflow$2 = {
adjustX: 1,
adjustY: 1
};
var targetOffset$2 = [0, 0];
var placements$3 = {
left: {
points: ["cr", "cl"],
overflow: autoAdjustOverflow$2,
offset: [-4, 0],
targetOffset: targetOffset$2
},
right: {
points: ["cl", "cr"],
overflow: autoAdjustOverflow$2,
offset: [4, 0],
targetOffset: targetOffset$2
},
top: {
points: ["bc", "tc"],
overflow: autoAdjustOverflow$2,
offset: [0, -4],
targetOffset: targetOffset$2
},
bottom: {
points: ["tc", "bc"],
overflow: autoAdjustOverflow$2,
offset: [0, 4],
targetOffset: targetOffset$2
},
topLeft: {
points: ["bl", "tl"],
overflow: autoAdjustOverflow$2,
offset: [0, -4],
targetOffset: targetOffset$2
},
leftTop: {
points: ["tr", "tl"],
overflow: autoAdjustOverflow$2,
offset: [-4, 0],
targetOffset: targetOffset$2
},
topRight: {
points: ["br", "tr"],
overflow: autoAdjustOverflow$2,
offset: [0, -4],
targetOffset: targetOffset$2
},
rightTop: {
points: ["tl", "tr"],
overflow: autoAdjustOverflow$2,
offset: [4, 0],
targetOffset: targetOffset$2
},
bottomRight: {
points: ["tr", "br"],
overflow: autoAdjustOverflow$2,
offset: [0, 4],
targetOffset: targetOffset$2
},
rightBottom: {
points: ["bl", "br"],
overflow: autoAdjustOverflow$2,
offset: [4, 0],
targetOffset: targetOffset$2
},
bottomLeft: {
points: ["tl", "bl"],
overflow: autoAdjustOverflow$2,
offset: [0, 4],
targetOffset: targetOffset$2
},
leftBottom: {
points: ["br", "bl"],
overflow: autoAdjustOverflow$2,
offset: [-4, 0],
targetOffset: targetOffset$2
}
};
function Popup$1(props) {
var showArrow = props.showArrow, arrowContent = props.arrowContent, children = props.children, prefixCls = props.prefixCls, id2 = props.id, overlayInnerStyle = props.overlayInnerStyle, className = props.className, style2 = props.style;
return /* @__PURE__ */ jsxs("div", {
className: classnames("".concat(prefixCls, "-content"), className),
style: style2,
children: [showArrow !== false && /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-arrow"),
children: arrowContent
}, "arrow"), /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-inner"),
id: id2,
role: "tooltip",
style: overlayInnerStyle,
children: typeof children === "function" ? children() : children
})]
});
}
var Tooltip$1 = function Tooltip2(props, ref) {
var overlayClassName = props.overlayClassName, _props$trigger = props.trigger, trigger = _props$trigger === void 0 ? ["hover"] : _props$trigger, _props$mouseEnterDela = props.mouseEnterDelay, mouseEnterDelay = _props$mouseEnterDela === void 0 ? 0 : _props$mouseEnterDela, _props$mouseLeaveDela = props.mouseLeaveDelay, mouseLeaveDelay = _props$mouseLeaveDela === void 0 ? 0.1 : _props$mouseLeaveDela, overlayStyle = props.overlayStyle, _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-tooltip" : _props$prefixCls, children = props.children, onVisibleChange = props.onVisibleChange, afterVisibleChange = props.afterVisibleChange, transitionName2 = props.transitionName, animation = props.animation, motion2 = props.motion, _props$placement = props.placement, placement = _props$placement === void 0 ? "right" : _props$placement, _props$align = props.align, align = _props$align === void 0 ? {} : _props$align, _props$destroyTooltip = props.destroyTooltipOnHide, destroyTooltipOnHide = _props$destroyTooltip === void 0 ? false : _props$destroyTooltip, defaultVisible = props.defaultVisible, getTooltipContainer = props.getTooltipContainer, overlayInnerStyle = props.overlayInnerStyle, arrowContent = props.arrowContent, overlay = props.overlay, id2 = props.id, showArrow = props.showArrow, restProps = _objectWithoutProperties$1(props, ["overlayClassName", "trigger", "mouseEnterDelay", "mouseLeaveDelay", "overlayStyle", "prefixCls", "children", "onVisibleChange", "afterVisibleChange", "transitionName", "animation", "motion", "placement", "align", "destroyTooltipOnHide", "defaultVisible", "getTooltipContainer", "overlayInnerStyle", "arrowContent", "overlay", "id", "showArrow"]);
var domRef = React$a.useRef(null);
React$a.useImperativeHandle(ref, function() {
return domRef.current;
});
var extraProps = _objectSpread2$a({}, restProps);
if ("visible" in props) {
extraProps.popupVisible = props.visible;
}
var getPopupElement = function getPopupElement2() {
return /* @__PURE__ */ jsx(Popup$1, {
showArrow,
arrowContent,
prefixCls,
id: id2,
overlayInnerStyle,
children: overlay
}, "content");
};
var destroyTooltip = false;
var autoDestroy = false;
if (typeof destroyTooltipOnHide === "boolean") {
destroyTooltip = destroyTooltipOnHide;
} else if (destroyTooltipOnHide && _typeof$q(destroyTooltipOnHide) === "object") {
var keepParent = destroyTooltipOnHide.keepParent;
destroyTooltip = keepParent === true;
autoDestroy = keepParent === false;
}
return /* @__PURE__ */ jsx(Trigger$1, {
popupClassName: overlayClassName,
prefixCls,
popup: getPopupElement,
action: trigger,
builtinPlacements: placements$3,
popupPlacement: placement,
ref: domRef,
popupAlign: align,
getPopupContainer: getTooltipContainer,
onPopupVisibleChange: onVisibleChange,
afterPopupVisibleChange: afterVisibleChange,
popupTransitionName: transitionName2,
popupAnimation: animation,
popupMotion: motion2,
defaultPopupVisible: defaultVisible,
destroyPopupOnHide: destroyTooltip,
autoDestroy,
mouseLeaveDelay,
popupStyle: overlayStyle,
mouseEnterDelay,
...extraProps,
children
});
};
const Tooltip$2 = /* @__PURE__ */ React$a.forwardRef(Tooltip$1);
var PresetStatusColorTypes = tuple$1("success", "processing", "error", "default", "warning");
var PresetColorTypes = tuple$1("pink", "red", "yellow", "orange", "cyan", "green", "blue", "purple", "geekblue", "magenta", "volcano", "gold", "lime");
var autoAdjustOverflowEnabled = {
adjustX: 1,
adjustY: 1
};
var autoAdjustOverflowDisabled = {
adjustX: 0,
adjustY: 0
};
var targetOffset$1 = [0, 0];
function getOverflowOptions(autoAdjustOverflow2) {
if (typeof autoAdjustOverflow2 === "boolean") {
return autoAdjustOverflow2 ? autoAdjustOverflowEnabled : autoAdjustOverflowDisabled;
}
return _extends$3(_extends$3({}, autoAdjustOverflowDisabled), autoAdjustOverflow2);
}
function getPlacements(config) {
var _config$arrowWidth = config.arrowWidth, arrowWidth = _config$arrowWidth === void 0 ? 4 : _config$arrowWidth, _config$horizontalArr = config.horizontalArrowShift, horizontalArrowShift = _config$horizontalArr === void 0 ? 16 : _config$horizontalArr, _config$verticalArrow = config.verticalArrowShift, verticalArrowShift = _config$verticalArrow === void 0 ? 8 : _config$verticalArrow, autoAdjustOverflow2 = config.autoAdjustOverflow, arrowPointAtCenter = config.arrowPointAtCenter;
var placementMap = {
left: {
points: ["cr", "cl"],
offset: [-4, 0]
},
right: {
points: ["cl", "cr"],
offset: [4, 0]
},
top: {
points: ["bc", "tc"],
offset: [0, -4]
},
bottom: {
points: ["tc", "bc"],
offset: [0, 4]
},
topLeft: {
points: ["bl", "tc"],
offset: [-(horizontalArrowShift + arrowWidth), -4]
},
leftTop: {
points: ["tr", "cl"],
offset: [-4, -(verticalArrowShift + arrowWidth)]
},
topRight: {
points: ["br", "tc"],
offset: [horizontalArrowShift + arrowWidth, -4]
},
rightTop: {
points: ["tl", "cr"],
offset: [4, -(verticalArrowShift + arrowWidth)]
},
bottomRight: {
points: ["tr", "bc"],
offset: [horizontalArrowShift + arrowWidth, 4]
},
rightBottom: {
points: ["bl", "cr"],
offset: [4, verticalArrowShift + arrowWidth]
},
bottomLeft: {
points: ["tl", "bc"],
offset: [-(horizontalArrowShift + arrowWidth), 4]
},
leftBottom: {
points: ["br", "cl"],
offset: [-4, verticalArrowShift + arrowWidth]
}
};
Object.keys(placementMap).forEach(function(key2) {
placementMap[key2] = arrowPointAtCenter ? _extends$3(_extends$3({}, placementMap[key2]), {
overflow: getOverflowOptions(autoAdjustOverflow2),
targetOffset: targetOffset$1
}) : _extends$3(_extends$3({}, placements$3[key2]), {
overflow: getOverflowOptions(autoAdjustOverflow2)
});
placementMap[key2].ignoreShake = true;
});
return placementMap;
}
var __rest$P = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var splitObject = function splitObject2(obj, keys2) {
var picked = {};
var omitted = _extends$3({}, obj);
keys2.forEach(function(key2) {
if (obj && key2 in obj) {
picked[key2] = obj[key2];
delete omitted[key2];
}
});
return {
picked,
omitted
};
};
var PresetColorRegex$1 = new RegExp("^(".concat(PresetColorTypes.join("|"), ")(-inverse)?$"));
function getDisabledCompatibleChildren(element, prefixCls) {
var elementType = element.type;
if ((elementType.__ANT_BUTTON === true || element.type === "button") && element.props.disabled || elementType.__ANT_SWITCH === true && (element.props.disabled || element.props.loading) || elementType.__ANT_RADIO === true && element.props.disabled) {
var _splitObject = splitObject(element.props.style, ["position", "left", "right", "top", "bottom", "float", "display", "zIndex"]), picked = _splitObject.picked, omitted = _splitObject.omitted;
var spanStyle = _extends$3(_extends$3({
display: "inline-block"
}, picked), {
cursor: "not-allowed",
width: element.props.block ? "100%" : void 0
});
var buttonStyle = _extends$3(_extends$3({}, omitted), {
pointerEvents: "none"
});
var child = cloneElement(element, {
style: buttonStyle,
className: null
});
return /* @__PURE__ */ jsx("span", {
style: spanStyle,
className: classnames(element.props.className, "".concat(prefixCls, "-disabled-compatible-wrapper")),
children: child
});
}
return element;
}
var Tooltip = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames2;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getContextPopupContainer = _React$useContext.getPopupContainer, getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var _useMergedState = useMergedState(false, {
value: props.open !== void 0 ? props.open : props.visible,
defaultValue: props.defaultOpen !== void 0 ? props.defaultOpen : props.defaultVisible
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), open = _useMergedState2[0], setOpen = _useMergedState2[1];
var isNoTitle = function isNoTitle2() {
var title = props.title, overlay = props.overlay;
return !title && !overlay && title !== 0;
};
var onOpenChange = function onOpenChange2(vis) {
var _a, _b;
setOpen(isNoTitle() ? false : vis);
if (!isNoTitle()) {
(_a = props.onOpenChange) === null || _a === void 0 ? void 0 : _a.call(props, vis);
(_b = props.onVisibleChange) === null || _b === void 0 ? void 0 : _b.call(props, vis);
}
};
var getTooltipPlacements = function getTooltipPlacements2() {
var builtinPlacements = props.builtinPlacements, _props$arrowPointAtCe = props.arrowPointAtCenter, arrowPointAtCenter = _props$arrowPointAtCe === void 0 ? false : _props$arrowPointAtCe, _props$autoAdjustOver = props.autoAdjustOverflow, autoAdjustOverflow2 = _props$autoAdjustOver === void 0 ? true : _props$autoAdjustOver;
return builtinPlacements || getPlacements({
arrowPointAtCenter,
autoAdjustOverflow: autoAdjustOverflow2
});
};
var onPopupAlign = function onPopupAlign2(domNode, align) {
var placements2 = getTooltipPlacements();
var placement2 = Object.keys(placements2).find(function(key2) {
var _a, _b;
return placements2[key2].points[0] === ((_a = align.points) === null || _a === void 0 ? void 0 : _a[0]) && placements2[key2].points[1] === ((_b = align.points) === null || _b === void 0 ? void 0 : _b[1]);
});
if (!placement2) {
return;
}
var rect = domNode.getBoundingClientRect();
var transformOrigin = {
top: "50%",
left: "50%"
};
if (/top|Bottom/.test(placement2)) {
transformOrigin.top = "".concat(rect.height - align.offset[1], "px");
} else if (/Top|bottom/.test(placement2)) {
transformOrigin.top = "".concat(-align.offset[1], "px");
}
if (/left|Right/.test(placement2)) {
transformOrigin.left = "".concat(rect.width - align.offset[0], "px");
} else if (/right|Left/.test(placement2)) {
transformOrigin.left = "".concat(-align.offset[0], "px");
}
domNode.style.transformOrigin = "".concat(transformOrigin.left, " ").concat(transformOrigin.top);
};
var getOverlay = function getOverlay2() {
var title = props.title, overlay = props.overlay;
if (title === 0) {
return title;
}
return overlay || title || "";
};
var getPopupContainer = props.getPopupContainer, _props$placement = props.placement, placement = _props$placement === void 0 ? "top" : _props$placement, _props$mouseEnterDela = props.mouseEnterDelay, mouseEnterDelay = _props$mouseEnterDela === void 0 ? 0.1 : _props$mouseEnterDela, _props$mouseLeaveDela = props.mouseLeaveDelay, mouseLeaveDelay = _props$mouseLeaveDela === void 0 ? 0.1 : _props$mouseLeaveDela, otherProps = __rest$P(props, ["getPopupContainer", "placement", "mouseEnterDelay", "mouseLeaveDelay"]);
var customizePrefixCls = props.prefixCls, openClassName = props.openClassName, getTooltipContainer = props.getTooltipContainer, overlayClassName = props.overlayClassName, color2 = props.color, overlayInnerStyle = props.overlayInnerStyle, children = props.children;
var prefixCls = getPrefixCls("tooltip", customizePrefixCls);
var rootPrefixCls = getPrefixCls();
var tempOpen = open;
if (!("open" in props) && !("visible" in props) && isNoTitle()) {
tempOpen = false;
}
var child = getDisabledCompatibleChildren(isValidElement(children) && !isFragment(children) ? children : /* @__PURE__ */ jsx("span", {
children
}), prefixCls);
var childProps = child.props;
var childCls = !childProps.className || typeof childProps.className === "string" ? classnames(childProps.className, _defineProperty$b({}, openClassName || "".concat(prefixCls, "-open"), true)) : childProps.className;
var customOverlayClassName = classnames(overlayClassName, (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-").concat(color2), color2 && PresetColorRegex$1.test(color2)), _classNames2));
var formattedOverlayInnerStyle = overlayInnerStyle;
var arrowContentStyle = {};
if (color2 && !PresetColorRegex$1.test(color2)) {
formattedOverlayInnerStyle = _extends$3(_extends$3({}, overlayInnerStyle), {
background: color2
});
arrowContentStyle = {
"--antd-arrow-background-color": color2
};
}
return /* @__PURE__ */ jsx(Tooltip$2, {
...otherProps,
placement,
mouseEnterDelay,
mouseLeaveDelay,
prefixCls,
overlayClassName: customOverlayClassName,
getTooltipContainer: getPopupContainer || getTooltipContainer || getContextPopupContainer,
ref,
builtinPlacements: getTooltipPlacements(),
overlay: getOverlay(),
visible: tempOpen,
onVisibleChange: onOpenChange,
onPopupAlign,
overlayInnerStyle: formattedOverlayInnerStyle,
arrowContent: /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-arrow-content"),
style: arrowContentStyle
}),
motion: {
motionName: getTransitionName(rootPrefixCls, "zoom-big-fast", props.transitionName),
motionDeadline: 1e3
},
children: tempOpen ? cloneElement(child, {
className: childCls
}) : child
});
});
const _Tooltip = Tooltip;
var getRenderPropValue = function getRenderPropValue2(propValue) {
if (!propValue) {
return null;
}
if (typeof propValue === "function") {
return propValue();
}
return propValue;
};
var __rest$O = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Overlay$1 = function Overlay2(_ref) {
var title = _ref.title, content = _ref.content, prefixCls = _ref.prefixCls;
if (!title && !content) {
return null;
}
return /* @__PURE__ */ jsxs(Fragment, {
children: [title && /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-title"),
children: getRenderPropValue(title)
}), /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-inner-content"),
children: getRenderPropValue(content)
})]
});
};
var Popover = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var customizePrefixCls = props.prefixCls, title = props.title, content = props.content, _overlay = props._overlay, _props$placement = props.placement, placement = _props$placement === void 0 ? "top" : _props$placement, _props$trigger = props.trigger, trigger = _props$trigger === void 0 ? "hover" : _props$trigger, _props$mouseEnterDela = props.mouseEnterDelay, mouseEnterDelay = _props$mouseEnterDela === void 0 ? 0.1 : _props$mouseEnterDela, _props$mouseLeaveDela = props.mouseLeaveDelay, mouseLeaveDelay = _props$mouseLeaveDela === void 0 ? 0.1 : _props$mouseLeaveDela, _props$overlayStyle = props.overlayStyle, overlayStyle = _props$overlayStyle === void 0 ? {} : _props$overlayStyle, otherProps = __rest$O(props, ["prefixCls", "title", "content", "_overlay", "placement", "trigger", "mouseEnterDelay", "mouseLeaveDelay", "overlayStyle"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls("popover", customizePrefixCls);
var rootPrefixCls = getPrefixCls();
return /* @__PURE__ */ jsx(_Tooltip, {
placement,
trigger,
mouseEnterDelay,
mouseLeaveDelay,
overlayStyle,
...otherProps,
prefixCls,
ref,
overlay: _overlay || /* @__PURE__ */ jsx(Overlay$1, {
prefixCls,
title,
content
}),
transitionName: getTransitionName(rootPrefixCls, "zoom-big", otherProps.transitionName)
});
});
const _Popover = Popover;
var EllipsisOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M176 511a56 56 0 10112 0 56 56 0 10-112 0zm280 0a56 56 0 10112 0 56 56 0 10-112 0zm280 0a56 56 0 10112 0 56 56 0 10-112 0z" } }] }, "name": "ellipsis", "theme": "outlined" };
const EllipsisOutlinedSvg = EllipsisOutlined$2;
var EllipsisOutlined = function EllipsisOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: EllipsisOutlinedSvg
})
});
};
EllipsisOutlined.displayName = "EllipsisOutlined";
const EllipsisOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(EllipsisOutlined);
var IdContext = /* @__PURE__ */ React__namespace.createContext(null);
function getMenuId(uuid2, eventKey) {
if (uuid2 === void 0) {
return null;
}
return "".concat(uuid2, "-").concat(eventKey);
}
function useMenuId(eventKey) {
var id2 = React__namespace.useContext(IdContext);
return getMenuId(id2, eventKey);
}
var _excluded$z = ["children", "locked"];
var MenuContext$2 = /* @__PURE__ */ React__namespace.createContext(null);
function mergeProps(origin, target) {
var clone = _objectSpread2$a({}, origin);
Object.keys(target).forEach(function(key2) {
var value = target[key2];
if (value !== void 0) {
clone[key2] = value;
}
});
return clone;
}
function InheritableContextProvider(_ref) {
var children = _ref.children, locked = _ref.locked, restProps = _objectWithoutProperties$1(_ref, _excluded$z);
var context2 = React__namespace.useContext(MenuContext$2);
var inheritableContext = useMemo(function() {
return mergeProps(context2, restProps);
}, [context2, restProps], function(prev, next) {
return !locked && (prev[0] !== next[0] || !isEqual$2(prev[1], next[1], true));
});
return /* @__PURE__ */ jsx(MenuContext$2.Provider, {
value: inheritableContext,
children
});
}
var EmptyList = [];
var PathRegisterContext = /* @__PURE__ */ React__namespace.createContext(null);
function useMeasure() {
return React__namespace.useContext(PathRegisterContext);
}
var PathTrackerContext = /* @__PURE__ */ React__namespace.createContext(EmptyList);
function useFullPath(eventKey) {
var parentKeyPath = React__namespace.useContext(PathTrackerContext);
return React__namespace.useMemo(function() {
return eventKey !== void 0 ? [].concat(_toConsumableArray$c(parentKeyPath), [eventKey]) : parentKeyPath;
}, [parentKeyPath, eventKey]);
}
var PathUserContext = /* @__PURE__ */ React__namespace.createContext(null);
var PrivateContext = /* @__PURE__ */ React__namespace.createContext({});
function focusable(node) {
var includePositive = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
if (isVisible(node)) {
var nodeName = node.nodeName.toLowerCase();
var isFocusableElement = ["input", "select", "textarea", "button"].includes(nodeName) || node.isContentEditable || nodeName === "a" && !!node.getAttribute("href");
var tabIndexAttr = node.getAttribute("tabindex");
var tabIndexNum = Number(tabIndexAttr);
var tabIndex = null;
if (tabIndexAttr && !Number.isNaN(tabIndexNum)) {
tabIndex = tabIndexNum;
} else if (isFocusableElement && tabIndex === null) {
tabIndex = 0;
}
if (isFocusableElement && node.disabled) {
tabIndex = null;
}
return tabIndex !== null && (tabIndex >= 0 || includePositive && tabIndex < 0);
}
return false;
}
function getFocusNodeList(node) {
var includePositive = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
var res = _toConsumableArray$c(node.querySelectorAll("*")).filter(function(child) {
return focusable(child, includePositive);
});
if (focusable(node, includePositive)) {
res.unshift(node);
}
return res;
}
var LEFT = KeyCode.LEFT, RIGHT = KeyCode.RIGHT, UP = KeyCode.UP, DOWN = KeyCode.DOWN, ENTER = KeyCode.ENTER, ESC$1 = KeyCode.ESC, HOME = KeyCode.HOME, END = KeyCode.END;
var ArrowKeys = [UP, DOWN, LEFT, RIGHT];
function getOffset$2(mode, isRootLevel, isRtl, which) {
var _inline, _horizontal, _vertical, _offsets;
var prev = "prev";
var next = "next";
var children = "children";
var parent2 = "parent";
if (mode === "inline" && which === ENTER) {
return {
inlineTrigger: true
};
}
var inline2 = (_inline = {}, _defineProperty$b(_inline, UP, prev), _defineProperty$b(_inline, DOWN, next), _inline);
var horizontal = (_horizontal = {}, _defineProperty$b(_horizontal, LEFT, isRtl ? next : prev), _defineProperty$b(_horizontal, RIGHT, isRtl ? prev : next), _defineProperty$b(_horizontal, DOWN, children), _defineProperty$b(_horizontal, ENTER, children), _horizontal);
var vertical = (_vertical = {}, _defineProperty$b(_vertical, UP, prev), _defineProperty$b(_vertical, DOWN, next), _defineProperty$b(_vertical, ENTER, children), _defineProperty$b(_vertical, ESC$1, parent2), _defineProperty$b(_vertical, LEFT, isRtl ? children : parent2), _defineProperty$b(_vertical, RIGHT, isRtl ? parent2 : children), _vertical);
var offsets = {
inline: inline2,
horizontal,
vertical,
inlineSub: inline2,
horizontalSub: vertical,
verticalSub: vertical
};
var type2 = (_offsets = offsets["".concat(mode).concat(isRootLevel ? "" : "Sub")]) === null || _offsets === void 0 ? void 0 : _offsets[which];
switch (type2) {
case prev:
return {
offset: -1,
sibling: true
};
case next:
return {
offset: 1,
sibling: true
};
case parent2:
return {
offset: -1,
sibling: false
};
case children:
return {
offset: 1,
sibling: false
};
default:
return null;
}
}
function findContainerUL(element) {
var current = element;
while (current) {
if (current.getAttribute("data-menu-list")) {
return current;
}
current = current.parentElement;
}
return null;
}
function getFocusElement(activeElement, elements) {
var current = activeElement || document.activeElement;
while (current) {
if (elements.has(current)) {
return current;
}
current = current.parentElement;
}
return null;
}
function getFocusableElements(container, elements) {
var list = getFocusNodeList(container, true);
return list.filter(function(ele) {
return elements.has(ele);
});
}
function getNextFocusElement(parentQueryContainer, elements, focusMenuElement) {
var offset2 = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : 1;
if (!parentQueryContainer) {
return null;
}
var sameLevelFocusableMenuElementList = getFocusableElements(parentQueryContainer, elements);
var count = sameLevelFocusableMenuElementList.length;
var focusIndex = sameLevelFocusableMenuElementList.findIndex(function(ele) {
return focusMenuElement === ele;
});
if (offset2 < 0) {
if (focusIndex === -1) {
focusIndex = count - 1;
} else {
focusIndex -= 1;
}
} else if (offset2 > 0) {
focusIndex += 1;
}
focusIndex = (focusIndex + count) % count;
return sameLevelFocusableMenuElementList[focusIndex];
}
function useAccessibility$1(mode, activeKey, isRtl, id2, containerRef, getKeys2, getKeyPath, triggerActiveKey, triggerAccessibilityOpen, originOnKeyDown) {
var rafRef = React__namespace.useRef();
var activeRef = React__namespace.useRef();
activeRef.current = activeKey;
var cleanRaf = function cleanRaf2() {
wrapperRaf$1.cancel(rafRef.current);
};
React__namespace.useEffect(function() {
return function() {
cleanRaf();
};
}, []);
return function(e2) {
var which = e2.which;
if ([].concat(ArrowKeys, [ENTER, ESC$1, HOME, END]).includes(which)) {
var elements;
var key2element;
var element2key;
var refreshElements = function refreshElements2() {
elements = /* @__PURE__ */ new Set();
key2element = /* @__PURE__ */ new Map();
element2key = /* @__PURE__ */ new Map();
var keys2 = getKeys2();
keys2.forEach(function(key2) {
var element = document.querySelector("[data-menu-id='".concat(getMenuId(id2, key2), "']"));
if (element) {
elements.add(element);
element2key.set(element, key2);
key2element.set(key2, element);
}
});
return elements;
};
refreshElements();
var activeElement = key2element.get(activeKey);
var focusMenuElement = getFocusElement(activeElement, elements);
var focusMenuKey = element2key.get(focusMenuElement);
var offsetObj = getOffset$2(mode, getKeyPath(focusMenuKey, true).length === 1, isRtl, which);
if (!offsetObj && which !== HOME && which !== END) {
return;
}
if (ArrowKeys.includes(which) || [HOME, END].includes(which)) {
e2.preventDefault();
}
var tryFocus = function tryFocus2(menuElement) {
if (menuElement) {
var focusTargetElement = menuElement;
var link2 = menuElement.querySelector("a");
if (link2 !== null && link2 !== void 0 && link2.getAttribute("href")) {
focusTargetElement = link2;
}
var targetKey = element2key.get(menuElement);
triggerActiveKey(targetKey);
cleanRaf();
rafRef.current = wrapperRaf$1(function() {
if (activeRef.current === targetKey) {
focusTargetElement.focus();
}
});
}
};
if ([HOME, END].includes(which) || offsetObj.sibling || !focusMenuElement) {
var parentQueryContainer;
if (!focusMenuElement || mode === "inline") {
parentQueryContainer = containerRef.current;
} else {
parentQueryContainer = findContainerUL(focusMenuElement);
}
var targetElement;
var focusableElements = getFocusableElements(parentQueryContainer, elements);
if (which === HOME) {
targetElement = focusableElements[0];
} else if (which === END) {
targetElement = focusableElements[focusableElements.length - 1];
} else {
targetElement = getNextFocusElement(parentQueryContainer, elements, focusMenuElement, offsetObj.offset);
}
tryFocus(targetElement);
} else if (offsetObj.inlineTrigger) {
triggerAccessibilityOpen(focusMenuKey);
} else if (offsetObj.offset > 0) {
triggerAccessibilityOpen(focusMenuKey, true);
cleanRaf();
rafRef.current = wrapperRaf$1(function() {
refreshElements();
var controlId = focusMenuElement.getAttribute("aria-controls");
var subQueryContainer = document.getElementById(controlId);
var targetElement2 = getNextFocusElement(subQueryContainer, elements);
tryFocus(targetElement2);
}, 5);
} else if (offsetObj.offset < 0) {
var keyPath = getKeyPath(focusMenuKey, true);
var parentKey = keyPath[keyPath.length - 2];
var parentMenuElement = key2element.get(parentKey);
triggerAccessibilityOpen(parentKey, false);
tryFocus(parentMenuElement);
}
}
originOnKeyDown === null || originOnKeyDown === void 0 ? void 0 : originOnKeyDown(e2);
};
}
function nextSlice(callback) {
Promise.resolve().then(callback);
}
var PATH_SPLIT = "__RC_UTIL_PATH_SPLIT__";
var getPathStr = function getPathStr2(keyPath) {
return keyPath.join(PATH_SPLIT);
};
var getPathKeys = function getPathKeys2(keyPathStr) {
return keyPathStr.split(PATH_SPLIT);
};
var OVERFLOW_KEY = "rc-menu-more";
function useKeyRecords() {
var _React$useState = React__namespace.useState({}), _React$useState2 = _slicedToArray$e(_React$useState, 2), internalForceUpdate = _React$useState2[1];
var key2pathRef = React$a.useRef(/* @__PURE__ */ new Map());
var path2keyRef = React$a.useRef(/* @__PURE__ */ new Map());
var _React$useState3 = React__namespace.useState([]), _React$useState4 = _slicedToArray$e(_React$useState3, 2), overflowKeys = _React$useState4[0], setOverflowKeys = _React$useState4[1];
var updateRef = React$a.useRef(0);
var destroyRef = React$a.useRef(false);
var forceUpdate = function forceUpdate2() {
if (!destroyRef.current) {
internalForceUpdate({});
}
};
var registerPath = React$a.useCallback(function(key2, keyPath) {
var connectedPath = getPathStr(keyPath);
path2keyRef.current.set(connectedPath, key2);
key2pathRef.current.set(key2, connectedPath);
updateRef.current += 1;
var id2 = updateRef.current;
nextSlice(function() {
if (id2 === updateRef.current) {
forceUpdate();
}
});
}, []);
var unregisterPath = React$a.useCallback(function(key2, keyPath) {
var connectedPath = getPathStr(keyPath);
path2keyRef.current.delete(connectedPath);
key2pathRef.current.delete(key2);
}, []);
var refreshOverflowKeys = React$a.useCallback(function(keys2) {
setOverflowKeys(keys2);
}, []);
var getKeyPath = React$a.useCallback(function(eventKey, includeOverflow) {
var fullPath = key2pathRef.current.get(eventKey) || "";
var keys2 = getPathKeys(fullPath);
if (includeOverflow && overflowKeys.includes(keys2[0])) {
keys2.unshift(OVERFLOW_KEY);
}
return keys2;
}, [overflowKeys]);
var isSubPathKey = React$a.useCallback(function(pathKeys, eventKey) {
return pathKeys.some(function(pathKey) {
var pathKeyList = getKeyPath(pathKey, true);
return pathKeyList.includes(eventKey);
});
}, [getKeyPath]);
var getKeys2 = function getKeys3() {
var keys2 = _toConsumableArray$c(key2pathRef.current.keys());
if (overflowKeys.length) {
keys2.push(OVERFLOW_KEY);
}
return keys2;
};
var getSubPathKeys = React$a.useCallback(function(key2) {
var connectedPath = "".concat(key2pathRef.current.get(key2)).concat(PATH_SPLIT);
var pathKeys = /* @__PURE__ */ new Set();
_toConsumableArray$c(path2keyRef.current.keys()).forEach(function(pathKey) {
if (pathKey.startsWith(connectedPath)) {
pathKeys.add(path2keyRef.current.get(pathKey));
}
});
return pathKeys;
}, []);
React__namespace.useEffect(function() {
return function() {
destroyRef.current = true;
};
}, []);
return {
registerPath,
unregisterPath,
refreshOverflowKeys,
isSubPathKey,
getKeyPath,
getKeys: getKeys2,
getSubPathKeys
};
}
function useMemoCallback(func) {
var funRef = React__namespace.useRef(func);
funRef.current = func;
var callback = React__namespace.useCallback(function() {
var _funRef$current;
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return (_funRef$current = funRef.current) === null || _funRef$current === void 0 ? void 0 : _funRef$current.call.apply(_funRef$current, [funRef].concat(args));
}, []);
return func ? callback : void 0;
}
var uniquePrefix = Math.random().toFixed(5).toString().slice(2);
var internalId = 0;
function useUUID(id2) {
var _useMergedState = useMergedState(id2, {
value: id2
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), uuid2 = _useMergedState2[0], setUUID = _useMergedState2[1];
React__namespace.useEffect(function() {
internalId += 1;
var newId = "".concat(uniquePrefix, "-").concat(internalId);
setUUID("rc-menu-uuid-".concat(newId));
}, []);
return uuid2;
}
function useActive(eventKey, disabled, onMouseEnter, onMouseLeave) {
var _React$useContext = React__namespace.useContext(MenuContext$2), activeKey = _React$useContext.activeKey, onActive = _React$useContext.onActive, onInactive = _React$useContext.onInactive;
var ret = {
active: activeKey === eventKey
};
if (!disabled) {
ret.onMouseEnter = function(domEvent) {
onMouseEnter === null || onMouseEnter === void 0 ? void 0 : onMouseEnter({
key: eventKey,
domEvent
});
onActive(eventKey);
};
ret.onMouseLeave = function(domEvent) {
onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave({
key: eventKey,
domEvent
});
onInactive(eventKey);
};
}
return ret;
}
function useDirectionStyle(level) {
var _React$useContext = React__namespace.useContext(MenuContext$2), mode = _React$useContext.mode, rtl2 = _React$useContext.rtl, inlineIndent = _React$useContext.inlineIndent;
if (mode !== "inline") {
return null;
}
var len = level;
return rtl2 ? {
paddingRight: len * inlineIndent
} : {
paddingLeft: len * inlineIndent
};
}
function Icon(_ref) {
var icon = _ref.icon, props = _ref.props, children = _ref.children;
var iconNode;
if (typeof icon === "function") {
iconNode = /* @__PURE__ */ React__namespace.createElement(icon, _objectSpread2$a({}, props));
} else {
iconNode = icon;
}
return iconNode || children || null;
}
var _excluded$y = ["item"];
function warnItemProp(_ref) {
var item = _ref.item, restInfo = _objectWithoutProperties$1(_ref, _excluded$y);
Object.defineProperty(restInfo, "item", {
get: function get2() {
warningOnce(false, "`info.item` is deprecated since we will move to function component that not provides React Node instance in future.");
return item;
}
});
return restInfo;
}
var _excluded$x = ["title", "attribute", "elementRef"], _excluded2$6 = ["style", "className", "eventKey", "warnKey", "disabled", "itemIcon", "children", "role", "onMouseEnter", "onMouseLeave", "onClick", "onKeyDown", "onFocus"], _excluded3 = ["active"];
var LegacyMenuItem = /* @__PURE__ */ function(_React$Component) {
_inherits(LegacyMenuItem2, _React$Component);
var _super = _createSuper(LegacyMenuItem2);
function LegacyMenuItem2() {
_classCallCheck(this, LegacyMenuItem2);
return _super.apply(this, arguments);
}
_createClass(LegacyMenuItem2, [{
key: "render",
value: function render2() {
var _this$props = this.props, title = _this$props.title, attribute = _this$props.attribute, elementRef = _this$props.elementRef, restProps = _objectWithoutProperties$1(_this$props, _excluded$x);
var passedProps = omit(restProps, ["eventKey", "popupClassName", "popupOffset", "onTitleClick"]);
warningOnce(!attribute, "`attribute` of Menu.Item is deprecated. Please pass attribute directly.");
return /* @__PURE__ */ jsx(ForwardOverflow.Item, {
...attribute,
title: typeof title === "string" ? title : void 0,
...passedProps,
ref: elementRef
});
}
}]);
return LegacyMenuItem2;
}(React__namespace.Component);
var InternalMenuItem = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames;
var style2 = props.style, className = props.className, eventKey = props.eventKey;
props.warnKey;
var disabled = props.disabled, itemIcon = props.itemIcon, children = props.children, role = props.role, onMouseEnter = props.onMouseEnter, onMouseLeave = props.onMouseLeave, onClick = props.onClick, onKeyDown2 = props.onKeyDown, onFocus = props.onFocus, restProps = _objectWithoutProperties$1(props, _excluded2$6);
var domDataId = useMenuId(eventKey);
var _React$useContext = React__namespace.useContext(MenuContext$2), prefixCls = _React$useContext.prefixCls, onItemClick = _React$useContext.onItemClick, contextDisabled = _React$useContext.disabled, overflowDisabled = _React$useContext.overflowDisabled, contextItemIcon = _React$useContext.itemIcon, selectedKeys = _React$useContext.selectedKeys, onActive = _React$useContext.onActive;
var _React$useContext2 = React__namespace.useContext(PrivateContext), _internalRenderMenuItem = _React$useContext2._internalRenderMenuItem;
var itemCls = "".concat(prefixCls, "-item");
var legacyMenuItemRef = React__namespace.useRef();
var elementRef = React__namespace.useRef();
var mergedDisabled = contextDisabled || disabled;
var mergedEleRef = useComposeRef(ref, elementRef);
var connectedKeys = useFullPath(eventKey);
var getEventInfo = function getEventInfo2(e2) {
return {
key: eventKey,
keyPath: _toConsumableArray$c(connectedKeys).reverse(),
item: legacyMenuItemRef.current,
domEvent: e2
};
};
var mergedItemIcon = itemIcon || contextItemIcon;
var _useActive = useActive(eventKey, mergedDisabled, onMouseEnter, onMouseLeave), active = _useActive.active, activeProps = _objectWithoutProperties$1(_useActive, _excluded3);
var selected = selectedKeys.includes(eventKey);
var directionStyle = useDirectionStyle(connectedKeys.length);
var onInternalClick = function onInternalClick2(e2) {
if (mergedDisabled) {
return;
}
var info = getEventInfo(e2);
onClick === null || onClick === void 0 ? void 0 : onClick(warnItemProp(info));
onItemClick(info);
};
var onInternalKeyDown = function onInternalKeyDown2(e2) {
onKeyDown2 === null || onKeyDown2 === void 0 ? void 0 : onKeyDown2(e2);
if (e2.which === KeyCode.ENTER) {
var info = getEventInfo(e2);
onClick === null || onClick === void 0 ? void 0 : onClick(warnItemProp(info));
onItemClick(info);
}
};
var onInternalFocus = function onInternalFocus2(e2) {
onActive(eventKey);
onFocus === null || onFocus === void 0 ? void 0 : onFocus(e2);
};
var optionRoleProps = {};
if (props.role === "option") {
optionRoleProps["aria-selected"] = selected;
}
var renderNode = /* @__PURE__ */ jsxs(LegacyMenuItem, {
ref: legacyMenuItemRef,
elementRef: mergedEleRef,
role: role === null ? "none" : role || "menuitem",
tabIndex: disabled ? null : -1,
"data-menu-id": overflowDisabled && domDataId ? null : domDataId,
...restProps,
...activeProps,
...optionRoleProps,
component: "li",
"aria-disabled": disabled,
style: _objectSpread2$a(_objectSpread2$a({}, directionStyle), style2),
className: classnames(itemCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(itemCls, "-active"), active), _defineProperty$b(_classNames, "".concat(itemCls, "-selected"), selected), _defineProperty$b(_classNames, "".concat(itemCls, "-disabled"), mergedDisabled), _classNames), className),
onClick: onInternalClick,
onKeyDown: onInternalKeyDown,
onFocus: onInternalFocus,
children: [children, /* @__PURE__ */ jsx(Icon, {
props: _objectSpread2$a(_objectSpread2$a({}, props), {}, {
isSelected: selected
}),
icon: mergedItemIcon
})]
});
if (_internalRenderMenuItem) {
renderNode = _internalRenderMenuItem(renderNode, props, {
selected
});
}
return renderNode;
});
function MenuItem$1(props, ref) {
var eventKey = props.eventKey;
var measure = useMeasure();
var connectedKeyPath = useFullPath(eventKey);
React__namespace.useEffect(function() {
if (measure) {
measure.registerPath(eventKey, connectedKeyPath);
return function() {
measure.unregisterPath(eventKey, connectedKeyPath);
};
}
}, [connectedKeyPath]);
if (measure) {
return null;
}
return /* @__PURE__ */ jsx(InternalMenuItem, {
...props,
ref
});
}
const MenuItem$2 = /* @__PURE__ */ React__namespace.forwardRef(MenuItem$1);
var _excluded$w = ["className", "children"];
var InternalSubMenuList = function InternalSubMenuList2(_ref, ref) {
var className = _ref.className, children = _ref.children, restProps = _objectWithoutProperties$1(_ref, _excluded$w);
var _React$useContext = React__namespace.useContext(MenuContext$2), prefixCls = _React$useContext.prefixCls, mode = _React$useContext.mode, rtl2 = _React$useContext.rtl;
return /* @__PURE__ */ jsx("ul", {
className: classnames(prefixCls, rtl2 && "".concat(prefixCls, "-rtl"), "".concat(prefixCls, "-sub"), "".concat(prefixCls, "-").concat(mode === "inline" ? "inline" : "vertical"), className),
role: "menu",
...restProps,
"data-menu-list": true,
ref,
children
});
};
var SubMenuList = /* @__PURE__ */ React__namespace.forwardRef(InternalSubMenuList);
SubMenuList.displayName = "SubMenuList";
var _excluded$v = ["label", "children", "key", "type"];
function parseChildren(children, keyPath) {
return toArray$9(children).map(function(child, index2) {
if (/* @__PURE__ */ React__namespace.isValidElement(child)) {
var _eventKey, _child$props;
var key2 = child.key;
var eventKey = (_eventKey = (_child$props = child.props) === null || _child$props === void 0 ? void 0 : _child$props.eventKey) !== null && _eventKey !== void 0 ? _eventKey : key2;
var emptyKey = eventKey === null || eventKey === void 0;
if (emptyKey) {
eventKey = "tmp_key-".concat([].concat(_toConsumableArray$c(keyPath), [index2]).join("-"));
}
var cloneProps = {
key: eventKey,
eventKey
};
return /* @__PURE__ */ React__namespace.cloneElement(child, cloneProps);
}
return child;
});
}
function convertItemsToNodes$1(list) {
return (list || []).map(function(opt, index2) {
if (opt && _typeof$q(opt) === "object") {
var _ref = opt, label = _ref.label, children = _ref.children, key2 = _ref.key, type2 = _ref.type, restProps = _objectWithoutProperties$1(_ref, _excluded$v);
var mergedKey = key2 !== null && key2 !== void 0 ? key2 : "tmp-".concat(index2);
if (children || type2 === "group") {
if (type2 === "group") {
return /* @__PURE__ */ jsx(MenuItemGroup, {
...restProps,
title: label,
children: convertItemsToNodes$1(children)
}, mergedKey);
}
return /* @__PURE__ */ jsx(SubMenu$1, {
...restProps,
title: label,
children: convertItemsToNodes$1(children)
}, mergedKey);
}
if (type2 === "divider") {
return /* @__PURE__ */ jsx(Divider$1, {
...restProps
}, mergedKey);
}
return /* @__PURE__ */ jsx(MenuItem$2, {
...restProps,
children: label
}, mergedKey);
}
return null;
}).filter(function(opt) {
return opt;
});
}
function parseItems(children, items, keyPath) {
var childNodes = children;
if (items) {
childNodes = convertItemsToNodes$1(items);
}
return parseChildren(childNodes, keyPath);
}
var autoAdjustOverflow$1 = {
adjustX: 1,
adjustY: 1
};
var placements$2 = {
topLeft: {
points: ["bl", "tl"],
overflow: autoAdjustOverflow$1,
offset: [0, -7]
},
bottomLeft: {
points: ["tl", "bl"],
overflow: autoAdjustOverflow$1,
offset: [0, 7]
},
leftTop: {
points: ["tr", "tl"],
overflow: autoAdjustOverflow$1,
offset: [-4, 0]
},
rightTop: {
points: ["tl", "tr"],
overflow: autoAdjustOverflow$1,
offset: [4, 0]
}
};
var placementsRtl = {
topLeft: {
points: ["bl", "tl"],
overflow: autoAdjustOverflow$1,
offset: [0, -7]
},
bottomLeft: {
points: ["tl", "bl"],
overflow: autoAdjustOverflow$1,
offset: [0, 7]
},
rightTop: {
points: ["tr", "tl"],
overflow: autoAdjustOverflow$1,
offset: [-4, 0]
},
leftTop: {
points: ["tl", "tr"],
overflow: autoAdjustOverflow$1,
offset: [4, 0]
}
};
function getMotion(mode, motion2, defaultMotions) {
if (motion2) {
return motion2;
}
if (defaultMotions) {
return defaultMotions[mode] || defaultMotions.other;
}
return void 0;
}
var popupPlacementMap = {
horizontal: "bottomLeft",
vertical: "rightTop",
"vertical-left": "rightTop",
"vertical-right": "leftTop"
};
function PopupTrigger(_ref) {
var prefixCls = _ref.prefixCls, visible = _ref.visible, children = _ref.children, popup = _ref.popup, popupClassName = _ref.popupClassName, popupOffset = _ref.popupOffset, disabled = _ref.disabled, mode = _ref.mode, onVisibleChange = _ref.onVisibleChange;
var _React$useContext = React__namespace.useContext(MenuContext$2), getPopupContainer = _React$useContext.getPopupContainer, rtl2 = _React$useContext.rtl, subMenuOpenDelay = _React$useContext.subMenuOpenDelay, subMenuCloseDelay = _React$useContext.subMenuCloseDelay, builtinPlacements = _React$useContext.builtinPlacements, triggerSubMenuAction = _React$useContext.triggerSubMenuAction, forceSubMenuRender = _React$useContext.forceSubMenuRender, rootClassName = _React$useContext.rootClassName, motion2 = _React$useContext.motion, defaultMotions = _React$useContext.defaultMotions;
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), innerVisible = _React$useState2[0], setInnerVisible = _React$useState2[1];
var placement = rtl2 ? _objectSpread2$a(_objectSpread2$a({}, placementsRtl), builtinPlacements) : _objectSpread2$a(_objectSpread2$a({}, placements$2), builtinPlacements);
var popupPlacement = popupPlacementMap[mode];
var targetMotion = getMotion(mode, motion2, defaultMotions);
var targetMotionRef = React__namespace.useRef(targetMotion);
if (mode !== "inline") {
targetMotionRef.current = targetMotion;
}
var mergedMotion = _objectSpread2$a(_objectSpread2$a({}, targetMotionRef.current), {}, {
leavedClassName: "".concat(prefixCls, "-hidden"),
removeOnLeave: false,
motionAppear: true
});
var visibleRef = React__namespace.useRef();
React__namespace.useEffect(function() {
visibleRef.current = wrapperRaf$1(function() {
setInnerVisible(visible);
});
return function() {
wrapperRaf$1.cancel(visibleRef.current);
};
}, [visible]);
return /* @__PURE__ */ jsx(Trigger$1, {
prefixCls,
popupClassName: classnames("".concat(prefixCls, "-popup"), _defineProperty$b({}, "".concat(prefixCls, "-rtl"), rtl2), popupClassName, rootClassName),
stretch: mode === "horizontal" ? "minWidth" : null,
getPopupContainer,
builtinPlacements: placement,
popupPlacement,
popupVisible: innerVisible,
popup,
popupAlign: popupOffset && {
offset: popupOffset
},
action: disabled ? [] : [triggerSubMenuAction],
mouseEnterDelay: subMenuOpenDelay,
mouseLeaveDelay: subMenuCloseDelay,
onPopupVisibleChange: onVisibleChange,
forceRender: forceSubMenuRender,
popupMotion: mergedMotion,
children
});
}
function InlineSubMenuList(_ref) {
var id2 = _ref.id, open = _ref.open, keyPath = _ref.keyPath, children = _ref.children;
var fixedMode = "inline";
var _React$useContext = React__namespace.useContext(MenuContext$2), prefixCls = _React$useContext.prefixCls, forceSubMenuRender = _React$useContext.forceSubMenuRender, motion2 = _React$useContext.motion, defaultMotions = _React$useContext.defaultMotions, mode = _React$useContext.mode;
var sameModeRef = React__namespace.useRef(false);
sameModeRef.current = mode === fixedMode;
var _React$useState = React__namespace.useState(!sameModeRef.current), _React$useState2 = _slicedToArray$e(_React$useState, 2), destroy = _React$useState2[0], setDestroy = _React$useState2[1];
var mergedOpen = sameModeRef.current ? open : false;
React__namespace.useEffect(function() {
if (sameModeRef.current) {
setDestroy(false);
}
}, [mode]);
var mergedMotion = _objectSpread2$a({}, getMotion(fixedMode, motion2, defaultMotions));
if (keyPath.length > 1) {
mergedMotion.motionAppear = false;
}
var originOnVisibleChanged = mergedMotion.onVisibleChanged;
mergedMotion.onVisibleChanged = function(newVisible) {
if (!sameModeRef.current && !newVisible) {
setDestroy(true);
}
return originOnVisibleChanged === null || originOnVisibleChanged === void 0 ? void 0 : originOnVisibleChanged(newVisible);
};
if (destroy) {
return null;
}
return /* @__PURE__ */ jsx(InheritableContextProvider, {
mode: fixedMode,
locked: !sameModeRef.current,
children: /* @__PURE__ */ jsx(CSSMotion, {
visible: mergedOpen,
...mergedMotion,
forceRender: forceSubMenuRender,
removeOnLeave: false,
leavedClassName: "".concat(prefixCls, "-hidden"),
children: function(_ref2) {
var motionClassName = _ref2.className, motionStyle = _ref2.style;
return /* @__PURE__ */ jsx(SubMenuList, {
id: id2,
className: motionClassName,
style: motionStyle,
children
});
}
})
});
}
var _excluded$u = ["style", "className", "title", "eventKey", "warnKey", "disabled", "internalPopupClose", "children", "itemIcon", "expandIcon", "popupClassName", "popupOffset", "onClick", "onMouseEnter", "onMouseLeave", "onTitleClick", "onTitleMouseEnter", "onTitleMouseLeave"], _excluded2$5 = ["active"];
var InternalSubMenu = function InternalSubMenu2(props) {
var _classNames;
var style2 = props.style, className = props.className, title = props.title, eventKey = props.eventKey;
props.warnKey;
var disabled = props.disabled, internalPopupClose = props.internalPopupClose, children = props.children, itemIcon = props.itemIcon, expandIcon = props.expandIcon, popupClassName = props.popupClassName, popupOffset = props.popupOffset, onClick = props.onClick, onMouseEnter = props.onMouseEnter, onMouseLeave = props.onMouseLeave, onTitleClick = props.onTitleClick, onTitleMouseEnter = props.onTitleMouseEnter, onTitleMouseLeave = props.onTitleMouseLeave, restProps = _objectWithoutProperties$1(props, _excluded$u);
var domDataId = useMenuId(eventKey);
var _React$useContext = React__namespace.useContext(MenuContext$2), prefixCls = _React$useContext.prefixCls, mode = _React$useContext.mode, openKeys = _React$useContext.openKeys, contextDisabled = _React$useContext.disabled, overflowDisabled = _React$useContext.overflowDisabled, activeKey = _React$useContext.activeKey, selectedKeys = _React$useContext.selectedKeys, contextItemIcon = _React$useContext.itemIcon, contextExpandIcon = _React$useContext.expandIcon, onItemClick = _React$useContext.onItemClick, onOpenChange = _React$useContext.onOpenChange, onActive = _React$useContext.onActive;
var _React$useContext2 = React__namespace.useContext(PrivateContext), _internalRenderSubMenuItem = _React$useContext2._internalRenderSubMenuItem;
var _React$useContext3 = React__namespace.useContext(PathUserContext), isSubPathKey = _React$useContext3.isSubPathKey;
var connectedPath = useFullPath();
var subMenuPrefixCls = "".concat(prefixCls, "-submenu");
var mergedDisabled = contextDisabled || disabled;
var elementRef = React__namespace.useRef();
var popupRef = React__namespace.useRef();
var mergedItemIcon = itemIcon || contextItemIcon;
var mergedExpandIcon = expandIcon || contextExpandIcon;
var originOpen = openKeys.includes(eventKey);
var open = !overflowDisabled && originOpen;
var childrenSelected = isSubPathKey(selectedKeys, eventKey);
var _useActive = useActive(eventKey, mergedDisabled, onTitleMouseEnter, onTitleMouseLeave), active = _useActive.active, activeProps = _objectWithoutProperties$1(_useActive, _excluded2$5);
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), childrenActive = _React$useState2[0], setChildrenActive = _React$useState2[1];
var triggerChildrenActive = function triggerChildrenActive2(newActive) {
if (!mergedDisabled) {
setChildrenActive(newActive);
}
};
var onInternalMouseEnter = function onInternalMouseEnter2(domEvent) {
triggerChildrenActive(true);
onMouseEnter === null || onMouseEnter === void 0 ? void 0 : onMouseEnter({
key: eventKey,
domEvent
});
};
var onInternalMouseLeave = function onInternalMouseLeave2(domEvent) {
triggerChildrenActive(false);
onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave({
key: eventKey,
domEvent
});
};
var mergedActive = React__namespace.useMemo(function() {
if (active) {
return active;
}
if (mode !== "inline") {
return childrenActive || isSubPathKey([activeKey], eventKey);
}
return false;
}, [mode, active, activeKey, childrenActive, eventKey, isSubPathKey]);
var directionStyle = useDirectionStyle(connectedPath.length);
var onInternalTitleClick = function onInternalTitleClick2(e2) {
if (mergedDisabled) {
return;
}
onTitleClick === null || onTitleClick === void 0 ? void 0 : onTitleClick({
key: eventKey,
domEvent: e2
});
if (mode === "inline") {
onOpenChange(eventKey, !originOpen);
}
};
var onMergedItemClick = useMemoCallback(function(info) {
onClick === null || onClick === void 0 ? void 0 : onClick(warnItemProp(info));
onItemClick(info);
});
var onPopupVisibleChange = function onPopupVisibleChange2(newVisible) {
if (mode !== "inline") {
onOpenChange(eventKey, newVisible);
}
};
var onInternalFocus = function onInternalFocus2() {
onActive(eventKey);
};
var popupId = domDataId && "".concat(domDataId, "-popup");
var titleNode = /* @__PURE__ */ jsxs("div", {
role: "menuitem",
style: directionStyle,
className: "".concat(subMenuPrefixCls, "-title"),
tabIndex: mergedDisabled ? null : -1,
ref: elementRef,
title: typeof title === "string" ? title : null,
"data-menu-id": overflowDisabled && domDataId ? null : domDataId,
"aria-expanded": open,
"aria-haspopup": true,
"aria-controls": popupId,
"aria-disabled": mergedDisabled,
onClick: onInternalTitleClick,
onFocus: onInternalFocus,
...activeProps,
children: [title, /* @__PURE__ */ jsx(Icon, {
icon: mode !== "horizontal" ? mergedExpandIcon : null,
props: _objectSpread2$a(_objectSpread2$a({}, props), {}, {
isOpen: open,
isSubMenu: true
}),
children: /* @__PURE__ */ jsx("i", {
className: "".concat(subMenuPrefixCls, "-arrow")
})
})]
});
var triggerModeRef = React__namespace.useRef(mode);
if (mode !== "inline" && connectedPath.length > 1) {
triggerModeRef.current = "vertical";
} else {
triggerModeRef.current = mode;
}
if (!overflowDisabled) {
var triggerMode = triggerModeRef.current;
titleNode = /* @__PURE__ */ jsx(PopupTrigger, {
mode: triggerMode,
prefixCls: subMenuPrefixCls,
visible: !internalPopupClose && open && mode !== "inline",
popupClassName,
popupOffset,
popup: /* @__PURE__ */ jsx(InheritableContextProvider, {
mode: triggerMode === "horizontal" ? "vertical" : triggerMode,
children: /* @__PURE__ */ jsx(SubMenuList, {
id: popupId,
ref: popupRef,
children
})
}),
disabled: mergedDisabled,
onVisibleChange: onPopupVisibleChange,
children: titleNode
});
}
var listNode = /* @__PURE__ */ jsxs(ForwardOverflow.Item, {
role: "none",
...restProps,
component: "li",
style: style2,
className: classnames(subMenuPrefixCls, "".concat(subMenuPrefixCls, "-").concat(mode), className, (_classNames = {}, _defineProperty$b(_classNames, "".concat(subMenuPrefixCls, "-open"), open), _defineProperty$b(_classNames, "".concat(subMenuPrefixCls, "-active"), mergedActive), _defineProperty$b(_classNames, "".concat(subMenuPrefixCls, "-selected"), childrenSelected), _defineProperty$b(_classNames, "".concat(subMenuPrefixCls, "-disabled"), mergedDisabled), _classNames)),
onMouseEnter: onInternalMouseEnter,
onMouseLeave: onInternalMouseLeave,
children: [titleNode, !overflowDisabled && /* @__PURE__ */ jsx(InlineSubMenuList, {
id: popupId,
open,
keyPath: connectedPath,
children
})]
});
if (_internalRenderSubMenuItem) {
listNode = _internalRenderSubMenuItem(listNode, props, {
selected: childrenSelected,
active: mergedActive,
open,
disabled: mergedDisabled
});
}
return /* @__PURE__ */ jsx(InheritableContextProvider, {
onItemClick: onMergedItemClick,
mode: mode === "horizontal" ? "vertical" : mode,
itemIcon: mergedItemIcon,
expandIcon: mergedExpandIcon,
children: listNode
});
};
function SubMenu$1(props) {
var eventKey = props.eventKey, children = props.children;
var connectedKeyPath = useFullPath(eventKey);
var childList = parseChildren(children, connectedKeyPath);
var measure = useMeasure();
React__namespace.useEffect(function() {
if (measure) {
measure.registerPath(eventKey, connectedKeyPath);
return function() {
measure.unregisterPath(eventKey, connectedKeyPath);
};
}
}, [connectedKeyPath]);
var renderNode;
if (measure) {
renderNode = childList;
} else {
renderNode = /* @__PURE__ */ jsx(InternalSubMenu, {
...props,
children: childList
});
}
return /* @__PURE__ */ jsx(PathTrackerContext.Provider, {
value: connectedKeyPath,
children: renderNode
});
}
var _excluded$t = ["prefixCls", "rootClassName", "style", "className", "tabIndex", "items", "children", "direction", "id", "mode", "inlineCollapsed", "disabled", "disabledOverflow", "subMenuOpenDelay", "subMenuCloseDelay", "forceSubMenuRender", "defaultOpenKeys", "openKeys", "activeKey", "defaultActiveFirst", "selectable", "multiple", "defaultSelectedKeys", "selectedKeys", "onSelect", "onDeselect", "inlineIndent", "motion", "defaultMotions", "triggerSubMenuAction", "builtinPlacements", "itemIcon", "expandIcon", "overflowedIndicator", "overflowedIndicatorPopupClassName", "getPopupContainer", "onClick", "onOpenChange", "onKeyDown", "openAnimation", "openTransitionName", "_internalRenderMenuItem", "_internalRenderSubMenuItem"];
var EMPTY_LIST$4 = [];
var Menu$2 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _childList$, _classNames;
var _ref = props, _ref$prefixCls = _ref.prefixCls, prefixCls = _ref$prefixCls === void 0 ? "rc-menu" : _ref$prefixCls, rootClassName = _ref.rootClassName, style2 = _ref.style, className = _ref.className, _ref$tabIndex = _ref.tabIndex, tabIndex = _ref$tabIndex === void 0 ? 0 : _ref$tabIndex, items = _ref.items, children = _ref.children, direction = _ref.direction, id2 = _ref.id, _ref$mode = _ref.mode, mode = _ref$mode === void 0 ? "vertical" : _ref$mode, inlineCollapsed = _ref.inlineCollapsed, disabled = _ref.disabled, disabledOverflow = _ref.disabledOverflow, _ref$subMenuOpenDelay = _ref.subMenuOpenDelay, subMenuOpenDelay = _ref$subMenuOpenDelay === void 0 ? 0.1 : _ref$subMenuOpenDelay, _ref$subMenuCloseDela = _ref.subMenuCloseDelay, subMenuCloseDelay = _ref$subMenuCloseDela === void 0 ? 0.1 : _ref$subMenuCloseDela, forceSubMenuRender = _ref.forceSubMenuRender, defaultOpenKeys = _ref.defaultOpenKeys, openKeys = _ref.openKeys, activeKey = _ref.activeKey, defaultActiveFirst = _ref.defaultActiveFirst, _ref$selectable = _ref.selectable, selectable = _ref$selectable === void 0 ? true : _ref$selectable, _ref$multiple = _ref.multiple, multiple = _ref$multiple === void 0 ? false : _ref$multiple, defaultSelectedKeys = _ref.defaultSelectedKeys, selectedKeys = _ref.selectedKeys, onSelect = _ref.onSelect, onDeselect = _ref.onDeselect, _ref$inlineIndent = _ref.inlineIndent, inlineIndent = _ref$inlineIndent === void 0 ? 24 : _ref$inlineIndent, motion2 = _ref.motion, defaultMotions = _ref.defaultMotions, _ref$triggerSubMenuAc = _ref.triggerSubMenuAction, triggerSubMenuAction = _ref$triggerSubMenuAc === void 0 ? "hover" : _ref$triggerSubMenuAc, builtinPlacements = _ref.builtinPlacements, itemIcon = _ref.itemIcon, expandIcon = _ref.expandIcon, _ref$overflowedIndica = _ref.overflowedIndicator, overflowedIndicator = _ref$overflowedIndica === void 0 ? "..." : _ref$overflowedIndica, overflowedIndicatorPopupClassName = _ref.overflowedIndicatorPopupClassName, getPopupContainer = _ref.getPopupContainer, onClick = _ref.onClick, onOpenChange = _ref.onOpenChange, onKeyDown2 = _ref.onKeyDown;
_ref.openAnimation;
_ref.openTransitionName;
var _internalRenderMenuItem = _ref._internalRenderMenuItem, _internalRenderSubMenuItem = _ref._internalRenderSubMenuItem, restProps = _objectWithoutProperties$1(_ref, _excluded$t);
var childList = React__namespace.useMemo(function() {
return parseItems(children, items, EMPTY_LIST$4);
}, [children, items]);
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), mounted = _React$useState2[0], setMounted = _React$useState2[1];
var containerRef = React__namespace.useRef();
var uuid2 = useUUID(id2);
var isRtl = direction === "rtl";
var _useMergedState = useMergedState(defaultOpenKeys, {
value: openKeys,
postState: function postState(keys2) {
return keys2 || EMPTY_LIST$4;
}
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), mergedOpenKeys = _useMergedState2[0], setMergedOpenKeys = _useMergedState2[1];
var triggerOpenKeys = function triggerOpenKeys2(keys2) {
var forceFlush = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
function doUpdate() {
setMergedOpenKeys(keys2);
onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(keys2);
}
if (forceFlush) {
ReactDOM2.flushSync(doUpdate);
} else {
doUpdate();
}
};
var _React$useState3 = React__namespace.useState(mergedOpenKeys), _React$useState4 = _slicedToArray$e(_React$useState3, 2), inlineCacheOpenKeys = _React$useState4[0], setInlineCacheOpenKeys = _React$useState4[1];
var mountRef = React__namespace.useRef(false);
var _React$useMemo = React__namespace.useMemo(function() {
if ((mode === "inline" || mode === "vertical") && inlineCollapsed) {
return ["vertical", inlineCollapsed];
}
return [mode, false];
}, [mode, inlineCollapsed]), _React$useMemo2 = _slicedToArray$e(_React$useMemo, 2), mergedMode = _React$useMemo2[0], mergedInlineCollapsed = _React$useMemo2[1];
var isInlineMode = mergedMode === "inline";
var _React$useState5 = React__namespace.useState(mergedMode), _React$useState6 = _slicedToArray$e(_React$useState5, 2), internalMode = _React$useState6[0], setInternalMode = _React$useState6[1];
var _React$useState7 = React__namespace.useState(mergedInlineCollapsed), _React$useState8 = _slicedToArray$e(_React$useState7, 2), internalInlineCollapsed = _React$useState8[0], setInternalInlineCollapsed = _React$useState8[1];
React__namespace.useEffect(function() {
setInternalMode(mergedMode);
setInternalInlineCollapsed(mergedInlineCollapsed);
if (!mountRef.current) {
return;
}
if (isInlineMode) {
setMergedOpenKeys(inlineCacheOpenKeys);
} else {
triggerOpenKeys(EMPTY_LIST$4);
}
}, [mergedMode, mergedInlineCollapsed]);
var _React$useState9 = React__namespace.useState(0), _React$useState10 = _slicedToArray$e(_React$useState9, 2), lastVisibleIndex = _React$useState10[0], setLastVisibleIndex = _React$useState10[1];
var allVisible = lastVisibleIndex >= childList.length - 1 || internalMode !== "horizontal" || disabledOverflow;
React__namespace.useEffect(function() {
if (isInlineMode) {
setInlineCacheOpenKeys(mergedOpenKeys);
}
}, [mergedOpenKeys]);
React__namespace.useEffect(function() {
mountRef.current = true;
return function() {
mountRef.current = false;
};
}, []);
var _useKeyRecords = useKeyRecords(), registerPath = _useKeyRecords.registerPath, unregisterPath = _useKeyRecords.unregisterPath, refreshOverflowKeys = _useKeyRecords.refreshOverflowKeys, isSubPathKey = _useKeyRecords.isSubPathKey, getKeyPath = _useKeyRecords.getKeyPath, getKeys2 = _useKeyRecords.getKeys, getSubPathKeys = _useKeyRecords.getSubPathKeys;
var registerPathContext = React__namespace.useMemo(function() {
return {
registerPath,
unregisterPath
};
}, [registerPath, unregisterPath]);
var pathUserContext = React__namespace.useMemo(function() {
return {
isSubPathKey
};
}, [isSubPathKey]);
React__namespace.useEffect(function() {
refreshOverflowKeys(allVisible ? EMPTY_LIST$4 : childList.slice(lastVisibleIndex + 1).map(function(child) {
return child.key;
}));
}, [lastVisibleIndex, allVisible]);
var _useMergedState3 = useMergedState(activeKey || defaultActiveFirst && ((_childList$ = childList[0]) === null || _childList$ === void 0 ? void 0 : _childList$.key), {
value: activeKey
}), _useMergedState4 = _slicedToArray$e(_useMergedState3, 2), mergedActiveKey = _useMergedState4[0], setMergedActiveKey = _useMergedState4[1];
var onActive = useMemoCallback(function(key2) {
setMergedActiveKey(key2);
});
var onInactive = useMemoCallback(function() {
setMergedActiveKey(void 0);
});
React$a.useImperativeHandle(ref, function() {
return {
list: containerRef.current,
focus: function focus(options) {
var _childList$find;
var shouldFocusKey = mergedActiveKey !== null && mergedActiveKey !== void 0 ? mergedActiveKey : (_childList$find = childList.find(function(node) {
return !node.props.disabled;
})) === null || _childList$find === void 0 ? void 0 : _childList$find.key;
if (shouldFocusKey) {
var _containerRef$current, _containerRef$current2, _containerRef$current3;
(_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 ? void 0 : (_containerRef$current2 = _containerRef$current.querySelector("li[data-menu-id='".concat(getMenuId(uuid2, shouldFocusKey), "']"))) === null || _containerRef$current2 === void 0 ? void 0 : (_containerRef$current3 = _containerRef$current2.focus) === null || _containerRef$current3 === void 0 ? void 0 : _containerRef$current3.call(_containerRef$current2, options);
}
}
};
});
var _useMergedState5 = useMergedState(defaultSelectedKeys || [], {
value: selectedKeys,
postState: function postState(keys2) {
if (Array.isArray(keys2)) {
return keys2;
}
if (keys2 === null || keys2 === void 0) {
return EMPTY_LIST$4;
}
return [keys2];
}
}), _useMergedState6 = _slicedToArray$e(_useMergedState5, 2), mergedSelectKeys = _useMergedState6[0], setMergedSelectKeys = _useMergedState6[1];
var triggerSelection = function triggerSelection2(info) {
if (selectable) {
var targetKey = info.key;
var exist = mergedSelectKeys.includes(targetKey);
var newSelectKeys;
if (multiple) {
if (exist) {
newSelectKeys = mergedSelectKeys.filter(function(key2) {
return key2 !== targetKey;
});
} else {
newSelectKeys = [].concat(_toConsumableArray$c(mergedSelectKeys), [targetKey]);
}
} else {
newSelectKeys = [targetKey];
}
setMergedSelectKeys(newSelectKeys);
var selectInfo = _objectSpread2$a(_objectSpread2$a({}, info), {}, {
selectedKeys: newSelectKeys
});
if (exist) {
onDeselect === null || onDeselect === void 0 ? void 0 : onDeselect(selectInfo);
} else {
onSelect === null || onSelect === void 0 ? void 0 : onSelect(selectInfo);
}
}
if (!multiple && mergedOpenKeys.length && internalMode !== "inline") {
triggerOpenKeys(EMPTY_LIST$4);
}
};
var onInternalClick = useMemoCallback(function(info) {
onClick === null || onClick === void 0 ? void 0 : onClick(warnItemProp(info));
triggerSelection(info);
});
var onInternalOpenChange = useMemoCallback(function(key2, open) {
var newOpenKeys = mergedOpenKeys.filter(function(k2) {
return k2 !== key2;
});
if (open) {
newOpenKeys.push(key2);
} else if (internalMode !== "inline") {
var subPathKeys = getSubPathKeys(key2);
newOpenKeys = newOpenKeys.filter(function(k2) {
return !subPathKeys.has(k2);
});
}
if (!isEqual$2(mergedOpenKeys, newOpenKeys, true)) {
triggerOpenKeys(newOpenKeys, true);
}
});
var getInternalPopupContainer = useMemoCallback(getPopupContainer);
var triggerAccessibilityOpen = function triggerAccessibilityOpen2(key2, open) {
var nextOpen = open !== null && open !== void 0 ? open : !mergedOpenKeys.includes(key2);
onInternalOpenChange(key2, nextOpen);
};
var onInternalKeyDown = useAccessibility$1(internalMode, mergedActiveKey, isRtl, uuid2, containerRef, getKeys2, getKeyPath, setMergedActiveKey, triggerAccessibilityOpen, onKeyDown2);
React__namespace.useEffect(function() {
setMounted(true);
}, []);
var privateContext = React__namespace.useMemo(function() {
return {
_internalRenderMenuItem,
_internalRenderSubMenuItem
};
}, [_internalRenderMenuItem, _internalRenderSubMenuItem]);
var wrappedChildList = internalMode !== "horizontal" || disabledOverflow ? childList : childList.map(function(child, index2) {
return /* @__PURE__ */ jsx(InheritableContextProvider, {
overflowDisabled: index2 > lastVisibleIndex,
children: child
}, child.key);
});
var container = /* @__PURE__ */ jsx(ForwardOverflow, {
id: id2,
ref: containerRef,
prefixCls: "".concat(prefixCls, "-overflow"),
component: "ul",
itemComponent: MenuItem$2,
className: classnames(prefixCls, "".concat(prefixCls, "-root"), "".concat(prefixCls, "-").concat(internalMode), className, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-inline-collapsed"), internalInlineCollapsed), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), isRtl), _classNames), rootClassName),
dir: direction,
style: style2,
role: "menu",
tabIndex,
data: wrappedChildList,
renderRawItem: function renderRawItem(node) {
return node;
},
renderRawRest: function renderRawRest(omitItems) {
var len = omitItems.length;
var originOmitItems = len ? childList.slice(-len) : null;
return /* @__PURE__ */ jsx(SubMenu$1, {
eventKey: OVERFLOW_KEY,
title: overflowedIndicator,
disabled: allVisible,
internalPopupClose: len === 0,
popupClassName: overflowedIndicatorPopupClassName,
children: originOmitItems
});
},
maxCount: internalMode !== "horizontal" || disabledOverflow ? ForwardOverflow.INVALIDATE : ForwardOverflow.RESPONSIVE,
ssr: "full",
"data-menu-list": true,
onVisibleChange: function onVisibleChange(newLastIndex) {
setLastVisibleIndex(newLastIndex);
},
onKeyDown: onInternalKeyDown,
...restProps
});
return /* @__PURE__ */ jsx(PrivateContext.Provider, {
value: privateContext,
children: /* @__PURE__ */ jsx(IdContext.Provider, {
value: uuid2,
children: /* @__PURE__ */ jsxs(InheritableContextProvider, {
prefixCls,
rootClassName,
mode: internalMode,
openKeys: mergedOpenKeys,
rtl: isRtl,
disabled,
motion: mounted ? motion2 : null,
defaultMotions: mounted ? defaultMotions : null,
activeKey: mergedActiveKey,
onActive,
onInactive,
selectedKeys: mergedSelectKeys,
inlineIndent,
subMenuOpenDelay,
subMenuCloseDelay,
forceSubMenuRender,
builtinPlacements,
triggerSubMenuAction,
getPopupContainer: getInternalPopupContainer,
itemIcon,
expandIcon,
onItemClick: onInternalClick,
onOpenChange: onInternalOpenChange,
children: [/* @__PURE__ */ jsx(PathUserContext.Provider, {
value: pathUserContext,
children: container
}), /* @__PURE__ */ jsx("div", {
style: {
display: "none"
},
"aria-hidden": true,
children: /* @__PURE__ */ jsx(PathRegisterContext.Provider, {
value: registerPathContext,
children: childList
})
})]
})
})
});
});
var _excluded$s = ["className", "title", "eventKey", "children"], _excluded2$4 = ["children"];
var InternalMenuItemGroup = function InternalMenuItemGroup2(_ref) {
var className = _ref.className, title = _ref.title;
_ref.eventKey;
var children = _ref.children, restProps = _objectWithoutProperties$1(_ref, _excluded$s);
var _React$useContext = React__namespace.useContext(MenuContext$2), prefixCls = _React$useContext.prefixCls;
var groupPrefixCls = "".concat(prefixCls, "-item-group");
return /* @__PURE__ */ jsxs("li", {
role: "presentation",
...restProps,
onClick: function onClick(e2) {
return e2.stopPropagation();
},
className: classnames(groupPrefixCls, className),
children: [/* @__PURE__ */ jsx("div", {
role: "presentation",
className: "".concat(groupPrefixCls, "-title"),
title: typeof title === "string" ? title : void 0,
children: title
}), /* @__PURE__ */ jsx("ul", {
role: "group",
className: "".concat(groupPrefixCls, "-list"),
children
})]
});
};
function MenuItemGroup(_ref2) {
var children = _ref2.children, props = _objectWithoutProperties$1(_ref2, _excluded2$4);
var connectedKeyPath = useFullPath(props.eventKey);
var childList = parseChildren(children, connectedKeyPath);
var measure = useMeasure();
if (measure) {
return childList;
}
return /* @__PURE__ */ jsx(InternalMenuItemGroup, {
...omit(props, ["warnKey"]),
children: childList
});
}
function Divider$1(_ref) {
var className = _ref.className, style2 = _ref.style;
var _React$useContext = React__namespace.useContext(MenuContext$2), prefixCls = _React$useContext.prefixCls;
var measure = useMeasure();
if (measure) {
return null;
}
return /* @__PURE__ */ jsx("li", {
className: classnames("".concat(prefixCls, "-item-divider"), className),
style: style2
});
}
var ExportMenu = Menu$2;
ExportMenu.Item = MenuItem$2;
ExportMenu.SubMenu = SubMenu$1;
ExportMenu.ItemGroup = MenuItemGroup;
ExportMenu.Divider = Divider$1;
var LeftOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M724 218.3V141c0-6.7-7.7-10.4-12.9-6.3L260.3 486.8a31.86 31.86 0 000 50.3l450.8 352.1c5.3 4.1 12.9.4 12.9-6.3v-77.3c0-4.9-2.3-9.6-6.1-12.6l-360-281 360-281.1c3.8-3 6.1-7.7 6.1-12.6z" } }] }, "name": "left", "theme": "outlined" };
const LeftOutlinedSvg = LeftOutlined$2;
var LeftOutlined = function LeftOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: LeftOutlinedSvg
})
});
};
LeftOutlined.displayName = "LeftOutlined";
const LeftOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(LeftOutlined);
var RightOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z" } }] }, "name": "right", "theme": "outlined" };
const RightOutlinedSvg = RightOutlined$2;
var RightOutlined = function RightOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: RightOutlinedSvg
})
});
};
RightOutlined.displayName = "RightOutlined";
const RightOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(RightOutlined);
globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var SiderContext = /* @__PURE__ */ React__namespace.createContext({});
var __rest$N = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var MenuDivider = function MenuDivider2(_a) {
var customizePrefixCls = _a.prefixCls, className = _a.className, dashed = _a.dashed, restProps = __rest$N(_a, ["prefixCls", "className", "dashed"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls("menu", customizePrefixCls);
var classString = classnames(_defineProperty$b({}, "".concat(prefixCls, "-item-divider-dashed"), !!dashed), className);
return /* @__PURE__ */ jsx(Divider$1, {
className: classString,
...restProps
});
};
const MenuDivider$1 = MenuDivider;
var MenuContext = /* @__PURE__ */ React$a.createContext({
prefixCls: "",
firstLevel: true,
inlineCollapsed: false
});
const MenuContext$1 = MenuContext;
var __rest$M = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var MenuItem = /* @__PURE__ */ function(_React$Component) {
_inherits(MenuItem2, _React$Component);
var _super = _createSuper(MenuItem2);
function MenuItem2() {
var _this2;
_classCallCheck(this, MenuItem2);
_this2 = _super.apply(this, arguments);
_this2.renderItem = function(_ref) {
var _classNames;
var siderCollapsed = _ref.siderCollapsed;
var _a;
var _this$context = _this2.context, prefixCls = _this$context.prefixCls, firstLevel = _this$context.firstLevel, inlineCollapsed = _this$context.inlineCollapsed, direction = _this$context.direction, disableMenuItemTitleTooltip = _this$context.disableMenuItemTitleTooltip;
var _this$props = _this2.props, className = _this$props.className, children = _this$props.children;
var _b = _this2.props, title = _b.title, icon = _b.icon, danger = _b.danger, rest = __rest$M(_b, ["title", "icon", "danger"]);
var tooltipTitle = title;
if (typeof title === "undefined") {
tooltipTitle = firstLevel ? children : "";
} else if (title === false) {
tooltipTitle = "";
}
var tooltipProps = {
title: tooltipTitle
};
if (!siderCollapsed && !inlineCollapsed) {
tooltipProps.title = null;
tooltipProps.open = false;
}
var childrenLength = toArray$9(children).length;
var returnNode = /* @__PURE__ */ jsxs(MenuItem$2, {
...rest,
className: classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-item-danger"), danger), _defineProperty$b(_classNames, "".concat(prefixCls, "-item-only-child"), (icon ? childrenLength + 1 : childrenLength) === 1), _classNames), className),
title: typeof title === "string" ? title : void 0,
children: [cloneElement(icon, {
className: classnames(isValidElement(icon) ? (_a = icon.props) === null || _a === void 0 ? void 0 : _a.className : "", "".concat(prefixCls, "-item-icon"))
}), _this2.renderItemChildren(inlineCollapsed)]
});
if (!disableMenuItemTitleTooltip) {
returnNode = /* @__PURE__ */ jsx(_Tooltip, {
...tooltipProps,
placement: direction === "rtl" ? "left" : "right",
overlayClassName: "".concat(prefixCls, "-inline-collapsed-tooltip"),
children: returnNode
});
}
return returnNode;
};
return _this2;
}
_createClass(MenuItem2, [{
key: "renderItemChildren",
value: function renderItemChildren(inlineCollapsed) {
var _this$context2 = this.context, prefixCls = _this$context2.prefixCls, firstLevel = _this$context2.firstLevel;
var _this$props2 = this.props, icon = _this$props2.icon, children = _this$props2.children;
var wrapNode = /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-title-content"),
children
});
if (!icon || isValidElement(children) && children.type === "span") {
if (children && inlineCollapsed && firstLevel && typeof children === "string") {
return /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-inline-collapsed-noicon"),
children: children.charAt(0)
});
}
}
return wrapNode;
}
}, {
key: "render",
value: function render2() {
return /* @__PURE__ */ jsx(SiderContext.Consumer, {
children: this.renderItem
});
}
}]);
return MenuItem2;
}(React__namespace.Component);
MenuItem.contextType = MenuContext$1;
function SubMenu(props) {
var _a;
var popupClassName = props.popupClassName, icon = props.icon, title = props.title, theme = props.theme;
var context2 = React__namespace.useContext(MenuContext$1);
var prefixCls = context2.prefixCls, inlineCollapsed = context2.inlineCollapsed, antdMenuTheme = context2.antdMenuTheme;
var parentPath = useFullPath();
var titleNode;
if (!icon) {
titleNode = inlineCollapsed && !parentPath.length && title && typeof title === "string" ? /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-inline-collapsed-noicon"),
children: title.charAt(0)
}) : /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-title-content"),
children: title
});
} else {
var titleIsSpan = isValidElement(title) && title.type === "span";
titleNode = /* @__PURE__ */ jsxs(Fragment, {
children: [cloneElement(icon, {
className: classnames(isValidElement(icon) ? (_a = icon.props) === null || _a === void 0 ? void 0 : _a.className : "", "".concat(prefixCls, "-item-icon"))
}), titleIsSpan ? title : /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-title-content"),
children: title
})]
});
}
var contextValue = React__namespace.useMemo(function() {
return _extends$3(_extends$3({}, context2), {
firstLevel: false
});
}, [context2]);
return /* @__PURE__ */ jsx(MenuContext$1.Provider, {
value: contextValue,
children: /* @__PURE__ */ jsx(SubMenu$1, {
...omit(props, ["icon"]),
title: titleNode,
popupClassName: classnames(prefixCls, "".concat(prefixCls, "-").concat(theme || antdMenuTheme), popupClassName)
})
});
}
var __rest$L = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
function convertItemsToNodes(list) {
return (list || []).map(function(opt, index2) {
if (opt && _typeof$q(opt) === "object") {
var _a = opt, label = _a.label, children = _a.children, key2 = _a.key, type2 = _a.type, restProps = __rest$L(_a, ["label", "children", "key", "type"]);
var mergedKey = key2 !== null && key2 !== void 0 ? key2 : "tmp-".concat(index2);
if (children || type2 === "group") {
if (type2 === "group") {
return /* @__PURE__ */ jsx(MenuItemGroup, {
...restProps,
title: label,
children: convertItemsToNodes(children)
}, mergedKey);
}
return /* @__PURE__ */ jsx(SubMenu, {
...restProps,
title: label,
children: convertItemsToNodes(children)
}, mergedKey);
}
if (type2 === "divider") {
return /* @__PURE__ */ jsx(MenuDivider$1, {
...restProps
}, mergedKey);
}
return /* @__PURE__ */ jsx(MenuItem, {
...restProps,
children: label
}, mergedKey);
}
return null;
}).filter(function(opt) {
return opt;
});
}
function useItems(items) {
return React__namespace.useMemo(function() {
if (!items) {
return items;
}
return convertItemsToNodes(items);
}, [items]);
}
var __rest$K = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var OverrideContext = /* @__PURE__ */ React__namespace.createContext(null);
var OverrideProvider = function OverrideProvider2(_a) {
var children = _a.children, restProps = __rest$K(_a, ["children"]);
var override = React__namespace.useContext(OverrideContext);
var context2 = React__namespace.useMemo(function() {
return _extends$3(_extends$3({}, override), restProps);
}, [
override,
restProps.prefixCls,
restProps.mode,
restProps.selectable
]);
return /* @__PURE__ */ jsx(OverrideContext.Provider, {
value: context2,
children
});
};
var __rest$J = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var InternalMenu = /* @__PURE__ */ React$a.forwardRef(function(props, ref) {
var _a;
var override = React__namespace.useContext(OverrideContext) || {};
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, getPopupContainer = _React$useContext.getPopupContainer, direction = _React$useContext.direction;
var rootPrefixCls = getPrefixCls();
var customizePrefixCls = props.prefixCls, className = props.className, _props$theme = props.theme, theme = _props$theme === void 0 ? "light" : _props$theme, expandIcon = props.expandIcon, _internalDisableMenuItemTitleTooltip = props._internalDisableMenuItemTitleTooltip, inlineCollapsed = props.inlineCollapsed, siderCollapsed = props.siderCollapsed, items = props.items, children = props.children, mode = props.mode, selectable = props.selectable, onClick = props.onClick, restProps = __rest$J(props, ["prefixCls", "className", "theme", "expandIcon", "_internalDisableMenuItemTitleTooltip", "inlineCollapsed", "siderCollapsed", "items", "children", "mode", "selectable", "onClick"]);
var passedProps = omit(restProps, ["collapsedWidth"]);
var mergedChildren = useItems(items) || children;
(_a = override.validator) === null || _a === void 0 ? void 0 : _a.call(override, {
mode
});
var onItemClick = useEvent(function() {
var _a2;
onClick === null || onClick === void 0 ? void 0 : onClick.apply(void 0, arguments);
(_a2 = override === null || override === void 0 ? void 0 : override.onClick) === null || _a2 === void 0 ? void 0 : _a2.call(override);
});
var mergedMode = override.mode || mode;
var mergedSelectable = selectable !== null && selectable !== void 0 ? selectable : override.selectable;
var mergedInlineCollapsed = React__namespace.useMemo(function() {
if (siderCollapsed !== void 0) {
return siderCollapsed;
}
return inlineCollapsed;
}, [inlineCollapsed, siderCollapsed]);
var defaultMotions = {
horizontal: {
motionName: "".concat(rootPrefixCls, "-slide-up")
},
inline: collapseMotion$1,
other: {
motionName: "".concat(rootPrefixCls, "-zoom-big")
}
};
var prefixCls = getPrefixCls("menu", customizePrefixCls || override.prefixCls);
var menuClassName = classnames("".concat(prefixCls, "-").concat(theme), className);
var mergedExpandIcon;
if (typeof expandIcon === "function") {
mergedExpandIcon = expandIcon;
} else {
mergedExpandIcon = cloneElement(expandIcon || override.expandIcon, {
className: "".concat(prefixCls, "-submenu-expand-icon")
});
}
var contextValue = React__namespace.useMemo(function() {
return {
prefixCls,
inlineCollapsed: mergedInlineCollapsed || false,
antdMenuTheme: theme,
direction,
firstLevel: true,
disableMenuItemTitleTooltip: _internalDisableMenuItemTitleTooltip
};
}, [prefixCls, mergedInlineCollapsed, theme, direction, _internalDisableMenuItemTitleTooltip]);
return /* @__PURE__ */ jsx(OverrideContext.Provider, {
value: null,
children: /* @__PURE__ */ jsx(MenuContext$1.Provider, {
value: contextValue,
children: /* @__PURE__ */ jsx(ExportMenu, {
getPopupContainer,
overflowedIndicator: /* @__PURE__ */ jsx(EllipsisOutlined$1, {}),
overflowedIndicatorPopupClassName: "".concat(prefixCls, "-").concat(theme),
mode: mergedMode,
selectable: mergedSelectable,
onClick: onItemClick,
...passedProps,
inlineCollapsed: mergedInlineCollapsed,
className: menuClassName,
prefixCls,
direction,
defaultMotions,
expandIcon: mergedExpandIcon,
ref,
children: mergedChildren
})
})
});
});
var Menu = /* @__PURE__ */ function(_React$Component) {
_inherits(Menu2, _React$Component);
var _super = _createSuper(Menu2);
function Menu2() {
var _this2;
_classCallCheck(this, Menu2);
_this2 = _super.apply(this, arguments);
_this2.focus = function(options) {
var _a;
(_a = _this2.menu) === null || _a === void 0 ? void 0 : _a.focus(options);
};
return _this2;
}
_createClass(Menu2, [{
key: "render",
value: function render2() {
var _this2 = this;
return /* @__PURE__ */ jsx(SiderContext.Consumer, {
children: function(context2) {
return /* @__PURE__ */ jsx(InternalMenu, {
ref: function ref(node) {
_this2.menu = node;
},
..._this2.props,
...context2
});
}
});
}
}]);
return Menu2;
}(React__namespace.Component);
Menu.Divider = MenuDivider$1;
Menu.Item = MenuItem;
Menu.SubMenu = SubMenu;
Menu.ItemGroup = MenuItemGroup;
const Menu$1 = Menu;
var autoAdjustOverflow = {
adjustX: 1,
adjustY: 1
};
var targetOffset = [0, 0];
var placements$1 = {
topLeft: {
points: ["bl", "tl"],
overflow: autoAdjustOverflow,
offset: [0, -4],
targetOffset
},
topCenter: {
points: ["bc", "tc"],
overflow: autoAdjustOverflow,
offset: [0, -4],
targetOffset
},
topRight: {
points: ["br", "tr"],
overflow: autoAdjustOverflow,
offset: [0, -4],
targetOffset
},
bottomLeft: {
points: ["tl", "bl"],
overflow: autoAdjustOverflow,
offset: [0, 4],
targetOffset
},
bottomCenter: {
points: ["tc", "bc"],
overflow: autoAdjustOverflow,
offset: [0, 4],
targetOffset
},
bottomRight: {
points: ["tr", "br"],
overflow: autoAdjustOverflow,
offset: [0, 4],
targetOffset
}
};
var ESC = KeyCode.ESC, TAB = KeyCode.TAB;
function useAccessibility(_ref) {
var visible = _ref.visible, setTriggerVisible = _ref.setTriggerVisible, triggerRef = _ref.triggerRef, onVisibleChange = _ref.onVisibleChange, autoFocus = _ref.autoFocus;
var focusMenuRef = React__namespace.useRef(false);
var handleCloseMenuAndReturnFocus = function handleCloseMenuAndReturnFocus2() {
if (visible && triggerRef.current) {
var _triggerRef$current, _triggerRef$current$t, _triggerRef$current$t2, _triggerRef$current$t3;
(_triggerRef$current = triggerRef.current) === null || _triggerRef$current === void 0 ? void 0 : (_triggerRef$current$t = _triggerRef$current.triggerRef) === null || _triggerRef$current$t === void 0 ? void 0 : (_triggerRef$current$t2 = _triggerRef$current$t.current) === null || _triggerRef$current$t2 === void 0 ? void 0 : (_triggerRef$current$t3 = _triggerRef$current$t2.focus) === null || _triggerRef$current$t3 === void 0 ? void 0 : _triggerRef$current$t3.call(_triggerRef$current$t2);
setTriggerVisible(false);
if (typeof onVisibleChange === "function") {
onVisibleChange(false);
}
}
};
var focusMenu = function focusMenu2() {
var _triggerRef$current2, _triggerRef$current2$, _triggerRef$current2$2, _triggerRef$current2$3;
var elements = getFocusNodeList((_triggerRef$current2 = triggerRef.current) === null || _triggerRef$current2 === void 0 ? void 0 : (_triggerRef$current2$ = _triggerRef$current2.popupRef) === null || _triggerRef$current2$ === void 0 ? void 0 : (_triggerRef$current2$2 = _triggerRef$current2$.current) === null || _triggerRef$current2$2 === void 0 ? void 0 : (_triggerRef$current2$3 = _triggerRef$current2$2.getElement) === null || _triggerRef$current2$3 === void 0 ? void 0 : _triggerRef$current2$3.call(_triggerRef$current2$2));
var firstElement = elements[0];
if (firstElement === null || firstElement === void 0 ? void 0 : firstElement.focus) {
firstElement.focus();
focusMenuRef.current = true;
return true;
}
return false;
};
var handleKeyDown = function handleKeyDown2(event) {
switch (event.keyCode) {
case ESC:
handleCloseMenuAndReturnFocus();
break;
case TAB: {
var focusResult = false;
if (!focusMenuRef.current) {
focusResult = focusMenu();
}
if (focusResult) {
event.preventDefault();
} else {
handleCloseMenuAndReturnFocus();
}
break;
}
}
};
React__namespace.useEffect(function() {
if (visible) {
window.addEventListener("keydown", handleKeyDown);
if (autoFocus) {
wrapperRaf$1(focusMenu, 3);
}
return function() {
window.removeEventListener("keydown", handleKeyDown);
focusMenuRef.current = false;
};
}
return function() {
focusMenuRef.current = false;
};
}, [visible]);
}
var _excluded$r = ["arrow", "prefixCls", "transitionName", "animation", "align", "placement", "placements", "getPopupContainer", "showAction", "hideAction", "overlayClassName", "overlayStyle", "visible", "trigger", "autoFocus"];
function Dropdown$2(props, ref) {
var _props$arrow = props.arrow, arrow = _props$arrow === void 0 ? false : _props$arrow, _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-dropdown" : _props$prefixCls, transitionName2 = props.transitionName, animation = props.animation, align = props.align, _props$placement = props.placement, placement = _props$placement === void 0 ? "bottomLeft" : _props$placement, _props$placements = props.placements, placements2 = _props$placements === void 0 ? placements$1 : _props$placements, getPopupContainer = props.getPopupContainer, showAction = props.showAction, hideAction = props.hideAction, overlayClassName = props.overlayClassName, overlayStyle = props.overlayStyle, visible = props.visible, _props$trigger = props.trigger, trigger = _props$trigger === void 0 ? ["hover"] : _props$trigger, autoFocus = props.autoFocus, otherProps = _objectWithoutProperties$1(props, _excluded$r);
var _React$useState = React__namespace.useState(), _React$useState2 = _slicedToArray$e(_React$useState, 2), triggerVisible = _React$useState2[0], setTriggerVisible = _React$useState2[1];
var mergedVisible = "visible" in props ? visible : triggerVisible;
var triggerRef = React__namespace.useRef(null);
React__namespace.useImperativeHandle(ref, function() {
return triggerRef.current;
});
useAccessibility({
visible: mergedVisible,
setTriggerVisible,
triggerRef,
onVisibleChange: props.onVisibleChange,
autoFocus
});
var getOverlayElement = function getOverlayElement2() {
var overlay = props.overlay;
var overlayElement;
if (typeof overlay === "function") {
overlayElement = overlay();
} else {
overlayElement = overlay;
}
return overlayElement;
};
var onClick = function onClick2(e2) {
var onOverlayClick = props.onOverlayClick;
setTriggerVisible(false);
if (onOverlayClick) {
onOverlayClick(e2);
}
};
var onVisibleChange = function onVisibleChange2(newVisible) {
var onVisibleChangeProp = props.onVisibleChange;
setTriggerVisible(newVisible);
if (typeof onVisibleChangeProp === "function") {
onVisibleChangeProp(newVisible);
}
};
var getMenuElement = function getMenuElement2() {
var overlayElement = getOverlayElement();
return /* @__PURE__ */ jsxs(Fragment, {
children: [arrow && /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-arrow")
}), overlayElement]
});
};
var getMenuElementOrLambda = function getMenuElementOrLambda2() {
var overlay = props.overlay;
if (typeof overlay === "function") {
return getMenuElement;
}
return getMenuElement();
};
var getMinOverlayWidthMatchTrigger = function getMinOverlayWidthMatchTrigger2() {
var minOverlayWidthMatchTrigger = props.minOverlayWidthMatchTrigger, alignPoint2 = props.alignPoint;
if ("minOverlayWidthMatchTrigger" in props) {
return minOverlayWidthMatchTrigger;
}
return !alignPoint2;
};
var getOpenClassName = function getOpenClassName2() {
var openClassName = props.openClassName;
if (openClassName !== void 0) {
return openClassName;
}
return "".concat(prefixCls, "-open");
};
var renderChildren = function renderChildren2() {
var children = props.children;
var childrenProps = children.props ? children.props : {};
var childClassName = classnames(childrenProps.className, getOpenClassName());
return mergedVisible && children ? /* @__PURE__ */ React__namespace.cloneElement(children, {
className: childClassName
}) : children;
};
var triggerHideAction = hideAction;
if (!triggerHideAction && trigger.indexOf("contextMenu") !== -1) {
triggerHideAction = ["click"];
}
return /* @__PURE__ */ jsx(Trigger$1, {
..._objectSpread2$a(_objectSpread2$a({
builtinPlacements: placements2
}, otherProps), {}, {
prefixCls,
ref: triggerRef,
popupClassName: classnames(overlayClassName, _defineProperty$b({}, "".concat(prefixCls, "-show-arrow"), arrow)),
popupStyle: overlayStyle,
action: trigger,
showAction,
hideAction: triggerHideAction || [],
popupPlacement: placement,
popupAlign: align,
popupTransitionName: transitionName2,
popupAnimation: animation,
popupVisible: mergedVisible,
stretch: getMinOverlayWidthMatchTrigger() ? "minWidth" : "",
popup: getMenuElementOrLambda(),
onPopupVisibleChange: onVisibleChange,
onPopupClick: onClick,
getPopupContainer
}),
children: renderChildren()
});
}
const Dropdown$3 = /* @__PURE__ */ React__namespace.forwardRef(Dropdown$2);
var id$2 = 0;
var ids = {};
function wrapperRaf(callback) {
var delayFrames = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 1;
var myId = id$2++;
var restFrames = delayFrames;
function internalCallback() {
restFrames -= 1;
if (restFrames <= 0) {
callback();
delete ids[myId];
} else {
ids[myId] = wrapperRaf$1(internalCallback);
}
}
ids[myId] = wrapperRaf$1(internalCallback);
return myId;
}
wrapperRaf.cancel = function cancel(pid) {
if (pid === void 0)
return;
wrapperRaf$1.cancel(ids[pid]);
delete ids[pid];
};
wrapperRaf.ids = ids;
var styleForPseudo;
function isHidden(element) {
return !element || element.offsetParent === null || element.hidden;
}
function getValidateContainer(nodeRoot) {
if (nodeRoot instanceof Document) {
return nodeRoot.body;
}
return Array.from(nodeRoot.childNodes).find(function(ele) {
return (ele === null || ele === void 0 ? void 0 : ele.nodeType) === Node.ELEMENT_NODE;
});
}
function isNotGrey(color2) {
var match2 = (color2 || "").match(/rgba?\((\d*), (\d*), (\d*)(, [\d.]*)?\)/);
if (match2 && match2[1] && match2[2] && match2[3]) {
return !(match2[1] === match2[2] && match2[2] === match2[3]);
}
return true;
}
var Wave = /* @__PURE__ */ function(_React$Component) {
_inherits(Wave2, _React$Component);
var _super = _createSuper(Wave2);
function Wave2() {
var _this2;
_classCallCheck(this, Wave2);
_this2 = _super.apply(this, arguments);
_this2.containerRef = /* @__PURE__ */ React__namespace.createRef();
_this2.animationStart = false;
_this2.destroyed = false;
_this2.onClick = function(node, waveColor) {
var _a, _b;
var _this$props = _this2.props, insertExtraNode = _this$props.insertExtraNode, disabled = _this$props.disabled;
if (disabled || !node || isHidden(node) || node.className.includes("-leave")) {
return;
}
_this2.extraNode = document.createElement("div");
var _assertThisInitialize = _assertThisInitialized(_this2), extraNode = _assertThisInitialize.extraNode;
var getPrefixCls = _this2.context.getPrefixCls;
extraNode.className = "".concat(getPrefixCls(""), "-click-animating-node");
var attributeName = _this2.getAttributeName();
node.setAttribute(attributeName, "true");
if (waveColor && waveColor !== "#fff" && waveColor !== "#ffffff" && waveColor !== "rgb(255, 255, 255)" && waveColor !== "rgba(255, 255, 255, 1)" && isNotGrey(waveColor) && !/rgba\((?:\d*, ){3}0\)/.test(waveColor) && waveColor !== "transparent") {
extraNode.style.borderColor = waveColor;
var nodeRoot = ((_a = node.getRootNode) === null || _a === void 0 ? void 0 : _a.call(node)) || node.ownerDocument;
var nodeBody = (_b = getValidateContainer(nodeRoot)) !== null && _b !== void 0 ? _b : nodeRoot;
styleForPseudo = updateCSS("\n [".concat(getPrefixCls(""), "-click-animating-without-extra-node='true']::after, .").concat(getPrefixCls(""), "-click-animating-node {\n --antd-wave-shadow-color: ").concat(waveColor, ";\n }"), "antd-wave", {
csp: _this2.csp,
attachTo: nodeBody
});
}
if (insertExtraNode) {
node.appendChild(extraNode);
}
["transition", "animation"].forEach(function(name2) {
node.addEventListener("".concat(name2, "start"), _this2.onTransitionStart);
node.addEventListener("".concat(name2, "end"), _this2.onTransitionEnd);
});
};
_this2.onTransitionStart = function(e2) {
if (_this2.destroyed) {
return;
}
var node = _this2.containerRef.current;
if (!e2 || e2.target !== node || _this2.animationStart) {
return;
}
_this2.resetEffect(node);
};
_this2.onTransitionEnd = function(e2) {
if (!e2 || e2.animationName !== "fadeEffect") {
return;
}
_this2.resetEffect(e2.target);
};
_this2.bindAnimationEvent = function(node) {
if (!node || !node.getAttribute || node.getAttribute("disabled") || node.className.includes("disabled")) {
return;
}
var onClick = function onClick2(e2) {
if (e2.target.tagName === "INPUT" || isHidden(e2.target)) {
return;
}
_this2.resetEffect(node);
var waveColor = getComputedStyle(node).getPropertyValue("border-top-color") || getComputedStyle(node).getPropertyValue("border-color") || getComputedStyle(node).getPropertyValue("background-color");
_this2.clickWaveTimeoutId = window.setTimeout(function() {
return _this2.onClick(node, waveColor);
}, 0);
wrapperRaf.cancel(_this2.animationStartId);
_this2.animationStart = true;
_this2.animationStartId = wrapperRaf(function() {
_this2.animationStart = false;
}, 10);
};
node.addEventListener("click", onClick, true);
return {
cancel: function cancel() {
node.removeEventListener("click", onClick, true);
}
};
};
_this2.renderWave = function(_ref) {
var csp = _ref.csp;
var children = _this2.props.children;
_this2.csp = csp;
if (!/* @__PURE__ */ React__namespace.isValidElement(children))
return children;
var ref = _this2.containerRef;
if (supportRef(children)) {
ref = composeRef(children.ref, _this2.containerRef);
}
return cloneElement(children, {
ref
});
};
return _this2;
}
_createClass(Wave2, [{
key: "componentDidMount",
value: function componentDidMount() {
this.destroyed = false;
var node = this.containerRef.current;
if (!node || node.nodeType !== 1) {
return;
}
this.instance = this.bindAnimationEvent(node);
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
if (this.instance) {
this.instance.cancel();
}
if (this.clickWaveTimeoutId) {
clearTimeout(this.clickWaveTimeoutId);
}
this.destroyed = true;
}
}, {
key: "getAttributeName",
value: function getAttributeName() {
var getPrefixCls = this.context.getPrefixCls;
var insertExtraNode = this.props.insertExtraNode;
return insertExtraNode ? "".concat(getPrefixCls(""), "-click-animating") : "".concat(getPrefixCls(""), "-click-animating-without-extra-node");
}
}, {
key: "resetEffect",
value: function resetEffect(node) {
var _this2 = this;
if (!node || node === this.extraNode || !(node instanceof Element)) {
return;
}
var insertExtraNode = this.props.insertExtraNode;
var attributeName = this.getAttributeName();
node.setAttribute(attributeName, "false");
if (styleForPseudo) {
styleForPseudo.innerHTML = "";
}
if (insertExtraNode && this.extraNode && node.contains(this.extraNode)) {
node.removeChild(this.extraNode);
}
["transition", "animation"].forEach(function(name2) {
node.removeEventListener("".concat(name2, "start"), _this2.onTransitionStart);
node.removeEventListener("".concat(name2, "end"), _this2.onTransitionEnd);
});
}
}, {
key: "render",
value: function render2() {
return /* @__PURE__ */ jsx(ConfigConsumer, {
children: this.renderWave
});
}
}]);
return Wave2;
}(React__namespace.Component);
Wave.contextType = ConfigContext$1;
const Wave$1 = Wave;
var __rest$I = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var GroupSizeContext = /* @__PURE__ */ React__namespace.createContext(void 0);
var ButtonGroup = function ButtonGroup2(props) {
var _classNames;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var customizePrefixCls = props.prefixCls, size = props.size, className = props.className, others = __rest$I(props, ["prefixCls", "size", "className"]);
var prefixCls = getPrefixCls("btn-group", customizePrefixCls);
var sizeCls = "";
switch (size) {
case "large":
sizeCls = "lg";
break;
case "small":
sizeCls = "sm";
break;
}
var classes = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(sizeCls), sizeCls), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className);
return /* @__PURE__ */ jsx(GroupSizeContext.Provider, {
value: size,
children: /* @__PURE__ */ jsx("div", {
...others,
className: classes
})
});
};
const Group$5 = ButtonGroup;
var getCollapsedWidth = function getCollapsedWidth2() {
return {
width: 0,
opacity: 0,
transform: "scale(0)"
};
};
var getRealWidth = function getRealWidth2(node) {
return {
width: node.scrollWidth,
opacity: 1,
transform: "scale(1)"
};
};
var LoadingIcon = function LoadingIcon2(_ref) {
var prefixCls = _ref.prefixCls, loading = _ref.loading, existIcon = _ref.existIcon;
var visible = !!loading;
if (existIcon) {
return /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-loading-icon"),
children: /* @__PURE__ */ jsx(LoadingOutlined$1, {})
});
}
return /* @__PURE__ */ jsx(CSSMotion, {
visible,
motionName: "".concat(prefixCls, "-loading-icon-motion"),
removeOnLeave: true,
onAppearStart: getCollapsedWidth,
onAppearActive: getRealWidth,
onEnterStart: getCollapsedWidth,
onEnterActive: getRealWidth,
onLeaveStart: getRealWidth,
onLeaveActive: getCollapsedWidth,
children: function(_ref2, ref) {
var className = _ref2.className, style2 = _ref2.style;
return /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-loading-icon"),
style: style2,
ref,
children: /* @__PURE__ */ jsx(LoadingOutlined$1, {
className
})
});
}
});
};
const LoadingIcon$1 = LoadingIcon;
var __rest$H = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var rxTwoCNChar = /^[\u4e00-\u9fa5]{2}$/;
var isTwoCNChar = rxTwoCNChar.test.bind(rxTwoCNChar);
function isString$1(str) {
return typeof str === "string";
}
function isUnBorderedButtonType(type2) {
return type2 === "text" || type2 === "link";
}
function insertSpace(child, needInserted) {
if (child === null || child === void 0) {
return;
}
var SPACE = needInserted ? " " : "";
if (typeof child !== "string" && typeof child !== "number" && isString$1(child.type) && isTwoCNChar(child.props.children)) {
return cloneElement(child, {
children: child.props.children.split("").join(SPACE)
});
}
if (typeof child === "string") {
return isTwoCNChar(child) ? /* @__PURE__ */ jsx("span", {
children: child.split("").join(SPACE)
}) : /* @__PURE__ */ jsx("span", {
children: child
});
}
if (isFragment(child)) {
return /* @__PURE__ */ jsx("span", {
children: child
});
}
return child;
}
function spaceChildren(children, needInserted) {
var isPrevChildPure = false;
var childList = [];
React__namespace.Children.forEach(children, function(child) {
var type2 = _typeof$q(child);
var isCurrentChildPure = type2 === "string" || type2 === "number";
if (isPrevChildPure && isCurrentChildPure) {
var lastIndex = childList.length - 1;
var lastChild = childList[lastIndex];
childList[lastIndex] = "".concat(lastChild).concat(child);
} else {
childList.push(child);
}
isPrevChildPure = isCurrentChildPure;
});
return React__namespace.Children.map(childList, function(child) {
return insertSpace(child, needInserted);
});
}
tuple$1("default", "primary", "ghost", "dashed", "link", "text");
tuple$1("default", "circle", "round");
tuple$1("submit", "button", "reset");
function convertLegacyProps(type2) {
if (type2 === "danger") {
return {
danger: true
};
}
return {
type: type2
};
}
var InternalButton = function InternalButton2(props, ref) {
var _classNames;
var _props$loading = props.loading, loading = _props$loading === void 0 ? false : _props$loading, customizePrefixCls = props.prefixCls, _props$type = props.type, type2 = _props$type === void 0 ? "default" : _props$type, danger = props.danger, _props$shape = props.shape, shape = _props$shape === void 0 ? "default" : _props$shape, customizeSize = props.size, customDisabled = props.disabled, className = props.className, children = props.children, icon = props.icon, _props$ghost = props.ghost, ghost = _props$ghost === void 0 ? false : _props$ghost, _props$block = props.block, block = _props$block === void 0 ? false : _props$block, _props$htmlType = props.htmlType, htmlType = _props$htmlType === void 0 ? "button" : _props$htmlType, rest = __rest$H(props, ["loading", "prefixCls", "type", "danger", "shape", "size", "disabled", "className", "children", "icon", "ghost", "block", "htmlType"]);
var size = React__namespace.useContext(SizeContext$1);
var disabled = React__namespace.useContext(DisabledContext$1);
var mergedDisabled = customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled;
var groupSize = React__namespace.useContext(GroupSizeContext);
var _React$useState = React__namespace.useState(!!loading), _React$useState2 = _slicedToArray$e(_React$useState, 2), innerLoading = _React$useState2[0], setLoading = _React$useState2[1];
var _React$useState3 = React__namespace.useState(false), _React$useState4 = _slicedToArray$e(_React$useState3, 2), hasTwoCNChar = _React$useState4[0], setHasTwoCNChar = _React$useState4[1];
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, autoInsertSpaceInButton = _React$useContext.autoInsertSpaceInButton, direction = _React$useContext.direction;
var buttonRef = ref || /* @__PURE__ */ React__namespace.createRef();
var isNeedInserted = function isNeedInserted2() {
return React__namespace.Children.count(children) === 1 && !icon && !isUnBorderedButtonType(type2);
};
var fixTwoCNChar = function fixTwoCNChar2() {
if (!buttonRef || !buttonRef.current || autoInsertSpaceInButton === false) {
return;
}
var buttonText = buttonRef.current.textContent;
if (isNeedInserted() && isTwoCNChar(buttonText)) {
if (!hasTwoCNChar) {
setHasTwoCNChar(true);
}
} else if (hasTwoCNChar) {
setHasTwoCNChar(false);
}
};
var loadingOrDelay = typeof loading === "boolean" ? loading : (loading === null || loading === void 0 ? void 0 : loading.delay) || true;
React__namespace.useEffect(function() {
var delayTimer = null;
if (typeof loadingOrDelay === "number") {
delayTimer = window.setTimeout(function() {
delayTimer = null;
setLoading(loadingOrDelay);
}, loadingOrDelay);
} else {
setLoading(loadingOrDelay);
}
return function() {
if (delayTimer) {
window.clearTimeout(delayTimer);
delayTimer = null;
}
};
}, [loadingOrDelay]);
React__namespace.useEffect(fixTwoCNChar, [buttonRef]);
var handleClick = function handleClick2(e2) {
var onClick = props.onClick;
if (innerLoading || mergedDisabled) {
e2.preventDefault();
return;
}
onClick === null || onClick === void 0 ? void 0 : onClick(e2);
};
var prefixCls = getPrefixCls("btn", customizePrefixCls);
var autoInsertSpace = autoInsertSpaceInButton !== false;
var _useCompactItemContex = useCompactItemContext(prefixCls, direction), compactSize = _useCompactItemContex.compactSize, compactItemClassnames = _useCompactItemContex.compactItemClassnames;
var sizeClassNameMap = {
large: "lg",
small: "sm",
middle: void 0
};
var sizeFullname = compactSize || groupSize || customizeSize || size;
var sizeCls = sizeFullname ? sizeClassNameMap[sizeFullname] || "" : "";
var iconType = innerLoading ? "loading" : icon;
var linkButtonRestProps = omit(rest, ["navigate"]);
var classes = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(shape), shape !== "default" && shape), _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(type2), type2), _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(sizeCls), sizeCls), _defineProperty$b(_classNames, "".concat(prefixCls, "-icon-only"), !children && children !== 0 && !!iconType), _defineProperty$b(_classNames, "".concat(prefixCls, "-background-ghost"), ghost && !isUnBorderedButtonType(type2)), _defineProperty$b(_classNames, "".concat(prefixCls, "-loading"), innerLoading), _defineProperty$b(_classNames, "".concat(prefixCls, "-two-chinese-chars"), hasTwoCNChar && autoInsertSpace && !innerLoading), _defineProperty$b(_classNames, "".concat(prefixCls, "-block"), block), _defineProperty$b(_classNames, "".concat(prefixCls, "-dangerous"), !!danger), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-disabled"), linkButtonRestProps.href !== void 0 && mergedDisabled), _classNames), compactItemClassnames, className);
var iconNode = icon && !innerLoading ? icon : /* @__PURE__ */ jsx(LoadingIcon$1, {
existIcon: !!icon,
prefixCls,
loading: !!innerLoading
});
var kids = children || children === 0 ? spaceChildren(children, isNeedInserted() && autoInsertSpace) : null;
if (linkButtonRestProps.href !== void 0) {
return /* @__PURE__ */ jsxs("a", {
...linkButtonRestProps,
className: classes,
onClick: handleClick,
ref: buttonRef,
children: [iconNode, kids]
});
}
var buttonNode = /* @__PURE__ */ jsxs("button", {
...rest,
type: htmlType,
className: classes,
onClick: handleClick,
disabled: mergedDisabled,
ref: buttonRef,
children: [iconNode, kids]
});
if (isUnBorderedButtonType(type2)) {
return buttonNode;
}
return /* @__PURE__ */ jsx(Wave$1, {
disabled: !!innerLoading,
children: buttonNode
});
};
var Button$1 = /* @__PURE__ */ React__namespace.forwardRef(InternalButton);
Button$1.Group = Group$5;
Button$1.__ANT_BUTTON = true;
const Button$2 = Button$1;
var isStyleNameSupport = function isStyleNameSupport2(styleName) {
if (canUseDom$1() && window.document.documentElement) {
var styleNameList = Array.isArray(styleName) ? styleName : [styleName];
var documentElement = window.document.documentElement;
return styleNameList.some(function(name2) {
return name2 in documentElement.style;
});
}
return false;
};
var isStyleValueSupport = function isStyleValueSupport2(styleName, value) {
if (!isStyleNameSupport(styleName)) {
return false;
}
var ele = document.createElement("div");
var origin = ele.style[styleName];
ele.style[styleName] = value;
return ele.style[styleName] !== origin;
};
function isStyleSupport(styleName, styleValue) {
if (!Array.isArray(styleName) && styleValue !== void 0) {
return isStyleValueSupport(styleName, styleValue);
}
return isStyleNameSupport(styleName);
}
var canUseDocElement = function canUseDocElement2() {
return canUseDom$1() && window.document.documentElement;
};
var flexGapSupported;
var detectFlexGapSupported = function detectFlexGapSupported2() {
if (!canUseDocElement()) {
return false;
}
if (flexGapSupported !== void 0) {
return flexGapSupported;
}
var flex = document.createElement("div");
flex.style.display = "flex";
flex.style.flexDirection = "column";
flex.style.rowGap = "1px";
flex.appendChild(document.createElement("div"));
flex.appendChild(document.createElement("div"));
document.body.appendChild(flex);
flexGapSupported = flex.scrollHeight === 1;
document.body.removeChild(flex);
return flexGapSupported;
};
const useFlexGapSupport = function() {
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), flexible = _React$useState2[0], setFlexible = _React$useState2[1];
React__namespace.useEffect(function() {
setFlexible(detectFlexGapSupported());
}, []);
return flexible;
};
function Item$1(_ref) {
var className = _ref.className, direction = _ref.direction, index2 = _ref.index, marginDirection = _ref.marginDirection, children = _ref.children, split = _ref.split, wrap2 = _ref.wrap;
var _React$useContext = React__namespace.useContext(SpaceContext), horizontalSize = _React$useContext.horizontalSize, verticalSize = _React$useContext.verticalSize, latestIndex = _React$useContext.latestIndex, supportFlexGap = _React$useContext.supportFlexGap;
var style2 = {};
if (!supportFlexGap) {
if (direction === "vertical") {
if (index2 < latestIndex) {
style2 = {
marginBottom: horizontalSize / (split ? 2 : 1)
};
}
} else {
style2 = _extends$3(_extends$3({}, index2 < latestIndex && _defineProperty$b({}, marginDirection, horizontalSize / (split ? 2 : 1))), wrap2 && {
paddingBottom: verticalSize
});
}
}
if (children === null || children === void 0) {
return null;
}
return /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx("div", {
className,
style: style2,
children
}), index2 < latestIndex && split && /* @__PURE__ */ jsx("span", {
className: "".concat(className, "-split"),
style: style2,
children: split
})]
});
}
var __rest$G = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var SpaceContext = /* @__PURE__ */ React__namespace.createContext({
latestIndex: 0,
horizontalSize: 0,
verticalSize: 0,
supportFlexGap: false
});
var spaceSize = {
small: 8,
middle: 16,
large: 24
};
function getNumberSize(size) {
return typeof size === "string" ? spaceSize[size] : size || 0;
}
var Space = function Space2(props) {
var _classNames;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, space = _React$useContext.space, directionConfig = _React$useContext.direction;
var _props$size = props.size, size = _props$size === void 0 ? (space === null || space === void 0 ? void 0 : space.size) || "small" : _props$size, align = props.align, className = props.className, children = props.children, _props$direction = props.direction, direction = _props$direction === void 0 ? "horizontal" : _props$direction, customizePrefixCls = props.prefixCls, split = props.split, style2 = props.style, _props$wrap = props.wrap, wrap2 = _props$wrap === void 0 ? false : _props$wrap, otherProps = __rest$G(props, ["size", "align", "className", "children", "direction", "prefixCls", "split", "style", "wrap"]);
var supportFlexGap = useFlexGapSupport();
var _React$useMemo = React__namespace.useMemo(function() {
return (Array.isArray(size) ? size : [size, size]).map(function(item) {
return getNumberSize(item);
});
}, [size]), _React$useMemo2 = _slicedToArray$e(_React$useMemo, 2), horizontalSize = _React$useMemo2[0], verticalSize = _React$useMemo2[1];
var childNodes = toArray$9(children, {
keepEmpty: true
});
var mergedAlign = align === void 0 && direction === "horizontal" ? "center" : align;
var prefixCls = getPrefixCls("space", customizePrefixCls);
var cn = classnames(prefixCls, "".concat(prefixCls, "-").concat(direction), (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), directionConfig === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-align-").concat(mergedAlign), mergedAlign), _classNames), className);
var itemClassName = "".concat(prefixCls, "-item");
var marginDirection = directionConfig === "rtl" ? "marginLeft" : "marginRight";
var latestIndex = 0;
var nodes = childNodes.map(function(child, i2) {
if (child !== null && child !== void 0) {
latestIndex = i2;
}
var key2 = child && child.key || "".concat(itemClassName, "-").concat(i2);
return /* @__PURE__ */ jsx(Item$1, {
className: itemClassName,
direction,
index: i2,
marginDirection,
split,
wrap: wrap2,
children: child
}, key2);
});
var spaceContext = React__namespace.useMemo(function() {
return {
horizontalSize,
verticalSize,
latestIndex,
supportFlexGap
};
}, [horizontalSize, verticalSize, latestIndex, supportFlexGap]);
if (childNodes.length === 0) {
return null;
}
var gapStyle = {};
if (wrap2) {
gapStyle.flexWrap = "wrap";
if (!supportFlexGap) {
gapStyle.marginBottom = -verticalSize;
}
}
if (supportFlexGap) {
gapStyle.columnGap = horizontalSize;
gapStyle.rowGap = verticalSize;
}
return /* @__PURE__ */ jsx("div", {
className: cn,
style: _extends$3(_extends$3({}, gapStyle), style2),
...otherProps,
children: /* @__PURE__ */ jsx(SpaceContext.Provider, {
value: spaceContext,
children: nodes
})
});
};
var CompoundedSpace = Space;
CompoundedSpace.Compact = Compact;
const _Space = CompoundedSpace;
var __rest$F = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var DropdownButton = function DropdownButton2(props) {
var _React$useContext = React__namespace.useContext(ConfigContext$1), getContextPopupContainer = _React$useContext.getPopupContainer, getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var customizePrefixCls = props.prefixCls, _props$type = props.type, type2 = _props$type === void 0 ? "default" : _props$type, danger = props.danger, disabled = props.disabled, loading = props.loading, onClick = props.onClick, htmlType = props.htmlType, children = props.children, className = props.className, menu = props.menu, arrow = props.arrow, autoFocus = props.autoFocus, overlay = props.overlay, trigger = props.trigger, align = props.align, visible = props.visible, open = props.open, onVisibleChange = props.onVisibleChange, onOpenChange = props.onOpenChange, placement = props.placement, getPopupContainer = props.getPopupContainer, href = props.href, _props$icon = props.icon, icon = _props$icon === void 0 ? /* @__PURE__ */ jsx(EllipsisOutlined$1, {}) : _props$icon, title = props.title, _props$buttonsRender = props.buttonsRender, buttonsRender = _props$buttonsRender === void 0 ? function(buttons) {
return buttons;
} : _props$buttonsRender, mouseEnterDelay = props.mouseEnterDelay, mouseLeaveDelay = props.mouseLeaveDelay, overlayClassName = props.overlayClassName, overlayStyle = props.overlayStyle, destroyPopupOnHide = props.destroyPopupOnHide, restProps = __rest$F(props, ["prefixCls", "type", "danger", "disabled", "loading", "onClick", "htmlType", "children", "className", "menu", "arrow", "autoFocus", "overlay", "trigger", "align", "visible", "open", "onVisibleChange", "onOpenChange", "placement", "getPopupContainer", "href", "icon", "title", "buttonsRender", "mouseEnterDelay", "mouseLeaveDelay", "overlayClassName", "overlayStyle", "destroyPopupOnHide"]);
var prefixCls = getPrefixCls("dropdown-button", customizePrefixCls);
var dropdownProps = {
menu,
arrow,
autoFocus,
align,
disabled,
trigger: disabled ? [] : trigger,
onOpenChange: onOpenChange || onVisibleChange,
getPopupContainer: getPopupContainer || getContextPopupContainer,
mouseEnterDelay,
mouseLeaveDelay,
overlayClassName,
overlayStyle,
destroyPopupOnHide
};
var _useCompactItemContex = useCompactItemContext(prefixCls, direction), compactSize = _useCompactItemContex.compactSize, compactItemClassnames = _useCompactItemContex.compactItemClassnames;
var classes = classnames(prefixCls, compactItemClassnames, className);
if ("overlay" in props) {
dropdownProps.overlay = overlay;
}
if ("open" in props) {
dropdownProps.open = open;
} else if ("visible" in props) {
dropdownProps.open = visible;
}
if ("placement" in props) {
dropdownProps.placement = placement;
} else {
dropdownProps.placement = direction === "rtl" ? "bottomLeft" : "bottomRight";
}
var leftButton = /* @__PURE__ */ jsx(Button$2, {
type: type2,
danger,
disabled,
loading,
onClick,
htmlType,
href,
title,
children
});
var rightButton = /* @__PURE__ */ jsx(Button$2, {
type: type2,
danger,
icon
});
var _buttonsRender = buttonsRender([leftButton, rightButton]), _buttonsRender2 = _slicedToArray$e(_buttonsRender, 2), leftButtonToRender = _buttonsRender2[0], rightButtonToRender = _buttonsRender2[1];
return /* @__PURE__ */ jsxs(_Space.Compact, {
className: classes,
size: compactSize,
block: true,
...restProps,
children: [leftButtonToRender, /* @__PURE__ */ jsx(Dropdown$1, {
...dropdownProps,
children: rightButtonToRender
})]
});
};
DropdownButton.__ANT_BUTTON = true;
const DropdownButton$1 = DropdownButton;
tuple$1("topLeft", "topCenter", "topRight", "bottomLeft", "bottomCenter", "bottomRight", "top", "bottom");
var Dropdown = function Dropdown2(props) {
var _React$useContext = React__namespace.useContext(ConfigContext$1), getContextPopupContainer = _React$useContext.getPopupContainer, getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var getTransitionName2 = function getTransitionName3() {
var rootPrefixCls = getPrefixCls();
var _props$placement = props.placement, placement = _props$placement === void 0 ? "" : _props$placement, transitionName2 = props.transitionName;
if (transitionName2 !== void 0) {
return transitionName2;
}
if (placement.includes("top")) {
return "".concat(rootPrefixCls, "-slide-down");
}
return "".concat(rootPrefixCls, "-slide-up");
};
var getPlacement = function getPlacement2() {
var placement = props.placement;
if (!placement) {
return direction === "rtl" ? "bottomRight" : "bottomLeft";
}
if (placement.includes("Center")) {
var newPlacement = placement.slice(0, placement.indexOf("Center"));
return newPlacement;
}
return placement;
};
var menu = props.menu, arrow = props.arrow, customizePrefixCls = props.prefixCls, children = props.children, trigger = props.trigger, disabled = props.disabled, dropdownRender = props.dropdownRender, getPopupContainer = props.getPopupContainer, overlayClassName = props.overlayClassName, visible = props.visible, open = props.open, onVisibleChange = props.onVisibleChange, onOpenChange = props.onOpenChange, _props$mouseEnterDela = props.mouseEnterDelay, mouseEnterDelay = _props$mouseEnterDela === void 0 ? 0.15 : _props$mouseEnterDela, _props$mouseLeaveDela = props.mouseLeaveDelay, mouseLeaveDelay = _props$mouseLeaveDela === void 0 ? 0.1 : _props$mouseLeaveDela, _props$autoAdjustOver = props.autoAdjustOverflow, autoAdjustOverflow2 = _props$autoAdjustOver === void 0 ? true : _props$autoAdjustOver;
var prefixCls = getPrefixCls("dropdown", customizePrefixCls);
var child = React__namespace.Children.only(children);
var dropdownTrigger = cloneElement(child, {
className: classnames("".concat(prefixCls, "-trigger"), _defineProperty$b({}, "".concat(prefixCls, "-rtl"), direction === "rtl"), child.props.className),
disabled
});
var triggerActions = disabled ? [] : trigger;
var alignPoint2;
if (triggerActions && triggerActions.includes("contextMenu")) {
alignPoint2 = true;
}
var _useMergedState = useMergedState(false, {
value: open !== void 0 ? open : visible
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), mergedOpen = _useMergedState2[0], setOpen = _useMergedState2[1];
var onInnerOpenChange = useEvent(function(nextOpen) {
onVisibleChange === null || onVisibleChange === void 0 ? void 0 : onVisibleChange(nextOpen);
onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(nextOpen);
setOpen(nextOpen);
});
var overlayClassNameCustomized = classnames(overlayClassName, _defineProperty$b({}, "".concat(prefixCls, "-rtl"), direction === "rtl"));
var builtinPlacements = getPlacements({
arrowPointAtCenter: _typeof$q(arrow) === "object" && arrow.pointAtCenter,
autoAdjustOverflow: autoAdjustOverflow2
});
var onMenuClick = React__namespace.useCallback(function() {
setOpen(false);
}, []);
var renderOverlay = function renderOverlay2() {
var overlay = props.overlay;
var overlayNode;
if (menu === null || menu === void 0 ? void 0 : menu.items) {
overlayNode = /* @__PURE__ */ jsx(Menu$1, {
...menu
});
} else if (typeof overlay === "function") {
overlayNode = overlay();
} else {
overlayNode = overlay;
}
if (dropdownRender) {
overlayNode = dropdownRender(overlayNode);
}
overlayNode = React__namespace.Children.only(typeof overlayNode === "string" ? /* @__PURE__ */ jsx("span", {
children: overlayNode
}) : overlayNode);
return /* @__PURE__ */ jsx(OverrideProvider, {
prefixCls: "".concat(prefixCls, "-menu"),
expandIcon: /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-menu-submenu-arrow"),
children: /* @__PURE__ */ jsx(RightOutlined$1, {
className: "".concat(prefixCls, "-menu-submenu-arrow-icon")
})
}),
mode: "vertical",
selectable: false,
onClick: onMenuClick,
validator: function validator2(_ref3) {
_ref3.mode;
},
children: /* @__PURE__ */ jsx(NoCompactStyle, {
children: overlayNode
})
});
};
return /* @__PURE__ */ jsx(Dropdown$3, {
alignPoint: alignPoint2,
...props,
mouseEnterDelay,
mouseLeaveDelay,
visible: mergedOpen,
builtinPlacements,
arrow: !!arrow,
overlayClassName: overlayClassNameCustomized,
prefixCls,
getPopupContainer: getPopupContainer || getContextPopupContainer,
transitionName: getTransitionName2(),
trigger: triggerActions,
overlay: renderOverlay,
placement: getPlacement(),
onVisibleChange: onInnerOpenChange,
children: dropdownTrigger
});
};
Dropdown.Button = DropdownButton$1;
const Dropdown$1 = Dropdown;
var freeGlobal$3 = typeof commonjsGlobal == "object" && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;
var _freeGlobal = freeGlobal$3;
var freeGlobal$2 = _freeGlobal;
var freeSelf$1 = typeof self == "object" && self && self.Object === Object && self;
var root$b = freeGlobal$2 || freeSelf$1 || Function("return this")();
var _root = root$b;
var root$a = _root;
var Symbol$7 = root$a.Symbol;
var _Symbol = Symbol$7;
var isArray$8 = Array.isArray;
var isArray_1 = isArray$8;
var Symbol$6 = _Symbol;
var objectProto$r = Object.prototype;
var hasOwnProperty$p = objectProto$r.hasOwnProperty;
var nativeObjectToString$3 = objectProto$r.toString;
var symToStringTag$3 = Symbol$6 ? Symbol$6.toStringTag : void 0;
function getRawTag$2(value) {
var isOwn = hasOwnProperty$p.call(value, symToStringTag$3), tag = value[symToStringTag$3];
try {
value[symToStringTag$3] = void 0;
var unmasked = true;
} catch (e2) {
}
var result = nativeObjectToString$3.call(value);
if (unmasked) {
if (isOwn) {
value[symToStringTag$3] = tag;
} else {
delete value[symToStringTag$3];
}
}
return result;
}
var _getRawTag = getRawTag$2;
var objectProto$q = Object.prototype;
var nativeObjectToString$2 = objectProto$q.toString;
function objectToString$2(value) {
return nativeObjectToString$2.call(value);
}
var _objectToString = objectToString$2;
var Symbol$5 = _Symbol, getRawTag$1 = _getRawTag, objectToString$1 = _objectToString;
var nullTag$1 = "[object Null]", undefinedTag$1 = "[object Undefined]";
var symToStringTag$2 = Symbol$5 ? Symbol$5.toStringTag : void 0;
function baseGetTag$6(value) {
if (value == null) {
return value === void 0 ? undefinedTag$1 : nullTag$1;
}
return symToStringTag$2 && symToStringTag$2 in Object(value) ? getRawTag$1(value) : objectToString$1(value);
}
var _baseGetTag = baseGetTag$6;
function isObjectLike$6(value) {
return value != null && typeof value == "object";
}
var isObjectLike_1 = isObjectLike$6;
var baseGetTag$5 = _baseGetTag, isObjectLike$5 = isObjectLike_1;
var symbolTag$5 = "[object Symbol]";
function isSymbol$3(value) {
return typeof value == "symbol" || isObjectLike$5(value) && baseGetTag$5(value) == symbolTag$5;
}
var isSymbol_1 = isSymbol$3;
var reWhitespace = /\s/;
function trimmedEndIndex$1(string2) {
var index2 = string2.length;
while (index2-- && reWhitespace.test(string2.charAt(index2))) {
}
return index2;
}
var _trimmedEndIndex = trimmedEndIndex$1;
var trimmedEndIndex = _trimmedEndIndex;
var reTrimStart = /^\s+/;
function baseTrim$1(string2) {
return string2 ? string2.slice(0, trimmedEndIndex(string2) + 1).replace(reTrimStart, "") : string2;
}
var _baseTrim = baseTrim$1;
function isObject$b(value) {
var type2 = typeof value;
return value != null && (type2 == "object" || type2 == "function");
}
var isObject_1 = isObject$b;
var baseTrim = _baseTrim, isObject$a = isObject_1, isSymbol$2 = isSymbol_1;
var NAN = 0 / 0;
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
var reIsBinary = /^0b[01]+$/i;
var reIsOctal = /^0o[0-7]+$/i;
var freeParseInt = parseInt;
function toNumber$1(value) {
if (typeof value == "number") {
return value;
}
if (isSymbol$2(value)) {
return NAN;
}
if (isObject$a(value)) {
var other = typeof value.valueOf == "function" ? value.valueOf() : value;
value = isObject$a(other) ? other + "" : other;
}
if (typeof value != "string") {
return value === 0 ? value : +value;
}
value = baseTrim(value);
var isBinary = reIsBinary.test(value);
return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
}
var toNumber_1 = toNumber$1;
var PanelContext = /* @__PURE__ */ React__namespace.createContext({});
var HIDDEN_STYLE$2 = {
visibility: "hidden"
};
function Header$1(_ref) {
var prefixCls = _ref.prefixCls, _ref$prevIcon = _ref.prevIcon, prevIcon = _ref$prevIcon === void 0 ? "\u2039" : _ref$prevIcon, _ref$nextIcon = _ref.nextIcon, nextIcon = _ref$nextIcon === void 0 ? "\u203A" : _ref$nextIcon, _ref$superPrevIcon = _ref.superPrevIcon, superPrevIcon = _ref$superPrevIcon === void 0 ? "\xAB" : _ref$superPrevIcon, _ref$superNextIcon = _ref.superNextIcon, superNextIcon = _ref$superNextIcon === void 0 ? "\xBB" : _ref$superNextIcon, onSuperPrev = _ref.onSuperPrev, onSuperNext = _ref.onSuperNext, onPrev = _ref.onPrev, onNext = _ref.onNext, children = _ref.children;
var _React$useContext = React__namespace.useContext(PanelContext), hideNextBtn = _React$useContext.hideNextBtn, hidePrevBtn = _React$useContext.hidePrevBtn;
return /* @__PURE__ */ jsxs("div", {
className: prefixCls,
children: [onSuperPrev && /* @__PURE__ */ jsx("button", {
type: "button",
onClick: onSuperPrev,
tabIndex: -1,
className: "".concat(prefixCls, "-super-prev-btn"),
style: hidePrevBtn ? HIDDEN_STYLE$2 : {},
children: superPrevIcon
}), onPrev && /* @__PURE__ */ jsx("button", {
type: "button",
onClick: onPrev,
tabIndex: -1,
className: "".concat(prefixCls, "-prev-btn"),
style: hidePrevBtn ? HIDDEN_STYLE$2 : {},
children: prevIcon
}), /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-view"),
children
}), onNext && /* @__PURE__ */ jsx("button", {
type: "button",
onClick: onNext,
tabIndex: -1,
className: "".concat(prefixCls, "-next-btn"),
style: hideNextBtn ? HIDDEN_STYLE$2 : {},
children: nextIcon
}), onSuperNext && /* @__PURE__ */ jsx("button", {
type: "button",
onClick: onSuperNext,
tabIndex: -1,
className: "".concat(prefixCls, "-super-next-btn"),
style: hideNextBtn ? HIDDEN_STYLE$2 : {},
children: superNextIcon
})]
});
}
function DecadeHeader(props) {
var prefixCls = props.prefixCls, generateConfig2 = props.generateConfig, viewDate = props.viewDate, onPrevDecades = props.onPrevDecades, onNextDecades = props.onNextDecades;
var _React$useContext = React__namespace.useContext(PanelContext), hideHeader = _React$useContext.hideHeader;
if (hideHeader) {
return null;
}
var headerPrefixCls = "".concat(prefixCls, "-header");
var yearNumber = generateConfig2.getYear(viewDate);
var startYear = Math.floor(yearNumber / DECADE_DISTANCE_COUNT) * DECADE_DISTANCE_COUNT;
var endYear = startYear + DECADE_DISTANCE_COUNT - 1;
return /* @__PURE__ */ jsxs(Header$1, {
...props,
prefixCls: headerPrefixCls,
onSuperPrev: onPrevDecades,
onSuperNext: onNextDecades,
children: [startYear, "-", endYear]
});
}
function setTime(generateConfig2, date2, hour, minute, second) {
var nextTime = generateConfig2.setHour(date2, hour);
nextTime = generateConfig2.setMinute(nextTime, minute);
nextTime = generateConfig2.setSecond(nextTime, second);
return nextTime;
}
function setDateTime(generateConfig2, date2, defaultDate) {
if (!defaultDate) {
return date2;
}
var newDate = date2;
newDate = generateConfig2.setHour(newDate, generateConfig2.getHour(defaultDate));
newDate = generateConfig2.setMinute(newDate, generateConfig2.getMinute(defaultDate));
newDate = generateConfig2.setSecond(newDate, generateConfig2.getSecond(defaultDate));
return newDate;
}
function getLowerBoundTime(hour, minute, second, hourStep, minuteStep, secondStep) {
var lowerBoundHour = Math.floor(hour / hourStep) * hourStep;
if (lowerBoundHour < hour) {
return [lowerBoundHour, 60 - minuteStep, 60 - secondStep];
}
var lowerBoundMinute = Math.floor(minute / minuteStep) * minuteStep;
if (lowerBoundMinute < minute) {
return [lowerBoundHour, lowerBoundMinute, 60 - secondStep];
}
var lowerBoundSecond = Math.floor(second / secondStep) * secondStep;
return [lowerBoundHour, lowerBoundMinute, lowerBoundSecond];
}
function getLastDay(generateConfig2, date2) {
var year = generateConfig2.getYear(date2);
var month = generateConfig2.getMonth(date2) + 1;
var endDate = generateConfig2.getEndDate(generateConfig2.getFixedDate("".concat(year, "-").concat(month, "-01")));
var lastDay = generateConfig2.getDate(endDate);
var monthShow = month < 10 ? "0".concat(month) : "".concat(month);
return "".concat(year, "-").concat(monthShow, "-").concat(lastDay);
}
function PanelBody(_ref) {
var prefixCls = _ref.prefixCls, disabledDate = _ref.disabledDate, onSelect = _ref.onSelect, picker = _ref.picker, rowNum = _ref.rowNum, colNum = _ref.colNum, prefixColumn = _ref.prefixColumn, rowClassName = _ref.rowClassName, baseDate = _ref.baseDate, getCellClassName = _ref.getCellClassName, getCellText = _ref.getCellText, getCellNode = _ref.getCellNode, getCellDate = _ref.getCellDate, generateConfig2 = _ref.generateConfig, titleCell = _ref.titleCell, headerCells = _ref.headerCells;
var _React$useContext = React__namespace.useContext(PanelContext), onDateMouseEnter = _React$useContext.onDateMouseEnter, onDateMouseLeave = _React$useContext.onDateMouseLeave, mode = _React$useContext.mode;
var cellPrefixCls = "".concat(prefixCls, "-cell");
var rows = [];
for (var i2 = 0; i2 < rowNum; i2 += 1) {
var row = [];
var rowStartDate = void 0;
var _loop = function _loop2() {
var _objectSpread22;
var offset2 = i2 * colNum + j2;
var currentDate = getCellDate(baseDate, offset2);
var disabled = getCellDateDisabled({
cellDate: currentDate,
mode,
disabledDate,
generateConfig: generateConfig2
});
if (j2 === 0) {
rowStartDate = currentDate;
if (prefixColumn) {
row.push(prefixColumn(rowStartDate));
}
}
var title = titleCell && titleCell(currentDate);
row.push(
/* @__PURE__ */ jsx("td", {
title,
className: classnames(cellPrefixCls, _objectSpread2$a((_objectSpread22 = {}, _defineProperty$b(_objectSpread22, "".concat(cellPrefixCls, "-disabled"), disabled), _defineProperty$b(_objectSpread22, "".concat(cellPrefixCls, "-start"), getCellText(currentDate) === 1 || picker === "year" && Number(title) % 10 === 0), _defineProperty$b(_objectSpread22, "".concat(cellPrefixCls, "-end"), title === getLastDay(generateConfig2, currentDate) || picker === "year" && Number(title) % 10 === 9), _objectSpread22), getCellClassName(currentDate))),
onClick: function onClick() {
if (!disabled) {
onSelect(currentDate);
}
},
onMouseEnter: function onMouseEnter() {
if (!disabled && onDateMouseEnter) {
onDateMouseEnter(currentDate);
}
},
onMouseLeave: function onMouseLeave() {
if (!disabled && onDateMouseLeave) {
onDateMouseLeave(currentDate);
}
},
children: getCellNode ? getCellNode(currentDate) : /* @__PURE__ */ jsx("div", {
className: "".concat(cellPrefixCls, "-inner"),
children: getCellText(currentDate)
})
}, j2)
);
};
for (var j2 = 0; j2 < colNum; j2 += 1) {
_loop();
}
rows.push(
/* @__PURE__ */ jsx("tr", {
className: rowClassName && rowClassName(rowStartDate),
children: row
}, i2)
);
}
return /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-body"),
children: /* @__PURE__ */ jsxs("table", {
className: "".concat(prefixCls, "-content"),
children: [headerCells && /* @__PURE__ */ jsx("thead", {
children: /* @__PURE__ */ jsx("tr", {
children: headerCells
})
}), /* @__PURE__ */ jsx("tbody", {
children: rows
})]
})
});
}
var DECADE_COL_COUNT = 3;
var DECADE_ROW_COUNT = 4;
function DecadeBody(props) {
var DECADE_UNIT_DIFF_DES = DECADE_UNIT_DIFF - 1;
var prefixCls = props.prefixCls, viewDate = props.viewDate, generateConfig2 = props.generateConfig;
var cellPrefixCls = "".concat(prefixCls, "-cell");
var yearNumber = generateConfig2.getYear(viewDate);
var decadeYearNumber = Math.floor(yearNumber / DECADE_UNIT_DIFF) * DECADE_UNIT_DIFF;
var startDecadeYear = Math.floor(yearNumber / DECADE_DISTANCE_COUNT) * DECADE_DISTANCE_COUNT;
var endDecadeYear = startDecadeYear + DECADE_DISTANCE_COUNT - 1;
var baseDecadeYear = generateConfig2.setYear(viewDate, startDecadeYear - Math.ceil((DECADE_COL_COUNT * DECADE_ROW_COUNT * DECADE_UNIT_DIFF - DECADE_DISTANCE_COUNT) / 2));
var getCellClassName = function getCellClassName2(date2) {
var _ref;
var startDecadeNumber = generateConfig2.getYear(date2);
var endDecadeNumber = startDecadeNumber + DECADE_UNIT_DIFF_DES;
return _ref = {}, _defineProperty$b(_ref, "".concat(cellPrefixCls, "-in-view"), startDecadeYear <= startDecadeNumber && endDecadeNumber <= endDecadeYear), _defineProperty$b(_ref, "".concat(cellPrefixCls, "-selected"), startDecadeNumber === decadeYearNumber), _ref;
};
return /* @__PURE__ */ jsx(PanelBody, {
...props,
rowNum: DECADE_ROW_COUNT,
colNum: DECADE_COL_COUNT,
baseDate: baseDecadeYear,
getCellText: function getCellText(date2) {
var startDecadeNumber = generateConfig2.getYear(date2);
return "".concat(startDecadeNumber, "-").concat(startDecadeNumber + DECADE_UNIT_DIFF_DES);
},
getCellClassName,
getCellDate: function getCellDate(date2, offset2) {
return generateConfig2.addYear(date2, offset2 * DECADE_UNIT_DIFF);
}
});
}
var scrollIds = /* @__PURE__ */ new Map();
function waitElementReady(element, callback) {
var id2;
function tryOrNextFrame() {
if (isVisible(element)) {
callback();
} else {
id2 = wrapperRaf$1(function() {
tryOrNextFrame();
});
}
}
tryOrNextFrame();
return function() {
wrapperRaf$1.cancel(id2);
};
}
function scrollTo(element, to, duration) {
if (scrollIds.get(element)) {
cancelAnimationFrame(scrollIds.get(element));
}
if (duration <= 0) {
scrollIds.set(element, requestAnimationFrame(function() {
element.scrollTop = to;
}));
return;
}
var difference = to - element.scrollTop;
var perTick = difference / duration * 10;
scrollIds.set(element, requestAnimationFrame(function() {
element.scrollTop += perTick;
if (element.scrollTop !== to) {
scrollTo(element, to, duration - 10);
}
}));
}
function createKeyDownHandler(event, _ref) {
var onLeftRight = _ref.onLeftRight, onCtrlLeftRight = _ref.onCtrlLeftRight, onUpDown = _ref.onUpDown, onPageUpDown = _ref.onPageUpDown, onEnter = _ref.onEnter;
var which = event.which, ctrlKey = event.ctrlKey, metaKey = event.metaKey;
switch (which) {
case KeyCode.LEFT:
if (ctrlKey || metaKey) {
if (onCtrlLeftRight) {
onCtrlLeftRight(-1);
return true;
}
} else if (onLeftRight) {
onLeftRight(-1);
return true;
}
break;
case KeyCode.RIGHT:
if (ctrlKey || metaKey) {
if (onCtrlLeftRight) {
onCtrlLeftRight(1);
return true;
}
} else if (onLeftRight) {
onLeftRight(1);
return true;
}
break;
case KeyCode.UP:
if (onUpDown) {
onUpDown(-1);
return true;
}
break;
case KeyCode.DOWN:
if (onUpDown) {
onUpDown(1);
return true;
}
break;
case KeyCode.PAGE_UP:
if (onPageUpDown) {
onPageUpDown(-1);
return true;
}
break;
case KeyCode.PAGE_DOWN:
if (onPageUpDown) {
onPageUpDown(1);
return true;
}
break;
case KeyCode.ENTER:
if (onEnter) {
onEnter();
return true;
}
break;
}
return false;
}
function getDefaultFormat(format2, picker, showTime, use12Hours) {
var mergedFormat = format2;
if (!mergedFormat) {
switch (picker) {
case "time":
mergedFormat = use12Hours ? "hh:mm:ss a" : "HH:mm:ss";
break;
case "week":
mergedFormat = "gggg-wo";
break;
case "month":
mergedFormat = "YYYY-MM";
break;
case "quarter":
mergedFormat = "YYYY-[Q]Q";
break;
case "year":
mergedFormat = "YYYY";
break;
default:
mergedFormat = showTime ? "YYYY-MM-DD HH:mm:ss" : "YYYY-MM-DD";
}
}
return mergedFormat;
}
function getInputSize(picker, format2, generateConfig2) {
var defaultSize = picker === "time" ? 8 : 10;
var length = typeof format2 === "function" ? format2(generateConfig2.getNow()).length : format2.length;
return Math.max(defaultSize, length) + 2;
}
var globalClickFunc = null;
var clickCallbacks = /* @__PURE__ */ new Set();
function addGlobalMouseDownEvent(callback) {
if (!globalClickFunc && typeof window !== "undefined" && window.addEventListener) {
globalClickFunc = function globalClickFunc2(e2) {
_toConsumableArray$c(clickCallbacks).forEach(function(queueFunc) {
queueFunc(e2);
});
};
window.addEventListener("mousedown", globalClickFunc);
}
clickCallbacks.add(callback);
return function() {
clickCallbacks.delete(callback);
if (clickCallbacks.size === 0) {
window.removeEventListener("mousedown", globalClickFunc);
globalClickFunc = null;
}
};
}
function getTargetFromEvent(e2) {
var target = e2.target;
if (e2.composed && target.shadowRoot) {
var _e$composedPath;
return ((_e$composedPath = e2.composedPath) === null || _e$composedPath === void 0 ? void 0 : _e$composedPath.call(e2)[0]) || target;
}
return target;
}
var getYearNextMode = function getYearNextMode2(next) {
if (next === "month" || next === "date") {
return "year";
}
return next;
};
var getMonthNextMode = function getMonthNextMode2(next) {
if (next === "date") {
return "month";
}
return next;
};
var getQuarterNextMode = function getQuarterNextMode2(next) {
if (next === "month" || next === "date") {
return "quarter";
}
return next;
};
var getWeekNextMode = function getWeekNextMode2(next) {
if (next === "date") {
return "week";
}
return next;
};
var PickerModeMap = {
year: getYearNextMode,
month: getMonthNextMode,
quarter: getQuarterNextMode,
week: getWeekNextMode,
time: null,
date: null
};
function elementsContains(elements, target) {
return elements.some(function(ele) {
return ele && ele.contains(target);
});
}
var DECADE_UNIT_DIFF = 10;
var DECADE_DISTANCE_COUNT = DECADE_UNIT_DIFF * 10;
function DecadePanel(props) {
var prefixCls = props.prefixCls, onViewDateChange = props.onViewDateChange, generateConfig2 = props.generateConfig, viewDate = props.viewDate, operationRef = props.operationRef, onSelect = props.onSelect, onPanelChange = props.onPanelChange;
var panelPrefixCls = "".concat(prefixCls, "-decade-panel");
operationRef.current = {
onKeyDown: function onKeyDown2(event) {
return createKeyDownHandler(event, {
onLeftRight: function onLeftRight(diff) {
onSelect(generateConfig2.addYear(viewDate, diff * DECADE_UNIT_DIFF), "key");
},
onCtrlLeftRight: function onCtrlLeftRight(diff) {
onSelect(generateConfig2.addYear(viewDate, diff * DECADE_DISTANCE_COUNT), "key");
},
onUpDown: function onUpDown(diff) {
onSelect(generateConfig2.addYear(viewDate, diff * DECADE_UNIT_DIFF * DECADE_COL_COUNT), "key");
},
onEnter: function onEnter() {
onPanelChange("year", viewDate);
}
});
}
};
var onDecadesChange = function onDecadesChange2(diff) {
var newDate = generateConfig2.addYear(viewDate, diff * DECADE_DISTANCE_COUNT);
onViewDateChange(newDate);
onPanelChange(null, newDate);
};
var onInternalSelect = function onInternalSelect2(date2) {
onSelect(date2, "mouse");
onPanelChange("year", date2);
};
return /* @__PURE__ */ jsxs("div", {
className: panelPrefixCls,
children: [/* @__PURE__ */ jsx(DecadeHeader, {
...props,
prefixCls,
onPrevDecades: function onPrevDecades() {
onDecadesChange(-1);
},
onNextDecades: function onNextDecades() {
onDecadesChange(1);
}
}), /* @__PURE__ */ jsx(DecadeBody, {
...props,
prefixCls,
onSelect: onInternalSelect
})]
});
}
var WEEK_DAY_COUNT = 7;
function isNullEqual(value1, value2) {
if (!value1 && !value2) {
return true;
}
if (!value1 || !value2) {
return false;
}
return void 0;
}
function isSameDecade(generateConfig2, decade1, decade2) {
var equal = isNullEqual(decade1, decade2);
if (typeof equal === "boolean") {
return equal;
}
var num1 = Math.floor(generateConfig2.getYear(decade1) / 10);
var num2 = Math.floor(generateConfig2.getYear(decade2) / 10);
return num1 === num2;
}
function isSameYear(generateConfig2, year1, year2) {
var equal = isNullEqual(year1, year2);
if (typeof equal === "boolean") {
return equal;
}
return generateConfig2.getYear(year1) === generateConfig2.getYear(year2);
}
function getQuarter(generateConfig2, date2) {
var quota = Math.floor(generateConfig2.getMonth(date2) / 3);
return quota + 1;
}
function isSameQuarter(generateConfig2, quarter1, quarter2) {
var equal = isNullEqual(quarter1, quarter2);
if (typeof equal === "boolean") {
return equal;
}
return isSameYear(generateConfig2, quarter1, quarter2) && getQuarter(generateConfig2, quarter1) === getQuarter(generateConfig2, quarter2);
}
function isSameMonth(generateConfig2, month1, month2) {
var equal = isNullEqual(month1, month2);
if (typeof equal === "boolean") {
return equal;
}
return isSameYear(generateConfig2, month1, month2) && generateConfig2.getMonth(month1) === generateConfig2.getMonth(month2);
}
function isSameDate(generateConfig2, date1, date2) {
var equal = isNullEqual(date1, date2);
if (typeof equal === "boolean") {
return equal;
}
return generateConfig2.getYear(date1) === generateConfig2.getYear(date2) && generateConfig2.getMonth(date1) === generateConfig2.getMonth(date2) && generateConfig2.getDate(date1) === generateConfig2.getDate(date2);
}
function isSameTime(generateConfig2, time1, time2) {
var equal = isNullEqual(time1, time2);
if (typeof equal === "boolean") {
return equal;
}
return generateConfig2.getHour(time1) === generateConfig2.getHour(time2) && generateConfig2.getMinute(time1) === generateConfig2.getMinute(time2) && generateConfig2.getSecond(time1) === generateConfig2.getSecond(time2);
}
function isSameWeek(generateConfig2, locale2, date1, date2) {
var equal = isNullEqual(date1, date2);
if (typeof equal === "boolean") {
return equal;
}
return generateConfig2.locale.getWeek(locale2, date1) === generateConfig2.locale.getWeek(locale2, date2);
}
function isEqual$1(generateConfig2, value1, value2) {
return isSameDate(generateConfig2, value1, value2) && isSameTime(generateConfig2, value1, value2);
}
function isInRange(generateConfig2, startDate, endDate, current) {
if (!startDate || !endDate || !current) {
return false;
}
return !isSameDate(generateConfig2, startDate, current) && !isSameDate(generateConfig2, endDate, current) && generateConfig2.isAfter(current, startDate) && generateConfig2.isAfter(endDate, current);
}
function getWeekStartDate(locale2, generateConfig2, value) {
var weekFirstDay = generateConfig2.locale.getWeekFirstDay(locale2);
var monthStartDate = generateConfig2.setDate(value, 1);
var startDateWeekDay = generateConfig2.getWeekDay(monthStartDate);
var alignStartDate = generateConfig2.addDate(monthStartDate, weekFirstDay - startDateWeekDay);
if (generateConfig2.getMonth(alignStartDate) === generateConfig2.getMonth(value) && generateConfig2.getDate(alignStartDate) > 1) {
alignStartDate = generateConfig2.addDate(alignStartDate, -7);
}
return alignStartDate;
}
function getClosingViewDate(viewDate, picker, generateConfig2) {
var offset2 = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : 1;
switch (picker) {
case "year":
return generateConfig2.addYear(viewDate, offset2 * 10);
case "quarter":
case "month":
return generateConfig2.addYear(viewDate, offset2);
default:
return generateConfig2.addMonth(viewDate, offset2);
}
}
function formatValue(value, _ref) {
var generateConfig2 = _ref.generateConfig, locale2 = _ref.locale, format2 = _ref.format;
return typeof format2 === "function" ? format2(value) : generateConfig2.locale.format(locale2.locale, value, format2);
}
function parseValue(value, _ref2) {
var generateConfig2 = _ref2.generateConfig, locale2 = _ref2.locale, formatList = _ref2.formatList;
if (!value || typeof formatList[0] === "function") {
return null;
}
return generateConfig2.locale.parse(locale2.locale, value, formatList);
}
function getCellDateDisabled(_ref3) {
var cellDate = _ref3.cellDate, mode = _ref3.mode, disabledDate = _ref3.disabledDate, generateConfig2 = _ref3.generateConfig;
if (!disabledDate)
return false;
var getDisabledFromRange = function getDisabledFromRange2(currentMode, start, end) {
var current = start;
while (current <= end) {
var date2 = void 0;
switch (currentMode) {
case "date": {
date2 = generateConfig2.setDate(cellDate, current);
if (!disabledDate(date2)) {
return false;
}
break;
}
case "month": {
date2 = generateConfig2.setMonth(cellDate, current);
if (!getCellDateDisabled({
cellDate: date2,
mode: "month",
generateConfig: generateConfig2,
disabledDate
})) {
return false;
}
break;
}
case "year": {
date2 = generateConfig2.setYear(cellDate, current);
if (!getCellDateDisabled({
cellDate: date2,
mode: "year",
generateConfig: generateConfig2,
disabledDate
})) {
return false;
}
break;
}
}
current += 1;
}
return true;
};
switch (mode) {
case "date":
case "week": {
return disabledDate(cellDate);
}
case "month": {
var startDate = 1;
var endDate = generateConfig2.getDate(generateConfig2.getEndDate(cellDate));
return getDisabledFromRange("date", startDate, endDate);
}
case "quarter": {
var startMonth = Math.floor(generateConfig2.getMonth(cellDate) / 3) * 3;
var endMonth = startMonth + 2;
return getDisabledFromRange("month", startMonth, endMonth);
}
case "year": {
return getDisabledFromRange("month", 0, 11);
}
case "decade": {
var year = generateConfig2.getYear(cellDate);
var startYear = Math.floor(year / DECADE_UNIT_DIFF) * DECADE_UNIT_DIFF;
var endYear = startYear + DECADE_UNIT_DIFF - 1;
return getDisabledFromRange("year", startYear, endYear);
}
}
}
function TimeHeader(props) {
var _React$useContext = React__namespace.useContext(PanelContext), hideHeader = _React$useContext.hideHeader;
if (hideHeader) {
return null;
}
var prefixCls = props.prefixCls, generateConfig2 = props.generateConfig, locale2 = props.locale, value = props.value, format2 = props.format;
var headerPrefixCls = "".concat(prefixCls, "-header");
return /* @__PURE__ */ jsx(Header$1, {
prefixCls: headerPrefixCls,
children: value ? formatValue(value, {
locale: locale2,
format: format2,
generateConfig: generateConfig2
}) : "\xA0"
});
}
function TimeUnitColumn(props) {
var prefixCls = props.prefixCls, units = props.units, onSelect = props.onSelect, value = props.value, active = props.active, hideDisabledOptions = props.hideDisabledOptions;
var cellPrefixCls = "".concat(prefixCls, "-cell");
var _React$useContext = React__namespace.useContext(PanelContext), open = _React$useContext.open;
var ulRef = React$a.useRef(null);
var liRefs = React$a.useRef(/* @__PURE__ */ new Map());
var scrollRef = React$a.useRef();
React$a.useLayoutEffect(function() {
var li = liRefs.current.get(value);
if (li && open !== false) {
scrollTo(ulRef.current, li.offsetTop, 120);
}
}, [value]);
React$a.useLayoutEffect(function() {
if (open) {
var li = liRefs.current.get(value);
if (li) {
scrollRef.current = waitElementReady(li, function() {
scrollTo(ulRef.current, li.offsetTop, 0);
});
}
}
return function() {
var _scrollRef$current;
(_scrollRef$current = scrollRef.current) === null || _scrollRef$current === void 0 ? void 0 : _scrollRef$current.call(scrollRef);
};
}, [open]);
return /* @__PURE__ */ jsx("ul", {
className: classnames("".concat(prefixCls, "-column"), _defineProperty$b({}, "".concat(prefixCls, "-column-active"), active)),
ref: ulRef,
style: {
position: "relative"
},
children: units.map(function(unit) {
var _classNames2;
if (hideDisabledOptions && unit.disabled) {
return null;
}
return /* @__PURE__ */ jsx("li", {
ref: function ref(element) {
liRefs.current.set(unit.value, element);
},
className: classnames(cellPrefixCls, (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(cellPrefixCls, "-disabled"), unit.disabled), _defineProperty$b(_classNames2, "".concat(cellPrefixCls, "-selected"), value === unit.value), _classNames2)),
onClick: function onClick() {
if (unit.disabled) {
return;
}
onSelect(unit.value);
},
children: /* @__PURE__ */ jsx("div", {
className: "".concat(cellPrefixCls, "-inner"),
children: unit.label
})
}, unit.value);
})
});
}
function leftPad(str, length) {
var fill = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "0";
var current = String(str);
while (current.length < length) {
current = "".concat(fill).concat(str);
}
return current;
}
var tuple = function tuple2() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return args;
};
function toArray$6(val) {
if (val === null || val === void 0) {
return [];
}
return Array.isArray(val) ? val : [val];
}
function getDataOrAriaProps(props) {
var retProps = {};
Object.keys(props).forEach(function(key2) {
if ((key2.substr(0, 5) === "data-" || key2.substr(0, 5) === "aria-" || key2 === "role" || key2 === "name") && key2.substr(0, 7) !== "data-__") {
retProps[key2] = props[key2];
}
});
return retProps;
}
function getValue$3(values, index2) {
return values ? values[index2] : null;
}
function updateValues(values, value, index2) {
var newValues = [getValue$3(values, 0), getValue$3(values, 1)];
newValues[index2] = typeof value === "function" ? value(newValues[index2]) : value;
if (!newValues[0] && !newValues[1]) {
return null;
}
return newValues;
}
function shouldUnitsUpdate(prevUnits, nextUnits) {
if (prevUnits.length !== nextUnits.length)
return true;
for (var i2 = 0; i2 < prevUnits.length; i2 += 1) {
if (prevUnits[i2].disabled !== nextUnits[i2].disabled)
return true;
}
return false;
}
function generateUnits(start, end, step2, disabledUnits) {
var units = [];
var integerStep = step2 >= 1 ? step2 | 0 : 1;
for (var i2 = start; i2 <= end; i2 += integerStep) {
units.push({
label: leftPad(i2, 2),
value: i2,
disabled: (disabledUnits || []).includes(i2)
});
}
return units;
}
function TimeBody(props) {
var generateConfig2 = props.generateConfig, prefixCls = props.prefixCls, operationRef = props.operationRef, activeColumnIndex = props.activeColumnIndex, value = props.value, showHour = props.showHour, showMinute = props.showMinute, showSecond = props.showSecond, use12Hours = props.use12Hours, _props$hourStep = props.hourStep, hourStep = _props$hourStep === void 0 ? 1 : _props$hourStep, _props$minuteStep = props.minuteStep, minuteStep = _props$minuteStep === void 0 ? 1 : _props$minuteStep, _props$secondStep = props.secondStep, secondStep = _props$secondStep === void 0 ? 1 : _props$secondStep, disabledHours = props.disabledHours, disabledMinutes = props.disabledMinutes, disabledSeconds = props.disabledSeconds, disabledTime = props.disabledTime, hideDisabledOptions = props.hideDisabledOptions, onSelect = props.onSelect;
var columns = [];
var contentPrefixCls = "".concat(prefixCls, "-content");
var columnPrefixCls = "".concat(prefixCls, "-time-panel");
var isPM;
var originHour = value ? generateConfig2.getHour(value) : -1;
var hour = originHour;
var minute = value ? generateConfig2.getMinute(value) : -1;
var second = value ? generateConfig2.getSecond(value) : -1;
var now2 = generateConfig2.getNow();
var _React$useMemo = React__namespace.useMemo(function() {
if (disabledTime) {
var disabledConfig = disabledTime(now2);
return [disabledConfig.disabledHours, disabledConfig.disabledMinutes, disabledConfig.disabledSeconds];
}
return [disabledHours, disabledMinutes, disabledSeconds];
}, [disabledHours, disabledMinutes, disabledSeconds, disabledTime, now2]), _React$useMemo2 = _slicedToArray$e(_React$useMemo, 3), mergedDisabledHours = _React$useMemo2[0], mergedDisabledMinutes = _React$useMemo2[1], mergedDisabledSeconds = _React$useMemo2[2];
var setTime$1 = function setTime$12(isNewPM, newHour, newMinute, newSecond) {
var newDate = value || generateConfig2.getNow();
var mergedHour = Math.max(0, newHour);
var mergedMinute = Math.max(0, newMinute);
var mergedSecond = Math.max(0, newSecond);
newDate = setTime(generateConfig2, newDate, !use12Hours || !isNewPM ? mergedHour : mergedHour + 12, mergedMinute, mergedSecond);
return newDate;
};
var rawHours = generateUnits(0, 23, hourStep, mergedDisabledHours && mergedDisabledHours());
var memorizedRawHours = useMemo(function() {
return rawHours;
}, rawHours, shouldUnitsUpdate);
if (use12Hours) {
isPM = hour >= 12;
hour %= 12;
}
var _React$useMemo3 = React__namespace.useMemo(function() {
if (!use12Hours) {
return [false, false];
}
var AMPMDisabled = [true, true];
memorizedRawHours.forEach(function(_ref) {
var disabled = _ref.disabled, hourValue = _ref.value;
if (disabled)
return;
if (hourValue >= 12) {
AMPMDisabled[1] = false;
} else {
AMPMDisabled[0] = false;
}
});
return AMPMDisabled;
}, [use12Hours, memorizedRawHours]), _React$useMemo4 = _slicedToArray$e(_React$useMemo3, 2), AMDisabled = _React$useMemo4[0], PMDisabled = _React$useMemo4[1];
var hours = React__namespace.useMemo(function() {
if (!use12Hours)
return memorizedRawHours;
return memorizedRawHours.filter(isPM ? function(hourMeta) {
return hourMeta.value >= 12;
} : function(hourMeta) {
return hourMeta.value < 12;
}).map(function(hourMeta) {
var hourValue = hourMeta.value % 12;
var hourLabel = hourValue === 0 ? "12" : leftPad(hourValue, 2);
return _objectSpread2$a(_objectSpread2$a({}, hourMeta), {}, {
label: hourLabel,
value: hourValue
});
});
}, [use12Hours, isPM, memorizedRawHours]);
var minutes = generateUnits(0, 59, minuteStep, mergedDisabledMinutes && mergedDisabledMinutes(originHour));
var seconds = generateUnits(0, 59, secondStep, mergedDisabledSeconds && mergedDisabledSeconds(originHour, minute));
operationRef.current = {
onUpDown: function onUpDown(diff) {
var column = columns[activeColumnIndex];
if (column) {
var valueIndex = column.units.findIndex(function(unit) {
return unit.value === column.value;
});
var unitLen = column.units.length;
for (var i2 = 1; i2 < unitLen; i2 += 1) {
var nextUnit = column.units[(valueIndex + diff * i2 + unitLen) % unitLen];
if (nextUnit.disabled !== true) {
column.onSelect(nextUnit.value);
break;
}
}
}
}
};
function addColumnNode(condition, node, columnValue, units, onColumnSelect) {
if (condition !== false) {
columns.push({
node: /* @__PURE__ */ React__namespace.cloneElement(node, {
prefixCls: columnPrefixCls,
value: columnValue,
active: activeColumnIndex === columns.length,
onSelect: onColumnSelect,
units,
hideDisabledOptions
}),
onSelect: onColumnSelect,
value: columnValue,
units
});
}
}
addColumnNode(
showHour,
/* @__PURE__ */ jsx(TimeUnitColumn, {}, "hour"),
hour,
hours,
function(num) {
onSelect(setTime$1(isPM, num, minute, second), "mouse");
}
);
addColumnNode(
showMinute,
/* @__PURE__ */ jsx(TimeUnitColumn, {}, "minute"),
minute,
minutes,
function(num) {
onSelect(setTime$1(isPM, hour, num, second), "mouse");
}
);
addColumnNode(
showSecond,
/* @__PURE__ */ jsx(TimeUnitColumn, {}, "second"),
second,
seconds,
function(num) {
onSelect(setTime$1(isPM, hour, minute, num), "mouse");
}
);
var PMIndex = -1;
if (typeof isPM === "boolean") {
PMIndex = isPM ? 1 : 0;
}
addColumnNode(
use12Hours === true,
/* @__PURE__ */ jsx(TimeUnitColumn, {}, "12hours"),
PMIndex,
[{
label: "AM",
value: 0,
disabled: AMDisabled
}, {
label: "PM",
value: 1,
disabled: PMDisabled
}],
function(num) {
onSelect(setTime$1(!!num, hour, minute, second), "mouse");
}
);
return /* @__PURE__ */ jsx("div", {
className: contentPrefixCls,
children: columns.map(function(_ref2) {
var node = _ref2.node;
return node;
})
});
}
var countBoolean = function countBoolean2(boolList) {
return boolList.filter(function(bool) {
return bool !== false;
}).length;
};
function TimePanel(props) {
var generateConfig2 = props.generateConfig, _props$format = props.format, format2 = _props$format === void 0 ? "HH:mm:ss" : _props$format, prefixCls = props.prefixCls, active = props.active, operationRef = props.operationRef, showHour = props.showHour, showMinute = props.showMinute, showSecond = props.showSecond, _props$use12Hours = props.use12Hours, use12Hours = _props$use12Hours === void 0 ? false : _props$use12Hours, onSelect = props.onSelect, value = props.value;
var panelPrefixCls = "".concat(prefixCls, "-time-panel");
var bodyOperationRef = React__namespace.useRef();
var _React$useState = React__namespace.useState(-1), _React$useState2 = _slicedToArray$e(_React$useState, 2), activeColumnIndex = _React$useState2[0], setActiveColumnIndex = _React$useState2[1];
var columnsCount = countBoolean([showHour, showMinute, showSecond, use12Hours]);
operationRef.current = {
onKeyDown: function onKeyDown2(event) {
return createKeyDownHandler(event, {
onLeftRight: function onLeftRight(diff) {
setActiveColumnIndex((activeColumnIndex + diff + columnsCount) % columnsCount);
},
onUpDown: function onUpDown(diff) {
if (activeColumnIndex === -1) {
setActiveColumnIndex(0);
} else if (bodyOperationRef.current) {
bodyOperationRef.current.onUpDown(diff);
}
},
onEnter: function onEnter() {
onSelect(value || generateConfig2.getNow(), "key");
setActiveColumnIndex(-1);
}
});
},
onBlur: function onBlur() {
setActiveColumnIndex(-1);
}
};
return /* @__PURE__ */ jsxs("div", {
className: classnames(panelPrefixCls, _defineProperty$b({}, "".concat(panelPrefixCls, "-active"), active)),
children: [/* @__PURE__ */ jsx(TimeHeader, {
...props,
format: format2,
prefixCls
}), /* @__PURE__ */ jsx(TimeBody, {
...props,
prefixCls,
activeColumnIndex,
operationRef: bodyOperationRef
})]
});
}
var RangeContext = /* @__PURE__ */ React__namespace.createContext({});
function useCellClassName(_ref) {
var cellPrefixCls = _ref.cellPrefixCls, generateConfig2 = _ref.generateConfig, rangedValue = _ref.rangedValue, hoverRangedValue = _ref.hoverRangedValue, isInView = _ref.isInView, isSameCell = _ref.isSameCell, offsetCell = _ref.offsetCell, today = _ref.today, value = _ref.value;
function getClassName(currentDate) {
var _ref2;
var prevDate = offsetCell(currentDate, -1);
var nextDate = offsetCell(currentDate, 1);
var rangeStart = getValue$3(rangedValue, 0);
var rangeEnd = getValue$3(rangedValue, 1);
var hoverStart = getValue$3(hoverRangedValue, 0);
var hoverEnd = getValue$3(hoverRangedValue, 1);
var isRangeHovered = isInRange(generateConfig2, hoverStart, hoverEnd, currentDate);
function isRangeStart(date2) {
return isSameCell(rangeStart, date2);
}
function isRangeEnd(date2) {
return isSameCell(rangeEnd, date2);
}
var isHoverStart = isSameCell(hoverStart, currentDate);
var isHoverEnd = isSameCell(hoverEnd, currentDate);
var isHoverEdgeStart = (isRangeHovered || isHoverEnd) && (!isInView(prevDate) || isRangeEnd(prevDate));
var isHoverEdgeEnd = (isRangeHovered || isHoverStart) && (!isInView(nextDate) || isRangeStart(nextDate));
return _ref2 = {}, _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-in-view"), isInView(currentDate)), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-in-range"), isInRange(generateConfig2, rangeStart, rangeEnd, currentDate)), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-start"), isRangeStart(currentDate)), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-end"), isRangeEnd(currentDate)), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-start-single"), isRangeStart(currentDate) && !rangeEnd), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-end-single"), isRangeEnd(currentDate) && !rangeStart), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-start-near-hover"), isRangeStart(currentDate) && (isSameCell(prevDate, hoverStart) || isInRange(generateConfig2, hoverStart, hoverEnd, prevDate))), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-end-near-hover"), isRangeEnd(currentDate) && (isSameCell(nextDate, hoverEnd) || isInRange(generateConfig2, hoverStart, hoverEnd, nextDate))), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-hover"), isRangeHovered), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-hover-start"), isHoverStart), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-hover-end"), isHoverEnd), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-hover-edge-start"), isHoverEdgeStart), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-hover-edge-end"), isHoverEdgeEnd), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-hover-edge-start-near-range"), isHoverEdgeStart && isSameCell(prevDate, rangeEnd)), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-hover-edge-end-near-range"), isHoverEdgeEnd && isSameCell(nextDate, rangeStart)), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-today"), isSameCell(today, currentDate)), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-selected"), isSameCell(value, currentDate)), _ref2;
}
return getClassName;
}
function DateBody(props) {
var prefixCls = props.prefixCls, generateConfig2 = props.generateConfig, prefixColumn = props.prefixColumn, locale2 = props.locale, rowCount = props.rowCount, viewDate = props.viewDate, value = props.value, dateRender = props.dateRender;
var _React$useContext = React__namespace.useContext(RangeContext), rangedValue = _React$useContext.rangedValue, hoverRangedValue = _React$useContext.hoverRangedValue;
var baseDate = getWeekStartDate(locale2.locale, generateConfig2, viewDate);
var cellPrefixCls = "".concat(prefixCls, "-cell");
var weekFirstDay = generateConfig2.locale.getWeekFirstDay(locale2.locale);
var today = generateConfig2.getNow();
var headerCells = [];
var weekDaysLocale = locale2.shortWeekDays || (generateConfig2.locale.getShortWeekDays ? generateConfig2.locale.getShortWeekDays(locale2.locale) : []);
if (prefixColumn) {
headerCells.push(
/* @__PURE__ */ jsx("th", {
"aria-label": "empty cell"
}, "empty")
);
}
for (var i2 = 0; i2 < WEEK_DAY_COUNT; i2 += 1) {
headerCells.push(
/* @__PURE__ */ jsx("th", {
children: weekDaysLocale[(i2 + weekFirstDay) % WEEK_DAY_COUNT]
}, i2)
);
}
var getCellClassName = useCellClassName({
cellPrefixCls,
today,
value,
generateConfig: generateConfig2,
rangedValue: prefixColumn ? null : rangedValue,
hoverRangedValue: prefixColumn ? null : hoverRangedValue,
isSameCell: function isSameCell(current, target) {
return isSameDate(generateConfig2, current, target);
},
isInView: function isInView(date2) {
return isSameMonth(generateConfig2, date2, viewDate);
},
offsetCell: function offsetCell(date2, offset2) {
return generateConfig2.addDate(date2, offset2);
}
});
var getCellNode = dateRender ? function(date2) {
return dateRender(date2, today);
} : void 0;
return /* @__PURE__ */ jsx(PanelBody, {
...props,
rowNum: rowCount,
colNum: WEEK_DAY_COUNT,
baseDate,
getCellNode,
getCellText: generateConfig2.getDate,
getCellClassName,
getCellDate: generateConfig2.addDate,
titleCell: function titleCell(date2) {
return formatValue(date2, {
locale: locale2,
format: "YYYY-MM-DD",
generateConfig: generateConfig2
});
},
headerCells
});
}
function DateHeader(props) {
var prefixCls = props.prefixCls, generateConfig2 = props.generateConfig, locale2 = props.locale, viewDate = props.viewDate, onNextMonth = props.onNextMonth, onPrevMonth = props.onPrevMonth, onNextYear = props.onNextYear, onPrevYear = props.onPrevYear, onYearClick = props.onYearClick, onMonthClick = props.onMonthClick;
var _React$useContext = React__namespace.useContext(PanelContext), hideHeader = _React$useContext.hideHeader;
if (hideHeader) {
return null;
}
var headerPrefixCls = "".concat(prefixCls, "-header");
var monthsLocale = locale2.shortMonths || (generateConfig2.locale.getShortMonths ? generateConfig2.locale.getShortMonths(locale2.locale) : []);
var month = generateConfig2.getMonth(viewDate);
var yearNode = /* @__PURE__ */ jsx("button", {
type: "button",
onClick: onYearClick,
tabIndex: -1,
className: "".concat(prefixCls, "-year-btn"),
children: formatValue(viewDate, {
locale: locale2,
format: locale2.yearFormat,
generateConfig: generateConfig2
})
}, "year");
var monthNode = /* @__PURE__ */ jsx("button", {
type: "button",
onClick: onMonthClick,
tabIndex: -1,
className: "".concat(prefixCls, "-month-btn"),
children: locale2.monthFormat ? formatValue(viewDate, {
locale: locale2,
format: locale2.monthFormat,
generateConfig: generateConfig2
}) : monthsLocale[month]
}, "month");
var monthYearNodes = locale2.monthBeforeYear ? [monthNode, yearNode] : [yearNode, monthNode];
return /* @__PURE__ */ jsx(Header$1, {
...props,
prefixCls: headerPrefixCls,
onSuperPrev: onPrevYear,
onPrev: onPrevMonth,
onNext: onNextMonth,
onSuperNext: onNextYear,
children: monthYearNodes
});
}
var DATE_ROW_COUNT = 6;
function DatePanel(props) {
var prefixCls = props.prefixCls, _props$panelName = props.panelName, panelName = _props$panelName === void 0 ? "date" : _props$panelName, keyboardConfig = props.keyboardConfig, active = props.active, operationRef = props.operationRef, generateConfig2 = props.generateConfig, value = props.value, viewDate = props.viewDate, onViewDateChange = props.onViewDateChange, onPanelChange = props.onPanelChange, _onSelect = props.onSelect;
var panelPrefixCls = "".concat(prefixCls, "-").concat(panelName, "-panel");
operationRef.current = {
onKeyDown: function onKeyDown2(event) {
return createKeyDownHandler(event, _objectSpread2$a({
onLeftRight: function onLeftRight(diff) {
_onSelect(generateConfig2.addDate(value || viewDate, diff), "key");
},
onCtrlLeftRight: function onCtrlLeftRight(diff) {
_onSelect(generateConfig2.addYear(value || viewDate, diff), "key");
},
onUpDown: function onUpDown(diff) {
_onSelect(generateConfig2.addDate(value || viewDate, diff * WEEK_DAY_COUNT), "key");
},
onPageUpDown: function onPageUpDown(diff) {
_onSelect(generateConfig2.addMonth(value || viewDate, diff), "key");
}
}, keyboardConfig));
}
};
var onYearChange = function onYearChange2(diff) {
var newDate = generateConfig2.addYear(viewDate, diff);
onViewDateChange(newDate);
onPanelChange(null, newDate);
};
var onMonthChange = function onMonthChange2(diff) {
var newDate = generateConfig2.addMonth(viewDate, diff);
onViewDateChange(newDate);
onPanelChange(null, newDate);
};
return /* @__PURE__ */ jsxs("div", {
className: classnames(panelPrefixCls, _defineProperty$b({}, "".concat(panelPrefixCls, "-active"), active)),
children: [/* @__PURE__ */ jsx(DateHeader, {
...props,
prefixCls,
value,
viewDate,
onPrevYear: function onPrevYear() {
onYearChange(-1);
},
onNextYear: function onNextYear() {
onYearChange(1);
},
onPrevMonth: function onPrevMonth() {
onMonthChange(-1);
},
onNextMonth: function onNextMonth() {
onMonthChange(1);
},
onMonthClick: function onMonthClick() {
onPanelChange("month", viewDate);
},
onYearClick: function onYearClick() {
onPanelChange("year", viewDate);
}
}), /* @__PURE__ */ jsx(DateBody, {
...props,
onSelect: function onSelect(date2) {
return _onSelect(date2, "mouse");
},
prefixCls,
value,
viewDate,
rowCount: DATE_ROW_COUNT
})]
});
}
var ACTIVE_PANEL = tuple("date", "time");
function DatetimePanel(props) {
var prefixCls = props.prefixCls, operationRef = props.operationRef, generateConfig2 = props.generateConfig, value = props.value, defaultValue = props.defaultValue, disabledTime = props.disabledTime, showTime = props.showTime, onSelect = props.onSelect;
var panelPrefixCls = "".concat(prefixCls, "-datetime-panel");
var _React$useState = React__namespace.useState(null), _React$useState2 = _slicedToArray$e(_React$useState, 2), activePanel = _React$useState2[0], setActivePanel = _React$useState2[1];
var dateOperationRef = React__namespace.useRef({});
var timeOperationRef = React__namespace.useRef({});
var timeProps = _typeof$q(showTime) === "object" ? _objectSpread2$a({}, showTime) : {};
function getNextActive(offset2) {
var activeIndex = ACTIVE_PANEL.indexOf(activePanel) + offset2;
var nextActivePanel = ACTIVE_PANEL[activeIndex] || null;
return nextActivePanel;
}
var onBlur = function onBlur2(e2) {
if (timeOperationRef.current.onBlur) {
timeOperationRef.current.onBlur(e2);
}
setActivePanel(null);
};
operationRef.current = {
onKeyDown: function onKeyDown2(event) {
if (event.which === KeyCode.TAB) {
var nextActivePanel = getNextActive(event.shiftKey ? -1 : 1);
setActivePanel(nextActivePanel);
if (nextActivePanel) {
event.preventDefault();
}
return true;
}
if (activePanel) {
var ref = activePanel === "date" ? dateOperationRef : timeOperationRef;
if (ref.current && ref.current.onKeyDown) {
ref.current.onKeyDown(event);
}
return true;
}
if ([KeyCode.LEFT, KeyCode.RIGHT, KeyCode.UP, KeyCode.DOWN].includes(event.which)) {
setActivePanel("date");
return true;
}
return false;
},
onBlur,
onClose: onBlur
};
var onInternalSelect = function onInternalSelect2(date2, source) {
var selectedDate = date2;
if (source === "date" && !value && timeProps.defaultValue) {
selectedDate = generateConfig2.setHour(selectedDate, generateConfig2.getHour(timeProps.defaultValue));
selectedDate = generateConfig2.setMinute(selectedDate, generateConfig2.getMinute(timeProps.defaultValue));
selectedDate = generateConfig2.setSecond(selectedDate, generateConfig2.getSecond(timeProps.defaultValue));
} else if (source === "time" && !value && defaultValue) {
selectedDate = generateConfig2.setYear(selectedDate, generateConfig2.getYear(defaultValue));
selectedDate = generateConfig2.setMonth(selectedDate, generateConfig2.getMonth(defaultValue));
selectedDate = generateConfig2.setDate(selectedDate, generateConfig2.getDate(defaultValue));
}
if (onSelect) {
onSelect(selectedDate, "mouse");
}
};
var disabledTimes = disabledTime ? disabledTime(value || null) : {};
return /* @__PURE__ */ jsxs("div", {
className: classnames(panelPrefixCls, _defineProperty$b({}, "".concat(panelPrefixCls, "-active"), activePanel)),
children: [/* @__PURE__ */ jsx(DatePanel, {
...props,
operationRef: dateOperationRef,
active: activePanel === "date",
onSelect: function onSelect2(date2) {
onInternalSelect(setDateTime(generateConfig2, date2, !value && _typeof$q(showTime) === "object" ? showTime.defaultValue : null), "date");
}
}), /* @__PURE__ */ jsx(TimePanel, {
...props,
format: void 0,
...timeProps,
...disabledTimes,
disabledTime: null,
defaultValue: void 0,
operationRef: timeOperationRef,
active: activePanel === "time",
onSelect: function onSelect2(date2) {
onInternalSelect(date2, "time");
}
})]
});
}
function WeekPanel(props) {
var prefixCls = props.prefixCls, generateConfig2 = props.generateConfig, locale2 = props.locale, value = props.value;
var cellPrefixCls = "".concat(prefixCls, "-cell");
var prefixColumn = function prefixColumn2(date2) {
return /* @__PURE__ */ jsx("td", {
className: classnames(cellPrefixCls, "".concat(cellPrefixCls, "-week")),
children: generateConfig2.locale.getWeek(locale2.locale, date2)
}, "week");
};
var rowPrefixCls = "".concat(prefixCls, "-week-panel-row");
var rowClassName = function rowClassName2(date2) {
return classnames(rowPrefixCls, _defineProperty$b({}, "".concat(rowPrefixCls, "-selected"), isSameWeek(generateConfig2, locale2.locale, value, date2)));
};
return /* @__PURE__ */ jsx(DatePanel, {
...props,
panelName: "week",
prefixColumn,
rowClassName,
keyboardConfig: {
onLeftRight: null
}
});
}
function MonthHeader(props) {
var prefixCls = props.prefixCls, generateConfig2 = props.generateConfig, locale2 = props.locale, viewDate = props.viewDate, onNextYear = props.onNextYear, onPrevYear = props.onPrevYear, onYearClick = props.onYearClick;
var _React$useContext = React__namespace.useContext(PanelContext), hideHeader = _React$useContext.hideHeader;
if (hideHeader) {
return null;
}
var headerPrefixCls = "".concat(prefixCls, "-header");
return /* @__PURE__ */ jsx(Header$1, {
...props,
prefixCls: headerPrefixCls,
onSuperPrev: onPrevYear,
onSuperNext: onNextYear,
children: /* @__PURE__ */ jsx("button", {
type: "button",
onClick: onYearClick,
className: "".concat(prefixCls, "-year-btn"),
children: formatValue(viewDate, {
locale: locale2,
format: locale2.yearFormat,
generateConfig: generateConfig2
})
})
});
}
var MONTH_COL_COUNT = 3;
var MONTH_ROW_COUNT = 4;
function MonthBody(props) {
var prefixCls = props.prefixCls, locale2 = props.locale, value = props.value, viewDate = props.viewDate, generateConfig2 = props.generateConfig, monthCellRender = props.monthCellRender;
var _React$useContext = React__namespace.useContext(RangeContext), rangedValue = _React$useContext.rangedValue, hoverRangedValue = _React$useContext.hoverRangedValue;
var cellPrefixCls = "".concat(prefixCls, "-cell");
var getCellClassName = useCellClassName({
cellPrefixCls,
value,
generateConfig: generateConfig2,
rangedValue,
hoverRangedValue,
isSameCell: function isSameCell(current, target) {
return isSameMonth(generateConfig2, current, target);
},
isInView: function isInView() {
return true;
},
offsetCell: function offsetCell(date2, offset2) {
return generateConfig2.addMonth(date2, offset2);
}
});
var monthsLocale = locale2.shortMonths || (generateConfig2.locale.getShortMonths ? generateConfig2.locale.getShortMonths(locale2.locale) : []);
var baseMonth = generateConfig2.setMonth(viewDate, 0);
var getCellNode = monthCellRender ? function(date2) {
return monthCellRender(date2, locale2);
} : void 0;
return /* @__PURE__ */ jsx(PanelBody, {
...props,
rowNum: MONTH_ROW_COUNT,
colNum: MONTH_COL_COUNT,
baseDate: baseMonth,
getCellNode,
getCellText: function getCellText(date2) {
return locale2.monthFormat ? formatValue(date2, {
locale: locale2,
format: locale2.monthFormat,
generateConfig: generateConfig2
}) : monthsLocale[generateConfig2.getMonth(date2)];
},
getCellClassName,
getCellDate: generateConfig2.addMonth,
titleCell: function titleCell(date2) {
return formatValue(date2, {
locale: locale2,
format: "YYYY-MM",
generateConfig: generateConfig2
});
}
});
}
function MonthPanel(props) {
var prefixCls = props.prefixCls, operationRef = props.operationRef, onViewDateChange = props.onViewDateChange, generateConfig2 = props.generateConfig, value = props.value, viewDate = props.viewDate, onPanelChange = props.onPanelChange, _onSelect = props.onSelect;
var panelPrefixCls = "".concat(prefixCls, "-month-panel");
operationRef.current = {
onKeyDown: function onKeyDown2(event) {
return createKeyDownHandler(event, {
onLeftRight: function onLeftRight(diff) {
_onSelect(generateConfig2.addMonth(value || viewDate, diff), "key");
},
onCtrlLeftRight: function onCtrlLeftRight(diff) {
_onSelect(generateConfig2.addYear(value || viewDate, diff), "key");
},
onUpDown: function onUpDown(diff) {
_onSelect(generateConfig2.addMonth(value || viewDate, diff * MONTH_COL_COUNT), "key");
},
onEnter: function onEnter() {
onPanelChange("date", value || viewDate);
}
});
}
};
var onYearChange = function onYearChange2(diff) {
var newDate = generateConfig2.addYear(viewDate, diff);
onViewDateChange(newDate);
onPanelChange(null, newDate);
};
return /* @__PURE__ */ jsxs("div", {
className: panelPrefixCls,
children: [/* @__PURE__ */ jsx(MonthHeader, {
...props,
prefixCls,
onPrevYear: function onPrevYear() {
onYearChange(-1);
},
onNextYear: function onNextYear() {
onYearChange(1);
},
onYearClick: function onYearClick() {
onPanelChange("year", viewDate);
}
}), /* @__PURE__ */ jsx(MonthBody, {
...props,
prefixCls,
onSelect: function onSelect(date2) {
_onSelect(date2, "mouse");
onPanelChange("date", date2);
}
})]
});
}
function QuarterHeader(props) {
var prefixCls = props.prefixCls, generateConfig2 = props.generateConfig, locale2 = props.locale, viewDate = props.viewDate, onNextYear = props.onNextYear, onPrevYear = props.onPrevYear, onYearClick = props.onYearClick;
var _React$useContext = React__namespace.useContext(PanelContext), hideHeader = _React$useContext.hideHeader;
if (hideHeader) {
return null;
}
var headerPrefixCls = "".concat(prefixCls, "-header");
return /* @__PURE__ */ jsx(Header$1, {
...props,
prefixCls: headerPrefixCls,
onSuperPrev: onPrevYear,
onSuperNext: onNextYear,
children: /* @__PURE__ */ jsx("button", {
type: "button",
onClick: onYearClick,
className: "".concat(prefixCls, "-year-btn"),
children: formatValue(viewDate, {
locale: locale2,
format: locale2.yearFormat,
generateConfig: generateConfig2
})
})
});
}
var QUARTER_COL_COUNT = 4;
var QUARTER_ROW_COUNT = 1;
function QuarterBody(props) {
var prefixCls = props.prefixCls, locale2 = props.locale, value = props.value, viewDate = props.viewDate, generateConfig2 = props.generateConfig;
var _React$useContext = React__namespace.useContext(RangeContext), rangedValue = _React$useContext.rangedValue, hoverRangedValue = _React$useContext.hoverRangedValue;
var cellPrefixCls = "".concat(prefixCls, "-cell");
var getCellClassName = useCellClassName({
cellPrefixCls,
value,
generateConfig: generateConfig2,
rangedValue,
hoverRangedValue,
isSameCell: function isSameCell(current, target) {
return isSameQuarter(generateConfig2, current, target);
},
isInView: function isInView() {
return true;
},
offsetCell: function offsetCell(date2, offset2) {
return generateConfig2.addMonth(date2, offset2 * 3);
}
});
var baseQuarter = generateConfig2.setDate(generateConfig2.setMonth(viewDate, 0), 1);
return /* @__PURE__ */ jsx(PanelBody, {
...props,
rowNum: QUARTER_ROW_COUNT,
colNum: QUARTER_COL_COUNT,
baseDate: baseQuarter,
getCellText: function getCellText(date2) {
return formatValue(date2, {
locale: locale2,
format: locale2.quarterFormat || "[Q]Q",
generateConfig: generateConfig2
});
},
getCellClassName,
getCellDate: function getCellDate(date2, offset2) {
return generateConfig2.addMonth(date2, offset2 * 3);
},
titleCell: function titleCell(date2) {
return formatValue(date2, {
locale: locale2,
format: "YYYY-[Q]Q",
generateConfig: generateConfig2
});
}
});
}
function QuarterPanel(props) {
var prefixCls = props.prefixCls, operationRef = props.operationRef, onViewDateChange = props.onViewDateChange, generateConfig2 = props.generateConfig, value = props.value, viewDate = props.viewDate, onPanelChange = props.onPanelChange, _onSelect = props.onSelect;
var panelPrefixCls = "".concat(prefixCls, "-quarter-panel");
operationRef.current = {
onKeyDown: function onKeyDown2(event) {
return createKeyDownHandler(event, {
onLeftRight: function onLeftRight(diff) {
_onSelect(generateConfig2.addMonth(value || viewDate, diff * 3), "key");
},
onCtrlLeftRight: function onCtrlLeftRight(diff) {
_onSelect(generateConfig2.addYear(value || viewDate, diff), "key");
},
onUpDown: function onUpDown(diff) {
_onSelect(generateConfig2.addYear(value || viewDate, diff), "key");
}
});
}
};
var onYearChange = function onYearChange2(diff) {
var newDate = generateConfig2.addYear(viewDate, diff);
onViewDateChange(newDate);
onPanelChange(null, newDate);
};
return /* @__PURE__ */ jsxs("div", {
className: panelPrefixCls,
children: [/* @__PURE__ */ jsx(QuarterHeader, {
...props,
prefixCls,
onPrevYear: function onPrevYear() {
onYearChange(-1);
},
onNextYear: function onNextYear() {
onYearChange(1);
},
onYearClick: function onYearClick() {
onPanelChange("year", viewDate);
}
}), /* @__PURE__ */ jsx(QuarterBody, {
...props,
prefixCls,
onSelect: function onSelect(date2) {
_onSelect(date2, "mouse");
}
})]
});
}
function YearHeader(props) {
var prefixCls = props.prefixCls, generateConfig2 = props.generateConfig, viewDate = props.viewDate, onPrevDecade = props.onPrevDecade, onNextDecade = props.onNextDecade, onDecadeClick = props.onDecadeClick;
var _React$useContext = React__namespace.useContext(PanelContext), hideHeader = _React$useContext.hideHeader;
if (hideHeader) {
return null;
}
var headerPrefixCls = "".concat(prefixCls, "-header");
var yearNumber = generateConfig2.getYear(viewDate);
var startYear = Math.floor(yearNumber / YEAR_DECADE_COUNT) * YEAR_DECADE_COUNT;
var endYear = startYear + YEAR_DECADE_COUNT - 1;
return /* @__PURE__ */ jsx(Header$1, {
...props,
prefixCls: headerPrefixCls,
onSuperPrev: onPrevDecade,
onSuperNext: onNextDecade,
children: /* @__PURE__ */ jsxs("button", {
type: "button",
onClick: onDecadeClick,
className: "".concat(prefixCls, "-decade-btn"),
children: [startYear, "-", endYear]
})
});
}
var YEAR_COL_COUNT = 3;
var YEAR_ROW_COUNT = 4;
function YearBody(props) {
var prefixCls = props.prefixCls, value = props.value, viewDate = props.viewDate, locale2 = props.locale, generateConfig2 = props.generateConfig;
var _React$useContext = React__namespace.useContext(RangeContext), rangedValue = _React$useContext.rangedValue, hoverRangedValue = _React$useContext.hoverRangedValue;
var yearPrefixCls = "".concat(prefixCls, "-cell");
var yearNumber = generateConfig2.getYear(viewDate);
var startYear = Math.floor(yearNumber / YEAR_DECADE_COUNT) * YEAR_DECADE_COUNT;
var endYear = startYear + YEAR_DECADE_COUNT - 1;
var baseYear = generateConfig2.setYear(viewDate, startYear - Math.ceil((YEAR_COL_COUNT * YEAR_ROW_COUNT - YEAR_DECADE_COUNT) / 2));
var isInView = function isInView2(date2) {
var currentYearNumber = generateConfig2.getYear(date2);
return startYear <= currentYearNumber && currentYearNumber <= endYear;
};
var getCellClassName = useCellClassName({
cellPrefixCls: yearPrefixCls,
value,
generateConfig: generateConfig2,
rangedValue,
hoverRangedValue,
isSameCell: function isSameCell(current, target) {
return isSameYear(generateConfig2, current, target);
},
isInView,
offsetCell: function offsetCell(date2, offset2) {
return generateConfig2.addYear(date2, offset2);
}
});
return /* @__PURE__ */ jsx(PanelBody, {
...props,
rowNum: YEAR_ROW_COUNT,
colNum: YEAR_COL_COUNT,
baseDate: baseYear,
getCellText: generateConfig2.getYear,
getCellClassName,
getCellDate: generateConfig2.addYear,
titleCell: function titleCell(date2) {
return formatValue(date2, {
locale: locale2,
format: "YYYY",
generateConfig: generateConfig2
});
}
});
}
var YEAR_DECADE_COUNT = 10;
function YearPanel(props) {
var prefixCls = props.prefixCls, operationRef = props.operationRef, onViewDateChange = props.onViewDateChange, generateConfig2 = props.generateConfig, value = props.value, viewDate = props.viewDate, sourceMode = props.sourceMode, _onSelect = props.onSelect, onPanelChange = props.onPanelChange;
var panelPrefixCls = "".concat(prefixCls, "-year-panel");
operationRef.current = {
onKeyDown: function onKeyDown2(event) {
return createKeyDownHandler(event, {
onLeftRight: function onLeftRight(diff) {
_onSelect(generateConfig2.addYear(value || viewDate, diff), "key");
},
onCtrlLeftRight: function onCtrlLeftRight(diff) {
_onSelect(generateConfig2.addYear(value || viewDate, diff * YEAR_DECADE_COUNT), "key");
},
onUpDown: function onUpDown(diff) {
_onSelect(generateConfig2.addYear(value || viewDate, diff * YEAR_COL_COUNT), "key");
},
onEnter: function onEnter() {
onPanelChange(sourceMode === "date" ? "date" : "month", value || viewDate);
}
});
}
};
var onDecadeChange = function onDecadeChange2(diff) {
var newDate = generateConfig2.addYear(viewDate, diff * 10);
onViewDateChange(newDate);
onPanelChange(null, newDate);
};
return /* @__PURE__ */ jsxs("div", {
className: panelPrefixCls,
children: [/* @__PURE__ */ jsx(YearHeader, {
...props,
prefixCls,
onPrevDecade: function onPrevDecade() {
onDecadeChange(-1);
},
onNextDecade: function onNextDecade() {
onDecadeChange(1);
},
onDecadeClick: function onDecadeClick() {
onPanelChange("decade", viewDate);
}
}), /* @__PURE__ */ jsx(YearBody, {
...props,
prefixCls,
onSelect: function onSelect(date2) {
onPanelChange(sourceMode === "date" ? "date" : "month", date2);
_onSelect(date2, "mouse");
}
})]
});
}
function getExtraFooter(prefixCls, mode, renderExtraFooter) {
if (!renderExtraFooter) {
return null;
}
return /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-footer-extra"),
children: renderExtraFooter(mode)
});
}
function getRanges(_ref) {
var prefixCls = _ref.prefixCls, _ref$rangeList = _ref.rangeList, rangeList = _ref$rangeList === void 0 ? [] : _ref$rangeList, _ref$components = _ref.components, components = _ref$components === void 0 ? {} : _ref$components, needConfirmButton = _ref.needConfirmButton, onNow = _ref.onNow, onOk = _ref.onOk, okDisabled = _ref.okDisabled, showNow = _ref.showNow, locale2 = _ref.locale;
var presetNode;
var okNode;
if (rangeList.length) {
var Item2 = components.rangeItem || "span";
presetNode = /* @__PURE__ */ jsx(Fragment, {
children: rangeList.map(function(_ref2) {
var label = _ref2.label, onClick = _ref2.onClick, onMouseEnter = _ref2.onMouseEnter, onMouseLeave = _ref2.onMouseLeave;
return /* @__PURE__ */ jsx("li", {
className: "".concat(prefixCls, "-preset"),
children: /* @__PURE__ */ jsx(Item2, {
onClick,
onMouseEnter,
onMouseLeave,
children: label
})
}, label);
})
});
}
if (needConfirmButton) {
var Button2 = components.button || "button";
if (onNow && !presetNode && showNow !== false) {
presetNode = /* @__PURE__ */ jsx("li", {
className: "".concat(prefixCls, "-now"),
children: /* @__PURE__ */ jsx("a", {
className: "".concat(prefixCls, "-now-btn"),
onClick: onNow,
children: locale2.now
})
});
}
okNode = needConfirmButton && /* @__PURE__ */ jsx("li", {
className: "".concat(prefixCls, "-ok"),
children: /* @__PURE__ */ jsx(Button2, {
disabled: okDisabled,
onClick: onOk,
children: locale2.ok
})
});
}
if (!presetNode && !okNode) {
return null;
}
return /* @__PURE__ */ jsxs("ul", {
className: "".concat(prefixCls, "-ranges"),
children: [presetNode, okNode]
});
}
var CALENDAR_PANEL_MODE = ["date", "month"];
function PickerPanel(props) {
var _classNames;
var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-picker" : _props$prefixCls, className = props.className, style2 = props.style, locale2 = props.locale, generateConfig2 = props.generateConfig, value = props.value, defaultValue = props.defaultValue, pickerValue = props.pickerValue, defaultPickerValue = props.defaultPickerValue, disabledDate = props.disabledDate, mode = props.mode, _props$picker = props.picker, picker = _props$picker === void 0 ? "date" : _props$picker, _props$tabIndex = props.tabIndex, tabIndex = _props$tabIndex === void 0 ? 0 : _props$tabIndex, showNow = props.showNow, showTime = props.showTime, showToday = props.showToday, renderExtraFooter = props.renderExtraFooter, hideHeader = props.hideHeader, onSelect = props.onSelect, onChange = props.onChange, onPanelChange = props.onPanelChange, onMouseDown = props.onMouseDown, onPickerValueChange = props.onPickerValueChange, _onOk = props.onOk, components = props.components, direction = props.direction, _props$hourStep = props.hourStep, hourStep = _props$hourStep === void 0 ? 1 : _props$hourStep, _props$minuteStep = props.minuteStep, minuteStep = _props$minuteStep === void 0 ? 1 : _props$minuteStep, _props$secondStep = props.secondStep, secondStep = _props$secondStep === void 0 ? 1 : _props$secondStep;
var needConfirmButton = picker === "date" && !!showTime || picker === "time";
var isHourStepValid = 24 % hourStep === 0;
var isMinuteStepValid = 60 % minuteStep === 0;
var isSecondStepValid = 60 % secondStep === 0;
var panelContext = React__namespace.useContext(PanelContext);
var operationRef = panelContext.operationRef, panelDivRef = panelContext.panelRef, onContextSelect = panelContext.onSelect, hideRanges = panelContext.hideRanges, defaultOpenValue = panelContext.defaultOpenValue;
var _React$useContext = React__namespace.useContext(RangeContext), inRange = _React$useContext.inRange, panelPosition = _React$useContext.panelPosition, rangedValue = _React$useContext.rangedValue, hoverRangedValue = _React$useContext.hoverRangedValue;
var panelRef = React__namespace.useRef({});
var initRef = React__namespace.useRef(true);
var _useMergedState = useMergedState(null, {
value,
defaultValue,
postState: function postState(val) {
if (!val && defaultOpenValue && picker === "time") {
return defaultOpenValue;
}
return val;
}
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), mergedValue = _useMergedState2[0], setInnerValue = _useMergedState2[1];
var _useMergedState3 = useMergedState(null, {
value: pickerValue,
defaultValue: defaultPickerValue || mergedValue,
postState: function postState(date2) {
var now3 = generateConfig2.getNow();
if (!date2) {
return now3;
}
if (!mergedValue && showTime) {
var defaultDateObject = _typeof$q(showTime) === "object" ? showTime.defaultValue : defaultValue;
return setDateTime(generateConfig2, Array.isArray(date2) ? date2[0] : date2, defaultDateObject || now3);
}
return Array.isArray(date2) ? date2[0] : date2;
}
}), _useMergedState4 = _slicedToArray$e(_useMergedState3, 2), viewDate = _useMergedState4[0], setInnerViewDate = _useMergedState4[1];
var setViewDate = function setViewDate2(date2) {
setInnerViewDate(date2);
if (onPickerValueChange) {
onPickerValueChange(date2);
}
};
var getInternalNextMode = function getInternalNextMode2(nextMode) {
var getNextMode = PickerModeMap[picker];
if (getNextMode) {
return getNextMode(nextMode);
}
return nextMode;
};
var _useMergedState5 = useMergedState(function() {
if (picker === "time") {
return "time";
}
return getInternalNextMode("date");
}, {
value: mode
}), _useMergedState6 = _slicedToArray$e(_useMergedState5, 2), mergedMode = _useMergedState6[0], setInnerMode = _useMergedState6[1];
React__namespace.useEffect(function() {
setInnerMode(picker);
}, [picker]);
var _React$useState = React__namespace.useState(function() {
return mergedMode;
}), _React$useState2 = _slicedToArray$e(_React$useState, 2), sourceMode = _React$useState2[0], setSourceMode = _React$useState2[1];
var onInternalPanelChange = function onInternalPanelChange2(newMode, viewValue) {
var nextMode = getInternalNextMode(newMode || mergedMode);
setSourceMode(mergedMode);
setInnerMode(nextMode);
if (onPanelChange && (mergedMode !== nextMode || isEqual$1(generateConfig2, viewDate, viewDate))) {
onPanelChange(viewValue, nextMode);
}
};
var triggerSelect = function triggerSelect2(date2, type2) {
var forceTriggerSelect = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : false;
if (mergedMode === picker || forceTriggerSelect) {
setInnerValue(date2);
if (onSelect) {
onSelect(date2);
}
if (onContextSelect) {
onContextSelect(date2, type2);
}
if (onChange && !isEqual$1(generateConfig2, date2, mergedValue) && !(disabledDate === null || disabledDate === void 0 ? void 0 : disabledDate(date2))) {
onChange(date2);
}
}
};
var isSelectable = function isSelectable2(key2) {
if (CALENDAR_PANEL_MODE.includes(mergedMode)) {
var date2;
var operationFnc;
var isDateMode = mergedMode === "date";
if (key2 === KeyCode.PAGE_UP || key2 === KeyCode.PAGE_DOWN) {
operationFnc = isDateMode ? generateConfig2.addMonth : generateConfig2.addYear;
} else {
operationFnc = isDateMode ? generateConfig2.addDate : generateConfig2.addMonth;
}
switch (key2) {
case KeyCode.LEFT:
case KeyCode.PAGE_UP:
date2 = operationFnc(viewDate, -1);
break;
case KeyCode.RIGHT:
case KeyCode.PAGE_DOWN:
date2 = operationFnc(viewDate, 1);
break;
case KeyCode.UP:
case KeyCode.DOWN:
date2 = operationFnc(viewDate, Number("".concat(key2 === KeyCode.UP ? "-" : "").concat(isDateMode ? WEEK_DAY_COUNT : MONTH_COL_COUNT)));
break;
}
if (date2) {
return !(disabledDate === null || disabledDate === void 0 ? void 0 : disabledDate(date2));
}
}
return true;
};
var onInternalKeyDown = function onInternalKeyDown2(e2) {
if (panelRef.current && panelRef.current.onKeyDown) {
var selectable = true;
var which = e2.which;
if ([KeyCode.LEFT, KeyCode.RIGHT, KeyCode.UP, KeyCode.DOWN, KeyCode.PAGE_UP, KeyCode.PAGE_DOWN, KeyCode.ENTER].includes(which)) {
e2.preventDefault();
if (which !== KeyCode.ENTER && tabIndex === 0) {
selectable = isSelectable(which);
}
}
if (selectable) {
return panelRef.current.onKeyDown(e2);
}
}
{
warningOnce(false, "Panel not correct handle keyDown event. Please help to fire issue about this.");
return false;
}
};
var onInternalBlur = function onInternalBlur2(e2) {
if (panelRef.current && panelRef.current.onBlur) {
panelRef.current.onBlur(e2);
}
};
if (operationRef && panelPosition !== "right") {
operationRef.current = {
onKeyDown: onInternalKeyDown,
onClose: function onClose() {
if (panelRef.current && panelRef.current.onClose) {
panelRef.current.onClose();
}
}
};
}
React__namespace.useEffect(function() {
if (value && !initRef.current) {
setInnerViewDate(value);
}
}, [value]);
React__namespace.useEffect(function() {
initRef.current = false;
}, []);
var panelNode;
var pickerProps = _objectSpread2$a(_objectSpread2$a({}, props), {}, {
operationRef: panelRef,
prefixCls,
viewDate,
value: mergedValue,
onViewDateChange: setViewDate,
sourceMode,
onPanelChange: onInternalPanelChange,
disabledDate
});
delete pickerProps.onChange;
delete pickerProps.onSelect;
switch (mergedMode) {
case "decade":
panelNode = /* @__PURE__ */ jsx(DecadePanel, {
...pickerProps,
onSelect: function onSelect2(date2, type2) {
setViewDate(date2);
triggerSelect(date2, type2);
}
});
break;
case "year":
panelNode = /* @__PURE__ */ jsx(YearPanel, {
...pickerProps,
onSelect: function onSelect2(date2, type2) {
setViewDate(date2);
triggerSelect(date2, type2);
}
});
break;
case "month":
panelNode = /* @__PURE__ */ jsx(MonthPanel, {
...pickerProps,
onSelect: function onSelect2(date2, type2) {
setViewDate(date2);
triggerSelect(date2, type2);
}
});
break;
case "quarter":
panelNode = /* @__PURE__ */ jsx(QuarterPanel, {
...pickerProps,
onSelect: function onSelect2(date2, type2) {
setViewDate(date2);
triggerSelect(date2, type2);
}
});
break;
case "week":
panelNode = /* @__PURE__ */ jsx(WeekPanel, {
...pickerProps,
onSelect: function onSelect2(date2, type2) {
setViewDate(date2);
triggerSelect(date2, type2);
}
});
break;
case "time":
delete pickerProps.showTime;
panelNode = /* @__PURE__ */ jsx(TimePanel, {
...pickerProps,
..._typeof$q(showTime) === "object" ? showTime : null,
onSelect: function onSelect2(date2, type2) {
setViewDate(date2);
triggerSelect(date2, type2);
}
});
break;
default:
if (showTime) {
panelNode = /* @__PURE__ */ jsx(DatetimePanel, {
...pickerProps,
onSelect: function onSelect2(date2, type2) {
setViewDate(date2);
triggerSelect(date2, type2);
}
});
} else {
panelNode = /* @__PURE__ */ jsx(DatePanel, {
...pickerProps,
onSelect: function onSelect2(date2, type2) {
setViewDate(date2);
triggerSelect(date2, type2);
}
});
}
}
var extraFooter;
var rangesNode;
var onNow = function onNow2() {
var now3 = generateConfig2.getNow();
var lowerBoundTime = getLowerBoundTime(generateConfig2.getHour(now3), generateConfig2.getMinute(now3), generateConfig2.getSecond(now3), isHourStepValid ? hourStep : 1, isMinuteStepValid ? minuteStep : 1, isSecondStepValid ? secondStep : 1);
var adjustedNow = setTime(
generateConfig2,
now3,
lowerBoundTime[0],
lowerBoundTime[1],
lowerBoundTime[2]
);
triggerSelect(adjustedNow, "submit");
};
if (!hideRanges) {
extraFooter = getExtraFooter(prefixCls, mergedMode, renderExtraFooter);
rangesNode = getRanges({
prefixCls,
components,
needConfirmButton,
okDisabled: !mergedValue || disabledDate && disabledDate(mergedValue),
locale: locale2,
showNow,
onNow: needConfirmButton && onNow,
onOk: function onOk() {
if (mergedValue) {
triggerSelect(mergedValue, "submit", true);
if (_onOk) {
_onOk(mergedValue);
}
}
}
});
}
var todayNode;
if (showToday && mergedMode === "date" && picker === "date" && !showTime) {
var now2 = generateConfig2.getNow();
var todayCls = "".concat(prefixCls, "-today-btn");
var disabled = disabledDate && disabledDate(now2);
todayNode = /* @__PURE__ */ jsx("a", {
className: classnames(todayCls, disabled && "".concat(todayCls, "-disabled")),
"aria-disabled": disabled,
onClick: function onClick() {
if (!disabled) {
triggerSelect(now2, "mouse", true);
}
},
children: locale2.today
});
}
return /* @__PURE__ */ jsx(PanelContext.Provider, {
value: _objectSpread2$a(_objectSpread2$a({}, panelContext), {}, {
mode: mergedMode,
hideHeader: "hideHeader" in props ? hideHeader : panelContext.hideHeader,
hidePrevBtn: inRange && panelPosition === "right",
hideNextBtn: inRange && panelPosition === "left"
}),
children: /* @__PURE__ */ jsxs("div", {
tabIndex,
className: classnames("".concat(prefixCls, "-panel"), className, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-panel-has-range"), rangedValue && rangedValue[0] && rangedValue[1]), _defineProperty$b(_classNames, "".concat(prefixCls, "-panel-has-range-hover"), hoverRangedValue && hoverRangedValue[0] && hoverRangedValue[1]), _defineProperty$b(_classNames, "".concat(prefixCls, "-panel-rtl"), direction === "rtl"), _classNames)),
style: style2,
onKeyDown: onInternalKeyDown,
onBlur: onInternalBlur,
onMouseDown,
ref: panelDivRef,
children: [panelNode, extraFooter || rangesNode || todayNode ? /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-footer"),
children: [extraFooter, rangesNode, todayNode]
}) : null]
})
});
}
var BUILT_IN_PLACEMENTS = {
bottomLeft: {
points: ["tl", "bl"],
offset: [0, 4],
overflow: {
adjustX: 1,
adjustY: 1
}
},
bottomRight: {
points: ["tr", "br"],
offset: [0, 4],
overflow: {
adjustX: 1,
adjustY: 1
}
},
topLeft: {
points: ["bl", "tl"],
offset: [0, -4],
overflow: {
adjustX: 0,
adjustY: 1
}
},
topRight: {
points: ["br", "tr"],
offset: [0, -4],
overflow: {
adjustX: 0,
adjustY: 1
}
}
};
function PickerTrigger(_ref) {
var _classNames;
var prefixCls = _ref.prefixCls, popupElement = _ref.popupElement, popupStyle = _ref.popupStyle, visible = _ref.visible, dropdownClassName = _ref.dropdownClassName, dropdownAlign = _ref.dropdownAlign, transitionName2 = _ref.transitionName, getPopupContainer = _ref.getPopupContainer, children = _ref.children, range2 = _ref.range, popupPlacement = _ref.popupPlacement, direction = _ref.direction;
var dropdownPrefixCls = "".concat(prefixCls, "-dropdown");
var getPopupPlacement = function getPopupPlacement2() {
if (popupPlacement !== void 0) {
return popupPlacement;
}
return direction === "rtl" ? "bottomRight" : "bottomLeft";
};
return /* @__PURE__ */ jsx(Trigger$1, {
showAction: [],
hideAction: [],
popupPlacement: getPopupPlacement(),
builtinPlacements: BUILT_IN_PLACEMENTS,
prefixCls: dropdownPrefixCls,
popupTransitionName: transitionName2,
popup: popupElement,
popupAlign: dropdownAlign,
popupVisible: visible,
popupClassName: classnames(dropdownClassName, (_classNames = {}, _defineProperty$b(_classNames, "".concat(dropdownPrefixCls, "-range"), range2), _defineProperty$b(_classNames, "".concat(dropdownPrefixCls, "-rtl"), direction === "rtl"), _classNames)),
popupStyle,
getPopupContainer,
children
});
}
function usePickerInput(_ref) {
var open = _ref.open, value = _ref.value, isClickOutside = _ref.isClickOutside, triggerOpen = _ref.triggerOpen, forwardKeyDown = _ref.forwardKeyDown, _onKeyDown = _ref.onKeyDown, blurToCancel = _ref.blurToCancel, onSubmit = _ref.onSubmit, onCancel = _ref.onCancel, _onFocus = _ref.onFocus, _onBlur = _ref.onBlur, currentFocusedKey = _ref.currentFocusedKey, _ref$key = _ref.key, key2 = _ref$key === void 0 ? "start" : _ref$key;
var _useState = React$a.useState(false), _useState2 = _slicedToArray$e(_useState, 2), typing = _useState2[0], setTyping = _useState2[1];
var _useState3 = React$a.useState(false), _useState4 = _slicedToArray$e(_useState3, 2), focused = _useState4[0], setFocused = _useState4[1];
var delayBlurTimer = React$a.useRef();
var preventBlurRef = React$a.useRef(false);
var valueChangedRef = React$a.useRef(false);
var preventDefaultRef = React$a.useRef(false);
var inputProps = {
onMouseDown: function onMouseDown() {
setTyping(true);
triggerOpen(true);
},
onKeyDown: function onKeyDown2(e2) {
var preventDefault = function preventDefault2() {
preventDefaultRef.current = true;
};
_onKeyDown(e2, preventDefault);
if (preventDefaultRef.current)
return;
switch (e2.which) {
case KeyCode.ENTER: {
if (!open) {
triggerOpen(true);
} else if (onSubmit() !== false) {
setTyping(true);
}
e2.preventDefault();
return;
}
case KeyCode.TAB: {
if (typing && open && !e2.shiftKey) {
setTyping(false);
e2.preventDefault();
} else if (!typing && open) {
if (!forwardKeyDown(e2) && e2.shiftKey) {
setTyping(true);
e2.preventDefault();
}
}
return;
}
case KeyCode.ESC: {
setTyping(true);
onCancel();
return;
}
}
if (!open && ![KeyCode.SHIFT].includes(e2.which)) {
triggerOpen(true);
} else if (!typing) {
forwardKeyDown(e2);
}
},
onFocus: function onFocus(e2) {
setTyping(true);
setFocused(true);
if (currentFocusedKey) {
currentFocusedKey.current = key2;
}
clearTimeout(delayBlurTimer.current);
if (_onFocus) {
_onFocus(e2);
}
},
onBlur: function onBlur(e2) {
if (preventBlurRef.current || !isClickOutside(document.activeElement)) {
preventBlurRef.current = false;
return;
}
if (blurToCancel) {
setTimeout(function() {
var _document = document, activeElement = _document.activeElement;
while (activeElement && activeElement.shadowRoot) {
activeElement = activeElement.shadowRoot.activeElement;
}
if (isClickOutside(activeElement)) {
onCancel();
}
}, 0);
} else if (open) {
triggerOpen(false);
if (valueChangedRef.current) {
onSubmit();
}
}
setFocused(false);
if (currentFocusedKey) {
currentFocusedKey.current = "";
delayBlurTimer.current = setTimeout(function() {
if (currentFocusedKey.current) {
return;
}
_onBlur === null || _onBlur === void 0 ? void 0 : _onBlur(e2);
}, 100);
} else {
_onBlur === null || _onBlur === void 0 ? void 0 : _onBlur(e2);
}
}
};
React$a.useEffect(function() {
valueChangedRef.current = false;
}, [open]);
React$a.useEffect(function() {
valueChangedRef.current = true;
}, [value]);
React$a.useEffect(function() {
return addGlobalMouseDownEvent(function(e2) {
var target = getTargetFromEvent(e2);
var clickedOutside = isClickOutside(target);
if (open) {
if (!clickedOutside) {
preventBlurRef.current = true;
requestAnimationFrame(function() {
preventBlurRef.current = false;
});
} else if (!focused || clickedOutside) {
triggerOpen(false);
}
} else if (focused && !clickedOutside) {
preventBlurRef.current = true;
}
});
});
React$a.useEffect(function() {
return function() {
return clearTimeout(delayBlurTimer.current);
};
}, []);
return [inputProps, {
focused,
typing
}];
}
function useTextValueMapping(_ref) {
var valueTexts = _ref.valueTexts, onTextChange = _ref.onTextChange;
var _React$useState = React__namespace.useState(""), _React$useState2 = _slicedToArray$e(_React$useState, 2), text = _React$useState2[0], setInnerText = _React$useState2[1];
var valueTextsRef = React__namespace.useRef([]);
valueTextsRef.current = valueTexts;
function triggerTextChange(value) {
setInnerText(value);
onTextChange(value);
}
function resetText() {
setInnerText(valueTextsRef.current[0]);
}
React__namespace.useEffect(function() {
if (valueTexts.every(function(valText) {
return valText !== text;
})) {
resetText();
}
}, [valueTexts.join("||")]);
return [text, triggerTextChange, resetText];
}
var shallowequal = function shallowEqual(objA, objB, compare, compareContext) {
var ret = compare ? compare.call(compareContext, objA, objB) : void 0;
if (ret !== void 0) {
return !!ret;
}
if (objA === objB) {
return true;
}
if (typeof objA !== "object" || !objA || typeof objB !== "object" || !objB) {
return false;
}
var keysA = Object.keys(objA);
var keysB = Object.keys(objB);
if (keysA.length !== keysB.length) {
return false;
}
var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB);
for (var idx = 0; idx < keysA.length; idx++) {
var key2 = keysA[idx];
if (!bHasOwnProperty(key2)) {
return false;
}
var valueA = objA[key2];
var valueB = objB[key2];
ret = compare ? compare.call(compareContext, valueA, valueB, key2) : void 0;
if (ret === false || ret === void 0 && valueA !== valueB) {
return false;
}
}
return true;
};
function useValueTexts(value, _ref) {
var formatList = _ref.formatList, generateConfig2 = _ref.generateConfig, locale2 = _ref.locale;
return useMemo(function() {
if (!value) {
return [[""], ""];
}
var firstValueText = "";
var fullValueTexts = [];
for (var i2 = 0; i2 < formatList.length; i2 += 1) {
var format2 = formatList[i2];
var formatStr = formatValue(value, {
generateConfig: generateConfig2,
locale: locale2,
format: format2
});
fullValueTexts.push(formatStr);
if (i2 === 0) {
firstValueText = formatStr;
}
}
return [fullValueTexts, firstValueText];
}, [value, formatList], function(prev, next) {
return prev[0] !== next[0] || !shallowequal(prev[1], next[1]);
});
}
function useHoverValue(valueText, _ref) {
var formatList = _ref.formatList, generateConfig2 = _ref.generateConfig, locale2 = _ref.locale;
var _useState = React$a.useState(null), _useState2 = _slicedToArray$e(_useState, 2), value = _useState2[0], internalSetValue = _useState2[1];
var raf2 = React$a.useRef(null);
function setValue2(val) {
var immediately = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
cancelAnimationFrame(raf2.current);
if (immediately) {
internalSetValue(val);
return;
}
raf2.current = requestAnimationFrame(function() {
internalSetValue(val);
});
}
var _useValueTexts = useValueTexts(value, {
formatList,
generateConfig: generateConfig2,
locale: locale2
}), _useValueTexts2 = _slicedToArray$e(_useValueTexts, 2), firstText = _useValueTexts2[1];
function onEnter(date2) {
setValue2(date2);
}
function onLeave() {
var immediately = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
setValue2(null, immediately);
}
React$a.useEffect(function() {
onLeave(true);
}, [valueText]);
React$a.useEffect(function() {
return function() {
return cancelAnimationFrame(raf2.current);
};
}, []);
return [firstText, onEnter, onLeave];
}
function InnerPicker(props) {
var _classNames2;
var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-picker" : _props$prefixCls, id2 = props.id, tabIndex = props.tabIndex, style2 = props.style, className = props.className, dropdownClassName = props.dropdownClassName, dropdownAlign = props.dropdownAlign, popupStyle = props.popupStyle, transitionName2 = props.transitionName, generateConfig2 = props.generateConfig, locale2 = props.locale, inputReadOnly = props.inputReadOnly, allowClear = props.allowClear, autoFocus = props.autoFocus, showTime = props.showTime, _props$picker = props.picker, picker = _props$picker === void 0 ? "date" : _props$picker, format2 = props.format, use12Hours = props.use12Hours, value = props.value, defaultValue = props.defaultValue, open = props.open, defaultOpen = props.defaultOpen, defaultOpenValue = props.defaultOpenValue, suffixIcon = props.suffixIcon, clearIcon = props.clearIcon, disabled = props.disabled, disabledDate = props.disabledDate, placeholder = props.placeholder, getPopupContainer = props.getPopupContainer, pickerRef = props.pickerRef, panelRender = props.panelRender, onChange = props.onChange, onOpenChange = props.onOpenChange, onFocus = props.onFocus, onBlur = props.onBlur, onMouseDown = props.onMouseDown, onMouseUp = props.onMouseUp, onMouseEnter = props.onMouseEnter, onMouseLeave = props.onMouseLeave, onContextMenu = props.onContextMenu, onClick = props.onClick, _onKeyDown = props.onKeyDown, _onSelect = props.onSelect, direction = props.direction, _props$autoComplete = props.autoComplete, autoComplete = _props$autoComplete === void 0 ? "off" : _props$autoComplete, inputRender = props.inputRender;
var inputRef = React__namespace.useRef(null);
var needConfirmButton = picker === "date" && !!showTime || picker === "time";
var formatList = toArray$6(getDefaultFormat(format2, picker, showTime, use12Hours));
var panelDivRef = React__namespace.useRef(null);
var inputDivRef = React__namespace.useRef(null);
var containerRef = React__namespace.useRef(null);
var _useMergedState = useMergedState(null, {
value,
defaultValue
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), mergedValue = _useMergedState2[0], setInnerValue = _useMergedState2[1];
var _React$useState = React__namespace.useState(mergedValue), _React$useState2 = _slicedToArray$e(_React$useState, 2), selectedValue = _React$useState2[0], setSelectedValue = _React$useState2[1];
var operationRef = React__namespace.useRef(null);
var _useMergedState3 = useMergedState(false, {
value: open,
defaultValue: defaultOpen,
postState: function postState(postOpen) {
return disabled ? false : postOpen;
},
onChange: function onChange2(newOpen) {
if (onOpenChange) {
onOpenChange(newOpen);
}
if (!newOpen && operationRef.current && operationRef.current.onClose) {
operationRef.current.onClose();
}
}
}), _useMergedState4 = _slicedToArray$e(_useMergedState3, 2), mergedOpen = _useMergedState4[0], triggerInnerOpen = _useMergedState4[1];
var _useValueTexts = useValueTexts(selectedValue, {
formatList,
generateConfig: generateConfig2,
locale: locale2
}), _useValueTexts2 = _slicedToArray$e(_useValueTexts, 2), valueTexts = _useValueTexts2[0], firstValueText = _useValueTexts2[1];
var _useTextValueMapping = useTextValueMapping({
valueTexts,
onTextChange: function onTextChange(newText) {
var inputDate = parseValue(newText, {
locale: locale2,
formatList,
generateConfig: generateConfig2
});
if (inputDate && (!disabledDate || !disabledDate(inputDate))) {
setSelectedValue(inputDate);
}
}
}), _useTextValueMapping2 = _slicedToArray$e(_useTextValueMapping, 3), text = _useTextValueMapping2[0], triggerTextChange = _useTextValueMapping2[1], resetText = _useTextValueMapping2[2];
var triggerChange = function triggerChange2(newValue) {
setSelectedValue(newValue);
setInnerValue(newValue);
if (onChange && !isEqual$1(generateConfig2, mergedValue, newValue)) {
onChange(newValue, newValue ? formatValue(newValue, {
generateConfig: generateConfig2,
locale: locale2,
format: formatList[0]
}) : "");
}
};
var triggerOpen = function triggerOpen2(newOpen) {
if (disabled && newOpen) {
return;
}
triggerInnerOpen(newOpen);
};
var forwardKeyDown = function forwardKeyDown2(e2) {
if (mergedOpen && operationRef.current && operationRef.current.onKeyDown) {
return operationRef.current.onKeyDown(e2);
}
{
warningOnce(false, "Picker not correct forward KeyDown operation. Please help to fire issue about this.");
return false;
}
};
var onInternalClick = function onInternalClick2() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
onClick === null || onClick === void 0 ? void 0 : onClick.apply(void 0, args);
if (inputRef.current) {
inputRef.current.focus();
triggerOpen(true);
}
};
var _usePickerInput = usePickerInput({
blurToCancel: needConfirmButton,
open: mergedOpen,
value: text,
triggerOpen,
forwardKeyDown,
isClickOutside: function isClickOutside(target) {
return !elementsContains([panelDivRef.current, inputDivRef.current, containerRef.current], target);
},
onSubmit: function onSubmit() {
if (!selectedValue || disabledDate && disabledDate(selectedValue)) {
return false;
}
triggerChange(selectedValue);
triggerOpen(false);
resetText();
return true;
},
onCancel: function onCancel() {
triggerOpen(false);
setSelectedValue(mergedValue);
resetText();
},
onKeyDown: function onKeyDown2(e2, preventDefault) {
_onKeyDown === null || _onKeyDown === void 0 ? void 0 : _onKeyDown(e2, preventDefault);
},
onFocus,
onBlur
}), _usePickerInput2 = _slicedToArray$e(_usePickerInput, 2), inputProps = _usePickerInput2[0], _usePickerInput2$ = _usePickerInput2[1], focused = _usePickerInput2$.focused, typing = _usePickerInput2$.typing;
React__namespace.useEffect(function() {
if (!mergedOpen) {
setSelectedValue(mergedValue);
if (!valueTexts.length || valueTexts[0] === "") {
triggerTextChange("");
} else if (firstValueText !== text) {
resetText();
}
}
}, [mergedOpen, valueTexts]);
React__namespace.useEffect(function() {
if (!mergedOpen) {
resetText();
}
}, [picker]);
React__namespace.useEffect(function() {
setSelectedValue(mergedValue);
}, [mergedValue]);
if (pickerRef) {
pickerRef.current = {
focus: function focus() {
if (inputRef.current) {
inputRef.current.focus();
}
},
blur: function blur() {
if (inputRef.current) {
inputRef.current.blur();
}
}
};
}
var _useHoverValue = useHoverValue(text, {
formatList,
generateConfig: generateConfig2,
locale: locale2
}), _useHoverValue2 = _slicedToArray$e(_useHoverValue, 3), hoverValue = _useHoverValue2[0], onEnter = _useHoverValue2[1], onLeave = _useHoverValue2[2];
var panelProps = _objectSpread2$a(_objectSpread2$a({}, props), {}, {
className: void 0,
style: void 0,
pickerValue: void 0,
onPickerValueChange: void 0,
onChange: null
});
var panelNode = /* @__PURE__ */ jsx(PickerPanel, {
...panelProps,
generateConfig: generateConfig2,
className: classnames(_defineProperty$b({}, "".concat(prefixCls, "-panel-focused"), !typing)),
value: selectedValue,
locale: locale2,
tabIndex: -1,
onSelect: function onSelect(date2) {
_onSelect === null || _onSelect === void 0 ? void 0 : _onSelect(date2);
setSelectedValue(date2);
},
direction,
onPanelChange: function onPanelChange(viewDate, mode) {
var onPanelChange2 = props.onPanelChange;
onLeave(true);
onPanelChange2 === null || onPanelChange2 === void 0 ? void 0 : onPanelChange2(viewDate, mode);
}
});
if (panelRender) {
panelNode = panelRender(panelNode);
}
var panel = /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-panel-container"),
onMouseDown: function onMouseDown2(e2) {
e2.preventDefault();
},
children: panelNode
});
var suffixNode;
if (suffixIcon) {
suffixNode = /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-suffix"),
children: suffixIcon
});
}
var clearNode;
if (allowClear && mergedValue && !disabled) {
clearNode = /* @__PURE__ */ jsx("span", {
onMouseDown: function onMouseDown2(e2) {
e2.preventDefault();
e2.stopPropagation();
},
onMouseUp: function onMouseUp2(e2) {
e2.preventDefault();
e2.stopPropagation();
triggerChange(null);
triggerOpen(false);
},
className: "".concat(prefixCls, "-clear"),
role: "button",
children: clearIcon || /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-clear-btn")
})
});
}
var mergedInputProps = _objectSpread2$a(_objectSpread2$a(_objectSpread2$a({
id: id2,
tabIndex,
disabled,
readOnly: inputReadOnly || typeof formatList[0] === "function" || !typing,
value: hoverValue || text,
onChange: function onChange2(e2) {
triggerTextChange(e2.target.value);
},
autoFocus,
placeholder,
ref: inputRef,
title: text
}, inputProps), {}, {
size: getInputSize(picker, formatList[0], generateConfig2)
}, getDataOrAriaProps(props)), {}, {
autoComplete
});
var inputNode = inputRender ? inputRender(mergedInputProps) : /* @__PURE__ */ jsx("input", {
...mergedInputProps
});
var onContextSelect = function onContextSelect2(date2, type2) {
if (type2 === "submit" || type2 !== "key" && !needConfirmButton) {
triggerChange(date2);
triggerOpen(false);
}
};
var popupPlacement = direction === "rtl" ? "bottomRight" : "bottomLeft";
return /* @__PURE__ */ jsx(PanelContext.Provider, {
value: {
operationRef,
hideHeader: picker === "time",
panelRef: panelDivRef,
onSelect: onContextSelect,
open: mergedOpen,
defaultOpenValue,
onDateMouseEnter: onEnter,
onDateMouseLeave: onLeave
},
children: /* @__PURE__ */ jsx(PickerTrigger, {
visible: mergedOpen,
popupElement: panel,
popupStyle,
prefixCls,
dropdownClassName,
dropdownAlign,
getPopupContainer,
transitionName: transitionName2,
popupPlacement,
direction,
children: /* @__PURE__ */ jsx("div", {
ref: containerRef,
className: classnames(prefixCls, className, (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-disabled"), disabled), _defineProperty$b(_classNames2, "".concat(prefixCls, "-focused"), focused), _defineProperty$b(_classNames2, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames2)),
style: style2,
onMouseDown,
onMouseUp,
onMouseEnter,
onMouseLeave,
onContextMenu,
onClick: onInternalClick,
children: /* @__PURE__ */ jsxs("div", {
className: classnames("".concat(prefixCls, "-input"), _defineProperty$b({}, "".concat(prefixCls, "-input-placeholder"), !!hoverValue)),
ref: inputDivRef,
children: [inputNode, suffixNode, clearNode]
})
})
})
});
}
var Picker = /* @__PURE__ */ function(_React$Component) {
_inherits(Picker2, _React$Component);
var _super = _createSuper(Picker2);
function Picker2() {
var _this2;
_classCallCheck(this, Picker2);
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_this2.pickerRef = /* @__PURE__ */ React__namespace.createRef();
_this2.focus = function() {
if (_this2.pickerRef.current) {
_this2.pickerRef.current.focus();
}
};
_this2.blur = function() {
if (_this2.pickerRef.current) {
_this2.pickerRef.current.blur();
}
};
return _this2;
}
_createClass(Picker2, [{
key: "render",
value: function render2() {
return /* @__PURE__ */ jsx(InnerPicker, {
...this.props,
pickerRef: this.pickerRef
});
}
}]);
return Picker2;
}(React__namespace.Component);
function useRangeDisabled(_ref, disabledStart, disabledEnd) {
var picker = _ref.picker, locale2 = _ref.locale, selectedValue = _ref.selectedValue, disabledDate = _ref.disabledDate, disabled = _ref.disabled, generateConfig2 = _ref.generateConfig;
var startDate = getValue$3(selectedValue, 0);
var endDate = getValue$3(selectedValue, 1);
function weekFirstDate(date2) {
return generateConfig2.locale.getWeekFirstDate(locale2.locale, date2);
}
function monthNumber(date2) {
var year = generateConfig2.getYear(date2);
var month = generateConfig2.getMonth(date2);
return year * 100 + month;
}
function quarterNumber(date2) {
var year = generateConfig2.getYear(date2);
var quarter = getQuarter(generateConfig2, date2);
return year * 10 + quarter;
}
var disabledStartDate = React__namespace.useCallback(function(date2) {
if (disabledDate && disabledDate(date2)) {
return true;
}
if (disabled[1] && endDate) {
return !isSameDate(generateConfig2, date2, endDate) && generateConfig2.isAfter(date2, endDate);
}
if (disabledStart && endDate) {
switch (picker) {
case "quarter":
return quarterNumber(date2) > quarterNumber(endDate);
case "month":
return monthNumber(date2) > monthNumber(endDate);
case "week":
return weekFirstDate(date2) > weekFirstDate(endDate);
default:
return !isSameDate(generateConfig2, date2, endDate) && generateConfig2.isAfter(date2, endDate);
}
}
return false;
}, [disabledDate, disabled[1], endDate, disabledStart]);
var disabledEndDate = React__namespace.useCallback(function(date2) {
if (disabledDate && disabledDate(date2)) {
return true;
}
if (disabled[0] && startDate) {
return !isSameDate(generateConfig2, date2, endDate) && generateConfig2.isAfter(startDate, date2);
}
if (disabledEnd && startDate) {
switch (picker) {
case "quarter":
return quarterNumber(date2) < quarterNumber(startDate);
case "month":
return monthNumber(date2) < monthNumber(startDate);
case "week":
return weekFirstDate(date2) < weekFirstDate(startDate);
default:
return !isSameDate(generateConfig2, date2, startDate) && generateConfig2.isAfter(startDate, date2);
}
}
return false;
}, [disabledDate, disabled[0], startDate, disabledEnd]);
return [disabledStartDate, disabledEndDate];
}
function getStartEndDistance(startDate, endDate, picker, generateConfig2) {
var startNext = getClosingViewDate(startDate, picker, generateConfig2, 1);
function getDistance(compareFunc) {
if (compareFunc(startDate, endDate)) {
return "same";
}
if (compareFunc(startNext, endDate)) {
return "closing";
}
return "far";
}
switch (picker) {
case "year":
return getDistance(function(start, end) {
return isSameDecade(generateConfig2, start, end);
});
case "quarter":
case "month":
return getDistance(function(start, end) {
return isSameYear(generateConfig2, start, end);
});
default:
return getDistance(function(start, end) {
return isSameMonth(generateConfig2, start, end);
});
}
}
function getRangeViewDate(values, index2, picker, generateConfig2) {
var startDate = getValue$3(values, 0);
var endDate = getValue$3(values, 1);
if (index2 === 0) {
return startDate;
}
if (startDate && endDate) {
var distance = getStartEndDistance(startDate, endDate, picker, generateConfig2);
switch (distance) {
case "same":
return startDate;
case "closing":
return startDate;
default:
return getClosingViewDate(endDate, picker, generateConfig2, -1);
}
}
return startDate;
}
function useRangeViewDates(_ref) {
var values = _ref.values, picker = _ref.picker, defaultDates = _ref.defaultDates, generateConfig2 = _ref.generateConfig;
var _React$useState = React__namespace.useState(function() {
return [getValue$3(defaultDates, 0), getValue$3(defaultDates, 1)];
}), _React$useState2 = _slicedToArray$e(_React$useState, 2), defaultViewDates = _React$useState2[0], setDefaultViewDates = _React$useState2[1];
var _React$useState3 = React__namespace.useState(null), _React$useState4 = _slicedToArray$e(_React$useState3, 2), viewDates = _React$useState4[0], setInternalViewDates = _React$useState4[1];
var startDate = getValue$3(values, 0);
var endDate = getValue$3(values, 1);
function getViewDate(index2) {
if (defaultViewDates[index2]) {
return defaultViewDates[index2];
}
return getValue$3(viewDates, index2) || getRangeViewDate(values, index2, picker, generateConfig2) || startDate || endDate || generateConfig2.getNow();
}
function setViewDate(viewDate, index2) {
if (viewDate) {
var newViewDates = updateValues(viewDates, viewDate, index2);
setDefaultViewDates(
updateValues(defaultViewDates, null, index2) || [null, null]
);
var anotherIndex = (index2 + 1) % 2;
if (!getValue$3(values, anotherIndex)) {
newViewDates = updateValues(newViewDates, viewDate, anotherIndex);
}
setInternalViewDates(newViewDates);
} else if (startDate || endDate) {
setInternalViewDates(null);
}
}
return [getViewDate, setViewDate];
}
function reorderValues(values, generateConfig2) {
if (values && values[0] && values[1] && generateConfig2.isAfter(values[0], values[1])) {
return [values[1], values[0]];
}
return values;
}
function canValueTrigger(value, index2, disabled, allowEmpty) {
if (value) {
return true;
}
if (allowEmpty && allowEmpty[index2]) {
return true;
}
if (disabled[(index2 + 1) % 2]) {
return true;
}
return false;
}
function InnerRangePicker(props) {
var _classNames2, _classNames3, _classNames4;
var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-picker" : _props$prefixCls, id2 = props.id, style2 = props.style, className = props.className, popupStyle = props.popupStyle, dropdownClassName = props.dropdownClassName, transitionName2 = props.transitionName, dropdownAlign = props.dropdownAlign, getPopupContainer = props.getPopupContainer, generateConfig2 = props.generateConfig, locale2 = props.locale, placeholder = props.placeholder, autoFocus = props.autoFocus, disabled = props.disabled, format2 = props.format, _props$picker = props.picker, picker = _props$picker === void 0 ? "date" : _props$picker, showTime = props.showTime, use12Hours = props.use12Hours, _props$separator = props.separator, separator = _props$separator === void 0 ? "~" : _props$separator, value = props.value, defaultValue = props.defaultValue, defaultPickerValue = props.defaultPickerValue, open = props.open, defaultOpen = props.defaultOpen, disabledDate = props.disabledDate, _disabledTime = props.disabledTime, dateRender = props.dateRender, panelRender = props.panelRender, ranges = props.ranges, allowEmpty = props.allowEmpty, allowClear = props.allowClear, suffixIcon = props.suffixIcon, clearIcon = props.clearIcon, pickerRef = props.pickerRef, inputReadOnly = props.inputReadOnly, mode = props.mode, renderExtraFooter = props.renderExtraFooter, onChange = props.onChange, onOpenChange = props.onOpenChange, onPanelChange = props.onPanelChange, onCalendarChange = props.onCalendarChange, _onFocus = props.onFocus, onBlur = props.onBlur, onMouseDown = props.onMouseDown, onMouseUp = props.onMouseUp, onMouseEnter = props.onMouseEnter, onMouseLeave = props.onMouseLeave, onClick = props.onClick, _onOk = props.onOk, _onKeyDown = props.onKeyDown, components = props.components, order = props.order, direction = props.direction, activePickerIndex = props.activePickerIndex, _props$autoComplete = props.autoComplete, autoComplete = _props$autoComplete === void 0 ? "off" : _props$autoComplete;
var needConfirmButton = picker === "date" && !!showTime || picker === "time";
var openRecordsRef = React$a.useRef({});
var containerRef = React$a.useRef(null);
var panelDivRef = React$a.useRef(null);
var startInputDivRef = React$a.useRef(null);
var endInputDivRef = React$a.useRef(null);
var separatorRef = React$a.useRef(null);
var startInputRef = React$a.useRef(null);
var endInputRef = React$a.useRef(null);
var arrowRef = React$a.useRef(null);
var formatList = toArray$6(getDefaultFormat(format2, picker, showTime, use12Hours));
var _useMergedState = useMergedState(0, {
value: activePickerIndex
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), mergedActivePickerIndex = _useMergedState2[0], setMergedActivePickerIndex = _useMergedState2[1];
var operationRef = React$a.useRef(null);
var mergedDisabled = React__namespace.useMemo(function() {
if (Array.isArray(disabled)) {
return disabled;
}
return [disabled || false, disabled || false];
}, [disabled]);
var _useMergedState3 = useMergedState(null, {
value,
defaultValue,
postState: function postState(values) {
return picker === "time" && !order ? values : reorderValues(values, generateConfig2);
}
}), _useMergedState4 = _slicedToArray$e(_useMergedState3, 2), mergedValue = _useMergedState4[0], setInnerValue = _useMergedState4[1];
var _useRangeViewDates = useRangeViewDates({
values: mergedValue,
picker,
defaultDates: defaultPickerValue,
generateConfig: generateConfig2
}), _useRangeViewDates2 = _slicedToArray$e(_useRangeViewDates, 2), getViewDate = _useRangeViewDates2[0], setViewDate = _useRangeViewDates2[1];
var _useMergedState5 = useMergedState(mergedValue, {
postState: function postState(values) {
var postValues = values;
if (mergedDisabled[0] && mergedDisabled[1]) {
return postValues;
}
for (var i2 = 0; i2 < 2; i2 += 1) {
if (mergedDisabled[i2] && !postValues && !getValue$3(postValues, i2) && !getValue$3(allowEmpty, i2)) {
postValues = updateValues(postValues, generateConfig2.getNow(), i2);
}
}
return postValues;
}
}), _useMergedState6 = _slicedToArray$e(_useMergedState5, 2), selectedValue = _useMergedState6[0], setSelectedValue = _useMergedState6[1];
var _useMergedState7 = useMergedState([picker, picker], {
value: mode
}), _useMergedState8 = _slicedToArray$e(_useMergedState7, 2), mergedModes = _useMergedState8[0], setInnerModes = _useMergedState8[1];
React$a.useEffect(function() {
setInnerModes([picker, picker]);
}, [picker]);
var triggerModesChange = function triggerModesChange2(modes, values) {
setInnerModes(modes);
if (onPanelChange) {
onPanelChange(values, modes);
}
};
var _useRangeDisabled = useRangeDisabled({
picker,
selectedValue,
locale: locale2,
disabled: mergedDisabled,
disabledDate,
generateConfig: generateConfig2
}, openRecordsRef.current[1], openRecordsRef.current[0]), _useRangeDisabled2 = _slicedToArray$e(_useRangeDisabled, 2), disabledStartDate = _useRangeDisabled2[0], disabledEndDate = _useRangeDisabled2[1];
var _useMergedState9 = useMergedState(false, {
value: open,
defaultValue: defaultOpen,
postState: function postState(postOpen) {
return mergedDisabled[mergedActivePickerIndex] ? false : postOpen;
},
onChange: function onChange2(newOpen) {
if (onOpenChange) {
onOpenChange(newOpen);
}
if (!newOpen && operationRef.current && operationRef.current.onClose) {
operationRef.current.onClose();
}
}
}), _useMergedState10 = _slicedToArray$e(_useMergedState9, 2), mergedOpen = _useMergedState10[0], triggerInnerOpen = _useMergedState10[1];
var startOpen = mergedOpen && mergedActivePickerIndex === 0;
var endOpen = mergedOpen && mergedActivePickerIndex === 1;
var _useState = React$a.useState(0), _useState2 = _slicedToArray$e(_useState, 2), popupMinWidth = _useState2[0], setPopupMinWidth = _useState2[1];
React$a.useEffect(function() {
if (!mergedOpen && containerRef.current) {
setPopupMinWidth(containerRef.current.offsetWidth);
}
}, [mergedOpen]);
var triggerRef = React__namespace.useRef();
function _triggerOpen(newOpen, index2) {
if (newOpen) {
clearTimeout(triggerRef.current);
openRecordsRef.current[index2] = true;
setMergedActivePickerIndex(index2);
triggerInnerOpen(newOpen);
if (!mergedOpen) {
setViewDate(null, index2);
}
} else if (mergedActivePickerIndex === index2) {
triggerInnerOpen(newOpen);
var openRecords = openRecordsRef.current;
triggerRef.current = setTimeout(function() {
if (openRecords === openRecordsRef.current) {
openRecordsRef.current = {};
}
});
}
}
function triggerOpenAndFocus(index2) {
_triggerOpen(true, index2);
setTimeout(function() {
var inputRef = [startInputRef, endInputRef][index2];
if (inputRef.current) {
inputRef.current.focus();
}
}, 0);
}
function triggerChange(newValue, sourceIndex) {
var values = newValue;
var startValue = getValue$3(values, 0);
var endValue = getValue$3(values, 1);
if (startValue && endValue && generateConfig2.isAfter(startValue, endValue)) {
if (picker === "week" && !isSameWeek(generateConfig2, locale2.locale, startValue, endValue) || picker === "quarter" && !isSameQuarter(generateConfig2, startValue, endValue) || picker !== "week" && picker !== "quarter" && picker !== "time" && !isSameDate(generateConfig2, startValue, endValue)) {
if (sourceIndex === 0) {
values = [startValue, null];
endValue = null;
} else {
startValue = null;
values = [null, endValue];
}
openRecordsRef.current = _defineProperty$b({}, sourceIndex, true);
} else if (picker !== "time" || order !== false) {
values = reorderValues(values, generateConfig2);
}
}
setSelectedValue(values);
var startStr2 = values && values[0] ? formatValue(values[0], {
generateConfig: generateConfig2,
locale: locale2,
format: formatList[0]
}) : "";
var endStr2 = values && values[1] ? formatValue(values[1], {
generateConfig: generateConfig2,
locale: locale2,
format: formatList[0]
}) : "";
if (onCalendarChange) {
var info = {
range: sourceIndex === 0 ? "start" : "end"
};
onCalendarChange(values, [startStr2, endStr2], info);
}
var canStartValueTrigger = canValueTrigger(startValue, 0, mergedDisabled, allowEmpty);
var canEndValueTrigger = canValueTrigger(endValue, 1, mergedDisabled, allowEmpty);
var canTrigger = values === null || canStartValueTrigger && canEndValueTrigger;
if (canTrigger) {
setInnerValue(values);
if (onChange && (!isEqual$1(generateConfig2, getValue$3(mergedValue, 0), startValue) || !isEqual$1(generateConfig2, getValue$3(mergedValue, 1), endValue))) {
onChange(values, [startStr2, endStr2]);
}
}
var nextOpenIndex = null;
if (sourceIndex === 0 && !mergedDisabled[1]) {
nextOpenIndex = 1;
} else if (sourceIndex === 1 && !mergedDisabled[0]) {
nextOpenIndex = 0;
}
if (nextOpenIndex !== null && nextOpenIndex !== mergedActivePickerIndex && (!openRecordsRef.current[nextOpenIndex] || !getValue$3(values, nextOpenIndex)) && getValue$3(values, sourceIndex)) {
triggerOpenAndFocus(nextOpenIndex);
} else {
_triggerOpen(false, sourceIndex);
}
}
var forwardKeyDown = function forwardKeyDown2(e2) {
if (mergedOpen && operationRef.current && operationRef.current.onKeyDown) {
return operationRef.current.onKeyDown(e2);
}
{
warningOnce(false, "Picker not correct forward KeyDown operation. Please help to fire issue about this.");
return false;
}
};
var sharedTextHooksProps = {
formatList,
generateConfig: generateConfig2,
locale: locale2
};
var _useValueTexts = useValueTexts(getValue$3(selectedValue, 0), sharedTextHooksProps), _useValueTexts2 = _slicedToArray$e(_useValueTexts, 2), startValueTexts = _useValueTexts2[0], firstStartValueText = _useValueTexts2[1];
var _useValueTexts3 = useValueTexts(getValue$3(selectedValue, 1), sharedTextHooksProps), _useValueTexts4 = _slicedToArray$e(_useValueTexts3, 2), endValueTexts = _useValueTexts4[0], firstEndValueText = _useValueTexts4[1];
var _onTextChange = function onTextChange(newText, index2) {
var inputDate = parseValue(newText, {
locale: locale2,
formatList,
generateConfig: generateConfig2
});
var disabledFunc = index2 === 0 ? disabledStartDate : disabledEndDate;
if (inputDate && !disabledFunc(inputDate)) {
setSelectedValue(updateValues(selectedValue, inputDate, index2));
setViewDate(inputDate, index2);
}
};
var _useTextValueMapping = useTextValueMapping({
valueTexts: startValueTexts,
onTextChange: function onTextChange(newText) {
return _onTextChange(newText, 0);
}
}), _useTextValueMapping2 = _slicedToArray$e(_useTextValueMapping, 3), startText = _useTextValueMapping2[0], triggerStartTextChange = _useTextValueMapping2[1], resetStartText = _useTextValueMapping2[2];
var _useTextValueMapping3 = useTextValueMapping({
valueTexts: endValueTexts,
onTextChange: function onTextChange(newText) {
return _onTextChange(newText, 1);
}
}), _useTextValueMapping4 = _slicedToArray$e(_useTextValueMapping3, 3), endText = _useTextValueMapping4[0], triggerEndTextChange = _useTextValueMapping4[1], resetEndText = _useTextValueMapping4[2];
var _useState3 = React$a.useState(null), _useState4 = _slicedToArray$e(_useState3, 2), rangeHoverValue = _useState4[0], setRangeHoverValue = _useState4[1];
var _useState5 = React$a.useState(null), _useState6 = _slicedToArray$e(_useState5, 2), hoverRangedValue = _useState6[0], setHoverRangedValue = _useState6[1];
var _useHoverValue = useHoverValue(startText, {
formatList,
generateConfig: generateConfig2,
locale: locale2
}), _useHoverValue2 = _slicedToArray$e(_useHoverValue, 3), startHoverValue = _useHoverValue2[0], onStartEnter = _useHoverValue2[1], onStartLeave = _useHoverValue2[2];
var _useHoverValue3 = useHoverValue(endText, {
formatList,
generateConfig: generateConfig2,
locale: locale2
}), _useHoverValue4 = _slicedToArray$e(_useHoverValue3, 3), endHoverValue = _useHoverValue4[0], onEndEnter = _useHoverValue4[1], onEndLeave = _useHoverValue4[2];
var onDateMouseEnter = function onDateMouseEnter2(date2) {
setHoverRangedValue(updateValues(selectedValue, date2, mergedActivePickerIndex));
if (mergedActivePickerIndex === 0) {
onStartEnter(date2);
} else {
onEndEnter(date2);
}
};
var onDateMouseLeave = function onDateMouseLeave2() {
setHoverRangedValue(updateValues(selectedValue, null, mergedActivePickerIndex));
if (mergedActivePickerIndex === 0) {
onStartLeave();
} else {
onEndLeave();
}
};
var getSharedInputHookProps = function getSharedInputHookProps2(index2, resetText) {
return {
blurToCancel: needConfirmButton,
forwardKeyDown,
onBlur,
isClickOutside: function isClickOutside(target) {
return !elementsContains([panelDivRef.current, startInputDivRef.current, endInputDivRef.current, containerRef.current], target);
},
onFocus: function onFocus(e2) {
setMergedActivePickerIndex(index2);
if (_onFocus) {
_onFocus(e2);
}
},
triggerOpen: function triggerOpen(newOpen) {
_triggerOpen(newOpen, index2);
},
onSubmit: function onSubmit() {
if (!selectedValue || disabledDate && disabledDate(selectedValue[index2])) {
return false;
}
triggerChange(selectedValue, index2);
resetText();
},
onCancel: function onCancel() {
_triggerOpen(false, index2);
setSelectedValue(mergedValue);
resetText();
}
};
};
var currentFocusedKey = React$a.useRef("");
var _usePickerInput = usePickerInput(_objectSpread2$a(_objectSpread2$a({}, getSharedInputHookProps(0, resetStartText)), {}, {
open: startOpen,
value: startText,
currentFocusedKey,
key: "start",
onKeyDown: function onKeyDown2(e2, preventDefault) {
_onKeyDown === null || _onKeyDown === void 0 ? void 0 : _onKeyDown(e2, preventDefault);
}
})), _usePickerInput2 = _slicedToArray$e(_usePickerInput, 2), startInputProps = _usePickerInput2[0], _usePickerInput2$ = _usePickerInput2[1], startFocused = _usePickerInput2$.focused, startTyping = _usePickerInput2$.typing;
var _usePickerInput3 = usePickerInput(_objectSpread2$a(_objectSpread2$a({}, getSharedInputHookProps(1, resetEndText)), {}, {
open: endOpen,
value: endText,
currentFocusedKey,
key: "end",
onKeyDown: function onKeyDown2(e2, preventDefault) {
_onKeyDown === null || _onKeyDown === void 0 ? void 0 : _onKeyDown(e2, preventDefault);
}
})), _usePickerInput4 = _slicedToArray$e(_usePickerInput3, 2), endInputProps = _usePickerInput4[0], _usePickerInput4$ = _usePickerInput4[1], endFocused = _usePickerInput4$.focused, endTyping = _usePickerInput4$.typing;
var onPickerClick = function onPickerClick2(e2) {
if (onClick) {
onClick(e2);
}
if (!mergedOpen && !startInputRef.current.contains(e2.target) && !endInputRef.current.contains(e2.target)) {
if (!mergedDisabled[0]) {
triggerOpenAndFocus(0);
} else if (!mergedDisabled[1]) {
triggerOpenAndFocus(1);
}
}
};
var onPickerMouseDown = function onPickerMouseDown2(e2) {
if (onMouseDown) {
onMouseDown(e2);
}
if (mergedOpen && (startFocused || endFocused) && !startInputRef.current.contains(e2.target) && !endInputRef.current.contains(e2.target)) {
e2.preventDefault();
}
};
var startStr = mergedValue && mergedValue[0] ? formatValue(mergedValue[0], {
locale: locale2,
format: "YYYYMMDDHHmmss",
generateConfig: generateConfig2
}) : "";
var endStr = mergedValue && mergedValue[1] ? formatValue(mergedValue[1], {
locale: locale2,
format: "YYYYMMDDHHmmss",
generateConfig: generateConfig2
}) : "";
React$a.useEffect(function() {
if (!mergedOpen) {
setSelectedValue(mergedValue);
if (!startValueTexts.length || startValueTexts[0] === "") {
triggerStartTextChange("");
} else if (firstStartValueText !== startText) {
resetStartText();
}
if (!endValueTexts.length || endValueTexts[0] === "") {
triggerEndTextChange("");
} else if (firstEndValueText !== endText) {
resetEndText();
}
}
}, [mergedOpen, startValueTexts, endValueTexts]);
React$a.useEffect(function() {
setSelectedValue(mergedValue);
}, [startStr, endStr]);
if (pickerRef) {
pickerRef.current = {
focus: function focus() {
if (startInputRef.current) {
startInputRef.current.focus();
}
},
blur: function blur() {
if (startInputRef.current) {
startInputRef.current.blur();
}
if (endInputRef.current) {
endInputRef.current.blur();
}
}
};
}
var rangeLabels = Object.keys(ranges || {});
var rangeList = rangeLabels.map(function(label) {
var range2 = ranges[label];
var newValues = typeof range2 === "function" ? range2() : range2;
return {
label,
onClick: function onClick2() {
triggerChange(newValues, null);
_triggerOpen(false, mergedActivePickerIndex);
},
onMouseEnter: function onMouseEnter2() {
setRangeHoverValue(newValues);
},
onMouseLeave: function onMouseLeave2() {
setRangeHoverValue(null);
}
};
});
function renderPanel() {
var panelPosition = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
var panelProps = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var panelHoverRangedValue = null;
if (mergedOpen && hoverRangedValue && hoverRangedValue[0] && hoverRangedValue[1] && generateConfig2.isAfter(hoverRangedValue[1], hoverRangedValue[0])) {
panelHoverRangedValue = hoverRangedValue;
}
var panelShowTime = showTime;
if (showTime && _typeof$q(showTime) === "object" && showTime.defaultValue) {
var timeDefaultValues = showTime.defaultValue;
panelShowTime = _objectSpread2$a(_objectSpread2$a({}, showTime), {}, {
defaultValue: getValue$3(timeDefaultValues, mergedActivePickerIndex) || void 0
});
}
var panelDateRender = null;
if (dateRender) {
panelDateRender = function panelDateRender2(date2, today) {
return dateRender(date2, today, {
range: mergedActivePickerIndex ? "end" : "start"
});
};
}
return /* @__PURE__ */ jsx(RangeContext.Provider, {
value: {
inRange: true,
panelPosition,
rangedValue: rangeHoverValue || selectedValue,
hoverRangedValue: panelHoverRangedValue
},
children: /* @__PURE__ */ jsx(PickerPanel, {
...props,
...panelProps,
dateRender: panelDateRender,
showTime: panelShowTime,
mode: mergedModes[mergedActivePickerIndex],
generateConfig: generateConfig2,
style: void 0,
direction,
disabledDate: mergedActivePickerIndex === 0 ? disabledStartDate : disabledEndDate,
disabledTime: function disabledTime(date2) {
if (_disabledTime) {
return _disabledTime(date2, mergedActivePickerIndex === 0 ? "start" : "end");
}
return false;
},
className: classnames(_defineProperty$b({}, "".concat(prefixCls, "-panel-focused"), mergedActivePickerIndex === 0 ? !startTyping : !endTyping)),
value: getValue$3(selectedValue, mergedActivePickerIndex),
locale: locale2,
tabIndex: -1,
onPanelChange: function onPanelChange2(date2, newMode) {
if (mergedActivePickerIndex === 0) {
onStartLeave(true);
}
if (mergedActivePickerIndex === 1) {
onEndLeave(true);
}
triggerModesChange(updateValues(mergedModes, newMode, mergedActivePickerIndex), updateValues(selectedValue, date2, mergedActivePickerIndex));
var viewDate = date2;
if (panelPosition === "right" && mergedModes[mergedActivePickerIndex] === newMode) {
viewDate = getClosingViewDate(viewDate, newMode, generateConfig2, -1);
}
setViewDate(viewDate, mergedActivePickerIndex);
},
onOk: null,
onSelect: void 0,
onChange: void 0,
defaultValue: mergedActivePickerIndex === 0 ? getValue$3(selectedValue, 1) : getValue$3(selectedValue, 0)
})
});
}
var arrowLeft = 0;
var panelLeft = 0;
if (mergedActivePickerIndex && startInputDivRef.current && separatorRef.current && panelDivRef.current) {
arrowLeft = startInputDivRef.current.offsetWidth + separatorRef.current.offsetWidth;
var arrowMarginLeft = arrowRef.current.offsetLeft > arrowLeft ? arrowRef.current.offsetLeft - arrowLeft : arrowRef.current.offsetLeft;
if (panelDivRef.current.offsetWidth && arrowRef.current.offsetWidth && arrowLeft > panelDivRef.current.offsetWidth - arrowRef.current.offsetWidth - (direction === "rtl" ? 0 : arrowMarginLeft)) {
panelLeft = arrowLeft;
}
}
var arrowPositionStyle = direction === "rtl" ? {
right: arrowLeft
} : {
left: arrowLeft
};
function renderPanels() {
var panels;
var extraNode = getExtraFooter(prefixCls, mergedModes[mergedActivePickerIndex], renderExtraFooter);
var rangesNode = getRanges({
prefixCls,
components,
needConfirmButton,
okDisabled: !getValue$3(selectedValue, mergedActivePickerIndex) || disabledDate && disabledDate(selectedValue[mergedActivePickerIndex]),
locale: locale2,
rangeList,
onOk: function onOk() {
if (getValue$3(selectedValue, mergedActivePickerIndex)) {
triggerChange(selectedValue, mergedActivePickerIndex);
if (_onOk) {
_onOk(selectedValue);
}
}
}
});
if (picker !== "time" && !showTime) {
var viewDate = getViewDate(mergedActivePickerIndex);
var nextViewDate = getClosingViewDate(viewDate, picker, generateConfig2);
var currentMode = mergedModes[mergedActivePickerIndex];
var showDoublePanel = currentMode === picker;
var leftPanel = renderPanel(showDoublePanel ? "left" : false, {
pickerValue: viewDate,
onPickerValueChange: function onPickerValueChange(newViewDate) {
setViewDate(newViewDate, mergedActivePickerIndex);
}
});
var rightPanel = renderPanel("right", {
pickerValue: nextViewDate,
onPickerValueChange: function onPickerValueChange(newViewDate) {
setViewDate(getClosingViewDate(newViewDate, picker, generateConfig2, -1), mergedActivePickerIndex);
}
});
if (direction === "rtl") {
panels = /* @__PURE__ */ jsxs(Fragment, {
children: [rightPanel, showDoublePanel && leftPanel]
});
} else {
panels = /* @__PURE__ */ jsxs(Fragment, {
children: [leftPanel, showDoublePanel && rightPanel]
});
}
} else {
panels = renderPanel();
}
var mergedNodes = /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-panels"),
children: panels
}), (extraNode || rangesNode) && /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-footer"),
children: [extraNode, rangesNode]
})]
});
if (panelRender) {
mergedNodes = panelRender(mergedNodes);
}
return /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-panel-container"),
style: {
marginLeft: panelLeft
},
ref: panelDivRef,
onMouseDown: function onMouseDown2(e2) {
e2.preventDefault();
},
children: mergedNodes
});
}
var rangePanel = /* @__PURE__ */ jsxs("div", {
className: classnames("".concat(prefixCls, "-range-wrapper"), "".concat(prefixCls, "-").concat(picker, "-range-wrapper")),
style: {
minWidth: popupMinWidth
},
children: [/* @__PURE__ */ jsx("div", {
ref: arrowRef,
className: "".concat(prefixCls, "-range-arrow"),
style: arrowPositionStyle
}), renderPanels()]
});
var suffixNode;
if (suffixIcon) {
suffixNode = /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-suffix"),
children: suffixIcon
});
}
var clearNode;
if (allowClear && (getValue$3(mergedValue, 0) && !mergedDisabled[0] || getValue$3(mergedValue, 1) && !mergedDisabled[1])) {
clearNode = /* @__PURE__ */ jsx("span", {
onMouseDown: function onMouseDown2(e2) {
e2.preventDefault();
e2.stopPropagation();
},
onMouseUp: function onMouseUp2(e2) {
e2.preventDefault();
e2.stopPropagation();
var values = mergedValue;
if (!mergedDisabled[0]) {
values = updateValues(values, null, 0);
}
if (!mergedDisabled[1]) {
values = updateValues(values, null, 1);
}
triggerChange(values, null);
_triggerOpen(false, mergedActivePickerIndex);
},
className: "".concat(prefixCls, "-clear"),
children: clearIcon || /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-clear-btn")
})
});
}
var inputSharedProps = {
size: getInputSize(picker, formatList[0], generateConfig2)
};
var activeBarLeft = 0;
var activeBarWidth = 0;
if (startInputDivRef.current && endInputDivRef.current && separatorRef.current) {
if (mergedActivePickerIndex === 0) {
activeBarWidth = startInputDivRef.current.offsetWidth;
} else {
activeBarLeft = arrowLeft;
activeBarWidth = endInputDivRef.current.offsetWidth;
}
}
var activeBarPositionStyle = direction === "rtl" ? {
right: activeBarLeft
} : {
left: activeBarLeft
};
var onContextSelect = function onContextSelect2(date2, type2) {
var values = updateValues(selectedValue, date2, mergedActivePickerIndex);
if (type2 === "submit" || type2 !== "key" && !needConfirmButton) {
triggerChange(values, mergedActivePickerIndex);
if (mergedActivePickerIndex === 0) {
onStartLeave();
} else {
onEndLeave();
}
} else {
setSelectedValue(values);
}
};
return /* @__PURE__ */ jsx(PanelContext.Provider, {
value: {
operationRef,
hideHeader: picker === "time",
onDateMouseEnter,
onDateMouseLeave,
hideRanges: true,
onSelect: onContextSelect,
open: mergedOpen
},
children: /* @__PURE__ */ jsx(PickerTrigger, {
visible: mergedOpen,
popupElement: rangePanel,
popupStyle,
prefixCls,
dropdownClassName,
dropdownAlign,
getPopupContainer,
transitionName: transitionName2,
range: true,
direction,
children: /* @__PURE__ */ jsxs("div", {
ref: containerRef,
className: classnames(prefixCls, "".concat(prefixCls, "-range"), className, (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-disabled"), mergedDisabled[0] && mergedDisabled[1]), _defineProperty$b(_classNames2, "".concat(prefixCls, "-focused"), mergedActivePickerIndex === 0 ? startFocused : endFocused), _defineProperty$b(_classNames2, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames2)),
style: style2,
onClick: onPickerClick,
onMouseEnter,
onMouseLeave,
onMouseDown: onPickerMouseDown,
onMouseUp,
...getDataOrAriaProps(props),
children: [/* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-input"), (_classNames3 = {}, _defineProperty$b(_classNames3, "".concat(prefixCls, "-input-active"), mergedActivePickerIndex === 0), _defineProperty$b(_classNames3, "".concat(prefixCls, "-input-placeholder"), !!startHoverValue), _classNames3)),
ref: startInputDivRef,
children: /* @__PURE__ */ jsx("input", {
id: id2,
disabled: mergedDisabled[0],
readOnly: inputReadOnly || typeof formatList[0] === "function" || !startTyping,
value: startHoverValue || startText,
onChange: function onChange2(e2) {
triggerStartTextChange(e2.target.value);
},
autoFocus,
placeholder: getValue$3(placeholder, 0) || "",
ref: startInputRef,
...startInputProps,
...inputSharedProps,
autoComplete
})
}), /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-range-separator"),
ref: separatorRef,
children: separator
}), /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-input"), (_classNames4 = {}, _defineProperty$b(_classNames4, "".concat(prefixCls, "-input-active"), mergedActivePickerIndex === 1), _defineProperty$b(_classNames4, "".concat(prefixCls, "-input-placeholder"), !!endHoverValue), _classNames4)),
ref: endInputDivRef,
children: /* @__PURE__ */ jsx("input", {
disabled: mergedDisabled[1],
readOnly: inputReadOnly || typeof formatList[0] === "function" || !endTyping,
value: endHoverValue || endText,
onChange: function onChange2(e2) {
triggerEndTextChange(e2.target.value);
},
placeholder: getValue$3(placeholder, 1) || "",
ref: endInputRef,
...endInputProps,
...inputSharedProps,
autoComplete
})
}), /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-active-bar"),
style: _objectSpread2$a(_objectSpread2$a({}, activeBarPositionStyle), {}, {
width: activeBarWidth,
position: "absolute"
})
}), suffixNode, clearNode]
})
})
});
}
var RangePicker$2 = /* @__PURE__ */ function(_React$Component) {
_inherits(RangePicker2, _React$Component);
var _super = _createSuper(RangePicker2);
function RangePicker2() {
var _this2;
_classCallCheck(this, RangePicker2);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_this2.pickerRef = /* @__PURE__ */ React__namespace.createRef();
_this2.focus = function() {
if (_this2.pickerRef.current) {
_this2.pickerRef.current.focus();
}
};
_this2.blur = function() {
if (_this2.pickerRef.current) {
_this2.pickerRef.current.blur();
}
};
return _this2;
}
_createClass(RangePicker2, [{
key: "render",
value: function render2() {
return /* @__PURE__ */ jsx(InnerRangePicker, {
...this.props,
pickerRef: this.pickerRef
});
}
}]);
return RangePicker2;
}(React__namespace.Component);
var RadioGroupContext = /* @__PURE__ */ React__namespace.createContext(null);
var RadioGroupContextProvider = RadioGroupContext.Provider;
var RadioOptionTypeContext = /* @__PURE__ */ React__namespace.createContext(null);
var RadioOptionTypeContextProvider = RadioOptionTypeContext.Provider;
var Checkbox$3 = /* @__PURE__ */ function(_Component) {
_inherits(Checkbox2, _Component);
var _super = _createSuper(Checkbox2);
function Checkbox2(props) {
var _this2;
_classCallCheck(this, Checkbox2);
_this2 = _super.call(this, props);
_this2.handleChange = function(e2) {
var _this$props = _this2.props, disabled = _this$props.disabled, onChange = _this$props.onChange;
if (disabled) {
return;
}
if (!("checked" in _this2.props)) {
_this2.setState({
checked: e2.target.checked
});
}
if (onChange) {
onChange({
target: _objectSpread2$a(_objectSpread2$a({}, _this2.props), {}, {
checked: e2.target.checked
}),
stopPropagation: function stopPropagation() {
e2.stopPropagation();
},
preventDefault: function preventDefault() {
e2.preventDefault();
},
nativeEvent: e2.nativeEvent
});
}
};
_this2.saveInput = function(node) {
_this2.input = node;
};
var checked = "checked" in props ? props.checked : props.defaultChecked;
_this2.state = {
checked
};
return _this2;
}
_createClass(Checkbox2, [{
key: "focus",
value: function focus() {
this.input.focus();
}
}, {
key: "blur",
value: function blur() {
this.input.blur();
}
}, {
key: "render",
value: function render2() {
var _classNames;
var _this$props2 = this.props, prefixCls = _this$props2.prefixCls, className = _this$props2.className, style2 = _this$props2.style, name2 = _this$props2.name, id2 = _this$props2.id, type2 = _this$props2.type, disabled = _this$props2.disabled, readOnly = _this$props2.readOnly, tabIndex = _this$props2.tabIndex, onClick = _this$props2.onClick, onFocus = _this$props2.onFocus, onBlur = _this$props2.onBlur, onKeyDown2 = _this$props2.onKeyDown, onKeyPress = _this$props2.onKeyPress, onKeyUp = _this$props2.onKeyUp, autoFocus = _this$props2.autoFocus, value = _this$props2.value, required2 = _this$props2.required, others = _objectWithoutProperties$1(_this$props2, ["prefixCls", "className", "style", "name", "id", "type", "disabled", "readOnly", "tabIndex", "onClick", "onFocus", "onBlur", "onKeyDown", "onKeyPress", "onKeyUp", "autoFocus", "value", "required"]);
var globalProps = Object.keys(others).reduce(function(prev, key2) {
if (key2.substr(0, 5) === "aria-" || key2.substr(0, 5) === "data-" || key2 === "role") {
prev[key2] = others[key2];
}
return prev;
}, {});
var checked = this.state.checked;
var classString = classnames(prefixCls, className, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-checked"), checked), _defineProperty$b(_classNames, "".concat(prefixCls, "-disabled"), disabled), _classNames));
return /* @__PURE__ */ jsxs("span", {
className: classString,
style: style2,
children: [/* @__PURE__ */ jsx("input", {
name: name2,
id: id2,
type: type2,
required: required2,
readOnly,
disabled,
tabIndex,
className: "".concat(prefixCls, "-input"),
checked: !!checked,
onClick,
onFocus,
onBlur,
onKeyUp,
onKeyDown: onKeyDown2,
onKeyPress,
onChange: this.handleChange,
autoFocus,
ref: this.saveInput,
value,
...globalProps
}), /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-inner")
})]
});
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(props, state) {
if ("checked" in props) {
return _objectSpread2$a(_objectSpread2$a({}, state), {}, {
checked: props.checked
});
}
return null;
}
}]);
return Checkbox2;
}(React$a.Component);
Checkbox$3.defaultProps = {
prefixCls: "rc-checkbox",
className: "",
style: {},
type: "checkbox",
defaultChecked: false,
onFocus: function onFocus() {
},
onBlur: function onBlur() {
},
onChange: function onChange() {
},
onKeyDown: function onKeyDown2() {
},
onKeyPress: function onKeyPress() {
},
onKeyUp: function onKeyUp() {
}
};
var __rest$E = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var InternalRadio = function InternalRadio2(props, ref) {
var _classNames;
var groupContext = React__namespace.useContext(RadioGroupContext);
var radioOptionTypeContext = React__namespace.useContext(RadioOptionTypeContext);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var innerRef = React__namespace.useRef();
var mergedRef = composeRef(ref, innerRef);
var _useContext = React$a.useContext(FormItemInputContext), isFormItemInput = _useContext.isFormItemInput;
var onChange = function onChange2(e2) {
var _a, _b;
(_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, e2);
(_b = groupContext === null || groupContext === void 0 ? void 0 : groupContext.onChange) === null || _b === void 0 ? void 0 : _b.call(groupContext, e2);
};
var customizePrefixCls = props.prefixCls, className = props.className, children = props.children, style2 = props.style, customDisabled = props.disabled, restProps = __rest$E(props, ["prefixCls", "className", "children", "style", "disabled"]);
var radioPrefixCls = getPrefixCls("radio", customizePrefixCls);
var prefixCls = ((groupContext === null || groupContext === void 0 ? void 0 : groupContext.optionType) || radioOptionTypeContext) === "button" ? "".concat(radioPrefixCls, "-button") : radioPrefixCls;
var radioProps = _extends$3({}, restProps);
var disabled = React__namespace.useContext(DisabledContext$1);
radioProps.disabled = customDisabled || disabled;
if (groupContext) {
radioProps.name = groupContext.name;
radioProps.onChange = onChange;
radioProps.checked = props.value === groupContext.value;
radioProps.disabled = radioProps.disabled || groupContext.disabled;
}
var wrapperClassString = classnames("".concat(prefixCls, "-wrapper"), (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-wrapper-checked"), radioProps.checked), _defineProperty$b(_classNames, "".concat(prefixCls, "-wrapper-disabled"), radioProps.disabled), _defineProperty$b(_classNames, "".concat(prefixCls, "-wrapper-rtl"), direction === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-wrapper-in-form-item"), isFormItemInput), _classNames), className);
return /* @__PURE__ */ jsxs("label", {
className: wrapperClassString,
style: style2,
onMouseEnter: props.onMouseEnter,
onMouseLeave: props.onMouseLeave,
children: [/* @__PURE__ */ jsx(Checkbox$3, {
...radioProps,
type: "radio",
prefixCls,
ref: mergedRef
}), children !== void 0 ? /* @__PURE__ */ jsx("span", {
children
}) : null]
});
};
var Radio$2 = /* @__PURE__ */ React__namespace.forwardRef(InternalRadio);
const InternalRadio$1 = Radio$2;
var RadioGroup = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var size = React__namespace.useContext(SizeContext$1);
var _useMergedState = useMergedState(props.defaultValue, {
value: props.value
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), value = _useMergedState2[0], setValue2 = _useMergedState2[1];
var onRadioChange = function onRadioChange2(ev) {
var lastValue = value;
var val = ev.target.value;
if (!("value" in props)) {
setValue2(val);
}
var onChange = props.onChange;
if (onChange && val !== lastValue) {
onChange(ev);
}
};
var customizePrefixCls = props.prefixCls, _props$className = props.className, className = _props$className === void 0 ? "" : _props$className, options = props.options, _props$buttonStyle = props.buttonStyle, buttonStyle = _props$buttonStyle === void 0 ? "outline" : _props$buttonStyle, disabled = props.disabled, children = props.children, customizeSize = props.size, style2 = props.style, id2 = props.id, onMouseEnter = props.onMouseEnter, onMouseLeave = props.onMouseLeave, onFocus = props.onFocus, onBlur = props.onBlur;
var prefixCls = getPrefixCls("radio", customizePrefixCls);
var groupPrefixCls = "".concat(prefixCls, "-group");
var childrenToRender = children;
if (options && options.length > 0) {
childrenToRender = options.map(function(option) {
if (typeof option === "string" || typeof option === "number") {
return /* @__PURE__ */ jsx(InternalRadio$1, {
prefixCls,
disabled,
value: option,
checked: value === option,
children: option
}, option.toString());
}
return /* @__PURE__ */ jsx(InternalRadio$1, {
prefixCls,
disabled: option.disabled || disabled,
value: option.value,
checked: value === option.value,
style: option.style,
children: option.label
}, "radio-group-value-options-".concat(option.value));
});
}
var mergedSize = customizeSize || size;
var classString = classnames(groupPrefixCls, "".concat(groupPrefixCls, "-").concat(buttonStyle), (_classNames = {}, _defineProperty$b(_classNames, "".concat(groupPrefixCls, "-").concat(mergedSize), mergedSize), _defineProperty$b(_classNames, "".concat(groupPrefixCls, "-rtl"), direction === "rtl"), _classNames), className);
return /* @__PURE__ */ jsx("div", {
...getDataOrAriaProps$1(props),
className: classString,
style: style2,
onMouseEnter,
onMouseLeave,
onFocus,
onBlur,
id: id2,
ref,
children: /* @__PURE__ */ jsx(RadioGroupContextProvider, {
value: {
onChange: onRadioChange,
value,
disabled: props.disabled,
name: props.name,
optionType: props.optionType
},
children: childrenToRender
})
});
});
const Group$4 = /* @__PURE__ */ React__namespace.memo(RadioGroup);
var __rest$D = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var RadioButton = function RadioButton2(props, ref) {
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var customizePrefixCls = props.prefixCls, radioProps = __rest$D(props, ["prefixCls"]);
var prefixCls = getPrefixCls("radio", customizePrefixCls);
return /* @__PURE__ */ jsx(RadioOptionTypeContextProvider, {
value: "button",
children: /* @__PURE__ */ jsx(InternalRadio$1, {
prefixCls,
...radioProps,
type: "radio",
ref
})
});
};
const Button = /* @__PURE__ */ React__namespace.forwardRef(RadioButton);
var Radio$1 = InternalRadio$1;
Radio$1.Button = Button;
Radio$1.Group = Group$4;
Radio$1.__ANT_RADIO = true;
const _Radio = Radio$1;
var Element$1 = function Element2(props) {
var _classNames, _classNames2;
var prefixCls = props.prefixCls, className = props.className, style2 = props.style, size = props.size, shape = props.shape;
var sizeCls = classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-lg"), size === "large"), _defineProperty$b(_classNames, "".concat(prefixCls, "-sm"), size === "small"), _classNames));
var shapeCls = classnames((_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-circle"), shape === "circle"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-square"), shape === "square"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-round"), shape === "round"), _classNames2));
var sizeStyle = React__namespace.useMemo(function() {
return typeof size === "number" ? {
width: size,
height: size,
lineHeight: "".concat(size, "px")
} : {};
}, [size]);
return /* @__PURE__ */ jsx("span", {
className: classnames(prefixCls, sizeCls, shapeCls, className),
style: _extends$3(_extends$3({}, sizeStyle), style2)
});
};
const Element$2 = Element$1;
var SkeletonAvatar = function SkeletonAvatar2(props) {
var customizePrefixCls = props.prefixCls, className = props.className, active = props.active, _props$shape = props.shape, shape = _props$shape === void 0 ? "circle" : _props$shape, _props$size = props.size, size = _props$size === void 0 ? "default" : _props$size;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls("skeleton", customizePrefixCls);
var otherProps = omit(props, ["prefixCls", "className"]);
var cls = classnames(prefixCls, "".concat(prefixCls, "-element"), _defineProperty$b({}, "".concat(prefixCls, "-active"), active), className);
return /* @__PURE__ */ jsx("div", {
className: cls,
children: /* @__PURE__ */ jsx(Element$2, {
prefixCls: "".concat(prefixCls, "-avatar"),
shape,
size,
...otherProps
})
});
};
const SkeletonAvatar$1 = SkeletonAvatar;
var SkeletonButton = function SkeletonButton2(props) {
var _classNames;
var customizePrefixCls = props.prefixCls, className = props.className, active = props.active, _props$block = props.block, block = _props$block === void 0 ? false : _props$block, _props$size = props.size, size = _props$size === void 0 ? "default" : _props$size;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls("skeleton", customizePrefixCls);
var otherProps = omit(props, ["prefixCls"]);
var cls = classnames(prefixCls, "".concat(prefixCls, "-element"), (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-active"), active), _defineProperty$b(_classNames, "".concat(prefixCls, "-block"), block), _classNames), className);
return /* @__PURE__ */ jsx("div", {
className: cls,
children: /* @__PURE__ */ jsx(Element$2, {
prefixCls: "".concat(prefixCls, "-button"),
size,
...otherProps
})
});
};
const SkeletonButton$1 = SkeletonButton;
var DotChartOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M888 792H200V168c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v688c0 4.4 3.6 8 8 8h752c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM288 604a64 64 0 10128 0 64 64 0 10-128 0zm118-224a48 48 0 1096 0 48 48 0 10-96 0zm158 228a96 96 0 10192 0 96 96 0 10-192 0zm148-314a56 56 0 10112 0 56 56 0 10-112 0z" } }] }, "name": "dot-chart", "theme": "outlined" };
const DotChartOutlinedSvg = DotChartOutlined$2;
var DotChartOutlined = function DotChartOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: DotChartOutlinedSvg
})
});
};
DotChartOutlined.displayName = "DotChartOutlined";
const DotChartOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(DotChartOutlined);
var SkeletonNode = function SkeletonNode2(props) {
var customizePrefixCls = props.prefixCls, className = props.className, style2 = props.style, active = props.active, children = props.children;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls("skeleton", customizePrefixCls);
var cls = classnames(prefixCls, "".concat(prefixCls, "-element"), _defineProperty$b({}, "".concat(prefixCls, "-active"), active), className);
var content = children !== null && children !== void 0 ? children : /* @__PURE__ */ jsx(DotChartOutlined$1, {});
return /* @__PURE__ */ jsx("div", {
className: cls,
children: /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-image"), className),
style: style2,
children: content
})
});
};
const SkeletonNode$1 = SkeletonNode;
var path = "M365.714286 329.142857q0 45.714286-32.036571 77.677714t-77.677714 32.036571-77.677714-32.036571-32.036571-77.677714 32.036571-77.677714 77.677714-32.036571 77.677714 32.036571 32.036571 77.677714zM950.857143 548.571429l0 256-804.571429 0 0-109.714286 182.857143-182.857143 91.428571 91.428571 292.571429-292.571429zM1005.714286 146.285714l-914.285714 0q-7.460571 0-12.873143 5.412571t-5.412571 12.873143l0 694.857143q0 7.460571 5.412571 12.873143t12.873143 5.412571l914.285714 0q7.460571 0 12.873143-5.412571t5.412571-12.873143l0-694.857143q0-7.460571-5.412571-12.873143t-12.873143-5.412571zM1097.142857 164.571429l0 694.857143q0 37.741714-26.843429 64.585143t-64.585143 26.843429l-914.285714 0q-37.741714 0-64.585143-26.843429t-26.843429-64.585143l0-694.857143q0-37.741714 26.843429-64.585143t64.585143-26.843429l914.285714 0q37.741714 0 64.585143 26.843429t26.843429 64.585143z";
var SkeletonImage = function SkeletonImage2(props) {
var customizePrefixCls = props.prefixCls, className = props.className, style2 = props.style, active = props.active;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls("skeleton", customizePrefixCls);
var cls = classnames(prefixCls, "".concat(prefixCls, "-element"), _defineProperty$b({}, "".concat(prefixCls, "-active"), active), className);
return /* @__PURE__ */ jsx("div", {
className: cls,
children: /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-image"), className),
style: style2,
children: /* @__PURE__ */ jsx("svg", {
viewBox: "0 0 1098 1024",
xmlns: "http://www.w3.org/2000/svg",
className: "".concat(prefixCls, "-image-svg"),
children: /* @__PURE__ */ jsx("path", {
d: path,
className: "".concat(prefixCls, "-image-path")
})
})
})
});
};
const SkeletonImage$1 = SkeletonImage;
var SkeletonInput = function SkeletonInput2(props) {
var _classNames;
var customizePrefixCls = props.prefixCls, className = props.className, active = props.active, block = props.block, _props$size = props.size, size = _props$size === void 0 ? "default" : _props$size;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls("skeleton", customizePrefixCls);
var otherProps = omit(props, ["prefixCls"]);
var cls = classnames(prefixCls, "".concat(prefixCls, "-element"), (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-active"), active), _defineProperty$b(_classNames, "".concat(prefixCls, "-block"), block), _classNames), className);
return /* @__PURE__ */ jsx("div", {
className: cls,
children: /* @__PURE__ */ jsx(Element$2, {
prefixCls: "".concat(prefixCls, "-input"),
size,
...otherProps
})
});
};
const SkeletonInput$1 = SkeletonInput;
var Paragraph = function Paragraph2(props) {
var getWidth = function getWidth2(index2) {
var width = props.width, _props$rows = props.rows, rows2 = _props$rows === void 0 ? 2 : _props$rows;
if (Array.isArray(width)) {
return width[index2];
}
if (rows2 - 1 === index2) {
return width;
}
return void 0;
};
var prefixCls = props.prefixCls, className = props.className, style2 = props.style, rows = props.rows;
var rowList = _toConsumableArray$c(Array(rows)).map(function(_, index2) {
return /* @__PURE__ */ jsx("li", {
style: {
width: getWidth(index2)
}
}, index2);
});
return /* @__PURE__ */ jsx("ul", {
className: classnames(prefixCls, className),
style: style2,
children: rowList
});
};
const Paragraph$1 = Paragraph;
var Title = function Title2(_ref) {
var prefixCls = _ref.prefixCls, className = _ref.className, width = _ref.width, style2 = _ref.style;
return /* @__PURE__ */ jsx("h3", {
className: classnames(prefixCls, className),
style: _extends$3({
width
}, style2)
});
};
const Title$1 = Title;
function getComponentProps(prop) {
if (prop && _typeof$q(prop) === "object") {
return prop;
}
return {};
}
function getAvatarBasicProps(hasTitle, hasParagraph) {
if (hasTitle && !hasParagraph) {
return {
size: "large",
shape: "square"
};
}
return {
size: "large",
shape: "circle"
};
}
function getTitleBasicProps(hasAvatar, hasParagraph) {
if (!hasAvatar && hasParagraph) {
return {
width: "38%"
};
}
if (hasAvatar && hasParagraph) {
return {
width: "50%"
};
}
return {};
}
function getParagraphBasicProps(hasAvatar, hasTitle) {
var basicProps = {};
if (!hasAvatar || !hasTitle) {
basicProps.width = "61%";
}
if (!hasAvatar && hasTitle) {
basicProps.rows = 3;
} else {
basicProps.rows = 2;
}
return basicProps;
}
var Skeleton = function Skeleton2(props) {
var customizePrefixCls = props.prefixCls, loading = props.loading, className = props.className, style2 = props.style, children = props.children, _props$avatar = props.avatar, avatar = _props$avatar === void 0 ? false : _props$avatar, _props$title = props.title, title = _props$title === void 0 ? true : _props$title, _props$paragraph = props.paragraph, paragraph = _props$paragraph === void 0 ? true : _props$paragraph, active = props.active, round = props.round;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var prefixCls = getPrefixCls("skeleton", customizePrefixCls);
if (loading || !("loading" in props)) {
var _classNames;
var hasAvatar = !!avatar;
var hasTitle = !!title;
var hasParagraph = !!paragraph;
var avatarNode;
if (hasAvatar) {
var avatarProps = _extends$3(_extends$3({
prefixCls: "".concat(prefixCls, "-avatar")
}, getAvatarBasicProps(hasTitle, hasParagraph)), getComponentProps(avatar));
avatarNode = /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-header"),
children: /* @__PURE__ */ jsx(Element$2, {
...avatarProps
})
});
}
var contentNode;
if (hasTitle || hasParagraph) {
var $title;
if (hasTitle) {
var titleProps = _extends$3(_extends$3({
prefixCls: "".concat(prefixCls, "-title")
}, getTitleBasicProps(hasAvatar, hasParagraph)), getComponentProps(title));
$title = /* @__PURE__ */ jsx(Title$1, {
...titleProps
});
}
var paragraphNode;
if (hasParagraph) {
var paragraphProps = _extends$3(_extends$3({
prefixCls: "".concat(prefixCls, "-paragraph")
}, getParagraphBasicProps(hasAvatar, hasTitle)), getComponentProps(paragraph));
paragraphNode = /* @__PURE__ */ jsx(Paragraph$1, {
...paragraphProps
});
}
contentNode = /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-content"),
children: [$title, paragraphNode]
});
}
var cls = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-with-avatar"), hasAvatar), _defineProperty$b(_classNames, "".concat(prefixCls, "-active"), active), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-round"), round), _classNames), className);
return /* @__PURE__ */ jsxs("div", {
className: cls,
style: style2,
children: [avatarNode, contentNode]
});
}
return typeof children !== "undefined" ? children : null;
};
Skeleton.Button = SkeletonButton$1;
Skeleton.Avatar = SkeletonAvatar$1;
Skeleton.Input = SkeletonInput$1;
Skeleton.Image = SkeletonImage$1;
Skeleton.Node = SkeletonNode$1;
const Skeleton$1 = Skeleton;
var PlusOutlined$5 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "defs", "attrs": {}, "children": [{ "tag": "style", "attrs": {} }] }, { "tag": "path", "attrs": { "d": "M482 152h60q8 0 8 8v704q0 8-8 8h-60q-8 0-8-8V160q0-8 8-8z" } }, { "tag": "path", "attrs": { "d": "M176 474h672q8 0 8 8v60q0 8-8 8H176q-8 0-8-8v-60q0-8 8-8z" } }] }, "name": "plus", "theme": "outlined" };
const PlusOutlinedSvg = PlusOutlined$5;
var PlusOutlined$3 = function PlusOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: PlusOutlinedSvg
})
});
};
PlusOutlined$3.displayName = "PlusOutlined";
const PlusOutlined$4 = /* @__PURE__ */ React__namespace.forwardRef(PlusOutlined$3);
const TabContext = /* @__PURE__ */ React$a.createContext(null);
var TabPane$3 = /* @__PURE__ */ React__namespace.forwardRef(function(_ref, ref) {
var prefixCls = _ref.prefixCls, className = _ref.className, style2 = _ref.style, id2 = _ref.id, active = _ref.active, tabKey = _ref.tabKey, children = _ref.children;
return /* @__PURE__ */ jsx("div", {
id: id2 && "".concat(id2, "-panel-").concat(tabKey),
role: "tabpanel",
tabIndex: active ? 0 : -1,
"aria-labelledby": id2 && "".concat(id2, "-tab-").concat(tabKey),
"aria-hidden": !active,
style: style2,
className: classnames(prefixCls, active && "".concat(prefixCls, "-active"), className),
ref,
children
});
});
var _excluded$q = ["key", "forceRender", "style", "className"];
function TabPanelList(_ref) {
var id2 = _ref.id, activeKey = _ref.activeKey, animated = _ref.animated, tabPosition = _ref.tabPosition, destroyInactiveTabPane = _ref.destroyInactiveTabPane;
var _React$useContext = React__namespace.useContext(TabContext), prefixCls = _React$useContext.prefixCls, tabs = _React$useContext.tabs;
var tabPaneAnimated = animated.tabPane;
var tabPanePrefixCls = "".concat(prefixCls, "-tabpane");
return /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-content-holder")),
children: /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-content"), "".concat(prefixCls, "-content-").concat(tabPosition), _defineProperty$b({}, "".concat(prefixCls, "-content-animated"), tabPaneAnimated)),
children: tabs.map(function(_ref2) {
var key2 = _ref2.key, forceRender = _ref2.forceRender, paneStyle = _ref2.style, paneClassName = _ref2.className, restTabProps = _objectWithoutProperties$1(_ref2, _excluded$q);
var active = key2 === activeKey;
return /* @__PURE__ */ jsx(CSSMotion, {
visible: active,
forceRender,
removeOnLeave: !!destroyInactiveTabPane,
leavedClassName: "".concat(tabPanePrefixCls, "-hidden"),
...animated.tabPaneMotion,
children: function(_ref3, ref) {
var motionStyle = _ref3.style, motionClassName = _ref3.className;
return /* @__PURE__ */ jsx(TabPane$3, {
...restTabProps,
prefixCls: tabPanePrefixCls,
id: id2,
tabKey: key2,
animated: tabPaneAnimated,
active,
style: _objectSpread2$a(_objectSpread2$a({}, paneStyle), motionStyle),
className: classnames(paneClassName, motionClassName),
ref
});
}
}, key2);
})
})
});
}
var DEFAULT_SIZE$1 = {
width: 0,
height: 0,
left: 0,
top: 0
};
function useOffsets(tabs, tabSizes, holderScrollWidth) {
return React$a.useMemo(function() {
var _tabs$;
var map = /* @__PURE__ */ new Map();
var lastOffset = tabSizes.get((_tabs$ = tabs[0]) === null || _tabs$ === void 0 ? void 0 : _tabs$.key) || DEFAULT_SIZE$1;
var rightOffset = lastOffset.left + lastOffset.width;
for (var i2 = 0; i2 < tabs.length; i2 += 1) {
var key2 = tabs[i2].key;
var data = tabSizes.get(key2);
if (!data) {
var _tabs;
data = tabSizes.get((_tabs = tabs[i2 - 1]) === null || _tabs === void 0 ? void 0 : _tabs.key) || DEFAULT_SIZE$1;
}
var entity = map.get(key2) || _objectSpread2$a({}, data);
entity.right = rightOffset - entity.left - entity.width;
map.set(key2, entity);
}
return map;
}, [tabs.map(function(tab) {
return tab.key;
}).join("_"), tabSizes, holderScrollWidth]);
}
function useSyncState$1(defaultState, onChange) {
var stateRef = React__namespace.useRef(defaultState);
var _React$useState = React__namespace.useState({}), _React$useState2 = _slicedToArray$e(_React$useState, 2), forceUpdate = _React$useState2[1];
function setState(updater) {
var newValue = typeof updater === "function" ? updater(stateRef.current) : updater;
if (newValue !== stateRef.current) {
onChange(newValue, stateRef.current);
}
stateRef.current = newValue;
forceUpdate({});
}
return [stateRef.current, setState];
}
var MIN_SWIPE_DISTANCE = 0.1;
var STOP_SWIPE_DISTANCE = 0.01;
var REFRESH_INTERVAL = 20;
var SPEED_OFF_MULTIPLE = Math.pow(0.995, REFRESH_INTERVAL);
function useTouchMove(ref, onOffset) {
var _useState = React$a.useState(), _useState2 = _slicedToArray$e(_useState, 2), touchPosition = _useState2[0], setTouchPosition = _useState2[1];
var _useState3 = React$a.useState(0), _useState4 = _slicedToArray$e(_useState3, 2), lastTimestamp = _useState4[0], setLastTimestamp = _useState4[1];
var _useState5 = React$a.useState(0), _useState6 = _slicedToArray$e(_useState5, 2), lastTimeDiff = _useState6[0], setLastTimeDiff = _useState6[1];
var _useState7 = React$a.useState(), _useState8 = _slicedToArray$e(_useState7, 2), lastOffset = _useState8[0], setLastOffset = _useState8[1];
var motionRef = React$a.useRef();
function onTouchStart(e2) {
var _e$touches$ = e2.touches[0], screenX = _e$touches$.screenX, screenY = _e$touches$.screenY;
setTouchPosition({
x: screenX,
y: screenY
});
window.clearInterval(motionRef.current);
}
function onTouchMove(e2) {
if (!touchPosition)
return;
e2.preventDefault();
var _e$touches$2 = e2.touches[0], screenX = _e$touches$2.screenX, screenY = _e$touches$2.screenY;
setTouchPosition({
x: screenX,
y: screenY
});
var offsetX = screenX - touchPosition.x;
var offsetY = screenY - touchPosition.y;
onOffset(offsetX, offsetY);
var now2 = Date.now();
setLastTimestamp(now2);
setLastTimeDiff(now2 - lastTimestamp);
setLastOffset({
x: offsetX,
y: offsetY
});
}
function onTouchEnd() {
if (!touchPosition)
return;
setTouchPosition(null);
setLastOffset(null);
if (lastOffset) {
var distanceX = lastOffset.x / lastTimeDiff;
var distanceY = lastOffset.y / lastTimeDiff;
var absX = Math.abs(distanceX);
var absY = Math.abs(distanceY);
if (Math.max(absX, absY) < MIN_SWIPE_DISTANCE)
return;
var currentX = distanceX;
var currentY = distanceY;
motionRef.current = window.setInterval(function() {
if (Math.abs(currentX) < STOP_SWIPE_DISTANCE && Math.abs(currentY) < STOP_SWIPE_DISTANCE) {
window.clearInterval(motionRef.current);
return;
}
currentX *= SPEED_OFF_MULTIPLE;
currentY *= SPEED_OFF_MULTIPLE;
onOffset(currentX * REFRESH_INTERVAL, currentY * REFRESH_INTERVAL);
}, REFRESH_INTERVAL);
}
}
var lastWheelDirectionRef = React$a.useRef();
function onWheel(e2) {
var deltaX = e2.deltaX, deltaY = e2.deltaY;
var mixed = 0;
var absX = Math.abs(deltaX);
var absY = Math.abs(deltaY);
if (absX === absY) {
mixed = lastWheelDirectionRef.current === "x" ? deltaX : deltaY;
} else if (absX > absY) {
mixed = deltaX;
lastWheelDirectionRef.current = "x";
} else {
mixed = deltaY;
lastWheelDirectionRef.current = "y";
}
if (onOffset(-mixed, -mixed)) {
e2.preventDefault();
}
}
var touchEventsRef = React$a.useRef(null);
touchEventsRef.current = {
onTouchStart,
onTouchMove,
onTouchEnd,
onWheel
};
React__namespace.useEffect(function() {
function onProxyTouchStart(e2) {
touchEventsRef.current.onTouchStart(e2);
}
function onProxyTouchMove(e2) {
touchEventsRef.current.onTouchMove(e2);
}
function onProxyTouchEnd(e2) {
touchEventsRef.current.onTouchEnd(e2);
}
function onProxyWheel(e2) {
touchEventsRef.current.onWheel(e2);
}
document.addEventListener("touchmove", onProxyTouchMove, {
passive: false
});
document.addEventListener("touchend", onProxyTouchEnd, {
passive: false
});
ref.current.addEventListener("touchstart", onProxyTouchStart, {
passive: false
});
ref.current.addEventListener("wheel", onProxyWheel);
return function() {
document.removeEventListener("touchmove", onProxyTouchMove);
document.removeEventListener("touchend", onProxyTouchEnd);
};
}, []);
}
function useUpdate(callback) {
var _useState = React$a.useState(0), _useState2 = _slicedToArray$e(_useState, 2), count = _useState2[0], setCount = _useState2[1];
var effectRef = React$a.useRef(0);
var callbackRef = React$a.useRef();
callbackRef.current = callback;
useLayoutUpdateEffect(function() {
var _callbackRef$current;
(_callbackRef$current = callbackRef.current) === null || _callbackRef$current === void 0 ? void 0 : _callbackRef$current.call(callbackRef);
}, [count]);
return function() {
if (effectRef.current !== count) {
return;
}
effectRef.current += 1;
setCount(effectRef.current);
};
}
function useUpdateState(defaultState) {
var batchRef = React$a.useRef([]);
var _useState3 = React$a.useState({}), _useState4 = _slicedToArray$e(_useState3, 2), forceUpdate = _useState4[1];
var state = React$a.useRef(typeof defaultState === "function" ? defaultState() : defaultState);
var flushUpdate = useUpdate(function() {
var current = state.current;
batchRef.current.forEach(function(callback) {
current = callback(current);
});
batchRef.current = [];
state.current = current;
forceUpdate({});
});
function updater(callback) {
batchRef.current.push(callback);
flushUpdate();
}
return [state.current, updater];
}
var DEFAULT_SIZE = {
width: 0,
height: 0,
left: 0,
top: 0,
right: 0
};
function useVisibleRange(tabOffsets, visibleTabContentValue, transform, tabContentSizeValue, addNodeSizeValue, operationNodeSizeValue, _ref) {
var tabs = _ref.tabs, tabPosition = _ref.tabPosition, rtl2 = _ref.rtl;
var charUnit;
var position;
var transformSize;
if (["top", "bottom"].includes(tabPosition)) {
charUnit = "width";
position = rtl2 ? "right" : "left";
transformSize = Math.abs(transform);
} else {
charUnit = "height";
position = "top";
transformSize = -transform;
}
return React$a.useMemo(function() {
if (!tabs.length) {
return [0, 0];
}
var len = tabs.length;
var endIndex = len;
for (var i2 = 0; i2 < len; i2 += 1) {
var offset2 = tabOffsets.get(tabs[i2].key) || DEFAULT_SIZE;
if (offset2[position] + offset2[charUnit] > transformSize + visibleTabContentValue) {
endIndex = i2 - 1;
break;
}
}
var startIndex = 0;
for (var _i = len - 1; _i >= 0; _i -= 1) {
var _offset = tabOffsets.get(tabs[_i].key) || DEFAULT_SIZE;
if (_offset[position] < transformSize) {
startIndex = _i + 1;
break;
}
}
return [startIndex, endIndex];
}, [tabOffsets, visibleTabContentValue, tabContentSizeValue, addNodeSizeValue, operationNodeSizeValue, transformSize, tabPosition, tabs.map(function(tab) {
return tab.key;
}).join("_"), rtl2]);
}
function stringify(obj) {
var tgt;
if (obj instanceof Map) {
tgt = {};
obj.forEach(function(v2, k2) {
tgt[k2] = v2;
});
} else {
tgt = obj;
}
return JSON.stringify(tgt);
}
var RC_TABS_DOUBLE_QUOTE = "TABS_DQ";
function genDataNodeKey(key2) {
return String(key2).replace(/"/g, RC_TABS_DOUBLE_QUOTE);
}
function AddButton(_ref, ref) {
var prefixCls = _ref.prefixCls, editable = _ref.editable, locale2 = _ref.locale, style2 = _ref.style;
if (!editable || editable.showAdd === false) {
return null;
}
return /* @__PURE__ */ jsx("button", {
ref,
type: "button",
className: "".concat(prefixCls, "-nav-add"),
style: style2,
"aria-label": (locale2 === null || locale2 === void 0 ? void 0 : locale2.addAriaLabel) || "Add tab",
onClick: function onClick(event) {
editable.onEdit("add", {
event
});
},
children: editable.addIcon || "+"
});
}
const AddButton$1 = /* @__PURE__ */ React__namespace.forwardRef(AddButton);
var ExtraContent = /* @__PURE__ */ React__namespace.forwardRef(function(_ref, ref) {
var position = _ref.position, prefixCls = _ref.prefixCls, extra = _ref.extra;
if (!extra)
return null;
var content;
var assertExtra = {};
if (_typeof$q(extra) === "object" && !/* @__PURE__ */ React__namespace.isValidElement(extra)) {
assertExtra = extra;
} else {
assertExtra.right = extra;
}
if (position === "right") {
content = assertExtra.right;
}
if (position === "left") {
content = assertExtra.left;
}
return content ? /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-extra-content"),
ref,
children: content
}) : null;
});
function OperationNode(_ref, ref) {
var prefixCls = _ref.prefixCls, id2 = _ref.id, tabs = _ref.tabs, locale2 = _ref.locale, mobile = _ref.mobile, _ref$moreIcon = _ref.moreIcon, moreIcon = _ref$moreIcon === void 0 ? "More" : _ref$moreIcon, moreTransitionName = _ref.moreTransitionName, style2 = _ref.style, className = _ref.className, editable = _ref.editable, tabBarGutter = _ref.tabBarGutter, rtl2 = _ref.rtl, removeAriaLabel = _ref.removeAriaLabel, onTabClick = _ref.onTabClick, getPopupContainer = _ref.getPopupContainer, popupClassName = _ref.popupClassName;
var _useState = React$a.useState(false), _useState2 = _slicedToArray$e(_useState, 2), open = _useState2[0], setOpen = _useState2[1];
var _useState3 = React$a.useState(null), _useState4 = _slicedToArray$e(_useState3, 2), selectedKey = _useState4[0], setSelectedKey = _useState4[1];
var popupId = "".concat(id2, "-more-popup");
var dropdownPrefix = "".concat(prefixCls, "-dropdown");
var selectedItemId = selectedKey !== null ? "".concat(popupId, "-").concat(selectedKey) : null;
var dropdownAriaLabel = locale2 === null || locale2 === void 0 ? void 0 : locale2.dropdownAriaLabel;
function onRemoveTab(event, key2) {
event.preventDefault();
event.stopPropagation();
editable.onEdit("remove", {
key: key2,
event
});
}
var menu = /* @__PURE__ */ jsx(ExportMenu, {
onClick: function onClick(_ref2) {
var key2 = _ref2.key, domEvent = _ref2.domEvent;
onTabClick(key2, domEvent);
setOpen(false);
},
prefixCls: "".concat(dropdownPrefix, "-menu"),
id: popupId,
tabIndex: -1,
role: "listbox",
"aria-activedescendant": selectedItemId,
selectedKeys: [selectedKey],
"aria-label": dropdownAriaLabel !== void 0 ? dropdownAriaLabel : "expanded dropdown",
children: tabs.map(function(tab) {
var removable = editable && tab.closable !== false && !tab.disabled;
return /* @__PURE__ */ jsxs(MenuItem$2, {
id: "".concat(popupId, "-").concat(tab.key),
role: "option",
"aria-controls": id2 && "".concat(id2, "-panel-").concat(tab.key),
disabled: tab.disabled,
children: [/* @__PURE__ */ jsx("span", {
children: tab.label
}), removable && /* @__PURE__ */ jsx("button", {
type: "button",
"aria-label": removeAriaLabel || "remove",
tabIndex: 0,
className: "".concat(dropdownPrefix, "-menu-item-remove"),
onClick: function onClick(e2) {
e2.stopPropagation();
onRemoveTab(e2, tab.key);
},
children: tab.closeIcon || editable.removeIcon || "\xD7"
})]
}, tab.key);
})
});
function selectOffset(offset2) {
var enabledTabs = tabs.filter(function(tab2) {
return !tab2.disabled;
});
var selectedIndex = enabledTabs.findIndex(function(tab2) {
return tab2.key === selectedKey;
}) || 0;
var len = enabledTabs.length;
for (var i2 = 0; i2 < len; i2 += 1) {
selectedIndex = (selectedIndex + offset2 + len) % len;
var tab = enabledTabs[selectedIndex];
if (!tab.disabled) {
setSelectedKey(tab.key);
return;
}
}
}
function onKeyDown2(e2) {
var which = e2.which;
if (!open) {
if ([KeyCode.DOWN, KeyCode.SPACE, KeyCode.ENTER].includes(which)) {
setOpen(true);
e2.preventDefault();
}
return;
}
switch (which) {
case KeyCode.UP:
selectOffset(-1);
e2.preventDefault();
break;
case KeyCode.DOWN:
selectOffset(1);
e2.preventDefault();
break;
case KeyCode.ESC:
setOpen(false);
break;
case KeyCode.SPACE:
case KeyCode.ENTER:
if (selectedKey !== null)
onTabClick(selectedKey, e2);
break;
}
}
React$a.useEffect(function() {
var ele = document.getElementById(selectedItemId);
if (ele && ele.scrollIntoView) {
ele.scrollIntoView(false);
}
}, [selectedKey]);
React$a.useEffect(function() {
if (!open) {
setSelectedKey(null);
}
}, [open]);
var moreStyle = _defineProperty$b({}, rtl2 ? "marginRight" : "marginLeft", tabBarGutter);
if (!tabs.length) {
moreStyle.visibility = "hidden";
moreStyle.order = 1;
}
var overlayClassName = classnames(_defineProperty$b({}, "".concat(dropdownPrefix, "-rtl"), rtl2));
var moreNode = mobile ? null : /* @__PURE__ */ jsx(Dropdown$3, {
prefixCls: dropdownPrefix,
overlay: menu,
trigger: ["hover"],
visible: tabs.length ? open : false,
transitionName: moreTransitionName,
onVisibleChange: setOpen,
overlayClassName: classnames(overlayClassName, popupClassName),
mouseEnterDelay: 0.1,
mouseLeaveDelay: 0.1,
getPopupContainer,
children: /* @__PURE__ */ jsx("button", {
type: "button",
className: "".concat(prefixCls, "-nav-more"),
style: moreStyle,
tabIndex: -1,
"aria-hidden": "true",
"aria-haspopup": "listbox",
"aria-controls": popupId,
id: "".concat(id2, "-more"),
"aria-expanded": open,
onKeyDown: onKeyDown2,
children: moreIcon
})
});
return /* @__PURE__ */ jsxs("div", {
className: classnames("".concat(prefixCls, "-nav-operations"), className),
style: style2,
ref,
children: [moreNode, /* @__PURE__ */ jsx(AddButton$1, {
prefixCls,
locale: locale2,
editable
})]
});
}
const OperationNode$1 = /* @__PURE__ */ React__namespace.memo(/* @__PURE__ */ React__namespace.forwardRef(OperationNode), function(_, next) {
return next.tabMoving;
});
function TabNode(_ref) {
var _classNames;
var prefixCls = _ref.prefixCls, id2 = _ref.id, active = _ref.active, _ref$tab = _ref.tab, key2 = _ref$tab.key, label = _ref$tab.label, disabled = _ref$tab.disabled, closeIcon = _ref$tab.closeIcon, closable = _ref.closable, renderWrapper = _ref.renderWrapper, removeAriaLabel = _ref.removeAriaLabel, editable = _ref.editable, onClick = _ref.onClick, onFocus = _ref.onFocus, style2 = _ref.style;
var tabPrefix = "".concat(prefixCls, "-tab");
var removable = editable && closable !== false && !disabled;
function onInternalClick(e2) {
if (disabled) {
return;
}
onClick(e2);
}
function onRemoveTab(event) {
event.preventDefault();
event.stopPropagation();
editable.onEdit("remove", {
key: key2,
event
});
}
var node = /* @__PURE__ */ jsxs("div", {
"data-node-key": genDataNodeKey(key2),
className: classnames(tabPrefix, (_classNames = {}, _defineProperty$b(_classNames, "".concat(tabPrefix, "-with-remove"), removable), _defineProperty$b(_classNames, "".concat(tabPrefix, "-active"), active), _defineProperty$b(_classNames, "".concat(tabPrefix, "-disabled"), disabled), _classNames)),
style: style2,
onClick: onInternalClick,
children: [/* @__PURE__ */ jsx("div", {
role: "tab",
"aria-selected": active,
id: id2 && "".concat(id2, "-tab-").concat(key2),
className: "".concat(tabPrefix, "-btn"),
"aria-controls": id2 && "".concat(id2, "-panel-").concat(key2),
"aria-disabled": disabled,
tabIndex: disabled ? null : 0,
onClick: function onClick2(e2) {
e2.stopPropagation();
onInternalClick(e2);
},
onKeyDown: function onKeyDown2(e2) {
if ([KeyCode.SPACE, KeyCode.ENTER].includes(e2.which)) {
e2.preventDefault();
onInternalClick(e2);
}
},
onFocus,
children: label
}), removable && /* @__PURE__ */ jsx("button", {
type: "button",
"aria-label": removeAriaLabel || "remove",
tabIndex: 0,
className: "".concat(tabPrefix, "-remove"),
onClick: function onClick2(e2) {
e2.stopPropagation();
onRemoveTab(e2);
},
children: closeIcon || editable.removeIcon || "\xD7"
})]
}, key2);
return renderWrapper ? renderWrapper(node) : node;
}
var getSize = function getSize2(refObj) {
var _ref = refObj.current || {}, _ref$offsetWidth = _ref.offsetWidth, offsetWidth = _ref$offsetWidth === void 0 ? 0 : _ref$offsetWidth, _ref$offsetHeight = _ref.offsetHeight, offsetHeight = _ref$offsetHeight === void 0 ? 0 : _ref$offsetHeight;
return [offsetWidth, offsetHeight];
};
var getUnitValue = function getUnitValue2(size, tabPositionTopOrBottom) {
return size[tabPositionTopOrBottom ? 0 : 1];
};
function TabNavList(props, ref) {
var _classNames;
var _React$useContext = React__namespace.useContext(TabContext), prefixCls = _React$useContext.prefixCls, tabs = _React$useContext.tabs;
var className = props.className, style2 = props.style, id2 = props.id, animated = props.animated, activeKey = props.activeKey, rtl2 = props.rtl, extra = props.extra, editable = props.editable, locale2 = props.locale, tabPosition = props.tabPosition, tabBarGutter = props.tabBarGutter, children = props.children, onTabClick = props.onTabClick, onTabScroll = props.onTabScroll;
var containerRef = React$a.useRef();
var extraLeftRef = React$a.useRef();
var extraRightRef = React$a.useRef();
var tabsWrapperRef = React$a.useRef();
var tabListRef = React$a.useRef();
var operationsRef = React$a.useRef();
var innerAddButtonRef = React$a.useRef();
var tabPositionTopOrBottom = tabPosition === "top" || tabPosition === "bottom";
var _useSyncState = useSyncState$1(0, function(next, prev) {
if (tabPositionTopOrBottom && onTabScroll) {
onTabScroll({
direction: next > prev ? "left" : "right"
});
}
}), _useSyncState2 = _slicedToArray$e(_useSyncState, 2), transformLeft = _useSyncState2[0], setTransformLeft = _useSyncState2[1];
var _useSyncState3 = useSyncState$1(0, function(next, prev) {
if (!tabPositionTopOrBottom && onTabScroll) {
onTabScroll({
direction: next > prev ? "top" : "bottom"
});
}
}), _useSyncState4 = _slicedToArray$e(_useSyncState3, 2), transformTop = _useSyncState4[0], setTransformTop = _useSyncState4[1];
var _useState = React$a.useState([0, 0]), _useState2 = _slicedToArray$e(_useState, 2), containerExcludeExtraSize = _useState2[0], setContainerExcludeExtraSize = _useState2[1];
var _useState3 = React$a.useState([0, 0]), _useState4 = _slicedToArray$e(_useState3, 2), tabContentSize = _useState4[0], setTabContentSize = _useState4[1];
var _useState5 = React$a.useState([0, 0]), _useState6 = _slicedToArray$e(_useState5, 2), addSize = _useState6[0], setAddSize = _useState6[1];
var _useState7 = React$a.useState([0, 0]), _useState8 = _slicedToArray$e(_useState7, 2), operationSize = _useState8[0], setOperationSize = _useState8[1];
var _useUpdateState = useUpdateState(/* @__PURE__ */ new Map()), _useUpdateState2 = _slicedToArray$e(_useUpdateState, 2), tabSizes = _useUpdateState2[0], setTabSizes = _useUpdateState2[1];
var tabOffsets = useOffsets(tabs, tabSizes, tabContentSize[0]);
var containerExcludeExtraSizeValue = getUnitValue(containerExcludeExtraSize, tabPositionTopOrBottom);
var tabContentSizeValue = getUnitValue(tabContentSize, tabPositionTopOrBottom);
var addSizeValue = getUnitValue(addSize, tabPositionTopOrBottom);
var operationSizeValue = getUnitValue(operationSize, tabPositionTopOrBottom);
var needScroll = containerExcludeExtraSizeValue < tabContentSizeValue + addSizeValue;
var visibleTabContentValue = needScroll ? containerExcludeExtraSizeValue - operationSizeValue : containerExcludeExtraSizeValue - addSizeValue;
var operationsHiddenClassName = "".concat(prefixCls, "-nav-operations-hidden");
var transformMin = 0;
var transformMax = 0;
if (!tabPositionTopOrBottom) {
transformMin = Math.min(0, visibleTabContentValue - tabContentSizeValue);
transformMax = 0;
} else if (rtl2) {
transformMin = 0;
transformMax = Math.max(0, tabContentSizeValue - visibleTabContentValue);
} else {
transformMin = Math.min(0, visibleTabContentValue - tabContentSizeValue);
transformMax = 0;
}
function alignInRange(value) {
if (value < transformMin) {
return transformMin;
}
if (value > transformMax) {
return transformMax;
}
return value;
}
var touchMovingRef = React$a.useRef();
var _useState9 = React$a.useState(), _useState10 = _slicedToArray$e(_useState9, 2), lockAnimation = _useState10[0], setLockAnimation = _useState10[1];
function doLockAnimation() {
setLockAnimation(Date.now());
}
function clearTouchMoving() {
window.clearTimeout(touchMovingRef.current);
}
useTouchMove(tabsWrapperRef, function(offsetX, offsetY) {
function doMove(setState, offset2) {
setState(function(value) {
var newValue = alignInRange(value + offset2);
return newValue;
});
}
if (!needScroll) {
return false;
}
if (tabPositionTopOrBottom) {
doMove(setTransformLeft, offsetX);
} else {
doMove(setTransformTop, offsetY);
}
clearTouchMoving();
doLockAnimation();
return true;
});
React$a.useEffect(function() {
clearTouchMoving();
if (lockAnimation) {
touchMovingRef.current = window.setTimeout(function() {
setLockAnimation(0);
}, 100);
}
return clearTouchMoving;
}, [lockAnimation]);
var _useVisibleRange = useVisibleRange(
tabOffsets,
visibleTabContentValue,
tabPositionTopOrBottom ? transformLeft : transformTop,
tabContentSizeValue,
addSizeValue,
operationSizeValue,
_objectSpread2$a(_objectSpread2$a({}, props), {}, {
tabs
})
), _useVisibleRange2 = _slicedToArray$e(_useVisibleRange, 2), visibleStart = _useVisibleRange2[0], visibleEnd = _useVisibleRange2[1];
var scrollToTab = useEvent(function() {
var key2 = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : activeKey;
var tabOffset = tabOffsets.get(key2) || {
width: 0,
height: 0,
left: 0,
right: 0,
top: 0
};
if (tabPositionTopOrBottom) {
var newTransform = transformLeft;
if (rtl2) {
if (tabOffset.right < transformLeft) {
newTransform = tabOffset.right;
} else if (tabOffset.right + tabOffset.width > transformLeft + visibleTabContentValue) {
newTransform = tabOffset.right + tabOffset.width - visibleTabContentValue;
}
} else if (tabOffset.left < -transformLeft) {
newTransform = -tabOffset.left;
} else if (tabOffset.left + tabOffset.width > -transformLeft + visibleTabContentValue) {
newTransform = -(tabOffset.left + tabOffset.width - visibleTabContentValue);
}
setTransformTop(0);
setTransformLeft(alignInRange(newTransform));
} else {
var _newTransform = transformTop;
if (tabOffset.top < -transformTop) {
_newTransform = -tabOffset.top;
} else if (tabOffset.top + tabOffset.height > -transformTop + visibleTabContentValue) {
_newTransform = -(tabOffset.top + tabOffset.height - visibleTabContentValue);
}
setTransformLeft(0);
setTransformTop(alignInRange(_newTransform));
}
});
var tabNodeStyle = {};
if (tabPosition === "top" || tabPosition === "bottom") {
tabNodeStyle[rtl2 ? "marginRight" : "marginLeft"] = tabBarGutter;
} else {
tabNodeStyle.marginTop = tabBarGutter;
}
var tabNodes = tabs.map(function(tab, i2) {
var key2 = tab.key;
return /* @__PURE__ */ jsx(TabNode, {
id: id2,
prefixCls,
tab,
style: i2 === 0 ? void 0 : tabNodeStyle,
closable: tab.closable,
editable,
active: key2 === activeKey,
renderWrapper: children,
removeAriaLabel: locale2 === null || locale2 === void 0 ? void 0 : locale2.removeAriaLabel,
onClick: function onClick(e2) {
onTabClick(key2, e2);
},
onFocus: function onFocus() {
scrollToTab(key2);
doLockAnimation();
if (!tabsWrapperRef.current) {
return;
}
if (!rtl2) {
tabsWrapperRef.current.scrollLeft = 0;
}
tabsWrapperRef.current.scrollTop = 0;
}
}, key2);
});
var updateTabSizes = function updateTabSizes2() {
return setTabSizes(function() {
var newSizes = /* @__PURE__ */ new Map();
tabs.forEach(function(_ref2) {
var _tabListRef$current;
var key2 = _ref2.key;
var btnNode = (_tabListRef$current = tabListRef.current) === null || _tabListRef$current === void 0 ? void 0 : _tabListRef$current.querySelector('[data-node-key="'.concat(genDataNodeKey(key2), '"]'));
if (btnNode) {
newSizes.set(key2, {
width: btnNode.offsetWidth,
height: btnNode.offsetHeight,
left: btnNode.offsetLeft,
top: btnNode.offsetTop
});
}
});
return newSizes;
});
};
React$a.useEffect(function() {
updateTabSizes();
}, [tabs.map(function(tab) {
return tab.key;
}).join("_")]);
var onListHolderResize = useUpdate(function() {
var containerSize = getSize(containerRef);
var extraLeftSize = getSize(extraLeftRef);
var extraRightSize = getSize(extraRightRef);
setContainerExcludeExtraSize([containerSize[0] - extraLeftSize[0] - extraRightSize[0], containerSize[1] - extraLeftSize[1] - extraRightSize[1]]);
var newAddSize = getSize(innerAddButtonRef);
setAddSize(newAddSize);
var newOperationSize = getSize(operationsRef);
setOperationSize(newOperationSize);
var tabContentFullSize = getSize(tabListRef);
setTabContentSize([tabContentFullSize[0] - newAddSize[0], tabContentFullSize[1] - newAddSize[1]]);
updateTabSizes();
});
var startHiddenTabs = tabs.slice(0, visibleStart);
var endHiddenTabs = tabs.slice(visibleEnd + 1);
var hiddenTabs = [].concat(_toConsumableArray$c(startHiddenTabs), _toConsumableArray$c(endHiddenTabs));
var _useState11 = React$a.useState(), _useState12 = _slicedToArray$e(_useState11, 2), inkStyle = _useState12[0], setInkStyle = _useState12[1];
var activeTabOffset = tabOffsets.get(activeKey);
var inkBarRafRef = React$a.useRef();
function cleanInkBarRaf() {
wrapperRaf$1.cancel(inkBarRafRef.current);
}
React$a.useEffect(function() {
var newInkStyle = {};
if (activeTabOffset) {
if (tabPositionTopOrBottom) {
if (rtl2) {
newInkStyle.right = activeTabOffset.right;
} else {
newInkStyle.left = activeTabOffset.left;
}
newInkStyle.width = activeTabOffset.width;
} else {
newInkStyle.top = activeTabOffset.top;
newInkStyle.height = activeTabOffset.height;
}
}
cleanInkBarRaf();
inkBarRafRef.current = wrapperRaf$1(function() {
setInkStyle(newInkStyle);
});
return cleanInkBarRaf;
}, [activeTabOffset, tabPositionTopOrBottom, rtl2]);
React$a.useEffect(function() {
scrollToTab();
}, [activeKey, transformMin, transformMax, stringify(activeTabOffset), stringify(tabOffsets), tabPositionTopOrBottom]);
React$a.useEffect(function() {
onListHolderResize();
}, [rtl2]);
var hasDropdown = !!hiddenTabs.length;
var wrapPrefix = "".concat(prefixCls, "-nav-wrap");
var pingLeft;
var pingRight;
var pingTop;
var pingBottom;
if (tabPositionTopOrBottom) {
if (rtl2) {
pingRight = transformLeft > 0;
pingLeft = transformLeft !== transformMax;
} else {
pingLeft = transformLeft < 0;
pingRight = transformLeft !== transformMin;
}
} else {
pingTop = transformTop < 0;
pingBottom = transformTop !== transformMin;
}
return /* @__PURE__ */ jsx(RefResizeObserver, {
onResize: onListHolderResize,
children: /* @__PURE__ */ jsxs("div", {
ref: useComposeRef(ref, containerRef),
role: "tablist",
className: classnames("".concat(prefixCls, "-nav"), className),
style: style2,
onKeyDown: function onKeyDown2() {
doLockAnimation();
},
children: [/* @__PURE__ */ jsx(ExtraContent, {
ref: extraLeftRef,
position: "left",
extra,
prefixCls
}), /* @__PURE__ */ jsx("div", {
className: classnames(wrapPrefix, (_classNames = {}, _defineProperty$b(_classNames, "".concat(wrapPrefix, "-ping-left"), pingLeft), _defineProperty$b(_classNames, "".concat(wrapPrefix, "-ping-right"), pingRight), _defineProperty$b(_classNames, "".concat(wrapPrefix, "-ping-top"), pingTop), _defineProperty$b(_classNames, "".concat(wrapPrefix, "-ping-bottom"), pingBottom), _classNames)),
ref: tabsWrapperRef,
children: /* @__PURE__ */ jsx(RefResizeObserver, {
onResize: onListHolderResize,
children: /* @__PURE__ */ jsxs("div", {
ref: tabListRef,
className: "".concat(prefixCls, "-nav-list"),
style: {
transform: "translate(".concat(transformLeft, "px, ").concat(transformTop, "px)"),
transition: lockAnimation ? "none" : void 0
},
children: [tabNodes, /* @__PURE__ */ jsx(AddButton$1, {
ref: innerAddButtonRef,
prefixCls,
locale: locale2,
editable,
style: _objectSpread2$a(_objectSpread2$a({}, tabNodes.length === 0 ? void 0 : tabNodeStyle), {}, {
visibility: hasDropdown ? "hidden" : null
})
}), /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-ink-bar"), _defineProperty$b({}, "".concat(prefixCls, "-ink-bar-animated"), animated.inkBar)),
style: inkStyle
})]
})
})
}), /* @__PURE__ */ jsx(OperationNode$1, {
...props,
removeAriaLabel: locale2 === null || locale2 === void 0 ? void 0 : locale2.removeAriaLabel,
ref: operationsRef,
prefixCls,
tabs: hiddenTabs,
className: !hasDropdown && operationsHiddenClassName,
tabMoving: !!lockAnimation
}), /* @__PURE__ */ jsx(ExtraContent, {
ref: extraRightRef,
position: "right",
extra,
prefixCls
})]
})
});
}
const TabNavList$1 = /* @__PURE__ */ React__namespace.forwardRef(TabNavList);
var _excluded$p = ["renderTabBar"], _excluded2$3 = ["label", "key"];
function TabNavListWrapper(_ref) {
var renderTabBar = _ref.renderTabBar, restProps = _objectWithoutProperties$1(_ref, _excluded$p);
var _React$useContext = React__namespace.useContext(TabContext), tabs = _React$useContext.tabs;
if (renderTabBar) {
var tabNavBarProps = _objectSpread2$a(_objectSpread2$a({}, restProps), {}, {
panes: tabs.map(function(_ref2) {
var label = _ref2.label, key2 = _ref2.key, restTabProps = _objectWithoutProperties$1(_ref2, _excluded2$3);
return /* @__PURE__ */ jsx(TabPane$3, {
tab: label,
tabKey: key2,
...restTabProps
}, key2);
})
});
return renderTabBar(tabNavBarProps, TabNavList$1);
}
return /* @__PURE__ */ jsx(TabNavList$1, {
...restProps
});
}
function useAnimateConfig$1() {
var animated = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {
inkBar: true,
tabPane: false
};
var mergedAnimated;
if (animated === false) {
mergedAnimated = {
inkBar: false,
tabPane: false
};
} else if (animated === true) {
mergedAnimated = {
inkBar: true,
tabPane: false
};
} else {
mergedAnimated = _objectSpread2$a({
inkBar: true
}, _typeof$q(animated) === "object" ? animated : {});
}
if (mergedAnimated.tabPaneMotion && mergedAnimated.tabPane === void 0) {
mergedAnimated.tabPane = true;
}
if (!mergedAnimated.tabPaneMotion && mergedAnimated.tabPane) {
mergedAnimated.tabPane = false;
}
return mergedAnimated;
}
var _excluded$o = ["id", "prefixCls", "className", "items", "direction", "activeKey", "defaultActiveKey", "editable", "animated", "tabPosition", "tabBarGutter", "tabBarStyle", "tabBarExtraContent", "locale", "moreIcon", "moreTransitionName", "destroyInactiveTabPane", "renderTabBar", "onChange", "onTabClick", "onTabScroll", "getPopupContainer", "popupClassName"];
var uuid$4 = 0;
function Tabs$1(_ref, ref) {
var _classNames;
var id2 = _ref.id, _ref$prefixCls = _ref.prefixCls, prefixCls = _ref$prefixCls === void 0 ? "rc-tabs" : _ref$prefixCls, className = _ref.className, items = _ref.items, direction = _ref.direction, activeKey = _ref.activeKey, defaultActiveKey = _ref.defaultActiveKey, editable = _ref.editable, animated = _ref.animated, _ref$tabPosition = _ref.tabPosition, tabPosition = _ref$tabPosition === void 0 ? "top" : _ref$tabPosition, tabBarGutter = _ref.tabBarGutter, tabBarStyle = _ref.tabBarStyle, tabBarExtraContent = _ref.tabBarExtraContent, locale2 = _ref.locale, moreIcon = _ref.moreIcon, moreTransitionName = _ref.moreTransitionName, destroyInactiveTabPane = _ref.destroyInactiveTabPane, renderTabBar = _ref.renderTabBar, onChange = _ref.onChange, onTabClick = _ref.onTabClick, onTabScroll = _ref.onTabScroll, getPopupContainer = _ref.getPopupContainer, popupClassName = _ref.popupClassName, restProps = _objectWithoutProperties$1(_ref, _excluded$o);
var tabs = React__namespace.useMemo(function() {
return (items || []).filter(function(item) {
return item && _typeof$q(item) === "object" && "key" in item;
});
}, [items]);
var rtl2 = direction === "rtl";
var mergedAnimated = useAnimateConfig$1(animated);
var _useState = React$a.useState(false), _useState2 = _slicedToArray$e(_useState, 2), mobile = _useState2[0], setMobile = _useState2[1];
React$a.useEffect(function() {
setMobile(isMobile$1());
}, []);
var _useMergedState = useMergedState(function() {
var _tabs$;
return (_tabs$ = tabs[0]) === null || _tabs$ === void 0 ? void 0 : _tabs$.key;
}, {
value: activeKey,
defaultValue: defaultActiveKey
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), mergedActiveKey = _useMergedState2[0], setMergedActiveKey = _useMergedState2[1];
var _useState3 = React$a.useState(function() {
return tabs.findIndex(function(tab) {
return tab.key === mergedActiveKey;
});
}), _useState4 = _slicedToArray$e(_useState3, 2), activeIndex = _useState4[0], setActiveIndex = _useState4[1];
React$a.useEffect(function() {
var newActiveIndex = tabs.findIndex(function(tab) {
return tab.key === mergedActiveKey;
});
if (newActiveIndex === -1) {
var _tabs$newActiveIndex;
newActiveIndex = Math.max(0, Math.min(activeIndex, tabs.length - 1));
setMergedActiveKey((_tabs$newActiveIndex = tabs[newActiveIndex]) === null || _tabs$newActiveIndex === void 0 ? void 0 : _tabs$newActiveIndex.key);
}
setActiveIndex(newActiveIndex);
}, [tabs.map(function(tab) {
return tab.key;
}).join("_"), mergedActiveKey, activeIndex]);
var _useMergedState3 = useMergedState(null, {
value: id2
}), _useMergedState4 = _slicedToArray$e(_useMergedState3, 2), mergedId = _useMergedState4[0], setMergedId = _useMergedState4[1];
React$a.useEffect(function() {
if (!id2) {
setMergedId("rc-tabs-".concat(uuid$4));
uuid$4 += 1;
}
}, []);
function onInternalTabClick(key2, e2) {
onTabClick === null || onTabClick === void 0 ? void 0 : onTabClick(key2, e2);
var isActiveChanged = key2 !== mergedActiveKey;
setMergedActiveKey(key2);
if (isActiveChanged) {
onChange === null || onChange === void 0 ? void 0 : onChange(key2);
}
}
var sharedProps = {
id: mergedId,
activeKey: mergedActiveKey,
animated: mergedAnimated,
tabPosition,
rtl: rtl2,
mobile
};
var tabNavBar;
var tabNavBarProps = _objectSpread2$a(_objectSpread2$a({}, sharedProps), {}, {
editable,
locale: locale2,
moreIcon,
moreTransitionName,
tabBarGutter,
onTabClick: onInternalTabClick,
onTabScroll,
extra: tabBarExtraContent,
style: tabBarStyle,
panes: null,
getPopupContainer,
popupClassName
});
return /* @__PURE__ */ jsx(TabContext.Provider, {
value: {
tabs,
prefixCls
},
children: /* @__PURE__ */ jsxs("div", {
ref,
id: id2,
className: classnames(prefixCls, "".concat(prefixCls, "-").concat(tabPosition), (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-mobile"), mobile), _defineProperty$b(_classNames, "".concat(prefixCls, "-editable"), editable), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), rtl2), _classNames), className),
...restProps,
children: [tabNavBar, /* @__PURE__ */ jsx(TabNavListWrapper, {
...tabNavBarProps,
renderTabBar
}), /* @__PURE__ */ jsx(TabPanelList, {
destroyInactiveTabPane,
...sharedProps,
animated: mergedAnimated
})]
})
});
}
var ForwardTabs = /* @__PURE__ */ React__namespace.forwardRef(Tabs$1);
var motion = {
motionAppear: false,
motionEnter: true,
motionLeave: true
};
function useAnimateConfig(prefixCls) {
var animated = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {
inkBar: true,
tabPane: false
};
var mergedAnimated;
if (animated === false) {
mergedAnimated = {
inkBar: false,
tabPane: false
};
} else if (animated === true) {
mergedAnimated = {
inkBar: true,
tabPane: true
};
} else {
mergedAnimated = _extends$3({
inkBar: true
}, _typeof$q(animated) === "object" ? animated : {});
}
if (mergedAnimated.tabPane) {
mergedAnimated.tabPaneMotion = _extends$3(_extends$3({}, motion), {
motionName: getTransitionName(prefixCls, "switch")
});
}
return mergedAnimated;
}
var __rest$C = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
function filter(items) {
return items.filter(function(item) {
return item;
});
}
function useLegacyItems(items, children) {
if (items) {
return items;
}
var childrenItems = toArray$9(children).map(function(node) {
if (/* @__PURE__ */ React__namespace.isValidElement(node)) {
var key2 = node.key, props = node.props;
var _a = props || {}, tab = _a.tab, restProps = __rest$C(_a, ["tab"]);
var item = _extends$3(_extends$3({
key: String(key2)
}, restProps), {
label: tab
});
return item;
}
return null;
});
return filter(childrenItems);
}
var TabPane$1 = function TabPane2() {
return null;
};
const TabPane$2 = TabPane$1;
var __rest$B = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
function Tabs(_a) {
var type2 = _a.type, className = _a.className, propSize = _a.size, _onEdit = _a.onEdit, hideAdd = _a.hideAdd, centered = _a.centered, addIcon = _a.addIcon, children = _a.children, items = _a.items, animated = _a.animated, props = __rest$B(_a, ["type", "className", "size", "onEdit", "hideAdd", "centered", "addIcon", "children", "items", "animated"]);
var customizePrefixCls = props.prefixCls, _props$moreIcon = props.moreIcon, moreIcon = _props$moreIcon === void 0 ? /* @__PURE__ */ jsx(EllipsisOutlined$1, {}) : _props$moreIcon;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction, getPopupContainer = _React$useContext.getPopupContainer;
var prefixCls = getPrefixCls("tabs", customizePrefixCls);
var editable;
if (type2 === "editable-card") {
editable = {
onEdit: function onEdit(editType, _ref) {
var key2 = _ref.key, event = _ref.event;
_onEdit === null || _onEdit === void 0 ? void 0 : _onEdit(editType === "add" ? event : key2, editType);
},
removeIcon: /* @__PURE__ */ jsx(CloseOutlined$4, {}),
addIcon: addIcon || /* @__PURE__ */ jsx(PlusOutlined$4, {}),
showAdd: hideAdd !== true
};
}
var rootPrefixCls = getPrefixCls();
var mergedItems = useLegacyItems(items, children);
var mergedAnimated = useAnimateConfig(prefixCls, animated);
return /* @__PURE__ */ jsx(SizeContext$1.Consumer, {
children: function(contextSize) {
var _classNames;
var size = propSize !== void 0 ? propSize : contextSize;
return /* @__PURE__ */ jsx(ForwardTabs, {
direction,
getPopupContainer,
moreTransitionName: "".concat(rootPrefixCls, "-slide-up"),
...props,
items: mergedItems,
className: classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(size), size), _defineProperty$b(_classNames, "".concat(prefixCls, "-card"), ["card", "editable-card"].includes(type2)), _defineProperty$b(_classNames, "".concat(prefixCls, "-editable-card"), type2 === "editable-card"), _defineProperty$b(_classNames, "".concat(prefixCls, "-centered"), centered), _classNames), className),
editable,
moreIcon,
prefixCls,
animated: mergedAnimated
});
}
});
}
Tabs.TabPane = TabPane$2;
var __rest$A = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Grid = function Grid2(_a) {
var prefixCls = _a.prefixCls, className = _a.className, _a$hoverable = _a.hoverable, hoverable = _a$hoverable === void 0 ? true : _a$hoverable, props = __rest$A(_a, ["prefixCls", "className", "hoverable"]);
return /* @__PURE__ */ jsx(ConfigConsumer, {
children: function(_ref) {
var getPrefixCls = _ref.getPrefixCls;
var prefix = getPrefixCls("card", prefixCls);
var classString = classnames("".concat(prefix, "-grid"), className, _defineProperty$b({}, "".concat(prefix, "-grid-hoverable"), hoverable));
return /* @__PURE__ */ jsx("div", {
...props,
className: classString
});
}
});
};
const Grid$1 = Grid;
var __rest$z = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
function getAction(actions) {
var actionList = actions.map(function(action, index2) {
return /* @__PURE__ */ jsx("li", {
style: {
width: "".concat(100 / actions.length, "%")
},
children: /* @__PURE__ */ jsx("span", {
children: action
})
}, "action-".concat(index2));
});
return actionList;
}
var Card$1 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _extends2, _classNames;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var size = React__namespace.useContext(SizeContext$1);
var onTabChange = function onTabChange2(key2) {
var _a;
(_a = props.onTabChange) === null || _a === void 0 ? void 0 : _a.call(props, key2);
};
var isContainGrid = function isContainGrid2() {
var containGrid;
React__namespace.Children.forEach(props.children, function(element) {
if (element && element.type && element.type === Grid$1) {
containGrid = true;
}
});
return containGrid;
};
var customizePrefixCls = props.prefixCls, className = props.className, extra = props.extra, _props$headStyle = props.headStyle, headStyle = _props$headStyle === void 0 ? {} : _props$headStyle, _props$bodyStyle = props.bodyStyle, bodyStyle = _props$bodyStyle === void 0 ? {} : _props$bodyStyle, title = props.title, loading = props.loading, _props$bordered = props.bordered, bordered = _props$bordered === void 0 ? true : _props$bordered, customizeSize = props.size, type2 = props.type, cover = props.cover, actions = props.actions, tabList = props.tabList, children = props.children, activeTabKey = props.activeTabKey, defaultActiveTabKey = props.defaultActiveTabKey, tabBarExtraContent = props.tabBarExtraContent, hoverable = props.hoverable, _props$tabProps = props.tabProps, tabProps = _props$tabProps === void 0 ? {} : _props$tabProps, others = __rest$z(props, ["prefixCls", "className", "extra", "headStyle", "bodyStyle", "title", "loading", "bordered", "size", "type", "cover", "actions", "tabList", "children", "activeTabKey", "defaultActiveTabKey", "tabBarExtraContent", "hoverable", "tabProps"]);
var prefixCls = getPrefixCls("card", customizePrefixCls);
var loadingBlock = /* @__PURE__ */ jsx(Skeleton$1, {
loading: true,
active: true,
paragraph: {
rows: 4
},
title: false,
children
});
var hasActiveTabKey = activeTabKey !== void 0;
var extraProps = _extends$3(_extends$3({}, tabProps), (_extends2 = {}, _defineProperty$b(_extends2, hasActiveTabKey ? "activeKey" : "defaultActiveKey", hasActiveTabKey ? activeTabKey : defaultActiveTabKey), _defineProperty$b(_extends2, "tabBarExtraContent", tabBarExtraContent), _extends2));
var head;
var tabs = tabList && tabList.length ? /* @__PURE__ */ jsx(Tabs, {
size: "large",
...extraProps,
className: "".concat(prefixCls, "-head-tabs"),
onChange: onTabChange,
items: tabList.map(function(item) {
var _a;
return {
label: item.tab,
key: item.key,
disabled: (_a = item.disabled) !== null && _a !== void 0 ? _a : false
};
})
}) : null;
if (title || extra || tabs) {
head = /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-head"),
style: headStyle,
children: [/* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-head-wrapper"),
children: [title && /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-head-title"),
children: title
}), extra && /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-extra"),
children: extra
})]
}), tabs]
});
}
var coverDom = cover ? /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-cover"),
children: cover
}) : null;
var body = /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-body"),
style: bodyStyle,
children: loading ? loadingBlock : children
});
var actionDom = actions && actions.length ? /* @__PURE__ */ jsx("ul", {
className: "".concat(prefixCls, "-actions"),
children: getAction(actions)
}) : null;
var divProps = omit(others, ["onTabChange"]);
var mergedSize = customizeSize || size;
var classString = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-loading"), loading), _defineProperty$b(_classNames, "".concat(prefixCls, "-bordered"), bordered), _defineProperty$b(_classNames, "".concat(prefixCls, "-hoverable"), hoverable), _defineProperty$b(_classNames, "".concat(prefixCls, "-contain-grid"), isContainGrid()), _defineProperty$b(_classNames, "".concat(prefixCls, "-contain-tabs"), tabList && tabList.length), _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(mergedSize), mergedSize), _defineProperty$b(_classNames, "".concat(prefixCls, "-type-").concat(type2), !!type2), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className);
return /* @__PURE__ */ jsxs("div", {
ref,
...divProps,
className: classString,
children: [head, coverDom, body, actionDom]
});
});
const InternalCard = Card$1;
var __rest$y = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Meta = function Meta2(props) {
return /* @__PURE__ */ jsx(ConfigConsumer, {
children: function(_ref) {
var getPrefixCls = _ref.getPrefixCls;
var customizePrefixCls = props.prefixCls, className = props.className, avatar = props.avatar, title = props.title, description = props.description, others = __rest$y(props, ["prefixCls", "className", "avatar", "title", "description"]);
var prefixCls = getPrefixCls("card", customizePrefixCls);
var classString = classnames("".concat(prefixCls, "-meta"), className);
var avatarDom = avatar ? /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-meta-avatar"),
children: avatar
}) : null;
var titleDom = title ? /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-meta-title"),
children: title
}) : null;
var descriptionDom = description ? /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-meta-description"),
children: description
}) : null;
var MetaDetail = titleDom || descriptionDom ? /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-meta-detail"),
children: [titleDom, descriptionDom]
}) : null;
return /* @__PURE__ */ jsxs("div", {
...others,
className: classString,
children: [avatarDom, MetaDetail]
});
}
});
};
const Meta$1 = Meta;
var Card = InternalCard;
Card.Grid = Grid$1;
Card.Meta = Meta$1;
const _Card = Card;
var root$9 = _root;
var now$2 = function() {
return root$9.Date.now();
};
var now_1 = now$2;
var isObject$9 = isObject_1, now$1 = now_1, toNumber = toNumber_1;
var FUNC_ERROR_TEXT$2 = "Expected a function";
var nativeMax = Math.max, nativeMin = Math.min;
function debounce(func, wait, options) {
var lastArgs, lastThis, maxWait, result, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true;
if (typeof func != "function") {
throw new TypeError(FUNC_ERROR_TEXT$2);
}
wait = toNumber(wait) || 0;
if (isObject$9(options)) {
leading = !!options.leading;
maxing = "maxWait" in options;
maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
trailing = "trailing" in options ? !!options.trailing : trailing;
}
function invokeFunc(time) {
var args = lastArgs, thisArg = lastThis;
lastArgs = lastThis = void 0;
lastInvokeTime = time;
result = func.apply(thisArg, args);
return result;
}
function leadingEdge(time) {
lastInvokeTime = time;
timerId = setTimeout(timerExpired, wait);
return leading ? invokeFunc(time) : result;
}
function remainingWait(time) {
var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall;
return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
}
function shouldInvoke(time) {
var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime;
return lastCallTime === void 0 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
}
function timerExpired() {
var time = now$1();
if (shouldInvoke(time)) {
return trailingEdge(time);
}
timerId = setTimeout(timerExpired, remainingWait(time));
}
function trailingEdge(time) {
timerId = void 0;
if (trailing && lastArgs) {
return invokeFunc(time);
}
lastArgs = lastThis = void 0;
return result;
}
function cancel() {
if (timerId !== void 0) {
clearTimeout(timerId);
}
lastInvokeTime = 0;
lastArgs = lastCallTime = lastThis = timerId = void 0;
}
function flush() {
return timerId === void 0 ? result : trailingEdge(now$1());
}
function debounced() {
var time = now$1(), isInvoking = shouldInvoke(time);
lastArgs = arguments;
lastThis = this;
lastCallTime = time;
if (isInvoking) {
if (timerId === void 0) {
return leadingEdge(lastCallTime);
}
if (maxing) {
clearTimeout(timerId);
timerId = setTimeout(timerExpired, wait);
return invokeFunc(lastCallTime);
}
}
if (timerId === void 0) {
timerId = setTimeout(timerExpired, wait);
}
return result;
}
debounced.cancel = cancel;
debounced.flush = flush;
return debounced;
}
var debounce_1 = debounce;
function removeFromCheckedKeys(halfCheckedKeys, checkedKeys) {
var filteredKeys = /* @__PURE__ */ new Set();
halfCheckedKeys.forEach(function(key2) {
if (!checkedKeys.has(key2)) {
filteredKeys.add(key2);
}
});
return filteredKeys;
}
function isCheckDisabled$1(node) {
var _ref = node || {}, disabled = _ref.disabled, disableCheckbox = _ref.disableCheckbox, checkable = _ref.checkable;
return !!(disabled || disableCheckbox) || checkable === false;
}
function fillConductCheck(keys2, levelEntities, maxLevel, syntheticGetCheckDisabled) {
var checkedKeys = new Set(keys2);
var halfCheckedKeys = /* @__PURE__ */ new Set();
for (var level = 0; level <= maxLevel; level += 1) {
var entities = levelEntities.get(level) || /* @__PURE__ */ new Set();
entities.forEach(function(entity) {
var key2 = entity.key, node = entity.node, _entity$children = entity.children, children = _entity$children === void 0 ? [] : _entity$children;
if (checkedKeys.has(key2) && !syntheticGetCheckDisabled(node)) {
children.filter(function(childEntity) {
return !syntheticGetCheckDisabled(childEntity.node);
}).forEach(function(childEntity) {
checkedKeys.add(childEntity.key);
});
}
});
}
var visitedKeys = /* @__PURE__ */ new Set();
for (var _level = maxLevel; _level >= 0; _level -= 1) {
var _entities = levelEntities.get(_level) || /* @__PURE__ */ new Set();
_entities.forEach(function(entity) {
var parent2 = entity.parent, node = entity.node;
if (syntheticGetCheckDisabled(node) || !entity.parent || visitedKeys.has(entity.parent.key)) {
return;
}
if (syntheticGetCheckDisabled(entity.parent.node)) {
visitedKeys.add(parent2.key);
return;
}
var allChecked = true;
var partialChecked = false;
(parent2.children || []).filter(function(childEntity) {
return !syntheticGetCheckDisabled(childEntity.node);
}).forEach(function(_ref2) {
var key2 = _ref2.key;
var checked = checkedKeys.has(key2);
if (allChecked && !checked) {
allChecked = false;
}
if (!partialChecked && (checked || halfCheckedKeys.has(key2))) {
partialChecked = true;
}
});
if (allChecked) {
checkedKeys.add(parent2.key);
}
if (partialChecked) {
halfCheckedKeys.add(parent2.key);
}
visitedKeys.add(parent2.key);
});
}
return {
checkedKeys: Array.from(checkedKeys),
halfCheckedKeys: Array.from(removeFromCheckedKeys(halfCheckedKeys, checkedKeys))
};
}
function cleanConductCheck(keys2, halfKeys, levelEntities, maxLevel, syntheticGetCheckDisabled) {
var checkedKeys = new Set(keys2);
var halfCheckedKeys = new Set(halfKeys);
for (var level = 0; level <= maxLevel; level += 1) {
var entities = levelEntities.get(level) || /* @__PURE__ */ new Set();
entities.forEach(function(entity) {
var key2 = entity.key, node = entity.node, _entity$children2 = entity.children, children = _entity$children2 === void 0 ? [] : _entity$children2;
if (!checkedKeys.has(key2) && !halfCheckedKeys.has(key2) && !syntheticGetCheckDisabled(node)) {
children.filter(function(childEntity) {
return !syntheticGetCheckDisabled(childEntity.node);
}).forEach(function(childEntity) {
checkedKeys.delete(childEntity.key);
});
}
});
}
halfCheckedKeys = /* @__PURE__ */ new Set();
var visitedKeys = /* @__PURE__ */ new Set();
for (var _level2 = maxLevel; _level2 >= 0; _level2 -= 1) {
var _entities2 = levelEntities.get(_level2) || /* @__PURE__ */ new Set();
_entities2.forEach(function(entity) {
var parent2 = entity.parent, node = entity.node;
if (syntheticGetCheckDisabled(node) || !entity.parent || visitedKeys.has(entity.parent.key)) {
return;
}
if (syntheticGetCheckDisabled(entity.parent.node)) {
visitedKeys.add(parent2.key);
return;
}
var allChecked = true;
var partialChecked = false;
(parent2.children || []).filter(function(childEntity) {
return !syntheticGetCheckDisabled(childEntity.node);
}).forEach(function(_ref3) {
var key2 = _ref3.key;
var checked = checkedKeys.has(key2);
if (allChecked && !checked) {
allChecked = false;
}
if (!partialChecked && (checked || halfCheckedKeys.has(key2))) {
partialChecked = true;
}
});
if (!allChecked) {
checkedKeys.delete(parent2.key);
}
if (partialChecked) {
halfCheckedKeys.add(parent2.key);
}
visitedKeys.add(parent2.key);
});
}
return {
checkedKeys: Array.from(checkedKeys),
halfCheckedKeys: Array.from(removeFromCheckedKeys(halfCheckedKeys, checkedKeys))
};
}
function conductCheck(keyList, checked, keyEntities, getCheckDisabled) {
var warningMissKeys = [];
var syntheticGetCheckDisabled;
if (getCheckDisabled) {
syntheticGetCheckDisabled = getCheckDisabled;
} else {
syntheticGetCheckDisabled = isCheckDisabled$1;
}
var keys2 = new Set(keyList.filter(function(key2) {
var hasEntity = !!keyEntities[key2];
if (!hasEntity) {
warningMissKeys.push(key2);
}
return hasEntity;
}));
var levelEntities = /* @__PURE__ */ new Map();
var maxLevel = 0;
Object.keys(keyEntities).forEach(function(key2) {
var entity = keyEntities[key2];
var level = entity.level;
var levelSet = levelEntities.get(level);
if (!levelSet) {
levelSet = /* @__PURE__ */ new Set();
levelEntities.set(level, levelSet);
}
levelSet.add(entity);
maxLevel = Math.max(maxLevel, level);
});
warningOnce(!warningMissKeys.length, "Tree missing follow keys: ".concat(warningMissKeys.slice(0, 100).map(function(key2) {
return "'".concat(key2, "'");
}).join(", ")));
var result;
if (checked === true) {
result = fillConductCheck(keys2, levelEntities, maxLevel, syntheticGetCheckDisabled);
} else {
result = cleanConductCheck(keys2, checked.halfCheckedKeys, levelEntities, maxLevel, syntheticGetCheckDisabled);
}
return result;
}
var _excluded$n = ["children"];
function getPosition$1(level, index2) {
return "".concat(level, "-").concat(index2);
}
function isTreeNode(node) {
return node && node.type && node.type.isTreeNode;
}
function getKey(key2, pos) {
if (key2 !== null && key2 !== void 0) {
return key2;
}
return pos;
}
function fillFieldNames$1(fieldNames) {
var _ref = fieldNames || {}, title = _ref.title, _title = _ref._title, key2 = _ref.key, children = _ref.children;
var mergedTitle = title || "title";
return {
title: mergedTitle,
_title: _title || [mergedTitle],
key: key2 || "key",
children: children || "children"
};
}
function convertTreeToData(rootNodes) {
function dig(node) {
var treeNodes = toArray$9(node);
return treeNodes.map(function(treeNode) {
if (!isTreeNode(treeNode)) {
warningOnce(!treeNode, "Tree/TreeNode can only accept TreeNode as children.");
return null;
}
var key2 = treeNode.key;
var _treeNode$props = treeNode.props, children = _treeNode$props.children, rest = _objectWithoutProperties$1(_treeNode$props, _excluded$n);
var dataNode = _objectSpread2$a({
key: key2
}, rest);
var parsedChildren = dig(children);
if (parsedChildren.length) {
dataNode.children = parsedChildren;
}
return dataNode;
}).filter(function(dataNode) {
return dataNode;
});
}
return dig(rootNodes);
}
function flattenTreeData(treeNodeList, expandedKeys, fieldNames) {
var _fillFieldNames = fillFieldNames$1(fieldNames), fieldTitles = _fillFieldNames._title, fieldKey = _fillFieldNames.key, fieldChildren = _fillFieldNames.children;
var expandedKeySet = new Set(expandedKeys === true ? [] : expandedKeys);
var flattenList = [];
function dig(list) {
var parent2 = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null;
return list.map(function(treeNode, index2) {
var pos = getPosition$1(parent2 ? parent2.pos : "0", index2);
var mergedKey = getKey(treeNode[fieldKey], pos);
var mergedTitle;
for (var i2 = 0; i2 < fieldTitles.length; i2 += 1) {
var fieldTitle = fieldTitles[i2];
if (treeNode[fieldTitle] !== void 0) {
mergedTitle = treeNode[fieldTitle];
break;
}
}
var flattenNode = _objectSpread2$a(_objectSpread2$a({}, omit(treeNode, [].concat(_toConsumableArray$c(fieldTitles), [fieldKey, fieldChildren]))), {}, {
title: mergedTitle,
key: mergedKey,
parent: parent2,
pos,
children: null,
data: treeNode,
isStart: [].concat(_toConsumableArray$c(parent2 ? parent2.isStart : []), [index2 === 0]),
isEnd: [].concat(_toConsumableArray$c(parent2 ? parent2.isEnd : []), [index2 === list.length - 1])
});
flattenList.push(flattenNode);
if (expandedKeys === true || expandedKeySet.has(mergedKey)) {
flattenNode.children = dig(treeNode[fieldChildren] || [], flattenNode);
} else {
flattenNode.children = [];
}
return flattenNode;
});
}
dig(treeNodeList);
return flattenList;
}
function traverseDataNodes(dataNodes, callback, config) {
var mergedConfig = {};
if (_typeof$q(config) === "object") {
mergedConfig = config;
} else {
mergedConfig = {
externalGetKey: config
};
}
mergedConfig = mergedConfig || {};
var _mergedConfig = mergedConfig, childrenPropName = _mergedConfig.childrenPropName, externalGetKey = _mergedConfig.externalGetKey, fieldNames = _mergedConfig.fieldNames;
var _fillFieldNames2 = fillFieldNames$1(fieldNames), fieldKey = _fillFieldNames2.key, fieldChildren = _fillFieldNames2.children;
var mergeChildrenPropName = childrenPropName || fieldChildren;
var syntheticGetKey;
if (externalGetKey) {
if (typeof externalGetKey === "string") {
syntheticGetKey = function syntheticGetKey2(node) {
return node[externalGetKey];
};
} else if (typeof externalGetKey === "function") {
syntheticGetKey = function syntheticGetKey2(node) {
return externalGetKey(node);
};
}
} else {
syntheticGetKey = function syntheticGetKey2(node, pos) {
return getKey(node[fieldKey], pos);
};
}
function processNode(node, index2, parent2, pathNodes) {
var children = node ? node[mergeChildrenPropName] : dataNodes;
var pos = node ? getPosition$1(parent2.pos, index2) : "0";
var connectNodes = node ? [].concat(_toConsumableArray$c(pathNodes), [node]) : [];
if (node) {
var key2 = syntheticGetKey(node, pos);
var data = {
node,
index: index2,
pos,
key: key2,
parentPos: parent2.node ? parent2.pos : null,
level: parent2.level + 1,
nodes: connectNodes
};
callback(data);
}
if (children) {
children.forEach(function(subNode, subIndex) {
processNode(subNode, subIndex, {
node,
pos,
level: parent2 ? parent2.level + 1 : -1
}, connectNodes);
});
}
}
processNode(null);
}
function convertDataToEntities(dataNodes) {
var _ref2 = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, initWrapper = _ref2.initWrapper, processEntity = _ref2.processEntity, onProcessFinished = _ref2.onProcessFinished, externalGetKey = _ref2.externalGetKey, childrenPropName = _ref2.childrenPropName, fieldNames = _ref2.fieldNames;
var legacyExternalGetKey = arguments.length > 2 ? arguments[2] : void 0;
var mergedExternalGetKey = externalGetKey || legacyExternalGetKey;
var posEntities = {};
var keyEntities = {};
var wrapper = {
posEntities,
keyEntities
};
if (initWrapper) {
wrapper = initWrapper(wrapper) || wrapper;
}
traverseDataNodes(dataNodes, function(item) {
var node = item.node, index2 = item.index, pos = item.pos, key2 = item.key, parentPos = item.parentPos, level = item.level, nodes = item.nodes;
var entity = {
node,
nodes,
index: index2,
key: key2,
pos,
level
};
var mergedKey = getKey(key2, pos);
posEntities[pos] = entity;
keyEntities[mergedKey] = entity;
entity.parent = posEntities[parentPos];
if (entity.parent) {
entity.parent.children = entity.parent.children || [];
entity.parent.children.push(entity);
}
if (processEntity) {
processEntity(entity, wrapper);
}
}, {
externalGetKey: mergedExternalGetKey,
childrenPropName,
fieldNames
});
if (onProcessFinished) {
onProcessFinished(wrapper);
}
return wrapper;
}
function getTreeNodeProps(key2, _ref3) {
var expandedKeys = _ref3.expandedKeys, selectedKeys = _ref3.selectedKeys, loadedKeys = _ref3.loadedKeys, loadingKeys = _ref3.loadingKeys, checkedKeys = _ref3.checkedKeys, halfCheckedKeys = _ref3.halfCheckedKeys, dragOverNodeKey = _ref3.dragOverNodeKey, dropPosition = _ref3.dropPosition, keyEntities = _ref3.keyEntities;
var entity = keyEntities[key2];
var treeNodeProps = {
eventKey: key2,
expanded: expandedKeys.indexOf(key2) !== -1,
selected: selectedKeys.indexOf(key2) !== -1,
loaded: loadedKeys.indexOf(key2) !== -1,
loading: loadingKeys.indexOf(key2) !== -1,
checked: checkedKeys.indexOf(key2) !== -1,
halfChecked: halfCheckedKeys.indexOf(key2) !== -1,
pos: String(entity ? entity.pos : ""),
dragOver: dragOverNodeKey === key2 && dropPosition === 0,
dragOverGapTop: dragOverNodeKey === key2 && dropPosition === -1,
dragOverGapBottom: dragOverNodeKey === key2 && dropPosition === 1
};
return treeNodeProps;
}
function convertNodePropsToEventData(props) {
var data = props.data, expanded = props.expanded, selected = props.selected, checked = props.checked, loaded = props.loaded, loading = props.loading, halfChecked = props.halfChecked, dragOver = props.dragOver, dragOverGapTop = props.dragOverGapTop, dragOverGapBottom = props.dragOverGapBottom, pos = props.pos, active = props.active, eventKey = props.eventKey;
var eventData = _objectSpread2$a(_objectSpread2$a({}, data), {}, {
expanded,
selected,
checked,
loaded,
loading,
halfChecked,
dragOver,
dragOverGapTop,
dragOverGapBottom,
pos,
active,
key: eventKey
});
if (!("props" in eventData)) {
Object.defineProperty(eventData, "props", {
get: function get2() {
warningOnce(false, "Second param return from event is node data instead of TreeNode instance. Please read value directly instead of reading from `props`.");
return props;
}
});
}
return eventData;
}
var __rest$x = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var GroupContext = /* @__PURE__ */ React__namespace.createContext(null);
var InternalCheckboxGroup = function InternalCheckboxGroup2(_a, ref) {
var defaultValue = _a.defaultValue, children = _a.children, _a$options = _a.options, options = _a$options === void 0 ? [] : _a$options, customizePrefixCls = _a.prefixCls, className = _a.className, style2 = _a.style, onChange = _a.onChange, restProps = __rest$x(_a, ["defaultValue", "children", "options", "prefixCls", "className", "style", "onChange"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var _React$useState = React__namespace.useState(restProps.value || defaultValue || []), _React$useState2 = _slicedToArray$e(_React$useState, 2), value = _React$useState2[0], setValue2 = _React$useState2[1];
var _React$useState3 = React__namespace.useState([]), _React$useState4 = _slicedToArray$e(_React$useState3, 2), registeredValues = _React$useState4[0], setRegisteredValues = _React$useState4[1];
React__namespace.useEffect(function() {
if ("value" in restProps) {
setValue2(restProps.value || []);
}
}, [restProps.value]);
var getOptions2 = function getOptions3() {
return options.map(function(option) {
if (typeof option === "string" || typeof option === "number") {
return {
label: option,
value: option
};
}
return option;
});
};
var cancelValue = function cancelValue2(val) {
setRegisteredValues(function(prevValues) {
return prevValues.filter(function(v2) {
return v2 !== val;
});
});
};
var registerValue = function registerValue2(val) {
setRegisteredValues(function(prevValues) {
return [].concat(_toConsumableArray$c(prevValues), [val]);
});
};
var toggleOption = function toggleOption2(option) {
var optionIndex = value.indexOf(option.value);
var newValue = _toConsumableArray$c(value);
if (optionIndex === -1) {
newValue.push(option.value);
} else {
newValue.splice(optionIndex, 1);
}
if (!("value" in restProps)) {
setValue2(newValue);
}
var opts = getOptions2();
onChange === null || onChange === void 0 ? void 0 : onChange(newValue.filter(function(val) {
return registeredValues.includes(val);
}).sort(function(a, b2) {
var indexA = opts.findIndex(function(opt) {
return opt.value === a;
});
var indexB = opts.findIndex(function(opt) {
return opt.value === b2;
});
return indexA - indexB;
}));
};
var prefixCls = getPrefixCls("checkbox", customizePrefixCls);
var groupPrefixCls = "".concat(prefixCls, "-group");
var domProps = omit(restProps, ["value", "disabled"]);
if (options && options.length > 0) {
children = getOptions2().map(function(option) {
return /* @__PURE__ */ jsx(InternalCheckbox$1, {
prefixCls,
disabled: "disabled" in option ? option.disabled : restProps.disabled,
value: option.value,
checked: value.includes(option.value),
onChange: option.onChange,
className: "".concat(groupPrefixCls, "-item"),
style: option.style,
children: option.label
}, option.value.toString());
});
}
var context2 = {
toggleOption,
value,
disabled: restProps.disabled,
name: restProps.name,
registerValue,
cancelValue
};
var classString = classnames(groupPrefixCls, _defineProperty$b({}, "".concat(groupPrefixCls, "-rtl"), direction === "rtl"), className);
return /* @__PURE__ */ jsx("div", {
className: classString,
style: style2,
...domProps,
ref,
children: /* @__PURE__ */ jsx(GroupContext.Provider, {
value: context2,
children
})
});
};
var CheckboxGroup = /* @__PURE__ */ React__namespace.forwardRef(InternalCheckboxGroup);
const Group$3 = /* @__PURE__ */ React__namespace.memo(CheckboxGroup);
var __rest$w = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var InternalCheckbox = function InternalCheckbox2(_a, ref) {
var _classNames;
var _b;
var customizePrefixCls = _a.prefixCls, className = _a.className, children = _a.children, _a$indeterminate = _a.indeterminate, indeterminate = _a$indeterminate === void 0 ? false : _a$indeterminate, style2 = _a.style, onMouseEnter = _a.onMouseEnter, onMouseLeave = _a.onMouseLeave, _a$skipGroup = _a.skipGroup, skipGroup = _a$skipGroup === void 0 ? false : _a$skipGroup, disabled = _a.disabled, restProps = __rest$w(_a, ["prefixCls", "className", "children", "indeterminate", "style", "onMouseEnter", "onMouseLeave", "skipGroup", "disabled"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var checkboxGroup = React__namespace.useContext(GroupContext);
var _useContext = React$a.useContext(FormItemInputContext), isFormItemInput = _useContext.isFormItemInput;
var contextDisabled = React$a.useContext(DisabledContext$1);
var mergedDisabled = (_b = (checkboxGroup === null || checkboxGroup === void 0 ? void 0 : checkboxGroup.disabled) || disabled) !== null && _b !== void 0 ? _b : contextDisabled;
var prevValue = React__namespace.useRef(restProps.value);
React__namespace.useEffect(function() {
checkboxGroup === null || checkboxGroup === void 0 ? void 0 : checkboxGroup.registerValue(restProps.value);
}, []);
React__namespace.useEffect(function() {
if (skipGroup) {
return;
}
if (restProps.value !== prevValue.current) {
checkboxGroup === null || checkboxGroup === void 0 ? void 0 : checkboxGroup.cancelValue(prevValue.current);
checkboxGroup === null || checkboxGroup === void 0 ? void 0 : checkboxGroup.registerValue(restProps.value);
prevValue.current = restProps.value;
}
return function() {
return checkboxGroup === null || checkboxGroup === void 0 ? void 0 : checkboxGroup.cancelValue(restProps.value);
};
}, [restProps.value]);
var prefixCls = getPrefixCls("checkbox", customizePrefixCls);
var checkboxProps = _extends$3({}, restProps);
if (checkboxGroup && !skipGroup) {
checkboxProps.onChange = function() {
if (restProps.onChange) {
restProps.onChange.apply(restProps, arguments);
}
if (checkboxGroup.toggleOption) {
checkboxGroup.toggleOption({
label: children,
value: restProps.value
});
}
};
checkboxProps.name = checkboxGroup.name;
checkboxProps.checked = checkboxGroup.value.includes(restProps.value);
}
var classString = classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-wrapper"), true), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-wrapper-checked"), checkboxProps.checked), _defineProperty$b(_classNames, "".concat(prefixCls, "-wrapper-disabled"), mergedDisabled), _defineProperty$b(_classNames, "".concat(prefixCls, "-wrapper-in-form-item"), isFormItemInput), _classNames), className);
var checkboxClass = classnames(_defineProperty$b({}, "".concat(prefixCls, "-indeterminate"), indeterminate));
var ariaChecked = indeterminate ? "mixed" : void 0;
return /* @__PURE__ */ jsxs("label", {
className: classString,
style: style2,
onMouseEnter,
onMouseLeave,
children: [/* @__PURE__ */ jsx(Checkbox$3, {
"aria-checked": ariaChecked,
...checkboxProps,
prefixCls,
className: checkboxClass,
disabled: mergedDisabled,
ref
}), children !== void 0 && /* @__PURE__ */ jsx("span", {
children
})]
});
};
var Checkbox$2 = /* @__PURE__ */ React__namespace.forwardRef(InternalCheckbox);
const InternalCheckbox$1 = Checkbox$2;
var Checkbox$1 = InternalCheckbox$1;
Checkbox$1.Group = Group$3;
Checkbox$1.__ANT_CHECKBOX = true;
const _Checkbox = Checkbox$1;
var RowContext = /* @__PURE__ */ React$a.createContext({});
const RowContext$1 = RowContext;
var __rest$v = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
function parseFlex(flex) {
if (typeof flex === "number") {
return "".concat(flex, " ").concat(flex, " auto");
}
if (/^\d+(\.\d+)?(px|em|rem|%)$/.test(flex)) {
return "0 0 ".concat(flex);
}
return flex;
}
var sizes = ["xs", "sm", "md", "lg", "xl", "xxl"];
var Col = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var _React$useContext2 = React__namespace.useContext(RowContext$1), gutter = _React$useContext2.gutter, wrap2 = _React$useContext2.wrap, supportFlexGap = _React$useContext2.supportFlexGap;
var customizePrefixCls = props.prefixCls, span = props.span, order = props.order, offset2 = props.offset, push = props.push, pull = props.pull, className = props.className, children = props.children, flex = props.flex, style2 = props.style, others = __rest$v(props, ["prefixCls", "span", "order", "offset", "push", "pull", "className", "children", "flex", "style"]);
var prefixCls = getPrefixCls("col", customizePrefixCls);
var sizeClassObj = {};
sizes.forEach(function(size) {
var _extends2;
var sizeProps = {};
var propSize = props[size];
if (typeof propSize === "number") {
sizeProps.span = propSize;
} else if (_typeof$q(propSize) === "object") {
sizeProps = propSize || {};
}
delete others[size];
sizeClassObj = _extends$3(_extends$3({}, sizeClassObj), (_extends2 = {}, _defineProperty$b(_extends2, "".concat(prefixCls, "-").concat(size, "-").concat(sizeProps.span), sizeProps.span !== void 0), _defineProperty$b(_extends2, "".concat(prefixCls, "-").concat(size, "-order-").concat(sizeProps.order), sizeProps.order || sizeProps.order === 0), _defineProperty$b(_extends2, "".concat(prefixCls, "-").concat(size, "-offset-").concat(sizeProps.offset), sizeProps.offset || sizeProps.offset === 0), _defineProperty$b(_extends2, "".concat(prefixCls, "-").concat(size, "-push-").concat(sizeProps.push), sizeProps.push || sizeProps.push === 0), _defineProperty$b(_extends2, "".concat(prefixCls, "-").concat(size, "-pull-").concat(sizeProps.pull), sizeProps.pull || sizeProps.pull === 0), _defineProperty$b(_extends2, "".concat(prefixCls, "-rtl"), direction === "rtl"), _extends2));
});
var classes = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(span), span !== void 0), _defineProperty$b(_classNames, "".concat(prefixCls, "-order-").concat(order), order), _defineProperty$b(_classNames, "".concat(prefixCls, "-offset-").concat(offset2), offset2), _defineProperty$b(_classNames, "".concat(prefixCls, "-push-").concat(push), push), _defineProperty$b(_classNames, "".concat(prefixCls, "-pull-").concat(pull), pull), _classNames), className, sizeClassObj);
var mergedStyle = {};
if (gutter && gutter[0] > 0) {
var horizontalGutter = gutter[0] / 2;
mergedStyle.paddingLeft = horizontalGutter;
mergedStyle.paddingRight = horizontalGutter;
}
if (gutter && gutter[1] > 0 && !supportFlexGap) {
var verticalGutter = gutter[1] / 2;
mergedStyle.paddingTop = verticalGutter;
mergedStyle.paddingBottom = verticalGutter;
}
if (flex) {
mergedStyle.flex = parseFlex(flex);
if (wrap2 === false && !mergedStyle.minWidth) {
mergedStyle.minWidth = 0;
}
}
return /* @__PURE__ */ jsx("div", {
...others,
style: _extends$3(_extends$3({}, mergedStyle), style2),
className: classes,
ref,
children
});
});
const Col$1 = Col;
var __rest$u = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
tuple$1("top", "middle", "bottom", "stretch");
tuple$1("start", "end", "center", "space-around", "space-between", "space-evenly");
function useMergePropByScreen(oriProp, screen) {
var _React$useState = React__namespace.useState(typeof oriProp === "string" ? oriProp : ""), _React$useState2 = _slicedToArray$e(_React$useState, 2), prop = _React$useState2[0], setProp = _React$useState2[1];
var clacMergeAlignOrJustify = function clacMergeAlignOrJustify2() {
if (typeof oriProp === "string") {
setProp(oriProp);
}
if (_typeof$q(oriProp) !== "object") {
return;
}
for (var i2 = 0; i2 < responsiveArray.length; i2++) {
var breakpoint = responsiveArray[i2];
if (!screen[breakpoint])
continue;
var curVal = oriProp[breakpoint];
if (curVal !== void 0) {
setProp(curVal);
return;
}
}
};
React__namespace.useEffect(function() {
clacMergeAlignOrJustify();
}, [JSON.stringify(oriProp), screen]);
return prop;
}
var Row = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames;
var customizePrefixCls = props.prefixCls, justify = props.justify, align = props.align, className = props.className, style2 = props.style, children = props.children, _props$gutter = props.gutter, gutter = _props$gutter === void 0 ? 0 : _props$gutter, wrap2 = props.wrap, others = __rest$u(props, ["prefixCls", "justify", "align", "className", "style", "children", "gutter", "wrap"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var _React$useState3 = React__namespace.useState({
xs: true,
sm: true,
md: true,
lg: true,
xl: true,
xxl: true
}), _React$useState4 = _slicedToArray$e(_React$useState3, 2), screens2 = _React$useState4[0], setScreens = _React$useState4[1];
var _React$useState5 = React__namespace.useState({
xs: false,
sm: false,
md: false,
lg: false,
xl: false,
xxl: false
}), _React$useState6 = _slicedToArray$e(_React$useState5, 2), curScreens = _React$useState6[0], setCurScreens = _React$useState6[1];
var mergeAlign = useMergePropByScreen(align, curScreens);
var mergeJustify = useMergePropByScreen(justify, curScreens);
var supportFlexGap = useFlexGapSupport();
var gutterRef = React__namespace.useRef(gutter);
React__namespace.useEffect(function() {
var token = ResponsiveObserve.subscribe(function(screen) {
setCurScreens(screen);
var currentGutter = gutterRef.current || 0;
if (!Array.isArray(currentGutter) && _typeof$q(currentGutter) === "object" || Array.isArray(currentGutter) && (_typeof$q(currentGutter[0]) === "object" || _typeof$q(currentGutter[1]) === "object")) {
setScreens(screen);
}
});
return function() {
return ResponsiveObserve.unsubscribe(token);
};
}, []);
var getGutter = function getGutter2() {
var results = [void 0, void 0];
var normalizedGutter = Array.isArray(gutter) ? gutter : [gutter, void 0];
normalizedGutter.forEach(function(g2, index2) {
if (_typeof$q(g2) === "object") {
for (var i2 = 0; i2 < responsiveArray.length; i2++) {
var breakpoint = responsiveArray[i2];
if (screens2[breakpoint] && g2[breakpoint] !== void 0) {
results[index2] = g2[breakpoint];
break;
}
}
} else {
results[index2] = g2;
}
});
return results;
};
var prefixCls = getPrefixCls("row", customizePrefixCls);
var gutters = getGutter();
var classes = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-no-wrap"), wrap2 === false), _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(mergeJustify), mergeJustify), _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(mergeAlign), mergeAlign), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className);
var rowStyle = {};
var horizontalGutter = gutters[0] != null && gutters[0] > 0 ? gutters[0] / -2 : void 0;
var verticalGutter = gutters[1] != null && gutters[1] > 0 ? gutters[1] / -2 : void 0;
if (horizontalGutter) {
rowStyle.marginLeft = horizontalGutter;
rowStyle.marginRight = horizontalGutter;
}
if (supportFlexGap) {
var _gutters = _slicedToArray$e(gutters, 2);
rowStyle.rowGap = _gutters[1];
} else if (verticalGutter) {
rowStyle.marginTop = verticalGutter;
rowStyle.marginBottom = verticalGutter;
}
var _gutters2 = _slicedToArray$e(gutters, 2), gutterH = _gutters2[0], gutterV = _gutters2[1];
var rowContext = React__namespace.useMemo(function() {
return {
gutter: [gutterH, gutterV],
wrap: wrap2,
supportFlexGap
};
}, [gutterH, gutterV, wrap2, supportFlexGap]);
return /* @__PURE__ */ jsx(RowContext$1.Provider, {
value: rowContext,
children: /* @__PURE__ */ jsx("div", {
...others,
className: classes,
style: _extends$3(_extends$3({}, rowStyle), style2),
ref,
children
})
});
});
const Row$1 = Row;
var PanelContent = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classnames;
var prefixCls = props.prefixCls, forceRender = props.forceRender, className = props.className, style2 = props.style, children = props.children, isActive2 = props.isActive, role = props.role;
var _React$useState = React__namespace.useState(isActive2 || forceRender), _React$useState2 = _slicedToArray$e(_React$useState, 2), rendered = _React$useState2[0], setRendered = _React$useState2[1];
React__namespace.useEffect(function() {
if (forceRender || isActive2) {
setRendered(true);
}
}, [forceRender, isActive2]);
if (!rendered) {
return null;
}
return /* @__PURE__ */ jsx("div", {
ref,
className: classnames("".concat(prefixCls, "-content"), (_classnames = {}, _defineProperty$b(_classnames, "".concat(prefixCls, "-content-active"), isActive2), _defineProperty$b(_classnames, "".concat(prefixCls, "-content-inactive"), !isActive2), _classnames), className),
style: style2,
role,
children: /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-content-box"),
children
})
});
});
PanelContent.displayName = "PanelContent";
var _excluded$m = ["className", "id", "style", "prefixCls", "headerClass", "children", "isActive", "destroyInactivePanel", "accordion", "forceRender", "openMotion", "extra", "collapsible"];
var CollapsePanel$2 = /* @__PURE__ */ function(_React$Component) {
_inherits(CollapsePanel2, _React$Component);
var _super = _createSuper(CollapsePanel2);
function CollapsePanel2() {
var _this2;
_classCallCheck(this, CollapsePanel2);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_this2.onItemClick = function() {
var _this$props = _this2.props, onItemClick = _this$props.onItemClick, panelKey = _this$props.panelKey;
if (typeof onItemClick === "function") {
onItemClick(panelKey);
}
};
_this2.handleKeyPress = function(e2) {
if (e2.key === "Enter" || e2.keyCode === 13 || e2.which === 13) {
_this2.onItemClick();
}
};
_this2.renderIcon = function() {
var _this$props2 = _this2.props, showArrow = _this$props2.showArrow, expandIcon = _this$props2.expandIcon, prefixCls = _this$props2.prefixCls, collapsible = _this$props2.collapsible;
if (!showArrow) {
return null;
}
var iconNode = typeof expandIcon === "function" ? expandIcon(_this2.props) : /* @__PURE__ */ jsx("i", {
className: "arrow"
});
return iconNode && /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-expand-icon"),
onClick: collapsible === "header" || collapsible === "icon" ? _this2.onItemClick : null,
children: iconNode
});
};
_this2.renderTitle = function() {
var _this$props3 = _this2.props, header = _this$props3.header, prefixCls = _this$props3.prefixCls, collapsible = _this$props3.collapsible;
return /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-header-text"),
onClick: collapsible === "header" ? _this2.onItemClick : null,
children: header
});
};
return _this2;
}
_createClass(CollapsePanel2, [{
key: "shouldComponentUpdate",
value: function shouldComponentUpdate(nextProps) {
return !shallowequal(this.props, nextProps);
}
}, {
key: "render",
value: function render2() {
var _classNames, _classNames2;
var _this$props4 = this.props, className = _this$props4.className, id2 = _this$props4.id, style2 = _this$props4.style, prefixCls = _this$props4.prefixCls, headerClass = _this$props4.headerClass, children = _this$props4.children, isActive2 = _this$props4.isActive, destroyInactivePanel = _this$props4.destroyInactivePanel, accordion = _this$props4.accordion, forceRender = _this$props4.forceRender, openMotion = _this$props4.openMotion, extra = _this$props4.extra, collapsible = _this$props4.collapsible, rest = _objectWithoutProperties$1(_this$props4, _excluded$m);
var disabled = collapsible === "disabled";
var collapsibleHeader = collapsible === "header";
var collapsibleIcon = collapsible === "icon";
var itemCls = classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-item"), true), _defineProperty$b(_classNames, "".concat(prefixCls, "-item-active"), isActive2), _defineProperty$b(_classNames, "".concat(prefixCls, "-item-disabled"), disabled), _classNames), className);
var headerCls = classnames("".concat(prefixCls, "-header"), (_classNames2 = {}, _defineProperty$b(_classNames2, headerClass, headerClass), _defineProperty$b(_classNames2, "".concat(prefixCls, "-header-collapsible-only"), collapsibleHeader), _defineProperty$b(_classNames2, "".concat(prefixCls, "-icon-collapsible-only"), collapsibleIcon), _classNames2));
var headerProps = {
className: headerCls,
"aria-expanded": isActive2,
"aria-disabled": disabled,
onKeyPress: this.handleKeyPress
};
if (!collapsibleHeader && !collapsibleIcon) {
headerProps.onClick = this.onItemClick;
headerProps.role = accordion ? "tab" : "button";
headerProps.tabIndex = disabled ? -1 : 0;
}
var ifExtraExist = extra !== null && extra !== void 0 && typeof extra !== "boolean";
delete rest.header;
delete rest.panelKey;
delete rest.onItemClick;
delete rest.showArrow;
delete rest.expandIcon;
return /* @__PURE__ */ jsxs("div", {
...rest,
className: itemCls,
style: style2,
id: id2,
children: [/* @__PURE__ */ jsxs("div", {
...headerProps,
children: [this.renderIcon(), this.renderTitle(), ifExtraExist && /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-extra"),
children: extra
})]
}), /* @__PURE__ */ jsx(CSSMotion, {
visible: isActive2,
leavedClassName: "".concat(prefixCls, "-content-hidden"),
...openMotion,
forceRender,
removeOnLeave: destroyInactivePanel,
children: function(_ref, ref) {
var motionClassName = _ref.className, motionStyle = _ref.style;
return /* @__PURE__ */ jsx(PanelContent, {
ref,
prefixCls,
className: motionClassName,
style: motionStyle,
isActive: isActive2,
forceRender,
role: accordion ? "tabpanel" : null,
children
});
}
})]
});
}
}]);
return CollapsePanel2;
}(React__namespace.Component);
CollapsePanel$2.defaultProps = {
showArrow: true,
isActive: false,
onItemClick: function onItemClick() {
},
headerClass: "",
forceRender: false
};
function getActiveKeysArray(activeKey) {
var currentActiveKey = activeKey;
if (!Array.isArray(currentActiveKey)) {
var activeKeyType = _typeof$q(currentActiveKey);
currentActiveKey = activeKeyType === "number" || activeKeyType === "string" ? [currentActiveKey] : [];
}
return currentActiveKey.map(function(key2) {
return String(key2);
});
}
var Collapse$2 = /* @__PURE__ */ function(_React$Component) {
_inherits(Collapse2, _React$Component);
var _super = _createSuper(Collapse2);
function Collapse2(_props) {
var _this2;
_classCallCheck(this, Collapse2);
_this2 = _super.call(this, _props);
_this2.onClickItem = function(key2) {
var activeKey = _this2.state.activeKey;
if (_this2.props.accordion) {
activeKey = activeKey[0] === key2 ? [] : [key2];
} else {
activeKey = _toConsumableArray$c(activeKey);
var index2 = activeKey.indexOf(key2);
var isActive2 = index2 > -1;
if (isActive2) {
activeKey.splice(index2, 1);
} else {
activeKey.push(key2);
}
}
_this2.setActiveKey(activeKey);
};
_this2.getNewChild = function(child, index2) {
if (!child)
return null;
var activeKey = _this2.state.activeKey;
var _this$props = _this2.props, prefixCls = _this$props.prefixCls, openMotion = _this$props.openMotion, accordion = _this$props.accordion, rootDestroyInactivePanel = _this$props.destroyInactivePanel, expandIcon = _this$props.expandIcon, collapsible = _this$props.collapsible;
var key2 = child.key || String(index2);
var _child$props = child.props, header = _child$props.header, headerClass = _child$props.headerClass, destroyInactivePanel = _child$props.destroyInactivePanel, childCollapsible = _child$props.collapsible;
var isActive2 = false;
if (accordion) {
isActive2 = activeKey[0] === key2;
} else {
isActive2 = activeKey.indexOf(key2) > -1;
}
var mergeCollapsible = childCollapsible !== null && childCollapsible !== void 0 ? childCollapsible : collapsible;
var props = {
key: key2,
panelKey: key2,
header,
headerClass,
isActive: isActive2,
prefixCls,
destroyInactivePanel: destroyInactivePanel !== null && destroyInactivePanel !== void 0 ? destroyInactivePanel : rootDestroyInactivePanel,
openMotion,
accordion,
children: child.props.children,
onItemClick: mergeCollapsible === "disabled" ? null : _this2.onClickItem,
expandIcon,
collapsible: mergeCollapsible
};
if (typeof child.type === "string") {
return child;
}
Object.keys(props).forEach(function(propName) {
if (typeof props[propName] === "undefined") {
delete props[propName];
}
});
return /* @__PURE__ */ React__namespace.cloneElement(child, props);
};
_this2.getItems = function() {
var children = _this2.props.children;
return toArray$9(children).map(_this2.getNewChild);
};
_this2.setActiveKey = function(activeKey) {
if (!("activeKey" in _this2.props)) {
_this2.setState({
activeKey
});
}
_this2.props.onChange(_this2.props.accordion ? activeKey[0] : activeKey);
};
var _activeKey = _props.activeKey, defaultActiveKey = _props.defaultActiveKey;
var currentActiveKey = defaultActiveKey;
if ("activeKey" in _props) {
currentActiveKey = _activeKey;
}
_this2.state = {
activeKey: getActiveKeysArray(currentActiveKey)
};
return _this2;
}
_createClass(Collapse2, [{
key: "shouldComponentUpdate",
value: function shouldComponentUpdate(nextProps, nextState) {
return !shallowequal(this.props, nextProps) || !shallowequal(this.state, nextState);
}
}, {
key: "render",
value: function render2() {
var _classNames;
var _this$props2 = this.props, prefixCls = _this$props2.prefixCls, className = _this$props2.className, style2 = _this$props2.style, accordion = _this$props2.accordion;
var collapseClassName = classnames((_classNames = {}, _defineProperty$b(_classNames, prefixCls, true), _defineProperty$b(_classNames, className, !!className), _classNames));
return /* @__PURE__ */ jsx("div", {
className: collapseClassName,
style: style2,
role: accordion ? "tablist" : null,
children: this.getItems()
});
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(nextProps) {
var newState = {};
if ("activeKey" in nextProps) {
newState.activeKey = getActiveKeysArray(nextProps.activeKey);
}
return newState;
}
}]);
return Collapse2;
}(React__namespace.Component);
Collapse$2.defaultProps = {
prefixCls: "rc-collapse",
onChange: function onChange() {
},
accordion: false,
destroyInactivePanel: false
};
Collapse$2.Panel = CollapsePanel$2;
Collapse$2.Panel;
var CollapsePanel = function CollapsePanel2(props) {
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var customizePrefixCls = props.prefixCls, _props$className = props.className, className = _props$className === void 0 ? "" : _props$className, _props$showArrow = props.showArrow, showArrow = _props$showArrow === void 0 ? true : _props$showArrow;
var prefixCls = getPrefixCls("collapse", customizePrefixCls);
var collapsePanelClassName = classnames(_defineProperty$b({}, "".concat(prefixCls, "-no-arrow"), !showArrow), className);
return /* @__PURE__ */ jsx(Collapse$2.Panel, {
...props,
prefixCls,
className: collapsePanelClassName
});
};
const CollapsePanel$1 = CollapsePanel;
var Collapse = function Collapse2(props) {
var _classNames;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var customizePrefixCls = props.prefixCls, _props$className = props.className, className = _props$className === void 0 ? "" : _props$className, _props$bordered = props.bordered, bordered = _props$bordered === void 0 ? true : _props$bordered, ghost = props.ghost, _props$expandIconPosi = props.expandIconPosition, expandIconPosition = _props$expandIconPosi === void 0 ? "start" : _props$expandIconPosi;
var prefixCls = getPrefixCls("collapse", customizePrefixCls);
var mergedExpandIconPosition = React__namespace.useMemo(function() {
if (expandIconPosition === "left") {
return "start";
}
return expandIconPosition === "right" ? "end" : expandIconPosition;
}, [expandIconPosition]);
var renderExpandIcon2 = function renderExpandIcon3() {
var panelProps = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
var expandIcon = props.expandIcon;
var icon = expandIcon ? expandIcon(panelProps) : /* @__PURE__ */ jsx(RightOutlined$1, {
rotate: panelProps.isActive ? 90 : void 0
});
return cloneElement(icon, function() {
return {
className: classnames(icon.props.className, "".concat(prefixCls, "-arrow"))
};
});
};
var collapseClassName = classnames("".concat(prefixCls, "-icon-position-").concat(mergedExpandIconPosition), (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-borderless"), !bordered), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-ghost"), !!ghost), _classNames), className);
var openMotion = _extends$3(_extends$3({}, collapseMotion$1), {
motionAppear: false,
leavedClassName: "".concat(prefixCls, "-content-hidden")
});
var getItems = function getItems2() {
var children = props.children;
return toArray$9(children).map(function(child, index2) {
var _a;
if ((_a = child.props) === null || _a === void 0 ? void 0 : _a.disabled) {
var key2 = child.key || String(index2);
var _child$props = child.props, disabled = _child$props.disabled, collapsible = _child$props.collapsible;
var childProps = _extends$3(_extends$3({}, omit(child.props, ["disabled"])), {
key: key2,
collapsible: collapsible !== null && collapsible !== void 0 ? collapsible : disabled ? "disabled" : void 0
});
return cloneElement(child, childProps);
}
return child;
});
};
return /* @__PURE__ */ jsx(Collapse$2, {
openMotion,
...props,
expandIcon: renderExpandIcon2,
prefixCls,
className: collapseClassName,
children: getItems()
});
};
Collapse.Panel = CollapsePanel$1;
const Collapse$1 = Collapse;
function PickerButton(props) {
return /* @__PURE__ */ jsx(Button$2, {
size: "small",
type: "primary",
...props
});
}
var __rest$t = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var CheckableTag = function CheckableTag2(_a) {
var _classNames;
var customizePrefixCls = _a.prefixCls, className = _a.className, checked = _a.checked, onChange = _a.onChange, onClick = _a.onClick, restProps = __rest$t(_a, ["prefixCls", "className", "checked", "onChange", "onClick"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var handleClick = function handleClick2(e2) {
onChange === null || onChange === void 0 ? void 0 : onChange(!checked);
onClick === null || onClick === void 0 ? void 0 : onClick(e2);
};
var prefixCls = getPrefixCls("tag", customizePrefixCls);
var cls = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-checkable"), true), _defineProperty$b(_classNames, "".concat(prefixCls, "-checkable-checked"), checked), _classNames), className);
return /* @__PURE__ */ jsx("span", {
...restProps,
className: cls,
onClick: handleClick
});
};
const CheckableTag$1 = CheckableTag;
var __rest$s = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var PresetColorRegex = new RegExp("^(".concat(PresetColorTypes.join("|"), ")(-inverse)?$"));
var PresetStatusColorRegex = new RegExp("^(".concat(PresetStatusColorTypes.join("|"), ")$"));
var InternalTag = function InternalTag2(_a, ref) {
var _classNames;
var customizePrefixCls = _a.prefixCls, className = _a.className, style2 = _a.style, children = _a.children, icon = _a.icon, color2 = _a.color, onClose = _a.onClose, closeIcon = _a.closeIcon, _a$closable = _a.closable, closable = _a$closable === void 0 ? false : _a$closable, props = __rest$s(_a, ["prefixCls", "className", "style", "children", "icon", "color", "onClose", "closeIcon", "closable"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var _React$useState = React__namespace.useState(true), _React$useState2 = _slicedToArray$e(_React$useState, 2), visible = _React$useState2[0], setVisible = _React$useState2[1];
React__namespace.useEffect(function() {
if ("visible" in props) {
setVisible(props.visible);
}
}, [props.visible]);
var isPresetColor = function isPresetColor2() {
if (!color2) {
return false;
}
return PresetColorRegex.test(color2) || PresetStatusColorRegex.test(color2);
};
var tagStyle = _extends$3({
backgroundColor: color2 && !isPresetColor() ? color2 : void 0
}, style2);
var presetColor = isPresetColor();
var prefixCls = getPrefixCls("tag", customizePrefixCls);
var tagClassName = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(color2), presetColor), _defineProperty$b(_classNames, "".concat(prefixCls, "-has-color"), color2 && !presetColor), _defineProperty$b(_classNames, "".concat(prefixCls, "-hidden"), !visible), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className);
var handleCloseClick = function handleCloseClick2(e2) {
e2.stopPropagation();
onClose === null || onClose === void 0 ? void 0 : onClose(e2);
if (e2.defaultPrevented) {
return;
}
if (!("visible" in props)) {
setVisible(false);
}
};
var renderCloseIcon = function renderCloseIcon2() {
if (closable) {
return closeIcon ? /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-close-icon"),
onClick: handleCloseClick,
children: closeIcon
}) : /* @__PURE__ */ jsx(CloseOutlined$4, {
className: "".concat(prefixCls, "-close-icon"),
onClick: handleCloseClick
});
}
return null;
};
var isNeedWave = "onClick" in props || children && children.type === "a";
var tagProps = omit(props, ["visible"]);
var iconNode = icon || null;
var kids = iconNode ? /* @__PURE__ */ jsxs(Fragment, {
children: [iconNode, /* @__PURE__ */ jsx("span", {
children
})]
}) : children;
var tagNode = /* @__PURE__ */ jsxs("span", {
...tagProps,
ref,
className: tagClassName,
style: tagStyle,
children: [kids, renderCloseIcon()]
});
return isNeedWave ? /* @__PURE__ */ jsx(Wave$1, {
children: tagNode
}) : tagNode;
};
var Tag = /* @__PURE__ */ React__namespace.forwardRef(InternalTag);
Tag.CheckableTag = CheckableTag$1;
const Tag$1 = Tag;
function PickerTag(props) {
return /* @__PURE__ */ jsx(Tag$1, {
color: "blue",
...props
});
}
var CalendarOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M880 184H712v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H384v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H144c-17.7 0-32 14.3-32 32v664c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V216c0-17.7-14.3-32-32-32zm-40 656H184V460h656v380zM184 392V256h128v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h256v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h128v136H184z" } }] }, "name": "calendar", "theme": "outlined" };
const CalendarOutlinedSvg = CalendarOutlined$2;
var CalendarOutlined = function CalendarOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: CalendarOutlinedSvg
})
});
};
CalendarOutlined.displayName = "CalendarOutlined";
const CalendarOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(CalendarOutlined);
var ClockCircleOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z" } }, { "tag": "path", "attrs": { "d": "M686.7 638.6L544.1 535.5V288c0-4.4-3.6-8-8-8H488c-4.4 0-8 3.6-8 8v275.4c0 2.6 1.2 5 3.3 6.5l165.4 120.6c3.6 2.6 8.6 1.8 11.2-1.7l28.6-39c2.6-3.7 1.8-8.7-1.8-11.2z" } }] }, "name": "clock-circle", "theme": "outlined" };
const ClockCircleOutlinedSvg = ClockCircleOutlined$2;
var ClockCircleOutlined = function ClockCircleOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: ClockCircleOutlinedSvg
})
});
};
ClockCircleOutlined.displayName = "ClockCircleOutlined";
const ClockCircleOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(ClockCircleOutlined);
var SwapRightOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "0 0 1024 1024", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M873.1 596.2l-164-208A32 32 0 00684 376h-64.8c-6.7 0-10.4 7.7-6.3 13l144.3 183H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h695.9c26.8 0 41.7-30.8 25.2-51.8z" } }] }, "name": "swap-right", "theme": "outlined" };
const SwapRightOutlinedSvg = SwapRightOutlined$2;
var SwapRightOutlined = function SwapRightOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: SwapRightOutlinedSvg
})
});
};
SwapRightOutlined.displayName = "SwapRightOutlined";
const SwapRightOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(SwapRightOutlined);
function getPlaceholder(picker, locale2, customizePlaceholder) {
if (customizePlaceholder !== void 0) {
return customizePlaceholder;
}
if (picker === "year" && locale2.lang.yearPlaceholder) {
return locale2.lang.yearPlaceholder;
}
if (picker === "quarter" && locale2.lang.quarterPlaceholder) {
return locale2.lang.quarterPlaceholder;
}
if (picker === "month" && locale2.lang.monthPlaceholder) {
return locale2.lang.monthPlaceholder;
}
if (picker === "week" && locale2.lang.weekPlaceholder) {
return locale2.lang.weekPlaceholder;
}
if (picker === "time" && locale2.timePickerLocale.placeholder) {
return locale2.timePickerLocale.placeholder;
}
return locale2.lang.placeholder;
}
function getRangePlaceholder(picker, locale2, customizePlaceholder) {
if (customizePlaceholder !== void 0) {
return customizePlaceholder;
}
if (picker === "year" && locale2.lang.yearPlaceholder) {
return locale2.lang.rangeYearPlaceholder;
}
if (picker === "quarter" && locale2.lang.quarterPlaceholder) {
return locale2.lang.rangeQuarterPlaceholder;
}
if (picker === "month" && locale2.lang.monthPlaceholder) {
return locale2.lang.rangeMonthPlaceholder;
}
if (picker === "week" && locale2.lang.weekPlaceholder) {
return locale2.lang.rangeWeekPlaceholder;
}
if (picker === "time" && locale2.timePickerLocale.placeholder) {
return locale2.timePickerLocale.rangePlaceholder;
}
return locale2.lang.rangePlaceholder;
}
function transPlacement2DropdownAlign(direction, placement) {
var overflow = {
adjustX: 1,
adjustY: 1
};
switch (placement) {
case "bottomLeft": {
return {
points: ["tl", "bl"],
offset: [0, 4],
overflow
};
}
case "bottomRight": {
return {
points: ["tr", "br"],
offset: [0, 4],
overflow
};
}
case "topLeft": {
return {
points: ["bl", "tl"],
offset: [0, -4],
overflow
};
}
case "topRight": {
return {
points: ["br", "tr"],
offset: [0, -4],
overflow
};
}
default: {
return {
points: direction === "rtl" ? ["tr", "br"] : ["tl", "bl"],
offset: [0, 4],
overflow
};
}
}
}
var __rest$r = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
function generateRangePicker(generateConfig2) {
var RangePicker2 = /* @__PURE__ */ React$a.forwardRef(function(props, ref) {
var customizePrefixCls = props.prefixCls, customGetPopupContainer = props.getPopupContainer, className = props.className, placement = props.placement, customizeSize = props.size, customDisabled = props.disabled, _props$bordered = props.bordered, bordered = _props$bordered === void 0 ? true : _props$bordered, placeholder = props.placeholder, popupClassName = props.popupClassName, dropdownClassName = props.dropdownClassName, customStatus = props.status, restProps = __rest$r(props, ["prefixCls", "getPopupContainer", "className", "placement", "size", "disabled", "bordered", "placeholder", "popupClassName", "dropdownClassName", "status"]);
var innerRef = React__namespace.useRef(null);
var _useContext = React$a.useContext(ConfigContext$1), getPrefixCls = _useContext.getPrefixCls, direction = _useContext.direction, getPopupContainer = _useContext.getPopupContainer;
var prefixCls = getPrefixCls("picker", customizePrefixCls);
var _useCompactItemContex = useCompactItemContext(prefixCls, direction), compactSize = _useCompactItemContex.compactSize, compactItemClassnames = _useCompactItemContex.compactItemClassnames;
var format2 = props.format, showTime = props.showTime, picker = props.picker;
var rootPrefixCls = getPrefixCls();
var additionalOverrideProps = {};
additionalOverrideProps = _extends$3(_extends$3(_extends$3({}, additionalOverrideProps), showTime ? getTimeProps(_extends$3({
format: format2,
picker
}, showTime)) : {}), picker === "time" ? getTimeProps(_extends$3(_extends$3({
format: format2
}, props), {
picker
})) : {});
var size = React__namespace.useContext(SizeContext$1);
var mergedSize = compactSize || customizeSize || size;
var disabled = React__namespace.useContext(DisabledContext$1);
var mergedDisabled = customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled;
var formItemContext = React$a.useContext(FormItemInputContext);
var hasFeedback = formItemContext.hasFeedback, contextStatus = formItemContext.status, feedbackIcon = formItemContext.feedbackIcon;
var suffixNode = /* @__PURE__ */ jsxs(Fragment, {
children: [picker === "time" ? /* @__PURE__ */ jsx(ClockCircleOutlined$1, {}) : /* @__PURE__ */ jsx(CalendarOutlined$1, {}), hasFeedback && feedbackIcon]
});
React$a.useImperativeHandle(ref, function() {
return {
focus: function focus() {
var _a;
return (_a = innerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
},
blur: function blur() {
var _a;
return (_a = innerRef.current) === null || _a === void 0 ? void 0 : _a.blur();
}
};
});
return /* @__PURE__ */ jsx(LocaleReceiver$1, {
componentName: "DatePicker",
defaultLocale: enUS$2,
children: function(contextLocale) {
var _classNames;
var locale2 = _extends$3(_extends$3({}, contextLocale), props.locale);
return /* @__PURE__ */ jsx(RangePicker$2, {
separator: /* @__PURE__ */ jsx("span", {
"aria-label": "to",
className: "".concat(prefixCls, "-separator"),
children: /* @__PURE__ */ jsx(SwapRightOutlined$1, {})
}),
disabled: mergedDisabled,
ref: innerRef,
dropdownAlign: transPlacement2DropdownAlign(direction, placement),
placeholder: getRangePlaceholder(picker, locale2, placeholder),
suffixIcon: suffixNode,
clearIcon: /* @__PURE__ */ jsx(CloseCircleFilled$1, {}),
prevIcon: /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-prev-icon")
}),
nextIcon: /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-next-icon")
}),
superPrevIcon: /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-super-prev-icon")
}),
superNextIcon: /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-super-next-icon")
}),
allowClear: true,
transitionName: "".concat(rootPrefixCls, "-slide-up"),
...restProps,
...additionalOverrideProps,
className: classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(mergedSize), mergedSize), _defineProperty$b(_classNames, "".concat(prefixCls, "-borderless"), !bordered), _classNames), getStatusClassNames(prefixCls, getMergedStatus(contextStatus, customStatus), hasFeedback), compactItemClassnames, className),
locale: locale2.lang,
prefixCls,
getPopupContainer: customGetPopupContainer || getPopupContainer,
generateConfig: generateConfig2,
components: Components,
direction,
dropdownClassName: popupClassName || dropdownClassName
});
}
});
});
return RangePicker2;
}
var __rest$q = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
function generatePicker$1(generateConfig2) {
function getPicker(picker, displayName) {
var Picker$1 = /* @__PURE__ */ React$a.forwardRef(function(props, ref) {
var customizePrefixCls = props.prefixCls, customizeGetPopupContainer = props.getPopupContainer, className = props.className, customizeSize = props.size, _props$bordered = props.bordered, bordered = _props$bordered === void 0 ? true : _props$bordered, placement = props.placement, placeholder = props.placeholder, popupClassName = props.popupClassName, dropdownClassName = props.dropdownClassName, customDisabled = props.disabled, customStatus = props.status, restProps = __rest$q(props, ["prefixCls", "getPopupContainer", "className", "size", "bordered", "placement", "placeholder", "popupClassName", "dropdownClassName", "disabled", "status"]);
var _useContext = React$a.useContext(ConfigContext$1), getPrefixCls = _useContext.getPrefixCls, direction = _useContext.direction, getPopupContainer = _useContext.getPopupContainer;
var prefixCls = getPrefixCls("picker", customizePrefixCls);
var _useCompactItemContex = useCompactItemContext(prefixCls, direction), compactSize = _useCompactItemContex.compactSize, compactItemClassnames = _useCompactItemContex.compactItemClassnames;
var innerRef = React__namespace.useRef(null);
var format2 = props.format, showTime = props.showTime;
React$a.useImperativeHandle(ref, function() {
return {
focus: function focus() {
var _a;
return (_a = innerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
},
blur: function blur() {
var _a;
return (_a = innerRef.current) === null || _a === void 0 ? void 0 : _a.blur();
}
};
});
var additionalProps = {
showToday: true
};
var additionalOverrideProps = {};
if (picker) {
additionalOverrideProps.picker = picker;
}
var mergedPicker = picker || props.picker;
additionalOverrideProps = _extends$3(_extends$3(_extends$3({}, additionalOverrideProps), showTime ? getTimeProps(_extends$3({
format: format2,
picker: mergedPicker
}, showTime)) : {}), mergedPicker === "time" ? getTimeProps(_extends$3(_extends$3({
format: format2
}, props), {
picker: mergedPicker
})) : {});
var rootPrefixCls = getPrefixCls();
var size = React__namespace.useContext(SizeContext$1);
var mergedSize = compactSize || customizeSize || size;
var disabled = React__namespace.useContext(DisabledContext$1);
var mergedDisabled = customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled;
var formItemContext = React$a.useContext(FormItemInputContext);
var hasFeedback = formItemContext.hasFeedback, contextStatus = formItemContext.status, feedbackIcon = formItemContext.feedbackIcon;
var suffixNode = /* @__PURE__ */ jsxs(Fragment, {
children: [mergedPicker === "time" ? /* @__PURE__ */ jsx(ClockCircleOutlined$1, {}) : /* @__PURE__ */ jsx(CalendarOutlined$1, {}), hasFeedback && feedbackIcon]
});
return /* @__PURE__ */ jsx(LocaleReceiver$1, {
componentName: "DatePicker",
defaultLocale: enUS$2,
children: function(contextLocale) {
var _classNames;
var locale2 = _extends$3(_extends$3({}, contextLocale), props.locale);
return /* @__PURE__ */ jsx(Picker, {
ref: innerRef,
placeholder: getPlaceholder(mergedPicker, locale2, placeholder),
suffixIcon: suffixNode,
dropdownAlign: transPlacement2DropdownAlign(direction, placement),
clearIcon: /* @__PURE__ */ jsx(CloseCircleFilled$1, {}),
prevIcon: /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-prev-icon")
}),
nextIcon: /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-next-icon")
}),
superPrevIcon: /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-super-prev-icon")
}),
superNextIcon: /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-super-next-icon")
}),
allowClear: true,
transitionName: "".concat(rootPrefixCls, "-slide-up"),
...additionalProps,
...restProps,
...additionalOverrideProps,
locale: locale2.lang,
className: classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(mergedSize), mergedSize), _defineProperty$b(_classNames, "".concat(prefixCls, "-borderless"), !bordered), _classNames), getStatusClassNames(prefixCls, getMergedStatus(contextStatus, customStatus), hasFeedback), compactItemClassnames, className),
prefixCls,
getPopupContainer: customizeGetPopupContainer || getPopupContainer,
generateConfig: generateConfig2,
components: Components,
direction,
disabled: mergedDisabled,
dropdownClassName: popupClassName || dropdownClassName
});
}
});
});
if (displayName) {
Picker$1.displayName = displayName;
}
return Picker$1;
}
var DatePicker2 = getPicker();
var WeekPicker = getPicker("week", "WeekPicker");
var MonthPicker = getPicker("month", "MonthPicker");
var YearPicker = getPicker("year", "YearPicker");
var TimePicker2 = getPicker("time", "TimePicker");
var QuarterPicker = getPicker("quarter", "QuarterPicker");
return {
DatePicker: DatePicker2,
WeekPicker,
MonthPicker,
YearPicker,
TimePicker: TimePicker2,
QuarterPicker
};
}
var Components = {
button: PickerButton,
rangeItem: PickerTag
};
function toArray$5(list) {
if (!list) {
return [];
}
return Array.isArray(list) ? list : [list];
}
function getTimeProps(props) {
var format2 = props.format, picker = props.picker, showHour = props.showHour, showMinute = props.showMinute, showSecond = props.showSecond, use12Hours = props.use12Hours;
var firstFormat = toArray$5(format2)[0];
var showTimeObj = _extends$3({}, props);
if (firstFormat && typeof firstFormat === "string") {
if (!firstFormat.includes("s") && showSecond === void 0) {
showTimeObj.showSecond = false;
}
if (!firstFormat.includes("m") && showMinute === void 0) {
showTimeObj.showMinute = false;
}
if (!firstFormat.includes("H") && !firstFormat.includes("h") && showHour === void 0) {
showTimeObj.showHour = false;
}
if ((firstFormat.includes("a") || firstFormat.includes("A")) && use12Hours === void 0) {
showTimeObj.use12Hours = true;
}
}
if (picker === "time") {
return showTimeObj;
}
if (typeof firstFormat === "function") {
delete showTimeObj.format;
}
return {
showTime: showTimeObj
};
}
tuple$1("bottomLeft", "bottomRight", "topLeft", "topRight");
function generatePicker(generateConfig2) {
var _generateSinglePicker = generatePicker$1(generateConfig2), DatePicker2 = _generateSinglePicker.DatePicker, WeekPicker = _generateSinglePicker.WeekPicker, MonthPicker = _generateSinglePicker.MonthPicker, YearPicker = _generateSinglePicker.YearPicker, TimePicker2 = _generateSinglePicker.TimePicker, QuarterPicker = _generateSinglePicker.QuarterPicker;
var RangePicker2 = generateRangePicker(generateConfig2);
var MergedDatePicker = DatePicker2;
MergedDatePicker.WeekPicker = WeekPicker;
MergedDatePicker.MonthPicker = MonthPicker;
MergedDatePicker.YearPicker = YearPicker;
MergedDatePicker.RangePicker = RangePicker2;
MergedDatePicker.TimePicker = TimePicker2;
MergedDatePicker.QuarterPicker = QuarterPicker;
return MergedDatePicker;
}
var __rest$p = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Divider = function Divider2(props) {
var _classNames;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var customizePrefixCls = props.prefixCls, _props$type = props.type, type2 = _props$type === void 0 ? "horizontal" : _props$type, _props$orientation = props.orientation, orientation = _props$orientation === void 0 ? "center" : _props$orientation, orientationMargin = props.orientationMargin, className = props.className, children = props.children, dashed = props.dashed, plain = props.plain, restProps = __rest$p(props, ["prefixCls", "type", "orientation", "orientationMargin", "className", "children", "dashed", "plain"]);
var prefixCls = getPrefixCls("divider", customizePrefixCls);
var orientationPrefix = orientation.length > 0 ? "-".concat(orientation) : orientation;
var hasChildren = !!children;
var hasCustomMarginLeft = orientation === "left" && orientationMargin != null;
var hasCustomMarginRight = orientation === "right" && orientationMargin != null;
var classString = classnames(prefixCls, "".concat(prefixCls, "-").concat(type2), (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-with-text"), hasChildren), _defineProperty$b(_classNames, "".concat(prefixCls, "-with-text").concat(orientationPrefix), hasChildren), _defineProperty$b(_classNames, "".concat(prefixCls, "-dashed"), !!dashed), _defineProperty$b(_classNames, "".concat(prefixCls, "-plain"), !!plain), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-no-default-orientation-margin-left"), hasCustomMarginLeft), _defineProperty$b(_classNames, "".concat(prefixCls, "-no-default-orientation-margin-right"), hasCustomMarginRight), _classNames), className);
var innerStyle = _extends$3(_extends$3({}, hasCustomMarginLeft && {
marginLeft: orientationMargin
}), hasCustomMarginRight && {
marginRight: orientationMargin
});
return /* @__PURE__ */ jsx("div", {
className: classString,
...restProps,
role: "separator",
children: children && type2 !== "vertical" && /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-inner-text"),
style: innerStyle,
children
})
});
};
const _Divider = Divider;
var OrderContext = /* @__PURE__ */ React__namespace.createContext(null);
var EMPTY_LIST$3 = [];
function useDom(render2, debug) {
var _React$useState = React__namespace.useState(function() {
if (!canUseDom$1()) {
return null;
}
var defaultEle = document.createElement("div");
return defaultEle;
}), _React$useState2 = _slicedToArray$e(_React$useState, 1), ele = _React$useState2[0];
var appendedRef = React__namespace.useRef(false);
var queueCreate = React__namespace.useContext(OrderContext);
var _React$useState3 = React__namespace.useState(EMPTY_LIST$3), _React$useState4 = _slicedToArray$e(_React$useState3, 2), queue = _React$useState4[0], setQueue = _React$useState4[1];
var mergedQueueCreate = queueCreate || (appendedRef.current ? void 0 : function(appendFn) {
setQueue(function(origin) {
var newQueue = [appendFn].concat(_toConsumableArray$c(origin));
return newQueue;
});
});
function append() {
if (!ele.parentElement) {
document.body.appendChild(ele);
}
appendedRef.current = true;
}
function cleanup2() {
var _ele$parentElement;
(_ele$parentElement = ele.parentElement) === null || _ele$parentElement === void 0 ? void 0 : _ele$parentElement.removeChild(ele);
appendedRef.current = false;
}
useLayoutEffect$1(function() {
if (render2) {
if (queueCreate) {
queueCreate(append);
} else {
append();
}
} else {
cleanup2();
}
return cleanup2;
}, [render2]);
useLayoutEffect$1(function() {
if (queue.length) {
queue.forEach(function(appendFn) {
return appendFn();
});
setQueue(EMPTY_LIST$3);
}
}, [queue]);
return [ele, mergedQueueCreate];
}
var cached;
function getScrollBarSize(fresh) {
if (typeof document === "undefined") {
return 0;
}
if (fresh || cached === void 0) {
var inner = document.createElement("div");
inner.style.width = "100%";
inner.style.height = "200px";
var outer = document.createElement("div");
var outerStyle = outer.style;
outerStyle.position = "absolute";
outerStyle.top = "0";
outerStyle.left = "0";
outerStyle.pointerEvents = "none";
outerStyle.visibility = "hidden";
outerStyle.width = "200px";
outerStyle.height = "150px";
outerStyle.overflow = "hidden";
outer.appendChild(inner);
document.body.appendChild(outer);
var widthContained = inner.offsetWidth;
outer.style.overflow = "scroll";
var widthScroll = inner.offsetWidth;
if (widthContained === widthScroll) {
widthScroll = outer.clientWidth;
}
document.body.removeChild(outer);
cached = widthContained - widthScroll;
}
return cached;
}
function ensureSize(str) {
var match2 = str.match(/^(.*)px$/);
var value = Number(match2 === null || match2 === void 0 ? void 0 : match2[1]);
return Number.isNaN(value) ? getScrollBarSize() : value;
}
function getTargetScrollBarSize(target) {
if (typeof document === "undefined" || !target || !(target instanceof Element)) {
return {
width: 0,
height: 0
};
}
var _getComputedStyle2 = getComputedStyle(target, "::-webkit-scrollbar"), width = _getComputedStyle2.width, height = _getComputedStyle2.height;
return {
width: ensureSize(width),
height: ensureSize(height)
};
}
function isBodyOverflowing() {
return document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight) && window.innerWidth > document.body.offsetWidth;
}
var UNIQUE_ID = "rc-util-locker-".concat(Date.now());
var uuid$3 = 0;
function useScrollLocker(lock) {
var mergedLock = !!lock;
var _React$useState = React__namespace.useState(function() {
uuid$3 += 1;
return "".concat(UNIQUE_ID, "_").concat(uuid$3);
}), _React$useState2 = _slicedToArray$e(_React$useState, 1), id2 = _React$useState2[0];
useLayoutEffect$1(function() {
if (mergedLock) {
var scrollbarSize = getScrollBarSize();
var isOverflow = isBodyOverflowing();
updateCSS("\nhtml body {\n overflow-y: hidden;\n ".concat(isOverflow ? "width: calc(100% - ".concat(scrollbarSize, "px);") : "", "\n}"), id2);
} else {
removeCSS(id2);
}
return function() {
removeCSS(id2);
};
}, [mergedLock, id2]);
}
var inline = false;
function inlineMock(nextInline) {
if (typeof nextInline === "boolean") {
inline = nextInline;
}
return inline;
}
var getPortalContainer = function getPortalContainer2(getContainer2) {
if (getContainer2 === false) {
return false;
}
if (!canUseDom$1() || !getContainer2) {
return null;
}
if (typeof getContainer2 === "string") {
return document.querySelector(getContainer2);
}
if (typeof getContainer2 === "function") {
return getContainer2();
}
return getContainer2;
};
var Portal = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var open = props.open, autoLock = props.autoLock, getContainer2 = props.getContainer;
props.debug;
var _props$autoDestroy = props.autoDestroy, autoDestroy = _props$autoDestroy === void 0 ? true : _props$autoDestroy, children = props.children;
var _React$useState = React__namespace.useState(open), _React$useState2 = _slicedToArray$e(_React$useState, 2), shouldRender = _React$useState2[0], setShouldRender = _React$useState2[1];
var mergedRender = shouldRender || open;
React__namespace.useEffect(function() {
if (autoDestroy || open) {
setShouldRender(open);
}
}, [open, autoDestroy]);
var _React$useState3 = React__namespace.useState(function() {
return getPortalContainer(getContainer2);
}), _React$useState4 = _slicedToArray$e(_React$useState3, 2), innerContainer = _React$useState4[0], setInnerContainer = _React$useState4[1];
React__namespace.useEffect(function() {
var customizeContainer = getPortalContainer(getContainer2);
setInnerContainer(customizeContainer !== null && customizeContainer !== void 0 ? customizeContainer : null);
});
var _useDom = useDom(mergedRender && !innerContainer), _useDom2 = _slicedToArray$e(_useDom, 2), defaultContainer2 = _useDom2[0], queueCreate = _useDom2[1];
var mergedContainer = innerContainer !== null && innerContainer !== void 0 ? innerContainer : defaultContainer2;
useScrollLocker(autoLock && open && canUseDom$1() && (mergedContainer === defaultContainer2 || mergedContainer === document.body));
var childRef = null;
if (children && supportRef(children) && ref) {
var _ref = children;
childRef = _ref.ref;
}
var mergedRef = useComposeRef(childRef, ref);
if (!mergedRender || !canUseDom$1() || innerContainer === void 0) {
return null;
}
var renderInline = mergedContainer === false || inlineMock();
var reffedChildren = children;
if (ref) {
reffedChildren = /* @__PURE__ */ React__namespace.cloneElement(children, {
ref: mergedRef
});
}
return /* @__PURE__ */ jsx(OrderContext.Provider, {
value: queueCreate,
children: renderInline ? reffedChildren : /* @__PURE__ */ ReactDOM2.createPortal(reffedChildren, mergedContainer)
});
});
var DrawerPanel = function DrawerPanel2(props) {
var prefixCls = props.prefixCls, className = props.className, style2 = props.style, children = props.children, containerRef = props.containerRef;
return /* @__PURE__ */ jsx(Fragment, {
children: /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-content"), className),
style: _objectSpread2$a({}, style2),
"aria-modal": "true",
role: "dialog",
ref: containerRef,
children
})
});
};
var DrawerContext = /* @__PURE__ */ React__namespace.createContext(null);
function parseWidthHeight(value) {
if (typeof value === "string" && String(Number(value)) === value) {
warningOnce(false, "Invalid value type of `width` or `height` which should be number type instead.");
return Number(value);
}
return value;
}
var sentinelStyle$1 = {
width: 0,
height: 0,
overflow: "hidden",
outline: "none",
position: "absolute"
};
function DrawerPopup(props, ref) {
var _ref, _pushConfig$distance, _pushConfig, _classNames;
var prefixCls = props.prefixCls, open = props.open, placement = props.placement, inline2 = props.inline, push = props.push, forceRender = props.forceRender, autoFocus = props.autoFocus, keyboard = props.keyboard, rootClassName = props.rootClassName, rootStyle = props.rootStyle, zIndex = props.zIndex, className = props.className, style2 = props.style, motion2 = props.motion, width = props.width, height = props.height, children = props.children, contentWrapperStyle = props.contentWrapperStyle, mask = props.mask, maskClosable = props.maskClosable, maskMotion = props.maskMotion, maskClassName = props.maskClassName, maskStyle = props.maskStyle, afterOpenChange = props.afterOpenChange, onClose = props.onClose;
var panelRef = React__namespace.useRef();
var sentinelStartRef = React__namespace.useRef();
var sentinelEndRef = React__namespace.useRef();
React__namespace.useImperativeHandle(ref, function() {
return panelRef.current;
});
var onPanelKeyDown = function onPanelKeyDown2(event) {
var keyCode = event.keyCode, shiftKey = event.shiftKey;
switch (keyCode) {
case KeyCode.TAB: {
if (keyCode === KeyCode.TAB) {
if (!shiftKey && document.activeElement === sentinelEndRef.current) {
var _sentinelStartRef$cur;
(_sentinelStartRef$cur = sentinelStartRef.current) === null || _sentinelStartRef$cur === void 0 ? void 0 : _sentinelStartRef$cur.focus({
preventScroll: true
});
} else if (shiftKey && document.activeElement === sentinelStartRef.current) {
var _sentinelEndRef$curre;
(_sentinelEndRef$curre = sentinelEndRef.current) === null || _sentinelEndRef$curre === void 0 ? void 0 : _sentinelEndRef$curre.focus({
preventScroll: true
});
}
}
break;
}
case KeyCode.ESC: {
if (onClose && keyboard) {
event.stopPropagation();
onClose(event);
}
break;
}
}
};
React__namespace.useEffect(function() {
if (open && autoFocus) {
var _panelRef$current;
(_panelRef$current = panelRef.current) === null || _panelRef$current === void 0 ? void 0 : _panelRef$current.focus({
preventScroll: true
});
}
}, [open]);
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), pushed = _React$useState2[0], setPushed = _React$useState2[1];
var parentContext = React__namespace.useContext(DrawerContext);
var pushConfig;
if (push === false) {
pushConfig = {
distance: 0
};
} else if (push === true) {
pushConfig = {};
} else {
pushConfig = push || {};
}
var pushDistance = (_ref = (_pushConfig$distance = (_pushConfig = pushConfig) === null || _pushConfig === void 0 ? void 0 : _pushConfig.distance) !== null && _pushConfig$distance !== void 0 ? _pushConfig$distance : parentContext === null || parentContext === void 0 ? void 0 : parentContext.pushDistance) !== null && _ref !== void 0 ? _ref : 180;
var mergedContext = React__namespace.useMemo(function() {
return {
pushDistance,
push: function push2() {
setPushed(true);
},
pull: function pull() {
setPushed(false);
}
};
}, [pushDistance]);
React__namespace.useEffect(function() {
if (open) {
var _parentContext$push;
parentContext === null || parentContext === void 0 ? void 0 : (_parentContext$push = parentContext.push) === null || _parentContext$push === void 0 ? void 0 : _parentContext$push.call(parentContext);
} else {
var _parentContext$pull;
parentContext === null || parentContext === void 0 ? void 0 : (_parentContext$pull = parentContext.pull) === null || _parentContext$pull === void 0 ? void 0 : _parentContext$pull.call(parentContext);
}
}, [open]);
React__namespace.useEffect(function() {
return function() {
var _parentContext$pull2;
parentContext === null || parentContext === void 0 ? void 0 : (_parentContext$pull2 = parentContext.pull) === null || _parentContext$pull2 === void 0 ? void 0 : _parentContext$pull2.call(parentContext);
};
}, []);
var maskNode = mask && /* @__PURE__ */ jsx(CSSMotion, {
...maskMotion,
visible: open,
children: function(_ref2, maskRef) {
var motionMaskClassName = _ref2.className, motionMaskStyle = _ref2.style;
return /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-mask"), motionMaskClassName, maskClassName),
style: _objectSpread2$a(_objectSpread2$a({}, motionMaskStyle), maskStyle),
onClick: maskClosable && open ? onClose : void 0,
ref: maskRef
});
}
}, "mask");
var motionProps = typeof motion2 === "function" ? motion2(placement) : motion2;
var wrapperStyle = {};
if (pushed && pushDistance) {
switch (placement) {
case "top":
wrapperStyle.transform = "translateY(".concat(pushDistance, "px)");
break;
case "bottom":
wrapperStyle.transform = "translateY(".concat(-pushDistance, "px)");
break;
case "left":
wrapperStyle.transform = "translateX(".concat(pushDistance, "px)");
break;
default:
wrapperStyle.transform = "translateX(".concat(-pushDistance, "px)");
break;
}
}
if (placement === "left" || placement === "right") {
wrapperStyle.width = parseWidthHeight(width);
} else {
wrapperStyle.height = parseWidthHeight(height);
}
var panelNode = /* @__PURE__ */ jsx(CSSMotion, {
...motionProps,
visible: open,
forceRender,
onVisibleChanged: function onVisibleChanged(nextVisible) {
afterOpenChange === null || afterOpenChange === void 0 ? void 0 : afterOpenChange(nextVisible);
},
removeOnLeave: false,
leavedClassName: "".concat(prefixCls, "-content-wrapper-hidden"),
children: function(_ref3, motionRef) {
var motionClassName = _ref3.className, motionStyle = _ref3.style;
return /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-content-wrapper"), motionClassName),
style: _objectSpread2$a(_objectSpread2$a(_objectSpread2$a({}, wrapperStyle), motionStyle), contentWrapperStyle),
children: /* @__PURE__ */ jsx(DrawerPanel, {
containerRef: motionRef,
prefixCls,
className,
style: style2,
children
})
});
}
}, "panel");
var containerStyle = _objectSpread2$a({}, rootStyle);
if (zIndex) {
containerStyle.zIndex = zIndex;
}
return /* @__PURE__ */ jsx(DrawerContext.Provider, {
value: mergedContext,
children: /* @__PURE__ */ jsxs("div", {
className: classnames(prefixCls, "".concat(prefixCls, "-").concat(placement), rootClassName, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-open"), open), _defineProperty$b(_classNames, "".concat(prefixCls, "-inline"), inline2), _classNames)),
style: containerStyle,
tabIndex: -1,
ref: panelRef,
onKeyDown: onPanelKeyDown,
children: [maskNode, /* @__PURE__ */ jsx("div", {
tabIndex: 0,
ref: sentinelStartRef,
style: sentinelStyle$1,
"aria-hidden": "true",
"data-sentinel": "start"
}), panelNode, /* @__PURE__ */ jsx("div", {
tabIndex: 0,
ref: sentinelEndRef,
style: sentinelStyle$1,
"aria-hidden": "true",
"data-sentinel": "end"
})]
})
});
}
var RefDrawerPopup = /* @__PURE__ */ React__namespace.forwardRef(DrawerPopup);
var Drawer$1 = function Drawer2(props) {
var _props$open = props.open, open = _props$open === void 0 ? false : _props$open, _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-drawer" : _props$prefixCls, _props$placement = props.placement, placement = _props$placement === void 0 ? "right" : _props$placement, _props$autoFocus = props.autoFocus, autoFocus = _props$autoFocus === void 0 ? true : _props$autoFocus, _props$keyboard = props.keyboard, keyboard = _props$keyboard === void 0 ? true : _props$keyboard, _props$width = props.width, width = _props$width === void 0 ? 378 : _props$width, _props$mask = props.mask, mask = _props$mask === void 0 ? true : _props$mask, _props$maskClosable = props.maskClosable, maskClosable = _props$maskClosable === void 0 ? true : _props$maskClosable, getContainer2 = props.getContainer, forceRender = props.forceRender, afterOpenChange = props.afterOpenChange, destroyOnClose = props.destroyOnClose;
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), animatedVisible = _React$useState2[0], setAnimatedVisible = _React$useState2[1];
var _React$useState3 = React__namespace.useState(false), _React$useState4 = _slicedToArray$e(_React$useState3, 2), mounted = _React$useState4[0], setMounted = _React$useState4[1];
useLayoutEffect$1(function() {
setMounted(true);
}, []);
var mergedOpen = mounted ? open : false;
var panelRef = React__namespace.useRef();
var lastActiveRef = React__namespace.useRef();
useLayoutEffect$1(function() {
if (mergedOpen) {
lastActiveRef.current = document.activeElement;
}
}, [mergedOpen]);
var internalAfterOpenChange = function internalAfterOpenChange2(nextVisible) {
var _panelRef$current;
setAnimatedVisible(nextVisible);
afterOpenChange === null || afterOpenChange === void 0 ? void 0 : afterOpenChange(nextVisible);
if (!nextVisible && lastActiveRef.current && !((_panelRef$current = panelRef.current) === null || _panelRef$current === void 0 ? void 0 : _panelRef$current.contains(lastActiveRef.current))) {
var _lastActiveRef$curren;
(_lastActiveRef$curren = lastActiveRef.current) === null || _lastActiveRef$curren === void 0 ? void 0 : _lastActiveRef$curren.focus({
preventScroll: true
});
}
};
if (!forceRender && !animatedVisible && !mergedOpen && destroyOnClose) {
return null;
}
var drawerPopupProps = _objectSpread2$a(_objectSpread2$a({}, props), {}, {
open: mergedOpen,
prefixCls,
placement,
autoFocus,
keyboard,
width,
mask,
maskClosable,
inline: getContainer2 === false,
afterOpenChange: internalAfterOpenChange,
ref: panelRef
});
return /* @__PURE__ */ jsx(Portal, {
open: mergedOpen || forceRender || animatedVisible,
autoDestroy: false,
getContainer: getContainer2,
autoLock: mask && (mergedOpen || animatedVisible),
children: /* @__PURE__ */ jsx(RefDrawerPopup, {
...drawerPopupProps
})
});
};
var __rest$o = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
tuple$1("default", "large");
var defaultPushState = {
distance: 180
};
function Drawer(props) {
var width = props.width, height = props.height, _props$size = props.size, size = _props$size === void 0 ? "default" : _props$size, _props$closable = props.closable, closable = _props$closable === void 0 ? true : _props$closable, _props$mask = props.mask, mask = _props$mask === void 0 ? true : _props$mask, _props$push = props.push, push = _props$push === void 0 ? defaultPushState : _props$push, _props$closeIcon = props.closeIcon, closeIcon = _props$closeIcon === void 0 ? /* @__PURE__ */ jsx(CloseOutlined$4, {}) : _props$closeIcon, bodyStyle = props.bodyStyle, drawerStyle = props.drawerStyle, className = props.className, visible = props.visible, open = props.open, children = props.children, style2 = props.style, title = props.title, headerStyle = props.headerStyle, onClose = props.onClose, footer = props.footer, footerStyle = props.footerStyle, customizePrefixCls = props.prefixCls, customizeGetContainer = props.getContainer, extra = props.extra, afterVisibleChange = props.afterVisibleChange, _afterOpenChange = props.afterOpenChange, rest = __rest$o(props, ["width", "height", "size", "closable", "mask", "push", "closeIcon", "bodyStyle", "drawerStyle", "className", "visible", "open", "children", "style", "title", "headerStyle", "onClose", "footer", "footerStyle", "prefixCls", "getContainer", "extra", "afterVisibleChange", "afterOpenChange"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPopupContainer = _React$useContext.getPopupContainer, getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var prefixCls = getPrefixCls("drawer", customizePrefixCls);
var getContainer2 = customizeGetContainer === void 0 && getPopupContainer ? function() {
return getPopupContainer(document.body);
} : customizeGetContainer;
var closeIconNode = closable && /* @__PURE__ */ jsx("button", {
type: "button",
onClick: onClose,
"aria-label": "Close",
className: "".concat(prefixCls, "-close"),
children: closeIcon
});
[["visible", "open"], ["afterVisibleChange", "afterOpenChange"]].forEach(function(_ref) {
var _ref2 = _slicedToArray$e(_ref, 2);
_ref2[0];
_ref2[1];
});
function renderHeader() {
if (!title && !closable) {
return null;
}
return /* @__PURE__ */ jsxs("div", {
className: classnames("".concat(prefixCls, "-header"), _defineProperty$b({}, "".concat(prefixCls, "-header-close-only"), closable && !title && !extra)),
style: headerStyle,
children: [/* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-header-title"),
children: [closeIconNode, title && /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-title"),
children: title
})]
}), extra && /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-extra"),
children: extra
})]
});
}
function renderFooter() {
if (!footer) {
return null;
}
var footerClassName = "".concat(prefixCls, "-footer");
return /* @__PURE__ */ jsx("div", {
className: footerClassName,
style: footerStyle,
children: footer
});
}
var drawerClassName = classnames(_defineProperty$b({
"no-mask": !mask
}, "".concat(prefixCls, "-rtl"), direction === "rtl"), className);
var mergedWidth = React__namespace.useMemo(function() {
return width !== null && width !== void 0 ? width : size === "large" ? 736 : 378;
}, [width, size]);
var mergedHeight = React__namespace.useMemo(function() {
return height !== null && height !== void 0 ? height : size === "large" ? 736 : 378;
}, [height, size]);
var maskMotion = {
motionName: getTransitionName(prefixCls, "mask-motion"),
motionAppear: true,
motionEnter: true,
motionLeave: true,
motionDeadline: 500
};
var panelMotion = function panelMotion2(motionPlacement) {
return {
motionName: getTransitionName(prefixCls, "panel-motion-".concat(motionPlacement)),
motionAppear: true,
motionEnter: true,
motionLeave: true,
motionDeadline: 500
};
};
return /* @__PURE__ */ jsx(NoCompactStyle, {
children: /* @__PURE__ */ jsx(NoFormStyle, {
status: true,
override: true,
children: /* @__PURE__ */ jsx(Drawer$1, {
prefixCls,
onClose,
...rest,
open: open !== null && open !== void 0 ? open : visible,
mask,
push,
width: mergedWidth,
height: mergedHeight,
rootClassName: drawerClassName,
getContainer: getContainer2,
afterOpenChange: function afterOpenChange(isOpen) {
_afterOpenChange === null || _afterOpenChange === void 0 ? void 0 : _afterOpenChange(isOpen);
afterVisibleChange === null || afterVisibleChange === void 0 ? void 0 : afterVisibleChange(isOpen);
},
maskMotion,
motion: panelMotion,
rootStyle: style2,
children: /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-wrapper-body"),
style: _extends$3({}, drawerStyle),
children: [renderHeader(), /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-body"),
style: bodyStyle,
children
}), renderFooter()]
})
})
})
});
}
function useDebounce(value) {
var _React$useState = React__namespace.useState(value), _React$useState2 = _slicedToArray$e(_React$useState, 2), cacheValue = _React$useState2[0], setCacheValue = _React$useState2[1];
React__namespace.useEffect(function() {
var timeout = setTimeout(function() {
setCacheValue(value);
}, value.length ? 0 : 10);
return function() {
clearTimeout(timeout);
};
}, [value]);
return cacheValue;
}
var EMPTY_LIST$2 = [];
function toErrorEntity(error, errorStatus, prefix) {
var index2 = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : 0;
return {
key: typeof error === "string" ? error : "".concat(prefix, "-").concat(index2),
error,
errorStatus
};
}
function ErrorList(_ref) {
var help = _ref.help, helpStatus = _ref.helpStatus, _ref$errors = _ref.errors, errors = _ref$errors === void 0 ? EMPTY_LIST$2 : _ref$errors, _ref$warnings = _ref.warnings, warnings = _ref$warnings === void 0 ? EMPTY_LIST$2 : _ref$warnings, rootClassName = _ref.className, fieldId = _ref.fieldId, onVisibleChanged = _ref.onVisibleChanged;
var _React$useContext = React__namespace.useContext(FormItemPrefixContext), prefixCls = _React$useContext.prefixCls;
var _React$useContext2 = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext2.getPrefixCls;
var baseClassName = "".concat(prefixCls, "-item-explain");
var rootPrefixCls = getPrefixCls();
var debounceErrors = useDebounce(errors);
var debounceWarnings = useDebounce(warnings);
var fullKeyList = React__namespace.useMemo(function() {
if (help !== void 0 && help !== null) {
return [toErrorEntity(help, helpStatus, "help")];
}
return [].concat(_toConsumableArray$c(debounceErrors.map(function(error, index2) {
return toErrorEntity(error, "error", "error", index2);
})), _toConsumableArray$c(debounceWarnings.map(function(warning2, index2) {
return toErrorEntity(warning2, "warning", "warning", index2);
})));
}, [help, helpStatus, debounceErrors, debounceWarnings]);
var helpProps = {};
if (fieldId) {
helpProps.id = "".concat(fieldId, "_help");
}
return /* @__PURE__ */ jsx(CSSMotion, {
motionDeadline: collapseMotion$1.motionDeadline,
motionName: "".concat(rootPrefixCls, "-show-help"),
visible: !!fullKeyList.length,
onVisibleChanged,
children: function(holderProps) {
var holderClassName = holderProps.className, holderStyle = holderProps.style;
return /* @__PURE__ */ jsx("div", {
...helpProps,
className: classnames(baseClassName, holderClassName, rootClassName),
style: holderStyle,
role: "alert",
children: /* @__PURE__ */ jsx(CSSMotionList, {
keys: fullKeyList,
...collapseMotion$1,
motionName: "".concat(rootPrefixCls, "-show-help-item"),
component: false,
children: function(itemProps) {
var key2 = itemProps.key, error = itemProps.error, errorStatus = itemProps.errorStatus, itemClassName = itemProps.className, itemStyle = itemProps.style;
return /* @__PURE__ */ jsx("div", {
className: classnames(itemClassName, _defineProperty$b({}, "".concat(baseClassName, "-").concat(errorStatus), errorStatus)),
style: itemStyle,
children: error
}, key2);
}
})
});
}
});
}
function t$2(t2) {
return "object" == typeof t2 && null != t2 && 1 === t2.nodeType;
}
function e$1(t2, e2) {
return (!e2 || "hidden" !== t2) && "visible" !== t2 && "clip" !== t2;
}
function n$2(t2, n2) {
if (t2.clientHeight < t2.scrollHeight || t2.clientWidth < t2.scrollWidth) {
var r2 = getComputedStyle(t2, null);
return e$1(r2.overflowY, n2) || e$1(r2.overflowX, n2) || function(t3) {
var e2 = function(t4) {
if (!t4.ownerDocument || !t4.ownerDocument.defaultView)
return null;
try {
return t4.ownerDocument.defaultView.frameElement;
} catch (t5) {
return null;
}
}(t3);
return !!e2 && (e2.clientHeight < t3.scrollHeight || e2.clientWidth < t3.scrollWidth);
}(t2);
}
return false;
}
function r$2(t2, e2, n2, r2, i2, o, l2, d2) {
return o < t2 && l2 > e2 || o > t2 && l2 < e2 ? 0 : o <= t2 && d2 <= n2 || l2 >= e2 && d2 >= n2 ? o - t2 - r2 : l2 > e2 && d2 < n2 || o < t2 && d2 > n2 ? l2 - e2 + i2 : 0;
}
var i$1 = function(e2, i2) {
var o = window, l2 = i2.scrollMode, d2 = i2.block, f2 = i2.inline, h2 = i2.boundary, u2 = i2.skipOverflowHiddenElements, s = "function" == typeof h2 ? h2 : function(t2) {
return t2 !== h2;
};
if (!t$2(e2))
throw new TypeError("Invalid target");
for (var a, c2, g2 = document.scrollingElement || document.documentElement, p2 = [], m2 = e2; t$2(m2) && s(m2); ) {
if ((m2 = null == (c2 = (a = m2).parentElement) ? a.getRootNode().host || null : c2) === g2) {
p2.push(m2);
break;
}
null != m2 && m2 === document.body && n$2(m2) && !n$2(document.documentElement) || null != m2 && n$2(m2, u2) && p2.push(m2);
}
for (var w2 = o.visualViewport ? o.visualViewport.width : innerWidth, v2 = o.visualViewport ? o.visualViewport.height : innerHeight, W = window.scrollX || pageXOffset, H = window.scrollY || pageYOffset, b2 = e2.getBoundingClientRect(), y2 = b2.height, E = b2.width, M = b2.top, V = b2.right, x2 = b2.bottom, I = b2.left, C = "start" === d2 || "nearest" === d2 ? M : "end" === d2 ? x2 : M + y2 / 2, R = "center" === f2 ? I + E / 2 : "end" === f2 ? V : I, T = [], k2 = 0; k2 < p2.length; k2++) {
var B = p2[k2], D = B.getBoundingClientRect(), O = D.height, X = D.width, Y = D.top, L = D.right, S = D.bottom, j2 = D.left;
if ("if-needed" === l2 && M >= 0 && I >= 0 && x2 <= v2 && V <= w2 && M >= Y && x2 <= S && I >= j2 && V <= L)
return T;
var N = getComputedStyle(B), q2 = parseInt(N.borderLeftWidth, 10), z2 = parseInt(N.borderTopWidth, 10), A2 = parseInt(N.borderRightWidth, 10), F = parseInt(N.borderBottomWidth, 10), G = 0, J = 0, K = "offsetWidth" in B ? B.offsetWidth - B.clientWidth - q2 - A2 : 0, P = "offsetHeight" in B ? B.offsetHeight - B.clientHeight - z2 - F : 0, Q = "offsetWidth" in B ? 0 === B.offsetWidth ? 0 : X / B.offsetWidth : 0, U = "offsetHeight" in B ? 0 === B.offsetHeight ? 0 : O / B.offsetHeight : 0;
if (g2 === B)
G = "start" === d2 ? C : "end" === d2 ? C - v2 : "nearest" === d2 ? r$2(H, H + v2, v2, z2, F, H + C, H + C + y2, y2) : C - v2 / 2, J = "start" === f2 ? R : "center" === f2 ? R - w2 / 2 : "end" === f2 ? R - w2 : r$2(W, W + w2, w2, q2, A2, W + R, W + R + E, E), G = Math.max(0, G + H), J = Math.max(0, J + W);
else {
G = "start" === d2 ? C - Y - z2 : "end" === d2 ? C - S + F + P : "nearest" === d2 ? r$2(Y, S, O, z2, F + P, C, C + y2, y2) : C - (Y + O / 2) + P / 2, J = "start" === f2 ? R - j2 - q2 : "center" === f2 ? R - (j2 + X / 2) + K / 2 : "end" === f2 ? R - L + A2 + K : r$2(j2, L, X, q2, A2 + K, R, R + E, E);
var Z = B.scrollLeft, $ = B.scrollTop;
C += $ - (G = Math.max(0, Math.min($ + G / U, B.scrollHeight - O / U + P))), R += Z - (J = Math.max(0, Math.min(Z + J / Q, B.scrollWidth - X / Q + K)));
}
T.push({ el: B, top: G, left: J });
}
return T;
};
function isOptionsObject(options) {
return options === Object(options) && Object.keys(options).length !== 0;
}
function defaultBehavior(actions, behavior) {
if (behavior === void 0) {
behavior = "auto";
}
var canSmoothScroll = "scrollBehavior" in document.body.style;
actions.forEach(function(_ref) {
var el = _ref.el, top = _ref.top, left = _ref.left;
if (el.scroll && canSmoothScroll) {
el.scroll({
top,
left,
behavior
});
} else {
el.scrollTop = top;
el.scrollLeft = left;
}
});
}
function getOptions(options) {
if (options === false) {
return {
block: "end",
inline: "nearest"
};
}
if (isOptionsObject(options)) {
return options;
}
return {
block: "start",
inline: "nearest"
};
}
function scrollIntoView(target, options) {
var isTargetAttached = target.isConnected || target.ownerDocument.documentElement.contains(target);
if (isOptionsObject(options) && typeof options.behavior === "function") {
return options.behavior(isTargetAttached ? i$1(target, options) : []);
}
if (!isTargetAttached) {
return;
}
var computeOptions = getOptions(options);
return defaultBehavior(i$1(target, computeOptions), computeOptions.behavior);
}
var formItemNameBlackList = ["parentNode"];
var defaultItemNamePrefixCls = "form_item";
function toArray$4(candidate) {
if (candidate === void 0 || candidate === false)
return [];
return Array.isArray(candidate) ? candidate : [candidate];
}
function getFieldId(namePath, formName) {
if (!namePath.length)
return void 0;
var mergedId = namePath.join("_");
if (formName) {
return "".concat(formName, "_").concat(mergedId);
}
var isIllegalName = formItemNameBlackList.includes(mergedId);
return isIllegalName ? "".concat(defaultItemNamePrefixCls, "_").concat(mergedId) : mergedId;
}
function toNamePathStr(name2) {
var namePath = toArray$4(name2);
return namePath.join("_");
}
function useForm$1(form) {
var _useRcForm = useForm$2(), _useRcForm2 = _slicedToArray$e(_useRcForm, 1), rcForm = _useRcForm2[0];
var itemsRef = React__namespace.useRef({});
var wrapForm = React__namespace.useMemo(function() {
return form !== null && form !== void 0 ? form : _extends$3(_extends$3({}, rcForm), {
__INTERNAL__: {
itemRef: function itemRef(name2) {
return function(node) {
var namePathStr = toNamePathStr(name2);
if (node) {
itemsRef.current[namePathStr] = node;
} else {
delete itemsRef.current[namePathStr];
}
};
}
},
scrollToField: function scrollToField(name2) {
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var namePath = toArray$4(name2);
var fieldId = getFieldId(namePath, wrapForm.__INTERNAL__.name);
var node = fieldId ? document.getElementById(fieldId) : null;
if (node) {
scrollIntoView(node, _extends$3({
scrollMode: "if-needed",
block: "nearest"
}, options));
}
},
getFieldInstance: function getFieldInstance(name2) {
var namePathStr = toNamePathStr(name2);
return itemsRef.current[namePathStr];
}
});
}, [form, rcForm]);
return [wrapForm];
}
var __rest$n = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var InternalForm = function InternalForm2(props, ref) {
var _classNames;
var contextSize = React__namespace.useContext(SizeContext$1);
var contextDisabled = React__namespace.useContext(DisabledContext$1);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction, contextForm = _React$useContext.form;
var customizePrefixCls = props.prefixCls, _props$className = props.className, className = _props$className === void 0 ? "" : _props$className, _props$size = props.size, size = _props$size === void 0 ? contextSize : _props$size, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? contextDisabled : _props$disabled, form = props.form, colon = props.colon, labelAlign = props.labelAlign, labelWrap = props.labelWrap, labelCol = props.labelCol, wrapperCol = props.wrapperCol, hideRequiredMark = props.hideRequiredMark, _props$layout = props.layout, layout = _props$layout === void 0 ? "horizontal" : _props$layout, scrollToFirstError = props.scrollToFirstError, requiredMark = props.requiredMark, onFinishFailed = props.onFinishFailed, name2 = props.name, restFormProps = __rest$n(props, ["prefixCls", "className", "size", "disabled", "form", "colon", "labelAlign", "labelWrap", "labelCol", "wrapperCol", "hideRequiredMark", "layout", "scrollToFirstError", "requiredMark", "onFinishFailed", "name"]);
var mergedRequiredMark = React$a.useMemo(function() {
if (requiredMark !== void 0) {
return requiredMark;
}
if (contextForm && contextForm.requiredMark !== void 0) {
return contextForm.requiredMark;
}
if (hideRequiredMark) {
return false;
}
return true;
}, [hideRequiredMark, requiredMark, contextForm]);
var mergedColon = colon !== null && colon !== void 0 ? colon : contextForm === null || contextForm === void 0 ? void 0 : contextForm.colon;
var prefixCls = getPrefixCls("form", customizePrefixCls);
var formClassName = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(layout), true), _defineProperty$b(_classNames, "".concat(prefixCls, "-hide-required-mark"), mergedRequiredMark === false), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(size), size), _classNames), className);
var _useForm = useForm$1(form), _useForm2 = _slicedToArray$e(_useForm, 1), wrapForm = _useForm2[0];
var __INTERNAL__ = wrapForm.__INTERNAL__;
__INTERNAL__.name = name2;
var formContextValue = React$a.useMemo(function() {
return {
name: name2,
labelAlign,
labelCol,
labelWrap,
wrapperCol,
vertical: layout === "vertical",
colon: mergedColon,
requiredMark: mergedRequiredMark,
itemRef: __INTERNAL__.itemRef,
form: wrapForm
};
}, [name2, labelAlign, labelCol, wrapperCol, layout, mergedColon, mergedRequiredMark, wrapForm]);
React__namespace.useImperativeHandle(ref, function() {
return wrapForm;
});
var onInternalFinishFailed = function onInternalFinishFailed2(errorInfo) {
onFinishFailed === null || onFinishFailed === void 0 ? void 0 : onFinishFailed(errorInfo);
var defaultScrollToFirstError = {
block: "nearest"
};
if (scrollToFirstError && errorInfo.errorFields.length) {
if (_typeof$q(scrollToFirstError) === "object") {
defaultScrollToFirstError = scrollToFirstError;
}
wrapForm.scrollToField(errorInfo.errorFields[0].name, defaultScrollToFirstError);
}
};
return /* @__PURE__ */ jsx(DisabledContextProvider, {
disabled,
children: /* @__PURE__ */ jsx(SizeContextProvider, {
size,
children: /* @__PURE__ */ jsx(FormContext.Provider, {
value: formContextValue,
children: /* @__PURE__ */ jsx(RefForm, {
id: name2,
...restFormProps,
name: name2,
onFinishFailed: onInternalFinishFailed,
form: wrapForm,
className: formClassName
})
})
})
});
};
var Form$1 = /* @__PURE__ */ React__namespace.forwardRef(InternalForm);
const InternalForm$1 = Form$1;
var useFormItemStatus = function useFormItemStatus2() {
var _useContext = React$a.useContext(FormItemInputContext), status = _useContext.status;
return {
status
};
};
const useFormItemStatus$1 = useFormItemStatus;
function useFrameState(defaultValue) {
var _React$useState = React__namespace.useState(defaultValue), _React$useState2 = _slicedToArray$e(_React$useState, 2), value = _React$useState2[0], setValue2 = _React$useState2[1];
var frameRef = React$a.useRef(null);
var batchRef = React$a.useRef([]);
var destroyRef = React$a.useRef(false);
React__namespace.useEffect(function() {
destroyRef.current = false;
return function() {
destroyRef.current = true;
wrapperRaf$1.cancel(frameRef.current);
frameRef.current = null;
};
}, []);
function setFrameValue(updater) {
if (destroyRef.current) {
return;
}
if (frameRef.current === null) {
batchRef.current = [];
frameRef.current = wrapperRaf$1(function() {
frameRef.current = null;
setValue2(function(prevValue) {
var current = prevValue;
batchRef.current.forEach(function(func) {
current = func(current);
});
return current;
});
});
}
batchRef.current.push(updater);
}
return [value, setFrameValue];
}
function useItemRef() {
var _React$useContext = React__namespace.useContext(FormContext), itemRef = _React$useContext.itemRef;
var cacheRef = React__namespace.useRef({});
function getRef(name2, children) {
var childrenRef = children && _typeof$q(children) === "object" && children.ref;
var nameStr = name2.join("_");
if (cacheRef.current.name !== nameStr || cacheRef.current.originRef !== childrenRef) {
cacheRef.current.name = nameStr;
cacheRef.current.originRef = childrenRef;
cacheRef.current.ref = composeRef(itemRef(name2), childrenRef);
}
return cacheRef.current.ref;
}
return getRef;
}
var QuestionCircleOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z" } }, { "tag": "path", "attrs": { "d": "M623.6 316.7C593.6 290.4 554 276 512 276s-81.6 14.5-111.6 40.7C369.2 344 352 380.7 352 420v7.6c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V420c0-44.1 43.1-80 96-80s96 35.9 96 80c0 31.1-22 59.6-56.1 72.7-21.2 8.1-39.2 22.3-52.1 40.9-13.1 19-19.9 41.8-19.9 64.9V620c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-22.7a48.3 48.3 0 0130.9-44.8c59-22.7 97.1-74.7 97.1-132.5.1-39.3-17.1-76-48.3-103.3zM472 732a40 40 0 1080 0 40 40 0 10-80 0z" } }] }, "name": "question-circle", "theme": "outlined" };
const QuestionCircleOutlinedSvg = QuestionCircleOutlined$2;
var QuestionCircleOutlined = function QuestionCircleOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: QuestionCircleOutlinedSvg
})
});
};
QuestionCircleOutlined.displayName = "QuestionCircleOutlined";
const QuestionCircleOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(QuestionCircleOutlined);
var __rest$m = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
function toTooltipProps(tooltip) {
if (!tooltip) {
return null;
}
if (_typeof$q(tooltip) === "object" && !/* @__PURE__ */ React__namespace.isValidElement(tooltip)) {
return tooltip;
}
return {
title: tooltip
};
}
var FormItemLabel = function FormItemLabel2(_ref) {
var prefixCls = _ref.prefixCls, label = _ref.label, htmlFor = _ref.htmlFor, labelCol = _ref.labelCol, labelAlign = _ref.labelAlign, colon = _ref.colon, required2 = _ref.required, requiredMark = _ref.requiredMark, tooltip = _ref.tooltip;
var _useLocaleReceiver = useLocaleReceiver("Form"), _useLocaleReceiver2 = _slicedToArray$e(_useLocaleReceiver, 1), formLocale = _useLocaleReceiver2[0];
if (!label)
return null;
return /* @__PURE__ */ jsx(FormContext.Consumer, {
children: function(_ref2) {
var _classNames2;
var vertical = _ref2.vertical, contextLabelAlign = _ref2.labelAlign, contextLabelCol = _ref2.labelCol, labelWrap = _ref2.labelWrap, contextColon = _ref2.colon;
var _a;
var mergedLabelCol = labelCol || contextLabelCol || {};
var mergedLabelAlign = labelAlign || contextLabelAlign;
var labelClsBasic = "".concat(prefixCls, "-item-label");
var labelColClassName = classnames(labelClsBasic, mergedLabelAlign === "left" && "".concat(labelClsBasic, "-left"), mergedLabelCol.className, _defineProperty$b({}, "".concat(labelClsBasic, "-wrap"), !!labelWrap));
var labelChildren = label;
var computedColon = colon === true || contextColon !== false && colon !== false;
var haveColon = computedColon && !vertical;
if (haveColon && typeof label === "string" && label.trim() !== "") {
labelChildren = label.replace(/[:|:]\s*$/, "");
}
var tooltipProps = toTooltipProps(tooltip);
if (tooltipProps) {
var _tooltipProps$icon = tooltipProps.icon, icon = _tooltipProps$icon === void 0 ? /* @__PURE__ */ jsx(QuestionCircleOutlined$1, {}) : _tooltipProps$icon, restTooltipProps = __rest$m(tooltipProps, ["icon"]);
var tooltipNode = /* @__PURE__ */ jsx(_Tooltip, {
...restTooltipProps,
children: /* @__PURE__ */ React__namespace.cloneElement(icon, {
className: "".concat(prefixCls, "-item-tooltip"),
title: ""
})
});
labelChildren = /* @__PURE__ */ jsxs(Fragment, {
children: [labelChildren, tooltipNode]
});
}
if (requiredMark === "optional" && !required2) {
labelChildren = /* @__PURE__ */ jsxs(Fragment, {
children: [labelChildren, /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-item-optional"),
title: "",
children: (formLocale === null || formLocale === void 0 ? void 0 : formLocale.optional) || ((_a = defaultLocale.Form) === null || _a === void 0 ? void 0 : _a.optional)
})]
});
}
var labelClassName = classnames((_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-item-required"), required2), _defineProperty$b(_classNames2, "".concat(prefixCls, "-item-required-mark-optional"), requiredMark === "optional"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-item-no-colon"), !computedColon), _classNames2));
return /* @__PURE__ */ jsx(Col$1, {
...mergedLabelCol,
className: labelColClassName,
children: /* @__PURE__ */ jsx("label", {
htmlFor,
className: labelClassName,
title: typeof label === "string" ? label : "",
children: labelChildren
})
});
}
}, "label");
};
const FormItemLabel$1 = FormItemLabel;
var FormItemInput = function FormItemInput2(props) {
var prefixCls = props.prefixCls, status = props.status, wrapperCol = props.wrapperCol, children = props.children, errors = props.errors, warnings = props.warnings, formItemRender = props._internalItemRender, extra = props.extra, help = props.help, fieldId = props.fieldId, marginBottom = props.marginBottom, onErrorVisibleChanged = props.onErrorVisibleChanged;
var baseClassName = "".concat(prefixCls, "-item");
var formContext = React__namespace.useContext(FormContext);
var mergedWrapperCol = wrapperCol || formContext.wrapperCol || {};
var className = classnames("".concat(baseClassName, "-control"), mergedWrapperCol.className);
var subFormContext = React__namespace.useMemo(function() {
return _extends$3({}, formContext);
}, [formContext]);
delete subFormContext.labelCol;
delete subFormContext.wrapperCol;
var inputDom = /* @__PURE__ */ jsx("div", {
className: "".concat(baseClassName, "-control-input"),
children: /* @__PURE__ */ jsx("div", {
className: "".concat(baseClassName, "-control-input-content"),
children
})
});
var formItemContext = React__namespace.useMemo(function() {
return {
prefixCls,
status
};
}, [prefixCls, status]);
var errorListDom = marginBottom !== null || errors.length || warnings.length ? /* @__PURE__ */ jsxs("div", {
style: {
display: "flex",
flexWrap: "nowrap"
},
children: [/* @__PURE__ */ jsx(FormItemPrefixContext.Provider, {
value: formItemContext,
children: /* @__PURE__ */ jsx(ErrorList, {
fieldId,
errors,
warnings,
help,
helpStatus: status,
className: "".concat(baseClassName, "-explain-connected"),
onVisibleChanged: onErrorVisibleChanged
})
}), !!marginBottom && /* @__PURE__ */ jsx("div", {
style: {
width: 0,
height: marginBottom
}
})]
}) : null;
var extraProps = {};
if (fieldId) {
extraProps.id = "".concat(fieldId, "_extra");
}
var extraDom = extra ? /* @__PURE__ */ jsx("div", {
...extraProps,
className: "".concat(baseClassName, "-extra"),
children: extra
}) : null;
var dom = formItemRender && formItemRender.mark === "pro_table_render" && formItemRender.render ? formItemRender.render(props, {
input: inputDom,
errorList: errorListDom,
extra: extraDom
}) : /* @__PURE__ */ jsxs(Fragment, {
children: [inputDom, errorListDom, extraDom]
});
return /* @__PURE__ */ jsx(FormContext.Provider, {
value: subFormContext,
children: /* @__PURE__ */ jsx(Col$1, {
...mergedWrapperCol,
className,
children: dom
})
});
};
const FormItemInput$1 = FormItemInput;
var __rest$l = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var iconMap = {
success: CheckCircleFilled$1,
warning: ExclamationCircleFilled$1,
error: CloseCircleFilled$1,
validating: LoadingOutlined$1
};
function ItemHolder(props) {
var _itemClassName;
var prefixCls = props.prefixCls, className = props.className, style2 = props.style, help = props.help, errors = props.errors, warnings = props.warnings, validateStatus = props.validateStatus, meta2 = props.meta, hasFeedback = props.hasFeedback, hidden = props.hidden, children = props.children, fieldId = props.fieldId, isRequired = props.isRequired, onSubItemMetaChange = props.onSubItemMetaChange, restProps = __rest$l(props, ["prefixCls", "className", "style", "help", "errors", "warnings", "validateStatus", "meta", "hasFeedback", "hidden", "children", "fieldId", "isRequired", "onSubItemMetaChange"]);
var itemPrefixCls = "".concat(prefixCls, "-item");
var _React$useContext = React__namespace.useContext(FormContext), requiredMark = _React$useContext.requiredMark;
var itemRef = React__namespace.useRef(null);
var debounceErrors = useDebounce(errors);
var debounceWarnings = useDebounce(warnings);
var hasHelp = help !== void 0 && help !== null;
var hasError = !!(hasHelp || errors.length || warnings.length);
var _React$useState = React__namespace.useState(null), _React$useState2 = _slicedToArray$e(_React$useState, 2), marginBottom = _React$useState2[0], setMarginBottom = _React$useState2[1];
useLayoutEffect$1(function() {
if (hasError && itemRef.current) {
var itemStyle = getComputedStyle(itemRef.current);
setMarginBottom(parseInt(itemStyle.marginBottom, 10));
}
}, [hasError]);
var onErrorVisibleChanged = function onErrorVisibleChanged2(nextVisible) {
if (!nextVisible) {
setMarginBottom(null);
}
};
var mergedValidateStatus = "";
if (validateStatus !== void 0) {
mergedValidateStatus = validateStatus;
} else if (meta2.validating) {
mergedValidateStatus = "validating";
} else if (debounceErrors.length) {
mergedValidateStatus = "error";
} else if (debounceWarnings.length) {
mergedValidateStatus = "warning";
} else if (meta2.touched) {
mergedValidateStatus = "success";
}
var formItemStatusContext = React__namespace.useMemo(function() {
var feedbackIcon;
if (hasFeedback) {
var IconNode = mergedValidateStatus && iconMap[mergedValidateStatus];
feedbackIcon = IconNode ? /* @__PURE__ */ jsx("span", {
className: classnames("".concat(itemPrefixCls, "-feedback-icon"), "".concat(itemPrefixCls, "-feedback-icon-").concat(mergedValidateStatus)),
children: /* @__PURE__ */ jsx(IconNode, {})
}) : null;
}
return {
status: mergedValidateStatus,
hasFeedback,
feedbackIcon,
isFormItemInput: true
};
}, [mergedValidateStatus, hasFeedback]);
var itemClassName = (_itemClassName = {}, _defineProperty$b(_itemClassName, itemPrefixCls, true), _defineProperty$b(_itemClassName, "".concat(itemPrefixCls, "-with-help"), hasHelp || debounceErrors.length || debounceWarnings.length), _defineProperty$b(_itemClassName, "".concat(className), !!className), _defineProperty$b(_itemClassName, "".concat(itemPrefixCls, "-has-feedback"), mergedValidateStatus && hasFeedback), _defineProperty$b(_itemClassName, "".concat(itemPrefixCls, "-has-success"), mergedValidateStatus === "success"), _defineProperty$b(_itemClassName, "".concat(itemPrefixCls, "-has-warning"), mergedValidateStatus === "warning"), _defineProperty$b(_itemClassName, "".concat(itemPrefixCls, "-has-error"), mergedValidateStatus === "error"), _defineProperty$b(_itemClassName, "".concat(itemPrefixCls, "-is-validating"), mergedValidateStatus === "validating"), _defineProperty$b(_itemClassName, "".concat(itemPrefixCls, "-hidden"), hidden), _itemClassName);
return /* @__PURE__ */ jsxs("div", {
className: classnames(itemClassName),
style: style2,
ref: itemRef,
children: [/* @__PURE__ */ jsxs(Row$1, {
className: "".concat(itemPrefixCls, "-row"),
...omit(restProps, ["_internalItemRender", "colon", "dependencies", "extra", "fieldKey", "getValueFromEvent", "getValueProps", "htmlFor", "id", "initialValue", "isListField", "label", "labelAlign", "labelCol", "labelWrap", "messageVariables", "name", "normalize", "noStyle", "preserve", "required", "requiredMark", "rules", "shouldUpdate", "trigger", "tooltip", "validateFirst", "validateTrigger", "valuePropName", "wrapperCol"]),
children: [/* @__PURE__ */ jsx(FormItemLabel$1, {
htmlFor: fieldId,
required: isRequired,
requiredMark,
...props,
prefixCls
}), /* @__PURE__ */ jsx(FormItemInput$1, {
...props,
...meta2,
errors: debounceErrors,
warnings: debounceWarnings,
prefixCls,
status: mergedValidateStatus,
help,
marginBottom,
onErrorVisibleChanged,
children: /* @__PURE__ */ jsx(NoStyleItemContext.Provider, {
value: onSubItemMetaChange,
children: /* @__PURE__ */ jsx(FormItemInputContext.Provider, {
value: formItemStatusContext,
children
})
})
})]
}), !!marginBottom && /* @__PURE__ */ jsx("div", {
className: "".concat(itemPrefixCls, "-margin-offset"),
style: {
marginBottom: -marginBottom
}
})]
});
}
var NAME_SPLIT = "__SPLIT__";
tuple$1("success", "warning", "error", "validating", "");
var MemoInput = /* @__PURE__ */ React__namespace.memo(function(_ref) {
var children = _ref.children;
return children;
}, function(prev, next) {
return prev.value === next.value && prev.update === next.update && prev.childProps.length === next.childProps.length && prev.childProps.every(function(value, index2) {
return value === next.childProps[index2];
});
});
function hasValidName(name2) {
return !(name2 === void 0 || name2 === null);
}
function genEmptyMeta() {
return {
errors: [],
warnings: [],
touched: false,
validating: false,
name: []
};
}
function InternalFormItem(props) {
var name2 = props.name, noStyle = props.noStyle, dependencies = props.dependencies, customizePrefixCls = props.prefixCls, shouldUpdate = props.shouldUpdate, rules2 = props.rules, children = props.children, required2 = props.required, label = props.label, messageVariables = props.messageVariables, _props$trigger = props.trigger, trigger = _props$trigger === void 0 ? "onChange" : _props$trigger, validateTrigger = props.validateTrigger, hidden = props.hidden;
var _useContext = React$a.useContext(ConfigContext$1), getPrefixCls = _useContext.getPrefixCls;
var _useContext2 = React$a.useContext(FormContext), formName = _useContext2.name;
var isRenderProps = typeof children === "function";
var notifyParentMetaChange = React$a.useContext(NoStyleItemContext);
var _useContext3 = React$a.useContext(Context$2), contextValidateTrigger = _useContext3.validateTrigger;
var mergedValidateTrigger = validateTrigger !== void 0 ? validateTrigger : contextValidateTrigger;
var hasName = hasValidName(name2);
var prefixCls = getPrefixCls("form", customizePrefixCls);
var listContext = React__namespace.useContext(ListContext);
var fieldKeyPathRef = React__namespace.useRef();
var _useFrameState = useFrameState({}), _useFrameState2 = _slicedToArray$e(_useFrameState, 2), subFieldErrors = _useFrameState2[0], setSubFieldErrors = _useFrameState2[1];
var _useState = useSafeState(function() {
return genEmptyMeta();
}), _useState2 = _slicedToArray$e(_useState, 2), meta2 = _useState2[0], setMeta2 = _useState2[1];
var onMetaChange = function onMetaChange2(nextMeta) {
var keyInfo = listContext === null || listContext === void 0 ? void 0 : listContext.getKey(nextMeta.name);
setMeta2(nextMeta.destroy ? genEmptyMeta() : nextMeta, true);
if (noStyle && notifyParentMetaChange) {
var namePath = nextMeta.name;
if (!nextMeta.destroy) {
if (keyInfo !== void 0) {
var _keyInfo = _slicedToArray$e(keyInfo, 2), fieldKey = _keyInfo[0], restPath = _keyInfo[1];
namePath = [fieldKey].concat(_toConsumableArray$c(restPath));
fieldKeyPathRef.current = namePath;
}
} else {
namePath = fieldKeyPathRef.current || namePath;
}
notifyParentMetaChange(nextMeta, namePath);
}
};
var onSubItemMetaChange = function onSubItemMetaChange2(subMeta, uniqueKeys) {
setSubFieldErrors(function(prevSubFieldErrors) {
var clone = _extends$3({}, prevSubFieldErrors);
var mergedNamePath = [].concat(_toConsumableArray$c(subMeta.name.slice(0, -1)), _toConsumableArray$c(uniqueKeys));
var mergedNameKey = mergedNamePath.join(NAME_SPLIT);
if (subMeta.destroy) {
delete clone[mergedNameKey];
} else {
clone[mergedNameKey] = subMeta;
}
return clone;
});
};
var _React$useMemo = React__namespace.useMemo(function() {
var errorList = _toConsumableArray$c(meta2.errors);
var warningList = _toConsumableArray$c(meta2.warnings);
Object.values(subFieldErrors).forEach(function(subFieldError) {
errorList.push.apply(errorList, _toConsumableArray$c(subFieldError.errors || []));
warningList.push.apply(warningList, _toConsumableArray$c(subFieldError.warnings || []));
});
return [errorList, warningList];
}, [subFieldErrors, meta2.errors, meta2.warnings]), _React$useMemo2 = _slicedToArray$e(_React$useMemo, 2), mergedErrors = _React$useMemo2[0], mergedWarnings = _React$useMemo2[1];
var getItemRef = useItemRef();
function renderLayout(baseChildren, fieldId, isRequired) {
if (noStyle && !hidden) {
return baseChildren;
}
return /* @__PURE__ */ jsx(ItemHolder, {
...props,
prefixCls,
fieldId,
isRequired,
errors: mergedErrors,
warnings: mergedWarnings,
meta: meta2,
onSubItemMetaChange,
children: baseChildren
}, "row");
}
if (!hasName && !isRenderProps && !dependencies) {
return renderLayout(children);
}
var variables = {};
if (typeof label === "string") {
variables.label = label;
} else if (name2) {
variables.label = String(name2);
}
if (messageVariables) {
variables = _extends$3(_extends$3({}, variables), messageVariables);
}
return /* @__PURE__ */ jsx(WrapperField, {
...props,
messageVariables: variables,
trigger,
validateTrigger: mergedValidateTrigger,
onMetaChange,
children: function(control, renderMeta, context2) {
var mergedName = toArray$4(name2).length && renderMeta ? renderMeta.name : [];
var fieldId = getFieldId(mergedName, formName);
var isRequired = required2 !== void 0 ? required2 : !!(rules2 && rules2.some(function(rule) {
if (rule && _typeof$q(rule) === "object" && rule.required && !rule.warningOnly) {
return true;
}
if (typeof rule === "function") {
var ruleEntity = rule(context2);
return ruleEntity && ruleEntity.required && !ruleEntity.warningOnly;
}
return false;
}));
var mergedControl = _extends$3({}, control);
var childNode = null;
if (Array.isArray(children) && hasName) {
childNode = children;
} else if (isRenderProps && (!(shouldUpdate || dependencies) || hasName))
;
else if (dependencies && !isRenderProps && !hasName)
;
else if (isValidElement(children)) {
var childProps = _extends$3(_extends$3({}, children.props), mergedControl);
if (!childProps.id) {
childProps.id = fieldId;
}
if (props.help || mergedErrors.length > 0 || mergedWarnings.length > 0 || props.extra) {
var describedbyArr = [];
if (props.help || mergedErrors.length > 0) {
describedbyArr.push("".concat(fieldId, "_help"));
}
if (props.extra) {
describedbyArr.push("".concat(fieldId, "_extra"));
}
childProps["aria-describedby"] = describedbyArr.join(" ");
}
if (mergedErrors.length > 0) {
childProps["aria-invalid"] = "true";
}
if (isRequired) {
childProps["aria-required"] = "true";
}
if (supportRef(children)) {
childProps.ref = getItemRef(mergedName, children);
}
var triggers = new Set([].concat(_toConsumableArray$c(toArray$4(trigger)), _toConsumableArray$c(toArray$4(mergedValidateTrigger))));
triggers.forEach(function(eventName) {
childProps[eventName] = function() {
var _a2, _c2;
var _a, _b, _c;
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
(_a = mergedControl[eventName]) === null || _a === void 0 ? void 0 : (_a2 = _a).call.apply(_a2, [mergedControl].concat(args));
(_c = (_b = children.props)[eventName]) === null || _c === void 0 ? void 0 : (_c2 = _c).call.apply(_c2, [_b].concat(args));
};
});
var watchingChildProps = [childProps["aria-required"], childProps["aria-invalid"], childProps["aria-describedby"]];
childNode = /* @__PURE__ */ jsx(MemoInput, {
value: mergedControl[props.valuePropName || "value"],
update: children,
childProps: watchingChildProps,
children: cloneElement(children, childProps)
});
} else if (isRenderProps && (shouldUpdate || dependencies) && !hasName) {
childNode = children(context2);
} else {
childNode = children;
}
return renderLayout(childNode, fieldId, isRequired);
}
});
}
var FormItem = InternalFormItem;
FormItem.useStatus = useFormItemStatus$1;
const Item = FormItem;
var __rest$k = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var FormList = function FormList2(_a) {
var customizePrefixCls = _a.prefixCls, children = _a.children, props = __rest$k(_a, ["prefixCls", "children"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls("form", customizePrefixCls);
var contextValue = React__namespace.useMemo(function() {
return {
prefixCls,
status: "error"
};
}, [prefixCls]);
return /* @__PURE__ */ jsx(List$2, {
...props,
children: function(fields, operation, meta2) {
return /* @__PURE__ */ jsx(FormItemPrefixContext.Provider, {
value: contextValue,
children: children(fields.map(function(field) {
return _extends$3(_extends$3({}, field), {
fieldKey: field.key
});
}), operation, {
errors: meta2.errors,
warnings: meta2.warnings
})
});
}
});
};
const List = FormList;
function useFormInstance() {
var _useContext = React$a.useContext(FormContext), form = _useContext.form;
return form;
}
var Form = InternalForm$1;
Form.Item = Item;
Form.List = List;
Form.ErrorList = ErrorList;
Form.useForm = useForm$1;
Form.useFormInstance = useFormInstance;
Form.useWatch = useWatch;
Form.Provider = FormProvider;
Form.create = function() {
};
const _Form = Form;
var EyeOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3a60.3 60.3 0 000 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM512 766c-161.3 0-279.4-81.8-362.7-254C232.6 339.8 350.7 258 512 258c161.3 0 279.4 81.8 362.7 254C791.5 684.2 673.4 766 512 766zm-4-430c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm0 288c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z" } }] }, "name": "eye", "theme": "outlined" };
const EyeOutlinedSvg = EyeOutlined$2;
var EyeOutlined = function EyeOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: EyeOutlinedSvg
})
});
};
EyeOutlined.displayName = "EyeOutlined";
const EyeOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(EyeOutlined);
function getClientSize() {
var width = document.documentElement.clientWidth;
var height = window.innerHeight || document.documentElement.clientHeight;
return {
width,
height
};
}
function getOffset$1(node) {
var box = node.getBoundingClientRect();
var docElem = document.documentElement;
return {
left: box.left + (window.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || document.body.clientLeft || 0),
top: box.top + (window.pageYOffset || docElem.scrollTop) - (docElem.clientTop || document.body.clientTop || 0)
};
}
function getUseId() {
var fullClone2 = _objectSpread2$a({}, React__namespace);
return fullClone2.useId;
}
var uuid$2 = 0;
function useId$1(id2) {
var _React$useState = React__namespace.useState("ssr-id"), _React$useState2 = _slicedToArray$e(_React$useState, 2), innerId = _React$useState2[0], setInnerId = _React$useState2[1];
var useOriginId = getUseId();
var reactNativeId = useOriginId === null || useOriginId === void 0 ? void 0 : useOriginId();
React__namespace.useEffect(function() {
if (!useOriginId) {
var nextId = uuid$2;
uuid$2 += 1;
setInnerId("rc_unique_".concat(nextId));
}
}, []);
if (id2) {
return id2;
}
return reactNativeId || innerId;
}
function Mask(props) {
var prefixCls = props.prefixCls, style2 = props.style, visible = props.visible, maskProps = props.maskProps, motionName = props.motionName;
return /* @__PURE__ */ jsx(CSSMotion, {
visible,
motionName,
leavedClassName: "".concat(prefixCls, "-mask-hidden"),
children: function(_ref, ref) {
var motionClassName = _ref.className, motionStyle = _ref.style;
return /* @__PURE__ */ jsx("div", {
ref,
style: _objectSpread2$a(_objectSpread2$a({}, motionStyle), style2),
className: classnames("".concat(prefixCls, "-mask"), motionClassName),
...maskProps
});
}
}, "mask");
}
function getMotionName(prefixCls, transitionName2, animationName) {
var motionName = transitionName2;
if (!motionName && animationName) {
motionName = "".concat(prefixCls, "-").concat(animationName);
}
return motionName;
}
function getScroll$1(w2, top) {
var ret = w2["page".concat(top ? "Y" : "X", "Offset")];
var method2 = "scroll".concat(top ? "Top" : "Left");
if (typeof ret !== "number") {
var d2 = w2.document;
ret = d2.documentElement[method2];
if (typeof ret !== "number") {
ret = d2.body[method2];
}
}
return ret;
}
function offset$1(el) {
var rect = el.getBoundingClientRect();
var pos = {
left: rect.left,
top: rect.top
};
var doc = el.ownerDocument;
var w2 = doc.defaultView || doc.parentWindow;
pos.left += getScroll$1(w2);
pos.top += getScroll$1(w2, true);
return pos;
}
const MemoChildren = /* @__PURE__ */ React__namespace.memo(function(_ref) {
var children = _ref.children;
return children;
}, function(_, _ref2) {
var shouldUpdate = _ref2.shouldUpdate;
return !shouldUpdate;
});
var sentinelStyle = {
width: 0,
height: 0,
overflow: "hidden",
outline: "none"
};
var Panel$3 = /* @__PURE__ */ React__default.default.forwardRef(function(props, ref) {
var prefixCls = props.prefixCls, className = props.className, style2 = props.style, title = props.title, ariaId = props.ariaId, footer = props.footer, closable = props.closable, closeIcon = props.closeIcon, onClose = props.onClose, children = props.children, bodyStyle = props.bodyStyle, bodyProps = props.bodyProps, modalRender = props.modalRender, onMouseDown = props.onMouseDown, onMouseUp = props.onMouseUp, holderRef = props.holderRef, visible = props.visible, forceRender = props.forceRender, width = props.width, height = props.height;
var sentinelStartRef = React$a.useRef();
var sentinelEndRef = React$a.useRef();
React__default.default.useImperativeHandle(ref, function() {
return {
focus: function focus() {
var _sentinelStartRef$cur;
(_sentinelStartRef$cur = sentinelStartRef.current) === null || _sentinelStartRef$cur === void 0 ? void 0 : _sentinelStartRef$cur.focus();
},
changeActive: function changeActive(next) {
var _document = document, activeElement = _document.activeElement;
if (next && activeElement === sentinelEndRef.current) {
sentinelStartRef.current.focus();
} else if (!next && activeElement === sentinelStartRef.current) {
sentinelEndRef.current.focus();
}
}
};
});
var contentStyle = {};
if (width !== void 0) {
contentStyle.width = width;
}
if (height !== void 0) {
contentStyle.height = height;
}
var footerNode;
if (footer) {
footerNode = /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-footer"),
children: footer
});
}
var headerNode;
if (title) {
headerNode = /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-header"),
children: /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-title"),
id: ariaId,
children: title
})
});
}
var closer;
if (closable) {
closer = /* @__PURE__ */ jsx("button", {
type: "button",
onClick: onClose,
"aria-label": "Close",
className: "".concat(prefixCls, "-close"),
children: closeIcon || /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-close-x")
})
});
}
var content = /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-content"),
children: [closer, headerNode, /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-body"),
style: bodyStyle,
...bodyProps,
children
}), footerNode]
});
return /* @__PURE__ */ jsxs("div", {
role: "dialog",
"aria-labelledby": title ? ariaId : null,
"aria-modal": "true",
ref: holderRef,
style: _objectSpread2$a(_objectSpread2$a({}, style2), contentStyle),
className: classnames(prefixCls, className),
onMouseDown,
onMouseUp,
children: [/* @__PURE__ */ jsx("div", {
tabIndex: 0,
ref: sentinelStartRef,
style: sentinelStyle,
"aria-hidden": "true"
}), /* @__PURE__ */ jsx(MemoChildren, {
shouldUpdate: visible || forceRender,
children: modalRender ? modalRender(content) : content
}), /* @__PURE__ */ jsx("div", {
tabIndex: 0,
ref: sentinelEndRef,
style: sentinelStyle,
"aria-hidden": "true"
})]
}, "dialog-element");
});
var Content = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var prefixCls = props.prefixCls, title = props.title, style2 = props.style, className = props.className, visible = props.visible, forceRender = props.forceRender, destroyOnClose = props.destroyOnClose, motionName = props.motionName, ariaId = props.ariaId, onVisibleChanged = props.onVisibleChanged, mousePosition = props.mousePosition;
var dialogRef = React$a.useRef();
var _React$useState = React__namespace.useState(), _React$useState2 = _slicedToArray$e(_React$useState, 2), transformOrigin = _React$useState2[0], setTransformOrigin = _React$useState2[1];
var contentStyle = {};
if (transformOrigin) {
contentStyle.transformOrigin = transformOrigin;
}
function onPrepare() {
var elementOffset = offset$1(dialogRef.current);
setTransformOrigin(mousePosition ? "".concat(mousePosition.x - elementOffset.left, "px ").concat(mousePosition.y - elementOffset.top, "px") : "");
}
return /* @__PURE__ */ jsx(CSSMotion, {
visible,
onVisibleChanged,
onAppearPrepare: onPrepare,
onEnterPrepare: onPrepare,
forceRender,
motionName,
removeOnLeave: destroyOnClose,
ref: dialogRef,
children: function(_ref, motionRef) {
var motionClassName = _ref.className, motionStyle = _ref.style;
return /* @__PURE__ */ jsx(Panel$3, {
...props,
ref,
title,
ariaId,
prefixCls,
holderRef: motionRef,
style: _objectSpread2$a(_objectSpread2$a(_objectSpread2$a({}, motionStyle), style2), contentStyle),
className: classnames(className, motionClassName)
});
}
});
});
Content.displayName = "Content";
function Dialog(props) {
var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-dialog" : _props$prefixCls, zIndex = props.zIndex, _props$visible = props.visible, visible = _props$visible === void 0 ? false : _props$visible, _props$keyboard = props.keyboard, keyboard = _props$keyboard === void 0 ? true : _props$keyboard, _props$focusTriggerAf = props.focusTriggerAfterClose, focusTriggerAfterClose = _props$focusTriggerAf === void 0 ? true : _props$focusTriggerAf, wrapStyle = props.wrapStyle, wrapClassName = props.wrapClassName, wrapProps = props.wrapProps, onClose = props.onClose, afterClose = props.afterClose, transitionName2 = props.transitionName, animation = props.animation, _props$closable = props.closable, closable = _props$closable === void 0 ? true : _props$closable, _props$mask = props.mask, mask = _props$mask === void 0 ? true : _props$mask, maskTransitionName = props.maskTransitionName, maskAnimation = props.maskAnimation, _props$maskClosable = props.maskClosable, maskClosable = _props$maskClosable === void 0 ? true : _props$maskClosable, maskStyle = props.maskStyle, maskProps = props.maskProps, rootClassName = props.rootClassName;
var lastOutSideActiveElementRef = React$a.useRef();
var wrapperRef = React$a.useRef();
var contentRef = React$a.useRef();
var _React$useState = React__namespace.useState(visible), _React$useState2 = _slicedToArray$e(_React$useState, 2), animatedVisible = _React$useState2[0], setAnimatedVisible = _React$useState2[1];
var ariaId = useId$1();
function saveLastOutSideActiveElementRef() {
if (!contains$2(wrapperRef.current, document.activeElement)) {
lastOutSideActiveElementRef.current = document.activeElement;
}
}
function focusDialogContent() {
if (!contains$2(wrapperRef.current, document.activeElement)) {
var _contentRef$current;
(_contentRef$current = contentRef.current) === null || _contentRef$current === void 0 ? void 0 : _contentRef$current.focus();
}
}
function onDialogVisibleChanged(newVisible) {
if (newVisible) {
focusDialogContent();
} else {
setAnimatedVisible(false);
if (mask && lastOutSideActiveElementRef.current && focusTriggerAfterClose) {
try {
lastOutSideActiveElementRef.current.focus({
preventScroll: true
});
} catch (e2) {
}
lastOutSideActiveElementRef.current = null;
}
if (animatedVisible) {
afterClose === null || afterClose === void 0 ? void 0 : afterClose();
}
}
}
function onInternalClose(e2) {
onClose === null || onClose === void 0 ? void 0 : onClose(e2);
}
var contentClickRef = React$a.useRef(false);
var contentTimeoutRef = React$a.useRef();
var onContentMouseDown = function onContentMouseDown2() {
clearTimeout(contentTimeoutRef.current);
contentClickRef.current = true;
};
var onContentMouseUp = function onContentMouseUp2() {
contentTimeoutRef.current = setTimeout(function() {
contentClickRef.current = false;
});
};
var onWrapperClick = null;
if (maskClosable) {
onWrapperClick = function onWrapperClick2(e2) {
if (contentClickRef.current) {
contentClickRef.current = false;
} else if (wrapperRef.current === e2.target) {
onInternalClose(e2);
}
};
}
function onWrapperKeyDown(e2) {
if (keyboard && e2.keyCode === KeyCode.ESC) {
e2.stopPropagation();
onInternalClose(e2);
return;
}
if (visible) {
if (e2.keyCode === KeyCode.TAB) {
contentRef.current.changeActive(!e2.shiftKey);
}
}
}
React$a.useEffect(function() {
if (visible) {
setAnimatedVisible(true);
saveLastOutSideActiveElementRef();
}
}, [visible]);
React$a.useEffect(function() {
return function() {
clearTimeout(contentTimeoutRef.current);
};
}, []);
return /* @__PURE__ */ jsxs("div", {
className: classnames("".concat(prefixCls, "-root"), rootClassName),
...pickAttrs(props, {
data: true
}),
children: [/* @__PURE__ */ jsx(Mask, {
prefixCls,
visible: mask && visible,
motionName: getMotionName(prefixCls, maskTransitionName, maskAnimation),
style: _objectSpread2$a({
zIndex
}, maskStyle),
maskProps
}), /* @__PURE__ */ jsx("div", {
tabIndex: -1,
onKeyDown: onWrapperKeyDown,
className: classnames("".concat(prefixCls, "-wrap"), wrapClassName),
ref: wrapperRef,
onClick: onWrapperClick,
style: _objectSpread2$a(_objectSpread2$a({
zIndex
}, wrapStyle), {}, {
display: !animatedVisible ? "none" : null
}),
...wrapProps,
children: /* @__PURE__ */ jsx(Content, {
...props,
onMouseDown: onContentMouseDown,
onMouseUp: onContentMouseUp,
ref: contentRef,
closable,
ariaId,
prefixCls,
visible: visible && animatedVisible,
onClose: onInternalClose,
onVisibleChanged: onDialogVisibleChanged,
motionName: getMotionName(prefixCls, transitionName2, animation)
})
})]
});
}
var DialogWrap = function DialogWrap2(props) {
var visible = props.visible, getContainer2 = props.getContainer, forceRender = props.forceRender, _props$destroyOnClose = props.destroyOnClose, destroyOnClose = _props$destroyOnClose === void 0 ? false : _props$destroyOnClose, _afterClose = props.afterClose;
var _React$useState = React__namespace.useState(visible), _React$useState2 = _slicedToArray$e(_React$useState, 2), animatedVisible = _React$useState2[0], setAnimatedVisible = _React$useState2[1];
React__namespace.useEffect(function() {
if (visible) {
setAnimatedVisible(true);
}
}, [visible]);
if (!forceRender && destroyOnClose && !animatedVisible) {
return null;
}
return /* @__PURE__ */ jsx(Portal, {
open: visible || forceRender || animatedVisible,
autoDestroy: false,
getContainer: getContainer2,
autoLock: visible || animatedVisible,
children: /* @__PURE__ */ jsx(Dialog, {
...props,
destroyOnClose,
afterClose: function afterClose() {
_afterClose === null || _afterClose === void 0 ? void 0 : _afterClose();
setAnimatedVisible(false);
}
})
});
};
DialogWrap.displayName = "Dialog";
var _excluded$l = ["visible", "onVisibleChange", "getContainer", "current", "countRender"];
var context = /* @__PURE__ */ React__namespace.createContext({
previewUrls: /* @__PURE__ */ new Map(),
setPreviewUrls: function setPreviewUrls() {
return null;
},
current: null,
setCurrent: function setCurrent() {
return null;
},
setShowPreview: function setShowPreview() {
return null;
},
setMousePosition: function setMousePosition() {
return null;
},
registerImage: function registerImage() {
return function() {
return null;
};
},
rootClassName: ""
});
var Provider = context.Provider;
var Group$2 = function Group2(_ref) {
var _ref$previewPrefixCls = _ref.previewPrefixCls, previewPrefixCls = _ref$previewPrefixCls === void 0 ? "rc-image-preview" : _ref$previewPrefixCls, children = _ref.children, _ref$icons = _ref.icons, icons2 = _ref$icons === void 0 ? {} : _ref$icons, preview = _ref.preview;
var _ref2 = _typeof$q(preview) === "object" ? preview : {}, _ref2$visible = _ref2.visible, previewVisible = _ref2$visible === void 0 ? void 0 : _ref2$visible, _ref2$onVisibleChange = _ref2.onVisibleChange, onPreviewVisibleChange = _ref2$onVisibleChange === void 0 ? void 0 : _ref2$onVisibleChange, _ref2$getContainer = _ref2.getContainer, getContainer2 = _ref2$getContainer === void 0 ? void 0 : _ref2$getContainer, _ref2$current = _ref2.current, currentIndex = _ref2$current === void 0 ? 0 : _ref2$current, _ref2$countRender = _ref2.countRender, countRender = _ref2$countRender === void 0 ? void 0 : _ref2$countRender, dialogProps = _objectWithoutProperties$1(_ref2, _excluded$l);
var _useState = React$a.useState(/* @__PURE__ */ new Map()), _useState2 = _slicedToArray$e(_useState, 2), previewUrls = _useState2[0], setPreviewUrls = _useState2[1];
var _useState3 = React$a.useState(), _useState4 = _slicedToArray$e(_useState3, 2), current = _useState4[0], setCurrent = _useState4[1];
var _useMergedState = useMergedState(!!previewVisible, {
value: previewVisible,
onChange: onPreviewVisibleChange
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), isShowPreview = _useMergedState2[0], setShowPreview = _useMergedState2[1];
var _useState5 = React$a.useState(null), _useState6 = _slicedToArray$e(_useState5, 2), mousePosition = _useState6[0], setMousePosition = _useState6[1];
var isControlled = previewVisible !== void 0;
var previewUrlsKeys = Array.from(previewUrls.keys());
var currentControlledKey = previewUrlsKeys[currentIndex];
var canPreviewUrls = new Map(Array.from(previewUrls).filter(function(_ref3) {
var _ref4 = _slicedToArray$e(_ref3, 2), canPreview = _ref4[1].canPreview;
return !!canPreview;
}).map(function(_ref5) {
var _ref6 = _slicedToArray$e(_ref5, 2), id2 = _ref6[0], url = _ref6[1].url;
return [id2, url];
}));
var registerImage = function registerImage2(id2, url) {
var canPreview = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true;
var unRegister = function unRegister2() {
setPreviewUrls(function(oldPreviewUrls) {
var clonePreviewUrls = new Map(oldPreviewUrls);
var deleteResult = clonePreviewUrls.delete(id2);
return deleteResult ? clonePreviewUrls : oldPreviewUrls;
});
};
setPreviewUrls(function(oldPreviewUrls) {
return new Map(oldPreviewUrls).set(id2, {
url,
canPreview
});
});
return unRegister;
};
var onPreviewClose = function onPreviewClose2(e2) {
e2.stopPropagation();
setShowPreview(false);
setMousePosition(null);
};
React__namespace.useEffect(function() {
setCurrent(currentControlledKey);
}, [currentControlledKey]);
React__namespace.useEffect(function() {
if (!isShowPreview && isControlled) {
setCurrent(currentControlledKey);
}
}, [currentControlledKey, isControlled, isShowPreview]);
return /* @__PURE__ */ jsxs(Provider, {
value: {
isPreviewGroup: true,
previewUrls: canPreviewUrls,
setPreviewUrls,
current,
setCurrent,
setShowPreview,
setMousePosition,
registerImage
},
children: [children, /* @__PURE__ */ jsx(Preview$1, {
"aria-hidden": !isShowPreview,
visible: isShowPreview,
prefixCls: previewPrefixCls,
onClose: onPreviewClose,
mousePosition,
src: canPreviewUrls.get(current),
icons: icons2,
getContainer: getContainer2,
countRender,
...dialogProps
})]
});
};
var MIN_SCALE = 1;
var MAX_SCALE = 50;
var BASE_SCALE_RATIO = 1;
var WHEEL_MAX_SCALE_RATIO = 0.2;
var Operations = function Operations2(props) {
var _countRender;
var visible = props.visible, maskTransitionName = props.maskTransitionName, getContainer2 = props.getContainer, prefixCls = props.prefixCls, rootClassName = props.rootClassName, icons2 = props.icons, countRender = props.countRender, showSwitch = props.showSwitch, showProgress = props.showProgress, current = props.current, count = props.count, scale = props.scale, onSwitchLeft = props.onSwitchLeft, onSwitchRight = props.onSwitchRight, onClose = props.onClose, onZoomIn = props.onZoomIn, onZoomOut = props.onZoomOut, onRotateRight = props.onRotateRight, onRotateLeft = props.onRotateLeft;
var rotateLeft = icons2.rotateLeft, rotateRight = icons2.rotateRight, zoomIn = icons2.zoomIn, zoomOut = icons2.zoomOut, close = icons2.close, left = icons2.left, right = icons2.right;
var toolClassName = "".concat(prefixCls, "-operations-operation");
var iconClassName = "".concat(prefixCls, "-operations-icon");
var tools = [{
icon: close,
onClick: onClose,
type: "close"
}, {
icon: zoomIn,
onClick: onZoomIn,
type: "zoomIn",
disabled: scale === MAX_SCALE
}, {
icon: zoomOut,
onClick: onZoomOut,
type: "zoomOut",
disabled: scale === MIN_SCALE
}, {
icon: rotateRight,
onClick: onRotateRight,
type: "rotateRight"
}, {
icon: rotateLeft,
onClick: onRotateLeft,
type: "rotateLeft"
}];
var operations = /* @__PURE__ */ jsxs(Fragment, {
children: [showSwitch && /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-switch-left"), _defineProperty$b({}, "".concat(prefixCls, "-switch-left-disabled"), current === 0)),
onClick: onSwitchLeft,
children: left
}), /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-switch-right"), _defineProperty$b({}, "".concat(prefixCls, "-switch-right-disabled"), current === count - 1)),
onClick: onSwitchRight,
children: right
})]
}), /* @__PURE__ */ jsxs("ul", {
className: "".concat(prefixCls, "-operations"),
children: [showProgress && /* @__PURE__ */ jsx("li", {
className: "".concat(prefixCls, "-operations-progress"),
children: (_countRender = countRender === null || countRender === void 0 ? void 0 : countRender(current + 1, count)) !== null && _countRender !== void 0 ? _countRender : "".concat(current + 1, " / ").concat(count)
}), tools.map(function(_ref) {
var _classnames3;
var icon = _ref.icon, onClick = _ref.onClick, type2 = _ref.type, disabled = _ref.disabled;
return /* @__PURE__ */ jsx("li", {
className: classnames(toolClassName, (_classnames3 = {}, _defineProperty$b(_classnames3, "".concat(prefixCls, "-operations-operation-").concat(type2), true), _defineProperty$b(_classnames3, "".concat(prefixCls, "-operations-operation-disabled"), !!disabled), _classnames3)),
onClick,
children: /* @__PURE__ */ React__namespace.isValidElement(icon) ? /* @__PURE__ */ React__namespace.cloneElement(icon, {
className: iconClassName
}) : icon
}, type2);
})]
})]
});
return /* @__PURE__ */ jsx(CSSMotion, {
visible,
motionName: maskTransitionName,
children: function(_ref2) {
var className = _ref2.className, style2 = _ref2.style;
return /* @__PURE__ */ jsx(Portal, {
open: true,
getContainer: getContainer2 !== null && getContainer2 !== void 0 ? getContainer2 : document.body,
children: /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-operations-wrapper"), className, rootClassName),
style: style2,
children: operations
})
});
}
});
};
var initialTransform = {
x: 0,
y: 0,
rotate: 0,
scale: 1
};
function useImageTransform(imgRef) {
var frame = React$a.useRef(null);
var queue = React$a.useRef([]);
var _useState = React$a.useState(initialTransform), _useState2 = _slicedToArray$e(_useState, 2), transform = _useState2[0], setTransform2 = _useState2[1];
var resetTransform = function resetTransform2() {
setTransform2(initialTransform);
};
var updateTransform = function updateTransform2(newTransform) {
if (frame.current === null) {
queue.current = [];
frame.current = wrapperRaf$1(function() {
setTransform2(function(preState) {
var memoState = preState;
queue.current.forEach(function(queueState) {
memoState = _objectSpread2$a(_objectSpread2$a({}, memoState), queueState);
});
frame.current = null;
return memoState;
});
});
}
queue.current.push(_objectSpread2$a(_objectSpread2$a({}, transform), newTransform));
};
var dispatchZoonChange = function dispatchZoonChange2(ratio, clientX, clientY) {
var _imgRef$current = imgRef.current, width = _imgRef$current.width, height = _imgRef$current.height, offsetWidth = _imgRef$current.offsetWidth, offsetHeight = _imgRef$current.offsetHeight, offsetLeft = _imgRef$current.offsetLeft, offsetTop = _imgRef$current.offsetTop;
var newRatio = ratio;
var newScale = transform.scale * ratio;
if (newScale > MAX_SCALE) {
newRatio = MAX_SCALE / transform.scale;
newScale = MAX_SCALE;
} else if (newScale < MIN_SCALE) {
newRatio = MIN_SCALE / transform.scale;
newScale = MIN_SCALE;
}
var mergedClientX = clientX !== null && clientX !== void 0 ? clientX : innerWidth / 2;
var mergedClientY = clientY !== null && clientY !== void 0 ? clientY : innerHeight / 2;
var diffRatio = newRatio - 1;
var diffImgX = diffRatio * width * 0.5;
var diffImgY = diffRatio * height * 0.5;
var diffOffsetLeft = diffRatio * (mergedClientX - transform.x - offsetLeft);
var diffOffsetTop = diffRatio * (mergedClientY - transform.y - offsetTop);
var newX = transform.x - (diffOffsetLeft - diffImgX);
var newY = transform.y - (diffOffsetTop - diffImgY);
if (ratio < 1 && newScale === 1) {
var mergedWidth = offsetWidth * newScale;
var mergedHeight = offsetHeight * newScale;
var _getClientSize = getClientSize(), clientWidth = _getClientSize.width, clientHeight = _getClientSize.height;
if (mergedWidth <= clientWidth && mergedHeight <= clientHeight) {
newX = 0;
newY = 0;
}
}
updateTransform({
x: newX,
y: newY,
scale: newScale
});
};
return {
transform,
resetTransform,
updateTransform,
dispatchZoonChange
};
}
function fixPoint(key2, start, width, clientWidth) {
var startAddWidth = start + width;
var offsetStart = (width - clientWidth) / 2;
if (width > clientWidth) {
if (start > 0) {
return _defineProperty$b({}, key2, offsetStart);
}
if (start < 0 && startAddWidth < clientWidth) {
return _defineProperty$b({}, key2, -offsetStart);
}
} else if (start < 0 || startAddWidth > clientWidth) {
return _defineProperty$b({}, key2, start < 0 ? offsetStart : -offsetStart);
}
return {};
}
function getFixScaleEleTransPosition(width, height, left, top) {
var _getClientSize = getClientSize(), clientWidth = _getClientSize.width, clientHeight = _getClientSize.height;
var fixPos = null;
if (width <= clientWidth && height <= clientHeight) {
fixPos = {
x: 0,
y: 0
};
} else if (width > clientWidth || height > clientHeight) {
fixPos = _objectSpread2$a(_objectSpread2$a({}, fixPoint("x", left, width, clientWidth)), fixPoint("y", top, height, clientHeight));
}
return fixPos;
}
var _excluded$k = ["prefixCls", "src", "alt", "onClose", "afterClose", "visible", "icons", "rootClassName", "getContainer", "countRender", "scaleStep", "transitionName", "maskTransitionName"];
var Preview$1 = function Preview2(props) {
var prefixCls = props.prefixCls, src = props.src, alt = props.alt, onClose = props.onClose;
props.afterClose;
var visible = props.visible, _props$icons = props.icons, icons2 = _props$icons === void 0 ? {} : _props$icons, rootClassName = props.rootClassName, getContainer2 = props.getContainer, countRender = props.countRender, _props$scaleStep = props.scaleStep, scaleStep = _props$scaleStep === void 0 ? 0.5 : _props$scaleStep, _props$transitionName = props.transitionName, transitionName2 = _props$transitionName === void 0 ? "zoom" : _props$transitionName, _props$maskTransition = props.maskTransitionName, maskTransitionName = _props$maskTransition === void 0 ? "fade" : _props$maskTransition, restProps = _objectWithoutProperties$1(props, _excluded$k);
var imgRef = React$a.useRef();
var downPositionRef = React$a.useRef({
deltaX: 0,
deltaY: 0,
transformX: 0,
transformY: 0
});
var _useState = React$a.useState(false), _useState2 = _slicedToArray$e(_useState, 2), isMoving = _useState2[0], setMoving = _useState2[1];
var _useContext = React$a.useContext(context), previewUrls = _useContext.previewUrls, current = _useContext.current, isPreviewGroup = _useContext.isPreviewGroup, setCurrent = _useContext.setCurrent;
var previewGroupCount = previewUrls.size;
var previewUrlsKeys = Array.from(previewUrls.keys());
var currentPreviewIndex = previewUrlsKeys.indexOf(current);
var combinationSrc = isPreviewGroup ? previewUrls.get(current) : src;
var showLeftOrRightSwitches = isPreviewGroup && previewGroupCount > 1;
var showOperationsProgress = isPreviewGroup && previewGroupCount >= 1;
var _useImageTransform = useImageTransform(imgRef), transform = _useImageTransform.transform, resetTransform = _useImageTransform.resetTransform, updateTransform = _useImageTransform.updateTransform, dispatchZoonChange = _useImageTransform.dispatchZoonChange;
var rotate = transform.rotate, scale = transform.scale;
var wrapClassName = classnames(_defineProperty$b({}, "".concat(prefixCls, "-moving"), isMoving));
var onAfterClose = function onAfterClose2() {
resetTransform();
};
var onZoomIn = function onZoomIn2() {
dispatchZoonChange(BASE_SCALE_RATIO + scaleStep);
};
var onZoomOut = function onZoomOut2() {
dispatchZoonChange(BASE_SCALE_RATIO - scaleStep);
};
var onRotateRight = function onRotateRight2() {
updateTransform({
rotate: rotate + 90
});
};
var onRotateLeft = function onRotateLeft2() {
updateTransform({
rotate: rotate - 90
});
};
var onSwitchLeft = function onSwitchLeft2(event) {
event.preventDefault();
event.stopPropagation();
if (currentPreviewIndex > 0) {
setCurrent(previewUrlsKeys[currentPreviewIndex - 1]);
}
};
var onSwitchRight = function onSwitchRight2(event) {
event.preventDefault();
event.stopPropagation();
if (currentPreviewIndex < previewGroupCount - 1) {
setCurrent(previewUrlsKeys[currentPreviewIndex + 1]);
}
};
var onMouseUp = function onMouseUp2() {
if (visible && isMoving) {
setMoving(false);
var _downPositionRef$curr = downPositionRef.current, transformX = _downPositionRef$curr.transformX, transformY = _downPositionRef$curr.transformY;
var hasChangedPosition = transform.x !== transformX && transform.y !== transformY;
if (!hasChangedPosition) {
return;
}
var width = imgRef.current.offsetWidth * scale;
var height = imgRef.current.offsetHeight * scale;
var _imgRef$current$getBo = imgRef.current.getBoundingClientRect(), left = _imgRef$current$getBo.left, top = _imgRef$current$getBo.top;
var isRotate = rotate % 180 !== 0;
var fixState = getFixScaleEleTransPosition(isRotate ? height : width, isRotate ? width : height, left, top);
if (fixState) {
updateTransform(_objectSpread2$a({}, fixState));
}
}
};
var onMouseDown = function onMouseDown2(event) {
if (event.button !== 0)
return;
event.preventDefault();
event.stopPropagation();
downPositionRef.current = {
deltaX: event.pageX - transform.x,
deltaY: event.pageY - transform.y,
transformX: transform.x,
transformY: transform.y
};
setMoving(true);
};
var onMouseMove = function onMouseMove2(event) {
if (visible && isMoving) {
updateTransform({
x: event.pageX - downPositionRef.current.deltaX,
y: event.pageY - downPositionRef.current.deltaY
});
}
};
var onWheel = function onWheel2(event) {
if (!visible || event.deltaY == 0)
return;
var scaleRatio = Math.abs(event.deltaY / 100);
var mergedScaleRatio = Math.min(scaleRatio, WHEEL_MAX_SCALE_RATIO);
var ratio = BASE_SCALE_RATIO + mergedScaleRatio * scaleStep;
if (event.deltaY > 0) {
ratio = BASE_SCALE_RATIO / ratio;
}
dispatchZoonChange(ratio, event.clientX, event.clientY);
};
var onKeyDown2 = React$a.useCallback(function(event) {
if (!visible || !showLeftOrRightSwitches)
return;
if (event.keyCode === KeyCode.LEFT) {
if (currentPreviewIndex > 0) {
setCurrent(previewUrlsKeys[currentPreviewIndex - 1]);
}
} else if (event.keyCode === KeyCode.RIGHT) {
if (currentPreviewIndex < previewGroupCount - 1) {
setCurrent(previewUrlsKeys[currentPreviewIndex + 1]);
}
}
}, [currentPreviewIndex, previewGroupCount, previewUrlsKeys, setCurrent, showLeftOrRightSwitches, visible]);
var onDoubleClick = function onDoubleClick2(event) {
if (visible) {
if (scale !== 1) {
updateTransform({
x: 0,
y: 0,
scale: 1
});
} else {
dispatchZoonChange(BASE_SCALE_RATIO + scaleStep, event.clientX, event.clientY);
}
}
};
React$a.useEffect(function() {
var onTopMouseUpListener;
var onTopMouseMoveListener;
var onMouseUpListener = addEventListenerWrap$2(window, "mouseup", onMouseUp, false);
var onMouseMoveListener = addEventListenerWrap$2(window, "mousemove", onMouseMove, false);
var onKeyDownListener = addEventListenerWrap$2(window, "keydown", onKeyDown2, false);
try {
if (window.top !== window.self) {
onTopMouseUpListener = addEventListenerWrap$2(window.top, "mouseup", onMouseUp, false);
onTopMouseMoveListener = addEventListenerWrap$2(window.top, "mousemove", onMouseMove, false);
}
} catch (error) {
}
return function() {
var _onTopMouseUpListener, _onTopMouseMoveListen;
onMouseUpListener.remove();
onMouseMoveListener.remove();
onKeyDownListener.remove();
(_onTopMouseUpListener = onTopMouseUpListener) === null || _onTopMouseUpListener === void 0 ? void 0 : _onTopMouseUpListener.remove();
(_onTopMouseMoveListen = onTopMouseMoveListener) === null || _onTopMouseMoveListen === void 0 ? void 0 : _onTopMouseMoveListen.remove();
};
}, [visible, isMoving, onKeyDown2]);
return /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(DialogWrap, {
transitionName: transitionName2,
maskTransitionName,
closable: false,
keyboard: true,
prefixCls,
onClose,
afterClose: onAfterClose,
visible,
wrapClassName,
rootClassName,
getContainer: getContainer2,
...restProps,
children: /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-img-wrapper"),
children: /* @__PURE__ */ jsx("img", {
width: props.width,
height: props.height,
onWheel,
onMouseDown,
onDoubleClick,
ref: imgRef,
className: "".concat(prefixCls, "-img"),
src: combinationSrc,
alt,
style: {
transform: "translate3d(".concat(transform.x, "px, ").concat(transform.y, "px, 0) scale3d(").concat(scale, ", ").concat(scale, ", 1) rotate(").concat(rotate, "deg)")
}
})
})
}), /* @__PURE__ */ jsx(Operations, {
visible,
maskTransitionName,
getContainer: getContainer2,
prefixCls,
rootClassName,
icons: icons2,
countRender,
showSwitch: showLeftOrRightSwitches,
showProgress: showOperationsProgress,
current: currentPreviewIndex,
count: previewGroupCount,
scale,
onSwitchLeft,
onSwitchRight,
onZoomIn,
onZoomOut,
onRotateRight,
onRotateLeft,
onClose
})]
});
};
var _excluded$j = ["src", "alt", "onPreviewClose", "prefixCls", "previewPrefixCls", "placeholder", "fallback", "width", "height", "style", "preview", "className", "onClick", "onError", "wrapperClassName", "wrapperStyle", "rootClassName", "crossOrigin", "decoding", "loading", "referrerPolicy", "sizes", "srcSet", "useMap", "draggable"], _excluded2$2 = ["src", "visible", "onVisibleChange", "getContainer", "mask", "maskClassName", "icons", "scaleStep"];
var uuid$1 = 0;
var ImageInternal = function ImageInternal2(_ref) {
var _imgCommonProps$style;
var imgSrc = _ref.src, alt = _ref.alt, onInitialPreviewClose = _ref.onPreviewClose, _ref$prefixCls = _ref.prefixCls, prefixCls = _ref$prefixCls === void 0 ? "rc-image" : _ref$prefixCls, _ref$previewPrefixCls = _ref.previewPrefixCls, previewPrefixCls = _ref$previewPrefixCls === void 0 ? "".concat(prefixCls, "-preview") : _ref$previewPrefixCls, placeholder = _ref.placeholder, fallback = _ref.fallback, width = _ref.width, height = _ref.height, style2 = _ref.style, _ref$preview = _ref.preview, preview = _ref$preview === void 0 ? true : _ref$preview, className = _ref.className, onClick = _ref.onClick, onImageError = _ref.onError, wrapperClassName = _ref.wrapperClassName, wrapperStyle = _ref.wrapperStyle, rootClassName = _ref.rootClassName, crossOrigin = _ref.crossOrigin, decoding = _ref.decoding, loading = _ref.loading, referrerPolicy = _ref.referrerPolicy, sizes2 = _ref.sizes, srcSet = _ref.srcSet, useMap = _ref.useMap, draggable = _ref.draggable, otherProps = _objectWithoutProperties$1(_ref, _excluded$j);
var isCustomPlaceholder = placeholder && placeholder !== true;
var _ref2 = _typeof$q(preview) === "object" ? preview : {}, previewSrc = _ref2.src, _ref2$visible = _ref2.visible, previewVisible = _ref2$visible === void 0 ? void 0 : _ref2$visible, _ref2$onVisibleChange = _ref2.onVisibleChange, onPreviewVisibleChange = _ref2$onVisibleChange === void 0 ? onInitialPreviewClose : _ref2$onVisibleChange, _ref2$getContainer = _ref2.getContainer, getPreviewContainer = _ref2$getContainer === void 0 ? void 0 : _ref2$getContainer, previewMask = _ref2.mask, maskClassName = _ref2.maskClassName, icons2 = _ref2.icons, scaleStep = _ref2.scaleStep, dialogProps = _objectWithoutProperties$1(_ref2, _excluded2$2);
var src = previewSrc !== null && previewSrc !== void 0 ? previewSrc : imgSrc;
var isControlled = previewVisible !== void 0;
var _useMergedState = useMergedState(!!previewVisible, {
value: previewVisible,
onChange: onPreviewVisibleChange
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), isShowPreview = _useMergedState2[0], setShowPreview = _useMergedState2[1];
var _useState = React$a.useState(isCustomPlaceholder ? "loading" : "normal"), _useState2 = _slicedToArray$e(_useState, 2), status = _useState2[0], setStatus = _useState2[1];
var _useState3 = React$a.useState(null), _useState4 = _slicedToArray$e(_useState3, 2), mousePosition = _useState4[0], setMousePosition = _useState4[1];
var isError = status === "error";
var _React$useContext = React__namespace.useContext(context), isPreviewGroup = _React$useContext.isPreviewGroup, setCurrent = _React$useContext.setCurrent, setGroupShowPreview = _React$useContext.setShowPreview, setGroupMousePosition = _React$useContext.setMousePosition, registerImage = _React$useContext.registerImage;
var _React$useState = React__namespace.useState(function() {
uuid$1 += 1;
return uuid$1;
}), _React$useState2 = _slicedToArray$e(_React$useState, 1), currentId = _React$useState2[0];
var canPreview = !!preview;
var isLoaded = React__namespace.useRef(false);
var onLoad = function onLoad2() {
setStatus("normal");
};
var onError = function onError2(e2) {
if (onImageError) {
onImageError(e2);
}
setStatus("error");
};
var onPreview = function onPreview2(e2) {
if (!isControlled) {
var _getOffset = getOffset$1(e2.target), left = _getOffset.left, top = _getOffset.top;
if (isPreviewGroup) {
setCurrent(currentId);
setGroupMousePosition({
x: left,
y: top
});
} else {
setMousePosition({
x: left,
y: top
});
}
}
if (isPreviewGroup) {
setGroupShowPreview(true);
} else {
setShowPreview(true);
}
if (onClick)
onClick(e2);
};
var onPreviewClose = function onPreviewClose2(e2) {
e2.stopPropagation();
setShowPreview(false);
if (!isControlled) {
setMousePosition(null);
}
};
var getImgRef = function getImgRef2(img) {
isLoaded.current = false;
if (status !== "loading")
return;
if (img !== null && img !== void 0 && img.complete && (img.naturalWidth || img.naturalHeight)) {
isLoaded.current = true;
onLoad();
}
};
React__namespace.useEffect(function() {
var unRegister = registerImage(currentId, src);
return unRegister;
}, []);
React__namespace.useEffect(function() {
registerImage(currentId, src, canPreview);
}, [src, canPreview]);
React__namespace.useEffect(function() {
if (isError) {
setStatus("normal");
}
if (isCustomPlaceholder && !isLoaded.current) {
setStatus("loading");
}
}, [imgSrc]);
var wrapperClass = classnames(prefixCls, wrapperClassName, rootClassName, _defineProperty$b({}, "".concat(prefixCls, "-error"), isError));
var mergedSrc = isError && fallback ? fallback : src;
var imgCommonProps = {
crossOrigin,
decoding,
draggable,
loading,
referrerPolicy,
sizes: sizes2,
srcSet,
useMap,
alt,
className: classnames("".concat(prefixCls, "-img"), _defineProperty$b({}, "".concat(prefixCls, "-img-placeholder"), placeholder === true), className),
style: _objectSpread2$a({
height
}, style2)
};
return /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsxs("div", {
...otherProps,
className: wrapperClass,
onClick: canPreview ? onPreview : onClick,
style: _objectSpread2$a({
width,
height
}, wrapperStyle),
children: [/* @__PURE__ */ jsx("img", {
...imgCommonProps,
ref: getImgRef,
...isError && fallback ? {
src: fallback
} : {
onLoad,
onError,
src: imgSrc
},
width,
height
}), status === "loading" && /* @__PURE__ */ jsx("div", {
"aria-hidden": "true",
className: "".concat(prefixCls, "-placeholder"),
children: placeholder
}), previewMask && canPreview && /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-mask"), maskClassName),
style: {
display: ((_imgCommonProps$style = imgCommonProps.style) === null || _imgCommonProps$style === void 0 ? void 0 : _imgCommonProps$style.display) === "none" ? "none" : void 0
},
children: previewMask
})]
}), !isPreviewGroup && canPreview && /* @__PURE__ */ jsx(Preview$1, {
"aria-hidden": !isShowPreview,
visible: isShowPreview,
prefixCls: previewPrefixCls,
onClose: onPreviewClose,
mousePosition,
src: mergedSrc,
alt,
getContainer: getPreviewContainer,
icons: icons2,
scaleStep,
rootClassName,
...dialogProps
})]
});
};
ImageInternal.PreviewGroup = Group$2;
ImageInternal.displayName = "Image";
var RotateLeftOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "defs", "attrs": {}, "children": [{ "tag": "style", "attrs": {} }] }, { "tag": "path", "attrs": { "d": "M672 418H144c-17.7 0-32 14.3-32 32v414c0 17.7 14.3 32 32 32h528c17.7 0 32-14.3 32-32V450c0-17.7-14.3-32-32-32zm-44 402H188V494h440v326z" } }, { "tag": "path", "attrs": { "d": "M819.3 328.5c-78.8-100.7-196-153.6-314.6-154.2l-.2-64c0-6.5-7.6-10.1-12.6-6.1l-128 101c-4 3.1-3.9 9.1 0 12.3L492 318.6c5.1 4 12.7.4 12.6-6.1v-63.9c12.9.1 25.9.9 38.8 2.5 42.1 5.2 82.1 18.2 119 38.7 38.1 21.2 71.2 49.7 98.4 84.3 27.1 34.7 46.7 73.7 58.1 115.8a325.95 325.95 0 016.5 140.9h74.9c14.8-103.6-11.3-213-81-302.3z" } }] }, "name": "rotate-left", "theme": "outlined" };
const RotateLeftOutlinedSvg = RotateLeftOutlined$2;
var RotateLeftOutlined = function RotateLeftOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: RotateLeftOutlinedSvg
})
});
};
RotateLeftOutlined.displayName = "RotateLeftOutlined";
const RotateLeftOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(RotateLeftOutlined);
var RotateRightOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "defs", "attrs": {}, "children": [{ "tag": "style", "attrs": {} }] }, { "tag": "path", "attrs": { "d": "M480.5 251.2c13-1.6 25.9-2.4 38.8-2.5v63.9c0 6.5 7.5 10.1 12.6 6.1L660 217.6c4-3.2 4-9.2 0-12.3l-128-101c-5.1-4-12.6-.4-12.6 6.1l-.2 64c-118.6.5-235.8 53.4-314.6 154.2A399.75 399.75 0 00123.5 631h74.9c-.9-5.3-1.7-10.7-2.4-16.1-5.1-42.1-2.1-84.1 8.9-124.8 11.4-42.2 31-81.1 58.1-115.8 27.2-34.7 60.3-63.2 98.4-84.3 37-20.6 76.9-33.6 119.1-38.8z" } }, { "tag": "path", "attrs": { "d": "M880 418H352c-17.7 0-32 14.3-32 32v414c0 17.7 14.3 32 32 32h528c17.7 0 32-14.3 32-32V450c0-17.7-14.3-32-32-32zm-44 402H396V494h440v326z" } }] }, "name": "rotate-right", "theme": "outlined" };
const RotateRightOutlinedSvg = RotateRightOutlined$2;
var RotateRightOutlined = function RotateRightOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: RotateRightOutlinedSvg
})
});
};
RotateRightOutlined.displayName = "RotateRightOutlined";
const RotateRightOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(RotateRightOutlined);
var ZoomInOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M637 443H519V309c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v134H325c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h118v134c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V519h118c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm284 424L775 721c122.1-148.9 113.6-369.5-26-509-148-148.1-388.4-148.1-537 0-148.1 148.6-148.1 389 0 537 139.5 139.6 360.1 148.1 509 26l146 146c3.2 2.8 8.3 2.8 11 0l43-43c2.8-2.7 2.8-7.8 0-11zM696 696c-118.8 118.7-311.2 118.7-430 0-118.7-118.8-118.7-311.2 0-430 118.8-118.7 311.2-118.7 430 0 118.7 118.8 118.7 311.2 0 430z" } }] }, "name": "zoom-in", "theme": "outlined" };
const ZoomInOutlinedSvg = ZoomInOutlined$2;
var ZoomInOutlined = function ZoomInOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: ZoomInOutlinedSvg
})
});
};
ZoomInOutlined.displayName = "ZoomInOutlined";
const ZoomInOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(ZoomInOutlined);
var ZoomOutOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M637 443H325c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h312c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm284 424L775 721c122.1-148.9 113.6-369.5-26-509-148-148.1-388.4-148.1-537 0-148.1 148.6-148.1 389 0 537 139.5 139.6 360.1 148.1 509 26l146 146c3.2 2.8 8.3 2.8 11 0l43-43c2.8-2.7 2.8-7.8 0-11zM696 696c-118.8 118.7-311.2 118.7-430 0-118.7-118.8-118.7-311.2 0-430 118.8-118.7 311.2-118.7 430 0 118.7 118.8 118.7 311.2 0 430z" } }] }, "name": "zoom-out", "theme": "outlined" };
const ZoomOutOutlinedSvg = ZoomOutOutlined$2;
var ZoomOutOutlined = function ZoomOutOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: ZoomOutOutlinedSvg
})
});
};
ZoomOutOutlined.displayName = "ZoomOutOutlined";
const ZoomOutOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(ZoomOutOutlined);
var __rest$j = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var icons = {
rotateLeft: /* @__PURE__ */ jsx(RotateLeftOutlined$1, {}),
rotateRight: /* @__PURE__ */ jsx(RotateRightOutlined$1, {}),
zoomIn: /* @__PURE__ */ jsx(ZoomInOutlined$1, {}),
zoomOut: /* @__PURE__ */ jsx(ZoomOutOutlined$1, {}),
close: /* @__PURE__ */ jsx(CloseOutlined$4, {}),
left: /* @__PURE__ */ jsx(LeftOutlined$1, {}),
right: /* @__PURE__ */ jsx(RightOutlined$1, {})
};
var InternalPreviewGroup = function InternalPreviewGroup2(_a) {
var customizePrefixCls = _a.previewPrefixCls, preview = _a.preview, props = __rest$j(_a, ["previewPrefixCls", "preview"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls("image-preview", customizePrefixCls);
var rootPrefixCls = getPrefixCls();
var mergedPreview = React__namespace.useMemo(function() {
if (preview === false) {
return preview;
}
var _preview = _typeof$q(preview) === "object" ? preview : {};
return _extends$3(_extends$3({}, _preview), {
transitionName: getTransitionName(rootPrefixCls, "zoom", _preview.transitionName),
maskTransitionName: getTransitionName(rootPrefixCls, "fade", _preview.maskTransitionName)
});
}, [preview]);
return /* @__PURE__ */ jsx(ImageInternal.PreviewGroup, {
preview: mergedPreview,
previewPrefixCls: prefixCls,
icons,
...props
});
};
const PreviewGroup = InternalPreviewGroup;
var __rest$i = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Image$1 = function Image2(_a) {
var customizePrefixCls = _a.prefixCls, preview = _a.preview, otherProps = __rest$i(_a, ["prefixCls", "preview"]);
var _useContext = React$a.useContext(ConfigContext$1), getPrefixCls = _useContext.getPrefixCls, _useContext$locale = _useContext.locale, contextLocale = _useContext$locale === void 0 ? defaultLocale : _useContext$locale, getContextPopupContainer = _useContext.getPopupContainer;
var prefixCls = getPrefixCls("image", customizePrefixCls);
var rootPrefixCls = getPrefixCls();
var imageLocale = contextLocale.Image || defaultLocale.Image;
var mergedPreview = React__namespace.useMemo(function() {
if (preview === false) {
return preview;
}
var _preview = _typeof$q(preview) === "object" ? preview : {};
var getContainer2 = _preview.getContainer, restPreviewProps = __rest$i(_preview, ["getContainer"]);
return _extends$3(_extends$3({
mask: /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-mask-info"),
children: [/* @__PURE__ */ jsx(EyeOutlined$1, {}), imageLocale === null || imageLocale === void 0 ? void 0 : imageLocale.preview]
}),
icons
}, restPreviewProps), {
getContainer: getContainer2 || getContextPopupContainer,
transitionName: getTransitionName(rootPrefixCls, "zoom", _preview.transitionName),
maskTransitionName: getTransitionName(rootPrefixCls, "fade", _preview.maskTransitionName)
});
}, [preview, imageLocale]);
return /* @__PURE__ */ jsx(ImageInternal, {
prefixCls,
preview: mergedPreview,
...otherProps
});
};
Image$1.PreviewGroup = PreviewGroup;
const _Image = Image$1;
var Group = function Group2(props) {
var _classNames;
var _useContext = React$a.useContext(ConfigContext$1), getPrefixCls = _useContext.getPrefixCls, direction = _useContext.direction;
var customizePrefixCls = props.prefixCls, _props$className = props.className, className = _props$className === void 0 ? "" : _props$className;
var prefixCls = getPrefixCls("input-group", customizePrefixCls);
var cls = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-lg"), props.size === "large"), _defineProperty$b(_classNames, "".concat(prefixCls, "-sm"), props.size === "small"), _defineProperty$b(_classNames, "".concat(prefixCls, "-compact"), props.compact), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className);
var formItemContext = React$a.useContext(FormItemInputContext);
var groupFormItemContext = React$a.useMemo(function() {
return _extends$3(_extends$3({}, formItemContext), {
isFormItemInput: false
});
}, [formItemContext]);
return /* @__PURE__ */ jsx("span", {
className: cls,
style: props.style,
onMouseEnter: props.onMouseEnter,
onMouseLeave: props.onMouseLeave,
onFocus: props.onFocus,
onBlur: props.onBlur,
children: /* @__PURE__ */ jsx(FormItemInputContext.Provider, {
value: groupFormItemContext,
children: props.children
})
});
};
const Group$1 = Group;
function hasAddon$1(props) {
return !!(props.addonBefore || props.addonAfter);
}
function hasPrefixSuffix$1(props) {
return !!(props.prefix || props.suffix || props.allowClear);
}
function resolveOnChange$1(target, e2, onChange, targetValue) {
if (!onChange) {
return;
}
var event = e2;
if (e2.type === "click") {
var currentTarget = target.cloneNode(true);
event = Object.create(e2, {
target: {
value: currentTarget
},
currentTarget: {
value: currentTarget
}
});
currentTarget.value = "";
onChange(event);
return;
}
if (targetValue !== void 0) {
event = Object.create(e2, {
target: {
value: target
},
currentTarget: {
value: target
}
});
target.value = targetValue;
onChange(event);
return;
}
onChange(event);
}
function triggerFocus$1(element, option) {
if (!element)
return;
element.focus(option);
var _ref = option || {}, cursor = _ref.cursor;
if (cursor) {
var len = element.value.length;
switch (cursor) {
case "start":
element.setSelectionRange(0, 0);
break;
case "end":
element.setSelectionRange(len, len);
break;
default:
element.setSelectionRange(0, len);
}
}
}
function fixControlledValue$1(value) {
if (typeof value === "undefined" || value === null) {
return "";
}
return String(value);
}
var BaseInput = function BaseInput2(props) {
var inputElement = props.inputElement, prefixCls = props.prefixCls, prefix = props.prefix, suffix = props.suffix, addonBefore = props.addonBefore, addonAfter = props.addonAfter, className = props.className, style2 = props.style, affixWrapperClassName = props.affixWrapperClassName, groupClassName = props.groupClassName, wrapperClassName = props.wrapperClassName, disabled = props.disabled, readOnly = props.readOnly, focused = props.focused, triggerFocus2 = props.triggerFocus, allowClear = props.allowClear, value = props.value, handleReset = props.handleReset, hidden = props.hidden;
var containerRef = React$a.useRef(null);
var onInputClick = function onInputClick2(e2) {
var _containerRef$current;
if ((_containerRef$current = containerRef.current) !== null && _containerRef$current !== void 0 && _containerRef$current.contains(e2.target)) {
triggerFocus2 === null || triggerFocus2 === void 0 ? void 0 : triggerFocus2();
}
};
var getClearIcon = function getClearIcon2() {
var _classNames;
if (!allowClear) {
return null;
}
var needClear = !disabled && !readOnly && value;
var clearIconCls = "".concat(prefixCls, "-clear-icon");
var iconNode = _typeof$q(allowClear) === "object" && allowClear !== null && allowClear !== void 0 && allowClear.clearIcon ? allowClear.clearIcon : "\u2716";
return /* @__PURE__ */ jsx("span", {
onClick: handleReset,
onMouseDown: function onMouseDown(e2) {
return e2.preventDefault();
},
className: classnames(clearIconCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(clearIconCls, "-hidden"), !needClear), _defineProperty$b(_classNames, "".concat(clearIconCls, "-has-suffix"), !!suffix), _classNames)),
role: "button",
tabIndex: -1,
children: iconNode
});
};
var element = /* @__PURE__ */ React$a.cloneElement(inputElement, {
value,
hidden
});
if (hasPrefixSuffix$1(props)) {
var _classNames2;
var affixWrapperPrefixCls = "".concat(prefixCls, "-affix-wrapper");
var affixWrapperCls = classnames(affixWrapperPrefixCls, (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(affixWrapperPrefixCls, "-disabled"), disabled), _defineProperty$b(_classNames2, "".concat(affixWrapperPrefixCls, "-focused"), focused), _defineProperty$b(_classNames2, "".concat(affixWrapperPrefixCls, "-readonly"), readOnly), _defineProperty$b(_classNames2, "".concat(affixWrapperPrefixCls, "-input-with-clear-btn"), suffix && allowClear && value), _classNames2), !hasAddon$1(props) && className, affixWrapperClassName);
var suffixNode = (suffix || allowClear) && /* @__PURE__ */ jsxs("span", {
className: "".concat(prefixCls, "-suffix"),
children: [getClearIcon(), suffix]
});
element = /* @__PURE__ */ jsxs("span", {
className: affixWrapperCls,
style: style2,
hidden: !hasAddon$1(props) && hidden,
onClick: onInputClick,
ref: containerRef,
children: [prefix && /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-prefix"),
children: prefix
}), /* @__PURE__ */ React$a.cloneElement(inputElement, {
style: null,
value,
hidden: null
}), suffixNode]
});
}
if (hasAddon$1(props)) {
var wrapperCls = "".concat(prefixCls, "-group");
var addonCls = "".concat(wrapperCls, "-addon");
var mergedWrapperClassName = classnames("".concat(prefixCls, "-wrapper"), wrapperCls, wrapperClassName);
var mergedGroupClassName = classnames("".concat(prefixCls, "-group-wrapper"), className, groupClassName);
return /* @__PURE__ */ jsx("span", {
className: mergedGroupClassName,
style: style2,
hidden,
children: /* @__PURE__ */ jsxs("span", {
className: mergedWrapperClassName,
children: [addonBefore && /* @__PURE__ */ jsx("span", {
className: addonCls,
children: addonBefore
}), /* @__PURE__ */ React$a.cloneElement(element, {
style: null,
hidden: null
}), addonAfter && /* @__PURE__ */ jsx("span", {
className: addonCls,
children: addonAfter
})]
})
});
}
return element;
};
var _excluded$i = ["autoComplete", "onChange", "onFocus", "onBlur", "onPressEnter", "onKeyDown", "prefixCls", "disabled", "htmlSize", "className", "maxLength", "suffix", "showCount", "type", "inputClassName"];
var Input$4 = /* @__PURE__ */ React$a.forwardRef(function(props, ref) {
var autoComplete = props.autoComplete, onChange = props.onChange, onFocus = props.onFocus, onBlur = props.onBlur, onPressEnter = props.onPressEnter, onKeyDown2 = props.onKeyDown, _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-input" : _props$prefixCls, disabled = props.disabled, htmlSize = props.htmlSize, className = props.className, maxLength = props.maxLength, suffix = props.suffix, showCount = props.showCount, _props$type = props.type, type2 = _props$type === void 0 ? "text" : _props$type, inputClassName = props.inputClassName, rest = _objectWithoutProperties$1(props, _excluded$i);
var _useMergedState = useMergedState(props.defaultValue, {
value: props.value
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), value = _useMergedState2[0], setValue2 = _useMergedState2[1];
var _useState = React$a.useState(false), _useState2 = _slicedToArray$e(_useState, 2), focused = _useState2[0], setFocused = _useState2[1];
var inputRef = React$a.useRef(null);
var focus = function focus2(option) {
if (inputRef.current) {
triggerFocus$1(inputRef.current, option);
}
};
React$a.useImperativeHandle(ref, function() {
return {
focus,
blur: function blur() {
var _inputRef$current;
(_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.blur();
},
setSelectionRange: function setSelectionRange(start, end, direction) {
var _inputRef$current2;
(_inputRef$current2 = inputRef.current) === null || _inputRef$current2 === void 0 ? void 0 : _inputRef$current2.setSelectionRange(start, end, direction);
},
select: function select() {
var _inputRef$current3;
(_inputRef$current3 = inputRef.current) === null || _inputRef$current3 === void 0 ? void 0 : _inputRef$current3.select();
},
input: inputRef.current
};
});
React$a.useEffect(function() {
setFocused(function(prev) {
return prev && disabled ? false : prev;
});
}, [disabled]);
var handleChange = function handleChange2(e2) {
if (props.value === void 0) {
setValue2(e2.target.value);
}
if (inputRef.current) {
resolveOnChange$1(inputRef.current, e2, onChange);
}
};
var handleKeyDown = function handleKeyDown2(e2) {
if (onPressEnter && e2.key === "Enter") {
onPressEnter(e2);
}
onKeyDown2 === null || onKeyDown2 === void 0 ? void 0 : onKeyDown2(e2);
};
var handleFocus = function handleFocus2(e2) {
setFocused(true);
onFocus === null || onFocus === void 0 ? void 0 : onFocus(e2);
};
var handleBlur = function handleBlur2(e2) {
setFocused(false);
onBlur === null || onBlur === void 0 ? void 0 : onBlur(e2);
};
var handleReset = function handleReset2(e2) {
setValue2("");
focus();
if (inputRef.current) {
resolveOnChange$1(inputRef.current, e2, onChange);
}
};
var getInputElement = function getInputElement2() {
var otherProps = omit(props, [
"prefixCls",
"onPressEnter",
"addonBefore",
"addonAfter",
"prefix",
"suffix",
"allowClear",
"defaultValue",
"showCount",
"affixWrapperClassName",
"groupClassName",
"inputClassName",
"wrapperClassName",
"htmlSize"
]);
return /* @__PURE__ */ jsx("input", {
autoComplete,
...otherProps,
onChange: handleChange,
onFocus: handleFocus,
onBlur: handleBlur,
onKeyDown: handleKeyDown,
className: classnames(prefixCls, _defineProperty$b({}, "".concat(prefixCls, "-disabled"), disabled), inputClassName, !hasAddon$1(props) && !hasPrefixSuffix$1(props) && className),
ref: inputRef,
size: htmlSize,
type: type2
});
};
var getSuffix = function getSuffix2() {
var hasMaxLength = Number(maxLength) > 0;
if (suffix || showCount) {
var val = fixControlledValue$1(value);
var valueLength = _toConsumableArray$c(val).length;
var dataCount = _typeof$q(showCount) === "object" ? showCount.formatter({
value: val,
count: valueLength,
maxLength
}) : "".concat(valueLength).concat(hasMaxLength ? " / ".concat(maxLength) : "");
return /* @__PURE__ */ jsxs(Fragment, {
children: [!!showCount && /* @__PURE__ */ jsx("span", {
className: classnames("".concat(prefixCls, "-show-count-suffix"), _defineProperty$b({}, "".concat(prefixCls, "-show-count-has-suffix"), !!suffix)),
children: dataCount
}), suffix]
});
}
return null;
};
return /* @__PURE__ */ jsx(BaseInput, {
...rest,
prefixCls,
className,
inputElement: getInputElement(),
handleReset,
value: fixControlledValue$1(value),
focused,
triggerFocus: focus,
suffix: getSuffix(),
disabled
});
});
function useRemovePasswordTimeout(inputRef, triggerOnMount) {
var removePasswordTimeoutRef = React$a.useRef([]);
var removePasswordTimeout = function removePasswordTimeout2() {
removePasswordTimeoutRef.current.push(setTimeout(function() {
var _a, _b, _c, _d;
if (((_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.input) && ((_b = inputRef.current) === null || _b === void 0 ? void 0 : _b.input.getAttribute("type")) === "password" && ((_c = inputRef.current) === null || _c === void 0 ? void 0 : _c.input.hasAttribute("value"))) {
(_d = inputRef.current) === null || _d === void 0 ? void 0 : _d.input.removeAttribute("value");
}
}));
};
React$a.useEffect(function() {
if (triggerOnMount) {
removePasswordTimeout();
}
return function() {
return removePasswordTimeoutRef.current.forEach(function(timer) {
if (timer) {
clearTimeout(timer);
}
});
};
}, []);
return removePasswordTimeout;
}
function hasPrefixSuffix(props) {
return !!(props.prefix || props.suffix || props.allowClear);
}
var __rest$h = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
function fixControlledValue(value) {
if (typeof value === "undefined" || value === null) {
return "";
}
return String(value);
}
function resolveOnChange(target, e2, onChange, targetValue) {
if (!onChange) {
return;
}
var event = e2;
if (e2.type === "click") {
var currentTarget = target.cloneNode(true);
event = Object.create(e2, {
target: {
value: currentTarget
},
currentTarget: {
value: currentTarget
}
});
currentTarget.value = "";
onChange(event);
return;
}
if (targetValue !== void 0) {
event = Object.create(e2, {
target: {
value: target
},
currentTarget: {
value: target
}
});
target.value = targetValue;
onChange(event);
return;
}
onChange(event);
}
function triggerFocus(element, option) {
if (!element) {
return;
}
element.focus(option);
var _ref = option || {}, cursor = _ref.cursor;
if (cursor) {
var len = element.value.length;
switch (cursor) {
case "start":
element.setSelectionRange(0, 0);
break;
case "end":
element.setSelectionRange(len, len);
break;
default:
element.setSelectionRange(0, len);
break;
}
}
}
var Input$3 = /* @__PURE__ */ React$a.forwardRef(function(props, ref) {
var _classNames, _classNames2, _classNames4;
var customizePrefixCls = props.prefixCls, _props$bordered = props.bordered, bordered = _props$bordered === void 0 ? true : _props$bordered, customStatus = props.status, customSize = props.size, customDisabled = props.disabled, onBlur = props.onBlur, onFocus = props.onFocus, suffix = props.suffix, allowClear = props.allowClear, addonAfter = props.addonAfter, addonBefore = props.addonBefore, className = props.className, onChange = props.onChange, rest = __rest$h(props, ["prefixCls", "bordered", "status", "size", "disabled", "onBlur", "onFocus", "suffix", "allowClear", "addonAfter", "addonBefore", "className", "onChange"]);
var _React$useContext = React__default.default.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction, input = _React$useContext.input;
var prefixCls = getPrefixCls("input", customizePrefixCls);
var inputRef = React$a.useRef(null);
var _useCompactItemContex = useCompactItemContext(prefixCls, direction), compactSize = _useCompactItemContex.compactSize, compactItemClassnames = _useCompactItemContex.compactItemClassnames;
var size = React__default.default.useContext(SizeContext$1);
var mergedSize = compactSize || customSize || size;
var disabled = React__default.default.useContext(DisabledContext$1);
var mergedDisabled = customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled;
var _useContext = React$a.useContext(FormItemInputContext), contextStatus = _useContext.status, hasFeedback = _useContext.hasFeedback, feedbackIcon = _useContext.feedbackIcon;
var mergedStatus = getMergedStatus(contextStatus, customStatus);
var inputHasPrefixSuffix = hasPrefixSuffix(props) || !!hasFeedback;
var prevHasPrefixSuffix = React$a.useRef(inputHasPrefixSuffix);
React$a.useEffect(function() {
if (inputHasPrefixSuffix && !prevHasPrefixSuffix.current)
;
prevHasPrefixSuffix.current = inputHasPrefixSuffix;
}, [inputHasPrefixSuffix]);
var removePasswordTimeout = useRemovePasswordTimeout(inputRef, true);
var handleBlur = function handleBlur2(e2) {
removePasswordTimeout();
onBlur === null || onBlur === void 0 ? void 0 : onBlur(e2);
};
var handleFocus = function handleFocus2(e2) {
removePasswordTimeout();
onFocus === null || onFocus === void 0 ? void 0 : onFocus(e2);
};
var handleChange = function handleChange2(e2) {
removePasswordTimeout();
onChange === null || onChange === void 0 ? void 0 : onChange(e2);
};
var suffixNode = (hasFeedback || suffix) && /* @__PURE__ */ jsxs(Fragment, {
children: [suffix, hasFeedback && feedbackIcon]
});
var mergedAllowClear;
if (_typeof$q(allowClear) === "object" && (allowClear === null || allowClear === void 0 ? void 0 : allowClear.clearIcon)) {
mergedAllowClear = allowClear;
} else if (allowClear) {
mergedAllowClear = {
clearIcon: /* @__PURE__ */ jsx(CloseCircleFilled$1, {})
};
}
return /* @__PURE__ */ jsx(Input$4, {
ref: composeRef(ref, inputRef),
prefixCls,
autoComplete: input === null || input === void 0 ? void 0 : input.autoComplete,
...rest,
disabled: mergedDisabled || void 0,
onBlur: handleBlur,
onFocus: handleFocus,
suffix: suffixNode,
allowClear: mergedAllowClear,
className: classnames(className, compactItemClassnames),
onChange: handleChange,
addonAfter: addonAfter && /* @__PURE__ */ jsx(NoCompactStyle, {
children: /* @__PURE__ */ jsx(NoFormStyle, {
override: true,
status: true,
children: addonAfter
})
}),
addonBefore: addonBefore && /* @__PURE__ */ jsx(NoCompactStyle, {
children: /* @__PURE__ */ jsx(NoFormStyle, {
override: true,
status: true,
children: addonBefore
})
}),
inputClassName: classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-sm"), mergedSize === "small"), _defineProperty$b(_classNames, "".concat(prefixCls, "-lg"), mergedSize === "large"), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-borderless"), !bordered), _classNames), !inputHasPrefixSuffix && getStatusClassNames(prefixCls, mergedStatus)),
affixWrapperClassName: classnames((_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-sm"), mergedSize === "small"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-lg"), mergedSize === "large"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-rtl"), direction === "rtl"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-borderless"), !bordered), _classNames2), getStatusClassNames("".concat(prefixCls, "-affix-wrapper"), mergedStatus, hasFeedback)),
wrapperClassName: classnames(_defineProperty$b({}, "".concat(prefixCls, "-group-rtl"), direction === "rtl")),
groupClassName: classnames((_classNames4 = {}, _defineProperty$b(_classNames4, "".concat(prefixCls, "-group-wrapper-sm"), mergedSize === "small"), _defineProperty$b(_classNames4, "".concat(prefixCls, "-group-wrapper-lg"), mergedSize === "large"), _defineProperty$b(_classNames4, "".concat(prefixCls, "-group-wrapper-rtl"), direction === "rtl"), _classNames4), getStatusClassNames("".concat(prefixCls, "-group-wrapper"), mergedStatus, hasFeedback))
});
});
const InternalInput = Input$3;
var EyeInvisibleOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M942.2 486.2Q889.47 375.11 816.7 305l-50.88 50.88C807.31 395.53 843.45 447.4 874.7 512 791.5 684.2 673.4 766 512 766q-72.67 0-133.87-22.38L323 798.75Q408 838 512 838q288.3 0 430.2-300.3a60.29 60.29 0 000-51.5zm-63.57-320.64L836 122.88a8 8 0 00-11.32 0L715.31 232.2Q624.86 186 512 186q-288.3 0-430.2 300.3a60.3 60.3 0 000 51.5q56.69 119.4 136.5 191.41L112.48 835a8 8 0 000 11.31L155.17 889a8 8 0 0011.31 0l712.15-712.12a8 8 0 000-11.32zM149.3 512C232.6 339.8 350.7 258 512 258c54.54 0 104.13 9.36 149.12 28.39l-70.3 70.3a176 176 0 00-238.13 238.13l-83.42 83.42C223.1 637.49 183.3 582.28 149.3 512zm246.7 0a112.11 112.11 0 01146.2-106.69L401.31 546.2A112 112 0 01396 512z" } }, { "tag": "path", "attrs": { "d": "M508 624c-3.46 0-6.87-.16-10.25-.47l-52.82 52.82a176.09 176.09 0 00227.42-227.42l-52.82 52.82c.31 3.38.47 6.79.47 10.25a111.94 111.94 0 01-112 112z" } }] }, "name": "eye-invisible", "theme": "outlined" };
const EyeInvisibleOutlinedSvg = EyeInvisibleOutlined$2;
var EyeInvisibleOutlined = function EyeInvisibleOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: EyeInvisibleOutlinedSvg
})
});
};
EyeInvisibleOutlined.displayName = "EyeInvisibleOutlined";
const EyeInvisibleOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(EyeInvisibleOutlined);
var __rest$g = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var defaultIconRender = function defaultIconRender2(visible) {
return visible ? /* @__PURE__ */ jsx(EyeOutlined$1, {}) : /* @__PURE__ */ jsx(EyeInvisibleOutlined$1, {});
};
var ActionMap = {
click: "onClick",
hover: "onMouseOver"
};
var Password = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _props$visibilityTogg = props.visibilityToggle, visibilityToggle = _props$visibilityTogg === void 0 ? true : _props$visibilityTogg;
var visibilityControlled = _typeof$q(visibilityToggle) === "object" && visibilityToggle.visible !== void 0;
var _useState = React$a.useState(function() {
return visibilityControlled ? visibilityToggle.visible : false;
}), _useState2 = _slicedToArray$e(_useState, 2), visible = _useState2[0], setVisible = _useState2[1];
var inputRef = React$a.useRef(null);
React__namespace.useEffect(function() {
if (visibilityControlled) {
setVisible(visibilityToggle.visible);
}
}, [visibilityControlled, visibilityToggle]);
var removePasswordTimeout = useRemovePasswordTimeout(inputRef);
var onVisibleChange = function onVisibleChange2() {
var disabled = props.disabled;
if (disabled) {
return;
}
if (visible) {
removePasswordTimeout();
}
setVisible(function(prevState) {
var _a;
var newState = !prevState;
if (_typeof$q(visibilityToggle) === "object") {
(_a = visibilityToggle.onVisibleChange) === null || _a === void 0 ? void 0 : _a.call(visibilityToggle, newState);
}
return newState;
});
};
var getIcon2 = function getIcon3(prefixCls) {
var _iconProps;
var _props$action = props.action, action = _props$action === void 0 ? "click" : _props$action, _props$iconRender = props.iconRender, iconRender = _props$iconRender === void 0 ? defaultIconRender : _props$iconRender;
var iconTrigger = ActionMap[action] || "";
var icon = iconRender(visible);
var iconProps = (_iconProps = {}, _defineProperty$b(_iconProps, iconTrigger, onVisibleChange), _defineProperty$b(_iconProps, "className", "".concat(prefixCls, "-icon")), _defineProperty$b(_iconProps, "key", "passwordIcon"), _defineProperty$b(_iconProps, "onMouseDown", function onMouseDown(e2) {
e2.preventDefault();
}), _defineProperty$b(_iconProps, "onMouseUp", function onMouseUp(e2) {
e2.preventDefault();
}), _iconProps);
return /* @__PURE__ */ React__namespace.cloneElement(/* @__PURE__ */ React__namespace.isValidElement(icon) ? icon : /* @__PURE__ */ jsx("span", {
children: icon
}), iconProps);
};
var renderPassword = function renderPassword2(_ref) {
var getPrefixCls = _ref.getPrefixCls;
var className = props.className, customizePrefixCls = props.prefixCls, customizeInputPrefixCls = props.inputPrefixCls, size = props.size, restProps = __rest$g(props, ["className", "prefixCls", "inputPrefixCls", "size"]);
var inputPrefixCls = getPrefixCls("input", customizeInputPrefixCls);
var prefixCls = getPrefixCls("input-password", customizePrefixCls);
var suffixIcon = visibilityToggle && getIcon2(prefixCls);
var inputClassName = classnames(prefixCls, className, _defineProperty$b({}, "".concat(prefixCls, "-").concat(size), !!size));
var omittedProps = _extends$3(_extends$3({}, omit(restProps, ["suffix", "iconRender", "visibilityToggle"])), {
type: visible ? "text" : "password",
className: inputClassName,
prefixCls: inputPrefixCls,
suffix: suffixIcon
});
if (size) {
omittedProps.size = size;
}
return /* @__PURE__ */ jsx(InternalInput, {
ref: composeRef(ref, inputRef),
...omittedProps
});
};
return /* @__PURE__ */ jsx(ConfigConsumer, {
children: renderPassword
});
});
const Password$1 = Password;
var __rest$f = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Search = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames;
var customizePrefixCls = props.prefixCls, customizeInputPrefixCls = props.inputPrefixCls, className = props.className, customizeSize = props.size, suffix = props.suffix, _props$enterButton = props.enterButton, enterButton = _props$enterButton === void 0 ? false : _props$enterButton, addonAfter = props.addonAfter, loading = props.loading, disabled = props.disabled, customOnSearch = props.onSearch, customOnChange = props.onChange, onCompositionStart = props.onCompositionStart, onCompositionEnd = props.onCompositionEnd, restProps = __rest$f(props, ["prefixCls", "inputPrefixCls", "className", "size", "suffix", "enterButton", "addonAfter", "loading", "disabled", "onSearch", "onChange", "onCompositionStart", "onCompositionEnd"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var contextSize = React__namespace.useContext(SizeContext$1);
var composedRef = React__namespace.useRef(false);
var prefixCls = getPrefixCls("input-search", customizePrefixCls);
var inputPrefixCls = getPrefixCls("input", customizeInputPrefixCls);
var _useCompactItemContex = useCompactItemContext(prefixCls, direction), compactSize = _useCompactItemContex.compactSize;
var size = compactSize || customizeSize || contextSize;
var inputRef = React__namespace.useRef(null);
var onChange = function onChange2(e2) {
if (e2 && e2.target && e2.type === "click" && customOnSearch) {
customOnSearch(e2.target.value, e2);
}
if (customOnChange) {
customOnChange(e2);
}
};
var onMouseDown = function onMouseDown2(e2) {
var _a;
if (document.activeElement === ((_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.input)) {
e2.preventDefault();
}
};
var onSearch = function onSearch2(e2) {
var _a, _b;
if (customOnSearch) {
customOnSearch((_b = (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.input) === null || _b === void 0 ? void 0 : _b.value, e2);
}
};
var onPressEnter = function onPressEnter2(e2) {
if (composedRef.current || loading) {
return;
}
onSearch(e2);
};
var searchIcon = typeof enterButton === "boolean" ? /* @__PURE__ */ jsx(SearchOutlined$1, {}) : null;
var btnClassName = "".concat(prefixCls, "-button");
var button;
var enterButtonAsElement = enterButton || {};
var isAntdButton = enterButtonAsElement.type && enterButtonAsElement.type.__ANT_BUTTON === true;
if (isAntdButton || enterButtonAsElement.type === "button") {
button = cloneElement(enterButtonAsElement, _extends$3({
onMouseDown,
onClick: function onClick(e2) {
var _a, _b;
(_b = (_a = enterButtonAsElement === null || enterButtonAsElement === void 0 ? void 0 : enterButtonAsElement.props) === null || _a === void 0 ? void 0 : _a.onClick) === null || _b === void 0 ? void 0 : _b.call(_a, e2);
onSearch(e2);
},
key: "enterButton"
}, isAntdButton ? {
className: btnClassName,
size
} : {}));
} else {
button = /* @__PURE__ */ jsx(Button$2, {
className: btnClassName,
type: enterButton ? "primary" : void 0,
size,
disabled,
onMouseDown,
onClick: onSearch,
loading,
icon: searchIcon,
children: enterButton
}, "enterButton");
}
if (addonAfter) {
button = [button, cloneElement(addonAfter, {
key: "addonAfter"
})];
}
var cls = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(size), !!size), _defineProperty$b(_classNames, "".concat(prefixCls, "-with-button"), !!enterButton), _classNames), className);
var handleOnCompositionStart = function handleOnCompositionStart2(e2) {
composedRef.current = true;
onCompositionStart === null || onCompositionStart === void 0 ? void 0 : onCompositionStart(e2);
};
var handleOnCompositionEnd = function handleOnCompositionEnd2(e2) {
composedRef.current = false;
onCompositionEnd === null || onCompositionEnd === void 0 ? void 0 : onCompositionEnd(e2);
};
return /* @__PURE__ */ jsx(InternalInput, {
ref: composeRef(inputRef, ref),
onPressEnter,
...restProps,
size,
onCompositionStart: handleOnCompositionStart,
onCompositionEnd: handleOnCompositionEnd,
prefixCls: inputPrefixCls,
addonAfter: button,
suffix,
onChange,
className: cls,
disabled
});
});
const Search$1 = Search;
var HIDDEN_TEXTAREA_STYLE = "\n min-height:0 !important;\n max-height:none !important;\n height:0 !important;\n visibility:hidden !important;\n overflow:hidden !important;\n position:absolute !important;\n z-index:-1000 !important;\n top:0 !important;\n right:0 !important;\n pointer-events: none !important;\n";
var SIZING_STYLE = ["letter-spacing", "line-height", "padding-top", "padding-bottom", "font-family", "font-weight", "font-size", "font-variant", "text-rendering", "text-transform", "width", "text-indent", "padding-left", "padding-right", "border-width", "box-sizing", "word-break"];
var computedStyleCache = {};
var hiddenTextarea;
function calculateNodeStyling(node) {
var useCache2 = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
var nodeRef = node.getAttribute("id") || node.getAttribute("data-reactid") || node.getAttribute("name");
if (useCache2 && computedStyleCache[nodeRef]) {
return computedStyleCache[nodeRef];
}
var style2 = window.getComputedStyle(node);
var boxSizing = style2.getPropertyValue("box-sizing") || style2.getPropertyValue("-moz-box-sizing") || style2.getPropertyValue("-webkit-box-sizing");
var paddingSize = parseFloat(style2.getPropertyValue("padding-bottom")) + parseFloat(style2.getPropertyValue("padding-top"));
var borderSize = parseFloat(style2.getPropertyValue("border-bottom-width")) + parseFloat(style2.getPropertyValue("border-top-width"));
var sizingStyle = SIZING_STYLE.map(function(name2) {
return "".concat(name2, ":").concat(style2.getPropertyValue(name2));
}).join(";");
var nodeInfo = {
sizingStyle,
paddingSize,
borderSize,
boxSizing
};
if (useCache2 && nodeRef) {
computedStyleCache[nodeRef] = nodeInfo;
}
return nodeInfo;
}
function calculateAutoSizeStyle(uiTextNode) {
var useCache2 = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
var minRows = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : null;
var maxRows = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : null;
if (!hiddenTextarea) {
hiddenTextarea = document.createElement("textarea");
hiddenTextarea.setAttribute("tab-index", "-1");
hiddenTextarea.setAttribute("aria-hidden", "true");
document.body.appendChild(hiddenTextarea);
}
if (uiTextNode.getAttribute("wrap")) {
hiddenTextarea.setAttribute("wrap", uiTextNode.getAttribute("wrap"));
} else {
hiddenTextarea.removeAttribute("wrap");
}
var _calculateNodeStyling = calculateNodeStyling(uiTextNode, useCache2), paddingSize = _calculateNodeStyling.paddingSize, borderSize = _calculateNodeStyling.borderSize, boxSizing = _calculateNodeStyling.boxSizing, sizingStyle = _calculateNodeStyling.sizingStyle;
hiddenTextarea.setAttribute("style", "".concat(sizingStyle, ";").concat(HIDDEN_TEXTAREA_STYLE));
hiddenTextarea.value = uiTextNode.value || uiTextNode.placeholder || "";
var minHeight = void 0;
var maxHeight = void 0;
var overflowY;
var height = hiddenTextarea.scrollHeight;
if (boxSizing === "border-box") {
height += borderSize;
} else if (boxSizing === "content-box") {
height -= paddingSize;
}
if (minRows !== null || maxRows !== null) {
hiddenTextarea.value = " ";
var singleRowHeight = hiddenTextarea.scrollHeight - paddingSize;
if (minRows !== null) {
minHeight = singleRowHeight * minRows;
if (boxSizing === "border-box") {
minHeight = minHeight + paddingSize + borderSize;
}
height = Math.max(minHeight, height);
}
if (maxRows !== null) {
maxHeight = singleRowHeight * maxRows;
if (boxSizing === "border-box") {
maxHeight = maxHeight + paddingSize + borderSize;
}
overflowY = height > maxHeight ? "" : "hidden";
height = Math.min(maxHeight, height);
}
}
var style2 = {
height,
overflowY,
resize: "none"
};
if (minHeight) {
style2.minHeight = minHeight;
}
if (maxHeight) {
style2.maxHeight = maxHeight;
}
return style2;
}
var _excluded$h = ["prefixCls", "onPressEnter", "defaultValue", "value", "autoSize", "onResize", "className", "style", "disabled", "onChange", "onInternalAutoSize"];
var RESIZE_START = 0;
var RESIZE_MEASURING = 1;
var RESIZE_STABLE = 2;
var ResizableTextArea = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-textarea" : _props$prefixCls;
props.onPressEnter;
var defaultValue = props.defaultValue, value = props.value, autoSize = props.autoSize, onResize2 = props.onResize, className = props.className, style2 = props.style, disabled = props.disabled, onChange = props.onChange;
props.onInternalAutoSize;
var restProps = _objectWithoutProperties$1(props, _excluded$h);
var _useMergedState = useMergedState(defaultValue, {
value,
postState: function postState(val) {
return val !== null && val !== void 0 ? val : "";
}
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), mergedValue = _useMergedState2[0], setMergedValue = _useMergedState2[1];
var onInternalChange = function onInternalChange2(event) {
setMergedValue(event.target.value);
onChange === null || onChange === void 0 ? void 0 : onChange(event);
};
var textareaRef = React__namespace.useRef();
React__namespace.useImperativeHandle(ref, function() {
return {
textArea: textareaRef.current
};
});
var _React$useMemo = React__namespace.useMemo(function() {
if (autoSize && _typeof$q(autoSize) === "object") {
return [autoSize.minRows, autoSize.maxRows];
}
return [];
}, [autoSize]), _React$useMemo2 = _slicedToArray$e(_React$useMemo, 2), minRows = _React$useMemo2[0], maxRows = _React$useMemo2[1];
var needAutoSize = !!autoSize;
var fixFirefoxAutoScroll = function fixFirefoxAutoScroll2() {
try {
if (document.activeElement === textareaRef.current) {
var _textareaRef$current = textareaRef.current, selectionStart = _textareaRef$current.selectionStart, selectionEnd = _textareaRef$current.selectionEnd, scrollTop = _textareaRef$current.scrollTop;
textareaRef.current.setSelectionRange(selectionStart, selectionEnd);
textareaRef.current.scrollTop = scrollTop;
}
} catch (e2) {
}
};
var _React$useState = React__namespace.useState(RESIZE_STABLE), _React$useState2 = _slicedToArray$e(_React$useState, 2), resizeState = _React$useState2[0], setResizeState = _React$useState2[1];
var _React$useState3 = React__namespace.useState(), _React$useState4 = _slicedToArray$e(_React$useState3, 2), autoSizeStyle = _React$useState4[0], setAutoSizeStyle = _React$useState4[1];
var startResize = function startResize2() {
setResizeState(RESIZE_START);
};
useLayoutEffect$1(function() {
if (needAutoSize) {
startResize();
}
}, [value, minRows, maxRows, needAutoSize]);
useLayoutEffect$1(function() {
if (resizeState === RESIZE_START) {
setResizeState(RESIZE_MEASURING);
} else if (resizeState === RESIZE_MEASURING) {
var textareaStyles = calculateAutoSizeStyle(textareaRef.current, false, minRows, maxRows);
setResizeState(RESIZE_STABLE);
setAutoSizeStyle(textareaStyles);
} else {
fixFirefoxAutoScroll();
}
}, [resizeState]);
var resizeRafRef = React__namespace.useRef();
var cleanRaf = function cleanRaf2() {
wrapperRaf$1.cancel(resizeRafRef.current);
};
var onInternalResize = function onInternalResize2(size) {
if (resizeState === RESIZE_STABLE) {
onResize2 === null || onResize2 === void 0 ? void 0 : onResize2(size);
if (autoSize) {
cleanRaf();
resizeRafRef.current = wrapperRaf$1(function() {
startResize();
});
}
}
};
React__namespace.useEffect(function() {
return cleanRaf;
}, []);
var mergedAutoSizeStyle = needAutoSize ? autoSizeStyle : null;
var mergedStyle = _objectSpread2$a(_objectSpread2$a({}, style2), mergedAutoSizeStyle);
if (resizeState === RESIZE_START || resizeState === RESIZE_MEASURING) {
mergedStyle.overflowY = "hidden";
mergedStyle.overflowX = "hidden";
}
return /* @__PURE__ */ jsx(RefResizeObserver, {
onResize: onInternalResize,
disabled: !(autoSize || onResize2),
children: /* @__PURE__ */ jsx("textarea", {
...restProps,
ref: textareaRef,
style: mergedStyle,
className: classnames(prefixCls, className, _defineProperty$b({}, "".concat(prefixCls, "-disabled"), disabled)),
disabled,
value: mergedValue,
onChange: onInternalChange
})
});
});
var TextArea$4 = /* @__PURE__ */ function(_React$Component) {
_inherits(TextArea2, _React$Component);
var _super = _createSuper(TextArea2);
function TextArea2(props) {
var _this2;
_classCallCheck(this, TextArea2);
_this2 = _super.call(this, props);
_this2.resizableTextArea = void 0;
_this2.focus = function() {
_this2.resizableTextArea.textArea.focus();
};
_this2.saveTextArea = function(resizableTextArea) {
_this2.resizableTextArea = resizableTextArea;
};
_this2.handleChange = function(e2) {
var onChange = _this2.props.onChange;
_this2.setValue(e2.target.value);
if (onChange) {
onChange(e2);
}
};
_this2.handleKeyDown = function(e2) {
var _this$props = _this2.props, onPressEnter = _this$props.onPressEnter, onKeyDown2 = _this$props.onKeyDown;
if (e2.keyCode === 13 && onPressEnter) {
onPressEnter(e2);
}
if (onKeyDown2) {
onKeyDown2(e2);
}
};
var value = typeof props.value === "undefined" || props.value === null ? props.defaultValue : props.value;
_this2.state = {
value
};
return _this2;
}
_createClass(TextArea2, [{
key: "setValue",
value: function setValue2(value, callback) {
if (!("value" in this.props)) {
this.setState({
value
}, callback);
}
}
}, {
key: "blur",
value: function blur() {
this.resizableTextArea.textArea.blur();
}
}, {
key: "render",
value: function render2() {
return /* @__PURE__ */ jsx(ResizableTextArea, {
...this.props,
value: this.state.value,
onKeyDown: this.handleKeyDown,
onChange: this.handleChange,
ref: this.saveTextArea
});
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(nextProps) {
if ("value" in nextProps) {
return {
value: nextProps.value
};
}
return null;
}
}]);
return TextArea2;
}(React__namespace.Component);
var ClearableInputType = tuple$1("text", "input");
function hasAddon(props) {
return !!(props.addonBefore || props.addonAfter);
}
var ClearableLabeledInput = /* @__PURE__ */ function(_React$Component) {
_inherits(ClearableLabeledInput2, _React$Component);
var _super = _createSuper(ClearableLabeledInput2);
function ClearableLabeledInput2() {
_classCallCheck(this, ClearableLabeledInput2);
return _super.apply(this, arguments);
}
_createClass(ClearableLabeledInput2, [{
key: "renderClearIcon",
value: function renderClearIcon(prefixCls) {
var _classNames;
var _this$props = this.props, value = _this$props.value, disabled = _this$props.disabled, readOnly = _this$props.readOnly, handleReset = _this$props.handleReset, suffix = _this$props.suffix;
var needClear = !disabled && !readOnly && value;
var className = "".concat(prefixCls, "-clear-icon");
return /* @__PURE__ */ jsx(CloseCircleFilled$1, {
onClick: handleReset,
onMouseDown: function onMouseDown(e2) {
return e2.preventDefault();
},
className: classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(className, "-hidden"), !needClear), _defineProperty$b(_classNames, "".concat(className, "-has-suffix"), !!suffix), _classNames), className),
role: "button"
});
}
}, {
key: "renderTextAreaWithClearIcon",
value: function renderTextAreaWithClearIcon(prefixCls, element, statusContext) {
var _classNames2;
var _this$props2 = this.props, value = _this$props2.value, allowClear = _this$props2.allowClear, className = _this$props2.className, style2 = _this$props2.style, direction = _this$props2.direction, bordered = _this$props2.bordered, hidden = _this$props2.hidden, customStatus = _this$props2.status;
var contextStatus = statusContext.status, hasFeedback = statusContext.hasFeedback;
if (!allowClear) {
return cloneElement(element, {
value
});
}
var affixWrapperCls = classnames("".concat(prefixCls, "-affix-wrapper"), "".concat(prefixCls, "-affix-wrapper-textarea-with-clear-btn"), getStatusClassNames("".concat(prefixCls, "-affix-wrapper"), getMergedStatus(contextStatus, customStatus), hasFeedback), (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-rtl"), direction === "rtl"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-borderless"), !bordered), _defineProperty$b(_classNames2, "".concat(className), !hasAddon(this.props) && className), _classNames2));
return /* @__PURE__ */ jsxs("span", {
className: affixWrapperCls,
style: style2,
hidden,
children: [cloneElement(element, {
style: null,
value
}), this.renderClearIcon(prefixCls)]
});
}
}, {
key: "render",
value: function render2() {
var _this2 = this;
return /* @__PURE__ */ jsx(FormItemInputContext.Consumer, {
children: function(statusContext) {
var _this$props3 = _this2.props, prefixCls = _this$props3.prefixCls, inputType = _this$props3.inputType, element = _this$props3.element;
if (inputType === ClearableInputType[0]) {
return _this2.renderTextAreaWithClearIcon(prefixCls, element, statusContext);
}
}
});
}
}]);
return ClearableLabeledInput2;
}(React__namespace.Component);
const ClearableLabeledInput$1 = ClearableLabeledInput;
var __rest$e = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
function fixEmojiLength(value, maxLength) {
return _toConsumableArray$c(value || "").slice(0, maxLength).join("");
}
function setTriggerValue(isCursorInEnd, preValue, triggerValue, maxLength) {
var newTriggerValue = triggerValue;
if (isCursorInEnd) {
newTriggerValue = fixEmojiLength(triggerValue, maxLength);
} else if (_toConsumableArray$c(preValue || "").length < triggerValue.length && _toConsumableArray$c(triggerValue || "").length > maxLength) {
newTriggerValue = preValue;
}
return newTriggerValue;
}
var TextArea$2 = /* @__PURE__ */ React__namespace.forwardRef(function(_a, ref) {
var _classNames;
var customizePrefixCls = _a.prefixCls, _a$bordered = _a.bordered, bordered = _a$bordered === void 0 ? true : _a$bordered, _a$showCount = _a.showCount, showCount = _a$showCount === void 0 ? false : _a$showCount, maxLength = _a.maxLength, className = _a.className, style2 = _a.style, customizeSize = _a.size, customDisabled = _a.disabled, onCompositionStart = _a.onCompositionStart, onCompositionEnd = _a.onCompositionEnd, onChange = _a.onChange, customStatus = _a.status, props = __rest$e(_a, ["prefixCls", "bordered", "showCount", "maxLength", "className", "style", "size", "disabled", "onCompositionStart", "onCompositionEnd", "onChange", "status"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var size = React__namespace.useContext(SizeContext$1);
var disabled = React__namespace.useContext(DisabledContext$1);
var mergedDisabled = customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled;
var _React$useContext2 = React__namespace.useContext(FormItemInputContext), contextStatus = _React$useContext2.status, hasFeedback = _React$useContext2.hasFeedback, isFormItemInput = _React$useContext2.isFormItemInput, feedbackIcon = _React$useContext2.feedbackIcon;
var mergedStatus = getMergedStatus(contextStatus, customStatus);
var innerRef = React__namespace.useRef(null);
var clearableInputRef = React__namespace.useRef(null);
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), compositing = _React$useState2[0], setCompositing = _React$useState2[1];
var oldCompositionValueRef = React__namespace.useRef();
var oldSelectionStartRef = React__namespace.useRef(0);
var _useMergedState = useMergedState(props.defaultValue, {
value: props.value
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), value = _useMergedState2[0], setValue2 = _useMergedState2[1];
var hidden = props.hidden;
var handleSetValue = function handleSetValue2(val2, callback) {
if (props.value === void 0) {
setValue2(val2);
callback === null || callback === void 0 ? void 0 : callback();
}
};
var hasMaxLength = Number(maxLength) > 0;
var onInternalCompositionStart = function onInternalCompositionStart2(e2) {
setCompositing(true);
oldCompositionValueRef.current = value;
oldSelectionStartRef.current = e2.currentTarget.selectionStart;
onCompositionStart === null || onCompositionStart === void 0 ? void 0 : onCompositionStart(e2);
};
var onInternalCompositionEnd = function onInternalCompositionEnd2(e2) {
var _a2;
setCompositing(false);
var triggerValue = e2.currentTarget.value;
if (hasMaxLength) {
var isCursorInEnd = oldSelectionStartRef.current >= maxLength + 1 || oldSelectionStartRef.current === ((_a2 = oldCompositionValueRef.current) === null || _a2 === void 0 ? void 0 : _a2.length);
triggerValue = setTriggerValue(isCursorInEnd, oldCompositionValueRef.current, triggerValue, maxLength);
}
if (triggerValue !== value) {
handleSetValue(triggerValue);
resolveOnChange(e2.currentTarget, e2, onChange, triggerValue);
}
onCompositionEnd === null || onCompositionEnd === void 0 ? void 0 : onCompositionEnd(e2);
};
var handleChange = function handleChange2(e2) {
var triggerValue = e2.target.value;
if (!compositing && hasMaxLength) {
var isCursorInEnd = e2.target.selectionStart >= maxLength + 1 || e2.target.selectionStart === triggerValue.length || !e2.target.selectionStart;
triggerValue = setTriggerValue(isCursorInEnd, value, triggerValue, maxLength);
}
handleSetValue(triggerValue);
resolveOnChange(e2.currentTarget, e2, onChange, triggerValue);
};
var handleReset = function handleReset2(e2) {
var _a2, _b, _c;
handleSetValue("");
(_a2 = innerRef.current) === null || _a2 === void 0 ? void 0 : _a2.focus();
resolveOnChange((_c = (_b = innerRef.current) === null || _b === void 0 ? void 0 : _b.resizableTextArea) === null || _c === void 0 ? void 0 : _c.textArea, e2, onChange);
};
var prefixCls = getPrefixCls("input", customizePrefixCls);
React__namespace.useImperativeHandle(ref, function() {
var _a2;
return {
resizableTextArea: (_a2 = innerRef.current) === null || _a2 === void 0 ? void 0 : _a2.resizableTextArea,
focus: function focus(option) {
var _a3, _b;
triggerFocus((_b = (_a3 = innerRef.current) === null || _a3 === void 0 ? void 0 : _a3.resizableTextArea) === null || _b === void 0 ? void 0 : _b.textArea, option);
},
blur: function blur() {
var _a3;
return (_a3 = innerRef.current) === null || _a3 === void 0 ? void 0 : _a3.blur();
}
};
});
var textArea = /* @__PURE__ */ jsx(TextArea$4, {
...omit(props, ["allowClear"]),
disabled: mergedDisabled,
className: classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-borderless"), !bordered), _defineProperty$b(_classNames, className, className && !showCount), _defineProperty$b(_classNames, "".concat(prefixCls, "-sm"), size === "small" || customizeSize === "small"), _defineProperty$b(_classNames, "".concat(prefixCls, "-lg"), size === "large" || customizeSize === "large"), _classNames), getStatusClassNames(prefixCls, mergedStatus)),
style: showCount ? {
resize: style2 === null || style2 === void 0 ? void 0 : style2.resize
} : style2,
prefixCls,
onCompositionStart: onInternalCompositionStart,
onChange: handleChange,
onCompositionEnd: onInternalCompositionEnd,
ref: innerRef
});
var val = fixControlledValue(value);
if (!compositing && hasMaxLength && (props.value === null || props.value === void 0)) {
val = fixEmojiLength(val, maxLength);
}
var textareaNode = /* @__PURE__ */ jsx(ClearableLabeledInput$1, {
disabled: mergedDisabled,
...props,
prefixCls,
direction,
inputType: "text",
value: val,
element: textArea,
handleReset,
ref: clearableInputRef,
bordered,
status: customStatus,
style: showCount ? void 0 : style2
});
if (showCount || hasFeedback) {
var _classNames2;
var valueLength = _toConsumableArray$c(val).length;
var dataCount = "";
if (_typeof$q(showCount) === "object") {
dataCount = showCount.formatter({
value: val,
count: valueLength,
maxLength
});
} else {
dataCount = "".concat(valueLength).concat(hasMaxLength ? " / ".concat(maxLength) : "");
}
return /* @__PURE__ */ jsxs("div", {
hidden,
className: classnames("".concat(prefixCls, "-textarea"), (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-textarea-rtl"), direction === "rtl"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-textarea-show-count"), showCount), _defineProperty$b(_classNames2, "".concat(prefixCls, "-textarea-in-form-item"), isFormItemInput), _classNames2), getStatusClassNames("".concat(prefixCls, "-textarea"), mergedStatus, hasFeedback), className),
style: style2,
"data-count": dataCount,
children: [textareaNode, hasFeedback && /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-textarea-suffix"),
children: feedbackIcon
})]
});
}
return textareaNode;
});
const TextArea$3 = TextArea$2;
var Input$1 = InternalInput;
Input$1.Group = Group$1;
Input$1.Search = Search$1;
Input$1.TextArea = TextArea$3;
Input$1.Password = Password$1;
const Input$2 = Input$1;
var UpOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M890.5 755.3L537.9 269.2c-12.8-17.6-39-17.6-51.7 0L133.5 755.3A8 8 0 00140 768h75c5.1 0 9.9-2.5 12.9-6.6L512 369.8l284.1 391.6c3 4.1 7.8 6.6 12.9 6.6h75c6.5 0 10.3-7.4 6.5-12.7z" } }] }, "name": "up", "theme": "outlined" };
const UpOutlinedSvg = UpOutlined$2;
var UpOutlined = function UpOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: UpOutlinedSvg
})
});
};
UpOutlined.displayName = "UpOutlined";
const UpOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(UpOutlined);
function supportBigInt() {
return typeof BigInt === "function";
}
function trimNumber(numStr) {
var str = numStr.trim();
var negative = str.startsWith("-");
if (negative) {
str = str.slice(1);
}
str = str.replace(/(\.\d*[^0])0*$/, "$1").replace(/\.0*$/, "").replace(/^0+/, "");
if (str.startsWith(".")) {
str = "0".concat(str);
}
var trimStr = str || "0";
var splitNumber = trimStr.split(".");
var integerStr = splitNumber[0] || "0";
var decimalStr = splitNumber[1] || "0";
if (integerStr === "0" && decimalStr === "0") {
negative = false;
}
var negativeStr = negative ? "-" : "";
return {
negative,
negativeStr,
trimStr,
integerStr,
decimalStr,
fullStr: "".concat(negativeStr).concat(trimStr)
};
}
function isE(number2) {
var str = String(number2);
return !Number.isNaN(Number(str)) && str.includes("e");
}
function getNumberPrecision(number2) {
var numStr = String(number2);
if (isE(number2)) {
var precision = Number(numStr.slice(numStr.indexOf("e-") + 2));
var decimalMatch = numStr.match(/\.(\d+)/);
if (decimalMatch === null || decimalMatch === void 0 ? void 0 : decimalMatch[1]) {
precision += decimalMatch[1].length;
}
return precision;
}
return numStr.includes(".") && validateNumber(numStr) ? numStr.length - numStr.indexOf(".") - 1 : 0;
}
function num2str(number2) {
var numStr = String(number2);
if (isE(number2)) {
if (number2 > Number.MAX_SAFE_INTEGER) {
return String(supportBigInt() ? BigInt(number2).toString() : Number.MAX_SAFE_INTEGER);
}
if (number2 < Number.MIN_SAFE_INTEGER) {
return String(supportBigInt() ? BigInt(number2).toString() : Number.MIN_SAFE_INTEGER);
}
numStr = number2.toFixed(getNumberPrecision(numStr));
}
return trimNumber(numStr).fullStr;
}
function validateNumber(num) {
if (typeof num === "number") {
return !Number.isNaN(num);
}
if (!num) {
return false;
}
return /^\s*-?\d+(\.\d+)?\s*$/.test(num) || /^\s*-?\d+\.\s*$/.test(num) || /^\s*-?\.\d+\s*$/.test(num);
}
function getDecupleSteps(step2) {
var stepStr = typeof step2 === "number" ? num2str(step2) : trimNumber(step2).fullStr;
var hasPoint = stepStr.includes(".");
if (!hasPoint) {
return step2 + "0";
}
return trimNumber(stepStr.replace(/(\d)\.(\d)/g, "$1$2.")).fullStr;
}
var NumberDecimal = /* @__PURE__ */ function() {
function NumberDecimal2(value) {
_classCallCheck(this, NumberDecimal2);
this.origin = "";
this.number = void 0;
this.empty = void 0;
if (!value && value !== 0 || !String(value).trim()) {
this.empty = true;
return;
}
this.origin = String(value);
this.number = Number(value);
}
_createClass(NumberDecimal2, [{
key: "negate",
value: function negate2() {
return new NumberDecimal2(-this.toNumber());
}
}, {
key: "add",
value: function add(value) {
if (this.isInvalidate()) {
return new NumberDecimal2(value);
}
var target = Number(value);
if (Number.isNaN(target)) {
return this;
}
var number2 = this.number + target;
if (number2 > Number.MAX_SAFE_INTEGER) {
return new NumberDecimal2(Number.MAX_SAFE_INTEGER);
}
if (number2 < Number.MIN_SAFE_INTEGER) {
return new NumberDecimal2(Number.MIN_SAFE_INTEGER);
}
var maxPrecision = Math.max(getNumberPrecision(this.number), getNumberPrecision(target));
return new NumberDecimal2(number2.toFixed(maxPrecision));
}
}, {
key: "isEmpty",
value: function isEmpty() {
return this.empty;
}
}, {
key: "isNaN",
value: function isNaN2() {
return Number.isNaN(this.number);
}
}, {
key: "isInvalidate",
value: function isInvalidate() {
return this.isEmpty() || this.isNaN();
}
}, {
key: "equals",
value: function equals(target) {
return this.toNumber() === (target === null || target === void 0 ? void 0 : target.toNumber());
}
}, {
key: "lessEquals",
value: function lessEquals(target) {
return this.add(target.negate().toString()).toNumber() <= 0;
}
}, {
key: "toNumber",
value: function toNumber2() {
return this.number;
}
}, {
key: "toString",
value: function toString2() {
var safe = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
if (!safe) {
return this.origin;
}
if (this.isInvalidate()) {
return "";
}
return num2str(this.number);
}
}]);
return NumberDecimal2;
}();
var BigIntDecimal = /* @__PURE__ */ function() {
function BigIntDecimal2(value) {
_classCallCheck(this, BigIntDecimal2);
this.origin = "";
this.negative = void 0;
this.integer = void 0;
this.decimal = void 0;
this.decimalLen = void 0;
this.empty = void 0;
this.nan = void 0;
if (!value && value !== 0 || !String(value).trim()) {
this.empty = true;
return;
}
this.origin = String(value);
if (value === "-") {
this.nan = true;
return;
}
var mergedValue = value;
if (isE(mergedValue)) {
mergedValue = Number(mergedValue);
}
mergedValue = typeof mergedValue === "string" ? mergedValue : num2str(mergedValue);
if (validateNumber(mergedValue)) {
var trimRet = trimNumber(mergedValue);
this.negative = trimRet.negative;
var numbers = trimRet.trimStr.split(".");
this.integer = BigInt(numbers[0]);
var decimalStr = numbers[1] || "0";
this.decimal = BigInt(decimalStr);
this.decimalLen = decimalStr.length;
} else {
this.nan = true;
}
}
_createClass(BigIntDecimal2, [{
key: "getMark",
value: function getMark2() {
return this.negative ? "-" : "";
}
}, {
key: "getIntegerStr",
value: function getIntegerStr() {
return this.integer.toString();
}
}, {
key: "getDecimalStr",
value: function getDecimalStr() {
return this.decimal.toString().padStart(this.decimalLen, "0");
}
}, {
key: "alignDecimal",
value: function alignDecimal(decimalLength) {
var str = "".concat(this.getMark()).concat(this.getIntegerStr()).concat(this.getDecimalStr().padEnd(decimalLength, "0"));
return BigInt(str);
}
}, {
key: "negate",
value: function negate2() {
var clone = new BigIntDecimal2(this.toString());
clone.negative = !clone.negative;
return clone;
}
}, {
key: "add",
value: function add(value) {
if (this.isInvalidate()) {
return new BigIntDecimal2(value);
}
var offset2 = new BigIntDecimal2(value);
if (offset2.isInvalidate()) {
return this;
}
var maxDecimalLength = Math.max(this.getDecimalStr().length, offset2.getDecimalStr().length);
var myAlignedDecimal = this.alignDecimal(maxDecimalLength);
var offsetAlignedDecimal = offset2.alignDecimal(maxDecimalLength);
var valueStr = (myAlignedDecimal + offsetAlignedDecimal).toString();
var _trimNumber = trimNumber(valueStr), negativeStr = _trimNumber.negativeStr, trimStr = _trimNumber.trimStr;
var hydrateValueStr = "".concat(negativeStr).concat(trimStr.padStart(maxDecimalLength + 1, "0"));
return new BigIntDecimal2("".concat(hydrateValueStr.slice(0, -maxDecimalLength), ".").concat(hydrateValueStr.slice(-maxDecimalLength)));
}
}, {
key: "isEmpty",
value: function isEmpty() {
return this.empty;
}
}, {
key: "isNaN",
value: function isNaN2() {
return this.nan;
}
}, {
key: "isInvalidate",
value: function isInvalidate() {
return this.isEmpty() || this.isNaN();
}
}, {
key: "equals",
value: function equals(target) {
return this.toString() === (target === null || target === void 0 ? void 0 : target.toString());
}
}, {
key: "lessEquals",
value: function lessEquals(target) {
return this.add(target.negate().toString()).toNumber() <= 0;
}
}, {
key: "toNumber",
value: function toNumber2() {
if (this.isNaN()) {
return NaN;
}
return Number(this.toString());
}
}, {
key: "toString",
value: function toString2() {
var safe = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
if (!safe) {
return this.origin;
}
if (this.isInvalidate()) {
return "";
}
return trimNumber("".concat(this.getMark()).concat(this.getIntegerStr(), ".").concat(this.getDecimalStr())).fullStr;
}
}]);
return BigIntDecimal2;
}();
function getMiniDecimal(value) {
if (supportBigInt()) {
return new BigIntDecimal(value);
}
return new NumberDecimal(value);
}
function toFixed(numStr, separatorStr, precision) {
var cutOnly = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : false;
if (numStr === "") {
return "";
}
var _trimNumber2 = trimNumber(numStr), negativeStr = _trimNumber2.negativeStr, integerStr = _trimNumber2.integerStr, decimalStr = _trimNumber2.decimalStr;
var precisionDecimalStr = "".concat(separatorStr).concat(decimalStr);
var numberWithoutDecimal = "".concat(negativeStr).concat(integerStr);
if (precision >= 0) {
var advancedNum = Number(decimalStr[precision]);
if (advancedNum >= 5 && !cutOnly) {
var advancedDecimal = getMiniDecimal(numStr).add("".concat(negativeStr, "0.").concat("0".repeat(precision)).concat(10 - advancedNum));
return toFixed(advancedDecimal.toString(), separatorStr, precision, cutOnly);
}
if (precision === 0) {
return numberWithoutDecimal;
}
return "".concat(numberWithoutDecimal).concat(separatorStr).concat(decimalStr.padEnd(precision, "0").slice(0, precision));
}
if (precisionDecimalStr === ".0") {
return numberWithoutDecimal;
}
return "".concat(numberWithoutDecimal).concat(precisionDecimalStr);
}
var STEP_INTERVAL = 200;
var STEP_DELAY = 600;
function StepHandler(_ref) {
var prefixCls = _ref.prefixCls, upNode = _ref.upNode, downNode = _ref.downNode, upDisabled = _ref.upDisabled, downDisabled = _ref.downDisabled, onStep = _ref.onStep;
var stepTimeoutRef = React__namespace.useRef();
var onStepRef = React__namespace.useRef();
onStepRef.current = onStep;
var onStepMouseDown = function onStepMouseDown2(e2, up) {
e2.preventDefault();
onStepRef.current(up);
function loopStep() {
onStepRef.current(up);
stepTimeoutRef.current = setTimeout(loopStep, STEP_INTERVAL);
}
stepTimeoutRef.current = setTimeout(loopStep, STEP_DELAY);
};
var onStopStep = function onStopStep2() {
clearTimeout(stepTimeoutRef.current);
};
React__namespace.useEffect(function() {
return onStopStep;
}, []);
if (isMobile$1()) {
return null;
}
var handlerClassName = "".concat(prefixCls, "-handler");
var upClassName = classnames(handlerClassName, "".concat(handlerClassName, "-up"), _defineProperty$b({}, "".concat(handlerClassName, "-up-disabled"), upDisabled));
var downClassName = classnames(handlerClassName, "".concat(handlerClassName, "-down"), _defineProperty$b({}, "".concat(handlerClassName, "-down-disabled"), downDisabled));
var sharedHandlerProps = {
unselectable: "on",
role: "button",
onMouseUp: onStopStep,
onMouseLeave: onStopStep
};
return /* @__PURE__ */ jsxs("div", {
className: "".concat(handlerClassName, "-wrap"),
children: [/* @__PURE__ */ jsx("span", {
...sharedHandlerProps,
onMouseDown: function onMouseDown(e2) {
onStepMouseDown(e2, true);
},
"aria-label": "Increase Value",
"aria-disabled": upDisabled,
className: upClassName,
children: upNode || /* @__PURE__ */ jsx("span", {
unselectable: "on",
className: "".concat(prefixCls, "-handler-up-inner")
})
}), /* @__PURE__ */ jsx("span", {
...sharedHandlerProps,
onMouseDown: function onMouseDown(e2) {
onStepMouseDown(e2, false);
},
"aria-label": "Decrease Value",
"aria-disabled": downDisabled,
className: downClassName,
children: downNode || /* @__PURE__ */ jsx("span", {
unselectable: "on",
className: "".concat(prefixCls, "-handler-down-inner")
})
})]
});
}
function useCursor(input, focused) {
var selectionRef = React$a.useRef(null);
function recordCursor() {
try {
var start = input.selectionStart, end = input.selectionEnd, value = input.value;
var beforeTxt = value.substring(0, start);
var afterTxt = value.substring(end);
selectionRef.current = {
start,
end,
value,
beforeTxt,
afterTxt
};
} catch (e2) {
}
}
function restoreCursor() {
if (input && selectionRef.current && focused) {
try {
var value = input.value;
var _selectionRef$current = selectionRef.current, beforeTxt = _selectionRef$current.beforeTxt, afterTxt = _selectionRef$current.afterTxt, start = _selectionRef$current.start;
var startPos = value.length;
if (value.endsWith(afterTxt)) {
startPos = value.length - selectionRef.current.afterTxt.length;
} else if (value.startsWith(beforeTxt)) {
startPos = beforeTxt.length;
} else {
var beforeLastChar = beforeTxt[start - 1];
var newIndex = value.indexOf(beforeLastChar, start - 1);
if (newIndex !== -1) {
startPos = newIndex + 1;
}
}
input.setSelectionRange(startPos, startPos);
} catch (e2) {
warningOnce(false, "Something warning of cursor restore. Please fire issue about this: ".concat(e2.message));
}
}
}
return [recordCursor, restoreCursor];
}
const useFrame = function() {
var idRef = React$a.useRef(0);
var cleanUp = function cleanUp2() {
wrapperRaf$1.cancel(idRef.current);
};
React$a.useEffect(function() {
return cleanUp;
}, []);
return function(callback) {
cleanUp();
idRef.current = wrapperRaf$1(function() {
callback();
});
};
};
var _excluded$g = ["prefixCls", "className", "style", "min", "max", "step", "defaultValue", "value", "disabled", "readOnly", "upHandler", "downHandler", "keyboard", "controls", "stringMode", "parser", "formatter", "precision", "decimalSeparator", "onChange", "onInput", "onPressEnter", "onStep"];
var getDecimalValue = function getDecimalValue2(stringMode, decimalValue) {
if (stringMode || decimalValue.isEmpty()) {
return decimalValue.toString();
}
return decimalValue.toNumber();
};
var getDecimalIfValidate = function getDecimalIfValidate2(value) {
var decimal = getMiniDecimal(value);
return decimal.isInvalidate() ? null : decimal;
};
var InputNumber$2 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames;
var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-input-number" : _props$prefixCls, className = props.className, style2 = props.style, min = props.min, max = props.max, _props$step = props.step, step2 = _props$step === void 0 ? 1 : _props$step, defaultValue = props.defaultValue, value = props.value, disabled = props.disabled, readOnly = props.readOnly, upHandler = props.upHandler, downHandler = props.downHandler, keyboard = props.keyboard, _props$controls = props.controls, controls = _props$controls === void 0 ? true : _props$controls, stringMode = props.stringMode, parser = props.parser, formatter = props.formatter, precision = props.precision, decimalSeparator = props.decimalSeparator, onChange = props.onChange, onInput = props.onInput, onPressEnter = props.onPressEnter, onStep = props.onStep, inputProps = _objectWithoutProperties$1(props, _excluded$g);
var inputClassName = "".concat(prefixCls, "-input");
var inputRef = React__namespace.useRef(null);
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), focus = _React$useState2[0], setFocus = _React$useState2[1];
var userTypingRef = React__namespace.useRef(false);
var compositionRef = React__namespace.useRef(false);
var shiftKeyRef = React__namespace.useRef(false);
var _React$useState3 = React__namespace.useState(function() {
return getMiniDecimal(value !== null && value !== void 0 ? value : defaultValue);
}), _React$useState4 = _slicedToArray$e(_React$useState3, 2), decimalValue = _React$useState4[0], setDecimalValue = _React$useState4[1];
function setUncontrolledDecimalValue(newDecimal) {
if (value === void 0) {
setDecimalValue(newDecimal);
}
}
var getPrecision = React__namespace.useCallback(function(numStr, userTyping) {
if (userTyping) {
return void 0;
}
if (precision >= 0) {
return precision;
}
return Math.max(getNumberPrecision(numStr), getNumberPrecision(step2));
}, [precision, step2]);
var mergedParser = React__namespace.useCallback(function(num) {
var numStr = String(num);
if (parser) {
return parser(numStr);
}
var parsedStr = numStr;
if (decimalSeparator) {
parsedStr = parsedStr.replace(decimalSeparator, ".");
}
return parsedStr.replace(/[^\w.-]+/g, "");
}, [parser, decimalSeparator]);
var inputValueRef = React__namespace.useRef("");
var mergedFormatter = React__namespace.useCallback(function(number2, userTyping) {
if (formatter) {
return formatter(number2, {
userTyping,
input: String(inputValueRef.current)
});
}
var str = typeof number2 === "number" ? num2str(number2) : number2;
if (!userTyping) {
var mergedPrecision = getPrecision(str, userTyping);
if (validateNumber(str) && (decimalSeparator || mergedPrecision >= 0)) {
var separatorStr = decimalSeparator || ".";
str = toFixed(str, separatorStr, mergedPrecision);
}
}
return str;
}, [formatter, getPrecision, decimalSeparator]);
var _React$useState5 = React__namespace.useState(function() {
var initValue = defaultValue !== null && defaultValue !== void 0 ? defaultValue : value;
if (decimalValue.isInvalidate() && ["string", "number"].includes(_typeof$q(initValue))) {
return Number.isNaN(initValue) ? "" : initValue;
}
return mergedFormatter(decimalValue.toString(), false);
}), _React$useState6 = _slicedToArray$e(_React$useState5, 2), inputValue = _React$useState6[0], setInternalInputValue = _React$useState6[1];
inputValueRef.current = inputValue;
function setInputValue(newValue, userTyping) {
setInternalInputValue(mergedFormatter(
newValue.isInvalidate() ? newValue.toString(false) : newValue.toString(!userTyping),
userTyping
));
}
var maxDecimal = React__namespace.useMemo(function() {
return getDecimalIfValidate(max);
}, [max, precision]);
var minDecimal = React__namespace.useMemo(function() {
return getDecimalIfValidate(min);
}, [min, precision]);
var upDisabled = React__namespace.useMemo(function() {
if (!maxDecimal || !decimalValue || decimalValue.isInvalidate()) {
return false;
}
return maxDecimal.lessEquals(decimalValue);
}, [maxDecimal, decimalValue]);
var downDisabled = React__namespace.useMemo(function() {
if (!minDecimal || !decimalValue || decimalValue.isInvalidate()) {
return false;
}
return decimalValue.lessEquals(minDecimal);
}, [minDecimal, decimalValue]);
var _useCursor = useCursor(inputRef.current, focus), _useCursor2 = _slicedToArray$e(_useCursor, 2), recordCursor = _useCursor2[0], restoreCursor = _useCursor2[1];
var getRangeValue = function getRangeValue2(target) {
if (maxDecimal && !target.lessEquals(maxDecimal)) {
return maxDecimal;
}
if (minDecimal && !minDecimal.lessEquals(target)) {
return minDecimal;
}
return null;
};
var isInRange2 = function isInRange3(target) {
return !getRangeValue(target);
};
var triggerValueUpdate = function triggerValueUpdate2(newValue, userTyping) {
var updateValue = newValue;
var isRangeValidate = isInRange2(updateValue) || updateValue.isEmpty();
if (!updateValue.isEmpty() && !userTyping) {
updateValue = getRangeValue(updateValue) || updateValue;
isRangeValidate = true;
}
if (!readOnly && !disabled && isRangeValidate) {
var numStr = updateValue.toString();
var mergedPrecision = getPrecision(numStr, userTyping);
if (mergedPrecision >= 0) {
updateValue = getMiniDecimal(toFixed(numStr, ".", mergedPrecision));
if (!isInRange2(updateValue)) {
updateValue = getMiniDecimal(toFixed(numStr, ".", mergedPrecision, true));
}
}
if (!updateValue.equals(decimalValue)) {
setUncontrolledDecimalValue(updateValue);
onChange === null || onChange === void 0 ? void 0 : onChange(updateValue.isEmpty() ? null : getDecimalValue(stringMode, updateValue));
if (value === void 0) {
setInputValue(updateValue, userTyping);
}
}
return updateValue;
}
return decimalValue;
};
var onNextPromise = useFrame();
var collectInputValue = function collectInputValue2(inputStr) {
recordCursor();
setInternalInputValue(inputStr);
if (!compositionRef.current) {
var finalValue = mergedParser(inputStr);
var finalDecimal = getMiniDecimal(finalValue);
if (!finalDecimal.isNaN()) {
triggerValueUpdate(finalDecimal, true);
}
}
onInput === null || onInput === void 0 ? void 0 : onInput(inputStr);
onNextPromise(function() {
var nextInputStr = inputStr;
if (!parser) {
nextInputStr = inputStr.replace(/。/g, ".");
}
if (nextInputStr !== inputStr) {
collectInputValue2(nextInputStr);
}
});
};
var onCompositionStart = function onCompositionStart2() {
compositionRef.current = true;
};
var onCompositionEnd = function onCompositionEnd2() {
compositionRef.current = false;
collectInputValue(inputRef.current.value);
};
var onInternalInput = function onInternalInput2(e2) {
collectInputValue(e2.target.value);
};
var onInternalStep = function onInternalStep2(up) {
var _inputRef$current;
if (up && upDisabled || !up && downDisabled) {
return;
}
userTypingRef.current = false;
var stepDecimal = getMiniDecimal(shiftKeyRef.current ? getDecupleSteps(step2) : step2);
if (!up) {
stepDecimal = stepDecimal.negate();
}
var target = (decimalValue || getMiniDecimal(0)).add(stepDecimal.toString());
var updatedValue = triggerValueUpdate(target, false);
onStep === null || onStep === void 0 ? void 0 : onStep(getDecimalValue(stringMode, updatedValue), {
offset: shiftKeyRef.current ? getDecupleSteps(step2) : step2,
type: up ? "up" : "down"
});
(_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus();
};
var flushInputValue = function flushInputValue2(userTyping) {
var parsedValue = getMiniDecimal(mergedParser(inputValue));
var formatValue2 = parsedValue;
if (!parsedValue.isNaN()) {
formatValue2 = triggerValueUpdate(parsedValue, userTyping);
} else {
formatValue2 = decimalValue;
}
if (value !== void 0) {
setInputValue(decimalValue, false);
} else if (!formatValue2.isNaN()) {
setInputValue(formatValue2, false);
}
};
var onBeforeInput = function onBeforeInput2() {
userTypingRef.current = true;
};
var onKeyDown2 = function onKeyDown3(event) {
var which = event.which, shiftKey = event.shiftKey;
userTypingRef.current = true;
if (shiftKey) {
shiftKeyRef.current = true;
} else {
shiftKeyRef.current = false;
}
if (which === KeyCode.ENTER) {
if (!compositionRef.current) {
userTypingRef.current = false;
}
flushInputValue(false);
onPressEnter === null || onPressEnter === void 0 ? void 0 : onPressEnter(event);
}
if (keyboard === false) {
return;
}
if (!compositionRef.current && [KeyCode.UP, KeyCode.DOWN].includes(which)) {
onInternalStep(KeyCode.UP === which);
event.preventDefault();
}
};
var onKeyUp = function onKeyUp2() {
userTypingRef.current = false;
shiftKeyRef.current = false;
};
var onBlur = function onBlur2() {
flushInputValue(false);
setFocus(false);
userTypingRef.current = false;
};
useLayoutUpdateEffect(function() {
if (!decimalValue.isInvalidate()) {
setInputValue(decimalValue, false);
}
}, [precision]);
useLayoutUpdateEffect(function() {
var newValue = getMiniDecimal(value);
setDecimalValue(newValue);
var currentParsedValue = getMiniDecimal(mergedParser(inputValue));
if (!newValue.equals(currentParsedValue) || !userTypingRef.current || formatter) {
setInputValue(newValue, userTypingRef.current);
}
}, [value]);
useLayoutUpdateEffect(function() {
if (formatter) {
restoreCursor();
}
}, [inputValue]);
return /* @__PURE__ */ jsxs("div", {
className: classnames(prefixCls, className, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-focused"), focus), _defineProperty$b(_classNames, "".concat(prefixCls, "-disabled"), disabled), _defineProperty$b(_classNames, "".concat(prefixCls, "-readonly"), readOnly), _defineProperty$b(_classNames, "".concat(prefixCls, "-not-a-number"), decimalValue.isNaN()), _defineProperty$b(_classNames, "".concat(prefixCls, "-out-of-range"), !decimalValue.isInvalidate() && !isInRange2(decimalValue)), _classNames)),
style: style2,
onFocus: function onFocus() {
setFocus(true);
},
onBlur,
onKeyDown: onKeyDown2,
onKeyUp,
onCompositionStart,
onCompositionEnd,
onBeforeInput,
children: [controls && /* @__PURE__ */ jsx(StepHandler, {
prefixCls,
upNode: upHandler,
downNode: downHandler,
upDisabled,
downDisabled,
onStep: onInternalStep
}), /* @__PURE__ */ jsx("div", {
className: "".concat(inputClassName, "-wrap"),
children: /* @__PURE__ */ jsx("input", {
autoComplete: "off",
role: "spinbutton",
"aria-valuemin": min,
"aria-valuemax": max,
"aria-valuenow": decimalValue.isInvalidate() ? null : decimalValue.toString(),
step: step2,
...inputProps,
ref: composeRef(inputRef, ref),
className: inputClassName,
value: inputValue,
onChange: onInternalInput,
disabled,
readOnly
})
})]
});
});
InputNumber$2.displayName = "InputNumber";
var __rest$d = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var InputNumber$1 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var size = React__namespace.useContext(SizeContext$1);
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), focused = _React$useState2[0], setFocus = _React$useState2[1];
var inputRef = React__namespace.useRef(null);
React__namespace.useImperativeHandle(ref, function() {
return inputRef.current;
});
var className = props.className, customizeSize = props.size, customDisabled = props.disabled, customizePrefixCls = props.prefixCls, addonBefore = props.addonBefore, addonAfter = props.addonAfter, prefix = props.prefix, _props$bordered = props.bordered, bordered = _props$bordered === void 0 ? true : _props$bordered, readOnly = props.readOnly, customStatus = props.status, controls = props.controls, others = __rest$d(props, ["className", "size", "disabled", "prefixCls", "addonBefore", "addonAfter", "prefix", "bordered", "readOnly", "status", "controls"]);
var prefixCls = getPrefixCls("input-number", customizePrefixCls);
var _useCompactItemContex = useCompactItemContext(prefixCls, direction), compactSize = _useCompactItemContex.compactSize, compactItemClassnames = _useCompactItemContex.compactItemClassnames;
var upIcon = /* @__PURE__ */ jsx(UpOutlined$1, {
className: "".concat(prefixCls, "-handler-up-inner")
});
var downIcon = /* @__PURE__ */ jsx(DownOutlined$4, {
className: "".concat(prefixCls, "-handler-down-inner")
});
var controlsTemp = typeof controls === "boolean" ? controls : void 0;
if (_typeof$q(controls) === "object") {
upIcon = typeof controls.upIcon === "undefined" ? upIcon : /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-handler-up-inner"),
children: controls.upIcon
});
downIcon = typeof controls.downIcon === "undefined" ? downIcon : /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-handler-down-inner"),
children: controls.downIcon
});
}
var _useContext = React$a.useContext(FormItemInputContext), hasFeedback = _useContext.hasFeedback, contextStatus = _useContext.status, isFormItemInput = _useContext.isFormItemInput, feedbackIcon = _useContext.feedbackIcon;
var mergedStatus = getMergedStatus(contextStatus, customStatus);
var mergeSize = compactSize || customizeSize || size;
var disabled = React__namespace.useContext(DisabledContext$1);
var mergedDisabled = customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled;
var inputNumberClass = classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-lg"), mergeSize === "large"), _defineProperty$b(_classNames, "".concat(prefixCls, "-sm"), mergeSize === "small"), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-borderless"), !bordered), _defineProperty$b(_classNames, "".concat(prefixCls, "-in-form-item"), isFormItemInput), _classNames), getStatusClassNames(prefixCls, mergedStatus), compactItemClassnames, className);
var element = /* @__PURE__ */ jsx(InputNumber$2, {
ref: inputRef,
disabled: mergedDisabled,
className: inputNumberClass,
upHandler: upIcon,
downHandler: downIcon,
prefixCls,
readOnly,
controls: controlsTemp,
...others
});
if (prefix != null || hasFeedback) {
var _classNames2;
var affixWrapperCls = classnames("".concat(prefixCls, "-affix-wrapper"), getStatusClassNames("".concat(prefixCls, "-affix-wrapper"), mergedStatus, hasFeedback), (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-focused"), focused), _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-disabled"), props.disabled), _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-sm"), size === "small"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-lg"), size === "large"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-rtl"), direction === "rtl"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-readonly"), readOnly), _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-borderless"), !bordered), _defineProperty$b(_classNames2, "".concat(className), !(addonBefore || addonAfter) && className), _classNames2));
element = /* @__PURE__ */ jsxs("div", {
className: affixWrapperCls,
style: props.style,
onMouseUp: function onMouseUp() {
return inputRef.current.focus();
},
children: [prefix && /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-prefix"),
children: prefix
}), cloneElement(element, {
style: null,
value: props.value,
onFocus: function onFocus(event) {
var _a;
setFocus(true);
(_a = props.onFocus) === null || _a === void 0 ? void 0 : _a.call(props, event);
},
onBlur: function onBlur(event) {
var _a;
setFocus(false);
(_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, event);
}
}), hasFeedback && /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-suffix"),
children: feedbackIcon
})]
});
}
if (addonBefore != null || addonAfter != null) {
var _classNames4;
var wrapperClassName = "".concat(prefixCls, "-group");
var addonClassName = "".concat(wrapperClassName, "-addon");
var addonBeforeNode = addonBefore ? /* @__PURE__ */ jsx("div", {
className: addonClassName,
children: addonBefore
}) : null;
var addonAfterNode = addonAfter ? /* @__PURE__ */ jsx("div", {
className: addonClassName,
children: addonAfter
}) : null;
var mergedWrapperClassName = classnames("".concat(prefixCls, "-wrapper"), wrapperClassName, _defineProperty$b({}, "".concat(wrapperClassName, "-rtl"), direction === "rtl"));
var mergedGroupClassName = classnames("".concat(prefixCls, "-group-wrapper"), (_classNames4 = {}, _defineProperty$b(_classNames4, "".concat(prefixCls, "-group-wrapper-sm"), size === "small"), _defineProperty$b(_classNames4, "".concat(prefixCls, "-group-wrapper-lg"), size === "large"), _defineProperty$b(_classNames4, "".concat(prefixCls, "-group-wrapper-rtl"), direction === "rtl"), _classNames4), getStatusClassNames("".concat(prefixCls, "-group-wrapper"), mergedStatus, hasFeedback), className);
element = /* @__PURE__ */ jsx("div", {
className: mergedGroupClassName,
style: props.style,
children: /* @__PURE__ */ jsxs("div", {
className: mergedWrapperClassName,
children: [addonBeforeNode && /* @__PURE__ */ jsx(NoCompactStyle, {
children: /* @__PURE__ */ jsx(NoFormStyle, {
status: true,
override: true,
children: addonBeforeNode
})
}), cloneElement(element, {
style: null,
disabled: mergedDisabled
}), addonAfterNode && /* @__PURE__ */ jsx(NoCompactStyle, {
children: /* @__PURE__ */ jsx(NoFormStyle, {
status: true,
override: true,
children: addonAfterNode
})
})]
})
});
}
return element;
});
const _InputNumber = InputNumber$1;
var DoubleLeftOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M272.9 512l265.4-339.1c4.1-5.2.4-12.9-6.3-12.9h-77.3c-4.9 0-9.6 2.3-12.6 6.1L186.8 492.3a31.99 31.99 0 000 39.5l255.3 326.1c3 3.9 7.7 6.1 12.6 6.1H532c6.7 0 10.4-7.7 6.3-12.9L272.9 512zm304 0l265.4-339.1c4.1-5.2.4-12.9-6.3-12.9h-77.3c-4.9 0-9.6 2.3-12.6 6.1L490.8 492.3a31.99 31.99 0 000 39.5l255.3 326.1c3 3.9 7.7 6.1 12.6 6.1H836c6.7 0 10.4-7.7 6.3-12.9L576.9 512z" } }] }, "name": "double-left", "theme": "outlined" };
const DoubleLeftOutlinedSvg = DoubleLeftOutlined$2;
var DoubleLeftOutlined = function DoubleLeftOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: DoubleLeftOutlinedSvg
})
});
};
DoubleLeftOutlined.displayName = "DoubleLeftOutlined";
const DoubleLeftOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(DoubleLeftOutlined);
var DoubleRightOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M533.2 492.3L277.9 166.1c-3-3.9-7.7-6.1-12.6-6.1H188c-6.7 0-10.4 7.7-6.3 12.9L447.1 512 181.7 851.1A7.98 7.98 0 00188 864h77.3c4.9 0 9.6-2.3 12.6-6.1l255.3-326.1c9.1-11.7 9.1-27.9 0-39.5zm304 0L581.9 166.1c-3-3.9-7.7-6.1-12.6-6.1H492c-6.7 0-10.4 7.7-6.3 12.9L751.1 512 485.7 851.1A7.98 7.98 0 00492 864h77.3c4.9 0 9.6-2.3 12.6-6.1l255.3-326.1c9.1-11.7 9.1-27.9 0-39.5z" } }] }, "name": "double-right", "theme": "outlined" };
const DoubleRightOutlinedSvg = DoubleRightOutlined$2;
var DoubleRightOutlined = function DoubleRightOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: DoubleRightOutlinedSvg
})
});
};
DoubleRightOutlined.displayName = "DoubleRightOutlined";
const DoubleRightOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(DoubleRightOutlined);
var Pager = function Pager2(props) {
var _classNames;
var prefixCls = "".concat(props.rootPrefixCls, "-item");
var cls = classnames(prefixCls, "".concat(prefixCls, "-").concat(props.page), (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-active"), props.active), _defineProperty$b(_classNames, "".concat(prefixCls, "-disabled"), !props.page), _defineProperty$b(_classNames, props.className, !!props.className), _classNames));
var handleClick = function handleClick2() {
props.onClick(props.page);
};
var handleKeyPress = function handleKeyPress2(e2) {
props.onKeyPress(e2, props.onClick, props.page);
};
return /* @__PURE__ */ jsx("li", {
title: props.showTitle ? props.page : null,
className: cls,
onClick: handleClick,
onKeyPress: handleKeyPress,
tabIndex: "0",
children: props.itemRender(
props.page,
"page",
/* @__PURE__ */ jsx("a", {
rel: "nofollow",
children: props.page
})
)
});
};
const KEYCODE = {
ZERO: 48,
NINE: 57,
NUMPAD_ZERO: 96,
NUMPAD_NINE: 105,
BACKSPACE: 8,
DELETE: 46,
ENTER: 13,
ARROW_UP: 38,
ARROW_DOWN: 40
};
var Options = /* @__PURE__ */ function(_React$Component) {
_inherits(Options2, _React$Component);
var _super = _createSuper(Options2);
function Options2() {
var _this2;
_classCallCheck(this, Options2);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_this2.state = {
goInputText: ""
};
_this2.buildOptionText = function(value) {
return "".concat(value, " ").concat(_this2.props.locale.items_per_page);
};
_this2.changeSize = function(value) {
_this2.props.changeSize(Number(value));
};
_this2.handleChange = function(e2) {
_this2.setState({
goInputText: e2.target.value
});
};
_this2.handleBlur = function(e2) {
var _this$props = _this2.props, goButton = _this$props.goButton, quickGo = _this$props.quickGo, rootPrefixCls = _this$props.rootPrefixCls;
var goInputText = _this2.state.goInputText;
if (goButton || goInputText === "") {
return;
}
_this2.setState({
goInputText: ""
});
if (e2.relatedTarget && (e2.relatedTarget.className.indexOf("".concat(rootPrefixCls, "-item-link")) >= 0 || e2.relatedTarget.className.indexOf("".concat(rootPrefixCls, "-item")) >= 0)) {
return;
}
quickGo(_this2.getValidValue());
};
_this2.go = function(e2) {
var goInputText = _this2.state.goInputText;
if (goInputText === "") {
return;
}
if (e2.keyCode === KEYCODE.ENTER || e2.type === "click") {
_this2.setState({
goInputText: ""
});
_this2.props.quickGo(_this2.getValidValue());
}
};
return _this2;
}
_createClass(Options2, [{
key: "getValidValue",
value: function getValidValue() {
var goInputText = this.state.goInputText;
return !goInputText || isNaN(goInputText) ? void 0 : Number(goInputText);
}
}, {
key: "getPageSizeOptions",
value: function getPageSizeOptions() {
var _this$props2 = this.props, pageSize = _this$props2.pageSize, pageSizeOptions = _this$props2.pageSizeOptions;
if (pageSizeOptions.some(function(option) {
return option.toString() === pageSize.toString();
})) {
return pageSizeOptions;
}
return pageSizeOptions.concat([pageSize.toString()]).sort(function(a, b2) {
var numberA = isNaN(Number(a)) ? 0 : Number(a);
var numberB = isNaN(Number(b2)) ? 0 : Number(b2);
return numberA - numberB;
});
}
}, {
key: "render",
value: function render2() {
var _this2 = this;
var _this$props3 = this.props, pageSize = _this$props3.pageSize, locale2 = _this$props3.locale, rootPrefixCls = _this$props3.rootPrefixCls, changeSize = _this$props3.changeSize, quickGo = _this$props3.quickGo, goButton = _this$props3.goButton, selectComponentClass = _this$props3.selectComponentClass, buildOptionText = _this$props3.buildOptionText, selectPrefixCls = _this$props3.selectPrefixCls, disabled = _this$props3.disabled;
var goInputText = this.state.goInputText;
var prefixCls = "".concat(rootPrefixCls, "-options");
var Select2 = selectComponentClass;
var changeSelect = null;
var goInput = null;
var gotoButton = null;
if (!changeSize && !quickGo) {
return null;
}
var pageSizeOptions = this.getPageSizeOptions();
if (changeSize && Select2) {
var options = pageSizeOptions.map(function(opt, i2) {
return /* @__PURE__ */ jsx(Select2.Option, {
value: opt.toString(),
children: (buildOptionText || _this2.buildOptionText)(opt)
}, i2);
});
changeSelect = /* @__PURE__ */ jsx(Select2, {
disabled,
prefixCls: selectPrefixCls,
showSearch: false,
className: "".concat(prefixCls, "-size-changer"),
optionLabelProp: "children",
dropdownMatchSelectWidth: false,
value: (pageSize || pageSizeOptions[0]).toString(),
onChange: this.changeSize,
getPopupContainer: function getPopupContainer(triggerNode) {
return triggerNode.parentNode;
},
"aria-label": locale2.page_size,
defaultOpen: false,
children: options
});
}
if (quickGo) {
if (goButton) {
gotoButton = typeof goButton === "boolean" ? /* @__PURE__ */ jsx("button", {
type: "button",
onClick: this.go,
onKeyUp: this.go,
disabled,
className: "".concat(prefixCls, "-quick-jumper-button"),
children: locale2.jump_to_confirm
}) : /* @__PURE__ */ jsx("span", {
onClick: this.go,
onKeyUp: this.go,
children: goButton
});
}
goInput = /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-quick-jumper"),
children: [locale2.jump_to, /* @__PURE__ */ jsx("input", {
disabled,
type: "text",
value: goInputText,
onChange: this.handleChange,
onKeyUp: this.go,
onBlur: this.handleBlur,
"aria-label": locale2.page
}), locale2.page, gotoButton]
});
}
return /* @__PURE__ */ jsxs("li", {
className: "".concat(prefixCls),
children: [changeSelect, goInput]
});
}
}]);
return Options2;
}(React__default.default.Component);
Options.defaultProps = {
pageSizeOptions: ["10", "20", "50", "100"]
};
const LOCALE = {
items_per_page: "\u6761/\u9875",
jump_to: "\u8DF3\u81F3",
jump_to_confirm: "\u786E\u5B9A",
page: "\u9875",
prev_page: "\u4E0A\u4E00\u9875",
next_page: "\u4E0B\u4E00\u9875",
prev_5: "\u5411\u524D 5 \u9875",
next_5: "\u5411\u540E 5 \u9875",
prev_3: "\u5411\u524D 3 \u9875",
next_3: "\u5411\u540E 3 \u9875",
page_size: "\u9875\u7801"
};
function noop$5() {
}
function isInteger(v2) {
var value = Number(v2);
return typeof value === "number" && !isNaN(value) && isFinite(value) && Math.floor(value) === value;
}
function defaultItemRender(page, type2, element) {
return element;
}
function calculatePage(p2, state, props) {
var pageSize = typeof p2 === "undefined" ? state.pageSize : p2;
return Math.floor((props.total - 1) / pageSize) + 1;
}
var Pagination$2 = /* @__PURE__ */ function(_React$Component) {
_inherits(Pagination2, _React$Component);
var _super = _createSuper(Pagination2);
function Pagination2(props) {
var _this2;
_classCallCheck(this, Pagination2);
_this2 = _super.call(this, props);
_this2.getJumpPrevPage = function() {
return Math.max(1, _this2.state.current - (_this2.props.showLessItems ? 3 : 5));
};
_this2.getJumpNextPage = function() {
return Math.min(calculatePage(void 0, _this2.state, _this2.props), _this2.state.current + (_this2.props.showLessItems ? 3 : 5));
};
_this2.getItemIcon = function(icon, label) {
var prefixCls = _this2.props.prefixCls;
var iconNode = icon || /* @__PURE__ */ jsx("button", {
type: "button",
"aria-label": label,
className: "".concat(prefixCls, "-item-link")
});
if (typeof icon === "function") {
iconNode = /* @__PURE__ */ React__default.default.createElement(icon, _objectSpread2$a({}, _this2.props));
}
return iconNode;
};
_this2.savePaginationNode = function(node) {
_this2.paginationNode = node;
};
_this2.isValid = function(page) {
var total = _this2.props.total;
return isInteger(page) && page !== _this2.state.current && isInteger(total) && total > 0;
};
_this2.shouldDisplayQuickJumper = function() {
var _this$props = _this2.props, showQuickJumper = _this$props.showQuickJumper, total = _this$props.total;
var pageSize = _this2.state.pageSize;
if (total <= pageSize) {
return false;
}
return showQuickJumper;
};
_this2.handleKeyDown = function(e2) {
if (e2.keyCode === KEYCODE.ARROW_UP || e2.keyCode === KEYCODE.ARROW_DOWN) {
e2.preventDefault();
}
};
_this2.handleKeyUp = function(e2) {
var value = _this2.getValidValue(e2);
var currentInputValue = _this2.state.currentInputValue;
if (value !== currentInputValue) {
_this2.setState({
currentInputValue: value
});
}
if (e2.keyCode === KEYCODE.ENTER) {
_this2.handleChange(value);
} else if (e2.keyCode === KEYCODE.ARROW_UP) {
_this2.handleChange(value - 1);
} else if (e2.keyCode === KEYCODE.ARROW_DOWN) {
_this2.handleChange(value + 1);
}
};
_this2.handleBlur = function(e2) {
var value = _this2.getValidValue(e2);
_this2.handleChange(value);
};
_this2.changePageSize = function(size) {
var current = _this2.state.current;
var newCurrent = calculatePage(size, _this2.state, _this2.props);
current = current > newCurrent ? newCurrent : current;
if (newCurrent === 0) {
current = _this2.state.current;
}
if (typeof size === "number") {
if (!("pageSize" in _this2.props)) {
_this2.setState({
pageSize: size
});
}
if (!("current" in _this2.props)) {
_this2.setState({
current,
currentInputValue: current
});
}
}
_this2.props.onShowSizeChange(current, size);
if ("onChange" in _this2.props && _this2.props.onChange) {
_this2.props.onChange(current, size);
}
};
_this2.handleChange = function(page) {
var _this$props2 = _this2.props, disabled = _this$props2.disabled, onChange = _this$props2.onChange;
var _this$state = _this2.state, pageSize = _this$state.pageSize, current = _this$state.current, currentInputValue = _this$state.currentInputValue;
if (_this2.isValid(page) && !disabled) {
var currentPage = calculatePage(void 0, _this2.state, _this2.props);
var newPage = page;
if (page > currentPage) {
newPage = currentPage;
} else if (page < 1) {
newPage = 1;
}
if (!("current" in _this2.props)) {
_this2.setState({
current: newPage
});
}
if (newPage !== currentInputValue) {
_this2.setState({
currentInputValue: newPage
});
}
onChange(newPage, pageSize);
return newPage;
}
return current;
};
_this2.prev = function() {
if (_this2.hasPrev()) {
_this2.handleChange(_this2.state.current - 1);
}
};
_this2.next = function() {
if (_this2.hasNext()) {
_this2.handleChange(_this2.state.current + 1);
}
};
_this2.jumpPrev = function() {
_this2.handleChange(_this2.getJumpPrevPage());
};
_this2.jumpNext = function() {
_this2.handleChange(_this2.getJumpNextPage());
};
_this2.hasPrev = function() {
return _this2.state.current > 1;
};
_this2.hasNext = function() {
return _this2.state.current < calculatePage(void 0, _this2.state, _this2.props);
};
_this2.runIfEnter = function(event, callback) {
if (event.key === "Enter" || event.charCode === 13) {
for (var _len = arguments.length, restParams = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
restParams[_key - 2] = arguments[_key];
}
callback.apply(void 0, restParams);
}
};
_this2.runIfEnterPrev = function(e2) {
_this2.runIfEnter(e2, _this2.prev);
};
_this2.runIfEnterNext = function(e2) {
_this2.runIfEnter(e2, _this2.next);
};
_this2.runIfEnterJumpPrev = function(e2) {
_this2.runIfEnter(e2, _this2.jumpPrev);
};
_this2.runIfEnterJumpNext = function(e2) {
_this2.runIfEnter(e2, _this2.jumpNext);
};
_this2.handleGoTO = function(e2) {
if (e2.keyCode === KEYCODE.ENTER || e2.type === "click") {
_this2.handleChange(_this2.state.currentInputValue);
}
};
var hasOnChange = props.onChange !== noop$5;
var hasCurrent = "current" in props;
if (hasCurrent && !hasOnChange) {
console.warn("Warning: You provided a `current` prop to a Pagination component without an `onChange` handler. This will render a read-only component.");
}
var _current = props.defaultCurrent;
if ("current" in props) {
_current = props.current;
}
var _pageSize = props.defaultPageSize;
if ("pageSize" in props) {
_pageSize = props.pageSize;
}
_current = Math.min(_current, calculatePage(_pageSize, void 0, props));
_this2.state = {
current: _current,
currentInputValue: _current,
pageSize: _pageSize
};
return _this2;
}
_createClass(Pagination2, [{
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps, prevState) {
var prefixCls = this.props.prefixCls;
if (prevState.current !== this.state.current && this.paginationNode) {
var lastCurrentNode = this.paginationNode.querySelector(".".concat(prefixCls, "-item-").concat(prevState.current));
if (lastCurrentNode && document.activeElement === lastCurrentNode) {
lastCurrentNode.blur();
}
}
}
}, {
key: "getValidValue",
value: function getValidValue(e2) {
var inputValue = e2.target.value;
var allPages = calculatePage(void 0, this.state, this.props);
var currentInputValue = this.state.currentInputValue;
var value;
if (inputValue === "") {
value = inputValue;
} else if (isNaN(Number(inputValue))) {
value = currentInputValue;
} else if (inputValue >= allPages) {
value = allPages;
} else {
value = Number(inputValue);
}
return value;
}
}, {
key: "getShowSizeChanger",
value: function getShowSizeChanger() {
var _this$props3 = this.props, showSizeChanger = _this$props3.showSizeChanger, total = _this$props3.total, totalBoundaryShowSizeChanger = _this$props3.totalBoundaryShowSizeChanger;
if (typeof showSizeChanger !== "undefined") {
return showSizeChanger;
}
return total > totalBoundaryShowSizeChanger;
}
}, {
key: "renderPrev",
value: function renderPrev(prevPage) {
var _this$props4 = this.props, prevIcon = _this$props4.prevIcon, itemRender = _this$props4.itemRender;
var prevButton = itemRender(prevPage, "prev", this.getItemIcon(prevIcon, "prev page"));
var disabled = !this.hasPrev();
return /* @__PURE__ */ React$a.isValidElement(prevButton) ? /* @__PURE__ */ React$a.cloneElement(prevButton, {
disabled
}) : prevButton;
}
}, {
key: "renderNext",
value: function renderNext(nextPage) {
var _this$props5 = this.props, nextIcon = _this$props5.nextIcon, itemRender = _this$props5.itemRender;
var nextButton = itemRender(nextPage, "next", this.getItemIcon(nextIcon, "next page"));
var disabled = !this.hasNext();
return /* @__PURE__ */ React$a.isValidElement(nextButton) ? /* @__PURE__ */ React$a.cloneElement(nextButton, {
disabled
}) : nextButton;
}
}, {
key: "render",
value: function render2() {
var _this2 = this;
var _this$props6 = this.props, prefixCls = _this$props6.prefixCls, className = _this$props6.className, style2 = _this$props6.style, disabled = _this$props6.disabled, hideOnSinglePage = _this$props6.hideOnSinglePage, total = _this$props6.total, locale2 = _this$props6.locale, showQuickJumper = _this$props6.showQuickJumper, showLessItems = _this$props6.showLessItems, showTitle = _this$props6.showTitle, showTotal = _this$props6.showTotal, simple = _this$props6.simple, itemRender = _this$props6.itemRender, showPrevNextJumpers = _this$props6.showPrevNextJumpers, jumpPrevIcon = _this$props6.jumpPrevIcon, jumpNextIcon = _this$props6.jumpNextIcon, selectComponentClass = _this$props6.selectComponentClass, selectPrefixCls = _this$props6.selectPrefixCls, pageSizeOptions = _this$props6.pageSizeOptions;
var _this$state2 = this.state, current = _this$state2.current, pageSize = _this$state2.pageSize, currentInputValue = _this$state2.currentInputValue;
if (hideOnSinglePage === true && total <= pageSize) {
return null;
}
var allPages = calculatePage(void 0, this.state, this.props);
var pagerList = [];
var jumpPrev = null;
var jumpNext = null;
var firstPager = null;
var lastPager = null;
var gotoButton = null;
var goButton = showQuickJumper && showQuickJumper.goButton;
var pageBufferSize = showLessItems ? 1 : 2;
var prevPage = current - 1 > 0 ? current - 1 : 0;
var nextPage = current + 1 < allPages ? current + 1 : allPages;
var dataOrAriaAttributeProps = Object.keys(this.props).reduce(function(prev, key2) {
if (key2.substr(0, 5) === "data-" || key2.substr(0, 5) === "aria-" || key2 === "role") {
prev[key2] = _this2.props[key2];
}
return prev;
}, {});
var totalText = showTotal && /* @__PURE__ */ jsx("li", {
className: "".concat(prefixCls, "-total-text"),
children: showTotal(total, [total === 0 ? 0 : (current - 1) * pageSize + 1, current * pageSize > total ? total : current * pageSize])
});
if (simple) {
if (goButton) {
if (typeof goButton === "boolean") {
gotoButton = /* @__PURE__ */ jsx("button", {
type: "button",
onClick: this.handleGoTO,
onKeyUp: this.handleGoTO,
children: locale2.jump_to_confirm
});
} else {
gotoButton = /* @__PURE__ */ jsx("span", {
onClick: this.handleGoTO,
onKeyUp: this.handleGoTO,
children: goButton
});
}
gotoButton = /* @__PURE__ */ jsx("li", {
title: showTitle ? "".concat(locale2.jump_to).concat(current, "/").concat(allPages) : null,
className: "".concat(prefixCls, "-simple-pager"),
children: gotoButton
});
}
return /* @__PURE__ */ jsxs("ul", {
className: classnames(prefixCls, "".concat(prefixCls, "-simple"), _defineProperty$b({}, "".concat(prefixCls, "-disabled"), disabled), className),
style: style2,
ref: this.savePaginationNode,
...dataOrAriaAttributeProps,
children: [totalText, /* @__PURE__ */ jsx("li", {
title: showTitle ? locale2.prev_page : null,
onClick: this.prev,
tabIndex: this.hasPrev() ? 0 : null,
onKeyPress: this.runIfEnterPrev,
className: classnames("".concat(prefixCls, "-prev"), _defineProperty$b({}, "".concat(prefixCls, "-disabled"), !this.hasPrev())),
"aria-disabled": !this.hasPrev(),
children: this.renderPrev(prevPage)
}), /* @__PURE__ */ jsxs("li", {
title: showTitle ? "".concat(current, "/").concat(allPages) : null,
className: "".concat(prefixCls, "-simple-pager"),
children: [/* @__PURE__ */ jsx("input", {
type: "text",
value: currentInputValue,
disabled,
onKeyDown: this.handleKeyDown,
onKeyUp: this.handleKeyUp,
onChange: this.handleKeyUp,
onBlur: this.handleBlur,
size: "3"
}), /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-slash"),
children: "/"
}), allPages]
}), /* @__PURE__ */ jsx("li", {
title: showTitle ? locale2.next_page : null,
onClick: this.next,
tabIndex: this.hasPrev() ? 0 : null,
onKeyPress: this.runIfEnterNext,
className: classnames("".concat(prefixCls, "-next"), _defineProperty$b({}, "".concat(prefixCls, "-disabled"), !this.hasNext())),
"aria-disabled": !this.hasNext(),
children: this.renderNext(nextPage)
}), gotoButton]
});
}
if (allPages <= 3 + pageBufferSize * 2) {
var pagerProps = {
locale: locale2,
rootPrefixCls: prefixCls,
onClick: this.handleChange,
onKeyPress: this.runIfEnter,
showTitle,
itemRender
};
if (!allPages) {
pagerList.push(
/* @__PURE__ */ React$a.createElement(Pager, {
...pagerProps,
key: "noPager",
page: 1,
className: "".concat(prefixCls, "-item-disabled")
})
);
}
for (var i2 = 1; i2 <= allPages; i2 += 1) {
var active = current === i2;
pagerList.push(
/* @__PURE__ */ React$a.createElement(Pager, {
...pagerProps,
key: i2,
page: i2,
active
})
);
}
} else {
var prevItemTitle = showLessItems ? locale2.prev_3 : locale2.prev_5;
var nextItemTitle = showLessItems ? locale2.next_3 : locale2.next_5;
if (showPrevNextJumpers) {
jumpPrev = /* @__PURE__ */ jsx("li", {
title: showTitle ? prevItemTitle : null,
onClick: this.jumpPrev,
tabIndex: "0",
onKeyPress: this.runIfEnterJumpPrev,
className: classnames("".concat(prefixCls, "-jump-prev"), _defineProperty$b({}, "".concat(prefixCls, "-jump-prev-custom-icon"), !!jumpPrevIcon)),
children: itemRender(this.getJumpPrevPage(), "jump-prev", this.getItemIcon(jumpPrevIcon, "prev page"))
}, "prev");
jumpNext = /* @__PURE__ */ jsx("li", {
title: showTitle ? nextItemTitle : null,
tabIndex: "0",
onClick: this.jumpNext,
onKeyPress: this.runIfEnterJumpNext,
className: classnames("".concat(prefixCls, "-jump-next"), _defineProperty$b({}, "".concat(prefixCls, "-jump-next-custom-icon"), !!jumpNextIcon)),
children: itemRender(this.getJumpNextPage(), "jump-next", this.getItemIcon(jumpNextIcon, "next page"))
}, "next");
}
lastPager = /* @__PURE__ */ jsx(Pager, {
locale: locale2,
last: true,
rootPrefixCls: prefixCls,
onClick: this.handleChange,
onKeyPress: this.runIfEnter,
page: allPages,
active: false,
showTitle,
itemRender
}, allPages);
firstPager = /* @__PURE__ */ jsx(Pager, {
locale: locale2,
rootPrefixCls: prefixCls,
onClick: this.handleChange,
onKeyPress: this.runIfEnter,
page: 1,
active: false,
showTitle,
itemRender
}, 1);
var left = Math.max(1, current - pageBufferSize);
var right = Math.min(current + pageBufferSize, allPages);
if (current - 1 <= pageBufferSize) {
right = 1 + pageBufferSize * 2;
}
if (allPages - current <= pageBufferSize) {
left = allPages - pageBufferSize * 2;
}
for (var _i = left; _i <= right; _i += 1) {
var _active = current === _i;
pagerList.push(
/* @__PURE__ */ jsx(Pager, {
locale: locale2,
rootPrefixCls: prefixCls,
onClick: this.handleChange,
onKeyPress: this.runIfEnter,
page: _i,
active: _active,
showTitle,
itemRender
}, _i)
);
}
if (current - 1 >= pageBufferSize * 2 && current !== 1 + 2) {
pagerList[0] = /* @__PURE__ */ React$a.cloneElement(pagerList[0], {
className: "".concat(prefixCls, "-item-after-jump-prev")
});
pagerList.unshift(jumpPrev);
}
if (allPages - current >= pageBufferSize * 2 && current !== allPages - 2) {
pagerList[pagerList.length - 1] = /* @__PURE__ */ React$a.cloneElement(pagerList[pagerList.length - 1], {
className: "".concat(prefixCls, "-item-before-jump-next")
});
pagerList.push(jumpNext);
}
if (left !== 1) {
pagerList.unshift(firstPager);
}
if (right !== allPages) {
pagerList.push(lastPager);
}
}
var prevDisabled = !this.hasPrev() || !allPages;
var nextDisabled = !this.hasNext() || !allPages;
return /* @__PURE__ */ jsxs("ul", {
className: classnames(prefixCls, className, _defineProperty$b({}, "".concat(prefixCls, "-disabled"), disabled)),
style: style2,
ref: this.savePaginationNode,
...dataOrAriaAttributeProps,
children: [totalText, /* @__PURE__ */ jsx("li", {
title: showTitle ? locale2.prev_page : null,
onClick: this.prev,
tabIndex: prevDisabled ? null : 0,
onKeyPress: this.runIfEnterPrev,
className: classnames("".concat(prefixCls, "-prev"), _defineProperty$b({}, "".concat(prefixCls, "-disabled"), prevDisabled)),
"aria-disabled": prevDisabled,
children: this.renderPrev(prevPage)
}), pagerList, /* @__PURE__ */ jsx("li", {
title: showTitle ? locale2.next_page : null,
onClick: this.next,
tabIndex: nextDisabled ? null : 0,
onKeyPress: this.runIfEnterNext,
className: classnames("".concat(prefixCls, "-next"), _defineProperty$b({}, "".concat(prefixCls, "-disabled"), nextDisabled)),
"aria-disabled": nextDisabled,
children: this.renderNext(nextPage)
}), /* @__PURE__ */ jsx(Options, {
disabled,
locale: locale2,
rootPrefixCls: prefixCls,
selectComponentClass,
selectPrefixCls,
changeSize: this.getShowSizeChanger() ? this.changePageSize : null,
current,
pageSize,
pageSizeOptions,
quickGo: this.shouldDisplayQuickJumper() ? this.handleChange : null,
goButton
})]
});
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(props, prevState) {
var newState = {};
if ("current" in props) {
newState.current = props.current;
if (props.current !== prevState.current) {
newState.currentInputValue = newState.current;
}
}
if ("pageSize" in props && props.pageSize !== prevState.pageSize) {
var current = prevState.current;
var newCurrent = calculatePage(props.pageSize, prevState, props);
current = current > newCurrent ? newCurrent : current;
if (!("current" in props)) {
newState.current = current;
newState.currentInputValue = current;
}
newState.pageSize = props.pageSize;
}
return newState;
}
}]);
return Pagination2;
}(React__default.default.Component);
Pagination$2.defaultProps = {
defaultCurrent: 1,
total: 0,
defaultPageSize: 10,
onChange: noop$5,
className: "",
selectPrefixCls: "rc-select",
prefixCls: "rc-pagination",
selectComponentClass: null,
hideOnSinglePage: false,
showPrevNextJumpers: true,
showQuickJumper: false,
showLessItems: false,
showTitle: true,
onShowSizeChange: noop$5,
locale: LOCALE,
style: {},
itemRender: defaultItemRender,
totalBoundaryShowSizeChanger: 50
};
var MiniSelect = function MiniSelect2(props) {
return /* @__PURE__ */ jsx(_Select, {
...props,
size: "small"
});
};
var MiddleSelect = function MiddleSelect2(props) {
return /* @__PURE__ */ jsx(_Select, {
...props,
size: "middle"
});
};
MiniSelect.Option = _Select.Option;
MiddleSelect.Option = _Select.Option;
var __rest$c = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Pagination = function Pagination2(_a) {
var customizePrefixCls = _a.prefixCls, customizeSelectPrefixCls = _a.selectPrefixCls, className = _a.className, size = _a.size, customLocale = _a.locale, selectComponentClass = _a.selectComponentClass, responsive = _a.responsive, showSizeChanger = _a.showSizeChanger, restProps = __rest$c(_a, ["prefixCls", "selectPrefixCls", "className", "size", "locale", "selectComponentClass", "responsive", "showSizeChanger"]);
var _useBreakpoint = useBreakpoint(responsive), xs = _useBreakpoint.xs;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction, _React$useContext$pag = _React$useContext.pagination, pagination = _React$useContext$pag === void 0 ? {} : _React$useContext$pag;
var prefixCls = getPrefixCls("pagination", customizePrefixCls);
var mergedShowSizeChanger = showSizeChanger !== null && showSizeChanger !== void 0 ? showSizeChanger : pagination.showSizeChanger;
var getIconsProps = function getIconsProps2() {
var ellipsis = /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-item-ellipsis"),
children: "\u2022\u2022\u2022"
});
var prevIcon = /* @__PURE__ */ jsx("button", {
className: "".concat(prefixCls, "-item-link"),
type: "button",
tabIndex: -1,
children: /* @__PURE__ */ jsx(LeftOutlined$1, {})
});
var nextIcon = /* @__PURE__ */ jsx("button", {
className: "".concat(prefixCls, "-item-link"),
type: "button",
tabIndex: -1,
children: /* @__PURE__ */ jsx(RightOutlined$1, {})
});
var jumpPrevIcon = /* @__PURE__ */ jsx("a", {
className: "".concat(prefixCls, "-item-link"),
children: /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-item-container"),
children: [/* @__PURE__ */ jsx(DoubleLeftOutlined$1, {
className: "".concat(prefixCls, "-item-link-icon")
}), ellipsis]
})
});
var jumpNextIcon = /* @__PURE__ */ jsx("a", {
className: "".concat(prefixCls, "-item-link"),
children: /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-item-container"),
children: [/* @__PURE__ */ jsx(DoubleRightOutlined$1, {
className: "".concat(prefixCls, "-item-link-icon")
}), ellipsis]
})
});
if (direction === "rtl") {
var _ref = [nextIcon, prevIcon];
prevIcon = _ref[0];
nextIcon = _ref[1];
var _ref2 = [jumpNextIcon, jumpPrevIcon];
jumpPrevIcon = _ref2[0];
jumpNextIcon = _ref2[1];
}
return {
prevIcon,
nextIcon,
jumpPrevIcon,
jumpNextIcon
};
};
return /* @__PURE__ */ jsx(LocaleReceiver$1, {
componentName: "Pagination",
defaultLocale: enUS$3,
children: function(contextLocale) {
var _classNames;
var locale2 = _extends$3(_extends$3({}, contextLocale), customLocale);
var isSmall = size === "small" || !!(xs && !size && responsive);
var selectPrefixCls = getPrefixCls("select", customizeSelectPrefixCls);
var extendedClassName = classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-mini"), isSmall), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className);
return /* @__PURE__ */ jsx(Pagination$2, {
...getIconsProps(),
...restProps,
prefixCls,
selectPrefixCls,
className: extendedClassName,
selectComponentClass: selectComponentClass || (isSmall ? MiniSelect : MiddleSelect),
locale: locale2,
showSizeChanger: mergedShowSizeChanger
});
}
});
};
const Pagination$1 = Pagination;
var __rest$b = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
tuple$1("small", "default", "large");
var defaultIndicator = null;
function renderIndicator(prefixCls, props) {
var indicator = props.indicator;
var dotClassName = "".concat(prefixCls, "-dot");
if (indicator === null) {
return null;
}
if (isValidElement(indicator)) {
return cloneElement(indicator, {
className: classnames(indicator.props.className, dotClassName)
});
}
if (isValidElement(defaultIndicator)) {
return cloneElement(defaultIndicator, {
className: classnames(defaultIndicator.props.className, dotClassName)
});
}
return /* @__PURE__ */ jsxs("span", {
className: classnames(dotClassName, "".concat(prefixCls, "-dot-spin")),
children: [/* @__PURE__ */ jsx("i", {
className: "".concat(prefixCls, "-dot-item")
}), /* @__PURE__ */ jsx("i", {
className: "".concat(prefixCls, "-dot-item")
}), /* @__PURE__ */ jsx("i", {
className: "".concat(prefixCls, "-dot-item")
}), /* @__PURE__ */ jsx("i", {
className: "".concat(prefixCls, "-dot-item")
})]
});
}
function shouldDelay(spinning, delay) {
return !!spinning && !!delay && !isNaN(Number(delay));
}
var Spin = function Spin2(props) {
var prefixCls = props.spinPrefixCls, _props$spinning = props.spinning, customSpinning = _props$spinning === void 0 ? true : _props$spinning, delay = props.delay, className = props.className, _props$size = props.size, size = _props$size === void 0 ? "default" : _props$size, tip = props.tip, wrapperClassName = props.wrapperClassName, style2 = props.style, children = props.children, restProps = __rest$b(props, ["spinPrefixCls", "spinning", "delay", "className", "size", "tip", "wrapperClassName", "style", "children"]);
var _React$useState = React__namespace.useState(function() {
return customSpinning && !shouldDelay(customSpinning, delay);
}), _React$useState2 = _slicedToArray$e(_React$useState, 2), spinning = _React$useState2[0], setSpinning = _React$useState2[1];
React__namespace.useEffect(function() {
var updateSpinning = debounce_1(function() {
setSpinning(customSpinning);
}, delay);
updateSpinning();
return function() {
var _a;
(_a = updateSpinning === null || updateSpinning === void 0 ? void 0 : updateSpinning.cancel) === null || _a === void 0 ? void 0 : _a.call(updateSpinning);
};
}, [delay, customSpinning]);
var isNestedPattern = function isNestedPattern2() {
return typeof children !== "undefined";
};
var renderSpin = function renderSpin2(_ref) {
var _classNames;
var direction = _ref.direction;
var spinClassName = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-sm"), size === "small"), _defineProperty$b(_classNames, "".concat(prefixCls, "-lg"), size === "large"), _defineProperty$b(_classNames, "".concat(prefixCls, "-spinning"), spinning), _defineProperty$b(_classNames, "".concat(prefixCls, "-show-text"), !!tip), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className);
var divProps = omit(restProps, ["indicator", "prefixCls"]);
var spinElement = /* @__PURE__ */ jsxs("div", {
...divProps,
style: style2,
className: spinClassName,
"aria-live": "polite",
"aria-busy": spinning,
children: [renderIndicator(prefixCls, props), tip ? /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-text"),
children: tip
}) : null]
});
if (isNestedPattern()) {
var containerClassName = classnames("".concat(prefixCls, "-container"), _defineProperty$b({}, "".concat(prefixCls, "-blur"), spinning));
return /* @__PURE__ */ jsxs("div", {
...divProps,
className: classnames("".concat(prefixCls, "-nested-loading"), wrapperClassName),
children: [spinning && /* @__PURE__ */ jsx("div", {
children: spinElement
}, "loading"), /* @__PURE__ */ jsx("div", {
className: containerClassName,
children
}, "container")]
});
}
return spinElement;
};
return /* @__PURE__ */ jsx(ConfigConsumer, {
children: renderSpin
});
};
var SpinFC = function SpinFC2(props) {
var customizePrefixCls = props.prefixCls;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var spinPrefixCls = getPrefixCls("spin", customizePrefixCls);
var spinClassProps = _extends$3(_extends$3({}, props), {
spinPrefixCls
});
return /* @__PURE__ */ jsx(Spin, {
...spinClassProps
});
};
SpinFC.setDefaultIndicator = function(indicator) {
defaultIndicator = indicator;
};
const Spin$1 = SpinFC;
function isThenable(thing) {
return !!(thing && !!thing.then);
}
var ActionButton = function ActionButton2(props) {
var clickedRef = React__namespace.useRef(false);
var ref = React__namespace.useRef(null);
var _useState = useSafeState(false), _useState2 = _slicedToArray$e(_useState, 2), loading = _useState2[0], setLoading = _useState2[1];
var close = props.close;
var onInternalClose = function onInternalClose2() {
close === null || close === void 0 ? void 0 : close.apply(void 0, arguments);
};
React__namespace.useEffect(function() {
var timeoutId = null;
if (props.autoFocus) {
timeoutId = setTimeout(function() {
var _a;
(_a = ref.current) === null || _a === void 0 ? void 0 : _a.focus();
});
}
return function() {
if (timeoutId) {
clearTimeout(timeoutId);
}
};
}, []);
var handlePromiseOnOk = function handlePromiseOnOk2(returnValueOfOnOk) {
if (!isThenable(returnValueOfOnOk)) {
return;
}
setLoading(true);
returnValueOfOnOk.then(function() {
setLoading(false, true);
onInternalClose.apply(void 0, arguments);
clickedRef.current = false;
}, function(e2) {
console.error(e2);
setLoading(false, true);
clickedRef.current = false;
});
};
var onClick = function onClick2(e2) {
var actionFn = props.actionFn;
if (clickedRef.current) {
return;
}
clickedRef.current = true;
if (!actionFn) {
onInternalClose();
return;
}
var returnValueOfOnOk;
if (props.emitEvent) {
returnValueOfOnOk = actionFn(e2);
if (props.quitOnNullishReturnValue && !isThenable(returnValueOfOnOk)) {
clickedRef.current = false;
onInternalClose(e2);
return;
}
} else if (actionFn.length) {
returnValueOfOnOk = actionFn(close);
clickedRef.current = false;
} else {
returnValueOfOnOk = actionFn();
if (!returnValueOfOnOk) {
onInternalClose();
return;
}
}
handlePromiseOnOk(returnValueOfOnOk);
};
var type2 = props.type, children = props.children, prefixCls = props.prefixCls, buttonProps = props.buttonProps;
return /* @__PURE__ */ jsx(Button$2, {
...convertLegacyProps(type2),
onClick,
loading,
prefixCls,
...buttonProps,
ref,
children
});
};
const ActionButton$1 = ActionButton;
var Overlay = function Overlay2(props) {
var prefixCls = props.prefixCls, okButtonProps = props.okButtonProps, cancelButtonProps = props.cancelButtonProps, title = props.title, cancelText = props.cancelText, okText = props.okText, okType = props.okType, icon = props.icon, _props$showCancel = props.showCancel, showCancel = _props$showCancel === void 0 ? true : _props$showCancel, close = props.close, onConfirm = props.onConfirm, onCancel = props.onCancel;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
return /* @__PURE__ */ jsx(LocaleReceiver$1, {
componentName: "Popconfirm",
defaultLocale: defaultLocale.Popconfirm,
children: function(contextLocale) {
return /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-inner-content"),
children: [/* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-message"),
children: [icon && /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-message-icon"),
children: icon
}), /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-message-title"),
children: getRenderPropValue(title)
})]
}), /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-buttons"),
children: [showCancel && /* @__PURE__ */ jsx(Button$2, {
onClick: onCancel,
size: "small",
...cancelButtonProps,
children: cancelText !== null && cancelText !== void 0 ? cancelText : contextLocale.cancelText
}), /* @__PURE__ */ jsx(ActionButton$1, {
buttonProps: _extends$3(_extends$3({
size: "small"
}, convertLegacyProps(okType)), okButtonProps),
actionFn: onConfirm,
close,
prefixCls: getPrefixCls("btn"),
quitOnNullishReturnValue: true,
emitEvent: true,
children: okText !== null && okText !== void 0 ? okText : contextLocale.okText
})]
})]
});
}
});
};
var _this = globalThis;
var __rest$a = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Popconfirm = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var _useMergedState = useMergedState(false, {
value: props.open !== void 0 ? props.open : props.visible,
defaultValue: props.defaultOpen !== void 0 ? props.defaultOpen : props.defaultVisible
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), open = _useMergedState2[0], setOpen = _useMergedState2[1];
var settingOpen = function settingOpen2(value, e2) {
var _a, _b;
setOpen(value, true);
(_a = props.onVisibleChange) === null || _a === void 0 ? void 0 : _a.call(props, value, e2);
(_b = props.onOpenChange) === null || _b === void 0 ? void 0 : _b.call(props, value, e2);
};
var close = function close2(e2) {
settingOpen(false, e2);
};
var onConfirm = function onConfirm2(e2) {
var _a;
return (_a = props.onConfirm) === null || _a === void 0 ? void 0 : _a.call(_this, e2);
};
var onCancel = function onCancel2(e2) {
var _a;
settingOpen(false, e2);
(_a = props.onCancel) === null || _a === void 0 ? void 0 : _a.call(_this, e2);
};
var _onKeyDown = function onKeyDown2(e2) {
if (e2.keyCode === KeyCode.ESC && open) {
settingOpen(false, e2);
}
};
var onOpenChange = function onOpenChange2(value) {
var _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled;
if (disabled) {
return;
}
settingOpen(value);
};
var customizePrefixCls = props.prefixCls, _props$placement = props.placement, placement = _props$placement === void 0 ? "top" : _props$placement, _props$trigger = props.trigger, trigger = _props$trigger === void 0 ? "click" : _props$trigger, _props$okType = props.okType, okType = _props$okType === void 0 ? "primary" : _props$okType, _props$icon = props.icon, icon = _props$icon === void 0 ? /* @__PURE__ */ jsx(ExclamationCircleFilled$1, {}) : _props$icon, children = props.children, overlayClassName = props.overlayClassName, restProps = __rest$a(props, ["prefixCls", "placement", "trigger", "okType", "icon", "children", "overlayClassName"]);
var prefixCls = getPrefixCls("popover", customizePrefixCls);
var prefixClsConfirm = getPrefixCls("popconfirm", customizePrefixCls);
var overlayClassNames = classnames(prefixClsConfirm, overlayClassName);
return /* @__PURE__ */ jsx(_Popover, {
...restProps,
trigger,
prefixCls,
placement,
onOpenChange,
open,
ref,
overlayClassName: overlayClassNames,
_overlay: /* @__PURE__ */ jsx(Overlay, {
okType,
icon,
...props,
prefixCls,
close,
onConfirm,
onCancel
}),
children: cloneElement(children, {
onKeyDown: function onKeyDown2(e2) {
var _a, _b;
if (/* @__PURE__ */ React__namespace.isValidElement(children)) {
(_b = children === null || children === void 0 ? void 0 : (_a = children.props).onKeyDown) === null || _b === void 0 ? void 0 : _b.call(_a, e2);
}
_onKeyDown(e2);
}
})
});
});
const _Popconfirm = Popconfirm;
var defaultProps = {
className: "",
percent: 0,
prefixCls: "rc-progress",
strokeColor: "#2db7f5",
strokeLinecap: "round",
strokeWidth: 1,
style: {},
trailColor: "#D9D9D9",
trailWidth: 1,
gapPosition: "bottom"
};
var useTransitionDuration = function useTransitionDuration2() {
var pathsRef = React$a.useRef([]);
var prevTimeStamp = React$a.useRef(null);
React$a.useEffect(function() {
var now2 = Date.now();
var updated = false;
pathsRef.current.forEach(function(path2) {
if (!path2) {
return;
}
updated = true;
var pathStyle = path2.style;
pathStyle.transitionDuration = ".3s, .3s, .3s, .06s";
if (prevTimeStamp.current && now2 - prevTimeStamp.current < 100) {
pathStyle.transitionDuration = "0s, 0s";
}
});
if (updated) {
prevTimeStamp.current = Date.now();
}
});
return pathsRef.current;
};
var uuid = 0;
var isBrowserClient = canUseDom$1();
function getUUID() {
var retId;
if (isBrowserClient) {
retId = uuid;
uuid += 1;
} else {
retId = "TEST_OR_SSR";
}
return retId;
}
const useId = function(id2) {
var _React$useState = React__namespace.useState(), _React$useState2 = _slicedToArray$e(_React$useState, 2), innerId = _React$useState2[0], setInnerId = _React$useState2[1];
React__namespace.useEffect(function() {
setInnerId("rc_progress_".concat(getUUID()));
}, []);
return id2 || innerId;
};
var _excluded$f = ["id", "prefixCls", "steps", "strokeWidth", "trailWidth", "gapDegree", "gapPosition", "trailColor", "strokeLinecap", "style", "className", "strokeColor", "percent"];
function stripPercentToNumber(percent) {
return +percent.replace("%", "");
}
function toArray$3(value) {
var mergedValue = value !== null && value !== void 0 ? value : [];
return Array.isArray(mergedValue) ? mergedValue : [mergedValue];
}
var VIEW_BOX_SIZE = 100;
var getCircleStyle = function getCircleStyle2(perimeter, perimeterWithoutGap, offset2, percent, rotateDeg, gapDegree, gapPosition, strokeColor, strokeLinecap, strokeWidth) {
var stepSpace = arguments.length > 10 && arguments[10] !== void 0 ? arguments[10] : 0;
var offsetDeg = offset2 / 100 * 360 * ((360 - gapDegree) / 360);
var positionDeg = gapDegree === 0 ? 0 : {
bottom: 0,
top: 180,
left: 90,
right: -90
}[gapPosition];
var strokeDashoffset = (100 - percent) / 100 * perimeterWithoutGap;
if (strokeLinecap === "round" && percent !== 100) {
strokeDashoffset += strokeWidth / 2;
if (strokeDashoffset >= perimeterWithoutGap) {
strokeDashoffset = perimeterWithoutGap - 0.01;
}
}
return {
stroke: typeof strokeColor === "string" ? strokeColor : void 0,
strokeDasharray: "".concat(perimeterWithoutGap, "px ").concat(perimeter),
strokeDashoffset: strokeDashoffset + stepSpace,
transform: "rotate(".concat(rotateDeg + offsetDeg + positionDeg, "deg)"),
transformOrigin: "0 0",
transition: "stroke-dashoffset .3s ease 0s, stroke-dasharray .3s ease 0s, stroke .3s, stroke-width .06s ease .3s, opacity .3s ease 0s",
fillOpacity: 0
};
};
var Circle$2 = function Circle2(_ref) {
var id2 = _ref.id, prefixCls = _ref.prefixCls, steps = _ref.steps, strokeWidth = _ref.strokeWidth, trailWidth = _ref.trailWidth, _ref$gapDegree = _ref.gapDegree, gapDegree = _ref$gapDegree === void 0 ? 0 : _ref$gapDegree, gapPosition = _ref.gapPosition, trailColor = _ref.trailColor, strokeLinecap = _ref.strokeLinecap, style2 = _ref.style, className = _ref.className, strokeColor = _ref.strokeColor, percent = _ref.percent, restProps = _objectWithoutProperties$1(_ref, _excluded$f);
var mergedId = useId(id2);
var gradientId = "".concat(mergedId, "-gradient");
var radius = VIEW_BOX_SIZE / 2 - strokeWidth / 2;
var perimeter = Math.PI * 2 * radius;
var rotateDeg = gapDegree > 0 ? 90 + gapDegree / 2 : -90;
var perimeterWithoutGap = perimeter * ((360 - gapDegree) / 360);
var _ref2 = _typeof$q(steps) === "object" ? steps : {
count: steps,
space: 2
}, stepCount = _ref2.count, stepSpace = _ref2.space;
var circleStyle = getCircleStyle(perimeter, perimeterWithoutGap, 0, 100, rotateDeg, gapDegree, gapPosition, trailColor, strokeLinecap, strokeWidth);
var percentList = toArray$3(percent);
var strokeColorList = toArray$3(strokeColor);
var gradient = strokeColorList.find(function(color2) {
return color2 && _typeof$q(color2) === "object";
});
var paths = useTransitionDuration();
var getStokeList = function getStokeList2() {
var stackPtg = 0;
return percentList.map(function(ptg, index2) {
var color2 = strokeColorList[index2] || strokeColorList[strokeColorList.length - 1];
var stroke = color2 && _typeof$q(color2) === "object" ? "url(#".concat(gradientId, ")") : void 0;
var circleStyleForStack = getCircleStyle(perimeter, perimeterWithoutGap, stackPtg, ptg, rotateDeg, gapDegree, gapPosition, color2, strokeLinecap, strokeWidth);
stackPtg += ptg;
return /* @__PURE__ */ jsx("circle", {
className: "".concat(prefixCls, "-circle-path"),
r: radius,
cx: 0,
cy: 0,
stroke,
strokeLinecap,
strokeWidth,
opacity: ptg === 0 ? 0 : 1,
style: circleStyleForStack,
ref: function ref(elem) {
paths[index2] = elem;
}
}, index2);
}).reverse();
};
var getStepStokeList = function getStepStokeList2() {
var current = Math.round(stepCount * (percentList[0] / 100));
var stepPtg = 100 / stepCount;
var stackPtg = 0;
return new Array(stepCount).fill(null).map(function(_, index2) {
var color2 = index2 <= current - 1 ? strokeColorList[0] : trailColor;
var stroke = color2 && _typeof$q(color2) === "object" ? "url(#".concat(gradientId, ")") : void 0;
var circleStyleForStack = getCircleStyle(perimeter, perimeterWithoutGap, stackPtg, stepPtg, rotateDeg, gapDegree, gapPosition, color2, "butt", strokeWidth, stepSpace);
stackPtg += (perimeterWithoutGap - circleStyleForStack.strokeDashoffset + stepSpace) * 100 / perimeterWithoutGap;
return /* @__PURE__ */ jsx("circle", {
className: "".concat(prefixCls, "-circle-path"),
r: radius,
cx: 0,
cy: 0,
stroke,
strokeWidth,
opacity: 1,
style: circleStyleForStack,
ref: function ref(elem) {
paths[index2] = elem;
}
}, index2);
});
};
return /* @__PURE__ */ jsxs("svg", {
className: classnames("".concat(prefixCls, "-circle"), className),
viewBox: "".concat(-VIEW_BOX_SIZE / 2, " ").concat(-VIEW_BOX_SIZE / 2, " ").concat(VIEW_BOX_SIZE, " ").concat(VIEW_BOX_SIZE),
style: style2,
id: id2,
role: "presentation",
...restProps,
children: [gradient && /* @__PURE__ */ jsx("defs", {
children: /* @__PURE__ */ jsx("linearGradient", {
id: gradientId,
x1: "100%",
y1: "0%",
x2: "0%",
y2: "0%",
children: Object.keys(gradient).sort(function(a, b2) {
return stripPercentToNumber(a) - stripPercentToNumber(b2);
}).map(function(key2, index2) {
return /* @__PURE__ */ jsx("stop", {
offset: key2,
stopColor: gradient[key2]
}, index2);
})
})
}), !stepCount && /* @__PURE__ */ jsx("circle", {
className: "".concat(prefixCls, "-circle-trail"),
r: radius,
cx: 0,
cy: 0,
stroke: trailColor,
strokeLinecap,
strokeWidth: trailWidth || strokeWidth,
style: circleStyle
}), stepCount ? getStepStokeList() : getStokeList()]
});
};
Circle$2.defaultProps = defaultProps;
Circle$2.displayName = "Circle";
function validProgress(progress) {
if (!progress || progress < 0) {
return 0;
}
if (progress > 100) {
return 100;
}
return progress;
}
function getSuccessPercent(_ref) {
var success = _ref.success, successPercent = _ref.successPercent;
var percent = successPercent;
if (success && "progress" in success) {
percent = success.progress;
}
if (success && "percent" in success) {
percent = success.percent;
}
return percent;
}
function getPercentage(_ref) {
var percent = _ref.percent, success = _ref.success, successPercent = _ref.successPercent;
var realSuccessPercent = validProgress(getSuccessPercent({
success,
successPercent
}));
return [realSuccessPercent, validProgress(validProgress(percent) - realSuccessPercent)];
}
function getStrokeColor(_ref2) {
var _ref2$success = _ref2.success, success = _ref2$success === void 0 ? {} : _ref2$success, strokeColor = _ref2.strokeColor;
var successColor = success.strokeColor;
return [successColor || presetPrimaryColors.green, strokeColor || null];
}
var Circle = function Circle2(props) {
var prefixCls = props.prefixCls, width = props.width, strokeWidth = props.strokeWidth, _props$trailColor = props.trailColor, trailColor = _props$trailColor === void 0 ? null : _props$trailColor, _props$strokeLinecap = props.strokeLinecap, strokeLinecap = _props$strokeLinecap === void 0 ? "round" : _props$strokeLinecap, gapPosition = props.gapPosition, gapDegree = props.gapDegree, type2 = props.type, children = props.children, success = props.success;
var circleSize = width || 120;
var circleStyle = {
width: circleSize,
height: circleSize,
fontSize: circleSize * 0.15 + 6
};
var circleWidth = strokeWidth || 6;
var gapPos = gapPosition || type2 === "dashboard" && "bottom" || void 0;
var getGapDegree = function getGapDegree2() {
if (gapDegree || gapDegree === 0) {
return gapDegree;
}
if (type2 === "dashboard") {
return 75;
}
return void 0;
};
var isGradient = Object.prototype.toString.call(props.strokeColor) === "[object Object]";
var strokeColor = getStrokeColor({
success,
strokeColor: props.strokeColor
});
var wrapperClassName = classnames("".concat(prefixCls, "-inner"), _defineProperty$b({}, "".concat(prefixCls, "-circle-gradient"), isGradient));
return /* @__PURE__ */ jsxs("div", {
className: wrapperClassName,
style: circleStyle,
children: [/* @__PURE__ */ jsx(Circle$2, {
percent: getPercentage(props),
strokeWidth: circleWidth,
trailWidth: circleWidth,
strokeColor,
strokeLinecap,
trailColor,
prefixCls,
gapDegree: getGapDegree(),
gapPosition: gapPos
}), children]
});
};
const Circle$1 = Circle;
var __rest$9 = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var sortGradient = function sortGradient2(gradients) {
var tempArr = [];
Object.keys(gradients).forEach(function(key2) {
var formattedKey = parseFloat(key2.replace(/%/g, ""));
if (!isNaN(formattedKey)) {
tempArr.push({
key: formattedKey,
value: gradients[key2]
});
}
});
tempArr = tempArr.sort(function(a, b2) {
return a.key - b2.key;
});
return tempArr.map(function(_ref) {
var key2 = _ref.key, value = _ref.value;
return "".concat(value, " ").concat(key2, "%");
}).join(", ");
};
var handleGradient = function handleGradient2(strokeColor, directionConfig) {
var _strokeColor$from = strokeColor.from, from = _strokeColor$from === void 0 ? presetPrimaryColors.blue : _strokeColor$from, _strokeColor$to = strokeColor.to, to = _strokeColor$to === void 0 ? presetPrimaryColors.blue : _strokeColor$to, _strokeColor$directio = strokeColor.direction, direction = _strokeColor$directio === void 0 ? directionConfig === "rtl" ? "to left" : "to right" : _strokeColor$directio, rest = __rest$9(strokeColor, ["from", "to", "direction"]);
if (Object.keys(rest).length !== 0) {
var sortedGradients = sortGradient(rest);
return {
backgroundImage: "linear-gradient(".concat(direction, ", ").concat(sortedGradients, ")")
};
}
return {
backgroundImage: "linear-gradient(".concat(direction, ", ").concat(from, ", ").concat(to, ")")
};
};
var Line = function Line2(props) {
var prefixCls = props.prefixCls, directionConfig = props.direction, percent = props.percent, strokeWidth = props.strokeWidth, size = props.size, strokeColor = props.strokeColor, _props$strokeLinecap = props.strokeLinecap, strokeLinecap = _props$strokeLinecap === void 0 ? "round" : _props$strokeLinecap, children = props.children, _props$trailColor = props.trailColor, trailColor = _props$trailColor === void 0 ? null : _props$trailColor, success = props.success;
var backgroundProps = strokeColor && typeof strokeColor !== "string" ? handleGradient(strokeColor, directionConfig) : {
background: strokeColor
};
var borderRadius = strokeLinecap === "square" || strokeLinecap === "butt" ? 0 : void 0;
var trailStyle = {
backgroundColor: trailColor || void 0,
borderRadius
};
var percentStyle = _extends$3({
width: "".concat(validProgress(percent), "%"),
height: strokeWidth || (size === "small" ? 6 : 8),
borderRadius
}, backgroundProps);
var successPercent = getSuccessPercent(props);
var successPercentStyle = {
width: "".concat(validProgress(successPercent), "%"),
height: strokeWidth || (size === "small" ? 6 : 8),
borderRadius,
backgroundColor: success === null || success === void 0 ? void 0 : success.strokeColor
};
var successSegment = successPercent !== void 0 ? /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-success-bg"),
style: successPercentStyle
}) : null;
return /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-outer"),
children: /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-inner"),
style: trailStyle,
children: [/* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-bg"),
style: percentStyle
}), successSegment]
})
}), children]
});
};
const Line$1 = Line;
var Steps$1 = function Steps2(props) {
var size = props.size, steps = props.steps, _props$percent = props.percent, percent = _props$percent === void 0 ? 0 : _props$percent, _props$strokeWidth = props.strokeWidth, strokeWidth = _props$strokeWidth === void 0 ? 8 : _props$strokeWidth, strokeColor = props.strokeColor, _props$trailColor = props.trailColor, trailColor = _props$trailColor === void 0 ? null : _props$trailColor, prefixCls = props.prefixCls, children = props.children;
var current = Math.round(steps * (percent / 100));
var stepWidth = size === "small" ? 2 : 14;
var styledSteps = new Array(steps);
for (var i2 = 0; i2 < steps; i2++) {
var color2 = Array.isArray(strokeColor) ? strokeColor[i2] : strokeColor;
styledSteps[i2] = /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-steps-item"), _defineProperty$b({}, "".concat(prefixCls, "-steps-item-active"), i2 <= current - 1)),
style: {
backgroundColor: i2 <= current - 1 ? color2 : trailColor,
width: stepWidth,
height: strokeWidth
}
}, i2);
}
return /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-steps-outer"),
children: [styledSteps, children]
});
};
const Steps$2 = Steps$1;
var __rest$8 = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
tuple$1("line", "circle", "dashboard");
var ProgressStatuses = tuple$1("normal", "exception", "active", "success");
var Progress = function Progress2(props) {
var _classNames;
var customizePrefixCls = props.prefixCls, className = props.className, steps = props.steps, strokeColor = props.strokeColor, _props$percent = props.percent, percent = _props$percent === void 0 ? 0 : _props$percent, _props$size = props.size, size = _props$size === void 0 ? "default" : _props$size, _props$showInfo = props.showInfo, showInfo = _props$showInfo === void 0 ? true : _props$showInfo, _props$type = props.type, type2 = _props$type === void 0 ? "line" : _props$type, restProps = __rest$8(props, ["prefixCls", "className", "steps", "strokeColor", "percent", "size", "showInfo", "type"]);
function getPercentNumber() {
var successPercent = getSuccessPercent(props);
return parseInt(successPercent !== void 0 ? successPercent.toString() : percent.toString(), 10);
}
function getProgressStatus() {
var status = props.status;
if (!ProgressStatuses.includes(status) && getPercentNumber() >= 100) {
return "success";
}
return status || "normal";
}
function renderProcessInfo(prefixCls2, progressStatus2) {
var format2 = props.format;
var successPercent = getSuccessPercent(props);
if (!showInfo) {
return null;
}
var text;
var textFormatter = format2 || function(percentNumber) {
return "".concat(percentNumber, "%");
};
var isLineType = type2 === "line";
if (format2 || progressStatus2 !== "exception" && progressStatus2 !== "success") {
text = textFormatter(validProgress(percent), validProgress(successPercent));
} else if (progressStatus2 === "exception") {
text = isLineType ? /* @__PURE__ */ jsx(CloseCircleFilled$1, {}) : /* @__PURE__ */ jsx(CloseOutlined$4, {});
} else if (progressStatus2 === "success") {
text = isLineType ? /* @__PURE__ */ jsx(CheckCircleFilled$1, {}) : /* @__PURE__ */ jsx(CheckOutlined$1, {});
}
return /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls2, "-text"),
title: typeof text === "string" ? text : void 0,
children: text
});
}
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var prefixCls = getPrefixCls("progress", customizePrefixCls);
var progressStatus = getProgressStatus();
var progressInfo = renderProcessInfo(prefixCls, progressStatus);
var strokeColorNotArray = Array.isArray(strokeColor) ? strokeColor[0] : strokeColor;
var strokeColorNotGradient = typeof strokeColor === "string" || Array.isArray(strokeColor) ? strokeColor : void 0;
var progress;
if (type2 === "line") {
progress = steps ? /* @__PURE__ */ jsx(Steps$2, {
...props,
strokeColor: strokeColorNotGradient,
prefixCls,
steps,
children: progressInfo
}) : /* @__PURE__ */ jsx(Line$1, {
...props,
strokeColor: strokeColorNotArray,
prefixCls,
direction,
children: progressInfo
});
} else if (type2 === "circle" || type2 === "dashboard") {
progress = /* @__PURE__ */ jsx(Circle$1, {
...props,
strokeColor: strokeColorNotArray,
prefixCls,
progressStatus,
children: progressInfo
});
}
var classString = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(type2 === "dashboard" && "circle" || steps && "steps" || type2), true), _defineProperty$b(_classNames, "".concat(prefixCls, "-status-").concat(progressStatus), true), _defineProperty$b(_classNames, "".concat(prefixCls, "-show-info"), showInfo), _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(size), size), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className);
return /* @__PURE__ */ jsx("div", {
...omit(restProps, ["status", "format", "trailColor", "strokeWidth", "width", "gapDegree", "gapPosition", "strokeLinecap", "success", "successPercent"]),
className: classString,
role: "progressbar",
children: progress
});
};
const Progress$1 = Progress;
var StarFilled$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M908.1 353.1l-253.9-36.9L540.7 86.1c-3.1-6.3-8.2-11.4-14.5-14.5-15.8-7.8-35-1.3-42.9 14.5L369.8 316.2l-253.9 36.9c-7 1-13.4 4.3-18.3 9.3a32.05 32.05 0 00.6 45.3l183.7 179.1-43.4 252.9a31.95 31.95 0 0046.4 33.7L512 754l227.1 119.4c6.2 3.3 13.4 4.4 20.3 3.2 17.4-3 29.1-19.5 26.1-36.9l-43.4-252.9 183.7-179.1c5-4.9 8.3-11.3 9.3-18.3 2.7-17.5-9.5-33.7-27-36.3z" } }] }, "name": "star", "theme": "filled" };
const StarFilledSvg = StarFilled$2;
var StarFilled = function StarFilled2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: StarFilledSvg
})
});
};
StarFilled.displayName = "StarFilled";
const StarFilled$1 = /* @__PURE__ */ React__namespace.forwardRef(StarFilled);
function getScroll(w2) {
var ret = w2.pageXOffset;
var method2 = "scrollLeft";
if (typeof ret !== "number") {
var d2 = w2.document;
ret = d2.documentElement[method2];
if (typeof ret !== "number") {
ret = d2.body[method2];
}
}
return ret;
}
function getClientPosition(elem) {
var x2;
var y2;
var doc = elem.ownerDocument;
var body = doc.body;
var docElem = doc && doc.documentElement;
var box = elem.getBoundingClientRect();
x2 = box.left;
y2 = box.top;
x2 -= docElem.clientLeft || body.clientLeft || 0;
y2 -= docElem.clientTop || body.clientTop || 0;
return {
left: x2,
top: y2
};
}
function getOffsetLeft(el) {
var pos = getClientPosition(el);
var doc = el.ownerDocument;
var w2 = doc.defaultView || doc.parentWindow;
pos.left += getScroll(w2);
return pos.left;
}
var Star = /* @__PURE__ */ function(_React$Component) {
_inherits(Star2, _React$Component);
var _super = _createSuper(Star2);
function Star2() {
var _this2;
_classCallCheck(this, Star2);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_this2.onHover = function(e2) {
var _this$props = _this2.props, onHover = _this$props.onHover, index2 = _this$props.index;
onHover(e2, index2);
};
_this2.onClick = function(e2) {
var _this$props2 = _this2.props, onClick = _this$props2.onClick, index2 = _this$props2.index;
onClick(e2, index2);
};
_this2.onKeyDown = function(e2) {
var _this$props3 = _this2.props, onClick = _this$props3.onClick, index2 = _this$props3.index;
if (e2.keyCode === 13) {
onClick(e2, index2);
}
};
return _this2;
}
_createClass(Star2, [{
key: "getClassName",
value: function getClassName() {
var _this$props4 = this.props, prefixCls = _this$props4.prefixCls, index2 = _this$props4.index, value = _this$props4.value, allowHalf = _this$props4.allowHalf, focused = _this$props4.focused;
var starValue = index2 + 1;
var className = prefixCls;
if (value === 0 && index2 === 0 && focused) {
className += " ".concat(prefixCls, "-focused");
} else if (allowHalf && value + 0.5 >= starValue && value < starValue) {
className += " ".concat(prefixCls, "-half ").concat(prefixCls, "-active");
if (focused) {
className += " ".concat(prefixCls, "-focused");
}
} else {
className += starValue <= value ? " ".concat(prefixCls, "-full") : " ".concat(prefixCls, "-zero");
if (starValue === value && focused) {
className += " ".concat(prefixCls, "-focused");
}
}
return className;
}
}, {
key: "render",
value: function render2() {
var onHover = this.onHover, onClick = this.onClick, onKeyDown2 = this.onKeyDown;
var _this$props5 = this.props, disabled = _this$props5.disabled, prefixCls = _this$props5.prefixCls, character = _this$props5.character, characterRender = _this$props5.characterRender, index2 = _this$props5.index, count = _this$props5.count, value = _this$props5.value;
var characterNode = typeof character === "function" ? character(this.props) : character;
var start = /* @__PURE__ */ jsx("li", {
className: this.getClassName(),
children: /* @__PURE__ */ jsxs("div", {
onClick: disabled ? null : onClick,
onKeyDown: disabled ? null : onKeyDown2,
onMouseMove: disabled ? null : onHover,
role: "radio",
"aria-checked": value > index2 ? "true" : "false",
"aria-posinset": index2 + 1,
"aria-setsize": count,
tabIndex: disabled ? -1 : 0,
children: [/* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-first"),
children: characterNode
}), /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-second"),
children: characterNode
})]
})
});
if (characterRender) {
start = characterRender(start, this.props);
}
return start;
}
}]);
return Star2;
}(React__default.default.Component);
function noop$4() {
}
var Rate$1 = /* @__PURE__ */ function(_React$Component) {
_inherits(Rate2, _React$Component);
var _super = _createSuper(Rate2);
function Rate2(props) {
var _this2;
_classCallCheck(this, Rate2);
_this2 = _super.call(this, props);
_this2.stars = void 0;
_this2.rate = void 0;
_this2.onHover = function(event, index2) {
var onHoverChange = _this2.props.onHoverChange;
var hoverValue = _this2.getStarValue(index2, event.pageX);
var cleanedValue = _this2.state.cleanedValue;
if (hoverValue !== cleanedValue) {
_this2.setState({
hoverValue,
cleanedValue: null
});
}
onHoverChange(hoverValue);
};
_this2.onMouseLeave = function() {
var onHoverChange = _this2.props.onHoverChange;
_this2.setState({
hoverValue: void 0,
cleanedValue: null
});
onHoverChange(void 0);
};
_this2.onClick = function(event, index2) {
var allowClear = _this2.props.allowClear;
var value = _this2.state.value;
var newValue = _this2.getStarValue(index2, event.pageX);
var isReset = false;
if (allowClear) {
isReset = newValue === value;
}
_this2.onMouseLeave();
_this2.changeValue(isReset ? 0 : newValue);
_this2.setState({
cleanedValue: isReset ? newValue : null
});
};
_this2.onFocus = function() {
var onFocus = _this2.props.onFocus;
_this2.setState({
focused: true
});
if (onFocus) {
onFocus();
}
};
_this2.onBlur = function() {
var onBlur = _this2.props.onBlur;
_this2.setState({
focused: false
});
if (onBlur) {
onBlur();
}
};
_this2.onKeyDown = function(event) {
var keyCode = event.keyCode;
var _this$props = _this2.props, count = _this$props.count, allowHalf = _this$props.allowHalf, onKeyDown2 = _this$props.onKeyDown, direction = _this$props.direction;
var reverse = direction === "rtl";
var value = _this2.state.value;
if (keyCode === KeyCode.RIGHT && value < count && !reverse) {
if (allowHalf) {
value += 0.5;
} else {
value += 1;
}
_this2.changeValue(value);
event.preventDefault();
} else if (keyCode === KeyCode.LEFT && value > 0 && !reverse) {
if (allowHalf) {
value -= 0.5;
} else {
value -= 1;
}
_this2.changeValue(value);
event.preventDefault();
} else if (keyCode === KeyCode.RIGHT && value > 0 && reverse) {
if (allowHalf) {
value -= 0.5;
} else {
value -= 1;
}
_this2.changeValue(value);
event.preventDefault();
} else if (keyCode === KeyCode.LEFT && value < count && reverse) {
if (allowHalf) {
value += 0.5;
} else {
value += 1;
}
_this2.changeValue(value);
event.preventDefault();
}
if (onKeyDown2) {
onKeyDown2(event);
}
};
_this2.saveRef = function(index2) {
return function(node) {
_this2.stars[index2] = node;
};
};
_this2.saveRate = function(node) {
_this2.rate = node;
};
var _value = props.value;
if (_value === void 0) {
_value = props.defaultValue;
}
_this2.stars = {};
_this2.state = {
value: _value,
focused: false,
cleanedValue: null
};
return _this2;
}
_createClass(Rate2, [{
key: "componentDidMount",
value: function componentDidMount() {
var _this$props2 = this.props, autoFocus = _this$props2.autoFocus, disabled = _this$props2.disabled;
if (autoFocus && !disabled) {
this.focus();
}
}
}, {
key: "getStarDOM",
value: function getStarDOM(index2) {
return findDOMNode(this.stars[index2]);
}
}, {
key: "getStarValue",
value: function getStarValue(index2, x2) {
var _this$props3 = this.props, allowHalf = _this$props3.allowHalf, direction = _this$props3.direction;
var reverse = direction === "rtl";
var value = index2 + 1;
if (allowHalf) {
var starEle = this.getStarDOM(index2);
var leftDis = getOffsetLeft(starEle);
var width = starEle.clientWidth;
if (reverse && x2 - leftDis > width / 2) {
value -= 0.5;
} else if (!reverse && x2 - leftDis < width / 2) {
value -= 0.5;
}
}
return value;
}
}, {
key: "focus",
value: function focus() {
var disabled = this.props.disabled;
if (!disabled) {
this.rate.focus();
}
}
}, {
key: "blur",
value: function blur() {
var disabled = this.props.disabled;
if (!disabled) {
this.rate.blur();
}
}
}, {
key: "changeValue",
value: function changeValue(value) {
var onChange = this.props.onChange;
if (!("value" in this.props)) {
this.setState({
value
});
}
onChange(value);
}
}, {
key: "render",
value: function render2() {
var _this$props4 = this.props, count = _this$props4.count, allowHalf = _this$props4.allowHalf, style2 = _this$props4.style, prefixCls = _this$props4.prefixCls, disabled = _this$props4.disabled, className = _this$props4.className, character = _this$props4.character, characterRender = _this$props4.characterRender, tabIndex = _this$props4.tabIndex, direction = _this$props4.direction;
var _this$state = this.state, value = _this$state.value, hoverValue = _this$state.hoverValue, focused = _this$state.focused;
var stars = [];
var disabledClass = disabled ? "".concat(prefixCls, "-disabled") : "";
for (var index2 = 0; index2 < count; index2 += 1) {
stars.push(
/* @__PURE__ */ jsx(Star, {
ref: this.saveRef(index2),
index: index2,
count,
disabled,
prefixCls: "".concat(prefixCls, "-star"),
allowHalf,
value: hoverValue === void 0 ? value : hoverValue,
onClick: this.onClick,
onHover: this.onHover,
character,
characterRender,
focused
}, index2)
);
}
var rateClassName = classnames(prefixCls, disabledClass, className, _defineProperty$b({}, "".concat(prefixCls, "-rtl"), direction === "rtl"));
return /* @__PURE__ */ jsx("ul", {
className: rateClassName,
style: style2,
onMouseLeave: disabled ? null : this.onMouseLeave,
tabIndex: disabled ? -1 : tabIndex,
onFocus: disabled ? null : this.onFocus,
onBlur: disabled ? null : this.onBlur,
onKeyDown: disabled ? null : this.onKeyDown,
ref: this.saveRate,
role: "radiogroup",
children: stars
});
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(nextProps, state) {
if ("value" in nextProps && nextProps.value !== void 0) {
return _objectSpread2$a(_objectSpread2$a({}, state), {}, {
value: nextProps.value
});
}
return state;
}
}]);
return Rate2;
}(React__default.default.Component);
Rate$1.defaultProps = {
defaultValue: 0,
count: 5,
allowHalf: false,
allowClear: true,
style: {},
prefixCls: "rc-rate",
onChange: noop$4,
character: "\u2605",
onHoverChange: noop$4,
tabIndex: 0,
direction: "ltr"
};
var __rest$7 = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Rate = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var prefixCls = props.prefixCls, tooltips = props.tooltips, _props$character = props.character, character = _props$character === void 0 ? /* @__PURE__ */ jsx(StarFilled$1, {}) : _props$character, rest = __rest$7(props, ["prefixCls", "tooltips", "character"]);
var characterRender = function characterRender2(node, _ref) {
var index2 = _ref.index;
if (!tooltips) {
return node;
}
return /* @__PURE__ */ jsx(_Tooltip, {
title: tooltips[index2],
children: node
});
};
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var ratePrefixCls = getPrefixCls("rate", prefixCls);
return /* @__PURE__ */ jsx(Rate$1, {
ref,
character,
characterRender,
...rest,
prefixCls: ratePrefixCls,
direction
});
});
const _Rate = Rate;
var SliderContext = /* @__PURE__ */ React__namespace.createContext({
min: 0,
max: 0,
direction: "ltr",
step: 1,
includedStart: 0,
includedEnd: 0,
tabIndex: 0
});
function getOffset(value, min, max) {
return (value - min) / (max - min);
}
function getDirectionStyle(direction, value, min, max) {
var offset2 = getOffset(value, min, max);
var positionStyle = {};
switch (direction) {
case "rtl":
positionStyle.right = "".concat(offset2 * 100, "%");
positionStyle.transform = "translateX(50%)";
break;
case "btt":
positionStyle.bottom = "".concat(offset2 * 100, "%");
positionStyle.transform = "translateY(50%)";
break;
case "ttb":
positionStyle.top = "".concat(offset2 * 100, "%");
positionStyle.transform = "translateY(-50%)";
break;
default:
positionStyle.left = "".concat(offset2 * 100, "%");
positionStyle.transform = "translateX(-50%)";
break;
}
return positionStyle;
}
function getIndex(value, index2) {
return Array.isArray(value) ? value[index2] : value;
}
var _excluded$e = ["prefixCls", "value", "valueIndex", "onStartMove", "style", "render", "dragging", "onOffsetChange"];
var Handle = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames, _getIndex;
var prefixCls = props.prefixCls, value = props.value, valueIndex = props.valueIndex, onStartMove = props.onStartMove, style2 = props.style, render2 = props.render, dragging = props.dragging, onOffsetChange = props.onOffsetChange, restProps = _objectWithoutProperties$1(props, _excluded$e);
var _React$useContext = React__namespace.useContext(SliderContext), min = _React$useContext.min, max = _React$useContext.max, direction = _React$useContext.direction, disabled = _React$useContext.disabled, range2 = _React$useContext.range, tabIndex = _React$useContext.tabIndex, ariaLabelForHandle = _React$useContext.ariaLabelForHandle, ariaLabelledByForHandle = _React$useContext.ariaLabelledByForHandle, ariaValueTextFormatterForHandle = _React$useContext.ariaValueTextFormatterForHandle;
var handlePrefixCls = "".concat(prefixCls, "-handle");
var onInternalStartMove = function onInternalStartMove2(e2) {
if (!disabled) {
onStartMove(e2, valueIndex);
}
};
var onKeyDown2 = function onKeyDown3(e2) {
if (!disabled) {
var offset2 = null;
switch (e2.which || e2.keyCode) {
case KeyCode.LEFT:
offset2 = direction === "ltr" || direction === "btt" ? -1 : 1;
break;
case KeyCode.RIGHT:
offset2 = direction === "ltr" || direction === "btt" ? 1 : -1;
break;
case KeyCode.UP:
offset2 = direction !== "ttb" ? 1 : -1;
break;
case KeyCode.DOWN:
offset2 = direction !== "ttb" ? -1 : 1;
break;
case KeyCode.HOME:
offset2 = "min";
break;
case KeyCode.END:
offset2 = "max";
break;
case KeyCode.PAGE_UP:
offset2 = 2;
break;
case KeyCode.PAGE_DOWN:
offset2 = -2;
break;
}
if (offset2 !== null) {
e2.preventDefault();
onOffsetChange(offset2, valueIndex);
}
}
};
var positionStyle = getDirectionStyle(direction, value, min, max);
var handleNode = /* @__PURE__ */ jsx("div", {
ref,
className: classnames(handlePrefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(handlePrefixCls, "-").concat(valueIndex + 1), range2), _defineProperty$b(_classNames, "".concat(handlePrefixCls, "-dragging"), dragging), _classNames)),
style: _objectSpread2$a(_objectSpread2$a({}, positionStyle), style2),
onMouseDown: onInternalStartMove,
onTouchStart: onInternalStartMove,
onKeyDown: onKeyDown2,
tabIndex: disabled ? null : getIndex(tabIndex, valueIndex),
role: "slider",
"aria-valuemin": min,
"aria-valuemax": max,
"aria-valuenow": value,
"aria-disabled": disabled,
"aria-label": getIndex(ariaLabelForHandle, valueIndex),
"aria-labelledby": getIndex(ariaLabelledByForHandle, valueIndex),
"aria-valuetext": (_getIndex = getIndex(ariaValueTextFormatterForHandle, valueIndex)) === null || _getIndex === void 0 ? void 0 : _getIndex(value),
...restProps
});
if (render2) {
handleNode = render2(handleNode, {
index: valueIndex,
prefixCls,
value,
dragging
});
}
return handleNode;
});
var _excluded$d = ["prefixCls", "style", "onStartMove", "onOffsetChange", "values", "handleRender", "draggingIndex"];
var Handles = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var prefixCls = props.prefixCls, style2 = props.style, onStartMove = props.onStartMove, onOffsetChange = props.onOffsetChange, values = props.values, handleRender = props.handleRender, draggingIndex = props.draggingIndex, restProps = _objectWithoutProperties$1(props, _excluded$d);
var handlesRef = React__namespace.useRef({});
React__namespace.useImperativeHandle(ref, function() {
return {
focus: function focus(index2) {
var _handlesRef$current$i;
(_handlesRef$current$i = handlesRef.current[index2]) === null || _handlesRef$current$i === void 0 ? void 0 : _handlesRef$current$i.focus();
}
};
});
return /* @__PURE__ */ jsx(Fragment, {
children: values.map(function(value, index2) {
return /* @__PURE__ */ jsx(Handle, {
ref: function ref2(node) {
if (!node) {
delete handlesRef.current[index2];
} else {
handlesRef.current[index2] = node;
}
},
dragging: draggingIndex === index2,
prefixCls,
style: getIndex(style2, index2),
value,
valueIndex: index2,
onStartMove,
onOffsetChange,
render: handleRender,
...restProps
}, index2);
})
});
});
function getPosition(e2) {
var obj = "touches" in e2 ? e2.touches[0] : e2;
return {
pageX: obj.pageX,
pageY: obj.pageY
};
}
function useDrag(containerRef, direction, rawValues, min, max, formatValue2, triggerChange, finishChange, offsetValues) {
var _React$useState = React__namespace.useState(null), _React$useState2 = _slicedToArray$e(_React$useState, 2), draggingValue = _React$useState2[0], setDraggingValue = _React$useState2[1];
var _React$useState3 = React__namespace.useState(-1), _React$useState4 = _slicedToArray$e(_React$useState3, 2), draggingIndex = _React$useState4[0], setDraggingIndex = _React$useState4[1];
var _React$useState5 = React__namespace.useState(rawValues), _React$useState6 = _slicedToArray$e(_React$useState5, 2), cacheValues = _React$useState6[0], setCacheValues = _React$useState6[1];
var _React$useState7 = React__namespace.useState(rawValues), _React$useState8 = _slicedToArray$e(_React$useState7, 2), originValues = _React$useState8[0], setOriginValues = _React$useState8[1];
var mouseMoveEventRef = React__namespace.useRef(null);
var mouseUpEventRef = React__namespace.useRef(null);
React__namespace.useEffect(function() {
if (draggingIndex === -1) {
setCacheValues(rawValues);
}
}, [rawValues, draggingIndex]);
React__namespace.useEffect(function() {
return function() {
document.removeEventListener("mousemove", mouseMoveEventRef.current);
document.removeEventListener("mouseup", mouseUpEventRef.current);
document.removeEventListener("touchmove", mouseMoveEventRef.current);
document.removeEventListener("touchend", mouseUpEventRef.current);
};
}, []);
var flushValues = function flushValues2(nextValues, nextValue) {
if (cacheValues.some(function(val, i2) {
return val !== nextValues[i2];
})) {
if (nextValue !== void 0) {
setDraggingValue(nextValue);
}
setCacheValues(nextValues);
triggerChange(nextValues);
}
};
var updateCacheValue = function updateCacheValue2(valueIndex, offsetPercent) {
if (valueIndex === -1) {
var startValue = originValues[0];
var endValue = originValues[originValues.length - 1];
var maxStartOffset = min - startValue;
var maxEndOffset = max - endValue;
var offset2 = offsetPercent * (max - min);
offset2 = Math.max(offset2, maxStartOffset);
offset2 = Math.min(offset2, maxEndOffset);
var formatStartValue = formatValue2(startValue + offset2);
offset2 = formatStartValue - startValue;
var cloneCacheValues = originValues.map(function(val) {
return val + offset2;
});
flushValues(cloneCacheValues);
} else {
var offsetDist = (max - min) * offsetPercent;
var cloneValues = _toConsumableArray$c(cacheValues);
cloneValues[valueIndex] = originValues[valueIndex];
var next = offsetValues(cloneValues, offsetDist, valueIndex, "dist");
flushValues(next.values, next.value);
}
};
var updateCacheValueRef = React__namespace.useRef(updateCacheValue);
updateCacheValueRef.current = updateCacheValue;
var onStartMove = function onStartMove2(e2, valueIndex) {
e2.stopPropagation();
var originValue = rawValues[valueIndex];
setDraggingIndex(valueIndex);
setDraggingValue(originValue);
setOriginValues(rawValues);
var _getPosition = getPosition(e2), startX = _getPosition.pageX, startY = _getPosition.pageY;
var onMouseMove = function onMouseMove2(event) {
event.preventDefault();
var _getPosition2 = getPosition(event), moveX = _getPosition2.pageX, moveY = _getPosition2.pageY;
var offsetX = moveX - startX;
var offsetY = moveY - startY;
var _containerRef$current = containerRef.current.getBoundingClientRect(), width = _containerRef$current.width, height = _containerRef$current.height;
var offSetPercent;
switch (direction) {
case "btt":
offSetPercent = -offsetY / height;
break;
case "ttb":
offSetPercent = offsetY / height;
break;
case "rtl":
offSetPercent = -offsetX / width;
break;
default:
offSetPercent = offsetX / width;
}
updateCacheValueRef.current(valueIndex, offSetPercent);
};
var onMouseUp = function onMouseUp2(event) {
event.preventDefault();
document.removeEventListener("mouseup", onMouseUp2);
document.removeEventListener("mousemove", onMouseMove);
document.removeEventListener("touchend", onMouseUp2);
document.removeEventListener("touchmove", onMouseMove);
mouseMoveEventRef.current = null;
mouseUpEventRef.current = null;
setDraggingIndex(-1);
finishChange();
};
document.addEventListener("mouseup", onMouseUp);
document.addEventListener("mousemove", onMouseMove);
document.addEventListener("touchend", onMouseUp);
document.addEventListener("touchmove", onMouseMove);
mouseMoveEventRef.current = onMouseMove;
mouseUpEventRef.current = onMouseUp;
};
var returnValues = React__namespace.useMemo(function() {
var sourceValues = _toConsumableArray$c(rawValues).sort(function(a, b2) {
return a - b2;
});
var targetValues = _toConsumableArray$c(cacheValues).sort(function(a, b2) {
return a - b2;
});
return sourceValues.every(function(val, index2) {
return val === targetValues[index2];
}) ? cacheValues : rawValues;
}, [rawValues, cacheValues]);
return [draggingIndex, draggingValue, returnValues, onStartMove];
}
function Track(props) {
var prefixCls = props.prefixCls, style2 = props.style, start = props.start, end = props.end, index2 = props.index, onStartMove = props.onStartMove;
var _React$useContext = React__namespace.useContext(SliderContext), direction = _React$useContext.direction, min = _React$useContext.min, max = _React$useContext.max, disabled = _React$useContext.disabled, range2 = _React$useContext.range;
var trackPrefixCls = "".concat(prefixCls, "-track");
var offsetStart = getOffset(start, min, max);
var offsetEnd = getOffset(end, min, max);
var onInternalStartMove = function onInternalStartMove2(e2) {
if (!disabled && onStartMove) {
onStartMove(e2, -1);
}
};
var positionStyle = {};
switch (direction) {
case "rtl":
positionStyle.right = "".concat(offsetStart * 100, "%");
positionStyle.width = "".concat(offsetEnd * 100 - offsetStart * 100, "%");
break;
case "btt":
positionStyle.bottom = "".concat(offsetStart * 100, "%");
positionStyle.height = "".concat(offsetEnd * 100 - offsetStart * 100, "%");
break;
case "ttb":
positionStyle.top = "".concat(offsetStart * 100, "%");
positionStyle.height = "".concat(offsetEnd * 100 - offsetStart * 100, "%");
break;
default:
positionStyle.left = "".concat(offsetStart * 100, "%");
positionStyle.width = "".concat(offsetEnd * 100 - offsetStart * 100, "%");
}
return /* @__PURE__ */ jsx("div", {
className: classnames(trackPrefixCls, range2 && "".concat(trackPrefixCls, "-").concat(index2 + 1)),
style: _objectSpread2$a(_objectSpread2$a({}, positionStyle), style2),
onMouseDown: onInternalStartMove,
onTouchStart: onInternalStartMove
});
}
function Tracks(props) {
var prefixCls = props.prefixCls, style2 = props.style, values = props.values, startPoint = props.startPoint, onStartMove = props.onStartMove;
var _React$useContext = React__namespace.useContext(SliderContext), included = _React$useContext.included, range2 = _React$useContext.range, min = _React$useContext.min;
var trackList = React__namespace.useMemo(function() {
if (!range2) {
if (values.length === 0) {
return [];
}
var startValue = startPoint !== null && startPoint !== void 0 ? startPoint : min;
var endValue = values[0];
return [{
start: Math.min(startValue, endValue),
end: Math.max(startValue, endValue)
}];
}
var list = [];
for (var i2 = 0; i2 < values.length - 1; i2 += 1) {
list.push({
start: values[i2],
end: values[i2 + 1]
});
}
return list;
}, [values, range2, startPoint, min]);
return included ? trackList.map(function(_ref, index2) {
var start = _ref.start, end = _ref.end;
return /* @__PURE__ */ jsx(Track, {
index: index2,
prefixCls,
style: getIndex(style2, index2),
start,
end,
onStartMove
}, index2);
}) : null;
}
function Mark(props) {
var prefixCls = props.prefixCls, style2 = props.style, children = props.children, value = props.value, _onClick = props.onClick;
var _React$useContext = React__namespace.useContext(SliderContext), min = _React$useContext.min, max = _React$useContext.max, direction = _React$useContext.direction, includedStart = _React$useContext.includedStart, includedEnd = _React$useContext.includedEnd, included = _React$useContext.included;
var textCls = "".concat(prefixCls, "-text");
var positionStyle = getDirectionStyle(direction, value, min, max);
return /* @__PURE__ */ jsx("span", {
className: classnames(textCls, _defineProperty$b({}, "".concat(textCls, "-active"), included && includedStart <= value && value <= includedEnd)),
style: _objectSpread2$a(_objectSpread2$a({}, positionStyle), style2),
onMouseDown: function onMouseDown(e2) {
e2.stopPropagation();
},
onClick: function onClick() {
_onClick(value);
},
children
});
}
function Marks(props) {
var prefixCls = props.prefixCls, marks = props.marks, onClick = props.onClick;
var markPrefixCls = "".concat(prefixCls, "-mark");
if (!marks.length) {
return null;
}
return /* @__PURE__ */ jsx("div", {
className: markPrefixCls,
children: marks.map(function(_ref) {
var value = _ref.value, style2 = _ref.style, label = _ref.label;
return /* @__PURE__ */ jsx(Mark, {
prefixCls: markPrefixCls,
style: style2,
value,
onClick,
children: label
}, value);
})
});
}
function Dot(props) {
var prefixCls = props.prefixCls, value = props.value, style2 = props.style, activeStyle = props.activeStyle;
var _React$useContext = React__namespace.useContext(SliderContext), min = _React$useContext.min, max = _React$useContext.max, direction = _React$useContext.direction, included = _React$useContext.included, includedStart = _React$useContext.includedStart, includedEnd = _React$useContext.includedEnd;
var dotClassName = "".concat(prefixCls, "-dot");
var active = included && includedStart <= value && value <= includedEnd;
var mergedStyle = _objectSpread2$a(_objectSpread2$a({}, getDirectionStyle(direction, value, min, max)), typeof style2 === "function" ? style2(value) : style2);
if (active) {
mergedStyle = _objectSpread2$a(_objectSpread2$a({}, mergedStyle), typeof activeStyle === "function" ? activeStyle(value) : activeStyle);
}
return /* @__PURE__ */ jsx("span", {
className: classnames(dotClassName, _defineProperty$b({}, "".concat(dotClassName, "-active"), active)),
style: mergedStyle
});
}
function Steps(props) {
var prefixCls = props.prefixCls, marks = props.marks, dots = props.dots, style2 = props.style, activeStyle = props.activeStyle;
var _React$useContext = React__namespace.useContext(SliderContext), min = _React$useContext.min, max = _React$useContext.max, step2 = _React$useContext.step;
var stepDots = React__namespace.useMemo(function() {
var dotSet = /* @__PURE__ */ new Set();
marks.forEach(function(mark) {
dotSet.add(mark.value);
});
if (dots && step2 !== null) {
var current = min;
while (current <= max) {
dotSet.add(current);
current += step2;
}
}
return Array.from(dotSet);
}, [min, max, step2, dots, marks]);
return /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-step"),
children: stepDots.map(function(dotValue) {
return /* @__PURE__ */ jsx(Dot, {
prefixCls,
value: dotValue,
style: style2,
activeStyle
}, dotValue);
})
});
}
function useOffset(min, max, step2, markList, allowCross, pushable) {
var formatRangeValue = React__namespace.useCallback(function(val) {
var formatNextValue = isFinite(val) ? val : min;
formatNextValue = Math.min(max, val);
formatNextValue = Math.max(min, formatNextValue);
return formatNextValue;
}, [min, max]);
var formatStepValue = React__namespace.useCallback(function(val) {
if (step2 !== null) {
var stepValue = min + Math.round((formatRangeValue(val) - min) / step2) * step2;
var getDecimal = function getDecimal2(num) {
return (String(num).split(".")[1] || "").length;
};
var maxDecimal = Math.max(getDecimal(step2), getDecimal(max), getDecimal(min));
var fixedValue = Number(stepValue.toFixed(maxDecimal));
return min <= fixedValue && fixedValue <= max ? fixedValue : null;
}
return null;
}, [step2, min, max, formatRangeValue]);
var formatValue2 = React__namespace.useCallback(function(val) {
var formatNextValue = formatRangeValue(val);
var alignValues = markList.map(function(mark) {
return mark.value;
});
if (step2 !== null) {
alignValues.push(formatStepValue(val));
}
alignValues.push(min, max);
var closeValue = alignValues[0];
var closeDist = max - min;
alignValues.forEach(function(alignValue) {
var dist = Math.abs(formatNextValue - alignValue);
if (dist <= closeDist) {
closeValue = alignValue;
closeDist = dist;
}
});
return closeValue;
}, [min, max, markList, step2, formatRangeValue, formatStepValue]);
var offsetValue = function offsetValue2(values, offset2, valueIndex) {
var mode = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : "unit";
if (typeof offset2 === "number") {
var nextValue;
var originValue = values[valueIndex];
var targetDistValue = originValue + offset2;
var potentialValues = [];
markList.forEach(function(mark) {
potentialValues.push(mark.value);
});
potentialValues.push(min, max);
potentialValues.push(formatStepValue(originValue));
var sign = offset2 > 0 ? 1 : -1;
if (mode === "unit") {
potentialValues.push(formatStepValue(originValue + sign * step2));
} else {
potentialValues.push(formatStepValue(targetDistValue));
}
potentialValues = potentialValues.filter(function(val) {
return val !== null;
}).filter(function(val) {
return offset2 < 0 ? val <= originValue : val >= originValue;
});
if (mode === "unit") {
potentialValues = potentialValues.filter(function(val) {
return val !== originValue;
});
}
var compareValue = mode === "unit" ? originValue : targetDistValue;
nextValue = potentialValues[0];
var valueDist = Math.abs(nextValue - compareValue);
potentialValues.forEach(function(potentialValue) {
var dist = Math.abs(potentialValue - compareValue);
if (dist < valueDist) {
nextValue = potentialValue;
valueDist = dist;
}
});
if (nextValue === void 0) {
return offset2 < 0 ? min : max;
}
if (mode === "dist") {
return nextValue;
}
if (Math.abs(offset2) > 1) {
var cloneValues = _toConsumableArray$c(values);
cloneValues[valueIndex] = nextValue;
return offsetValue2(cloneValues, offset2 - sign, valueIndex, mode);
}
return nextValue;
} else if (offset2 === "min") {
return min;
} else if (offset2 === "max") {
return max;
}
};
var offsetChangedValue = function offsetChangedValue2(values, offset2, valueIndex) {
var mode = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : "unit";
var originValue = values[valueIndex];
var nextValue = offsetValue(values, offset2, valueIndex, mode);
return {
value: nextValue,
changed: nextValue !== originValue
};
};
var needPush = function needPush2(dist) {
return pushable === null && dist === 0 || typeof pushable === "number" && dist < pushable;
};
var offsetValues = function offsetValues2(values, offset2, valueIndex) {
var mode = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : "unit";
var nextValues = values.map(formatValue2);
var originValue = nextValues[valueIndex];
var nextValue = offsetValue(nextValues, offset2, valueIndex, mode);
nextValues[valueIndex] = nextValue;
if (allowCross === false) {
var pushNum = pushable || 0;
if (valueIndex > 0 && nextValues[valueIndex - 1] !== originValue) {
nextValues[valueIndex] = Math.max(nextValues[valueIndex], nextValues[valueIndex - 1] + pushNum);
}
if (valueIndex < nextValues.length - 1 && nextValues[valueIndex + 1] !== originValue) {
nextValues[valueIndex] = Math.min(nextValues[valueIndex], nextValues[valueIndex + 1] - pushNum);
}
} else if (typeof pushable === "number" || pushable === null) {
for (var i2 = valueIndex + 1; i2 < nextValues.length; i2 += 1) {
var changed = true;
while (needPush(nextValues[i2] - nextValues[i2 - 1]) && changed) {
var _offsetChangedValue = offsetChangedValue(nextValues, 1, i2);
nextValues[i2] = _offsetChangedValue.value;
changed = _offsetChangedValue.changed;
}
}
for (var _i = valueIndex; _i > 0; _i -= 1) {
var _changed = true;
while (needPush(nextValues[_i] - nextValues[_i - 1]) && _changed) {
var _offsetChangedValue2 = offsetChangedValue(nextValues, -1, _i - 1);
nextValues[_i - 1] = _offsetChangedValue2.value;
_changed = _offsetChangedValue2.changed;
}
}
for (var _i2 = nextValues.length - 1; _i2 > 0; _i2 -= 1) {
var _changed2 = true;
while (needPush(nextValues[_i2] - nextValues[_i2 - 1]) && _changed2) {
var _offsetChangedValue3 = offsetChangedValue(nextValues, -1, _i2 - 1);
nextValues[_i2 - 1] = _offsetChangedValue3.value;
_changed2 = _offsetChangedValue3.changed;
}
}
for (var _i3 = 0; _i3 < nextValues.length - 1; _i3 += 1) {
var _changed3 = true;
while (needPush(nextValues[_i3 + 1] - nextValues[_i3]) && _changed3) {
var _offsetChangedValue4 = offsetChangedValue(nextValues, 1, _i3 + 1);
nextValues[_i3 + 1] = _offsetChangedValue4.value;
_changed3 = _offsetChangedValue4.changed;
}
}
}
return {
value: nextValues[valueIndex],
values: nextValues
};
};
return [formatValue2, offsetValues];
}
var Slider$2 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames;
var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-slider" : _props$prefixCls, className = props.className, style2 = props.style, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, autoFocus = props.autoFocus, onFocus = props.onFocus, onBlur = props.onBlur, _props$min = props.min, min = _props$min === void 0 ? 0 : _props$min, _props$max = props.max, max = _props$max === void 0 ? 100 : _props$max, _props$step = props.step, step2 = _props$step === void 0 ? 1 : _props$step, value = props.value, defaultValue = props.defaultValue, range2 = props.range, count = props.count, onChange = props.onChange, onBeforeChange = props.onBeforeChange, onAfterChange = props.onAfterChange, _props$allowCross = props.allowCross, allowCross = _props$allowCross === void 0 ? true : _props$allowCross, _props$pushable = props.pushable, pushable = _props$pushable === void 0 ? false : _props$pushable, draggableTrack = props.draggableTrack, reverse = props.reverse, vertical = props.vertical, _props$included = props.included, included = _props$included === void 0 ? true : _props$included, startPoint = props.startPoint, trackStyle = props.trackStyle, handleStyle = props.handleStyle, railStyle = props.railStyle, dotStyle = props.dotStyle, activeDotStyle = props.activeDotStyle, marks = props.marks, dots = props.dots, handleRender = props.handleRender, _props$tabIndex = props.tabIndex, tabIndex = _props$tabIndex === void 0 ? 0 : _props$tabIndex, ariaLabelForHandle = props.ariaLabelForHandle, ariaLabelledByForHandle = props.ariaLabelledByForHandle, ariaValueTextFormatterForHandle = props.ariaValueTextFormatterForHandle;
var handlesRef = React__namespace.useRef();
var containerRef = React__namespace.useRef();
var direction = React__namespace.useMemo(function() {
if (vertical) {
return reverse ? "ttb" : "btt";
}
return reverse ? "rtl" : "ltr";
}, [reverse, vertical]);
var mergedMin = React__namespace.useMemo(function() {
return isFinite(min) ? min : 0;
}, [min]);
var mergedMax = React__namespace.useMemo(function() {
return isFinite(max) ? max : 100;
}, [max]);
var mergedStep = React__namespace.useMemo(function() {
return step2 !== null && step2 <= 0 ? 1 : step2;
}, [step2]);
var mergedPush = React__namespace.useMemo(function() {
if (pushable === true) {
return mergedStep;
}
return pushable >= 0 ? pushable : false;
}, [pushable, mergedStep]);
var markList = React__namespace.useMemo(function() {
var keys2 = Object.keys(marks || {});
return keys2.map(function(key2) {
var mark = marks[key2];
var markObj = {
value: Number(key2)
};
if (mark && _typeof$q(mark) === "object" && !/* @__PURE__ */ React__namespace.isValidElement(mark) && ("label" in mark || "style" in mark)) {
markObj.style = mark.style;
markObj.label = mark.label;
} else {
markObj.label = mark;
}
return markObj;
}).filter(function(_ref) {
var label = _ref.label;
return label || typeof label === "number";
}).sort(function(a, b2) {
return a.value - b2.value;
});
}, [marks]);
var _useOffset = useOffset(mergedMin, mergedMax, mergedStep, markList, allowCross, mergedPush), _useOffset2 = _slicedToArray$e(_useOffset, 2), formatValue2 = _useOffset2[0], offsetValues = _useOffset2[1];
var _useMergedState = useMergedState(defaultValue, {
value
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), mergedValue = _useMergedState2[0], setValue2 = _useMergedState2[1];
var rawValues = React__namespace.useMemo(function() {
var valueList = mergedValue === null || mergedValue === void 0 ? [] : Array.isArray(mergedValue) ? mergedValue : [mergedValue];
var _valueList = _slicedToArray$e(valueList, 1), _valueList$ = _valueList[0], val0 = _valueList$ === void 0 ? mergedMin : _valueList$;
var returnValues = mergedValue === null ? [] : [val0];
if (range2) {
returnValues = _toConsumableArray$c(valueList);
if (count || mergedValue === void 0) {
var pointCount = count >= 0 ? count + 1 : 2;
returnValues = returnValues.slice(0, pointCount);
while (returnValues.length < pointCount) {
var _returnValues;
returnValues.push((_returnValues = returnValues[returnValues.length - 1]) !== null && _returnValues !== void 0 ? _returnValues : mergedMin);
}
}
returnValues.sort(function(a, b2) {
return a - b2;
});
}
returnValues.forEach(function(val, index2) {
returnValues[index2] = formatValue2(val);
});
return returnValues;
}, [mergedValue, range2, mergedMin, count, formatValue2]);
var rawValuesRef = React__namespace.useRef(rawValues);
rawValuesRef.current = rawValues;
var getTriggerValue = function getTriggerValue2(triggerValues) {
return range2 ? triggerValues : triggerValues[0];
};
var triggerChange = function triggerChange2(nextValues) {
var cloneNextValues = _toConsumableArray$c(nextValues).sort(function(a, b2) {
return a - b2;
});
if (onChange && !shallowequal(cloneNextValues, rawValuesRef.current)) {
onChange(getTriggerValue(cloneNextValues));
}
setValue2(cloneNextValues);
};
var changeToCloseValue = function changeToCloseValue2(newValue) {
if (!disabled) {
var valueIndex = 0;
var valueDist = mergedMax - mergedMin;
rawValues.forEach(function(val, index2) {
var dist = Math.abs(newValue - val);
if (dist <= valueDist) {
valueDist = dist;
valueIndex = index2;
}
});
var cloneNextValues = _toConsumableArray$c(rawValues);
cloneNextValues[valueIndex] = newValue;
if (range2 && !rawValues.length && count === void 0) {
cloneNextValues.push(newValue);
}
onBeforeChange === null || onBeforeChange === void 0 ? void 0 : onBeforeChange(getTriggerValue(cloneNextValues));
triggerChange(cloneNextValues);
onAfterChange === null || onAfterChange === void 0 ? void 0 : onAfterChange(getTriggerValue(cloneNextValues));
}
};
var onSliderMouseDown = function onSliderMouseDown2(e2) {
e2.preventDefault();
var _containerRef$current = containerRef.current.getBoundingClientRect(), width = _containerRef$current.width, height = _containerRef$current.height, left = _containerRef$current.left, top = _containerRef$current.top, bottom = _containerRef$current.bottom, right = _containerRef$current.right;
var clientX = e2.clientX, clientY = e2.clientY;
var percent;
switch (direction) {
case "btt":
percent = (bottom - clientY) / height;
break;
case "ttb":
percent = (clientY - top) / height;
break;
case "rtl":
percent = (right - clientX) / width;
break;
default:
percent = (clientX - left) / width;
}
var nextValue = mergedMin + percent * (mergedMax - mergedMin);
changeToCloseValue(formatValue2(nextValue));
};
var _React$useState = React__namespace.useState(null), _React$useState2 = _slicedToArray$e(_React$useState, 2), keyboardValue = _React$useState2[0], setKeyboardValue = _React$useState2[1];
var onHandleOffsetChange = function onHandleOffsetChange2(offset2, valueIndex) {
if (!disabled) {
var next = offsetValues(rawValues, offset2, valueIndex);
onBeforeChange === null || onBeforeChange === void 0 ? void 0 : onBeforeChange(getTriggerValue(rawValues));
triggerChange(next.values);
onAfterChange === null || onAfterChange === void 0 ? void 0 : onAfterChange(getTriggerValue(next.values));
setKeyboardValue(next.value);
}
};
React__namespace.useEffect(function() {
if (keyboardValue !== null) {
var valueIndex = rawValues.indexOf(keyboardValue);
if (valueIndex >= 0) {
handlesRef.current.focus(valueIndex);
}
}
setKeyboardValue(null);
}, [keyboardValue]);
var mergedDraggableTrack = React__namespace.useMemo(function() {
if (draggableTrack && mergedStep === null) {
return false;
}
return draggableTrack;
}, [draggableTrack, mergedStep]);
var finishChange = function finishChange2() {
onAfterChange === null || onAfterChange === void 0 ? void 0 : onAfterChange(getTriggerValue(rawValuesRef.current));
};
var _useDrag = useDrag(containerRef, direction, rawValues, mergedMin, mergedMax, formatValue2, triggerChange, finishChange, offsetValues), _useDrag2 = _slicedToArray$e(_useDrag, 4), draggingIndex = _useDrag2[0], draggingValue = _useDrag2[1], cacheValues = _useDrag2[2], onStartDrag = _useDrag2[3];
var onStartMove = function onStartMove2(e2, valueIndex) {
onStartDrag(e2, valueIndex);
onBeforeChange === null || onBeforeChange === void 0 ? void 0 : onBeforeChange(getTriggerValue(rawValuesRef.current));
};
var dragging = draggingIndex !== -1;
React__namespace.useEffect(function() {
if (!dragging) {
var valueIndex = rawValues.lastIndexOf(draggingValue);
handlesRef.current.focus(valueIndex);
}
}, [dragging]);
var sortedCacheValues = React__namespace.useMemo(function() {
return _toConsumableArray$c(cacheValues).sort(function(a, b2) {
return a - b2;
});
}, [cacheValues]);
var _React$useMemo = React__namespace.useMemo(function() {
if (!range2) {
return [mergedMin, sortedCacheValues[0]];
}
return [sortedCacheValues[0], sortedCacheValues[sortedCacheValues.length - 1]];
}, [sortedCacheValues, range2, mergedMin]), _React$useMemo2 = _slicedToArray$e(_React$useMemo, 2), includedStart = _React$useMemo2[0], includedEnd = _React$useMemo2[1];
React__namespace.useImperativeHandle(ref, function() {
return {
focus: function focus() {
handlesRef.current.focus(0);
},
blur: function blur() {
var _document = document, activeElement = _document.activeElement;
if (containerRef.current.contains(activeElement)) {
activeElement === null || activeElement === void 0 ? void 0 : activeElement.blur();
}
}
};
});
React__namespace.useEffect(function() {
if (autoFocus) {
handlesRef.current.focus(0);
}
}, []);
var context2 = React__namespace.useMemo(function() {
return {
min: mergedMin,
max: mergedMax,
direction,
disabled,
step: mergedStep,
included,
includedStart,
includedEnd,
range: range2,
tabIndex,
ariaLabelForHandle,
ariaLabelledByForHandle,
ariaValueTextFormatterForHandle
};
}, [mergedMin, mergedMax, direction, disabled, mergedStep, included, includedStart, includedEnd, range2, tabIndex, ariaLabelForHandle, ariaLabelledByForHandle, ariaValueTextFormatterForHandle]);
return /* @__PURE__ */ jsx(SliderContext.Provider, {
value: context2,
children: /* @__PURE__ */ jsxs("div", {
ref: containerRef,
className: classnames(prefixCls, className, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-disabled"), disabled), _defineProperty$b(_classNames, "".concat(prefixCls, "-vertical"), vertical), _defineProperty$b(_classNames, "".concat(prefixCls, "-horizontal"), !vertical), _defineProperty$b(_classNames, "".concat(prefixCls, "-with-marks"), markList.length), _classNames)),
style: style2,
onMouseDown: onSliderMouseDown,
children: [/* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-rail"),
style: railStyle
}), /* @__PURE__ */ jsx(Tracks, {
prefixCls,
style: trackStyle,
values: sortedCacheValues,
startPoint,
onStartMove: mergedDraggableTrack ? onStartMove : null
}), /* @__PURE__ */ jsx(Steps, {
prefixCls,
marks: markList,
dots,
style: dotStyle,
activeStyle: activeDotStyle
}), /* @__PURE__ */ jsx(Handles, {
ref: handlesRef,
prefixCls,
style: handleStyle,
values: cacheValues,
draggingIndex,
onStartMove,
onOffsetChange: onHandleOffsetChange,
onFocus,
onBlur,
handleRender
}), /* @__PURE__ */ jsx(Marks, {
prefixCls,
marks: markList,
onClick: changeToCloseValue
})]
})
});
});
var SliderTooltip = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var open = props.open;
var innerRef = React$a.useRef(null);
var rafRef = React$a.useRef(null);
function cancelKeepAlign() {
wrapperRaf$1.cancel(rafRef.current);
rafRef.current = null;
}
function keepAlign() {
rafRef.current = wrapperRaf$1(function() {
var _a;
(_a = innerRef.current) === null || _a === void 0 ? void 0 : _a.forcePopupAlign();
rafRef.current = null;
});
}
React__namespace.useEffect(function() {
if (open) {
keepAlign();
} else {
cancelKeepAlign();
}
return cancelKeepAlign;
}, [open, props.title]);
return /* @__PURE__ */ jsx(_Tooltip, {
ref: composeRef(innerRef, ref),
...props
});
});
const SliderTooltip$1 = SliderTooltip;
var __rest$6 = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Slider$1 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction, getPopupContainer = _React$useContext.getPopupContainer;
var _React$useState = React__namespace.useState({}), _React$useState2 = _slicedToArray$e(_React$useState, 2), opens = _React$useState2[0], setOpens = _React$useState2[1];
var toggleTooltipOpen = function toggleTooltipOpen2(index2, open) {
setOpens(function(prev) {
return _extends$3(_extends$3({}, prev), _defineProperty$b({}, index2, open));
});
};
var getTooltipPlacement = function getTooltipPlacement2(tooltipPlacement, vertical) {
if (tooltipPlacement) {
return tooltipPlacement;
}
if (!vertical) {
return "top";
}
return direction === "rtl" ? "left" : "right";
};
var customizePrefixCls = props.prefixCls, range2 = props.range, className = props.className, restProps = __rest$6(props, ["prefixCls", "range", "className"]);
var prefixCls = getPrefixCls("slider", customizePrefixCls);
var cls = classnames(className, _defineProperty$b({}, "".concat(prefixCls, "-rtl"), direction === "rtl"));
if (direction === "rtl" && !restProps.vertical) {
restProps.reverse = !restProps.reverse;
}
var _React$useMemo = React__namespace.useMemo(function() {
if (!range2) {
return [false];
}
return _typeof$q(range2) === "object" ? [true, range2.draggableTrack] : [true, false];
}, [range2]), _React$useMemo2 = _slicedToArray$e(_React$useMemo, 2), mergedRange = _React$useMemo2[0], draggableTrack = _React$useMemo2[1];
var handleRender = function handleRender2(node, info) {
var _a;
var index2 = info.index, dragging = info.dragging;
var rootPrefixCls = getPrefixCls();
var _props$tooltip = props.tooltip, tooltip = _props$tooltip === void 0 ? {} : _props$tooltip, vertical = props.vertical;
var tooltipProps = _extends$3({
formatter: (_a = props.tipFormatter) !== null && _a !== void 0 ? _a : function(value) {
return typeof value === "number" ? value.toString() : "";
},
open: props.tooltipVisible,
placement: props.tooltipPlacement,
getPopupContainer: props.getTooltipPopupContainer
}, tooltip);
var tooltipOpen = tooltipProps.open, tooltipPlacement = tooltipProps.placement, getTooltipPopupContainer = tooltipProps.getPopupContainer, customizeTooltipPrefixCls = tooltipProps.prefixCls, tipFormatter = tooltipProps.formatter;
var isTipFormatter = tipFormatter ? opens[index2] || dragging : false;
var open = tooltipOpen || tooltipOpen === void 0 && isTipFormatter;
var passedProps = _extends$3(_extends$3({}, node.props), {
onMouseEnter: function onMouseEnter() {
return toggleTooltipOpen(index2, true);
},
onMouseLeave: function onMouseLeave() {
return toggleTooltipOpen(index2, false);
}
});
var tooltipPrefixCls = getPrefixCls("tooltip", customizeTooltipPrefixCls);
return /* @__PURE__ */ jsx(SliderTooltip$1, {
prefixCls: tooltipPrefixCls,
title: tipFormatter ? tipFormatter(info.value) : "",
open,
placement: getTooltipPlacement(tooltipPlacement, vertical),
transitionName: "".concat(rootPrefixCls, "-zoom-down"),
overlayClassName: "".concat(prefixCls, "-tooltip"),
getPopupContainer: getTooltipPopupContainer || getPopupContainer,
children: /* @__PURE__ */ React__namespace.cloneElement(node, passedProps)
}, index2);
};
return /* @__PURE__ */ jsx(Slider$2, {
...restProps,
step: restProps.step,
range: mergedRange,
draggableTrack,
className: cls,
ref,
prefixCls,
handleRender
});
});
const _Slider = Slider$1;
var Switch$2 = React__namespace.forwardRef(function(_ref, ref) {
var _classNames;
var _ref$prefixCls = _ref.prefixCls, prefixCls = _ref$prefixCls === void 0 ? "rc-switch" : _ref$prefixCls, className = _ref.className, checked = _ref.checked, defaultChecked = _ref.defaultChecked, disabled = _ref.disabled, loadingIcon = _ref.loadingIcon, checkedChildren = _ref.checkedChildren, unCheckedChildren = _ref.unCheckedChildren, onClick = _ref.onClick, onChange = _ref.onChange, onKeyDown2 = _ref.onKeyDown, restProps = _objectWithoutProperties$1(_ref, ["prefixCls", "className", "checked", "defaultChecked", "disabled", "loadingIcon", "checkedChildren", "unCheckedChildren", "onClick", "onChange", "onKeyDown"]);
var _useMergedState = useMergedState(false, {
value: checked,
defaultValue: defaultChecked
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), innerChecked = _useMergedState2[0], setInnerChecked = _useMergedState2[1];
function triggerChange(newChecked, event) {
var mergedChecked = innerChecked;
if (!disabled) {
mergedChecked = newChecked;
setInnerChecked(mergedChecked);
onChange === null || onChange === void 0 ? void 0 : onChange(mergedChecked, event);
}
return mergedChecked;
}
function onInternalKeyDown(e2) {
if (e2.which === KeyCode.LEFT) {
triggerChange(false, e2);
} else if (e2.which === KeyCode.RIGHT) {
triggerChange(true, e2);
}
onKeyDown2 === null || onKeyDown2 === void 0 ? void 0 : onKeyDown2(e2);
}
function onInternalClick(e2) {
var ret = triggerChange(!innerChecked, e2);
onClick === null || onClick === void 0 ? void 0 : onClick(ret, e2);
}
var switchClassName = classnames(prefixCls, className, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-checked"), innerChecked), _defineProperty$b(_classNames, "".concat(prefixCls, "-disabled"), disabled), _classNames));
return /* @__PURE__ */ jsxs("button", {
...Object.assign({}, restProps, {
type: "button",
role: "switch",
"aria-checked": innerChecked,
disabled,
className: switchClassName,
ref,
onKeyDown: onInternalKeyDown,
onClick: onInternalClick
}),
children: [loadingIcon, /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-inner"),
children: innerChecked ? checkedChildren : unCheckedChildren
})]
});
});
Switch$2.displayName = "Switch";
var __rest$5 = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Switch$1 = /* @__PURE__ */ React__namespace.forwardRef(function(_a, ref) {
var _classNames;
var customizePrefixCls = _a.prefixCls, customizeSize = _a.size, customDisabled = _a.disabled, loading = _a.loading, _a$className = _a.className, className = _a$className === void 0 ? "" : _a$className, props = __rest$5(_a, ["prefixCls", "size", "disabled", "loading", "className"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var size = React__namespace.useContext(SizeContext$1);
var disabled = React__namespace.useContext(DisabledContext$1);
var mergedDisabled = (customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled) || loading;
var prefixCls = getPrefixCls("switch", customizePrefixCls);
var loadingIcon = /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-handle"),
children: loading && /* @__PURE__ */ jsx(LoadingOutlined$1, {
className: "".concat(prefixCls, "-loading-icon")
})
});
var classes = classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-small"), (customizeSize || size) === "small"), _defineProperty$b(_classNames, "".concat(prefixCls, "-loading"), loading), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className);
return /* @__PURE__ */ jsx(Wave$1, {
insertExtraNode: true,
children: /* @__PURE__ */ jsx(Switch$2, {
...props,
prefixCls,
className: classes,
disabled: mergedDisabled,
ref,
loadingIcon
})
});
});
Switch$1.__ANT_SWITCH = true;
const _Switch = Switch$1;
function ColumnGroup$1(_) {
return null;
}
function Column$1(_) {
return null;
}
var INTERNAL_KEY_PREFIX = "RC_TABLE_KEY";
function toArray$2(arr) {
if (arr === void 0 || arr === null) {
return [];
}
return Array.isArray(arr) ? arr : [arr];
}
function getPathValue(record, path2) {
if (!path2 && typeof path2 !== "number") {
return record;
}
var pathList = toArray$2(path2);
var current = record;
for (var i2 = 0; i2 < pathList.length; i2 += 1) {
if (!current) {
return null;
}
var prop = pathList[i2];
current = current[prop];
}
return current;
}
function getColumnsKey(columns) {
var columnKeys = [];
var keys2 = {};
columns.forEach(function(column) {
var _ref = column || {}, key2 = _ref.key, dataIndex = _ref.dataIndex;
var mergedKey = key2 || toArray$2(dataIndex).join("-") || INTERNAL_KEY_PREFIX;
while (keys2[mergedKey]) {
mergedKey = "".concat(mergedKey, "_next");
}
keys2[mergedKey] = true;
columnKeys.push(mergedKey);
});
return columnKeys;
}
function validateValue(val) {
return val !== null && val !== void 0;
}
var StickyContext = /* @__PURE__ */ React__namespace.createContext(false);
function createContext() {
var Context2 = /* @__PURE__ */ React__namespace.createContext(null);
var Provider2 = function Provider3(_ref) {
var value = _ref.value, children = _ref.children;
var valueRef = React__namespace.useRef(value);
valueRef.current = value;
var _React$useState = React__namespace.useState(function() {
return {
getValue: function getValue2() {
return valueRef.current;
},
listeners: /* @__PURE__ */ new Set()
};
}), _React$useState2 = _slicedToArray$e(_React$useState, 1), context2 = _React$useState2[0];
useLayoutEffect$1(function() {
context2.listeners.forEach(function(listener) {
listener(value);
});
}, [value]);
return /* @__PURE__ */ jsx(Context2.Provider, {
value: context2,
children
});
};
return {
Context: Context2,
Provider: Provider2
};
}
function useContextSelector(holder, selector) {
var eventSelector = useEvent(selector);
var context2 = React__namespace.useContext(holder === null || holder === void 0 ? void 0 : holder.Context);
var _ref2 = context2 || {}, listeners = _ref2.listeners, getValue2 = _ref2.getValue;
var _React$useState3 = React__namespace.useState(function() {
return eventSelector(context2 ? getValue2() : null);
}), _React$useState4 = _slicedToArray$e(_React$useState3, 2), value = _React$useState4[0], setValue2 = _React$useState4[1];
useLayoutEffect$1(function() {
if (!context2) {
return;
}
function trigger(nextValue) {
setValue2(function(prev) {
var selectedValue = eventSelector(nextValue);
return shallowequal(prev, selectedValue) ? prev : selectedValue;
});
}
listeners.add(trigger);
return function() {
listeners.delete(trigger);
};
}, [context2]);
return value;
}
var HoverContext = createContext();
var BodyContext = /* @__PURE__ */ React__namespace.createContext(null);
var PerfContext = /* @__PURE__ */ React__namespace.createContext({
renderWithProps: false
});
var _excluded$c = ["colSpan", "rowSpan", "style", "className"];
function inHoverRange(cellStartRow, cellRowSpan, startRow, endRow) {
var cellEndRow = cellStartRow + cellRowSpan - 1;
return cellStartRow <= endRow && cellEndRow >= startRow;
}
function isRenderCell(data) {
return data && _typeof$q(data) === "object" && !Array.isArray(data) && !/* @__PURE__ */ React__namespace.isValidElement(data);
}
function isRefComponent(component) {
if (typeof component === "string") {
return true;
}
return supportRef(component);
}
var getTitleFromCellRenderChildren = function getTitleFromCellRenderChildren2(_ref) {
var ellipsis = _ref.ellipsis, rowType = _ref.rowType, children = _ref.children;
var title;
var ellipsisConfig = ellipsis === true ? {
showTitle: true
} : ellipsis;
if (ellipsisConfig && (ellipsisConfig.showTitle || rowType === "header")) {
if (typeof children === "string" || typeof children === "number") {
title = children.toString();
} else if (/* @__PURE__ */ React__namespace.isValidElement(children) && typeof children.props.children === "string") {
title = children.props.children;
}
}
return title;
};
function Cell(_ref2, ref) {
var _ref4, _ref5, _classNames;
var prefixCls = _ref2.prefixCls, className = _ref2.className, record = _ref2.record, index2 = _ref2.index, renderIndex = _ref2.renderIndex, dataIndex = _ref2.dataIndex, render2 = _ref2.render, children = _ref2.children, _ref2$component = _ref2.component, Component = _ref2$component === void 0 ? "td" : _ref2$component, colSpan = _ref2.colSpan, rowSpan = _ref2.rowSpan, fixLeft = _ref2.fixLeft, fixRight = _ref2.fixRight, firstFixLeft = _ref2.firstFixLeft, lastFixLeft = _ref2.lastFixLeft, firstFixRight = _ref2.firstFixRight, lastFixRight = _ref2.lastFixRight, appendNode = _ref2.appendNode, _ref2$additionalProps = _ref2.additionalProps, additionalProps = _ref2$additionalProps === void 0 ? {} : _ref2$additionalProps, ellipsis = _ref2.ellipsis, align = _ref2.align, rowType = _ref2.rowType, isSticky = _ref2.isSticky, hovering = _ref2.hovering, onHover = _ref2.onHover;
var cellPrefixCls = "".concat(prefixCls, "-cell");
var perfRecord = React__namespace.useContext(PerfContext);
var supportSticky = React__namespace.useContext(StickyContext);
var _React$useContext = React__namespace.useContext(BodyContext), allColumnsFixedLeft = _React$useContext.allColumnsFixedLeft;
var _React$useMemo = React__namespace.useMemo(function() {
if (validateValue(children)) {
return [children];
}
var value = getPathValue(record, dataIndex);
var returnChildNode = value;
var returnCellProps = void 0;
if (render2) {
var renderData = render2(value, record, renderIndex);
if (isRenderCell(renderData)) {
returnChildNode = renderData.children;
returnCellProps = renderData.props;
perfRecord.renderWithProps = true;
} else {
returnChildNode = renderData;
}
}
return [returnChildNode, returnCellProps];
}, [
perfRecord.renderWithProps ? Math.random() : 0,
children,
dataIndex,
perfRecord,
record,
render2,
renderIndex
]), _React$useMemo2 = _slicedToArray$e(_React$useMemo, 2), childNode = _React$useMemo2[0], legacyCellProps = _React$useMemo2[1];
var mergedChildNode = childNode;
if (_typeof$q(mergedChildNode) === "object" && !Array.isArray(mergedChildNode) && !/* @__PURE__ */ React__namespace.isValidElement(mergedChildNode)) {
mergedChildNode = null;
}
if (ellipsis && (lastFixLeft || firstFixRight)) {
mergedChildNode = /* @__PURE__ */ jsx("span", {
className: "".concat(cellPrefixCls, "-content"),
children: mergedChildNode
});
}
var _ref3 = legacyCellProps || {}, cellColSpan = _ref3.colSpan, cellRowSpan = _ref3.rowSpan, cellStyle = _ref3.style, cellClassName = _ref3.className, restCellProps = _objectWithoutProperties$1(_ref3, _excluded$c);
var mergedColSpan = (_ref4 = cellColSpan !== void 0 ? cellColSpan : colSpan) !== null && _ref4 !== void 0 ? _ref4 : 1;
var mergedRowSpan = (_ref5 = cellRowSpan !== void 0 ? cellRowSpan : rowSpan) !== null && _ref5 !== void 0 ? _ref5 : 1;
if (mergedColSpan === 0 || mergedRowSpan === 0) {
return null;
}
var fixedStyle = {};
var isFixLeft = typeof fixLeft === "number" && supportSticky;
var isFixRight = typeof fixRight === "number" && supportSticky;
if (isFixLeft) {
fixedStyle.position = "sticky";
fixedStyle.left = fixLeft;
}
if (isFixRight) {
fixedStyle.position = "sticky";
fixedStyle.right = fixRight;
}
var alignStyle = {};
if (align) {
alignStyle.textAlign = align;
}
var onMouseEnter = function onMouseEnter2(event) {
var _additionalProps$onMo;
if (record) {
onHover(index2, index2 + mergedRowSpan - 1);
}
additionalProps === null || additionalProps === void 0 ? void 0 : (_additionalProps$onMo = additionalProps.onMouseEnter) === null || _additionalProps$onMo === void 0 ? void 0 : _additionalProps$onMo.call(additionalProps, event);
};
var onMouseLeave = function onMouseLeave2(event) {
var _additionalProps$onMo2;
if (record) {
onHover(-1, -1);
}
additionalProps === null || additionalProps === void 0 ? void 0 : (_additionalProps$onMo2 = additionalProps.onMouseLeave) === null || _additionalProps$onMo2 === void 0 ? void 0 : _additionalProps$onMo2.call(additionalProps, event);
};
var title = getTitleFromCellRenderChildren({
rowType,
ellipsis,
children: childNode
});
var componentProps = _objectSpread2$a(_objectSpread2$a(_objectSpread2$a({
title
}, restCellProps), additionalProps), {}, {
colSpan: mergedColSpan !== 1 ? mergedColSpan : null,
rowSpan: mergedRowSpan !== 1 ? mergedRowSpan : null,
className: classnames(cellPrefixCls, className, (_classNames = {}, _defineProperty$b(_classNames, "".concat(cellPrefixCls, "-fix-left"), isFixLeft && supportSticky), _defineProperty$b(_classNames, "".concat(cellPrefixCls, "-fix-left-first"), firstFixLeft && supportSticky), _defineProperty$b(_classNames, "".concat(cellPrefixCls, "-fix-left-last"), lastFixLeft && supportSticky), _defineProperty$b(_classNames, "".concat(cellPrefixCls, "-fix-left-all"), lastFixLeft && allColumnsFixedLeft && supportSticky), _defineProperty$b(_classNames, "".concat(cellPrefixCls, "-fix-right"), isFixRight && supportSticky), _defineProperty$b(_classNames, "".concat(cellPrefixCls, "-fix-right-first"), firstFixRight && supportSticky), _defineProperty$b(_classNames, "".concat(cellPrefixCls, "-fix-right-last"), lastFixRight && supportSticky), _defineProperty$b(_classNames, "".concat(cellPrefixCls, "-ellipsis"), ellipsis), _defineProperty$b(_classNames, "".concat(cellPrefixCls, "-with-append"), appendNode), _defineProperty$b(_classNames, "".concat(cellPrefixCls, "-fix-sticky"), (isFixLeft || isFixRight) && isSticky && supportSticky), _defineProperty$b(_classNames, "".concat(cellPrefixCls, "-row-hover"), !legacyCellProps && hovering), _classNames), additionalProps.className, cellClassName),
style: _objectSpread2$a(_objectSpread2$a(_objectSpread2$a(_objectSpread2$a({}, additionalProps.style), alignStyle), fixedStyle), cellStyle),
onMouseEnter,
onMouseLeave,
ref: isRefComponent(Component) ? ref : null
});
return /* @__PURE__ */ jsxs(Component, {
...componentProps,
children: [appendNode, mergedChildNode]
});
}
var RefCell = /* @__PURE__ */ React__namespace.forwardRef(Cell);
RefCell.displayName = "Cell";
var comparePropList = ["expanded", "className", "hovering"];
var MemoCell = /* @__PURE__ */ React__namespace.memo(RefCell, function(prev, next) {
if (next.shouldCellUpdate) {
return comparePropList.every(function(propName) {
return prev[propName] === next[propName];
}) && !next.shouldCellUpdate(next.record, prev.record);
}
return shallowequal(prev, next);
});
var WrappedCell = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var index2 = props.index, _props$additionalProp = props.additionalProps, additionalProps = _props$additionalProp === void 0 ? {} : _props$additionalProp, colSpan = props.colSpan, rowSpan = props.rowSpan;
var cellColSpan = additionalProps.colSpan, cellRowSpan = additionalProps.rowSpan;
var mergedColSpan = colSpan !== null && colSpan !== void 0 ? colSpan : cellColSpan;
var mergedRowSpan = rowSpan !== null && rowSpan !== void 0 ? rowSpan : cellRowSpan;
var _useContextSelector = useContextSelector(HoverContext, function(cxt) {
var isHovering = inHoverRange(index2, mergedRowSpan || 1, cxt === null || cxt === void 0 ? void 0 : cxt.startRow, cxt === null || cxt === void 0 ? void 0 : cxt.endRow);
return {
onHover: cxt === null || cxt === void 0 ? void 0 : cxt.onHover,
hovering: isHovering
};
}), onHover = _useContextSelector.onHover, hovering = _useContextSelector.hovering;
return /* @__PURE__ */ jsx(MemoCell, {
...props,
colSpan: mergedColSpan,
rowSpan: mergedRowSpan,
hovering,
ref,
onHover
});
});
WrappedCell.displayName = "WrappedCell";
var TableContext = /* @__PURE__ */ React__namespace.createContext(null);
function getCellFixedInfo(colStart, colEnd, columns, stickyOffsets, direction) {
var startColumn = columns[colStart] || {};
var endColumn = columns[colEnd] || {};
var fixLeft;
var fixRight;
if (startColumn.fixed === "left") {
fixLeft = stickyOffsets.left[colStart];
} else if (endColumn.fixed === "right") {
fixRight = stickyOffsets.right[colEnd];
}
var lastFixLeft = false;
var firstFixRight = false;
var lastFixRight = false;
var firstFixLeft = false;
var nextColumn = columns[colEnd + 1];
var prevColumn = columns[colStart - 1];
if (direction === "rtl") {
if (fixLeft !== void 0) {
var prevFixLeft = prevColumn && prevColumn.fixed === "left";
firstFixLeft = !prevFixLeft;
} else if (fixRight !== void 0) {
var nextFixRight = nextColumn && nextColumn.fixed === "right";
lastFixRight = !nextFixRight;
}
} else if (fixLeft !== void 0) {
var nextFixLeft = nextColumn && nextColumn.fixed === "left";
lastFixLeft = !nextFixLeft;
} else if (fixRight !== void 0) {
var prevFixRight = prevColumn && prevColumn.fixed === "right";
firstFixRight = !prevFixRight;
}
return {
fixLeft,
fixRight,
lastFixLeft,
firstFixRight,
lastFixRight,
firstFixLeft,
isSticky: stickyOffsets.isSticky
};
}
function HeaderRow(_ref) {
var cells = _ref.cells, stickyOffsets = _ref.stickyOffsets, flattenColumns = _ref.flattenColumns, RowComponent = _ref.rowComponent, CellComponent = _ref.cellComponent, onHeaderRow = _ref.onHeaderRow, index2 = _ref.index;
var _React$useContext = React__namespace.useContext(TableContext), prefixCls = _React$useContext.prefixCls, direction = _React$useContext.direction;
var rowProps;
if (onHeaderRow) {
rowProps = onHeaderRow(cells.map(function(cell) {
return cell.column;
}), index2);
}
var columnsKey = getColumnsKey(cells.map(function(cell) {
return cell.column;
}));
return /* @__PURE__ */ jsx(RowComponent, {
...rowProps,
children: cells.map(function(cell, cellIndex) {
var column = cell.column;
var fixedInfo = getCellFixedInfo(cell.colStart, cell.colEnd, flattenColumns, stickyOffsets, direction);
var additionalProps;
if (column && column.onHeaderCell) {
additionalProps = cell.column.onHeaderCell(column);
}
return /* @__PURE__ */ React$a.createElement(WrappedCell, {
...cell,
ellipsis: column.ellipsis,
align: column.align,
component: CellComponent,
prefixCls,
key: columnsKey[cellIndex],
...fixedInfo,
additionalProps,
rowType: "header"
});
})
});
}
HeaderRow.displayName = "HeaderRow";
function parseHeaderRows(rootColumns) {
var rows = [];
function fillRowCells(columns, colIndex) {
var rowIndex2 = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 0;
rows[rowIndex2] = rows[rowIndex2] || [];
var currentColIndex = colIndex;
var colSpans = columns.filter(Boolean).map(function(column) {
var cell = {
key: column.key,
className: column.className || "",
children: column.title,
column,
colStart: currentColIndex
};
var colSpan = 1;
var subColumns = column.children;
if (subColumns && subColumns.length > 0) {
colSpan = fillRowCells(subColumns, currentColIndex, rowIndex2 + 1).reduce(function(total, count) {
return total + count;
}, 0);
cell.hasSubColumns = true;
}
if ("colSpan" in column) {
colSpan = column.colSpan;
}
if ("rowSpan" in column) {
cell.rowSpan = column.rowSpan;
}
cell.colSpan = colSpan;
cell.colEnd = cell.colStart + colSpan - 1;
rows[rowIndex2].push(cell);
currentColIndex += colSpan;
return colSpan;
});
return colSpans;
}
fillRowCells(rootColumns, 0);
var rowCount = rows.length;
var _loop = function _loop2(rowIndex2) {
rows[rowIndex2].forEach(function(cell) {
if (!("rowSpan" in cell) && !cell.hasSubColumns) {
cell.rowSpan = rowCount - rowIndex2;
}
});
};
for (var rowIndex = 0; rowIndex < rowCount; rowIndex += 1) {
_loop(rowIndex);
}
return rows;
}
function Header(_ref) {
var stickyOffsets = _ref.stickyOffsets, columns = _ref.columns, flattenColumns = _ref.flattenColumns, onHeaderRow = _ref.onHeaderRow;
var _React$useContext = React__namespace.useContext(TableContext), prefixCls = _React$useContext.prefixCls, getComponent = _React$useContext.getComponent;
var rows = React__namespace.useMemo(function() {
return parseHeaderRows(columns);
}, [columns]);
var WrapperComponent = getComponent(["header", "wrapper"], "thead");
var trComponent = getComponent(["header", "row"], "tr");
var thComponent = getComponent(["header", "cell"], "th");
return /* @__PURE__ */ jsx(WrapperComponent, {
className: "".concat(prefixCls, "-thead"),
children: rows.map(function(row, rowIndex) {
var rowNode = /* @__PURE__ */ jsx(HeaderRow, {
flattenColumns,
cells: row,
stickyOffsets,
rowComponent: trComponent,
cellComponent: thComponent,
onHeaderRow,
index: rowIndex
}, rowIndex);
return rowNode;
})
});
}
var ExpandedRowContext = /* @__PURE__ */ React__namespace.createContext(null);
function ExpandedRow(_ref) {
var prefixCls = _ref.prefixCls, children = _ref.children, Component = _ref.component, cellComponent = _ref.cellComponent, className = _ref.className, expanded = _ref.expanded, colSpan = _ref.colSpan, isEmpty = _ref.isEmpty;
var _React$useContext = React__namespace.useContext(TableContext), scrollbarSize = _React$useContext.scrollbarSize;
var _React$useContext2 = React__namespace.useContext(ExpandedRowContext), fixHeader = _React$useContext2.fixHeader, fixColumn = _React$useContext2.fixColumn, componentWidth = _React$useContext2.componentWidth, horizonScroll = _React$useContext2.horizonScroll;
return React__namespace.useMemo(function() {
var contentNode = children;
if (isEmpty ? horizonScroll : fixColumn) {
contentNode = /* @__PURE__ */ jsx("div", {
style: {
width: componentWidth - (fixHeader ? scrollbarSize : 0),
position: "sticky",
left: 0,
overflow: "hidden"
},
className: "".concat(prefixCls, "-expanded-row-fixed"),
children: componentWidth !== 0 && contentNode
});
}
return /* @__PURE__ */ jsx(Component, {
className,
style: {
display: expanded ? null : "none"
},
children: /* @__PURE__ */ jsx(WrappedCell, {
component: cellComponent,
prefixCls,
colSpan,
children: contentNode
})
});
}, [children, Component, className, expanded, colSpan, isEmpty, scrollbarSize, componentWidth, fixColumn, fixHeader, horizonScroll]);
}
var ResizeContext = /* @__PURE__ */ React__namespace.createContext(null);
function BodyRow(props) {
var className = props.className, style2 = props.style, record = props.record, index2 = props.index, renderIndex = props.renderIndex, rowKey = props.rowKey, rowExpandable = props.rowExpandable, expandedKeys = props.expandedKeys, onRow = props.onRow, _props$indent = props.indent, indent = _props$indent === void 0 ? 0 : _props$indent, RowComponent = props.rowComponent, cellComponent = props.cellComponent, childrenColumnName = props.childrenColumnName;
var _React$useContext = React__namespace.useContext(TableContext), prefixCls = _React$useContext.prefixCls, fixedInfoList = _React$useContext.fixedInfoList;
var _React$useContext2 = React__namespace.useContext(BodyContext), flattenColumns = _React$useContext2.flattenColumns, expandableType = _React$useContext2.expandableType, expandRowByClick = _React$useContext2.expandRowByClick, onTriggerExpand = _React$useContext2.onTriggerExpand, rowClassName = _React$useContext2.rowClassName, expandedRowClassName = _React$useContext2.expandedRowClassName, indentSize = _React$useContext2.indentSize, expandIcon = _React$useContext2.expandIcon, expandedRowRender = _React$useContext2.expandedRowRender, expandIconColumnIndex = _React$useContext2.expandIconColumnIndex;
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), expandRended = _React$useState2[0], setExpandRended = _React$useState2[1];
var expanded = expandedKeys && expandedKeys.has(props.recordKey);
React__namespace.useEffect(function() {
if (expanded) {
setExpandRended(true);
}
}, [expanded]);
var rowSupportExpand = expandableType === "row" && (!rowExpandable || rowExpandable(record));
var nestExpandable = expandableType === "nest";
var hasNestChildren = childrenColumnName && record && record[childrenColumnName];
var mergedExpandable = rowSupportExpand || nestExpandable;
var onExpandRef = React__namespace.useRef(onTriggerExpand);
onExpandRef.current = onTriggerExpand;
var onInternalTriggerExpand = function onInternalTriggerExpand2() {
onExpandRef.current.apply(onExpandRef, arguments);
};
var additionalProps = onRow === null || onRow === void 0 ? void 0 : onRow(record, index2);
var onClick = function onClick2(event) {
var _additionalProps$onCl;
if (expandRowByClick && mergedExpandable) {
onInternalTriggerExpand(record, event);
}
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
additionalProps === null || additionalProps === void 0 ? void 0 : (_additionalProps$onCl = additionalProps.onClick) === null || _additionalProps$onCl === void 0 ? void 0 : _additionalProps$onCl.call.apply(_additionalProps$onCl, [additionalProps, event].concat(args));
};
var computeRowClassName;
if (typeof rowClassName === "string") {
computeRowClassName = rowClassName;
} else if (typeof rowClassName === "function") {
computeRowClassName = rowClassName(record, index2, indent);
}
var columnsKey = getColumnsKey(flattenColumns);
var baseRowNode = /* @__PURE__ */ jsx(RowComponent, {
...additionalProps,
"data-row-key": rowKey,
className: classnames(className, "".concat(prefixCls, "-row"), "".concat(prefixCls, "-row-level-").concat(indent), computeRowClassName, additionalProps && additionalProps.className),
style: _objectSpread2$a(_objectSpread2$a({}, style2), additionalProps ? additionalProps.style : null),
onClick,
children: flattenColumns.map(function(column, colIndex) {
var render2 = column.render, dataIndex = column.dataIndex, columnClassName = column.className;
var key2 = columnsKey[colIndex];
var fixedInfo = fixedInfoList[colIndex];
var appendCellNode;
if (colIndex === (expandIconColumnIndex || 0) && nestExpandable) {
appendCellNode = /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx("span", {
style: {
paddingLeft: "".concat(indentSize * indent, "px")
},
className: "".concat(prefixCls, "-row-indent indent-level-").concat(indent)
}), expandIcon({
prefixCls,
expanded,
expandable: hasNestChildren,
record,
onExpand: onInternalTriggerExpand
})]
});
}
var additionalCellProps;
if (column.onCell) {
additionalCellProps = column.onCell(record, index2);
}
return /* @__PURE__ */ jsx(WrappedCell, {
className: columnClassName,
ellipsis: column.ellipsis,
align: column.align,
component: cellComponent,
prefixCls,
record,
index: index2,
renderIndex,
dataIndex,
render: render2,
shouldCellUpdate: column.shouldCellUpdate,
expanded: appendCellNode && expanded,
...fixedInfo,
appendNode: appendCellNode,
additionalProps: additionalCellProps
}, key2);
})
});
var expandRowNode;
if (rowSupportExpand && (expandRended || expanded)) {
var expandContent = expandedRowRender(record, index2, indent + 1, expanded);
var computedExpandedRowClassName = expandedRowClassName && expandedRowClassName(record, index2, indent);
expandRowNode = /* @__PURE__ */ jsx(ExpandedRow, {
expanded,
className: classnames("".concat(prefixCls, "-expanded-row"), "".concat(prefixCls, "-expanded-row-level-").concat(indent + 1), computedExpandedRowClassName),
prefixCls,
component: RowComponent,
cellComponent,
colSpan: flattenColumns.length,
isEmpty: false,
children: expandContent
});
}
return /* @__PURE__ */ jsxs(Fragment, {
children: [baseRowNode, expandRowNode]
});
}
BodyRow.displayName = "BodyRow";
function flatRecord(record, indent, childrenColumnName, expandedKeys, getRowKey, index2) {
var arr = [];
arr.push({
record,
indent,
index: index2
});
var key2 = getRowKey(record);
var expanded = expandedKeys === null || expandedKeys === void 0 ? void 0 : expandedKeys.has(key2);
if (record && Array.isArray(record[childrenColumnName]) && expanded) {
for (var i2 = 0; i2 < record[childrenColumnName].length; i2 += 1) {
var tempArr = flatRecord(record[childrenColumnName][i2], indent + 1, childrenColumnName, expandedKeys, getRowKey, i2);
arr.push.apply(arr, _toConsumableArray$c(tempArr));
}
}
return arr;
}
function useFlattenRecords(data, childrenColumnName, expandedKeys, getRowKey) {
var arr = React__namespace.useMemo(function() {
if (expandedKeys === null || expandedKeys === void 0 ? void 0 : expandedKeys.size) {
var temp = [];
for (var i2 = 0; i2 < (data === null || data === void 0 ? void 0 : data.length); i2 += 1) {
var record = data[i2];
temp.push.apply(temp, _toConsumableArray$c(flatRecord(record, 0, childrenColumnName, expandedKeys, getRowKey, i2)));
}
return temp;
}
return data === null || data === void 0 ? void 0 : data.map(function(item, index2) {
return {
record: item,
indent: 0,
index: index2
};
});
}, [data, childrenColumnName, expandedKeys, getRowKey]);
return arr;
}
function MeasureCell(_ref) {
var columnKey = _ref.columnKey, onColumnResize = _ref.onColumnResize;
var cellRef = React__namespace.useRef();
React__namespace.useEffect(function() {
if (cellRef.current) {
onColumnResize(columnKey, cellRef.current.offsetWidth);
}
}, []);
return /* @__PURE__ */ jsx(RefResizeObserver, {
data: columnKey,
children: /* @__PURE__ */ jsx("td", {
ref: cellRef,
style: {
padding: 0,
border: 0,
height: 0
},
children: /* @__PURE__ */ jsx("div", {
style: {
height: 0,
overflow: "hidden"
},
children: "\xA0"
})
})
});
}
function MeasureRow(_ref) {
var prefixCls = _ref.prefixCls, columnsKey = _ref.columnsKey, onColumnResize = _ref.onColumnResize;
return /* @__PURE__ */ jsx("tr", {
"aria-hidden": "true",
className: "".concat(prefixCls, "-measure-row"),
style: {
height: 0,
fontSize: 0
},
children: /* @__PURE__ */ jsx(RefResizeObserver.Collection, {
onBatchResize: function onBatchResize(infoList) {
infoList.forEach(function(_ref2) {
var columnKey = _ref2.data, size = _ref2.size;
onColumnResize(columnKey, size.offsetWidth);
});
},
children: columnsKey.map(function(columnKey) {
return /* @__PURE__ */ jsx(MeasureCell, {
columnKey,
onColumnResize
}, columnKey);
})
})
});
}
function Body(_ref) {
var data = _ref.data, getRowKey = _ref.getRowKey, measureColumnWidth = _ref.measureColumnWidth, expandedKeys = _ref.expandedKeys, onRow = _ref.onRow, rowExpandable = _ref.rowExpandable, emptyNode = _ref.emptyNode, childrenColumnName = _ref.childrenColumnName;
var _React$useContext = React__namespace.useContext(ResizeContext), onColumnResize = _React$useContext.onColumnResize;
var _React$useContext2 = React__namespace.useContext(TableContext), prefixCls = _React$useContext2.prefixCls, getComponent = _React$useContext2.getComponent;
var _React$useContext3 = React__namespace.useContext(BodyContext), flattenColumns = _React$useContext3.flattenColumns;
var flattenData2 = useFlattenRecords(data, childrenColumnName, expandedKeys, getRowKey);
var perfRef = React__namespace.useRef({
renderWithProps: false
});
var _React$useState = React__namespace.useState(-1), _React$useState2 = _slicedToArray$e(_React$useState, 2), startRow = _React$useState2[0], setStartRow = _React$useState2[1];
var _React$useState3 = React__namespace.useState(-1), _React$useState4 = _slicedToArray$e(_React$useState3, 2), endRow = _React$useState4[0], setEndRow = _React$useState4[1];
var onHover = React__namespace.useCallback(function(start, end) {
setStartRow(start);
setEndRow(end);
}, []);
var bodyNode = React__namespace.useMemo(function() {
var WrapperComponent = getComponent(["body", "wrapper"], "tbody");
var trComponent = getComponent(["body", "row"], "tr");
var tdComponent = getComponent(["body", "cell"], "td");
var rows;
if (data.length) {
rows = flattenData2.map(function(item, idx) {
var record = item.record, indent = item.indent, renderIndex = item.index;
var key2 = getRowKey(record, idx);
return /* @__PURE__ */ jsx(BodyRow, {
rowKey: key2,
record,
recordKey: key2,
index: idx,
renderIndex,
rowComponent: trComponent,
cellComponent: tdComponent,
expandedKeys,
onRow,
getRowKey,
rowExpandable,
childrenColumnName,
indent
}, key2);
});
} else {
rows = /* @__PURE__ */ jsx(ExpandedRow, {
expanded: true,
className: "".concat(prefixCls, "-placeholder"),
prefixCls,
component: trComponent,
cellComponent: tdComponent,
colSpan: flattenColumns.length,
isEmpty: true,
children: emptyNode
});
}
var columnsKey = getColumnsKey(flattenColumns);
return /* @__PURE__ */ jsxs(WrapperComponent, {
className: "".concat(prefixCls, "-tbody"),
children: [measureColumnWidth && /* @__PURE__ */ jsx(MeasureRow, {
prefixCls,
columnsKey,
onColumnResize
}), rows]
});
}, [data, prefixCls, onRow, measureColumnWidth, expandedKeys, getRowKey, getComponent, emptyNode, flattenColumns, childrenColumnName, onColumnResize, rowExpandable, flattenData2]);
return /* @__PURE__ */ jsx(PerfContext.Provider, {
value: perfRef.current,
children: /* @__PURE__ */ jsx(HoverContext.Provider, {
value: {
startRow,
endRow,
onHover
},
children: bodyNode
})
});
}
var MemoBody = /* @__PURE__ */ React__namespace.memo(Body);
MemoBody.displayName = "Body";
var _excluded$b = ["expandable"];
var INTERNAL_COL_DEFINE = "RC_TABLE_INTERNAL_COL_DEFINE";
function getExpandableProps(props) {
var expandable = props.expandable, legacyExpandableConfig = _objectWithoutProperties$1(props, _excluded$b);
var config;
if ("expandable" in props) {
config = _objectSpread2$a(_objectSpread2$a({}, legacyExpandableConfig), expandable);
} else {
config = legacyExpandableConfig;
}
if (config.showExpandColumn === false) {
config.expandIconColumnIndex = -1;
}
return config;
}
var EXPAND_COLUMN = {};
var _excluded$a = ["children"], _excluded2$1 = ["fixed"];
function convertChildrenToColumns(children) {
return toArray$9(children).filter(function(node) {
return /* @__PURE__ */ React__namespace.isValidElement(node);
}).map(function(_ref) {
var key2 = _ref.key, props = _ref.props;
var nodeChildren = props.children, restProps = _objectWithoutProperties$1(props, _excluded$a);
var column = _objectSpread2$a({
key: key2
}, restProps);
if (nodeChildren) {
column.children = convertChildrenToColumns(nodeChildren);
}
return column;
});
}
function flatColumns(columns) {
return columns.reduce(function(list, column) {
var fixed = column.fixed;
var parsedFixed = fixed === true ? "left" : fixed;
var subColumns = column.children;
if (subColumns && subColumns.length > 0) {
return [].concat(_toConsumableArray$c(list), _toConsumableArray$c(flatColumns(subColumns).map(function(subColum) {
return _objectSpread2$a({
fixed: parsedFixed
}, subColum);
})));
}
return [].concat(_toConsumableArray$c(list), [_objectSpread2$a(_objectSpread2$a({}, column), {}, {
fixed: parsedFixed
})]);
}, []);
}
function revertForRtl(columns) {
return columns.map(function(column) {
var fixed = column.fixed, restProps = _objectWithoutProperties$1(column, _excluded2$1);
var parsedFixed = fixed;
if (fixed === "left") {
parsedFixed = "right";
} else if (fixed === "right") {
parsedFixed = "left";
}
return _objectSpread2$a({
fixed: parsedFixed
}, restProps);
});
}
function useColumns(_ref2, transformColumns) {
var prefixCls = _ref2.prefixCls, columns = _ref2.columns, children = _ref2.children, expandable = _ref2.expandable, expandedKeys = _ref2.expandedKeys, columnTitle = _ref2.columnTitle, getRowKey = _ref2.getRowKey, onTriggerExpand = _ref2.onTriggerExpand, expandIcon = _ref2.expandIcon, rowExpandable = _ref2.rowExpandable, expandIconColumnIndex = _ref2.expandIconColumnIndex, direction = _ref2.direction, expandRowByClick = _ref2.expandRowByClick, columnWidth = _ref2.columnWidth, fixed = _ref2.fixed;
var baseColumns = React__namespace.useMemo(function() {
return columns || convertChildrenToColumns(children);
}, [columns, children]);
var withExpandColumns = React__namespace.useMemo(function() {
if (expandable) {
var _expandColumn;
var cloneColumns = baseColumns.slice();
if (!cloneColumns.includes(EXPAND_COLUMN)) {
var expandColIndex = expandIconColumnIndex || 0;
if (expandColIndex >= 0) {
cloneColumns.splice(expandColIndex, 0, EXPAND_COLUMN);
}
}
var expandColumnIndex = cloneColumns.indexOf(EXPAND_COLUMN);
cloneColumns = cloneColumns.filter(function(column, index2) {
return column !== EXPAND_COLUMN || index2 === expandColumnIndex;
});
var prevColumn = baseColumns[expandColumnIndex];
var fixedColumn;
if ((fixed === "left" || fixed) && !expandIconColumnIndex) {
fixedColumn = "left";
} else if ((fixed === "right" || fixed) && expandIconColumnIndex === baseColumns.length) {
fixedColumn = "right";
} else {
fixedColumn = prevColumn ? prevColumn.fixed : null;
}
var expandColumn = (_expandColumn = {}, _defineProperty$b(_expandColumn, INTERNAL_COL_DEFINE, {
className: "".concat(prefixCls, "-expand-icon-col"),
columnType: "EXPAND_COLUMN"
}), _defineProperty$b(_expandColumn, "title", columnTitle), _defineProperty$b(_expandColumn, "fixed", fixedColumn), _defineProperty$b(_expandColumn, "className", "".concat(prefixCls, "-row-expand-icon-cell")), _defineProperty$b(_expandColumn, "width", columnWidth), _defineProperty$b(_expandColumn, "render", function render2(_, record, index2) {
var rowKey = getRowKey(record, index2);
var expanded = expandedKeys.has(rowKey);
var recordExpandable = rowExpandable ? rowExpandable(record) : true;
var icon = expandIcon({
prefixCls,
expanded,
expandable: recordExpandable,
record,
onExpand: onTriggerExpand
});
if (expandRowByClick) {
return /* @__PURE__ */ jsx("span", {
onClick: function onClick(e2) {
return e2.stopPropagation();
},
children: icon
});
}
return icon;
}), _expandColumn);
return cloneColumns.map(function(col) {
return col === EXPAND_COLUMN ? expandColumn : col;
});
}
return baseColumns.filter(function(col) {
return col !== EXPAND_COLUMN;
});
}, [expandable, baseColumns, getRowKey, expandedKeys, expandIcon, direction]);
var mergedColumns = React__namespace.useMemo(function() {
var finalColumns = withExpandColumns;
if (transformColumns) {
finalColumns = transformColumns(finalColumns);
}
if (!finalColumns.length) {
finalColumns = [{
render: function render2() {
return null;
}
}];
}
return finalColumns;
}, [transformColumns, withExpandColumns, direction]);
var flattenColumns = React__namespace.useMemo(function() {
if (direction === "rtl") {
return revertForRtl(flatColumns(mergedColumns));
}
return flatColumns(mergedColumns);
}, [mergedColumns, direction]);
return [mergedColumns, flattenColumns];
}
function useLayoutState(defaultState) {
var stateRef = React$a.useRef(defaultState);
var _useState = React$a.useState({}), _useState2 = _slicedToArray$e(_useState, 2), forceUpdate = _useState2[1];
var lastPromiseRef = React$a.useRef(null);
var updateBatchRef = React$a.useRef([]);
function setFrameState(updater) {
updateBatchRef.current.push(updater);
var promise = Promise.resolve();
lastPromiseRef.current = promise;
promise.then(function() {
if (lastPromiseRef.current === promise) {
var prevBatch = updateBatchRef.current;
var prevState = stateRef.current;
updateBatchRef.current = [];
prevBatch.forEach(function(batchUpdater) {
stateRef.current = batchUpdater(stateRef.current);
});
lastPromiseRef.current = null;
if (prevState !== stateRef.current) {
forceUpdate({});
}
}
});
}
React$a.useEffect(function() {
return function() {
lastPromiseRef.current = null;
};
}, []);
return [stateRef.current, setFrameState];
}
function useTimeoutLock(defaultState) {
var frameRef = React$a.useRef(defaultState || null);
var timeoutRef = React$a.useRef();
function cleanUp() {
window.clearTimeout(timeoutRef.current);
}
function setState(newState) {
frameRef.current = newState;
cleanUp();
timeoutRef.current = window.setTimeout(function() {
frameRef.current = null;
timeoutRef.current = void 0;
}, 100);
}
function getState() {
return frameRef.current;
}
React$a.useEffect(function() {
return cleanUp;
}, []);
return [setState, getState];
}
function useStickyOffsets(colWidths, columnCount, direction) {
var stickyOffsets = React$a.useMemo(function() {
var leftOffsets = [];
var rightOffsets = [];
var left = 0;
var right = 0;
for (var start = 0; start < columnCount; start += 1) {
if (direction === "rtl") {
rightOffsets[start] = right;
right += colWidths[start] || 0;
var end = columnCount - start - 1;
leftOffsets[end] = left;
left += colWidths[end] || 0;
} else {
leftOffsets[start] = left;
left += colWidths[start] || 0;
var _end = columnCount - start - 1;
rightOffsets[_end] = right;
right += colWidths[_end] || 0;
}
}
return {
left: leftOffsets,
right: rightOffsets
};
}, [colWidths, columnCount, direction]);
return stickyOffsets;
}
var _excluded$9 = ["columnType"];
function ColGroup(_ref) {
var colWidths = _ref.colWidths, columns = _ref.columns, columCount = _ref.columCount;
var cols = [];
var len = columCount || columns.length;
var mustInsert = false;
for (var i2 = len - 1; i2 >= 0; i2 -= 1) {
var width = colWidths[i2];
var column = columns && columns[i2];
var additionalProps = column && column[INTERNAL_COL_DEFINE];
if (width || additionalProps || mustInsert) {
var _ref2 = additionalProps || {};
_ref2.columnType;
var restAdditionalProps = _objectWithoutProperties$1(_ref2, _excluded$9);
cols.unshift(
/* @__PURE__ */ jsx("col", {
style: {
width
},
...restAdditionalProps
}, i2)
);
mustInsert = true;
}
}
return /* @__PURE__ */ jsx("colgroup", {
children: cols
});
}
function Panel$2(_ref) {
var className = _ref.className, children = _ref.children;
return /* @__PURE__ */ jsx("div", {
className,
children
});
}
var SummaryContext = /* @__PURE__ */ React__namespace.createContext({});
function SummaryCell(_ref) {
var className = _ref.className, index2 = _ref.index, children = _ref.children, _ref$colSpan = _ref.colSpan, colSpan = _ref$colSpan === void 0 ? 1 : _ref$colSpan, rowSpan = _ref.rowSpan, align = _ref.align;
var _React$useContext = React__namespace.useContext(TableContext), prefixCls = _React$useContext.prefixCls, direction = _React$useContext.direction;
var _React$useContext2 = React__namespace.useContext(SummaryContext), scrollColumnIndex = _React$useContext2.scrollColumnIndex, stickyOffsets = _React$useContext2.stickyOffsets, flattenColumns = _React$useContext2.flattenColumns;
var lastIndex = index2 + colSpan - 1;
var mergedColSpan = lastIndex + 1 === scrollColumnIndex ? colSpan + 1 : colSpan;
var fixedInfo = getCellFixedInfo(index2, index2 + mergedColSpan - 1, flattenColumns, stickyOffsets, direction);
return /* @__PURE__ */ jsx(WrappedCell, {
className,
index: index2,
component: "td",
prefixCls,
record: null,
dataIndex: null,
align,
colSpan: mergedColSpan,
rowSpan,
render: function render2() {
return children;
},
...fixedInfo
});
}
var _excluded$8 = ["children"];
function FooterRow(_ref) {
var children = _ref.children, props = _objectWithoutProperties$1(_ref, _excluded$8);
return /* @__PURE__ */ jsx("tr", {
...props,
children
});
}
function Summary(_ref) {
var children = _ref.children;
return children;
}
Summary.Row = FooterRow;
Summary.Cell = SummaryCell;
function Footer(_ref) {
var children = _ref.children, stickyOffsets = _ref.stickyOffsets, flattenColumns = _ref.flattenColumns;
var tableContext = React__namespace.useContext(TableContext);
var prefixCls = tableContext.prefixCls;
var lastColumnIndex = flattenColumns.length - 1;
var scrollColumn = flattenColumns[lastColumnIndex];
var summaryContext = React__namespace.useMemo(function() {
return {
stickyOffsets,
flattenColumns,
scrollColumnIndex: (scrollColumn === null || scrollColumn === void 0 ? void 0 : scrollColumn.scrollbar) ? lastColumnIndex : null
};
}, [scrollColumn, flattenColumns, lastColumnIndex, stickyOffsets]);
return /* @__PURE__ */ jsx(SummaryContext.Provider, {
value: summaryContext,
children: /* @__PURE__ */ jsx("tfoot", {
className: "".concat(prefixCls, "-summary"),
children
})
});
}
var FooterComponents = Summary;
function renderExpandIcon$1(_ref) {
var _classNames;
var prefixCls = _ref.prefixCls, record = _ref.record, onExpand = _ref.onExpand, expanded = _ref.expanded, expandable = _ref.expandable;
var expandClassName = "".concat(prefixCls, "-row-expand-icon");
if (!expandable) {
return /* @__PURE__ */ jsx("span", {
className: classnames(expandClassName, "".concat(prefixCls, "-row-spaced"))
});
}
var onClick = function onClick2(event) {
onExpand(record, event);
event.stopPropagation();
};
return /* @__PURE__ */ jsx("span", {
className: classnames(expandClassName, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-row-expanded"), expanded), _defineProperty$b(_classNames, "".concat(prefixCls, "-row-collapsed"), !expanded), _classNames)),
onClick
});
}
function findAllChildrenKeys(data, getRowKey, childrenColumnName) {
var keys2 = [];
function dig(list) {
(list || []).forEach(function(item, index2) {
keys2.push(getRowKey(item, index2));
dig(item[childrenColumnName]);
});
}
dig(data);
return keys2;
}
var StickyScrollBar = function StickyScrollBar2(_ref, ref) {
var _scrollBodyRef$curren, _scrollBodyRef$curren2;
var scrollBodyRef = _ref.scrollBodyRef, onScroll = _ref.onScroll, offsetScroll = _ref.offsetScroll, container = _ref.container;
var _React$useContext = React__namespace.useContext(TableContext), prefixCls = _React$useContext.prefixCls;
var bodyScrollWidth = ((_scrollBodyRef$curren = scrollBodyRef.current) === null || _scrollBodyRef$curren === void 0 ? void 0 : _scrollBodyRef$curren.scrollWidth) || 0;
var bodyWidth = ((_scrollBodyRef$curren2 = scrollBodyRef.current) === null || _scrollBodyRef$curren2 === void 0 ? void 0 : _scrollBodyRef$curren2.clientWidth) || 0;
var scrollBarWidth = bodyScrollWidth && bodyWidth * (bodyWidth / bodyScrollWidth);
var scrollBarRef = React__namespace.useRef();
var _useLayoutState = useLayoutState({
scrollLeft: 0,
isHiddenScrollBar: false
}), _useLayoutState2 = _slicedToArray$e(_useLayoutState, 2), scrollState = _useLayoutState2[0], setScrollState = _useLayoutState2[1];
var refState = React__namespace.useRef({
delta: 0,
x: 0
});
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), isActive2 = _React$useState2[0], setActive = _React$useState2[1];
var onMouseUp = function onMouseUp2() {
setActive(false);
};
var onMouseDown = function onMouseDown2(event) {
event.persist();
refState.current.delta = event.pageX - scrollState.scrollLeft;
refState.current.x = 0;
setActive(true);
event.preventDefault();
};
var onMouseMove = function onMouseMove2(event) {
var _window;
var _ref2 = event || ((_window = window) === null || _window === void 0 ? void 0 : _window.event), buttons = _ref2.buttons;
if (!isActive2 || buttons === 0) {
if (isActive2) {
setActive(false);
}
return;
}
var left = refState.current.x + event.pageX - refState.current.x - refState.current.delta;
if (left <= 0) {
left = 0;
}
if (left + scrollBarWidth >= bodyWidth) {
left = bodyWidth - scrollBarWidth;
}
onScroll({
scrollLeft: left / bodyWidth * (bodyScrollWidth + 2)
});
refState.current.x = event.pageX;
};
var onContainerScroll = function onContainerScroll2() {
if (!scrollBodyRef.current) {
return;
}
var tableOffsetTop = getOffset$1(scrollBodyRef.current).top;
var tableBottomOffset = tableOffsetTop + scrollBodyRef.current.offsetHeight;
var currentClientOffset = container === window ? document.documentElement.scrollTop + window.innerHeight : getOffset$1(container).top + container.clientHeight;
if (tableBottomOffset - getScrollBarSize() <= currentClientOffset || tableOffsetTop >= currentClientOffset - offsetScroll) {
setScrollState(function(state) {
return _objectSpread2$a(_objectSpread2$a({}, state), {}, {
isHiddenScrollBar: true
});
});
} else {
setScrollState(function(state) {
return _objectSpread2$a(_objectSpread2$a({}, state), {}, {
isHiddenScrollBar: false
});
});
}
};
var setScrollLeft = function setScrollLeft2(left) {
setScrollState(function(state) {
return _objectSpread2$a(_objectSpread2$a({}, state), {}, {
scrollLeft: left / bodyScrollWidth * bodyWidth || 0
});
});
};
React__namespace.useImperativeHandle(ref, function() {
return {
setScrollLeft
};
});
React__namespace.useEffect(function() {
var onMouseUpListener = addEventListenerWrap$2(document.body, "mouseup", onMouseUp, false);
var onMouseMoveListener = addEventListenerWrap$2(document.body, "mousemove", onMouseMove, false);
onContainerScroll();
return function() {
onMouseUpListener.remove();
onMouseMoveListener.remove();
};
}, [scrollBarWidth, isActive2]);
React__namespace.useEffect(function() {
var onScrollListener = addEventListenerWrap$2(container, "scroll", onContainerScroll, false);
var onResizeListener = addEventListenerWrap$2(window, "resize", onContainerScroll, false);
return function() {
onScrollListener.remove();
onResizeListener.remove();
};
}, [container]);
React__namespace.useEffect(function() {
if (!scrollState.isHiddenScrollBar) {
setScrollState(function(state) {
var bodyNode = scrollBodyRef.current;
if (!bodyNode) {
return state;
}
return _objectSpread2$a(_objectSpread2$a({}, state), {}, {
scrollLeft: bodyNode.scrollLeft / bodyNode.scrollWidth * bodyNode.clientWidth
});
});
}
}, [scrollState.isHiddenScrollBar]);
if (bodyScrollWidth <= bodyWidth || !scrollBarWidth || scrollState.isHiddenScrollBar) {
return null;
}
return /* @__PURE__ */ jsx("div", {
style: {
height: getScrollBarSize(),
width: bodyWidth,
bottom: offsetScroll
},
className: "".concat(prefixCls, "-sticky-scroll"),
children: /* @__PURE__ */ jsx("div", {
onMouseDown,
ref: scrollBarRef,
className: classnames("".concat(prefixCls, "-sticky-scroll-bar"), _defineProperty$b({}, "".concat(prefixCls, "-sticky-scroll-bar-active"), isActive2)),
style: {
width: "".concat(scrollBarWidth, "px"),
transform: "translate3d(".concat(scrollState.scrollLeft, "px, 0, 0)")
}
})
});
};
const StickyScrollBar$1 = /* @__PURE__ */ React__namespace.forwardRef(StickyScrollBar);
var defaultContainer = canUseDom$1() ? window : null;
function useSticky(sticky, prefixCls) {
var _ref = _typeof$q(sticky) === "object" ? sticky : {}, _ref$offsetHeader = _ref.offsetHeader, offsetHeader = _ref$offsetHeader === void 0 ? 0 : _ref$offsetHeader, _ref$offsetSummary = _ref.offsetSummary, offsetSummary = _ref$offsetSummary === void 0 ? 0 : _ref$offsetSummary, _ref$offsetScroll = _ref.offsetScroll, offsetScroll = _ref$offsetScroll === void 0 ? 0 : _ref$offsetScroll, _ref$getContainer = _ref.getContainer, getContainer2 = _ref$getContainer === void 0 ? function() {
return defaultContainer;
} : _ref$getContainer;
var container = getContainer2() || defaultContainer;
return React__namespace.useMemo(function() {
var isSticky = !!sticky;
return {
isSticky,
stickyClassName: isSticky ? "".concat(prefixCls, "-sticky-holder") : "",
offsetHeader,
offsetSummary,
offsetScroll,
container
};
}, [offsetScroll, offsetHeader, offsetSummary, prefixCls, container]);
}
var _excluded$7 = ["className", "noData", "columns", "flattenColumns", "colWidths", "columCount", "stickyOffsets", "direction", "fixHeader", "stickyTopOffset", "stickyBottomOffset", "stickyClassName", "onScroll", "maxContentScroll", "children"];
function useColumnWidth(colWidths, columCount) {
return React$a.useMemo(function() {
var cloneColumns = [];
for (var i2 = 0; i2 < columCount; i2 += 1) {
var val = colWidths[i2];
if (val !== void 0) {
cloneColumns[i2] = val;
} else {
return null;
}
}
return cloneColumns;
}, [colWidths.join("_"), columCount]);
}
var FixedHolder = /* @__PURE__ */ React__namespace.forwardRef(function(_ref, ref) {
var className = _ref.className, noData = _ref.noData, columns = _ref.columns, flattenColumns = _ref.flattenColumns, colWidths = _ref.colWidths, columCount = _ref.columCount, stickyOffsets = _ref.stickyOffsets, direction = _ref.direction, fixHeader = _ref.fixHeader, stickyTopOffset = _ref.stickyTopOffset, stickyBottomOffset = _ref.stickyBottomOffset, stickyClassName = _ref.stickyClassName, onScroll = _ref.onScroll, maxContentScroll = _ref.maxContentScroll, children = _ref.children, props = _objectWithoutProperties$1(_ref, _excluded$7);
var _React$useContext = React__namespace.useContext(TableContext), prefixCls = _React$useContext.prefixCls, scrollbarSize = _React$useContext.scrollbarSize, isSticky = _React$useContext.isSticky;
var combinationScrollBarSize = isSticky && !fixHeader ? 0 : scrollbarSize;
var scrollRef = React__namespace.useRef(null);
var setScrollRef = React__namespace.useCallback(function(element) {
fillRef(ref, element);
fillRef(scrollRef, element);
}, []);
React__namespace.useEffect(function() {
var _scrollRef$current;
function onWheel(e2) {
var currentTarget = e2.currentTarget, deltaX = e2.deltaX;
if (deltaX) {
onScroll({
currentTarget,
scrollLeft: currentTarget.scrollLeft + deltaX
});
e2.preventDefault();
}
}
(_scrollRef$current = scrollRef.current) === null || _scrollRef$current === void 0 ? void 0 : _scrollRef$current.addEventListener("wheel", onWheel);
return function() {
var _scrollRef$current2;
(_scrollRef$current2 = scrollRef.current) === null || _scrollRef$current2 === void 0 ? void 0 : _scrollRef$current2.removeEventListener("wheel", onWheel);
};
}, []);
var allFlattenColumnsWithWidth = React__namespace.useMemo(function() {
return flattenColumns.every(function(column) {
return column.width >= 0;
});
}, [flattenColumns]);
var lastColumn = flattenColumns[flattenColumns.length - 1];
var ScrollBarColumn = {
fixed: lastColumn ? lastColumn.fixed : null,
scrollbar: true,
onHeaderCell: function onHeaderCell() {
return {
className: "".concat(prefixCls, "-cell-scrollbar")
};
}
};
var columnsWithScrollbar = React$a.useMemo(function() {
return combinationScrollBarSize ? [].concat(_toConsumableArray$c(columns), [ScrollBarColumn]) : columns;
}, [combinationScrollBarSize, columns]);
var flattenColumnsWithScrollbar = React$a.useMemo(function() {
return combinationScrollBarSize ? [].concat(_toConsumableArray$c(flattenColumns), [ScrollBarColumn]) : flattenColumns;
}, [combinationScrollBarSize, flattenColumns]);
var headerStickyOffsets = React$a.useMemo(function() {
var right = stickyOffsets.right, left = stickyOffsets.left;
return _objectSpread2$a(_objectSpread2$a({}, stickyOffsets), {}, {
left: direction === "rtl" ? [].concat(_toConsumableArray$c(left.map(function(width) {
return width + combinationScrollBarSize;
})), [0]) : left,
right: direction === "rtl" ? right : [].concat(_toConsumableArray$c(right.map(function(width) {
return width + combinationScrollBarSize;
})), [0]),
isSticky
});
}, [combinationScrollBarSize, stickyOffsets, isSticky]);
var mergedColumnWidth = useColumnWidth(colWidths, columCount);
return /* @__PURE__ */ jsx("div", {
style: _objectSpread2$a({
overflow: "hidden"
}, isSticky ? {
top: stickyTopOffset,
bottom: stickyBottomOffset
} : {}),
ref: setScrollRef,
className: classnames(className, _defineProperty$b({}, stickyClassName, !!stickyClassName)),
children: /* @__PURE__ */ jsxs("table", {
style: {
tableLayout: "fixed",
visibility: noData || mergedColumnWidth ? null : "hidden"
},
children: [(!noData || !maxContentScroll || allFlattenColumnsWithWidth) && /* @__PURE__ */ jsx(ColGroup, {
colWidths: mergedColumnWidth ? [].concat(_toConsumableArray$c(mergedColumnWidth), [combinationScrollBarSize]) : [],
columCount: columCount + 1,
columns: flattenColumnsWithScrollbar
}), children(_objectSpread2$a(_objectSpread2$a({}, props), {}, {
stickyOffsets: headerStickyOffsets,
columns: columnsWithScrollbar,
flattenColumns: flattenColumnsWithScrollbar
}))]
})
});
});
FixedHolder.displayName = "FixedHolder";
var EMPTY_DATA = [];
var EMPTY_SCROLL_TARGET = {};
var INTERNAL_HOOKS = "rc-table-internal-hook";
var MemoTableContent = /* @__PURE__ */ React__namespace.memo(function(_ref) {
var children = _ref.children;
return children;
}, function(prev, next) {
if (!shallowequal(prev.props, next.props)) {
return false;
}
return prev.pingLeft !== next.pingLeft || prev.pingRight !== next.pingRight;
});
function Table$2(props) {
var _classNames;
var prefixCls = props.prefixCls, className = props.className, rowClassName = props.rowClassName, style2 = props.style, data = props.data, rowKey = props.rowKey, scroll = props.scroll, tableLayout = props.tableLayout, direction = props.direction, title = props.title, footer = props.footer, summary = props.summary, id2 = props.id, showHeader = props.showHeader, components = props.components, emptyText = props.emptyText, onRow = props.onRow, onHeaderRow = props.onHeaderRow, internalHooks = props.internalHooks, transformColumns = props.transformColumns, internalRefs = props.internalRefs, sticky = props.sticky;
var mergedData = data || EMPTY_DATA;
var hasData = !!mergedData.length;
var getComponent = React__namespace.useCallback(function(path2, defaultComponent) {
return getPathValue(components || {}, path2) || defaultComponent;
}, [components]);
var getRowKey = React__namespace.useMemo(function() {
if (typeof rowKey === "function") {
return rowKey;
}
return function(record) {
var key2 = record && record[rowKey];
return key2;
};
}, [rowKey]);
var expandableConfig = getExpandableProps(props);
var expandIcon = expandableConfig.expandIcon, expandedRowKeys = expandableConfig.expandedRowKeys, defaultExpandedRowKeys = expandableConfig.defaultExpandedRowKeys, defaultExpandAllRows = expandableConfig.defaultExpandAllRows, expandedRowRender = expandableConfig.expandedRowRender, columnTitle = expandableConfig.columnTitle, onExpand = expandableConfig.onExpand, onExpandedRowsChange = expandableConfig.onExpandedRowsChange, expandRowByClick = expandableConfig.expandRowByClick, rowExpandable = expandableConfig.rowExpandable, expandIconColumnIndex = expandableConfig.expandIconColumnIndex, expandedRowClassName = expandableConfig.expandedRowClassName, childrenColumnName = expandableConfig.childrenColumnName, indentSize = expandableConfig.indentSize;
var mergedExpandIcon = expandIcon || renderExpandIcon$1;
var mergedChildrenColumnName = childrenColumnName || "children";
var expandableType = React__namespace.useMemo(function() {
if (expandedRowRender) {
return "row";
}
if (props.expandable && internalHooks === INTERNAL_HOOKS && props.expandable.__PARENT_RENDER_ICON__ || mergedData.some(function(record) {
return record && _typeof$q(record) === "object" && record[mergedChildrenColumnName];
})) {
return "nest";
}
return false;
}, [!!expandedRowRender, mergedData]);
var _React$useState = React__namespace.useState(function() {
if (defaultExpandedRowKeys) {
return defaultExpandedRowKeys;
}
if (defaultExpandAllRows) {
return findAllChildrenKeys(mergedData, getRowKey, mergedChildrenColumnName);
}
return [];
}), _React$useState2 = _slicedToArray$e(_React$useState, 2), innerExpandedKeys = _React$useState2[0], setInnerExpandedKeys = _React$useState2[1];
var mergedExpandedKeys = React__namespace.useMemo(function() {
return new Set(expandedRowKeys || innerExpandedKeys || []);
}, [expandedRowKeys, innerExpandedKeys]);
var onTriggerExpand = React__namespace.useCallback(function(record) {
var key2 = getRowKey(record, mergedData.indexOf(record));
var newExpandedKeys;
var hasKey = mergedExpandedKeys.has(key2);
if (hasKey) {
mergedExpandedKeys.delete(key2);
newExpandedKeys = _toConsumableArray$c(mergedExpandedKeys);
} else {
newExpandedKeys = [].concat(_toConsumableArray$c(mergedExpandedKeys), [key2]);
}
setInnerExpandedKeys(newExpandedKeys);
if (onExpand) {
onExpand(!hasKey, record);
}
if (onExpandedRowsChange) {
onExpandedRowsChange(newExpandedKeys);
}
}, [getRowKey, mergedExpandedKeys, mergedData, onExpand, onExpandedRowsChange]);
var _React$useState3 = React__namespace.useState(0), _React$useState4 = _slicedToArray$e(_React$useState3, 2), componentWidth = _React$useState4[0], setComponentWidth = _React$useState4[1];
var _useColumns = useColumns(_objectSpread2$a(_objectSpread2$a(_objectSpread2$a({}, props), expandableConfig), {}, {
expandable: !!expandedRowRender,
columnTitle,
expandedKeys: mergedExpandedKeys,
getRowKey,
onTriggerExpand,
expandIcon: mergedExpandIcon,
expandIconColumnIndex,
direction
}), internalHooks === INTERNAL_HOOKS ? transformColumns : null), _useColumns2 = _slicedToArray$e(_useColumns, 2), columns = _useColumns2[0], flattenColumns = _useColumns2[1];
var columnContext = React__namespace.useMemo(function() {
return {
columns,
flattenColumns
};
}, [columns, flattenColumns]);
var fullTableRef = React__namespace.useRef();
var scrollHeaderRef = React__namespace.useRef();
var scrollBodyRef = React__namespace.useRef();
var scrollBodyContainerRef = React__namespace.useRef();
var scrollSummaryRef = React__namespace.useRef();
var _React$useState5 = React__namespace.useState(false), _React$useState6 = _slicedToArray$e(_React$useState5, 2), pingedLeft = _React$useState6[0], setPingedLeft = _React$useState6[1];
var _React$useState7 = React__namespace.useState(false), _React$useState8 = _slicedToArray$e(_React$useState7, 2), pingedRight = _React$useState8[0], setPingedRight = _React$useState8[1];
var _useLayoutState = useLayoutState(/* @__PURE__ */ new Map()), _useLayoutState2 = _slicedToArray$e(_useLayoutState, 2), colsWidths = _useLayoutState2[0], updateColsWidths = _useLayoutState2[1];
var colsKeys = getColumnsKey(flattenColumns);
var pureColWidths = colsKeys.map(function(columnKey) {
return colsWidths.get(columnKey);
});
var colWidths = React__namespace.useMemo(function() {
return pureColWidths;
}, [pureColWidths.join("_")]);
var stickyOffsets = useStickyOffsets(colWidths, flattenColumns.length, direction);
var fixHeader = scroll && validateValue(scroll.y);
var horizonScroll = scroll && validateValue(scroll.x) || Boolean(expandableConfig.fixed);
var fixColumn = horizonScroll && flattenColumns.some(function(_ref2) {
var fixed = _ref2.fixed;
return fixed;
});
var stickyRef = React__namespace.useRef();
var _useSticky = useSticky(sticky, prefixCls), isSticky = _useSticky.isSticky, offsetHeader = _useSticky.offsetHeader, offsetSummary = _useSticky.offsetSummary, offsetScroll = _useSticky.offsetScroll, stickyClassName = _useSticky.stickyClassName, container = _useSticky.container;
var summaryNode = summary === null || summary === void 0 ? void 0 : summary(mergedData);
var fixFooter = (fixHeader || isSticky) && /* @__PURE__ */ React__namespace.isValidElement(summaryNode) && summaryNode.type === Summary && summaryNode.props.fixed;
var scrollXStyle;
var scrollYStyle;
var scrollTableStyle;
if (fixHeader) {
scrollYStyle = {
overflowY: "scroll",
maxHeight: scroll.y
};
}
if (horizonScroll) {
scrollXStyle = {
overflowX: "auto"
};
if (!fixHeader) {
scrollYStyle = {
overflowY: "hidden"
};
}
scrollTableStyle = {
width: (scroll === null || scroll === void 0 ? void 0 : scroll.x) === true ? "auto" : scroll === null || scroll === void 0 ? void 0 : scroll.x,
minWidth: "100%"
};
}
var onColumnResize = React__namespace.useCallback(function(columnKey, width) {
if (isVisible(fullTableRef.current)) {
updateColsWidths(function(widths) {
if (widths.get(columnKey) !== width) {
var newWidths = new Map(widths);
newWidths.set(columnKey, width);
return newWidths;
}
return widths;
});
}
}, []);
var _useTimeoutLock = useTimeoutLock(null), _useTimeoutLock2 = _slicedToArray$e(_useTimeoutLock, 2), setScrollTarget = _useTimeoutLock2[0], getScrollTarget = _useTimeoutLock2[1];
function forceScroll(scrollLeft, target) {
if (!target) {
return;
}
if (typeof target === "function") {
target(scrollLeft);
} else if (target.scrollLeft !== scrollLeft) {
target.scrollLeft = scrollLeft;
}
}
var onScroll = function onScroll2(_ref3) {
var currentTarget = _ref3.currentTarget, scrollLeft = _ref3.scrollLeft;
var isRTL = direction === "rtl";
var mergedScrollLeft = typeof scrollLeft === "number" ? scrollLeft : currentTarget.scrollLeft;
var compareTarget = currentTarget || EMPTY_SCROLL_TARGET;
if (!getScrollTarget() || getScrollTarget() === compareTarget) {
var _stickyRef$current;
setScrollTarget(compareTarget);
forceScroll(mergedScrollLeft, scrollHeaderRef.current);
forceScroll(mergedScrollLeft, scrollBodyRef.current);
forceScroll(mergedScrollLeft, scrollSummaryRef.current);
forceScroll(mergedScrollLeft, (_stickyRef$current = stickyRef.current) === null || _stickyRef$current === void 0 ? void 0 : _stickyRef$current.setScrollLeft);
}
if (currentTarget) {
var scrollWidth = currentTarget.scrollWidth, clientWidth = currentTarget.clientWidth;
if (scrollWidth === clientWidth) {
setPingedLeft(false);
setPingedRight(false);
return;
}
if (isRTL) {
setPingedLeft(-mergedScrollLeft < scrollWidth - clientWidth);
setPingedRight(-mergedScrollLeft > 0);
} else {
setPingedLeft(mergedScrollLeft > 0);
setPingedRight(mergedScrollLeft < scrollWidth - clientWidth);
}
}
};
var triggerOnScroll = function triggerOnScroll2() {
if (horizonScroll && scrollBodyRef.current) {
onScroll({
currentTarget: scrollBodyRef.current
});
} else {
setPingedLeft(false);
setPingedRight(false);
}
};
var onFullTableResize = function onFullTableResize2(_ref4) {
var width = _ref4.width;
if (width !== componentWidth) {
triggerOnScroll();
setComponentWidth(fullTableRef.current ? fullTableRef.current.offsetWidth : width);
}
};
var mounted = React__namespace.useRef(false);
React__namespace.useEffect(function() {
if (mounted.current) {
triggerOnScroll();
}
}, [horizonScroll, data, columns.length]);
React__namespace.useEffect(function() {
mounted.current = true;
}, []);
var _React$useState9 = React__namespace.useState(0), _React$useState10 = _slicedToArray$e(_React$useState9, 2), scrollbarSize = _React$useState10[0], setScrollbarSize = _React$useState10[1];
var _React$useState11 = React__namespace.useState(true), _React$useState12 = _slicedToArray$e(_React$useState11, 2), supportSticky = _React$useState12[0], setSupportSticky = _React$useState12[1];
React__namespace.useEffect(function() {
if (scrollBodyRef.current instanceof Element) {
setScrollbarSize(getTargetScrollBarSize(scrollBodyRef.current).width);
} else {
setScrollbarSize(getTargetScrollBarSize(scrollBodyContainerRef.current).width);
}
setSupportSticky(isStyleSupport("position", "sticky"));
}, []);
React__namespace.useEffect(function() {
if (internalHooks === INTERNAL_HOOKS && internalRefs) {
internalRefs.body.current = scrollBodyRef.current;
}
});
var TableComponent = getComponent(["table"], "table");
var mergedTableLayout = React__namespace.useMemo(function() {
if (tableLayout) {
return tableLayout;
}
if (fixColumn) {
return (scroll === null || scroll === void 0 ? void 0 : scroll.x) === "max-content" ? "auto" : "fixed";
}
if (fixHeader || isSticky || flattenColumns.some(function(_ref5) {
var ellipsis = _ref5.ellipsis;
return ellipsis;
})) {
return "fixed";
}
return "auto";
}, [fixHeader, fixColumn, flattenColumns, tableLayout, isSticky]);
var groupTableNode;
var headerProps = {
colWidths,
columCount: flattenColumns.length,
stickyOffsets,
onHeaderRow,
fixHeader,
scroll
};
var emptyNode = React__namespace.useMemo(function() {
if (hasData) {
return null;
}
if (typeof emptyText === "function") {
return emptyText();
}
return emptyText;
}, [hasData, emptyText]);
var bodyTable = /* @__PURE__ */ jsx(MemoBody, {
data: mergedData,
measureColumnWidth: fixHeader || horizonScroll || isSticky,
expandedKeys: mergedExpandedKeys,
rowExpandable,
getRowKey,
onRow,
emptyNode,
childrenColumnName: mergedChildrenColumnName
});
var bodyColGroup = /* @__PURE__ */ jsx(ColGroup, {
colWidths: flattenColumns.map(function(_ref6) {
var width = _ref6.width;
return width;
}),
columns: flattenColumns
});
var customizeScrollBody = getComponent(["body"]);
if (fixHeader || isSticky) {
var bodyContent;
if (typeof customizeScrollBody === "function") {
bodyContent = customizeScrollBody(mergedData, {
scrollbarSize,
ref: scrollBodyRef,
onScroll
});
headerProps.colWidths = flattenColumns.map(function(_ref7, index2) {
var width = _ref7.width;
var colWidth = index2 === columns.length - 1 ? width - scrollbarSize : width;
if (typeof colWidth === "number" && !Number.isNaN(colWidth)) {
return colWidth;
}
warningOnce(false, "When use `components.body` with render props. Each column should have a fixed `width` value.");
return 0;
});
} else {
bodyContent = /* @__PURE__ */ jsx("div", {
style: _objectSpread2$a(_objectSpread2$a({}, scrollXStyle), scrollYStyle),
onScroll,
ref: scrollBodyRef,
className: classnames("".concat(prefixCls, "-body")),
children: /* @__PURE__ */ jsxs(TableComponent, {
style: _objectSpread2$a(_objectSpread2$a({}, scrollTableStyle), {}, {
tableLayout: mergedTableLayout
}),
children: [bodyColGroup, bodyTable, !fixFooter && summaryNode && /* @__PURE__ */ jsx(Footer, {
stickyOffsets,
flattenColumns,
children: summaryNode
})]
})
});
}
var fixedHolderProps = _objectSpread2$a(_objectSpread2$a(_objectSpread2$a({
noData: !mergedData.length,
maxContentScroll: horizonScroll && scroll.x === "max-content"
}, headerProps), columnContext), {}, {
direction,
stickyClassName,
onScroll
});
groupTableNode = /* @__PURE__ */ jsxs(Fragment, {
children: [showHeader !== false && /* @__PURE__ */ jsx(FixedHolder, {
...fixedHolderProps,
stickyTopOffset: offsetHeader,
className: "".concat(prefixCls, "-header"),
ref: scrollHeaderRef,
children: function(fixedHolderPassProps) {
return /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(Header, {
...fixedHolderPassProps
}), fixFooter === "top" && /* @__PURE__ */ jsx(Footer, {
...fixedHolderPassProps,
children: summaryNode
})]
});
}
}), bodyContent, fixFooter && fixFooter !== "top" && /* @__PURE__ */ jsx(FixedHolder, {
...fixedHolderProps,
stickyBottomOffset: offsetSummary,
className: "".concat(prefixCls, "-summary"),
ref: scrollSummaryRef,
children: function(fixedHolderPassProps) {
return /* @__PURE__ */ jsx(Footer, {
...fixedHolderPassProps,
children: summaryNode
});
}
}), isSticky && /* @__PURE__ */ jsx(StickyScrollBar$1, {
ref: stickyRef,
offsetScroll,
scrollBodyRef,
onScroll,
container
})]
});
} else {
groupTableNode = /* @__PURE__ */ jsx("div", {
style: _objectSpread2$a(_objectSpread2$a({}, scrollXStyle), scrollYStyle),
className: classnames("".concat(prefixCls, "-content")),
onScroll,
ref: scrollBodyRef,
children: /* @__PURE__ */ jsxs(TableComponent, {
style: _objectSpread2$a(_objectSpread2$a({}, scrollTableStyle), {}, {
tableLayout: mergedTableLayout
}),
children: [bodyColGroup, showHeader !== false && /* @__PURE__ */ jsx(Header, {
...headerProps,
...columnContext
}), bodyTable, summaryNode && /* @__PURE__ */ jsx(Footer, {
stickyOffsets,
flattenColumns,
children: summaryNode
})]
})
});
}
var ariaProps = pickAttrs(props, {
aria: true,
data: true
});
var fullTable = /* @__PURE__ */ jsx("div", {
className: classnames(prefixCls, className, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-ping-left"), pingedLeft), _defineProperty$b(_classNames, "".concat(prefixCls, "-ping-right"), pingedRight), _defineProperty$b(_classNames, "".concat(prefixCls, "-layout-fixed"), tableLayout === "fixed"), _defineProperty$b(_classNames, "".concat(prefixCls, "-fixed-header"), fixHeader), _defineProperty$b(_classNames, "".concat(prefixCls, "-fixed-column"), fixColumn), _defineProperty$b(_classNames, "".concat(prefixCls, "-scroll-horizontal"), horizonScroll), _defineProperty$b(_classNames, "".concat(prefixCls, "-has-fix-left"), flattenColumns[0] && flattenColumns[0].fixed), _defineProperty$b(_classNames, "".concat(prefixCls, "-has-fix-right"), flattenColumns[flattenColumns.length - 1] && flattenColumns[flattenColumns.length - 1].fixed === "right"), _classNames)),
style: style2,
id: id2,
ref: fullTableRef,
...ariaProps,
children: /* @__PURE__ */ jsxs(MemoTableContent, {
pingLeft: pingedLeft,
pingRight: pingedRight,
props: _objectSpread2$a(_objectSpread2$a({}, props), {}, {
stickyOffsets,
mergedExpandedKeys
}),
children: [title && /* @__PURE__ */ jsx(Panel$2, {
className: "".concat(prefixCls, "-title"),
children: title(mergedData)
}), /* @__PURE__ */ jsx("div", {
ref: scrollBodyContainerRef,
className: "".concat(prefixCls, "-container"),
children: groupTableNode
}), footer && /* @__PURE__ */ jsx(Panel$2, {
className: "".concat(prefixCls, "-footer"),
children: footer(mergedData)
})]
})
});
if (horizonScroll) {
fullTable = /* @__PURE__ */ jsx(RefResizeObserver, {
onResize: onFullTableResize,
children: fullTable
});
}
var TableContextValue = React__namespace.useMemo(function() {
return {
prefixCls,
getComponent,
scrollbarSize,
direction,
fixedInfoList: flattenColumns.map(function(_, colIndex) {
return getCellFixedInfo(colIndex, colIndex, flattenColumns, stickyOffsets, direction);
}),
isSticky
};
}, [prefixCls, getComponent, scrollbarSize, direction, flattenColumns, stickyOffsets, isSticky]);
var BodyContextValue = React__namespace.useMemo(function() {
return _objectSpread2$a(_objectSpread2$a({}, columnContext), {}, {
tableLayout: mergedTableLayout,
rowClassName,
expandedRowClassName,
expandIcon: mergedExpandIcon,
expandableType,
expandRowByClick,
expandedRowRender,
onTriggerExpand,
expandIconColumnIndex,
indentSize,
allColumnsFixedLeft: columnContext.flattenColumns.every(function(col) {
return col.fixed === "left";
})
});
}, [columnContext, mergedTableLayout, rowClassName, expandedRowClassName, mergedExpandIcon, expandableType, expandRowByClick, expandedRowRender, onTriggerExpand, expandIconColumnIndex, indentSize]);
var ExpandedRowContextValue = React__namespace.useMemo(function() {
return {
componentWidth,
fixHeader,
fixColumn,
horizonScroll
};
}, [componentWidth, fixHeader, fixColumn, horizonScroll]);
var ResizeContextValue = React__namespace.useMemo(function() {
return {
onColumnResize
};
}, [onColumnResize]);
return /* @__PURE__ */ jsx(StickyContext.Provider, {
value: supportSticky,
children: /* @__PURE__ */ jsx(TableContext.Provider, {
value: TableContextValue,
children: /* @__PURE__ */ jsx(BodyContext.Provider, {
value: BodyContextValue,
children: /* @__PURE__ */ jsx(ExpandedRowContext.Provider, {
value: ExpandedRowContextValue,
children: /* @__PURE__ */ jsx(ResizeContext.Provider, {
value: ResizeContextValue,
children: fullTable
})
})
})
})
});
}
Table$2.EXPAND_COLUMN = EXPAND_COLUMN;
Table$2.Column = Column$1;
Table$2.ColumnGroup = ColumnGroup$1;
Table$2.Summary = FooterComponents;
Table$2.defaultProps = {
rowKey: "key",
prefixCls: "rc-table",
emptyText: function emptyText() {
return "No Data";
}
};
function Column(_) {
return null;
}
function ColumnGroup(_) {
return null;
}
function renderExpandIcon(locale2) {
return function expandIcon(_ref) {
var _classNames;
var prefixCls = _ref.prefixCls, onExpand = _ref.onExpand, record = _ref.record, expanded = _ref.expanded, expandable = _ref.expandable;
var iconPrefix = "".concat(prefixCls, "-row-expand-icon");
return /* @__PURE__ */ jsx("button", {
type: "button",
onClick: function onClick(e2) {
onExpand(record, e2);
e2.stopPropagation();
},
className: classnames(iconPrefix, (_classNames = {}, _defineProperty$b(_classNames, "".concat(iconPrefix, "-spaced"), !expandable), _defineProperty$b(_classNames, "".concat(iconPrefix, "-expanded"), expandable && expanded), _defineProperty$b(_classNames, "".concat(iconPrefix, "-collapsed"), expandable && !expanded), _classNames)),
"aria-label": expanded ? locale2.collapse : locale2.expand,
"aria-expanded": expanded
});
};
}
function getColumnKey(column, defaultKey2) {
if ("key" in column && column.key !== void 0 && column.key !== null) {
return column.key;
}
if (column.dataIndex) {
return Array.isArray(column.dataIndex) ? column.dataIndex.join(".") : column.dataIndex;
}
return defaultKey2;
}
function getColumnPos(index2, pos) {
return pos ? "".concat(pos, "-").concat(index2) : "".concat(index2);
}
function renderColumnTitle(title, props) {
if (typeof title === "function") {
return title(props);
}
return title;
}
function safeColumnTitle(title, props) {
var res = renderColumnTitle(title, props);
if (Object.prototype.toString.call(res) === "[object Object]")
return "";
return res;
}
var FilterFilled$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M349 838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V642H349v196zm531.1-684H143.9c-24.5 0-39.8 26.7-27.5 48l221.3 376h348.8l221.3-376c12.1-21.3-3.2-48-27.7-48z" } }] }, "name": "filter", "theme": "filled" };
const FilterFilledSvg = FilterFilled$2;
var FilterFilled = function FilterFilled2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: FilterFilledSvg
})
});
};
FilterFilled.displayName = "FilterFilled";
const FilterFilled$1 = /* @__PURE__ */ React__namespace.forwardRef(FilterFilled);
function listCacheClear$2() {
this.__data__ = [];
this.size = 0;
}
var _listCacheClear = listCacheClear$2;
function eq$3(value, other) {
return value === other || value !== value && other !== other;
}
var eq_1 = eq$3;
var eq$2 = eq_1;
function assocIndexOf$5(array2, key2) {
var length = array2.length;
while (length--) {
if (eq$2(array2[length][0], key2)) {
return length;
}
}
return -1;
}
var _assocIndexOf = assocIndexOf$5;
var assocIndexOf$4 = _assocIndexOf;
var arrayProto$1 = Array.prototype;
var splice$1 = arrayProto$1.splice;
function listCacheDelete$2(key2) {
var data = this.__data__, index2 = assocIndexOf$4(data, key2);
if (index2 < 0) {
return false;
}
var lastIndex = data.length - 1;
if (index2 == lastIndex) {
data.pop();
} else {
splice$1.call(data, index2, 1);
}
--this.size;
return true;
}
var _listCacheDelete = listCacheDelete$2;
var assocIndexOf$3 = _assocIndexOf;
function listCacheGet$2(key2) {
var data = this.__data__, index2 = assocIndexOf$3(data, key2);
return index2 < 0 ? void 0 : data[index2][1];
}
var _listCacheGet = listCacheGet$2;
var assocIndexOf$2 = _assocIndexOf;
function listCacheHas$2(key2) {
return assocIndexOf$2(this.__data__, key2) > -1;
}
var _listCacheHas = listCacheHas$2;
var assocIndexOf$1 = _assocIndexOf;
function listCacheSet$2(key2, value) {
var data = this.__data__, index2 = assocIndexOf$1(data, key2);
if (index2 < 0) {
++this.size;
data.push([key2, value]);
} else {
data[index2][1] = value;
}
return this;
}
var _listCacheSet = listCacheSet$2;
var listCacheClear$1 = _listCacheClear, listCacheDelete$1 = _listCacheDelete, listCacheGet$1 = _listCacheGet, listCacheHas$1 = _listCacheHas, listCacheSet$1 = _listCacheSet;
function ListCache$5(entries) {
var index2 = -1, length = entries == null ? 0 : entries.length;
this.clear();
while (++index2 < length) {
var entry = entries[index2];
this.set(entry[0], entry[1]);
}
}
ListCache$5.prototype.clear = listCacheClear$1;
ListCache$5.prototype["delete"] = listCacheDelete$1;
ListCache$5.prototype.get = listCacheGet$1;
ListCache$5.prototype.has = listCacheHas$1;
ListCache$5.prototype.set = listCacheSet$1;
var _ListCache = ListCache$5;
var ListCache$4 = _ListCache;
function stackClear$2() {
this.__data__ = new ListCache$4();
this.size = 0;
}
var _stackClear = stackClear$2;
function stackDelete$2(key2) {
var data = this.__data__, result = data["delete"](key2);
this.size = data.size;
return result;
}
var _stackDelete = stackDelete$2;
function stackGet$2(key2) {
return this.__data__.get(key2);
}
var _stackGet = stackGet$2;
function stackHas$2(key2) {
return this.__data__.has(key2);
}
var _stackHas = stackHas$2;
var baseGetTag$4 = _baseGetTag, isObject$8 = isObject_1;
var asyncTag$1 = "[object AsyncFunction]", funcTag$4 = "[object Function]", genTag$2 = "[object GeneratorFunction]", proxyTag$1 = "[object Proxy]";
function isFunction$6(value) {
if (!isObject$8(value)) {
return false;
}
var tag = baseGetTag$4(value);
return tag == funcTag$4 || tag == genTag$2 || tag == asyncTag$1 || tag == proxyTag$1;
}
var isFunction_1 = isFunction$6;
var root$8 = _root;
var coreJsData$3 = root$8["__core-js_shared__"];
var _coreJsData = coreJsData$3;
var coreJsData$2 = _coreJsData;
var maskSrcKey$1 = function() {
var uid2 = /[^.]+$/.exec(coreJsData$2 && coreJsData$2.keys && coreJsData$2.keys.IE_PROTO || "");
return uid2 ? "Symbol(src)_1." + uid2 : "";
}();
function isMasked$2(func) {
return !!maskSrcKey$1 && maskSrcKey$1 in func;
}
var _isMasked = isMasked$2;
var funcProto$3 = Function.prototype;
var funcToString$3 = funcProto$3.toString;
function toSource$3(func) {
if (func != null) {
try {
return funcToString$3.call(func);
} catch (e2) {
}
try {
return func + "";
} catch (e2) {
}
}
return "";
}
var _toSource = toSource$3;
var isFunction$5 = isFunction_1, isMasked$1 = _isMasked, isObject$7 = isObject_1, toSource$2 = _toSource;
var reRegExpChar$1 = /[\\^$.*+?()[\]{}|]/g;
var reIsHostCtor$1 = /^\[object .+?Constructor\]$/;
var funcProto$2 = Function.prototype, objectProto$p = Object.prototype;
var funcToString$2 = funcProto$2.toString;
var hasOwnProperty$o = objectProto$p.hasOwnProperty;
var reIsNative$1 = RegExp(
"^" + funcToString$2.call(hasOwnProperty$o).replace(reRegExpChar$1, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"
);
function baseIsNative$2(value) {
if (!isObject$7(value) || isMasked$1(value)) {
return false;
}
var pattern2 = isFunction$5(value) ? reIsNative$1 : reIsHostCtor$1;
return pattern2.test(toSource$2(value));
}
var _baseIsNative = baseIsNative$2;
function getValue$2(object2, key2) {
return object2 == null ? void 0 : object2[key2];
}
var _getValue = getValue$2;
var baseIsNative$1 = _baseIsNative, getValue$1 = _getValue;
function getNative$7(object2, key2) {
var value = getValue$1(object2, key2);
return baseIsNative$1(value) ? value : void 0;
}
var _getNative = getNative$7;
var getNative$6 = _getNative, root$7 = _root;
var Map$6 = getNative$6(root$7, "Map");
var _Map = Map$6;
var getNative$5 = _getNative;
var nativeCreate$6 = getNative$5(Object, "create");
var _nativeCreate = nativeCreate$6;
var nativeCreate$5 = _nativeCreate;
function hashClear$2() {
this.__data__ = nativeCreate$5 ? nativeCreate$5(null) : {};
this.size = 0;
}
var _hashClear = hashClear$2;
function hashDelete$2(key2) {
var result = this.has(key2) && delete this.__data__[key2];
this.size -= result ? 1 : 0;
return result;
}
var _hashDelete = hashDelete$2;
var nativeCreate$4 = _nativeCreate;
var HASH_UNDEFINED$5 = "__lodash_hash_undefined__";
var objectProto$o = Object.prototype;
var hasOwnProperty$n = objectProto$o.hasOwnProperty;
function hashGet$2(key2) {
var data = this.__data__;
if (nativeCreate$4) {
var result = data[key2];
return result === HASH_UNDEFINED$5 ? void 0 : result;
}
return hasOwnProperty$n.call(data, key2) ? data[key2] : void 0;
}
var _hashGet = hashGet$2;
var nativeCreate$3 = _nativeCreate;
var objectProto$n = Object.prototype;
var hasOwnProperty$m = objectProto$n.hasOwnProperty;
function hashHas$2(key2) {
var data = this.__data__;
return nativeCreate$3 ? data[key2] !== void 0 : hasOwnProperty$m.call(data, key2);
}
var _hashHas = hashHas$2;
var nativeCreate$2 = _nativeCreate;
var HASH_UNDEFINED$4 = "__lodash_hash_undefined__";
function hashSet$2(key2, value) {
var data = this.__data__;
this.size += this.has(key2) ? 0 : 1;
data[key2] = nativeCreate$2 && value === void 0 ? HASH_UNDEFINED$4 : value;
return this;
}
var _hashSet = hashSet$2;
var hashClear$1 = _hashClear, hashDelete$1 = _hashDelete, hashGet$1 = _hashGet, hashHas$1 = _hashHas, hashSet$1 = _hashSet;
function Hash$2(entries) {
var index2 = -1, length = entries == null ? 0 : entries.length;
this.clear();
while (++index2 < length) {
var entry = entries[index2];
this.set(entry[0], entry[1]);
}
}
Hash$2.prototype.clear = hashClear$1;
Hash$2.prototype["delete"] = hashDelete$1;
Hash$2.prototype.get = hashGet$1;
Hash$2.prototype.has = hashHas$1;
Hash$2.prototype.set = hashSet$1;
var _Hash = Hash$2;
var Hash$1 = _Hash, ListCache$3 = _ListCache, Map$5 = _Map;
function mapCacheClear$2() {
this.size = 0;
this.__data__ = {
"hash": new Hash$1(),
"map": new (Map$5 || ListCache$3)(),
"string": new Hash$1()
};
}
var _mapCacheClear = mapCacheClear$2;
function isKeyable$2(value) {
var type2 = typeof value;
return type2 == "string" || type2 == "number" || type2 == "symbol" || type2 == "boolean" ? value !== "__proto__" : value === null;
}
var _isKeyable = isKeyable$2;
var isKeyable$1 = _isKeyable;
function getMapData$5(map, key2) {
var data = map.__data__;
return isKeyable$1(key2) ? data[typeof key2 == "string" ? "string" : "hash"] : data.map;
}
var _getMapData = getMapData$5;
var getMapData$4 = _getMapData;
function mapCacheDelete$2(key2) {
var result = getMapData$4(this, key2)["delete"](key2);
this.size -= result ? 1 : 0;
return result;
}
var _mapCacheDelete = mapCacheDelete$2;
var getMapData$3 = _getMapData;
function mapCacheGet$2(key2) {
return getMapData$3(this, key2).get(key2);
}
var _mapCacheGet = mapCacheGet$2;
var getMapData$2 = _getMapData;
function mapCacheHas$2(key2) {
return getMapData$2(this, key2).has(key2);
}
var _mapCacheHas = mapCacheHas$2;
var getMapData$1 = _getMapData;
function mapCacheSet$2(key2, value) {
var data = getMapData$1(this, key2), size = data.size;
data.set(key2, value);
this.size += data.size == size ? 0 : 1;
return this;
}
var _mapCacheSet = mapCacheSet$2;
var mapCacheClear$1 = _mapCacheClear, mapCacheDelete$1 = _mapCacheDelete, mapCacheGet$1 = _mapCacheGet, mapCacheHas$1 = _mapCacheHas, mapCacheSet$1 = _mapCacheSet;
function MapCache$3(entries) {
var index2 = -1, length = entries == null ? 0 : entries.length;
this.clear();
while (++index2 < length) {
var entry = entries[index2];
this.set(entry[0], entry[1]);
}
}
MapCache$3.prototype.clear = mapCacheClear$1;
MapCache$3.prototype["delete"] = mapCacheDelete$1;
MapCache$3.prototype.get = mapCacheGet$1;
MapCache$3.prototype.has = mapCacheHas$1;
MapCache$3.prototype.set = mapCacheSet$1;
var _MapCache = MapCache$3;
var ListCache$2 = _ListCache, Map$4 = _Map, MapCache$2 = _MapCache;
var LARGE_ARRAY_SIZE$1 = 200;
function stackSet$2(key2, value) {
var data = this.__data__;
if (data instanceof ListCache$2) {
var pairs = data.__data__;
if (!Map$4 || pairs.length < LARGE_ARRAY_SIZE$1 - 1) {
pairs.push([key2, value]);
this.size = ++data.size;
return this;
}
data = this.__data__ = new MapCache$2(pairs);
}
data.set(key2, value);
this.size = data.size;
return this;
}
var _stackSet = stackSet$2;
var ListCache$1 = _ListCache, stackClear$1 = _stackClear, stackDelete$1 = _stackDelete, stackGet$1 = _stackGet, stackHas$1 = _stackHas, stackSet$1 = _stackSet;
function Stack$2(entries) {
var data = this.__data__ = new ListCache$1(entries);
this.size = data.size;
}
Stack$2.prototype.clear = stackClear$1;
Stack$2.prototype["delete"] = stackDelete$1;
Stack$2.prototype.get = stackGet$1;
Stack$2.prototype.has = stackHas$1;
Stack$2.prototype.set = stackSet$1;
var _Stack = Stack$2;
var HASH_UNDEFINED$3 = "__lodash_hash_undefined__";
function setCacheAdd$2(value) {
this.__data__.set(value, HASH_UNDEFINED$3);
return this;
}
var _setCacheAdd = setCacheAdd$2;
function setCacheHas$2(value) {
return this.__data__.has(value);
}
var _setCacheHas = setCacheHas$2;
var MapCache$1 = _MapCache, setCacheAdd$1 = _setCacheAdd, setCacheHas$1 = _setCacheHas;
function SetCache$2(values) {
var index2 = -1, length = values == null ? 0 : values.length;
this.__data__ = new MapCache$1();
while (++index2 < length) {
this.add(values[index2]);
}
}
SetCache$2.prototype.add = SetCache$2.prototype.push = setCacheAdd$1;
SetCache$2.prototype.has = setCacheHas$1;
var _SetCache = SetCache$2;
function arraySome$2(array2, predicate) {
var index2 = -1, length = array2 == null ? 0 : array2.length;
while (++index2 < length) {
if (predicate(array2[index2], index2, array2)) {
return true;
}
}
return false;
}
var _arraySome = arraySome$2;
function cacheHas$2(cache, key2) {
return cache.has(key2);
}
var _cacheHas = cacheHas$2;
var SetCache$1 = _SetCache, arraySome$1 = _arraySome, cacheHas$1 = _cacheHas;
var COMPARE_PARTIAL_FLAG$9 = 1, COMPARE_UNORDERED_FLAG$5 = 2;
function equalArrays$3(array2, other, bitmask, customizer, equalFunc, stack) {
var isPartial = bitmask & COMPARE_PARTIAL_FLAG$9, arrLength = array2.length, othLength = other.length;
if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
return false;
}
var arrStacked = stack.get(array2);
var othStacked = stack.get(other);
if (arrStacked && othStacked) {
return arrStacked == other && othStacked == array2;
}
var index2 = -1, result = true, seen = bitmask & COMPARE_UNORDERED_FLAG$5 ? new SetCache$1() : void 0;
stack.set(array2, other);
stack.set(other, array2);
while (++index2 < arrLength) {
var arrValue = array2[index2], othValue = other[index2];
if (customizer) {
var compared = isPartial ? customizer(othValue, arrValue, index2, other, array2, stack) : customizer(arrValue, othValue, index2, array2, other, stack);
}
if (compared !== void 0) {
if (compared) {
continue;
}
result = false;
break;
}
if (seen) {
if (!arraySome$1(other, function(othValue2, othIndex) {
if (!cacheHas$1(seen, othIndex) && (arrValue === othValue2 || equalFunc(arrValue, othValue2, bitmask, customizer, stack))) {
return seen.push(othIndex);
}
})) {
result = false;
break;
}
} else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
result = false;
break;
}
}
stack["delete"](array2);
stack["delete"](other);
return result;
}
var _equalArrays = equalArrays$3;
var root$6 = _root;
var Uint8Array$4 = root$6.Uint8Array;
var _Uint8Array = Uint8Array$4;
function mapToArray$2(map) {
var index2 = -1, result = Array(map.size);
map.forEach(function(value, key2) {
result[++index2] = [key2, value];
});
return result;
}
var _mapToArray = mapToArray$2;
function setToArray$2(set2) {
var index2 = -1, result = Array(set2.size);
set2.forEach(function(value) {
result[++index2] = value;
});
return result;
}
var _setToArray = setToArray$2;
var Symbol$4 = _Symbol, Uint8Array$3 = _Uint8Array, eq$1 = eq_1, equalArrays$2 = _equalArrays, mapToArray$1 = _mapToArray, setToArray$1 = _setToArray;
var COMPARE_PARTIAL_FLAG$8 = 1, COMPARE_UNORDERED_FLAG$4 = 2;
var boolTag$5 = "[object Boolean]", dateTag$5 = "[object Date]", errorTag$4 = "[object Error]", mapTag$8 = "[object Map]", numberTag$5 = "[object Number]", regexpTag$5 = "[object RegExp]", setTag$8 = "[object Set]", stringTag$5 = "[object String]", symbolTag$4 = "[object Symbol]";
var arrayBufferTag$5 = "[object ArrayBuffer]", dataViewTag$7 = "[object DataView]";
var symbolProto$3 = Symbol$4 ? Symbol$4.prototype : void 0, symbolValueOf$2 = symbolProto$3 ? symbolProto$3.valueOf : void 0;
function equalByTag$2(object2, other, tag, bitmask, customizer, equalFunc, stack) {
switch (tag) {
case dataViewTag$7:
if (object2.byteLength != other.byteLength || object2.byteOffset != other.byteOffset) {
return false;
}
object2 = object2.buffer;
other = other.buffer;
case arrayBufferTag$5:
if (object2.byteLength != other.byteLength || !equalFunc(new Uint8Array$3(object2), new Uint8Array$3(other))) {
return false;
}
return true;
case boolTag$5:
case dateTag$5:
case numberTag$5:
return eq$1(+object2, +other);
case errorTag$4:
return object2.name == other.name && object2.message == other.message;
case regexpTag$5:
case stringTag$5:
return object2 == other + "";
case mapTag$8:
var convert2 = mapToArray$1;
case setTag$8:
var isPartial = bitmask & COMPARE_PARTIAL_FLAG$8;
convert2 || (convert2 = setToArray$1);
if (object2.size != other.size && !isPartial) {
return false;
}
var stacked = stack.get(object2);
if (stacked) {
return stacked == other;
}
bitmask |= COMPARE_UNORDERED_FLAG$4;
stack.set(object2, other);
var result = equalArrays$2(convert2(object2), convert2(other), bitmask, customizer, equalFunc, stack);
stack["delete"](object2);
return result;
case symbolTag$4:
if (symbolValueOf$2) {
return symbolValueOf$2.call(object2) == symbolValueOf$2.call(other);
}
}
return false;
}
var _equalByTag = equalByTag$2;
function arrayPush$2(array2, values) {
var index2 = -1, length = values.length, offset2 = array2.length;
while (++index2 < length) {
array2[offset2 + index2] = values[index2];
}
return array2;
}
var _arrayPush = arrayPush$2;
var arrayPush$1 = _arrayPush, isArray$7 = isArray_1;
function baseGetAllKeys$2(object2, keysFunc, symbolsFunc) {
var result = keysFunc(object2);
return isArray$7(object2) ? result : arrayPush$1(result, symbolsFunc(object2));
}
var _baseGetAllKeys = baseGetAllKeys$2;
function arrayFilter$2(array2, predicate) {
var index2 = -1, length = array2 == null ? 0 : array2.length, resIndex = 0, result = [];
while (++index2 < length) {
var value = array2[index2];
if (predicate(value, index2, array2)) {
result[resIndex++] = value;
}
}
return result;
}
var _arrayFilter = arrayFilter$2;
function stubArray$2() {
return [];
}
var stubArray_1 = stubArray$2;
var arrayFilter$1 = _arrayFilter, stubArray$1 = stubArray_1;
var objectProto$m = Object.prototype;
var propertyIsEnumerable$3 = objectProto$m.propertyIsEnumerable;
var nativeGetSymbols$2 = Object.getOwnPropertySymbols;
var getSymbols$3 = !nativeGetSymbols$2 ? stubArray$1 : function(object2) {
if (object2 == null) {
return [];
}
object2 = Object(object2);
return arrayFilter$1(nativeGetSymbols$2(object2), function(symbol2) {
return propertyIsEnumerable$3.call(object2, symbol2);
});
};
var _getSymbols = getSymbols$3;
function baseTimes$2(n2, iteratee) {
var index2 = -1, result = Array(n2);
while (++index2 < n2) {
result[index2] = iteratee(index2);
}
return result;
}
var _baseTimes = baseTimes$2;
var baseGetTag$3 = _baseGetTag, isObjectLike$4 = isObjectLike_1;
var argsTag$6 = "[object Arguments]";
function baseIsArguments$2(value) {
return isObjectLike$4(value) && baseGetTag$3(value) == argsTag$6;
}
var _baseIsArguments = baseIsArguments$2;
var baseIsArguments$1 = _baseIsArguments, isObjectLike$3 = isObjectLike_1;
var objectProto$l = Object.prototype;
var hasOwnProperty$l = objectProto$l.hasOwnProperty;
var propertyIsEnumerable$2 = objectProto$l.propertyIsEnumerable;
var isArguments$3 = baseIsArguments$1(function() {
return arguments;
}()) ? baseIsArguments$1 : function(value) {
return isObjectLike$3(value) && hasOwnProperty$l.call(value, "callee") && !propertyIsEnumerable$2.call(value, "callee");
};
var isArguments_1 = isArguments$3;
var isBuffer$5 = { exports: {} };
function stubFalse$1() {
return false;
}
var stubFalse_1 = stubFalse$1;
(function(module2, exports2) {
var root2 = _root, stubFalse2 = stubFalse_1;
var freeExports2 = exports2 && !exports2.nodeType && exports2;
var freeModule2 = freeExports2 && true && module2 && !module2.nodeType && module2;
var moduleExports2 = freeModule2 && freeModule2.exports === freeExports2;
var Buffer2 = moduleExports2 ? root2.Buffer : void 0;
var nativeIsBuffer2 = Buffer2 ? Buffer2.isBuffer : void 0;
var isBuffer2 = nativeIsBuffer2 || stubFalse2;
module2.exports = isBuffer2;
})(isBuffer$5, isBuffer$5.exports);
var MAX_SAFE_INTEGER$3 = 9007199254740991;
var reIsUint$1 = /^(?:0|[1-9]\d*)$/;
function isIndex$2(value, length) {
var type2 = typeof value;
length = length == null ? MAX_SAFE_INTEGER$3 : length;
return !!length && (type2 == "number" || type2 != "symbol" && reIsUint$1.test(value)) && (value > -1 && value % 1 == 0 && value < length);
}
var _isIndex = isIndex$2;
var MAX_SAFE_INTEGER$2 = 9007199254740991;
function isLength$3(value) {
return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER$2;
}
var isLength_1 = isLength$3;
var baseGetTag$2 = _baseGetTag, isLength$2 = isLength_1, isObjectLike$2 = isObjectLike_1;
var argsTag$5 = "[object Arguments]", arrayTag$4 = "[object Array]", boolTag$4 = "[object Boolean]", dateTag$4 = "[object Date]", errorTag$3 = "[object Error]", funcTag$3 = "[object Function]", mapTag$7 = "[object Map]", numberTag$4 = "[object Number]", objectTag$6 = "[object Object]", regexpTag$4 = "[object RegExp]", setTag$7 = "[object Set]", stringTag$4 = "[object String]", weakMapTag$4 = "[object WeakMap]";
var arrayBufferTag$4 = "[object ArrayBuffer]", dataViewTag$6 = "[object DataView]", float32Tag$3 = "[object Float32Array]", float64Tag$3 = "[object Float64Array]", int8Tag$3 = "[object Int8Array]", int16Tag$3 = "[object Int16Array]", int32Tag$3 = "[object Int32Array]", uint8Tag$3 = "[object Uint8Array]", uint8ClampedTag$3 = "[object Uint8ClampedArray]", uint16Tag$3 = "[object Uint16Array]", uint32Tag$3 = "[object Uint32Array]";
var typedArrayTags$1 = {};
typedArrayTags$1[float32Tag$3] = typedArrayTags$1[float64Tag$3] = typedArrayTags$1[int8Tag$3] = typedArrayTags$1[int16Tag$3] = typedArrayTags$1[int32Tag$3] = typedArrayTags$1[uint8Tag$3] = typedArrayTags$1[uint8ClampedTag$3] = typedArrayTags$1[uint16Tag$3] = typedArrayTags$1[uint32Tag$3] = true;
typedArrayTags$1[argsTag$5] = typedArrayTags$1[arrayTag$4] = typedArrayTags$1[arrayBufferTag$4] = typedArrayTags$1[boolTag$4] = typedArrayTags$1[dataViewTag$6] = typedArrayTags$1[dateTag$4] = typedArrayTags$1[errorTag$3] = typedArrayTags$1[funcTag$3] = typedArrayTags$1[mapTag$7] = typedArrayTags$1[numberTag$4] = typedArrayTags$1[objectTag$6] = typedArrayTags$1[regexpTag$4] = typedArrayTags$1[setTag$7] = typedArrayTags$1[stringTag$4] = typedArrayTags$1[weakMapTag$4] = false;
function baseIsTypedArray$2(value) {
return isObjectLike$2(value) && isLength$2(value.length) && !!typedArrayTags$1[baseGetTag$2(value)];
}
var _baseIsTypedArray = baseIsTypedArray$2;
function baseUnary$2(func) {
return function(value) {
return func(value);
};
}
var _baseUnary = baseUnary$2;
var _nodeUtil = { exports: {} };
(function(module2, exports2) {
var freeGlobal2 = _freeGlobal;
var freeExports2 = exports2 && !exports2.nodeType && exports2;
var freeModule2 = freeExports2 && true && module2 && !module2.nodeType && module2;
var moduleExports2 = freeModule2 && freeModule2.exports === freeExports2;
var freeProcess2 = moduleExports2 && freeGlobal2.process;
var nodeUtil2 = function() {
try {
var types2 = freeModule2 && freeModule2.require && freeModule2.require("util").types;
if (types2) {
return types2;
}
return freeProcess2 && freeProcess2.binding && freeProcess2.binding("util");
} catch (e2) {
}
}();
module2.exports = nodeUtil2;
})(_nodeUtil, _nodeUtil.exports);
var baseIsTypedArray$1 = _baseIsTypedArray, baseUnary$1 = _baseUnary, nodeUtil$2 = _nodeUtil.exports;
var nodeIsTypedArray$1 = nodeUtil$2 && nodeUtil$2.isTypedArray;
var isTypedArray$5 = nodeIsTypedArray$1 ? baseUnary$1(nodeIsTypedArray$1) : baseIsTypedArray$1;
var isTypedArray_1 = isTypedArray$5;
var baseTimes$1 = _baseTimes, isArguments$2 = isArguments_1, isArray$6 = isArray_1, isBuffer$4 = isBuffer$5.exports, isIndex$1 = _isIndex, isTypedArray$4 = isTypedArray_1;
var objectProto$k = Object.prototype;
var hasOwnProperty$k = objectProto$k.hasOwnProperty;
function arrayLikeKeys$2(value, inherited) {
var isArr = isArray$6(value), isArg = !isArr && isArguments$2(value), isBuff = !isArr && !isArg && isBuffer$4(value), isType = !isArr && !isArg && !isBuff && isTypedArray$4(value), skipIndexes = isArr || isArg || isBuff || isType, result = skipIndexes ? baseTimes$1(value.length, String) : [], length = result.length;
for (var key2 in value) {
if ((inherited || hasOwnProperty$k.call(value, key2)) && !(skipIndexes && (key2 == "length" || isBuff && (key2 == "offset" || key2 == "parent") || isType && (key2 == "buffer" || key2 == "byteLength" || key2 == "byteOffset") || isIndex$1(key2, length)))) {
result.push(key2);
}
}
return result;
}
var _arrayLikeKeys = arrayLikeKeys$2;
var objectProto$j = Object.prototype;
function isPrototype$2(value) {
var Ctor = value && value.constructor, proto2 = typeof Ctor == "function" && Ctor.prototype || objectProto$j;
return value === proto2;
}
var _isPrototype = isPrototype$2;
function overArg$2(func, transform) {
return function(arg) {
return func(transform(arg));
};
}
var _overArg = overArg$2;
var overArg$1 = _overArg;
var nativeKeys$3 = overArg$1(Object.keys, Object);
var _nativeKeys = nativeKeys$3;
var isPrototype$1 = _isPrototype, nativeKeys$2 = _nativeKeys;
var objectProto$i = Object.prototype;
var hasOwnProperty$j = objectProto$i.hasOwnProperty;
function baseKeys$2(object2) {
if (!isPrototype$1(object2)) {
return nativeKeys$2(object2);
}
var result = [];
for (var key2 in Object(object2)) {
if (hasOwnProperty$j.call(object2, key2) && key2 != "constructor") {
result.push(key2);
}
}
return result;
}
var _baseKeys = baseKeys$2;
var isFunction$4 = isFunction_1, isLength$1 = isLength_1;
function isArrayLike$2(value) {
return value != null && isLength$1(value.length) && !isFunction$4(value);
}
var isArrayLike_1 = isArrayLike$2;
var arrayLikeKeys$1 = _arrayLikeKeys, baseKeys$1 = _baseKeys, isArrayLike$1 = isArrayLike_1;
function keys$2(object2) {
return isArrayLike$1(object2) ? arrayLikeKeys$1(object2) : baseKeys$1(object2);
}
var keys_1 = keys$2;
var baseGetAllKeys$1 = _baseGetAllKeys, getSymbols$2 = _getSymbols, keys$1 = keys_1;
function getAllKeys$3(object2) {
return baseGetAllKeys$1(object2, keys$1, getSymbols$2);
}
var _getAllKeys = getAllKeys$3;
var getAllKeys$2 = _getAllKeys;
var COMPARE_PARTIAL_FLAG$7 = 1;
var objectProto$h = Object.prototype;
var hasOwnProperty$i = objectProto$h.hasOwnProperty;
function equalObjects$2(object2, other, bitmask, customizer, equalFunc, stack) {
var isPartial = bitmask & COMPARE_PARTIAL_FLAG$7, objProps = getAllKeys$2(object2), objLength = objProps.length, othProps = getAllKeys$2(other), othLength = othProps.length;
if (objLength != othLength && !isPartial) {
return false;
}
var index2 = objLength;
while (index2--) {
var key2 = objProps[index2];
if (!(isPartial ? key2 in other : hasOwnProperty$i.call(other, key2))) {
return false;
}
}
var objStacked = stack.get(object2);
var othStacked = stack.get(other);
if (objStacked && othStacked) {
return objStacked == other && othStacked == object2;
}
var result = true;
stack.set(object2, other);
stack.set(other, object2);
var skipCtor = isPartial;
while (++index2 < objLength) {
key2 = objProps[index2];
var objValue = object2[key2], othValue = other[key2];
if (customizer) {
var compared = isPartial ? customizer(othValue, objValue, key2, other, object2, stack) : customizer(objValue, othValue, key2, object2, other, stack);
}
if (!(compared === void 0 ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) {
result = false;
break;
}
skipCtor || (skipCtor = key2 == "constructor");
}
if (result && !skipCtor) {
var objCtor = object2.constructor, othCtor = other.constructor;
if (objCtor != othCtor && ("constructor" in object2 && "constructor" in other) && !(typeof objCtor == "function" && objCtor instanceof objCtor && typeof othCtor == "function" && othCtor instanceof othCtor)) {
result = false;
}
}
stack["delete"](object2);
stack["delete"](other);
return result;
}
var _equalObjects = equalObjects$2;
var getNative$4 = _getNative, root$5 = _root;
var DataView$3 = getNative$4(root$5, "DataView");
var _DataView = DataView$3;
var getNative$3 = _getNative, root$4 = _root;
var Promise$4 = getNative$3(root$4, "Promise");
var _Promise = Promise$4;
var getNative$2 = _getNative, root$3 = _root;
var Set$4 = getNative$2(root$3, "Set");
var _Set = Set$4;
var getNative$1 = _getNative, root$2 = _root;
var WeakMap$4 = getNative$1(root$2, "WeakMap");
var _WeakMap = WeakMap$4;
var DataView$2 = _DataView, Map$3 = _Map, Promise$3 = _Promise, Set$3 = _Set, WeakMap$3 = _WeakMap, baseGetTag$1 = _baseGetTag, toSource$1 = _toSource;
var mapTag$6 = "[object Map]", objectTag$5 = "[object Object]", promiseTag$1 = "[object Promise]", setTag$6 = "[object Set]", weakMapTag$3 = "[object WeakMap]";
var dataViewTag$5 = "[object DataView]";
var dataViewCtorString$1 = toSource$1(DataView$2), mapCtorString$1 = toSource$1(Map$3), promiseCtorString$1 = toSource$1(Promise$3), setCtorString$1 = toSource$1(Set$3), weakMapCtorString$1 = toSource$1(WeakMap$3);
var getTag$3 = baseGetTag$1;
if (DataView$2 && getTag$3(new DataView$2(new ArrayBuffer(1))) != dataViewTag$5 || Map$3 && getTag$3(new Map$3()) != mapTag$6 || Promise$3 && getTag$3(Promise$3.resolve()) != promiseTag$1 || Set$3 && getTag$3(new Set$3()) != setTag$6 || WeakMap$3 && getTag$3(new WeakMap$3()) != weakMapTag$3) {
getTag$3 = function(value) {
var result = baseGetTag$1(value), Ctor = result == objectTag$5 ? value.constructor : void 0, ctorString = Ctor ? toSource$1(Ctor) : "";
if (ctorString) {
switch (ctorString) {
case dataViewCtorString$1:
return dataViewTag$5;
case mapCtorString$1:
return mapTag$6;
case promiseCtorString$1:
return promiseTag$1;
case setCtorString$1:
return setTag$6;
case weakMapCtorString$1:
return weakMapTag$3;
}
}
return result;
};
}
var _getTag = getTag$3;
var Stack$1 = _Stack, equalArrays$1 = _equalArrays, equalByTag$1 = _equalByTag, equalObjects$1 = _equalObjects, getTag$2 = _getTag, isArray$5 = isArray_1, isBuffer$3 = isBuffer$5.exports, isTypedArray$3 = isTypedArray_1;
var COMPARE_PARTIAL_FLAG$6 = 1;
var argsTag$4 = "[object Arguments]", arrayTag$3 = "[object Array]", objectTag$4 = "[object Object]";
var objectProto$g = Object.prototype;
var hasOwnProperty$h = objectProto$g.hasOwnProperty;
function baseIsEqualDeep$2(object2, other, bitmask, customizer, equalFunc, stack) {
var objIsArr = isArray$5(object2), othIsArr = isArray$5(other), objTag = objIsArr ? arrayTag$3 : getTag$2(object2), othTag = othIsArr ? arrayTag$3 : getTag$2(other);
objTag = objTag == argsTag$4 ? objectTag$4 : objTag;
othTag = othTag == argsTag$4 ? objectTag$4 : othTag;
var objIsObj = objTag == objectTag$4, othIsObj = othTag == objectTag$4, isSameTag = objTag == othTag;
if (isSameTag && isBuffer$3(object2)) {
if (!isBuffer$3(other)) {
return false;
}
objIsArr = true;
objIsObj = false;
}
if (isSameTag && !objIsObj) {
stack || (stack = new Stack$1());
return objIsArr || isTypedArray$3(object2) ? equalArrays$1(object2, other, bitmask, customizer, equalFunc, stack) : equalByTag$1(object2, other, objTag, bitmask, customizer, equalFunc, stack);
}
if (!(bitmask & COMPARE_PARTIAL_FLAG$6)) {
var objIsWrapped = objIsObj && hasOwnProperty$h.call(object2, "__wrapped__"), othIsWrapped = othIsObj && hasOwnProperty$h.call(other, "__wrapped__");
if (objIsWrapped || othIsWrapped) {
var objUnwrapped = objIsWrapped ? object2.value() : object2, othUnwrapped = othIsWrapped ? other.value() : other;
stack || (stack = new Stack$1());
return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
}
}
if (!isSameTag) {
return false;
}
stack || (stack = new Stack$1());
return equalObjects$1(object2, other, bitmask, customizer, equalFunc, stack);
}
var _baseIsEqualDeep = baseIsEqualDeep$2;
var baseIsEqualDeep$1 = _baseIsEqualDeep, isObjectLike$1 = isObjectLike_1;
function baseIsEqual$2(value, other, bitmask, customizer, stack) {
if (value === other) {
return true;
}
if (value == null || other == null || !isObjectLike$1(value) && !isObjectLike$1(other)) {
return value !== value && other !== other;
}
return baseIsEqualDeep$1(value, other, bitmask, customizer, baseIsEqual$2, stack);
}
var _baseIsEqual = baseIsEqual$2;
var baseIsEqual$1 = _baseIsEqual;
function isEqual(value, other) {
return baseIsEqual$1(value, other);
}
var isEqual_1 = isEqual;
var TreeContext = /* @__PURE__ */ React__namespace.createContext(null);
var Indent = function Indent2(_ref) {
var prefixCls = _ref.prefixCls, level = _ref.level, isStart = _ref.isStart, isEnd = _ref.isEnd;
var baseClassName = "".concat(prefixCls, "-indent-unit");
var list = [];
for (var i2 = 0; i2 < level; i2 += 1) {
var _classNames;
list.push(
/* @__PURE__ */ jsx("span", {
className: classnames(baseClassName, (_classNames = {}, _defineProperty$b(_classNames, "".concat(baseClassName, "-start"), isStart[i2]), _defineProperty$b(_classNames, "".concat(baseClassName, "-end"), isEnd[i2]), _classNames))
}, i2)
);
}
return /* @__PURE__ */ jsx("span", {
"aria-hidden": "true",
className: "".concat(prefixCls, "-indent"),
children: list
});
};
const Indent$1 = /* @__PURE__ */ React__namespace.memo(Indent);
var _excluded$6 = ["eventKey", "className", "style", "dragOver", "dragOverGapTop", "dragOverGapBottom", "isLeaf", "isStart", "isEnd", "expanded", "selected", "checked", "halfChecked", "loading", "domRef", "active", "data", "onMouseMove", "selectable"];
var ICON_OPEN = "open";
var ICON_CLOSE = "close";
var defaultTitle = "---";
var InternalTreeNode = /* @__PURE__ */ function(_React$Component) {
_inherits(InternalTreeNode2, _React$Component);
var _super = _createSuper(InternalTreeNode2);
function InternalTreeNode2() {
var _this2;
_classCallCheck(this, InternalTreeNode2);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_this2.state = {
dragNodeHighlight: false
};
_this2.selectHandle = void 0;
_this2.onSelectorClick = function(e2) {
var onNodeClick = _this2.props.context.onNodeClick;
onNodeClick(e2, convertNodePropsToEventData(_this2.props));
if (_this2.isSelectable()) {
_this2.onSelect(e2);
} else {
_this2.onCheck(e2);
}
};
_this2.onSelectorDoubleClick = function(e2) {
var onNodeDoubleClick = _this2.props.context.onNodeDoubleClick;
onNodeDoubleClick(e2, convertNodePropsToEventData(_this2.props));
};
_this2.onSelect = function(e2) {
if (_this2.isDisabled())
return;
var onNodeSelect = _this2.props.context.onNodeSelect;
e2.preventDefault();
onNodeSelect(e2, convertNodePropsToEventData(_this2.props));
};
_this2.onCheck = function(e2) {
if (_this2.isDisabled())
return;
var _this$props = _this2.props, disableCheckbox = _this$props.disableCheckbox, checked = _this$props.checked;
var onNodeCheck = _this2.props.context.onNodeCheck;
if (!_this2.isCheckable() || disableCheckbox)
return;
e2.preventDefault();
var targetChecked = !checked;
onNodeCheck(e2, convertNodePropsToEventData(_this2.props), targetChecked);
};
_this2.onMouseEnter = function(e2) {
var onNodeMouseEnter = _this2.props.context.onNodeMouseEnter;
onNodeMouseEnter(e2, convertNodePropsToEventData(_this2.props));
};
_this2.onMouseLeave = function(e2) {
var onNodeMouseLeave = _this2.props.context.onNodeMouseLeave;
onNodeMouseLeave(e2, convertNodePropsToEventData(_this2.props));
};
_this2.onContextMenu = function(e2) {
var onNodeContextMenu = _this2.props.context.onNodeContextMenu;
onNodeContextMenu(e2, convertNodePropsToEventData(_this2.props));
};
_this2.onDragStart = function(e2) {
var onNodeDragStart = _this2.props.context.onNodeDragStart;
e2.stopPropagation();
_this2.setState({
dragNodeHighlight: true
});
onNodeDragStart(e2, _assertThisInitialized(_this2));
try {
e2.dataTransfer.setData("text/plain", "");
} catch (error) {
}
};
_this2.onDragEnter = function(e2) {
var onNodeDragEnter = _this2.props.context.onNodeDragEnter;
e2.preventDefault();
e2.stopPropagation();
onNodeDragEnter(e2, _assertThisInitialized(_this2));
};
_this2.onDragOver = function(e2) {
var onNodeDragOver = _this2.props.context.onNodeDragOver;
e2.preventDefault();
e2.stopPropagation();
onNodeDragOver(e2, _assertThisInitialized(_this2));
};
_this2.onDragLeave = function(e2) {
var onNodeDragLeave = _this2.props.context.onNodeDragLeave;
e2.stopPropagation();
onNodeDragLeave(e2, _assertThisInitialized(_this2));
};
_this2.onDragEnd = function(e2) {
var onNodeDragEnd = _this2.props.context.onNodeDragEnd;
e2.stopPropagation();
_this2.setState({
dragNodeHighlight: false
});
onNodeDragEnd(e2, _assertThisInitialized(_this2));
};
_this2.onDrop = function(e2) {
var onNodeDrop = _this2.props.context.onNodeDrop;
e2.preventDefault();
e2.stopPropagation();
_this2.setState({
dragNodeHighlight: false
});
onNodeDrop(e2, _assertThisInitialized(_this2));
};
_this2.onExpand = function(e2) {
var _this$props2 = _this2.props, loading = _this$props2.loading, onNodeExpand = _this$props2.context.onNodeExpand;
if (loading)
return;
onNodeExpand(e2, convertNodePropsToEventData(_this2.props));
};
_this2.setSelectHandle = function(node) {
_this2.selectHandle = node;
};
_this2.getNodeState = function() {
var expanded = _this2.props.expanded;
if (_this2.isLeaf()) {
return null;
}
return expanded ? ICON_OPEN : ICON_CLOSE;
};
_this2.hasChildren = function() {
var eventKey = _this2.props.eventKey;
var keyEntities = _this2.props.context.keyEntities;
var _ref = keyEntities[eventKey] || {}, children = _ref.children;
return !!(children || []).length;
};
_this2.isLeaf = function() {
var _this$props3 = _this2.props, isLeaf = _this$props3.isLeaf, loaded = _this$props3.loaded;
var loadData = _this2.props.context.loadData;
var hasChildren = _this2.hasChildren();
if (isLeaf === false) {
return false;
}
return isLeaf || !loadData && !hasChildren || loadData && loaded && !hasChildren;
};
_this2.isDisabled = function() {
var disabled = _this2.props.disabled;
var treeDisabled = _this2.props.context.disabled;
return !!(treeDisabled || disabled);
};
_this2.isCheckable = function() {
var checkable = _this2.props.checkable;
var treeCheckable = _this2.props.context.checkable;
if (!treeCheckable || checkable === false)
return false;
return treeCheckable;
};
_this2.syncLoadData = function(props) {
var expanded = props.expanded, loading = props.loading, loaded = props.loaded;
var _this$props$context = _this2.props.context, loadData = _this$props$context.loadData, onNodeLoad = _this$props$context.onNodeLoad;
if (loading) {
return;
}
if (loadData && expanded && !_this2.isLeaf()) {
if (!_this2.hasChildren() && !loaded) {
onNodeLoad(convertNodePropsToEventData(_this2.props));
}
}
};
_this2.isDraggable = function() {
var _this$props4 = _this2.props, data = _this$props4.data, draggable = _this$props4.context.draggable;
return !!(draggable && (!draggable.nodeDraggable || draggable.nodeDraggable(data)));
};
_this2.renderDragHandler = function() {
var _this$props$context2 = _this2.props.context, draggable = _this$props$context2.draggable, prefixCls = _this$props$context2.prefixCls;
return (draggable === null || draggable === void 0 ? void 0 : draggable.icon) ? /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-draggable-icon"),
children: draggable.icon
}) : null;
};
_this2.renderSwitcherIconDom = function(isLeaf) {
var switcherIconFromProps = _this2.props.switcherIcon;
var switcherIconFromCtx = _this2.props.context.switcherIcon;
var switcherIcon = switcherIconFromProps || switcherIconFromCtx;
if (typeof switcherIcon === "function") {
return switcherIcon(_objectSpread2$a(_objectSpread2$a({}, _this2.props), {}, {
isLeaf
}));
}
return switcherIcon;
};
_this2.renderSwitcher = function() {
var expanded = _this2.props.expanded;
var prefixCls = _this2.props.context.prefixCls;
if (_this2.isLeaf()) {
var _switcherIconDom = _this2.renderSwitcherIconDom(true);
return _switcherIconDom !== false ? /* @__PURE__ */ jsx("span", {
className: classnames("".concat(prefixCls, "-switcher"), "".concat(prefixCls, "-switcher-noop")),
children: _switcherIconDom
}) : null;
}
var switcherCls = classnames("".concat(prefixCls, "-switcher"), "".concat(prefixCls, "-switcher_").concat(expanded ? ICON_OPEN : ICON_CLOSE));
var switcherIconDom = _this2.renderSwitcherIconDom(false);
return switcherIconDom !== false ? /* @__PURE__ */ jsx("span", {
onClick: _this2.onExpand,
className: switcherCls,
children: switcherIconDom
}) : null;
};
_this2.renderCheckbox = function() {
var _this$props5 = _this2.props, checked = _this$props5.checked, halfChecked = _this$props5.halfChecked, disableCheckbox = _this$props5.disableCheckbox;
var prefixCls = _this2.props.context.prefixCls;
var disabled = _this2.isDisabled();
var checkable = _this2.isCheckable();
if (!checkable)
return null;
var $custom = typeof checkable !== "boolean" ? checkable : null;
return /* @__PURE__ */ jsx("span", {
className: classnames("".concat(prefixCls, "-checkbox"), checked && "".concat(prefixCls, "-checkbox-checked"), !checked && halfChecked && "".concat(prefixCls, "-checkbox-indeterminate"), (disabled || disableCheckbox) && "".concat(prefixCls, "-checkbox-disabled")),
onClick: _this2.onCheck,
children: $custom
});
};
_this2.renderIcon = function() {
var loading = _this2.props.loading;
var prefixCls = _this2.props.context.prefixCls;
return /* @__PURE__ */ jsx("span", {
className: classnames("".concat(prefixCls, "-iconEle"), "".concat(prefixCls, "-icon__").concat(_this2.getNodeState() || "docu"), loading && "".concat(prefixCls, "-icon_loading"))
});
};
_this2.renderSelector = function() {
var dragNodeHighlight = _this2.state.dragNodeHighlight;
var _this$props6 = _this2.props, _this$props6$title = _this$props6.title, title = _this$props6$title === void 0 ? defaultTitle : _this$props6$title, selected = _this$props6.selected, icon = _this$props6.icon, loading = _this$props6.loading, data = _this$props6.data;
var _this$props$context3 = _this2.props.context, prefixCls = _this$props$context3.prefixCls, showIcon = _this$props$context3.showIcon, treeIcon = _this$props$context3.icon, loadData = _this$props$context3.loadData, titleRender = _this$props$context3.titleRender;
var disabled = _this2.isDisabled();
var wrapClass = "".concat(prefixCls, "-node-content-wrapper");
var $icon;
if (showIcon) {
var currentIcon = icon || treeIcon;
$icon = currentIcon ? /* @__PURE__ */ jsx("span", {
className: classnames("".concat(prefixCls, "-iconEle"), "".concat(prefixCls, "-icon__customize")),
children: typeof currentIcon === "function" ? currentIcon(_this2.props) : currentIcon
}) : _this2.renderIcon();
} else if (loadData && loading) {
$icon = _this2.renderIcon();
}
var titleNode;
if (typeof title === "function") {
titleNode = title(data);
} else if (titleRender) {
titleNode = titleRender(data);
} else {
titleNode = title;
}
var $title = /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-title"),
children: titleNode
});
return /* @__PURE__ */ jsxs("span", {
ref: _this2.setSelectHandle,
title: typeof title === "string" ? title : "",
className: classnames("".concat(wrapClass), "".concat(wrapClass, "-").concat(_this2.getNodeState() || "normal"), !disabled && (selected || dragNodeHighlight) && "".concat(prefixCls, "-node-selected")),
onMouseEnter: _this2.onMouseEnter,
onMouseLeave: _this2.onMouseLeave,
onContextMenu: _this2.onContextMenu,
onClick: _this2.onSelectorClick,
onDoubleClick: _this2.onSelectorDoubleClick,
children: [$icon, $title, _this2.renderDropIndicator()]
});
};
_this2.renderDropIndicator = function() {
var _this$props7 = _this2.props, disabled = _this$props7.disabled, eventKey = _this$props7.eventKey;
var _this$props$context4 = _this2.props.context, draggable = _this$props$context4.draggable, dropLevelOffset = _this$props$context4.dropLevelOffset, dropPosition = _this$props$context4.dropPosition, prefixCls = _this$props$context4.prefixCls, indent = _this$props$context4.indent, dropIndicatorRender2 = _this$props$context4.dropIndicatorRender, dragOverNodeKey = _this$props$context4.dragOverNodeKey, direction = _this$props$context4.direction;
var rootDraggable = !!draggable;
var showIndicator = !disabled && rootDraggable && dragOverNodeKey === eventKey;
return showIndicator ? dropIndicatorRender2({
dropPosition,
dropLevelOffset,
indent,
prefixCls,
direction
}) : null;
};
return _this2;
}
_createClass(InternalTreeNode2, [{
key: "componentDidMount",
value: function componentDidMount() {
this.syncLoadData(this.props);
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate() {
this.syncLoadData(this.props);
}
}, {
key: "isSelectable",
value: function isSelectable() {
var selectable = this.props.selectable;
var treeSelectable = this.props.context.selectable;
if (typeof selectable === "boolean") {
return selectable;
}
return treeSelectable;
}
}, {
key: "render",
value: function render2() {
var _classNames;
var _this$props8 = this.props, eventKey = _this$props8.eventKey, className = _this$props8.className, style2 = _this$props8.style, dragOver = _this$props8.dragOver, dragOverGapTop = _this$props8.dragOverGapTop, dragOverGapBottom = _this$props8.dragOverGapBottom, isLeaf = _this$props8.isLeaf, isStart = _this$props8.isStart, isEnd = _this$props8.isEnd, expanded = _this$props8.expanded, selected = _this$props8.selected, checked = _this$props8.checked, halfChecked = _this$props8.halfChecked, loading = _this$props8.loading, domRef = _this$props8.domRef, active = _this$props8.active;
_this$props8.data;
var onMouseMove = _this$props8.onMouseMove, selectable = _this$props8.selectable, otherProps = _objectWithoutProperties$1(_this$props8, _excluded$6);
var _this$props$context5 = this.props.context, prefixCls = _this$props$context5.prefixCls, filterTreeNode = _this$props$context5.filterTreeNode, keyEntities = _this$props$context5.keyEntities, dropContainerKey = _this$props$context5.dropContainerKey, dropTargetKey = _this$props$context5.dropTargetKey, draggingNodeKey = _this$props$context5.draggingNodeKey;
var disabled = this.isDisabled();
var dataOrAriaAttributeProps = pickAttrs(otherProps, {
aria: true,
data: true
});
var _ref2 = keyEntities[eventKey] || {}, level = _ref2.level;
var isEndNode = isEnd[isEnd.length - 1];
var mergedDraggable = this.isDraggable();
var draggableWithoutDisabled = !disabled && mergedDraggable;
var dragging = draggingNodeKey === eventKey;
var ariaSelected = selectable !== void 0 ? {
"aria-selected": !!selectable
} : void 0;
return /* @__PURE__ */ jsxs("div", {
ref: domRef,
className: classnames(className, "".concat(prefixCls, "-treenode"), (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-treenode-disabled"), disabled), _defineProperty$b(_classNames, "".concat(prefixCls, "-treenode-switcher-").concat(expanded ? "open" : "close"), !isLeaf), _defineProperty$b(_classNames, "".concat(prefixCls, "-treenode-checkbox-checked"), checked), _defineProperty$b(_classNames, "".concat(prefixCls, "-treenode-checkbox-indeterminate"), halfChecked), _defineProperty$b(_classNames, "".concat(prefixCls, "-treenode-selected"), selected), _defineProperty$b(_classNames, "".concat(prefixCls, "-treenode-loading"), loading), _defineProperty$b(_classNames, "".concat(prefixCls, "-treenode-active"), active), _defineProperty$b(_classNames, "".concat(prefixCls, "-treenode-leaf-last"), isEndNode), _defineProperty$b(_classNames, "".concat(prefixCls, "-treenode-draggable"), mergedDraggable), _defineProperty$b(_classNames, "dragging", dragging), _defineProperty$b(_classNames, "drop-target", dropTargetKey === eventKey), _defineProperty$b(_classNames, "drop-container", dropContainerKey === eventKey), _defineProperty$b(_classNames, "drag-over", !disabled && dragOver), _defineProperty$b(_classNames, "drag-over-gap-top", !disabled && dragOverGapTop), _defineProperty$b(_classNames, "drag-over-gap-bottom", !disabled && dragOverGapBottom), _defineProperty$b(_classNames, "filter-node", filterTreeNode && filterTreeNode(convertNodePropsToEventData(this.props))), _classNames)),
style: style2,
draggable: draggableWithoutDisabled,
"aria-grabbed": dragging,
onDragStart: draggableWithoutDisabled ? this.onDragStart : void 0,
onDragEnter: mergedDraggable ? this.onDragEnter : void 0,
onDragOver: mergedDraggable ? this.onDragOver : void 0,
onDragLeave: mergedDraggable ? this.onDragLeave : void 0,
onDrop: mergedDraggable ? this.onDrop : void 0,
onDragEnd: mergedDraggable ? this.onDragEnd : void 0,
onMouseMove,
...ariaSelected,
...dataOrAriaAttributeProps,
children: [/* @__PURE__ */ jsx(Indent$1, {
prefixCls,
level,
isStart,
isEnd
}), this.renderDragHandler(), this.renderSwitcher(), this.renderCheckbox(), this.renderSelector()]
});
}
}]);
return InternalTreeNode2;
}(React__namespace.Component);
var ContextTreeNode = function ContextTreeNode2(props) {
return /* @__PURE__ */ jsx(TreeContext.Consumer, {
children: function(context2) {
return /* @__PURE__ */ jsx(InternalTreeNode, {
...props,
context: context2
});
}
});
};
ContextTreeNode.displayName = "TreeNode";
ContextTreeNode.isTreeNode = 1;
function arrDel(list, value) {
if (!list)
return [];
var clone = list.slice();
var index2 = clone.indexOf(value);
if (index2 >= 0) {
clone.splice(index2, 1);
}
return clone;
}
function arrAdd(list, value) {
var clone = (list || []).slice();
if (clone.indexOf(value) === -1) {
clone.push(value);
}
return clone;
}
function posToArr(pos) {
return pos.split("-");
}
function getDragChildrenKeys(dragNodeKey, keyEntities) {
var dragChildrenKeys = [];
var entity = keyEntities[dragNodeKey];
function dig() {
var list = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [];
list.forEach(function(_ref) {
var key2 = _ref.key, children = _ref.children;
dragChildrenKeys.push(key2);
dig(children);
});
}
dig(entity.children);
return dragChildrenKeys;
}
function isLastChild(treeNodeEntity) {
if (treeNodeEntity.parent) {
var posArr = posToArr(treeNodeEntity.pos);
return Number(posArr[posArr.length - 1]) === treeNodeEntity.parent.children.length - 1;
}
return false;
}
function isFirstChild(treeNodeEntity) {
var posArr = posToArr(treeNodeEntity.pos);
return Number(posArr[posArr.length - 1]) === 0;
}
function calcDropPosition(event, dragNode, targetNode, indent, startMousePosition, allowDrop, flattenedNodes, keyEntities, expandKeys, direction) {
var _abstractDropNodeEnti;
var clientX = event.clientX, clientY = event.clientY;
var _event$target$getBoun = event.target.getBoundingClientRect(), top = _event$target$getBoun.top, height = _event$target$getBoun.height;
var horizontalMouseOffset = (direction === "rtl" ? -1 : 1) * (((startMousePosition === null || startMousePosition === void 0 ? void 0 : startMousePosition.x) || 0) - clientX);
var rawDropLevelOffset = (horizontalMouseOffset - 12) / indent;
var abstractDropNodeEntity = keyEntities[targetNode.props.eventKey];
if (clientY < top + height / 2) {
var nodeIndex = flattenedNodes.findIndex(function(flattenedNode) {
return flattenedNode.key === abstractDropNodeEntity.key;
});
var prevNodeIndex = nodeIndex <= 0 ? 0 : nodeIndex - 1;
var prevNodeKey = flattenedNodes[prevNodeIndex].key;
abstractDropNodeEntity = keyEntities[prevNodeKey];
}
var initialAbstractDropNodeKey = abstractDropNodeEntity.key;
var abstractDragOverEntity = abstractDropNodeEntity;
var dragOverNodeKey = abstractDropNodeEntity.key;
var dropPosition = 0;
var dropLevelOffset = 0;
if (!expandKeys.includes(initialAbstractDropNodeKey)) {
for (var i2 = 0; i2 < rawDropLevelOffset; i2 += 1) {
if (isLastChild(abstractDropNodeEntity)) {
abstractDropNodeEntity = abstractDropNodeEntity.parent;
dropLevelOffset += 1;
} else {
break;
}
}
}
var abstractDragDataNode = dragNode.props.data;
var abstractDropDataNode = abstractDropNodeEntity.node;
var dropAllowed = true;
if (isFirstChild(abstractDropNodeEntity) && abstractDropNodeEntity.level === 0 && clientY < top + height / 2 && allowDrop({
dragNode: abstractDragDataNode,
dropNode: abstractDropDataNode,
dropPosition: -1
}) && abstractDropNodeEntity.key === targetNode.props.eventKey) {
dropPosition = -1;
} else if ((abstractDragOverEntity.children || []).length && expandKeys.includes(dragOverNodeKey)) {
if (allowDrop({
dragNode: abstractDragDataNode,
dropNode: abstractDropDataNode,
dropPosition: 0
})) {
dropPosition = 0;
} else {
dropAllowed = false;
}
} else if (dropLevelOffset === 0) {
if (rawDropLevelOffset > -1.5) {
if (allowDrop({
dragNode: abstractDragDataNode,
dropNode: abstractDropDataNode,
dropPosition: 1
})) {
dropPosition = 1;
} else {
dropAllowed = false;
}
} else {
if (allowDrop({
dragNode: abstractDragDataNode,
dropNode: abstractDropDataNode,
dropPosition: 0
})) {
dropPosition = 0;
} else if (allowDrop({
dragNode: abstractDragDataNode,
dropNode: abstractDropDataNode,
dropPosition: 1
})) {
dropPosition = 1;
} else {
dropAllowed = false;
}
}
} else {
if (allowDrop({
dragNode: abstractDragDataNode,
dropNode: abstractDropDataNode,
dropPosition: 1
})) {
dropPosition = 1;
} else {
dropAllowed = false;
}
}
return {
dropPosition,
dropLevelOffset,
dropTargetKey: abstractDropNodeEntity.key,
dropTargetPos: abstractDropNodeEntity.pos,
dragOverNodeKey,
dropContainerKey: dropPosition === 0 ? null : ((_abstractDropNodeEnti = abstractDropNodeEntity.parent) === null || _abstractDropNodeEnti === void 0 ? void 0 : _abstractDropNodeEnti.key) || null,
dropAllowed
};
}
function calcSelectedKeys(selectedKeys, props) {
if (!selectedKeys)
return void 0;
var multiple = props.multiple;
if (multiple) {
return selectedKeys.slice();
}
if (selectedKeys.length) {
return [selectedKeys[0]];
}
return selectedKeys;
}
function parseCheckedKeys(keys2) {
if (!keys2) {
return null;
}
var keyProps;
if (Array.isArray(keys2)) {
keyProps = {
checkedKeys: keys2,
halfCheckedKeys: void 0
};
} else if (_typeof$q(keys2) === "object") {
keyProps = {
checkedKeys: keys2.checked || void 0,
halfCheckedKeys: keys2.halfChecked || void 0
};
} else {
warningOnce(false, "`checkedKeys` is not an array or an object");
return null;
}
return keyProps;
}
function conductExpandParent(keyList, keyEntities) {
var expandedKeys = /* @__PURE__ */ new Set();
function conductUp(key2) {
if (expandedKeys.has(key2))
return;
var entity = keyEntities[key2];
if (!entity)
return;
expandedKeys.add(key2);
var parent2 = entity.parent, node = entity.node;
if (node.disabled)
return;
if (parent2) {
conductUp(parent2.key);
}
}
(keyList || []).forEach(function(key2) {
conductUp(key2);
});
return _toConsumableArray$c(expandedKeys);
}
function _objectDestructuringEmpty(obj) {
if (obj == null)
throw new TypeError("Cannot destructure " + obj);
}
function useUnmount$2(triggerStart, triggerEnd) {
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), firstMount = _React$useState2[0], setFirstMount = _React$useState2[1];
React__namespace.useLayoutEffect(function() {
if (firstMount) {
triggerStart();
return function() {
triggerEnd();
};
}
}, [firstMount]);
React__namespace.useLayoutEffect(function() {
setFirstMount(true);
return function() {
setFirstMount(false);
};
}, []);
}
var _excluded$5 = ["className", "style", "motion", "motionNodes", "motionType", "onMotionStart", "onMotionEnd", "active", "treeNodeRequiredProps"];
var MotionTreeNode = function MotionTreeNode2(_ref, ref) {
var className = _ref.className, style2 = _ref.style, motion2 = _ref.motion, motionNodes = _ref.motionNodes, motionType = _ref.motionType, onOriginMotionStart = _ref.onMotionStart, onOriginMotionEnd = _ref.onMotionEnd, active = _ref.active, treeNodeRequiredProps = _ref.treeNodeRequiredProps, props = _objectWithoutProperties$1(_ref, _excluded$5);
var _React$useState = React__namespace.useState(true), _React$useState2 = _slicedToArray$e(_React$useState, 2), visible = _React$useState2[0], setVisible = _React$useState2[1];
var _React$useContext = React__namespace.useContext(TreeContext), prefixCls = _React$useContext.prefixCls;
var targetVisible = motionNodes && motionType !== "hide";
useLayoutEffect$1(function() {
if (motionNodes) {
if (targetVisible !== visible) {
setVisible(targetVisible);
}
}
}, [motionNodes]);
var triggerMotionStart = function triggerMotionStart2() {
if (motionNodes) {
onOriginMotionStart();
}
};
var triggerMotionEndRef = React__namespace.useRef(false);
var triggerMotionEnd = function triggerMotionEnd2() {
if (motionNodes && !triggerMotionEndRef.current) {
triggerMotionEndRef.current = true;
onOriginMotionEnd();
}
};
useUnmount$2(triggerMotionStart, triggerMotionEnd);
var onVisibleChanged = function onVisibleChanged2(nextVisible) {
if (targetVisible === nextVisible) {
triggerMotionEnd();
}
};
if (motionNodes) {
return /* @__PURE__ */ jsx(CSSMotion, {
ref,
visible,
...motion2,
motionAppear: motionType === "show",
onVisibleChanged,
children: function(_ref2, motionRef) {
var motionClassName = _ref2.className, motionStyle = _ref2.style;
return /* @__PURE__ */ jsx("div", {
ref: motionRef,
className: classnames("".concat(prefixCls, "-treenode-motion"), motionClassName),
style: motionStyle,
children: motionNodes.map(function(treeNode) {
var restProps = _extends$3({}, (_objectDestructuringEmpty(treeNode.data), treeNode.data)), title = treeNode.title, key2 = treeNode.key, isStart = treeNode.isStart, isEnd = treeNode.isEnd;
delete restProps.children;
var treeNodeProps = getTreeNodeProps(key2, treeNodeRequiredProps);
return /* @__PURE__ */ React$a.createElement(ContextTreeNode, {
...restProps,
...treeNodeProps,
title,
active,
data: treeNode.data,
key: key2,
isStart,
isEnd
});
})
});
}
});
}
return /* @__PURE__ */ jsx(ContextTreeNode, {
domRef: ref,
className,
style: style2,
...props,
active
});
};
MotionTreeNode.displayName = "MotionTreeNode";
var RefMotionTreeNode = /* @__PURE__ */ React__namespace.forwardRef(MotionTreeNode);
function findExpandedKeys() {
var prev = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [];
var next = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
var prevLen = prev.length;
var nextLen = next.length;
if (Math.abs(prevLen - nextLen) !== 1) {
return {
add: false,
key: null
};
}
function find(shorter, longer) {
var cache = /* @__PURE__ */ new Map();
shorter.forEach(function(key2) {
cache.set(key2, true);
});
var keys2 = longer.filter(function(key2) {
return !cache.has(key2);
});
return keys2.length === 1 ? keys2[0] : null;
}
if (prevLen < nextLen) {
return {
add: true,
key: find(prev, next)
};
}
return {
add: false,
key: find(next, prev)
};
}
function getExpandRange(shorter, longer, key2) {
var shorterStartIndex = shorter.findIndex(function(data) {
return data.key === key2;
});
var shorterEndNode = shorter[shorterStartIndex + 1];
var longerStartIndex = longer.findIndex(function(data) {
return data.key === key2;
});
if (shorterEndNode) {
var longerEndIndex = longer.findIndex(function(data) {
return data.key === shorterEndNode.key;
});
return longer.slice(longerStartIndex + 1, longerEndIndex);
}
return longer.slice(longerStartIndex + 1);
}
var _excluded$4 = ["prefixCls", "data", "selectable", "checkable", "expandedKeys", "selectedKeys", "checkedKeys", "loadedKeys", "loadingKeys", "halfCheckedKeys", "keyEntities", "disabled", "dragging", "dragOverNodeKey", "dropPosition", "motion", "height", "itemHeight", "virtual", "focusable", "activeItem", "focused", "tabIndex", "onKeyDown", "onFocus", "onBlur", "onActiveChange", "onListChangeStart", "onListChangeEnd"];
var HIDDEN_STYLE$1 = {
width: 0,
height: 0,
display: "flex",
overflow: "hidden",
opacity: 0,
border: 0,
padding: 0,
margin: 0
};
var noop$3 = function noop2() {
};
var MOTION_KEY = "RC_TREE_MOTION_".concat(Math.random());
var MotionNode = {
key: MOTION_KEY
};
var MotionEntity = {
key: MOTION_KEY,
level: 0,
index: 0,
pos: "0",
node: MotionNode,
nodes: [MotionNode]
};
var MotionFlattenData = {
parent: null,
children: [],
pos: MotionEntity.pos,
data: MotionNode,
title: null,
key: MOTION_KEY,
isStart: [],
isEnd: []
};
function getMinimumRangeTransitionRange(list, virtual, height, itemHeight) {
if (virtual === false || !height) {
return list;
}
return list.slice(0, Math.ceil(height / itemHeight) + 1);
}
function itemKey(item) {
var key2 = item.key, pos = item.pos;
return getKey(key2, pos);
}
function getAccessibilityPath(item) {
var path2 = String(item.data.key);
var current = item;
while (current.parent) {
current = current.parent;
path2 = "".concat(current.data.key, " > ").concat(path2);
}
return path2;
}
var NodeList = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var prefixCls = props.prefixCls, data = props.data;
props.selectable;
props.checkable;
var expandedKeys = props.expandedKeys, selectedKeys = props.selectedKeys, checkedKeys = props.checkedKeys, loadedKeys = props.loadedKeys, loadingKeys = props.loadingKeys, halfCheckedKeys = props.halfCheckedKeys, keyEntities = props.keyEntities, disabled = props.disabled, dragging = props.dragging, dragOverNodeKey = props.dragOverNodeKey, dropPosition = props.dropPosition, motion2 = props.motion, height = props.height, itemHeight = props.itemHeight, virtual = props.virtual, focusable2 = props.focusable, activeItem = props.activeItem, focused = props.focused, tabIndex = props.tabIndex, onKeyDown2 = props.onKeyDown, onFocus = props.onFocus, onBlur = props.onBlur, onActiveChange = props.onActiveChange, onListChangeStart = props.onListChangeStart, onListChangeEnd = props.onListChangeEnd, domProps = _objectWithoutProperties$1(props, _excluded$4);
var listRef = React__namespace.useRef(null);
var indentMeasurerRef = React__namespace.useRef(null);
React__namespace.useImperativeHandle(ref, function() {
return {
scrollTo: function scrollTo2(scroll) {
listRef.current.scrollTo(scroll);
},
getIndentWidth: function getIndentWidth() {
return indentMeasurerRef.current.offsetWidth;
}
};
});
var _React$useState = React__namespace.useState(expandedKeys), _React$useState2 = _slicedToArray$e(_React$useState, 2), prevExpandedKeys = _React$useState2[0], setPrevExpandedKeys = _React$useState2[1];
var _React$useState3 = React__namespace.useState(data), _React$useState4 = _slicedToArray$e(_React$useState3, 2), prevData = _React$useState4[0], setPrevData = _React$useState4[1];
var _React$useState5 = React__namespace.useState(data), _React$useState6 = _slicedToArray$e(_React$useState5, 2), transitionData = _React$useState6[0], setTransitionData = _React$useState6[1];
var _React$useState7 = React__namespace.useState([]), _React$useState8 = _slicedToArray$e(_React$useState7, 2), transitionRange = _React$useState8[0], setTransitionRange = _React$useState8[1];
var _React$useState9 = React__namespace.useState(null), _React$useState10 = _slicedToArray$e(_React$useState9, 2), motionType = _React$useState10[0], setMotionType = _React$useState10[1];
var dataRef = React__namespace.useRef(data);
dataRef.current = data;
function onMotionEnd() {
var latestData = dataRef.current;
setPrevData(latestData);
setTransitionData(latestData);
setTransitionRange([]);
setMotionType(null);
onListChangeEnd();
}
useLayoutEffect$1(function() {
setPrevExpandedKeys(expandedKeys);
var diffExpanded = findExpandedKeys(prevExpandedKeys, expandedKeys);
if (diffExpanded.key !== null) {
if (diffExpanded.add) {
var keyIndex = prevData.findIndex(function(_ref) {
var key2 = _ref.key;
return key2 === diffExpanded.key;
});
var rangeNodes = getMinimumRangeTransitionRange(getExpandRange(prevData, data, diffExpanded.key), virtual, height, itemHeight);
var newTransitionData = prevData.slice();
newTransitionData.splice(keyIndex + 1, 0, MotionFlattenData);
setTransitionData(newTransitionData);
setTransitionRange(rangeNodes);
setMotionType("show");
} else {
var _keyIndex = data.findIndex(function(_ref2) {
var key2 = _ref2.key;
return key2 === diffExpanded.key;
});
var _rangeNodes = getMinimumRangeTransitionRange(getExpandRange(data, prevData, diffExpanded.key), virtual, height, itemHeight);
var _newTransitionData = data.slice();
_newTransitionData.splice(_keyIndex + 1, 0, MotionFlattenData);
setTransitionData(_newTransitionData);
setTransitionRange(_rangeNodes);
setMotionType("hide");
}
} else if (prevData !== data) {
setPrevData(data);
setTransitionData(data);
}
}, [expandedKeys, data]);
React__namespace.useEffect(function() {
if (!dragging) {
onMotionEnd();
}
}, [dragging]);
var mergedData = motion2 ? transitionData : data;
var treeNodeRequiredProps = {
expandedKeys,
selectedKeys,
loadedKeys,
loadingKeys,
checkedKeys,
halfCheckedKeys,
dragOverNodeKey,
dropPosition,
keyEntities
};
return /* @__PURE__ */ jsxs(Fragment, {
children: [focused && activeItem && /* @__PURE__ */ jsx("span", {
style: HIDDEN_STYLE$1,
"aria-live": "assertive",
children: getAccessibilityPath(activeItem)
}), /* @__PURE__ */ jsx("div", {
children: /* @__PURE__ */ jsx("input", {
style: HIDDEN_STYLE$1,
disabled: focusable2 === false || disabled,
tabIndex: focusable2 !== false ? tabIndex : null,
onKeyDown: onKeyDown2,
onFocus,
onBlur,
value: "",
onChange: noop$3,
"aria-label": "for screen reader"
})
}), /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-treenode"),
"aria-hidden": true,
style: {
position: "absolute",
pointerEvents: "none",
visibility: "hidden",
height: 0,
overflow: "hidden",
border: 0,
padding: 0
},
children: /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-indent"),
children: /* @__PURE__ */ jsx("div", {
ref: indentMeasurerRef,
className: "".concat(prefixCls, "-indent-unit")
})
})
}), /* @__PURE__ */ jsx(List$1, {
...domProps,
data: mergedData,
itemKey,
height,
fullHeight: false,
virtual,
itemHeight,
prefixCls: "".concat(prefixCls, "-list"),
ref: listRef,
onVisibleChange: function onVisibleChange(originList, fullList) {
var originSet = new Set(originList);
var restList = fullList.filter(function(item) {
return !originSet.has(item);
});
if (restList.some(function(item) {
return itemKey(item) === MOTION_KEY;
})) {
onMotionEnd();
}
},
children: function(treeNode) {
var pos = treeNode.pos, restProps = _extends$3({}, (_objectDestructuringEmpty(treeNode.data), treeNode.data)), title = treeNode.title, key2 = treeNode.key, isStart = treeNode.isStart, isEnd = treeNode.isEnd;
var mergedKey = getKey(key2, pos);
delete restProps.key;
delete restProps.children;
var treeNodeProps = getTreeNodeProps(mergedKey, treeNodeRequiredProps);
return /* @__PURE__ */ jsx(RefMotionTreeNode, {
...restProps,
...treeNodeProps,
title,
active: !!activeItem && key2 === activeItem.key,
pos,
data: treeNode.data,
isStart,
isEnd,
motion: motion2,
motionNodes: key2 === MOTION_KEY ? transitionRange : null,
motionType,
onMotionStart: onListChangeStart,
onMotionEnd,
treeNodeRequiredProps,
onMouseMove: function onMouseMove() {
onActiveChange(null);
}
});
}
})]
});
});
NodeList.displayName = "NodeList";
function DropIndicator(_ref) {
var dropPosition = _ref.dropPosition, dropLevelOffset = _ref.dropLevelOffset, indent = _ref.indent;
var style2 = {
pointerEvents: "none",
position: "absolute",
right: 0,
backgroundColor: "red",
height: 2
};
switch (dropPosition) {
case -1:
style2.top = 0;
style2.left = -dropLevelOffset * indent;
break;
case 1:
style2.bottom = 0;
style2.left = -dropLevelOffset * indent;
break;
case 0:
style2.bottom = 0;
style2.left = indent;
break;
}
return /* @__PURE__ */ jsx("div", {
style: style2
});
}
var MAX_RETRY_TIMES = 10;
var Tree$3 = /* @__PURE__ */ function(_React$Component) {
_inherits(Tree2, _React$Component);
var _super = _createSuper(Tree2);
function Tree2() {
var _this2;
_classCallCheck(this, Tree2);
for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {
_args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(_args));
_this2.destroyed = false;
_this2.delayedDragEnterLogic = void 0;
_this2.loadingRetryTimes = {};
_this2.state = {
keyEntities: {},
indent: null,
selectedKeys: [],
checkedKeys: [],
halfCheckedKeys: [],
loadedKeys: [],
loadingKeys: [],
expandedKeys: [],
draggingNodeKey: null,
dragChildrenKeys: [],
dropTargetKey: null,
dropPosition: null,
dropContainerKey: null,
dropLevelOffset: null,
dropTargetPos: null,
dropAllowed: true,
dragOverNodeKey: null,
treeData: [],
flattenNodes: [],
focused: false,
activeKey: null,
listChanging: false,
prevProps: null,
fieldNames: fillFieldNames$1()
};
_this2.dragStartMousePosition = null;
_this2.dragNode = void 0;
_this2.currentMouseOverDroppableNodeKey = null;
_this2.listRef = /* @__PURE__ */ React__namespace.createRef();
_this2.onNodeDragStart = function(event, node) {
var _this$state = _this2.state, expandedKeys = _this$state.expandedKeys, keyEntities = _this$state.keyEntities;
var onDragStart = _this2.props.onDragStart;
var eventKey = node.props.eventKey;
_this2.dragNode = node;
_this2.dragStartMousePosition = {
x: event.clientX,
y: event.clientY
};
var newExpandedKeys = arrDel(expandedKeys, eventKey);
_this2.setState({
draggingNodeKey: eventKey,
dragChildrenKeys: getDragChildrenKeys(eventKey, keyEntities),
indent: _this2.listRef.current.getIndentWidth()
});
_this2.setExpandedKeys(newExpandedKeys);
window.addEventListener("dragend", _this2.onWindowDragEnd);
onDragStart === null || onDragStart === void 0 ? void 0 : onDragStart({
event,
node: convertNodePropsToEventData(node.props)
});
};
_this2.onNodeDragEnter = function(event, node) {
var _this$state2 = _this2.state, expandedKeys = _this$state2.expandedKeys, keyEntities = _this$state2.keyEntities, dragChildrenKeys = _this$state2.dragChildrenKeys, flattenNodes = _this$state2.flattenNodes, indent = _this$state2.indent;
var _this$props = _this2.props, onDragEnter = _this$props.onDragEnter, onExpand = _this$props.onExpand, allowDrop = _this$props.allowDrop, direction = _this$props.direction;
var _node$props = node.props, pos = _node$props.pos, eventKey = _node$props.eventKey;
var _assertThisInitialize = _assertThisInitialized(_this2), dragNode = _assertThisInitialize.dragNode;
if (_this2.currentMouseOverDroppableNodeKey !== eventKey) {
_this2.currentMouseOverDroppableNodeKey = eventKey;
}
if (!dragNode) {
_this2.resetDragState();
return;
}
var _calcDropPosition = calcDropPosition(event, dragNode, node, indent, _this2.dragStartMousePosition, allowDrop, flattenNodes, keyEntities, expandedKeys, direction), dropPosition = _calcDropPosition.dropPosition, dropLevelOffset = _calcDropPosition.dropLevelOffset, dropTargetKey = _calcDropPosition.dropTargetKey, dropContainerKey = _calcDropPosition.dropContainerKey, dropTargetPos = _calcDropPosition.dropTargetPos, dropAllowed = _calcDropPosition.dropAllowed, dragOverNodeKey = _calcDropPosition.dragOverNodeKey;
if (dragChildrenKeys.indexOf(dropTargetKey) !== -1 || !dropAllowed) {
_this2.resetDragState();
return;
}
if (!_this2.delayedDragEnterLogic) {
_this2.delayedDragEnterLogic = {};
}
Object.keys(_this2.delayedDragEnterLogic).forEach(function(key2) {
clearTimeout(_this2.delayedDragEnterLogic[key2]);
});
if (dragNode.props.eventKey !== node.props.eventKey) {
event.persist();
_this2.delayedDragEnterLogic[pos] = window.setTimeout(function() {
if (_this2.state.draggingNodeKey === null)
return;
var newExpandedKeys = _toConsumableArray$c(expandedKeys);
var entity = keyEntities[node.props.eventKey];
if (entity && (entity.children || []).length) {
newExpandedKeys = arrAdd(expandedKeys, node.props.eventKey);
}
if (!("expandedKeys" in _this2.props)) {
_this2.setExpandedKeys(newExpandedKeys);
}
onExpand === null || onExpand === void 0 ? void 0 : onExpand(newExpandedKeys, {
node: convertNodePropsToEventData(node.props),
expanded: true,
nativeEvent: event.nativeEvent
});
}, 800);
}
if (dragNode.props.eventKey === dropTargetKey && dropLevelOffset === 0) {
_this2.resetDragState();
return;
}
_this2.setState({
dragOverNodeKey,
dropPosition,
dropLevelOffset,
dropTargetKey,
dropContainerKey,
dropTargetPos,
dropAllowed
});
onDragEnter === null || onDragEnter === void 0 ? void 0 : onDragEnter({
event,
node: convertNodePropsToEventData(node.props),
expandedKeys
});
};
_this2.onNodeDragOver = function(event, node) {
var _this$state3 = _this2.state, dragChildrenKeys = _this$state3.dragChildrenKeys, flattenNodes = _this$state3.flattenNodes, keyEntities = _this$state3.keyEntities, expandedKeys = _this$state3.expandedKeys, indent = _this$state3.indent;
var _this$props2 = _this2.props, onDragOver = _this$props2.onDragOver, allowDrop = _this$props2.allowDrop, direction = _this$props2.direction;
var _assertThisInitialize2 = _assertThisInitialized(_this2), dragNode = _assertThisInitialize2.dragNode;
if (!dragNode) {
return;
}
var _calcDropPosition2 = calcDropPosition(event, dragNode, node, indent, _this2.dragStartMousePosition, allowDrop, flattenNodes, keyEntities, expandedKeys, direction), dropPosition = _calcDropPosition2.dropPosition, dropLevelOffset = _calcDropPosition2.dropLevelOffset, dropTargetKey = _calcDropPosition2.dropTargetKey, dropContainerKey = _calcDropPosition2.dropContainerKey, dropAllowed = _calcDropPosition2.dropAllowed, dropTargetPos = _calcDropPosition2.dropTargetPos, dragOverNodeKey = _calcDropPosition2.dragOverNodeKey;
if (dragChildrenKeys.indexOf(dropTargetKey) !== -1 || !dropAllowed) {
return;
}
if (dragNode.props.eventKey === dropTargetKey && dropLevelOffset === 0) {
if (!(_this2.state.dropPosition === null && _this2.state.dropLevelOffset === null && _this2.state.dropTargetKey === null && _this2.state.dropContainerKey === null && _this2.state.dropTargetPos === null && _this2.state.dropAllowed === false && _this2.state.dragOverNodeKey === null)) {
_this2.resetDragState();
}
} else if (!(dropPosition === _this2.state.dropPosition && dropLevelOffset === _this2.state.dropLevelOffset && dropTargetKey === _this2.state.dropTargetKey && dropContainerKey === _this2.state.dropContainerKey && dropTargetPos === _this2.state.dropTargetPos && dropAllowed === _this2.state.dropAllowed && dragOverNodeKey === _this2.state.dragOverNodeKey)) {
_this2.setState({
dropPosition,
dropLevelOffset,
dropTargetKey,
dropContainerKey,
dropTargetPos,
dropAllowed,
dragOverNodeKey
});
}
onDragOver === null || onDragOver === void 0 ? void 0 : onDragOver({
event,
node: convertNodePropsToEventData(node.props)
});
};
_this2.onNodeDragLeave = function(event, node) {
if (_this2.currentMouseOverDroppableNodeKey === node.props.eventKey && !event.currentTarget.contains(event.relatedTarget)) {
_this2.resetDragState();
_this2.currentMouseOverDroppableNodeKey = null;
}
var onDragLeave = _this2.props.onDragLeave;
onDragLeave === null || onDragLeave === void 0 ? void 0 : onDragLeave({
event,
node: convertNodePropsToEventData(node.props)
});
};
_this2.onWindowDragEnd = function(event) {
_this2.onNodeDragEnd(event, null, true);
window.removeEventListener("dragend", _this2.onWindowDragEnd);
};
_this2.onNodeDragEnd = function(event, node) {
var onDragEnd = _this2.props.onDragEnd;
_this2.setState({
dragOverNodeKey: null
});
_this2.cleanDragState();
onDragEnd === null || onDragEnd === void 0 ? void 0 : onDragEnd({
event,
node: convertNodePropsToEventData(node.props)
});
_this2.dragNode = null;
window.removeEventListener("dragend", _this2.onWindowDragEnd);
};
_this2.onNodeDrop = function(event, node) {
var _this$getActiveItem;
var outsideTree = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : false;
var _this$state4 = _this2.state, dragChildrenKeys = _this$state4.dragChildrenKeys, dropPosition = _this$state4.dropPosition, dropTargetKey = _this$state4.dropTargetKey, dropTargetPos = _this$state4.dropTargetPos, dropAllowed = _this$state4.dropAllowed;
if (!dropAllowed)
return;
var onDrop = _this2.props.onDrop;
_this2.setState({
dragOverNodeKey: null
});
_this2.cleanDragState();
if (dropTargetKey === null)
return;
var abstractDropNodeProps = _objectSpread2$a(_objectSpread2$a({}, getTreeNodeProps(dropTargetKey, _this2.getTreeNodeRequiredProps())), {}, {
active: ((_this$getActiveItem = _this2.getActiveItem()) === null || _this$getActiveItem === void 0 ? void 0 : _this$getActiveItem.key) === dropTargetKey,
data: _this2.state.keyEntities[dropTargetKey].node
});
var dropToChild = dragChildrenKeys.indexOf(dropTargetKey) !== -1;
warningOnce(!dropToChild, "Can not drop to dragNode's children node. This is a bug of rc-tree. Please report an issue.");
var posArr = posToArr(dropTargetPos);
var dropResult = {
event,
node: convertNodePropsToEventData(abstractDropNodeProps),
dragNode: _this2.dragNode ? convertNodePropsToEventData(_this2.dragNode.props) : null,
dragNodesKeys: [_this2.dragNode.props.eventKey].concat(dragChildrenKeys),
dropToGap: dropPosition !== 0,
dropPosition: dropPosition + Number(posArr[posArr.length - 1])
};
if (!outsideTree) {
onDrop === null || onDrop === void 0 ? void 0 : onDrop(dropResult);
}
_this2.dragNode = null;
};
_this2.cleanDragState = function() {
var draggingNodeKey = _this2.state.draggingNodeKey;
if (draggingNodeKey !== null) {
_this2.setState({
draggingNodeKey: null,
dropPosition: null,
dropContainerKey: null,
dropTargetKey: null,
dropLevelOffset: null,
dropAllowed: true,
dragOverNodeKey: null
});
}
_this2.dragStartMousePosition = null;
_this2.currentMouseOverDroppableNodeKey = null;
};
_this2.triggerExpandActionExpand = function(e2, treeNode) {
var _this$state5 = _this2.state, expandedKeys = _this$state5.expandedKeys, flattenNodes = _this$state5.flattenNodes;
var expanded = treeNode.expanded, key2 = treeNode.key, isLeaf = treeNode.isLeaf;
if (isLeaf || e2.shiftKey || e2.metaKey || e2.ctrlKey) {
return;
}
var node = flattenNodes.filter(function(nodeItem) {
return nodeItem.key === key2;
})[0];
var eventNode = convertNodePropsToEventData(_objectSpread2$a(_objectSpread2$a({}, getTreeNodeProps(key2, _this2.getTreeNodeRequiredProps())), {}, {
data: node.data
}));
_this2.setExpandedKeys(expanded ? arrDel(expandedKeys, key2) : arrAdd(expandedKeys, key2));
_this2.onNodeExpand(e2, eventNode);
};
_this2.onNodeClick = function(e2, treeNode) {
var _this$props3 = _this2.props, onClick = _this$props3.onClick, expandAction = _this$props3.expandAction;
if (expandAction === "click") {
_this2.triggerExpandActionExpand(e2, treeNode);
}
onClick === null || onClick === void 0 ? void 0 : onClick(e2, treeNode);
};
_this2.onNodeDoubleClick = function(e2, treeNode) {
var _this$props4 = _this2.props, onDoubleClick = _this$props4.onDoubleClick, expandAction = _this$props4.expandAction;
if (expandAction === "doubleClick") {
_this2.triggerExpandActionExpand(e2, treeNode);
}
onDoubleClick === null || onDoubleClick === void 0 ? void 0 : onDoubleClick(e2, treeNode);
};
_this2.onNodeSelect = function(e2, treeNode) {
var selectedKeys = _this2.state.selectedKeys;
var _this$state6 = _this2.state, keyEntities = _this$state6.keyEntities, fieldNames = _this$state6.fieldNames;
var _this$props5 = _this2.props, onSelect = _this$props5.onSelect, multiple = _this$props5.multiple;
var selected = treeNode.selected;
var key2 = treeNode[fieldNames.key];
var targetSelected = !selected;
if (!targetSelected) {
selectedKeys = arrDel(selectedKeys, key2);
} else if (!multiple) {
selectedKeys = [key2];
} else {
selectedKeys = arrAdd(selectedKeys, key2);
}
var selectedNodes = selectedKeys.map(function(selectedKey) {
var entity = keyEntities[selectedKey];
if (!entity)
return null;
return entity.node;
}).filter(function(node) {
return node;
});
_this2.setUncontrolledState({
selectedKeys
});
onSelect === null || onSelect === void 0 ? void 0 : onSelect(selectedKeys, {
event: "select",
selected: targetSelected,
node: treeNode,
selectedNodes,
nativeEvent: e2.nativeEvent
});
};
_this2.onNodeCheck = function(e2, treeNode, checked) {
var _this$state7 = _this2.state, keyEntities = _this$state7.keyEntities, oriCheckedKeys = _this$state7.checkedKeys, oriHalfCheckedKeys = _this$state7.halfCheckedKeys;
var _this$props6 = _this2.props, checkStrictly = _this$props6.checkStrictly, onCheck = _this$props6.onCheck;
var key2 = treeNode.key;
var checkedObj;
var eventObj = {
event: "check",
node: treeNode,
checked,
nativeEvent: e2.nativeEvent
};
if (checkStrictly) {
var checkedKeys = checked ? arrAdd(oriCheckedKeys, key2) : arrDel(oriCheckedKeys, key2);
var halfCheckedKeys = arrDel(oriHalfCheckedKeys, key2);
checkedObj = {
checked: checkedKeys,
halfChecked: halfCheckedKeys
};
eventObj.checkedNodes = checkedKeys.map(function(checkedKey) {
return keyEntities[checkedKey];
}).filter(function(entity) {
return entity;
}).map(function(entity) {
return entity.node;
});
_this2.setUncontrolledState({
checkedKeys
});
} else {
var _conductCheck = conductCheck([].concat(_toConsumableArray$c(oriCheckedKeys), [key2]), true, keyEntities), _checkedKeys = _conductCheck.checkedKeys, _halfCheckedKeys = _conductCheck.halfCheckedKeys;
if (!checked) {
var keySet = new Set(_checkedKeys);
keySet.delete(key2);
var _conductCheck2 = conductCheck(Array.from(keySet), {
checked: false,
halfCheckedKeys: _halfCheckedKeys
}, keyEntities);
_checkedKeys = _conductCheck2.checkedKeys;
_halfCheckedKeys = _conductCheck2.halfCheckedKeys;
}
checkedObj = _checkedKeys;
eventObj.checkedNodes = [];
eventObj.checkedNodesPositions = [];
eventObj.halfCheckedKeys = _halfCheckedKeys;
_checkedKeys.forEach(function(checkedKey) {
var entity = keyEntities[checkedKey];
if (!entity)
return;
var node = entity.node, pos = entity.pos;
eventObj.checkedNodes.push(node);
eventObj.checkedNodesPositions.push({
node,
pos
});
});
_this2.setUncontrolledState({
checkedKeys: _checkedKeys
}, false, {
halfCheckedKeys: _halfCheckedKeys
});
}
onCheck === null || onCheck === void 0 ? void 0 : onCheck(checkedObj, eventObj);
};
_this2.onNodeLoad = function(treeNode) {
var key2 = treeNode.key;
var loadPromise = new Promise(function(resolve, reject) {
_this2.setState(function(_ref) {
var _ref$loadedKeys = _ref.loadedKeys, loadedKeys = _ref$loadedKeys === void 0 ? [] : _ref$loadedKeys, _ref$loadingKeys = _ref.loadingKeys, loadingKeys = _ref$loadingKeys === void 0 ? [] : _ref$loadingKeys;
var _this$props7 = _this2.props, loadData = _this$props7.loadData, onLoad = _this$props7.onLoad;
if (!loadData || loadedKeys.indexOf(key2) !== -1 || loadingKeys.indexOf(key2) !== -1) {
return null;
}
var promise = loadData(treeNode);
promise.then(function() {
var currentLoadedKeys = _this2.state.loadedKeys;
var newLoadedKeys = arrAdd(currentLoadedKeys, key2);
onLoad === null || onLoad === void 0 ? void 0 : onLoad(newLoadedKeys, {
event: "load",
node: treeNode
});
_this2.setUncontrolledState({
loadedKeys: newLoadedKeys
});
_this2.setState(function(prevState) {
return {
loadingKeys: arrDel(prevState.loadingKeys, key2)
};
});
resolve();
}).catch(function(e2) {
_this2.setState(function(prevState) {
return {
loadingKeys: arrDel(prevState.loadingKeys, key2)
};
});
_this2.loadingRetryTimes[key2] = (_this2.loadingRetryTimes[key2] || 0) + 1;
if (_this2.loadingRetryTimes[key2] >= MAX_RETRY_TIMES) {
var currentLoadedKeys = _this2.state.loadedKeys;
warningOnce(false, "Retry for `loadData` many times but still failed. No more retry.");
_this2.setUncontrolledState({
loadedKeys: arrAdd(currentLoadedKeys, key2)
});
resolve();
}
reject(e2);
});
return {
loadingKeys: arrAdd(loadingKeys, key2)
};
});
});
loadPromise.catch(function() {
});
return loadPromise;
};
_this2.onNodeMouseEnter = function(event, node) {
var onMouseEnter = _this2.props.onMouseEnter;
onMouseEnter === null || onMouseEnter === void 0 ? void 0 : onMouseEnter({
event,
node
});
};
_this2.onNodeMouseLeave = function(event, node) {
var onMouseLeave = _this2.props.onMouseLeave;
onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave({
event,
node
});
};
_this2.onNodeContextMenu = function(event, node) {
var onRightClick = _this2.props.onRightClick;
if (onRightClick) {
event.preventDefault();
onRightClick({
event,
node
});
}
};
_this2.onFocus = function() {
var onFocus = _this2.props.onFocus;
_this2.setState({
focused: true
});
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
onFocus === null || onFocus === void 0 ? void 0 : onFocus.apply(void 0, args);
};
_this2.onBlur = function() {
var onBlur = _this2.props.onBlur;
_this2.setState({
focused: false
});
_this2.onActiveChange(null);
for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
args[_key3] = arguments[_key3];
}
onBlur === null || onBlur === void 0 ? void 0 : onBlur.apply(void 0, args);
};
_this2.getTreeNodeRequiredProps = function() {
var _this$state8 = _this2.state, expandedKeys = _this$state8.expandedKeys, selectedKeys = _this$state8.selectedKeys, loadedKeys = _this$state8.loadedKeys, loadingKeys = _this$state8.loadingKeys, checkedKeys = _this$state8.checkedKeys, halfCheckedKeys = _this$state8.halfCheckedKeys, dragOverNodeKey = _this$state8.dragOverNodeKey, dropPosition = _this$state8.dropPosition, keyEntities = _this$state8.keyEntities;
return {
expandedKeys: expandedKeys || [],
selectedKeys: selectedKeys || [],
loadedKeys: loadedKeys || [],
loadingKeys: loadingKeys || [],
checkedKeys: checkedKeys || [],
halfCheckedKeys: halfCheckedKeys || [],
dragOverNodeKey,
dropPosition,
keyEntities
};
};
_this2.setExpandedKeys = function(expandedKeys) {
var _this$state9 = _this2.state, treeData = _this$state9.treeData, fieldNames = _this$state9.fieldNames;
var flattenNodes = flattenTreeData(treeData, expandedKeys, fieldNames);
_this2.setUncontrolledState({
expandedKeys,
flattenNodes
}, true);
};
_this2.onNodeExpand = function(e2, treeNode) {
var expandedKeys = _this2.state.expandedKeys;
var _this$state10 = _this2.state, listChanging = _this$state10.listChanging, fieldNames = _this$state10.fieldNames;
var _this$props8 = _this2.props, onExpand = _this$props8.onExpand, loadData = _this$props8.loadData;
var expanded = treeNode.expanded;
var key2 = treeNode[fieldNames.key];
if (listChanging) {
return;
}
var index2 = expandedKeys.indexOf(key2);
var targetExpanded = !expanded;
warningOnce(expanded && index2 !== -1 || !expanded && index2 === -1, "Expand state not sync with index check");
if (targetExpanded) {
expandedKeys = arrAdd(expandedKeys, key2);
} else {
expandedKeys = arrDel(expandedKeys, key2);
}
_this2.setExpandedKeys(expandedKeys);
onExpand === null || onExpand === void 0 ? void 0 : onExpand(expandedKeys, {
node: treeNode,
expanded: targetExpanded,
nativeEvent: e2.nativeEvent
});
if (targetExpanded && loadData) {
var loadPromise = _this2.onNodeLoad(treeNode);
if (loadPromise) {
loadPromise.then(function() {
var newFlattenTreeData = flattenTreeData(_this2.state.treeData, expandedKeys, fieldNames);
_this2.setUncontrolledState({
flattenNodes: newFlattenTreeData
});
}).catch(function() {
var currentExpandedKeys = _this2.state.expandedKeys;
var expandedKeysToRestore = arrDel(currentExpandedKeys, key2);
_this2.setExpandedKeys(expandedKeysToRestore);
});
}
}
};
_this2.onListChangeStart = function() {
_this2.setUncontrolledState({
listChanging: true
});
};
_this2.onListChangeEnd = function() {
setTimeout(function() {
_this2.setUncontrolledState({
listChanging: false
});
});
};
_this2.onActiveChange = function(newActiveKey) {
var activeKey = _this2.state.activeKey;
var onActiveChange = _this2.props.onActiveChange;
if (activeKey === newActiveKey) {
return;
}
_this2.setState({
activeKey: newActiveKey
});
if (newActiveKey !== null) {
_this2.scrollTo({
key: newActiveKey
});
}
onActiveChange === null || onActiveChange === void 0 ? void 0 : onActiveChange(newActiveKey);
};
_this2.getActiveItem = function() {
var _this$state11 = _this2.state, activeKey = _this$state11.activeKey, flattenNodes = _this$state11.flattenNodes;
if (activeKey === null) {
return null;
}
return flattenNodes.find(function(_ref2) {
var key2 = _ref2.key;
return key2 === activeKey;
}) || null;
};
_this2.offsetActiveKey = function(offset2) {
var _this$state12 = _this2.state, flattenNodes = _this$state12.flattenNodes, activeKey = _this$state12.activeKey;
var index2 = flattenNodes.findIndex(function(_ref3) {
var key3 = _ref3.key;
return key3 === activeKey;
});
if (index2 === -1 && offset2 < 0) {
index2 = flattenNodes.length;
}
index2 = (index2 + offset2 + flattenNodes.length) % flattenNodes.length;
var item = flattenNodes[index2];
if (item) {
var key2 = item.key;
_this2.onActiveChange(key2);
} else {
_this2.onActiveChange(null);
}
};
_this2.onKeyDown = function(event) {
var _this$state13 = _this2.state, activeKey = _this$state13.activeKey, expandedKeys = _this$state13.expandedKeys, checkedKeys = _this$state13.checkedKeys, fieldNames = _this$state13.fieldNames;
var _this$props9 = _this2.props, onKeyDown2 = _this$props9.onKeyDown, checkable = _this$props9.checkable, selectable = _this$props9.selectable;
switch (event.which) {
case KeyCode.UP: {
_this2.offsetActiveKey(-1);
event.preventDefault();
break;
}
case KeyCode.DOWN: {
_this2.offsetActiveKey(1);
event.preventDefault();
break;
}
}
var activeItem = _this2.getActiveItem();
if (activeItem && activeItem.data) {
var treeNodeRequiredProps = _this2.getTreeNodeRequiredProps();
var expandable = activeItem.data.isLeaf === false || !!(activeItem.data[fieldNames.children] || []).length;
var eventNode = convertNodePropsToEventData(_objectSpread2$a(_objectSpread2$a({}, getTreeNodeProps(activeKey, treeNodeRequiredProps)), {}, {
data: activeItem.data,
active: true
}));
switch (event.which) {
case KeyCode.LEFT: {
if (expandable && expandedKeys.includes(activeKey)) {
_this2.onNodeExpand({}, eventNode);
} else if (activeItem.parent) {
_this2.onActiveChange(activeItem.parent.key);
}
event.preventDefault();
break;
}
case KeyCode.RIGHT: {
if (expandable && !expandedKeys.includes(activeKey)) {
_this2.onNodeExpand({}, eventNode);
} else if (activeItem.children && activeItem.children.length) {
_this2.onActiveChange(activeItem.children[0].key);
}
event.preventDefault();
break;
}
case KeyCode.ENTER:
case KeyCode.SPACE: {
if (checkable && !eventNode.disabled && eventNode.checkable !== false && !eventNode.disableCheckbox) {
_this2.onNodeCheck({}, eventNode, !checkedKeys.includes(activeKey));
} else if (!checkable && selectable && !eventNode.disabled && eventNode.selectable !== false) {
_this2.onNodeSelect({}, eventNode);
}
break;
}
}
}
onKeyDown2 === null || onKeyDown2 === void 0 ? void 0 : onKeyDown2(event);
};
_this2.setUncontrolledState = function(state) {
var atomic = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
var forceState = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : null;
if (!_this2.destroyed) {
var needSync = false;
var allPassed = true;
var newState = {};
Object.keys(state).forEach(function(name2) {
if (name2 in _this2.props) {
allPassed = false;
return;
}
needSync = true;
newState[name2] = state[name2];
});
if (needSync && (!atomic || allPassed)) {
_this2.setState(_objectSpread2$a(_objectSpread2$a({}, newState), forceState));
}
}
};
_this2.scrollTo = function(scroll) {
_this2.listRef.current.scrollTo(scroll);
};
return _this2;
}
_createClass(Tree2, [{
key: "componentDidMount",
value: function componentDidMount() {
this.destroyed = false;
this.onUpdated();
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate() {
this.onUpdated();
}
}, {
key: "onUpdated",
value: function onUpdated() {
var activeKey = this.props.activeKey;
if (activeKey !== void 0 && activeKey !== this.state.activeKey) {
this.setState({
activeKey
});
if (activeKey !== null) {
this.scrollTo({
key: activeKey
});
}
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
window.removeEventListener("dragend", this.onWindowDragEnd);
this.destroyed = true;
}
}, {
key: "resetDragState",
value: function resetDragState() {
this.setState({
dragOverNodeKey: null,
dropPosition: null,
dropLevelOffset: null,
dropTargetKey: null,
dropContainerKey: null,
dropTargetPos: null,
dropAllowed: false
});
}
}, {
key: "render",
value: function render2() {
var _classNames;
var _this$state14 = this.state, focused = _this$state14.focused, flattenNodes = _this$state14.flattenNodes, keyEntities = _this$state14.keyEntities, draggingNodeKey = _this$state14.draggingNodeKey, activeKey = _this$state14.activeKey, dropLevelOffset = _this$state14.dropLevelOffset, dropContainerKey = _this$state14.dropContainerKey, dropTargetKey = _this$state14.dropTargetKey, dropPosition = _this$state14.dropPosition, dragOverNodeKey = _this$state14.dragOverNodeKey, indent = _this$state14.indent;
var _this$props10 = this.props, prefixCls = _this$props10.prefixCls, className = _this$props10.className, style2 = _this$props10.style, showLine = _this$props10.showLine, focusable2 = _this$props10.focusable, _this$props10$tabInde = _this$props10.tabIndex, tabIndex = _this$props10$tabInde === void 0 ? 0 : _this$props10$tabInde, selectable = _this$props10.selectable, showIcon = _this$props10.showIcon, icon = _this$props10.icon, switcherIcon = _this$props10.switcherIcon, draggable = _this$props10.draggable, checkable = _this$props10.checkable, checkStrictly = _this$props10.checkStrictly, disabled = _this$props10.disabled, motion2 = _this$props10.motion, loadData = _this$props10.loadData, filterTreeNode = _this$props10.filterTreeNode, height = _this$props10.height, itemHeight = _this$props10.itemHeight, virtual = _this$props10.virtual, titleRender = _this$props10.titleRender, dropIndicatorRender2 = _this$props10.dropIndicatorRender, onContextMenu = _this$props10.onContextMenu, onScroll = _this$props10.onScroll, direction = _this$props10.direction, rootClassName = _this$props10.rootClassName, rootStyle = _this$props10.rootStyle;
var domProps = pickAttrs(this.props, {
aria: true,
data: true
});
var draggableConfig;
if (draggable) {
if (_typeof$q(draggable) === "object") {
draggableConfig = draggable;
} else if (typeof draggable === "function") {
draggableConfig = {
nodeDraggable: draggable
};
} else {
draggableConfig = {};
}
}
return /* @__PURE__ */ jsx(TreeContext.Provider, {
value: {
prefixCls,
selectable,
showIcon,
icon,
switcherIcon,
draggable: draggableConfig,
draggingNodeKey,
checkable,
checkStrictly,
disabled,
keyEntities,
dropLevelOffset,
dropContainerKey,
dropTargetKey,
dropPosition,
dragOverNodeKey,
indent,
direction,
dropIndicatorRender: dropIndicatorRender2,
loadData,
filterTreeNode,
titleRender,
onNodeClick: this.onNodeClick,
onNodeDoubleClick: this.onNodeDoubleClick,
onNodeExpand: this.onNodeExpand,
onNodeSelect: this.onNodeSelect,
onNodeCheck: this.onNodeCheck,
onNodeLoad: this.onNodeLoad,
onNodeMouseEnter: this.onNodeMouseEnter,
onNodeMouseLeave: this.onNodeMouseLeave,
onNodeContextMenu: this.onNodeContextMenu,
onNodeDragStart: this.onNodeDragStart,
onNodeDragEnter: this.onNodeDragEnter,
onNodeDragOver: this.onNodeDragOver,
onNodeDragLeave: this.onNodeDragLeave,
onNodeDragEnd: this.onNodeDragEnd,
onNodeDrop: this.onNodeDrop
},
children: /* @__PURE__ */ jsx("div", {
role: "tree",
className: classnames(prefixCls, className, rootClassName, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-show-line"), showLine), _defineProperty$b(_classNames, "".concat(prefixCls, "-focused"), focused), _defineProperty$b(_classNames, "".concat(prefixCls, "-active-focused"), activeKey !== null), _classNames)),
style: rootStyle,
children: /* @__PURE__ */ jsx(NodeList, {
ref: this.listRef,
prefixCls,
style: style2,
data: flattenNodes,
disabled,
selectable,
checkable: !!checkable,
motion: motion2,
dragging: draggingNodeKey !== null,
height,
itemHeight,
virtual,
focusable: focusable2,
focused,
tabIndex,
activeItem: this.getActiveItem(),
onFocus: this.onFocus,
onBlur: this.onBlur,
onKeyDown: this.onKeyDown,
onActiveChange: this.onActiveChange,
onListChangeStart: this.onListChangeStart,
onListChangeEnd: this.onListChangeEnd,
onContextMenu,
onScroll,
...this.getTreeNodeRequiredProps(),
...domProps
})
})
});
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(props, prevState) {
var prevProps = prevState.prevProps;
var newState = {
prevProps: props
};
function needSync(name2) {
return !prevProps && name2 in props || prevProps && prevProps[name2] !== props[name2];
}
var treeData;
var fieldNames = prevState.fieldNames;
if (needSync("fieldNames")) {
fieldNames = fillFieldNames$1(props.fieldNames);
newState.fieldNames = fieldNames;
}
if (needSync("treeData")) {
treeData = props.treeData;
} else if (needSync("children")) {
warningOnce(false, "`children` of Tree is deprecated. Please use `treeData` instead.");
treeData = convertTreeToData(props.children);
}
if (treeData) {
newState.treeData = treeData;
var entitiesMap = convertDataToEntities(treeData, {
fieldNames
});
newState.keyEntities = _objectSpread2$a(_defineProperty$b({}, MOTION_KEY, MotionEntity), entitiesMap.keyEntities);
}
var keyEntities = newState.keyEntities || prevState.keyEntities;
if (needSync("expandedKeys") || prevProps && needSync("autoExpandParent")) {
newState.expandedKeys = props.autoExpandParent || !prevProps && props.defaultExpandParent ? conductExpandParent(props.expandedKeys, keyEntities) : props.expandedKeys;
} else if (!prevProps && props.defaultExpandAll) {
var cloneKeyEntities = _objectSpread2$a({}, keyEntities);
delete cloneKeyEntities[MOTION_KEY];
newState.expandedKeys = Object.keys(cloneKeyEntities).map(function(key2) {
return cloneKeyEntities[key2].key;
});
} else if (!prevProps && props.defaultExpandedKeys) {
newState.expandedKeys = props.autoExpandParent || props.defaultExpandParent ? conductExpandParent(props.defaultExpandedKeys, keyEntities) : props.defaultExpandedKeys;
}
if (!newState.expandedKeys) {
delete newState.expandedKeys;
}
if (treeData || newState.expandedKeys) {
var flattenNodes = flattenTreeData(treeData || prevState.treeData, newState.expandedKeys || prevState.expandedKeys, fieldNames);
newState.flattenNodes = flattenNodes;
}
if (props.selectable) {
if (needSync("selectedKeys")) {
newState.selectedKeys = calcSelectedKeys(props.selectedKeys, props);
} else if (!prevProps && props.defaultSelectedKeys) {
newState.selectedKeys = calcSelectedKeys(props.defaultSelectedKeys, props);
}
}
if (props.checkable) {
var checkedKeyEntity;
if (needSync("checkedKeys")) {
checkedKeyEntity = parseCheckedKeys(props.checkedKeys) || {};
} else if (!prevProps && props.defaultCheckedKeys) {
checkedKeyEntity = parseCheckedKeys(props.defaultCheckedKeys) || {};
} else if (treeData) {
checkedKeyEntity = parseCheckedKeys(props.checkedKeys) || {
checkedKeys: prevState.checkedKeys,
halfCheckedKeys: prevState.halfCheckedKeys
};
}
if (checkedKeyEntity) {
var _checkedKeyEntity = checkedKeyEntity, _checkedKeyEntity$che = _checkedKeyEntity.checkedKeys, checkedKeys = _checkedKeyEntity$che === void 0 ? [] : _checkedKeyEntity$che, _checkedKeyEntity$hal = _checkedKeyEntity.halfCheckedKeys, halfCheckedKeys = _checkedKeyEntity$hal === void 0 ? [] : _checkedKeyEntity$hal;
if (!props.checkStrictly) {
var conductKeys = conductCheck(checkedKeys, true, keyEntities);
checkedKeys = conductKeys.checkedKeys;
halfCheckedKeys = conductKeys.halfCheckedKeys;
}
newState.checkedKeys = checkedKeys;
newState.halfCheckedKeys = halfCheckedKeys;
}
}
if (needSync("loadedKeys")) {
newState.loadedKeys = props.loadedKeys;
}
return newState;
}
}]);
return Tree2;
}(React__namespace.Component);
Tree$3.defaultProps = {
prefixCls: "rc-tree",
showLine: false,
showIcon: true,
selectable: true,
multiple: false,
checkable: false,
disabled: false,
checkStrictly: false,
draggable: false,
defaultExpandParent: true,
autoExpandParent: false,
defaultExpandAll: false,
defaultExpandedKeys: [],
defaultCheckedKeys: [],
defaultSelectedKeys: [],
dropIndicatorRender: DropIndicator,
allowDrop: function allowDrop() {
return true;
},
expandAction: false
};
Tree$3.TreeNode = ContextTreeNode;
var HolderOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M300 276.5a56 56 0 1056-97 56 56 0 00-56 97zm0 284a56 56 0 1056-97 56 56 0 00-56 97zM640 228a56 56 0 10112 0 56 56 0 00-112 0zm0 284a56 56 0 10112 0 56 56 0 00-112 0zM300 844.5a56 56 0 1056-97 56 56 0 00-56 97zM640 796a56 56 0 10112 0 56 56 0 00-112 0z" } }] }, "name": "holder", "theme": "outlined" };
const HolderOutlinedSvg = HolderOutlined$2;
var HolderOutlined = function HolderOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: HolderOutlinedSvg
})
});
};
HolderOutlined.displayName = "HolderOutlined";
const HolderOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(HolderOutlined);
var offset = 4;
function dropIndicatorRender(props) {
var _style;
var dropPosition = props.dropPosition, dropLevelOffset = props.dropLevelOffset, prefixCls = props.prefixCls, indent = props.indent, _props$direction = props.direction, direction = _props$direction === void 0 ? "ltr" : _props$direction;
var startPosition = direction === "ltr" ? "left" : "right";
var endPosition = direction === "ltr" ? "right" : "left";
var style2 = (_style = {}, _defineProperty$b(_style, startPosition, -dropLevelOffset * indent + offset), _defineProperty$b(_style, endPosition, 0), _style);
switch (dropPosition) {
case -1:
style2.top = -3;
break;
case 1:
style2.bottom = -3;
break;
default:
style2.bottom = -3;
style2[startPosition] = indent + offset;
break;
}
return /* @__PURE__ */ jsx("div", {
style: style2,
className: "".concat(prefixCls, "-drop-indicator")
});
}
var CaretDownFilled$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "0 0 1024 1024", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M840.4 300H183.6c-19.7 0-30.7 20.8-18.5 35l328.4 380.8c9.4 10.9 27.5 10.9 37 0L858.9 335c12.2-14.2 1.2-35-18.5-35z" } }] }, "name": "caret-down", "theme": "filled" };
const CaretDownFilledSvg = CaretDownFilled$2;
var CaretDownFilled = function CaretDownFilled2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: CaretDownFilledSvg
})
});
};
CaretDownFilled.displayName = "CaretDownFilled";
const CaretDownFilled$1 = /* @__PURE__ */ React__namespace.forwardRef(CaretDownFilled);
var FileOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326zm1.8 562H232V136h302v216a42 42 0 0042 42h216v494z" } }] }, "name": "file", "theme": "outlined" };
const FileOutlinedSvg = FileOutlined$2;
var FileOutlined = function FileOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: FileOutlinedSvg
})
});
};
FileOutlined.displayName = "FileOutlined";
const FileOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(FileOutlined);
var MinusSquareOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M328 544h368c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z" } }, { "tag": "path", "attrs": { "d": "M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z" } }] }, "name": "minus-square", "theme": "outlined" };
const MinusSquareOutlinedSvg = MinusSquareOutlined$2;
var MinusSquareOutlined = function MinusSquareOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: MinusSquareOutlinedSvg
})
});
};
MinusSquareOutlined.displayName = "MinusSquareOutlined";
const MinusSquareOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(MinusSquareOutlined);
var PlusSquareOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M328 544h152v152c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V544h152c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H544V328c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v152H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z" } }, { "tag": "path", "attrs": { "d": "M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z" } }] }, "name": "plus-square", "theme": "outlined" };
const PlusSquareOutlinedSvg = PlusSquareOutlined$2;
var PlusSquareOutlined = function PlusSquareOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: PlusSquareOutlinedSvg
})
});
};
PlusSquareOutlined.displayName = "PlusSquareOutlined";
const PlusSquareOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(PlusSquareOutlined);
function renderSwitcherIcon(prefixCls, switcherIcon, showLine, treeNodeProps) {
var isLeaf = treeNodeProps.isLeaf, expanded = treeNodeProps.expanded, loading = treeNodeProps.loading;
if (loading) {
return /* @__PURE__ */ jsx(LoadingOutlined$1, {
className: "".concat(prefixCls, "-switcher-loading-icon")
});
}
var showLeafIcon;
if (showLine && _typeof$q(showLine) === "object") {
showLeafIcon = showLine.showLeafIcon;
}
if (isLeaf) {
if (!showLine) {
return null;
}
if (typeof showLeafIcon !== "boolean" && !!showLeafIcon) {
var leafIcon = typeof showLeafIcon === "function" ? showLeafIcon(treeNodeProps) : showLeafIcon;
var leafCls = "".concat(prefixCls, "-switcher-line-custom-icon");
if (isValidElement(leafIcon)) {
return cloneElement(leafIcon, {
className: classnames(leafIcon.props.className || "", leafCls)
});
}
return leafIcon;
}
return showLeafIcon ? /* @__PURE__ */ jsx(FileOutlined$1, {
className: "".concat(prefixCls, "-switcher-line-icon")
}) : /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-switcher-leaf-line")
});
}
var switcherCls = "".concat(prefixCls, "-switcher-icon");
var switcher = typeof switcherIcon === "function" ? switcherIcon(treeNodeProps) : switcherIcon;
if (isValidElement(switcher)) {
return cloneElement(switcher, {
className: classnames(switcher.props.className || "", switcherCls)
});
}
if (switcher) {
return switcher;
}
if (showLine) {
return expanded ? /* @__PURE__ */ jsx(MinusSquareOutlined$1, {
className: "".concat(prefixCls, "-switcher-line-icon")
}) : /* @__PURE__ */ jsx(PlusSquareOutlined$1, {
className: "".concat(prefixCls, "-switcher-line-icon")
});
}
return /* @__PURE__ */ jsx(CaretDownFilled$1, {
className: switcherCls
});
}
var Tree$2 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction, virtual = _React$useContext.virtual;
var customizePrefixCls = props.prefixCls, className = props.className, _props$showIcon = props.showIcon, showIcon = _props$showIcon === void 0 ? false : _props$showIcon, showLine = props.showLine, _switcherIcon = props.switcherIcon, _props$blockNode = props.blockNode, blockNode = _props$blockNode === void 0 ? false : _props$blockNode, children = props.children, _props$checkable = props.checkable, checkable = _props$checkable === void 0 ? false : _props$checkable, _props$selectable = props.selectable, selectable = _props$selectable === void 0 ? true : _props$selectable, draggable = props.draggable, _props$motion = props.motion, motion2 = _props$motion === void 0 ? _extends$3(_extends$3({}, collapseMotion$1), {
motionAppear: false
}) : _props$motion;
var prefixCls = getPrefixCls("tree", customizePrefixCls);
var newProps = _extends$3(_extends$3({}, props), {
checkable,
selectable,
showIcon,
motion: motion2,
blockNode,
showLine: Boolean(showLine),
dropIndicatorRender
});
var draggableConfig = React__namespace.useMemo(function() {
if (!draggable) {
return false;
}
var mergedDraggable = {};
switch (_typeof$q(draggable)) {
case "function":
mergedDraggable.nodeDraggable = draggable;
break;
case "object":
mergedDraggable = _extends$3({}, draggable);
break;
}
if (mergedDraggable.icon !== false) {
mergedDraggable.icon = mergedDraggable.icon || /* @__PURE__ */ jsx(HolderOutlined$1, {});
}
return mergedDraggable;
}, [draggable]);
return /* @__PURE__ */ jsx(Tree$3, {
itemHeight: 20,
ref,
virtual,
...newProps,
prefixCls,
className: classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-icon-hide"), !showIcon), _defineProperty$b(_classNames, "".concat(prefixCls, "-block-node"), blockNode), _defineProperty$b(_classNames, "".concat(prefixCls, "-unselectable"), !selectable), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className),
direction,
checkable: checkable ? /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-checkbox-inner")
}) : checkable,
selectable,
switcherIcon: function switcherIcon(nodeProps) {
return renderSwitcherIcon(prefixCls, _switcherIcon, showLine, nodeProps);
},
draggable: draggableConfig,
children
});
});
const TreePure = Tree$2;
var FolderOpenOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M928 444H820V330.4c0-17.7-14.3-32-32-32H473L355.7 186.2a8.15 8.15 0 00-5.5-2.2H96c-17.7 0-32 14.3-32 32v592c0 17.7 14.3 32 32 32h698c13 0 24.8-7.9 29.7-20l134-332c1.5-3.8 2.3-7.9 2.3-12 0-17.7-14.3-32-32-32zM136 256h188.5l119.6 114.4H748V444H238c-13 0-24.8 7.9-29.7 20L136 643.2V256zm635.3 512H159l103.3-256h612.4L771.3 768z" } }] }, "name": "folder-open", "theme": "outlined" };
const FolderOpenOutlinedSvg = FolderOpenOutlined$2;
var FolderOpenOutlined = function FolderOpenOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: FolderOpenOutlinedSvg
})
});
};
FolderOpenOutlined.displayName = "FolderOpenOutlined";
const FolderOpenOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(FolderOpenOutlined);
var FolderOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M880 298.4H521L403.7 186.2a8.15 8.15 0 00-5.5-2.2H144c-17.7 0-32 14.3-32 32v592c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V330.4c0-17.7-14.3-32-32-32zM840 768H184V256h188.5l119.6 114.4H840V768z" } }] }, "name": "folder", "theme": "outlined" };
const FolderOutlinedSvg = FolderOutlined$2;
var FolderOutlined = function FolderOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: FolderOutlinedSvg
})
});
};
FolderOutlined.displayName = "FolderOutlined";
const FolderOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(FolderOutlined);
var Record;
(function(Record2) {
Record2[Record2["None"] = 0] = "None";
Record2[Record2["Start"] = 1] = "Start";
Record2[Record2["End"] = 2] = "End";
})(Record || (Record = {}));
function traverseNodesKey(treeData, callback) {
function processNode(dataNode) {
var key2 = dataNode.key, children = dataNode.children;
if (callback(key2, dataNode) !== false) {
traverseNodesKey(children || [], callback);
}
}
treeData.forEach(processNode);
}
function calcRangeKeys(_ref) {
var treeData = _ref.treeData, expandedKeys = _ref.expandedKeys, startKey = _ref.startKey, endKey = _ref.endKey;
var keys2 = [];
var record = Record.None;
if (startKey && startKey === endKey) {
return [startKey];
}
if (!startKey || !endKey) {
return [];
}
function matchKey(key2) {
return key2 === startKey || key2 === endKey;
}
traverseNodesKey(treeData, function(key2) {
if (record === Record.End) {
return false;
}
if (matchKey(key2)) {
keys2.push(key2);
if (record === Record.None) {
record = Record.Start;
} else if (record === Record.Start) {
record = Record.End;
return false;
}
} else if (record === Record.Start) {
keys2.push(key2);
}
return expandedKeys.includes(key2);
});
return keys2;
}
function convertDirectoryKeysToNodes(treeData, keys2) {
var restKeys = _toConsumableArray$c(keys2);
var nodes = [];
traverseNodesKey(treeData, function(key2, node) {
var index2 = restKeys.indexOf(key2);
if (index2 !== -1) {
nodes.push(node);
restKeys.splice(index2, 1);
}
return !!restKeys.length;
});
return nodes;
}
var __rest$4 = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
function getIcon(props) {
var isLeaf = props.isLeaf, expanded = props.expanded;
if (isLeaf) {
return /* @__PURE__ */ jsx(FileOutlined$1, {});
}
return expanded ? /* @__PURE__ */ jsx(FolderOpenOutlined$1, {}) : /* @__PURE__ */ jsx(FolderOutlined$1, {});
}
function getTreeData(_ref) {
var treeData = _ref.treeData, children = _ref.children;
return treeData || convertTreeToData(children);
}
var DirectoryTree = function DirectoryTree2(_a, ref) {
var defaultExpandAll = _a.defaultExpandAll, defaultExpandParent = _a.defaultExpandParent, defaultExpandedKeys = _a.defaultExpandedKeys, props = __rest$4(_a, ["defaultExpandAll", "defaultExpandParent", "defaultExpandedKeys"]);
var lastSelectedKey = React__namespace.useRef();
var cachedSelectedKeys = React__namespace.useRef();
var getInitExpandedKeys = function getInitExpandedKeys2() {
var _convertDataToEntitie = convertDataToEntities(getTreeData(props)), keyEntities = _convertDataToEntitie.keyEntities;
var initExpandedKeys;
if (defaultExpandAll) {
initExpandedKeys = Object.keys(keyEntities);
} else if (defaultExpandParent) {
initExpandedKeys = conductExpandParent(props.expandedKeys || defaultExpandedKeys || [], keyEntities);
} else {
initExpandedKeys = props.expandedKeys || defaultExpandedKeys;
}
return initExpandedKeys;
};
var _React$useState = React__namespace.useState(props.selectedKeys || props.defaultSelectedKeys || []), _React$useState2 = _slicedToArray$e(_React$useState, 2), selectedKeys = _React$useState2[0], setSelectedKeys = _React$useState2[1];
var _React$useState3 = React__namespace.useState(function() {
return getInitExpandedKeys();
}), _React$useState4 = _slicedToArray$e(_React$useState3, 2), expandedKeys = _React$useState4[0], setExpandedKeys = _React$useState4[1];
React__namespace.useEffect(function() {
if ("selectedKeys" in props) {
setSelectedKeys(props.selectedKeys);
}
}, [props.selectedKeys]);
React__namespace.useEffect(function() {
if ("expandedKeys" in props) {
setExpandedKeys(props.expandedKeys);
}
}, [props.expandedKeys]);
var onExpand = function onExpand2(keys2, info) {
var _a2;
if (!("expandedKeys" in props)) {
setExpandedKeys(keys2);
}
return (_a2 = props.onExpand) === null || _a2 === void 0 ? void 0 : _a2.call(props, keys2, info);
};
var onSelect = function onSelect2(keys2, event) {
var _a2;
var multiple = props.multiple;
var node = event.node, nativeEvent = event.nativeEvent;
var _node$key = node.key, key2 = _node$key === void 0 ? "" : _node$key;
var treeData = getTreeData(props);
var newEvent = _extends$3(_extends$3({}, event), {
selected: true
});
var ctrlPick = (nativeEvent === null || nativeEvent === void 0 ? void 0 : nativeEvent.ctrlKey) || (nativeEvent === null || nativeEvent === void 0 ? void 0 : nativeEvent.metaKey);
var shiftPick = nativeEvent === null || nativeEvent === void 0 ? void 0 : nativeEvent.shiftKey;
var newSelectedKeys;
if (multiple && ctrlPick) {
newSelectedKeys = keys2;
lastSelectedKey.current = key2;
cachedSelectedKeys.current = newSelectedKeys;
newEvent.selectedNodes = convertDirectoryKeysToNodes(treeData, newSelectedKeys);
} else if (multiple && shiftPick) {
newSelectedKeys = Array.from(new Set([].concat(_toConsumableArray$c(cachedSelectedKeys.current || []), _toConsumableArray$c(calcRangeKeys({
treeData,
expandedKeys,
startKey: key2,
endKey: lastSelectedKey.current
})))));
newEvent.selectedNodes = convertDirectoryKeysToNodes(treeData, newSelectedKeys);
} else {
newSelectedKeys = [key2];
lastSelectedKey.current = key2;
cachedSelectedKeys.current = newSelectedKeys;
newEvent.selectedNodes = convertDirectoryKeysToNodes(treeData, newSelectedKeys);
}
(_a2 = props.onSelect) === null || _a2 === void 0 ? void 0 : _a2.call(props, newSelectedKeys, newEvent);
if (!("selectedKeys" in props)) {
setSelectedKeys(newSelectedKeys);
}
};
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var customizePrefixCls = props.prefixCls, className = props.className, _props$showIcon = props.showIcon, showIcon = _props$showIcon === void 0 ? true : _props$showIcon, _props$expandAction = props.expandAction, expandAction = _props$expandAction === void 0 ? "click" : _props$expandAction, otherProps = __rest$4(props, ["prefixCls", "className", "showIcon", "expandAction"]);
var prefixCls = getPrefixCls("tree", customizePrefixCls);
var connectClassName = classnames("".concat(prefixCls, "-directory"), _defineProperty$b({}, "".concat(prefixCls, "-directory-rtl"), direction === "rtl"), className);
return /* @__PURE__ */ jsx(TreePure, {
icon: getIcon,
ref,
blockNode: true,
...otherProps,
showIcon,
expandAction,
prefixCls,
className: connectClassName,
expandedKeys,
selectedKeys,
onSelect,
onExpand
});
};
var ForwardDirectoryTree = /* @__PURE__ */ React__namespace.forwardRef(DirectoryTree);
const DirectoryTree$1 = ForwardDirectoryTree;
var Tree = TreePure;
Tree.DirectoryTree = DirectoryTree$1;
Tree.TreeNode = ContextTreeNode;
const Tree$1 = Tree;
function useSyncState(initialValue) {
var ref = React__namespace.useRef(initialValue);
var forceUpdate = useForceUpdate();
return [function() {
return ref.current;
}, function(newValue) {
ref.current = newValue;
forceUpdate();
}];
}
function FilterSearch(_ref) {
var value = _ref.value, onChange = _ref.onChange, filterSearch = _ref.filterSearch, tablePrefixCls = _ref.tablePrefixCls, locale2 = _ref.locale;
if (!filterSearch) {
return null;
}
return /* @__PURE__ */ jsx("div", {
className: "".concat(tablePrefixCls, "-filter-dropdown-search"),
children: /* @__PURE__ */ jsx(Input$2, {
prefix: /* @__PURE__ */ jsx(SearchOutlined$1, {}),
placeholder: locale2.filterSearchPlaceholder,
onChange,
value,
htmlSize: 1,
className: "".concat(tablePrefixCls, "-filter-dropdown-search-input")
})
});
}
var onKeyDown = function onKeyDown2(event) {
var keyCode = event.keyCode;
if (keyCode === KeyCode.ENTER) {
event.stopPropagation();
}
};
var FilterDropdownMenuWrapper = function FilterDropdownMenuWrapper2(props) {
return /* @__PURE__ */ jsx("div", {
className: props.className,
onClick: function onClick(e2) {
return e2.stopPropagation();
},
onKeyDown,
children: props.children
});
};
const FilterDropdownMenuWrapper$1 = FilterDropdownMenuWrapper;
function hasSubMenu(filters) {
return filters.some(function(_ref) {
var children = _ref.children;
return children;
});
}
function searchValueMatched(searchValue, text) {
if (typeof text === "string" || typeof text === "number") {
return text === null || text === void 0 ? void 0 : text.toString().toLowerCase().includes(searchValue.trim().toLowerCase());
}
return false;
}
function renderFilterItems(_ref2) {
var filters = _ref2.filters, prefixCls = _ref2.prefixCls, filteredKeys = _ref2.filteredKeys, filterMultiple = _ref2.filterMultiple, searchValue = _ref2.searchValue, filterSearch = _ref2.filterSearch;
return filters.map(function(filter2, index2) {
var key2 = String(filter2.value);
if (filter2.children) {
return {
key: key2 || index2,
label: filter2.text,
popupClassName: "".concat(prefixCls, "-dropdown-submenu"),
children: renderFilterItems({
filters: filter2.children,
prefixCls,
filteredKeys,
filterMultiple,
searchValue,
filterSearch
})
};
}
var Component = filterMultiple ? _Checkbox : _Radio;
var item = {
key: filter2.value !== void 0 ? key2 : index2,
label: /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(Component, {
checked: filteredKeys.includes(key2)
}), /* @__PURE__ */ jsx("span", {
children: filter2.text
})]
})
};
if (searchValue.trim()) {
if (typeof filterSearch === "function") {
return filterSearch(searchValue, filter2) ? item : null;
}
return searchValueMatched(searchValue, filter2.text) ? item : null;
}
return item;
});
}
function FilterDropdown(props) {
var _a;
var tablePrefixCls = props.tablePrefixCls, prefixCls = props.prefixCls, column = props.column, dropdownPrefixCls = props.dropdownPrefixCls, columnKey = props.columnKey, filterMultiple = props.filterMultiple, _props$filterMode = props.filterMode, filterMode = _props$filterMode === void 0 ? "menu" : _props$filterMode, _props$filterSearch = props.filterSearch, filterSearch = _props$filterSearch === void 0 ? false : _props$filterSearch, filterState = props.filterState, triggerFilter = props.triggerFilter, locale2 = props.locale, children = props.children, getPopupContainer = props.getPopupContainer;
var filterDropdownOpen = column.filterDropdownOpen, onFilterDropdownOpenChange = column.onFilterDropdownOpenChange, filterDropdownVisible = column.filterDropdownVisible, onFilterDropdownVisibleChange = column.onFilterDropdownVisibleChange, filterResetToDefaultFilteredValue = column.filterResetToDefaultFilteredValue, defaultFilteredValue = column.defaultFilteredValue;
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), visible = _React$useState2[0], setVisible = _React$useState2[1];
var filtered = !!(filterState && (((_a = filterState.filteredKeys) === null || _a === void 0 ? void 0 : _a.length) || filterState.forceFiltered));
var triggerVisible = function triggerVisible2(newVisible) {
setVisible(newVisible);
onFilterDropdownOpenChange === null || onFilterDropdownOpenChange === void 0 ? void 0 : onFilterDropdownOpenChange(newVisible);
onFilterDropdownVisibleChange === null || onFilterDropdownVisibleChange === void 0 ? void 0 : onFilterDropdownVisibleChange(newVisible);
};
var mergedVisible;
if (typeof filterDropdownOpen === "boolean") {
mergedVisible = filterDropdownOpen;
} else {
mergedVisible = typeof filterDropdownVisible === "boolean" ? filterDropdownVisible : visible;
}
var propFilteredKeys = filterState === null || filterState === void 0 ? void 0 : filterState.filteredKeys;
var _useSyncState = useSyncState(propFilteredKeys || []), _useSyncState2 = _slicedToArray$e(_useSyncState, 2), getFilteredKeysSync = _useSyncState2[0], setFilteredKeysSync = _useSyncState2[1];
var onSelectKeys = function onSelectKeys2(_ref3) {
var selectedKeys2 = _ref3.selectedKeys;
setFilteredKeysSync(selectedKeys2);
};
var onCheck = function onCheck2(keys2, _ref4) {
var node = _ref4.node, checked = _ref4.checked;
if (!filterMultiple) {
onSelectKeys({
selectedKeys: checked && node.key ? [node.key] : []
});
} else {
onSelectKeys({
selectedKeys: keys2
});
}
};
React__namespace.useEffect(function() {
if (!visible) {
return;
}
onSelectKeys({
selectedKeys: propFilteredKeys || []
});
}, [propFilteredKeys]);
var _React$useState3 = React__namespace.useState([]), _React$useState4 = _slicedToArray$e(_React$useState3, 2), openKeys = _React$useState4[0], setOpenKeys = _React$useState4[1];
var onOpenChange = function onOpenChange2(keys2) {
setOpenKeys(keys2);
};
var _React$useState5 = React__namespace.useState(""), _React$useState6 = _slicedToArray$e(_React$useState5, 2), searchValue = _React$useState6[0], setSearchValue = _React$useState6[1];
var onSearch = function onSearch2(e2) {
var value = e2.target.value;
setSearchValue(value);
};
React__namespace.useEffect(function() {
if (!visible) {
setSearchValue("");
}
}, [visible]);
var internalTriggerFilter = function internalTriggerFilter2(keys2) {
var mergedKeys = keys2 && keys2.length ? keys2 : null;
if (mergedKeys === null && (!filterState || !filterState.filteredKeys)) {
return null;
}
if (isEqual_1(mergedKeys, filterState === null || filterState === void 0 ? void 0 : filterState.filteredKeys)) {
return null;
}
triggerFilter({
column,
key: columnKey,
filteredKeys: mergedKeys
});
};
var onConfirm = function onConfirm2() {
triggerVisible(false);
internalTriggerFilter(getFilteredKeysSync());
};
var onReset = function onReset2() {
var _ref5 = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {
confirm: false,
closeDropdown: false
}, confirm = _ref5.confirm, closeDropdown = _ref5.closeDropdown;
if (confirm) {
internalTriggerFilter([]);
}
if (closeDropdown) {
triggerVisible(false);
}
setSearchValue("");
if (filterResetToDefaultFilteredValue) {
setFilteredKeysSync((defaultFilteredValue || []).map(function(key2) {
return String(key2);
}));
} else {
setFilteredKeysSync([]);
}
};
var doFilter = function doFilter2() {
var _ref6 = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {
closeDropdown: true
}, closeDropdown = _ref6.closeDropdown;
if (closeDropdown) {
triggerVisible(false);
}
internalTriggerFilter(getFilteredKeysSync());
};
var onVisibleChange = function onVisibleChange2(newVisible) {
if (newVisible && propFilteredKeys !== void 0) {
setFilteredKeysSync(propFilteredKeys || []);
}
triggerVisible(newVisible);
if (!newVisible && !column.filterDropdown) {
onConfirm();
}
};
var dropdownMenuClass = classnames(_defineProperty$b({}, "".concat(dropdownPrefixCls, "-menu-without-submenu"), !hasSubMenu(column.filters || [])));
var onCheckAll = function onCheckAll2(e2) {
if (e2.target.checked) {
var allFilterKeys = flattenKeys(column === null || column === void 0 ? void 0 : column.filters).map(function(key2) {
return String(key2);
});
setFilteredKeysSync(allFilterKeys);
} else {
setFilteredKeysSync([]);
}
};
var getTreeData2 = function getTreeData3(_ref7) {
var filters = _ref7.filters;
return (filters || []).map(function(filter2, index2) {
var key2 = String(filter2.value);
var item = {
title: filter2.text,
key: filter2.value !== void 0 ? key2 : index2
};
if (filter2.children) {
item.children = getTreeData3({
filters: filter2.children
});
}
return item;
});
};
var getFilterData2 = function getFilterData3(node) {
var _a2;
return _extends$3(_extends$3({}, node), {
text: node.title,
value: node.key,
children: ((_a2 = node.children) === null || _a2 === void 0 ? void 0 : _a2.map(function(item) {
return getFilterData3(item);
})) || []
});
};
var dropdownContent;
if (typeof column.filterDropdown === "function") {
dropdownContent = column.filterDropdown({
prefixCls: "".concat(dropdownPrefixCls, "-custom"),
setSelectedKeys: function setSelectedKeys(selectedKeys2) {
return onSelectKeys({
selectedKeys: selectedKeys2
});
},
selectedKeys: getFilteredKeysSync(),
confirm: doFilter,
clearFilters: onReset,
filters: column.filters,
visible: mergedVisible,
close: function close() {
triggerVisible(false);
}
});
} else if (column.filterDropdown) {
dropdownContent = column.filterDropdown;
} else {
var selectedKeys = getFilteredKeysSync() || [];
var getFilterComponent = function getFilterComponent2() {
if ((column.filters || []).length === 0) {
return /* @__PURE__ */ jsx(Empty$2, {
image: Empty$2.PRESENTED_IMAGE_SIMPLE,
description: locale2.filterEmptyText,
imageStyle: {
height: 24
},
style: {
margin: 0,
padding: "16px 0"
}
});
}
if (filterMode === "tree") {
return /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(FilterSearch, {
filterSearch,
value: searchValue,
onChange: onSearch,
tablePrefixCls,
locale: locale2
}), /* @__PURE__ */ jsxs("div", {
className: "".concat(tablePrefixCls, "-filter-dropdown-tree"),
children: [filterMultiple ? /* @__PURE__ */ jsx(_Checkbox, {
checked: selectedKeys.length === flattenKeys(column.filters).length,
indeterminate: selectedKeys.length > 0 && selectedKeys.length < flattenKeys(column.filters).length,
className: "".concat(tablePrefixCls, "-filter-dropdown-checkall"),
onChange: onCheckAll,
children: locale2.filterCheckall
}) : null, /* @__PURE__ */ jsx(Tree$1, {
checkable: true,
selectable: false,
blockNode: true,
multiple: filterMultiple,
checkStrictly: !filterMultiple,
className: "".concat(dropdownPrefixCls, "-menu"),
onCheck,
checkedKeys: selectedKeys,
selectedKeys,
showIcon: false,
treeData: getTreeData2({
filters: column.filters
}),
autoExpandParent: true,
defaultExpandAll: true,
filterTreeNode: searchValue.trim() ? function(node) {
if (typeof filterSearch === "function") {
return filterSearch(searchValue, getFilterData2(node));
}
return searchValueMatched(searchValue, node.title);
} : void 0
})]
})]
});
}
return /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(FilterSearch, {
filterSearch,
value: searchValue,
onChange: onSearch,
tablePrefixCls,
locale: locale2
}), /* @__PURE__ */ jsx(Menu$1, {
selectable: true,
multiple: filterMultiple,
prefixCls: "".concat(dropdownPrefixCls, "-menu"),
className: dropdownMenuClass,
onSelect: onSelectKeys,
onDeselect: onSelectKeys,
selectedKeys,
getPopupContainer,
openKeys,
onOpenChange,
items: renderFilterItems({
filters: column.filters || [],
filterSearch,
prefixCls,
filteredKeys: getFilteredKeysSync(),
filterMultiple,
searchValue
})
})]
});
};
var getResetDisabled = function getResetDisabled2() {
if (filterResetToDefaultFilteredValue) {
return isEqual_1((defaultFilteredValue || []).map(function(key2) {
return String(key2);
}), selectedKeys);
}
return selectedKeys.length === 0;
};
dropdownContent = /* @__PURE__ */ jsxs(Fragment, {
children: [getFilterComponent(), /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-dropdown-btns"),
children: [/* @__PURE__ */ jsx(Button$2, {
type: "link",
size: "small",
disabled: getResetDisabled(),
onClick: function onClick() {
return onReset();
},
children: locale2.filterReset
}), /* @__PURE__ */ jsx(Button$2, {
type: "primary",
size: "small",
onClick: onConfirm,
children: locale2.filterConfirm
})]
})]
});
}
if (column.filterDropdown) {
dropdownContent = /* @__PURE__ */ jsx(OverrideProvider, {
selectable: void 0,
children: dropdownContent
});
}
var menu = function menu2() {
return /* @__PURE__ */ jsx(FilterDropdownMenuWrapper$1, {
className: "".concat(prefixCls, "-dropdown"),
children: dropdownContent
});
};
var filterIcon;
if (typeof column.filterIcon === "function") {
filterIcon = column.filterIcon(filtered);
} else if (column.filterIcon) {
filterIcon = column.filterIcon;
} else {
filterIcon = /* @__PURE__ */ jsx(FilterFilled$1, {});
}
var _React$useContext = React__namespace.useContext(ConfigContext$1), direction = _React$useContext.direction;
return /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-column"),
children: [/* @__PURE__ */ jsx("span", {
className: "".concat(tablePrefixCls, "-column-title"),
children
}), /* @__PURE__ */ jsx(Dropdown$1, {
dropdownRender: menu,
trigger: ["click"],
open: mergedVisible,
onOpenChange: onVisibleChange,
getPopupContainer,
placement: direction === "rtl" ? "bottomLeft" : "bottomRight",
children: /* @__PURE__ */ jsx("span", {
role: "button",
tabIndex: -1,
className: classnames("".concat(prefixCls, "-trigger"), {
active: filtered
}),
onClick: function onClick(e2) {
e2.stopPropagation();
},
children: filterIcon
})
})]
});
}
function collectFilterStates(columns, init2, pos) {
var filterStates = [];
(columns || []).forEach(function(column, index2) {
var _a;
var columnPos = getColumnPos(index2, pos);
if (column.filters || "filterDropdown" in column || "onFilter" in column) {
if ("filteredValue" in column) {
var filteredValues = column.filteredValue;
if (!("filterDropdown" in column)) {
filteredValues = (_a = filteredValues === null || filteredValues === void 0 ? void 0 : filteredValues.map(String)) !== null && _a !== void 0 ? _a : filteredValues;
}
filterStates.push({
column,
key: getColumnKey(column, columnPos),
filteredKeys: filteredValues,
forceFiltered: column.filtered
});
} else {
filterStates.push({
column,
key: getColumnKey(column, columnPos),
filteredKeys: init2 && column.defaultFilteredValue ? column.defaultFilteredValue : void 0,
forceFiltered: column.filtered
});
}
}
if ("children" in column) {
filterStates = [].concat(_toConsumableArray$c(filterStates), _toConsumableArray$c(collectFilterStates(column.children, init2, columnPos)));
}
});
return filterStates;
}
function injectFilter(prefixCls, dropdownPrefixCls, columns, filterStates, triggerFilter, getPopupContainer, locale2, pos) {
return columns.map(function(column, index2) {
var columnPos = getColumnPos(index2, pos);
var _column$filterMultipl = column.filterMultiple, filterMultiple = _column$filterMultipl === void 0 ? true : _column$filterMultipl, filterMode = column.filterMode, filterSearch = column.filterSearch;
var newColumn = column;
if (newColumn.filters || newColumn.filterDropdown) {
var columnKey = getColumnKey(newColumn, columnPos);
var filterState = filterStates.find(function(_ref) {
var key2 = _ref.key;
return columnKey === key2;
});
newColumn = _extends$3(_extends$3({}, newColumn), {
title: function title(renderProps) {
return /* @__PURE__ */ jsx(FilterDropdown, {
tablePrefixCls: prefixCls,
prefixCls: "".concat(prefixCls, "-filter"),
dropdownPrefixCls,
column: newColumn,
columnKey,
filterState,
filterMultiple,
filterMode,
filterSearch,
triggerFilter,
locale: locale2,
getPopupContainer,
children: renderColumnTitle(column.title, renderProps)
});
}
});
}
if ("children" in newColumn) {
newColumn = _extends$3(_extends$3({}, newColumn), {
children: injectFilter(prefixCls, dropdownPrefixCls, newColumn.children, filterStates, triggerFilter, getPopupContainer, locale2, columnPos)
});
}
return newColumn;
});
}
function flattenKeys(filters) {
var keys2 = [];
(filters || []).forEach(function(_ref2) {
var value = _ref2.value, children = _ref2.children;
keys2.push(value);
if (children) {
keys2 = [].concat(_toConsumableArray$c(keys2), _toConsumableArray$c(flattenKeys(children)));
}
});
return keys2;
}
function generateFilterInfo(filterStates) {
var currentFilters = {};
filterStates.forEach(function(_ref3) {
var key2 = _ref3.key, filteredKeys = _ref3.filteredKeys, column = _ref3.column;
var filters = column.filters, filterDropdown = column.filterDropdown;
if (filterDropdown) {
currentFilters[key2] = filteredKeys || null;
} else if (Array.isArray(filteredKeys)) {
var keys2 = flattenKeys(filters);
currentFilters[key2] = keys2.filter(function(originKey) {
return filteredKeys.includes(String(originKey));
});
} else {
currentFilters[key2] = null;
}
});
return currentFilters;
}
function getFilterData(data, filterStates) {
return filterStates.reduce(function(currentData, filterState) {
var _filterState$column = filterState.column, onFilter = _filterState$column.onFilter, filters = _filterState$column.filters, filteredKeys = filterState.filteredKeys;
if (onFilter && filteredKeys && filteredKeys.length) {
return currentData.filter(function(record) {
return filteredKeys.some(function(key2) {
var keys2 = flattenKeys(filters);
var keyIndex = keys2.findIndex(function(k2) {
return String(k2) === String(key2);
});
var realKey = keyIndex !== -1 ? keys2[keyIndex] : key2;
return onFilter(realKey, record);
});
});
}
return currentData;
}, data);
}
function useFilter(_ref4) {
var prefixCls = _ref4.prefixCls, dropdownPrefixCls = _ref4.dropdownPrefixCls, mergedColumns = _ref4.mergedColumns, onFilterChange = _ref4.onFilterChange, getPopupContainer = _ref4.getPopupContainer, tableLocale = _ref4.locale;
var _React$useState = React__namespace.useState(function() {
return collectFilterStates(mergedColumns, true);
}), _React$useState2 = _slicedToArray$e(_React$useState, 2), filterStates = _React$useState2[0], setFilterStates = _React$useState2[1];
var mergedFilterStates = React__namespace.useMemo(function() {
var collectedStates = collectFilterStates(mergedColumns, false);
var filteredKeysIsAllNotControlled = true;
collectedStates.forEach(function(_ref5) {
var filteredKeys = _ref5.filteredKeys;
if (filteredKeys !== void 0) {
filteredKeysIsAllNotControlled = false;
}
});
if (filteredKeysIsAllNotControlled) {
return filterStates;
}
return collectedStates;
}, [mergedColumns, filterStates]);
var filters = React__namespace.useMemo(function() {
return generateFilterInfo(mergedFilterStates);
}, [mergedFilterStates]);
var triggerFilter = function triggerFilter2(filterState) {
var newFilterStates = mergedFilterStates.filter(function(_ref6) {
var key2 = _ref6.key;
return key2 !== filterState.key;
});
newFilterStates.push(filterState);
setFilterStates(newFilterStates);
onFilterChange(generateFilterInfo(newFilterStates), newFilterStates);
};
var transformColumns = function transformColumns2(innerColumns) {
return injectFilter(prefixCls, dropdownPrefixCls, innerColumns, mergedFilterStates, triggerFilter, getPopupContainer, tableLocale);
};
return [transformColumns, mergedFilterStates, filters];
}
function useLazyKVMap(data, childrenColumnName, getRowKey) {
var mapCacheRef = React__namespace.useRef({});
function getRecordByKey(key2) {
if (!mapCacheRef.current || mapCacheRef.current.data !== data || mapCacheRef.current.childrenColumnName !== childrenColumnName || mapCacheRef.current.getRowKey !== getRowKey) {
let dig = function(records) {
records.forEach(function(record, index2) {
var rowKey = getRowKey(record, index2);
kvMap.set(rowKey, record);
if (record && _typeof$q(record) === "object" && childrenColumnName in record) {
dig(record[childrenColumnName] || []);
}
});
};
var kvMap = /* @__PURE__ */ new Map();
dig(data);
mapCacheRef.current = {
data,
childrenColumnName,
kvMap,
getRowKey
};
}
return mapCacheRef.current.kvMap.get(key2);
}
return [getRecordByKey];
}
var __rest$3 = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var DEFAULT_PAGE_SIZE = 10;
function getPaginationParam(pagination, mergedPagination) {
var param = {
current: mergedPagination.current,
pageSize: mergedPagination.pageSize
};
var paginationObj = pagination && _typeof$q(pagination) === "object" ? pagination : {};
Object.keys(paginationObj).forEach(function(pageProp) {
var value = mergedPagination[pageProp];
if (typeof value !== "function") {
param[pageProp] = value;
}
});
return param;
}
function extendsObject() {
var result = {};
for (var _len = arguments.length, list = new Array(_len), _key = 0; _key < _len; _key++) {
list[_key] = arguments[_key];
}
list.forEach(function(obj) {
if (obj) {
Object.keys(obj).forEach(function(key2) {
var val = obj[key2];
if (val !== void 0) {
result[key2] = val;
}
});
}
});
return result;
}
function usePagination(total, pagination, onChange) {
var _a = pagination && _typeof$q(pagination) === "object" ? pagination : {}, _a$total = _a.total, paginationTotal = _a$total === void 0 ? 0 : _a$total, paginationObj = __rest$3(_a, ["total"]);
var _useState = React$a.useState(function() {
return {
current: "defaultCurrent" in paginationObj ? paginationObj.defaultCurrent : 1,
pageSize: "defaultPageSize" in paginationObj ? paginationObj.defaultPageSize : DEFAULT_PAGE_SIZE
};
}), _useState2 = _slicedToArray$e(_useState, 2), innerPagination = _useState2[0], setInnerPagination = _useState2[1];
var mergedPagination = extendsObject(innerPagination, paginationObj, {
total: paginationTotal > 0 ? paginationTotal : total
});
var maxPage = Math.ceil((paginationTotal || total) / mergedPagination.pageSize);
if (mergedPagination.current > maxPage) {
mergedPagination.current = maxPage || 1;
}
var refreshPagination = function refreshPagination2(current, pageSize) {
setInnerPagination({
current: current !== null && current !== void 0 ? current : 1,
pageSize: pageSize || mergedPagination.pageSize
});
};
var onInternalChange = function onInternalChange2(current, pageSize) {
var _a2;
if (pagination) {
(_a2 = pagination.onChange) === null || _a2 === void 0 ? void 0 : _a2.call(pagination, current, pageSize);
}
refreshPagination(current, pageSize);
onChange(current, pageSize || (mergedPagination === null || mergedPagination === void 0 ? void 0 : mergedPagination.pageSize));
};
if (pagination === false) {
return [{}, function() {
}];
}
return [_extends$3(_extends$3({}, mergedPagination), {
onChange: onInternalChange
}), refreshPagination];
}
var SELECTION_COLUMN = {};
var SELECTION_ALL = "SELECT_ALL";
var SELECTION_INVERT = "SELECT_INVERT";
var SELECTION_NONE = "SELECT_NONE";
var EMPTY_LIST$1 = [];
function flattenData(data, childrenColumnName) {
var list = [];
(data || []).forEach(function(record) {
list.push(record);
if (record && _typeof$q(record) === "object" && childrenColumnName in record) {
list = [].concat(_toConsumableArray$c(list), _toConsumableArray$c(flattenData(record[childrenColumnName], childrenColumnName)));
}
});
return list;
}
function useSelection(rowSelection, config) {
var _ref = rowSelection || {}, preserveSelectedRowKeys = _ref.preserveSelectedRowKeys, selectedRowKeys = _ref.selectedRowKeys, defaultSelectedRowKeys = _ref.defaultSelectedRowKeys, getCheckboxProps = _ref.getCheckboxProps, onSelectionChange = _ref.onChange, onSelect = _ref.onSelect, onSelectAll = _ref.onSelectAll, onSelectInvert = _ref.onSelectInvert, onSelectNone = _ref.onSelectNone, onSelectMultiple = _ref.onSelectMultiple, selectionColWidth = _ref.columnWidth, selectionType = _ref.type, selections = _ref.selections, fixed = _ref.fixed, customizeRenderCell = _ref.renderCell, hideSelectAll = _ref.hideSelectAll, _ref$checkStrictly = _ref.checkStrictly, checkStrictly = _ref$checkStrictly === void 0 ? true : _ref$checkStrictly;
var prefixCls = config.prefixCls, data = config.data, pageData = config.pageData, getRecordByKey = config.getRecordByKey, getRowKey = config.getRowKey, expandType = config.expandType, childrenColumnName = config.childrenColumnName, tableLocale = config.locale, getPopupContainer = config.getPopupContainer;
var _useMergedState = useMergedState(selectedRowKeys || defaultSelectedRowKeys || EMPTY_LIST$1, {
value: selectedRowKeys
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), mergedSelectedKeys = _useMergedState2[0], setMergedSelectedKeys = _useMergedState2[1];
var preserveRecordsRef = React__namespace.useRef(/* @__PURE__ */ new Map());
var updatePreserveRecordsCache = React$a.useCallback(function(keys2) {
if (preserveSelectedRowKeys) {
var newCache = /* @__PURE__ */ new Map();
keys2.forEach(function(key2) {
var record = getRecordByKey(key2);
if (!record && preserveRecordsRef.current.has(key2)) {
record = preserveRecordsRef.current.get(key2);
}
newCache.set(key2, record);
});
preserveRecordsRef.current = newCache;
}
}, [getRecordByKey, preserveSelectedRowKeys]);
React__namespace.useEffect(function() {
updatePreserveRecordsCache(mergedSelectedKeys);
}, [mergedSelectedKeys]);
var _useMemo = React$a.useMemo(function() {
return checkStrictly ? {
keyEntities: null
} : convertDataToEntities(data, {
externalGetKey: getRowKey,
childrenPropName: childrenColumnName
});
}, [data, getRowKey, checkStrictly, childrenColumnName]), keyEntities = _useMemo.keyEntities;
var flattedData = React$a.useMemo(function() {
return flattenData(pageData, childrenColumnName);
}, [pageData, childrenColumnName]);
var checkboxPropsMap = React$a.useMemo(function() {
var map = /* @__PURE__ */ new Map();
flattedData.forEach(function(record, index2) {
var key2 = getRowKey(record, index2);
var checkboxProps = (getCheckboxProps ? getCheckboxProps(record) : null) || {};
map.set(key2, checkboxProps);
});
return map;
}, [flattedData, getRowKey, getCheckboxProps]);
var isCheckboxDisabled = React$a.useCallback(function(r2) {
var _a;
return !!((_a = checkboxPropsMap.get(getRowKey(r2))) === null || _a === void 0 ? void 0 : _a.disabled);
}, [checkboxPropsMap, getRowKey]);
var _useMemo2 = React$a.useMemo(function() {
if (checkStrictly) {
return [mergedSelectedKeys || [], []];
}
var _conductCheck = conductCheck(mergedSelectedKeys, true, keyEntities, isCheckboxDisabled), checkedKeys = _conductCheck.checkedKeys, halfCheckedKeys = _conductCheck.halfCheckedKeys;
return [checkedKeys || [], halfCheckedKeys];
}, [mergedSelectedKeys, checkStrictly, keyEntities, isCheckboxDisabled]), _useMemo3 = _slicedToArray$e(_useMemo2, 2), derivedSelectedKeys = _useMemo3[0], derivedHalfSelectedKeys = _useMemo3[1];
var derivedSelectedKeySet = React$a.useMemo(function() {
var keys2 = selectionType === "radio" ? derivedSelectedKeys.slice(0, 1) : derivedSelectedKeys;
return new Set(keys2);
}, [derivedSelectedKeys, selectionType]);
var derivedHalfSelectedKeySet = React$a.useMemo(function() {
return selectionType === "radio" ? /* @__PURE__ */ new Set() : new Set(derivedHalfSelectedKeys);
}, [derivedHalfSelectedKeys, selectionType]);
var _useState = React$a.useState(null), _useState2 = _slicedToArray$e(_useState, 2), lastSelectedKey = _useState2[0], setLastSelectedKey = _useState2[1];
React__namespace.useEffect(function() {
if (!rowSelection) {
setMergedSelectedKeys(EMPTY_LIST$1);
}
}, [!!rowSelection]);
var setSelectedKeys = React$a.useCallback(function(keys2, method2) {
var availableKeys;
var records;
updatePreserveRecordsCache(keys2);
if (preserveSelectedRowKeys) {
availableKeys = keys2;
records = keys2.map(function(key2) {
return preserveRecordsRef.current.get(key2);
});
} else {
availableKeys = [];
records = [];
keys2.forEach(function(key2) {
var record = getRecordByKey(key2);
if (record !== void 0) {
availableKeys.push(key2);
records.push(record);
}
});
}
setMergedSelectedKeys(availableKeys);
onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(availableKeys, records, {
type: method2
});
}, [setMergedSelectedKeys, getRecordByKey, onSelectionChange, preserveSelectedRowKeys]);
var triggerSingleSelection = React$a.useCallback(function(key2, selected, keys2, event) {
if (onSelect) {
var rows = keys2.map(function(k2) {
return getRecordByKey(k2);
});
onSelect(getRecordByKey(key2), selected, rows, event);
}
setSelectedKeys(keys2, "single");
}, [onSelect, getRecordByKey, setSelectedKeys]);
var mergedSelections = React$a.useMemo(function() {
if (!selections || hideSelectAll) {
return null;
}
var selectionList = selections === true ? [SELECTION_ALL, SELECTION_INVERT, SELECTION_NONE] : selections;
return selectionList.map(function(selection) {
if (selection === SELECTION_ALL) {
return {
key: "all",
text: tableLocale.selectionAll,
onSelect: function onSelect2() {
setSelectedKeys(data.map(function(record, index2) {
return getRowKey(record, index2);
}).filter(function(key2) {
var checkProps = checkboxPropsMap.get(key2);
return !(checkProps === null || checkProps === void 0 ? void 0 : checkProps.disabled) || derivedSelectedKeySet.has(key2);
}), "all");
}
};
}
if (selection === SELECTION_INVERT) {
return {
key: "invert",
text: tableLocale.selectInvert,
onSelect: function onSelect2() {
var keySet = new Set(derivedSelectedKeySet);
pageData.forEach(function(record, index2) {
var key2 = getRowKey(record, index2);
var checkProps = checkboxPropsMap.get(key2);
if (!(checkProps === null || checkProps === void 0 ? void 0 : checkProps.disabled)) {
if (keySet.has(key2)) {
keySet["delete"](key2);
} else {
keySet.add(key2);
}
}
});
var keys2 = Array.from(keySet);
if (onSelectInvert) {
onSelectInvert(keys2);
}
setSelectedKeys(keys2, "invert");
}
};
}
if (selection === SELECTION_NONE) {
return {
key: "none",
text: tableLocale.selectNone,
onSelect: function onSelect2() {
onSelectNone === null || onSelectNone === void 0 ? void 0 : onSelectNone();
setSelectedKeys(Array.from(derivedSelectedKeySet).filter(function(key2) {
var checkProps = checkboxPropsMap.get(key2);
return checkProps === null || checkProps === void 0 ? void 0 : checkProps.disabled;
}), "none");
}
};
}
return selection;
}).map(function(selection) {
return _extends$3(_extends$3({}, selection), {
onSelect: function onSelect2() {
var _a2;
var _a;
for (var _len = arguments.length, rest = new Array(_len), _key = 0; _key < _len; _key++) {
rest[_key] = arguments[_key];
}
(_a = selection.onSelect) === null || _a === void 0 ? void 0 : (_a2 = _a).call.apply(_a2, [selection].concat(rest));
setLastSelectedKey(null);
}
});
});
}, [selections, derivedSelectedKeySet, pageData, getRowKey, onSelectInvert, setSelectedKeys]);
var transformColumns = React$a.useCallback(function(columns) {
var _a;
if (!rowSelection) {
return columns.filter(function(col) {
return col !== SELECTION_COLUMN;
});
}
var cloneColumns = _toConsumableArray$c(columns);
var keySet = new Set(derivedSelectedKeySet);
var recordKeys = flattedData.map(getRowKey).filter(function(key2) {
return !checkboxPropsMap.get(key2).disabled;
});
var checkedCurrentAll = recordKeys.every(function(key2) {
return keySet.has(key2);
});
var checkedCurrentSome = recordKeys.some(function(key2) {
return keySet.has(key2);
});
var onSelectAllChange = function onSelectAllChange2() {
var changeKeys = [];
if (checkedCurrentAll) {
recordKeys.forEach(function(key2) {
keySet["delete"](key2);
changeKeys.push(key2);
});
} else {
recordKeys.forEach(function(key2) {
if (!keySet.has(key2)) {
keySet.add(key2);
changeKeys.push(key2);
}
});
}
var keys2 = Array.from(keySet);
onSelectAll === null || onSelectAll === void 0 ? void 0 : onSelectAll(!checkedCurrentAll, keys2.map(function(k2) {
return getRecordByKey(k2);
}), changeKeys.map(function(k2) {
return getRecordByKey(k2);
}));
setSelectedKeys(keys2, "all");
setLastSelectedKey(null);
};
var title;
if (selectionType !== "radio") {
var customizeSelections;
if (mergedSelections) {
var menu = {
getPopupContainer,
items: mergedSelections.map(function(selection, index2) {
var key2 = selection.key, text = selection.text, onSelectionClick = selection.onSelect;
return {
key: key2 || index2,
onClick: function onClick() {
onSelectionClick === null || onSelectionClick === void 0 ? void 0 : onSelectionClick(recordKeys);
},
label: text
};
})
};
customizeSelections = /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-selection-extra"),
children: /* @__PURE__ */ jsx(Dropdown$1, {
menu,
getPopupContainer,
children: /* @__PURE__ */ jsx("span", {
children: /* @__PURE__ */ jsx(DownOutlined$4, {})
})
})
});
}
var allDisabledData = flattedData.map(function(record, index2) {
var key2 = getRowKey(record, index2);
var checkboxProps = checkboxPropsMap.get(key2) || {};
return _extends$3({
checked: keySet.has(key2)
}, checkboxProps);
}).filter(function(_ref2) {
var disabled = _ref2.disabled;
return disabled;
});
var allDisabled = !!allDisabledData.length && allDisabledData.length === flattedData.length;
var allDisabledAndChecked = allDisabled && allDisabledData.every(function(_ref3) {
var checked = _ref3.checked;
return checked;
});
var allDisabledSomeChecked = allDisabled && allDisabledData.some(function(_ref4) {
var checked = _ref4.checked;
return checked;
});
title = !hideSelectAll && /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-selection"),
children: [/* @__PURE__ */ jsx(_Checkbox, {
checked: !allDisabled ? !!flattedData.length && checkedCurrentAll : allDisabledAndChecked,
indeterminate: !allDisabled ? !checkedCurrentAll && checkedCurrentSome : !allDisabledAndChecked && allDisabledSomeChecked,
onChange: onSelectAllChange,
disabled: flattedData.length === 0 || allDisabled,
"aria-label": customizeSelections ? "Custom selection" : "Select all",
skipGroup: true
}), customizeSelections]
});
}
var renderCell;
if (selectionType === "radio") {
renderCell = function renderCell2(_, record, index2) {
var key2 = getRowKey(record, index2);
var checked = keySet.has(key2);
return {
node: /* @__PURE__ */ jsx(_Radio, {
...checkboxPropsMap.get(key2),
checked,
onClick: function onClick(e2) {
return e2.stopPropagation();
},
onChange: function onChange(event) {
if (!keySet.has(key2)) {
triggerSingleSelection(key2, true, [key2], event.nativeEvent);
}
}
}),
checked
};
};
} else {
renderCell = function renderCell2(_, record, index2) {
var _a2;
var key2 = getRowKey(record, index2);
var checked = keySet.has(key2);
var indeterminate = derivedHalfSelectedKeySet.has(key2);
var checkboxProps = checkboxPropsMap.get(key2);
var mergedIndeterminate;
if (expandType === "nest") {
mergedIndeterminate = indeterminate;
} else {
mergedIndeterminate = (_a2 = checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.indeterminate) !== null && _a2 !== void 0 ? _a2 : indeterminate;
}
return {
node: /* @__PURE__ */ jsx(_Checkbox, {
...checkboxProps,
indeterminate: mergedIndeterminate,
checked,
skipGroup: true,
onClick: function onClick(e2) {
return e2.stopPropagation();
},
onChange: function onChange(_ref5) {
var nativeEvent = _ref5.nativeEvent;
var shiftKey = nativeEvent.shiftKey;
var startIndex = -1;
var endIndex = -1;
if (shiftKey && checkStrictly) {
var pointKeys = /* @__PURE__ */ new Set([lastSelectedKey, key2]);
recordKeys.some(function(recordKey, recordIndex) {
if (pointKeys.has(recordKey)) {
if (startIndex === -1) {
startIndex = recordIndex;
} else {
endIndex = recordIndex;
return true;
}
}
return false;
});
}
if (endIndex !== -1 && startIndex !== endIndex && checkStrictly) {
var rangeKeys = recordKeys.slice(startIndex, endIndex + 1);
var changedKeys = [];
if (checked) {
rangeKeys.forEach(function(recordKey) {
if (keySet.has(recordKey)) {
changedKeys.push(recordKey);
keySet["delete"](recordKey);
}
});
} else {
rangeKeys.forEach(function(recordKey) {
if (!keySet.has(recordKey)) {
changedKeys.push(recordKey);
keySet.add(recordKey);
}
});
}
var keys2 = Array.from(keySet);
onSelectMultiple === null || onSelectMultiple === void 0 ? void 0 : onSelectMultiple(!checked, keys2.map(function(recordKey) {
return getRecordByKey(recordKey);
}), changedKeys.map(function(recordKey) {
return getRecordByKey(recordKey);
}));
setSelectedKeys(keys2, "multiple");
} else {
var originCheckedKeys = derivedSelectedKeys;
if (checkStrictly) {
var checkedKeys = checked ? arrDel(originCheckedKeys, key2) : arrAdd(originCheckedKeys, key2);
triggerSingleSelection(key2, !checked, checkedKeys, nativeEvent);
} else {
var result = conductCheck([].concat(_toConsumableArray$c(originCheckedKeys), [key2]), true, keyEntities, isCheckboxDisabled);
var _checkedKeys = result.checkedKeys, halfCheckedKeys = result.halfCheckedKeys;
var nextCheckedKeys = _checkedKeys;
if (checked) {
var tempKeySet = new Set(_checkedKeys);
tempKeySet["delete"](key2);
nextCheckedKeys = conductCheck(Array.from(tempKeySet), {
checked: false,
halfCheckedKeys
}, keyEntities, isCheckboxDisabled).checkedKeys;
}
triggerSingleSelection(key2, !checked, nextCheckedKeys, nativeEvent);
}
}
if (checked) {
setLastSelectedKey(null);
} else {
setLastSelectedKey(key2);
}
}
}),
checked
};
};
}
var renderSelectionCell = function renderSelectionCell2(_, record, index2) {
var _renderCell = renderCell(_, record, index2), node = _renderCell.node, checked = _renderCell.checked;
if (customizeRenderCell) {
return customizeRenderCell(checked, record, index2, node);
}
return node;
};
if (!cloneColumns.includes(SELECTION_COLUMN)) {
if (cloneColumns.findIndex(function(col) {
var _a2;
return ((_a2 = col[INTERNAL_COL_DEFINE]) === null || _a2 === void 0 ? void 0 : _a2.columnType) === "EXPAND_COLUMN";
}) === 0) {
var _cloneColumns = cloneColumns, _cloneColumns2 = _toArray$1(_cloneColumns), expandColumn = _cloneColumns2[0], restColumns = _cloneColumns2.slice(1);
cloneColumns = [expandColumn, SELECTION_COLUMN].concat(_toConsumableArray$c(restColumns));
} else {
cloneColumns = [SELECTION_COLUMN].concat(_toConsumableArray$c(cloneColumns));
}
}
var selectionColumnIndex = cloneColumns.indexOf(SELECTION_COLUMN);
cloneColumns = cloneColumns.filter(function(column, index2) {
return column !== SELECTION_COLUMN || index2 === selectionColumnIndex;
});
var prevCol = cloneColumns[selectionColumnIndex - 1];
var nextCol = cloneColumns[selectionColumnIndex + 1];
var mergedFixed = fixed;
if (mergedFixed === void 0) {
if ((nextCol === null || nextCol === void 0 ? void 0 : nextCol.fixed) !== void 0) {
mergedFixed = nextCol.fixed;
} else if ((prevCol === null || prevCol === void 0 ? void 0 : prevCol.fixed) !== void 0) {
mergedFixed = prevCol.fixed;
}
}
if (mergedFixed && prevCol && ((_a = prevCol[INTERNAL_COL_DEFINE]) === null || _a === void 0 ? void 0 : _a.columnType) === "EXPAND_COLUMN" && prevCol.fixed === void 0) {
prevCol.fixed = mergedFixed;
}
var selectionColumn = _defineProperty$b({
fixed: mergedFixed,
width: selectionColWidth,
className: "".concat(prefixCls, "-selection-column"),
title: rowSelection.columnTitle || title,
render: renderSelectionCell
}, INTERNAL_COL_DEFINE, {
className: "".concat(prefixCls, "-selection-col")
});
return cloneColumns.map(function(col) {
return col === SELECTION_COLUMN ? selectionColumn : col;
});
}, [getRowKey, flattedData, rowSelection, derivedSelectedKeys, derivedSelectedKeySet, derivedHalfSelectedKeySet, selectionColWidth, mergedSelections, expandType, lastSelectedKey, checkboxPropsMap, onSelectMultiple, triggerSingleSelection, isCheckboxDisabled]);
return [transformColumns, derivedSelectedKeySet];
}
var CaretDownOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "0 0 1024 1024", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M840.4 300H183.6c-19.7 0-30.7 20.8-18.5 35l328.4 380.8c9.4 10.9 27.5 10.9 37 0L858.9 335c12.2-14.2 1.2-35-18.5-35z" } }] }, "name": "caret-down", "theme": "outlined" };
const CaretDownOutlinedSvg = CaretDownOutlined$2;
var CaretDownOutlined = function CaretDownOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: CaretDownOutlinedSvg
})
});
};
CaretDownOutlined.displayName = "CaretDownOutlined";
const CaretDownOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(CaretDownOutlined);
var CaretUpOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "0 0 1024 1024", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M858.9 689L530.5 308.2c-9.4-10.9-27.5-10.9-37 0L165.1 689c-12.2 14.2-1.2 35 18.5 35h656.8c19.7 0 30.7-20.8 18.5-35z" } }] }, "name": "caret-up", "theme": "outlined" };
const CaretUpOutlinedSvg = CaretUpOutlined$2;
var CaretUpOutlined = function CaretUpOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: CaretUpOutlinedSvg
})
});
};
CaretUpOutlined.displayName = "CaretUpOutlined";
const CaretUpOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(CaretUpOutlined);
var ASCEND = "ascend";
var DESCEND = "descend";
function getMultiplePriority(column) {
if (_typeof$q(column.sorter) === "object" && typeof column.sorter.multiple === "number") {
return column.sorter.multiple;
}
return false;
}
function getSortFunction(sorter) {
if (typeof sorter === "function") {
return sorter;
}
if (sorter && _typeof$q(sorter) === "object" && sorter.compare) {
return sorter.compare;
}
return false;
}
function nextSortDirection(sortDirections, current) {
if (!current) {
return sortDirections[0];
}
return sortDirections[sortDirections.indexOf(current) + 1];
}
function collectSortStates(columns, init2, pos) {
var sortStates = [];
function pushState(column, columnPos) {
sortStates.push({
column,
key: getColumnKey(column, columnPos),
multiplePriority: getMultiplePriority(column),
sortOrder: column.sortOrder
});
}
(columns || []).forEach(function(column, index2) {
var columnPos = getColumnPos(index2, pos);
if (column.children) {
if ("sortOrder" in column) {
pushState(column, columnPos);
}
sortStates = [].concat(_toConsumableArray$c(sortStates), _toConsumableArray$c(collectSortStates(column.children, init2, columnPos)));
} else if (column.sorter) {
if ("sortOrder" in column) {
pushState(column, columnPos);
} else if (init2 && column.defaultSortOrder) {
sortStates.push({
column,
key: getColumnKey(column, columnPos),
multiplePriority: getMultiplePriority(column),
sortOrder: column.defaultSortOrder
});
}
}
});
return sortStates;
}
function injectSorter(prefixCls, columns, sorterStates, triggerSorter, defaultSortDirections, tableLocale, tableShowSorterTooltip, pos) {
return (columns || []).map(function(column, index2) {
var columnPos = getColumnPos(index2, pos);
var newColumn = column;
if (newColumn.sorter) {
var sortDirections = newColumn.sortDirections || defaultSortDirections;
var showSorterTooltip = newColumn.showSorterTooltip === void 0 ? tableShowSorterTooltip : newColumn.showSorterTooltip;
var columnKey = getColumnKey(newColumn, columnPos);
var sorterState = sorterStates.find(function(_ref) {
var key2 = _ref.key;
return key2 === columnKey;
});
var sorterOrder = sorterState ? sorterState.sortOrder : null;
var nextSortOrder = nextSortDirection(sortDirections, sorterOrder);
var upNode = sortDirections.includes(ASCEND) && /* @__PURE__ */ jsx(CaretUpOutlined$1, {
className: classnames("".concat(prefixCls, "-column-sorter-up"), {
active: sorterOrder === ASCEND
}),
role: "presentation"
});
var downNode = sortDirections.includes(DESCEND) && /* @__PURE__ */ jsx(CaretDownOutlined$1, {
className: classnames("".concat(prefixCls, "-column-sorter-down"), {
active: sorterOrder === DESCEND
}),
role: "presentation"
});
var _ref2 = tableLocale || {}, cancelSort = _ref2.cancelSort, triggerAsc = _ref2.triggerAsc, triggerDesc = _ref2.triggerDesc;
var sortTip = cancelSort;
if (nextSortOrder === DESCEND) {
sortTip = triggerDesc;
} else if (nextSortOrder === ASCEND) {
sortTip = triggerAsc;
}
var tooltipProps = _typeof$q(showSorterTooltip) === "object" ? showSorterTooltip : {
title: sortTip
};
newColumn = _extends$3(_extends$3({}, newColumn), {
className: classnames(newColumn.className, _defineProperty$b({}, "".concat(prefixCls, "-column-sort"), sorterOrder)),
title: function title(renderProps) {
var renderSortTitle = /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-column-sorters"),
children: [/* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-column-title"),
children: renderColumnTitle(column.title, renderProps)
}), /* @__PURE__ */ jsx("span", {
className: classnames("".concat(prefixCls, "-column-sorter"), _defineProperty$b({}, "".concat(prefixCls, "-column-sorter-full"), !!(upNode && downNode))),
children: /* @__PURE__ */ jsxs("span", {
className: "".concat(prefixCls, "-column-sorter-inner"),
children: [upNode, downNode]
})
})]
});
return showSorterTooltip ? /* @__PURE__ */ jsx(_Tooltip, {
...tooltipProps,
children: renderSortTitle
}) : renderSortTitle;
},
onHeaderCell: function onHeaderCell(col) {
var cell = column.onHeaderCell && column.onHeaderCell(col) || {};
var originOnClick = cell.onClick;
var originOKeyDown = cell.onKeyDown;
cell.onClick = function(event) {
triggerSorter({
column,
key: columnKey,
sortOrder: nextSortOrder,
multiplePriority: getMultiplePriority(column)
});
originOnClick === null || originOnClick === void 0 ? void 0 : originOnClick(event);
};
cell.onKeyDown = function(event) {
if (event.keyCode === KeyCode.ENTER) {
triggerSorter({
column,
key: columnKey,
sortOrder: nextSortOrder,
multiplePriority: getMultiplePriority(column)
});
originOKeyDown === null || originOKeyDown === void 0 ? void 0 : originOKeyDown(event);
}
};
var renderTitle = safeColumnTitle(column.title, {});
var displayTitle = renderTitle === null || renderTitle === void 0 ? void 0 : renderTitle.toString();
if (sorterOrder) {
cell["aria-sort"] = sorterOrder === "ascend" ? "ascending" : "descending";
} else {
cell["aria-label"] = displayTitle || "";
}
cell.className = classnames(cell.className, "".concat(prefixCls, "-column-has-sorters"));
cell.tabIndex = 0;
if (column.ellipsis) {
cell.title = (renderTitle !== null && renderTitle !== void 0 ? renderTitle : "").toString();
}
return cell;
}
});
}
if ("children" in newColumn) {
newColumn = _extends$3(_extends$3({}, newColumn), {
children: injectSorter(prefixCls, newColumn.children, sorterStates, triggerSorter, defaultSortDirections, tableLocale, tableShowSorterTooltip, columnPos)
});
}
return newColumn;
});
}
function stateToInfo(sorterStates) {
var column = sorterStates.column, sortOrder = sorterStates.sortOrder;
return {
column,
order: sortOrder,
field: column.dataIndex,
columnKey: column.key
};
}
function generateSorterInfo(sorterStates) {
var list = sorterStates.filter(function(_ref3) {
var sortOrder = _ref3.sortOrder;
return sortOrder;
}).map(stateToInfo);
if (list.length === 0 && sorterStates.length) {
return _extends$3(_extends$3({}, stateToInfo(sorterStates[sorterStates.length - 1])), {
column: void 0
});
}
if (list.length <= 1) {
return list[0] || {};
}
return list;
}
function getSortData(data, sortStates, childrenColumnName) {
var innerSorterStates = sortStates.slice().sort(function(a, b2) {
return b2.multiplePriority - a.multiplePriority;
});
var cloneData = data.slice();
var runningSorters = innerSorterStates.filter(function(_ref4) {
var sorter = _ref4.column.sorter, sortOrder = _ref4.sortOrder;
return getSortFunction(sorter) && sortOrder;
});
if (!runningSorters.length) {
return cloneData;
}
return cloneData.sort(function(record1, record2) {
for (var i2 = 0; i2 < runningSorters.length; i2 += 1) {
var sorterState = runningSorters[i2];
var sorter = sorterState.column.sorter, sortOrder = sorterState.sortOrder;
var compareFn = getSortFunction(sorter);
if (compareFn && sortOrder) {
var compareResult = compareFn(record1, record2, sortOrder);
if (compareResult !== 0) {
return sortOrder === ASCEND ? compareResult : -compareResult;
}
}
}
return 0;
}).map(function(record) {
var subRecords = record[childrenColumnName];
if (subRecords) {
return _extends$3(_extends$3({}, record), _defineProperty$b({}, childrenColumnName, getSortData(subRecords, sortStates, childrenColumnName)));
}
return record;
});
}
function useFilterSorter(_ref5) {
var prefixCls = _ref5.prefixCls, mergedColumns = _ref5.mergedColumns, onSorterChange = _ref5.onSorterChange, sortDirections = _ref5.sortDirections, tableLocale = _ref5.tableLocale, showSorterTooltip = _ref5.showSorterTooltip;
var _React$useState = React__namespace.useState(collectSortStates(mergedColumns, true)), _React$useState2 = _slicedToArray$e(_React$useState, 2), sortStates = _React$useState2[0], setSortStates = _React$useState2[1];
var mergedSorterStates = React__namespace.useMemo(function() {
var validate = true;
var collectedStates = collectSortStates(mergedColumns, false);
if (!collectedStates.length) {
return sortStates;
}
var validateStates = [];
function patchStates(state) {
if (validate) {
validateStates.push(state);
} else {
validateStates.push(_extends$3(_extends$3({}, state), {
sortOrder: null
}));
}
}
var multipleMode = null;
collectedStates.forEach(function(state) {
if (multipleMode === null) {
patchStates(state);
if (state.sortOrder) {
if (state.multiplePriority === false) {
validate = false;
} else {
multipleMode = true;
}
}
} else if (multipleMode && state.multiplePriority !== false) {
patchStates(state);
} else {
validate = false;
patchStates(state);
}
});
return validateStates;
}, [mergedColumns, sortStates]);
var columnTitleSorterProps = React__namespace.useMemo(function() {
var sortColumns = mergedSorterStates.map(function(_ref6) {
var column = _ref6.column, sortOrder = _ref6.sortOrder;
return {
column,
order: sortOrder
};
});
return {
sortColumns,
sortColumn: sortColumns[0] && sortColumns[0].column,
sortOrder: sortColumns[0] && sortColumns[0].order
};
}, [mergedSorterStates]);
function triggerSorter(sortState) {
var newSorterStates;
if (sortState.multiplePriority === false || !mergedSorterStates.length || mergedSorterStates[0].multiplePriority === false) {
newSorterStates = [sortState];
} else {
newSorterStates = [].concat(_toConsumableArray$c(mergedSorterStates.filter(function(_ref7) {
var key2 = _ref7.key;
return key2 !== sortState.key;
})), [sortState]);
}
setSortStates(newSorterStates);
onSorterChange(generateSorterInfo(newSorterStates), newSorterStates);
}
var transformColumns = function transformColumns2(innerColumns) {
return injectSorter(prefixCls, innerColumns, mergedSorterStates, triggerSorter, sortDirections, tableLocale, showSorterTooltip);
};
var getSorters = function getSorters2() {
return generateSorterInfo(mergedSorterStates);
};
return [transformColumns, mergedSorterStates, columnTitleSorterProps, getSorters];
}
function fillTitle(columns, columnTitleProps) {
return columns.map(function(column) {
var cloneColumn = _extends$3({}, column);
cloneColumn.title = renderColumnTitle(column.title, columnTitleProps);
if ("children" in cloneColumn) {
cloneColumn.children = fillTitle(cloneColumn.children, columnTitleProps);
}
return cloneColumn;
});
}
function useTitleColumns(columnTitleProps) {
var filledColumns = React__namespace.useCallback(function(columns) {
return fillTitle(columns, columnTitleProps);
}, [columnTitleProps]);
return [filledColumns];
}
var EMPTY_LIST = [];
function InternalTable(props, ref) {
var _classNames3;
var customizePrefixCls = props.prefixCls, className = props.className, style2 = props.style, customizeSize = props.size, bordered = props.bordered, customizeDropdownPrefixCls = props.dropdownPrefixCls, dataSource = props.dataSource, pagination = props.pagination, rowSelection = props.rowSelection, _props$rowKey = props.rowKey, rowKey = _props$rowKey === void 0 ? "key" : _props$rowKey, rowClassName = props.rowClassName, columns = props.columns, children = props.children, legacyChildrenColumnName = props.childrenColumnName, onChange = props.onChange, getPopupContainer = props.getPopupContainer, loading = props.loading, expandIcon = props.expandIcon, expandable = props.expandable, expandedRowRender = props.expandedRowRender, expandIconColumnIndex = props.expandIconColumnIndex, indentSize = props.indentSize, scroll = props.scroll, sortDirections = props.sortDirections, locale2 = props.locale, _props$showSorterTool = props.showSorterTooltip, showSorterTooltip = _props$showSorterTool === void 0 ? true : _props$showSorterTool;
[["filterDropdownVisible", "filterDropdownOpen"], ["onFilterDropdownVisibleChange", "onFilterDropdownOpenChange"]].forEach(function(_ref) {
var _ref2 = _slicedToArray$e(_ref, 2);
_ref2[0];
_ref2[1];
});
var baseColumns = React__namespace.useMemo(function() {
return columns || convertChildrenToColumns(children);
}, [columns, children]);
var needResponsive = React__namespace.useMemo(function() {
return baseColumns.some(function(col) {
return col.responsive;
});
}, [baseColumns]);
var screens2 = useBreakpoint(needResponsive);
var mergedColumns = React__namespace.useMemo(function() {
var matched = new Set(Object.keys(screens2).filter(function(m2) {
return screens2[m2];
}));
return baseColumns.filter(function(c2) {
return !c2.responsive || c2.responsive.some(function(r2) {
return matched.has(r2);
});
});
}, [baseColumns, screens2]);
var tableProps = omit(props, ["className", "style", "columns"]);
var size = React__namespace.useContext(SizeContext$1);
var _React$useContext = React__namespace.useContext(ConfigContext$1), _React$useContext$loc = _React$useContext.locale, contextLocale = _React$useContext$loc === void 0 ? defaultLocale : _React$useContext$loc, renderEmpty = _React$useContext.renderEmpty, direction = _React$useContext.direction;
var mergedSize = customizeSize || size;
var tableLocale = _extends$3(_extends$3({}, contextLocale.Table), locale2);
var rawData = dataSource || EMPTY_LIST;
var _React$useContext2 = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext2.getPrefixCls;
var prefixCls = getPrefixCls("table", customizePrefixCls);
var dropdownPrefixCls = getPrefixCls("dropdown", customizeDropdownPrefixCls);
var mergedExpandable = _extends$3({
childrenColumnName: legacyChildrenColumnName,
expandIconColumnIndex
}, expandable);
var _mergedExpandable$chi = mergedExpandable.childrenColumnName, childrenColumnName = _mergedExpandable$chi === void 0 ? "children" : _mergedExpandable$chi;
var expandType = React__namespace.useMemo(function() {
if (rawData.some(function(item) {
return item === null || item === void 0 ? void 0 : item[childrenColumnName];
})) {
return "nest";
}
if (expandedRowRender || expandable && expandable.expandedRowRender) {
return "row";
}
return null;
}, [rawData]);
var internalRefs = {
body: React__namespace.useRef()
};
var getRowKey = React__namespace.useMemo(function() {
if (typeof rowKey === "function") {
return rowKey;
}
return function(record) {
return record === null || record === void 0 ? void 0 : record[rowKey];
};
}, [rowKey]);
var _useLazyKVMap = useLazyKVMap(rawData, childrenColumnName, getRowKey), _useLazyKVMap2 = _slicedToArray$e(_useLazyKVMap, 1), getRecordByKey = _useLazyKVMap2[0];
var changeEventInfo = {};
var triggerOnChange = function triggerOnChange2(info, action) {
var reset = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : false;
var changeInfo = _extends$3(_extends$3({}, changeEventInfo), info);
if (reset) {
changeEventInfo.resetPagination();
if (changeInfo.pagination.current) {
changeInfo.pagination.current = 1;
}
if (pagination && pagination.onChange) {
pagination.onChange(1, changeInfo.pagination.pageSize);
}
}
if (scroll && scroll.scrollToFirstRowOnChange !== false && internalRefs.body.current) {
scrollTo$1(0, {
getContainer: function getContainer2() {
return internalRefs.body.current;
}
});
}
onChange === null || onChange === void 0 ? void 0 : onChange(changeInfo.pagination, changeInfo.filters, changeInfo.sorter, {
currentDataSource: getFilterData(getSortData(rawData, changeInfo.sorterStates, childrenColumnName), changeInfo.filterStates),
action
});
};
var onSorterChange = function onSorterChange2(sorter, sorterStates) {
triggerOnChange({
sorter,
sorterStates
}, "sort", false);
};
var _useSorter = useFilterSorter({
prefixCls,
mergedColumns,
onSorterChange,
sortDirections: sortDirections || ["ascend", "descend"],
tableLocale,
showSorterTooltip
}), _useSorter2 = _slicedToArray$e(_useSorter, 4), transformSorterColumns = _useSorter2[0], sortStates = _useSorter2[1], sorterTitleProps = _useSorter2[2], getSorters = _useSorter2[3];
var sortedData = React__namespace.useMemo(function() {
return getSortData(rawData, sortStates, childrenColumnName);
}, [rawData, sortStates]);
changeEventInfo.sorter = getSorters();
changeEventInfo.sorterStates = sortStates;
var onFilterChange = function onFilterChange2(filters2, filterStates2) {
triggerOnChange({
filters: filters2,
filterStates: filterStates2
}, "filter", true);
};
var _useFilter = useFilter({
prefixCls,
locale: tableLocale,
dropdownPrefixCls,
mergedColumns,
onFilterChange,
getPopupContainer
}), _useFilter2 = _slicedToArray$e(_useFilter, 3), transformFilterColumns = _useFilter2[0], filterStates = _useFilter2[1], filters = _useFilter2[2];
var mergedData = getFilterData(sortedData, filterStates);
changeEventInfo.filters = filters;
changeEventInfo.filterStates = filterStates;
var columnTitleProps = React__namespace.useMemo(function() {
var mergedFilters = {};
Object.keys(filters).forEach(function(filterKey) {
if (filters[filterKey] !== null) {
mergedFilters[filterKey] = filters[filterKey];
}
});
return _extends$3(_extends$3({}, sorterTitleProps), {
filters: mergedFilters
});
}, [sorterTitleProps, filters]);
var _useTitleColumns = useTitleColumns(columnTitleProps), _useTitleColumns2 = _slicedToArray$e(_useTitleColumns, 1), transformTitleColumns = _useTitleColumns2[0];
var onPaginationChange = function onPaginationChange2(current, pageSize) {
triggerOnChange({
pagination: _extends$3(_extends$3({}, changeEventInfo.pagination), {
current,
pageSize
})
}, "paginate");
};
var _usePagination = usePagination(mergedData.length, pagination, onPaginationChange), _usePagination2 = _slicedToArray$e(_usePagination, 2), mergedPagination = _usePagination2[0], resetPagination = _usePagination2[1];
changeEventInfo.pagination = pagination === false ? {} : getPaginationParam(pagination, mergedPagination);
changeEventInfo.resetPagination = resetPagination;
var pageData = React__namespace.useMemo(function() {
if (pagination === false || !mergedPagination.pageSize) {
return mergedData;
}
var _mergedPagination$cur = mergedPagination.current, current = _mergedPagination$cur === void 0 ? 1 : _mergedPagination$cur, total = mergedPagination.total, _mergedPagination$pag = mergedPagination.pageSize, pageSize = _mergedPagination$pag === void 0 ? DEFAULT_PAGE_SIZE : _mergedPagination$pag;
if (mergedData.length < total) {
if (mergedData.length > pageSize) {
return mergedData.slice((current - 1) * pageSize, current * pageSize);
}
return mergedData;
}
return mergedData.slice((current - 1) * pageSize, current * pageSize);
}, [!!pagination, mergedData, mergedPagination && mergedPagination.current, mergedPagination && mergedPagination.pageSize, mergedPagination && mergedPagination.total]);
var _useSelection = useSelection(rowSelection, {
prefixCls,
data: mergedData,
pageData,
getRowKey,
getRecordByKey,
expandType,
childrenColumnName,
locale: tableLocale,
getPopupContainer
}), _useSelection2 = _slicedToArray$e(_useSelection, 2), transformSelectionColumns = _useSelection2[0], selectedKeySet = _useSelection2[1];
var internalRowClassName = function internalRowClassName2(record, index2, indent) {
var mergedRowClassName;
if (typeof rowClassName === "function") {
mergedRowClassName = classnames(rowClassName(record, index2, indent));
} else {
mergedRowClassName = classnames(rowClassName);
}
return classnames(_defineProperty$b({}, "".concat(prefixCls, "-row-selected"), selectedKeySet.has(getRowKey(record, index2))), mergedRowClassName);
};
mergedExpandable.__PARENT_RENDER_ICON__ = mergedExpandable.expandIcon;
mergedExpandable.expandIcon = mergedExpandable.expandIcon || expandIcon || renderExpandIcon(tableLocale);
if (expandType === "nest" && mergedExpandable.expandIconColumnIndex === void 0) {
mergedExpandable.expandIconColumnIndex = rowSelection ? 1 : 0;
} else if (mergedExpandable.expandIconColumnIndex > 0 && rowSelection) {
mergedExpandable.expandIconColumnIndex -= 1;
}
if (typeof mergedExpandable.indentSize !== "number") {
mergedExpandable.indentSize = typeof indentSize === "number" ? indentSize : 15;
}
var transformColumns = React__namespace.useCallback(function(innerColumns) {
return transformTitleColumns(transformSelectionColumns(transformFilterColumns(transformSorterColumns(innerColumns))));
}, [transformSorterColumns, transformFilterColumns, transformSelectionColumns]);
var topPaginationNode;
var bottomPaginationNode;
if (pagination !== false && (mergedPagination === null || mergedPagination === void 0 ? void 0 : mergedPagination.total)) {
var paginationSize;
if (mergedPagination.size) {
paginationSize = mergedPagination.size;
} else {
paginationSize = mergedSize === "small" || mergedSize === "middle" ? "small" : void 0;
}
var renderPagination = function renderPagination2(position2) {
return /* @__PURE__ */ jsx(Pagination$1, {
...mergedPagination,
className: classnames("".concat(prefixCls, "-pagination ").concat(prefixCls, "-pagination-").concat(position2), mergedPagination.className),
size: paginationSize
});
};
var defaultPosition = direction === "rtl" ? "left" : "right";
var position = mergedPagination.position;
if (position !== null && Array.isArray(position)) {
var topPos = position.find(function(p2) {
return p2.includes("top");
});
var bottomPos = position.find(function(p2) {
return p2.includes("bottom");
});
var isDisable = position.every(function(p2) {
return "".concat(p2) === "none";
});
if (!topPos && !bottomPos && !isDisable) {
bottomPaginationNode = renderPagination(defaultPosition);
}
if (topPos) {
topPaginationNode = renderPagination(topPos.toLowerCase().replace("top", ""));
}
if (bottomPos) {
bottomPaginationNode = renderPagination(bottomPos.toLowerCase().replace("bottom", ""));
}
} else {
bottomPaginationNode = renderPagination(defaultPosition);
}
}
var spinProps;
if (typeof loading === "boolean") {
spinProps = {
spinning: loading
};
} else if (_typeof$q(loading) === "object") {
spinProps = _extends$3({
spinning: true
}, loading);
}
var wrapperClassNames = classnames("".concat(prefixCls, "-wrapper"), _defineProperty$b({}, "".concat(prefixCls, "-wrapper-rtl"), direction === "rtl"), className);
return /* @__PURE__ */ jsx("div", {
ref,
className: wrapperClassNames,
style: style2,
children: /* @__PURE__ */ jsxs(Spin$1, {
spinning: false,
...spinProps,
children: [topPaginationNode, /* @__PURE__ */ jsx(Table$2, {
...tableProps,
columns: mergedColumns,
direction,
expandable: mergedExpandable,
prefixCls,
className: classnames((_classNames3 = {}, _defineProperty$b(_classNames3, "".concat(prefixCls, "-middle"), mergedSize === "middle"), _defineProperty$b(_classNames3, "".concat(prefixCls, "-small"), mergedSize === "small"), _defineProperty$b(_classNames3, "".concat(prefixCls, "-bordered"), bordered), _defineProperty$b(_classNames3, "".concat(prefixCls, "-empty"), rawData.length === 0), _classNames3)),
data: pageData,
rowKey: getRowKey,
rowClassName: internalRowClassName,
emptyText: locale2 && locale2.emptyText || (renderEmpty || defaultRenderEmpty$1)("Table"),
internalHooks: INTERNAL_HOOKS,
internalRefs,
transformColumns
}), bottomPaginationNode]
})
});
}
var ForwardTable = /* @__PURE__ */ React__namespace.forwardRef(InternalTable);
var Table = ForwardTable;
Table.SELECTION_COLUMN = SELECTION_COLUMN;
Table.EXPAND_COLUMN = Table$2.EXPAND_COLUMN;
Table.SELECTION_ALL = SELECTION_ALL;
Table.SELECTION_INVERT = SELECTION_INVERT;
Table.SELECTION_NONE = SELECTION_NONE;
Table.Column = Column;
Table.ColumnGroup = ColumnGroup;
Table.Summary = FooterComponents;
const Table$1 = Table;
var DeleteOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M360 184h-8c4.4 0 8-3.6 8-8v8h304v-8c0 4.4 3.6 8 8 8h-8v72h72v-80c0-35.3-28.7-64-64-64H352c-35.3 0-64 28.7-64 64v80h72v-72zm504 72H160c-17.7 0-32 14.3-32 32v32c0 4.4 3.6 8 8 8h60.4l24.7 523c1.6 34.1 29.8 61 63.9 61h454c34.2 0 62.3-26.8 63.9-61l24.7-523H888c4.4 0 8-3.6 8-8v-32c0-17.7-14.3-32-32-32zM731.3 840H292.7l-24.2-512h487l-24.2 512z" } }] }, "name": "delete", "theme": "outlined" };
const DeleteOutlinedSvg = DeleteOutlined$2;
var DeleteOutlined = function DeleteOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: DeleteOutlinedSvg
})
});
};
DeleteOutlined.displayName = "DeleteOutlined";
const DeleteOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(DeleteOutlined);
var LegacySelectContext = /* @__PURE__ */ React__namespace.createContext(null);
var TreeSelectContext = /* @__PURE__ */ React__namespace.createContext(null);
function toArray$1(value) {
if (Array.isArray(value)) {
return value;
}
return value !== void 0 ? [value] : [];
}
function fillFieldNames(fieldNames) {
var _ref = fieldNames || {}, label = _ref.label, value = _ref.value, children = _ref.children;
var mergedValue = value || "value";
return {
_title: label ? [label] : ["title", "label"],
value: mergedValue,
key: mergedValue,
children: children || "children"
};
}
function isCheckDisabled(node) {
return !node || node.disabled || node.disableCheckbox || node.checkable === false;
}
function getAllKeys$1(treeData, fieldNames) {
var keys2 = [];
function dig(list) {
list.forEach(function(item) {
var children = item[fieldNames.children];
if (children) {
keys2.push(item[fieldNames.value]);
dig(children);
}
});
}
dig(treeData);
return keys2;
}
function isNil(val) {
return val === null || val === void 0;
}
var HIDDEN_STYLE = {
width: 0,
height: 0,
display: "flex",
overflow: "hidden",
opacity: 0,
border: 0,
padding: 0,
margin: 0
};
var OptionList = function OptionList2(_, ref) {
var _useBaseProps = useBaseProps(), prefixCls = _useBaseProps.prefixCls, multiple = _useBaseProps.multiple, searchValue = _useBaseProps.searchValue, toggleOpen = _useBaseProps.toggleOpen, open = _useBaseProps.open, notFoundContent = _useBaseProps.notFoundContent;
var _React$useContext = React__namespace.useContext(TreeSelectContext), virtual = _React$useContext.virtual, listHeight = _React$useContext.listHeight, listItemHeight = _React$useContext.listItemHeight, treeData = _React$useContext.treeData, fieldNames = _React$useContext.fieldNames, onSelect = _React$useContext.onSelect, dropdownMatchSelectWidth = _React$useContext.dropdownMatchSelectWidth, treeExpandAction = _React$useContext.treeExpandAction;
var _React$useContext2 = React__namespace.useContext(LegacySelectContext), checkable = _React$useContext2.checkable, checkedKeys = _React$useContext2.checkedKeys, halfCheckedKeys = _React$useContext2.halfCheckedKeys, treeExpandedKeys = _React$useContext2.treeExpandedKeys, treeDefaultExpandAll = _React$useContext2.treeDefaultExpandAll, treeDefaultExpandedKeys = _React$useContext2.treeDefaultExpandedKeys, onTreeExpand = _React$useContext2.onTreeExpand, treeIcon = _React$useContext2.treeIcon, showTreeIcon = _React$useContext2.showTreeIcon, switcherIcon = _React$useContext2.switcherIcon, treeLine = _React$useContext2.treeLine, treeNodeFilterProp = _React$useContext2.treeNodeFilterProp, loadData = _React$useContext2.loadData, treeLoadedKeys = _React$useContext2.treeLoadedKeys, treeMotion = _React$useContext2.treeMotion, onTreeLoad = _React$useContext2.onTreeLoad, keyEntities = _React$useContext2.keyEntities;
var treeRef = React__namespace.useRef();
var memoTreeData = useMemo(function() {
return treeData;
}, [open, treeData], function(prev, next) {
return next[0] && prev[1] !== next[1];
});
var mergedCheckedKeys = React__namespace.useMemo(function() {
if (!checkable) {
return null;
}
return {
checked: checkedKeys,
halfChecked: halfCheckedKeys
};
}, [checkable, checkedKeys, halfCheckedKeys]);
React__namespace.useEffect(function() {
if (open && !multiple && checkedKeys.length) {
var _treeRef$current;
(_treeRef$current = treeRef.current) === null || _treeRef$current === void 0 ? void 0 : _treeRef$current.scrollTo({
key: checkedKeys[0]
});
}
}, [open]);
var lowerSearchValue = String(searchValue).toLowerCase();
var filterTreeNode = function filterTreeNode2(treeNode) {
if (!lowerSearchValue) {
return false;
}
return String(treeNode[treeNodeFilterProp]).toLowerCase().includes(lowerSearchValue);
};
var _React$useState = React__namespace.useState(treeDefaultExpandedKeys), _React$useState2 = _slicedToArray$e(_React$useState, 2), expandedKeys = _React$useState2[0], setExpandedKeys = _React$useState2[1];
var _React$useState3 = React__namespace.useState(null), _React$useState4 = _slicedToArray$e(_React$useState3, 2), searchExpandedKeys = _React$useState4[0], setSearchExpandedKeys = _React$useState4[1];
var mergedExpandedKeys = React__namespace.useMemo(function() {
if (treeExpandedKeys) {
return _toConsumableArray$c(treeExpandedKeys);
}
return searchValue ? searchExpandedKeys : expandedKeys;
}, [expandedKeys, searchExpandedKeys, treeExpandedKeys, searchValue]);
React__namespace.useEffect(function() {
if (searchValue) {
setSearchExpandedKeys(getAllKeys$1(treeData, fieldNames));
}
}, [searchValue]);
var onInternalExpand = function onInternalExpand2(keys2) {
setExpandedKeys(keys2);
setSearchExpandedKeys(keys2);
if (onTreeExpand) {
onTreeExpand(keys2);
}
};
var onListMouseDown = function onListMouseDown2(event) {
event.preventDefault();
};
var onInternalSelect = function onInternalSelect2(__, info) {
var node = info.node;
if (checkable && isCheckDisabled(node)) {
return;
}
onSelect(node.key, {
selected: !checkedKeys.includes(node.key)
});
if (!multiple) {
toggleOpen(false);
}
};
var _React$useState5 = React__namespace.useState(null), _React$useState6 = _slicedToArray$e(_React$useState5, 2), activeKey = _React$useState6[0], setActiveKey = _React$useState6[1];
var activeEntity = keyEntities[activeKey];
React__namespace.useImperativeHandle(ref, function() {
var _treeRef$current2;
return {
scrollTo: (_treeRef$current2 = treeRef.current) === null || _treeRef$current2 === void 0 ? void 0 : _treeRef$current2.scrollTo,
onKeyDown: function onKeyDown2(event) {
var _treeRef$current3;
var which = event.which;
switch (which) {
case KeyCode.UP:
case KeyCode.DOWN:
case KeyCode.LEFT:
case KeyCode.RIGHT:
(_treeRef$current3 = treeRef.current) === null || _treeRef$current3 === void 0 ? void 0 : _treeRef$current3.onKeyDown(event);
break;
case KeyCode.ENTER: {
if (activeEntity) {
var _ref = (activeEntity === null || activeEntity === void 0 ? void 0 : activeEntity.node) || {}, selectable = _ref.selectable, value = _ref.value;
if (selectable !== false) {
onInternalSelect(null, {
node: {
key: activeKey
},
selected: !checkedKeys.includes(value)
});
}
}
break;
}
case KeyCode.ESC: {
toggleOpen(false);
}
}
},
onKeyUp: function onKeyUp() {
}
};
});
if (memoTreeData.length === 0) {
return /* @__PURE__ */ jsx("div", {
role: "listbox",
className: "".concat(prefixCls, "-empty"),
onMouseDown: onListMouseDown,
children: notFoundContent
});
}
var treeProps = {
fieldNames
};
if (treeLoadedKeys) {
treeProps.loadedKeys = treeLoadedKeys;
}
if (mergedExpandedKeys) {
treeProps.expandedKeys = mergedExpandedKeys;
}
return /* @__PURE__ */ jsxs("div", {
onMouseDown: onListMouseDown,
children: [activeEntity && open && /* @__PURE__ */ jsx("span", {
style: HIDDEN_STYLE,
"aria-live": "assertive",
children: activeEntity.node.value
}), /* @__PURE__ */ jsx(Tree$3, {
ref: treeRef,
focusable: false,
prefixCls: "".concat(prefixCls, "-tree"),
treeData: memoTreeData,
height: listHeight,
itemHeight: listItemHeight,
virtual: virtual !== false && dropdownMatchSelectWidth !== false,
multiple,
icon: treeIcon,
showIcon: showTreeIcon,
switcherIcon,
showLine: treeLine,
loadData: searchValue ? null : loadData,
motion: treeMotion,
activeKey,
checkable,
checkStrictly: true,
checkedKeys: mergedCheckedKeys,
selectedKeys: !checkable ? checkedKeys : [],
defaultExpandAll: treeDefaultExpandAll,
...treeProps,
onActiveChange: setActiveKey,
onSelect: onInternalSelect,
onCheck: onInternalSelect,
onExpand: onInternalExpand,
onLoad: onTreeLoad,
filterTreeNode,
expandAction: treeExpandAction
})]
});
};
var RefOptionList = /* @__PURE__ */ React__namespace.forwardRef(OptionList);
RefOptionList.displayName = "OptionList";
var TreeNode = function TreeNode2() {
return null;
};
var SHOW_ALL = "SHOW_ALL";
var SHOW_PARENT = "SHOW_PARENT";
var SHOW_CHILD = "SHOW_CHILD";
function formatStrategyValues(values, strategy, keyEntities, fieldNames) {
var valueSet = new Set(values);
if (strategy === SHOW_CHILD) {
return values.filter(function(key2) {
var entity = keyEntities[key2];
if (entity && entity.children && entity.children.some(function(_ref) {
var node = _ref.node;
return valueSet.has(node[fieldNames.value]);
}) && entity.children.every(function(_ref2) {
var node = _ref2.node;
return isCheckDisabled(node) || valueSet.has(node[fieldNames.value]);
})) {
return false;
}
return true;
});
}
if (strategy === SHOW_PARENT) {
return values.filter(function(key2) {
var entity = keyEntities[key2];
var parent2 = entity ? entity.parent : null;
if (parent2 && !isCheckDisabled(parent2.node) && valueSet.has(parent2.key)) {
return false;
}
return true;
});
}
return values;
}
var _excluded$3 = ["children", "value"];
function convertChildrenToData(nodes) {
return toArray$9(nodes).map(function(node) {
if (!/* @__PURE__ */ React__namespace.isValidElement(node) || !node.type) {
return null;
}
var _ref = node, key2 = _ref.key, _ref$props = _ref.props, children = _ref$props.children, value = _ref$props.value, restProps = _objectWithoutProperties$1(_ref$props, _excluded$3);
var data = _objectSpread2$a({
key: key2,
value
}, restProps);
var childData = convertChildrenToData(children);
if (childData.length) {
data.children = childData;
}
return data;
}).filter(function(data) {
return data;
});
}
function fillLegacyProps(dataNode) {
if (!dataNode) {
return dataNode;
}
var cloneNode = _objectSpread2$a({}, dataNode);
if (!("props" in cloneNode)) {
Object.defineProperty(cloneNode, "props", {
get: function get2() {
warningOnce(false, "New `rc-tree-select` not support return node instance as argument anymore. Please consider to remove `props` access.");
return cloneNode;
}
});
}
return cloneNode;
}
function fillAdditionalInfo(extra, triggerValue, checkedValues, treeData, showPosition, fieldNames) {
var triggerNode = null;
var nodeList = null;
function generateMap() {
function dig(list) {
var level = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "0";
var parentIncluded = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : false;
return list.map(function(option, index2) {
var pos = "".concat(level, "-").concat(index2);
var value = option[fieldNames.value];
var included = checkedValues.includes(value);
var children = dig(option[fieldNames.children] || [], pos, included);
var node = /* @__PURE__ */ jsx(TreeNode, {
...option,
children: children.map(function(child) {
return child.node;
})
});
if (triggerValue === value) {
triggerNode = node;
}
if (included) {
var checkedNode = {
pos,
node,
children
};
if (!parentIncluded) {
nodeList.push(checkedNode);
}
return checkedNode;
}
return null;
}).filter(function(node) {
return node;
});
}
if (!nodeList) {
nodeList = [];
dig(treeData);
nodeList.sort(function(_ref2, _ref3) {
var val1 = _ref2.node.props.value;
var val2 = _ref3.node.props.value;
var index1 = checkedValues.indexOf(val1);
var index2 = checkedValues.indexOf(val2);
return index1 - index2;
});
}
}
Object.defineProperty(extra, "triggerNode", {
get: function get2() {
warningOnce(false, "`triggerNode` is deprecated. Please consider decoupling data with node.");
generateMap();
return triggerNode;
}
});
Object.defineProperty(extra, "allCheckedNodes", {
get: function get2() {
warningOnce(false, "`allCheckedNodes` is deprecated. Please consider decoupling data with node.");
generateMap();
if (showPosition) {
return nodeList;
}
return nodeList.map(function(_ref4) {
var node = _ref4.node;
return node;
});
}
});
}
function parseSimpleTreeData(treeData, _ref) {
var id2 = _ref.id, pId = _ref.pId, rootPId = _ref.rootPId;
var keyNodes = {};
var rootNodeList = [];
var nodeList = treeData.map(function(node) {
var clone = _objectSpread2$a({}, node);
var key2 = clone[id2];
keyNodes[key2] = clone;
clone.key = clone.key || key2;
return clone;
});
nodeList.forEach(function(node) {
var parentKey = node[pId];
var parent2 = keyNodes[parentKey];
if (parent2) {
parent2.children = parent2.children || [];
parent2.children.push(node);
}
if (parentKey === rootPId || !parent2 && rootPId === null) {
rootNodeList.push(node);
}
});
return rootNodeList;
}
function useTreeData(treeData, children, simpleMode) {
return React__namespace.useMemo(function() {
if (treeData) {
return simpleMode ? parseSimpleTreeData(treeData, _objectSpread2$a({
id: "id",
pId: "pId",
rootPId: null
}, simpleMode !== true ? simpleMode : {})) : treeData;
}
return convertChildrenToData(children);
}, [children, simpleMode, treeData]);
}
const useCache = function(values) {
var cacheRef = React__namespace.useRef({
valueLabels: /* @__PURE__ */ new Map()
});
return React__namespace.useMemo(function() {
var valueLabels = cacheRef.current.valueLabels;
var valueLabelsCache = /* @__PURE__ */ new Map();
var filledValues = values.map(function(item) {
var _item$label;
var value = item.value;
var mergedLabel = (_item$label = item.label) !== null && _item$label !== void 0 ? _item$label : valueLabels.get(value);
valueLabelsCache.set(value, mergedLabel);
return _objectSpread2$a(_objectSpread2$a({}, item), {}, {
label: mergedLabel
});
});
cacheRef.current.valueLabels = valueLabelsCache;
return [filledValues];
}, [values]);
};
function useRefFunc(callback) {
var funcRef = React__namespace.useRef();
funcRef.current = callback;
var cacheFn = React__namespace.useCallback(function() {
return funcRef.current.apply(funcRef, arguments);
}, []);
return cacheFn;
}
const useDataEntities = function(treeData, fieldNames) {
return React__namespace.useMemo(function() {
var collection = convertDataToEntities(treeData, {
fieldNames,
initWrapper: function initWrapper(wrapper) {
return _objectSpread2$a(_objectSpread2$a({}, wrapper), {}, {
valueEntities: /* @__PURE__ */ new Map()
});
},
processEntity: function processEntity(entity, wrapper) {
var val = entity.node[fieldNames.value];
wrapper.valueEntities.set(val, entity);
}
});
return collection;
}, [treeData, fieldNames]);
};
const useCheckedKeys = function(rawLabeledValues, rawHalfCheckedValues, treeConduction, keyEntities) {
return React__namespace.useMemo(function() {
var checkedKeys = rawLabeledValues.map(function(_ref) {
var value = _ref.value;
return value;
});
var halfCheckedKeys = rawHalfCheckedValues.map(function(_ref2) {
var value = _ref2.value;
return value;
});
var missingValues = checkedKeys.filter(function(key2) {
return !keyEntities[key2];
});
if (treeConduction) {
var _conductCheck = conductCheck(checkedKeys, true, keyEntities);
checkedKeys = _conductCheck.checkedKeys;
halfCheckedKeys = _conductCheck.halfCheckedKeys;
}
return [
Array.from(new Set([].concat(_toConsumableArray$c(missingValues), _toConsumableArray$c(checkedKeys)))),
halfCheckedKeys
];
}, [rawLabeledValues, rawHalfCheckedValues, treeConduction, keyEntities]);
};
const useFilterTreeData = function(treeData, searchValue, _ref) {
var treeNodeFilterProp = _ref.treeNodeFilterProp, filterTreeNode = _ref.filterTreeNode, fieldNames = _ref.fieldNames;
var fieldChildren = fieldNames.children;
return React__namespace.useMemo(function() {
if (!searchValue || filterTreeNode === false) {
return treeData;
}
var filterOptionFunc;
if (typeof filterTreeNode === "function") {
filterOptionFunc = filterTreeNode;
} else {
var upperStr = searchValue.toUpperCase();
filterOptionFunc = function filterOptionFunc2(_, dataNode) {
var value = dataNode[treeNodeFilterProp];
return String(value).toUpperCase().includes(upperStr);
};
}
function dig(list) {
var keepAll = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
return list.map(function(dataNode) {
var children = dataNode[fieldChildren];
var match2 = keepAll || filterOptionFunc(searchValue, fillLegacyProps(dataNode));
var childList = dig(children || [], match2);
if (match2 || childList.length) {
return _objectSpread2$a(_objectSpread2$a({}, dataNode), {}, _defineProperty$b({
isLeaf: void 0
}, fieldChildren, childList));
}
return null;
}).filter(function(node) {
return node;
});
}
return dig(treeData);
}, [treeData, searchValue, fieldChildren, treeNodeFilterProp, filterTreeNode]);
};
var _excluded$2 = ["id", "prefixCls", "value", "defaultValue", "onChange", "onSelect", "onDeselect", "searchValue", "inputValue", "onSearch", "autoClearSearchValue", "filterTreeNode", "treeNodeFilterProp", "showCheckedStrategy", "treeNodeLabelProp", "multiple", "treeCheckable", "treeCheckStrictly", "labelInValue", "fieldNames", "treeDataSimpleMode", "treeData", "children", "loadData", "treeLoadedKeys", "onTreeLoad", "treeDefaultExpandAll", "treeExpandedKeys", "treeDefaultExpandedKeys", "onTreeExpand", "treeExpandAction", "virtual", "listHeight", "listItemHeight", "onDropdownVisibleChange", "dropdownMatchSelectWidth", "treeLine", "treeIcon", "showTreeIcon", "switcherIcon", "treeMotion"];
function isRawValue(value) {
return !value || _typeof$q(value) !== "object";
}
var TreeSelect$2 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var id2 = props.id, _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-tree-select" : _props$prefixCls, value = props.value, defaultValue = props.defaultValue, onChange = props.onChange, onSelect = props.onSelect, onDeselect = props.onDeselect, searchValue = props.searchValue, inputValue = props.inputValue, onSearch = props.onSearch, _props$autoClearSearc = props.autoClearSearchValue, autoClearSearchValue = _props$autoClearSearc === void 0 ? true : _props$autoClearSearc, filterTreeNode = props.filterTreeNode, _props$treeNodeFilter = props.treeNodeFilterProp, treeNodeFilterProp = _props$treeNodeFilter === void 0 ? "value" : _props$treeNodeFilter, _props$showCheckedStr = props.showCheckedStrategy, showCheckedStrategy = _props$showCheckedStr === void 0 ? SHOW_CHILD : _props$showCheckedStr, treeNodeLabelProp = props.treeNodeLabelProp, multiple = props.multiple, treeCheckable = props.treeCheckable, treeCheckStrictly = props.treeCheckStrictly, labelInValue = props.labelInValue, fieldNames = props.fieldNames, treeDataSimpleMode = props.treeDataSimpleMode, treeData = props.treeData, children = props.children, loadData = props.loadData, treeLoadedKeys = props.treeLoadedKeys, onTreeLoad = props.onTreeLoad, treeDefaultExpandAll = props.treeDefaultExpandAll, treeExpandedKeys = props.treeExpandedKeys, treeDefaultExpandedKeys = props.treeDefaultExpandedKeys, onTreeExpand = props.onTreeExpand, treeExpandAction = props.treeExpandAction, virtual = props.virtual, _props$listHeight = props.listHeight, listHeight = _props$listHeight === void 0 ? 200 : _props$listHeight, _props$listItemHeight = props.listItemHeight, listItemHeight = _props$listItemHeight === void 0 ? 20 : _props$listItemHeight, onDropdownVisibleChange = props.onDropdownVisibleChange, _props$dropdownMatchS = props.dropdownMatchSelectWidth, dropdownMatchSelectWidth = _props$dropdownMatchS === void 0 ? true : _props$dropdownMatchS, treeLine = props.treeLine, treeIcon = props.treeIcon, showTreeIcon = props.showTreeIcon, switcherIcon = props.switcherIcon, treeMotion = props.treeMotion, restProps = _objectWithoutProperties$1(props, _excluded$2);
var mergedId = useId$2(id2);
var treeConduction = treeCheckable && !treeCheckStrictly;
var mergedCheckable = treeCheckable || treeCheckStrictly;
var mergedLabelInValue = treeCheckStrictly || labelInValue;
var mergedMultiple = mergedCheckable || multiple;
var _useMergedState = useMergedState(defaultValue, {
value
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), internalValue = _useMergedState2[0], setInternalValue = _useMergedState2[1];
var mergedFieldNames = React__namespace.useMemo(
function() {
return fillFieldNames(fieldNames);
},
[JSON.stringify(fieldNames)]
);
var _useMergedState3 = useMergedState("", {
value: searchValue !== void 0 ? searchValue : inputValue,
postState: function postState(search) {
return search || "";
}
}), _useMergedState4 = _slicedToArray$e(_useMergedState3, 2), mergedSearchValue = _useMergedState4[0], setSearchValue = _useMergedState4[1];
var onInternalSearch = function onInternalSearch2(searchText) {
setSearchValue(searchText);
onSearch === null || onSearch === void 0 ? void 0 : onSearch(searchText);
};
var mergedTreeData = useTreeData(treeData, children, treeDataSimpleMode);
var _useDataEntities = useDataEntities(mergedTreeData, mergedFieldNames), keyEntities = _useDataEntities.keyEntities, valueEntities = _useDataEntities.valueEntities;
var splitRawValues = React__namespace.useCallback(function(newRawValues) {
var missingRawValues = [];
var existRawValues = [];
newRawValues.forEach(function(val) {
if (valueEntities.has(val)) {
existRawValues.push(val);
} else {
missingRawValues.push(val);
}
});
return {
missingRawValues,
existRawValues
};
}, [valueEntities]);
var filteredTreeData = useFilterTreeData(mergedTreeData, mergedSearchValue, {
fieldNames: mergedFieldNames,
treeNodeFilterProp,
filterTreeNode
});
var getLabel2 = React__namespace.useCallback(function(item) {
if (item) {
if (treeNodeLabelProp) {
return item[treeNodeLabelProp];
}
var titleList = mergedFieldNames._title;
for (var i2 = 0; i2 < titleList.length; i2 += 1) {
var title = item[titleList[i2]];
if (title !== void 0) {
return title;
}
}
}
}, [mergedFieldNames, treeNodeLabelProp]);
var toLabeledValues = React__namespace.useCallback(function(draftValues) {
var values = toArray$1(draftValues);
return values.map(function(val) {
if (isRawValue(val)) {
return {
value: val
};
}
return val;
});
}, []);
var convert2LabelValues = React__namespace.useCallback(function(draftValues) {
var values = toLabeledValues(draftValues);
return values.map(function(item) {
var rawLabel = item.label;
var rawValue = item.value, rawHalfChecked = item.halfChecked;
var rawDisabled;
var entity = valueEntities.get(rawValue);
if (entity) {
var _rawLabel;
rawLabel = (_rawLabel = rawLabel) !== null && _rawLabel !== void 0 ? _rawLabel : getLabel2(entity.node);
rawDisabled = entity.node.disabled;
} else if (rawLabel === void 0) {
var labelInValueItem = toLabeledValues(internalValue).find(function(labeledItem) {
return labeledItem.value === rawValue;
});
rawLabel = labelInValueItem.label;
}
return {
label: rawLabel,
value: rawValue,
halfChecked: rawHalfChecked,
disabled: rawDisabled
};
});
}, [valueEntities, getLabel2, toLabeledValues, internalValue]);
var rawMixedLabeledValues = React__namespace.useMemo(function() {
return toLabeledValues(internalValue);
}, [toLabeledValues, internalValue]);
var _React$useMemo = React__namespace.useMemo(function() {
var fullCheckValues = [];
var halfCheckValues = [];
rawMixedLabeledValues.forEach(function(item) {
if (item.halfChecked) {
halfCheckValues.push(item);
} else {
fullCheckValues.push(item);
}
});
return [fullCheckValues, halfCheckValues];
}, [rawMixedLabeledValues]), _React$useMemo2 = _slicedToArray$e(_React$useMemo, 2), rawLabeledValues = _React$useMemo2[0], rawHalfLabeledValues = _React$useMemo2[1];
var rawValues = React__namespace.useMemo(function() {
return rawLabeledValues.map(function(item) {
return item.value;
});
}, [rawLabeledValues]);
var _useCheckedKeys = useCheckedKeys(rawLabeledValues, rawHalfLabeledValues, treeConduction, keyEntities), _useCheckedKeys2 = _slicedToArray$e(_useCheckedKeys, 2), rawCheckedValues = _useCheckedKeys2[0], rawHalfCheckedValues = _useCheckedKeys2[1];
var displayValues = React__namespace.useMemo(function() {
var displayKeys = formatStrategyValues(rawCheckedValues, showCheckedStrategy, keyEntities, mergedFieldNames);
var values = displayKeys.map(function(key2) {
var _keyEntities$key$node, _keyEntities$key, _keyEntities$key$node2;
return (_keyEntities$key$node = (_keyEntities$key = keyEntities[key2]) === null || _keyEntities$key === void 0 ? void 0 : (_keyEntities$key$node2 = _keyEntities$key.node) === null || _keyEntities$key$node2 === void 0 ? void 0 : _keyEntities$key$node2[mergedFieldNames.value]) !== null && _keyEntities$key$node !== void 0 ? _keyEntities$key$node : key2;
});
var labeledValues = values.map(function(val) {
var targetItem = rawLabeledValues.find(function(item) {
return item.value === val;
});
return {
value: val,
label: targetItem === null || targetItem === void 0 ? void 0 : targetItem.label
};
});
var rawDisplayValues = convert2LabelValues(labeledValues);
var firstVal = rawDisplayValues[0];
if (!mergedMultiple && firstVal && isNil(firstVal.value) && isNil(firstVal.label)) {
return [];
}
return rawDisplayValues.map(function(item) {
var _item$label;
return _objectSpread2$a(_objectSpread2$a({}, item), {}, {
label: (_item$label = item.label) !== null && _item$label !== void 0 ? _item$label : item.value
});
});
}, [mergedFieldNames, mergedMultiple, rawCheckedValues, rawLabeledValues, convert2LabelValues, showCheckedStrategy, keyEntities]);
var _useCache = useCache(displayValues), _useCache2 = _slicedToArray$e(_useCache, 1), cachedDisplayValues = _useCache2[0];
var triggerChange = useRefFunc(function(newRawValues, extra, source) {
var labeledValues = convert2LabelValues(newRawValues);
setInternalValue(labeledValues);
if (autoClearSearchValue) {
setSearchValue("");
}
if (onChange) {
var eventValues = newRawValues;
if (treeConduction) {
var formattedKeyList = formatStrategyValues(newRawValues, showCheckedStrategy, keyEntities, mergedFieldNames);
eventValues = formattedKeyList.map(function(key2) {
var entity = valueEntities.get(key2);
return entity ? entity.node[mergedFieldNames.value] : key2;
});
}
var _ref = extra || {
triggerValue: void 0,
selected: void 0
}, triggerValue = _ref.triggerValue, selected = _ref.selected;
var returnRawValues = eventValues;
if (treeCheckStrictly) {
var halfValues = rawHalfLabeledValues.filter(function(item) {
return !eventValues.includes(item.value);
});
returnRawValues = [].concat(_toConsumableArray$c(returnRawValues), _toConsumableArray$c(halfValues));
}
var returnLabeledValues = convert2LabelValues(returnRawValues);
var additionalInfo = {
preValue: rawLabeledValues,
triggerValue
};
var showPosition = true;
if (treeCheckStrictly || source === "selection" && !selected) {
showPosition = false;
}
fillAdditionalInfo(additionalInfo, triggerValue, newRawValues, mergedTreeData, showPosition, mergedFieldNames);
if (mergedCheckable) {
additionalInfo.checked = selected;
} else {
additionalInfo.selected = selected;
}
var returnValues = mergedLabelInValue ? returnLabeledValues : returnLabeledValues.map(function(item) {
return item.value;
});
onChange(mergedMultiple ? returnValues : returnValues[0], mergedLabelInValue ? null : returnLabeledValues.map(function(item) {
return item.label;
}), additionalInfo);
}
});
var onOptionSelect = React__namespace.useCallback(function(selectedKey, _ref2) {
var _node$mergedFieldName;
var selected = _ref2.selected, source = _ref2.source;
var entity = keyEntities[selectedKey];
var node = entity === null || entity === void 0 ? void 0 : entity.node;
var selectedValue = (_node$mergedFieldName = node === null || node === void 0 ? void 0 : node[mergedFieldNames.value]) !== null && _node$mergedFieldName !== void 0 ? _node$mergedFieldName : selectedKey;
if (!mergedMultiple) {
triggerChange([selectedValue], {
selected: true,
triggerValue: selectedValue
}, "option");
} else {
var newRawValues = selected ? [].concat(_toConsumableArray$c(rawValues), [selectedValue]) : rawCheckedValues.filter(function(v2) {
return v2 !== selectedValue;
});
if (treeConduction) {
var _splitRawValues = splitRawValues(newRawValues), missingRawValues = _splitRawValues.missingRawValues, existRawValues = _splitRawValues.existRawValues;
var keyList = existRawValues.map(function(val) {
return valueEntities.get(val).key;
});
var checkedKeys;
if (selected) {
var _conductCheck = conductCheck(keyList, true, keyEntities);
checkedKeys = _conductCheck.checkedKeys;
} else {
var _conductCheck2 = conductCheck(keyList, {
checked: false,
halfCheckedKeys: rawHalfCheckedValues
}, keyEntities);
checkedKeys = _conductCheck2.checkedKeys;
}
newRawValues = [].concat(_toConsumableArray$c(missingRawValues), _toConsumableArray$c(checkedKeys.map(function(key2) {
return keyEntities[key2].node[mergedFieldNames.value];
})));
}
triggerChange(newRawValues, {
selected,
triggerValue: selectedValue
}, source || "option");
}
if (selected || !mergedMultiple) {
onSelect === null || onSelect === void 0 ? void 0 : onSelect(selectedValue, fillLegacyProps(node));
} else {
onDeselect === null || onDeselect === void 0 ? void 0 : onDeselect(selectedValue, fillLegacyProps(node));
}
}, [splitRawValues, valueEntities, keyEntities, mergedFieldNames, mergedMultiple, rawValues, triggerChange, treeConduction, onSelect, onDeselect, rawCheckedValues, rawHalfCheckedValues]);
var onInternalDropdownVisibleChange = React__namespace.useCallback(function(open) {
if (onDropdownVisibleChange) {
var legacyParam = {};
Object.defineProperty(legacyParam, "documentClickClose", {
get: function get2() {
warningOnce(false, "Second param of `onDropdownVisibleChange` has been removed.");
return false;
}
});
onDropdownVisibleChange(open, legacyParam);
}
}, [onDropdownVisibleChange]);
var onDisplayValuesChange = useRefFunc(function(newValues, info) {
var newRawValues = newValues.map(function(item) {
return item.value;
});
if (info.type === "clear") {
triggerChange(newRawValues, {}, "selection");
return;
}
if (info.values.length) {
onOptionSelect(info.values[0].value, {
selected: false,
source: "selection"
});
}
});
var treeSelectContext = React__namespace.useMemo(function() {
return {
virtual,
dropdownMatchSelectWidth,
listHeight,
listItemHeight,
treeData: filteredTreeData,
fieldNames: mergedFieldNames,
onSelect: onOptionSelect,
treeExpandAction
};
}, [virtual, dropdownMatchSelectWidth, listHeight, listItemHeight, filteredTreeData, mergedFieldNames, onOptionSelect, treeExpandAction]);
var legacyContext = React__namespace.useMemo(function() {
return {
checkable: mergedCheckable,
loadData,
treeLoadedKeys,
onTreeLoad,
checkedKeys: rawCheckedValues,
halfCheckedKeys: rawHalfCheckedValues,
treeDefaultExpandAll,
treeExpandedKeys,
treeDefaultExpandedKeys,
onTreeExpand,
treeIcon,
treeMotion,
showTreeIcon,
switcherIcon,
treeLine,
treeNodeFilterProp,
keyEntities
};
}, [mergedCheckable, loadData, treeLoadedKeys, onTreeLoad, rawCheckedValues, rawHalfCheckedValues, treeDefaultExpandAll, treeExpandedKeys, treeDefaultExpandedKeys, onTreeExpand, treeIcon, treeMotion, showTreeIcon, switcherIcon, treeLine, treeNodeFilterProp, keyEntities]);
return /* @__PURE__ */ jsx(TreeSelectContext.Provider, {
value: treeSelectContext,
children: /* @__PURE__ */ jsx(LegacySelectContext.Provider, {
value: legacyContext,
children: /* @__PURE__ */ jsx(BaseSelect, {
ref,
...restProps,
id: mergedId,
prefixCls,
mode: mergedMultiple ? "multiple" : void 0,
displayValues: cachedDisplayValues,
onDisplayValuesChange,
searchValue: mergedSearchValue,
onSearch: onInternalSearch,
OptionList: RefOptionList,
emptyOptions: !mergedTreeData.length,
onDropdownVisibleChange: onInternalDropdownVisibleChange,
dropdownMatchSelectWidth
})
})
});
});
var GenericTreeSelect = TreeSelect$2;
GenericTreeSelect.TreeNode = TreeNode;
GenericTreeSelect.SHOW_ALL = SHOW_ALL;
GenericTreeSelect.SHOW_PARENT = SHOW_PARENT;
GenericTreeSelect.SHOW_CHILD = SHOW_CHILD;
var __rest$2 = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var InternalTreeSelect = function InternalTreeSelect2(_a, ref) {
var _classNames2;
var customizePrefixCls = _a.prefixCls, customizeSize = _a.size, customDisabled = _a.disabled, _a$bordered = _a.bordered, bordered = _a$bordered === void 0 ? true : _a$bordered, className = _a.className, treeCheckable = _a.treeCheckable, multiple = _a.multiple, _a$listHeight = _a.listHeight, listHeight = _a$listHeight === void 0 ? 256 : _a$listHeight, _a$listItemHeight = _a.listItemHeight, listItemHeight = _a$listItemHeight === void 0 ? 26 : _a$listItemHeight, placement = _a.placement, notFoundContent = _a.notFoundContent, _switcherIcon = _a.switcherIcon, treeLine = _a.treeLine, getPopupContainer = _a.getPopupContainer, dropdownClassName = _a.dropdownClassName, popupClassName = _a.popupClassName, _a$treeIcon = _a.treeIcon, treeIcon = _a$treeIcon === void 0 ? false : _a$treeIcon, transitionName2 = _a.transitionName, _a$choiceTransitionNa = _a.choiceTransitionName, choiceTransitionName = _a$choiceTransitionNa === void 0 ? "" : _a$choiceTransitionNa, customStatus = _a.status, showArrow = _a.showArrow, treeExpandAction = _a.treeExpandAction, props = __rest$2(_a, ["prefixCls", "size", "disabled", "bordered", "className", "treeCheckable", "multiple", "listHeight", "listItemHeight", "placement", "notFoundContent", "switcherIcon", "treeLine", "getPopupContainer", "dropdownClassName", "popupClassName", "treeIcon", "transitionName", "choiceTransitionName", "status", "showArrow", "treeExpandAction"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getContextPopupContainer = _React$useContext.getPopupContainer, getPrefixCls = _React$useContext.getPrefixCls, renderEmpty = _React$useContext.renderEmpty, direction = _React$useContext.direction, virtual = _React$useContext.virtual, dropdownMatchSelectWidth = _React$useContext.dropdownMatchSelectWidth;
var size = React__namespace.useContext(SizeContext$1);
var prefixCls = getPrefixCls("select", customizePrefixCls);
var treePrefixCls = getPrefixCls("select-tree", customizePrefixCls);
var treeSelectPrefixCls = getPrefixCls("tree-select", customizePrefixCls);
var _useCompactItemContex = useCompactItemContext(prefixCls, direction), compactSize = _useCompactItemContex.compactSize, compactItemClassnames = _useCompactItemContex.compactItemClassnames;
var mergedDropdownClassName = classnames(popupClassName || dropdownClassName, "".concat(treeSelectPrefixCls, "-dropdown"), _defineProperty$b({}, "".concat(treeSelectPrefixCls, "-dropdown-rtl"), direction === "rtl"));
var isMultiple2 = !!(treeCheckable || multiple);
var mergedShowArrow = showArrow !== void 0 ? showArrow : props.loading || !isMultiple2;
var _useContext = React$a.useContext(FormItemInputContext), contextStatus = _useContext.status, hasFeedback = _useContext.hasFeedback, isFormItemInput = _useContext.isFormItemInput, feedbackIcon = _useContext.feedbackIcon;
var mergedStatus = getMergedStatus(contextStatus, customStatus);
var _getIcons = getIcons(_extends$3(_extends$3({}, props), {
multiple: isMultiple2,
showArrow: mergedShowArrow,
hasFeedback,
feedbackIcon,
prefixCls
})), suffixIcon = _getIcons.suffixIcon, removeIcon = _getIcons.removeIcon, clearIcon = _getIcons.clearIcon;
var mergedNotFound;
if (notFoundContent !== void 0) {
mergedNotFound = notFoundContent;
} else {
mergedNotFound = (renderEmpty || defaultRenderEmpty$1)("Select");
}
var selectProps = omit(props, ["suffixIcon", "itemIcon", "removeIcon", "clearIcon", "switcherIcon"]);
var getPlacement = function getPlacement2() {
if (placement !== void 0) {
return placement;
}
return direction === "rtl" ? "bottomRight" : "bottomLeft";
};
var mergedSize = compactSize || customizeSize || size;
var disabled = React__namespace.useContext(DisabledContext$1);
var mergedDisabled = customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled;
var mergedClassName = classnames(!customizePrefixCls && treeSelectPrefixCls, (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-lg"), mergedSize === "large"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-sm"), mergedSize === "small"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-borderless"), !bordered), _defineProperty$b(_classNames2, "".concat(prefixCls, "-in-form-item"), isFormItemInput), _classNames2), getStatusClassNames(prefixCls, mergedStatus, hasFeedback), compactItemClassnames, className);
var rootPrefixCls = getPrefixCls();
return /* @__PURE__ */ jsx(GenericTreeSelect, {
virtual,
dropdownMatchSelectWidth,
disabled: mergedDisabled,
...selectProps,
ref,
prefixCls,
className: mergedClassName,
listHeight,
listItemHeight,
treeCheckable: treeCheckable ? /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-tree-checkbox-inner")
}) : treeCheckable,
treeLine: !!treeLine,
inputIcon: suffixIcon,
multiple,
placement: getPlacement(),
removeIcon,
clearIcon,
switcherIcon: function switcherIcon(nodeProps) {
return renderSwitcherIcon(treePrefixCls, _switcherIcon, treeLine, nodeProps);
},
showTreeIcon: treeIcon,
notFoundContent: mergedNotFound,
getPopupContainer: getPopupContainer || getContextPopupContainer,
treeMotion: null,
dropdownClassName: mergedDropdownClassName,
choiceTransitionName: getTransitionName(rootPrefixCls, "", choiceTransitionName),
transitionName: getTransitionName(rootPrefixCls, getTransitionDirection(placement), transitionName2),
showArrow: hasFeedback || showArrow,
treeExpandAction
});
};
var TreeSelectRef = /* @__PURE__ */ React__namespace.forwardRef(InternalTreeSelect);
var TreeSelect$1 = TreeSelectRef;
TreeSelect$1.TreeNode = TreeNode;
TreeSelect$1.SHOW_ALL = SHOW_ALL;
TreeSelect$1.SHOW_PARENT = SHOW_PARENT;
TreeSelect$1.SHOW_CHILD = SHOW_CHILD;
const _TreeSelect = TreeSelect$1;
function getError(option, xhr) {
var msg = "cannot ".concat(option.method, " ").concat(option.action, " ").concat(xhr.status, "'");
var err = new Error(msg);
err.status = xhr.status;
err.method = option.method;
err.url = option.action;
return err;
}
function getBody(xhr) {
var text = xhr.responseText || xhr.response;
if (!text) {
return text;
}
try {
return JSON.parse(text);
} catch (e2) {
return text;
}
}
function upload(option) {
var xhr = new XMLHttpRequest();
if (option.onProgress && xhr.upload) {
xhr.upload.onprogress = function progress(e2) {
if (e2.total > 0) {
e2.percent = e2.loaded / e2.total * 100;
}
option.onProgress(e2);
};
}
var formData = new FormData();
if (option.data) {
Object.keys(option.data).forEach(function(key2) {
var value = option.data[key2];
if (Array.isArray(value)) {
value.forEach(function(item) {
formData.append("".concat(key2, "[]"), item);
});
return;
}
formData.append(key2, value);
});
}
if (option.file instanceof Blob) {
formData.append(option.filename, option.file, option.file.name);
} else {
formData.append(option.filename, option.file);
}
xhr.onerror = function error(e2) {
option.onError(e2);
};
xhr.onload = function onload() {
if (xhr.status < 200 || xhr.status >= 300) {
return option.onError(getError(option, xhr), getBody(xhr));
}
return option.onSuccess(getBody(xhr), xhr);
};
xhr.open(option.method, option.action, true);
if (option.withCredentials && "withCredentials" in xhr) {
xhr.withCredentials = true;
}
var headers = option.headers || {};
if (headers["X-Requested-With"] !== null) {
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
}
Object.keys(headers).forEach(function(h2) {
if (headers[h2] !== null) {
xhr.setRequestHeader(h2, headers[h2]);
}
});
xhr.send(formData);
return {
abort: function abort() {
xhr.abort();
}
};
}
var now = +new Date();
var index$Y = 0;
function uid$3() {
return "rc-upload-".concat(now, "-").concat(++index$Y);
}
const attrAccept = function(file, acceptedFiles) {
if (file && acceptedFiles) {
var acceptedFilesArray = Array.isArray(acceptedFiles) ? acceptedFiles : acceptedFiles.split(",");
var fileName = file.name || "";
var mimeType = file.type || "";
var baseMimeType = mimeType.replace(/\/.*$/, "");
return acceptedFilesArray.some(function(type2) {
var validType = type2.trim();
if (/^\*(\/\*)?$/.test(type2)) {
return true;
}
if (validType.charAt(0) === ".") {
var lowerFileName = fileName.toLowerCase();
var lowerType = validType.toLowerCase();
var affixList = [lowerType];
if (lowerType === ".jpg" || lowerType === ".jpeg") {
affixList = [".jpg", ".jpeg"];
}
return affixList.some(function(affix) {
return lowerFileName.endsWith(affix);
});
}
if (/\/\*$/.test(validType)) {
return baseMimeType === validType.replace(/\/.*$/, "");
}
if (mimeType === validType) {
return true;
}
if (/^\w+$/.test(validType)) {
warningOnce(false, "Upload takes an invalidate 'accept' type '".concat(validType, "'.Skip for check."));
return true;
}
return false;
});
}
return true;
};
function loopFiles(item, callback) {
var dirReader = item.createReader();
var fileList = [];
function sequence() {
dirReader.readEntries(function(entries) {
var entryList = Array.prototype.slice.apply(entries);
fileList = fileList.concat(entryList);
var isFinished = !entryList.length;
if (isFinished) {
callback(fileList);
} else {
sequence();
}
});
}
sequence();
}
var traverseFileTree = function traverseFileTree2(files, callback, isAccepted) {
var _traverseFileTree = function _traverseFileTree2(item, path2) {
item.path = path2 || "";
if (item.isFile) {
item.file(function(file) {
if (isAccepted(file)) {
if (item.fullPath && !file.webkitRelativePath) {
Object.defineProperties(file, {
webkitRelativePath: {
writable: true
}
});
file.webkitRelativePath = item.fullPath.replace(/^\//, "");
Object.defineProperties(file, {
webkitRelativePath: {
writable: false
}
});
}
callback([file]);
}
});
} else if (item.isDirectory) {
loopFiles(item, function(entries) {
entries.forEach(function(entryItem) {
_traverseFileTree2(entryItem, "".concat(path2).concat(item.name, "/"));
});
});
}
};
files.forEach(function(file) {
_traverseFileTree(file.webkitGetAsEntry());
});
};
var _excluded$1 = ["component", "prefixCls", "className", "disabled", "id", "style", "multiple", "accept", "capture", "children", "directory", "openFileDialogOnClick", "onMouseEnter", "onMouseLeave"];
var AjaxUploader = /* @__PURE__ */ function(_Component) {
_inherits(AjaxUploader2, _Component);
var _super = _createSuper(AjaxUploader2);
function AjaxUploader2() {
var _this2;
_classCallCheck(this, AjaxUploader2);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_this2.state = {
uid: uid$3()
};
_this2.reqs = {};
_this2.fileInput = void 0;
_this2._isMounted = void 0;
_this2.onChange = function(e2) {
var _this$props = _this2.props, accept = _this$props.accept, directory = _this$props.directory;
var files = e2.target.files;
var acceptedFiles = _toConsumableArray$c(files).filter(function(file) {
return !directory || attrAccept(file, accept);
});
_this2.uploadFiles(acceptedFiles);
_this2.reset();
};
_this2.onClick = function(e2) {
var el = _this2.fileInput;
if (!el) {
return;
}
var _this$props2 = _this2.props, children = _this$props2.children, onClick = _this$props2.onClick;
if (children && children.type === "button") {
var parent2 = el.parentNode;
parent2.focus();
parent2.querySelector("button").blur();
}
el.click();
if (onClick) {
onClick(e2);
}
};
_this2.onKeyDown = function(e2) {
if (e2.key === "Enter") {
_this2.onClick(e2);
}
};
_this2.onFileDrop = function(e2) {
var multiple = _this2.props.multiple;
e2.preventDefault();
if (e2.type === "dragover") {
return;
}
if (_this2.props.directory) {
traverseFileTree(Array.prototype.slice.call(e2.dataTransfer.items), _this2.uploadFiles, function(_file) {
return attrAccept(_file, _this2.props.accept);
});
} else {
var files = _toConsumableArray$c(e2.dataTransfer.files).filter(function(file) {
return attrAccept(file, _this2.props.accept);
});
if (multiple === false) {
files = files.slice(0, 1);
}
_this2.uploadFiles(files);
}
};
_this2.uploadFiles = function(files) {
var originFiles = _toConsumableArray$c(files);
var postFiles = originFiles.map(function(file) {
file.uid = uid$3();
return _this2.processFile(file, originFiles);
});
Promise.all(postFiles).then(function(fileList) {
var onBatchStart = _this2.props.onBatchStart;
onBatchStart === null || onBatchStart === void 0 ? void 0 : onBatchStart(fileList.map(function(_ref) {
var origin = _ref.origin, parsedFile = _ref.parsedFile;
return {
file: origin,
parsedFile
};
}));
fileList.filter(function(file) {
return file.parsedFile !== null;
}).forEach(function(file) {
_this2.post(file);
});
});
};
_this2.processFile = /* @__PURE__ */ function() {
var _ref2 = _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime$3().mark(function _callee(file, fileList) {
var beforeUpload, transformedFile, action, mergedAction, data, mergedData, parsedData, parsedFile, mergedParsedFile;
return _regeneratorRuntime$3().wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
beforeUpload = _this2.props.beforeUpload;
transformedFile = file;
if (!beforeUpload) {
_context.next = 14;
break;
}
_context.prev = 3;
_context.next = 6;
return beforeUpload(file, fileList);
case 6:
transformedFile = _context.sent;
_context.next = 12;
break;
case 9:
_context.prev = 9;
_context.t0 = _context["catch"](3);
transformedFile = false;
case 12:
if (!(transformedFile === false)) {
_context.next = 14;
break;
}
return _context.abrupt("return", {
origin: file,
parsedFile: null,
action: null,
data: null
});
case 14:
action = _this2.props.action;
if (!(typeof action === "function")) {
_context.next = 21;
break;
}
_context.next = 18;
return action(file);
case 18:
mergedAction = _context.sent;
_context.next = 22;
break;
case 21:
mergedAction = action;
case 22:
data = _this2.props.data;
if (!(typeof data === "function")) {
_context.next = 29;
break;
}
_context.next = 26;
return data(file);
case 26:
mergedData = _context.sent;
_context.next = 30;
break;
case 29:
mergedData = data;
case 30:
parsedData = (_typeof$q(transformedFile) === "object" || typeof transformedFile === "string") && transformedFile ? transformedFile : file;
if (parsedData instanceof File) {
parsedFile = parsedData;
} else {
parsedFile = new File([parsedData], file.name, {
type: file.type
});
}
mergedParsedFile = parsedFile;
mergedParsedFile.uid = file.uid;
return _context.abrupt("return", {
origin: file,
data: mergedData,
parsedFile: mergedParsedFile,
action: mergedAction
});
case 35:
case "end":
return _context.stop();
}
}
}, _callee, null, [[3, 9]]);
}));
return function(_x, _x2) {
return _ref2.apply(this, arguments);
};
}();
_this2.saveFileInput = function(node) {
_this2.fileInput = node;
};
return _this2;
}
_createClass(AjaxUploader2, [{
key: "componentDidMount",
value: function componentDidMount() {
this._isMounted = true;
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this._isMounted = false;
this.abort();
}
}, {
key: "post",
value: function post(_ref3) {
var _this2 = this;
var data = _ref3.data, origin = _ref3.origin, action = _ref3.action, parsedFile = _ref3.parsedFile;
if (!this._isMounted) {
return;
}
var _this$props3 = this.props, onStart = _this$props3.onStart, customRequest = _this$props3.customRequest, name2 = _this$props3.name, headers = _this$props3.headers, withCredentials = _this$props3.withCredentials, method2 = _this$props3.method;
var uid2 = origin.uid;
var request = customRequest || upload;
var requestOption = {
action,
filename: name2,
data,
file: parsedFile,
headers,
withCredentials,
method: method2 || "post",
onProgress: function onProgress(e2) {
var onProgress2 = _this2.props.onProgress;
onProgress2 === null || onProgress2 === void 0 ? void 0 : onProgress2(e2, parsedFile);
},
onSuccess: function onSuccess(ret, xhr) {
var onSuccess2 = _this2.props.onSuccess;
onSuccess2 === null || onSuccess2 === void 0 ? void 0 : onSuccess2(ret, parsedFile, xhr);
delete _this2.reqs[uid2];
},
onError: function onError(err, ret) {
var onError2 = _this2.props.onError;
onError2 === null || onError2 === void 0 ? void 0 : onError2(err, ret, parsedFile);
delete _this2.reqs[uid2];
}
};
onStart(origin);
this.reqs[uid2] = request(requestOption);
}
}, {
key: "reset",
value: function reset() {
this.setState({
uid: uid$3()
});
}
}, {
key: "abort",
value: function abort(file) {
var reqs = this.reqs;
if (file) {
var uid2 = file.uid ? file.uid : file;
if (reqs[uid2] && reqs[uid2].abort) {
reqs[uid2].abort();
}
delete reqs[uid2];
} else {
Object.keys(reqs).forEach(function(uid3) {
if (reqs[uid3] && reqs[uid3].abort) {
reqs[uid3].abort();
}
delete reqs[uid3];
});
}
}
}, {
key: "render",
value: function render2() {
var _classNames;
var _this$props4 = this.props, Tag2 = _this$props4.component, prefixCls = _this$props4.prefixCls, className = _this$props4.className, disabled = _this$props4.disabled, id2 = _this$props4.id, style2 = _this$props4.style, multiple = _this$props4.multiple, accept = _this$props4.accept, capture = _this$props4.capture, children = _this$props4.children, directory = _this$props4.directory, openFileDialogOnClick = _this$props4.openFileDialogOnClick, onMouseEnter = _this$props4.onMouseEnter, onMouseLeave = _this$props4.onMouseLeave, otherProps = _objectWithoutProperties$1(_this$props4, _excluded$1);
var cls = classnames((_classNames = {}, _defineProperty$b(_classNames, prefixCls, true), _defineProperty$b(_classNames, "".concat(prefixCls, "-disabled"), disabled), _defineProperty$b(_classNames, className, className), _classNames));
var dirProps = directory ? {
directory: "directory",
webkitdirectory: "webkitdirectory"
} : {};
var events = disabled ? {} : {
onClick: openFileDialogOnClick ? this.onClick : function() {
},
onKeyDown: openFileDialogOnClick ? this.onKeyDown : function() {
},
onMouseEnter,
onMouseLeave,
onDrop: this.onFileDrop,
onDragOver: this.onFileDrop,
tabIndex: "0"
};
return /* @__PURE__ */ jsxs(Tag2, {
...events,
className: cls,
role: "button",
style: style2,
children: [/* @__PURE__ */ React$a.createElement("input", {
...pickAttrs(otherProps, {
aria: true,
data: true
}),
id: id2,
type: "file",
ref: this.saveFileInput,
onClick: function onClick(e2) {
return e2.stopPropagation();
},
key: this.state.uid,
style: {
display: "none"
},
accept,
...dirProps,
multiple,
onChange: this.onChange,
...capture != null ? {
capture
} : {}
}), children]
});
}
}]);
return AjaxUploader2;
}(React$a.Component);
function empty() {
}
var Upload$2 = /* @__PURE__ */ function(_Component) {
_inherits(Upload2, _Component);
var _super = _createSuper(Upload2);
function Upload2() {
var _this2;
_classCallCheck(this, Upload2);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_this2.uploader = void 0;
_this2.saveUploader = function(node) {
_this2.uploader = node;
};
return _this2;
}
_createClass(Upload2, [{
key: "abort",
value: function abort(file) {
this.uploader.abort(file);
}
}, {
key: "render",
value: function render2() {
return /* @__PURE__ */ jsx(AjaxUploader, {
...this.props,
ref: this.saveUploader
});
}
}]);
return Upload2;
}(React$a.Component);
Upload$2.defaultProps = {
component: "span",
prefixCls: "rc-upload",
data: {},
headers: {},
name: "file",
multipart: false,
onStart: empty,
onError: empty,
onSuccess: empty,
multiple: false,
beforeUpload: null,
customRequest: null,
withCredentials: false,
openFileDialogOnClick: true
};
var FileTwoTone$2 = { "icon": function render2(primaryColor, secondaryColor) {
return { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M534 352V136H232v752h560V394H576a42 42 0 01-42-42z", "fill": secondaryColor } }, { "tag": "path", "attrs": { "d": "M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM602 137.8L790.2 326H602V137.8zM792 888H232V136h302v216a42 42 0 0042 42h216v494z", "fill": primaryColor } }] };
}, "name": "file", "theme": "twotone" };
const FileTwoToneSvg = FileTwoTone$2;
var FileTwoTone = function FileTwoTone2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: FileTwoToneSvg
})
});
};
FileTwoTone.displayName = "FileTwoTone";
const FileTwoTone$1 = /* @__PURE__ */ React__namespace.forwardRef(FileTwoTone);
var PaperClipOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M779.3 196.6c-94.2-94.2-247.6-94.2-341.7 0l-261 260.8c-1.7 1.7-2.6 4-2.6 6.4s.9 4.7 2.6 6.4l36.9 36.9a9 9 0 0012.7 0l261-260.8c32.4-32.4 75.5-50.2 121.3-50.2s88.9 17.8 121.2 50.2c32.4 32.4 50.2 75.5 50.2 121.2 0 45.8-17.8 88.8-50.2 121.2l-266 265.9-43.1 43.1c-40.3 40.3-105.8 40.3-146.1 0-19.5-19.5-30.2-45.4-30.2-73s10.7-53.5 30.2-73l263.9-263.8c6.7-6.6 15.5-10.3 24.9-10.3h.1c9.4 0 18.1 3.7 24.7 10.3 6.7 6.7 10.3 15.5 10.3 24.9 0 9.3-3.7 18.1-10.3 24.7L372.4 653c-1.7 1.7-2.6 4-2.6 6.4s.9 4.7 2.6 6.4l36.9 36.9a9 9 0 0012.7 0l215.6-215.6c19.9-19.9 30.8-46.3 30.8-74.4s-11-54.6-30.8-74.4c-41.1-41.1-107.9-41-149 0L463 364 224.8 602.1A172.22 172.22 0 00174 724.8c0 46.3 18.1 89.8 50.8 122.5 33.9 33.8 78.3 50.7 122.7 50.7 44.4 0 88.8-16.9 122.6-50.7l309.2-309C824.8 492.7 850 432 850 367.5c.1-64.6-25.1-125.3-70.7-170.9z" } }] }, "name": "paper-clip", "theme": "outlined" };
const PaperClipOutlinedSvg = PaperClipOutlined$2;
var PaperClipOutlined = function PaperClipOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: PaperClipOutlinedSvg
})
});
};
PaperClipOutlined.displayName = "PaperClipOutlined";
const PaperClipOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(PaperClipOutlined);
var PictureTwoTone$2 = { "icon": function render2(primaryColor, secondaryColor) {
return { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zm-40 632H136v-39.9l138.5-164.3 150.1 178L658.1 489 888 761.6V792zm0-129.8L664.2 396.8c-3.2-3.8-9-3.8-12.2 0L424.6 666.4l-144-170.7c-3.2-3.8-9-3.8-12.2 0L136 652.7V232h752v430.2z", "fill": primaryColor } }, { "tag": "path", "attrs": { "d": "M424.6 765.8l-150.1-178L136 752.1V792h752v-30.4L658.1 489z", "fill": secondaryColor } }, { "tag": "path", "attrs": { "d": "M136 652.7l132.4-157c3.2-3.8 9-3.8 12.2 0l144 170.7L652 396.8c3.2-3.8 9-3.8 12.2 0L888 662.2V232H136v420.7zM304 280a88 88 0 110 176 88 88 0 010-176z", "fill": secondaryColor } }, { "tag": "path", "attrs": { "d": "M276 368a28 28 0 1056 0 28 28 0 10-56 0z", "fill": secondaryColor } }, { "tag": "path", "attrs": { "d": "M304 456a88 88 0 100-176 88 88 0 000 176zm0-116c15.5 0 28 12.5 28 28s-12.5 28-28 28-28-12.5-28-28 12.5-28 28-28z", "fill": primaryColor } }] };
}, "name": "picture", "theme": "twotone" };
const PictureTwoToneSvg = PictureTwoTone$2;
var PictureTwoTone = function PictureTwoTone2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: PictureTwoToneSvg
})
});
};
PictureTwoTone.displayName = "PictureTwoTone";
const PictureTwoTone$1 = /* @__PURE__ */ React__namespace.forwardRef(PictureTwoTone);
function file2Obj(file) {
return _extends$3(_extends$3({}, file), {
lastModified: file.lastModified,
lastModifiedDate: file.lastModifiedDate,
name: file.name,
size: file.size,
type: file.type,
uid: file.uid,
percent: 0,
originFileObj: file
});
}
function updateFileList(file, fileList) {
var nextFileList = _toConsumableArray$c(fileList);
var fileIndex = nextFileList.findIndex(function(_ref) {
var uid2 = _ref.uid;
return uid2 === file.uid;
});
if (fileIndex === -1) {
nextFileList.push(file);
} else {
nextFileList[fileIndex] = file;
}
return nextFileList;
}
function getFileItem(file, fileList) {
var matchKey = file.uid !== void 0 ? "uid" : "name";
return fileList.filter(function(item) {
return item[matchKey] === file[matchKey];
})[0];
}
function removeFileItem(file, fileList) {
var matchKey = file.uid !== void 0 ? "uid" : "name";
var removed = fileList.filter(function(item) {
return item[matchKey] !== file[matchKey];
});
if (removed.length === fileList.length) {
return null;
}
return removed;
}
var extname = function extname2() {
var url = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "";
var temp = url.split("/");
var filename = temp[temp.length - 1];
var filenameWithoutSuffix = filename.split(/#|\?/)[0];
return (/\.[^./\\]*$/.exec(filenameWithoutSuffix) || [""])[0];
};
var isImageFileType = function isImageFileType2(type2) {
return type2.indexOf("image/") === 0;
};
var isImageUrl = function isImageUrl2(file) {
if (file.type && !file.thumbUrl) {
return isImageFileType(file.type);
}
var url = file.thumbUrl || file.url || "";
var extension = extname(url);
if (/^data:image\//.test(url) || /(webp|svg|png|gif|jpg|jpeg|jfif|bmp|dpg|ico|heic|heif)$/i.test(extension)) {
return true;
}
if (/^data:/.test(url)) {
return false;
}
if (extension) {
return false;
}
return true;
};
var MEASURE_SIZE = 200;
function previewImage(file) {
return new Promise(function(resolve) {
if (!file.type || !isImageFileType(file.type)) {
resolve("");
return;
}
var canvas = document.createElement("canvas");
canvas.width = MEASURE_SIZE;
canvas.height = MEASURE_SIZE;
canvas.style.cssText = "position: fixed; left: 0; top: 0; width: ".concat(MEASURE_SIZE, "px; height: ").concat(MEASURE_SIZE, "px; z-index: 9999; display: none;");
document.body.appendChild(canvas);
var ctx2 = canvas.getContext("2d");
var img = new Image();
img.onload = function() {
var width = img.width, height = img.height;
var drawWidth = MEASURE_SIZE;
var drawHeight = MEASURE_SIZE;
var offsetX = 0;
var offsetY = 0;
if (width > height) {
drawHeight = height * (MEASURE_SIZE / width);
offsetY = -(drawHeight - drawWidth) / 2;
} else {
drawWidth = width * (MEASURE_SIZE / height);
offsetX = -(drawWidth - drawHeight) / 2;
}
ctx2.drawImage(img, offsetX, offsetY, drawWidth, drawHeight);
var dataURL = canvas.toDataURL();
document.body.removeChild(canvas);
resolve(dataURL);
};
img.crossOrigin = "anonymous";
if (file.type.startsWith("image/svg+xml")) {
var reader = new FileReader();
reader.addEventListener("load", function() {
if (reader.result)
img.src = reader.result;
});
reader.readAsDataURL(file);
} else {
img.src = window.URL.createObjectURL(file);
}
});
}
var DownloadOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M505.7 661a8 8 0 0012.6 0l112-141.7c4.1-5.2.4-12.9-6.3-12.9h-74.1V168c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v338.3H400c-6.7 0-10.4 7.7-6.3 12.9l112 141.8zM878 626h-60c-4.4 0-8 3.6-8 8v154H214V634c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v198c0 17.7 14.3 32 32 32h684c17.7 0 32-14.3 32-32V634c0-4.4-3.6-8-8-8z" } }] }, "name": "download", "theme": "outlined" };
const DownloadOutlinedSvg = DownloadOutlined$2;
var DownloadOutlined = function DownloadOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: DownloadOutlinedSvg
})
});
};
DownloadOutlined.displayName = "DownloadOutlined";
const DownloadOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(DownloadOutlined);
var ListItem = /* @__PURE__ */ React__namespace.forwardRef(function(_ref, ref) {
var _classNames3;
var prefixCls = _ref.prefixCls, className = _ref.className, style2 = _ref.style, locale2 = _ref.locale, listType = _ref.listType, file = _ref.file, items = _ref.items, progressProps = _ref.progress, iconRender = _ref.iconRender, actionIconRender = _ref.actionIconRender, itemRender = _ref.itemRender, isImgUrl = _ref.isImgUrl, showPreviewIcon = _ref.showPreviewIcon, showRemoveIcon = _ref.showRemoveIcon, showDownloadIcon = _ref.showDownloadIcon, customPreviewIcon = _ref.previewIcon, customRemoveIcon = _ref.removeIcon, customDownloadIcon = _ref.downloadIcon, onPreview = _ref.onPreview, onDownload = _ref.onDownload, onClose = _ref.onClose;
var _a, _b;
var status = file.status;
var _React$useState = React__namespace.useState(status), _React$useState2 = _slicedToArray$e(_React$useState, 2), mergedStatus = _React$useState2[0], setMergedStatus = _React$useState2[1];
React__namespace.useEffect(function() {
if (status !== "removed") {
setMergedStatus(status);
}
}, [status]);
var _React$useState3 = React__namespace.useState(false), _React$useState4 = _slicedToArray$e(_React$useState3, 2), showProgress = _React$useState4[0], setShowProgress = _React$useState4[1];
var progressRafRef = React__namespace.useRef(null);
React__namespace.useEffect(function() {
progressRafRef.current = setTimeout(function() {
setShowProgress(true);
}, 300);
return function() {
if (progressRafRef.current) {
clearTimeout(progressRafRef.current);
}
};
}, []);
var spanClassName = "".concat(prefixCls, "-span");
var iconNode = iconRender(file);
var icon = /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-text-icon"),
children: iconNode
});
if (listType === "picture" || listType === "picture-card") {
if (mergedStatus === "uploading" || !file.thumbUrl && !file.url) {
var _classNames;
var uploadingClassName = classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-list-item-thumbnail"), true), _defineProperty$b(_classNames, "".concat(prefixCls, "-list-item-file"), mergedStatus !== "uploading"), _classNames));
icon = /* @__PURE__ */ jsx("div", {
className: uploadingClassName,
children: iconNode
});
} else {
var _classNames2;
var thumbnail = (isImgUrl === null || isImgUrl === void 0 ? void 0 : isImgUrl(file)) ? /* @__PURE__ */ jsx("img", {
src: file.thumbUrl || file.url,
alt: file.name,
className: "".concat(prefixCls, "-list-item-image"),
crossOrigin: file.crossOrigin
}) : iconNode;
var aClassName = classnames((_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-list-item-thumbnail"), true), _defineProperty$b(_classNames2, "".concat(prefixCls, "-list-item-file"), isImgUrl && !isImgUrl(file)), _classNames2));
icon = /* @__PURE__ */ jsx("a", {
className: aClassName,
onClick: function onClick(e2) {
return onPreview(file, e2);
},
href: file.url || file.thumbUrl,
target: "_blank",
rel: "noopener noreferrer",
children: thumbnail
});
}
}
var infoUploadingClass = classnames((_classNames3 = {}, _defineProperty$b(_classNames3, "".concat(prefixCls, "-list-item"), true), _defineProperty$b(_classNames3, "".concat(prefixCls, "-list-item-").concat(mergedStatus), true), _defineProperty$b(_classNames3, "".concat(prefixCls, "-list-item-list-type-").concat(listType), true), _classNames3));
var linkProps = typeof file.linkProps === "string" ? JSON.parse(file.linkProps) : file.linkProps;
var removeIcon = showRemoveIcon ? actionIconRender((typeof customRemoveIcon === "function" ? customRemoveIcon(file) : customRemoveIcon) || /* @__PURE__ */ jsx(DeleteOutlined$1, {}), function() {
return onClose(file);
}, prefixCls, locale2.removeFile) : null;
var downloadIcon = showDownloadIcon && mergedStatus === "done" ? actionIconRender((typeof customDownloadIcon === "function" ? customDownloadIcon(file) : customDownloadIcon) || /* @__PURE__ */ jsx(DownloadOutlined$1, {}), function() {
return onDownload(file);
}, prefixCls, locale2.downloadFile) : null;
var downloadOrDelete = listType !== "picture-card" && /* @__PURE__ */ jsxs("span", {
className: classnames("".concat(prefixCls, "-list-item-card-actions"), {
picture: listType === "picture"
}),
children: [downloadIcon, removeIcon]
}, "download-delete");
var listItemNameClass = classnames("".concat(prefixCls, "-list-item-name"));
var preview = file.url ? [
/* @__PURE__ */ jsx("a", {
target: "_blank",
rel: "noopener noreferrer",
className: listItemNameClass,
title: file.name,
...linkProps,
href: file.url,
onClick: function onClick(e2) {
return onPreview(file, e2);
},
children: file.name
}, "view"),
downloadOrDelete
] : [
/* @__PURE__ */ jsx("span", {
className: listItemNameClass,
onClick: function onClick(e2) {
return onPreview(file, e2);
},
title: file.name,
children: file.name
}, "view"),
downloadOrDelete
];
var previewStyle = {
pointerEvents: "none",
opacity: 0.5
};
var previewIcon = showPreviewIcon ? /* @__PURE__ */ jsx("a", {
href: file.url || file.thumbUrl,
target: "_blank",
rel: "noopener noreferrer",
style: file.url || file.thumbUrl ? void 0 : previewStyle,
onClick: function onClick(e2) {
return onPreview(file, e2);
},
title: locale2.previewFile,
children: typeof customPreviewIcon === "function" ? customPreviewIcon(file) : customPreviewIcon || /* @__PURE__ */ jsx(EyeOutlined$1, {})
}) : null;
var actions = listType === "picture-card" && mergedStatus !== "uploading" && /* @__PURE__ */ jsxs("span", {
className: "".concat(prefixCls, "-list-item-actions"),
children: [previewIcon, mergedStatus === "done" && downloadIcon, removeIcon]
});
var message;
if (file.response && typeof file.response === "string") {
message = file.response;
} else {
message = ((_a = file.error) === null || _a === void 0 ? void 0 : _a.statusText) || ((_b = file.error) === null || _b === void 0 ? void 0 : _b.message) || locale2.uploadError;
}
var iconAndPreview = /* @__PURE__ */ jsxs("span", {
className: spanClassName,
children: [icon, preview]
});
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var rootPrefixCls = getPrefixCls();
var dom = /* @__PURE__ */ jsxs("div", {
className: infoUploadingClass,
children: [/* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-list-item-info"),
children: iconAndPreview
}), actions, showProgress && /* @__PURE__ */ jsx(CSSMotion, {
motionName: "".concat(rootPrefixCls, "-fade"),
visible: mergedStatus === "uploading",
motionDeadline: 2e3,
children: function(_ref2) {
var motionClassName = _ref2.className;
var loadingProgress = "percent" in file ? /* @__PURE__ */ jsx(Progress$1, {
...progressProps,
type: "line",
percent: file.percent
}) : null;
return /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-list-item-progress"), motionClassName),
children: loadingProgress
});
}
})]
});
var listContainerNameClass = classnames("".concat(prefixCls, "-list-").concat(listType, "-container"), className);
var item = mergedStatus === "error" ? /* @__PURE__ */ jsx(_Tooltip, {
title: message,
getPopupContainer: function getPopupContainer(node) {
return node.parentNode;
},
children: dom
}) : dom;
return /* @__PURE__ */ jsx("div", {
className: listContainerNameClass,
style: style2,
ref,
children: itemRender ? itemRender(item, file, items, {
download: onDownload.bind(null, file),
preview: onPreview.bind(null, file),
remove: onClose.bind(null, file)
}) : item
});
});
const ListItem$1 = ListItem;
var listItemMotion = _extends$3({}, collapseMotion$1);
delete listItemMotion.onAppearEnd;
delete listItemMotion.onEnterEnd;
delete listItemMotion.onLeaveEnd;
var InternalUploadList = function InternalUploadList2(props, ref) {
var _classNames;
var _props$listType = props.listType, listType = _props$listType === void 0 ? "text" : _props$listType, _props$previewFile = props.previewFile, previewFile = _props$previewFile === void 0 ? previewImage : _props$previewFile, onPreview = props.onPreview, onDownload = props.onDownload, onRemove = props.onRemove, locale2 = props.locale, iconRender = props.iconRender, _props$isImageUrl = props.isImageUrl, isImgUrl = _props$isImageUrl === void 0 ? isImageUrl : _props$isImageUrl, customizePrefixCls = props.prefixCls, _props$items = props.items, items = _props$items === void 0 ? [] : _props$items, _props$showPreviewIco = props.showPreviewIcon, showPreviewIcon = _props$showPreviewIco === void 0 ? true : _props$showPreviewIco, _props$showRemoveIcon = props.showRemoveIcon, showRemoveIcon = _props$showRemoveIcon === void 0 ? true : _props$showRemoveIcon, _props$showDownloadIc = props.showDownloadIcon, showDownloadIcon = _props$showDownloadIc === void 0 ? false : _props$showDownloadIc, removeIcon = props.removeIcon, previewIcon = props.previewIcon, downloadIcon = props.downloadIcon, _props$progress = props.progress, progress = _props$progress === void 0 ? {
strokeWidth: 2,
showInfo: false
} : _props$progress, appendAction = props.appendAction, _props$appendActionVi = props.appendActionVisible, appendActionVisible = _props$appendActionVi === void 0 ? true : _props$appendActionVi, itemRender = props.itemRender;
var forceUpdate = useForceUpdate();
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), motionAppear = _React$useState2[0], setMotionAppear = _React$useState2[1];
React__namespace.useEffect(function() {
if (listType !== "picture" && listType !== "picture-card") {
return;
}
(items || []).forEach(function(file) {
if (typeof document === "undefined" || typeof window === "undefined" || !window.FileReader || !window.File || !(file.originFileObj instanceof File || file.originFileObj instanceof Blob) || file.thumbUrl !== void 0) {
return;
}
file.thumbUrl = "";
if (previewFile) {
previewFile(file.originFileObj).then(function(previewDataUrl) {
file.thumbUrl = previewDataUrl || "";
forceUpdate();
});
}
});
}, [listType, items, previewFile]);
React__namespace.useEffect(function() {
setMotionAppear(true);
}, []);
var onInternalPreview = function onInternalPreview2(file, e2) {
if (!onPreview) {
return;
}
e2 === null || e2 === void 0 ? void 0 : e2.preventDefault();
return onPreview(file);
};
var onInternalDownload = function onInternalDownload2(file) {
if (typeof onDownload === "function") {
onDownload(file);
} else if (file.url) {
window.open(file.url);
}
};
var onInternalClose = function onInternalClose2(file) {
onRemove === null || onRemove === void 0 ? void 0 : onRemove(file);
};
var internalIconRender = function internalIconRender2(file) {
if (iconRender) {
return iconRender(file, listType);
}
var isLoading = file.status === "uploading";
var fileIcon = isImgUrl && isImgUrl(file) ? /* @__PURE__ */ jsx(PictureTwoTone$1, {}) : /* @__PURE__ */ jsx(FileTwoTone$1, {});
var icon = isLoading ? /* @__PURE__ */ jsx(LoadingOutlined$1, {}) : /* @__PURE__ */ jsx(PaperClipOutlined$1, {});
if (listType === "picture") {
icon = isLoading ? /* @__PURE__ */ jsx(LoadingOutlined$1, {}) : fileIcon;
} else if (listType === "picture-card") {
icon = isLoading ? locale2.uploading : fileIcon;
}
return icon;
};
var actionIconRender = function actionIconRender2(customIcon, callback, prefixCls2, title) {
var btnProps = {
type: "text",
size: "small",
title,
onClick: function onClick(e2) {
callback();
if (isValidElement(customIcon) && customIcon.props.onClick) {
customIcon.props.onClick(e2);
}
},
className: "".concat(prefixCls2, "-list-item-card-actions-btn")
};
if (isValidElement(customIcon)) {
var btnIcon = cloneElement(customIcon, _extends$3(_extends$3({}, customIcon.props), {
onClick: function onClick() {
}
}));
return /* @__PURE__ */ jsx(Button$2, {
...btnProps,
icon: btnIcon
});
}
return /* @__PURE__ */ jsx(Button$2, {
...btnProps,
children: /* @__PURE__ */ jsx("span", {
children: customIcon
})
});
};
React__namespace.useImperativeHandle(ref, function() {
return {
handlePreview: onInternalPreview,
handleDownload: onInternalDownload
};
});
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var prefixCls = getPrefixCls("upload", customizePrefixCls);
var listClassNames = classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-list"), true), _defineProperty$b(_classNames, "".concat(prefixCls, "-list-").concat(listType), true), _defineProperty$b(_classNames, "".concat(prefixCls, "-list-rtl"), direction === "rtl"), _classNames));
var motionKeyList = _toConsumableArray$c(items.map(function(file) {
return {
key: file.uid,
file
};
}));
var animationDirection = listType === "picture-card" ? "animate-inline" : "animate";
var motionConfig = {
motionDeadline: 2e3,
motionName: "".concat(prefixCls, "-").concat(animationDirection),
keys: motionKeyList,
motionAppear
};
if (listType !== "picture-card") {
motionConfig = _extends$3(_extends$3({}, listItemMotion), motionConfig);
}
return /* @__PURE__ */ jsxs("div", {
className: listClassNames,
children: [/* @__PURE__ */ jsx(CSSMotionList, {
...motionConfig,
component: false,
children: function(_ref) {
var key2 = _ref.key, file = _ref.file, motionClassName = _ref.className, motionStyle = _ref.style;
return /* @__PURE__ */ jsx(ListItem$1, {
locale: locale2,
prefixCls,
className: motionClassName,
style: motionStyle,
file,
items,
progress,
listType,
isImgUrl,
showPreviewIcon,
showRemoveIcon,
showDownloadIcon,
removeIcon,
previewIcon,
downloadIcon,
iconRender: internalIconRender,
actionIconRender,
itemRender,
onPreview: onInternalPreview,
onDownload: onInternalDownload,
onClose: onInternalClose
}, key2);
}
}), appendAction && /* @__PURE__ */ jsx(CSSMotion, {
...motionConfig,
visible: appendActionVisible,
forceRender: true,
children: function(_ref2) {
var motionClassName = _ref2.className, motionStyle = _ref2.style;
return cloneElement(appendAction, function(oriProps) {
return {
className: classnames(oriProps.className, motionClassName),
style: _extends$3(_extends$3(_extends$3({}, motionStyle), {
pointerEvents: motionClassName ? "none" : void 0
}), oriProps.style)
};
});
}
})]
});
};
var UploadList = /* @__PURE__ */ React__namespace.forwardRef(InternalUploadList);
const UploadList$1 = UploadList;
var __awaiter$1 = globalThis && globalThis.__awaiter || function(thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P ? value : new P(function(resolve) {
resolve(value);
});
}
return new (P || (P = Promise))(function(resolve, reject) {
function fulfilled(value) {
try {
step2(generator.next(value));
} catch (e2) {
reject(e2);
}
}
function rejected(value) {
try {
step2(generator["throw"](value));
} catch (e2) {
reject(e2);
}
}
function step2(result) {
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
}
step2((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var LIST_IGNORE = "__LIST_IGNORE_".concat(Date.now(), "__");
var InternalUpload = function InternalUpload2(props, ref) {
var _classNames2;
var fileList = props.fileList, defaultFileList = props.defaultFileList, onRemove = props.onRemove, _props$showUploadList = props.showUploadList, showUploadList = _props$showUploadList === void 0 ? true : _props$showUploadList, _props$listType = props.listType, listType = _props$listType === void 0 ? "text" : _props$listType, onPreview = props.onPreview, onDownload = props.onDownload, onChange = props.onChange, onDrop = props.onDrop, previewFile = props.previewFile, customDisabled = props.disabled, propLocale = props.locale, iconRender = props.iconRender, isImageUrl2 = props.isImageUrl, progress = props.progress, customizePrefixCls = props.prefixCls, className = props.className, _props$type = props.type, type2 = _props$type === void 0 ? "select" : _props$type, children = props.children, style2 = props.style, itemRender = props.itemRender, maxCount2 = props.maxCount, _props$data = props.data, data = _props$data === void 0 ? {} : _props$data, _props$multiple = props.multiple, multiple = _props$multiple === void 0 ? false : _props$multiple, _props$action = props.action, action = _props$action === void 0 ? "" : _props$action, _props$accept = props.accept, accept = _props$accept === void 0 ? "" : _props$accept, _props$supportServerR = props.supportServerRender, supportServerRender = _props$supportServerR === void 0 ? true : _props$supportServerR;
var disabled = React__namespace.useContext(DisabledContext$1);
var mergedDisabled = customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled;
var _useMergedState = useMergedState(defaultFileList || [], {
value: fileList,
postState: function postState(list) {
return list !== null && list !== void 0 ? list : [];
}
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), mergedFileList = _useMergedState2[0], setMergedFileList = _useMergedState2[1];
var _React$useState = React__namespace.useState("drop"), _React$useState2 = _slicedToArray$e(_React$useState, 2), dragState = _React$useState2[0], setDragState = _React$useState2[1];
var upload2 = React__namespace.useRef(null);
React__namespace.useMemo(function() {
var timestamp = Date.now();
(fileList || []).forEach(function(file, index2) {
if (!file.uid && !Object.isFrozen(file)) {
file.uid = "__AUTO__".concat(timestamp, "_").concat(index2, "__");
}
});
}, [fileList]);
var onInternalChange = function onInternalChange2(file, changedFileList, event) {
var cloneList = _toConsumableArray$c(changedFileList);
if (maxCount2 === 1) {
cloneList = cloneList.slice(-1);
} else if (maxCount2) {
cloneList = cloneList.slice(0, maxCount2);
}
ReactDOM2.flushSync(function() {
setMergedFileList(cloneList);
});
var changeInfo = {
file,
fileList: cloneList
};
if (event) {
changeInfo.event = event;
}
onChange === null || onChange === void 0 ? void 0 : onChange(changeInfo);
};
var mergedBeforeUpload = function mergedBeforeUpload2(file, fileListArgs) {
return __awaiter$1(void 0, void 0, void 0, /* @__PURE__ */ _regeneratorRuntime$3().mark(function _callee() {
var beforeUpload, transformFile, parsedFile, result;
return _regeneratorRuntime$3().wrap(function _callee$(_context) {
while (1)
switch (_context.prev = _context.next) {
case 0:
beforeUpload = props.beforeUpload, transformFile = props.transformFile;
parsedFile = file;
if (!beforeUpload) {
_context.next = 13;
break;
}
_context.next = 5;
return beforeUpload(file, fileListArgs);
case 5:
result = _context.sent;
if (!(result === false)) {
_context.next = 8;
break;
}
return _context.abrupt("return", false);
case 8:
delete file[LIST_IGNORE];
if (!(result === LIST_IGNORE)) {
_context.next = 12;
break;
}
Object.defineProperty(file, LIST_IGNORE, {
value: true,
configurable: true
});
return _context.abrupt("return", false);
case 12:
if (_typeof$q(result) === "object" && result) {
parsedFile = result;
}
case 13:
if (!transformFile) {
_context.next = 17;
break;
}
_context.next = 16;
return transformFile(parsedFile);
case 16:
parsedFile = _context.sent;
case 17:
return _context.abrupt("return", parsedFile);
case 18:
case "end":
return _context.stop();
}
}, _callee);
}));
};
var onBatchStart = function onBatchStart2(batchFileInfoList) {
var filteredFileInfoList = batchFileInfoList.filter(function(info) {
return !info.file[LIST_IGNORE];
});
if (!filteredFileInfoList.length) {
return;
}
var objectFileList = filteredFileInfoList.map(function(info) {
return file2Obj(info.file);
});
var newFileList = _toConsumableArray$c(mergedFileList);
objectFileList.forEach(function(fileObj) {
newFileList = updateFileList(fileObj, newFileList);
});
objectFileList.forEach(function(fileObj, index2) {
var triggerFileObj = fileObj;
if (!filteredFileInfoList[index2].parsedFile) {
var originFileObj = fileObj.originFileObj;
var clone;
try {
clone = new File([originFileObj], originFileObj.name, {
type: originFileObj.type
});
} catch (e2) {
clone = new Blob([originFileObj], {
type: originFileObj.type
});
clone.name = originFileObj.name;
clone.lastModifiedDate = new Date();
clone.lastModified = new Date().getTime();
}
clone.uid = fileObj.uid;
triggerFileObj = clone;
} else {
fileObj.status = "uploading";
}
onInternalChange(triggerFileObj, newFileList);
});
};
var onSuccess = function onSuccess2(response, file, xhr) {
try {
if (typeof response === "string") {
response = JSON.parse(response);
}
} catch (e2) {
}
if (!getFileItem(file, mergedFileList)) {
return;
}
var targetItem = file2Obj(file);
targetItem.status = "done";
targetItem.percent = 100;
targetItem.response = response;
targetItem.xhr = xhr;
var nextFileList = updateFileList(targetItem, mergedFileList);
onInternalChange(targetItem, nextFileList);
};
var onProgress = function onProgress2(e2, file) {
if (!getFileItem(file, mergedFileList)) {
return;
}
var targetItem = file2Obj(file);
targetItem.status = "uploading";
targetItem.percent = e2.percent;
var nextFileList = updateFileList(targetItem, mergedFileList);
onInternalChange(targetItem, nextFileList, e2);
};
var onError = function onError2(error, response, file) {
if (!getFileItem(file, mergedFileList)) {
return;
}
var targetItem = file2Obj(file);
targetItem.error = error;
targetItem.response = response;
targetItem.status = "error";
var nextFileList = updateFileList(targetItem, mergedFileList);
onInternalChange(targetItem, nextFileList);
};
var handleRemove = function handleRemove2(file) {
var currentFile;
Promise.resolve(typeof onRemove === "function" ? onRemove(file) : onRemove).then(function(ret) {
var _a;
if (ret === false) {
return;
}
var removedFileList = removeFileItem(file, mergedFileList);
if (removedFileList) {
currentFile = _extends$3(_extends$3({}, file), {
status: "removed"
});
mergedFileList === null || mergedFileList === void 0 ? void 0 : mergedFileList.forEach(function(item) {
var matchKey = currentFile.uid !== void 0 ? "uid" : "name";
if (item[matchKey] === currentFile[matchKey] && !Object.isFrozen(item)) {
item.status = "removed";
}
});
(_a = upload2.current) === null || _a === void 0 ? void 0 : _a.abort(currentFile);
onInternalChange(currentFile, removedFileList);
}
});
};
var onFileDrop = function onFileDrop2(e2) {
setDragState(e2.type);
if (e2.type === "drop") {
onDrop === null || onDrop === void 0 ? void 0 : onDrop(e2);
}
};
React__namespace.useImperativeHandle(ref, function() {
return {
onBatchStart,
onSuccess,
onProgress,
onError,
fileList: mergedFileList,
upload: upload2.current
};
});
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var prefixCls = getPrefixCls("upload", customizePrefixCls);
var rcUploadProps = _extends$3(_extends$3({
onBatchStart,
onError,
onProgress,
onSuccess
}, props), {
data,
multiple,
action,
accept,
supportServerRender,
prefixCls,
disabled: mergedDisabled,
beforeUpload: mergedBeforeUpload,
onChange: void 0
});
delete rcUploadProps.className;
delete rcUploadProps.style;
if (!children || mergedDisabled) {
delete rcUploadProps.id;
}
var renderUploadList = function renderUploadList2(button, buttonVisible) {
return showUploadList ? /* @__PURE__ */ jsx(LocaleReceiver$1, {
componentName: "Upload",
defaultLocale: defaultLocale.Upload,
children: function(contextLocale) {
var _ref = typeof showUploadList === "boolean" ? {} : showUploadList, showRemoveIcon = _ref.showRemoveIcon, showPreviewIcon = _ref.showPreviewIcon, showDownloadIcon = _ref.showDownloadIcon, removeIcon = _ref.removeIcon, previewIcon = _ref.previewIcon, downloadIcon = _ref.downloadIcon;
return /* @__PURE__ */ jsx(UploadList$1, {
prefixCls,
listType,
items: mergedFileList,
previewFile,
onPreview,
onDownload,
onRemove: handleRemove,
showRemoveIcon: !mergedDisabled && showRemoveIcon,
showPreviewIcon,
showDownloadIcon,
removeIcon,
previewIcon,
downloadIcon,
iconRender,
locale: _extends$3(_extends$3({}, contextLocale), propLocale),
isImageUrl: isImageUrl2,
progress,
appendAction: button,
appendActionVisible: buttonVisible,
itemRender
});
}
}) : button;
};
if (type2 === "drag") {
var _classNames;
var dragCls = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-drag"), true), _defineProperty$b(_classNames, "".concat(prefixCls, "-drag-uploading"), mergedFileList.some(function(file) {
return file.status === "uploading";
})), _defineProperty$b(_classNames, "".concat(prefixCls, "-drag-hover"), dragState === "dragover"), _defineProperty$b(_classNames, "".concat(prefixCls, "-disabled"), mergedDisabled), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className);
return /* @__PURE__ */ jsxs("span", {
children: [/* @__PURE__ */ jsx("div", {
className: dragCls,
onDrop: onFileDrop,
onDragOver: onFileDrop,
onDragLeave: onFileDrop,
style: style2,
children: /* @__PURE__ */ jsx(Upload$2, {
...rcUploadProps,
ref: upload2,
className: "".concat(prefixCls, "-btn"),
children: /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-drag-container"),
children
})
})
}), renderUploadList()]
});
}
var uploadButtonCls = classnames(prefixCls, (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-select"), true), _defineProperty$b(_classNames2, "".concat(prefixCls, "-select-").concat(listType), true), _defineProperty$b(_classNames2, "".concat(prefixCls, "-disabled"), mergedDisabled), _defineProperty$b(_classNames2, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames2));
var renderUploadButton = function renderUploadButton2(uploadButtonStyle) {
return /* @__PURE__ */ jsx("div", {
className: uploadButtonCls,
style: uploadButtonStyle,
children: /* @__PURE__ */ jsx(Upload$2, {
...rcUploadProps,
ref: upload2
})
});
};
var uploadButton = renderUploadButton(children ? void 0 : {
display: "none"
});
if (listType === "picture-card") {
return /* @__PURE__ */ jsx("span", {
className: classnames("".concat(prefixCls, "-picture-card-wrapper"), className),
children: renderUploadList(uploadButton, !!children)
});
}
return /* @__PURE__ */ jsxs("span", {
className,
children: [uploadButton, renderUploadList()]
});
};
var Upload$1 = /* @__PURE__ */ React__namespace.forwardRef(InternalUpload);
const InternalUpload$1 = Upload$1;
var __rest$1 = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Dragger = /* @__PURE__ */ React__namespace.forwardRef(function(_a, ref) {
var style2 = _a.style, height = _a.height, restProps = __rest$1(_a, ["style", "height"]);
return /* @__PURE__ */ jsx(InternalUpload$1, {
ref,
...restProps,
type: "drag",
style: _extends$3(_extends$3({}, style2), {
height
})
});
});
const Dragger$1 = Dragger;
var Upload = InternalUpload$1;
Upload.Dragger = Dragger$1;
Upload.LIST_IGNORE = LIST_IGNORE;
const _Upload = Upload;
var monkeyWindow = window;
var GM_setValue = /* @__PURE__ */ (() => monkeyWindow.GM_setValue)();
var GM_setClipboard = /* @__PURE__ */ (() => monkeyWindow.GM_setClipboard)();
var GM_getValue = /* @__PURE__ */ (() => monkeyWindow.GM_getValue)();
const _default$o = "";
const index$X = "";
const index$W = "";
const index$V = "";
const index$U = "";
const index$T = "";
const index$S = "";
function __rest(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
}
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P ? value : new P(function(resolve) {
resolve(value);
});
}
return new (P || (P = Promise))(function(resolve, reject) {
function fulfilled(value) {
try {
step2(generator.next(value));
} catch (e2) {
reject(e2);
}
}
function rejected(value) {
try {
step2(generator["throw"](value));
} catch (e2) {
reject(e2);
}
}
function step2(result) {
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
}
step2((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
var e2 = new Error(message);
return e2.name = "SuppressedError", e2.error = error, e2.suppressed = suppressed, e2;
};
const createStoreImpl = (createState) => {
let state;
const listeners = /* @__PURE__ */ new Set();
const setState = (partial, replace) => {
const nextState = typeof partial === "function" ? partial(state) : partial;
if (!Object.is(nextState, state)) {
const previousState = state;
state = (replace != null ? replace : typeof nextState !== "object") ? nextState : Object.assign({}, state, nextState);
listeners.forEach((listener) => listener(state, previousState));
}
};
const getState = () => state;
const subscribe = (listener) => {
listeners.add(listener);
return () => listeners.delete(listener);
};
const destroy = () => {
if (({ "BASE_URL": "/", "MODE": "production", "DEV": false, "PROD": true } && "production") !== "production") {
console.warn(
"[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected."
);
}
listeners.clear();
};
const api2 = { setState, getState, subscribe, destroy };
state = createState(setState, getState, api2);
return api2;
};
const createStore$1 = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;
var withSelector = { exports: {} };
var withSelector_production_min = {};
var shim = { exports: {} };
var useSyncExternalStoreShim_production_min = {};
/**
* @license React
* use-sync-external-store-shim.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var e = React__default.default;
function h$1(a, b2) {
return a === b2 && (0 !== a || 1 / a === 1 / b2) || a !== a && b2 !== b2;
}
var k$1 = "function" === typeof Object.is ? Object.is : h$1, l = e.useState, m = e.useEffect, n$1 = e.useLayoutEffect, p$1 = e.useDebugValue;
function q$1(a, b2) {
var d2 = b2(), f2 = l({ inst: { value: d2, getSnapshot: b2 } }), c2 = f2[0].inst, g2 = f2[1];
n$1(function() {
c2.value = d2;
c2.getSnapshot = b2;
r$1(c2) && g2({ inst: c2 });
}, [a, d2, b2]);
m(function() {
r$1(c2) && g2({ inst: c2 });
return a(function() {
r$1(c2) && g2({ inst: c2 });
});
}, [a]);
p$1(d2);
return d2;
}
function r$1(a) {
var b2 = a.getSnapshot;
a = a.value;
try {
var d2 = b2();
return !k$1(a, d2);
} catch (f2) {
return true;
}
}
function t$1(a, b2) {
return b2();
}
var u$1 = "undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement ? t$1 : q$1;
useSyncExternalStoreShim_production_min.useSyncExternalStore = void 0 !== e.useSyncExternalStore ? e.useSyncExternalStore : u$1;
(function(module2) {
{
module2.exports = useSyncExternalStoreShim_production_min;
}
})(shim);
/**
* @license React
* use-sync-external-store-shim/with-selector.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var h = React__default.default, n = shim.exports;
function p(a, b2) {
return a === b2 && (0 !== a || 1 / a === 1 / b2) || a !== a && b2 !== b2;
}
var q = "function" === typeof Object.is ? Object.is : p, r = n.useSyncExternalStore, t = h.useRef, u = h.useEffect, v = h.useMemo, w = h.useDebugValue;
withSelector_production_min.useSyncExternalStoreWithSelector = function(a, b2, e2, l2, g2) {
var c2 = t(null);
if (null === c2.current) {
var f2 = { hasValue: false, value: null };
c2.current = f2;
} else
f2 = c2.current;
c2 = v(function() {
function a2(a3) {
if (!c3) {
c3 = true;
d3 = a3;
a3 = l2(a3);
if (void 0 !== g2 && f2.hasValue) {
var b3 = f2.value;
if (g2(b3, a3))
return k2 = b3;
}
return k2 = a3;
}
b3 = k2;
if (q(d3, a3))
return b3;
var e3 = l2(a3);
if (void 0 !== g2 && g2(b3, e3))
return b3;
d3 = a3;
return k2 = e3;
}
var c3 = false, d3, k2, m2 = void 0 === e2 ? null : e2;
return [function() {
return a2(b2());
}, null === m2 ? void 0 : function() {
return a2(m2());
}];
}, [b2, e2, l2, g2]);
var d2 = r(a, c2[0], c2[1]);
u(function() {
f2.hasValue = true;
f2.value = d2;
}, [d2]);
w(d2);
return d2;
};
(function(module2) {
{
module2.exports = withSelector_production_min;
}
})(withSelector);
const useSyncExternalStoreExports = /* @__PURE__ */ getDefaultExportFromCjs(withSelector.exports);
const { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports;
function useStore(api2, selector = api2.getState, equalityFn) {
const slice2 = useSyncExternalStoreWithSelector(
api2.subscribe,
api2.getState,
api2.getServerState || api2.getState,
selector,
equalityFn
);
React$a.useDebugValue(slice2);
return slice2;
}
var freeGlobal = typeof global == "object" && global && global.Object === Object && global;
const freeGlobal$1 = freeGlobal;
var freeSelf = typeof self == "object" && self && self.Object === Object && self;
var root = freeGlobal$1 || freeSelf || Function("return this")();
const root$1 = root;
var Symbol$2 = root$1.Symbol;
const Symbol$3 = Symbol$2;
var objectProto$f = Object.prototype;
var hasOwnProperty$g = objectProto$f.hasOwnProperty;
var nativeObjectToString$1 = objectProto$f.toString;
var symToStringTag$1 = Symbol$3 ? Symbol$3.toStringTag : void 0;
function getRawTag(value) {
var isOwn = hasOwnProperty$g.call(value, symToStringTag$1), tag = value[symToStringTag$1];
try {
value[symToStringTag$1] = void 0;
var unmasked = true;
} catch (e2) {
}
var result = nativeObjectToString$1.call(value);
if (unmasked) {
if (isOwn) {
value[symToStringTag$1] = tag;
} else {
delete value[symToStringTag$1];
}
}
return result;
}
var objectProto$e = Object.prototype;
var nativeObjectToString = objectProto$e.toString;
function objectToString(value) {
return nativeObjectToString.call(value);
}
var nullTag = "[object Null]", undefinedTag = "[object Undefined]";
var symToStringTag = Symbol$3 ? Symbol$3.toStringTag : void 0;
function baseGetTag(value) {
if (value == null) {
return value === void 0 ? undefinedTag : nullTag;
}
return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value);
}
function isObjectLike(value) {
return value != null && typeof value == "object";
}
var symbolTag$3 = "[object Symbol]";
function isSymbol$1(value) {
return typeof value == "symbol" || isObjectLike(value) && baseGetTag(value) == symbolTag$3;
}
function arrayMap(array2, iteratee) {
var index2 = -1, length = array2 == null ? 0 : array2.length, result = Array(length);
while (++index2 < length) {
result[index2] = iteratee(array2[index2], index2, array2);
}
return result;
}
var isArray$3 = Array.isArray;
const isArray$4 = isArray$3;
var INFINITY$1 = 1 / 0;
var symbolProto$2 = Symbol$3 ? Symbol$3.prototype : void 0, symbolToString = symbolProto$2 ? symbolProto$2.toString : void 0;
function baseToString(value) {
if (typeof value == "string") {
return value;
}
if (isArray$4(value)) {
return arrayMap(value, baseToString) + "";
}
if (isSymbol$1(value)) {
return symbolToString ? symbolToString.call(value) : "";
}
var result = value + "";
return result == "0" && 1 / value == -INFINITY$1 ? "-0" : result;
}
function isObject$6(value) {
var type2 = typeof value;
return value != null && (type2 == "object" || type2 == "function");
}
function identity$1(value) {
return value;
}
var asyncTag = "[object AsyncFunction]", funcTag$2 = "[object Function]", genTag$1 = "[object GeneratorFunction]", proxyTag = "[object Proxy]";
function isFunction$3(value) {
if (!isObject$6(value)) {
return false;
}
var tag = baseGetTag(value);
return tag == funcTag$2 || tag == genTag$1 || tag == asyncTag || tag == proxyTag;
}
var coreJsData = root$1["__core-js_shared__"];
const coreJsData$1 = coreJsData;
var maskSrcKey = function() {
var uid2 = /[^.]+$/.exec(coreJsData$1 && coreJsData$1.keys && coreJsData$1.keys.IE_PROTO || "");
return uid2 ? "Symbol(src)_1." + uid2 : "";
}();
function isMasked(func) {
return !!maskSrcKey && maskSrcKey in func;
}
var funcProto$1 = Function.prototype;
var funcToString$1 = funcProto$1.toString;
function toSource(func) {
if (func != null) {
try {
return funcToString$1.call(func);
} catch (e2) {
}
try {
return func + "";
} catch (e2) {
}
}
return "";
}
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
var reIsHostCtor = /^\[object .+?Constructor\]$/;
var funcProto = Function.prototype, objectProto$d = Object.prototype;
var funcToString = funcProto.toString;
var hasOwnProperty$f = objectProto$d.hasOwnProperty;
var reIsNative = RegExp(
"^" + funcToString.call(hasOwnProperty$f).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"
);
function baseIsNative(value) {
if (!isObject$6(value) || isMasked(value)) {
return false;
}
var pattern2 = isFunction$3(value) ? reIsNative : reIsHostCtor;
return pattern2.test(toSource(value));
}
function getValue(object2, key2) {
return object2 == null ? void 0 : object2[key2];
}
function getNative(object2, key2) {
var value = getValue(object2, key2);
return baseIsNative(value) ? value : void 0;
}
var WeakMap$1 = getNative(root$1, "WeakMap");
const WeakMap$2 = WeakMap$1;
var objectCreate = Object.create;
var baseCreate = function() {
function object2() {
}
return function(proto2) {
if (!isObject$6(proto2)) {
return {};
}
if (objectCreate) {
return objectCreate(proto2);
}
object2.prototype = proto2;
var result = new object2();
object2.prototype = void 0;
return result;
};
}();
const baseCreate$1 = baseCreate;
function copyArray(source, array2) {
var index2 = -1, length = source.length;
array2 || (array2 = Array(length));
while (++index2 < length) {
array2[index2] = source[index2];
}
return array2;
}
var defineProperty$4 = function() {
try {
var func = getNative(Object, "defineProperty");
func({}, "", {});
return func;
} catch (e2) {
}
}();
const defineProperty$5 = defineProperty$4;
function arrayEach(array2, iteratee) {
var index2 = -1, length = array2 == null ? 0 : array2.length;
while (++index2 < length) {
if (iteratee(array2[index2], index2, array2) === false) {
break;
}
}
return array2;
}
var MAX_SAFE_INTEGER$1 = 9007199254740991;
var reIsUint = /^(?:0|[1-9]\d*)$/;
function isIndex(value, length) {
var type2 = typeof value;
length = length == null ? MAX_SAFE_INTEGER$1 : length;
return !!length && (type2 == "number" || type2 != "symbol" && reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length);
}
function baseAssignValue(object2, key2, value) {
if (key2 == "__proto__" && defineProperty$5) {
defineProperty$5(object2, key2, {
"configurable": true,
"enumerable": true,
"value": value,
"writable": true
});
} else {
object2[key2] = value;
}
}
function eq(value, other) {
return value === other || value !== value && other !== other;
}
var objectProto$c = Object.prototype;
var hasOwnProperty$e = objectProto$c.hasOwnProperty;
function assignValue(object2, key2, value) {
var objValue = object2[key2];
if (!(hasOwnProperty$e.call(object2, key2) && eq(objValue, value)) || value === void 0 && !(key2 in object2)) {
baseAssignValue(object2, key2, value);
}
}
function copyObject(source, props, object2, customizer) {
var isNew = !object2;
object2 || (object2 = {});
var index2 = -1, length = props.length;
while (++index2 < length) {
var key2 = props[index2];
var newValue = customizer ? customizer(object2[key2], source[key2], key2, object2, source) : void 0;
if (newValue === void 0) {
newValue = source[key2];
}
if (isNew) {
baseAssignValue(object2, key2, newValue);
} else {
assignValue(object2, key2, newValue);
}
}
return object2;
}
var MAX_SAFE_INTEGER = 9007199254740991;
function isLength(value) {
return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
}
function isArrayLike(value) {
return value != null && isLength(value.length) && !isFunction$3(value);
}
function isIterateeCall(value, index2, object2) {
if (!isObject$6(object2)) {
return false;
}
var type2 = typeof index2;
if (type2 == "number" ? isArrayLike(object2) && isIndex(index2, object2.length) : type2 == "string" && index2 in object2) {
return eq(object2[index2], value);
}
return false;
}
var objectProto$b = Object.prototype;
function isPrototype(value) {
var Ctor = value && value.constructor, proto2 = typeof Ctor == "function" && Ctor.prototype || objectProto$b;
return value === proto2;
}
function baseTimes(n2, iteratee) {
var index2 = -1, result = Array(n2);
while (++index2 < n2) {
result[index2] = iteratee(index2);
}
return result;
}
var argsTag$3 = "[object Arguments]";
function baseIsArguments(value) {
return isObjectLike(value) && baseGetTag(value) == argsTag$3;
}
var objectProto$a = Object.prototype;
var hasOwnProperty$d = objectProto$a.hasOwnProperty;
var propertyIsEnumerable$1 = objectProto$a.propertyIsEnumerable;
var isArguments = baseIsArguments(function() {
return arguments;
}()) ? baseIsArguments : function(value) {
return isObjectLike(value) && hasOwnProperty$d.call(value, "callee") && !propertyIsEnumerable$1.call(value, "callee");
};
const isArguments$1 = isArguments;
function stubFalse() {
return false;
}
var freeExports$2 = typeof exports == "object" && exports && !exports.nodeType && exports;
var freeModule$2 = freeExports$2 && typeof module == "object" && module && !module.nodeType && module;
var moduleExports$2 = freeModule$2 && freeModule$2.exports === freeExports$2;
var Buffer$2 = moduleExports$2 ? root$1.Buffer : void 0;
var nativeIsBuffer = Buffer$2 ? Buffer$2.isBuffer : void 0;
var isBuffer$1 = nativeIsBuffer || stubFalse;
const isBuffer$2 = isBuffer$1;
var argsTag$2 = "[object Arguments]", arrayTag$2 = "[object Array]", boolTag$3 = "[object Boolean]", dateTag$3 = "[object Date]", errorTag$2 = "[object Error]", funcTag$1 = "[object Function]", mapTag$5 = "[object Map]", numberTag$3 = "[object Number]", objectTag$3 = "[object Object]", regexpTag$3 = "[object RegExp]", setTag$5 = "[object Set]", stringTag$3 = "[object String]", weakMapTag$2 = "[object WeakMap]";
var arrayBufferTag$3 = "[object ArrayBuffer]", dataViewTag$4 = "[object DataView]", float32Tag$2 = "[object Float32Array]", float64Tag$2 = "[object Float64Array]", int8Tag$2 = "[object Int8Array]", int16Tag$2 = "[object Int16Array]", int32Tag$2 = "[object Int32Array]", uint8Tag$2 = "[object Uint8Array]", uint8ClampedTag$2 = "[object Uint8ClampedArray]", uint16Tag$2 = "[object Uint16Array]", uint32Tag$2 = "[object Uint32Array]";
var typedArrayTags = {};
typedArrayTags[float32Tag$2] = typedArrayTags[float64Tag$2] = typedArrayTags[int8Tag$2] = typedArrayTags[int16Tag$2] = typedArrayTags[int32Tag$2] = typedArrayTags[uint8Tag$2] = typedArrayTags[uint8ClampedTag$2] = typedArrayTags[uint16Tag$2] = typedArrayTags[uint32Tag$2] = true;
typedArrayTags[argsTag$2] = typedArrayTags[arrayTag$2] = typedArrayTags[arrayBufferTag$3] = typedArrayTags[boolTag$3] = typedArrayTags[dataViewTag$4] = typedArrayTags[dateTag$3] = typedArrayTags[errorTag$2] = typedArrayTags[funcTag$1] = typedArrayTags[mapTag$5] = typedArrayTags[numberTag$3] = typedArrayTags[objectTag$3] = typedArrayTags[regexpTag$3] = typedArrayTags[setTag$5] = typedArrayTags[stringTag$3] = typedArrayTags[weakMapTag$2] = false;
function baseIsTypedArray(value) {
return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
}
function baseUnary(func) {
return function(value) {
return func(value);
};
}
var freeExports$1 = typeof exports == "object" && exports && !exports.nodeType && exports;
var freeModule$1 = freeExports$1 && typeof module == "object" && module && !module.nodeType && module;
var moduleExports$1 = freeModule$1 && freeModule$1.exports === freeExports$1;
var freeProcess = moduleExports$1 && freeGlobal$1.process;
var nodeUtil = function() {
try {
var types2 = freeModule$1 && freeModule$1.require && freeModule$1.require("util").types;
if (types2) {
return types2;
}
return freeProcess && freeProcess.binding && freeProcess.binding("util");
} catch (e2) {
}
}();
const nodeUtil$1 = nodeUtil;
var nodeIsTypedArray = nodeUtil$1 && nodeUtil$1.isTypedArray;
var isTypedArray$1 = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
const isTypedArray$2 = isTypedArray$1;
var objectProto$9 = Object.prototype;
var hasOwnProperty$c = objectProto$9.hasOwnProperty;
function arrayLikeKeys(value, inherited) {
var isArr = isArray$4(value), isArg = !isArr && isArguments$1(value), isBuff = !isArr && !isArg && isBuffer$2(value), isType = !isArr && !isArg && !isBuff && isTypedArray$2(value), skipIndexes = isArr || isArg || isBuff || isType, result = skipIndexes ? baseTimes(value.length, String) : [], length = result.length;
for (var key2 in value) {
if ((inherited || hasOwnProperty$c.call(value, key2)) && !(skipIndexes && (key2 == "length" || isBuff && (key2 == "offset" || key2 == "parent") || isType && (key2 == "buffer" || key2 == "byteLength" || key2 == "byteOffset") || isIndex(key2, length)))) {
result.push(key2);
}
}
return result;
}
function overArg(func, transform) {
return function(arg) {
return func(transform(arg));
};
}
var nativeKeys = overArg(Object.keys, Object);
const nativeKeys$1 = nativeKeys;
var objectProto$8 = Object.prototype;
var hasOwnProperty$b = objectProto$8.hasOwnProperty;
function baseKeys(object2) {
if (!isPrototype(object2)) {
return nativeKeys$1(object2);
}
var result = [];
for (var key2 in Object(object2)) {
if (hasOwnProperty$b.call(object2, key2) && key2 != "constructor") {
result.push(key2);
}
}
return result;
}
function keys(object2) {
return isArrayLike(object2) ? arrayLikeKeys(object2) : baseKeys(object2);
}
function nativeKeysIn(object2) {
var result = [];
if (object2 != null) {
for (var key2 in Object(object2)) {
result.push(key2);
}
}
return result;
}
var objectProto$7 = Object.prototype;
var hasOwnProperty$a = objectProto$7.hasOwnProperty;
function baseKeysIn(object2) {
if (!isObject$6(object2)) {
return nativeKeysIn(object2);
}
var isProto = isPrototype(object2), result = [];
for (var key2 in object2) {
if (!(key2 == "constructor" && (isProto || !hasOwnProperty$a.call(object2, key2)))) {
result.push(key2);
}
}
return result;
}
function keysIn(object2) {
return isArrayLike(object2) ? arrayLikeKeys(object2, true) : baseKeysIn(object2);
}
var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/;
function isKey(value, object2) {
if (isArray$4(value)) {
return false;
}
var type2 = typeof value;
if (type2 == "number" || type2 == "symbol" || type2 == "boolean" || value == null || isSymbol$1(value)) {
return true;
}
return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object2 != null && value in Object(object2);
}
var nativeCreate = getNative(Object, "create");
const nativeCreate$1 = nativeCreate;
function hashClear() {
this.__data__ = nativeCreate$1 ? nativeCreate$1(null) : {};
this.size = 0;
}
function hashDelete(key2) {
var result = this.has(key2) && delete this.__data__[key2];
this.size -= result ? 1 : 0;
return result;
}
var HASH_UNDEFINED$2 = "__lodash_hash_undefined__";
var objectProto$6 = Object.prototype;
var hasOwnProperty$9 = objectProto$6.hasOwnProperty;
function hashGet(key2) {
var data = this.__data__;
if (nativeCreate$1) {
var result = data[key2];
return result === HASH_UNDEFINED$2 ? void 0 : result;
}
return hasOwnProperty$9.call(data, key2) ? data[key2] : void 0;
}
var objectProto$5 = Object.prototype;
var hasOwnProperty$8 = objectProto$5.hasOwnProperty;
function hashHas(key2) {
var data = this.__data__;
return nativeCreate$1 ? data[key2] !== void 0 : hasOwnProperty$8.call(data, key2);
}
var HASH_UNDEFINED$1 = "__lodash_hash_undefined__";
function hashSet(key2, value) {
var data = this.__data__;
this.size += this.has(key2) ? 0 : 1;
data[key2] = nativeCreate$1 && value === void 0 ? HASH_UNDEFINED$1 : value;
return this;
}
function Hash(entries) {
var index2 = -1, length = entries == null ? 0 : entries.length;
this.clear();
while (++index2 < length) {
var entry = entries[index2];
this.set(entry[0], entry[1]);
}
}
Hash.prototype.clear = hashClear;
Hash.prototype["delete"] = hashDelete;
Hash.prototype.get = hashGet;
Hash.prototype.has = hashHas;
Hash.prototype.set = hashSet;
function listCacheClear() {
this.__data__ = [];
this.size = 0;
}
function assocIndexOf(array2, key2) {
var length = array2.length;
while (length--) {
if (eq(array2[length][0], key2)) {
return length;
}
}
return -1;
}
var arrayProto = Array.prototype;
var splice = arrayProto.splice;
function listCacheDelete(key2) {
var data = this.__data__, index2 = assocIndexOf(data, key2);
if (index2 < 0) {
return false;
}
var lastIndex = data.length - 1;
if (index2 == lastIndex) {
data.pop();
} else {
splice.call(data, index2, 1);
}
--this.size;
return true;
}
function listCacheGet(key2) {
var data = this.__data__, index2 = assocIndexOf(data, key2);
return index2 < 0 ? void 0 : data[index2][1];
}
function listCacheHas(key2) {
return assocIndexOf(this.__data__, key2) > -1;
}
function listCacheSet(key2, value) {
var data = this.__data__, index2 = assocIndexOf(data, key2);
if (index2 < 0) {
++this.size;
data.push([key2, value]);
} else {
data[index2][1] = value;
}
return this;
}
function ListCache(entries) {
var index2 = -1, length = entries == null ? 0 : entries.length;
this.clear();
while (++index2 < length) {
var entry = entries[index2];
this.set(entry[0], entry[1]);
}
}
ListCache.prototype.clear = listCacheClear;
ListCache.prototype["delete"] = listCacheDelete;
ListCache.prototype.get = listCacheGet;
ListCache.prototype.has = listCacheHas;
ListCache.prototype.set = listCacheSet;
var Map$1 = getNative(root$1, "Map");
const Map$2 = Map$1;
function mapCacheClear() {
this.size = 0;
this.__data__ = {
"hash": new Hash(),
"map": new (Map$2 || ListCache)(),
"string": new Hash()
};
}
function isKeyable(value) {
var type2 = typeof value;
return type2 == "string" || type2 == "number" || type2 == "symbol" || type2 == "boolean" ? value !== "__proto__" : value === null;
}
function getMapData(map, key2) {
var data = map.__data__;
return isKeyable(key2) ? data[typeof key2 == "string" ? "string" : "hash"] : data.map;
}
function mapCacheDelete(key2) {
var result = getMapData(this, key2)["delete"](key2);
this.size -= result ? 1 : 0;
return result;
}
function mapCacheGet(key2) {
return getMapData(this, key2).get(key2);
}
function mapCacheHas(key2) {
return getMapData(this, key2).has(key2);
}
function mapCacheSet(key2, value) {
var data = getMapData(this, key2), size = data.size;
data.set(key2, value);
this.size += data.size == size ? 0 : 1;
return this;
}
function MapCache(entries) {
var index2 = -1, length = entries == null ? 0 : entries.length;
this.clear();
while (++index2 < length) {
var entry = entries[index2];
this.set(entry[0], entry[1]);
}
}
MapCache.prototype.clear = mapCacheClear;
MapCache.prototype["delete"] = mapCacheDelete;
MapCache.prototype.get = mapCacheGet;
MapCache.prototype.has = mapCacheHas;
MapCache.prototype.set = mapCacheSet;
var FUNC_ERROR_TEXT$1 = "Expected a function";
function memoize(func, resolver) {
if (typeof func != "function" || resolver != null && typeof resolver != "function") {
throw new TypeError(FUNC_ERROR_TEXT$1);
}
var memoized = function() {
var args = arguments, key2 = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache;
if (cache.has(key2)) {
return cache.get(key2);
}
var result = func.apply(this, args);
memoized.cache = cache.set(key2, result) || cache;
return result;
};
memoized.cache = new (memoize.Cache || MapCache)();
return memoized;
}
memoize.Cache = MapCache;
var MAX_MEMOIZE_SIZE = 500;
function memoizeCapped(func) {
var result = memoize(func, function(key2) {
if (cache.size === MAX_MEMOIZE_SIZE) {
cache.clear();
}
return key2;
});
var cache = result.cache;
return result;
}
var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
var reEscapeChar = /\\(\\)?/g;
var stringToPath = memoizeCapped(function(string2) {
var result = [];
if (string2.charCodeAt(0) === 46) {
result.push("");
}
string2.replace(rePropName, function(match2, number2, quote, subString) {
result.push(quote ? subString.replace(reEscapeChar, "$1") : number2 || match2);
});
return result;
});
const stringToPath$1 = stringToPath;
function toString$3(value) {
return value == null ? "" : baseToString(value);
}
function castPath(value, object2) {
if (isArray$4(value)) {
return value;
}
return isKey(value, object2) ? [value] : stringToPath$1(toString$3(value));
}
var INFINITY = 1 / 0;
function toKey(value) {
if (typeof value == "string" || isSymbol$1(value)) {
return value;
}
var result = value + "";
return result == "0" && 1 / value == -INFINITY ? "-0" : result;
}
function baseGet(object2, path2) {
path2 = castPath(path2, object2);
var index2 = 0, length = path2.length;
while (object2 != null && index2 < length) {
object2 = object2[toKey(path2[index2++])];
}
return index2 && index2 == length ? object2 : void 0;
}
function get(object2, path2, defaultValue) {
var result = object2 == null ? void 0 : baseGet(object2, path2);
return result === void 0 ? defaultValue : result;
}
function arrayPush(array2, values) {
var index2 = -1, length = values.length, offset2 = array2.length;
while (++index2 < length) {
array2[offset2 + index2] = values[index2];
}
return array2;
}
var getPrototype = overArg(Object.getPrototypeOf, Object);
const getPrototype$1 = getPrototype;
function baseSlice(array2, start, end) {
var index2 = -1, length = array2.length;
if (start < 0) {
start = -start > length ? 0 : length + start;
}
end = end > length ? length : end;
if (end < 0) {
end += length;
}
length = start > end ? 0 : end - start >>> 0;
start >>>= 0;
var result = Array(length);
while (++index2 < length) {
result[index2] = array2[index2 + start];
}
return result;
}
function stackClear() {
this.__data__ = new ListCache();
this.size = 0;
}
function stackDelete(key2) {
var data = this.__data__, result = data["delete"](key2);
this.size = data.size;
return result;
}
function stackGet(key2) {
return this.__data__.get(key2);
}
function stackHas(key2) {
return this.__data__.has(key2);
}
var LARGE_ARRAY_SIZE = 200;
function stackSet(key2, value) {
var data = this.__data__;
if (data instanceof ListCache) {
var pairs = data.__data__;
if (!Map$2 || pairs.length < LARGE_ARRAY_SIZE - 1) {
pairs.push([key2, value]);
this.size = ++data.size;
return this;
}
data = this.__data__ = new MapCache(pairs);
}
data.set(key2, value);
this.size = data.size;
return this;
}
function Stack(entries) {
var data = this.__data__ = new ListCache(entries);
this.size = data.size;
}
Stack.prototype.clear = stackClear;
Stack.prototype["delete"] = stackDelete;
Stack.prototype.get = stackGet;
Stack.prototype.has = stackHas;
Stack.prototype.set = stackSet;
function baseAssign(object2, source) {
return object2 && copyObject(source, keys(source), object2);
}
function baseAssignIn(object2, source) {
return object2 && copyObject(source, keysIn(source), object2);
}
var freeExports = typeof exports == "object" && exports && !exports.nodeType && exports;
var freeModule = freeExports && typeof module == "object" && module && !module.nodeType && module;
var moduleExports = freeModule && freeModule.exports === freeExports;
var Buffer$1 = moduleExports ? root$1.Buffer : void 0, allocUnsafe = Buffer$1 ? Buffer$1.allocUnsafe : void 0;
function cloneBuffer(buffer2, isDeep) {
if (isDeep) {
return buffer2.slice();
}
var length = buffer2.length, result = allocUnsafe ? allocUnsafe(length) : new buffer2.constructor(length);
buffer2.copy(result);
return result;
}
function arrayFilter(array2, predicate) {
var index2 = -1, length = array2 == null ? 0 : array2.length, resIndex = 0, result = [];
while (++index2 < length) {
var value = array2[index2];
if (predicate(value, index2, array2)) {
result[resIndex++] = value;
}
}
return result;
}
function stubArray() {
return [];
}
var objectProto$4 = Object.prototype;
var propertyIsEnumerable = objectProto$4.propertyIsEnumerable;
var nativeGetSymbols$1 = Object.getOwnPropertySymbols;
var getSymbols = !nativeGetSymbols$1 ? stubArray : function(object2) {
if (object2 == null) {
return [];
}
object2 = Object(object2);
return arrayFilter(nativeGetSymbols$1(object2), function(symbol2) {
return propertyIsEnumerable.call(object2, symbol2);
});
};
const getSymbols$1 = getSymbols;
function copySymbols(source, object2) {
return copyObject(source, getSymbols$1(source), object2);
}
var nativeGetSymbols = Object.getOwnPropertySymbols;
var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object2) {
var result = [];
while (object2) {
arrayPush(result, getSymbols$1(object2));
object2 = getPrototype$1(object2);
}
return result;
};
const getSymbolsIn$1 = getSymbolsIn;
function copySymbolsIn(source, object2) {
return copyObject(source, getSymbolsIn$1(source), object2);
}
function baseGetAllKeys(object2, keysFunc, symbolsFunc) {
var result = keysFunc(object2);
return isArray$4(object2) ? result : arrayPush(result, symbolsFunc(object2));
}
function getAllKeys(object2) {
return baseGetAllKeys(object2, keys, getSymbols$1);
}
function getAllKeysIn(object2) {
return baseGetAllKeys(object2, keysIn, getSymbolsIn$1);
}
var DataView = getNative(root$1, "DataView");
const DataView$1 = DataView;
var Promise$1 = getNative(root$1, "Promise");
const Promise$2 = Promise$1;
var Set$1 = getNative(root$1, "Set");
const Set$2 = Set$1;
var mapTag$4 = "[object Map]", objectTag$2 = "[object Object]", promiseTag = "[object Promise]", setTag$4 = "[object Set]", weakMapTag$1 = "[object WeakMap]";
var dataViewTag$3 = "[object DataView]";
var dataViewCtorString = toSource(DataView$1), mapCtorString = toSource(Map$2), promiseCtorString = toSource(Promise$2), setCtorString = toSource(Set$2), weakMapCtorString = toSource(WeakMap$2);
var getTag = baseGetTag;
if (DataView$1 && getTag(new DataView$1(new ArrayBuffer(1))) != dataViewTag$3 || Map$2 && getTag(new Map$2()) != mapTag$4 || Promise$2 && getTag(Promise$2.resolve()) != promiseTag || Set$2 && getTag(new Set$2()) != setTag$4 || WeakMap$2 && getTag(new WeakMap$2()) != weakMapTag$1) {
getTag = function(value) {
var result = baseGetTag(value), Ctor = result == objectTag$2 ? value.constructor : void 0, ctorString = Ctor ? toSource(Ctor) : "";
if (ctorString) {
switch (ctorString) {
case dataViewCtorString:
return dataViewTag$3;
case mapCtorString:
return mapTag$4;
case promiseCtorString:
return promiseTag;
case setCtorString:
return setTag$4;
case weakMapCtorString:
return weakMapTag$1;
}
}
return result;
};
}
const getTag$1 = getTag;
var objectProto$3 = Object.prototype;
var hasOwnProperty$7 = objectProto$3.hasOwnProperty;
function initCloneArray(array2) {
var length = array2.length, result = new array2.constructor(length);
if (length && typeof array2[0] == "string" && hasOwnProperty$7.call(array2, "index")) {
result.index = array2.index;
result.input = array2.input;
}
return result;
}
var Uint8Array$1 = root$1.Uint8Array;
const Uint8Array$2 = Uint8Array$1;
function cloneArrayBuffer(arrayBuffer) {
var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
new Uint8Array$2(result).set(new Uint8Array$2(arrayBuffer));
return result;
}
function cloneDataView(dataView, isDeep) {
var buffer2 = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
return new dataView.constructor(buffer2, dataView.byteOffset, dataView.byteLength);
}
var reFlags = /\w*$/;
function cloneRegExp(regexp2) {
var result = new regexp2.constructor(regexp2.source, reFlags.exec(regexp2));
result.lastIndex = regexp2.lastIndex;
return result;
}
var symbolProto$1 = Symbol$3 ? Symbol$3.prototype : void 0, symbolValueOf$1 = symbolProto$1 ? symbolProto$1.valueOf : void 0;
function cloneSymbol(symbol2) {
return symbolValueOf$1 ? Object(symbolValueOf$1.call(symbol2)) : {};
}
function cloneTypedArray(typedArray, isDeep) {
var buffer2 = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
return new typedArray.constructor(buffer2, typedArray.byteOffset, typedArray.length);
}
var boolTag$2 = "[object Boolean]", dateTag$2 = "[object Date]", mapTag$3 = "[object Map]", numberTag$2 = "[object Number]", regexpTag$2 = "[object RegExp]", setTag$3 = "[object Set]", stringTag$2 = "[object String]", symbolTag$2 = "[object Symbol]";
var arrayBufferTag$2 = "[object ArrayBuffer]", dataViewTag$2 = "[object DataView]", float32Tag$1 = "[object Float32Array]", float64Tag$1 = "[object Float64Array]", int8Tag$1 = "[object Int8Array]", int16Tag$1 = "[object Int16Array]", int32Tag$1 = "[object Int32Array]", uint8Tag$1 = "[object Uint8Array]", uint8ClampedTag$1 = "[object Uint8ClampedArray]", uint16Tag$1 = "[object Uint16Array]", uint32Tag$1 = "[object Uint32Array]";
function initCloneByTag(object2, tag, isDeep) {
var Ctor = object2.constructor;
switch (tag) {
case arrayBufferTag$2:
return cloneArrayBuffer(object2);
case boolTag$2:
case dateTag$2:
return new Ctor(+object2);
case dataViewTag$2:
return cloneDataView(object2, isDeep);
case float32Tag$1:
case float64Tag$1:
case int8Tag$1:
case int16Tag$1:
case int32Tag$1:
case uint8Tag$1:
case uint8ClampedTag$1:
case uint16Tag$1:
case uint32Tag$1:
return cloneTypedArray(object2, isDeep);
case mapTag$3:
return new Ctor();
case numberTag$2:
case stringTag$2:
return new Ctor(object2);
case regexpTag$2:
return cloneRegExp(object2);
case setTag$3:
return new Ctor();
case symbolTag$2:
return cloneSymbol(object2);
}
}
function initCloneObject(object2) {
return typeof object2.constructor == "function" && !isPrototype(object2) ? baseCreate$1(getPrototype$1(object2)) : {};
}
var mapTag$2 = "[object Map]";
function baseIsMap(value) {
return isObjectLike(value) && getTag$1(value) == mapTag$2;
}
var nodeIsMap = nodeUtil$1 && nodeUtil$1.isMap;
var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
const isMap$1 = isMap;
var setTag$2 = "[object Set]";
function baseIsSet(value) {
return isObjectLike(value) && getTag$1(value) == setTag$2;
}
var nodeIsSet = nodeUtil$1 && nodeUtil$1.isSet;
var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
const isSet$1 = isSet;
var CLONE_DEEP_FLAG$1 = 1, CLONE_FLAT_FLAG = 2, CLONE_SYMBOLS_FLAG$1 = 4;
var argsTag$1 = "[object Arguments]", arrayTag$1 = "[object Array]", boolTag$1 = "[object Boolean]", dateTag$1 = "[object Date]", errorTag$1 = "[object Error]", funcTag = "[object Function]", genTag = "[object GeneratorFunction]", mapTag$1 = "[object Map]", numberTag$1 = "[object Number]", objectTag$1 = "[object Object]", regexpTag$1 = "[object RegExp]", setTag$1 = "[object Set]", stringTag$1 = "[object String]", symbolTag$1 = "[object Symbol]", weakMapTag = "[object WeakMap]";
var arrayBufferTag$1 = "[object ArrayBuffer]", dataViewTag$1 = "[object DataView]", float32Tag = "[object Float32Array]", float64Tag = "[object Float64Array]", int8Tag = "[object Int8Array]", int16Tag = "[object Int16Array]", int32Tag = "[object Int32Array]", uint8Tag = "[object Uint8Array]", uint8ClampedTag = "[object Uint8ClampedArray]", uint16Tag = "[object Uint16Array]", uint32Tag = "[object Uint32Array]";
var cloneableTags = {};
cloneableTags[argsTag$1] = cloneableTags[arrayTag$1] = cloneableTags[arrayBufferTag$1] = cloneableTags[dataViewTag$1] = cloneableTags[boolTag$1] = cloneableTags[dateTag$1] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[mapTag$1] = cloneableTags[numberTag$1] = cloneableTags[objectTag$1] = cloneableTags[regexpTag$1] = cloneableTags[setTag$1] = cloneableTags[stringTag$1] = cloneableTags[symbolTag$1] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
cloneableTags[errorTag$1] = cloneableTags[funcTag] = cloneableTags[weakMapTag] = false;
function baseClone(value, bitmask, customizer, key2, object2, stack) {
var result, isDeep = bitmask & CLONE_DEEP_FLAG$1, isFlat = bitmask & CLONE_FLAT_FLAG, isFull = bitmask & CLONE_SYMBOLS_FLAG$1;
if (customizer) {
result = object2 ? customizer(value, key2, object2, stack) : customizer(value);
}
if (result !== void 0) {
return result;
}
if (!isObject$6(value)) {
return value;
}
var isArr = isArray$4(value);
if (isArr) {
result = initCloneArray(value);
if (!isDeep) {
return copyArray(value, result);
}
} else {
var tag = getTag$1(value), isFunc = tag == funcTag || tag == genTag;
if (isBuffer$2(value)) {
return cloneBuffer(value, isDeep);
}
if (tag == objectTag$1 || tag == argsTag$1 || isFunc && !object2) {
result = isFlat || isFunc ? {} : initCloneObject(value);
if (!isDeep) {
return isFlat ? copySymbolsIn(value, baseAssignIn(result, value)) : copySymbols(value, baseAssign(result, value));
}
} else {
if (!cloneableTags[tag]) {
return object2 ? value : {};
}
result = initCloneByTag(value, tag, isDeep);
}
}
stack || (stack = new Stack());
var stacked = stack.get(value);
if (stacked) {
return stacked;
}
stack.set(value, result);
if (isSet$1(value)) {
value.forEach(function(subValue) {
result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
});
} else if (isMap$1(value)) {
value.forEach(function(subValue, key3) {
result.set(key3, baseClone(subValue, bitmask, customizer, key3, value, stack));
});
}
var keysFunc = isFull ? isFlat ? getAllKeysIn : getAllKeys : isFlat ? keysIn : keys;
var props = isArr ? void 0 : keysFunc(value);
arrayEach(props || value, function(subValue, key3) {
if (props) {
key3 = subValue;
subValue = value[key3];
}
assignValue(result, key3, baseClone(subValue, bitmask, customizer, key3, value, stack));
});
return result;
}
var CLONE_DEEP_FLAG = 1, CLONE_SYMBOLS_FLAG = 4;
function cloneDeep(value) {
return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
}
var HASH_UNDEFINED = "__lodash_hash_undefined__";
function setCacheAdd(value) {
this.__data__.set(value, HASH_UNDEFINED);
return this;
}
function setCacheHas(value) {
return this.__data__.has(value);
}
function SetCache(values) {
var index2 = -1, length = values == null ? 0 : values.length;
this.__data__ = new MapCache();
while (++index2 < length) {
this.add(values[index2]);
}
}
SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
SetCache.prototype.has = setCacheHas;
function arraySome(array2, predicate) {
var index2 = -1, length = array2 == null ? 0 : array2.length;
while (++index2 < length) {
if (predicate(array2[index2], index2, array2)) {
return true;
}
}
return false;
}
function cacheHas(cache, key2) {
return cache.has(key2);
}
var COMPARE_PARTIAL_FLAG$5 = 1, COMPARE_UNORDERED_FLAG$3 = 2;
function equalArrays(array2, other, bitmask, customizer, equalFunc, stack) {
var isPartial = bitmask & COMPARE_PARTIAL_FLAG$5, arrLength = array2.length, othLength = other.length;
if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
return false;
}
var arrStacked = stack.get(array2);
var othStacked = stack.get(other);
if (arrStacked && othStacked) {
return arrStacked == other && othStacked == array2;
}
var index2 = -1, result = true, seen = bitmask & COMPARE_UNORDERED_FLAG$3 ? new SetCache() : void 0;
stack.set(array2, other);
stack.set(other, array2);
while (++index2 < arrLength) {
var arrValue = array2[index2], othValue = other[index2];
if (customizer) {
var compared = isPartial ? customizer(othValue, arrValue, index2, other, array2, stack) : customizer(arrValue, othValue, index2, array2, other, stack);
}
if (compared !== void 0) {
if (compared) {
continue;
}
result = false;
break;
}
if (seen) {
if (!arraySome(other, function(othValue2, othIndex) {
if (!cacheHas(seen, othIndex) && (arrValue === othValue2 || equalFunc(arrValue, othValue2, bitmask, customizer, stack))) {
return seen.push(othIndex);
}
})) {
result = false;
break;
}
} else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
result = false;
break;
}
}
stack["delete"](array2);
stack["delete"](other);
return result;
}
function mapToArray(map) {
var index2 = -1, result = Array(map.size);
map.forEach(function(value, key2) {
result[++index2] = [key2, value];
});
return result;
}
function setToArray(set2) {
var index2 = -1, result = Array(set2.size);
set2.forEach(function(value) {
result[++index2] = value;
});
return result;
}
var COMPARE_PARTIAL_FLAG$4 = 1, COMPARE_UNORDERED_FLAG$2 = 2;
var boolTag = "[object Boolean]", dateTag = "[object Date]", errorTag = "[object Error]", mapTag = "[object Map]", numberTag = "[object Number]", regexpTag = "[object RegExp]", setTag = "[object Set]", stringTag = "[object String]", symbolTag = "[object Symbol]";
var arrayBufferTag = "[object ArrayBuffer]", dataViewTag = "[object DataView]";
var symbolProto = Symbol$3 ? Symbol$3.prototype : void 0, symbolValueOf = symbolProto ? symbolProto.valueOf : void 0;
function equalByTag(object2, other, tag, bitmask, customizer, equalFunc, stack) {
switch (tag) {
case dataViewTag:
if (object2.byteLength != other.byteLength || object2.byteOffset != other.byteOffset) {
return false;
}
object2 = object2.buffer;
other = other.buffer;
case arrayBufferTag:
if (object2.byteLength != other.byteLength || !equalFunc(new Uint8Array$2(object2), new Uint8Array$2(other))) {
return false;
}
return true;
case boolTag:
case dateTag:
case numberTag:
return eq(+object2, +other);
case errorTag:
return object2.name == other.name && object2.message == other.message;
case regexpTag:
case stringTag:
return object2 == other + "";
case mapTag:
var convert2 = mapToArray;
case setTag:
var isPartial = bitmask & COMPARE_PARTIAL_FLAG$4;
convert2 || (convert2 = setToArray);
if (object2.size != other.size && !isPartial) {
return false;
}
var stacked = stack.get(object2);
if (stacked) {
return stacked == other;
}
bitmask |= COMPARE_UNORDERED_FLAG$2;
stack.set(object2, other);
var result = equalArrays(convert2(object2), convert2(other), bitmask, customizer, equalFunc, stack);
stack["delete"](object2);
return result;
case symbolTag:
if (symbolValueOf) {
return symbolValueOf.call(object2) == symbolValueOf.call(other);
}
}
return false;
}
var COMPARE_PARTIAL_FLAG$3 = 1;
var objectProto$2 = Object.prototype;
var hasOwnProperty$6 = objectProto$2.hasOwnProperty;
function equalObjects(object2, other, bitmask, customizer, equalFunc, stack) {
var isPartial = bitmask & COMPARE_PARTIAL_FLAG$3, objProps = getAllKeys(object2), objLength = objProps.length, othProps = getAllKeys(other), othLength = othProps.length;
if (objLength != othLength && !isPartial) {
return false;
}
var index2 = objLength;
while (index2--) {
var key2 = objProps[index2];
if (!(isPartial ? key2 in other : hasOwnProperty$6.call(other, key2))) {
return false;
}
}
var objStacked = stack.get(object2);
var othStacked = stack.get(other);
if (objStacked && othStacked) {
return objStacked == other && othStacked == object2;
}
var result = true;
stack.set(object2, other);
stack.set(other, object2);
var skipCtor = isPartial;
while (++index2 < objLength) {
key2 = objProps[index2];
var objValue = object2[key2], othValue = other[key2];
if (customizer) {
var compared = isPartial ? customizer(othValue, objValue, key2, other, object2, stack) : customizer(objValue, othValue, key2, object2, other, stack);
}
if (!(compared === void 0 ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) {
result = false;
break;
}
skipCtor || (skipCtor = key2 == "constructor");
}
if (result && !skipCtor) {
var objCtor = object2.constructor, othCtor = other.constructor;
if (objCtor != othCtor && ("constructor" in object2 && "constructor" in other) && !(typeof objCtor == "function" && objCtor instanceof objCtor && typeof othCtor == "function" && othCtor instanceof othCtor)) {
result = false;
}
}
stack["delete"](object2);
stack["delete"](other);
return result;
}
var COMPARE_PARTIAL_FLAG$2 = 1;
var argsTag = "[object Arguments]", arrayTag = "[object Array]", objectTag = "[object Object]";
var objectProto$1 = Object.prototype;
var hasOwnProperty$5 = objectProto$1.hasOwnProperty;
function baseIsEqualDeep(object2, other, bitmask, customizer, equalFunc, stack) {
var objIsArr = isArray$4(object2), othIsArr = isArray$4(other), objTag = objIsArr ? arrayTag : getTag$1(object2), othTag = othIsArr ? arrayTag : getTag$1(other);
objTag = objTag == argsTag ? objectTag : objTag;
othTag = othTag == argsTag ? objectTag : othTag;
var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag;
if (isSameTag && isBuffer$2(object2)) {
if (!isBuffer$2(other)) {
return false;
}
objIsArr = true;
objIsObj = false;
}
if (isSameTag && !objIsObj) {
stack || (stack = new Stack());
return objIsArr || isTypedArray$2(object2) ? equalArrays(object2, other, bitmask, customizer, equalFunc, stack) : equalByTag(object2, other, objTag, bitmask, customizer, equalFunc, stack);
}
if (!(bitmask & COMPARE_PARTIAL_FLAG$2)) {
var objIsWrapped = objIsObj && hasOwnProperty$5.call(object2, "__wrapped__"), othIsWrapped = othIsObj && hasOwnProperty$5.call(other, "__wrapped__");
if (objIsWrapped || othIsWrapped) {
var objUnwrapped = objIsWrapped ? object2.value() : object2, othUnwrapped = othIsWrapped ? other.value() : other;
stack || (stack = new Stack());
return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
}
}
if (!isSameTag) {
return false;
}
stack || (stack = new Stack());
return equalObjects(object2, other, bitmask, customizer, equalFunc, stack);
}
function baseIsEqual(value, other, bitmask, customizer, stack) {
if (value === other) {
return true;
}
if (value == null || other == null || !isObjectLike(value) && !isObjectLike(other)) {
return value !== value && other !== other;
}
return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
}
var COMPARE_PARTIAL_FLAG$1 = 1, COMPARE_UNORDERED_FLAG$1 = 2;
function baseIsMatch(object2, source, matchData, customizer) {
var index2 = matchData.length, length = index2, noCustomizer = !customizer;
if (object2 == null) {
return !length;
}
object2 = Object(object2);
while (index2--) {
var data = matchData[index2];
if (noCustomizer && data[2] ? data[1] !== object2[data[0]] : !(data[0] in object2)) {
return false;
}
}
while (++index2 < length) {
data = matchData[index2];
var key2 = data[0], objValue = object2[key2], srcValue = data[1];
if (noCustomizer && data[2]) {
if (objValue === void 0 && !(key2 in object2)) {
return false;
}
} else {
var stack = new Stack();
if (customizer) {
var result = customizer(objValue, srcValue, key2, object2, source, stack);
}
if (!(result === void 0 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$1 | COMPARE_UNORDERED_FLAG$1, customizer, stack) : result)) {
return false;
}
}
}
return true;
}
function isStrictComparable(value) {
return value === value && !isObject$6(value);
}
function getMatchData(object2) {
var result = keys(object2), length = result.length;
while (length--) {
var key2 = result[length], value = object2[key2];
result[length] = [key2, value, isStrictComparable(value)];
}
return result;
}
function matchesStrictComparable(key2, srcValue) {
return function(object2) {
if (object2 == null) {
return false;
}
return object2[key2] === srcValue && (srcValue !== void 0 || key2 in Object(object2));
};
}
function baseMatches(source) {
var matchData = getMatchData(source);
if (matchData.length == 1 && matchData[0][2]) {
return matchesStrictComparable(matchData[0][0], matchData[0][1]);
}
return function(object2) {
return object2 === source || baseIsMatch(object2, source, matchData);
};
}
function baseHasIn(object2, key2) {
return object2 != null && key2 in Object(object2);
}
function hasPath(object2, path2, hasFunc) {
path2 = castPath(path2, object2);
var index2 = -1, length = path2.length, result = false;
while (++index2 < length) {
var key2 = toKey(path2[index2]);
if (!(result = object2 != null && hasFunc(object2, key2))) {
break;
}
object2 = object2[key2];
}
if (result || ++index2 != length) {
return result;
}
length = object2 == null ? 0 : object2.length;
return !!length && isLength(length) && isIndex(key2, length) && (isArray$4(object2) || isArguments$1(object2));
}
function hasIn(object2, path2) {
return object2 != null && hasPath(object2, path2, baseHasIn);
}
var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2;
function baseMatchesProperty(path2, srcValue) {
if (isKey(path2) && isStrictComparable(srcValue)) {
return matchesStrictComparable(toKey(path2), srcValue);
}
return function(object2) {
var objValue = get(object2, path2);
return objValue === void 0 && objValue === srcValue ? hasIn(object2, path2) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
};
}
function baseProperty(key2) {
return function(object2) {
return object2 == null ? void 0 : object2[key2];
};
}
function basePropertyDeep(path2) {
return function(object2) {
return baseGet(object2, path2);
};
}
function property(path2) {
return isKey(path2) ? baseProperty(toKey(path2)) : basePropertyDeep(path2);
}
function baseIteratee(value) {
if (typeof value == "function") {
return value;
}
if (value == null) {
return identity$1;
}
if (typeof value == "object") {
return isArray$4(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value);
}
return property(value);
}
function createBaseFor(fromRight) {
return function(object2, iteratee, keysFunc) {
var index2 = -1, iterable = Object(object2), props = keysFunc(object2), length = props.length;
while (length--) {
var key2 = props[fromRight ? length : ++index2];
if (iteratee(iterable[key2], key2, iterable) === false) {
break;
}
}
return object2;
};
}
var baseFor = createBaseFor();
const baseFor$1 = baseFor;
function baseForOwn(object2, iteratee) {
return object2 && baseFor$1(object2, iteratee, keys);
}
function createBaseEach(eachFunc, fromRight) {
return function(collection, iteratee) {
if (collection == null) {
return collection;
}
if (!isArrayLike(collection)) {
return eachFunc(collection, iteratee);
}
var length = collection.length, index2 = fromRight ? length : -1, iterable = Object(collection);
while (fromRight ? index2-- : ++index2 < length) {
if (iteratee(iterable[index2], index2, iterable) === false) {
break;
}
}
return collection;
};
}
var baseEach = createBaseEach(baseForOwn);
const baseEach$1 = baseEach;
function last(array2) {
var length = array2 == null ? 0 : array2.length;
return length ? array2[length - 1] : void 0;
}
var objectProto = Object.prototype;
var hasOwnProperty$4 = objectProto.hasOwnProperty;
function baseHas(object2, key2) {
return object2 != null && hasOwnProperty$4.call(object2, key2);
}
function has$6(object2, path2) {
return object2 != null && hasPath(object2, path2, baseHas);
}
function parent(object2, path2) {
return path2.length < 2 ? object2 : baseGet(object2, baseSlice(path2, 0, -1));
}
function isMatch(object2, source) {
return object2 === source || baseIsMatch(object2, source, getMatchData(source));
}
function isUndefined$1(value) {
return value === void 0;
}
var FUNC_ERROR_TEXT = "Expected a function";
function negate(predicate) {
if (typeof predicate != "function") {
throw new TypeError(FUNC_ERROR_TEXT);
}
return function() {
var args = arguments;
switch (args.length) {
case 0:
return !predicate.call(this);
case 1:
return !predicate.call(this, args[0]);
case 2:
return !predicate.call(this, args[0], args[1]);
case 3:
return !predicate.call(this, args[0], args[1], args[2]);
}
return !predicate.apply(this, args);
};
}
function baseUnset(object2, path2) {
path2 = castPath(path2, object2);
object2 = parent(object2, path2);
return object2 == null || delete object2[toKey(last(path2))];
}
function baseSet(object2, path2, value, customizer) {
if (!isObject$6(object2)) {
return object2;
}
path2 = castPath(path2, object2);
var index2 = -1, length = path2.length, lastIndex = length - 1, nested = object2;
while (nested != null && ++index2 < length) {
var key2 = toKey(path2[index2]), newValue = value;
if (key2 === "__proto__" || key2 === "constructor" || key2 === "prototype") {
return object2;
}
if (index2 != lastIndex) {
var objValue = nested[key2];
newValue = customizer ? customizer(objValue, key2, nested) : void 0;
if (newValue === void 0) {
newValue = isObject$6(objValue) ? objValue : isIndex(path2[index2 + 1]) ? [] : {};
}
}
assignValue(nested, key2, newValue);
nested = nested[key2];
}
return object2;
}
function basePickBy(object2, paths, predicate) {
var index2 = -1, length = paths.length, result = {};
while (++index2 < length) {
var path2 = paths[index2], value = baseGet(object2, path2);
if (predicate(value, path2)) {
baseSet(result, castPath(path2, object2), value);
}
}
return result;
}
function pickBy(object2, predicate) {
if (object2 == null) {
return {};
}
var props = arrayMap(getAllKeysIn(object2), function(prop) {
return [prop];
});
predicate = baseIteratee(predicate);
return basePickBy(object2, props, function(value, path2) {
return predicate(value, path2[0]);
});
}
function omitBy(object2, predicate) {
return pickBy(object2, negate(baseIteratee(predicate)));
}
function set(object2, path2, value) {
return object2 == null ? object2 : baseSet(object2, path2, value);
}
function baseSome(collection, predicate) {
var result;
baseEach$1(collection, function(value, index2, collection2) {
result = predicate(value, index2, collection2);
return !result;
});
return !!result;
}
function some(collection, predicate, guard) {
var func = isArray$4(collection) ? arraySome : baseSome;
if (guard && isIterateeCall(collection, predicate, guard)) {
predicate = void 0;
}
return func(collection, baseIteratee(predicate));
}
function unset(object2, path2) {
return object2 == null ? true : baseUnset(object2, path2);
}
var _set = set;
var _get = get;
var _cloneDeep = cloneDeep;
var _has$1 = has$6;
var _some = some;
var _isMatch = isMatch;
var isObject$5 = function isObject2(data) {
var str = Object.prototype.toString.call(data);
return str.indexOf("Object") > -1;
};
var isArray$2 = function isArray2(data) {
var str = Object.prototype.toString.call(data);
return str.indexOf("Array") > -1;
};
var isFunction$2 = function isFunction2(data) {
return typeof data === "function";
};
function isUrl$1(string2) {
var protocolRE = /^(?:\w+:)?\/\/(\S+)$/;
if (typeof string2 !== "string")
return false;
return protocolRE.test(string2);
}
var isNumber$1 = function isNumber2(str) {
return !isNaN(Number(str));
};
var getArray = function getArray2(arr) {
var defaultValue = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
if (Array.isArray(arr))
return arr;
return defaultValue;
};
function isObjType(schema2) {
return (schema2 === null || schema2 === void 0 ? void 0 : schema2.type) === "object" && (schema2 === null || schema2 === void 0 ? void 0 : schema2.properties) && (schema2 === null || schema2 === void 0 ? void 0 : schema2.widgetType) !== "field";
}
function isListType(schema2) {
return (schema2 === null || schema2 === void 0 ? void 0 : schema2.type) === "array" && isObjType(schema2 === null || schema2 === void 0 ? void 0 : schema2.items) && (schema2 === null || schema2 === void 0 ? void 0 : schema2.enum) === void 0;
}
function isCheckBoxType(schema2, readOnly) {
if (readOnly)
return false;
if (schema2.widget === "checkbox")
return true;
if (schema2 && schema2.type === "boolean") {
if (schema2.enum)
return false;
if (schema2.widget === void 0)
return true;
return false;
}
}
var valueRemoveUndefined = function valueRemoveUndefined2(values, notFilter) {
var recursionArray = function recursionArray2(list) {
var result = list.map(function(item) {
if (isObject$5(item)) {
return recursionObj(item);
}
if (isArray$2(item)) {
return recursionArray2(item);
}
return item;
});
if (Object.keys(result).length === 0) {
return void 0;
}
return result;
};
var recursionObj = function recursionObj2(_data) {
var data = omitBy(_data, isUndefined$1);
Object.keys(data).forEach(function(key2) {
var item = data[key2];
if (isObject$5(item)) {
data[key2] = recursionObj2(item);
}
if (isArray$2(item)) {
var result = recursionArray(item) || [];
data[key2] = notFilter ? result : result.filter(function(item2) {
return item2 !== void 0;
});
}
});
data = omitBy(data, isUndefined$1);
if (Object.keys(data).length === 0) {
return void 0;
}
return data;
};
return recursionObj(values) || {};
};
var translation$1 = function translation2(configCtx) {
return function(key2) {
var locale2 = configCtx === null || configCtx === void 0 ? void 0 : configCtx.locale.FormRender;
return locale2[key2];
};
};
var hasFuncProperty = function hasFuncProperty2(obj) {
return _some(obj, function(value) {
if (isFunction$2(value)) {
return true;
}
if (isObject$5(value)) {
return hasFuncProperty2(value);
}
return false;
});
};
var FRContext = /* @__PURE__ */ React$a.createContext(null);
var ConfigContext = /* @__PURE__ */ React$a.createContext(null);
var displayTypeEnum = {
column: "vertical",
row: "horizontal",
inline: "inline"
};
var transformProps = function transformProps2(props) {
var schema2 = props.schema, beforeFinish = props.beforeFinish, onMount = props.onMount, _props$displayType = props.displayType, displayType = _props$displayType === void 0 ? "column" : _props$displayType, watch = props.watch, _props$removeHiddenDa = props.removeHiddenData, removeHiddenData = _props$removeHiddenDa === void 0 ? true : _props$removeHiddenDa, readOnly = props.readOnly, _props$column = props.column, column = _props$column === void 0 ? 1 : _props$column, mapping2 = props.mapping, debugCss = props.debugCss, locale2 = props.locale, configProvider = props.configProvider, validateMessages = props.validateMessages, debug = props.debug, id2 = props.id, labelWidth = props.labelWidth, maxWidth = props.maxWidth, form = props.form, onFinish = props.onFinish, onFinishFailed = props.onFinishFailed, footer = props.footer, operateExtra = props.operateExtra, logOnMount = props.logOnMount, logOnSubmit = props.logOnSubmit, labelCol = props.labelCol, fieldCol = props.fieldCol, disabled = props.disabled, className = props.className, validateTrigger = props.validateTrigger, otherProps = __rest(props, ["schema", "beforeFinish", "onMount", "displayType", "watch", "removeHiddenData", "readOnly", "column", "mapping", "debugCss", "locale", "configProvider", "validateMessages", "debug", "id", "labelWidth", "maxWidth", "form", "onFinish", "onFinishFailed", "footer", "operateExtra", "logOnMount", "logOnSubmit", "labelCol", "fieldCol", "disabled", "className", "validateTrigger"]);
var formProps = Object.assign({}, otherProps);
if (displayType) {
formProps.layout = displayTypeEnum[displayType] || "horizontal";
}
return {
formProps,
schema: schema2,
displayType,
onFinish,
beforeFinish,
onMount,
watch,
readOnly,
disabled,
column,
mapping: mapping2,
debugCss,
locale: locale2,
configProvider,
footer,
form,
labelWidth,
validateMessages,
debug,
id: id2,
onFinishFailed,
removeHiddenData,
operateExtra,
logOnMount,
logOnSubmit,
labelCol,
fieldCol,
maxWidth,
className,
validateTrigger
};
};
function _typeof$o(obj) {
"@babel/helpers - typeof";
return _typeof$o = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$o(obj);
}
function _defineProperty$9(obj, key2, value) {
key2 = _toPropertyKey$6(key2);
if (key2 in obj) {
Object.defineProperty(obj, key2, { value, enumerable: true, configurable: true, writable: true });
} else {
obj[key2] = value;
}
return obj;
}
function _toPropertyKey$6(arg) {
var key2 = _toPrimitive$7(arg, "string");
return _typeof$o(key2) === "symbol" ? key2 : String(key2);
}
function _toPrimitive$7(input, hint) {
if (_typeof$o(input) !== "object" || input === null)
return input;
var prim = input[Symbol.toPrimitive];
if (prim !== void 0) {
var res = prim.call(input, hint || "default");
if (_typeof$o(res) !== "object")
return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
function _toConsumableArray$b(arr) {
return _arrayWithoutHoles$b(arr) || _iterableToArray$b(arr) || _unsupportedIterableToArray$k(arr) || _nonIterableSpread$b();
}
function _nonIterableSpread$b() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _arrayWithoutHoles$b(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$k(arr);
}
function _toArray(arr) {
return _arrayWithHoles$e(arr) || _iterableToArray$b(arr) || _unsupportedIterableToArray$k(arr) || _nonIterableRest$e();
}
function _nonIterableRest$e() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$k(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$k(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$k(o, minLen);
}
function _arrayLikeToArray$k(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArray$b(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithHoles$e(arr) {
if (Array.isArray(arr))
return arr;
}
var isMultiBind = function isMultiBind2(array2) {
return isArray$2(array2) && array2.every(function(item) {
return typeof item === "string";
});
};
var transformPath = function transformPath2(path2) {
var result = [];
var recursion = function recursion2(str) {
var index2 = str.indexOf("[]");
if (index2 === -1) {
result.push(str);
return;
}
result.push(str.substring(0, index2));
recursion2(str.substring(index2 + 3));
};
recursion(path2);
if (result.length === 1) {
return result[0];
}
return result;
};
var transformValueToBind = function transformValueToBind2(data, path2, bind2) {
if (bind2 === false) {
unset(data, path2);
return;
}
if (typeof bind2 === "string") {
var value = get(data, path2);
var preValue = get(data, bind2);
if (isObject$5(preValue)) {
value = Object.assign(Object.assign({}, preValue), value);
}
set(data, bind2, value);
unset(data, path2);
return;
}
if (isMultiBind(bind2)) {
var _value = get(data, path2);
unset(data, path2);
if (Array.isArray(_value)) {
_value.forEach(function(item, index2) {
var bindPath = bind2[index2];
bindPath && set(data, bindPath, item);
});
}
}
};
var transformBindToValue = function transformBindToValue2(data, path2, bind2) {
if (typeof bind2 === "string") {
var value = get(data, bind2);
var preValue = get(data, path2);
if (isObject$5(preValue)) {
value = Object.assign(Object.assign({}, preValue), value);
}
set(data, path2, value);
unset(data, bind2);
return;
}
if (isMultiBind(bind2)) {
var _value2 = [];
bind2.forEach(function(key2) {
var bindValue = get(data, key2);
_value2.push(bindValue);
unset(data, key2);
});
if (_value2.length > 0) {
set(data, path2, _value2);
}
}
};
var parseValuesToBind = function parseValuesToBind2(values, flatten) {
if (!JSON.stringify(flatten).includes("bind")) {
return values;
}
var data = _cloneDeep(values);
var dealFieldList = function dealFieldList2(obj, _ref, bind2) {
var _ref2 = _toArray(_ref), path2 = _ref2[0], rest = _ref2.slice(1);
if (rest.length === 1) {
var list = get(obj, path2, []);
list.forEach(function(item, index2) {
var value2 = get(item, rest[0]);
if (bind2 === "root") {
list[index2] = value2;
return;
}
transformValueToBind(item, rest[0], bind2);
});
}
if (isArray$2(obj)) {
obj.forEach(function(item) {
return dealFieldList2(item, [path2].concat(_toConsumableArray$b(rest)), bind2);
});
} else if (isObject$5(obj)) {
var value = get(obj, path2);
dealFieldList2(value, rest, bind2);
}
};
Object.keys(flatten).forEach(function(key2) {
var _a, _b;
var bind2 = (_b = (_a = flatten[key2]) === null || _a === void 0 ? void 0 : _a.schema) === null || _b === void 0 ? void 0 : _b.bind;
if (bind2 === void 0) {
return;
}
var path2 = transformPath(key2);
isArray$2(path2) ? dealFieldList(data, path2, bind2) : transformValueToBind(data, path2, bind2);
});
return data;
};
var parseBindToValues = function parseBindToValues2(values, flatten) {
if (!JSON.stringify(flatten).includes("bind")) {
return values;
}
var data = _cloneDeep(values);
var dealFieldList = function dealFieldList2(obj, _ref3, bind2) {
var _ref4 = _toArray(_ref3), path2 = _ref4[0], rest = _ref4.slice(1);
if (rest.length === 1) {
var list = get(obj, path2, []);
list.forEach(function(item, index2) {
if (bind2 === "root") {
list[index2] = _defineProperty$9({}, rest[0], item);
return;
}
transformBindToValue(item, rest[0], bind2);
});
}
if (isArray$2(obj)) {
obj.forEach(function(item) {
return dealFieldList2(item, [path2].concat(_toConsumableArray$b(rest)), bind2);
});
} else if (isObject$5(obj)) {
var value = get(obj, path2);
dealFieldList2(value, rest, bind2);
}
};
Object.keys(flatten).forEach(function(key2) {
var _a, _b;
var bind2 = (_b = (_a = flatten[key2]) === null || _a === void 0 ? void 0 : _a.schema) === null || _b === void 0 ? void 0 : _b.bind;
if (bind2 === void 0) {
return;
}
var path2 = transformPath(key2);
isArray$2(path2) ? dealFieldList(data, path2, bind2) : transformBindToValue(data, path2, bind2);
});
return data;
};
var getFormItemLayout = function getFormItemLayout2(column, schema2, _ref) {
var labelWidth = _ref.labelWidth, displayType = _ref.displayType, _labelCol = _ref._labelCol, _fieldCol = _ref._fieldCol;
var labelCol = {
span: 5
};
var fieldCol = {
span: 9
};
if (column === 2) {
labelCol = {
span: 6
};
fieldCol = {
span: 14
};
}
if (column > 2) {
labelCol = {
span: 7
};
fieldCol = {
span: 16
};
}
if (displayType === "column") {
labelCol = {};
fieldCol = {};
}
if (_labelCol) {
labelCol = _labelCol;
if (displayType === "column") {
labelCol = {};
}
}
if (_fieldCol) {
fieldCol = _fieldCol;
if (typeof _fieldCol === "number") {
fieldCol = {
span: _fieldCol
};
}
}
if (displayType === "inline") {
labelCol = {};
fieldCol = {};
}
if ((labelWidth || labelWidth === 0) && displayType !== "column") {
labelCol = {
flex: labelWidth + "px"
};
fieldCol = {
flex: "auto"
};
}
if (schema2.cellSpan) {
fieldCol = {};
}
if (schema2.labelCol || schema2.labelCol === 0) {
labelCol = schema2.labelCol;
}
if (schema2.fieldCol || schema2.fieldCol === 0) {
fieldCol = schema2.fieldCol;
}
if (typeof labelCol === "number") {
labelCol = {
span: labelCol
};
}
if (typeof fieldCol === "number") {
fieldCol = {
span: fieldCol
};
}
return {
labelCol,
fieldCol
};
};
function _toConsumableArray$a(arr) {
return _arrayWithoutHoles$a(arr) || _iterableToArray$a(arr) || _unsupportedIterableToArray$j(arr) || _nonIterableSpread$a();
}
function _nonIterableSpread$a() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$j(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$j(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$j(o, minLen);
}
function _iterableToArray$a(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithoutHoles$a(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$j(arr);
}
function _arrayLikeToArray$j(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
var executeCallBack = function executeCallBack2(watchItem, value, path2, index2) {
if (isFunction$2(watchItem)) {
try {
watchItem(value, index2);
} catch (error) {
console.log("".concat(path2, "\u5BF9\u5E94\u7684watch\u51FD\u6570\u6267\u884C\u62A5\u9519\uFF1A"), error);
}
}
if (isFunction$2(watchItem === null || watchItem === void 0 ? void 0 : watchItem.handler)) {
try {
watchItem.handler(value, index2);
} catch (error) {
console.log("".concat(path2, "\u5BF9\u5E94\u7684watch\u51FD\u6570\u6267\u884C\u62A5\u9519\uFF1A"), error);
}
}
};
var traverseValues = function traverseValues2(_ref) {
var changedValues = _ref.changedValues, allValues = _ref.allValues, flatValues = _ref.flatValues;
var traverseArray = function traverseArray2(list, fullList, path2, index2) {
if (!list.length) {
return;
}
var _path = path2 += "[]";
var filterLength = list.filter(function(item) {
return item || item === void 0;
}).length;
var flag = filterLength !== fullList.length || list.length === 1;
var isRemove = false;
if (filterLength > 1 && filterLength < fullList.length) {
flag = false;
isRemove = true;
}
list.forEach(function(item, idx) {
if (!isRemove) {
flatValues[_path] = {
value: fullList[idx],
index: index2
};
}
if (isObject$5(item)) {
traverseObj(item, fullList[idx], _path, [].concat(_toConsumableArray$a(index2), [idx]), !flag);
}
if (isArray$2(item)) {
traverseArray2(item, fullList[idx], _path, [].concat(_toConsumableArray$a(index2), [idx]));
}
});
};
var traverseObj = function traverseObj2(obj, fullObj, path2, index2, flag) {
Object.keys(obj).forEach(function(key2) {
var item = obj[key2];
var fullItem = fullObj === null || fullObj === void 0 ? void 0 : fullObj[key2];
var value = item;
var _path = path2 ? path2 + "." + key2 : key2;
var last2 = true;
if (isArray$2(item)) {
value = fullItem ? _toConsumableArray$a(fullItem) : fullItem;
last2 = false;
traverseArray(item, fullItem, _path, index2);
}
if (isObject$5(item)) {
last2 = false;
traverseObj2(item, fullItem, _path, index2, flag);
}
if (!last2 || !flag) {
flatValues[_path] = {
value,
index: index2
};
}
});
};
traverseObj(changedValues, allValues, null, []);
};
var valuesWatch = function valuesWatch2(changedValues, allValues, watch) {
var _a;
if (((_a = Object.keys(watch || {})) === null || _a === void 0 ? void 0 : _a.length) === 0) {
return;
}
var flatValues = {
"#": {
value: allValues,
index: changedValues
}
};
traverseValues({
changedValues,
allValues,
flatValues
});
Object.keys(watch).forEach(function(path2) {
if (!_has$1(flatValues, path2)) {
return;
}
var _get2 = _get(flatValues, path2), value = _get2.value, index2 = _get2.index;
var item = watch[path2];
executeCallBack(item, value, path2, index2);
});
};
var transformFieldsData = function transformFieldsData2(_fieldsError, getFieldName2) {
var fieldsError = _fieldsError;
if (isObject$5(fieldsError)) {
fieldsError = [fieldsError];
}
if (!(isArray$2(fieldsError) && fieldsError.length > 0)) {
return;
}
return fieldsError.map(function(field) {
return Object.assign(Object.assign({
errors: field.error
}, field), {
name: getFieldName2(field.name)
});
});
};
var immediateWatch = function immediateWatch2(watch, values) {
var _a;
if (((_a = Object.keys(watch || {})) === null || _a === void 0 ? void 0 : _a.length) === 0) {
return;
}
var watchObj = {};
Object.keys(watch).forEach(function(key2) {
var watchItem = watch[key2];
if ((watchItem === null || watchItem === void 0 ? void 0 : watchItem.immediate) && isFunction$2(watchItem === null || watchItem === void 0 ? void 0 : watchItem.handler)) {
watchObj[key2] = watchItem;
}
});
valuesWatch(values, values, watchObj);
};
var getSchemaFullPath = function getSchemaFullPath2(path2, schema2) {
if (!path2 || !path2.includes(".")) {
return "properties." + path2;
}
while (path2.includes("[]")) {
var index2 = path2.indexOf("[]");
path2 = path2.substring(0, index2) + ".items" + path2.substring(index2 + 2);
}
var result = "properties";
path2.split(".").forEach(function(item) {
var key2 = result + "." + item;
var itemSchema = _get(schema2, key2, {});
if (isObjType(itemSchema)) {
result = key2 + ".properties";
return;
}
result = key2;
});
return result;
};
function yymmdd(timeStamp) {
var date_ob = new Date(Number(timeStamp));
var adjustZero = function adjustZero2(num) {
return ("0" + num).slice(-2);
};
var day = adjustZero(date_ob.getDate());
var month = adjustZero(date_ob.getMonth());
var year = date_ob.getFullYear();
var hours = adjustZero(date_ob.getHours());
var minutes = adjustZero(date_ob.getMinutes());
var seconds = adjustZero(date_ob.getSeconds());
return "".concat(year, "-").concat(month, "-").concat(day, " ").concat(hours, ":").concat(minutes, ":").concat(seconds);
}
function msToTime(duration) {
var seconds = Math.floor(duration / 1e3 % 60);
var minutes = Math.floor(duration / (1e3 * 60) % 60);
var hours = Math.floor(duration / (1e3 * 60 * 60) % 24);
hours = hours < 10 ? "0" + hours : hours;
minutes = minutes < 10 ? "0" + minutes : minutes;
seconds = seconds < 10 ? "0" + seconds : seconds;
return hours + ":" + minutes + ":" + seconds;
}
var getSessionItem = function getSessionItem2(key2) {
return Number(sessionStorage.getItem(key2) || 0);
};
var setSessionItem = function setSessionItem2(key2, data) {
sessionStorage.setItem(key2, data + "");
};
function _toConsumableArray$9(arr) {
return _arrayWithoutHoles$9(arr) || _iterableToArray$9(arr) || _unsupportedIterableToArray$i(arr) || _nonIterableSpread$9();
}
function _nonIterableSpread$9() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$i(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$i(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$i(o, minLen);
}
function _iterableToArray$9(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithoutHoles$9(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$i(arr);
}
function _arrayLikeToArray$i(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
var filterHiddenData = function filterHiddenData2(list) {
if (!isArray$2(list)) {
return list;
}
var result = [];
for (var i2 = 0; i2 < list.length; i2++) {
var item = list[i2];
if (!item.hidden) {
var node = Object.assign({}, item);
if (item.children) {
var children = filterHiddenData2(item.children);
if (children.length > 0) {
node.children = children;
}
}
if (item.items) {
var items = filterHiddenData2(item.items);
if (items.length > 0) {
node.items = items;
}
}
result.push(node);
}
}
return result;
};
var getPathObj = function getPathObj2(_ref) {
var _ref$rootPath = _ref.rootPath, rootPath = _ref$rootPath === void 0 ? [] : _ref$rootPath, path2 = _ref.path;
var pathList = (path2 || "").split(".");
var dataIndex = [];
var schemaIndex = [];
var dataPathList = [];
rootPath.forEach(function(item, index2) {
if (isNumber$1(item)) {
dataIndex.push(item);
return;
}
if (isNumber$1(rootPath[index2 + 1])) {
schemaIndex.push("".concat(item, "[]"));
} else {
schemaIndex.push(item);
}
});
var list = _toConsumableArray$9(rootPath);
list.pop();
list = [].concat(_toConsumableArray$9(list), _toConsumableArray$9(pathList));
list.forEach(function(item, index2) {
if (isNumber$1(item)) {
dataPathList.push("[".concat(item, "]"));
} else {
dataPathList.push(item);
}
});
var dataPath = dataPathList.join(".");
var _path = pathList;
if (_path[0] && isNumber$1(_path[0])) {
_path.splice(0, 1);
}
var schemaPath = [].concat(schemaIndex, [_path]).join(".");
return {
dataIndex,
dataPath,
schemaPath
};
};
var getPath = function getPath2(path2) {
if (!path2) {
return null;
}
if (isArray$2(path2)) {
return path2.join(".");
}
return path2;
};
var getLabel$1 = function getLabel2(schema2, displayType, widgets) {
var title = schema2.title, description = schema2.description, descWidget = schema2.descWidget, labelWidget = schema2.labelWidget;
var LabelNode = widgets[labelWidget];
if (LabelNode) {
return /* @__PURE__ */ jsx(LabelNode, {
schema: schema2
});
}
if (!description && !descWidget) {
return title;
}
var RenderDesc = function RenderDesc2() {
var Widget = widgets[descWidget];
if (Widget) {
return /* @__PURE__ */ jsx(Widget, {
schema: schema2
});
}
if (description) {
return /* @__PURE__ */ jsxs("span", {
className: "fr-desc",
children: ["(", description, ")"]
});
}
return null;
};
return /* @__PURE__ */ jsxs(Fragment, {
children: [title, /* @__PURE__ */ jsx(RenderDesc, {})]
});
};
var getTooltip$4 = function getTooltip2(schema2, displayType) {
var descType = schema2.descType, description = schema2.description, tooltip = schema2.tooltip;
if (tooltip) {
if (typeof tooltip === "string") {
return {
title: /* @__PURE__ */ jsx("span", {
dangerouslySetInnerHTML: {
__html: tooltip
}
})
};
}
return Object.assign(Object.assign({}, tooltip), {
title: /* @__PURE__ */ jsx("span", {
dangerouslySetInnerHTML: {
__html: tooltip.title
}
})
});
}
if (descType === "widget" || !description) {
return null;
}
if (displayType === "column" && descType === "icon") {
return {
title: description
};
}
return null;
};
var getExtraView = function getExtraView2(extraKey, schema2, widgets) {
var extra = schema2[extraKey];
if (!extra) {
return;
}
var widgetName = extra === null || extra === void 0 ? void 0 : extra.widget;
if (widgetName) {
var Widget = widgets[widgetName];
if (!Widget) {
return;
}
return /* @__PURE__ */ jsx(Widget, {
schema: schema2
});
}
var __html = "";
if (typeof extra === "string") {
__html = extra;
}
if (extra === null || extra === void 0 ? void 0 : extra.text) {
__html = extra.text;
}
if (!__html) {
return;
}
return /* @__PURE__ */ jsx("div", {
className: "fr-form-item-extra",
dangerouslySetInnerHTML: {
__html
}
});
};
var getColSpan = function getColSpan2(formCtx, parentCtx, schema2) {
var span = 24;
var column = getParamValue$2(formCtx, parentCtx, schema2)("column");
if (column) {
span = 24 / column;
}
if (schema2.width) {
if (schema2.width === "100%") {
span = 24;
} else if (schema2.width === "50%") {
span = 12;
} else if (schema2.width === "20%") {
span = 5;
} else if (schema2.width < "50%") {
span = 8;
}
}
if (schema2.cellSpan) {
span = schema2.cellSpan * span;
}
if (schema2.span) {
span = schema2.span;
}
return span;
};
var getParamValue$2 = function getParamValue2(formCtx, upperCtx, schema2) {
return function(valueKey) {
var isTop = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true;
var _a, _b, _c;
if (isTop) {
return (_b = (_a = schema2[valueKey]) !== null && _a !== void 0 ? _a : upperCtx[valueKey]) !== null && _b !== void 0 ? _b : formCtx[valueKey];
}
return (_c = schema2[valueKey]) !== null && _c !== void 0 ? _c : upperCtx[valueKey];
};
};
var getFieldProps = function getFieldProps2(widgetName, schema2, _ref2) {
var widgets = _ref2.widgets, methods = _ref2.methods, form = _ref2.form, dependValues = _ref2.dependValues, globalProps = _ref2.globalProps, path2 = _ref2.path, rootPath = _ref2.rootPath, fieldRef = _ref2.fieldRef;
var _a;
var pathObj = getPathObj({
path: path2,
rootPath
});
var fieldProps = Object.assign(Object.assign({}, schema2.props), {
addons: Object.assign(Object.assign(Object.assign({}, form), {
globalProps,
dependValues,
fieldRef
}), pathObj)
});
if ((dependValues === null || dependValues === void 0 ? void 0 : dependValues.length) > 0) {
fieldProps.dependValues = dependValues;
}
["placeholder", "disabled", "format", "onStatusChange"].forEach(function(key2) {
if (schema2[key2]) {
fieldProps[key2] = schema2[key2];
}
});
if (schema2.enum && !((_a = schema2.props) === null || _a === void 0 ? void 0 : _a.options)) {
var enums = schema2.enum, enumNames = schema2.enumNames;
fieldProps.options = getArray(enums).map(function(item, index2) {
var label = enumNames && Array.isArray(enumNames) ? enumNames[index2] : item;
var isHtml = typeof label === "string" && label[0] === "<";
if (isHtml) {
label = /* @__PURE__ */ jsx("span", {
dangerouslySetInnerHTML: {
__html: label
}
});
}
return {
label,
value: item
};
});
}
if (isArray$2(fieldProps.options)) {
fieldProps = Object.assign(Object.assign({}, fieldProps), {
options: filterHiddenData(fieldProps.options)
});
}
Object.keys(schema2).forEach(function(key2) {
if (typeof key2 === "string" && key2.toLowerCase().indexOf("props") > -1 && key2.length > 5) {
fieldProps[key2] = schema2[key2];
}
});
if (isObject$5(fieldProps.addonAfter) && fieldProps.addonAfter.widget) {
var AddonAfterWidget = widgets[fieldProps.addonAfter.widget];
fieldProps.addonAfter = /* @__PURE__ */ jsx(AddonAfterWidget, {
...Object.assign({}, schema2)
});
}
if (["treeSelect", "inputNumber", "multiSelect", "select"].includes(widgetName)) {
fieldProps.style = Object.assign({
width: "100%"
}, fieldProps.style);
}
if (widgetName === "multiSelect") {
fieldProps.mode = "multiple";
}
if (isObject$5(schema2.methods)) {
Object.keys(schema2.methods).forEach(function(key2) {
var name2 = schema2.methods[key2];
fieldProps[key2] = methods[name2];
});
}
fieldProps.schema = schema2;
return fieldProps;
};
var getDependValues = function getDependValues2(formData, dependPath, props, dependencieItem) {
var indexReg = /\[[0-9]*\]/;
if (indexReg.test(dependPath)) {
var currentIndex = _get(props, "path.0");
var dependIndex = dependPath.match(indexReg)[0].replace("[", "").replace("]", "");
var listPath = dependPath.split(indexReg)[0];
var itemIndex = dependIndex || currentIndex;
var itemPath = dependPath.replace("".concat(listPath, "[").concat(dependIndex, "]."), "");
var listData = _get(formData, "".concat(listPath, "[").concat(itemIndex, "]"));
dependencieItem.push(listPath, itemIndex);
return getDependValues2(listData, itemPath, props, dependencieItem);
}
dependencieItem.push.apply(dependencieItem, _toConsumableArray$9(dependPath.split(".")));
return _get(formData, dependPath);
};
function _typeof$n(obj) {
"@babel/helpers - typeof";
return _typeof$n = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$n(obj);
}
var createDataSkeleton = function createDataSkeleton2(schema2, formData) {
var _formData = _cloneDeep(formData);
var result = _formData;
if (isObjType(schema2)) {
if (_formData === void 0 || _typeof$n(_formData) !== "object") {
_formData = {};
result = {};
}
Object.keys(schema2.properties).forEach(function(key2) {
var childSchema = schema2.properties[key2];
var childData = _formData[key2];
var childResult = createDataSkeleton2(childSchema, childData);
result[key2] = childResult;
});
} else if (_formData !== void 0)
;
else if (schema2.default !== void 0) {
result = _cloneDeep(schema2.default);
} else if (isListType(schema2)) {
result = [createDataSkeleton2(schema2.items)];
} else if (schema2.type === "boolean" && !schema2.widget) {
result = void 0;
} else {
result = void 0;
}
return result;
};
var isExpression = function isExpression2(str) {
if (typeof str !== "string") {
return false;
}
var pattern2 = /^{\s*{(.+)}\s*}$/;
var reg1 = /^{\s*{function\(.+}\s*}$/;
return str.match(pattern2) && !str.match(reg1);
};
var isHasExpression = function isHasExpression2(schema2) {
var result = Object.keys(schema2).some(function(key2) {
var item = schema2[key2];
if (key2 === "properties") {
return false;
}
var recursionArray = function recursionArray2(list) {
var result2 = list.some(function(ite) {
if (isArray$2(ite)) {
return recursionArray2(ite);
}
if (isObject$5(ite)) {
return isHasExpression2(ite);
}
return isExpression(ite);
});
return result2;
};
if (isArray$2(item)) {
return recursionArray(item);
}
if (isObject$5(item)) {
return isHasExpression2(item);
}
return isExpression(item);
});
return result;
};
var parseExpression = function parseExpression2(func) {
var formData = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var parentPath = arguments.length > 2 ? arguments[2] : void 0;
var parentData = get(formData, parentPath) || {};
if (typeof func === "string") {
var funcBody = func.replace(/^{\s*{/g, "").replace(/}\s*}$/g, "");
var funcStr = "\n return ".concat(funcBody.replace(/formData/g, JSON.stringify(formData)).replace(/rootValue/g, JSON.stringify(parentData)), "\n ");
try {
var result = Function(funcStr)();
return result;
} catch (error) {
console.log(error, parentPath);
return null;
}
}
return func;
};
var parseAllExpression = function parseAllExpression2(_schema, _formData, dataPath, formSchema) {
var schema2 = _cloneDeep(_schema);
var formData = _formData;
if (formSchema) {
formData = createDataSkeleton(formSchema, formData);
}
var recursionArray = function recursionArray2(list) {
var result = list.map(function(item) {
if (isArray$2(item)) {
return recursionArray2(item);
}
if (isObject$5(item)) {
return parseAllExpression2(item, formData, dataPath);
}
if (isExpression(item)) {
return parseExpression(item, formData, dataPath);
}
return item;
});
return result;
};
Object.keys(schema2).forEach(function(key2) {
var _a;
var value = schema2[key2];
if (isArray$2(value)) {
schema2[key2] = recursionArray(value);
}
if (isObject$5(value) && ((_a = value.mustacheParse) !== null && _a !== void 0 ? _a : true)) {
schema2[key2] = parseAllExpression2(value, formData, dataPath);
} else if (isExpression(value)) {
schema2[key2] = parseExpression(value, formData, dataPath);
}
});
return schema2;
};
var extractFormDataStrings = function extractFormDataStrings2(list) {
var result = [];
list.forEach(function(str) {
var regex = /formData.\w+(.\w+)*/g;
var matches = str.match(regex);
if (matches) {
result = result.concat(matches);
}
});
return result;
};
var extractRootValueStrings = function extractRootValueStrings2(list) {
var result = [];
list.forEach(function(str) {
var regex = /rootValue.\w+(.\w+)*/g;
var matches = str.match(regex);
if (matches) {
result = result.concat(matches);
}
});
return result;
};
var findStrList = function findStrList2(str, type2) {
var regex = /{{(.*?)}}/g;
var matches = [];
var match2;
while ((match2 = regex.exec(str)) !== null) {
matches.push(match2[1]);
}
if (type2 === "formData") {
return extractFormDataStrings(matches);
}
if (type2 === "rootValue") {
return extractRootValueStrings(matches);
}
return [];
};
var getListEveryResult = function getListEveryResult2(list, preValue, nextValue, dataPath) {
return list.every(function(item) {
var pre = parseExpression(item, preValue, dataPath);
var curr = parseExpression(item, nextValue, dataPath);
return pre === curr;
});
};
const fieldShouldUpdate = function(str, dataPath, dependencies, shouldUpdateOpen) {
return function(preValue, nextValue) {
if (dependencies) {
return true;
}
var formDataList = findStrList(str, "formData");
var rootValueList = findStrList(str, "rootValue");
var formDataRes = getListEveryResult(formDataList, preValue, nextValue, dataPath);
var rootValueRes = getListEveryResult(rootValueList, preValue, nextValue, dataPath);
if (formDataRes && rootValueRes) {
return false;
}
return true;
};
};
var mapping = {
default: "input",
string: "input",
array: "list",
boolean: "checkbox",
integer: "number",
number: "inputNumber",
object: "map",
html: "html",
card: "card",
collapse: "collapse",
lineTitle: "lineTitle",
line: "line",
subItem: "subItem",
panel: "panel",
"string:upload": "upload",
"string:url": "urlInput",
"string:dateTime": "datePicker",
"string:date": "datePicker",
"string:year": "datePicker",
"string:month": "datePicker",
"string:week": "datePicker",
"string:quarter": "datePicker",
"string:time": "timePicker",
"string:textarea": "textArea",
"string:color": "color",
"string:image": "imageInput",
"range:time": "timeRange",
"range:dateTime": "dateRange",
"range:date": "dateRange",
"range:year": "dateRange",
"range:month": "dateRange",
"range:week": "dateRange",
"range:quarter": "dateRange",
"*?enum": "radio",
"*?enum_long": "select",
"array?enum": "checkboxes",
"array?enum_long": "multiSelect",
"*?readOnly": "html"
};
function getWidgetName(schema2) {
var _mapping = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : mapping;
var type2 = schema2.type, format2 = schema2.format, enums = schema2.enum, readOnly = schema2.readOnly;
schema2.widget;
var props = schema2.props;
if (schema2["ui:widget"] || schema2.widget) {
return schema2["ui:widget"] || schema2.widget;
}
var list = [];
if (readOnly) {
list.push("".concat(type2, "?readOnly"));
list.push("*?readOnly");
}
if (enums) {
if (Array.isArray(enums) && (type2 === "array" && enums.length > 6 || type2 !== "array" && enums.length > 2)) {
list.push("".concat(type2, "?enum_long"));
list.push("*?enum_long");
} else {
list.push("".concat(type2, "?enum"));
list.push("*?enum");
}
}
if (props === null || props === void 0 ? void 0 : props.options) {
if (type2 === "array" && props.options.length > 6 || type2 !== "array" && props.options.length > 2) {
list.push("".concat(type2, "?enum_long"));
list.push("*?enum_long");
} else {
list.push("".concat(type2, "?enum"));
list.push("*?enum");
}
}
var _widget = format2;
if (_widget) {
list.push("".concat(type2, ":").concat(_widget));
}
if (type2 === "object") {
list.push((schema2.theme === "tile" ? "lineTitle" : schema2.theme) || "collapse");
} else {
list.push(type2);
}
var widgetName = "";
list.some(function(item) {
widgetName = _mapping[item];
return !!widgetName;
});
return widgetName;
}
function capitalizeFirstLetter(str) {
if (!str) {
return str;
}
return str.charAt(0).toUpperCase() + str.slice(1);
}
var getWidget = function getWidget2(name2, widgets) {
var widget = widgets[name2];
if (!widget) {
widget = widgets[capitalizeFirstLetter(name2)];
}
if (!widget) {
widget = widgets["Html"] || null;
}
return widget;
};
var colorString$1 = { exports: {} };
var colorName = {
"aliceblue": [240, 248, 255],
"antiquewhite": [250, 235, 215],
"aqua": [0, 255, 255],
"aquamarine": [127, 255, 212],
"azure": [240, 255, 255],
"beige": [245, 245, 220],
"bisque": [255, 228, 196],
"black": [0, 0, 0],
"blanchedalmond": [255, 235, 205],
"blue": [0, 0, 255],
"blueviolet": [138, 43, 226],
"brown": [165, 42, 42],
"burlywood": [222, 184, 135],
"cadetblue": [95, 158, 160],
"chartreuse": [127, 255, 0],
"chocolate": [210, 105, 30],
"coral": [255, 127, 80],
"cornflowerblue": [100, 149, 237],
"cornsilk": [255, 248, 220],
"crimson": [220, 20, 60],
"cyan": [0, 255, 255],
"darkblue": [0, 0, 139],
"darkcyan": [0, 139, 139],
"darkgoldenrod": [184, 134, 11],
"darkgray": [169, 169, 169],
"darkgreen": [0, 100, 0],
"darkgrey": [169, 169, 169],
"darkkhaki": [189, 183, 107],
"darkmagenta": [139, 0, 139],
"darkolivegreen": [85, 107, 47],
"darkorange": [255, 140, 0],
"darkorchid": [153, 50, 204],
"darkred": [139, 0, 0],
"darksalmon": [233, 150, 122],
"darkseagreen": [143, 188, 143],
"darkslateblue": [72, 61, 139],
"darkslategray": [47, 79, 79],
"darkslategrey": [47, 79, 79],
"darkturquoise": [0, 206, 209],
"darkviolet": [148, 0, 211],
"deeppink": [255, 20, 147],
"deepskyblue": [0, 191, 255],
"dimgray": [105, 105, 105],
"dimgrey": [105, 105, 105],
"dodgerblue": [30, 144, 255],
"firebrick": [178, 34, 34],
"floralwhite": [255, 250, 240],
"forestgreen": [34, 139, 34],
"fuchsia": [255, 0, 255],
"gainsboro": [220, 220, 220],
"ghostwhite": [248, 248, 255],
"gold": [255, 215, 0],
"goldenrod": [218, 165, 32],
"gray": [128, 128, 128],
"green": [0, 128, 0],
"greenyellow": [173, 255, 47],
"grey": [128, 128, 128],
"honeydew": [240, 255, 240],
"hotpink": [255, 105, 180],
"indianred": [205, 92, 92],
"indigo": [75, 0, 130],
"ivory": [255, 255, 240],
"khaki": [240, 230, 140],
"lavender": [230, 230, 250],
"lavenderblush": [255, 240, 245],
"lawngreen": [124, 252, 0],
"lemonchiffon": [255, 250, 205],
"lightblue": [173, 216, 230],
"lightcoral": [240, 128, 128],
"lightcyan": [224, 255, 255],
"lightgoldenrodyellow": [250, 250, 210],
"lightgray": [211, 211, 211],
"lightgreen": [144, 238, 144],
"lightgrey": [211, 211, 211],
"lightpink": [255, 182, 193],
"lightsalmon": [255, 160, 122],
"lightseagreen": [32, 178, 170],
"lightskyblue": [135, 206, 250],
"lightslategray": [119, 136, 153],
"lightslategrey": [119, 136, 153],
"lightsteelblue": [176, 196, 222],
"lightyellow": [255, 255, 224],
"lime": [0, 255, 0],
"limegreen": [50, 205, 50],
"linen": [250, 240, 230],
"magenta": [255, 0, 255],
"maroon": [128, 0, 0],
"mediumaquamarine": [102, 205, 170],
"mediumblue": [0, 0, 205],
"mediumorchid": [186, 85, 211],
"mediumpurple": [147, 112, 219],
"mediumseagreen": [60, 179, 113],
"mediumslateblue": [123, 104, 238],
"mediumspringgreen": [0, 250, 154],
"mediumturquoise": [72, 209, 204],
"mediumvioletred": [199, 21, 133],
"midnightblue": [25, 25, 112],
"mintcream": [245, 255, 250],
"mistyrose": [255, 228, 225],
"moccasin": [255, 228, 181],
"navajowhite": [255, 222, 173],
"navy": [0, 0, 128],
"oldlace": [253, 245, 230],
"olive": [128, 128, 0],
"olivedrab": [107, 142, 35],
"orange": [255, 165, 0],
"orangered": [255, 69, 0],
"orchid": [218, 112, 214],
"palegoldenrod": [238, 232, 170],
"palegreen": [152, 251, 152],
"paleturquoise": [175, 238, 238],
"palevioletred": [219, 112, 147],
"papayawhip": [255, 239, 213],
"peachpuff": [255, 218, 185],
"peru": [205, 133, 63],
"pink": [255, 192, 203],
"plum": [221, 160, 221],
"powderblue": [176, 224, 230],
"purple": [128, 0, 128],
"rebeccapurple": [102, 51, 153],
"red": [255, 0, 0],
"rosybrown": [188, 143, 143],
"royalblue": [65, 105, 225],
"saddlebrown": [139, 69, 19],
"salmon": [250, 128, 114],
"sandybrown": [244, 164, 96],
"seagreen": [46, 139, 87],
"seashell": [255, 245, 238],
"sienna": [160, 82, 45],
"silver": [192, 192, 192],
"skyblue": [135, 206, 235],
"slateblue": [106, 90, 205],
"slategray": [112, 128, 144],
"slategrey": [112, 128, 144],
"snow": [255, 250, 250],
"springgreen": [0, 255, 127],
"steelblue": [70, 130, 180],
"tan": [210, 180, 140],
"teal": [0, 128, 128],
"thistle": [216, 191, 216],
"tomato": [255, 99, 71],
"turquoise": [64, 224, 208],
"violet": [238, 130, 238],
"wheat": [245, 222, 179],
"white": [255, 255, 255],
"whitesmoke": [245, 245, 245],
"yellow": [255, 255, 0],
"yellowgreen": [154, 205, 50]
};
var simpleSwizzle = { exports: {} };
var isArrayish$1 = function isArrayish2(obj) {
if (!obj || typeof obj === "string") {
return false;
}
return obj instanceof Array || Array.isArray(obj) || obj.length >= 0 && (obj.splice instanceof Function || Object.getOwnPropertyDescriptor(obj, obj.length - 1) && obj.constructor.name !== "String");
};
var isArrayish = isArrayish$1;
var concat = Array.prototype.concat;
var slice = Array.prototype.slice;
var swizzle$1 = simpleSwizzle.exports = function swizzle2(args) {
var results = [];
for (var i2 = 0, len = args.length; i2 < len; i2++) {
var arg = args[i2];
if (isArrayish(arg)) {
results = concat.call(results, slice.call(arg));
} else {
results.push(arg);
}
}
return results;
};
swizzle$1.wrap = function(fn) {
return function() {
return fn(swizzle$1(arguments));
};
};
var colorNames = colorName;
var swizzle = simpleSwizzle.exports;
var hasOwnProperty$3 = Object.hasOwnProperty;
var reverseNames = /* @__PURE__ */ Object.create(null);
for (var name in colorNames) {
if (hasOwnProperty$3.call(colorNames, name)) {
reverseNames[colorNames[name]] = name;
}
}
var cs = colorString$1.exports = {
to: {},
get: {}
};
cs.get = function(string2) {
var prefix = string2.substring(0, 3).toLowerCase();
var val;
var model2;
switch (prefix) {
case "hsl":
val = cs.get.hsl(string2);
model2 = "hsl";
break;
case "hwb":
val = cs.get.hwb(string2);
model2 = "hwb";
break;
default:
val = cs.get.rgb(string2);
model2 = "rgb";
break;
}
if (!val) {
return null;
}
return { model: model2, value: val };
};
cs.get.rgb = function(string2) {
if (!string2) {
return null;
}
var abbr = /^#([a-f0-9]{3,4})$/i;
var hex = /^#([a-f0-9]{6})([a-f0-9]{2})?$/i;
var rgba = /^rgba?\(\s*([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/;
var per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/;
var keyword = /^(\w+)$/;
var rgb = [0, 0, 0, 1];
var match2;
var i2;
var hexAlpha;
if (match2 = string2.match(hex)) {
hexAlpha = match2[2];
match2 = match2[1];
for (i2 = 0; i2 < 3; i2++) {
var i22 = i2 * 2;
rgb[i2] = parseInt(match2.slice(i22, i22 + 2), 16);
}
if (hexAlpha) {
rgb[3] = parseInt(hexAlpha, 16) / 255;
}
} else if (match2 = string2.match(abbr)) {
match2 = match2[1];
hexAlpha = match2[3];
for (i2 = 0; i2 < 3; i2++) {
rgb[i2] = parseInt(match2[i2] + match2[i2], 16);
}
if (hexAlpha) {
rgb[3] = parseInt(hexAlpha + hexAlpha, 16) / 255;
}
} else if (match2 = string2.match(rgba)) {
for (i2 = 0; i2 < 3; i2++) {
rgb[i2] = parseInt(match2[i2 + 1], 0);
}
if (match2[4]) {
if (match2[5]) {
rgb[3] = parseFloat(match2[4]) * 0.01;
} else {
rgb[3] = parseFloat(match2[4]);
}
}
} else if (match2 = string2.match(per)) {
for (i2 = 0; i2 < 3; i2++) {
rgb[i2] = Math.round(parseFloat(match2[i2 + 1]) * 2.55);
}
if (match2[4]) {
if (match2[5]) {
rgb[3] = parseFloat(match2[4]) * 0.01;
} else {
rgb[3] = parseFloat(match2[4]);
}
}
} else if (match2 = string2.match(keyword)) {
if (match2[1] === "transparent") {
return [0, 0, 0, 0];
}
if (!hasOwnProperty$3.call(colorNames, match2[1])) {
return null;
}
rgb = colorNames[match2[1]];
rgb[3] = 1;
return rgb;
} else {
return null;
}
for (i2 = 0; i2 < 3; i2++) {
rgb[i2] = clamp(rgb[i2], 0, 255);
}
rgb[3] = clamp(rgb[3], 0, 1);
return rgb;
};
cs.get.hsl = function(string2) {
if (!string2) {
return null;
}
var hsl = /^hsla?\(\s*([+-]?(?:\d{0,3}\.)?\d+)(?:deg)?\s*,?\s*([+-]?[\d\.]+)%\s*,?\s*([+-]?[\d\.]+)%\s*(?:[,|\/]\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:[eE][+-]?\d+)?)\s*)?\)$/;
var match2 = string2.match(hsl);
if (match2) {
var alpha = parseFloat(match2[4]);
var h2 = (parseFloat(match2[1]) % 360 + 360) % 360;
var s = clamp(parseFloat(match2[2]), 0, 100);
var l2 = clamp(parseFloat(match2[3]), 0, 100);
var a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);
return [h2, s, l2, a];
}
return null;
};
cs.get.hwb = function(string2) {
if (!string2) {
return null;
}
var hwb = /^hwb\(\s*([+-]?\d{0,3}(?:\.\d+)?)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:[eE][+-]?\d+)?)\s*)?\)$/;
var match2 = string2.match(hwb);
if (match2) {
var alpha = parseFloat(match2[4]);
var h2 = (parseFloat(match2[1]) % 360 + 360) % 360;
var w2 = clamp(parseFloat(match2[2]), 0, 100);
var b2 = clamp(parseFloat(match2[3]), 0, 100);
var a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);
return [h2, w2, b2, a];
}
return null;
};
cs.to.hex = function() {
var rgba = swizzle(arguments);
return "#" + hexDouble(rgba[0]) + hexDouble(rgba[1]) + hexDouble(rgba[2]) + (rgba[3] < 1 ? hexDouble(Math.round(rgba[3] * 255)) : "");
};
cs.to.rgb = function() {
var rgba = swizzle(arguments);
return rgba.length < 4 || rgba[3] === 1 ? "rgb(" + Math.round(rgba[0]) + ", " + Math.round(rgba[1]) + ", " + Math.round(rgba[2]) + ")" : "rgba(" + Math.round(rgba[0]) + ", " + Math.round(rgba[1]) + ", " + Math.round(rgba[2]) + ", " + rgba[3] + ")";
};
cs.to.rgb.percent = function() {
var rgba = swizzle(arguments);
var r2 = Math.round(rgba[0] / 255 * 100);
var g2 = Math.round(rgba[1] / 255 * 100);
var b2 = Math.round(rgba[2] / 255 * 100);
return rgba.length < 4 || rgba[3] === 1 ? "rgb(" + r2 + "%, " + g2 + "%, " + b2 + "%)" : "rgba(" + r2 + "%, " + g2 + "%, " + b2 + "%, " + rgba[3] + ")";
};
cs.to.hsl = function() {
var hsla = swizzle(arguments);
return hsla.length < 4 || hsla[3] === 1 ? "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)" : "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " + hsla[3] + ")";
};
cs.to.hwb = function() {
var hwba = swizzle(arguments);
var a = "";
if (hwba.length >= 4 && hwba[3] !== 1) {
a = ", " + hwba[3];
}
return "hwb(" + hwba[0] + ", " + hwba[1] + "%, " + hwba[2] + "%" + a + ")";
};
cs.to.keyword = function(rgb) {
return reverseNames[rgb.slice(0, 3)];
};
function clamp(num, min, max) {
return Math.min(Math.max(min, num), max);
}
function hexDouble(num) {
var str = Math.round(num).toString(16).toUpperCase();
return str.length < 2 ? "0" + str : str;
}
var conversions$2 = { exports: {} };
var cssKeywords = colorName;
var reverseKeywords = {};
for (var key in cssKeywords) {
if (cssKeywords.hasOwnProperty(key)) {
reverseKeywords[cssKeywords[key]] = key;
}
}
var convert$2 = conversions$2.exports = {
rgb: { channels: 3, labels: "rgb" },
hsl: { channels: 3, labels: "hsl" },
hsv: { channels: 3, labels: "hsv" },
hwb: { channels: 3, labels: "hwb" },
cmyk: { channels: 4, labels: "cmyk" },
xyz: { channels: 3, labels: "xyz" },
lab: { channels: 3, labels: "lab" },
lch: { channels: 3, labels: "lch" },
hex: { channels: 1, labels: ["hex"] },
keyword: { channels: 1, labels: ["keyword"] },
ansi16: { channels: 1, labels: ["ansi16"] },
ansi256: { channels: 1, labels: ["ansi256"] },
hcg: { channels: 3, labels: ["h", "c", "g"] },
apple: { channels: 3, labels: ["r16", "g16", "b16"] },
gray: { channels: 1, labels: ["gray"] }
};
for (var model in convert$2) {
if (convert$2.hasOwnProperty(model)) {
if (!("channels" in convert$2[model])) {
throw new Error("missing channels property: " + model);
}
if (!("labels" in convert$2[model])) {
throw new Error("missing channel labels property: " + model);
}
if (convert$2[model].labels.length !== convert$2[model].channels) {
throw new Error("channel and label counts mismatch: " + model);
}
var channels = convert$2[model].channels;
var labels = convert$2[model].labels;
delete convert$2[model].channels;
delete convert$2[model].labels;
Object.defineProperty(convert$2[model], "channels", { value: channels });
Object.defineProperty(convert$2[model], "labels", { value: labels });
}
}
convert$2.rgb.hsl = function(rgb) {
var r2 = rgb[0] / 255;
var g2 = rgb[1] / 255;
var b2 = rgb[2] / 255;
var min = Math.min(r2, g2, b2);
var max = Math.max(r2, g2, b2);
var delta = max - min;
var h2;
var s;
var l2;
if (max === min) {
h2 = 0;
} else if (r2 === max) {
h2 = (g2 - b2) / delta;
} else if (g2 === max) {
h2 = 2 + (b2 - r2) / delta;
} else if (b2 === max) {
h2 = 4 + (r2 - g2) / delta;
}
h2 = Math.min(h2 * 60, 360);
if (h2 < 0) {
h2 += 360;
}
l2 = (min + max) / 2;
if (max === min) {
s = 0;
} else if (l2 <= 0.5) {
s = delta / (max + min);
} else {
s = delta / (2 - max - min);
}
return [h2, s * 100, l2 * 100];
};
convert$2.rgb.hsv = function(rgb) {
var rdif;
var gdif;
var bdif;
var h2;
var s;
var r2 = rgb[0] / 255;
var g2 = rgb[1] / 255;
var b2 = rgb[2] / 255;
var v2 = Math.max(r2, g2, b2);
var diff = v2 - Math.min(r2, g2, b2);
var diffc = function(c2) {
return (v2 - c2) / 6 / diff + 1 / 2;
};
if (diff === 0) {
h2 = s = 0;
} else {
s = diff / v2;
rdif = diffc(r2);
gdif = diffc(g2);
bdif = diffc(b2);
if (r2 === v2) {
h2 = bdif - gdif;
} else if (g2 === v2) {
h2 = 1 / 3 + rdif - bdif;
} else if (b2 === v2) {
h2 = 2 / 3 + gdif - rdif;
}
if (h2 < 0) {
h2 += 1;
} else if (h2 > 1) {
h2 -= 1;
}
}
return [
h2 * 360,
s * 100,
v2 * 100
];
};
convert$2.rgb.hwb = function(rgb) {
var r2 = rgb[0];
var g2 = rgb[1];
var b2 = rgb[2];
var h2 = convert$2.rgb.hsl(rgb)[0];
var w2 = 1 / 255 * Math.min(r2, Math.min(g2, b2));
b2 = 1 - 1 / 255 * Math.max(r2, Math.max(g2, b2));
return [h2, w2 * 100, b2 * 100];
};
convert$2.rgb.cmyk = function(rgb) {
var r2 = rgb[0] / 255;
var g2 = rgb[1] / 255;
var b2 = rgb[2] / 255;
var c2;
var m2;
var y2;
var k2;
k2 = Math.min(1 - r2, 1 - g2, 1 - b2);
c2 = (1 - r2 - k2) / (1 - k2) || 0;
m2 = (1 - g2 - k2) / (1 - k2) || 0;
y2 = (1 - b2 - k2) / (1 - k2) || 0;
return [c2 * 100, m2 * 100, y2 * 100, k2 * 100];
};
function comparativeDistance(x2, y2) {
return Math.pow(x2[0] - y2[0], 2) + Math.pow(x2[1] - y2[1], 2) + Math.pow(x2[2] - y2[2], 2);
}
convert$2.rgb.keyword = function(rgb) {
var reversed = reverseKeywords[rgb];
if (reversed) {
return reversed;
}
var currentClosestDistance = Infinity;
var currentClosestKeyword;
for (var keyword in cssKeywords) {
if (cssKeywords.hasOwnProperty(keyword)) {
var value = cssKeywords[keyword];
var distance = comparativeDistance(rgb, value);
if (distance < currentClosestDistance) {
currentClosestDistance = distance;
currentClosestKeyword = keyword;
}
}
}
return currentClosestKeyword;
};
convert$2.keyword.rgb = function(keyword) {
return cssKeywords[keyword];
};
convert$2.rgb.xyz = function(rgb) {
var r2 = rgb[0] / 255;
var g2 = rgb[1] / 255;
var b2 = rgb[2] / 255;
r2 = r2 > 0.04045 ? Math.pow((r2 + 0.055) / 1.055, 2.4) : r2 / 12.92;
g2 = g2 > 0.04045 ? Math.pow((g2 + 0.055) / 1.055, 2.4) : g2 / 12.92;
b2 = b2 > 0.04045 ? Math.pow((b2 + 0.055) / 1.055, 2.4) : b2 / 12.92;
var x2 = r2 * 0.4124 + g2 * 0.3576 + b2 * 0.1805;
var y2 = r2 * 0.2126 + g2 * 0.7152 + b2 * 0.0722;
var z2 = r2 * 0.0193 + g2 * 0.1192 + b2 * 0.9505;
return [x2 * 100, y2 * 100, z2 * 100];
};
convert$2.rgb.lab = function(rgb) {
var xyz = convert$2.rgb.xyz(rgb);
var x2 = xyz[0];
var y2 = xyz[1];
var z2 = xyz[2];
var l2;
var a;
var b2;
x2 /= 95.047;
y2 /= 100;
z2 /= 108.883;
x2 = x2 > 8856e-6 ? Math.pow(x2, 1 / 3) : 7.787 * x2 + 16 / 116;
y2 = y2 > 8856e-6 ? Math.pow(y2, 1 / 3) : 7.787 * y2 + 16 / 116;
z2 = z2 > 8856e-6 ? Math.pow(z2, 1 / 3) : 7.787 * z2 + 16 / 116;
l2 = 116 * y2 - 16;
a = 500 * (x2 - y2);
b2 = 200 * (y2 - z2);
return [l2, a, b2];
};
convert$2.hsl.rgb = function(hsl) {
var h2 = hsl[0] / 360;
var s = hsl[1] / 100;
var l2 = hsl[2] / 100;
var t1;
var t2;
var t3;
var rgb;
var val;
if (s === 0) {
val = l2 * 255;
return [val, val, val];
}
if (l2 < 0.5) {
t2 = l2 * (1 + s);
} else {
t2 = l2 + s - l2 * s;
}
t1 = 2 * l2 - t2;
rgb = [0, 0, 0];
for (var i2 = 0; i2 < 3; i2++) {
t3 = h2 + 1 / 3 * -(i2 - 1);
if (t3 < 0) {
t3++;
}
if (t3 > 1) {
t3--;
}
if (6 * t3 < 1) {
val = t1 + (t2 - t1) * 6 * t3;
} else if (2 * t3 < 1) {
val = t2;
} else if (3 * t3 < 2) {
val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
} else {
val = t1;
}
rgb[i2] = val * 255;
}
return rgb;
};
convert$2.hsl.hsv = function(hsl) {
var h2 = hsl[0];
var s = hsl[1] / 100;
var l2 = hsl[2] / 100;
var smin = s;
var lmin = Math.max(l2, 0.01);
var sv;
var v2;
l2 *= 2;
s *= l2 <= 1 ? l2 : 2 - l2;
smin *= lmin <= 1 ? lmin : 2 - lmin;
v2 = (l2 + s) / 2;
sv = l2 === 0 ? 2 * smin / (lmin + smin) : 2 * s / (l2 + s);
return [h2, sv * 100, v2 * 100];
};
convert$2.hsv.rgb = function(hsv) {
var h2 = hsv[0] / 60;
var s = hsv[1] / 100;
var v2 = hsv[2] / 100;
var hi = Math.floor(h2) % 6;
var f2 = h2 - Math.floor(h2);
var p2 = 255 * v2 * (1 - s);
var q2 = 255 * v2 * (1 - s * f2);
var t2 = 255 * v2 * (1 - s * (1 - f2));
v2 *= 255;
switch (hi) {
case 0:
return [v2, t2, p2];
case 1:
return [q2, v2, p2];
case 2:
return [p2, v2, t2];
case 3:
return [p2, q2, v2];
case 4:
return [t2, p2, v2];
case 5:
return [v2, p2, q2];
}
};
convert$2.hsv.hsl = function(hsv) {
var h2 = hsv[0];
var s = hsv[1] / 100;
var v2 = hsv[2] / 100;
var vmin = Math.max(v2, 0.01);
var lmin;
var sl;
var l2;
l2 = (2 - s) * v2;
lmin = (2 - s) * vmin;
sl = s * vmin;
sl /= lmin <= 1 ? lmin : 2 - lmin;
sl = sl || 0;
l2 /= 2;
return [h2, sl * 100, l2 * 100];
};
convert$2.hwb.rgb = function(hwb) {
var h2 = hwb[0] / 360;
var wh = hwb[1] / 100;
var bl = hwb[2] / 100;
var ratio = wh + bl;
var i2;
var v2;
var f2;
var n2;
if (ratio > 1) {
wh /= ratio;
bl /= ratio;
}
i2 = Math.floor(6 * h2);
v2 = 1 - bl;
f2 = 6 * h2 - i2;
if ((i2 & 1) !== 0) {
f2 = 1 - f2;
}
n2 = wh + f2 * (v2 - wh);
var r2;
var g2;
var b2;
switch (i2) {
default:
case 6:
case 0:
r2 = v2;
g2 = n2;
b2 = wh;
break;
case 1:
r2 = n2;
g2 = v2;
b2 = wh;
break;
case 2:
r2 = wh;
g2 = v2;
b2 = n2;
break;
case 3:
r2 = wh;
g2 = n2;
b2 = v2;
break;
case 4:
r2 = n2;
g2 = wh;
b2 = v2;
break;
case 5:
r2 = v2;
g2 = wh;
b2 = n2;
break;
}
return [r2 * 255, g2 * 255, b2 * 255];
};
convert$2.cmyk.rgb = function(cmyk) {
var c2 = cmyk[0] / 100;
var m2 = cmyk[1] / 100;
var y2 = cmyk[2] / 100;
var k2 = cmyk[3] / 100;
var r2;
var g2;
var b2;
r2 = 1 - Math.min(1, c2 * (1 - k2) + k2);
g2 = 1 - Math.min(1, m2 * (1 - k2) + k2);
b2 = 1 - Math.min(1, y2 * (1 - k2) + k2);
return [r2 * 255, g2 * 255, b2 * 255];
};
convert$2.xyz.rgb = function(xyz) {
var x2 = xyz[0] / 100;
var y2 = xyz[1] / 100;
var z2 = xyz[2] / 100;
var r2;
var g2;
var b2;
r2 = x2 * 3.2406 + y2 * -1.5372 + z2 * -0.4986;
g2 = x2 * -0.9689 + y2 * 1.8758 + z2 * 0.0415;
b2 = x2 * 0.0557 + y2 * -0.204 + z2 * 1.057;
r2 = r2 > 31308e-7 ? 1.055 * Math.pow(r2, 1 / 2.4) - 0.055 : r2 * 12.92;
g2 = g2 > 31308e-7 ? 1.055 * Math.pow(g2, 1 / 2.4) - 0.055 : g2 * 12.92;
b2 = b2 > 31308e-7 ? 1.055 * Math.pow(b2, 1 / 2.4) - 0.055 : b2 * 12.92;
r2 = Math.min(Math.max(0, r2), 1);
g2 = Math.min(Math.max(0, g2), 1);
b2 = Math.min(Math.max(0, b2), 1);
return [r2 * 255, g2 * 255, b2 * 255];
};
convert$2.xyz.lab = function(xyz) {
var x2 = xyz[0];
var y2 = xyz[1];
var z2 = xyz[2];
var l2;
var a;
var b2;
x2 /= 95.047;
y2 /= 100;
z2 /= 108.883;
x2 = x2 > 8856e-6 ? Math.pow(x2, 1 / 3) : 7.787 * x2 + 16 / 116;
y2 = y2 > 8856e-6 ? Math.pow(y2, 1 / 3) : 7.787 * y2 + 16 / 116;
z2 = z2 > 8856e-6 ? Math.pow(z2, 1 / 3) : 7.787 * z2 + 16 / 116;
l2 = 116 * y2 - 16;
a = 500 * (x2 - y2);
b2 = 200 * (y2 - z2);
return [l2, a, b2];
};
convert$2.lab.xyz = function(lab) {
var l2 = lab[0];
var a = lab[1];
var b2 = lab[2];
var x2;
var y2;
var z2;
y2 = (l2 + 16) / 116;
x2 = a / 500 + y2;
z2 = y2 - b2 / 200;
var y22 = Math.pow(y2, 3);
var x22 = Math.pow(x2, 3);
var z22 = Math.pow(z2, 3);
y2 = y22 > 8856e-6 ? y22 : (y2 - 16 / 116) / 7.787;
x2 = x22 > 8856e-6 ? x22 : (x2 - 16 / 116) / 7.787;
z2 = z22 > 8856e-6 ? z22 : (z2 - 16 / 116) / 7.787;
x2 *= 95.047;
y2 *= 100;
z2 *= 108.883;
return [x2, y2, z2];
};
convert$2.lab.lch = function(lab) {
var l2 = lab[0];
var a = lab[1];
var b2 = lab[2];
var hr;
var h2;
var c2;
hr = Math.atan2(b2, a);
h2 = hr * 360 / 2 / Math.PI;
if (h2 < 0) {
h2 += 360;
}
c2 = Math.sqrt(a * a + b2 * b2);
return [l2, c2, h2];
};
convert$2.lch.lab = function(lch) {
var l2 = lch[0];
var c2 = lch[1];
var h2 = lch[2];
var a;
var b2;
var hr;
hr = h2 / 360 * 2 * Math.PI;
a = c2 * Math.cos(hr);
b2 = c2 * Math.sin(hr);
return [l2, a, b2];
};
convert$2.rgb.ansi16 = function(args) {
var r2 = args[0];
var g2 = args[1];
var b2 = args[2];
var value = 1 in arguments ? arguments[1] : convert$2.rgb.hsv(args)[2];
value = Math.round(value / 50);
if (value === 0) {
return 30;
}
var ansi = 30 + (Math.round(b2 / 255) << 2 | Math.round(g2 / 255) << 1 | Math.round(r2 / 255));
if (value === 2) {
ansi += 60;
}
return ansi;
};
convert$2.hsv.ansi16 = function(args) {
return convert$2.rgb.ansi16(convert$2.hsv.rgb(args), args[2]);
};
convert$2.rgb.ansi256 = function(args) {
var r2 = args[0];
var g2 = args[1];
var b2 = args[2];
if (r2 === g2 && g2 === b2) {
if (r2 < 8) {
return 16;
}
if (r2 > 248) {
return 231;
}
return Math.round((r2 - 8) / 247 * 24) + 232;
}
var ansi = 16 + 36 * Math.round(r2 / 255 * 5) + 6 * Math.round(g2 / 255 * 5) + Math.round(b2 / 255 * 5);
return ansi;
};
convert$2.ansi16.rgb = function(args) {
var color2 = args % 10;
if (color2 === 0 || color2 === 7) {
if (args > 50) {
color2 += 3.5;
}
color2 = color2 / 10.5 * 255;
return [color2, color2, color2];
}
var mult = (~~(args > 50) + 1) * 0.5;
var r2 = (color2 & 1) * mult * 255;
var g2 = (color2 >> 1 & 1) * mult * 255;
var b2 = (color2 >> 2 & 1) * mult * 255;
return [r2, g2, b2];
};
convert$2.ansi256.rgb = function(args) {
if (args >= 232) {
var c2 = (args - 232) * 10 + 8;
return [c2, c2, c2];
}
args -= 16;
var rem;
var r2 = Math.floor(args / 36) / 5 * 255;
var g2 = Math.floor((rem = args % 36) / 6) / 5 * 255;
var b2 = rem % 6 / 5 * 255;
return [r2, g2, b2];
};
convert$2.rgb.hex = function(args) {
var integer2 = ((Math.round(args[0]) & 255) << 16) + ((Math.round(args[1]) & 255) << 8) + (Math.round(args[2]) & 255);
var string2 = integer2.toString(16).toUpperCase();
return "000000".substring(string2.length) + string2;
};
convert$2.hex.rgb = function(args) {
var match2 = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);
if (!match2) {
return [0, 0, 0];
}
var colorString2 = match2[0];
if (match2[0].length === 3) {
colorString2 = colorString2.split("").map(function(char) {
return char + char;
}).join("");
}
var integer2 = parseInt(colorString2, 16);
var r2 = integer2 >> 16 & 255;
var g2 = integer2 >> 8 & 255;
var b2 = integer2 & 255;
return [r2, g2, b2];
};
convert$2.rgb.hcg = function(rgb) {
var r2 = rgb[0] / 255;
var g2 = rgb[1] / 255;
var b2 = rgb[2] / 255;
var max = Math.max(Math.max(r2, g2), b2);
var min = Math.min(Math.min(r2, g2), b2);
var chroma = max - min;
var grayscale;
var hue;
if (chroma < 1) {
grayscale = min / (1 - chroma);
} else {
grayscale = 0;
}
if (chroma <= 0) {
hue = 0;
} else if (max === r2) {
hue = (g2 - b2) / chroma % 6;
} else if (max === g2) {
hue = 2 + (b2 - r2) / chroma;
} else {
hue = 4 + (r2 - g2) / chroma + 4;
}
hue /= 6;
hue %= 1;
return [hue * 360, chroma * 100, grayscale * 100];
};
convert$2.hsl.hcg = function(hsl) {
var s = hsl[1] / 100;
var l2 = hsl[2] / 100;
var c2 = 1;
var f2 = 0;
if (l2 < 0.5) {
c2 = 2 * s * l2;
} else {
c2 = 2 * s * (1 - l2);
}
if (c2 < 1) {
f2 = (l2 - 0.5 * c2) / (1 - c2);
}
return [hsl[0], c2 * 100, f2 * 100];
};
convert$2.hsv.hcg = function(hsv) {
var s = hsv[1] / 100;
var v2 = hsv[2] / 100;
var c2 = s * v2;
var f2 = 0;
if (c2 < 1) {
f2 = (v2 - c2) / (1 - c2);
}
return [hsv[0], c2 * 100, f2 * 100];
};
convert$2.hcg.rgb = function(hcg) {
var h2 = hcg[0] / 360;
var c2 = hcg[1] / 100;
var g2 = hcg[2] / 100;
if (c2 === 0) {
return [g2 * 255, g2 * 255, g2 * 255];
}
var pure = [0, 0, 0];
var hi = h2 % 1 * 6;
var v2 = hi % 1;
var w2 = 1 - v2;
var mg = 0;
switch (Math.floor(hi)) {
case 0:
pure[0] = 1;
pure[1] = v2;
pure[2] = 0;
break;
case 1:
pure[0] = w2;
pure[1] = 1;
pure[2] = 0;
break;
case 2:
pure[0] = 0;
pure[1] = 1;
pure[2] = v2;
break;
case 3:
pure[0] = 0;
pure[1] = w2;
pure[2] = 1;
break;
case 4:
pure[0] = v2;
pure[1] = 0;
pure[2] = 1;
break;
default:
pure[0] = 1;
pure[1] = 0;
pure[2] = w2;
}
mg = (1 - c2) * g2;
return [
(c2 * pure[0] + mg) * 255,
(c2 * pure[1] + mg) * 255,
(c2 * pure[2] + mg) * 255
];
};
convert$2.hcg.hsv = function(hcg) {
var c2 = hcg[1] / 100;
var g2 = hcg[2] / 100;
var v2 = c2 + g2 * (1 - c2);
var f2 = 0;
if (v2 > 0) {
f2 = c2 / v2;
}
return [hcg[0], f2 * 100, v2 * 100];
};
convert$2.hcg.hsl = function(hcg) {
var c2 = hcg[1] / 100;
var g2 = hcg[2] / 100;
var l2 = g2 * (1 - c2) + 0.5 * c2;
var s = 0;
if (l2 > 0 && l2 < 0.5) {
s = c2 / (2 * l2);
} else if (l2 >= 0.5 && l2 < 1) {
s = c2 / (2 * (1 - l2));
}
return [hcg[0], s * 100, l2 * 100];
};
convert$2.hcg.hwb = function(hcg) {
var c2 = hcg[1] / 100;
var g2 = hcg[2] / 100;
var v2 = c2 + g2 * (1 - c2);
return [hcg[0], (v2 - c2) * 100, (1 - v2) * 100];
};
convert$2.hwb.hcg = function(hwb) {
var w2 = hwb[1] / 100;
var b2 = hwb[2] / 100;
var v2 = 1 - b2;
var c2 = v2 - w2;
var g2 = 0;
if (c2 < 1) {
g2 = (v2 - c2) / (1 - c2);
}
return [hwb[0], c2 * 100, g2 * 100];
};
convert$2.apple.rgb = function(apple) {
return [apple[0] / 65535 * 255, apple[1] / 65535 * 255, apple[2] / 65535 * 255];
};
convert$2.rgb.apple = function(rgb) {
return [rgb[0] / 255 * 65535, rgb[1] / 255 * 65535, rgb[2] / 255 * 65535];
};
convert$2.gray.rgb = function(args) {
return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];
};
convert$2.gray.hsl = convert$2.gray.hsv = function(args) {
return [0, 0, args[0]];
};
convert$2.gray.hwb = function(gray) {
return [0, 100, gray[0]];
};
convert$2.gray.cmyk = function(gray) {
return [0, 0, 0, gray[0]];
};
convert$2.gray.lab = function(gray) {
return [gray[0], 0, 0];
};
convert$2.gray.hex = function(gray) {
var val = Math.round(gray[0] / 100 * 255) & 255;
var integer2 = (val << 16) + (val << 8) + val;
var string2 = integer2.toString(16).toUpperCase();
return "000000".substring(string2.length) + string2;
};
convert$2.rgb.gray = function(rgb) {
var val = (rgb[0] + rgb[1] + rgb[2]) / 3;
return [val / 255 * 100];
};
var conversions$1 = conversions$2.exports;
function buildGraph() {
var graph = {};
var models2 = Object.keys(conversions$1);
for (var len = models2.length, i2 = 0; i2 < len; i2++) {
graph[models2[i2]] = {
distance: -1,
parent: null
};
}
return graph;
}
function deriveBFS(fromModel) {
var graph = buildGraph();
var queue = [fromModel];
graph[fromModel].distance = 0;
while (queue.length) {
var current = queue.pop();
var adjacents = Object.keys(conversions$1[current]);
for (var len = adjacents.length, i2 = 0; i2 < len; i2++) {
var adjacent = adjacents[i2];
var node = graph[adjacent];
if (node.distance === -1) {
node.distance = graph[current].distance + 1;
node.parent = current;
queue.unshift(adjacent);
}
}
}
return graph;
}
function link(from, to) {
return function(args) {
return to(from(args));
};
}
function wrapConversion(toModel, graph) {
var path2 = [graph[toModel].parent, toModel];
var fn = conversions$1[graph[toModel].parent][toModel];
var cur = graph[toModel].parent;
while (graph[cur].parent) {
path2.unshift(graph[cur].parent);
fn = link(conversions$1[graph[cur].parent][cur], fn);
cur = graph[cur].parent;
}
fn.conversion = path2;
return fn;
}
var route$1 = function(fromModel) {
var graph = deriveBFS(fromModel);
var conversion = {};
var models2 = Object.keys(graph);
for (var len = models2.length, i2 = 0; i2 < len; i2++) {
var toModel = models2[i2];
var node = graph[toModel];
if (node.parent === null) {
continue;
}
conversion[toModel] = wrapConversion(toModel, graph);
}
return conversion;
};
var conversions = conversions$2.exports;
var route = route$1;
var convert$1 = {};
var models = Object.keys(conversions);
function wrapRaw(fn) {
var wrappedFn = function(args) {
if (args === void 0 || args === null) {
return args;
}
if (arguments.length > 1) {
args = Array.prototype.slice.call(arguments);
}
return fn(args);
};
if ("conversion" in fn) {
wrappedFn.conversion = fn.conversion;
}
return wrappedFn;
}
function wrapRounded(fn) {
var wrappedFn = function(args) {
if (args === void 0 || args === null) {
return args;
}
if (arguments.length > 1) {
args = Array.prototype.slice.call(arguments);
}
var result = fn(args);
if (typeof result === "object") {
for (var len = result.length, i2 = 0; i2 < len; i2++) {
result[i2] = Math.round(result[i2]);
}
}
return result;
};
if ("conversion" in fn) {
wrappedFn.conversion = fn.conversion;
}
return wrappedFn;
}
models.forEach(function(fromModel) {
convert$1[fromModel] = {};
Object.defineProperty(convert$1[fromModel], "channels", { value: conversions[fromModel].channels });
Object.defineProperty(convert$1[fromModel], "labels", { value: conversions[fromModel].labels });
var routes = route(fromModel);
var routeModels = Object.keys(routes);
routeModels.forEach(function(toModel) {
var fn = routes[toModel];
convert$1[fromModel][toModel] = wrapRounded(fn);
convert$1[fromModel][toModel].raw = wrapRaw(fn);
});
});
var colorConvert = convert$1;
var colorString = colorString$1.exports;
var convert = colorConvert;
var _slice = [].slice;
var skippedModels = [
"keyword",
"gray",
"hex"
];
var hashedModelKeys = {};
Object.keys(convert).forEach(function(model2) {
hashedModelKeys[_slice.call(convert[model2].labels).sort().join("")] = model2;
});
var limiters = {};
function Color$1(obj, model2) {
if (!(this instanceof Color$1)) {
return new Color$1(obj, model2);
}
if (model2 && model2 in skippedModels) {
model2 = null;
}
if (model2 && !(model2 in convert)) {
throw new Error("Unknown model: " + model2);
}
var i2;
var channels2;
if (obj == null) {
this.model = "rgb";
this.color = [0, 0, 0];
this.valpha = 1;
} else if (obj instanceof Color$1) {
this.model = obj.model;
this.color = obj.color.slice();
this.valpha = obj.valpha;
} else if (typeof obj === "string") {
var result = colorString.get(obj);
if (result === null) {
throw new Error("Unable to parse color from string: " + obj);
}
this.model = result.model;
channels2 = convert[this.model].channels;
this.color = result.value.slice(0, channels2);
this.valpha = typeof result.value[channels2] === "number" ? result.value[channels2] : 1;
} else if (obj.length) {
this.model = model2 || "rgb";
channels2 = convert[this.model].channels;
var newArr = _slice.call(obj, 0, channels2);
this.color = zeroArray(newArr, channels2);
this.valpha = typeof obj[channels2] === "number" ? obj[channels2] : 1;
} else if (typeof obj === "number") {
obj &= 16777215;
this.model = "rgb";
this.color = [
obj >> 16 & 255,
obj >> 8 & 255,
obj & 255
];
this.valpha = 1;
} else {
this.valpha = 1;
var keys2 = Object.keys(obj);
if ("alpha" in obj) {
keys2.splice(keys2.indexOf("alpha"), 1);
this.valpha = typeof obj.alpha === "number" ? obj.alpha : 0;
}
var hashedKeys = keys2.sort().join("");
if (!(hashedKeys in hashedModelKeys)) {
throw new Error("Unable to parse color from object: " + JSON.stringify(obj));
}
this.model = hashedModelKeys[hashedKeys];
var labels2 = convert[this.model].labels;
var color2 = [];
for (i2 = 0; i2 < labels2.length; i2++) {
color2.push(obj[labels2[i2]]);
}
this.color = zeroArray(color2);
}
if (limiters[this.model]) {
channels2 = convert[this.model].channels;
for (i2 = 0; i2 < channels2; i2++) {
var limit = limiters[this.model][i2];
if (limit) {
this.color[i2] = limit(this.color[i2]);
}
}
}
this.valpha = Math.max(0, Math.min(1, this.valpha));
if (Object.freeze) {
Object.freeze(this);
}
}
Color$1.prototype = {
toString: function() {
return this.string();
},
toJSON: function() {
return this[this.model]();
},
string: function(places) {
var self2 = this.model in colorString.to ? this : this.rgb();
self2 = self2.round(typeof places === "number" ? places : 1);
var args = self2.valpha === 1 ? self2.color : self2.color.concat(this.valpha);
return colorString.to[self2.model](args);
},
percentString: function(places) {
var self2 = this.rgb().round(typeof places === "number" ? places : 1);
var args = self2.valpha === 1 ? self2.color : self2.color.concat(this.valpha);
return colorString.to.rgb.percent(args);
},
array: function() {
return this.valpha === 1 ? this.color.slice() : this.color.concat(this.valpha);
},
object: function() {
var result = {};
var channels2 = convert[this.model].channels;
var labels2 = convert[this.model].labels;
for (var i2 = 0; i2 < channels2; i2++) {
result[labels2[i2]] = this.color[i2];
}
if (this.valpha !== 1) {
result.alpha = this.valpha;
}
return result;
},
unitArray: function() {
var rgb = this.rgb().color;
rgb[0] /= 255;
rgb[1] /= 255;
rgb[2] /= 255;
if (this.valpha !== 1) {
rgb.push(this.valpha);
}
return rgb;
},
unitObject: function() {
var rgb = this.rgb().object();
rgb.r /= 255;
rgb.g /= 255;
rgb.b /= 255;
if (this.valpha !== 1) {
rgb.alpha = this.valpha;
}
return rgb;
},
round: function(places) {
places = Math.max(places || 0, 0);
return new Color$1(this.color.map(roundToPlace(places)).concat(this.valpha), this.model);
},
alpha: function(val) {
if (arguments.length) {
return new Color$1(this.color.concat(Math.max(0, Math.min(1, val))), this.model);
}
return this.valpha;
},
red: getset("rgb", 0, maxfn(255)),
green: getset("rgb", 1, maxfn(255)),
blue: getset("rgb", 2, maxfn(255)),
hue: getset(["hsl", "hsv", "hsl", "hwb", "hcg"], 0, function(val) {
return (val % 360 + 360) % 360;
}),
saturationl: getset("hsl", 1, maxfn(100)),
lightness: getset("hsl", 2, maxfn(100)),
saturationv: getset("hsv", 1, maxfn(100)),
value: getset("hsv", 2, maxfn(100)),
chroma: getset("hcg", 1, maxfn(100)),
gray: getset("hcg", 2, maxfn(100)),
white: getset("hwb", 1, maxfn(100)),
wblack: getset("hwb", 2, maxfn(100)),
cyan: getset("cmyk", 0, maxfn(100)),
magenta: getset("cmyk", 1, maxfn(100)),
yellow: getset("cmyk", 2, maxfn(100)),
black: getset("cmyk", 3, maxfn(100)),
x: getset("xyz", 0, maxfn(100)),
y: getset("xyz", 1, maxfn(100)),
z: getset("xyz", 2, maxfn(100)),
l: getset("lab", 0, maxfn(100)),
a: getset("lab", 1),
b: getset("lab", 2),
keyword: function(val) {
if (arguments.length) {
return new Color$1(val);
}
return convert[this.model].keyword(this.color);
},
hex: function(val) {
if (arguments.length) {
return new Color$1(val);
}
return colorString.to.hex(this.rgb().round().color);
},
rgbNumber: function() {
var rgb = this.rgb().color;
return (rgb[0] & 255) << 16 | (rgb[1] & 255) << 8 | rgb[2] & 255;
},
luminosity: function() {
var rgb = this.rgb().color;
var lum = [];
for (var i2 = 0; i2 < rgb.length; i2++) {
var chan = rgb[i2] / 255;
lum[i2] = chan <= 0.03928 ? chan / 12.92 : Math.pow((chan + 0.055) / 1.055, 2.4);
}
return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];
},
contrast: function(color2) {
var lum1 = this.luminosity();
var lum2 = color2.luminosity();
if (lum1 > lum2) {
return (lum1 + 0.05) / (lum2 + 0.05);
}
return (lum2 + 0.05) / (lum1 + 0.05);
},
level: function(color2) {
var contrastRatio = this.contrast(color2);
if (contrastRatio >= 7.1) {
return "AAA";
}
return contrastRatio >= 4.5 ? "AA" : "";
},
isDark: function() {
var rgb = this.rgb().color;
var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1e3;
return yiq < 128;
},
isLight: function() {
return !this.isDark();
},
negate: function() {
var rgb = this.rgb();
for (var i2 = 0; i2 < 3; i2++) {
rgb.color[i2] = 255 - rgb.color[i2];
}
return rgb;
},
lighten: function(ratio) {
var hsl = this.hsl();
hsl.color[2] += hsl.color[2] * ratio;
return hsl;
},
darken: function(ratio) {
var hsl = this.hsl();
hsl.color[2] -= hsl.color[2] * ratio;
return hsl;
},
saturate: function(ratio) {
var hsl = this.hsl();
hsl.color[1] += hsl.color[1] * ratio;
return hsl;
},
desaturate: function(ratio) {
var hsl = this.hsl();
hsl.color[1] -= hsl.color[1] * ratio;
return hsl;
},
whiten: function(ratio) {
var hwb = this.hwb();
hwb.color[1] += hwb.color[1] * ratio;
return hwb;
},
blacken: function(ratio) {
var hwb = this.hwb();
hwb.color[2] += hwb.color[2] * ratio;
return hwb;
},
grayscale: function() {
var rgb = this.rgb().color;
var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;
return Color$1.rgb(val, val, val);
},
fade: function(ratio) {
return this.alpha(this.valpha - this.valpha * ratio);
},
opaquer: function(ratio) {
return this.alpha(this.valpha + this.valpha * ratio);
},
rotate: function(degrees) {
var hsl = this.hsl();
var hue = hsl.color[0];
hue = (hue + degrees) % 360;
hue = hue < 0 ? 360 + hue : hue;
hsl.color[0] = hue;
return hsl;
},
mix: function(mixinColor, weight) {
if (!mixinColor || !mixinColor.rgb) {
throw new Error('Argument to "mix" was not a Color instance, but rather an instance of ' + typeof mixinColor);
}
var color1 = mixinColor.rgb();
var color2 = this.rgb();
var p2 = weight === void 0 ? 0.5 : weight;
var w2 = 2 * p2 - 1;
var a = color1.alpha() - color2.alpha();
var w1 = ((w2 * a === -1 ? w2 : (w2 + a) / (1 + w2 * a)) + 1) / 2;
var w22 = 1 - w1;
return Color$1.rgb(
w1 * color1.red() + w22 * color2.red(),
w1 * color1.green() + w22 * color2.green(),
w1 * color1.blue() + w22 * color2.blue(),
color1.alpha() * p2 + color2.alpha() * (1 - p2)
);
}
};
Object.keys(convert).forEach(function(model2) {
if (skippedModels.indexOf(model2) !== -1) {
return;
}
var channels2 = convert[model2].channels;
Color$1.prototype[model2] = function() {
if (this.model === model2) {
return new Color$1(this);
}
if (arguments.length) {
return new Color$1(arguments, model2);
}
var newAlpha = typeof arguments[channels2] === "number" ? channels2 : this.valpha;
return new Color$1(assertArray(convert[this.model][model2].raw(this.color)).concat(newAlpha), model2);
};
Color$1[model2] = function(color2) {
if (typeof color2 === "number") {
color2 = zeroArray(_slice.call(arguments), channels2);
}
return new Color$1(color2, model2);
};
});
function roundTo(num, places) {
return Number(num.toFixed(places));
}
function roundToPlace(places) {
return function(num) {
return roundTo(num, places);
};
}
function getset(model2, channel, modifier) {
model2 = Array.isArray(model2) ? model2 : [model2];
model2.forEach(function(m2) {
(limiters[m2] || (limiters[m2] = []))[channel] = modifier;
});
model2 = model2[0];
return function(val) {
var result;
if (arguments.length) {
if (modifier) {
val = modifier(val);
}
result = this[model2]();
result.color[channel] = val;
return result;
}
result = this[model2]().color[channel];
if (modifier) {
result = modifier(result);
}
return result;
};
}
function maxfn(max) {
return function(v2) {
return Math.max(0, Math.min(max, v2));
};
}
function assertArray(val) {
return Array.isArray(val) ? val : [val];
}
function zeroArray(arr, length) {
for (var i2 = 0; i2 < length; i2++) {
if (typeof arr[i2] !== "number") {
arr[i2] = 0;
}
}
return arr;
}
var color$1 = Color$1;
function _typeof$m(obj) {
"@babel/helpers - typeof";
return _typeof$m = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$m(obj);
}
function _toConsumableArray$8(arr) {
return _arrayWithoutHoles$8(arr) || _iterableToArray$8(arr) || _unsupportedIterableToArray$h(arr) || _nonIterableSpread$8();
}
function _nonIterableSpread$8() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$h(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$h(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$h(o, minLen);
}
function _iterableToArray$8(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithoutHoles$8(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$h(arr);
}
function _arrayLikeToArray$h(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _regeneratorRuntime$2() {
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
_regeneratorRuntime$2 = function _regeneratorRuntime2() {
return exports2;
};
var exports2 = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty2 = Object.defineProperty || function(obj, key2, desc) {
obj[key2] = desc.value;
}, $Symbol2 = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol2.iterator || "@@iterator", asyncIteratorSymbol = $Symbol2.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol2.toStringTag || "@@toStringTag";
function define(obj, key2, value) {
return Object.defineProperty(obj, key2, { value, enumerable: true, configurable: true, writable: true }), obj[key2];
}
try {
define({}, "");
} catch (err) {
define = function define2(obj, key2, value) {
return obj[key2] = value;
};
}
function wrap2(innerFn, outerFn, self2, tryLocsList) {
var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context2 = new Context2(tryLocsList || []);
return defineProperty2(generator, "_invoke", { value: makeInvokeMethod(innerFn, self2, context2) }), generator;
}
function tryCatch(fn, obj, arg) {
try {
return { type: "normal", arg: fn.call(obj, arg) };
} catch (err) {
return { type: "throw", arg: err };
}
}
exports2.wrap = wrap2;
var ContinueSentinel = {};
function Generator() {
}
function GeneratorFunction() {
}
function GeneratorFunctionPrototype() {
}
var IteratorPrototype2 = {};
define(IteratorPrototype2, iteratorSymbol, function() {
return this;
});
var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([])));
NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype2 = NativeIteratorPrototype);
var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype2);
function defineIteratorMethods(prototype2) {
["next", "throw", "return"].forEach(function(method2) {
define(prototype2, method2, function(arg) {
return this._invoke(method2, arg);
});
});
}
function AsyncIterator(generator, PromiseImpl) {
function invoke(method2, arg, resolve, reject) {
var record = tryCatch(generator[method2], generator, arg);
if ("throw" !== record.type) {
var result = record.arg, value = result.value;
return value && "object" == _typeof$m(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function(value2) {
invoke("next", value2, resolve, reject);
}, function(err) {
invoke("throw", err, resolve, reject);
}) : PromiseImpl.resolve(value).then(function(unwrapped) {
result.value = unwrapped, resolve(result);
}, function(error) {
return invoke("throw", error, resolve, reject);
});
}
reject(record.arg);
}
var previousPromise;
defineProperty2(this, "_invoke", { value: function value(method2, arg) {
function callInvokeWithMethodAndArg() {
return new PromiseImpl(function(resolve, reject) {
invoke(method2, arg, resolve, reject);
});
}
return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
} });
}
function makeInvokeMethod(innerFn, self2, context2) {
var state = "suspendedStart";
return function(method2, arg) {
if ("executing" === state)
throw new Error("Generator is already running");
if ("completed" === state) {
if ("throw" === method2)
throw arg;
return doneResult();
}
for (context2.method = method2, context2.arg = arg; ; ) {
var delegate = context2.delegate;
if (delegate) {
var delegateResult = maybeInvokeDelegate(delegate, context2);
if (delegateResult) {
if (delegateResult === ContinueSentinel)
continue;
return delegateResult;
}
}
if ("next" === context2.method)
context2.sent = context2._sent = context2.arg;
else if ("throw" === context2.method) {
if ("suspendedStart" === state)
throw state = "completed", context2.arg;
context2.dispatchException(context2.arg);
} else
"return" === context2.method && context2.abrupt("return", context2.arg);
state = "executing";
var record = tryCatch(innerFn, self2, context2);
if ("normal" === record.type) {
if (state = context2.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel)
continue;
return { value: record.arg, done: context2.done };
}
"throw" === record.type && (state = "completed", context2.method = "throw", context2.arg = record.arg);
}
};
}
function maybeInvokeDelegate(delegate, context2) {
var methodName = context2.method, method2 = delegate.iterator[methodName];
if (void 0 === method2)
return context2.delegate = null, "throw" === methodName && delegate.iterator.return && (context2.method = "return", context2.arg = void 0, maybeInvokeDelegate(delegate, context2), "throw" === context2.method) || "return" !== methodName && (context2.method = "throw", context2.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel;
var record = tryCatch(method2, delegate.iterator, context2.arg);
if ("throw" === record.type)
return context2.method = "throw", context2.arg = record.arg, context2.delegate = null, ContinueSentinel;
var info = record.arg;
return info ? info.done ? (context2[delegate.resultName] = info.value, context2.next = delegate.nextLoc, "return" !== context2.method && (context2.method = "next", context2.arg = void 0), context2.delegate = null, ContinueSentinel) : info : (context2.method = "throw", context2.arg = new TypeError("iterator result is not an object"), context2.delegate = null, ContinueSentinel);
}
function pushTryEntry(locs) {
var entry = { tryLoc: locs[0] };
1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);
}
function resetTryEntry(entry) {
var record = entry.completion || {};
record.type = "normal", delete record.arg, entry.completion = record;
}
function Context2(tryLocsList) {
this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(true);
}
function values(iterable) {
if (iterable) {
var iteratorMethod = iterable[iteratorSymbol];
if (iteratorMethod)
return iteratorMethod.call(iterable);
if ("function" == typeof iterable.next)
return iterable;
if (!isNaN(iterable.length)) {
var i2 = -1, next = function next2() {
for (; ++i2 < iterable.length; )
if (hasOwn.call(iterable, i2))
return next2.value = iterable[i2], next2.done = false, next2;
return next2.value = void 0, next2.done = true, next2;
};
return next.next = next;
}
}
return { next: doneResult };
}
function doneResult() {
return { value: void 0, done: true };
}
return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty2(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: true }), defineProperty2(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: true }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports2.isGeneratorFunction = function(genFun) {
var ctor = "function" == typeof genFun && genFun.constructor;
return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name));
}, exports2.mark = function(genFun) {
return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun;
}, exports2.awrap = function(arg) {
return { __await: arg };
}, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function() {
return this;
}), exports2.AsyncIterator = AsyncIterator, exports2.async = function(innerFn, outerFn, self2, tryLocsList, PromiseImpl) {
void 0 === PromiseImpl && (PromiseImpl = Promise);
var iter = new AsyncIterator(wrap2(innerFn, outerFn, self2, tryLocsList), PromiseImpl);
return exports2.isGeneratorFunction(outerFn) ? iter : iter.next().then(function(result) {
return result.done ? result.value : iter.next();
});
}, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function() {
return this;
}), define(Gp, "toString", function() {
return "[object Generator]";
}), exports2.keys = function(val) {
var object2 = Object(val), keys2 = [];
for (var key2 in object2)
keys2.push(key2);
return keys2.reverse(), function next() {
for (; keys2.length; ) {
var key3 = keys2.pop();
if (key3 in object2)
return next.value = key3, next.done = false, next;
}
return next.done = true, next;
};
}, exports2.values = values, Context2.prototype = { constructor: Context2, reset: function reset(skipTempReset) {
if (this.prev = 0, this.next = 0, this.sent = this._sent = void 0, this.done = false, this.delegate = null, this.method = "next", this.arg = void 0, this.tryEntries.forEach(resetTryEntry), !skipTempReset)
for (var name2 in this)
"t" === name2.charAt(0) && hasOwn.call(this, name2) && !isNaN(+name2.slice(1)) && (this[name2] = void 0);
}, stop: function stop() {
this.done = true;
var rootRecord = this.tryEntries[0].completion;
if ("throw" === rootRecord.type)
throw rootRecord.arg;
return this.rval;
}, dispatchException: function dispatchException(exception) {
if (this.done)
throw exception;
var context2 = this;
function handle(loc, caught) {
return record.type = "throw", record.arg = exception, context2.next = loc, caught && (context2.method = "next", context2.arg = void 0), !!caught;
}
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2], record = entry.completion;
if ("root" === entry.tryLoc)
return handle("end");
if (entry.tryLoc <= this.prev) {
var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc");
if (hasCatch && hasFinally) {
if (this.prev < entry.catchLoc)
return handle(entry.catchLoc, true);
if (this.prev < entry.finallyLoc)
return handle(entry.finallyLoc);
} else if (hasCatch) {
if (this.prev < entry.catchLoc)
return handle(entry.catchLoc, true);
} else {
if (!hasFinally)
throw new Error("try statement without catch or finally");
if (this.prev < entry.finallyLoc)
return handle(entry.finallyLoc);
}
}
}
}, abrupt: function abrupt(type2, arg) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
var finallyEntry = entry;
break;
}
}
finallyEntry && ("break" === type2 || "continue" === type2) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);
var record = finallyEntry ? finallyEntry.completion : {};
return record.type = type2, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);
}, complete: function complete(record, afterLoc) {
if ("throw" === record.type)
throw record.arg;
return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;
}, finish: function finish(finallyLoc) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.finallyLoc === finallyLoc)
return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;
}
}, catch: function _catch(tryLoc) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.tryLoc === tryLoc) {
var record = entry.completion;
if ("throw" === record.type) {
var thrown = record.arg;
resetTryEntry(entry);
}
return thrown;
}
}
throw new Error("illegal catch attempt");
}, delegateYield: function delegateYield(iterable, resultName, nextLoc) {
return this.delegate = { iterator: values(iterable), resultName, nextLoc }, "next" === this.method && (this.arg = void 0), ContinueSentinel;
} }, exports2;
}
var insertLengthRule = function insertLengthRule2(schema2, rules2) {
var type2 = schema2.type, max = schema2.max, min = schema2.min, message = schema2.message;
if (max || max === 0) {
rules2.push({
type: type2,
max,
message: message === null || message === void 0 ? void 0 : message.max
});
}
if (min || min === 0) {
rules2.push({
type: type2,
min,
message: message === null || message === void 0 ? void 0 : message.min
});
}
};
var insertRequiredRule = function insertRequiredRule2(schema2, rules2) {
var _a;
var type2 = schema2.type, format2 = schema2.format, required2 = schema2.required, message = schema2.message, widget = schema2.widget, title = schema2.title;
var requiredAlready = (_a = schema2 === null || schema2 === void 0 ? void 0 : schema2.rules) === null || _a === void 0 ? void 0 : _a.some(function(item) {
return item === null || item === void 0 ? void 0 : item.required;
});
if (!required2 || requiredAlready) {
return;
}
var rule = {
required: true,
message: message === null || message === void 0 ? void 0 : message.required
};
if (["year", "quarter", "month", "week", "date", "dateTime", "time"].includes(format2) && type2 === "range") {
rule = {
type: "array",
required: true,
len: 2,
fields: {
0: {
type: "string",
required: true
},
1: {
type: "string",
required: true
}
}
};
} else if (widget === "checkbox") {
rule = {
type: type2,
required: true,
whitespace: true,
message: title + "\u5FC5\u586B"
};
} else if (type2 === "string") {
rule = {
type: "string",
required: true,
whitespace: true,
message: (message === null || message === void 0 ? void 0 : message.required) || (!title ? "\u5185\u5BB9\u5FC5\u586B" : void 0)
};
}
rules2.push(rule);
};
var transformRules = function transformRules2() {
var rules2 = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [];
var methods = arguments.length > 1 ? arguments[1] : void 0;
var form = arguments.length > 2 ? arguments[2] : void 0;
return rules2.map(function(item) {
if (item.validator && !item.transformed) {
var validator2 = isFunction$2(item.validator) ? item.validator : methods[item.validator];
item.validator = function(_, value) {
return __awaiter(void 0, void 0, void 0, /* @__PURE__ */ _regeneratorRuntime$2().mark(function _callee() {
var result;
return _regeneratorRuntime$2().wrap(function _callee$(_context) {
while (1)
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return validator2(_, value, {
form
});
case 2:
result = _context.sent;
if (!isObject$5(result)) {
_context.next = 5;
break;
}
return _context.abrupt("return", (result === null || result === void 0 ? void 0 : result.status) ? Promise.resolve() : Promise.reject(new Error(result.message || item.message)));
case 5:
return _context.abrupt("return", result ? Promise.resolve() : Promise.reject(new Error(item.message)));
case 6:
case "end":
return _context.stop();
}
}, _callee);
}));
};
item.transformed = true;
}
return item;
});
};
const getRuleList = function(schema2, form, methods, fieldRef) {
var _a, _b;
var format2 = schema2.format, _schema$rules = schema2.rules, ruleList = _schema$rules === void 0 ? [] : _schema$rules, pattern2 = schema2.pattern, message = schema2.message;
var rules2 = _toConsumableArray$8(ruleList);
insertRequiredRule(schema2, rules2);
insertLengthRule(schema2, rules2);
rules2.push({
validator: function validator2(_) {
return __awaiter(void 0, void 0, void 0, /* @__PURE__ */ _regeneratorRuntime$2().mark(function _callee2() {
var _c, _d, res;
return _regeneratorRuntime$2().wrap(function _callee2$(_context2) {
while (1)
switch (_context2.prev = _context2.next) {
case 0:
if (isFunction$2((_c = fieldRef === null || fieldRef === void 0 ? void 0 : fieldRef.current) === null || _c === void 0 ? void 0 : _c.validator)) {
_context2.next = 2;
break;
}
return _context2.abrupt("return", true);
case 2:
_context2.next = 4;
return (_d = fieldRef.current) === null || _d === void 0 ? void 0 : _d.validator();
case 4:
res = _context2.sent;
return _context2.abrupt("return", res);
case 6:
case "end":
return _context2.stop();
}
}, _callee2);
}));
}
});
if (pattern2) {
rules2.push({
pattern: pattern2,
message: message === null || message === void 0 ? void 0 : message.pattern
});
}
if (format2 === "url") {
rules2.push({
type: "url",
message: message === null || message === void 0 ? void 0 : message.url
});
}
if (format2 === "email") {
rules2.push({
type: "email",
message: message === null || message === void 0 ? void 0 : message.email
});
}
if (format2 === "image") {
rules2.push({
validator: function validator2(_, value) {
if (!value) {
return true;
}
var imagePattern = "([/|.|w|s|-])*.(?:jpg|gif|png|bmp|apng|webp|jpeg|json)";
var _isUrl = isUrl$1(value);
var _isImg = new RegExp(imagePattern).test(value);
return _isUrl || _isImg;
},
message: (_a = message === null || message === void 0 ? void 0 : message.email) !== null && _a !== void 0 ? _a : "\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u56FE\u7247\u683C\u5F0F"
});
}
if (format2 === "color") {
rules2.push({
validator: function validator2(_, value) {
try {
color$1(value || null);
return true;
} catch (e2) {
return false;
}
},
message: (_b = message === null || message === void 0 ? void 0 : message.color) !== null && _b !== void 0 ? _b : "\u8BF7\u586B\u5199\u6B63\u786E\u7684\u989C\u8272\u683C\u5F0F"
});
}
return transformRules(rules2, methods, form);
};
const createUpdateEffect = (hook) => (effect, deps) => {
const isMounted = React$a.useRef(false);
hook(() => {
return () => {
isMounted.current = false;
};
}, []);
hook(() => {
if (!isMounted.current) {
isMounted.current = true;
} else {
return effect();
}
}, deps);
};
const isFunction$1 = (value) => typeof value === "function";
const isDev = false;
const isDev$1 = isDev;
const useUpdateEffect = createUpdateEffect(React$a.useEffect);
function useLatest(value) {
const ref = React$a.useRef(value);
ref.current = value;
return ref;
}
const useUnmount = (fn) => {
if (isDev$1) {
if (!isFunction$1(fn)) {
console.error(`useUnmount expected parameter is a function, got ${typeof fn}`);
}
}
const fnRef = useLatest(fn);
React$a.useEffect(() => () => {
fnRef.current();
}, []);
};
const useUnmount$1 = useUnmount;
var dayjs_min = { exports: {} };
(function(module2, exports2) {
!function(t2, e2) {
module2.exports = e2();
}(commonjsGlobal, function() {
var t2 = 1e3, e2 = 6e4, n2 = 36e5, r2 = "millisecond", i2 = "second", s = "minute", u2 = "hour", a = "day", o = "week", f2 = "month", h2 = "quarter", c2 = "year", d2 = "date", l2 = "Invalid Date", $ = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, y2 = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g, M = { name: "en", weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), ordinal: function(t3) {
var e3 = ["th", "st", "nd", "rd"], n3 = t3 % 100;
return "[" + t3 + (e3[(n3 - 20) % 10] || e3[n3] || e3[0]) + "]";
} }, m2 = function(t3, e3, n3) {
var r3 = String(t3);
return !r3 || r3.length >= e3 ? t3 : "" + Array(e3 + 1 - r3.length).join(n3) + t3;
}, v2 = { s: m2, z: function(t3) {
var e3 = -t3.utcOffset(), n3 = Math.abs(e3), r3 = Math.floor(n3 / 60), i3 = n3 % 60;
return (e3 <= 0 ? "+" : "-") + m2(r3, 2, "0") + ":" + m2(i3, 2, "0");
}, m: function t3(e3, n3) {
if (e3.date() < n3.date())
return -t3(n3, e3);
var r3 = 12 * (n3.year() - e3.year()) + (n3.month() - e3.month()), i3 = e3.clone().add(r3, f2), s2 = n3 - i3 < 0, u3 = e3.clone().add(r3 + (s2 ? -1 : 1), f2);
return +(-(r3 + (n3 - i3) / (s2 ? i3 - u3 : u3 - i3)) || 0);
}, a: function(t3) {
return t3 < 0 ? Math.ceil(t3) || 0 : Math.floor(t3);
}, p: function(t3) {
return { M: f2, y: c2, w: o, d: a, D: d2, h: u2, m: s, s: i2, ms: r2, Q: h2 }[t3] || String(t3 || "").toLowerCase().replace(/s$/, "");
}, u: function(t3) {
return void 0 === t3;
} }, g2 = "en", D = {};
D[g2] = M;
var p2 = function(t3) {
return t3 instanceof _;
}, S = function t3(e3, n3, r3) {
var i3;
if (!e3)
return g2;
if ("string" == typeof e3) {
var s2 = e3.toLowerCase();
D[s2] && (i3 = s2), n3 && (D[s2] = n3, i3 = s2);
var u3 = e3.split("-");
if (!i3 && u3.length > 1)
return t3(u3[0]);
} else {
var a2 = e3.name;
D[a2] = e3, i3 = a2;
}
return !r3 && i3 && (g2 = i3), i3 || !r3 && g2;
}, w2 = function(t3, e3) {
if (p2(t3))
return t3.clone();
var n3 = "object" == typeof e3 ? e3 : {};
return n3.date = t3, n3.args = arguments, new _(n3);
}, O = v2;
O.l = S, O.i = p2, O.w = function(t3, e3) {
return w2(t3, { locale: e3.$L, utc: e3.$u, x: e3.$x, $offset: e3.$offset });
};
var _ = function() {
function M2(t3) {
this.$L = S(t3.locale, null, true), this.parse(t3);
}
var m3 = M2.prototype;
return m3.parse = function(t3) {
this.$d = function(t4) {
var e3 = t4.date, n3 = t4.utc;
if (null === e3)
return new Date(NaN);
if (O.u(e3))
return new Date();
if (e3 instanceof Date)
return new Date(e3);
if ("string" == typeof e3 && !/Z$/i.test(e3)) {
var r3 = e3.match($);
if (r3) {
var i3 = r3[2] - 1 || 0, s2 = (r3[7] || "0").substring(0, 3);
return n3 ? new Date(Date.UTC(r3[1], i3, r3[3] || 1, r3[4] || 0, r3[5] || 0, r3[6] || 0, s2)) : new Date(r3[1], i3, r3[3] || 1, r3[4] || 0, r3[5] || 0, r3[6] || 0, s2);
}
}
return new Date(e3);
}(t3), this.$x = t3.x || {}, this.init();
}, m3.init = function() {
var t3 = this.$d;
this.$y = t3.getFullYear(), this.$M = t3.getMonth(), this.$D = t3.getDate(), this.$W = t3.getDay(), this.$H = t3.getHours(), this.$m = t3.getMinutes(), this.$s = t3.getSeconds(), this.$ms = t3.getMilliseconds();
}, m3.$utils = function() {
return O;
}, m3.isValid = function() {
return !(this.$d.toString() === l2);
}, m3.isSame = function(t3, e3) {
var n3 = w2(t3);
return this.startOf(e3) <= n3 && n3 <= this.endOf(e3);
}, m3.isAfter = function(t3, e3) {
return w2(t3) < this.startOf(e3);
}, m3.isBefore = function(t3, e3) {
return this.endOf(e3) < w2(t3);
}, m3.$g = function(t3, e3, n3) {
return O.u(t3) ? this[e3] : this.set(n3, t3);
}, m3.unix = function() {
return Math.floor(this.valueOf() / 1e3);
}, m3.valueOf = function() {
return this.$d.getTime();
}, m3.startOf = function(t3, e3) {
var n3 = this, r3 = !!O.u(e3) || e3, h3 = O.p(t3), l3 = function(t4, e4) {
var i3 = O.w(n3.$u ? Date.UTC(n3.$y, e4, t4) : new Date(n3.$y, e4, t4), n3);
return r3 ? i3 : i3.endOf(a);
}, $2 = function(t4, e4) {
return O.w(n3.toDate()[t4].apply(n3.toDate("s"), (r3 ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice(e4)), n3);
}, y3 = this.$W, M3 = this.$M, m4 = this.$D, v3 = "set" + (this.$u ? "UTC" : "");
switch (h3) {
case c2:
return r3 ? l3(1, 0) : l3(31, 11);
case f2:
return r3 ? l3(1, M3) : l3(0, M3 + 1);
case o:
var g3 = this.$locale().weekStart || 0, D2 = (y3 < g3 ? y3 + 7 : y3) - g3;
return l3(r3 ? m4 - D2 : m4 + (6 - D2), M3);
case a:
case d2:
return $2(v3 + "Hours", 0);
case u2:
return $2(v3 + "Minutes", 1);
case s:
return $2(v3 + "Seconds", 2);
case i2:
return $2(v3 + "Milliseconds", 3);
default:
return this.clone();
}
}, m3.endOf = function(t3) {
return this.startOf(t3, false);
}, m3.$set = function(t3, e3) {
var n3, o2 = O.p(t3), h3 = "set" + (this.$u ? "UTC" : ""), l3 = (n3 = {}, n3[a] = h3 + "Date", n3[d2] = h3 + "Date", n3[f2] = h3 + "Month", n3[c2] = h3 + "FullYear", n3[u2] = h3 + "Hours", n3[s] = h3 + "Minutes", n3[i2] = h3 + "Seconds", n3[r2] = h3 + "Milliseconds", n3)[o2], $2 = o2 === a ? this.$D + (e3 - this.$W) : e3;
if (o2 === f2 || o2 === c2) {
var y3 = this.clone().set(d2, 1);
y3.$d[l3]($2), y3.init(), this.$d = y3.set(d2, Math.min(this.$D, y3.daysInMonth())).$d;
} else
l3 && this.$d[l3]($2);
return this.init(), this;
}, m3.set = function(t3, e3) {
return this.clone().$set(t3, e3);
}, m3.get = function(t3) {
return this[O.p(t3)]();
}, m3.add = function(r3, h3) {
var d3, l3 = this;
r3 = Number(r3);
var $2 = O.p(h3), y3 = function(t3) {
var e3 = w2(l3);
return O.w(e3.date(e3.date() + Math.round(t3 * r3)), l3);
};
if ($2 === f2)
return this.set(f2, this.$M + r3);
if ($2 === c2)
return this.set(c2, this.$y + r3);
if ($2 === a)
return y3(1);
if ($2 === o)
return y3(7);
var M3 = (d3 = {}, d3[s] = e2, d3[u2] = n2, d3[i2] = t2, d3)[$2] || 1, m4 = this.$d.getTime() + r3 * M3;
return O.w(m4, this);
}, m3.subtract = function(t3, e3) {
return this.add(-1 * t3, e3);
}, m3.format = function(t3) {
var e3 = this, n3 = this.$locale();
if (!this.isValid())
return n3.invalidDate || l2;
var r3 = t3 || "YYYY-MM-DDTHH:mm:ssZ", i3 = O.z(this), s2 = this.$H, u3 = this.$m, a2 = this.$M, o2 = n3.weekdays, f3 = n3.months, h3 = function(t4, n4, i4, s3) {
return t4 && (t4[n4] || t4(e3, r3)) || i4[n4].slice(0, s3);
}, c3 = function(t4) {
return O.s(s2 % 12 || 12, t4, "0");
}, d3 = n3.meridiem || function(t4, e4, n4) {
var r4 = t4 < 12 ? "AM" : "PM";
return n4 ? r4.toLowerCase() : r4;
}, $2 = { YY: String(this.$y).slice(-2), YYYY: this.$y, M: a2 + 1, MM: O.s(a2 + 1, 2, "0"), MMM: h3(n3.monthsShort, a2, f3, 3), MMMM: h3(f3, a2), D: this.$D, DD: O.s(this.$D, 2, "0"), d: String(this.$W), dd: h3(n3.weekdaysMin, this.$W, o2, 2), ddd: h3(n3.weekdaysShort, this.$W, o2, 3), dddd: o2[this.$W], H: String(s2), HH: O.s(s2, 2, "0"), h: c3(1), hh: c3(2), a: d3(s2, u3, true), A: d3(s2, u3, false), m: String(u3), mm: O.s(u3, 2, "0"), s: String(this.$s), ss: O.s(this.$s, 2, "0"), SSS: O.s(this.$ms, 3, "0"), Z: i3 };
return r3.replace(y2, function(t4, e4) {
return e4 || $2[t4] || i3.replace(":", "");
});
}, m3.utcOffset = function() {
return 15 * -Math.round(this.$d.getTimezoneOffset() / 15);
}, m3.diff = function(r3, d3, l3) {
var $2, y3 = O.p(d3), M3 = w2(r3), m4 = (M3.utcOffset() - this.utcOffset()) * e2, v3 = this - M3, g3 = O.m(this, M3);
return g3 = ($2 = {}, $2[c2] = g3 / 12, $2[f2] = g3, $2[h2] = g3 / 3, $2[o] = (v3 - m4) / 6048e5, $2[a] = (v3 - m4) / 864e5, $2[u2] = v3 / n2, $2[s] = v3 / e2, $2[i2] = v3 / t2, $2)[y3] || v3, l3 ? g3 : O.a(g3);
}, m3.daysInMonth = function() {
return this.endOf(f2).$D;
}, m3.$locale = function() {
return D[this.$L];
}, m3.locale = function(t3, e3) {
if (!t3)
return this.$L;
var n3 = this.clone(), r3 = S(t3, e3, true);
return r3 && (n3.$L = r3), n3;
}, m3.clone = function() {
return O.w(this.$d, this);
}, m3.toDate = function() {
return new Date(this.valueOf());
}, m3.toJSON = function() {
return this.isValid() ? this.toISOString() : null;
}, m3.toISOString = function() {
return this.$d.toISOString();
}, m3.toString = function() {
return this.$d.toUTCString();
}, M2;
}(), T = _.prototype;
return w2.prototype = T, [["$ms", r2], ["$s", i2], ["$m", s], ["$H", u2], ["$W", a], ["$M", f2], ["$y", c2], ["$D", d2]].forEach(function(t3) {
T[t3[1]] = function(e3) {
return this.$g(e3, t3[0], t3[1]);
};
}), w2.extend = function(t3, e3) {
return t3.$i || (t3(e3, _, w2), t3.$i = true), w2;
}, w2.locale = S, w2.isDayjs = p2, w2.unix = function(t3) {
return w2(1e3 * t3);
}, w2.en = D[g2], w2.Ls = D, w2.p = {}, w2;
});
})(dayjs_min);
const dayjs = dayjs_min.exports;
var FieldWrapperStatus = function FieldWrapperStatus2(props) {
var Field2 = props.Field, fieldProps = props.fieldProps, maxWidth = props.maxWidth, initialValue = props.initialValue, otherProps = __rest(props, ["Field", "fieldProps", "maxWidth", "initialValue"]);
var onStatusChange = fieldProps.onStatusChange, addons = fieldProps.addons, otherFieldProps = __rest(fieldProps, ["onStatusChange", "addons"]);
var style2 = maxWidth ? Object.assign({
maxWidth
}, fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.style) : Object.assign({}, fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.style);
var _Form$Item$useStatus = _Form.Item.useStatus(), status = _Form$Item$useStatus.status;
var errors = addons.getFieldError(addons.dataPath);
React$a.useEffect(function() {
onStatusChange && onStatusChange(status, errors);
}, [JSON.stringify(errors)]);
useUpdateEffect(function() {
otherProps.onChange(initialValue);
}, [JSON.stringify(initialValue)]);
return /* @__PURE__ */ jsx(Field2, {
...Object.assign({}, otherProps, otherFieldProps, {
style: style2,
addons
})
});
};
var FieldWrapper = function FieldWrapper2(props) {
var Field2 = props.Field, fieldProps = props.fieldProps, maxWidth = props.maxWidth, initialValue = props.initialValue, otherProps = __rest(props, ["Field", "fieldProps", "maxWidth", "initialValue"]);
var addons = fieldProps.addons, schema2 = fieldProps.schema;
var _style = maxWidth ? Object.assign({
maxWidth
}, fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.style) : Object.assign({}, fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.style);
var removeBtn = schema2.removeBtn;
var configCtx = React$a.useContext(_ConfigProvider.ConfigContext);
var t2 = translation$1(configCtx);
useUpdateEffect(function() {
otherProps.onChange(initialValue);
}, [JSON.stringify(initialValue)]);
var handleRemove = function handleRemove2() {
if (isFunction$2(removeBtn === null || removeBtn === void 0 ? void 0 : removeBtn.onClick)) {
removeBtn.onClick(function() {
addons.setSchemaByPath(addons.schemaPath, {
hidden: true
});
});
return;
}
addons.setSchemaByPath(addons.schemaPath, {
hidden: true
});
};
return /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(Field2, {
...Object.assign({}, otherProps, fieldProps, {
style: _style
})
}), removeBtn && /* @__PURE__ */ React__default.default.createElement(Button$2, Object.assign({
type: "link",
danger: true
}, removeBtn, {
onClick: handleRemove
}), (removeBtn === null || removeBtn === void 0 ? void 0 : removeBtn.text) || t2("delete"))]
});
};
function _typeof$l(obj) {
"@babel/helpers - typeof";
return _typeof$l = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$l(obj);
}
function _defineProperty$8(obj, key2, value) {
key2 = _toPropertyKey$5(key2);
if (key2 in obj) {
Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key2] = value;
}
return obj;
}
function _toPropertyKey$5(arg) {
var key2 = _toPrimitive$6(arg, "string");
return _typeof$l(key2) === "symbol" ? key2 : String(key2);
}
function _toPrimitive$6(input, hint) {
if (_typeof$l(input) !== "object" || input === null)
return input;
var prim = input[Symbol.toPrimitive];
if (prim !== void 0) {
var res = prim.call(input, hint || "default");
if (_typeof$l(res) !== "object")
return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
var UpperContext$1 = /* @__PURE__ */ React$a.createContext(function() {
});
var valuePropNameMap = {
checkbox: "checked",
switch: "checked"
};
const Main$2 = function(props) {
var _a, _b;
var configCtx = props.configCtx, store2 = props.store, schema2 = props.schema, path2 = props.path, children = props.children, dependValues = props.dependValues, rootPath = props.rootPath;
var fieldRef = React$a.useRef();
var formCtx = useStore(store2, function(state) {
return state.context;
});
var upperCtx = React$a.useContext(UpperContext$1);
var form = configCtx.form, widgets = configCtx.widgets, methods = configCtx.methods, globalProps = configCtx.globalProps;
var reserveLabel = schema2.reserveLabel, hidden = schema2.hidden;
schema2.properties;
var dependencies = schema2.dependencies, _inlineMode = schema2.inlineMode;
schema2.remove;
schema2.removeText;
var _schema$visible = schema2.visible, visible = _schema$visible === void 0 ? true : _schema$visible, otherSchema = __rest(schema2, ["reserveLabel", "hidden", "properties", "dependencies", "inlineMode", "remove", "removeText", "visible"]);
var getValueFromKey = getParamValue$2(formCtx, upperCtx, schema2);
var widgetName = getWidgetName(schema2);
var Widget = getWidget(widgetName, widgets);
var fieldProps = getFieldProps(widgetName, schema2, {
widgets,
methods,
form,
dependValues,
globalProps,
path: getPath(path2),
rootPath,
fieldRef
});
React$a.useEffect(function() {
form.setFieldRef(fieldProps.addons.dataPath, fieldRef);
}, []);
if (schema2 === null || schema2 === void 0 ? void 0 : schema2.hidden) {
return null;
}
if (!widgetName) {
var ErrorSchema2 = widgets["errorSchema"] || widgets["ErrorSchema"];
return /* @__PURE__ */ jsx(ErrorSchema2, {
schema: schema2
});
}
if (schema2.type === "void") {
return /* @__PURE__ */ React__default.default.createElement(
Col$1,
{
span: 24
},
/* @__PURE__ */ jsx(Widget, {
...Object.assign({}, fieldProps)
})
);
}
var displayType = getValueFromKey("displayType");
var inlineSelf = _inlineMode || (upperCtx === null || upperCtx === void 0 ? void 0 : upperCtx.displayType) === "inline";
if (!upperCtx.exist) {
inlineSelf = _inlineMode || (formCtx === null || formCtx === void 0 ? void 0 : formCtx.displayType) === "inline";
}
var inlineChild = displayType === "inline";
var labelWidth = getValueFromKey("labelWidth");
if (children) {
var childElement = /* @__PURE__ */ jsx("div", {
className: "fr-inline-container",
children
});
if (!inlineChild) {
var gutter = {
row: 16,
column: 24
}[displayType];
childElement = /* @__PURE__ */ React__default.default.createElement(Row$1, {
gutter
}, children);
}
fieldProps.children = childElement;
var content = /* @__PURE__ */ jsx(Widget, {
...Object.assign({
labelWidth,
displayType: schema2.displayType
}, fieldProps, otherSchema)
});
return /* @__PURE__ */ jsx(UpperContext$1.Provider, {
value: {
column: schema2.column,
labelCol: schema2.labelCol,
fieldCol: schema2.fieldCol,
displayType: schema2.displayType,
labelWidth: schema2.labelWidth,
noStyle: schema2.noStyle,
exist: true
},
children: inlineSelf ? content : /* @__PURE__ */ React__default.default.createElement(Col$1, {
span: 24,
className: classnames("fr-obj-col", _defineProperty$8({}, schema2.className, !!schema2.className))
}, content)
});
}
var label = getLabel$1(schema2, displayType, widgets);
var noStyle = getValueFromKey("noStyle");
var span = getColSpan(formCtx, upperCtx, schema2);
var extra = getExtraView("extra", schema2, widgets);
var help = getExtraView("help", schema2, widgets);
var tooltip = getTooltip$4(schema2, displayType);
var ruleList = getRuleList(schema2, form, methods, fieldRef);
var readOnly = getValueFromKey("readOnly");
var disabled = getValueFromKey("disabled");
var validateTrigger = getValueFromKey("validateTrigger");
var _labelCol = getValueFromKey("labelCol");
var _fieldCol = getValueFromKey("fieldCol");
var maxWidth = getValueFromKey("maxWidth");
var _getFormItemLayout = getFormItemLayout(Math.floor(24 / span * 1), schema2, {
displayType,
labelWidth,
_labelCol,
_fieldCol
}), labelCol = _getFormItemLayout.labelCol, fieldCol = _getFormItemLayout.fieldCol;
var valuePropName = schema2.valuePropName || valuePropNameMap[widgetName] || void 0;
if (readOnly) {
fieldProps.readOnly = readOnly;
}
if (disabled) {
fieldProps.disabled = disabled;
}
if (reserveLabel && !label && displayType !== "column") {
label = "fr-hide-label";
}
if (readOnly) {
Widget = widgets[schema2.readOnlyWidget] || widgets["Html"];
}
if (isCheckBoxType(schema2, readOnly)) {
fieldProps.title = label;
label = null;
if (displayType === "row") {
label = "fr-hide-label";
}
}
var initialValue = (_a = schema2.default) !== null && _a !== void 0 ? _a : schema2.defaultValue;
var classRest = _defineProperty$8({
"fr-hide-label": label === "fr-hide-label",
"fr-inline-field": inlineSelf,
"fr-field-visibility": !visible
}, schema2.className, !!schema2.className);
var formItem = /* @__PURE__ */ React__default.default.createElement(_Form.Item, {
className: classnames("fr-field", classRest),
label,
name: path2,
valuePropName,
rules: readOnly ? [] : ruleList,
hidden,
tooltip,
extra,
help,
initialValue,
labelCol,
wrapperCol: fieldCol,
noStyle,
dependencies,
validateTrigger: (validateTrigger !== null && validateTrigger !== void 0 ? validateTrigger : (_b = fieldRef === null || fieldRef === void 0 ? void 0 : fieldRef.current) === null || _b === void 0 ? void 0 : _b.validator) ? "onSubmit" : "onChange"
}, fieldProps.onStatusChange ? /* @__PURE__ */ jsx(FieldWrapperStatus, {
Field: Widget,
fieldProps,
maxWidth,
initialValue
}) : /* @__PURE__ */ jsx(FieldWrapper, {
Field: Widget,
fieldProps,
maxWidth,
initialValue
}));
if (inlineSelf) {
if (noStyle) {
return /* @__PURE__ */ jsx("div", {
className: classnames("fr-inline-field", _defineProperty$8({
"fr-field-visibility": !visible
}, schema2.className, !!schema2.className)),
children: formItem
});
}
return formItem;
}
return /* @__PURE__ */ React__default.default.createElement(Col$1, {
span,
className: classnames(null, {
"fr-field-visibility": !visible
})
}, formItem);
};
const FieldItem = function(props) {
var _a, _b;
var schema2 = props.schema, rootPath = props.rootPath, otherProps = __rest(props, ["schema", "rootPath"]);
var store2 = React$a.useContext(FRContext);
var _store$getState = store2.getState(), formSchema = _store$getState.schema;
var configCtx = React$a.useContext(ConfigContext);
var mustacheDisabled = (_a = configCtx === null || configCtx === void 0 ? void 0 : configCtx.globalConfig) === null || _a === void 0 ? void 0 : _a.mustacheDisabled;
(_b = configCtx === null || configCtx === void 0 ? void 0 : configCtx.globalConfig) === null || _b === void 0 ? void 0 : _b.shouldUpdateOpen;
var dependencies = schema2 === null || schema2 === void 0 ? void 0 : schema2.dependencies;
if (!isHasExpression(schema2) && !mustacheDisabled && (!dependencies || !(dependencies === null || dependencies === void 0 ? void 0 : dependencies.length))) {
return /* @__PURE__ */ jsx(Main$2, {
...Object.assign({}, props, {
store: store2,
configCtx
})
});
}
var schemaStr = JSON.stringify(schema2);
return /* @__PURE__ */ React__default.default.createElement(_Form.Item, {
noStyle: true,
shouldUpdate: fieldShouldUpdate(schemaStr, rootPath, dependencies)
}, function(form) {
var formData = form.getFieldsValue(true);
var formDependencies = [];
var dependValues = (dependencies || []).map(function(depPath) {
var item = [];
formDependencies.push(item);
return getDependValues(formData, depPath, props, item);
});
var newSchema = mustacheDisabled ? schema2 : parseAllExpression(schema2, formData, rootPath, formSchema);
return /* @__PURE__ */ jsx(Main$2, {
...Object.assign({
schema: Object.assign(Object.assign({}, newSchema), {
dependencies: formDependencies
}),
rootPath
}, otherProps, {
dependValues,
store: store2,
configCtx
})
});
});
};
var getParamValue$1 = function getParamValue2(formCtx, upperCtx, schema2) {
return function(valueKey) {
var _a, _b;
return (_b = (_a = schema2[valueKey]) !== null && _a !== void 0 ? _a : upperCtx[valueKey]) !== null && _b !== void 0 ? _b : formCtx[valueKey];
};
};
var getFormListLayout = function getFormListLayout2(getValueFromKey, displayType) {
var _labelCol = getValueFromKey("labelCol");
var _fieldCol = getValueFromKey("fieldCol");
var labelWidth = getValueFromKey("labelWidth");
var labelCol = {
span: 5
};
var fieldCol = {
flex: 1
};
if (labelWidth && displayType !== "column") {
labelCol = {
flex: labelWidth + "px"
};
}
if (_labelCol) {
labelCol = _labelCol;
}
if (_fieldCol) {
fieldCol = _fieldCol;
}
if (typeof _labelCol === "number") {
labelCol = {
span: _labelCol
};
}
if (typeof _fieldCol === "number") {
fieldCol = {
span: _fieldCol
};
}
return {
labelCol,
fieldCol
};
};
var getLabel = function getLabel2(schema2, displayType, widgets) {
var title = schema2.title, description = schema2.description, descWidget = schema2.descWidget, labelWidget = schema2.labelWidget;
var LabelNode = widgets[labelWidget];
if (LabelNode) {
return /* @__PURE__ */ jsx(LabelNode, {
schema: schema2
});
}
if (!description && !descWidget) {
return title;
}
var RenderDesc = function RenderDesc2() {
var Widget = widgets[descWidget];
if (Widget) {
return /* @__PURE__ */ jsx(Widget, {
schema: schema2
});
}
if (description) {
return /* @__PURE__ */ jsxs("span", {
className: "fr-desc",
children: ["(", description, ")"]
});
}
return null;
};
if (displayType === "inline") {
return title;
}
return /* @__PURE__ */ jsxs(Fragment, {
children: [title, /* @__PURE__ */ jsx(RenderDesc, {})]
});
};
var getTooltip$3 = function getTooltip2(schema2, displayType) {
var descType = schema2.descType, description = schema2.description, tooltip = schema2.tooltip;
if (tooltip) {
if (typeof tooltip === "string") {
return {
title: /* @__PURE__ */ jsx("span", {
dangerouslySetInnerHTML: {
__html: tooltip
}
})
};
}
return Object.assign(Object.assign({}, tooltip), {
title: /* @__PURE__ */ jsx("span", {
dangerouslySetInnerHTML: {
__html: tooltip.title
}
})
});
}
if (descType === "widget" || !description) {
return null;
}
if (displayType === "column" && descType === "icon") {
return {
title: description
};
}
return null;
};
const index$R = "";
function _typeof$k(obj) {
"@babel/helpers - typeof";
return _typeof$k = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$k(obj);
}
function _regeneratorRuntime$1() {
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
_regeneratorRuntime$1 = function _regeneratorRuntime2() {
return exports2;
};
var exports2 = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty2 = Object.defineProperty || function(obj, key2, desc) {
obj[key2] = desc.value;
}, $Symbol2 = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol2.iterator || "@@iterator", asyncIteratorSymbol = $Symbol2.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol2.toStringTag || "@@toStringTag";
function define(obj, key2, value) {
return Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
}), obj[key2];
}
try {
define({}, "");
} catch (err) {
define = function define2(obj, key2, value) {
return obj[key2] = value;
};
}
function wrap2(innerFn, outerFn, self2, tryLocsList) {
var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context2 = new Context2(tryLocsList || []);
return defineProperty2(generator, "_invoke", {
value: makeInvokeMethod(innerFn, self2, context2)
}), generator;
}
function tryCatch(fn, obj, arg) {
try {
return {
type: "normal",
arg: fn.call(obj, arg)
};
} catch (err) {
return {
type: "throw",
arg: err
};
}
}
exports2.wrap = wrap2;
var ContinueSentinel = {};
function Generator() {
}
function GeneratorFunction() {
}
function GeneratorFunctionPrototype() {
}
var IteratorPrototype2 = {};
define(IteratorPrototype2, iteratorSymbol, function() {
return this;
});
var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([])));
NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype2 = NativeIteratorPrototype);
var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype2);
function defineIteratorMethods(prototype2) {
["next", "throw", "return"].forEach(function(method2) {
define(prototype2, method2, function(arg) {
return this._invoke(method2, arg);
});
});
}
function AsyncIterator(generator, PromiseImpl) {
function invoke(method2, arg, resolve, reject) {
var record = tryCatch(generator[method2], generator, arg);
if ("throw" !== record.type) {
var result = record.arg, value = result.value;
return value && "object" == _typeof$k(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function(value2) {
invoke("next", value2, resolve, reject);
}, function(err) {
invoke("throw", err, resolve, reject);
}) : PromiseImpl.resolve(value).then(function(unwrapped) {
result.value = unwrapped, resolve(result);
}, function(error) {
return invoke("throw", error, resolve, reject);
});
}
reject(record.arg);
}
var previousPromise;
defineProperty2(this, "_invoke", {
value: function value(method2, arg) {
function callInvokeWithMethodAndArg() {
return new PromiseImpl(function(resolve, reject) {
invoke(method2, arg, resolve, reject);
});
}
return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
}
});
}
function makeInvokeMethod(innerFn, self2, context2) {
var state = "suspendedStart";
return function(method2, arg) {
if ("executing" === state)
throw new Error("Generator is already running");
if ("completed" === state) {
if ("throw" === method2)
throw arg;
return doneResult();
}
for (context2.method = method2, context2.arg = arg; ; ) {
var delegate = context2.delegate;
if (delegate) {
var delegateResult = maybeInvokeDelegate(delegate, context2);
if (delegateResult) {
if (delegateResult === ContinueSentinel)
continue;
return delegateResult;
}
}
if ("next" === context2.method)
context2.sent = context2._sent = context2.arg;
else if ("throw" === context2.method) {
if ("suspendedStart" === state)
throw state = "completed", context2.arg;
context2.dispatchException(context2.arg);
} else
"return" === context2.method && context2.abrupt("return", context2.arg);
state = "executing";
var record = tryCatch(innerFn, self2, context2);
if ("normal" === record.type) {
if (state = context2.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel)
continue;
return {
value: record.arg,
done: context2.done
};
}
"throw" === record.type && (state = "completed", context2.method = "throw", context2.arg = record.arg);
}
};
}
function maybeInvokeDelegate(delegate, context2) {
var methodName = context2.method, method2 = delegate.iterator[methodName];
if (void 0 === method2)
return context2.delegate = null, "throw" === methodName && delegate.iterator.return && (context2.method = "return", context2.arg = void 0, maybeInvokeDelegate(delegate, context2), "throw" === context2.method) || "return" !== methodName && (context2.method = "throw", context2.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel;
var record = tryCatch(method2, delegate.iterator, context2.arg);
if ("throw" === record.type)
return context2.method = "throw", context2.arg = record.arg, context2.delegate = null, ContinueSentinel;
var info = record.arg;
return info ? info.done ? (context2[delegate.resultName] = info.value, context2.next = delegate.nextLoc, "return" !== context2.method && (context2.method = "next", context2.arg = void 0), context2.delegate = null, ContinueSentinel) : info : (context2.method = "throw", context2.arg = new TypeError("iterator result is not an object"), context2.delegate = null, ContinueSentinel);
}
function pushTryEntry(locs) {
var entry = {
tryLoc: locs[0]
};
1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);
}
function resetTryEntry(entry) {
var record = entry.completion || {};
record.type = "normal", delete record.arg, entry.completion = record;
}
function Context2(tryLocsList) {
this.tryEntries = [{
tryLoc: "root"
}], tryLocsList.forEach(pushTryEntry, this), this.reset(true);
}
function values(iterable) {
if (iterable) {
var iteratorMethod = iterable[iteratorSymbol];
if (iteratorMethod)
return iteratorMethod.call(iterable);
if ("function" == typeof iterable.next)
return iterable;
if (!isNaN(iterable.length)) {
var i2 = -1, next = function next2() {
for (; ++i2 < iterable.length; )
if (hasOwn.call(iterable, i2))
return next2.value = iterable[i2], next2.done = false, next2;
return next2.value = void 0, next2.done = true, next2;
};
return next.next = next;
}
}
return {
next: doneResult
};
}
function doneResult() {
return {
value: void 0,
done: true
};
}
return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty2(Gp, "constructor", {
value: GeneratorFunctionPrototype,
configurable: true
}), defineProperty2(GeneratorFunctionPrototype, "constructor", {
value: GeneratorFunction,
configurable: true
}), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports2.isGeneratorFunction = function(genFun) {
var ctor = "function" == typeof genFun && genFun.constructor;
return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name));
}, exports2.mark = function(genFun) {
return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun;
}, exports2.awrap = function(arg) {
return {
__await: arg
};
}, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function() {
return this;
}), exports2.AsyncIterator = AsyncIterator, exports2.async = function(innerFn, outerFn, self2, tryLocsList, PromiseImpl) {
void 0 === PromiseImpl && (PromiseImpl = Promise);
var iter = new AsyncIterator(wrap2(innerFn, outerFn, self2, tryLocsList), PromiseImpl);
return exports2.isGeneratorFunction(outerFn) ? iter : iter.next().then(function(result) {
return result.done ? result.value : iter.next();
});
}, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function() {
return this;
}), define(Gp, "toString", function() {
return "[object Generator]";
}), exports2.keys = function(val) {
var object2 = Object(val), keys2 = [];
for (var key2 in object2)
keys2.push(key2);
return keys2.reverse(), function next() {
for (; keys2.length; ) {
var key3 = keys2.pop();
if (key3 in object2)
return next.value = key3, next.done = false, next;
}
return next.done = true, next;
};
}, exports2.values = values, Context2.prototype = {
constructor: Context2,
reset: function reset(skipTempReset) {
if (this.prev = 0, this.next = 0, this.sent = this._sent = void 0, this.done = false, this.delegate = null, this.method = "next", this.arg = void 0, this.tryEntries.forEach(resetTryEntry), !skipTempReset)
for (var name2 in this)
"t" === name2.charAt(0) && hasOwn.call(this, name2) && !isNaN(+name2.slice(1)) && (this[name2] = void 0);
},
stop: function stop() {
this.done = true;
var rootRecord = this.tryEntries[0].completion;
if ("throw" === rootRecord.type)
throw rootRecord.arg;
return this.rval;
},
dispatchException: function dispatchException(exception) {
if (this.done)
throw exception;
var context2 = this;
function handle(loc, caught) {
return record.type = "throw", record.arg = exception, context2.next = loc, caught && (context2.method = "next", context2.arg = void 0), !!caught;
}
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2], record = entry.completion;
if ("root" === entry.tryLoc)
return handle("end");
if (entry.tryLoc <= this.prev) {
var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc");
if (hasCatch && hasFinally) {
if (this.prev < entry.catchLoc)
return handle(entry.catchLoc, true);
if (this.prev < entry.finallyLoc)
return handle(entry.finallyLoc);
} else if (hasCatch) {
if (this.prev < entry.catchLoc)
return handle(entry.catchLoc, true);
} else {
if (!hasFinally)
throw new Error("try statement without catch or finally");
if (this.prev < entry.finallyLoc)
return handle(entry.finallyLoc);
}
}
}
},
abrupt: function abrupt(type2, arg) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
var finallyEntry = entry;
break;
}
}
finallyEntry && ("break" === type2 || "continue" === type2) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);
var record = finallyEntry ? finallyEntry.completion : {};
return record.type = type2, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);
},
complete: function complete(record, afterLoc) {
if ("throw" === record.type)
throw record.arg;
return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;
},
finish: function finish(finallyLoc) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.finallyLoc === finallyLoc)
return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;
}
},
catch: function _catch(tryLoc) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.tryLoc === tryLoc) {
var record = entry.completion;
if ("throw" === record.type) {
var thrown = record.arg;
resetTryEntry(entry);
}
return thrown;
}
}
throw new Error("illegal catch attempt");
},
delegateYield: function delegateYield(iterable, resultName, nextLoc) {
return this.delegate = {
iterator: values(iterable),
resultName,
nextLoc
}, "next" === this.method && (this.arg = void 0), ContinueSentinel;
}
}, exports2;
}
function _toConsumableArray$7(arr) {
return _arrayWithoutHoles$7(arr) || _iterableToArray$7(arr) || _unsupportedIterableToArray$g(arr) || _nonIterableSpread$7();
}
function _nonIterableSpread$7() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$g(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$g(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$g(o, minLen);
}
function _iterableToArray$7(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithoutHoles$7(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$g(arr);
}
function _arrayLikeToArray$g(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
var getParamValue = function getParamValue2(formCtx, upperCtx, schema2) {
return function(valueKey) {
var _a, _b;
return (_b = (_a = schema2[valueKey]) !== null && _a !== void 0 ? _a : upperCtx[valueKey]) !== null && _b !== void 0 ? _b : formCtx[valueKey];
};
};
const Main$1 = function(props) {
var _a, _b, _c;
var form = props.form, schema2 = props.schema, path2 = props.path, parentLitPath = props.parentLitPath, renderCore = props.renderCore, rootPath = props.rootPath, methods = props.methods, upperCtx = props.upperCtx, formCtx = props.formCtx, configContext = props.configContext, listData = props.listData, setListData = props.setListData;
var widgets = configContext.widgets, globalConfig2 = configContext.globalConfig;
var configCtx = React$a.useContext(_ConfigProvider.ConfigContext);
var t2 = translation$1(configCtx);
var defaultAddBtnProps = {
type: "dashed",
block: true,
children: t2("add_item")
};
var defaultDelConfirmProps = {
title: t2("confirm_delete"),
okText: t2("confirm"),
cancelText: t2("cancel")
};
var defaultActionColumnProps = {
colHeaderText: t2("operate")
};
var widgetName = schema2.widget || "cardList";
var Widget = getWidget(widgetName, widgets);
var listProps = schema2.props, removeBtn = schema2.removeBtn, _schema$rules = schema2.rules, rules2 = _schema$rules === void 0 ? [] : _schema$rules, otherSchema = __rest(schema2, ["props", "removeBtn", "rules"]);
var defaultValue = (_a = schema2.default) !== null && _a !== void 0 ? _a : schema2.defaultValue;
if (defaultValue === void 0 && !["drawerList", "list1"].includes(widgetName)) {
defaultValue = [{}];
}
React$a.useEffect(function() {
setListData(defaultValue || []);
}, []);
var _d = listProps || {}, addBtnProps = _d.addBtnProps, delConfirmProps = _d.delConfirmProps, actionColumnProps = _d.actionColumnProps, hideAdd = _d.hideAdd, hideCopy = _d.hideCopy, hideMove = _d.hideMove, hideDelete = _d.hideDelete, onAdd = _d.onAdd, onRemove = _d.onRemove, onMove = _d.onMove, onCopy = _d.onCopy, otherListProps = __rest(_d, ["addBtnProps", "delConfirmProps", "actionColumnProps", "hideAdd", "hideCopy", "hideMove", "hideDelete", "onAdd", "onRemove", "onMove", "onCopy"]);
var handleAdd = function handleAdd2(add) {
return function(data) {
var addFunc = onAdd;
if (typeof onAdd === "string") {
addFunc = methods[onAdd];
}
if (isFunction$2(addFunc)) {
addFunc(function(funData) {
return add(funData || data);
}, {
schema: schema2,
data
});
return;
}
add(data);
};
};
var handleRemove = function handleRemove2(remove) {
return function(index2) {
var removeFunc = onRemove;
if (typeof onRemove === "string") {
removeFunc = methods[onRemove];
}
if (isFunction$2(removeFunc)) {
var data = form.getFieldValue([].concat(_toConsumableArray$7(preRootPath), _toConsumableArray$7(path2), [index2]));
removeFunc(function() {
return remove(index2);
}, {
schema: schema2,
index: index2,
data
});
return;
}
remove(index2);
};
};
var handleMove = function handleMove2(move2) {
return function(form2, to) {
var moveFunc = onMove;
if (typeof moveFunc === "string") {
moveFunc = methods[onMove];
}
if (isFunction$2(moveFunc)) {
moveFunc(function() {
return move2(form2, to);
}, {
schema: schema2,
form: form2,
to
});
return;
}
move2(form2, to);
};
};
var handleCopy = function handleCopy2(add, fields) {
return function(data) {
if (schema2.max && fields.length === schema2.max) {
return _message.warning(t2("copy_max_tip"));
}
var copyFunc = onCopy;
if (typeof onCopy === "string") {
copyFunc = methods[onCopy];
}
if (isFunction$2(copyFunc)) {
copyFunc(function(funData) {
return add(funData || data);
}, {
schema: schema2,
data
});
return;
}
add(data);
};
};
var handleDelete = function handleDelete2() {
if (isFunction$2(removeBtn === null || removeBtn === void 0 ? void 0 : removeBtn.onClick)) {
removeBtn.onClick(function() {
form.setSchemaByPath(path2, {
hidden: true
});
});
return;
}
form.setSchemaByPath(path2, {
hidden: true
});
};
var getValueFromKey = getParamValue(formCtx, upperCtx, schema2);
var readOnly = getValueFromKey("readOnly");
var preRootPath = (rootPath || []).splice(0, rootPath.length - 1);
var displayType = getValueFromKey("displayType");
if (hideMove === void 0 && ((_b = globalConfig2 === null || globalConfig2 === void 0 ? void 0 : globalConfig2.listOperate) === null || _b === void 0 ? void 0 : _b.hideMove)) {
hideMove = globalConfig2 === null || globalConfig2 === void 0 ? void 0 : globalConfig2.listOperate.hideMove;
}
if ((otherSchema === null || otherSchema === void 0 ? void 0 : otherSchema.min) > 0 && listData.length <= (otherSchema === null || otherSchema === void 0 ? void 0 : otherSchema.min)) {
hideDelete = true;
}
if ((otherSchema === null || otherSchema === void 0 ? void 0 : otherSchema.max) > 0 && (otherSchema === null || otherSchema === void 0 ? void 0 : otherSchema.max) <= listData.length) {
hideAdd = true;
}
if (hideAdd) {
hideCopy = true;
}
if (readOnly) {
hideAdd = true;
hideCopy = true;
hideDelete = true;
hideMove = true;
}
var operateBtnType = (_c = globalConfig2 === null || globalConfig2 === void 0 ? void 0 : globalConfig2.listOperate) === null || _c === void 0 ? void 0 : _c.btnType;
var ruleList = [];
if (!readOnly) {
ruleList = [{
validator: function validator2(_, data) {
return __awaiter(void 0, void 0, void 0, /* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee() {
var _e;
return _regeneratorRuntime$1().wrap(function _callee$(_context) {
while (1)
switch (_context.prev = _context.next) {
case 0:
setListData(data);
if (otherSchema === null || otherSchema === void 0 ? void 0 : otherSchema.min) {
_context.next = 3;
break;
}
return _context.abrupt("return");
case 3:
if (!(!data || data.length < otherSchema.min)) {
_context.next = 5;
break;
}
return _context.abrupt("return", Promise.reject(new Error(((_e = otherSchema === null || otherSchema === void 0 ? void 0 : otherSchema.message) === null || _e === void 0 ? void 0 : _e.min) || "\u6570\u636E\u957F\u5EA6\u5FC5\u987B\u5927\u4E8E\u7B49\u4E8E".concat(otherSchema.min))));
case 5:
case "end":
return _context.stop();
}
}, _callee);
}));
}
}].concat(_toConsumableArray$7(transformRules(rules2 || [], methods, form)));
}
return /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, /* @__PURE__ */ React__default.default.createElement(_Form.List, {
name: path2,
initialValue: defaultValue,
rules: ruleList
}, function(fields, operation, _ref) {
var errors = _ref.errors;
return /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(Widget, {
...Object.assign({}, otherListProps, {
configContext,
form,
schema: otherSchema,
fields,
operation,
path: path2,
listName: path2,
parentLitPath,
rootPath: [].concat(_toConsumableArray$7(preRootPath), _toConsumableArray$7(path2)),
readOnly,
methods,
renderCore,
widgets,
hideAdd,
hideCopy,
hideDelete,
hideMove,
addItem: handleAdd(operation.add),
removeItem: handleRemove(operation.remove),
moveItem: handleMove(operation.move),
copyItem: handleCopy(operation.add, fields),
temporary: {
displayType
},
addBtnProps: Object.assign(Object.assign({}, defaultAddBtnProps), addBtnProps),
delConfirmProps: Object.assign(Object.assign({}, defaultDelConfirmProps), delConfirmProps),
actionColumnProps: Object.assign(Object.assign({}, defaultActionColumnProps), actionColumnProps),
copyBtnProps: {
children: t2("copy"),
btnType: operateBtnType
},
editorBtnProps: {
children: t2("edit"),
btnType: operateBtnType
},
deleteBtnProps: {
children: t2("delete"),
btnType: operateBtnType
},
moveUpBtnProps: {
children: t2("moveUp"),
btnType: operateBtnType
},
moveDownBtnProps: {
children: t2("moveDown"),
btnType: operateBtnType
}
})
}), (errors === null || errors === void 0 ? void 0 : errors.length) !== 0 && /* @__PURE__ */ React__default.default.createElement("div", {
style: {
marginBottom: "12px"
}
}, /* @__PURE__ */ React__default.default.createElement(_Form.ErrorList, {
errors
}))]
});
}), removeBtn && /* @__PURE__ */ React__default.default.createElement(Button$2, Object.assign({
type: "link",
danger: true
}, removeBtn, {
onClick: handleDelete
}), (removeBtn === null || removeBtn === void 0 ? void 0 : removeBtn.text) || t2("delete")));
};
function _slicedToArray$d(arr, i2) {
return _arrayWithHoles$d(arr) || _iterableToArrayLimit$d(arr, i2) || _unsupportedIterableToArray$f(arr, i2) || _nonIterableRest$d();
}
function _nonIterableRest$d() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$f(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$f(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$f(o, minLen);
}
function _arrayLikeToArray$f(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$d(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$d(arr) {
if (Array.isArray(arr))
return arr;
}
var UpperContext = /* @__PURE__ */ React$a.createContext(function() {
});
const Main = function(props) {
var _useState = React$a.useState([]), _useState2 = _slicedToArray$d(_useState, 2), listData = _useState2[0], setListData = _useState2[1];
var configContext = props.configContext;
var store2 = React$a.useContext(FRContext);
var formCtx = useStore(store2, function(state) {
return state.context;
});
var upperCtx = React$a.useContext(UpperContext);
var form = configContext.form, widgets = configContext.widgets, methods = configContext.methods, globalConfig2 = configContext.globalConfig;
var displayType = formCtx.displayType;
var isDisplayColumn = displayType === "column";
var _schema = props.schema;
var formData = form.getFieldsValue(true);
var _store$getState = store2.getState(), formSchema = _store$getState.schema;
var items = _schema.items, className = _schema.className, otherSchema = __rest(_schema, ["items", "className"]);
var schema2 = (globalConfig2 === null || globalConfig2 === void 0 ? void 0 : globalConfig2.mustacheDisabled) ? _schema : Object.assign({
items
}, parseAllExpression(otherSchema, formData, props.rootPath, formSchema));
var widget = schema2.widget;
var widgetName = widget || "list1";
var getValueFromKey = getParamValue$1(formCtx, upperCtx, schema2);
var label = getLabel(schema2, displayType, widgets);
var tooltip = getTooltip$3(schema2, displayType);
var _getFormListLayout = getFormListLayout(getValueFromKey, displayType), labelCol = _getFormListLayout.labelCol, fieldCol = _getFormListLayout.fieldCol;
var isInline = schema2.display === "inline";
if (!(setListData === null || setListData === void 0 ? void 0 : setListData.length) && widgetName !== "drawerList") {
isInline = true;
}
if (schema2.hidden) {
return null;
}
return /* @__PURE__ */ React__default.default.createElement(Col$1, {
span: 24,
className
}, !isInline && !isDisplayColumn && label && /* @__PURE__ */ React__default.default.createElement(_Form.Item, {
className: "ant-form-item-optional-hide",
label,
labelAlign: "left",
colon: false,
tooltip,
style: {
marginBottom: 0
},
labelCol: {
span: 24
}
}), /* @__PURE__ */ React__default.default.createElement(
_Form.Item,
{
label,
labelCol: isDisplayColumn ? {
span: 24
} : labelCol,
wrapperCol: fieldCol,
noStyle: !isInline && !isDisplayColumn,
tooltip
},
/* @__PURE__ */ jsx(Main$1, {
...Object.assign({}, props, {
form,
methods,
formCtx,
upperCtx,
widgets,
configContext,
setListData,
listData
})
})
));
};
const FieldList = function(props) {
var _a;
var schema2 = props.schema, rootPath = props.rootPath;
var configCtx = React$a.useContext(ConfigContext);
var mustacheDisabled = (_a = configCtx === null || configCtx === void 0 ? void 0 : configCtx.globalConfig) === null || _a === void 0 ? void 0 : _a.mustacheDisabled;
var dependencies = schema2 === null || schema2 === void 0 ? void 0 : schema2.dependencies;
if (!isHasExpression(schema2) && !mustacheDisabled && (!dependencies || !(dependencies === null || dependencies === void 0 ? void 0 : dependencies.length))) {
return /* @__PURE__ */ jsx(Main, {
...Object.assign({
configContext: configCtx
}, props)
});
}
var schemaStr = JSON.stringify(schema2);
return /* @__PURE__ */ React__default.default.createElement(_Form.Item, {
noStyle: true,
shouldUpdate: fieldShouldUpdate(schemaStr, rootPath, dependencies)
}, function() {
return /* @__PURE__ */ jsx(Main, {
...Object.assign({
configContext: configCtx
}, props)
});
});
};
function _slicedToArray$c(arr, i2) {
return _arrayWithHoles$c(arr) || _iterableToArrayLimit$c(arr, i2) || _unsupportedIterableToArray$e(arr, i2) || _nonIterableRest$c();
}
function _nonIterableRest$c() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$e(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$e(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$e(o, minLen);
}
function _arrayLikeToArray$e(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$c(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$c(arr) {
if (Array.isArray(arr))
return arr;
}
const sortProperties = function(properties) {
var orderKey = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "order";
var orderHash = /* @__PURE__ */ new Map();
var unsortedList = [];
var insert = function insert2(item) {
var _item = _slicedToArray$c(item, 2), value = _item[1];
if (typeof value[orderKey] !== "number") {
unsortedList.push(item);
return;
}
if (orderHash.has(value[orderKey])) {
orderHash.get(value[orderKey]).push(item);
} else {
orderHash.set(value[orderKey], [item]);
}
};
properties.forEach(function(item) {
return insert(item);
});
var sortedList = Array.from(orderHash.entries()).sort(function(_ref, _ref2) {
var _ref3 = _slicedToArray$c(_ref, 1), order1 = _ref3[0];
var _ref4 = _slicedToArray$c(_ref2, 1), order2 = _ref4[0];
return order1 - order2;
}).flatMap(function(_ref5) {
var _ref6 = _slicedToArray$c(_ref5, 2), items = _ref6[1];
return items;
});
return sortedList.concat(unsortedList);
};
const index$Q = "";
function _toConsumableArray$6(arr) {
return _arrayWithoutHoles$6(arr) || _iterableToArray$6(arr) || _unsupportedIterableToArray$d(arr) || _nonIterableSpread$6();
}
function _nonIterableSpread$6() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _iterableToArray$6(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithoutHoles$6(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$d(arr);
}
function _slicedToArray$b(arr, i2) {
return _arrayWithHoles$b(arr) || _iterableToArrayLimit$b(arr, i2) || _unsupportedIterableToArray$d(arr, i2) || _nonIterableRest$b();
}
function _nonIterableRest$b() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$d(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$d(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$d(o, minLen);
}
function _arrayLikeToArray$d(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$b(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$b(arr) {
if (Array.isArray(arr))
return arr;
}
var renderItem = function renderItem2(props) {
var _a;
var schema2 = props.schema, key2 = props.key, path2 = props.path, rootPath = props.rootPath;
if (schema2.type === "array" && ((_a = schema2.items) === null || _a === void 0 ? void 0 : _a.type) === "object") {
return /* @__PURE__ */ jsx(FieldList, {
schema: schema2,
path: path2,
rootPath,
renderCore: RenderCore
}, key2);
}
var child = null;
if ((schema2 === null || schema2 === void 0 ? void 0 : schema2.properties) && (schema2 === null || schema2 === void 0 ? void 0 : schema2.widgetType) !== "field") {
child = RenderCore({
schema: schema2,
parentPath: path2,
rootPath
});
path2 = void 0;
}
return /* @__PURE__ */ jsx(FieldItem, {
schema: schema2,
path: path2,
rootPath,
children: child,
renderCore: RenderCore
}, key2);
};
var RenderCore = function RenderCore2(props) {
var schema2 = props.schema, _props$parentPath = props.parentPath, parentPath = _props$parentPath === void 0 ? [] : _props$parentPath, _props$rootPath = props.rootPath, rootPath = _props$rootPath === void 0 ? [] : _props$rootPath;
if (!schema2 || Object.keys(schema2).length === 0) {
return null;
}
if (schema2 === null || schema2 === void 0 ? void 0 : schema2.items) {
return renderItem({
schema: schema2.items,
path: parentPath,
rootPath
});
}
return sortProperties(Object.entries(schema2.properties || {})).map(function(_ref) {
var _ref2 = _slicedToArray$b(_ref, 2), key2 = _ref2[0], item = _ref2[1];
var path2 = [].concat(_toConsumableArray$6(parentPath), [key2]);
return renderItem({
schema: item,
path: path2,
key: key2,
rootPath
});
});
};
const index$P = "";
function _typeof$j(obj) {
"@babel/helpers - typeof";
return _typeof$j = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$j(obj);
}
function _regeneratorRuntime() {
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
_regeneratorRuntime = function _regeneratorRuntime2() {
return exports2;
};
var exports2 = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty2 = Object.defineProperty || function(obj, key2, desc) {
obj[key2] = desc.value;
}, $Symbol2 = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol2.iterator || "@@iterator", asyncIteratorSymbol = $Symbol2.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol2.toStringTag || "@@toStringTag";
function define(obj, key2, value) {
return Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
}), obj[key2];
}
try {
define({}, "");
} catch (err) {
define = function define2(obj, key2, value) {
return obj[key2] = value;
};
}
function wrap2(innerFn, outerFn, self2, tryLocsList) {
var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context2 = new Context2(tryLocsList || []);
return defineProperty2(generator, "_invoke", {
value: makeInvokeMethod(innerFn, self2, context2)
}), generator;
}
function tryCatch(fn, obj, arg) {
try {
return {
type: "normal",
arg: fn.call(obj, arg)
};
} catch (err) {
return {
type: "throw",
arg: err
};
}
}
exports2.wrap = wrap2;
var ContinueSentinel = {};
function Generator() {
}
function GeneratorFunction() {
}
function GeneratorFunctionPrototype() {
}
var IteratorPrototype2 = {};
define(IteratorPrototype2, iteratorSymbol, function() {
return this;
});
var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([])));
NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype2 = NativeIteratorPrototype);
var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype2);
function defineIteratorMethods(prototype2) {
["next", "throw", "return"].forEach(function(method2) {
define(prototype2, method2, function(arg) {
return this._invoke(method2, arg);
});
});
}
function AsyncIterator(generator, PromiseImpl) {
function invoke(method2, arg, resolve, reject) {
var record = tryCatch(generator[method2], generator, arg);
if ("throw" !== record.type) {
var result = record.arg, value = result.value;
return value && "object" == _typeof$j(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function(value2) {
invoke("next", value2, resolve, reject);
}, function(err) {
invoke("throw", err, resolve, reject);
}) : PromiseImpl.resolve(value).then(function(unwrapped) {
result.value = unwrapped, resolve(result);
}, function(error) {
return invoke("throw", error, resolve, reject);
});
}
reject(record.arg);
}
var previousPromise;
defineProperty2(this, "_invoke", {
value: function value(method2, arg) {
function callInvokeWithMethodAndArg() {
return new PromiseImpl(function(resolve, reject) {
invoke(method2, arg, resolve, reject);
});
}
return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
}
});
}
function makeInvokeMethod(innerFn, self2, context2) {
var state = "suspendedStart";
return function(method2, arg) {
if ("executing" === state)
throw new Error("Generator is already running");
if ("completed" === state) {
if ("throw" === method2)
throw arg;
return doneResult();
}
for (context2.method = method2, context2.arg = arg; ; ) {
var delegate = context2.delegate;
if (delegate) {
var delegateResult = maybeInvokeDelegate(delegate, context2);
if (delegateResult) {
if (delegateResult === ContinueSentinel)
continue;
return delegateResult;
}
}
if ("next" === context2.method)
context2.sent = context2._sent = context2.arg;
else if ("throw" === context2.method) {
if ("suspendedStart" === state)
throw state = "completed", context2.arg;
context2.dispatchException(context2.arg);
} else
"return" === context2.method && context2.abrupt("return", context2.arg);
state = "executing";
var record = tryCatch(innerFn, self2, context2);
if ("normal" === record.type) {
if (state = context2.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel)
continue;
return {
value: record.arg,
done: context2.done
};
}
"throw" === record.type && (state = "completed", context2.method = "throw", context2.arg = record.arg);
}
};
}
function maybeInvokeDelegate(delegate, context2) {
var methodName = context2.method, method2 = delegate.iterator[methodName];
if (void 0 === method2)
return context2.delegate = null, "throw" === methodName && delegate.iterator.return && (context2.method = "return", context2.arg = void 0, maybeInvokeDelegate(delegate, context2), "throw" === context2.method) || "return" !== methodName && (context2.method = "throw", context2.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel;
var record = tryCatch(method2, delegate.iterator, context2.arg);
if ("throw" === record.type)
return context2.method = "throw", context2.arg = record.arg, context2.delegate = null, ContinueSentinel;
var info = record.arg;
return info ? info.done ? (context2[delegate.resultName] = info.value, context2.next = delegate.nextLoc, "return" !== context2.method && (context2.method = "next", context2.arg = void 0), context2.delegate = null, ContinueSentinel) : info : (context2.method = "throw", context2.arg = new TypeError("iterator result is not an object"), context2.delegate = null, ContinueSentinel);
}
function pushTryEntry(locs) {
var entry = {
tryLoc: locs[0]
};
1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);
}
function resetTryEntry(entry) {
var record = entry.completion || {};
record.type = "normal", delete record.arg, entry.completion = record;
}
function Context2(tryLocsList) {
this.tryEntries = [{
tryLoc: "root"
}], tryLocsList.forEach(pushTryEntry, this), this.reset(true);
}
function values(iterable) {
if (iterable) {
var iteratorMethod = iterable[iteratorSymbol];
if (iteratorMethod)
return iteratorMethod.call(iterable);
if ("function" == typeof iterable.next)
return iterable;
if (!isNaN(iterable.length)) {
var i2 = -1, next = function next2() {
for (; ++i2 < iterable.length; )
if (hasOwn.call(iterable, i2))
return next2.value = iterable[i2], next2.done = false, next2;
return next2.value = void 0, next2.done = true, next2;
};
return next.next = next;
}
}
return {
next: doneResult
};
}
function doneResult() {
return {
value: void 0,
done: true
};
}
return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty2(Gp, "constructor", {
value: GeneratorFunctionPrototype,
configurable: true
}), defineProperty2(GeneratorFunctionPrototype, "constructor", {
value: GeneratorFunction,
configurable: true
}), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports2.isGeneratorFunction = function(genFun) {
var ctor = "function" == typeof genFun && genFun.constructor;
return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name));
}, exports2.mark = function(genFun) {
return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun;
}, exports2.awrap = function(arg) {
return {
__await: arg
};
}, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function() {
return this;
}), exports2.AsyncIterator = AsyncIterator, exports2.async = function(innerFn, outerFn, self2, tryLocsList, PromiseImpl) {
void 0 === PromiseImpl && (PromiseImpl = Promise);
var iter = new AsyncIterator(wrap2(innerFn, outerFn, self2, tryLocsList), PromiseImpl);
return exports2.isGeneratorFunction(outerFn) ? iter : iter.next().then(function(result) {
return result.done ? result.value : iter.next();
});
}, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function() {
return this;
}), define(Gp, "toString", function() {
return "[object Generator]";
}), exports2.keys = function(val) {
var object2 = Object(val), keys2 = [];
for (var key2 in object2)
keys2.push(key2);
return keys2.reverse(), function next() {
for (; keys2.length; ) {
var key3 = keys2.pop();
if (key3 in object2)
return next.value = key3, next.done = false, next;
}
return next.done = true, next;
};
}, exports2.values = values, Context2.prototype = {
constructor: Context2,
reset: function reset(skipTempReset) {
if (this.prev = 0, this.next = 0, this.sent = this._sent = void 0, this.done = false, this.delegate = null, this.method = "next", this.arg = void 0, this.tryEntries.forEach(resetTryEntry), !skipTempReset)
for (var name2 in this)
"t" === name2.charAt(0) && hasOwn.call(this, name2) && !isNaN(+name2.slice(1)) && (this[name2] = void 0);
},
stop: function stop() {
this.done = true;
var rootRecord = this.tryEntries[0].completion;
if ("throw" === rootRecord.type)
throw rootRecord.arg;
return this.rval;
},
dispatchException: function dispatchException(exception) {
if (this.done)
throw exception;
var context2 = this;
function handle(loc, caught) {
return record.type = "throw", record.arg = exception, context2.next = loc, caught && (context2.method = "next", context2.arg = void 0), !!caught;
}
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2], record = entry.completion;
if ("root" === entry.tryLoc)
return handle("end");
if (entry.tryLoc <= this.prev) {
var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc");
if (hasCatch && hasFinally) {
if (this.prev < entry.catchLoc)
return handle(entry.catchLoc, true);
if (this.prev < entry.finallyLoc)
return handle(entry.finallyLoc);
} else if (hasCatch) {
if (this.prev < entry.catchLoc)
return handle(entry.catchLoc, true);
} else {
if (!hasFinally)
throw new Error("try statement without catch or finally");
if (this.prev < entry.finallyLoc)
return handle(entry.finallyLoc);
}
}
}
},
abrupt: function abrupt(type2, arg) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
var finallyEntry = entry;
break;
}
}
finallyEntry && ("break" === type2 || "continue" === type2) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);
var record = finallyEntry ? finallyEntry.completion : {};
return record.type = type2, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);
},
complete: function complete(record, afterLoc) {
if ("throw" === record.type)
throw record.arg;
return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;
},
finish: function finish(finallyLoc) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.finallyLoc === finallyLoc)
return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;
}
},
catch: function _catch(tryLoc) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.tryLoc === tryLoc) {
var record = entry.completion;
if ("throw" === record.type) {
var thrown = record.arg;
resetTryEntry(entry);
}
return thrown;
}
}
throw new Error("illegal catch attempt");
},
delegateYield: function delegateYield(iterable, resultName, nextLoc) {
return this.delegate = {
iterator: values(iterable),
resultName,
nextLoc
}, "next" === this.method && (this.arg = void 0), ContinueSentinel;
}
}, exports2;
}
var FormCore = function FormCore2(props) {
var _a, _b, _c, _d, _e;
var store2 = React$a.useContext(FRContext);
var schema2 = useStore(store2, function(state) {
return state.schema;
});
var flattenSchema2 = useStore(store2, function(state) {
return state.flattenSchema;
});
var setContext = useStore(store2, function(state) {
return state.setContext;
});
var configCtx = React$a.useContext(_ConfigProvider.ConfigContext);
var t2 = translation$1(configCtx);
var _f = schema2 || {};
_f.type;
_f.properties;
var schemProps = __rest(_f, ["type", "properties"]);
var _transformProps = transformProps(Object.assign(Object.assign({}, props), schemProps)), formProps = _transformProps.formProps, displayType = _transformProps.displayType, beforeFinish = _transformProps.beforeFinish, watch = _transformProps.watch, onMount = _transformProps.onMount, column = _transformProps.column, labelWidth = _transformProps.labelWidth, labelCol = _transformProps.labelCol, fieldCol = _transformProps.fieldCol, maxWidth = _transformProps.maxWidth, form = _transformProps.form, onFinish = _transformProps.onFinish, onFinishFailed = _transformProps.onFinishFailed, readOnly = _transformProps.readOnly, disabled = _transformProps.disabled, footer = _transformProps.footer, removeHiddenData = _transformProps.removeHiddenData, operateExtra = _transformProps.operateExtra, logOnMount = _transformProps.logOnMount, logOnSubmit = _transformProps.logOnSubmit, id2 = _transformProps.id, className = _transformProps.className, validateTrigger = _transformProps.validateTrigger;
React$a.useEffect(function() {
form.__initStore(store2);
setTimeout(initial, 0);
}, []);
React$a.useEffect(function() {
form.setSchema(props.schema, true);
}, [JSON.stringify(props.schema || {})]);
React$a.useEffect(function() {
var context2 = {
column,
readOnly,
disabled,
labelWidth,
displayType,
labelCol,
fieldCol,
maxWidth,
validateTrigger
};
setContext(context2);
}, [column, labelCol, fieldCol, displayType, labelWidth, maxWidth, readOnly, disabled, validateTrigger]);
var initial = function initial2() {
return __awaiter(void 0, void 0, void 0, /* @__PURE__ */ _regeneratorRuntime().mark(function _callee() {
return _regeneratorRuntime().wrap(function _callee$(_context) {
while (1)
switch (_context.prev = _context.next) {
case 0:
_context.t0 = onMount;
if (!_context.t0) {
_context.next = 4;
break;
}
_context.next = 4;
return onMount();
case 4:
onMountLogger();
setTimeout(function() {
var values = form.getValues();
immediateWatch(watch, values);
}, 0);
case 6:
case "end":
return _context.stop();
}
}, _callee);
}));
};
var onMountLogger = function onMountLogger2() {
var start = new Date().getTime();
if (isFunction$2(logOnMount) || isFunction$2(logOnSubmit)) {
setSessionItem("FORM_MOUNT_TIME", start);
setSessionItem("FORM_START", start);
}
if (isFunction$2(logOnMount)) {
var logParams = {
schema: props.schema,
url: location.href,
formData: JSON.stringify(form.getValues()),
formMount: yymmdd(start)
};
if (id2) {
logParams.id = id2;
}
logOnMount(logParams);
}
if (isFunction$2(logOnSubmit)) {
setSessionItem("NUMBER_OF_SUBMITS", 0);
setSessionItem("FAILED_ATTEMPTS", 0);
}
};
var onSubmitLogger = function onSubmitLogger2(params) {
if (!isFunction$2(logOnSubmit)) {
return;
}
var start = getSessionItem("FORM_START");
var mount = getSessionItem("FORM_MOUNT_TIME");
var numberOfSubmits = getSessionItem("NUMBER_OF_SUBMITS") + 1;
var end = new Date().getTime();
var failedAttempts = getSessionItem("FAILED_ATTEMPTS");
if (params.errorFields.length > 0) {
failedAttempts = failedAttempts + 1;
}
var logParams = {
formMount: yymmdd(mount),
ms: end - start,
duration: msToTime(end - start),
numberOfSubmits,
failedAttempts,
url: location.href,
formData: JSON.stringify(params.values),
errors: JSON.stringify(params.errorFields),
schema: JSON.stringify(schema2)
};
if (id2) {
logParams.id = id2;
}
logOnSubmit(logParams);
setSessionItem("FORM_START", end);
setSessionItem("NUMBER_OF_SUBMITS", numberOfSubmits);
setSessionItem("FAILED_ATTEMPTS", failedAttempts);
};
var handleValuesChange = function handleValuesChange2(changedValues, _allValues) {
var allValues = valueRemoveUndefined(_allValues, true);
valuesWatch(changedValues, allValues, watch);
};
var handleFinish = function handleFinish2(_values) {
return __awaiter(void 0, void 0, void 0, /* @__PURE__ */ _regeneratorRuntime().mark(function _callee2() {
var values, fieldsError;
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
while (1)
switch (_context2.prev = _context2.next) {
case 0:
onSubmitLogger({
values: _values
});
values = _cloneDeep(_values);
if (!removeHiddenData) {
values = _cloneDeep(form.getFieldsValue(true));
}
values = parseValuesToBind(values, flattenSchema2);
values = valueRemoveUndefined(values);
if (!beforeFinish) {
_context2.next = 11;
break;
}
_context2.next = 8;
return beforeFinish({
data: values,
schema: schema2,
errors: []
});
case 8:
_context2.t0 = _context2.sent;
_context2.next = 12;
break;
case 11:
_context2.t0 = null;
case 12:
fieldsError = _context2.t0;
if (!fieldsError) {
_context2.next = 16;
break;
}
form.setFields(fieldsError);
return _context2.abrupt("return");
case 16:
onFinish && onFinish(values, []);
case 17:
case "end":
return _context2.stop();
}
}, _callee2);
}));
};
var handleFinishFailed = function handleFinishFailed2(params) {
return __awaiter(void 0, void 0, void 0, /* @__PURE__ */ _regeneratorRuntime().mark(function _callee3() {
var values;
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
while (1)
switch (_context3.prev = _context3.next) {
case 0:
onSubmitLogger(params);
if (onFinishFailed) {
_context3.next = 3;
break;
}
return _context3.abrupt("return");
case 3:
values = _cloneDeep(params === null || params === void 0 ? void 0 : params.values);
if (!removeHiddenData) {
values = _cloneDeep(form.getFieldsValue(true));
}
values = parseValuesToBind(values, flattenSchema2);
values = valueRemoveUndefined(values);
onFinishFailed(Object.assign(Object.assign({}, params), {
values
}));
case 8:
case "end":
return _context3.stop();
}
}, _callee3);
}));
};
var operlabelCol = (_a = getFormItemLayout(column, {}, {
labelWidth
})) === null || _a === void 0 ? void 0 : _a.labelCol;
var classRest = {};
if (className) {
classRest[className] = true;
}
return /* @__PURE__ */ React__default.default.createElement(_Form, Object.assign({
className: classnames("fr-form", classRest),
labelWrap: true
}, formProps, {
disabled,
form,
onFinish: handleFinish,
onFinishFailed: handleFinishFailed,
onValuesChange: handleValuesChange
}), /* @__PURE__ */ React__default.default.createElement(
Row$1,
{
gutter: displayType === "row" ? 16 : 24
},
/* @__PURE__ */ jsx(RenderCore, {
schema: schema2
}),
operateExtra
), schema2 && !!footer && /* @__PURE__ */ React__default.default.createElement(Row$1, {
gutter: displayType === "row" ? 16 : 24
}, /* @__PURE__ */ React__default.default.createElement(Col$1, {
span: 24 / column
}, /* @__PURE__ */ React__default.default.createElement(_Form.Item, {
label: displayType !== "column" ? "hideLabel" : null,
labelCol: operlabelCol,
className: "fr-hide-label"
}, isFunction$2(footer) ? /* @__PURE__ */ React__default.default.createElement(_Space, null, footer()) : /* @__PURE__ */ React__default.default.createElement(_Space, null, !((_b = footer === null || footer === void 0 ? void 0 : footer.reset) === null || _b === void 0 ? void 0 : _b.hide) && /* @__PURE__ */ React__default.default.createElement(Button$2, Object.assign({}, footer === null || footer === void 0 ? void 0 : footer.reset, {
onClick: function onClick() {
return form.resetFields();
}
}), ((_c = footer === null || footer === void 0 ? void 0 : footer.reset) === null || _c === void 0 ? void 0 : _c.text) || t2("reset")), !((_d = footer === null || footer === void 0 ? void 0 : footer.submit) === null || _d === void 0 ? void 0 : _d.hide) && /* @__PURE__ */ React__default.default.createElement(Button$2, Object.assign({
type: "primary",
onClick: form.submit
}, footer === null || footer === void 0 ? void 0 : footer.submit), ((_e = footer === null || footer === void 0 ? void 0 : footer.submit) === null || _e === void 0 ? void 0 : _e.text) || t2("submit")))))));
};
var zh_CN$5 = {};
var interopRequireDefault = { exports: {} };
(function(module2) {
function _interopRequireDefault2(obj) {
return obj && obj.__esModule ? obj : {
"default": obj
};
}
module2.exports = _interopRequireDefault2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(interopRequireDefault);
var zh_CN$4 = {};
Object.defineProperty(zh_CN$4, "__esModule", {
value: true
});
zh_CN$4.default = void 0;
var _default$n = {
items_per_page: "\u6761/\u9875",
jump_to: "\u8DF3\u81F3",
jump_to_confirm: "\u786E\u5B9A",
page: "\u9875",
prev_page: "\u4E0A\u4E00\u9875",
next_page: "\u4E0B\u4E00\u9875",
prev_5: "\u5411\u524D 5 \u9875",
next_5: "\u5411\u540E 5 \u9875",
prev_3: "\u5411\u524D 3 \u9875",
next_3: "\u5411\u540E 3 \u9875",
page_size: "\u9875\u7801"
};
zh_CN$4.default = _default$n;
var zh_CN$3 = {};
var zh_CN$2 = {};
var _extends$1 = { exports: {} };
(function(module2) {
function _extends2() {
module2.exports = _extends2 = Object.assign ? Object.assign.bind() : function(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = arguments[i2];
for (var key2 in source) {
if (Object.prototype.hasOwnProperty.call(source, key2)) {
target[key2] = source[key2];
}
}
}
return target;
}, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
return _extends2.apply(this, arguments);
}
module2.exports = _extends2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(_extends$1);
var zh_CN$1 = {};
Object.defineProperty(zh_CN$1, "__esModule", {
value: true
});
zh_CN$1.default = void 0;
var locale$1 = {
locale: "zh_CN",
today: "\u4ECA\u5929",
now: "\u6B64\u523B",
backToToday: "\u8FD4\u56DE\u4ECA\u5929",
ok: "\u786E\u5B9A",
timeSelect: "\u9009\u62E9\u65F6\u95F4",
dateSelect: "\u9009\u62E9\u65E5\u671F",
weekSelect: "\u9009\u62E9\u5468",
clear: "\u6E05\u9664",
month: "\u6708",
year: "\u5E74",
previousMonth: "\u4E0A\u4E2A\u6708 (\u7FFB\u9875\u4E0A\u952E)",
nextMonth: "\u4E0B\u4E2A\u6708 (\u7FFB\u9875\u4E0B\u952E)",
monthSelect: "\u9009\u62E9\u6708\u4EFD",
yearSelect: "\u9009\u62E9\u5E74\u4EFD",
decadeSelect: "\u9009\u62E9\u5E74\u4EE3",
yearFormat: "YYYY\u5E74",
dayFormat: "D\u65E5",
dateFormat: "YYYY\u5E74M\u6708D\u65E5",
dateTimeFormat: "YYYY\u5E74M\u6708D\u65E5 HH\u65F6mm\u5206ss\u79D2",
previousYear: "\u4E0A\u4E00\u5E74 (Control\u952E\u52A0\u5DE6\u65B9\u5411\u952E)",
nextYear: "\u4E0B\u4E00\u5E74 (Control\u952E\u52A0\u53F3\u65B9\u5411\u952E)",
previousDecade: "\u4E0A\u4E00\u5E74\u4EE3",
nextDecade: "\u4E0B\u4E00\u5E74\u4EE3",
previousCentury: "\u4E0A\u4E00\u4E16\u7EAA",
nextCentury: "\u4E0B\u4E00\u4E16\u7EAA"
};
var _default$m = locale$1;
zh_CN$1.default = _default$m;
var zh_CN = {};
(function(exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
exports2["default"] = void 0;
var locale2 = {
placeholder: "\u8BF7\u9009\u62E9\u65F6\u95F4",
rangePlaceholder: ["\u5F00\u59CB\u65F6\u95F4", "\u7ED3\u675F\u65F6\u95F4"]
};
var _default2 = locale2;
exports2["default"] = _default2;
})(zh_CN);
(function(exports2) {
var _interopRequireDefault2 = interopRequireDefault.exports["default"];
Object.defineProperty(exports2, "__esModule", {
value: true
});
exports2["default"] = void 0;
var _extends2 = _interopRequireDefault2(_extends$1.exports);
var _zh_CN = _interopRequireDefault2(zh_CN$1);
var _zh_CN2 = _interopRequireDefault2(zh_CN);
var locale2 = {
lang: (0, _extends2["default"])({
placeholder: "\u8BF7\u9009\u62E9\u65E5\u671F",
yearPlaceholder: "\u8BF7\u9009\u62E9\u5E74\u4EFD",
quarterPlaceholder: "\u8BF7\u9009\u62E9\u5B63\u5EA6",
monthPlaceholder: "\u8BF7\u9009\u62E9\u6708\u4EFD",
weekPlaceholder: "\u8BF7\u9009\u62E9\u5468",
rangePlaceholder: ["\u5F00\u59CB\u65E5\u671F", "\u7ED3\u675F\u65E5\u671F"],
rangeYearPlaceholder: ["\u5F00\u59CB\u5E74\u4EFD", "\u7ED3\u675F\u5E74\u4EFD"],
rangeMonthPlaceholder: ["\u5F00\u59CB\u6708\u4EFD", "\u7ED3\u675F\u6708\u4EFD"],
rangeQuarterPlaceholder: ["\u5F00\u59CB\u5B63\u5EA6", "\u7ED3\u675F\u5B63\u5EA6"],
rangeWeekPlaceholder: ["\u5F00\u59CB\u5468", "\u7ED3\u675F\u5468"]
}, _zh_CN["default"]),
timePickerLocale: (0, _extends2["default"])({}, _zh_CN2["default"])
};
locale2.lang.ok = "\u786E\u5B9A";
var _default2 = locale2;
exports2["default"] = _default2;
})(zh_CN$2);
(function(exports2) {
var _interopRequireDefault2 = interopRequireDefault.exports["default"];
Object.defineProperty(exports2, "__esModule", {
value: true
});
exports2["default"] = void 0;
var _zh_CN = _interopRequireDefault2(zh_CN$2);
var _default2 = _zh_CN["default"];
exports2["default"] = _default2;
})(zh_CN$3);
(function(exports2) {
var _interopRequireDefault2 = interopRequireDefault.exports["default"];
Object.defineProperty(exports2, "__esModule", {
value: true
});
exports2["default"] = void 0;
var _zh_CN = _interopRequireDefault2(zh_CN$4);
var _zh_CN2 = _interopRequireDefault2(zh_CN$3);
var _zh_CN3 = _interopRequireDefault2(zh_CN$2);
var _zh_CN4 = _interopRequireDefault2(zh_CN);
var typeTemplate2 = "${label}\u4E0D\u662F\u4E00\u4E2A\u6709\u6548\u7684${type}";
var localeValues2 = {
locale: "zh-cn",
Pagination: _zh_CN["default"],
DatePicker: _zh_CN3["default"],
TimePicker: _zh_CN4["default"],
Calendar: _zh_CN2["default"],
global: {
placeholder: "\u8BF7\u9009\u62E9"
},
Table: {
filterTitle: "\u7B5B\u9009",
filterConfirm: "\u786E\u5B9A",
filterReset: "\u91CD\u7F6E",
filterEmptyText: "\u65E0\u7B5B\u9009\u9879",
filterCheckall: "\u5168\u9009",
filterSearchPlaceholder: "\u5728\u7B5B\u9009\u9879\u4E2D\u641C\u7D22",
selectAll: "\u5168\u9009\u5F53\u9875",
selectInvert: "\u53CD\u9009\u5F53\u9875",
selectNone: "\u6E05\u7A7A\u6240\u6709",
selectionAll: "\u5168\u9009\u6240\u6709",
sortTitle: "\u6392\u5E8F",
expand: "\u5C55\u5F00\u884C",
collapse: "\u5173\u95ED\u884C",
triggerDesc: "\u70B9\u51FB\u964D\u5E8F",
triggerAsc: "\u70B9\u51FB\u5347\u5E8F",
cancelSort: "\u53D6\u6D88\u6392\u5E8F"
},
Modal: {
okText: "\u786E\u5B9A",
cancelText: "\u53D6\u6D88",
justOkText: "\u77E5\u9053\u4E86"
},
Popconfirm: {
cancelText: "\u53D6\u6D88",
okText: "\u786E\u5B9A"
},
Transfer: {
titles: ["", ""],
searchPlaceholder: "\u8BF7\u8F93\u5165\u641C\u7D22\u5185\u5BB9",
itemUnit: "\u9879",
itemsUnit: "\u9879",
remove: "\u5220\u9664",
selectCurrent: "\u5168\u9009\u5F53\u9875",
removeCurrent: "\u5220\u9664\u5F53\u9875",
selectAll: "\u5168\u9009\u6240\u6709",
removeAll: "\u5220\u9664\u5168\u90E8",
selectInvert: "\u53CD\u9009\u5F53\u9875"
},
Upload: {
uploading: "\u6587\u4EF6\u4E0A\u4F20\u4E2D",
removeFile: "\u5220\u9664\u6587\u4EF6",
uploadError: "\u4E0A\u4F20\u9519\u8BEF",
previewFile: "\u9884\u89C8\u6587\u4EF6",
downloadFile: "\u4E0B\u8F7D\u6587\u4EF6"
},
Empty: {
description: "\u6682\u65E0\u6570\u636E"
},
Icon: {
icon: "\u56FE\u6807"
},
Text: {
edit: "\u7F16\u8F91",
copy: "\u590D\u5236",
copied: "\u590D\u5236\u6210\u529F",
expand: "\u5C55\u5F00"
},
PageHeader: {
back: "\u8FD4\u56DE"
},
Form: {
optional: "\uFF08\u53EF\u9009\uFF09",
defaultValidateMessages: {
"default": "\u5B57\u6BB5\u9A8C\u8BC1\u9519\u8BEF${label}",
required: "\u8BF7\u8F93\u5165${label}",
"enum": "${label}\u5FC5\u987B\u662F\u5176\u4E2D\u4E00\u4E2A[${enum}]",
whitespace: "${label}\u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26",
date: {
format: "${label}\u65E5\u671F\u683C\u5F0F\u65E0\u6548",
parse: "${label}\u4E0D\u80FD\u8F6C\u6362\u4E3A\u65E5\u671F",
invalid: "${label}\u662F\u4E00\u4E2A\u65E0\u6548\u65E5\u671F"
},
types: {
string: typeTemplate2,
method: typeTemplate2,
array: typeTemplate2,
object: typeTemplate2,
number: typeTemplate2,
date: typeTemplate2,
"boolean": typeTemplate2,
integer: typeTemplate2,
"float": typeTemplate2,
regexp: typeTemplate2,
email: typeTemplate2,
url: typeTemplate2,
hex: typeTemplate2
},
string: {
len: "${label}\u987B\u4E3A${len}\u4E2A\u5B57\u7B26",
min: "${label}\u6700\u5C11${min}\u4E2A\u5B57\u7B26",
max: "${label}\u6700\u591A${max}\u4E2A\u5B57\u7B26",
range: "${label}\u987B\u5728${min}-${max}\u5B57\u7B26\u4E4B\u95F4"
},
number: {
len: "${label}\u5FC5\u987B\u7B49\u4E8E${len}",
min: "${label}\u6700\u5C0F\u503C\u4E3A${min}",
max: "${label}\u6700\u5927\u503C\u4E3A${max}",
range: "${label}\u987B\u5728${min}-${max}\u4E4B\u95F4"
},
array: {
len: "\u987B\u4E3A${len}\u4E2A${label}",
min: "\u6700\u5C11${min}\u4E2A${label}",
max: "\u6700\u591A${max}\u4E2A${label}",
range: "${label}\u6570\u91CF\u987B\u5728${min}-${max}\u4E4B\u95F4"
},
pattern: {
mismatch: "${label}\u4E0E\u6A21\u5F0F\u4E0D\u5339\u914D${pattern}"
}
}
},
Image: {
preview: "\u9884\u89C8"
}
};
var _default2 = localeValues2;
exports2["default"] = _default2;
})(zh_CN$5);
const zhCN$1 = /* @__PURE__ */ getDefaultExportFromCjs(zh_CN$5);
var en_US$5 = {};
var _default$l = {};
var en_US$4 = {};
Object.defineProperty(en_US$4, "__esModule", {
value: true
});
en_US$4.default = void 0;
var _default$k = {
items_per_page: "/ page",
jump_to: "Go to",
jump_to_confirm: "confirm",
page: "Page",
prev_page: "Previous Page",
next_page: "Next Page",
prev_5: "Previous 5 Pages",
next_5: "Next 5 Pages",
prev_3: "Previous 3 Pages",
next_3: "Next 3 Pages",
page_size: "Page Size"
};
en_US$4.default = _default$k;
var en_US$3 = {};
var en_US$2 = {};
var en_US$1 = {};
Object.defineProperty(en_US$1, "__esModule", {
value: true
});
en_US$1.default = void 0;
var locale = {
locale: "en_US",
today: "Today",
now: "Now",
backToToday: "Back to today",
ok: "OK",
clear: "Clear",
month: "Month",
year: "Year",
timeSelect: "select time",
dateSelect: "select date",
weekSelect: "Choose a week",
monthSelect: "Choose a month",
yearSelect: "Choose a year",
decadeSelect: "Choose a decade",
yearFormat: "YYYY",
dateFormat: "M/D/YYYY",
dayFormat: "D",
dateTimeFormat: "M/D/YYYY HH:mm:ss",
monthBeforeYear: true,
previousMonth: "Previous month (PageUp)",
nextMonth: "Next month (PageDown)",
previousYear: "Last year (Control + left)",
nextYear: "Next year (Control + right)",
previousDecade: "Last decade",
nextDecade: "Next decade",
previousCentury: "Last century",
nextCentury: "Next century"
};
var _default$j = locale;
en_US$1.default = _default$j;
var en_US = {};
(function(exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
exports2["default"] = void 0;
var locale2 = {
placeholder: "Select time",
rangePlaceholder: ["Start time", "End time"]
};
var _default2 = locale2;
exports2["default"] = _default2;
})(en_US);
(function(exports2) {
var _interopRequireDefault2 = interopRequireDefault.exports["default"];
Object.defineProperty(exports2, "__esModule", {
value: true
});
exports2["default"] = void 0;
var _extends2 = _interopRequireDefault2(_extends$1.exports);
var _en_US = _interopRequireDefault2(en_US$1);
var _en_US2 = _interopRequireDefault2(en_US);
var locale2 = {
lang: (0, _extends2["default"])({
placeholder: "Select date",
yearPlaceholder: "Select year",
quarterPlaceholder: "Select quarter",
monthPlaceholder: "Select month",
weekPlaceholder: "Select week",
rangePlaceholder: ["Start date", "End date"],
rangeYearPlaceholder: ["Start year", "End year"],
rangeQuarterPlaceholder: ["Start quarter", "End quarter"],
rangeMonthPlaceholder: ["Start month", "End month"],
rangeWeekPlaceholder: ["Start week", "End week"]
}, _en_US["default"]),
timePickerLocale: (0, _extends2["default"])({}, _en_US2["default"])
};
var _default2 = locale2;
exports2["default"] = _default2;
})(en_US$2);
(function(exports2) {
var _interopRequireDefault2 = interopRequireDefault.exports["default"];
Object.defineProperty(exports2, "__esModule", {
value: true
});
exports2["default"] = void 0;
var _en_US = _interopRequireDefault2(en_US$2);
var _default2 = _en_US["default"];
exports2["default"] = _default2;
})(en_US$3);
(function(exports2) {
var _interopRequireDefault2 = interopRequireDefault.exports["default"];
Object.defineProperty(exports2, "__esModule", {
value: true
});
exports2["default"] = void 0;
var _en_US = _interopRequireDefault2(en_US$4);
var _en_US2 = _interopRequireDefault2(en_US$3);
var _en_US3 = _interopRequireDefault2(en_US$2);
var _en_US4 = _interopRequireDefault2(en_US);
var typeTemplate2 = "${label} is not a valid ${type}";
var localeValues2 = {
locale: "en",
Pagination: _en_US["default"],
DatePicker: _en_US3["default"],
TimePicker: _en_US4["default"],
Calendar: _en_US2["default"],
global: {
placeholder: "Please select"
},
Table: {
filterTitle: "Filter menu",
filterConfirm: "OK",
filterReset: "Reset",
filterEmptyText: "No filters",
filterCheckall: "Select all items",
filterSearchPlaceholder: "Search in filters",
emptyText: "No data",
selectAll: "Select current page",
selectInvert: "Invert current page",
selectNone: "Clear all data",
selectionAll: "Select all data",
sortTitle: "Sort",
expand: "Expand row",
collapse: "Collapse row",
triggerDesc: "Click to sort descending",
triggerAsc: "Click to sort ascending",
cancelSort: "Click to cancel sorting"
},
Modal: {
okText: "OK",
cancelText: "Cancel",
justOkText: "OK"
},
Popconfirm: {
okText: "OK",
cancelText: "Cancel"
},
Transfer: {
titles: ["", ""],
searchPlaceholder: "Search here",
itemUnit: "item",
itemsUnit: "items",
remove: "Remove",
selectCurrent: "Select current page",
removeCurrent: "Remove current page",
selectAll: "Select all data",
removeAll: "Remove all data",
selectInvert: "Invert current page"
},
Upload: {
uploading: "Uploading...",
removeFile: "Remove file",
uploadError: "Upload error",
previewFile: "Preview file",
downloadFile: "Download file"
},
Empty: {
description: "No data"
},
Icon: {
icon: "icon"
},
Text: {
edit: "Edit",
copy: "Copy",
copied: "Copied",
expand: "Expand"
},
PageHeader: {
back: "Back"
},
Form: {
optional: "(optional)",
defaultValidateMessages: {
"default": "Field validation error for ${label}",
required: "Please enter ${label}",
"enum": "${label} must be one of [${enum}]",
whitespace: "${label} cannot be a blank character",
date: {
format: "${label} date format is invalid",
parse: "${label} cannot be converted to a date",
invalid: "${label} is an invalid date"
},
types: {
string: typeTemplate2,
method: typeTemplate2,
array: typeTemplate2,
object: typeTemplate2,
number: typeTemplate2,
date: typeTemplate2,
"boolean": typeTemplate2,
integer: typeTemplate2,
"float": typeTemplate2,
regexp: typeTemplate2,
email: typeTemplate2,
url: typeTemplate2,
hex: typeTemplate2
},
string: {
len: "${label} must be ${len} characters",
min: "${label} must be at least ${min} characters",
max: "${label} must be up to ${max} characters",
range: "${label} must be between ${min}-${max} characters"
},
number: {
len: "${label} must be equal to ${len}",
min: "${label} must be minimum ${min}",
max: "${label} must be maximum ${max}",
range: "${label} must be between ${min}-${max}"
},
array: {
len: "Must be ${len} ${label}",
min: "At least ${min} ${label}",
max: "At most ${max} ${label}",
range: "The amount of ${label} must be between ${min}-${max}"
},
pattern: {
mismatch: "${label} does not match the pattern ${pattern}"
}
}
},
Image: {
preview: "Preview"
}
};
var _default2 = localeValues2;
exports2["default"] = _default2;
})(_default$l);
(function(exports2) {
var _interopRequireDefault2 = interopRequireDefault.exports["default"];
Object.defineProperty(exports2, "__esModule", {
value: true
});
exports2["default"] = void 0;
var _default2 = _interopRequireDefault2(_default$l);
var _default3 = _default2["default"];
exports2["default"] = _default3;
})(en_US$5);
const enUS$1 = /* @__PURE__ */ getDefaultExportFromCjs(en_US$5);
const enUS = {
"copy_max_tip": "The maximum number of table items has been reached and cannot be copied",
"copy": "Copy",
"add_item": "Add a new line",
"confirm_delete": "Are you sure to delete?",
"confirm": "Yes",
"cancel": "No",
"operate": "Operate",
"delete": "Delete",
"edit": "Edit",
"img_src_error": "Image address error",
"upload": "Upload",
"upload_success": "upload success",
"upload_fail": "upload failed",
"uploaded_address": "Uploaded address",
"test_src": "Test address",
"schema_not_match": "Schema does not match the display component\uFF1A",
"item": "Item",
"search": "Search",
"reset": "Reset",
"expand": "Expand",
"fold": "Fold",
"submit": "Submit",
"save": "Save",
"moveDown": "Move Down",
"moveUp": "Move Up"
};
const zhCN = {
"copy_max_tip": "\u5DF2\u8FBE\u8868\u5355\u9879\u6570\u91CF\u4E0A\u9650\uFF0C\u65E0\u6CD5\u590D\u5236\uFF01",
"copy": "\u590D\u5236",
"add_item": "\u65B0\u589E\u4E00\u6761",
"confirm_delete": "\u786E\u5B9A\u5220\u9664?",
"confirm": "\u786E\u5B9A",
"cancel": "\u53D6\u6D88",
"operate": "\u64CD\u4F5C",
"delete": "\u5220\u9664",
"edit": "\u7F16\u8F91",
"img_src_error": "\u56FE\u7247\u5730\u5740\u9519\u8BEF",
"upload": "\u4E0A\u4F20",
"upload_success": "\u4E0A\u4F20\u6210\u529F",
"upload_fail": "\u4E0A\u4F20\u5931\u8D25",
"uploaded_address": "\u5DF2\u4E0A\u4F20\u5730\u5740",
"test_src": "\u6D4B\u8BD5\u94FE\u63A5",
"schema_not_match": "schema\u672A\u5339\u914D\u5230\u5C55\u793A\u7EC4\u4EF6\uFF1A",
"item": "\u9879\u76EE",
"search": "\u67E5\u8BE2",
"reset": "\u91CD\u7F6E",
"expand": "\u5C55\u5F00",
"fold": "\u6536\u8D77",
"submit": "\u63D0\u4EA4",
"save": "\u4FDD\u5B58",
"moveDown": "\u4E0B\u79FB",
"moveUp": "\u4E0A\u79FB"
};
const locales = {
"en-US": enUS,
"zh-CN": zhCN
};
var zhCn = { exports: {} };
(function(module2, exports2) {
!function(e2, _) {
module2.exports = _(dayjs_min.exports);
}(commonjsGlobal, function(e2) {
function _(e3) {
return e3 && "object" == typeof e3 && "default" in e3 ? e3 : { default: e3 };
}
var t2 = _(e2), d2 = { name: "zh-cn", weekdays: "\u661F\u671F\u65E5_\u661F\u671F\u4E00_\u661F\u671F\u4E8C_\u661F\u671F\u4E09_\u661F\u671F\u56DB_\u661F\u671F\u4E94_\u661F\u671F\u516D".split("_"), weekdaysShort: "\u5468\u65E5_\u5468\u4E00_\u5468\u4E8C_\u5468\u4E09_\u5468\u56DB_\u5468\u4E94_\u5468\u516D".split("_"), weekdaysMin: "\u65E5_\u4E00_\u4E8C_\u4E09_\u56DB_\u4E94_\u516D".split("_"), months: "\u4E00\u6708_\u4E8C\u6708_\u4E09\u6708_\u56DB\u6708_\u4E94\u6708_\u516D\u6708_\u4E03\u6708_\u516B\u6708_\u4E5D\u6708_\u5341\u6708_\u5341\u4E00\u6708_\u5341\u4E8C\u6708".split("_"), monthsShort: "1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"), ordinal: function(e3, _2) {
return "W" === _2 ? e3 + "\u5468" : e3 + "\u65E5";
}, weekStart: 1, yearStart: 4, formats: { LT: "HH:mm", LTS: "HH:mm:ss", L: "YYYY/MM/DD", LL: "YYYY\u5E74M\u6708D\u65E5", LLL: "YYYY\u5E74M\u6708D\u65E5Ah\u70B9mm\u5206", LLLL: "YYYY\u5E74M\u6708D\u65E5ddddAh\u70B9mm\u5206", l: "YYYY/M/D", ll: "YYYY\u5E74M\u6708D\u65E5", lll: "YYYY\u5E74M\u6708D\u65E5 HH:mm", llll: "YYYY\u5E74M\u6708D\u65E5dddd HH:mm" }, relativeTime: { future: "%s\u5185", past: "%s\u524D", s: "\u51E0\u79D2", m: "1 \u5206\u949F", mm: "%d \u5206\u949F", h: "1 \u5C0F\u65F6", hh: "%d \u5C0F\u65F6", d: "1 \u5929", dd: "%d \u5929", M: "1 \u4E2A\u6708", MM: "%d \u4E2A\u6708", y: "1 \u5E74", yy: "%d \u5E74" }, meridiem: function(e3, _2) {
var t3 = 100 * e3 + _2;
return t3 < 600 ? "\u51CC\u6668" : t3 < 900 ? "\u65E9\u4E0A" : t3 < 1100 ? "\u4E0A\u5348" : t3 < 1300 ? "\u4E2D\u5348" : t3 < 1800 ? "\u4E0B\u5348" : "\u665A\u4E0A";
} };
return t2.default.locale(d2, null, true), d2;
});
})(zhCn);
var createStore = function createStore2() {
return createStore$1(function(setState, get2) {
return {
initialized: false,
schema: {},
flattenSchema: {},
context: {},
init: function init2(data) {
return setState(Object.assign({
initialized: true
}, data));
},
setContext: function setContext(context2) {
return setState({
context: context2
});
}
};
});
};
var typeTemplate = "'${label}' is not a valid ${type}";
var typeTemplateCN = "\u6570\u636E\u7C7B\u578B\u5FC5\u987B\u662F ${type}";
var validateMessagesEN = {
default: "Validation error on field '${label}'",
required: "'${label}' is required",
enum: "'${label}' must be one of [${enum}]",
whitespace: "'${label}' cannot be empty",
date: {
format: "'${label}' is invalid for format date",
parse: "'${label}' could not be parsed as date",
invalid: "'${label}' is invalid date"
},
types: {
string: typeTemplate,
method: typeTemplate,
array: typeTemplate,
object: typeTemplate,
number: typeTemplate,
date: typeTemplate,
boolean: typeTemplate,
integer: typeTemplate,
float: typeTemplate,
regexp: typeTemplate,
email: typeTemplate,
url: typeTemplate,
hex: typeTemplate
},
string: {
len: "'${label}' must be exactly ${len} characters",
min: "'${label}' must be at least ${min} characters",
max: "'${label}' cannot be longer than ${max} characters",
range: "'${label}' must be between ${min} and ${max} characters"
},
number: {
len: "'${label}' must equal ${len}",
min: "'${label}' cannot be less than ${min}",
max: "'${label}' cannot be greater than ${max}",
range: "'${label}' must be between ${min} and ${max}"
},
array: {
len: "'${label}' must be exactly ${len} in length",
min: "'${label}' cannot be less than ${min} in length",
max: "'${label}' cannot be greater than ${max} in length",
range: "'${label}' must be between ${min} and ${max} in length"
},
pattern: {
mismatch: "'${label}' does not match pattern ${pattern}"
}
};
var validateMessagesCN = {
default: "${label}\u672A\u901A\u8FC7\u6821\u9A8C",
required: "${label}\u5FC5\u586B",
whitespace: "${label}\u4E0D\u80FD\u4E3A\u7A7A",
date: {
format: "${label}\u7684\u683C\u5F0F\u9519\u8BEF",
parse: "${label}\u65E0\u6CD5\u88AB\u89E3\u6790",
invalid: "${label}\u6570\u636E\u4E0D\u5408\u6CD5"
},
types: {
string: typeTemplateCN,
method: typeTemplateCN,
array: typeTemplateCN,
object: typeTemplateCN,
number: typeTemplateCN,
date: typeTemplateCN,
boolean: typeTemplateCN,
integer: typeTemplateCN,
float: typeTemplateCN,
regexp: typeTemplateCN,
email: typeTemplateCN,
url: typeTemplateCN,
hex: typeTemplateCN
},
string: {
len: "${label}\u957F\u5EA6\u4E0D\u662F${len}",
min: "${label}\u957F\u5EA6\u4E0D\u80FD\u5C0F\u4E8E${min}",
max: "${label}\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E${max}",
range: "${label}\u957F\u5EA6\u9700\u5728${min}\u4E0E${max}\u4E4B\u95F4"
},
number: {
len: "${label}\u4E0D\u7B49\u4E8E${len}",
min: "${label}\u4E0D\u80FD\u5C0F\u4E8E${min}",
max: "${label}\u4E0D\u80FD\u5927\u4E8E${max}",
range: "${label}\u9700\u5728${min}\u4E0E${max}\u4E4B\u95F4"
},
array: {
len: "${label}\u957F\u5EA6\u4E0D\u662F${len}",
min: "${label}\u957F\u5EA6\u4E0D\u80FD\u5C0F\u4E8E${min}",
max: "${label}\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E${max}",
range: "${label}\u957F\u5EA6\u9700\u5728${min}\u4E0E${max}\u4E4B\u95F4"
},
pattern: {
mismatch: "${label}\u672A\u901A\u8FC7\u6B63\u5219\u5224\u65AD${pattern}"
}
};
function withProvider(Element2, defaultWidgets2) {
return function(props) {
var configProvider = props.configProvider, _props$locale = props.locale, locale2 = _props$locale === void 0 ? "zh-CN" : _props$locale, widgets = props.widgets, methods = props.methods, form = props.form, validateMessages = props.validateMessages, _props$globalProps = props.globalProps, globalProps = _props$globalProps === void 0 ? {} : _props$globalProps, _props$globalConfig = props.globalConfig, globalConfig2 = _props$globalConfig === void 0 ? {} : _props$globalConfig, otherProps = __rest(props, ["configProvider", "locale", "widgets", "methods", "form", "validateMessages", "globalProps", "globalConfig"]);
var storeRef = React$a.useRef(createStore());
var store2 = storeRef.current;
React$a.useEffect(function() {
if (locale2 === "en-US") {
dayjs.locale("en");
return;
}
dayjs.locale("zh-cn");
}, [locale2]);
useUnmount$1(function() {
form.resetFields();
});
if (!form) {
console.warn("Please provide a form instance to FormRender");
return null;
}
var antdLocale = locale2 === "zh-CN" ? zhCN$1 : enUS$1;
var formValidateMessages = locale2 === "zh-CN" ? validateMessagesCN : validateMessagesEN;
var configContext = {
locale: locale2,
widgets: Object.assign(Object.assign({}, defaultWidgets2), widgets),
methods,
form,
globalProps,
globalConfig: globalConfig2
};
var langPack = Object.assign(Object.assign(Object.assign({}, antdLocale), {
"FormRender": locales[locale2]
}), configProvider === null || configProvider === void 0 ? void 0 : configProvider.locale);
return /* @__PURE__ */ React__default.default.createElement(
_ConfigProvider,
Object.assign({}, configProvider, {
locale: langPack,
form: {
validateMessages: Object.assign(Object.assign({}, formValidateMessages), validateMessages)
}
}),
/* @__PURE__ */ jsx(ConfigContext.Provider, {
value: configContext,
children: /* @__PURE__ */ jsx(FRContext.Provider, {
value: store2,
children: /* @__PURE__ */ jsx(Element2, {
...Object.assign({
form
}, otherProps)
})
})
})
);
};
}
const index$O = "";
var getProps = function getProps2(props, filter2) {
var result = {};
Object.keys(props).forEach(function(key2) {
if (filter2.includes(key2)) {
return;
}
result[key2] = props[key2];
});
return result;
};
const withFieldWrap = function(Field2) {
var filterProps = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : ["addons", "schema", "dependValues"];
return function(props) {
return /* @__PURE__ */ jsx(Field2, {
...Object.assign({}, getProps(props, filterProps))
});
};
};
const Input = withFieldWrap(Input$2);
const index$N = "";
const InputNumber = withFieldWrap(_InputNumber);
var TextArea = function TextArea2(props) {
var finalProps = Object.assign({
autoSize: {
minRows: 3
}
}, props);
if (finalProps.rows)
delete finalProps.autoSize;
return /* @__PURE__ */ React__default.default.createElement(Input$2.TextArea, Object.assign({}, finalProps));
};
const TextArea$1 = withFieldWrap(TextArea);
const index$M = "";
const index$L = "";
const MultiSelect = withFieldWrap(_Select);
const index$K = "";
const Switch = withFieldWrap(_Switch);
const index$J = "";
var RadioComp = function RadioComp2(props) {
var _props$direction = props.direction, direction = _props$direction === void 0 ? "row" : _props$direction, _props$options = props.options, options = _props$options === void 0 ? [] : _props$options, rest = __rest(props, ["direction", "options"]);
if (direction === "column") {
return /* @__PURE__ */ React__default.default.createElement(_Radio.Group, Object.assign({}, rest), /* @__PURE__ */ React__default.default.createElement(_Space, {
direction: "vertical"
}, options.map(function(item) {
var value = item.value, label = item.label, rest2 = __rest(item, ["value", "label"]);
return /* @__PURE__ */ React__default.default.createElement(_Radio, Object.assign({
key: value,
value
}, rest2), label);
})));
}
return /* @__PURE__ */ React__default.default.createElement(_Radio.Group, Object.assign({}, rest, {
options
}));
};
const Radio = withFieldWrap(RadioComp);
const index$I = "";
const index$H = withFieldWrap(_Rate);
const index$G = "";
const TreeSelect = withFieldWrap(_TreeSelect);
const index$F = "";
var CheckBox = function CheckBox2(_a) {
var title = _a.title, rest = __rest(_a, ["title"]);
return /* @__PURE__ */ React__default.default.createElement(
React__default.default.Fragment,
null,
/* @__PURE__ */ React__default.default.createElement(_Checkbox, Object.assign({}, rest)),
/* @__PURE__ */ jsx("span", {
style: {
marginLeft: "12px"
},
children: title
})
);
};
const Checkbox = withFieldWrap(CheckBox);
var Checkboxes = function Checkboxes2(props) {
var _props$direction = props.direction, direction = _props$direction === void 0 ? "row" : _props$direction, _props$options = props.options, options = _props$options === void 0 ? [] : _props$options, rest = __rest(props, ["direction", "options"]);
if (direction === "column") {
return /* @__PURE__ */ React__default.default.createElement(_Checkbox.Group, Object.assign({}, rest), /* @__PURE__ */ React__default.default.createElement(_Space, {
direction: "vertical"
}, options.map(function(item) {
var value = item.value, label = item.label, rest2 = __rest(item, ["value", "label"]);
return /* @__PURE__ */ React__default.default.createElement(_Checkbox, Object.assign({
key: value,
value
}, rest2), label);
})));
}
return /* @__PURE__ */ React__default.default.createElement(_Checkbox.Group, Object.assign({}, rest, {
options
}));
};
const Checkboxes$1 = withFieldWrap(Checkboxes);
var lib$1 = { exports: {} };
var ColorPicker$1 = { exports: {} };
var propTypes = { exports: {} };
var ReactPropTypesSecret$1 = "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";
var ReactPropTypesSecret_1 = ReactPropTypesSecret$1;
var ReactPropTypesSecret = ReactPropTypesSecret_1;
function emptyFunction() {
}
function emptyFunctionWithReset() {
}
emptyFunctionWithReset.resetWarningCache = emptyFunction;
var factoryWithThrowingShims = function() {
function shim2(props, propName, componentName, location2, propFullName, secret) {
if (secret === ReactPropTypesSecret) {
return;
}
var err = new Error(
"Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types"
);
err.name = "Invariant Violation";
throw err;
}
shim2.isRequired = shim2;
function getShim() {
return shim2;
}
var ReactPropTypes = {
array: shim2,
bigint: shim2,
bool: shim2,
func: shim2,
number: shim2,
object: shim2,
string: shim2,
symbol: shim2,
any: shim2,
arrayOf: getShim,
element: shim2,
elementType: shim2,
instanceOf: getShim,
node: shim2,
objectOf: getShim,
oneOf: getShim,
oneOfType: getShim,
shape: getShim,
exact: getShim,
checkPropTypes: emptyFunctionWithReset,
resetWarningCache: emptyFunction
};
ReactPropTypes.PropTypes = ReactPropTypes;
return ReactPropTypes;
};
{
propTypes.exports = factoryWithThrowingShims();
}
var assign$1 = { exports: {} };
var _global$1 = { exports: {} };
var global$5 = _global$1.exports = typeof window != "undefined" && window.Math == Math ? window : typeof self != "undefined" && self.Math == Math ? self : Function("return this")();
if (typeof __g == "number")
__g = global$5;
var _core = { exports: {} };
var core$3 = _core.exports = { version: "2.6.12" };
if (typeof __e == "number")
__e = core$3;
var _aFunction = function(it) {
if (typeof it != "function")
throw TypeError(it + " is not a function!");
return it;
};
var aFunction = _aFunction;
var _ctx = function(fn, that, length) {
aFunction(fn);
if (that === void 0)
return fn;
switch (length) {
case 1:
return function(a) {
return fn.call(that, a);
};
case 2:
return function(a, b2) {
return fn.call(that, a, b2);
};
case 3:
return function(a, b2, c2) {
return fn.call(that, a, b2, c2);
};
}
return function() {
return fn.apply(that, arguments);
};
};
var _objectDp = {};
var _isObject = function(it) {
return typeof it === "object" ? it !== null : typeof it === "function";
};
var isObject$4 = _isObject;
var _anObject = function(it) {
if (!isObject$4(it))
throw TypeError(it + " is not an object!");
return it;
};
var _fails = function(exec) {
try {
return !!exec();
} catch (e2) {
return true;
}
};
var _descriptors = !_fails(function() {
return Object.defineProperty({}, "a", { get: function() {
return 7;
} }).a != 7;
});
var _domCreate;
var hasRequired_domCreate;
function require_domCreate() {
if (hasRequired_domCreate)
return _domCreate;
hasRequired_domCreate = 1;
var isObject2 = _isObject;
var document2 = _global$1.exports.document;
var is = isObject2(document2) && isObject2(document2.createElement);
_domCreate = function(it) {
return is ? document2.createElement(it) : {};
};
return _domCreate;
}
var _ie8DomDefine = !_descriptors && !_fails(function() {
return Object.defineProperty(require_domCreate()("div"), "a", { get: function() {
return 7;
} }).a != 7;
});
var isObject$3 = _isObject;
var _toPrimitive$5 = function(it, S) {
if (!isObject$3(it))
return it;
var fn, val;
if (S && typeof (fn = it.toString) == "function" && !isObject$3(val = fn.call(it)))
return val;
if (typeof (fn = it.valueOf) == "function" && !isObject$3(val = fn.call(it)))
return val;
if (!S && typeof (fn = it.toString) == "function" && !isObject$3(val = fn.call(it)))
return val;
throw TypeError("Can't convert object to primitive value");
};
var anObject$3 = _anObject;
var IE8_DOM_DEFINE$1 = _ie8DomDefine;
var toPrimitive$3 = _toPrimitive$5;
var dP$3 = Object.defineProperty;
_objectDp.f = _descriptors ? Object.defineProperty : function defineProperty2(O, P, Attributes) {
anObject$3(O);
P = toPrimitive$3(P, true);
anObject$3(Attributes);
if (IE8_DOM_DEFINE$1)
try {
return dP$3(O, P, Attributes);
} catch (e2) {
}
if ("get" in Attributes || "set" in Attributes)
throw TypeError("Accessors not supported!");
if ("value" in Attributes)
O[P] = Attributes.value;
return O;
};
var _propertyDesc = function(bitmap, value) {
return {
enumerable: !(bitmap & 1),
configurable: !(bitmap & 2),
writable: !(bitmap & 4),
value
};
};
var dP$2 = _objectDp;
var createDesc$2 = _propertyDesc;
var _hide = _descriptors ? function(object2, key2, value) {
return dP$2.f(object2, key2, createDesc$2(1, value));
} : function(object2, key2, value) {
object2[key2] = value;
return object2;
};
var hasOwnProperty$2 = {}.hasOwnProperty;
var _has = function(it, key2) {
return hasOwnProperty$2.call(it, key2);
};
var global$4 = _global$1.exports;
var core$2 = _core.exports;
var ctx = _ctx;
var hide$2 = _hide;
var has$5 = _has;
var PROTOTYPE$2 = "prototype";
var $export$6 = function(type2, name2, source) {
var IS_FORCED = type2 & $export$6.F;
var IS_GLOBAL = type2 & $export$6.G;
var IS_STATIC = type2 & $export$6.S;
var IS_PROTO = type2 & $export$6.P;
var IS_BIND = type2 & $export$6.B;
var IS_WRAP = type2 & $export$6.W;
var exports2 = IS_GLOBAL ? core$2 : core$2[name2] || (core$2[name2] = {});
var expProto = exports2[PROTOTYPE$2];
var target = IS_GLOBAL ? global$4 : IS_STATIC ? global$4[name2] : (global$4[name2] || {})[PROTOTYPE$2];
var key2, own, out;
if (IS_GLOBAL)
source = name2;
for (key2 in source) {
own = !IS_FORCED && target && target[key2] !== void 0;
if (own && has$5(exports2, key2))
continue;
out = own ? target[key2] : source[key2];
exports2[key2] = IS_GLOBAL && typeof target[key2] != "function" ? source[key2] : IS_BIND && own ? ctx(out, global$4) : IS_WRAP && target[key2] == out ? function(C) {
var F = function(a, b2, c2) {
if (this instanceof C) {
switch (arguments.length) {
case 0:
return new C();
case 1:
return new C(a);
case 2:
return new C(a, b2);
}
return new C(a, b2, c2);
}
return C.apply(this, arguments);
};
F[PROTOTYPE$2] = C[PROTOTYPE$2];
return F;
}(out) : IS_PROTO && typeof out == "function" ? ctx(Function.call, out) : out;
if (IS_PROTO) {
(exports2.virtual || (exports2.virtual = {}))[key2] = out;
if (type2 & $export$6.R && expProto && !expProto[key2])
hide$2(expProto, key2, out);
}
}
};
$export$6.F = 1;
$export$6.G = 2;
$export$6.S = 4;
$export$6.P = 8;
$export$6.B = 16;
$export$6.W = 32;
$export$6.U = 64;
$export$6.R = 128;
var _export = $export$6;
var _cof;
var hasRequired_cof;
function require_cof() {
if (hasRequired_cof)
return _cof;
hasRequired_cof = 1;
var toString2 = {}.toString;
_cof = function(it) {
return toString2.call(it).slice(8, -1);
};
return _cof;
}
var _iobject;
var hasRequired_iobject;
function require_iobject() {
if (hasRequired_iobject)
return _iobject;
hasRequired_iobject = 1;
var cof2 = require_cof();
_iobject = Object("z").propertyIsEnumerable(0) ? Object : function(it) {
return cof2(it) == "String" ? it.split("") : Object(it);
};
return _iobject;
}
var _defined;
var hasRequired_defined;
function require_defined() {
if (hasRequired_defined)
return _defined;
hasRequired_defined = 1;
_defined = function(it) {
if (it == void 0)
throw TypeError("Can't call method on " + it);
return it;
};
return _defined;
}
var IObject = require_iobject();
var defined$1 = require_defined();
var _toIobject = function(it) {
return IObject(defined$1(it));
};
var ceil = Math.ceil;
var floor = Math.floor;
var _toInteger = function(it) {
return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
};
var _toLength;
var hasRequired_toLength;
function require_toLength() {
if (hasRequired_toLength)
return _toLength;
hasRequired_toLength = 1;
var toInteger2 = _toInteger;
var min = Math.min;
_toLength = function(it) {
return it > 0 ? min(toInteger2(it), 9007199254740991) : 0;
};
return _toLength;
}
var _toAbsoluteIndex;
var hasRequired_toAbsoluteIndex;
function require_toAbsoluteIndex() {
if (hasRequired_toAbsoluteIndex)
return _toAbsoluteIndex;
hasRequired_toAbsoluteIndex = 1;
var toInteger2 = _toInteger;
var max = Math.max;
var min = Math.min;
_toAbsoluteIndex = function(index2, length) {
index2 = toInteger2(index2);
return index2 < 0 ? max(index2 + length, 0) : min(index2, length);
};
return _toAbsoluteIndex;
}
var _arrayIncludes;
var hasRequired_arrayIncludes;
function require_arrayIncludes() {
if (hasRequired_arrayIncludes)
return _arrayIncludes;
hasRequired_arrayIncludes = 1;
var toIObject2 = _toIobject;
var toLength = require_toLength();
var toAbsoluteIndex = require_toAbsoluteIndex();
_arrayIncludes = function(IS_INCLUDES) {
return function($this, el, fromIndex) {
var O = toIObject2($this);
var length = toLength(O.length);
var index2 = toAbsoluteIndex(fromIndex, length);
var value;
if (IS_INCLUDES && el != el)
while (length > index2) {
value = O[index2++];
if (value != value)
return true;
}
else
for (; length > index2; index2++)
if (IS_INCLUDES || index2 in O) {
if (O[index2] === el)
return IS_INCLUDES || index2 || 0;
}
return !IS_INCLUDES && -1;
};
};
return _arrayIncludes;
}
var _shared = { exports: {} };
var _library = true;
var core$1 = _core.exports;
var global$3 = _global$1.exports;
var SHARED = "__core-js_shared__";
var store$1 = global$3[SHARED] || (global$3[SHARED] = {});
(_shared.exports = function(key2, value) {
return store$1[key2] || (store$1[key2] = value !== void 0 ? value : {});
})("versions", []).push({
version: core$1.version,
mode: "pure",
copyright: "\xA9 2020 Denis Pushkarev (zloirock.ru)"
});
var id$1 = 0;
var px = Math.random();
var _uid = function(key2) {
return "Symbol(".concat(key2 === void 0 ? "" : key2, ")_", (++id$1 + px).toString(36));
};
var shared$1 = _shared.exports("keys");
var uid$2 = _uid;
var _sharedKey = function(key2) {
return shared$1[key2] || (shared$1[key2] = uid$2(key2));
};
var _objectKeysInternal;
var hasRequired_objectKeysInternal;
function require_objectKeysInternal() {
if (hasRequired_objectKeysInternal)
return _objectKeysInternal;
hasRequired_objectKeysInternal = 1;
var has2 = _has;
var toIObject2 = _toIobject;
var arrayIndexOf = require_arrayIncludes()(false);
var IE_PROTO2 = _sharedKey("IE_PROTO");
_objectKeysInternal = function(object2, names2) {
var O = toIObject2(object2);
var i2 = 0;
var result = [];
var key2;
for (key2 in O)
if (key2 != IE_PROTO2)
has2(O, key2) && result.push(key2);
while (names2.length > i2)
if (has2(O, key2 = names2[i2++])) {
~arrayIndexOf(result, key2) || result.push(key2);
}
return result;
};
return _objectKeysInternal;
}
var _enumBugKeys = "constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",");
var _objectKeys;
var hasRequired_objectKeys;
function require_objectKeys() {
if (hasRequired_objectKeys)
return _objectKeys;
hasRequired_objectKeys = 1;
var $keys2 = require_objectKeysInternal();
var enumBugKeys2 = _enumBugKeys;
_objectKeys = Object.keys || function keys2(O) {
return $keys2(O, enumBugKeys2);
};
return _objectKeys;
}
var _objectGops = {};
var hasRequired_objectGops;
function require_objectGops() {
if (hasRequired_objectGops)
return _objectGops;
hasRequired_objectGops = 1;
_objectGops.f = Object.getOwnPropertySymbols;
return _objectGops;
}
var _objectPie = {};
var hasRequired_objectPie;
function require_objectPie() {
if (hasRequired_objectPie)
return _objectPie;
hasRequired_objectPie = 1;
_objectPie.f = {}.propertyIsEnumerable;
return _objectPie;
}
var _toObject;
var hasRequired_toObject;
function require_toObject() {
if (hasRequired_toObject)
return _toObject;
hasRequired_toObject = 1;
var defined2 = require_defined();
_toObject = function(it) {
return Object(defined2(it));
};
return _toObject;
}
var _objectAssign;
var hasRequired_objectAssign;
function require_objectAssign() {
if (hasRequired_objectAssign)
return _objectAssign;
hasRequired_objectAssign = 1;
var DESCRIPTORS2 = _descriptors;
var getKeys2 = require_objectKeys();
var gOPS2 = require_objectGops();
var pIE2 = require_objectPie();
var toObject2 = require_toObject();
var IObject2 = require_iobject();
var $assign = Object.assign;
_objectAssign = !$assign || _fails(function() {
var A2 = {};
var B = {};
var S = Symbol();
var K = "abcdefghijklmnopqrst";
A2[S] = 7;
K.split("").forEach(function(k2) {
B[k2] = k2;
});
return $assign({}, A2)[S] != 7 || Object.keys($assign({}, B)).join("") != K;
}) ? function assign2(target, source) {
var T = toObject2(target);
var aLen = arguments.length;
var index2 = 1;
var getSymbols2 = gOPS2.f;
var isEnum2 = pIE2.f;
while (aLen > index2) {
var S = IObject2(arguments[index2++]);
var keys2 = getSymbols2 ? getKeys2(S).concat(getSymbols2(S)) : getKeys2(S);
var length = keys2.length;
var j2 = 0;
var key2;
while (length > j2) {
key2 = keys2[j2++];
if (!DESCRIPTORS2 || isEnum2.call(S, key2))
T[key2] = S[key2];
}
}
return T;
} : $assign;
return _objectAssign;
}
var $export$5 = _export;
$export$5($export$5.S + $export$5.F, "Object", { assign: require_objectAssign() });
var assign = _core.exports.Object.assign;
(function(module2) {
module2.exports = { "default": assign, __esModule: true };
})(assign$1);
var _assign$1 = assign$1.exports;
var _assign2 = _interopRequireDefault$g(_assign$1);
function _interopRequireDefault$g(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
var _default$i = _assign2.default || function(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = arguments[i2];
for (var key2 in source) {
if (Object.prototype.hasOwnProperty.call(source, key2)) {
target[key2] = source[key2];
}
}
}
return target;
};
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
var hasOwnProperty$1 = Object.prototype.hasOwnProperty;
var propIsEnumerable = Object.prototype.propertyIsEnumerable;
function toObject$2(val) {
if (val === null || val === void 0) {
throw new TypeError("Object.assign cannot be called with null or undefined");
}
return Object(val);
}
function shouldUseNative() {
try {
if (!Object.assign) {
return false;
}
var test1 = new String("abc");
test1[5] = "de";
if (Object.getOwnPropertyNames(test1)[0] === "5") {
return false;
}
var test2 = {};
for (var i2 = 0; i2 < 10; i2++) {
test2["_" + String.fromCharCode(i2)] = i2;
}
var order2 = Object.getOwnPropertyNames(test2).map(function(n2) {
return test2[n2];
});
if (order2.join("") !== "0123456789") {
return false;
}
var test3 = {};
"abcdefghijklmnopqrst".split("").forEach(function(letter) {
test3[letter] = letter;
});
if (Object.keys(Object.assign({}, test3)).join("") !== "abcdefghijklmnopqrst") {
return false;
}
return true;
} catch (err) {
return false;
}
}
var objectAssign = shouldUseNative() ? Object.assign : function(target, source) {
var from;
var to = toObject$2(target);
var symbols;
for (var s = 1; s < arguments.length; s++) {
from = Object(arguments[s]);
for (var key2 in from) {
if (hasOwnProperty$1.call(from, key2)) {
to[key2] = from[key2];
}
}
if (getOwnPropertySymbols) {
symbols = getOwnPropertySymbols(from);
for (var i2 = 0; i2 < symbols.length; i2++) {
if (propIsEnumerable.call(from, symbols[i2])) {
to[symbols[i2]] = from[symbols[i2]];
}
}
}
}
return to;
};
var _assign = objectAssign;
var emptyObject = {};
function _invariant(condition, format2, a, b2, c2, d2, e2, f2) {
if (!condition) {
var error;
if (format2 === void 0) {
error = new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");
} else {
var args = [a, b2, c2, d2, e2, f2];
var argIndex = 0;
error = new Error(format2.replace(/%s/g, function() {
return args[argIndex++];
}));
error.name = "Invariant Violation";
}
error.framesToPop = 1;
throw error;
}
}
var MIXINS_KEY = "mixins";
function identity(fn) {
return fn;
}
function factory$1(ReactComponent, isValidElement2, ReactNoopUpdateQueue2) {
var injectedMixins = [];
var ReactClassInterface = {
mixins: "DEFINE_MANY",
statics: "DEFINE_MANY",
propTypes: "DEFINE_MANY",
contextTypes: "DEFINE_MANY",
childContextTypes: "DEFINE_MANY",
getDefaultProps: "DEFINE_MANY_MERGED",
getInitialState: "DEFINE_MANY_MERGED",
getChildContext: "DEFINE_MANY_MERGED",
render: "DEFINE_ONCE",
componentWillMount: "DEFINE_MANY",
componentDidMount: "DEFINE_MANY",
componentWillReceiveProps: "DEFINE_MANY",
shouldComponentUpdate: "DEFINE_ONCE",
componentWillUpdate: "DEFINE_MANY",
componentDidUpdate: "DEFINE_MANY",
componentWillUnmount: "DEFINE_MANY",
UNSAFE_componentWillMount: "DEFINE_MANY",
UNSAFE_componentWillReceiveProps: "DEFINE_MANY",
UNSAFE_componentWillUpdate: "DEFINE_MANY",
updateComponent: "OVERRIDE_BASE"
};
var ReactClassStaticInterface = {
getDerivedStateFromProps: "DEFINE_MANY_MERGED"
};
var RESERVED_SPEC_KEYS = {
displayName: function(Constructor, displayName) {
Constructor.displayName = displayName;
},
mixins: function(Constructor, mixins) {
if (mixins) {
for (var i2 = 0; i2 < mixins.length; i2++) {
mixSpecIntoComponent(Constructor, mixins[i2]);
}
}
},
childContextTypes: function(Constructor, childContextTypes) {
Constructor.childContextTypes = _assign(
{},
Constructor.childContextTypes,
childContextTypes
);
},
contextTypes: function(Constructor, contextTypes) {
Constructor.contextTypes = _assign(
{},
Constructor.contextTypes,
contextTypes
);
},
getDefaultProps: function(Constructor, getDefaultProps) {
if (Constructor.getDefaultProps) {
Constructor.getDefaultProps = createMergedResultFunction(
Constructor.getDefaultProps,
getDefaultProps
);
} else {
Constructor.getDefaultProps = getDefaultProps;
}
},
propTypes: function(Constructor, propTypes2) {
Constructor.propTypes = _assign({}, Constructor.propTypes, propTypes2);
},
statics: function(Constructor, statics) {
mixStaticSpecIntoComponent(Constructor, statics);
},
autobind: function() {
}
};
function validateMethodOverride(isAlreadyDefined, name2) {
var specPolicy = ReactClassInterface.hasOwnProperty(name2) ? ReactClassInterface[name2] : null;
if (ReactClassMixin.hasOwnProperty(name2)) {
_invariant(
specPolicy === "OVERRIDE_BASE",
"ReactClassInterface: You are attempting to override `%s` from your class specification. Ensure that your method names do not overlap with React methods.",
name2
);
}
if (isAlreadyDefined) {
_invariant(
specPolicy === "DEFINE_MANY" || specPolicy === "DEFINE_MANY_MERGED",
"ReactClassInterface: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.",
name2
);
}
}
function mixSpecIntoComponent(Constructor, spec) {
if (!spec) {
return;
}
_invariant(
typeof spec !== "function",
"ReactClass: You're attempting to use a component class or function as a mixin. Instead, just use a regular object."
);
_invariant(
!isValidElement2(spec),
"ReactClass: You're attempting to use a component as a mixin. Instead, just use a regular object."
);
var proto2 = Constructor.prototype;
var autoBindPairs = proto2.__reactAutoBindPairs;
if (spec.hasOwnProperty(MIXINS_KEY)) {
RESERVED_SPEC_KEYS.mixins(Constructor, spec.mixins);
}
for (var name2 in spec) {
if (!spec.hasOwnProperty(name2)) {
continue;
}
if (name2 === MIXINS_KEY) {
continue;
}
var property2 = spec[name2];
var isAlreadyDefined = proto2.hasOwnProperty(name2);
validateMethodOverride(isAlreadyDefined, name2);
if (RESERVED_SPEC_KEYS.hasOwnProperty(name2)) {
RESERVED_SPEC_KEYS[name2](Constructor, property2);
} else {
var isReactClassMethod = ReactClassInterface.hasOwnProperty(name2);
var isFunction2 = typeof property2 === "function";
var shouldAutoBind = isFunction2 && !isReactClassMethod && !isAlreadyDefined && spec.autobind !== false;
if (shouldAutoBind) {
autoBindPairs.push(name2, property2);
proto2[name2] = property2;
} else {
if (isAlreadyDefined) {
var specPolicy = ReactClassInterface[name2];
_invariant(
isReactClassMethod && (specPolicy === "DEFINE_MANY_MERGED" || specPolicy === "DEFINE_MANY"),
"ReactClass: Unexpected spec policy %s for key %s when mixing in component specs.",
specPolicy,
name2
);
if (specPolicy === "DEFINE_MANY_MERGED") {
proto2[name2] = createMergedResultFunction(proto2[name2], property2);
} else if (specPolicy === "DEFINE_MANY") {
proto2[name2] = createChainedFunction(proto2[name2], property2);
}
} else {
proto2[name2] = property2;
}
}
}
}
}
function mixStaticSpecIntoComponent(Constructor, statics) {
if (!statics) {
return;
}
for (var name2 in statics) {
var property2 = statics[name2];
if (!statics.hasOwnProperty(name2)) {
continue;
}
var isReserved = name2 in RESERVED_SPEC_KEYS;
_invariant(
!isReserved,
'ReactClass: You are attempting to define a reserved property, `%s`, that shouldn\'t be on the "statics" key. Define it as an instance property instead; it will still be accessible on the constructor.',
name2
);
var isAlreadyDefined = name2 in Constructor;
if (isAlreadyDefined) {
var specPolicy = ReactClassStaticInterface.hasOwnProperty(name2) ? ReactClassStaticInterface[name2] : null;
_invariant(
specPolicy === "DEFINE_MANY_MERGED",
"ReactClass: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.",
name2
);
Constructor[name2] = createMergedResultFunction(Constructor[name2], property2);
return;
}
Constructor[name2] = property2;
}
}
function mergeIntoWithNoDuplicateKeys(one, two) {
_invariant(
one && two && typeof one === "object" && typeof two === "object",
"mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects."
);
for (var key2 in two) {
if (two.hasOwnProperty(key2)) {
_invariant(
one[key2] === void 0,
"mergeIntoWithNoDuplicateKeys(): Tried to merge two objects with the same key: `%s`. This conflict may be due to a mixin; in particular, this may be caused by two getInitialState() or getDefaultProps() methods returning objects with clashing keys.",
key2
);
one[key2] = two[key2];
}
}
return one;
}
function createMergedResultFunction(one, two) {
return function mergedResult() {
var a = one.apply(this, arguments);
var b2 = two.apply(this, arguments);
if (a == null) {
return b2;
} else if (b2 == null) {
return a;
}
var c2 = {};
mergeIntoWithNoDuplicateKeys(c2, a);
mergeIntoWithNoDuplicateKeys(c2, b2);
return c2;
};
}
function createChainedFunction(one, two) {
return function chainedFunction() {
one.apply(this, arguments);
two.apply(this, arguments);
};
}
function bindAutoBindMethod(component, method2) {
var boundMethod = method2.bind(component);
return boundMethod;
}
function bindAutoBindMethods(component) {
var pairs = component.__reactAutoBindPairs;
for (var i2 = 0; i2 < pairs.length; i2 += 2) {
var autoBindKey = pairs[i2];
var method2 = pairs[i2 + 1];
component[autoBindKey] = bindAutoBindMethod(component, method2);
}
}
var IsMountedPreMixin = {
componentDidMount: function() {
this.__isMounted = true;
}
};
var IsMountedPostMixin = {
componentWillUnmount: function() {
this.__isMounted = false;
}
};
var ReactClassMixin = {
replaceState: function(newState, callback) {
this.updater.enqueueReplaceState(this, newState, callback);
},
isMounted: function() {
return !!this.__isMounted;
}
};
var ReactClassComponent = function() {
};
_assign(
ReactClassComponent.prototype,
ReactComponent.prototype,
ReactClassMixin
);
function createClass(spec) {
var Constructor = identity(function(props, context2, updater) {
if (this.__reactAutoBindPairs.length) {
bindAutoBindMethods(this);
}
this.props = props;
this.context = context2;
this.refs = emptyObject;
this.updater = updater || ReactNoopUpdateQueue2;
this.state = null;
var initialState = this.getInitialState ? this.getInitialState() : null;
_invariant(
typeof initialState === "object" && !Array.isArray(initialState),
"%s.getInitialState(): must return an object or null",
Constructor.displayName || "ReactCompositeComponent"
);
this.state = initialState;
});
Constructor.prototype = new ReactClassComponent();
Constructor.prototype.constructor = Constructor;
Constructor.prototype.__reactAutoBindPairs = [];
injectedMixins.forEach(mixSpecIntoComponent.bind(null, Constructor));
mixSpecIntoComponent(Constructor, IsMountedPreMixin);
mixSpecIntoComponent(Constructor, spec);
mixSpecIntoComponent(Constructor, IsMountedPostMixin);
if (Constructor.getDefaultProps) {
Constructor.defaultProps = Constructor.getDefaultProps();
}
_invariant(
Constructor.prototype.render,
"createClass(...): Class specification must implement a `render` method."
);
for (var methodName in ReactClassInterface) {
if (!Constructor.prototype[methodName]) {
Constructor.prototype[methodName] = null;
}
}
return Constructor;
}
return createClass;
}
var factory_1 = factory$1;
var React$9 = React__default.default;
var factory = factory_1;
if (typeof React$9 === "undefined") {
throw Error(
"create-react-class could not find the React object. If you are using script tags, make sure that React is being loaded before create-react-class."
);
}
var ReactNoopUpdateQueue = new React$9.Component().updater;
var createReactClass = factory(
React$9.Component,
React$9.isValidElement,
ReactNoopUpdateQueue
);
function contains$1(root2, n2) {
var node = n2;
while (node) {
if (node === root2) {
return true;
}
node = node.parentNode;
}
return false;
}
var addEventListener$1 = {};
var lib = { exports: {} };
var EventObject = { exports: {} };
var EventBaseObject = { exports: {} };
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
function returnFalse() {
return false;
}
function returnTrue() {
return true;
}
function EventBaseObject2() {
this.timeStamp = Date.now();
this.target = void 0;
this.currentTarget = void 0;
}
EventBaseObject2.prototype = {
isEventObject: 1,
constructor: EventBaseObject2,
isDefaultPrevented: returnFalse,
isPropagationStopped: returnFalse,
isImmediatePropagationStopped: returnFalse,
preventDefault: function preventDefault() {
this.isDefaultPrevented = returnTrue;
},
stopPropagation: function stopPropagation() {
this.isPropagationStopped = returnTrue;
},
stopImmediatePropagation: function stopImmediatePropagation() {
this.isImmediatePropagationStopped = returnTrue;
this.stopPropagation();
},
halt: function halt(immediate) {
if (immediate) {
this.stopImmediatePropagation();
} else {
this.stopPropagation();
}
this.preventDefault();
}
};
exports2["default"] = EventBaseObject2;
module2.exports = exports2["default"];
})(EventBaseObject, EventBaseObject.exports);
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
function _interopRequireDefault2(obj) {
return obj && obj.__esModule ? obj : { "default": obj };
}
var _EventBaseObject = EventBaseObject.exports;
var _EventBaseObject2 = _interopRequireDefault2(_EventBaseObject);
var _objectAssign2 = objectAssign;
var _objectAssign22 = _interopRequireDefault2(_objectAssign2);
var TRUE = true;
var FALSE = false;
var commonProps = ["altKey", "bubbles", "cancelable", "ctrlKey", "currentTarget", "eventPhase", "metaKey", "shiftKey", "target", "timeStamp", "view", "type"];
function isNullOrUndefined(w2) {
return w2 === null || w2 === void 0;
}
var eventNormalizers = [{
reg: /^key/,
props: ["char", "charCode", "key", "keyCode", "which"],
fix: function fix(event, nativeEvent) {
if (isNullOrUndefined(event.which)) {
event.which = !isNullOrUndefined(nativeEvent.charCode) ? nativeEvent.charCode : nativeEvent.keyCode;
}
if (event.metaKey === void 0) {
event.metaKey = event.ctrlKey;
}
}
}, {
reg: /^touch/,
props: ["touches", "changedTouches", "targetTouches"]
}, {
reg: /^hashchange$/,
props: ["newURL", "oldURL"]
}, {
reg: /^gesturechange$/i,
props: ["rotation", "scale"]
}, {
reg: /^(mousewheel|DOMMouseScroll)$/,
props: [],
fix: function fix(event, nativeEvent) {
var deltaX = void 0;
var deltaY = void 0;
var delta = void 0;
var wheelDelta = nativeEvent.wheelDelta;
var axis = nativeEvent.axis;
var wheelDeltaY = nativeEvent.wheelDeltaY;
var wheelDeltaX = nativeEvent.wheelDeltaX;
var detail = nativeEvent.detail;
if (wheelDelta) {
delta = wheelDelta / 120;
}
if (detail) {
delta = 0 - (detail % 3 === 0 ? detail / 3 : detail);
}
if (axis !== void 0) {
if (axis === event.HORIZONTAL_AXIS) {
deltaY = 0;
deltaX = 0 - delta;
} else if (axis === event.VERTICAL_AXIS) {
deltaX = 0;
deltaY = delta;
}
}
if (wheelDeltaY !== void 0) {
deltaY = wheelDeltaY / 120;
}
if (wheelDeltaX !== void 0) {
deltaX = -1 * wheelDeltaX / 120;
}
if (!deltaX && !deltaY) {
deltaY = delta;
}
if (deltaX !== void 0) {
event.deltaX = deltaX;
}
if (deltaY !== void 0) {
event.deltaY = deltaY;
}
if (delta !== void 0) {
event.delta = delta;
}
}
}, {
reg: /^mouse|contextmenu|click|mspointer|(^DOMMouseScroll$)/i,
props: ["buttons", "clientX", "clientY", "button", "offsetX", "relatedTarget", "which", "fromElement", "toElement", "offsetY", "pageX", "pageY", "screenX", "screenY"],
fix: function fix(event, nativeEvent) {
var eventDoc = void 0;
var doc = void 0;
var body = void 0;
var target = event.target;
var button = nativeEvent.button;
if (target && isNullOrUndefined(event.pageX) && !isNullOrUndefined(nativeEvent.clientX)) {
eventDoc = target.ownerDocument || document;
doc = eventDoc.documentElement;
body = eventDoc.body;
event.pageX = nativeEvent.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
event.pageY = nativeEvent.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
}
if (!event.which && button !== void 0) {
if (button & 1) {
event.which = 1;
} else if (button & 2) {
event.which = 3;
} else if (button & 4) {
event.which = 2;
} else {
event.which = 0;
}
}
if (!event.relatedTarget && event.fromElement) {
event.relatedTarget = event.fromElement === target ? event.toElement : event.fromElement;
}
return event;
}
}];
function retTrue() {
return TRUE;
}
function retFalse() {
return FALSE;
}
function DomEventObject(nativeEvent) {
var type2 = nativeEvent.type;
var isNative = typeof nativeEvent.stopPropagation === "function" || typeof nativeEvent.cancelBubble === "boolean";
_EventBaseObject2["default"].call(this);
this.nativeEvent = nativeEvent;
var isDefaultPrevented = retFalse;
if ("defaultPrevented" in nativeEvent) {
isDefaultPrevented = nativeEvent.defaultPrevented ? retTrue : retFalse;
} else if ("getPreventDefault" in nativeEvent) {
isDefaultPrevented = nativeEvent.getPreventDefault() ? retTrue : retFalse;
} else if ("returnValue" in nativeEvent) {
isDefaultPrevented = nativeEvent.returnValue === FALSE ? retTrue : retFalse;
}
this.isDefaultPrevented = isDefaultPrevented;
var fixFns = [];
var fixFn = void 0;
var l2 = void 0;
var prop = void 0;
var props = commonProps.concat();
eventNormalizers.forEach(function(normalizer) {
if (type2.match(normalizer.reg)) {
props = props.concat(normalizer.props);
if (normalizer.fix) {
fixFns.push(normalizer.fix);
}
}
});
l2 = props.length;
while (l2) {
prop = props[--l2];
this[prop] = nativeEvent[prop];
}
if (!this.target && isNative) {
this.target = nativeEvent.srcElement || document;
}
if (this.target && this.target.nodeType === 3) {
this.target = this.target.parentNode;
}
l2 = fixFns.length;
while (l2) {
fixFn = fixFns[--l2];
fixFn(this, nativeEvent);
}
this.timeStamp = nativeEvent.timeStamp || Date.now();
}
var EventBaseObjectProto = _EventBaseObject2["default"].prototype;
(0, _objectAssign22["default"])(DomEventObject.prototype, EventBaseObjectProto, {
constructor: DomEventObject,
preventDefault: function preventDefault() {
var e2 = this.nativeEvent;
if (e2.preventDefault) {
e2.preventDefault();
} else {
e2.returnValue = FALSE;
}
EventBaseObjectProto.preventDefault.call(this);
},
stopPropagation: function stopPropagation() {
var e2 = this.nativeEvent;
if (e2.stopPropagation) {
e2.stopPropagation();
} else {
e2.cancelBubble = TRUE;
}
EventBaseObjectProto.stopPropagation.call(this);
}
});
exports2["default"] = DomEventObject;
module2.exports = exports2["default"];
})(EventObject, EventObject.exports);
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
exports2["default"] = addEventListener2;
function _interopRequireDefault2(obj) {
return obj && obj.__esModule ? obj : { "default": obj };
}
var _EventObject = EventObject.exports;
var _EventObject2 = _interopRequireDefault2(_EventObject);
function addEventListener2(target, eventType, callback, option) {
function wrapCallback(e2) {
var ne = new _EventObject2["default"](e2);
callback.call(target, ne);
}
if (target.addEventListener) {
var _ret = function() {
var useCapture = false;
if (typeof option === "object") {
useCapture = option.capture || false;
} else if (typeof option === "boolean") {
useCapture = option;
}
target.addEventListener(eventType, wrapCallback, option || false);
return {
v: {
remove: function remove() {
target.removeEventListener(eventType, wrapCallback, useCapture);
}
}
};
}();
if (typeof _ret === "object")
return _ret.v;
} else if (target.attachEvent) {
target.attachEvent("on" + eventType, wrapCallback);
return {
remove: function remove() {
target.detachEvent("on" + eventType, wrapCallback);
}
};
}
}
module2.exports = exports2["default"];
})(lib, lib.exports);
const addDOMEventListener = /* @__PURE__ */ getDefaultExportFromCjs(lib.exports);
Object.defineProperty(addEventListener$1, "__esModule", {
value: true
});
var _default$h = addEventListener$1.default = addEventListenerWrap$1;
var _addDomEventListener = _interopRequireDefault$f(lib.exports);
var _reactDom$1 = _interopRequireDefault$f(ReactDOM__default.default);
function _interopRequireDefault$f(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
function addEventListenerWrap$1(target, eventType, cb, option) {
var callback = _reactDom$1.default.unstable_batchedUpdates ? function run(e2) {
_reactDom$1.default.unstable_batchedUpdates(cb, e2);
} : cb;
return (0, _addDomEventListener.default)(target, eventType, callback, option);
}
var _default$g = function(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
};
var defineProperty$3 = { exports: {} };
var $export$4 = _export;
$export$4($export$4.S + $export$4.F * !_descriptors, "Object", { defineProperty: _objectDp.f });
var $Object$1 = _core.exports.Object;
var defineProperty$2 = function defineProperty2(it, key2, desc) {
return $Object$1.defineProperty(it, key2, desc);
};
(function(module2) {
module2.exports = { "default": defineProperty$2, __esModule: true };
})(defineProperty$3);
var _defineProperty$7 = defineProperty$3.exports;
var _defineProperty2$1 = _interopRequireDefault$e(_defineProperty$7);
function _interopRequireDefault$e(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
var _default$f = function() {
function defineProperties(target, props) {
for (var i2 = 0; i2 < props.length; i2++) {
var descriptor2 = props[i2];
descriptor2.enumerable = descriptor2.enumerable || false;
descriptor2.configurable = true;
if ("value" in descriptor2)
descriptor2.writable = true;
(0, _defineProperty2$1.default)(target, descriptor2.key, descriptor2);
}
}
return function(Constructor, protoProps, staticProps) {
if (protoProps)
defineProperties(Constructor.prototype, protoProps);
if (staticProps)
defineProperties(Constructor, staticProps);
return Constructor;
};
}();
var _typeof$i = {};
var iterator$1 = { exports: {} };
var toInteger = _toInteger;
var defined = require_defined();
var _stringAt = function(TO_STRING) {
return function(that, pos) {
var s = String(defined(that));
var i2 = toInteger(pos);
var l2 = s.length;
var a, b2;
if (i2 < 0 || i2 >= l2)
return TO_STRING ? "" : void 0;
a = s.charCodeAt(i2);
return a < 55296 || a > 56319 || i2 + 1 === l2 || (b2 = s.charCodeAt(i2 + 1)) < 56320 || b2 > 57343 ? TO_STRING ? s.charAt(i2) : a : TO_STRING ? s.slice(i2, i2 + 2) : (a - 55296 << 10) + (b2 - 56320) + 65536;
};
};
var _redefine = { exports: {} };
(function(module2) {
module2.exports = _hide;
})(_redefine);
var _iterators = {};
var dP$1 = _objectDp;
var anObject$2 = _anObject;
var getKeys$1 = require_objectKeys();
var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties) {
anObject$2(O);
var keys2 = getKeys$1(Properties);
var length = keys2.length;
var i2 = 0;
var P;
while (length > i2)
dP$1.f(O, P = keys2[i2++], Properties[P]);
return O;
};
var _html;
var hasRequired_html;
function require_html() {
if (hasRequired_html)
return _html;
hasRequired_html = 1;
var document2 = _global$1.exports.document;
_html = document2 && document2.documentElement;
return _html;
}
var anObject$1 = _anObject;
var dPs = _objectDps;
var enumBugKeys = _enumBugKeys;
var IE_PROTO$1 = _sharedKey("IE_PROTO");
var Empty = function() {
};
var PROTOTYPE$1 = "prototype";
var createDict = function() {
var iframe = require_domCreate()("iframe");
var i2 = enumBugKeys.length;
var lt = "<";
var gt = ">";
var iframeDocument;
iframe.style.display = "none";
require_html().appendChild(iframe);
iframe.src = "javascript:";
iframeDocument = iframe.contentWindow.document;
iframeDocument.open();
iframeDocument.write(lt + "script" + gt + "document.F=Object" + lt + "/script" + gt);
iframeDocument.close();
createDict = iframeDocument.F;
while (i2--)
delete createDict[PROTOTYPE$1][enumBugKeys[i2]];
return createDict();
};
var _objectCreate = Object.create || function create2(O, Properties) {
var result;
if (O !== null) {
Empty[PROTOTYPE$1] = anObject$1(O);
result = new Empty();
Empty[PROTOTYPE$1] = null;
result[IE_PROTO$1] = O;
} else
result = createDict();
return Properties === void 0 ? result : dPs(result, Properties);
};
var _wks = { exports: {} };
var store = _shared.exports("wks");
var uid$1 = _uid;
var Symbol$1 = _global$1.exports.Symbol;
var USE_SYMBOL = typeof Symbol$1 == "function";
var $exports = _wks.exports = function(name2) {
return store[name2] || (store[name2] = USE_SYMBOL && Symbol$1[name2] || (USE_SYMBOL ? Symbol$1 : uid$1)("Symbol." + name2));
};
$exports.store = store;
var def = _objectDp.f;
var has$4 = _has;
var TAG = _wks.exports("toStringTag");
var _setToStringTag = function(it, tag, stat) {
if (it && !has$4(it = stat ? it : it.prototype, TAG))
def(it, TAG, { configurable: true, value: tag });
};
var create$2 = _objectCreate;
var descriptor = _propertyDesc;
var setToStringTag$2 = _setToStringTag;
var IteratorPrototype = {};
_hide(IteratorPrototype, _wks.exports("iterator"), function() {
return this;
});
var _iterCreate = function(Constructor, NAME2, next) {
Constructor.prototype = create$2(IteratorPrototype, { next: descriptor(1, next) });
setToStringTag$2(Constructor, NAME2 + " Iterator");
};
var has$3 = _has;
var toObject$1 = require_toObject();
var IE_PROTO = _sharedKey("IE_PROTO");
var ObjectProto$1 = Object.prototype;
var _objectGpo = Object.getPrototypeOf || function(O) {
O = toObject$1(O);
if (has$3(O, IE_PROTO))
return O[IE_PROTO];
if (typeof O.constructor == "function" && O instanceof O.constructor) {
return O.constructor.prototype;
}
return O instanceof Object ? ObjectProto$1 : null;
};
var $export$3 = _export;
var redefine$1 = _redefine.exports;
var hide$1 = _hide;
var Iterators$2 = _iterators;
var $iterCreate = _iterCreate;
var setToStringTag$1 = _setToStringTag;
var getPrototypeOf$1 = _objectGpo;
var ITERATOR = _wks.exports("iterator");
var BUGGY = !([].keys && "next" in [].keys());
var FF_ITERATOR = "@@iterator";
var KEYS = "keys";
var VALUES = "values";
var returnThis = function() {
return this;
};
var _iterDefine = function(Base, NAME2, Constructor, next, DEFAULT, IS_SET, FORCED) {
$iterCreate(Constructor, NAME2, next);
var getMethod = function(kind) {
if (!BUGGY && kind in proto2)
return proto2[kind];
switch (kind) {
case KEYS:
return function keys2() {
return new Constructor(this, kind);
};
case VALUES:
return function values() {
return new Constructor(this, kind);
};
}
return function entries() {
return new Constructor(this, kind);
};
};
var TAG2 = NAME2 + " Iterator";
var DEF_VALUES = DEFAULT == VALUES;
var VALUES_BUG = false;
var proto2 = Base.prototype;
var $native = proto2[ITERATOR] || proto2[FF_ITERATOR] || DEFAULT && proto2[DEFAULT];
var $default = $native || getMethod(DEFAULT);
var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod("entries") : void 0;
var $anyNative = NAME2 == "Array" ? proto2.entries || $native : $native;
var methods, key2, IteratorPrototype2;
if ($anyNative) {
IteratorPrototype2 = getPrototypeOf$1($anyNative.call(new Base()));
if (IteratorPrototype2 !== Object.prototype && IteratorPrototype2.next) {
setToStringTag$1(IteratorPrototype2, TAG2, true);
}
}
if (DEF_VALUES && $native && $native.name !== VALUES) {
VALUES_BUG = true;
$default = function values() {
return $native.call(this);
};
}
if (FORCED && (BUGGY || VALUES_BUG || !proto2[ITERATOR])) {
hide$1(proto2, ITERATOR, $default);
}
Iterators$2[NAME2] = $default;
Iterators$2[TAG2] = returnThis;
if (DEFAULT) {
methods = {
values: DEF_VALUES ? $default : getMethod(VALUES),
keys: IS_SET ? $default : getMethod(KEYS),
entries: $entries
};
if (FORCED)
for (key2 in methods) {
if (!(key2 in proto2))
redefine$1(proto2, key2, methods[key2]);
}
else
$export$3($export$3.P + $export$3.F * (BUGGY || VALUES_BUG), NAME2, methods);
}
return methods;
};
var $at = _stringAt(true);
_iterDefine(String, "String", function(iterated) {
this._t = String(iterated);
this._i = 0;
}, function() {
var O = this._t;
var index2 = this._i;
var point;
if (index2 >= O.length)
return { value: void 0, done: true };
point = $at(O, index2);
this._i += point.length;
return { value: point, done: false };
});
var _iterStep = function(done, value) {
return { value, done: !!done };
};
var step = _iterStep;
var Iterators$1 = _iterators;
var toIObject$3 = _toIobject;
_iterDefine(Array, "Array", function(iterated, kind) {
this._t = toIObject$3(iterated);
this._i = 0;
this._k = kind;
}, function() {
var O = this._t;
var kind = this._k;
var index2 = this._i++;
if (!O || index2 >= O.length) {
this._t = void 0;
return step(1);
}
if (kind == "keys")
return step(0, index2);
if (kind == "values")
return step(0, O[index2]);
return step(0, [index2, O[index2]]);
}, "values");
Iterators$1.Arguments = Iterators$1.Array;
var global$2 = _global$1.exports;
var hide = _hide;
var Iterators = _iterators;
var TO_STRING_TAG = _wks.exports("toStringTag");
var DOMIterables = "CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(",");
for (var i = 0; i < DOMIterables.length; i++) {
var NAME = DOMIterables[i];
var Collection = global$2[NAME];
var proto = Collection && Collection.prototype;
if (proto && !proto[TO_STRING_TAG])
hide(proto, TO_STRING_TAG, NAME);
Iterators[NAME] = Iterators.Array;
}
var _wksExt = {};
_wksExt.f = _wks.exports;
var iterator = _wksExt.f("iterator");
(function(module2) {
module2.exports = { "default": iterator, __esModule: true };
})(iterator$1);
var symbol$1 = { exports: {} };
var _meta = { exports: {} };
var META$1 = _uid("meta");
var isObject$2 = _isObject;
var has$2 = _has;
var setDesc = _objectDp.f;
var id = 0;
var isExtensible = Object.isExtensible || function() {
return true;
};
var FREEZE = !_fails(function() {
return isExtensible(Object.preventExtensions({}));
});
var setMeta = function(it) {
setDesc(it, META$1, { value: {
i: "O" + ++id,
w: {}
} });
};
var fastKey = function(it, create2) {
if (!isObject$2(it))
return typeof it == "symbol" ? it : (typeof it == "string" ? "S" : "P") + it;
if (!has$2(it, META$1)) {
if (!isExtensible(it))
return "F";
if (!create2)
return "E";
setMeta(it);
}
return it[META$1].i;
};
var getWeak = function(it, create2) {
if (!has$2(it, META$1)) {
if (!isExtensible(it))
return true;
if (!create2)
return false;
setMeta(it);
}
return it[META$1].w;
};
var onFreeze = function(it) {
if (FREEZE && meta.NEED && isExtensible(it) && !has$2(it, META$1))
setMeta(it);
return it;
};
var meta = _meta.exports = {
KEY: META$1,
NEED: false,
fastKey,
getWeak,
onFreeze
};
var core = _core.exports;
var wksExt$1 = _wksExt;
var defineProperty$1 = _objectDp.f;
var _wksDefine = function(name2) {
var $Symbol2 = core.Symbol || (core.Symbol = {});
if (name2.charAt(0) != "_" && !(name2 in $Symbol2))
defineProperty$1($Symbol2, name2, { value: wksExt$1.f(name2) });
};
var getKeys = require_objectKeys();
var gOPS = require_objectGops();
var pIE$1 = require_objectPie();
var _enumKeys = function(it) {
var result = getKeys(it);
var getSymbols2 = gOPS.f;
if (getSymbols2) {
var symbols = getSymbols2(it);
var isEnum2 = pIE$1.f;
var i2 = 0;
var key2;
while (symbols.length > i2)
if (isEnum2.call(it, key2 = symbols[i2++]))
result.push(key2);
}
return result;
};
var cof = require_cof();
var _isArray = Array.isArray || function isArray2(arg) {
return cof(arg) == "Array";
};
var _objectGopnExt = {};
var _objectGopn = {};
var $keys$1 = require_objectKeysInternal();
var hiddenKeys = _enumBugKeys.concat("length", "prototype");
_objectGopn.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
return $keys$1(O, hiddenKeys);
};
var toIObject$2 = _toIobject;
var gOPN$1 = _objectGopn.f;
var toString$2 = {}.toString;
var windowNames = typeof window == "object" && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : [];
var getWindowNames = function(it) {
try {
return gOPN$1(it);
} catch (e2) {
return windowNames.slice();
}
};
_objectGopnExt.f = function getOwnPropertyNames(it) {
return windowNames && toString$2.call(it) == "[object Window]" ? getWindowNames(it) : gOPN$1(toIObject$2(it));
};
var _objectGopd = {};
var pIE = require_objectPie();
var createDesc$1 = _propertyDesc;
var toIObject$1 = _toIobject;
var toPrimitive$2 = _toPrimitive$5;
var has$1 = _has;
var IE8_DOM_DEFINE = _ie8DomDefine;
var gOPD$1 = Object.getOwnPropertyDescriptor;
_objectGopd.f = _descriptors ? gOPD$1 : function getOwnPropertyDescriptor(O, P) {
O = toIObject$1(O);
P = toPrimitive$2(P, true);
if (IE8_DOM_DEFINE)
try {
return gOPD$1(O, P);
} catch (e2) {
}
if (has$1(O, P))
return createDesc$1(!pIE.f.call(O, P), O[P]);
};
var global$1 = _global$1.exports;
var has = _has;
var DESCRIPTORS = _descriptors;
var $export$2 = _export;
var redefine = _redefine.exports;
var META = _meta.exports.KEY;
var $fails = _fails;
var shared = _shared.exports;
var setToStringTag = _setToStringTag;
var uid = _uid;
var wks = _wks.exports;
var wksExt = _wksExt;
var wksDefine = _wksDefine;
var enumKeys = _enumKeys;
var isArray$1 = _isArray;
var anObject = _anObject;
var isObject$1 = _isObject;
var toObject = require_toObject();
var toIObject = _toIobject;
var toPrimitive$1 = _toPrimitive$5;
var createDesc = _propertyDesc;
var _create$1 = _objectCreate;
var gOPNExt = _objectGopnExt;
var $GOPD = _objectGopd;
var $GOPS = require_objectGops();
var $DP = _objectDp;
var $keys = require_objectKeys();
var gOPD = $GOPD.f;
var dP = $DP.f;
var gOPN = gOPNExt.f;
var $Symbol = global$1.Symbol;
var $JSON = global$1.JSON;
var _stringify = $JSON && $JSON.stringify;
var PROTOTYPE = "prototype";
var HIDDEN = wks("_hidden");
var TO_PRIMITIVE = wks("toPrimitive");
var isEnum = {}.propertyIsEnumerable;
var SymbolRegistry = shared("symbol-registry");
var AllSymbols = shared("symbols");
var OPSymbols = shared("op-symbols");
var ObjectProto = Object[PROTOTYPE];
var USE_NATIVE = typeof $Symbol == "function" && !!$GOPS.f;
var QObject = global$1.QObject;
var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
var setSymbolDesc = DESCRIPTORS && $fails(function() {
return _create$1(dP({}, "a", {
get: function() {
return dP(this, "a", { value: 7 }).a;
}
})).a != 7;
}) ? function(it, key2, D) {
var protoDesc = gOPD(ObjectProto, key2);
if (protoDesc)
delete ObjectProto[key2];
dP(it, key2, D);
if (protoDesc && it !== ObjectProto)
dP(ObjectProto, key2, protoDesc);
} : dP;
var wrap = function(tag) {
var sym = AllSymbols[tag] = _create$1($Symbol[PROTOTYPE]);
sym._k = tag;
return sym;
};
var isSymbol = USE_NATIVE && typeof $Symbol.iterator == "symbol" ? function(it) {
return typeof it == "symbol";
} : function(it) {
return it instanceof $Symbol;
};
var $defineProperty = function defineProperty2(it, key2, D) {
if (it === ObjectProto)
$defineProperty(OPSymbols, key2, D);
anObject(it);
key2 = toPrimitive$1(key2, true);
anObject(D);
if (has(AllSymbols, key2)) {
if (!D.enumerable) {
if (!has(it, HIDDEN))
dP(it, HIDDEN, createDesc(1, {}));
it[HIDDEN][key2] = true;
} else {
if (has(it, HIDDEN) && it[HIDDEN][key2])
it[HIDDEN][key2] = false;
D = _create$1(D, { enumerable: createDesc(0, false) });
}
return setSymbolDesc(it, key2, D);
}
return dP(it, key2, D);
};
var $defineProperties = function defineProperties(it, P) {
anObject(it);
var keys2 = enumKeys(P = toIObject(P));
var i2 = 0;
var l2 = keys2.length;
var key2;
while (l2 > i2)
$defineProperty(it, key2 = keys2[i2++], P[key2]);
return it;
};
var $create = function create2(it, P) {
return P === void 0 ? _create$1(it) : $defineProperties(_create$1(it), P);
};
var $propertyIsEnumerable = function propertyIsEnumerable2(key2) {
var E = isEnum.call(this, key2 = toPrimitive$1(key2, true));
if (this === ObjectProto && has(AllSymbols, key2) && !has(OPSymbols, key2))
return false;
return E || !has(this, key2) || !has(AllSymbols, key2) || has(this, HIDDEN) && this[HIDDEN][key2] ? E : true;
};
var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key2) {
it = toIObject(it);
key2 = toPrimitive$1(key2, true);
if (it === ObjectProto && has(AllSymbols, key2) && !has(OPSymbols, key2))
return;
var D = gOPD(it, key2);
if (D && has(AllSymbols, key2) && !(has(it, HIDDEN) && it[HIDDEN][key2]))
D.enumerable = true;
return D;
};
var $getOwnPropertyNames = function getOwnPropertyNames(it) {
var names2 = gOPN(toIObject(it));
var result = [];
var i2 = 0;
var key2;
while (names2.length > i2) {
if (!has(AllSymbols, key2 = names2[i2++]) && key2 != HIDDEN && key2 != META)
result.push(key2);
}
return result;
};
var $getOwnPropertySymbols = function getOwnPropertySymbols2(it) {
var IS_OP = it === ObjectProto;
var names2 = gOPN(IS_OP ? OPSymbols : toIObject(it));
var result = [];
var i2 = 0;
var key2;
while (names2.length > i2) {
if (has(AllSymbols, key2 = names2[i2++]) && (IS_OP ? has(ObjectProto, key2) : true))
result.push(AllSymbols[key2]);
}
return result;
};
if (!USE_NATIVE) {
$Symbol = function Symbol2() {
if (this instanceof $Symbol)
throw TypeError("Symbol is not a constructor!");
var tag = uid(arguments.length > 0 ? arguments[0] : void 0);
var $set = function(value) {
if (this === ObjectProto)
$set.call(OPSymbols, value);
if (has(this, HIDDEN) && has(this[HIDDEN], tag))
this[HIDDEN][tag] = false;
setSymbolDesc(this, tag, createDesc(1, value));
};
if (DESCRIPTORS && setter)
setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });
return wrap(tag);
};
redefine($Symbol[PROTOTYPE], "toString", function toString2() {
return this._k;
});
$GOPD.f = $getOwnPropertyDescriptor;
$DP.f = $defineProperty;
_objectGopn.f = gOPNExt.f = $getOwnPropertyNames;
require_objectPie().f = $propertyIsEnumerable;
$GOPS.f = $getOwnPropertySymbols;
if (DESCRIPTORS && !_library) {
redefine(ObjectProto, "propertyIsEnumerable", $propertyIsEnumerable, true);
}
wksExt.f = function(name2) {
return wrap(wks(name2));
};
}
$export$2($export$2.G + $export$2.W + $export$2.F * !USE_NATIVE, { Symbol: $Symbol });
for (var es6Symbols = "hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","), j = 0; es6Symbols.length > j; )
wks(es6Symbols[j++]);
for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k; )
wksDefine(wellKnownSymbols[k++]);
$export$2($export$2.S + $export$2.F * !USE_NATIVE, "Symbol", {
"for": function(key2) {
return has(SymbolRegistry, key2 += "") ? SymbolRegistry[key2] : SymbolRegistry[key2] = $Symbol(key2);
},
keyFor: function keyFor(sym) {
if (!isSymbol(sym))
throw TypeError(sym + " is not a symbol!");
for (var key2 in SymbolRegistry)
if (SymbolRegistry[key2] === sym)
return key2;
},
useSetter: function() {
setter = true;
},
useSimple: function() {
setter = false;
}
});
$export$2($export$2.S + $export$2.F * !USE_NATIVE, "Object", {
create: $create,
defineProperty: $defineProperty,
defineProperties: $defineProperties,
getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
getOwnPropertyNames: $getOwnPropertyNames,
getOwnPropertySymbols: $getOwnPropertySymbols
});
var FAILS_ON_PRIMITIVES = $fails(function() {
$GOPS.f(1);
});
$export$2($export$2.S + $export$2.F * FAILS_ON_PRIMITIVES, "Object", {
getOwnPropertySymbols: function getOwnPropertySymbols2(it) {
return $GOPS.f(toObject(it));
}
});
$JSON && $export$2($export$2.S + $export$2.F * (!USE_NATIVE || $fails(function() {
var S = $Symbol();
return _stringify([S]) != "[null]" || _stringify({ a: S }) != "{}" || _stringify(Object(S)) != "{}";
})), "JSON", {
stringify: function stringify2(it) {
var args = [it];
var i2 = 1;
var replacer, $replacer;
while (arguments.length > i2)
args.push(arguments[i2++]);
$replacer = replacer = args[1];
if (!isObject$1(replacer) && it === void 0 || isSymbol(it))
return;
if (!isArray$1(replacer))
replacer = function(key2, value) {
if (typeof $replacer == "function")
value = $replacer.call(this, key2, value);
if (!isSymbol(value))
return value;
};
args[1] = replacer;
return _stringify.apply($JSON, args);
}
});
$Symbol[PROTOTYPE][TO_PRIMITIVE] || _hide($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
setToStringTag($Symbol, "Symbol");
setToStringTag(Math, "Math", true);
setToStringTag(global$1.JSON, "JSON", true);
_wksDefine("asyncIterator");
_wksDefine("observable");
var symbol = _core.exports.Symbol;
(function(module2) {
module2.exports = { "default": symbol, __esModule: true };
})(symbol$1);
_typeof$i.__esModule = true;
var _iterator = iterator$1.exports;
var _iterator2 = _interopRequireDefault$d(_iterator);
var _symbol = symbol$1.exports;
var _symbol2 = _interopRequireDefault$d(_symbol);
var _typeof$h = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function(obj) {
return typeof obj;
} : function(obj) {
return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj;
};
function _interopRequireDefault$d(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
var _default$e = _typeof$i.default = typeof _symbol2.default === "function" && _typeof$h(_iterator2.default) === "symbol" ? function(obj) {
return typeof obj === "undefined" ? "undefined" : _typeof$h(obj);
} : function(obj) {
return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof$h(obj);
};
var _typeof2$1 = _typeof$i;
var _typeof3$1 = _interopRequireDefault$c(_typeof2$1);
function _interopRequireDefault$c(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
var _default$d = function(self2, call2) {
if (!self2) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call2 && ((typeof call2 === "undefined" ? "undefined" : (0, _typeof3$1.default)(call2)) === "object" || typeof call2 === "function") ? call2 : self2;
};
var setPrototypeOf$1 = { exports: {} };
var _setProto;
var hasRequired_setProto;
function require_setProto() {
if (hasRequired_setProto)
return _setProto;
hasRequired_setProto = 1;
var isObject2 = _isObject;
var anObject2 = _anObject;
var check = function(O, proto2) {
anObject2(O);
if (!isObject2(proto2) && proto2 !== null)
throw TypeError(proto2 + ": can't set as prototype!");
};
_setProto = {
set: Object.setPrototypeOf || ("__proto__" in {} ? function(test, buggy, set2) {
try {
set2 = _ctx(Function.call, _objectGopd.f(Object.prototype, "__proto__").set, 2);
set2(test, []);
buggy = !(test instanceof Array);
} catch (e2) {
buggy = true;
}
return function setPrototypeOf2(O, proto2) {
check(O, proto2);
if (buggy)
O.__proto__ = proto2;
else
set2(O, proto2);
return O;
};
}({}, false) : void 0),
check
};
return _setProto;
}
var $export$1 = _export;
$export$1($export$1.S, "Object", { setPrototypeOf: require_setProto().set });
var setPrototypeOf = _core.exports.Object.setPrototypeOf;
(function(module2) {
module2.exports = { "default": setPrototypeOf, __esModule: true };
})(setPrototypeOf$1);
var create$1 = { exports: {} };
var $export = _export;
$export($export.S, "Object", { create: _objectCreate });
var $Object = _core.exports.Object;
var create = function create2(P, D) {
return $Object.create(P, D);
};
(function(module2) {
module2.exports = { "default": create, __esModule: true };
})(create$1);
var _setPrototypeOf = setPrototypeOf$1.exports;
var _setPrototypeOf2 = _interopRequireDefault$b(_setPrototypeOf);
var _create = create$1.exports;
var _create2 = _interopRequireDefault$b(_create);
var _typeof2 = _typeof$i;
var _typeof3 = _interopRequireDefault$b(_typeof2);
function _interopRequireDefault$b(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
var _default$c = function(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : (0, _typeof3.default)(superClass)));
}
subClass.prototype = (0, _create2.default)(superClass && superClass.prototype, {
constructor: {
value: subClass,
enumerable: false,
writable: true,
configurable: true
}
});
if (superClass)
_setPrototypeOf2.default ? (0, _setPrototypeOf2.default)(subClass, superClass) : subClass.__proto__ = superClass;
};
function addEventListenerWrap(target, eventType, cb, option) {
var callback = ReactDOM__default.default.unstable_batchedUpdates ? function run(e2) {
ReactDOM__default.default.unstable_batchedUpdates(cb, e2);
} : cb;
return addDOMEventListener(target, eventType, callback, option);
}
function buffer(fn, ms) {
var timer = void 0;
function clear() {
if (timer) {
clearTimeout(timer);
timer = null;
}
}
function bufferFn() {
clear();
timer = setTimeout(fn, ms);
}
bufferFn.clear = clear;
return bufferFn;
}
function isSamePoint(prev, next) {
if (prev === next)
return true;
if (!prev || !next)
return false;
if ("pageX" in next && "pageY" in next) {
return prev.pageX === next.pageX && prev.pageY === next.pageY;
}
if ("clientX" in next && "clientY" in next) {
return prev.clientX === next.clientX && prev.clientY === next.clientY;
}
return false;
}
function isWindow(obj) {
return obj && typeof obj === "object" && obj.window === obj;
}
function isSimilarValue(val1, val2) {
var int1 = Math.floor(val1);
var int2 = Math.floor(val2);
return Math.abs(int1 - int2) <= 1;
}
function restoreFocus(activeElement, container) {
if (activeElement !== document.activeElement && contains$1(container, activeElement)) {
activeElement.focus();
}
}
function getElement(func) {
if (typeof func !== "function" || !func)
return null;
return func();
}
function getPoint(point) {
if (typeof point !== "object" || !point)
return null;
return point;
}
var Align = function(_Component) {
_default$c(Align2, _Component);
function Align2() {
var _ref;
var _temp, _this2, _ret;
_default$g(this, Align2);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this2 = _default$d(this, (_ref = Align2.__proto__ || Object.getPrototypeOf(Align2)).call.apply(_ref, [this].concat(args))), _this2), _this2.forceAlign = function() {
var _this$props = _this2.props, disabled = _this$props.disabled, target = _this$props.target, align = _this$props.align, onAlign = _this$props.onAlign;
if (!disabled && target) {
var source = ReactDOM__default.default.findDOMNode(_this2);
var result = void 0;
var element = getElement(target);
var point = getPoint(target);
var activeElement = document.activeElement;
if (element) {
result = alignElement(source, element, align);
} else if (point) {
result = alignPoint(source, point, align);
}
restoreFocus(activeElement, source);
if (onAlign) {
onAlign(source, result);
}
}
}, _temp), _default$d(_this2, _ret);
}
_default$f(Align2, [{
key: "componentDidMount",
value: function componentDidMount() {
var props = this.props;
this.forceAlign();
if (!props.disabled && props.monitorWindowResize) {
this.startMonitorWindowResize();
}
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps) {
var reAlign = false;
var props = this.props;
if (!props.disabled) {
var source = ReactDOM__default.default.findDOMNode(this);
var sourceRect = source ? source.getBoundingClientRect() : null;
if (prevProps.disabled) {
reAlign = true;
} else {
var lastElement = getElement(prevProps.target);
var currentElement = getElement(props.target);
var lastPoint = getPoint(prevProps.target);
var currentPoint = getPoint(props.target);
if (isWindow(lastElement) && isWindow(currentElement)) {
reAlign = false;
} else if (lastElement !== currentElement || lastElement && !currentElement && currentPoint || lastPoint && currentPoint && currentElement || currentPoint && !isSamePoint(lastPoint, currentPoint)) {
reAlign = true;
}
var preRect = this.sourceRect || {};
if (!reAlign && source && (!isSimilarValue(preRect.width, sourceRect.width) || !isSimilarValue(preRect.height, sourceRect.height))) {
reAlign = true;
}
}
this.sourceRect = sourceRect;
}
if (reAlign) {
this.forceAlign();
}
if (props.monitorWindowResize && !props.disabled) {
this.startMonitorWindowResize();
} else {
this.stopMonitorWindowResize();
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this.stopMonitorWindowResize();
}
}, {
key: "startMonitorWindowResize",
value: function startMonitorWindowResize() {
if (!this.resizeHandler) {
this.bufferMonitor = buffer(this.forceAlign, this.props.monitorBufferTime);
this.resizeHandler = addEventListenerWrap(window, "resize", this.bufferMonitor);
}
}
}, {
key: "stopMonitorWindowResize",
value: function stopMonitorWindowResize() {
if (this.resizeHandler) {
this.bufferMonitor.clear();
this.resizeHandler.remove();
this.resizeHandler = null;
}
}
}, {
key: "render",
value: function render2() {
var _this2 = this;
var _props = this.props, childrenProps = _props.childrenProps, children = _props.children;
var child = React__default.default.Children.only(children);
if (childrenProps) {
var newProps = {};
var propList2 = Object.keys(childrenProps);
propList2.forEach(function(prop) {
newProps[prop] = _this2.props[childrenProps[prop]];
});
return React__default.default.cloneElement(child, newProps);
}
return child;
}
}]);
return Align2;
}(React$a.Component);
Align.propTypes = {
childrenProps: propTypes.exports.object,
align: propTypes.exports.object.isRequired,
target: propTypes.exports.oneOfType([propTypes.exports.func, propTypes.exports.shape({
clientX: propTypes.exports.number,
clientY: propTypes.exports.number,
pageX: propTypes.exports.number,
pageY: propTypes.exports.number
})]),
onAlign: propTypes.exports.func,
monitorBufferTime: propTypes.exports.number,
monitorWindowResize: propTypes.exports.bool,
disabled: propTypes.exports.bool,
children: propTypes.exports.any
};
Align.defaultProps = {
target: function target() {
return window;
},
monitorBufferTime: 50,
monitorWindowResize: false,
disabled: false
};
var _defineProperty$6 = defineProperty$3.exports;
var _defineProperty2 = _interopRequireDefault$a(_defineProperty$6);
function _interopRequireDefault$a(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
var _default$b = function(obj, key2, value) {
if (key2 in obj) {
(0, _defineProperty2.default)(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key2] = value;
}
return obj;
};
var unsafeLifecyclesPolyfill = function unsafeLifecyclesPolyfill2(Component) {
var prototype2 = Component.prototype;
if (!prototype2 || !prototype2.isReactComponent) {
throw new Error("Can only polyfill class components");
}
if (typeof prototype2.componentWillReceiveProps !== "function") {
return Component;
}
if (!React__default.default.Profiler) {
return Component;
}
prototype2.UNSAFE_componentWillReceiveProps = prototype2.componentWillReceiveProps;
delete prototype2.componentWillReceiveProps;
return Component;
};
function toArrayChildren(children) {
var ret = [];
React__default.default.Children.forEach(children, function(child) {
ret.push(child);
});
return ret;
}
function findChildInChildrenByKey(children, key2) {
var ret = null;
if (children) {
children.forEach(function(child) {
if (ret) {
return;
}
if (child && child.key === key2) {
ret = child;
}
});
}
return ret;
}
function findShownChildInChildrenByKey(children, key2, showProp) {
var ret = null;
if (children) {
children.forEach(function(child) {
if (child && child.key === key2 && child.props[showProp]) {
if (ret) {
throw new Error("two child with same key for <rc-animate> children");
}
ret = child;
}
});
}
return ret;
}
function isSameChildren(c1, c2, showProp) {
var same = c1.length === c2.length;
if (same) {
c1.forEach(function(child, index2) {
var child2 = c2[index2];
if (child && child2) {
if (child && !child2 || !child && child2) {
same = false;
} else if (child.key !== child2.key) {
same = false;
} else if (showProp && child.props[showProp] !== child2.props[showProp]) {
same = false;
}
}
});
}
return same;
}
function mergeChildren(prev, next) {
var ret = [];
var nextChildrenPending = {};
var pendingChildren = [];
prev.forEach(function(child) {
if (child && findChildInChildrenByKey(next, child.key)) {
if (pendingChildren.length) {
nextChildrenPending[child.key] = pendingChildren;
pendingChildren = [];
}
} else {
pendingChildren.push(child);
}
});
next.forEach(function(child) {
if (child && Object.prototype.hasOwnProperty.call(nextChildrenPending, child.key)) {
ret = ret.concat(nextChildrenPending[child.key]);
}
ret.push(child);
});
ret = ret.concat(pendingChildren);
return ret;
}
var START_EVENT_NAME_MAP = {
transitionstart: {
transition: "transitionstart",
WebkitTransition: "webkitTransitionStart",
MozTransition: "mozTransitionStart",
OTransition: "oTransitionStart",
msTransition: "MSTransitionStart"
},
animationstart: {
animation: "animationstart",
WebkitAnimation: "webkitAnimationStart",
MozAnimation: "mozAnimationStart",
OAnimation: "oAnimationStart",
msAnimation: "MSAnimationStart"
}
};
var END_EVENT_NAME_MAP = {
transitionend: {
transition: "transitionend",
WebkitTransition: "webkitTransitionEnd",
MozTransition: "mozTransitionEnd",
OTransition: "oTransitionEnd",
msTransition: "MSTransitionEnd"
},
animationend: {
animation: "animationend",
WebkitAnimation: "webkitAnimationEnd",
MozAnimation: "mozAnimationEnd",
OAnimation: "oAnimationEnd",
msAnimation: "MSAnimationEnd"
}
};
var startEvents = [];
var endEvents = [];
function detectEvents() {
var testEl = document.createElement("div");
var style2 = testEl.style;
if (!("AnimationEvent" in window)) {
delete START_EVENT_NAME_MAP.animationstart.animation;
delete END_EVENT_NAME_MAP.animationend.animation;
}
if (!("TransitionEvent" in window)) {
delete START_EVENT_NAME_MAP.transitionstart.transition;
delete END_EVENT_NAME_MAP.transitionend.transition;
}
function process2(EVENT_NAME_MAP, events) {
for (var baseEventName in EVENT_NAME_MAP) {
if (EVENT_NAME_MAP.hasOwnProperty(baseEventName)) {
var baseEvents = EVENT_NAME_MAP[baseEventName];
for (var styleName in baseEvents) {
if (styleName in style2) {
events.push(baseEvents[styleName]);
break;
}
}
}
}
}
process2(START_EVENT_NAME_MAP, startEvents);
process2(END_EVENT_NAME_MAP, endEvents);
}
if (typeof window !== "undefined" && typeof document !== "undefined") {
detectEvents();
}
function addEventListener(node, eventName, eventListener) {
node.addEventListener(eventName, eventListener, false);
}
function removeEventListener(node, eventName, eventListener) {
node.removeEventListener(eventName, eventListener, false);
}
var TransitionEvents = {
startEvents,
addStartEventListener: function addStartEventListener(node, eventListener) {
if (startEvents.length === 0) {
window.setTimeout(eventListener, 0);
return;
}
startEvents.forEach(function(startEvent) {
addEventListener(node, startEvent, eventListener);
});
},
removeStartEventListener: function removeStartEventListener(node, eventListener) {
if (startEvents.length === 0) {
return;
}
startEvents.forEach(function(startEvent) {
removeEventListener(node, startEvent, eventListener);
});
},
endEvents,
addEndEventListener: function addEndEventListener(node, eventListener) {
if (endEvents.length === 0) {
window.setTimeout(eventListener, 0);
return;
}
endEvents.forEach(function(endEvent) {
addEventListener(node, endEvent, eventListener);
});
},
removeEndEventListener: function removeEndEventListener(node, eventListener) {
if (endEvents.length === 0) {
return;
}
endEvents.forEach(function(endEvent) {
removeEventListener(node, endEvent, eventListener);
});
}
};
var componentIndexof;
var hasRequiredComponentIndexof;
function requireComponentIndexof() {
if (hasRequiredComponentIndexof)
return componentIndexof;
hasRequiredComponentIndexof = 1;
componentIndexof = function(arr, obj) {
if (arr.indexOf)
return arr.indexOf(obj);
for (var i2 = 0; i2 < arr.length; ++i2) {
if (arr[i2] === obj)
return i2;
}
return -1;
};
return componentIndexof;
}
try {
var index$E = require("indexof");
} catch (err) {
var index$E = requireComponentIndexof();
}
var re = /\s+/;
var toString$1 = Object.prototype.toString;
var componentClasses = function(el) {
return new ClassList(el);
};
function ClassList(el) {
if (!el || !el.nodeType) {
throw new Error("A DOM element reference is required");
}
this.el = el;
this.list = el.classList;
}
ClassList.prototype.add = function(name2) {
if (this.list) {
this.list.add(name2);
return this;
}
var arr = this.array();
var i2 = index$E(arr, name2);
if (!~i2)
arr.push(name2);
this.el.className = arr.join(" ");
return this;
};
ClassList.prototype.remove = function(name2) {
if ("[object RegExp]" == toString$1.call(name2)) {
return this.removeMatching(name2);
}
if (this.list) {
this.list.remove(name2);
return this;
}
var arr = this.array();
var i2 = index$E(arr, name2);
if (~i2)
arr.splice(i2, 1);
this.el.className = arr.join(" ");
return this;
};
ClassList.prototype.removeMatching = function(re2) {
var arr = this.array();
for (var i2 = 0; i2 < arr.length; i2++) {
if (re2.test(arr[i2])) {
this.remove(arr[i2]);
}
}
return this;
};
ClassList.prototype.toggle = function(name2, force) {
if (this.list) {
if ("undefined" !== typeof force) {
if (force !== this.list.toggle(name2, force)) {
this.list.toggle(name2);
}
} else {
this.list.toggle(name2);
}
return this;
}
if ("undefined" !== typeof force) {
if (!force) {
this.remove(name2);
} else {
this.add(name2);
}
} else {
if (this.has(name2)) {
this.remove(name2);
} else {
this.add(name2);
}
}
return this;
};
ClassList.prototype.array = function() {
var className = this.el.getAttribute("class") || "";
var str = className.replace(/^\s+|\s+$/g, "");
var arr = str.split(re);
if ("" === arr[0])
arr.shift();
return arr;
};
ClassList.prototype.has = ClassList.prototype.contains = function(name2) {
return this.list ? this.list.contains(name2) : !!~index$E(this.array(), name2);
};
var isCssAnimationSupported = TransitionEvents.endEvents.length !== 0;
var capitalPrefixes = [
"Webkit",
"Moz",
"O",
"ms"
];
var prefixes = ["-webkit-", "-moz-", "-o-", "ms-", ""];
function getStyleProperty(node, name2) {
var style2 = window.getComputedStyle(node, null);
var ret = "";
for (var i2 = 0; i2 < prefixes.length; i2++) {
ret = style2.getPropertyValue(prefixes[i2] + name2);
if (ret) {
break;
}
}
return ret;
}
function fixBrowserByTimeout(node) {
if (isCssAnimationSupported) {
var transitionDelay = parseFloat(getStyleProperty(node, "transition-delay")) || 0;
var transitionDuration = parseFloat(getStyleProperty(node, "transition-duration")) || 0;
var animationDelay = parseFloat(getStyleProperty(node, "animation-delay")) || 0;
var animationDuration = parseFloat(getStyleProperty(node, "animation-duration")) || 0;
var time = Math.max(transitionDuration + transitionDelay, animationDuration + animationDelay);
node.rcEndAnimTimeout = setTimeout(function() {
node.rcEndAnimTimeout = null;
if (node.rcEndListener) {
node.rcEndListener();
}
}, time * 1e3 + 200);
}
}
function clearBrowserBugTimeout(node) {
if (node.rcEndAnimTimeout) {
clearTimeout(node.rcEndAnimTimeout);
node.rcEndAnimTimeout = null;
}
}
var cssAnimation = function cssAnimation2(node, transitionName2, endCallback) {
var nameIsObj = (typeof transitionName2 === "undefined" ? "undefined" : _default$e(transitionName2)) === "object";
var className = nameIsObj ? transitionName2.name : transitionName2;
var activeClassName = nameIsObj ? transitionName2.active : transitionName2 + "-active";
var end = endCallback;
var start = void 0;
var active = void 0;
var nodeClasses = componentClasses(node);
if (endCallback && Object.prototype.toString.call(endCallback) === "[object Object]") {
end = endCallback.end;
start = endCallback.start;
active = endCallback.active;
}
if (node.rcEndListener) {
node.rcEndListener();
}
node.rcEndListener = function(e2) {
if (e2 && e2.target !== node) {
return;
}
if (node.rcAnimTimeout) {
clearTimeout(node.rcAnimTimeout);
node.rcAnimTimeout = null;
}
clearBrowserBugTimeout(node);
nodeClasses.remove(className);
nodeClasses.remove(activeClassName);
TransitionEvents.removeEndEventListener(node, node.rcEndListener);
node.rcEndListener = null;
if (end) {
end();
}
};
TransitionEvents.addEndEventListener(node, node.rcEndListener);
if (start) {
start();
}
nodeClasses.add(className);
node.rcAnimTimeout = setTimeout(function() {
node.rcAnimTimeout = null;
nodeClasses.add(activeClassName);
if (active) {
setTimeout(active, 0);
}
fixBrowserByTimeout(node);
}, 30);
return {
stop: function stop() {
if (node.rcEndListener) {
node.rcEndListener();
}
}
};
};
cssAnimation.style = function(node, style2, callback) {
if (node.rcEndListener) {
node.rcEndListener();
}
node.rcEndListener = function(e2) {
if (e2 && e2.target !== node) {
return;
}
if (node.rcAnimTimeout) {
clearTimeout(node.rcAnimTimeout);
node.rcAnimTimeout = null;
}
clearBrowserBugTimeout(node);
TransitionEvents.removeEndEventListener(node, node.rcEndListener);
node.rcEndListener = null;
if (callback) {
callback();
}
};
TransitionEvents.addEndEventListener(node, node.rcEndListener);
node.rcAnimTimeout = setTimeout(function() {
for (var s in style2) {
if (style2.hasOwnProperty(s)) {
node.style[s] = style2[s];
}
}
node.rcAnimTimeout = null;
fixBrowserByTimeout(node);
}, 0);
};
cssAnimation.setTransition = function(node, p2, value) {
var property2 = p2;
var v2 = value;
if (value === void 0) {
v2 = property2;
property2 = "";
}
property2 = property2 || "";
capitalPrefixes.forEach(function(prefix) {
node.style[prefix + "Transition" + property2] = v2;
});
};
cssAnimation.isCssAnimationSupported = isCssAnimationSupported;
var util = {
isAppearSupported: function isAppearSupported(props) {
return props.transitionName && props.transitionAppear || props.animation.appear;
},
isEnterSupported: function isEnterSupported(props) {
return props.transitionName && props.transitionEnter || props.animation.enter;
},
isLeaveSupported: function isLeaveSupported(props) {
return props.transitionName && props.transitionLeave || props.animation.leave;
},
allowAppearCallback: function allowAppearCallback(props) {
return props.transitionAppear || props.animation.appear;
},
allowEnterCallback: function allowEnterCallback(props) {
return props.transitionEnter || props.animation.enter;
},
allowLeaveCallback: function allowLeaveCallback(props) {
return props.transitionLeave || props.animation.leave;
}
};
var transitionMap = {
enter: "transitionEnter",
appear: "transitionAppear",
leave: "transitionLeave"
};
var AnimateChild = function(_React$Component) {
_default$c(AnimateChild2, _React$Component);
function AnimateChild2() {
_default$g(this, AnimateChild2);
return _default$d(this, (AnimateChild2.__proto__ || Object.getPrototypeOf(AnimateChild2)).apply(this, arguments));
}
_default$f(AnimateChild2, [{
key: "componentWillUnmount",
value: function componentWillUnmount() {
this.stop();
}
}, {
key: "componentWillEnter",
value: function componentWillEnter(done) {
if (util.isEnterSupported(this.props)) {
this.transition("enter", done);
} else {
done();
}
}
}, {
key: "componentWillAppear",
value: function componentWillAppear(done) {
if (util.isAppearSupported(this.props)) {
this.transition("appear", done);
} else {
done();
}
}
}, {
key: "componentWillLeave",
value: function componentWillLeave(done) {
if (util.isLeaveSupported(this.props)) {
this.transition("leave", done);
} else {
done();
}
}
}, {
key: "transition",
value: function transition(animationType, finishCallback) {
var _this2 = this;
var node = ReactDOM__default.default.findDOMNode(this);
var props = this.props;
var transitionName2 = props.transitionName;
var nameIsObj = typeof transitionName2 === "object";
this.stop();
var end = function end2() {
_this2.stopper = null;
finishCallback();
};
if ((isCssAnimationSupported || !props.animation[animationType]) && transitionName2 && props[transitionMap[animationType]]) {
var name2 = nameIsObj ? transitionName2[animationType] : transitionName2 + "-" + animationType;
var activeName = name2 + "-active";
if (nameIsObj && transitionName2[animationType + "Active"]) {
activeName = transitionName2[animationType + "Active"];
}
this.stopper = cssAnimation(node, {
name: name2,
active: activeName
}, end);
} else {
this.stopper = props.animation[animationType](node, end);
}
}
}, {
key: "stop",
value: function stop() {
var stopper = this.stopper;
if (stopper) {
this.stopper = null;
stopper.stop();
}
}
}, {
key: "render",
value: function render2() {
return this.props.children;
}
}]);
return AnimateChild2;
}(React__default.default.Component);
AnimateChild.propTypes = {
children: propTypes.exports.any,
animation: propTypes.exports.any,
transitionName: propTypes.exports.any
};
var defaultKey = "rc_animate_" + Date.now();
function getChildrenFromProps(props) {
var children = props.children;
if (React__default.default.isValidElement(children)) {
if (!children.key) {
return React__default.default.cloneElement(children, {
key: defaultKey
});
}
}
return children;
}
function noop$2() {
}
var Animate = function(_React$Component) {
_default$c(Animate2, _React$Component);
function Animate2(props) {
_default$g(this, Animate2);
var _this2 = _default$d(this, (Animate2.__proto__ || Object.getPrototypeOf(Animate2)).call(this, props));
_initialiseProps$1.call(_this2);
_this2.currentlyAnimatingKeys = {};
_this2.keysToEnter = [];
_this2.keysToLeave = [];
_this2.state = {
children: toArrayChildren(getChildrenFromProps(props))
};
_this2.childrenRefs = {};
return _this2;
}
_default$f(Animate2, [{
key: "componentDidMount",
value: function componentDidMount() {
var _this2 = this;
var showProp = this.props.showProp;
var children = this.state.children;
if (showProp) {
children = children.filter(function(child) {
return !!child.props[showProp];
});
}
children.forEach(function(child) {
if (child) {
_this2.performAppear(child.key);
}
});
}
}, {
key: "componentWillReceiveProps",
value: function componentWillReceiveProps(nextProps) {
var _this3 = this;
this.nextProps = nextProps;
var nextChildren = toArrayChildren(getChildrenFromProps(nextProps));
var props = this.props;
if (props.exclusive) {
Object.keys(this.currentlyAnimatingKeys).forEach(function(key2) {
_this3.stop(key2);
});
}
var showProp = props.showProp;
var currentlyAnimatingKeys = this.currentlyAnimatingKeys;
var currentChildren = props.exclusive ? toArrayChildren(getChildrenFromProps(props)) : this.state.children;
var newChildren = [];
if (showProp) {
currentChildren.forEach(function(currentChild) {
var nextChild = currentChild && findChildInChildrenByKey(nextChildren, currentChild.key);
var newChild = void 0;
if ((!nextChild || !nextChild.props[showProp]) && currentChild.props[showProp]) {
newChild = React__default.default.cloneElement(nextChild || currentChild, _default$b({}, showProp, true));
} else {
newChild = nextChild;
}
if (newChild) {
newChildren.push(newChild);
}
});
nextChildren.forEach(function(nextChild) {
if (!nextChild || !findChildInChildrenByKey(currentChildren, nextChild.key)) {
newChildren.push(nextChild);
}
});
} else {
newChildren = mergeChildren(currentChildren, nextChildren);
}
this.setState({
children: newChildren
});
nextChildren.forEach(function(child) {
var key2 = child && child.key;
if (child && currentlyAnimatingKeys[key2]) {
return;
}
var hasPrev = child && findChildInChildrenByKey(currentChildren, key2);
if (showProp) {
var showInNext = child.props[showProp];
if (hasPrev) {
var showInNow = findShownChildInChildrenByKey(currentChildren, key2, showProp);
if (!showInNow && showInNext) {
_this3.keysToEnter.push(key2);
}
} else if (showInNext) {
_this3.keysToEnter.push(key2);
}
} else if (!hasPrev) {
_this3.keysToEnter.push(key2);
}
});
currentChildren.forEach(function(child) {
var key2 = child && child.key;
if (child && currentlyAnimatingKeys[key2]) {
return;
}
var hasNext = child && findChildInChildrenByKey(nextChildren, key2);
if (showProp) {
var showInNow = child.props[showProp];
if (hasNext) {
var showInNext = findShownChildInChildrenByKey(nextChildren, key2, showProp);
if (!showInNext && showInNow) {
_this3.keysToLeave.push(key2);
}
} else if (showInNow) {
_this3.keysToLeave.push(key2);
}
} else if (!hasNext) {
_this3.keysToLeave.push(key2);
}
});
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate() {
var keysToEnter = this.keysToEnter;
this.keysToEnter = [];
keysToEnter.forEach(this.performEnter);
var keysToLeave = this.keysToLeave;
this.keysToLeave = [];
keysToLeave.forEach(this.performLeave);
}
}, {
key: "isValidChildByKey",
value: function isValidChildByKey(currentChildren, key2) {
var showProp = this.props.showProp;
if (showProp) {
return findShownChildInChildrenByKey(currentChildren, key2, showProp);
}
return findChildInChildrenByKey(currentChildren, key2);
}
}, {
key: "stop",
value: function stop(key2) {
delete this.currentlyAnimatingKeys[key2];
var component = this.childrenRefs[key2];
if (component) {
component.stop();
}
}
}, {
key: "render",
value: function render2() {
var _this4 = this;
var props = this.props;
this.nextProps = props;
var stateChildren = this.state.children;
var children = null;
if (stateChildren) {
children = stateChildren.map(function(child) {
if (child === null || child === void 0) {
return child;
}
if (!child.key) {
throw new Error("must set key for <rc-animate> children");
}
return /* @__PURE__ */ jsx(AnimateChild, {
ref: function ref(node) {
_this4.childrenRefs[child.key] = node;
},
animation: props.animation,
transitionName: props.transitionName,
transitionEnter: props.transitionEnter,
transitionAppear: props.transitionAppear,
transitionLeave: props.transitionLeave,
children: child
}, child.key);
});
}
var Component = props.component;
if (Component) {
var passedProps = props;
if (typeof Component === "string") {
passedProps = _default$i({
className: props.className,
style: props.style
}, props.componentProps);
}
return /* @__PURE__ */ jsx(Component, {
...passedProps,
children
});
}
return children[0] || null;
}
}]);
return Animate2;
}(React__default.default.Component);
Animate.isAnimate = true;
Animate.propTypes = {
className: propTypes.exports.string,
style: propTypes.exports.object,
component: propTypes.exports.any,
componentProps: propTypes.exports.object,
animation: propTypes.exports.object,
transitionName: propTypes.exports.oneOfType([propTypes.exports.string, propTypes.exports.object]),
transitionEnter: propTypes.exports.bool,
transitionAppear: propTypes.exports.bool,
exclusive: propTypes.exports.bool,
transitionLeave: propTypes.exports.bool,
onEnd: propTypes.exports.func,
onEnter: propTypes.exports.func,
onLeave: propTypes.exports.func,
onAppear: propTypes.exports.func,
showProp: propTypes.exports.string,
children: propTypes.exports.node
};
Animate.defaultProps = {
animation: {},
component: "span",
componentProps: {},
transitionEnter: true,
transitionLeave: true,
transitionAppear: false,
onEnd: noop$2,
onEnter: noop$2,
onLeave: noop$2,
onAppear: noop$2
};
var _initialiseProps$1 = function _initialiseProps2() {
var _this5 = this;
this.performEnter = function(key2) {
if (_this5.childrenRefs[key2]) {
_this5.currentlyAnimatingKeys[key2] = true;
_this5.childrenRefs[key2].componentWillEnter(_this5.handleDoneAdding.bind(_this5, key2, "enter"));
}
};
this.performAppear = function(key2) {
if (_this5.childrenRefs[key2]) {
_this5.currentlyAnimatingKeys[key2] = true;
_this5.childrenRefs[key2].componentWillAppear(_this5.handleDoneAdding.bind(_this5, key2, "appear"));
}
};
this.handleDoneAdding = function(key2, type2) {
var props = _this5.props;
delete _this5.currentlyAnimatingKeys[key2];
if (props.exclusive && props !== _this5.nextProps) {
return;
}
var currentChildren = toArrayChildren(getChildrenFromProps(props));
if (!_this5.isValidChildByKey(currentChildren, key2)) {
_this5.performLeave(key2);
} else if (type2 === "appear") {
if (util.allowAppearCallback(props)) {
props.onAppear(key2);
props.onEnd(key2, true);
}
} else if (util.allowEnterCallback(props)) {
props.onEnter(key2);
props.onEnd(key2, true);
}
};
this.performLeave = function(key2) {
if (_this5.childrenRefs[key2]) {
_this5.currentlyAnimatingKeys[key2] = true;
_this5.childrenRefs[key2].componentWillLeave(_this5.handleDoneLeaving.bind(_this5, key2));
}
};
this.handleDoneLeaving = function(key2) {
var props = _this5.props;
delete _this5.currentlyAnimatingKeys[key2];
if (props.exclusive && props !== _this5.nextProps) {
return;
}
var currentChildren = toArrayChildren(getChildrenFromProps(props));
if (_this5.isValidChildByKey(currentChildren, key2)) {
_this5.performEnter(key2);
} else {
var end = function end2() {
if (util.allowLeaveCallback(props)) {
props.onLeave(key2);
props.onEnd(key2, false);
}
};
if (!isSameChildren(_this5.state.children, currentChildren, props.showProp)) {
_this5.setState({
children: currentChildren
}, end);
} else {
end();
}
}
};
};
const Animate$1 = unsafeLifecyclesPolyfill(Animate);
var _default$a = function(obj, keys2) {
var target = {};
for (var i2 in obj) {
if (keys2.indexOf(i2) >= 0)
continue;
if (!Object.prototype.hasOwnProperty.call(obj, i2))
continue;
target[i2] = obj[i2];
}
return target;
};
var LazyRenderBox = function(_Component) {
_default$c(LazyRenderBox2, _Component);
function LazyRenderBox2() {
_default$g(this, LazyRenderBox2);
return _default$d(this, (LazyRenderBox2.__proto__ || Object.getPrototypeOf(LazyRenderBox2)).apply(this, arguments));
}
_default$f(LazyRenderBox2, [{
key: "shouldComponentUpdate",
value: function shouldComponentUpdate(nextProps) {
return nextProps.hiddenClassName || nextProps.visible;
}
}, {
key: "render",
value: function render2() {
var _props = this.props, hiddenClassName = _props.hiddenClassName, visible = _props.visible, props = _default$a(_props, ["hiddenClassName", "visible"]);
if (hiddenClassName || React__default.default.Children.count(props.children) > 1) {
if (!visible && hiddenClassName) {
props.className += " " + hiddenClassName;
}
return /* @__PURE__ */ jsx("div", {
...props
});
}
return React__default.default.Children.only(props.children);
}
}]);
return LazyRenderBox2;
}(React$a.Component);
LazyRenderBox.propTypes = {
children: propTypes.exports.any,
className: propTypes.exports.string,
visible: propTypes.exports.bool,
hiddenClassName: propTypes.exports.string
};
var PopupInner = function(_Component) {
_default$c(PopupInner2, _Component);
function PopupInner2() {
_default$g(this, PopupInner2);
return _default$d(this, (PopupInner2.__proto__ || Object.getPrototypeOf(PopupInner2)).apply(this, arguments));
}
_default$f(PopupInner2, [{
key: "render",
value: function render2() {
var props = this.props;
var className = props.className;
if (!props.visible) {
className += " " + props.hiddenClassName;
}
return /* @__PURE__ */ jsx("div", {
className,
onMouseEnter: props.onMouseEnter,
onMouseLeave: props.onMouseLeave,
style: props.style,
children: /* @__PURE__ */ jsx(LazyRenderBox, {
className: props.prefixCls + "-content",
visible: props.visible,
children: props.children
})
});
}
}]);
return PopupInner2;
}(React$a.Component);
PopupInner.propTypes = {
hiddenClassName: propTypes.exports.string,
className: propTypes.exports.string,
prefixCls: propTypes.exports.string,
onMouseEnter: propTypes.exports.func,
onMouseLeave: propTypes.exports.func,
children: propTypes.exports.any
};
function isPointsEq(a1, a2) {
return a1[0] === a2[0] && a1[1] === a2[1];
}
function getAlignFromPlacement(builtinPlacements, placementStr, align) {
var baseAlign = builtinPlacements[placementStr] || {};
return _default$i({}, baseAlign, align);
}
function getPopupClassNameFromAlign(builtinPlacements, prefixCls, align) {
var points = align.points;
for (var placement in builtinPlacements) {
if (builtinPlacements.hasOwnProperty(placement)) {
if (isPointsEq(builtinPlacements[placement].points, points)) {
return prefixCls + "-placement-" + placement;
}
}
}
return "";
}
function saveRef(name2, component) {
this[name2] = component;
}
var Popup = function(_Component) {
_default$c(Popup2, _Component);
function Popup2(props) {
_default$g(this, Popup2);
var _this2 = _default$d(this, (Popup2.__proto__ || Object.getPrototypeOf(Popup2)).call(this, props));
_initialiseProps.call(_this2);
_this2.savePopupRef = saveRef.bind(_this2, "popupInstance");
_this2.saveAlignRef = saveRef.bind(_this2, "alignInstance");
return _this2;
}
_default$f(Popup2, [{
key: "componentDidMount",
value: function componentDidMount() {
this.rootNode = this.getPopupDomNode();
}
}, {
key: "getPopupDomNode",
value: function getPopupDomNode() {
return ReactDOM__default.default.findDOMNode(this.popupInstance);
}
}, {
key: "getMaskTransitionName",
value: function getMaskTransitionName() {
var props = this.props;
var transitionName2 = props.maskTransitionName;
var animation = props.maskAnimation;
if (!transitionName2 && animation) {
transitionName2 = props.prefixCls + "-" + animation;
}
return transitionName2;
}
}, {
key: "getTransitionName",
value: function getTransitionName2() {
var props = this.props;
var transitionName2 = props.transitionName;
if (!transitionName2 && props.animation) {
transitionName2 = props.prefixCls + "-" + props.animation;
}
return transitionName2;
}
}, {
key: "getClassName",
value: function getClassName(currentAlignClassName) {
return this.props.prefixCls + " " + this.props.className + " " + currentAlignClassName;
}
}, {
key: "getPopupElement",
value: function getPopupElement() {
var savePopupRef = this.savePopupRef, props = this.props;
var align = props.align, style2 = props.style, visible = props.visible, prefixCls = props.prefixCls, destroyPopupOnHide = props.destroyPopupOnHide;
var className = this.getClassName(this.currentAlignClassName || props.getClassNameFromAlign(align));
var hiddenClassName = prefixCls + "-hidden";
if (!visible) {
this.currentAlignClassName = null;
}
var newStyle = _default$i({}, style2, this.getZIndexStyle());
var popupInnerProps = {
className,
prefixCls,
ref: savePopupRef,
onMouseEnter: props.onMouseEnter,
onMouseLeave: props.onMouseLeave,
style: newStyle
};
if (destroyPopupOnHide) {
return /* @__PURE__ */ jsx(Animate$1, {
component: "",
exclusive: true,
transitionAppear: true,
transitionName: this.getTransitionName(),
children: visible ? /* @__PURE__ */ jsx(Align, {
target: this.getTarget,
ref: this.saveAlignRef,
monitorWindowResize: true,
align,
onAlign: this.onAlign,
children: /* @__PURE__ */ jsx(PopupInner, {
visible: true,
...popupInnerProps,
children: props.children
})
}, "popup") : null
});
}
return /* @__PURE__ */ jsx(Animate$1, {
component: "",
exclusive: true,
transitionAppear: true,
transitionName: this.getTransitionName(),
showProp: "xVisible",
children: /* @__PURE__ */ jsx(Align, {
target: this.getTarget,
ref: this.saveAlignRef,
monitorWindowResize: true,
xVisible: visible,
childrenProps: {
visible: "xVisible"
},
disabled: !visible,
align,
onAlign: this.onAlign,
children: /* @__PURE__ */ jsx(PopupInner, {
hiddenClassName,
...popupInnerProps,
children: props.children
})
}, "popup")
});
}
}, {
key: "getZIndexStyle",
value: function getZIndexStyle() {
var style2 = {};
var props = this.props;
if (props.zIndex !== void 0) {
style2.zIndex = props.zIndex;
}
return style2;
}
}, {
key: "getMaskElement",
value: function getMaskElement() {
var props = this.props;
var maskElement = void 0;
if (props.mask) {
var maskTransition = this.getMaskTransitionName();
maskElement = /* @__PURE__ */ jsx(LazyRenderBox, {
style: this.getZIndexStyle(),
className: props.prefixCls + "-mask",
hiddenClassName: props.prefixCls + "-mask-hidden",
visible: props.visible
}, "mask");
if (maskTransition) {
maskElement = /* @__PURE__ */ jsx(Animate$1, {
showProp: "visible",
transitionAppear: true,
component: "",
transitionName: maskTransition,
children: maskElement
}, "mask");
}
}
return maskElement;
}
}, {
key: "render",
value: function render2() {
return /* @__PURE__ */ jsxs("div", {
children: [this.getMaskElement(), this.getPopupElement()]
});
}
}]);
return Popup2;
}(React$a.Component);
Popup.propTypes = {
visible: propTypes.exports.bool,
style: propTypes.exports.object,
getClassNameFromAlign: propTypes.exports.func,
onAlign: propTypes.exports.func,
getRootDomNode: propTypes.exports.func,
onMouseEnter: propTypes.exports.func,
align: propTypes.exports.any,
destroyPopupOnHide: propTypes.exports.bool,
className: propTypes.exports.string,
prefixCls: propTypes.exports.string,
onMouseLeave: propTypes.exports.func
};
var _initialiseProps = function _initialiseProps2() {
var _this2 = this;
this.onAlign = function(popupDomNode, align) {
var props = _this2.props;
var currentAlignClassName = props.getClassNameFromAlign(align);
if (_this2.currentAlignClassName !== currentAlignClassName) {
_this2.currentAlignClassName = currentAlignClassName;
popupDomNode.className = _this2.getClassName(currentAlignClassName);
}
props.onAlign(popupDomNode, align);
};
this.getTarget = function() {
return _this2.props.getRootDomNode();
};
};
var getContainerRenderMixin$1 = {};
Object.defineProperty(getContainerRenderMixin$1, "__esModule", {
value: true
});
var _default$9 = getContainerRenderMixin$1.default = getContainerRenderMixin;
var _reactDom = _interopRequireDefault$9(ReactDOM__default.default);
function _interopRequireDefault$9(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
function ownKeys$1(object2, enumerableOnly) {
var keys2 = Object.keys(object2);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object2);
if (enumerableOnly)
symbols = symbols.filter(function(sym) {
return Object.getOwnPropertyDescriptor(object2, sym).enumerable;
});
keys2.push.apply(keys2, symbols);
}
return keys2;
}
function _objectSpread$1(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = arguments[i2] != null ? arguments[i2] : {};
if (i2 % 2) {
ownKeys$1(Object(source), true).forEach(function(key2) {
_defineProperty$5(target, key2, source[key2]);
});
} else if (Object.getOwnPropertyDescriptors) {
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
} else {
ownKeys$1(Object(source)).forEach(function(key2) {
Object.defineProperty(target, key2, Object.getOwnPropertyDescriptor(source, key2));
});
}
}
return target;
}
function _defineProperty$5(obj, key2, value) {
if (key2 in obj) {
Object.defineProperty(obj, key2, { value, enumerable: true, configurable: true, writable: true });
} else {
obj[key2] = value;
}
return obj;
}
function defaultGetContainer() {
var container = document.createElement("div");
document.body.appendChild(container);
return container;
}
function getContainerRenderMixin(config) {
var _config$autoMount = config.autoMount, autoMount = _config$autoMount === void 0 ? true : _config$autoMount, _config$autoDestroy = config.autoDestroy, autoDestroy = _config$autoDestroy === void 0 ? true : _config$autoDestroy, isVisible2 = config.isVisible, isForceRender = config.isForceRender, getComponent = config.getComponent, _config$getContainer = config.getContainer, getContainer2 = _config$getContainer === void 0 ? defaultGetContainer : _config$getContainer;
var mixin;
function _renderComponent(instance, componentArg, ready) {
if (!isVisible2 || instance._component || isVisible2(instance) || isForceRender && isForceRender(instance)) {
if (!instance._container) {
instance._container = getContainer2(instance);
}
var component;
if (instance.getComponent) {
component = instance.getComponent(componentArg);
} else {
component = getComponent(instance, componentArg);
}
_reactDom.default.unstable_renderSubtreeIntoContainer(instance, component, instance._container, function callback() {
instance._component = this;
if (ready) {
ready.call(this);
}
});
}
}
if (autoMount) {
mixin = _objectSpread$1(_objectSpread$1({}, mixin), {}, {
componentDidMount: function componentDidMount() {
_renderComponent(this);
},
componentDidUpdate: function componentDidUpdate() {
_renderComponent(this);
}
});
}
if (!autoMount || !autoDestroy) {
mixin = _objectSpread$1(_objectSpread$1({}, mixin), {}, {
renderComponent: function renderComponent(componentArg, ready) {
_renderComponent(this, componentArg, ready);
}
});
}
function _removeContainer(instance) {
if (instance._container) {
var container = instance._container;
_reactDom.default.unmountComponentAtNode(container);
container.parentNode.removeChild(container);
instance._container = null;
}
}
if (autoDestroy) {
mixin = _objectSpread$1(_objectSpread$1({}, mixin), {}, {
componentWillUnmount: function componentWillUnmount() {
_removeContainer(this);
}
});
} else {
mixin = _objectSpread$1(_objectSpread$1({}, mixin), {}, {
removeContainer: function removeContainer() {
_removeContainer(this);
}
});
}
return mixin;
}
function noop$1() {
}
function returnEmptyString() {
return "";
}
function returnDocument() {
return window.document;
}
var isMobile = typeof navigator !== "undefined" && !!navigator.userAgent.match(/(Android|iPhone|iPad|iPod|iOS|UCWEB)/i);
var ALL_HANDLERS = ["onClick", "onMouseDown", "onTouchStart", "onMouseEnter", "onMouseLeave", "onFocus", "onBlur"];
var Trigger = createReactClass({
displayName: "Trigger",
propTypes: {
children: propTypes.exports.any,
action: propTypes.exports.oneOfType([propTypes.exports.string, propTypes.exports.arrayOf(propTypes.exports.string)]),
showAction: propTypes.exports.any,
hideAction: propTypes.exports.any,
getPopupClassNameFromAlign: propTypes.exports.any,
onPopupVisibleChange: propTypes.exports.func,
afterPopupVisibleChange: propTypes.exports.func,
popup: propTypes.exports.oneOfType([propTypes.exports.node, propTypes.exports.func]).isRequired,
popupStyle: propTypes.exports.object,
prefixCls: propTypes.exports.string,
popupClassName: propTypes.exports.string,
popupPlacement: propTypes.exports.string,
builtinPlacements: propTypes.exports.object,
popupTransitionName: propTypes.exports.oneOfType([propTypes.exports.string, propTypes.exports.object]),
popupAnimation: propTypes.exports.any,
mouseEnterDelay: propTypes.exports.number,
mouseLeaveDelay: propTypes.exports.number,
zIndex: propTypes.exports.number,
focusDelay: propTypes.exports.number,
blurDelay: propTypes.exports.number,
getPopupContainer: propTypes.exports.func,
getDocument: propTypes.exports.func,
destroyPopupOnHide: propTypes.exports.bool,
mask: propTypes.exports.bool,
maskClosable: propTypes.exports.bool,
onPopupAlign: propTypes.exports.func,
popupAlign: propTypes.exports.object,
popupVisible: propTypes.exports.bool,
maskTransitionName: propTypes.exports.oneOfType([propTypes.exports.string, propTypes.exports.object]),
maskAnimation: propTypes.exports.string
},
mixins: [_default$9({
autoMount: false,
isVisible: function isVisible2(instance) {
return instance.state.popupVisible;
},
getContainer: function getContainer2(instance) {
var props = instance.props;
var popupContainer = document.createElement("div");
popupContainer.style.position = "absolute";
popupContainer.style.top = "0";
popupContainer.style.left = "0";
popupContainer.style.width = "100%";
var mountNode = props.getPopupContainer ? props.getPopupContainer(ReactDOM2.findDOMNode(instance)) : props.getDocument().body;
mountNode.appendChild(popupContainer);
return popupContainer;
}
})],
getDefaultProps: function getDefaultProps() {
return {
prefixCls: "rc-trigger-popup",
getPopupClassNameFromAlign: returnEmptyString,
getDocument: returnDocument,
onPopupVisibleChange: noop$1,
afterPopupVisibleChange: noop$1,
onPopupAlign: noop$1,
popupClassName: "",
mouseEnterDelay: 0,
mouseLeaveDelay: 0.1,
focusDelay: 0,
blurDelay: 0.15,
popupStyle: {},
destroyPopupOnHide: false,
popupAlign: {},
defaultPopupVisible: false,
mask: false,
maskClosable: true,
action: [],
showAction: [],
hideAction: []
};
},
getInitialState: function getInitialState() {
var props = this.props;
var popupVisible = void 0;
if ("popupVisible" in props) {
popupVisible = !!props.popupVisible;
} else {
popupVisible = !!props.defaultPopupVisible;
}
return {
popupVisible
};
},
componentWillMount: function componentWillMount() {
var _this2 = this;
ALL_HANDLERS.forEach(function(h2) {
_this2["fire" + h2] = function(e2) {
_this2.fireEvents(h2, e2);
};
});
},
componentDidMount: function componentDidMount() {
this.componentDidUpdate({}, {
popupVisible: this.state.popupVisible
});
},
componentWillReceiveProps: function componentWillReceiveProps(_ref) {
var popupVisible = _ref.popupVisible;
if (popupVisible !== void 0) {
this.setState({
popupVisible
});
}
},
componentDidUpdate: function componentDidUpdate(_, prevState) {
var props = this.props;
var state = this.state;
this.renderComponent(null, function() {
if (prevState.popupVisible !== state.popupVisible) {
props.afterPopupVisibleChange(state.popupVisible);
}
});
if (state.popupVisible) {
var currentDocument = void 0;
if (!this.clickOutsideHandler && this.isClickToHide()) {
currentDocument = props.getDocument();
this.clickOutsideHandler = _default$h(currentDocument, "mousedown", this.onDocumentClick);
}
if (!this.touchOutsideHandler && isMobile) {
currentDocument = currentDocument || props.getDocument();
this.touchOutsideHandler = _default$h(currentDocument, "click", this.onDocumentClick);
}
return;
}
this.clearOutsideHandler();
},
componentWillUnmount: function componentWillUnmount() {
this.clearDelayTimer();
this.clearOutsideHandler();
},
onMouseEnter: function onMouseEnter(e2) {
this.fireEvents("onMouseEnter", e2);
this.delaySetPopupVisible(true, this.props.mouseEnterDelay);
},
onMouseLeave: function onMouseLeave(e2) {
this.fireEvents("onMouseLeave", e2);
this.delaySetPopupVisible(false, this.props.mouseLeaveDelay);
},
onPopupMouseEnter: function onPopupMouseEnter() {
this.clearDelayTimer();
},
onPopupMouseLeave: function onPopupMouseLeave(e2) {
if (e2.relatedTarget && !e2.relatedTarget.setTimeout && this._component && this._component.getPopupDomNode && contains$1(this._component.getPopupDomNode(), e2.relatedTarget)) {
return;
}
this.delaySetPopupVisible(false, this.props.mouseLeaveDelay);
},
onFocus: function onFocus(e2) {
this.fireEvents("onFocus", e2);
this.clearDelayTimer();
if (this.isFocusToShow()) {
this.focusTime = Date.now();
this.delaySetPopupVisible(true, this.props.focusDelay);
}
},
onMouseDown: function onMouseDown(e2) {
this.fireEvents("onMouseDown", e2);
this.preClickTime = Date.now();
},
onTouchStart: function onTouchStart(e2) {
this.fireEvents("onTouchStart", e2);
this.preTouchTime = Date.now();
},
onBlur: function onBlur(e2) {
this.fireEvents("onBlur", e2);
this.clearDelayTimer();
if (this.isBlurToHide()) {
this.delaySetPopupVisible(false, this.props.blurDelay);
}
},
onClick: function onClick(event) {
this.fireEvents("onClick", event);
if (this.focusTime) {
var preTime = void 0;
if (this.preClickTime && this.preTouchTime) {
preTime = Math.min(this.preClickTime, this.preTouchTime);
} else if (this.preClickTime) {
preTime = this.preClickTime;
} else if (this.preTouchTime) {
preTime = this.preTouchTime;
}
if (Math.abs(preTime - this.focusTime) < 20) {
return;
}
this.focusTime = 0;
}
this.preClickTime = 0;
this.preTouchTime = 0;
event.preventDefault();
var nextVisible = !this.state.popupVisible;
if (this.isClickToHide() && !nextVisible || nextVisible && this.isClickToShow()) {
this.setPopupVisible(!this.state.popupVisible);
}
},
onDocumentClick: function onDocumentClick(event) {
if (this.props.mask && !this.props.maskClosable) {
return;
}
var target = event.target;
var root2 = ReactDOM2.findDOMNode(this);
var popupNode = this.getPopupDomNode();
if (!contains$1(root2, target) && !contains$1(popupNode, target)) {
this.close();
}
},
getPopupDomNode: function getPopupDomNode() {
if (this._component && this._component.getPopupDomNode) {
return this._component.getPopupDomNode();
}
return null;
},
getRootDomNode: function getRootDomNode() {
return ReactDOM2.findDOMNode(this);
},
getPopupClassNameFromAlign: function getPopupClassNameFromAlign$1(align) {
var className = [];
var props = this.props;
var popupPlacement = props.popupPlacement, builtinPlacements = props.builtinPlacements, prefixCls = props.prefixCls;
if (popupPlacement && builtinPlacements) {
className.push(getPopupClassNameFromAlign(builtinPlacements, prefixCls, align));
}
if (props.getPopupClassNameFromAlign) {
className.push(props.getPopupClassNameFromAlign(align));
}
return className.join(" ");
},
getPopupAlign: function getPopupAlign() {
var props = this.props;
var popupPlacement = props.popupPlacement, popupAlign = props.popupAlign, builtinPlacements = props.builtinPlacements;
if (popupPlacement && builtinPlacements) {
return getAlignFromPlacement(builtinPlacements, popupPlacement, popupAlign);
}
return popupAlign;
},
getComponent: function getComponent() {
var props = this.props, state = this.state;
var mouseProps = {};
if (this.isMouseEnterToShow()) {
mouseProps.onMouseEnter = this.onPopupMouseEnter;
}
if (this.isMouseLeaveToHide()) {
mouseProps.onMouseLeave = this.onPopupMouseLeave;
}
return /* @__PURE__ */ jsx(Popup, {
prefixCls: props.prefixCls,
destroyPopupOnHide: props.destroyPopupOnHide,
visible: state.popupVisible,
className: props.popupClassName,
action: props.action,
align: this.getPopupAlign(),
onAlign: props.onPopupAlign,
animation: props.popupAnimation,
getClassNameFromAlign: this.getPopupClassNameFromAlign,
...mouseProps,
getRootDomNode: this.getRootDomNode,
style: props.popupStyle,
mask: props.mask,
zIndex: props.zIndex,
transitionName: props.popupTransitionName,
maskAnimation: props.maskAnimation,
maskTransitionName: props.maskTransitionName,
children: typeof props.popup === "function" ? props.popup() : props.popup
});
},
setPopupVisible: function setPopupVisible(popupVisible) {
this.clearDelayTimer();
if (this.state.popupVisible !== popupVisible) {
if (!("popupVisible" in this.props)) {
this.setState({
popupVisible
});
}
this.props.onPopupVisibleChange(popupVisible);
}
},
delaySetPopupVisible: function delaySetPopupVisible(visible, delayS) {
var _this2 = this;
var delay = delayS * 1e3;
this.clearDelayTimer();
if (delay) {
this.delayTimer = setTimeout(function() {
_this2.setPopupVisible(visible);
_this2.clearDelayTimer();
}, delay);
} else {
this.setPopupVisible(visible);
}
},
clearDelayTimer: function clearDelayTimer() {
if (this.delayTimer) {
clearTimeout(this.delayTimer);
this.delayTimer = null;
}
},
clearOutsideHandler: function clearOutsideHandler() {
if (this.clickOutsideHandler) {
this.clickOutsideHandler.remove();
this.clickOutsideHandler = null;
}
if (this.touchOutsideHandler) {
this.touchOutsideHandler.remove();
this.touchOutsideHandler = null;
}
},
createTwoChains: function createTwoChains(event) {
var childPros = this.props.children.props;
var props = this.props;
if (childPros[event] && props[event]) {
return this["fire" + event];
}
return childPros[event] || props[event];
},
isClickToShow: function isClickToShow() {
var _props = this.props, action = _props.action, showAction = _props.showAction;
return action.indexOf("click") !== -1 || showAction.indexOf("click") !== -1;
},
isClickToHide: function isClickToHide() {
var _props2 = this.props, action = _props2.action, hideAction = _props2.hideAction;
return action.indexOf("click") !== -1 || hideAction.indexOf("click") !== -1;
},
isMouseEnterToShow: function isMouseEnterToShow() {
var _props3 = this.props, action = _props3.action, showAction = _props3.showAction;
return action.indexOf("hover") !== -1 || showAction.indexOf("mouseEnter") !== -1;
},
isMouseLeaveToHide: function isMouseLeaveToHide() {
var _props4 = this.props, action = _props4.action, hideAction = _props4.hideAction;
return action.indexOf("hover") !== -1 || hideAction.indexOf("mouseLeave") !== -1;
},
isFocusToShow: function isFocusToShow() {
var _props5 = this.props, action = _props5.action, showAction = _props5.showAction;
return action.indexOf("focus") !== -1 || showAction.indexOf("focus") !== -1;
},
isBlurToHide: function isBlurToHide() {
var _props6 = this.props, action = _props6.action, hideAction = _props6.hideAction;
return action.indexOf("focus") !== -1 || hideAction.indexOf("blur") !== -1;
},
forcePopupAlign: function forcePopupAlign() {
if (this.state.popupVisible && this._component && this._component.alignInstance) {
this._component.alignInstance.forceAlign();
}
},
fireEvents: function fireEvents(type2, e2) {
var childCallback = this.props.children.props[type2];
if (childCallback) {
childCallback(e2);
}
var callback = this.props[type2];
if (callback) {
callback(e2);
}
},
close: function close() {
this.setPopupVisible(false);
},
render: function render2() {
var props = this.props;
var children = props.children;
var child = React__default.default.Children.only(children);
var newChildProps = {};
if (this.isClickToHide() || this.isClickToShow()) {
newChildProps.onClick = this.onClick;
newChildProps.onMouseDown = this.onMouseDown;
newChildProps.onTouchStart = this.onTouchStart;
} else {
newChildProps.onClick = this.createTwoChains("onClick");
newChildProps.onMouseDown = this.createTwoChains("onMouseDown");
newChildProps.onTouchStart = this.createTwoChains("onTouchStart");
}
if (this.isMouseEnterToShow()) {
newChildProps.onMouseEnter = this.onMouseEnter;
} else {
newChildProps.onMouseEnter = this.createTwoChains("onMouseEnter");
}
if (this.isMouseLeaveToHide()) {
newChildProps.onMouseLeave = this.onMouseLeave;
} else {
newChildProps.onMouseLeave = this.createTwoChains("onMouseLeave");
}
if (this.isFocusToShow() || this.isBlurToHide()) {
newChildProps.onFocus = this.onFocus;
newChildProps.onBlur = this.onBlur;
} else {
newChildProps.onFocus = this.createTwoChains("onFocus");
newChildProps.onBlur = this.createTwoChains("onBlur");
}
return React__default.default.cloneElement(child, newChildProps);
}
});
const es = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
default: Trigger
}, Symbol.toStringTag, { value: "Module" }));
const require$$3$1 = /* @__PURE__ */ getAugmentedNamespace(es);
var Panel$1 = { exports: {} };
var color = { exports: {} };
var tinycolor = { exports: {} };
(function(module2, exports2) {
(function(global2, factory2) {
module2.exports = factory2();
})(commonjsGlobal, function() {
function _typeof4(obj) {
"@babel/helpers - typeof";
return _typeof4 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof4(obj);
}
var trimLeft = /^\s+/;
var trimRight = /\s+$/;
function tinycolor2(color2, opts) {
color2 = color2 ? color2 : "";
opts = opts || {};
if (color2 instanceof tinycolor2) {
return color2;
}
if (!(this instanceof tinycolor2)) {
return new tinycolor2(color2, opts);
}
var rgb = inputToRGB2(color2);
this._originalInput = color2, this._r = rgb.r, this._g = rgb.g, this._b = rgb.b, this._a = rgb.a, this._roundA = Math.round(100 * this._a) / 100, this._format = opts.format || rgb.format;
this._gradientType = opts.gradientType;
if (this._r < 1)
this._r = Math.round(this._r);
if (this._g < 1)
this._g = Math.round(this._g);
if (this._b < 1)
this._b = Math.round(this._b);
this._ok = rgb.ok;
}
tinycolor2.prototype = {
isDark: function isDark() {
return this.getBrightness() < 128;
},
isLight: function isLight() {
return !this.isDark();
},
isValid: function isValid() {
return this._ok;
},
getOriginalInput: function getOriginalInput() {
return this._originalInput;
},
getFormat: function getFormat2() {
return this._format;
},
getAlpha: function getAlpha() {
return this._a;
},
getBrightness: function getBrightness() {
var rgb = this.toRgb();
return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1e3;
},
getLuminance: function getLuminance() {
var rgb = this.toRgb();
var RsRGB, GsRGB, BsRGB, R, G, B;
RsRGB = rgb.r / 255;
GsRGB = rgb.g / 255;
BsRGB = rgb.b / 255;
if (RsRGB <= 0.03928)
R = RsRGB / 12.92;
else
R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);
if (GsRGB <= 0.03928)
G = GsRGB / 12.92;
else
G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);
if (BsRGB <= 0.03928)
B = BsRGB / 12.92;
else
B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);
return 0.2126 * R + 0.7152 * G + 0.0722 * B;
},
setAlpha: function setAlpha(value) {
this._a = boundAlpha2(value);
this._roundA = Math.round(100 * this._a) / 100;
return this;
},
toHsv: function toHsv2() {
var hsv = rgbToHsv2(this._r, this._g, this._b);
return {
h: hsv.h * 360,
s: hsv.s,
v: hsv.v,
a: this._a
};
},
toHsvString: function toHsvString() {
var hsv = rgbToHsv2(this._r, this._g, this._b);
var h2 = Math.round(hsv.h * 360), s = Math.round(hsv.s * 100), v2 = Math.round(hsv.v * 100);
return this._a == 1 ? "hsv(" + h2 + ", " + s + "%, " + v2 + "%)" : "hsva(" + h2 + ", " + s + "%, " + v2 + "%, " + this._roundA + ")";
},
toHsl: function toHsl() {
var hsl = rgbToHsl2(this._r, this._g, this._b);
return {
h: hsl.h * 360,
s: hsl.s,
l: hsl.l,
a: this._a
};
},
toHslString: function toHslString() {
var hsl = rgbToHsl2(this._r, this._g, this._b);
var h2 = Math.round(hsl.h * 360), s = Math.round(hsl.s * 100), l2 = Math.round(hsl.l * 100);
return this._a == 1 ? "hsl(" + h2 + ", " + s + "%, " + l2 + "%)" : "hsla(" + h2 + ", " + s + "%, " + l2 + "%, " + this._roundA + ")";
},
toHex: function toHex2(allow3Char) {
return rgbToHex2(this._r, this._g, this._b, allow3Char);
},
toHexString: function toHexString(allow3Char) {
return "#" + this.toHex(allow3Char);
},
toHex8: function toHex8(allow4Char) {
return rgbaToHex2(this._r, this._g, this._b, this._a, allow4Char);
},
toHex8String: function toHex8String(allow4Char) {
return "#" + this.toHex8(allow4Char);
},
toRgb: function toRgb() {
return {
r: Math.round(this._r),
g: Math.round(this._g),
b: Math.round(this._b),
a: this._a
};
},
toRgbString: function toRgbString() {
return this._a == 1 ? "rgb(" + Math.round(this._r) + ", " + Math.round(this._g) + ", " + Math.round(this._b) + ")" : "rgba(" + Math.round(this._r) + ", " + Math.round(this._g) + ", " + Math.round(this._b) + ", " + this._roundA + ")";
},
toPercentageRgb: function toPercentageRgb() {
return {
r: Math.round(bound012(this._r, 255) * 100) + "%",
g: Math.round(bound012(this._g, 255) * 100) + "%",
b: Math.round(bound012(this._b, 255) * 100) + "%",
a: this._a
};
},
toPercentageRgbString: function toPercentageRgbString() {
return this._a == 1 ? "rgb(" + Math.round(bound012(this._r, 255) * 100) + "%, " + Math.round(bound012(this._g, 255) * 100) + "%, " + Math.round(bound012(this._b, 255) * 100) + "%)" : "rgba(" + Math.round(bound012(this._r, 255) * 100) + "%, " + Math.round(bound012(this._g, 255) * 100) + "%, " + Math.round(bound012(this._b, 255) * 100) + "%, " + this._roundA + ")";
},
toName: function toName() {
if (this._a === 0) {
return "transparent";
}
if (this._a < 1) {
return false;
}
return hexNames[rgbToHex2(this._r, this._g, this._b, true)] || false;
},
toFilter: function toFilter(secondColor) {
var hex8String = "#" + rgbaToArgbHex(this._r, this._g, this._b, this._a);
var secondHex8String = hex8String;
var gradientType = this._gradientType ? "GradientType = 1, " : "";
if (secondColor) {
var s = tinycolor2(secondColor);
secondHex8String = "#" + rgbaToArgbHex(s._r, s._g, s._b, s._a);
}
return "progid:DXImageTransform.Microsoft.gradient(" + gradientType + "startColorstr=" + hex8String + ",endColorstr=" + secondHex8String + ")";
},
toString: function toString2(format2) {
var formatSet = !!format2;
format2 = format2 || this._format;
var formattedString = false;
var hasAlpha = this._a < 1 && this._a >= 0;
var needsAlphaFormat = !formatSet && hasAlpha && (format2 === "hex" || format2 === "hex6" || format2 === "hex3" || format2 === "hex4" || format2 === "hex8" || format2 === "name");
if (needsAlphaFormat) {
if (format2 === "name" && this._a === 0) {
return this.toName();
}
return this.toRgbString();
}
if (format2 === "rgb") {
formattedString = this.toRgbString();
}
if (format2 === "prgb") {
formattedString = this.toPercentageRgbString();
}
if (format2 === "hex" || format2 === "hex6") {
formattedString = this.toHexString();
}
if (format2 === "hex3") {
formattedString = this.toHexString(true);
}
if (format2 === "hex4") {
formattedString = this.toHex8String(true);
}
if (format2 === "hex8") {
formattedString = this.toHex8String();
}
if (format2 === "name") {
formattedString = this.toName();
}
if (format2 === "hsl") {
formattedString = this.toHslString();
}
if (format2 === "hsv") {
formattedString = this.toHsvString();
}
return formattedString || this.toHexString();
},
clone: function clone() {
return tinycolor2(this.toString());
},
_applyModification: function _applyModification(fn, args) {
var color2 = fn.apply(null, [this].concat([].slice.call(args)));
this._r = color2._r;
this._g = color2._g;
this._b = color2._b;
this.setAlpha(color2._a);
return this;
},
lighten: function lighten() {
return this._applyModification(_lighten, arguments);
},
brighten: function brighten() {
return this._applyModification(_brighten, arguments);
},
darken: function darken() {
return this._applyModification(_darken, arguments);
},
desaturate: function desaturate() {
return this._applyModification(_desaturate, arguments);
},
saturate: function saturate() {
return this._applyModification(_saturate, arguments);
},
greyscale: function greyscale() {
return this._applyModification(_greyscale, arguments);
},
spin: function spin() {
return this._applyModification(_spin, arguments);
},
_applyCombination: function _applyCombination(fn, args) {
return fn.apply(null, [this].concat([].slice.call(args)));
},
analogous: function analogous() {
return this._applyCombination(_analogous, arguments);
},
complement: function complement() {
return this._applyCombination(_complement, arguments);
},
monochromatic: function monochromatic() {
return this._applyCombination(_monochromatic, arguments);
},
splitcomplement: function splitcomplement() {
return this._applyCombination(_splitcomplement, arguments);
},
triad: function triad() {
return this._applyCombination(polyad, [3]);
},
tetrad: function tetrad() {
return this._applyCombination(polyad, [4]);
}
};
tinycolor2.fromRatio = function(color2, opts) {
if (_typeof4(color2) == "object") {
var newColor = {};
for (var i2 in color2) {
if (color2.hasOwnProperty(i2)) {
if (i2 === "a") {
newColor[i2] = color2[i2];
} else {
newColor[i2] = convertToPercentage2(color2[i2]);
}
}
}
color2 = newColor;
}
return tinycolor2(color2, opts);
};
function inputToRGB2(color2) {
var rgb = {
r: 0,
g: 0,
b: 0
};
var a = 1;
var s = null;
var v2 = null;
var l2 = null;
var ok = false;
var format2 = false;
if (typeof color2 == "string") {
color2 = stringInputToObject2(color2);
}
if (_typeof4(color2) == "object") {
if (isValidCSSUnit2(color2.r) && isValidCSSUnit2(color2.g) && isValidCSSUnit2(color2.b)) {
rgb = rgbToRgb2(color2.r, color2.g, color2.b);
ok = true;
format2 = String(color2.r).substr(-1) === "%" ? "prgb" : "rgb";
} else if (isValidCSSUnit2(color2.h) && isValidCSSUnit2(color2.s) && isValidCSSUnit2(color2.v)) {
s = convertToPercentage2(color2.s);
v2 = convertToPercentage2(color2.v);
rgb = hsvToRgb2(color2.h, s, v2);
ok = true;
format2 = "hsv";
} else if (isValidCSSUnit2(color2.h) && isValidCSSUnit2(color2.s) && isValidCSSUnit2(color2.l)) {
s = convertToPercentage2(color2.s);
l2 = convertToPercentage2(color2.l);
rgb = hslToRgb2(color2.h, s, l2);
ok = true;
format2 = "hsl";
}
if (color2.hasOwnProperty("a")) {
a = color2.a;
}
}
a = boundAlpha2(a);
return {
ok,
format: color2.format || format2,
r: Math.min(255, Math.max(rgb.r, 0)),
g: Math.min(255, Math.max(rgb.g, 0)),
b: Math.min(255, Math.max(rgb.b, 0)),
a
};
}
function rgbToRgb2(r2, g2, b2) {
return {
r: bound012(r2, 255) * 255,
g: bound012(g2, 255) * 255,
b: bound012(b2, 255) * 255
};
}
function rgbToHsl2(r2, g2, b2) {
r2 = bound012(r2, 255);
g2 = bound012(g2, 255);
b2 = bound012(b2, 255);
var max = Math.max(r2, g2, b2), min = Math.min(r2, g2, b2);
var h2, s, l2 = (max + min) / 2;
if (max == min) {
h2 = s = 0;
} else {
var d2 = max - min;
s = l2 > 0.5 ? d2 / (2 - max - min) : d2 / (max + min);
switch (max) {
case r2:
h2 = (g2 - b2) / d2 + (g2 < b2 ? 6 : 0);
break;
case g2:
h2 = (b2 - r2) / d2 + 2;
break;
case b2:
h2 = (r2 - g2) / d2 + 4;
break;
}
h2 /= 6;
}
return {
h: h2,
s,
l: l2
};
}
function hslToRgb2(h2, s, l2) {
var r2, g2, b2;
h2 = bound012(h2, 360);
s = bound012(s, 100);
l2 = bound012(l2, 100);
function hue2rgb2(p3, q3, t2) {
if (t2 < 0)
t2 += 1;
if (t2 > 1)
t2 -= 1;
if (t2 < 1 / 6)
return p3 + (q3 - p3) * 6 * t2;
if (t2 < 1 / 2)
return q3;
if (t2 < 2 / 3)
return p3 + (q3 - p3) * (2 / 3 - t2) * 6;
return p3;
}
if (s === 0) {
r2 = g2 = b2 = l2;
} else {
var q2 = l2 < 0.5 ? l2 * (1 + s) : l2 + s - l2 * s;
var p2 = 2 * l2 - q2;
r2 = hue2rgb2(p2, q2, h2 + 1 / 3);
g2 = hue2rgb2(p2, q2, h2);
b2 = hue2rgb2(p2, q2, h2 - 1 / 3);
}
return {
r: r2 * 255,
g: g2 * 255,
b: b2 * 255
};
}
function rgbToHsv2(r2, g2, b2) {
r2 = bound012(r2, 255);
g2 = bound012(g2, 255);
b2 = bound012(b2, 255);
var max = Math.max(r2, g2, b2), min = Math.min(r2, g2, b2);
var h2, s, v2 = max;
var d2 = max - min;
s = max === 0 ? 0 : d2 / max;
if (max == min) {
h2 = 0;
} else {
switch (max) {
case r2:
h2 = (g2 - b2) / d2 + (g2 < b2 ? 6 : 0);
break;
case g2:
h2 = (b2 - r2) / d2 + 2;
break;
case b2:
h2 = (r2 - g2) / d2 + 4;
break;
}
h2 /= 6;
}
return {
h: h2,
s,
v: v2
};
}
function hsvToRgb2(h2, s, v2) {
h2 = bound012(h2, 360) * 6;
s = bound012(s, 100);
v2 = bound012(v2, 100);
var i2 = Math.floor(h2), f2 = h2 - i2, p2 = v2 * (1 - s), q2 = v2 * (1 - f2 * s), t2 = v2 * (1 - (1 - f2) * s), mod = i2 % 6, r2 = [v2, q2, p2, p2, t2, v2][mod], g2 = [t2, v2, v2, q2, p2, p2][mod], b2 = [p2, p2, t2, v2, v2, q2][mod];
return {
r: r2 * 255,
g: g2 * 255,
b: b2 * 255
};
}
function rgbToHex2(r2, g2, b2, allow3Char) {
var hex = [pad22(Math.round(r2).toString(16)), pad22(Math.round(g2).toString(16)), pad22(Math.round(b2).toString(16))];
if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {
return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);
}
return hex.join("");
}
function rgbaToHex2(r2, g2, b2, a, allow4Char) {
var hex = [pad22(Math.round(r2).toString(16)), pad22(Math.round(g2).toString(16)), pad22(Math.round(b2).toString(16)), pad22(convertDecimalToHex2(a))];
if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {
return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);
}
return hex.join("");
}
function rgbaToArgbHex(r2, g2, b2, a) {
var hex = [pad22(convertDecimalToHex2(a)), pad22(Math.round(r2).toString(16)), pad22(Math.round(g2).toString(16)), pad22(Math.round(b2).toString(16))];
return hex.join("");
}
tinycolor2.equals = function(color1, color2) {
if (!color1 || !color2)
return false;
return tinycolor2(color1).toRgbString() == tinycolor2(color2).toRgbString();
};
tinycolor2.random = function() {
return tinycolor2.fromRatio({
r: Math.random(),
g: Math.random(),
b: Math.random()
});
};
function _desaturate(color2, amount) {
amount = amount === 0 ? 0 : amount || 10;
var hsl = tinycolor2(color2).toHsl();
hsl.s -= amount / 100;
hsl.s = clamp012(hsl.s);
return tinycolor2(hsl);
}
function _saturate(color2, amount) {
amount = amount === 0 ? 0 : amount || 10;
var hsl = tinycolor2(color2).toHsl();
hsl.s += amount / 100;
hsl.s = clamp012(hsl.s);
return tinycolor2(hsl);
}
function _greyscale(color2) {
return tinycolor2(color2).desaturate(100);
}
function _lighten(color2, amount) {
amount = amount === 0 ? 0 : amount || 10;
var hsl = tinycolor2(color2).toHsl();
hsl.l += amount / 100;
hsl.l = clamp012(hsl.l);
return tinycolor2(hsl);
}
function _brighten(color2, amount) {
amount = amount === 0 ? 0 : amount || 10;
var rgb = tinycolor2(color2).toRgb();
rgb.r = Math.max(0, Math.min(255, rgb.r - Math.round(255 * -(amount / 100))));
rgb.g = Math.max(0, Math.min(255, rgb.g - Math.round(255 * -(amount / 100))));
rgb.b = Math.max(0, Math.min(255, rgb.b - Math.round(255 * -(amount / 100))));
return tinycolor2(rgb);
}
function _darken(color2, amount) {
amount = amount === 0 ? 0 : amount || 10;
var hsl = tinycolor2(color2).toHsl();
hsl.l -= amount / 100;
hsl.l = clamp012(hsl.l);
return tinycolor2(hsl);
}
function _spin(color2, amount) {
var hsl = tinycolor2(color2).toHsl();
var hue = (hsl.h + amount) % 360;
hsl.h = hue < 0 ? 360 + hue : hue;
return tinycolor2(hsl);
}
function _complement(color2) {
var hsl = tinycolor2(color2).toHsl();
hsl.h = (hsl.h + 180) % 360;
return tinycolor2(hsl);
}
function polyad(color2, number2) {
if (isNaN(number2) || number2 <= 0) {
throw new Error("Argument to polyad must be a positive number");
}
var hsl = tinycolor2(color2).toHsl();
var result = [tinycolor2(color2)];
var step2 = 360 / number2;
for (var i2 = 1; i2 < number2; i2++) {
result.push(tinycolor2({
h: (hsl.h + i2 * step2) % 360,
s: hsl.s,
l: hsl.l
}));
}
return result;
}
function _splitcomplement(color2) {
var hsl = tinycolor2(color2).toHsl();
var h2 = hsl.h;
return [tinycolor2(color2), tinycolor2({
h: (h2 + 72) % 360,
s: hsl.s,
l: hsl.l
}), tinycolor2({
h: (h2 + 216) % 360,
s: hsl.s,
l: hsl.l
})];
}
function _analogous(color2, results, slices) {
results = results || 6;
slices = slices || 30;
var hsl = tinycolor2(color2).toHsl();
var part = 360 / slices;
var ret = [tinycolor2(color2)];
for (hsl.h = (hsl.h - (part * results >> 1) + 720) % 360; --results; ) {
hsl.h = (hsl.h + part) % 360;
ret.push(tinycolor2(hsl));
}
return ret;
}
function _monochromatic(color2, results) {
results = results || 6;
var hsv = tinycolor2(color2).toHsv();
var h2 = hsv.h, s = hsv.s, v2 = hsv.v;
var ret = [];
var modification = 1 / results;
while (results--) {
ret.push(tinycolor2({
h: h2,
s,
v: v2
}));
v2 = (v2 + modification) % 1;
}
return ret;
}
tinycolor2.mix = function(color1, color2, amount) {
amount = amount === 0 ? 0 : amount || 50;
var rgb1 = tinycolor2(color1).toRgb();
var rgb2 = tinycolor2(color2).toRgb();
var p2 = amount / 100;
var rgba = {
r: (rgb2.r - rgb1.r) * p2 + rgb1.r,
g: (rgb2.g - rgb1.g) * p2 + rgb1.g,
b: (rgb2.b - rgb1.b) * p2 + rgb1.b,
a: (rgb2.a - rgb1.a) * p2 + rgb1.a
};
return tinycolor2(rgba);
};
tinycolor2.readability = function(color1, color2) {
var c1 = tinycolor2(color1);
var c2 = tinycolor2(color2);
return (Math.max(c1.getLuminance(), c2.getLuminance()) + 0.05) / (Math.min(c1.getLuminance(), c2.getLuminance()) + 0.05);
};
tinycolor2.isReadable = function(color1, color2, wcag2) {
var readability = tinycolor2.readability(color1, color2);
var wcag2Parms, out;
out = false;
wcag2Parms = validateWCAG2Parms(wcag2);
switch (wcag2Parms.level + wcag2Parms.size) {
case "AAsmall":
case "AAAlarge":
out = readability >= 4.5;
break;
case "AAlarge":
out = readability >= 3;
break;
case "AAAsmall":
out = readability >= 7;
break;
}
return out;
};
tinycolor2.mostReadable = function(baseColor, colorList, args) {
var bestColor = null;
var bestScore = 0;
var readability;
var includeFallbackColors, level, size;
args = args || {};
includeFallbackColors = args.includeFallbackColors;
level = args.level;
size = args.size;
for (var i2 = 0; i2 < colorList.length; i2++) {
readability = tinycolor2.readability(baseColor, colorList[i2]);
if (readability > bestScore) {
bestScore = readability;
bestColor = tinycolor2(colorList[i2]);
}
}
if (tinycolor2.isReadable(baseColor, bestColor, {
level,
size
}) || !includeFallbackColors) {
return bestColor;
} else {
args.includeFallbackColors = false;
return tinycolor2.mostReadable(baseColor, ["#fff", "#000"], args);
}
};
var names2 = tinycolor2.names = {
aliceblue: "f0f8ff",
antiquewhite: "faebd7",
aqua: "0ff",
aquamarine: "7fffd4",
azure: "f0ffff",
beige: "f5f5dc",
bisque: "ffe4c4",
black: "000",
blanchedalmond: "ffebcd",
blue: "00f",
blueviolet: "8a2be2",
brown: "a52a2a",
burlywood: "deb887",
burntsienna: "ea7e5d",
cadetblue: "5f9ea0",
chartreuse: "7fff00",
chocolate: "d2691e",
coral: "ff7f50",
cornflowerblue: "6495ed",
cornsilk: "fff8dc",
crimson: "dc143c",
cyan: "0ff",
darkblue: "00008b",
darkcyan: "008b8b",
darkgoldenrod: "b8860b",
darkgray: "a9a9a9",
darkgreen: "006400",
darkgrey: "a9a9a9",
darkkhaki: "bdb76b",
darkmagenta: "8b008b",
darkolivegreen: "556b2f",
darkorange: "ff8c00",
darkorchid: "9932cc",
darkred: "8b0000",
darksalmon: "e9967a",
darkseagreen: "8fbc8f",
darkslateblue: "483d8b",
darkslategray: "2f4f4f",
darkslategrey: "2f4f4f",
darkturquoise: "00ced1",
darkviolet: "9400d3",
deeppink: "ff1493",
deepskyblue: "00bfff",
dimgray: "696969",
dimgrey: "696969",
dodgerblue: "1e90ff",
firebrick: "b22222",
floralwhite: "fffaf0",
forestgreen: "228b22",
fuchsia: "f0f",
gainsboro: "dcdcdc",
ghostwhite: "f8f8ff",
gold: "ffd700",
goldenrod: "daa520",
gray: "808080",
green: "008000",
greenyellow: "adff2f",
grey: "808080",
honeydew: "f0fff0",
hotpink: "ff69b4",
indianred: "cd5c5c",
indigo: "4b0082",
ivory: "fffff0",
khaki: "f0e68c",
lavender: "e6e6fa",
lavenderblush: "fff0f5",
lawngreen: "7cfc00",
lemonchiffon: "fffacd",
lightblue: "add8e6",
lightcoral: "f08080",
lightcyan: "e0ffff",
lightgoldenrodyellow: "fafad2",
lightgray: "d3d3d3",
lightgreen: "90ee90",
lightgrey: "d3d3d3",
lightpink: "ffb6c1",
lightsalmon: "ffa07a",
lightseagreen: "20b2aa",
lightskyblue: "87cefa",
lightslategray: "789",
lightslategrey: "789",
lightsteelblue: "b0c4de",
lightyellow: "ffffe0",
lime: "0f0",
limegreen: "32cd32",
linen: "faf0e6",
magenta: "f0f",
maroon: "800000",
mediumaquamarine: "66cdaa",
mediumblue: "0000cd",
mediumorchid: "ba55d3",
mediumpurple: "9370db",
mediumseagreen: "3cb371",
mediumslateblue: "7b68ee",
mediumspringgreen: "00fa9a",
mediumturquoise: "48d1cc",
mediumvioletred: "c71585",
midnightblue: "191970",
mintcream: "f5fffa",
mistyrose: "ffe4e1",
moccasin: "ffe4b5",
navajowhite: "ffdead",
navy: "000080",
oldlace: "fdf5e6",
olive: "808000",
olivedrab: "6b8e23",
orange: "ffa500",
orangered: "ff4500",
orchid: "da70d6",
palegoldenrod: "eee8aa",
palegreen: "98fb98",
paleturquoise: "afeeee",
palevioletred: "db7093",
papayawhip: "ffefd5",
peachpuff: "ffdab9",
peru: "cd853f",
pink: "ffc0cb",
plum: "dda0dd",
powderblue: "b0e0e6",
purple: "800080",
rebeccapurple: "663399",
red: "f00",
rosybrown: "bc8f8f",
royalblue: "4169e1",
saddlebrown: "8b4513",
salmon: "fa8072",
sandybrown: "f4a460",
seagreen: "2e8b57",
seashell: "fff5ee",
sienna: "a0522d",
silver: "c0c0c0",
skyblue: "87ceeb",
slateblue: "6a5acd",
slategray: "708090",
slategrey: "708090",
snow: "fffafa",
springgreen: "00ff7f",
steelblue: "4682b4",
tan: "d2b48c",
teal: "008080",
thistle: "d8bfd8",
tomato: "ff6347",
turquoise: "40e0d0",
violet: "ee82ee",
wheat: "f5deb3",
white: "fff",
whitesmoke: "f5f5f5",
yellow: "ff0",
yellowgreen: "9acd32"
};
var hexNames = tinycolor2.hexNames = flip2(names2);
function flip2(o) {
var flipped = {};
for (var i2 in o) {
if (o.hasOwnProperty(i2)) {
flipped[o[i2]] = i2;
}
}
return flipped;
}
function boundAlpha2(a) {
a = parseFloat(a);
if (isNaN(a) || a < 0 || a > 1) {
a = 1;
}
return a;
}
function bound012(n2, max) {
if (isOnePointZero2(n2))
n2 = "100%";
var processPercent = isPercentage2(n2);
n2 = Math.min(max, Math.max(0, parseFloat(n2)));
if (processPercent) {
n2 = parseInt(n2 * max, 10) / 100;
}
if (Math.abs(n2 - max) < 1e-6) {
return 1;
}
return n2 % max / parseFloat(max);
}
function clamp012(val) {
return Math.min(1, Math.max(0, val));
}
function parseIntFromHex2(val) {
return parseInt(val, 16);
}
function isOnePointZero2(n2) {
return typeof n2 == "string" && n2.indexOf(".") != -1 && parseFloat(n2) === 1;
}
function isPercentage2(n2) {
return typeof n2 === "string" && n2.indexOf("%") != -1;
}
function pad22(c2) {
return c2.length == 1 ? "0" + c2 : "" + c2;
}
function convertToPercentage2(n2) {
if (n2 <= 1) {
n2 = n2 * 100 + "%";
}
return n2;
}
function convertDecimalToHex2(d2) {
return Math.round(parseFloat(d2) * 255).toString(16);
}
function convertHexToDecimal2(h2) {
return parseIntFromHex2(h2) / 255;
}
var matchers2 = function() {
var CSS_INTEGER2 = "[-\\+]?\\d+%?";
var CSS_NUMBER2 = "[-\\+]?\\d*\\.\\d+%?";
var CSS_UNIT2 = "(?:" + CSS_NUMBER2 + ")|(?:" + CSS_INTEGER2 + ")";
var PERMISSIVE_MATCH32 = "[\\s|\\(]+(" + CSS_UNIT2 + ")[,|\\s]+(" + CSS_UNIT2 + ")[,|\\s]+(" + CSS_UNIT2 + ")\\s*\\)?";
var PERMISSIVE_MATCH42 = "[\\s|\\(]+(" + CSS_UNIT2 + ")[,|\\s]+(" + CSS_UNIT2 + ")[,|\\s]+(" + CSS_UNIT2 + ")[,|\\s]+(" + CSS_UNIT2 + ")\\s*\\)?";
return {
CSS_UNIT: new RegExp(CSS_UNIT2),
rgb: new RegExp("rgb" + PERMISSIVE_MATCH32),
rgba: new RegExp("rgba" + PERMISSIVE_MATCH42),
hsl: new RegExp("hsl" + PERMISSIVE_MATCH32),
hsla: new RegExp("hsla" + PERMISSIVE_MATCH42),
hsv: new RegExp("hsv" + PERMISSIVE_MATCH32),
hsva: new RegExp("hsva" + PERMISSIVE_MATCH42),
hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,
hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
};
}();
function isValidCSSUnit2(color2) {
return !!matchers2.CSS_UNIT.exec(color2);
}
function stringInputToObject2(color2) {
color2 = color2.replace(trimLeft, "").replace(trimRight, "").toLowerCase();
var named = false;
if (names2[color2]) {
color2 = names2[color2];
named = true;
} else if (color2 == "transparent") {
return {
r: 0,
g: 0,
b: 0,
a: 0,
format: "name"
};
}
var match2;
if (match2 = matchers2.rgb.exec(color2)) {
return {
r: match2[1],
g: match2[2],
b: match2[3]
};
}
if (match2 = matchers2.rgba.exec(color2)) {
return {
r: match2[1],
g: match2[2],
b: match2[3],
a: match2[4]
};
}
if (match2 = matchers2.hsl.exec(color2)) {
return {
h: match2[1],
s: match2[2],
l: match2[3]
};
}
if (match2 = matchers2.hsla.exec(color2)) {
return {
h: match2[1],
s: match2[2],
l: match2[3],
a: match2[4]
};
}
if (match2 = matchers2.hsv.exec(color2)) {
return {
h: match2[1],
s: match2[2],
v: match2[3]
};
}
if (match2 = matchers2.hsva.exec(color2)) {
return {
h: match2[1],
s: match2[2],
v: match2[3],
a: match2[4]
};
}
if (match2 = matchers2.hex8.exec(color2)) {
return {
r: parseIntFromHex2(match2[1]),
g: parseIntFromHex2(match2[2]),
b: parseIntFromHex2(match2[3]),
a: convertHexToDecimal2(match2[4]),
format: named ? "name" : "hex8"
};
}
if (match2 = matchers2.hex6.exec(color2)) {
return {
r: parseIntFromHex2(match2[1]),
g: parseIntFromHex2(match2[2]),
b: parseIntFromHex2(match2[3]),
format: named ? "name" : "hex"
};
}
if (match2 = matchers2.hex4.exec(color2)) {
return {
r: parseIntFromHex2(match2[1] + "" + match2[1]),
g: parseIntFromHex2(match2[2] + "" + match2[2]),
b: parseIntFromHex2(match2[3] + "" + match2[3]),
a: convertHexToDecimal2(match2[4] + "" + match2[4]),
format: named ? "name" : "hex8"
};
}
if (match2 = matchers2.hex3.exec(color2)) {
return {
r: parseIntFromHex2(match2[1] + "" + match2[1]),
g: parseIntFromHex2(match2[2] + "" + match2[2]),
b: parseIntFromHex2(match2[3] + "" + match2[3]),
format: named ? "name" : "hex"
};
}
return false;
}
function validateWCAG2Parms(parms) {
var level, size;
parms = parms || {
level: "AA",
size: "small"
};
level = (parms.level || "AA").toUpperCase();
size = (parms.size || "small").toLowerCase();
if (level !== "AA" && level !== "AAA") {
level = "AA";
}
if (size !== "small" && size !== "large") {
size = "small";
}
return {
level,
size
};
}
return tinycolor2;
});
})(tinycolor);
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
var _extends2 = Object.assign || function(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = arguments[i2];
for (var key2 in source) {
if (Object.prototype.hasOwnProperty.call(source, key2)) {
target[key2] = source[key2];
}
}
}
return target;
};
var _createClass2 = function() {
function defineProperties(target, props) {
for (var i2 = 0; i2 < props.length; i2++) {
var descriptor2 = props[i2];
descriptor2.enumerable = descriptor2.enumerable || false;
descriptor2.configurable = true;
if ("value" in descriptor2)
descriptor2.writable = true;
Object.defineProperty(target, descriptor2.key, descriptor2);
}
}
return function(Constructor, protoProps, staticProps) {
if (protoProps)
defineProperties(Constructor.prototype, protoProps);
if (staticProps)
defineProperties(Constructor, staticProps);
return Constructor;
};
}();
var _tinycolor = tinycolor.exports;
var _tinycolor2 = _interopRequireDefault2(_tinycolor);
function _interopRequireDefault2(obj) {
return obj && obj.__esModule ? obj : { "default": obj };
}
function _classCallCheck2(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
var Color2 = function() {
function Color3(input) {
var _this2 = this;
_classCallCheck2(this, Color3);
this.initRgb = function() {
var _color$toRgb = _this2.color.toRgb(), r2 = _color$toRgb.r, g2 = _color$toRgb.g, b2 = _color$toRgb.b;
_this2.redValue = r2;
_this2.greenValue = g2;
_this2.blueValue = b2;
};
this.initHsb = function() {
var _color$toHsv = _this2.color.toHsv(), h2 = _color$toHsv.h, s = _color$toHsv.s, v2 = _color$toHsv.v;
_this2.hueValue = h2;
_this2.saturationValue = s;
_this2.brightnessValue = v2;
};
this.toHexString = function() {
return _this2.color.toHexString();
};
this.toRgbString = function() {
return _this2.color.toRgbString();
};
this.color = (0, _tinycolor2["default"])(input);
this.initRgb();
this.initHsb();
var initAlpha = input && input.alpha || this.color.toRgb().a;
this.alphaValue = Math.min(1, initAlpha) * 100;
}
Color3.isValidHex = function isValidHex(hex) {
return (0, _tinycolor2["default"])(hex).isValid();
};
_createClass2(Color3, [{
key: "hex",
get: function get2() {
return this.color.toHex();
}
}, {
key: "hue",
set: function set2(value) {
this.color = (0, _tinycolor2["default"])({
h: value,
s: this.saturation,
v: this.brightness
});
this.initRgb();
this.hueValue = value;
},
get: function get2() {
return this.hueValue;
}
}, {
key: "saturation",
set: function set2(value) {
this.color = (0, _tinycolor2["default"])({
h: this.hue,
s: value,
v: this.brightness
});
this.initRgb();
this.saturationValue = value;
},
get: function get2() {
return this.saturationValue;
}
}, {
key: "lightness",
set: function set2(value) {
this.color = (0, _tinycolor2["default"])({
h: this.hue,
s: this.saturation,
l: value
});
this.initRgb();
this.lightnessValue = value;
},
get: function get2() {
return this.lightnessValue;
}
}, {
key: "brightness",
set: function set2(value) {
this.color = (0, _tinycolor2["default"])({
h: this.hue,
s: this.saturation,
v: value
});
this.initRgb();
this.brightnessValue = value;
},
get: function get2() {
return this.brightnessValue;
}
}, {
key: "red",
set: function set2(value) {
var rgb = this.color.toRgb();
this.color = (0, _tinycolor2["default"])(_extends2({}, rgb, {
r: value
}));
this.initHsb();
this.redValue = value;
},
get: function get2() {
return this.redValue;
}
}, {
key: "green",
set: function set2(value) {
var rgb = this.color.toRgb();
this.color = (0, _tinycolor2["default"])(_extends2({}, rgb, {
g: value
}));
this.initHsb();
this.greenValue = value;
},
get: function get2() {
return this.greenValue;
}
}, {
key: "blue",
set: function set2(value) {
var rgb = this.color.toRgb();
this.color = (0, _tinycolor2["default"])(_extends2({}, rgb, {
b: value
}));
this.initHsb();
this.blueValue = value;
},
get: function get2() {
return this.blueValue;
}
}, {
key: "alpha",
set: function set2(value) {
this.color.setAlpha(value / 100);
},
get: function get2() {
return this.color.getAlpha() * 100;
}
}, {
key: "RGB",
get: function get2() {
return [this.red, this.green, this.blue];
}
}, {
key: "HSB",
get: function get2() {
return [this.hue, this.saturation, this.brightness];
}
}]);
return Color3;
}();
exports2["default"] = Color2;
module2.exports = exports2["default"];
})(color, color.exports);
var Board = { exports: {} };
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
var _react = React__default.default;
var _react2 = _interopRequireDefault2(_react);
var _reactDom2 = ReactDOM__default.default;
var _reactDom22 = _interopRequireDefault2(_reactDom2);
var _propTypes = propTypes.exports;
var _propTypes2 = _interopRequireDefault2(_propTypes);
var _addEventListener = addEventListener$1;
var _addEventListener2 = _interopRequireDefault2(_addEventListener);
var _color = color.exports;
var _color2 = _interopRequireDefault2(_color);
function _interopRequireDefault2(obj) {
return obj && obj.__esModule ? obj : { "default": obj };
}
function _defaults(obj, defaults2) {
var keys2 = Object.getOwnPropertyNames(defaults2);
for (var i2 = 0; i2 < keys2.length; i2++) {
var key2 = keys2[i2];
var value = Object.getOwnPropertyDescriptor(defaults2, key2);
if (value && value.configurable && obj[key2] === void 0) {
Object.defineProperty(obj, key2, value);
}
}
return obj;
}
function _classCallCheck2(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn2(self2, call2) {
if (!self2) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call2 && (typeof call2 === "object" || typeof call2 === "function") ? call2 : self2;
}
function _inherits2(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });
if (superClass)
Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);
}
var WIDTH = 200;
var HEIGHT = 150;
var Board2 = function(_React$Component) {
_inherits2(Board3, _React$Component);
function Board3(props) {
_classCallCheck2(this, Board3);
var _this2 = _possibleConstructorReturn2(this, _React$Component.call(this, props));
_this2.onBoardMouseDown = function(e2) {
var buttons = e2.buttons;
if (buttons !== 1)
return;
var x2 = e2.clientX;
var y2 = e2.clientY;
_this2.pointMoveTo({
x: x2,
y: y2
});
_this2.removeListeners();
_this2.dragListener = (0, _addEventListener2["default"])(window, "mousemove", _this2.onBoardDrag);
_this2.dragUpListener = (0, _addEventListener2["default"])(window, "mouseup", _this2.onBoardDragEnd);
};
_this2.onBoardTouchStart = function(e2) {
if (e2.touches.length !== 1) {
return;
}
_this2.removeTouchListeners();
var x2 = e2.targetTouches[0].clientX;
var y2 = e2.targetTouches[0].clientY;
_this2.pointMoveTo({
x: x2,
y: y2
});
_this2.touchMoveListener = (0, _addEventListener2["default"])(window, "touchmove", _this2.onBoardTouchMove);
_this2.touchEndListener = (0, _addEventListener2["default"])(window, "touchend", _this2.onBoardTouchEnd);
};
_this2.onBoardTouchMove = function(e2) {
if (e2.preventDefault) {
e2.preventDefault();
}
var x2 = e2.targetTouches[0].clientX;
var y2 = e2.targetTouches[0].clientY;
_this2.pointMoveTo({
x: x2,
y: y2
});
};
_this2.onBoardTouchEnd = function() {
_this2.removeTouchListeners();
};
_this2.onBoardDrag = function(e2) {
var x2 = e2.clientX;
var y2 = e2.clientY;
_this2.pointMoveTo({
x: x2,
y: y2
});
};
_this2.onBoardDragEnd = function(e2) {
var x2 = e2.clientX;
var y2 = e2.clientY;
_this2.pointMoveTo({
x: x2,
y: y2
});
_this2.removeListeners();
};
_this2.getPrefixCls = function() {
return _this2.props.rootPrefixCls + "-board";
};
_this2.removeTouchListeners = function() {
if (_this2.touchMoveListener) {
_this2.touchMoveListener.remove();
_this2.touchMoveListener = null;
}
if (_this2.touchEndListener) {
_this2.touchEndListener.remove();
_this2.touchEndListener = null;
}
};
_this2.removeListeners = function() {
if (_this2.dragListener) {
_this2.dragListener.remove();
_this2.dragListener = null;
}
if (_this2.dragUpListener) {
_this2.dragUpListener.remove();
_this2.dragUpListener = null;
}
};
_this2.pointMoveTo = function(pos) {
var rect = _reactDom22["default"].findDOMNode(_this2).getBoundingClientRect();
var left = pos.x - rect.left;
var top = pos.y - rect.top;
var rWidth = rect.width || WIDTH;
var rHeight = rect.height || HEIGHT;
left = Math.max(0, left);
left = Math.min(left, rWidth);
top = Math.max(0, top);
top = Math.min(top, rHeight);
var color2 = _this2.props.color;
color2.saturation = left / rWidth;
color2.brightness = 1 - top / rHeight;
_this2.props.onChange(color2);
};
return _this2;
}
Board3.prototype.componentWillUnmount = function componentWillUnmount() {
this.removeListeners();
this.removeTouchListeners();
};
Board3.prototype.render = function render2() {
var prefixCls = this.getPrefixCls();
var color2 = this.props.color;
var hueHsv = {
h: color2.hue,
s: 1,
v: 1
};
var hueColor = new _color2["default"](hueHsv).toHexString();
var xRel = color2.saturation * 100;
var yRel = (1 - color2.brightness) * 100;
return _react2["default"].createElement(
"div",
{ className: prefixCls },
_react2["default"].createElement(
"div",
{ className: prefixCls + "-hsv", style: { backgroundColor: hueColor } },
_react2["default"].createElement("div", { className: prefixCls + "-value" }),
_react2["default"].createElement("div", { className: prefixCls + "-saturation" })
),
_react2["default"].createElement("span", { style: { left: xRel + "%", top: yRel + "%" } }),
_react2["default"].createElement("div", {
className: prefixCls + "-handler",
onMouseDown: this.onBoardMouseDown,
onTouchStart: this.onBoardTouchStart
})
);
};
return Board3;
}(_react2["default"].Component);
exports2["default"] = Board2;
Board2.propTypes = {
color: _propTypes2["default"].object,
onChange: _propTypes2["default"].func,
rootPrefixCls: _propTypes2["default"].string
};
module2.exports = exports2["default"];
})(Board, Board.exports);
var Preview = { exports: {} };
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
var _react = React__default.default;
var _react2 = _interopRequireDefault2(_react);
var _propTypes = propTypes.exports;
var _propTypes2 = _interopRequireDefault2(_propTypes);
var _color = color.exports;
var _color2 = _interopRequireDefault2(_color);
function _interopRequireDefault2(obj) {
return obj && obj.__esModule ? obj : { "default": obj };
}
function _defaults(obj, defaults2) {
var keys2 = Object.getOwnPropertyNames(defaults2);
for (var i2 = 0; i2 < keys2.length; i2++) {
var key2 = keys2[i2];
var value = Object.getOwnPropertyDescriptor(defaults2, key2);
if (value && value.configurable && obj[key2] === void 0) {
Object.defineProperty(obj, key2, value);
}
}
return obj;
}
function _classCallCheck2(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn2(self2, call2) {
if (!self2) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call2 && (typeof call2 === "object" || typeof call2 === "function") ? call2 : self2;
}
function _inherits2(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });
if (superClass)
Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);
}
var Preview2 = function(_React$Component) {
_inherits2(Preview3, _React$Component);
function Preview3() {
var _temp, _this2, _ret;
_classCallCheck2(this, Preview3);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this2 = _possibleConstructorReturn2(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this2), _this2.onChange = function(e2) {
var value = e2.target.value;
var color2 = new _color2["default"](value);
_this2.props.onChange(color2);
e2.stopPropagation();
}, _this2.getPrefixCls = function() {
return _this2.props.rootPrefixCls + "-preview";
}, _temp), _possibleConstructorReturn2(_this2, _ret);
}
Preview3.prototype.render = function render2() {
var prefixCls = this.getPrefixCls();
var hex = this.props.color.toHexString();
return _react2["default"].createElement(
"div",
{ className: prefixCls },
_react2["default"].createElement("span", {
style: {
backgroundColor: hex,
opacity: this.props.alpha / 100
}
}),
_react2["default"].createElement("input", {
type: "color",
value: hex,
onChange: this.onChange,
onClick: this.props.onInputClick
})
);
};
return Preview3;
}(_react2["default"].Component);
exports2["default"] = Preview2;
Preview2.propTypes = {
rootPrefixCls: _propTypes2["default"].string,
color: _propTypes2["default"].object,
alpha: _propTypes2["default"].number,
onChange: _propTypes2["default"].func,
onInputClick: _propTypes2["default"].func
};
module2.exports = exports2["default"];
})(Preview, Preview.exports);
var Ribbon = { exports: {} };
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
var _react = React__default.default;
var _react2 = _interopRequireDefault2(_react);
var _reactDom2 = ReactDOM__default.default;
var _reactDom22 = _interopRequireDefault2(_reactDom2);
var _propTypes = propTypes.exports;
var _propTypes2 = _interopRequireDefault2(_propTypes);
var _addEventListener = addEventListener$1;
var _addEventListener2 = _interopRequireDefault2(_addEventListener);
function _interopRequireDefault2(obj) {
return obj && obj.__esModule ? obj : { "default": obj };
}
function _defaults(obj, defaults2) {
var keys2 = Object.getOwnPropertyNames(defaults2);
for (var i2 = 0; i2 < keys2.length; i2++) {
var key2 = keys2[i2];
var value = Object.getOwnPropertyDescriptor(defaults2, key2);
if (value && value.configurable && obj[key2] === void 0) {
Object.defineProperty(obj, key2, value);
}
}
return obj;
}
function _classCallCheck2(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn2(self2, call2) {
if (!self2) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call2 && (typeof call2 === "object" || typeof call2 === "function") ? call2 : self2;
}
function _inherits2(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });
if (superClass)
Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);
}
var Ribbon2 = function(_React$Component) {
_inherits2(Ribbon3, _React$Component);
function Ribbon3(props) {
_classCallCheck2(this, Ribbon3);
var _this2 = _possibleConstructorReturn2(this, _React$Component.call(this, props));
_this2.onMouseDown = function(e2) {
var x2 = e2.clientX;
var y2 = e2.clientY;
_this2.pointMoveTo({
x: x2,
y: y2
});
_this2.dragListener = (0, _addEventListener2["default"])(window, "mousemove", _this2.onDrag);
_this2.dragUpListener = (0, _addEventListener2["default"])(window, "mouseup", _this2.onDragEnd);
};
_this2.onDrag = function(e2) {
var x2 = e2.clientX;
var y2 = e2.clientY;
_this2.pointMoveTo({
x: x2,
y: y2
});
};
_this2.onDragEnd = function(e2) {
var x2 = e2.clientX;
var y2 = e2.clientY;
_this2.pointMoveTo({
x: x2,
y: y2
});
_this2.removeListeners();
};
_this2.getPrefixCls = function() {
return _this2.props.rootPrefixCls + "-ribbon";
};
_this2.pointMoveTo = function(coords) {
var rect = _reactDom22["default"].findDOMNode(_this2).getBoundingClientRect();
var width = rect.width;
var left = coords.x - rect.left;
left = Math.max(0, left);
left = Math.min(left, width);
var huePercent = left / width;
var hue = huePercent * 360;
var color2 = _this2.props.color;
color2.hue = hue;
_this2.props.onChange(color2);
};
_this2.removeListeners = function() {
if (_this2.dragListener) {
_this2.dragListener.remove();
_this2.dragListener = null;
}
if (_this2.dragUpListener) {
_this2.dragUpListener.remove();
_this2.dragUpListener = null;
}
};
return _this2;
}
Ribbon3.prototype.componentWillUnmount = function componentWillUnmount() {
this.removeListeners();
};
Ribbon3.prototype.render = function render2() {
var prefixCls = this.getPrefixCls();
var hue = this.props.color.hue;
var per = hue / 360 * 100;
return _react2["default"].createElement(
"div",
{ className: prefixCls },
_react2["default"].createElement("span", { ref: "point", style: { left: per + "%" } }),
_react2["default"].createElement("div", { className: prefixCls + "-handler", onMouseDown: this.onMouseDown })
);
};
return Ribbon3;
}(_react2["default"].Component);
exports2["default"] = Ribbon2;
Ribbon2.propTypes = {
rootPrefixCls: _propTypes2["default"].string,
color: _propTypes2["default"].object,
onChange: _propTypes2["default"].func
};
module2.exports = exports2["default"];
})(Ribbon, Ribbon.exports);
var Alpha = { exports: {} };
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
var _react = React__default.default;
var _react2 = _interopRequireDefault2(_react);
var _reactDom2 = ReactDOM__default.default;
var _propTypes = propTypes.exports;
var _propTypes2 = _interopRequireDefault2(_propTypes);
var _addEventListener = addEventListener$1;
var _addEventListener2 = _interopRequireDefault2(_addEventListener);
function _interopRequireDefault2(obj) {
return obj && obj.__esModule ? obj : { "default": obj };
}
function _defaults(obj, defaults2) {
var keys2 = Object.getOwnPropertyNames(defaults2);
for (var i2 = 0; i2 < keys2.length; i2++) {
var key2 = keys2[i2];
var value = Object.getOwnPropertyDescriptor(defaults2, key2);
if (value && value.configurable && obj[key2] === void 0) {
Object.defineProperty(obj, key2, value);
}
}
return obj;
}
function _classCallCheck2(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn2(self2, call2) {
if (!self2) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call2 && (typeof call2 === "object" || typeof call2 === "function") ? call2 : self2;
}
function _inherits2(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });
if (superClass)
Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);
}
function rgbaColor(r2, g2, b2, a) {
return "rgba(" + [r2, g2, b2, a / 100].join(",") + ")";
}
var Alpha2 = function(_React$Component) {
_inherits2(Alpha3, _React$Component);
function Alpha3(props) {
_classCallCheck2(this, Alpha3);
var _this2 = _possibleConstructorReturn2(this, _React$Component.call(this, props));
_this2.onMouseDown = function(e2) {
var x2 = e2.clientX;
var y2 = e2.clientY;
_this2.pointMoveTo({
x: x2,
y: y2
});
_this2.dragListener = (0, _addEventListener2["default"])(window, "mousemove", _this2.onDrag);
_this2.dragUpListener = (0, _addEventListener2["default"])(window, "mouseup", _this2.onDragEnd);
};
_this2.onDrag = function(e2) {
var x2 = e2.clientX;
var y2 = e2.clientY;
_this2.pointMoveTo({
x: x2,
y: y2
});
};
_this2.onDragEnd = function(e2) {
var x2 = e2.clientX;
var y2 = e2.clientY;
_this2.pointMoveTo({
x: x2,
y: y2
});
_this2.removeListeners();
};
_this2.getBackground = function() {
var _this$props$color = _this2.props.color, red2 = _this$props$color.red, green2 = _this$props$color.green, blue2 = _this$props$color.blue;
var opacityGradient = "linear-gradient(to right, " + rgbaColor(red2, green2, blue2, 0) + " , " + rgbaColor(red2, green2, blue2, 100) + ")";
return opacityGradient;
};
_this2.getPrefixCls = function() {
return _this2.props.rootPrefixCls + "-alpha";
};
_this2.pointMoveTo = function(coords) {
var rect = (0, _reactDom2.findDOMNode)(_this2).getBoundingClientRect();
var width = rect.width;
var left = coords.x - rect.left;
left = Math.max(0, left);
left = Math.min(left, width);
var alpha = Math.round(left / width * 100);
_this2.props.onChange(alpha);
};
_this2.removeListeners = function() {
if (_this2.dragListener) {
_this2.dragListener.remove();
_this2.dragListener = null;
}
if (_this2.dragUpListener) {
_this2.dragUpListener.remove();
_this2.dragUpListener = null;
}
};
return _this2;
}
Alpha3.prototype.componentWillUnmount = function componentWillUnmount() {
this.removeListeners();
};
Alpha3.prototype.render = function render2() {
var prefixCls = this.getPrefixCls();
return _react2["default"].createElement(
"div",
{ className: prefixCls },
_react2["default"].createElement("div", { ref: "bg", className: prefixCls + "-bg", style: { background: this.getBackground() } }),
_react2["default"].createElement("span", { style: { left: this.props.alpha + "%" } }),
_react2["default"].createElement("div", { className: prefixCls + "-handler", onMouseDown: this.onMouseDown })
);
};
return Alpha3;
}(_react2["default"].Component);
exports2["default"] = Alpha2;
Alpha2.propTypes = {
color: _propTypes2["default"].object,
onChange: _propTypes2["default"].func,
rootPrefixCls: _propTypes2["default"].string,
alpha: _propTypes2["default"].number
};
module2.exports = exports2["default"];
})(Alpha, Alpha.exports);
var Params = { exports: {} };
var percentage = { exports: {} };
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
exports2["default"] = percentage2;
function percentage2(input) {
return Math.round(input * 100);
}
module2.exports = exports2["default"];
})(percentage, percentage.exports);
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
var _react = React__default.default;
var _react2 = _interopRequireDefault2(_react);
var _propTypes = propTypes.exports;
var _propTypes2 = _interopRequireDefault2(_propTypes);
var _classnames = classnames$1.exports;
var _classnames2 = _interopRequireDefault2(_classnames);
var _color = color.exports;
var _color2 = _interopRequireDefault2(_color);
var _percentage = percentage.exports;
var _percentage2 = _interopRequireDefault2(_percentage);
function _interopRequireDefault2(obj) {
return obj && obj.__esModule ? obj : { "default": obj };
}
function _defaults(obj, defaults2) {
var keys2 = Object.getOwnPropertyNames(defaults2);
for (var i2 = 0; i2 < keys2.length; i2++) {
var key2 = keys2[i2];
var value = Object.getOwnPropertyDescriptor(defaults2, key2);
if (value && value.configurable && obj[key2] === void 0) {
Object.defineProperty(obj, key2, value);
}
}
return obj;
}
function _defineProperty3(obj, key2, value) {
if (key2 in obj) {
Object.defineProperty(obj, key2, { value, enumerable: true, configurable: true, writable: true });
} else {
obj[key2] = value;
}
return obj;
}
function _classCallCheck2(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn2(self2, call2) {
if (!self2) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call2 && (typeof call2 === "object" || typeof call2 === "function") ? call2 : self2;
}
function _inherits2(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });
if (superClass)
Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);
}
var modesMap = ["RGB", "HSB"];
var Params2 = function(_React$Component) {
_inherits2(Params3, _React$Component);
function Params3(props) {
_classCallCheck2(this, Params3);
var _this2 = _possibleConstructorReturn2(this, _React$Component.call(this, props));
_this2.getChannelInRange = function(value, index2) {
var channelMap = {
RGB: [[0, 255], [0, 255], [0, 255]],
HSB: [[0, 359], [0, 100], [0, 100]]
};
var mode = _this2.state.mode;
var range2 = channelMap[mode][index2];
var result = parseInt(value, 10);
if (isNaN(result)) {
result = 0;
}
result = Math.max(range2[0], result);
result = Math.min(result, range2[1]);
return result;
};
_this2.getPrefixCls = function() {
return _this2.props.rootPrefixCls + "-params";
};
_this2.handleHexBlur = function() {
var hex = _this2.state.hex;
var color2 = null;
if (_color2["default"].isValidHex(hex)) {
color2 = new _color2["default"](hex);
}
if (color2 !== null) {
_this2.setState({
color: color2,
hex
});
_this2.props.onChange(color2, false);
}
};
_this2.handleHexPress = function(event) {
var hex = _this2.state.hex;
if (event.nativeEvent.which === 13) {
var color2 = null;
if (_color2["default"].isValidHex(hex)) {
color2 = new _color2["default"](hex);
}
if (color2 !== null) {
_this2.setState({
color: color2,
hex
});
_this2.props.onChange(color2, false);
}
}
};
_this2.handleHexChange = function(event) {
var hex = event.target.value;
_this2.setState({
hex
});
};
_this2.handleModeChange = function() {
var mode = _this2.state.mode;
var modeIndex = (modesMap.indexOf(mode) + 1) % modesMap.length;
mode = modesMap[modeIndex];
_this2.setState({
mode
});
};
_this2.handleAlphaHandler = function(event) {
var alpha = parseInt(event.target.value, 10);
if (isNaN(alpha)) {
alpha = 0;
}
alpha = Math.max(0, alpha);
alpha = Math.min(alpha, 100);
_this2.props.onAlphaChange(alpha);
};
_this2.updateColorByChanel = function(channel, value) {
var color2 = _this2.props.color;
var mode = _this2.state.mode;
if (mode === "HSB") {
if (channel === "H") {
color2.hue = parseInt(value, 10);
} else if (channel === "S") {
color2.saturation = parseInt(value, 10) / 100;
} else if (channel === "B") {
color2.brightness = parseInt(value, 10) / 100;
}
} else {
if (channel === "R") {
color2.red = parseInt(value, 10);
} else if (channel === "G") {
color2.green = parseInt(value, 10);
} else if (channel === "B") {
color2.blue = parseInt(value, 10);
}
}
return color2;
};
_this2.handleColorChannelChange = function(index2, event) {
var value = _this2.getChannelInRange(event.target.value, index2);
var mode = _this2.state.mode;
var channel = mode[index2];
var color2 = _this2.updateColorByChanel(channel, value);
_this2.setState({
hex: color2.hex,
color: color2
}, function() {
_this2.props.onChange(color2, false);
});
};
_this2.state = {
mode: props.mode,
hex: props.color.hex,
color: props.color
};
return _this2;
}
Params3.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
var nextColor = nextProps.color;
this.setState({
color: nextColor,
hex: nextColor.hex
});
};
Params3.prototype.render = function render2() {
var _cx;
var prefixCls = this.getPrefixCls();
var enableAlpha = this.props.enableAlpha;
var _state = this.state, mode = _state.mode, color2 = _state.color;
var colorChannel = color2[mode];
if (mode === "HSB") {
colorChannel[0] = parseInt(colorChannel[0], 10);
colorChannel[1] = (0, _percentage2["default"])(colorChannel[1]);
colorChannel[2] = (0, _percentage2["default"])(colorChannel[2]);
}
var paramsClasses = (0, _classnames2["default"])((_cx = {}, _defineProperty3(_cx, prefixCls, true), _defineProperty3(_cx, prefixCls + "-has-alpha", enableAlpha), _cx));
return _react2["default"].createElement(
"div",
{ className: paramsClasses },
_react2["default"].createElement(
"div",
{ className: prefixCls + "-input" },
_react2["default"].createElement("input", {
className: prefixCls + "-hex",
type: "text",
maxLength: "6",
onKeyPress: this.handleHexPress,
onBlur: this.handleHexBlur,
onChange: this.handleHexChange,
value: this.state.hex.toLowerCase()
}),
_react2["default"].createElement("input", {
type: "number",
ref: "channel_0",
value: colorChannel[0],
onChange: this.handleColorChannelChange.bind(null, 0)
}),
_react2["default"].createElement("input", {
type: "number",
ref: "channel_1",
value: colorChannel[1],
onChange: this.handleColorChannelChange.bind(null, 1)
}),
_react2["default"].createElement("input", {
type: "number",
ref: "channel_2",
value: colorChannel[2],
onChange: this.handleColorChannelChange.bind(null, 2)
}),
enableAlpha && _react2["default"].createElement("input", {
type: "number",
value: Math.round(this.props.alpha),
onChange: this.handleAlphaHandler
})
),
_react2["default"].createElement(
"div",
{ className: prefixCls + "-lable" },
_react2["default"].createElement(
"label",
{ className: prefixCls + "-lable-hex" },
"Hex"
),
_react2["default"].createElement(
"label",
{ className: prefixCls + "-lable-number", onClick: this.handleModeChange },
mode[0]
),
_react2["default"].createElement(
"label",
{ className: prefixCls + "-lable-number", onClick: this.handleModeChange },
mode[1]
),
_react2["default"].createElement(
"label",
{ className: prefixCls + "-lable-number", onClick: this.handleModeChange },
mode[2]
),
enableAlpha && _react2["default"].createElement(
"label",
{ className: prefixCls + "-lable-alpha" },
"A"
)
)
);
};
return Params3;
}(_react2["default"].Component);
exports2["default"] = Params2;
Params2.propTypes = {
alpha: _propTypes2["default"].number,
enableAlpha: _propTypes2["default"].bool,
color: _propTypes2["default"].object.isRequired,
mode: _propTypes2["default"].oneOf(modesMap),
onAlphaChange: _propTypes2["default"].func,
onChange: _propTypes2["default"].func,
rootPrefixCls: _propTypes2["default"].string
};
Params2.defaultProps = {
mode: modesMap[0],
enableAlpha: true
};
module2.exports = exports2["default"];
})(Params, Params.exports);
var validationColor = function validationColor2(props, propName, componentName) {
if (props[propName] && !/^#[0-9a-fA-F]{3,6}$/.test(props[propName])) {
return new Error(componentName + ".props." + propName + " Validation failed!");
}
};
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
var _react = React__default.default;
var _react2 = _interopRequireDefault2(_react);
var _propTypes = propTypes.exports;
var _propTypes2 = _interopRequireDefault2(_propTypes);
var _color = color.exports;
var _color2 = _interopRequireDefault2(_color);
var _Board = Board.exports;
var _Board2 = _interopRequireDefault2(_Board);
var _Preview = Preview.exports;
var _Preview2 = _interopRequireDefault2(_Preview);
var _Ribbon = Ribbon.exports;
var _Ribbon2 = _interopRequireDefault2(_Ribbon);
var _Alpha = Alpha.exports;
var _Alpha2 = _interopRequireDefault2(_Alpha);
var _Params = Params.exports;
var _Params2 = _interopRequireDefault2(_Params);
var _classnames = classnames$1.exports;
var _classnames2 = _interopRequireDefault2(_classnames);
var _validationColor = validationColor;
var _validationColor2 = _interopRequireDefault2(_validationColor);
function _interopRequireDefault2(obj) {
return obj && obj.__esModule ? obj : { "default": obj };
}
function _defaults(obj, defaults2) {
var keys2 = Object.getOwnPropertyNames(defaults2);
for (var i2 = 0; i2 < keys2.length; i2++) {
var key2 = keys2[i2];
var value = Object.getOwnPropertyDescriptor(defaults2, key2);
if (value && value.configurable && obj[key2] === void 0) {
Object.defineProperty(obj, key2, value);
}
}
return obj;
}
function _defineProperty3(obj, key2, value) {
if (key2 in obj) {
Object.defineProperty(obj, key2, { value, enumerable: true, configurable: true, writable: true });
} else {
obj[key2] = value;
}
return obj;
}
function _classCallCheck2(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn2(self2, call2) {
if (!self2) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call2 && (typeof call2 === "object" || typeof call2 === "function") ? call2 : self2;
}
function _inherits2(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });
if (superClass)
Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);
}
function noop2() {
}
var Panel2 = function(_React$Component) {
_inherits2(Panel3, _React$Component);
function Panel3(props) {
_classCallCheck2(this, Panel3);
var _this2 = _possibleConstructorReturn2(this, _React$Component.call(this, props));
_initialiseProps2.call(_this2);
var alpha = typeof props.alpha === "undefined" ? props.defaultAlpha : Math.min(props.alpha, props.defaultAlpha);
var color2 = new _color2["default"](props.color || props.defaultColor);
_this2.state = {
color: color2,
alpha
};
return _this2;
}
Panel3.prototype.componentDidMount = function componentDidMount() {
this.props.onMount(this.ref);
};
Panel3.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
if (nextProps.color) {
var color2 = new _color2["default"](nextProps.color);
this.setState({
color: color2
});
}
if (nextProps.alpha !== void 0) {
this.setState({
alpha: nextProps.alpha
});
}
};
Panel3.prototype.render = function render2() {
var _cx, _this2 = this;
var _props = this.props, prefixCls = _props.prefixCls, enableAlpha = _props.enableAlpha;
var _state = this.state, color2 = _state.color, alpha = _state.alpha;
var wrapClasses = (0, _classnames2["default"])((_cx = {}, _defineProperty3(_cx, prefixCls + "-wrap", true), _defineProperty3(_cx, prefixCls + "-wrap-has-alpha", enableAlpha), _cx));
return _react2["default"].createElement(
"div",
{
ref: function ref(_ref) {
return _this2.ref = _ref;
},
className: [prefixCls, this.props.className].join(" "),
style: this.props.style,
onFocus: this.onFocus,
onBlur: this.onBlur,
tabIndex: "0"
},
_react2["default"].createElement(
"div",
{ className: prefixCls + "-inner" },
_react2["default"].createElement(_Board2["default"], { rootPrefixCls: prefixCls, color: color2, onChange: this.handleChange }),
_react2["default"].createElement(
"div",
{ className: wrapClasses },
_react2["default"].createElement(
"div",
{ className: prefixCls + "-wrap-ribbon" },
_react2["default"].createElement(_Ribbon2["default"], { rootPrefixCls: prefixCls, color: color2, onChange: this.handleChange })
),
enableAlpha && _react2["default"].createElement(
"div",
{ className: prefixCls + "-wrap-alpha" },
_react2["default"].createElement(_Alpha2["default"], {
rootPrefixCls: prefixCls,
alpha,
color: color2,
onChange: this.handleAlphaChange
})
),
_react2["default"].createElement(
"div",
{ className: prefixCls + "-wrap-preview" },
_react2["default"].createElement(_Preview2["default"], {
rootPrefixCls: prefixCls,
alpha,
onChange: this.handleChange,
onInputClick: this.onSystemColorPickerOpen,
color: color2
})
)
),
_react2["default"].createElement(
"div",
{ className: prefixCls + "-wrap", style: { height: 40, marginTop: 6 } },
_react2["default"].createElement(_Params2["default"], {
rootPrefixCls: prefixCls,
color: color2,
alpha,
onAlphaChange: this.handleAlphaChange,
onChange: this.handleChange,
mode: this.props.mode,
enableAlpha: this.props.enableAlpha
})
)
)
);
};
return Panel3;
}(_react2["default"].Component);
var _initialiseProps2 = function _initialiseProps3() {
var _this3 = this;
this.onSystemColorPickerOpen = function(e2) {
if (e2.target.type === "color") {
_this3.systemColorPickerOpen = true;
}
};
this.onFocus = function() {
if (_this3._blurTimer) {
clearTimeout(_this3._blurTimer);
_this3._blurTimer = null;
} else {
_this3.props.onFocus();
}
};
this.onBlur = function() {
if (_this3._blurTimer) {
clearTimeout(_this3._blurTimer);
}
_this3._blurTimer = setTimeout(function() {
if (_this3.systemColorPickerOpen) {
_this3.systemColorPickerOpen = false;
return;
}
_this3.props.onBlur();
}, 100);
};
this.handleAlphaChange = function(alpha) {
var color2 = _this3.state.color;
color2.alpha = alpha;
_this3.setState({
alpha,
color: color2
});
_this3.props.onChange({
color: color2.toHexString(),
alpha
});
};
this.handleChange = function(color2) {
var alpha = _this3.state.alpha;
color2.alpha = alpha;
_this3.setState({ color: color2 });
_this3.props.onChange({
color: color2.toHexString(),
alpha: color2.alpha
});
};
};
exports2["default"] = Panel2;
Panel2.propTypes = {
alpha: _propTypes2["default"].number,
className: _propTypes2["default"].string,
color: _validationColor2["default"],
defaultAlpha: _propTypes2["default"].number,
defaultColor: _validationColor2["default"],
enableAlpha: _propTypes2["default"].bool,
mode: _propTypes2["default"].oneOf(["RGB", "HSL", "HSB"]),
onBlur: _propTypes2["default"].func,
onChange: _propTypes2["default"].func,
onFocus: _propTypes2["default"].func,
onMount: _propTypes2["default"].func,
prefixCls: _propTypes2["default"].string,
style: _propTypes2["default"].object
};
Panel2.defaultProps = {
className: "",
defaultAlpha: 100,
defaultColor: "#ff0000",
enableAlpha: true,
mode: "RGB",
onBlur: noop2,
onChange: noop2,
onFocus: noop2,
onMount: noop2,
prefixCls: "rc-color-picker-panel",
style: {}
};
module2.exports = exports2["default"];
})(Panel$1, Panel$1.exports);
var placements = { exports: {} };
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
var autoAdjustOverflow2 = {
adjustX: 1,
adjustY: 1
};
var targetOffset2 = [0, 0];
var placements2 = {
topLeft: {
points: ["bl", "tl"],
overflow: autoAdjustOverflow2,
offset: [0, -5],
targetOffset: targetOffset2
},
topRight: {
points: ["br", "tr"],
overflow: autoAdjustOverflow2,
offset: [0, -5],
targetOffset: targetOffset2
},
bottomLeft: {
points: ["tl", "bl"],
overflow: autoAdjustOverflow2,
offset: [0, 5],
targetOffset: targetOffset2
},
bottomRight: {
points: ["tr", "br"],
overflow: autoAdjustOverflow2,
offset: [0, 5],
targetOffset: targetOffset2
}
};
exports2["default"] = placements2;
module2.exports = exports2["default"];
})(placements, placements.exports);
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
var _slicedToArray2 = function() {
function sliceIterator(arr, i2) {
var _arr = [];
var _n = true;
var _d = false;
var _e = void 0;
try {
for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
_arr.push(_s.value);
if (i2 && _arr.length === i2)
break;
}
} catch (err) {
_d = true;
_e = err;
} finally {
try {
if (!_n && _i["return"])
_i["return"]();
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
return function(arr, i2) {
if (Array.isArray(arr)) {
return arr;
} else if (Symbol.iterator in Object(arr)) {
return sliceIterator(arr, i2);
} else {
throw new TypeError("Invalid attempt to destructure non-iterable instance");
}
};
}();
var _extends2 = Object.assign || function(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = arguments[i2];
for (var key2 in source) {
if (Object.prototype.hasOwnProperty.call(source, key2)) {
target[key2] = source[key2];
}
}
}
return target;
};
var _react = React__default.default;
var _react2 = _interopRequireDefault2(_react);
var _reactDom2 = ReactDOM__default.default;
var _propTypes = propTypes.exports;
var _propTypes2 = _interopRequireDefault2(_propTypes);
var _rcTrigger = require$$3$1;
var _rcTrigger2 = _interopRequireDefault2(_rcTrigger);
var _Panel = Panel$1.exports;
var _Panel2 = _interopRequireDefault2(_Panel);
var _placements = placements.exports;
var _placements2 = _interopRequireDefault2(_placements);
var _color = color.exports;
var _color2 = _interopRequireDefault2(_color);
function _interopRequireDefault2(obj) {
return obj && obj.__esModule ? obj : { "default": obj };
}
function _defaults(obj, defaults2) {
var keys2 = Object.getOwnPropertyNames(defaults2);
for (var i2 = 0; i2 < keys2.length; i2++) {
var key2 = keys2[i2];
var value = Object.getOwnPropertyDescriptor(defaults2, key2);
if (value && value.configurable && obj[key2] === void 0) {
Object.defineProperty(obj, key2, value);
}
}
return obj;
}
function _classCallCheck2(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn2(self2, call2) {
if (!self2) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call2 && (typeof call2 === "object" || typeof call2 === "function") ? call2 : self2;
}
function _inherits2(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });
if (superClass)
Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);
}
function refFn(field, component) {
this[field] = component;
}
function prevent(e2) {
e2.preventDefault();
}
var ColorPicker2 = function(_React$Component) {
_inherits2(ColorPicker3, _React$Component);
function ColorPicker3(props) {
_classCallCheck2(this, ColorPicker3);
var _this2 = _possibleConstructorReturn2(this, _React$Component.call(this, props));
var alpha = typeof props.alpha === "undefined" ? props.defaultAlpha : Math.min(props.alpha, props.defaultAlpha);
_this2.state = {
color: props.color || props.defaultColor,
alpha,
open: false
};
var events = ["onTriggerClick", "onChange", "onBlur", "getPickerElement", "getRootDOMNode", "getTriggerDOMNode", "onVisibleChange", "onPanelMount", "setOpen", "open", "close", "focus"];
events.forEach(function(e2) {
_this2[e2] = _this2[e2].bind(_this2);
});
_this2.saveTriggerRef = refFn.bind(_this2, "triggerInstance");
return _this2;
}
ColorPicker3.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
if (nextProps.color) {
this.setState({
color: nextProps.color
});
}
if (nextProps.alpha !== null && nextProps.alpha !== void 0) {
this.setState({
alpha: nextProps.alpha
});
}
};
ColorPicker3.prototype.onTriggerClick = function onTriggerClick() {
this.setState({
open: !this.state.open
});
};
ColorPicker3.prototype.onChange = function onChange(colors) {
var _this2 = this;
this.setState(_extends2({}, colors), function() {
_this2.props.onChange(_this2.state);
});
};
ColorPicker3.prototype.onBlur = function onBlur() {
this.setOpen(false);
};
ColorPicker3.prototype.onVisibleChange = function onVisibleChange(open) {
this.setOpen(open);
};
ColorPicker3.prototype.onPanelMount = function onPanelMount(panelDOMRef) {
if (this.state.open) {
setTimeout(function() {
panelDOMRef.focus();
}, 1);
}
};
ColorPicker3.prototype.setOpen = function setOpen(open, callback) {
var _this3 = this;
if (this.state.open !== open) {
this.setState({
open
}, function() {
if (typeof callback === "function")
callback();
var _props = _this3.props, onOpen = _props.onOpen, onClose = _props.onClose;
if (_this3.state.open) {
onOpen(_this3.state);
} else {
onClose(_this3.state);
}
});
}
};
ColorPicker3.prototype.getRootDOMNode = function getRootDOMNode() {
return (0, _reactDom2.findDOMNode)(this);
};
ColorPicker3.prototype.getTriggerDOMNode = function getTriggerDOMNode() {
return (0, _reactDom2.findDOMNode)(this.triggerInstance);
};
ColorPicker3.prototype.getPickerElement = function getPickerElement() {
return _react2["default"].createElement(_Panel2["default"], {
onMount: this.onPanelMount,
defaultColor: this.state.color,
alpha: this.state.alpha,
enableAlpha: this.props.enableAlpha,
prefixCls: this.props.prefixCls + "-panel",
onChange: this.onChange,
onBlur: this.onBlur,
mode: this.props.mode,
className: this.props.className
});
};
ColorPicker3.prototype.open = function open(callback) {
this.setOpen(true, callback);
};
ColorPicker3.prototype.close = function close(callback) {
this.setOpen(false, callback);
};
ColorPicker3.prototype.focus = function focus() {
if (!this.state.open) {
(0, _reactDom2.findDOMNode)(this).focus();
}
};
ColorPicker3.prototype.render = function render2() {
var props = this.props;
var state = this.state;
var classes = [props.prefixCls + "-wrap", props.className];
if (state.open) {
classes.push(props.prefixCls + "-open");
}
var children = props.children;
var _RGB = _slicedToArray2(new _color2["default"](this.state.color).RGB, 3), r2 = _RGB[0], g2 = _RGB[1], b2 = _RGB[2];
var RGBA = [r2, g2, b2];
RGBA.push(this.state.alpha / 100);
if (children) {
children = _react2["default"].cloneElement(children, {
ref: this.saveTriggerRef,
unselectable: "unselectable",
style: {
backgroundColor: "rgba(" + RGBA.join(",") + ")"
},
onClick: this.onTriggerClick,
onMouseDown: prevent
});
}
var prefixCls = props.prefixCls, placement = props.placement, style2 = props.style, getCalendarContainer = props.getCalendarContainer, align = props.align, animation = props.animation, disabled = props.disabled, transitionName2 = props.transitionName;
return _react2["default"].createElement(
"div",
{ className: classes.join(" ") },
_react2["default"].createElement(
_rcTrigger2["default"],
{
popup: this.getPickerElement(),
popupAlign: align,
builtinPlacements: _placements2["default"],
popupPlacement: placement,
action: disabled ? [] : ["click"],
destroyPopupOnHide: true,
getPopupContainer: getCalendarContainer,
popupStyle: style2,
popupAnimation: animation,
popupTransitionName: transitionName2,
popupVisible: state.open,
onPopupVisibleChange: this.onVisibleChange,
prefixCls
},
children
)
);
};
return ColorPicker3;
}(_react2["default"].Component);
exports2["default"] = ColorPicker2;
ColorPicker2.propTypes = {
defaultColor: _propTypes2["default"].string,
defaultAlpha: _propTypes2["default"].number,
alpha: _propTypes2["default"].number,
children: _propTypes2["default"].node.isRequired,
className: _propTypes2["default"].string,
color: _propTypes2["default"].string,
enableAlpha: _propTypes2["default"].bool,
mode: _propTypes2["default"].oneOf(["RGB", "HSL", "HSB"]),
onChange: _propTypes2["default"].func,
onClose: _propTypes2["default"].func,
onOpen: _propTypes2["default"].func,
placement: _propTypes2["default"].oneOf(["topLeft", "topRight", "bottomLeft", "bottomRight"]),
prefixCls: _propTypes2["default"].string.isRequired,
style: _propTypes2["default"].object
};
ColorPicker2.defaultProps = {
defaultColor: "#F00",
defaultAlpha: 100,
onChange: function onChange() {
},
onOpen: function onOpen() {
},
onClose: function onClose() {
},
children: _react2["default"].createElement("span", { className: "rc-color-picker-trigger" }),
className: "",
enableAlpha: true,
placement: "topLeft",
prefixCls: "rc-color-picker",
style: {}
};
module2.exports = exports2["default"];
})(ColorPicker$1, ColorPicker$1.exports);
(function(module2) {
module2.exports = ColorPicker$1.exports;
module2.exports.Panel = Panel$1.exports;
})(lib$1);
const ColorPicker = /* @__PURE__ */ getDefaultExportFromCjs(lib$1.exports);
const alphaHexMap = {
"1.00": "FF",
0.99: "FC",
0.98: "FA",
0.97: "F7",
0.96: "F5",
0.95: "F2",
0.94: "F0",
0.93: "ED",
0.92: "EB",
0.91: "E8",
"0.90": "E6",
0.89: "E3",
0.88: "E0",
0.87: "DE",
0.86: "DB",
0.85: "D9",
0.84: "D6",
0.83: "D4",
0.82: "D1",
0.81: "CF",
"0.80": "CC",
0.79: "C9",
0.78: "C7",
0.77: "C4",
0.76: "C2",
0.75: "BF",
0.74: "BD",
0.73: "BA",
0.72: "B8",
0.71: "B5",
"0.70": "B3",
0.69: "B0",
0.68: "AD",
0.67: "AB",
0.66: "A8",
0.65: "A6",
0.64: "A3",
0.63: "A1",
0.62: "9E",
0.61: "9C",
"0.60": "99",
0.59: "96",
0.58: "94",
0.57: "91",
0.56: "8F",
0.55: "8C",
0.54: "8A",
0.53: "87",
0.52: "85",
0.51: "82",
"0.50": "80",
0.49: "7D",
0.48: "7A",
0.47: "78",
0.46: "75",
0.45: "73",
0.44: "70",
0.43: "6E",
0.42: "6B",
0.41: "69",
"0.40": "66",
0.39: "63",
0.38: "61",
0.37: "5E",
0.36: "5C",
0.35: "59",
0.34: "57",
0.33: "54",
0.32: "52",
0.31: "4F",
"0.30": "4D",
0.29: "4A",
0.28: "47",
0.27: "45",
0.26: "42",
0.25: "40",
0.24: "3D",
0.23: "3B",
0.22: "38",
0.21: "36",
"0.20": "33",
0.19: "30",
0.18: "2E",
0.17: "2B",
0.16: "29",
0.15: "26",
0.14: "24",
0.13: "21",
0.12: "1F",
0.11: "1C",
"0.10": "1A",
0.09: "17",
0.08: "14",
0.07: "12",
0.06: "0F",
0.05: "0D",
0.04: "0A",
0.03: "08",
0.02: "05",
0.01: "03",
"0.00": "00"
};
const index$D = "";
const index$C = "";
var getAlphaFromHex = function getAlphaFromHex2() {
var hex = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "#ffffff";
var alphaHex = hex.slice(7);
var alpha = 100;
for (var key2 in alphaHexMap) {
if (alphaHexMap[key2] === alphaHex.toUpperCase()) {
alpha = Number(key2) * 100;
}
}
return alpha;
};
var Color = function Color2(props) {
var className = props.className, schema2 = props.schema, disabled = props.disabled, readOnly = props.readOnly, value = props.value, onChange = props.onChange, style2 = props.style;
var onPickerChange = function onPickerChange2(ev) {
if (disabled || readOnly) {
return;
}
var alphaHex = alphaHexMap[(ev.alpha / 100).toFixed(2)];
var hex = ev.color + (ev.alpha === 100 ? "" : alphaHex);
onChange(hex);
};
var onInputChange = function onInputChange2(ev) {
onChange(ev.target.value);
};
return /* @__PURE__ */ jsxs("div", {
className: "fr-color-picker",
style: style2,
children: [disabled || readOnly ? /* @__PURE__ */ jsx("span", {
className: "rc-color-picker-trigger",
style: {
backgroundColor: value || "#ffffff"
}
}) : /* @__PURE__ */ jsx(ColorPicker, {
type: schema2 === null || schema2 === void 0 ? void 0 : schema2.format,
animation: "slide-up",
color: value && value.slice(0, 7) || "#ffffff",
alpha: getAlphaFromHex(value),
onChange: onPickerChange,
disabled: true
}), readOnly ? /* @__PURE__ */ jsx("span", {
children: value || "#ffffff"
}) : /* @__PURE__ */ React__default.default.createElement(Input$2, {
className,
placeholder: "#ffffff",
disabled,
value,
onChange: onInputChange
})]
});
};
var quarterOfYear$1 = { exports: {} };
(function(module2, exports2) {
!function(t2, n2) {
module2.exports = n2();
}(commonjsGlobal, function() {
var t2 = "month", n2 = "quarter";
return function(e2, i2) {
var r2 = i2.prototype;
r2.quarter = function(t3) {
return this.$utils().u(t3) ? Math.ceil((this.month() + 1) / 3) : this.month(this.month() % 3 + 3 * (t3 - 1));
};
var s = r2.add;
r2.add = function(e3, i3) {
return e3 = Number(e3), this.$utils().p(i3) === n2 ? this.add(3 * e3, t2) : s.bind(this)(e3, i3);
};
var u2 = r2.startOf;
r2.startOf = function(e3, i3) {
var r3 = this.$utils(), s2 = !!r3.u(i3) || i3;
if (r3.p(e3) === n2) {
var o = this.quarter() - 1;
return s2 ? this.month(3 * o).startOf(t2).startOf("day") : this.month(3 * o + 2).endOf(t2).endOf("day");
}
return u2.bind(this)(e3, i3);
};
};
});
})(quarterOfYear$1);
const quarterOfYear = quarterOfYear$1.exports;
var weekOfYear$1 = { exports: {} };
(function(module2, exports2) {
!function(e2, t2) {
module2.exports = t2();
}(commonjsGlobal, function() {
var e2 = "week", t2 = "year";
return function(i2, n2, r2) {
var f2 = n2.prototype;
f2.week = function(i3) {
if (void 0 === i3 && (i3 = null), null !== i3)
return this.add(7 * (i3 - this.week()), "day");
var n3 = this.$locale().yearStart || 1;
if (11 === this.month() && this.date() > 25) {
var f3 = r2(this).startOf(t2).add(1, t2).date(n3), s = r2(this).endOf(e2);
if (f3.isBefore(s))
return 1;
}
var a = r2(this).startOf(t2).date(n3).startOf(e2).subtract(1, "millisecond"), o = this.diff(a, e2, true);
return o < 0 ? r2(this).startOf("week").week() : Math.ceil(o);
}, f2.weeks = function(e3) {
return void 0 === e3 && (e3 = null), this.week(e3);
};
};
});
})(weekOfYear$1);
const weekOfYear = weekOfYear$1.exports;
function _slicedToArray$a(arr, i2) {
return _arrayWithHoles$a(arr) || _iterableToArrayLimit$a(arr, i2) || _unsupportedIterableToArray$c(arr, i2) || _nonIterableRest$a();
}
function _nonIterableRest$a() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$c(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$c(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$c(o, minLen);
}
function _arrayLikeToArray$c(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$a(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$a(arr) {
if (Array.isArray(arr))
return arr;
}
dayjs.extend(weekOfYear);
function isUrl(str) {
var protocolRE = /^(?:\w+:)?\/\/(\S+)$/;
if (typeof str !== "string")
return false;
return protocolRE.test(str);
}
function getFormat(format2) {
var dateFormat;
switch (format2) {
case "date":
dateFormat = "YYYY-MM-DD";
break;
case "time":
dateFormat = "HH:mm:ss";
break;
case "dateTime":
dateFormat = "YYYY-MM-DD HH:mm:ss";
break;
case "week":
dateFormat = "YYYY-w";
break;
case "year":
dateFormat = "YYYY";
break;
case "quarter":
dateFormat = "YYYY-Q";
break;
case "month":
dateFormat = "YYYY-MM";
break;
default:
if (typeof format2 === "string") {
dateFormat = format2;
} else {
dateFormat = "YYYY-MM-DD";
}
}
return dateFormat;
}
var transformDateValue = function transformDateValue2(value, format2, dateFormat) {
var _a;
var result = value || void 0;
if (typeof value === "string") {
if (format2 === "week") {
var _value$split = value.split("-"), _value$split2 = _slicedToArray$a(_value$split, 2), years = _value$split2[0], week = _value$split2[1];
result = (_a = dayjs(years)) === null || _a === void 0 ? void 0 : _a.week(Number(week));
}
if (format2 === "quarter") {
var _value$split3 = value.split("-"), _value$split4 = _slicedToArray$a(_value$split3, 2), yearx = _value$split4[0], quarter = _value$split4[1];
result = dayjs(yearx).quarter(quarter);
}
}
if (result) {
result = dayjs(result, dateFormat);
}
return result;
};
var translation = function translation2(configCtx) {
return function(key2) {
var _a;
var locale2 = (_a = configCtx === null || configCtx === void 0 ? void 0 : configCtx.locale) === null || _a === void 0 ? void 0 : _a.FormRender;
return locale2[key2];
};
};
var weekday$1 = { exports: {} };
(function(module2, exports2) {
!function(e2, t2) {
module2.exports = t2();
}(commonjsGlobal, function() {
return function(e2, t2) {
t2.prototype.weekday = function(e3) {
var t3 = this.$locale().weekStart || 0, i2 = this.$W, n2 = (i2 < t3 ? i2 + 7 : i2) - t3;
return this.$utils().u(e3) ? n2 : this.subtract(n2, "day").add(e3, "day");
};
};
});
})(weekday$1);
const weekday = weekday$1.exports;
var localeData$1 = { exports: {} };
(function(module2, exports2) {
!function(n2, e2) {
module2.exports = e2();
}(commonjsGlobal, function() {
return function(n2, e2, t2) {
var r2 = e2.prototype, o = function(n3) {
return n3 && (n3.indexOf ? n3 : n3.s);
}, u2 = function(n3, e3, t3, r3, u3) {
var i3 = n3.name ? n3 : n3.$locale(), a2 = o(i3[e3]), s2 = o(i3[t3]), f2 = a2 || s2.map(function(n4) {
return n4.slice(0, r3);
});
if (!u3)
return f2;
var d2 = i3.weekStart;
return f2.map(function(n4, e4) {
return f2[(e4 + (d2 || 0)) % 7];
});
}, i2 = function() {
return t2.Ls[t2.locale()];
}, a = function(n3, e3) {
return n3.formats[e3] || function(n4) {
return n4.replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g, function(n5, e4, t3) {
return e4 || t3.slice(1);
});
}(n3.formats[e3.toUpperCase()]);
}, s = function() {
var n3 = this;
return { months: function(e3) {
return e3 ? e3.format("MMMM") : u2(n3, "months");
}, monthsShort: function(e3) {
return e3 ? e3.format("MMM") : u2(n3, "monthsShort", "months", 3);
}, firstDayOfWeek: function() {
return n3.$locale().weekStart || 0;
}, weekdays: function(e3) {
return e3 ? e3.format("dddd") : u2(n3, "weekdays");
}, weekdaysMin: function(e3) {
return e3 ? e3.format("dd") : u2(n3, "weekdaysMin", "weekdays", 2);
}, weekdaysShort: function(e3) {
return e3 ? e3.format("ddd") : u2(n3, "weekdaysShort", "weekdays", 3);
}, longDateFormat: function(e3) {
return a(n3.$locale(), e3);
}, meridiem: this.$locale().meridiem, ordinal: this.$locale().ordinal };
};
r2.localeData = function() {
return s.bind(this)();
}, t2.localeData = function() {
var n3 = i2();
return { firstDayOfWeek: function() {
return n3.weekStart || 0;
}, weekdays: function() {
return t2.weekdays();
}, weekdaysShort: function() {
return t2.weekdaysShort();
}, weekdaysMin: function() {
return t2.weekdaysMin();
}, months: function() {
return t2.months();
}, monthsShort: function() {
return t2.monthsShort();
}, longDateFormat: function(e3) {
return a(n3, e3);
}, meridiem: n3.meridiem, ordinal: n3.ordinal };
}, t2.months = function() {
return u2(i2(), "months");
}, t2.monthsShort = function() {
return u2(i2(), "monthsShort", "months", 3);
}, t2.weekdays = function(n3) {
return u2(i2(), "weekdays", null, null, n3);
}, t2.weekdaysShort = function(n3) {
return u2(i2(), "weekdaysShort", "weekdays", 3, n3);
}, t2.weekdaysMin = function(n3) {
return u2(i2(), "weekdaysMin", "weekdays", 2, n3);
};
};
});
})(localeData$1);
const localeData = localeData$1.exports;
var weekYear$1 = { exports: {} };
(function(module2, exports2) {
!function(e2, t2) {
module2.exports = t2();
}(commonjsGlobal, function() {
return function(e2, t2) {
t2.prototype.weekYear = function() {
var e3 = this.month(), t3 = this.week(), n2 = this.year();
return 1 === t3 && 11 === e3 ? n2 + 1 : 0 === e3 && t3 >= 52 ? n2 - 1 : n2;
};
};
});
})(weekYear$1);
const weekYear = weekYear$1.exports;
var advancedFormat$1 = { exports: {} };
(function(module2, exports2) {
!function(e2, t2) {
module2.exports = t2();
}(commonjsGlobal, function() {
return function(e2, t2) {
var r2 = t2.prototype, n2 = r2.format;
r2.format = function(e3) {
var t3 = this, r3 = this.$locale();
if (!this.isValid())
return n2.bind(this)(e3);
var s = this.$utils(), a = (e3 || "YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g, function(e4) {
switch (e4) {
case "Q":
return Math.ceil((t3.$M + 1) / 3);
case "Do":
return r3.ordinal(t3.$D);
case "gggg":
return t3.weekYear();
case "GGGG":
return t3.isoWeekYear();
case "wo":
return r3.ordinal(t3.week(), "W");
case "w":
case "ww":
return s.s(t3.week(), "w" === e4 ? 1 : 2, "0");
case "W":
case "WW":
return s.s(t3.isoWeek(), "W" === e4 ? 1 : 2, "0");
case "k":
case "kk":
return s.s(String(0 === t3.$H ? 24 : t3.$H), "k" === e4 ? 1 : 2, "0");
case "X":
return Math.floor(t3.$d.getTime() / 1e3);
case "x":
return t3.$d.getTime();
case "z":
return "[" + t3.offsetName() + "]";
case "zzz":
return "[" + t3.offsetName("long") + "]";
default:
return e4;
}
});
return n2.bind(this)(a);
};
};
});
})(advancedFormat$1);
const advancedFormat = advancedFormat$1.exports;
var customParseFormat$1 = { exports: {} };
(function(module2, exports2) {
!function(e2, t2) {
module2.exports = t2();
}(commonjsGlobal, function() {
var e2 = { LTS: "h:mm:ss A", LT: "h:mm A", L: "MM/DD/YYYY", LL: "MMMM D, YYYY", LLL: "MMMM D, YYYY h:mm A", LLLL: "dddd, MMMM D, YYYY h:mm A" }, t2 = /(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|YYYY|YY?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g, n2 = /\d\d/, r2 = /\d\d?/, i2 = /\d*[^-_:/,()\s\d]+/, o = {}, s = function(e3) {
return (e3 = +e3) + (e3 > 68 ? 1900 : 2e3);
};
var a = function(e3) {
return function(t3) {
this[e3] = +t3;
};
}, f2 = [/[+-]\d\d:?(\d\d)?|Z/, function(e3) {
(this.zone || (this.zone = {})).offset = function(e4) {
if (!e4)
return 0;
if ("Z" === e4)
return 0;
var t3 = e4.match(/([+-]|\d\d)/g), n3 = 60 * t3[1] + (+t3[2] || 0);
return 0 === n3 ? 0 : "+" === t3[0] ? -n3 : n3;
}(e3);
}], h2 = function(e3) {
var t3 = o[e3];
return t3 && (t3.indexOf ? t3 : t3.s.concat(t3.f));
}, u2 = function(e3, t3) {
var n3, r3 = o.meridiem;
if (r3) {
for (var i3 = 1; i3 <= 24; i3 += 1)
if (e3.indexOf(r3(i3, 0, t3)) > -1) {
n3 = i3 > 12;
break;
}
} else
n3 = e3 === (t3 ? "pm" : "PM");
return n3;
}, d2 = { A: [i2, function(e3) {
this.afternoon = u2(e3, false);
}], a: [i2, function(e3) {
this.afternoon = u2(e3, true);
}], S: [/\d/, function(e3) {
this.milliseconds = 100 * +e3;
}], SS: [n2, function(e3) {
this.milliseconds = 10 * +e3;
}], SSS: [/\d{3}/, function(e3) {
this.milliseconds = +e3;
}], s: [r2, a("seconds")], ss: [r2, a("seconds")], m: [r2, a("minutes")], mm: [r2, a("minutes")], H: [r2, a("hours")], h: [r2, a("hours")], HH: [r2, a("hours")], hh: [r2, a("hours")], D: [r2, a("day")], DD: [n2, a("day")], Do: [i2, function(e3) {
var t3 = o.ordinal, n3 = e3.match(/\d+/);
if (this.day = n3[0], t3)
for (var r3 = 1; r3 <= 31; r3 += 1)
t3(r3).replace(/\[|\]/g, "") === e3 && (this.day = r3);
}], M: [r2, a("month")], MM: [n2, a("month")], MMM: [i2, function(e3) {
var t3 = h2("months"), n3 = (h2("monthsShort") || t3.map(function(e4) {
return e4.slice(0, 3);
})).indexOf(e3) + 1;
if (n3 < 1)
throw new Error();
this.month = n3 % 12 || n3;
}], MMMM: [i2, function(e3) {
var t3 = h2("months").indexOf(e3) + 1;
if (t3 < 1)
throw new Error();
this.month = t3 % 12 || t3;
}], Y: [/[+-]?\d+/, a("year")], YY: [n2, function(e3) {
this.year = s(e3);
}], YYYY: [/\d{4}/, a("year")], Z: f2, ZZ: f2 };
function c2(n3) {
var r3, i3;
r3 = n3, i3 = o && o.formats;
for (var s2 = (n3 = r3.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g, function(t3, n4, r4) {
var o2 = r4 && r4.toUpperCase();
return n4 || i3[r4] || e2[r4] || i3[o2].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g, function(e3, t4, n5) {
return t4 || n5.slice(1);
});
})).match(t2), a2 = s2.length, f3 = 0; f3 < a2; f3 += 1) {
var h3 = s2[f3], u3 = d2[h3], c3 = u3 && u3[0], l2 = u3 && u3[1];
s2[f3] = l2 ? { regex: c3, parser: l2 } : h3.replace(/^\[|\]$/g, "");
}
return function(e3) {
for (var t3 = {}, n4 = 0, r4 = 0; n4 < a2; n4 += 1) {
var i4 = s2[n4];
if ("string" == typeof i4)
r4 += i4.length;
else {
var o2 = i4.regex, f4 = i4.parser, h4 = e3.slice(r4), u4 = o2.exec(h4)[0];
f4.call(t3, u4), e3 = e3.replace(u4, "");
}
}
return function(e4) {
var t4 = e4.afternoon;
if (void 0 !== t4) {
var n5 = e4.hours;
t4 ? n5 < 12 && (e4.hours += 12) : 12 === n5 && (e4.hours = 0), delete e4.afternoon;
}
}(t3), t3;
};
}
return function(e3, t3, n3) {
n3.p.customParseFormat = true, e3 && e3.parseTwoDigitYear && (s = e3.parseTwoDigitYear);
var r3 = t3.prototype, i3 = r3.parse;
r3.parse = function(e4) {
var t4 = e4.date, r4 = e4.utc, s2 = e4.args;
this.$u = r4;
var a2 = s2[1];
if ("string" == typeof a2) {
var f3 = true === s2[2], h3 = true === s2[3], u3 = f3 || h3, d3 = s2[2];
h3 && (d3 = s2[2]), o = this.$locale(), !f3 && d3 && (o = n3.Ls[d3]), this.$d = function(e5, t5, n4) {
try {
if (["x", "X"].indexOf(t5) > -1)
return new Date(("X" === t5 ? 1e3 : 1) * e5);
var r5 = c2(t5)(e5), i4 = r5.year, o2 = r5.month, s3 = r5.day, a3 = r5.hours, f4 = r5.minutes, h4 = r5.seconds, u4 = r5.milliseconds, d4 = r5.zone, l3 = new Date(), m3 = s3 || (i4 || o2 ? 1 : l3.getDate()), M2 = i4 || l3.getFullYear(), Y = 0;
i4 && !o2 || (Y = o2 > 0 ? o2 - 1 : l3.getMonth());
var p2 = a3 || 0, v2 = f4 || 0, D = h4 || 0, g2 = u4 || 0;
return d4 ? new Date(Date.UTC(M2, Y, m3, p2, v2, D, g2 + 60 * d4.offset * 1e3)) : n4 ? new Date(Date.UTC(M2, Y, m3, p2, v2, D, g2)) : new Date(M2, Y, m3, p2, v2, D, g2);
} catch (e6) {
return new Date("");
}
}(t4, a2, r4), this.init(), d3 && true !== d3 && (this.$L = this.locale(d3).$L), u3 && t4 != this.format(a2) && (this.$d = new Date("")), o = {};
} else if (a2 instanceof Array)
for (var l2 = a2.length, m2 = 1; m2 <= l2; m2 += 1) {
s2[1] = a2[m2 - 1];
var M = n3.apply(this, s2);
if (M.isValid()) {
this.$d = M.$d, this.$L = M.$L, this.init();
break;
}
m2 === l2 && (this.$d = new Date(""));
}
else
i3.call(this, e4);
};
};
});
})(customParseFormat$1);
const customParseFormat = customParseFormat$1.exports;
dayjs.extend(customParseFormat);
dayjs.extend(advancedFormat);
dayjs.extend(weekday);
dayjs.extend(localeData);
dayjs.extend(weekOfYear);
dayjs.extend(weekYear);
dayjs.extend(function(o, c2) {
var proto2 = c2.prototype;
var oldFormat = proto2.format;
proto2.format = function f2(formatStr) {
var str = (formatStr || "").replace("Wo", "wo");
return oldFormat.bind(this)(str);
};
});
var localeMap = {
bn_BD: "bn-bd",
by_BY: "be",
en_GB: "en-gb",
en_US: "en",
fr_BE: "fr",
fr_CA: "fr-ca",
hy_AM: "hy-am",
kmr_IQ: "ku",
nl_BE: "nl-be",
pt_BR: "pt-br",
zh_CN: "zh-cn",
zh_HK: "zh-hk",
zh_TW: "zh-tw"
};
var parseLocale = function parseLocale2(locale2) {
var mapLocale = localeMap[locale2];
return mapLocale || locale2.split("_")[0];
};
var parseNoMatchNotice = function parseNoMatchNotice2() {
noteOnce(false, "Not match any format. Please help to fire a issue about this.");
};
var generateConfig = {
getNow: function getNow() {
return dayjs();
},
getFixedDate: function getFixedDate(string2) {
return dayjs(string2, ["YYYY-M-DD", "YYYY-MM-DD"]);
},
getEndDate: function getEndDate(date2) {
return date2.endOf("month");
},
getWeekDay: function getWeekDay(date2) {
var clone = date2.locale("en");
return clone.weekday() + clone.localeData().firstDayOfWeek();
},
getYear: function getYear(date2) {
return date2.year();
},
getMonth: function getMonth(date2) {
return date2.month();
},
getDate: function getDate(date2) {
return date2.date();
},
getHour: function getHour(date2) {
return date2.hour();
},
getMinute: function getMinute(date2) {
return date2.minute();
},
getSecond: function getSecond(date2) {
return date2.second();
},
addYear: function addYear(date2, diff) {
return date2.add(diff, "year");
},
addMonth: function addMonth(date2, diff) {
return date2.add(diff, "month");
},
addDate: function addDate(date2, diff) {
return date2.add(diff, "day");
},
setYear: function setYear(date2, year) {
return date2.year(year);
},
setMonth: function setMonth(date2, month) {
return date2.month(month);
},
setDate: function setDate(date2, num) {
return date2.date(num);
},
setHour: function setHour(date2, hour) {
return date2.hour(hour);
},
setMinute: function setMinute(date2, minute) {
return date2.minute(minute);
},
setSecond: function setSecond(date2, second) {
return date2.second(second);
},
isAfter: function isAfter(date1, date2) {
return date1.isAfter(date2);
},
isValidate: function isValidate(date2) {
return date2.isValid();
},
locale: {
getWeekFirstDay: function getWeekFirstDay(locale2) {
return dayjs().locale(parseLocale(locale2)).localeData().firstDayOfWeek();
},
getWeekFirstDate: function getWeekFirstDate(locale2, date2) {
return date2.locale(parseLocale(locale2)).weekday(0);
},
getWeek: function getWeek(locale2, date2) {
return date2.locale(parseLocale(locale2)).week();
},
getShortWeekDays: function getShortWeekDays(locale2) {
return dayjs().locale(parseLocale(locale2)).localeData().weekdaysMin();
},
getShortMonths: function getShortMonths(locale2) {
return dayjs().locale(parseLocale(locale2)).localeData().monthsShort();
},
format: function format2(locale2, date2, _format) {
return date2.locale(parseLocale(locale2)).format(_format);
},
parse: function parse(locale2, text, formats) {
var localeStr = parseLocale(locale2);
for (var i2 = 0; i2 < formats.length; i2 += 1) {
var format2 = formats[i2];
var formatText = text;
if (format2.includes("wo") || format2.includes("Wo")) {
var year = formatText.split("-")[0];
var weekStr = formatText.split("-")[1];
var firstWeek = dayjs(year, "YYYY").startOf("year").locale(localeStr);
for (var j2 = 0; j2 <= 52; j2 += 1) {
var nextWeek = firstWeek.add(j2, "week");
if (nextWeek.format("Wo") === weekStr) {
return nextWeek;
}
}
parseNoMatchNotice();
return null;
}
var date2 = dayjs(formatText, format2).locale(localeStr);
if (date2.isValid()) {
return date2;
}
}
if (text) {
parseNoMatchNotice();
}
return null;
}
}
};
const index$B = "";
const index$A = "";
var DatePicker$1 = generatePicker(generateConfig);
dayjs.extend(quarterOfYear);
var DateCmpt = function DateCmpt2(_a) {
var onChange = _a.onChange, format2 = _a.format, value = _a.value, style2 = _a.style, rest = __rest(_a, ["onChange", "format", "value", "style"]);
var dateFormat = getFormat(format2);
var valueObj = React$a.useMemo(function() {
return transformDateValue(value, format2, dateFormat);
}, [value]);
var handleChange = function handleChange2(dateValue, dateString) {
var newValue = dateString;
if (format2 === "week" || format2 === "quarter") {
newValue = dayjs(dateValue).format(dateFormat);
}
onChange(newValue);
};
var dateParams = {
value: valueObj,
style: Object.assign({
width: "100%"
}, style2),
onChange: handleChange
};
if (format2 === "dateTime") {
dateParams.showTime = true;
}
if (["week", "month", "quarter", "year"].indexOf(format2) > -1) {
dateParams.picker = format2;
}
if (dateFormat === format2) {
dateParams.format = format2;
}
return /* @__PURE__ */ jsx(DatePicker$1, {
...Object.assign({}, dateParams, rest)
});
};
const DatePicker = withFieldWrap(DateCmpt);
dayjs.extend(quarterOfYear);
var RangePicker$1 = DatePicker$1.RangePicker;
var DateRange = function DateRange2(_a) {
var onChange = _a.onChange, format2 = _a.format, value = _a.value, style2 = _a.style, rest = __rest(_a, ["onChange", "format", "value", "style"]);
var dateFormat = getFormat(format2);
var valueObj = React$a.useMemo(function() {
if (!value) {
return value;
}
return value.map(function(item) {
return transformDateValue(item, format2, dateFormat);
});
}, [value]);
var handleChange = function handleChange2(val, _stringList) {
var stringList = _stringList;
if (["week", "quarter"].includes(format2)) {
stringList = (val || []).map(function(item) {
return dayjs(item).format(dateFormat);
});
}
var isPass = stringList.every(function(item) {
return !!item;
});
if (!isPass) {
stringList = null;
}
onChange(stringList);
};
var dateParams = {
value: valueObj,
style: Object.assign({
width: "100%"
}, style2),
onChange: handleChange
};
if (format2 === "dateTime") {
dateParams.showTime = true;
}
if (["week", "month", "quarter", "year"].indexOf(format2) > -1) {
dateParams.picker = format2;
}
dateParams = Object.assign(Object.assign({}, dateParams), rest);
if (dateFormat === format2) {
dateParams.format = format2;
}
return /* @__PURE__ */ jsx(RangePicker$1, {
...Object.assign({}, dateParams)
});
};
const DateRange$1 = withFieldWrap(DateRange);
var TimePicker$1 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
return /* @__PURE__ */ jsx(DatePicker$1, {
...Object.assign({}, props, {
picker: "time",
mode: void 0,
ref
})
});
});
TimePicker$1.displayName = "TimePicker";
TimePicker$1.RangePicker = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
return /* @__PURE__ */ jsx(DatePicker$1.RangePicker, {
...Object.assign({}, props, {
picker: "time",
mode: void 0,
ref
})
});
});
var Time = function Time2(_a) {
var onChange = _a.onChange, _a$format = _a.format, format2 = _a$format === void 0 ? "time" : _a$format, value = _a.value, style2 = _a.style, rest = __rest(_a, ["onChange", "format", "value", "style"]);
var timeFormat = getFormat(format2);
var _value = value ? dayjs(value, timeFormat) : void 0;
var handleChange = function handleChange2(_, valueStr) {
onChange(valueStr);
};
var timeParams = Object.assign({
value: _value,
style: Object.assign({
width: "100%"
}, style2),
onChange: handleChange,
format: timeFormat
}, rest);
return /* @__PURE__ */ jsx(TimePicker$1, {
...Object.assign({}, timeParams)
});
};
const TimePicker = withFieldWrap(Time);
function _slicedToArray$9(arr, i2) {
return _arrayWithHoles$9(arr) || _iterableToArrayLimit$9(arr, i2) || _unsupportedIterableToArray$b(arr, i2) || _nonIterableRest$9();
}
function _nonIterableRest$9() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$b(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$b(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$b(o, minLen);
}
function _arrayLikeToArray$b(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$9(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$9(arr) {
if (Array.isArray(arr))
return arr;
}
var RangePicker = TimePicker$1.RangePicker;
var TimeRange = function TimeRange2(_ref) {
var onChange = _ref.onChange, _ref$format = _ref.format, format2 = _ref$format === void 0 ? "time" : _ref$format, value = _ref.value, style2 = _ref.style, schema2 = _ref.schema;
var _a, _b;
var timeFormat = getFormat(format2);
var _ref2 = Array.isArray(value) ? value : [], _ref3 = _slicedToArray$9(_ref2, 2), start = _ref3[0], end = _ref3[1];
var _value = start && end ? [dayjs(start, ((_a = schema2 === null || schema2 === void 0 ? void 0 : schema2.props) === null || _a === void 0 ? void 0 : _a.format) || timeFormat), dayjs(end, ((_b = schema2 === null || schema2 === void 0 ? void 0 : schema2.props) === null || _b === void 0 ? void 0 : _b.format) || timeFormat)] : [];
var handleChange = function handleChange2(_, stringList) {
var emptyList1 = stringList[0] === "" || stringList[1] === "";
var emptyList2 = stringList[0] === void 0 || stringList[1] === void 0;
if (emptyList1 || emptyList2) {
onChange(void 0);
} else {
onChange(stringList);
}
};
var timeParams = Object.assign({
style: Object.assign({
width: "100%"
}, style2),
value: _value,
onChange: handleChange
}, schema2.props || {});
return /* @__PURE__ */ jsx(RangePicker, {
...Object.assign({}, timeParams)
});
};
var PictureOutlined$2 = {};
var _typeof$g = { exports: {} };
(function(module2) {
function _typeof4(obj) {
"@babel/helpers - typeof";
return module2.exports = _typeof4 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, module2.exports.__esModule = true, module2.exports["default"] = module2.exports, _typeof4(obj);
}
module2.exports = _typeof4, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(_typeof$g);
var objectSpread2 = { exports: {} };
var defineProperty = { exports: {} };
var toPropertyKey = { exports: {} };
var toPrimitive = { exports: {} };
var hasRequiredToPrimitive;
function requireToPrimitive() {
if (hasRequiredToPrimitive)
return toPrimitive.exports;
hasRequiredToPrimitive = 1;
(function(module2) {
var _typeof4 = _typeof$g.exports["default"];
function _toPrimitive2(input, hint) {
if (_typeof4(input) !== "object" || input === null)
return input;
var prim = input[Symbol.toPrimitive];
if (prim !== void 0) {
var res = prim.call(input, hint || "default");
if (_typeof4(res) !== "object")
return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
module2.exports = _toPrimitive2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(toPrimitive);
return toPrimitive.exports;
}
var hasRequiredToPropertyKey;
function requireToPropertyKey() {
if (hasRequiredToPropertyKey)
return toPropertyKey.exports;
hasRequiredToPropertyKey = 1;
(function(module2) {
var _typeof4 = _typeof$g.exports["default"];
var toPrimitive2 = requireToPrimitive();
function _toPropertyKey2(arg) {
var key2 = toPrimitive2(arg, "string");
return _typeof4(key2) === "symbol" ? key2 : String(key2);
}
module2.exports = _toPropertyKey2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(toPropertyKey);
return toPropertyKey.exports;
}
var hasRequiredDefineProperty;
function requireDefineProperty() {
if (hasRequiredDefineProperty)
return defineProperty.exports;
hasRequiredDefineProperty = 1;
(function(module2) {
var toPropertyKey2 = requireToPropertyKey();
function _defineProperty3(obj, key2, value) {
key2 = toPropertyKey2(key2);
if (key2 in obj) {
Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key2] = value;
}
return obj;
}
module2.exports = _defineProperty3, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(defineProperty);
return defineProperty.exports;
}
var hasRequiredObjectSpread2;
function requireObjectSpread2() {
if (hasRequiredObjectSpread2)
return objectSpread2.exports;
hasRequiredObjectSpread2 = 1;
(function(module2) {
var defineProperty2 = requireDefineProperty();
function ownKeys2(object2, enumerableOnly) {
var keys2 = Object.keys(object2);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object2);
enumerableOnly && (symbols = symbols.filter(function(sym) {
return Object.getOwnPropertyDescriptor(object2, sym).enumerable;
})), keys2.push.apply(keys2, symbols);
}
return keys2;
}
function _objectSpread22(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = null != arguments[i2] ? arguments[i2] : {};
i2 % 2 ? ownKeys2(Object(source), true).forEach(function(key2) {
defineProperty2(target, key2, source[key2]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys2(Object(source)).forEach(function(key2) {
Object.defineProperty(target, key2, Object.getOwnPropertyDescriptor(source, key2));
});
}
return target;
}
module2.exports = _objectSpread22, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(objectSpread2);
return objectSpread2.exports;
}
var PictureOutlined$1 = {};
var hasRequiredPictureOutlined;
function requirePictureOutlined() {
if (hasRequiredPictureOutlined)
return PictureOutlined$1;
hasRequiredPictureOutlined = 1;
Object.defineProperty(PictureOutlined$1, "__esModule", { value: true });
var PictureOutlined2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zm-40 632H136v-39.9l138.5-164.3 150.1 178L658.1 489 888 761.6V792zm0-129.8L664.2 396.8c-3.2-3.8-9-3.8-12.2 0L424.6 666.4l-144-170.7c-3.2-3.8-9-3.8-12.2 0L136 652.7V232h752v430.2zM304 456a88 88 0 100-176 88 88 0 000 176zm0-116c15.5 0 28 12.5 28 28s-12.5 28-28 28-28-12.5-28-28 12.5-28 28-28z" } }] }, "name": "picture", "theme": "outlined" };
PictureOutlined$1.default = PictureOutlined2;
return PictureOutlined$1;
}
var AntdIcon = {};
var slicedToArray = { exports: {} };
var arrayWithHoles = { exports: {} };
var hasRequiredArrayWithHoles;
function requireArrayWithHoles() {
if (hasRequiredArrayWithHoles)
return arrayWithHoles.exports;
hasRequiredArrayWithHoles = 1;
(function(module2) {
function _arrayWithHoles2(arr) {
if (Array.isArray(arr))
return arr;
}
module2.exports = _arrayWithHoles2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(arrayWithHoles);
return arrayWithHoles.exports;
}
var iterableToArrayLimit = { exports: {} };
var hasRequiredIterableToArrayLimit;
function requireIterableToArrayLimit() {
if (hasRequiredIterableToArrayLimit)
return iterableToArrayLimit.exports;
hasRequiredIterableToArrayLimit = 1;
(function(module2) {
function _iterableToArrayLimit2(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
module2.exports = _iterableToArrayLimit2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(iterableToArrayLimit);
return iterableToArrayLimit.exports;
}
var unsupportedIterableToArray = { exports: {} };
var arrayLikeToArray = { exports: {} };
var hasRequiredArrayLikeToArray;
function requireArrayLikeToArray() {
if (hasRequiredArrayLikeToArray)
return arrayLikeToArray.exports;
hasRequiredArrayLikeToArray = 1;
(function(module2) {
function _arrayLikeToArray2(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
module2.exports = _arrayLikeToArray2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(arrayLikeToArray);
return arrayLikeToArray.exports;
}
var hasRequiredUnsupportedIterableToArray;
function requireUnsupportedIterableToArray() {
if (hasRequiredUnsupportedIterableToArray)
return unsupportedIterableToArray.exports;
hasRequiredUnsupportedIterableToArray = 1;
(function(module2) {
var arrayLikeToArray2 = requireArrayLikeToArray();
function _unsupportedIterableToArray2(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return arrayLikeToArray2(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return arrayLikeToArray2(o, minLen);
}
module2.exports = _unsupportedIterableToArray2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(unsupportedIterableToArray);
return unsupportedIterableToArray.exports;
}
var nonIterableRest = { exports: {} };
var hasRequiredNonIterableRest;
function requireNonIterableRest() {
if (hasRequiredNonIterableRest)
return nonIterableRest.exports;
hasRequiredNonIterableRest = 1;
(function(module2) {
function _nonIterableRest2() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
module2.exports = _nonIterableRest2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(nonIterableRest);
return nonIterableRest.exports;
}
var hasRequiredSlicedToArray;
function requireSlicedToArray() {
if (hasRequiredSlicedToArray)
return slicedToArray.exports;
hasRequiredSlicedToArray = 1;
(function(module2) {
var arrayWithHoles2 = requireArrayWithHoles();
var iterableToArrayLimit2 = requireIterableToArrayLimit();
var unsupportedIterableToArray2 = requireUnsupportedIterableToArray();
var nonIterableRest2 = requireNonIterableRest();
function _slicedToArray2(arr, i2) {
return arrayWithHoles2(arr) || iterableToArrayLimit2(arr, i2) || unsupportedIterableToArray2(arr, i2) || nonIterableRest2();
}
module2.exports = _slicedToArray2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(slicedToArray);
return slicedToArray.exports;
}
var objectWithoutProperties = { exports: {} };
var objectWithoutPropertiesLoose = { exports: {} };
var hasRequiredObjectWithoutPropertiesLoose;
function requireObjectWithoutPropertiesLoose() {
if (hasRequiredObjectWithoutPropertiesLoose)
return objectWithoutPropertiesLoose.exports;
hasRequiredObjectWithoutPropertiesLoose = 1;
(function(module2) {
function _objectWithoutPropertiesLoose2(source, excluded) {
if (source == null)
return {};
var target = {};
var sourceKeys = Object.keys(source);
var key2, i2;
for (i2 = 0; i2 < sourceKeys.length; i2++) {
key2 = sourceKeys[i2];
if (excluded.indexOf(key2) >= 0)
continue;
target[key2] = source[key2];
}
return target;
}
module2.exports = _objectWithoutPropertiesLoose2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(objectWithoutPropertiesLoose);
return objectWithoutPropertiesLoose.exports;
}
var hasRequiredObjectWithoutProperties;
function requireObjectWithoutProperties() {
if (hasRequiredObjectWithoutProperties)
return objectWithoutProperties.exports;
hasRequiredObjectWithoutProperties = 1;
(function(module2) {
var objectWithoutPropertiesLoose2 = requireObjectWithoutPropertiesLoose();
function _objectWithoutProperties2(source, excluded) {
if (source == null)
return {};
var target = objectWithoutPropertiesLoose2(source, excluded);
var key2, i2;
if (Object.getOwnPropertySymbols) {
var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
for (i2 = 0; i2 < sourceSymbolKeys.length; i2++) {
key2 = sourceSymbolKeys[i2];
if (excluded.indexOf(key2) >= 0)
continue;
if (!Object.prototype.propertyIsEnumerable.call(source, key2))
continue;
target[key2] = source[key2];
}
}
return target;
}
module2.exports = _objectWithoutProperties2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(objectWithoutProperties);
return objectWithoutProperties.exports;
}
var Context = {};
var hasRequiredContext;
function requireContext() {
if (hasRequiredContext)
return Context;
hasRequiredContext = 1;
Object.defineProperty(Context, "__esModule", {
value: true
});
Context.default = void 0;
var _react = React__default.default;
var IconContext2 = /* @__PURE__ */ (0, _react.createContext)({});
var _default2 = IconContext2;
Context.default = _default2;
return Context;
}
var IconBase = {};
var utils$1 = {};
const require$$3 = /* @__PURE__ */ getAugmentedNamespace(index_esm);
var warning = {};
var hasRequiredWarning;
function requireWarning() {
if (hasRequiredWarning)
return warning;
hasRequiredWarning = 1;
Object.defineProperty(warning, "__esModule", {
value: true
});
warning.call = call2;
warning.default = void 0;
warning.note = note2;
warning.noteOnce = noteOnce2;
warning.preMessage = void 0;
warning.resetWarned = resetWarned2;
warning.warning = warning$12;
warning.warningOnce = warningOnce2;
var warned2 = {};
var preMessage2 = function preMessage3(fn) {
};
warning.preMessage = preMessage2;
function warning$12(valid, message) {
}
function note2(valid, message) {
}
function resetWarned2() {
warned2 = {};
}
function call2(method2, valid, message) {
if (!valid && !warned2[message]) {
method2(false, message);
warned2[message] = true;
}
}
function warningOnce2(valid, message) {
call2(warning$12, valid, message);
}
function noteOnce2(valid, message) {
call2(note2, valid, message);
}
warningOnce2.preMessage = preMessage2;
warningOnce2.resetWarned = resetWarned2;
warningOnce2.noteOnce = noteOnce2;
var _default2 = warningOnce2;
warning.default = _default2;
return warning;
}
var dynamicCSS = {};
var canUseDom = {};
var hasRequiredCanUseDom;
function requireCanUseDom() {
if (hasRequiredCanUseDom)
return canUseDom;
hasRequiredCanUseDom = 1;
Object.defineProperty(canUseDom, "__esModule", {
value: true
});
canUseDom.default = canUseDom$12;
function canUseDom$12() {
return !!(typeof window !== "undefined" && window.document && window.document.createElement);
}
return canUseDom;
}
var contains = {};
var hasRequiredContains;
function requireContains() {
if (hasRequiredContains)
return contains;
hasRequiredContains = 1;
Object.defineProperty(contains, "__esModule", {
value: true
});
contains.default = contains$12;
function contains$12(root2, n2) {
if (!root2) {
return false;
}
if (root2.contains) {
return root2.contains(n2);
}
var node = n2;
while (node) {
if (node === root2) {
return true;
}
node = node.parentNode;
}
return false;
}
return contains;
}
var hasRequiredDynamicCSS;
function requireDynamicCSS() {
if (hasRequiredDynamicCSS)
return dynamicCSS;
hasRequiredDynamicCSS = 1;
var _interopRequireDefault2 = interopRequireDefault.exports.default;
Object.defineProperty(dynamicCSS, "__esModule", {
value: true
});
dynamicCSS.clearContainerCache = clearContainerCache;
dynamicCSS.injectCSS = injectCSS2;
dynamicCSS.removeCSS = removeCSS2;
dynamicCSS.updateCSS = updateCSS2;
var _canUseDom = _interopRequireDefault2(requireCanUseDom());
var _contains = _interopRequireDefault2(requireContains());
var APPEND_ORDER2 = "data-rc-order";
var MARK_KEY2 = "rc-util-key";
var containerCache2 = /* @__PURE__ */ new Map();
function getMark2() {
var _ref = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, mark = _ref.mark;
if (mark) {
return mark.startsWith("data-") ? mark : "data-".concat(mark);
}
return MARK_KEY2;
}
function getContainer2(option) {
if (option.attachTo) {
return option.attachTo;
}
var head = document.querySelector("head");
return head || document.body;
}
function getOrder2(prepend) {
if (prepend === "queue") {
return "prependQueue";
}
return prepend ? "prepend" : "append";
}
function findStyles2(container) {
return Array.from((containerCache2.get(container) || container).children).filter(function(node) {
return node.tagName === "STYLE";
});
}
function injectCSS2(css2) {
var option = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
if (!(0, _canUseDom.default)()) {
return null;
}
var csp = option.csp, prepend = option.prepend;
var styleNode = document.createElement("style");
styleNode.setAttribute(APPEND_ORDER2, getOrder2(prepend));
if (csp !== null && csp !== void 0 && csp.nonce) {
styleNode.nonce = csp === null || csp === void 0 ? void 0 : csp.nonce;
}
styleNode.innerHTML = css2;
var container = getContainer2(option);
var firstChild = container.firstChild;
if (prepend) {
if (prepend === "queue") {
var existStyle = findStyles2(container).filter(function(node) {
return ["prepend", "prependQueue"].includes(node.getAttribute(APPEND_ORDER2));
});
if (existStyle.length) {
container.insertBefore(styleNode, existStyle[existStyle.length - 1].nextSibling);
return styleNode;
}
}
container.insertBefore(styleNode, firstChild);
} else {
container.appendChild(styleNode);
}
return styleNode;
}
function findExistNode2(key2) {
var option = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var container = getContainer2(option);
return findStyles2(container).find(function(node) {
return node.getAttribute(getMark2(option)) === key2;
});
}
function removeCSS2(key2) {
var option = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var existNode = findExistNode2(key2, option);
if (existNode) {
var container = getContainer2(option);
container.removeChild(existNode);
}
}
function syncRealContainer2(container, option) {
var cachedRealContainer = containerCache2.get(container);
if (!cachedRealContainer || !(0, _contains.default)(document, cachedRealContainer)) {
var placeholderStyle = injectCSS2("", option);
var parentNode = placeholderStyle.parentNode;
containerCache2.set(container, parentNode);
container.removeChild(placeholderStyle);
}
}
function clearContainerCache() {
containerCache2.clear();
}
function updateCSS2(css2, key2) {
var option = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
var container = getContainer2(option);
syncRealContainer2(container, option);
var existNode = findExistNode2(key2, option);
if (existNode) {
var _option$csp, _option$csp2;
if ((_option$csp = option.csp) !== null && _option$csp !== void 0 && _option$csp.nonce && existNode.nonce !== ((_option$csp2 = option.csp) === null || _option$csp2 === void 0 ? void 0 : _option$csp2.nonce)) {
var _option$csp3;
existNode.nonce = (_option$csp3 = option.csp) === null || _option$csp3 === void 0 ? void 0 : _option$csp3.nonce;
}
if (existNode.innerHTML !== css2) {
existNode.innerHTML = css2;
}
return existNode;
}
var newNode = injectCSS2(css2, option);
newNode.setAttribute(getMark2(option), key2);
return newNode;
}
return dynamicCSS;
}
var hasRequiredUtils;
function requireUtils() {
if (hasRequiredUtils)
return utils$1;
hasRequiredUtils = 1;
var _interopRequireDefault2 = interopRequireDefault.exports;
var _typeof32 = _typeof$g.exports;
Object.defineProperty(utils$1, "__esModule", {
value: true
});
utils$1.generate = generate2;
utils$1.getSecondaryColor = getSecondaryColor2;
utils$1.iconStyles = void 0;
utils$1.isIconDefinition = isIconDefinition2;
utils$1.normalizeAttrs = normalizeAttrs2;
utils$1.normalizeTwoToneColors = normalizeTwoToneColors2;
utils$1.useInsertStyles = utils$1.svgBaseProps = void 0;
utils$1.warning = warning2;
var _objectSpread22 = _interopRequireDefault2(requireObjectSpread2());
var _typeof22 = _interopRequireDefault2(_typeof$g.exports);
var _colors = require$$3;
var _react = _interopRequireWildcard2(React__default.default);
var _warning = _interopRequireDefault2(requireWarning());
var _dynamicCSS = requireDynamicCSS();
var _Context = _interopRequireDefault2(requireContext());
function _getRequireWildcardCache2(nodeInterop) {
if (typeof WeakMap !== "function")
return null;
var cacheBabelInterop = /* @__PURE__ */ new WeakMap();
var cacheNodeInterop = /* @__PURE__ */ new WeakMap();
return (_getRequireWildcardCache2 = function _getRequireWildcardCache3(nodeInterop2) {
return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard2(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || _typeof32(obj) !== "object" && typeof obj !== "function") {
return { default: obj };
}
var cache = _getRequireWildcardCache2(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key2 in obj) {
if (key2 !== "default" && Object.prototype.hasOwnProperty.call(obj, key2)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key2) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key2, desc);
} else {
newObj[key2] = obj[key2];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
function warning2(valid, message) {
(0, _warning.default)(valid, "[@ant-design/icons] ".concat(message));
}
function isIconDefinition2(target) {
return (0, _typeof22.default)(target) === "object" && typeof target.name === "string" && typeof target.theme === "string" && ((0, _typeof22.default)(target.icon) === "object" || typeof target.icon === "function");
}
function normalizeAttrs2() {
var attrs = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
return Object.keys(attrs).reduce(function(acc, key2) {
var val = attrs[key2];
switch (key2) {
case "class":
acc.className = val;
delete acc.class;
break;
default:
acc[key2] = val;
}
return acc;
}, {});
}
function generate2(node, key2, rootProps) {
if (!rootProps) {
return /* @__PURE__ */ _react.default.createElement(node.tag, (0, _objectSpread22.default)({
key: key2
}, normalizeAttrs2(node.attrs)), (node.children || []).map(function(child, index2) {
return generate2(child, "".concat(key2, "-").concat(node.tag, "-").concat(index2));
}));
}
return /* @__PURE__ */ _react.default.createElement(node.tag, (0, _objectSpread22.default)((0, _objectSpread22.default)({
key: key2
}, normalizeAttrs2(node.attrs)), rootProps), (node.children || []).map(function(child, index2) {
return generate2(child, "".concat(key2, "-").concat(node.tag, "-").concat(index2));
}));
}
function getSecondaryColor2(primaryColor) {
return (0, _colors.generate)(primaryColor)[0];
}
function normalizeTwoToneColors2(twoToneColor) {
if (!twoToneColor) {
return [];
}
return Array.isArray(twoToneColor) ? twoToneColor : [twoToneColor];
}
var svgBaseProps = {
width: "1em",
height: "1em",
fill: "currentColor",
"aria-hidden": "true",
focusable: "false"
};
utils$1.svgBaseProps = svgBaseProps;
var iconStyles2 = "\n.anticon {\n display: inline-block;\n color: inherit;\n font-style: normal;\n line-height: 0;\n text-align: center;\n text-transform: none;\n vertical-align: -0.125em;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.anticon > * {\n line-height: 1;\n}\n\n.anticon svg {\n display: inline-block;\n}\n\n.anticon::before {\n display: none;\n}\n\n.anticon .anticon-icon {\n display: block;\n}\n\n.anticon[tabindex] {\n cursor: pointer;\n}\n\n.anticon-spin::before,\n.anticon-spin {\n display: inline-block;\n -webkit-animation: loadingCircle 1s infinite linear;\n animation: loadingCircle 1s infinite linear;\n}\n\n@-webkit-keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n@keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n";
utils$1.iconStyles = iconStyles2;
var useInsertStyles2 = function useInsertStyles3() {
var styleStr = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : iconStyles2;
var _useContext = (0, _react.useContext)(_Context.default), csp = _useContext.csp;
(0, _react.useEffect)(function() {
(0, _dynamicCSS.updateCSS)(styleStr, "@ant-design-icons", {
prepend: true,
csp
});
}, []);
};
utils$1.useInsertStyles = useInsertStyles2;
return utils$1;
}
var hasRequiredIconBase;
function requireIconBase() {
if (hasRequiredIconBase)
return IconBase;
hasRequiredIconBase = 1;
var _interopRequireDefault2 = interopRequireDefault.exports;
Object.defineProperty(IconBase, "__esModule", {
value: true
});
IconBase.default = void 0;
var _objectWithoutProperties2 = _interopRequireDefault2(requireObjectWithoutProperties());
var _objectSpread22 = _interopRequireDefault2(requireObjectSpread2());
var _utils = requireUtils();
var _excluded4 = ["icon", "className", "onClick", "style", "primaryColor", "secondaryColor"];
var twoToneColorPalette2 = {
primaryColor: "#333",
secondaryColor: "#E6E6E6",
calculated: false
};
function setTwoToneColors2(_ref) {
var primaryColor = _ref.primaryColor, secondaryColor = _ref.secondaryColor;
twoToneColorPalette2.primaryColor = primaryColor;
twoToneColorPalette2.secondaryColor = secondaryColor || (0, _utils.getSecondaryColor)(primaryColor);
twoToneColorPalette2.calculated = !!secondaryColor;
}
function getTwoToneColors2() {
return (0, _objectSpread22.default)({}, twoToneColorPalette2);
}
var IconBase$12 = function IconBase2(props) {
var icon = props.icon, className = props.className, onClick = props.onClick, style2 = props.style, primaryColor = props.primaryColor, secondaryColor = props.secondaryColor, restProps = (0, _objectWithoutProperties2.default)(props, _excluded4);
var colors = twoToneColorPalette2;
if (primaryColor) {
colors = {
primaryColor,
secondaryColor: secondaryColor || (0, _utils.getSecondaryColor)(primaryColor)
};
}
(0, _utils.useInsertStyles)();
(0, _utils.warning)((0, _utils.isIconDefinition)(icon), "icon should be icon definiton, but got ".concat(icon));
if (!(0, _utils.isIconDefinition)(icon)) {
return null;
}
var target = icon;
if (target && typeof target.icon === "function") {
target = (0, _objectSpread22.default)((0, _objectSpread22.default)({}, target), {}, {
icon: target.icon(colors.primaryColor, colors.secondaryColor)
});
}
return (0, _utils.generate)(target.icon, "svg-".concat(target.name), (0, _objectSpread22.default)({
className,
onClick,
style: style2,
"data-icon": target.name,
width: "1em",
height: "1em",
fill: "currentColor",
"aria-hidden": "true"
}, restProps));
};
IconBase$12.displayName = "IconReact";
IconBase$12.getTwoToneColors = getTwoToneColors2;
IconBase$12.setTwoToneColors = setTwoToneColors2;
var _default2 = IconBase$12;
IconBase.default = _default2;
return IconBase;
}
var twoTonePrimaryColor = {};
var hasRequiredTwoTonePrimaryColor;
function requireTwoTonePrimaryColor() {
if (hasRequiredTwoTonePrimaryColor)
return twoTonePrimaryColor;
hasRequiredTwoTonePrimaryColor = 1;
var _interopRequireDefault2 = interopRequireDefault.exports;
Object.defineProperty(twoTonePrimaryColor, "__esModule", {
value: true
});
twoTonePrimaryColor.getTwoToneColor = getTwoToneColor2;
twoTonePrimaryColor.setTwoToneColor = setTwoToneColor2;
var _slicedToArray2 = _interopRequireDefault2(requireSlicedToArray());
var _IconBase = _interopRequireDefault2(requireIconBase());
var _utils = requireUtils();
function setTwoToneColor2(twoToneColor) {
var _normalizeTwoToneColo = (0, _utils.normalizeTwoToneColors)(twoToneColor), _normalizeTwoToneColo2 = (0, _slicedToArray2.default)(_normalizeTwoToneColo, 2), primaryColor = _normalizeTwoToneColo2[0], secondaryColor = _normalizeTwoToneColo2[1];
return _IconBase.default.setTwoToneColors({
primaryColor,
secondaryColor
});
}
function getTwoToneColor2() {
var colors = _IconBase.default.getTwoToneColors();
if (!colors.calculated) {
return colors.primaryColor;
}
return [colors.primaryColor, colors.secondaryColor];
}
return twoTonePrimaryColor;
}
var hasRequiredAntdIcon;
function requireAntdIcon() {
if (hasRequiredAntdIcon)
return AntdIcon;
hasRequiredAntdIcon = 1;
var _interopRequireDefault2 = interopRequireDefault.exports;
var _typeof4 = _typeof$g.exports;
Object.defineProperty(AntdIcon, "__esModule", {
value: true
});
AntdIcon.default = void 0;
var _objectSpread22 = _interopRequireDefault2(requireObjectSpread2());
var _slicedToArray2 = _interopRequireDefault2(requireSlicedToArray());
var _defineProperty22 = _interopRequireDefault2(requireDefineProperty());
var _objectWithoutProperties2 = _interopRequireDefault2(requireObjectWithoutProperties());
var React3 = _interopRequireWildcard2(React__default.default);
var _classnames = _interopRequireDefault2(classnames$1.exports);
var _Context = _interopRequireDefault2(requireContext());
var _IconBase = _interopRequireDefault2(requireIconBase());
var _twoTonePrimaryColor = requireTwoTonePrimaryColor();
var _utils = requireUtils();
var _excluded4 = ["className", "icon", "spin", "rotate", "tabIndex", "onClick", "twoToneColor"];
function _getRequireWildcardCache2(nodeInterop) {
if (typeof WeakMap !== "function")
return null;
var cacheBabelInterop = /* @__PURE__ */ new WeakMap();
var cacheNodeInterop = /* @__PURE__ */ new WeakMap();
return (_getRequireWildcardCache2 = function _getRequireWildcardCache3(nodeInterop2) {
return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard2(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || _typeof4(obj) !== "object" && typeof obj !== "function") {
return { default: obj };
}
var cache = _getRequireWildcardCache2(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key2 in obj) {
if (key2 !== "default" && Object.prototype.hasOwnProperty.call(obj, key2)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key2) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key2, desc);
} else {
newObj[key2] = obj[key2];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
(0, _twoTonePrimaryColor.setTwoToneColor)("#1890ff");
var Icon2 = /* @__PURE__ */ React3.forwardRef(function(props, ref) {
var _classNames;
var className = props.className, icon = props.icon, spin = props.spin, rotate = props.rotate, tabIndex = props.tabIndex, onClick = props.onClick, twoToneColor = props.twoToneColor, restProps = (0, _objectWithoutProperties2.default)(props, _excluded4);
var _React$useContext = React3.useContext(_Context.default), _React$useContext$pre = _React$useContext.prefixCls, prefixCls = _React$useContext$pre === void 0 ? "anticon" : _React$useContext$pre, rootClassName = _React$useContext.rootClassName;
var classString = (0, _classnames.default)(rootClassName, prefixCls, (_classNames = {}, (0, _defineProperty22.default)(_classNames, "".concat(prefixCls, "-").concat(icon.name), !!icon.name), (0, _defineProperty22.default)(_classNames, "".concat(prefixCls, "-spin"), !!spin || icon.name === "loading"), _classNames), className);
var iconTabIndex = tabIndex;
if (iconTabIndex === void 0 && onClick) {
iconTabIndex = -1;
}
var svgStyle = rotate ? {
msTransform: "rotate(".concat(rotate, "deg)"),
transform: "rotate(".concat(rotate, "deg)")
} : void 0;
var _normalizeTwoToneColo = (0, _utils.normalizeTwoToneColors)(twoToneColor), _normalizeTwoToneColo2 = (0, _slicedToArray2.default)(_normalizeTwoToneColo, 2), primaryColor = _normalizeTwoToneColo2[0], secondaryColor = _normalizeTwoToneColo2[1];
return /* @__PURE__ */ React3.createElement("span", (0, _objectSpread22.default)((0, _objectSpread22.default)({
role: "img",
"aria-label": icon.name
}, restProps), {}, {
ref,
tabIndex: iconTabIndex,
onClick,
className: classString
}), /* @__PURE__ */ React3.createElement(_IconBase.default, {
icon,
primaryColor,
secondaryColor,
style: svgStyle
}));
});
Icon2.displayName = "AntdIcon";
Icon2.getTwoToneColor = _twoTonePrimaryColor.getTwoToneColor;
Icon2.setTwoToneColor = _twoTonePrimaryColor.setTwoToneColor;
var _default2 = Icon2;
AntdIcon.default = _default2;
return AntdIcon;
}
var _interopRequireDefault$8 = interopRequireDefault.exports;
var _typeof$f = _typeof$g.exports;
Object.defineProperty(PictureOutlined$2, "__esModule", {
value: true
});
var default_1$8 = PictureOutlined$2.default = void 0;
var _objectSpread2$8 = _interopRequireDefault$8(requireObjectSpread2());
var React$8 = _interopRequireWildcard$8(React__default.default);
var _PictureOutlined = _interopRequireDefault$8(requirePictureOutlined());
var _AntdIcon$8 = _interopRequireDefault$8(requireAntdIcon());
function _getRequireWildcardCache$8(nodeInterop) {
if (typeof WeakMap !== "function")
return null;
var cacheBabelInterop = /* @__PURE__ */ new WeakMap();
var cacheNodeInterop = /* @__PURE__ */ new WeakMap();
return (_getRequireWildcardCache$8 = function _getRequireWildcardCache2(nodeInterop2) {
return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard$8(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || _typeof$f(obj) !== "object" && typeof obj !== "function") {
return { default: obj };
}
var cache = _getRequireWildcardCache$8(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key2 in obj) {
if (key2 !== "default" && Object.prototype.hasOwnProperty.call(obj, key2)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key2) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key2, desc);
} else {
newObj[key2] = obj[key2];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
var PictureOutlined = function PictureOutlined2(props, ref) {
return /* @__PURE__ */ React$8.createElement(_AntdIcon$8.default, (0, _objectSpread2$8.default)((0, _objectSpread2$8.default)({}, props), {}, {
ref,
icon: _PictureOutlined.default
}));
};
PictureOutlined.displayName = "PictureOutlined";
var _default$8 = /* @__PURE__ */ React$8.forwardRef(PictureOutlined);
default_1$8 = PictureOutlined$2.default = _default$8;
const index$z = "";
const index$y = "";
var DEFAULT_IMG = "https://img.alicdn.com/tfs/TB14tSiKhTpK1RjSZFKXXa2wXXa-354-330.png";
var PreviewNode = function PreviewNode2(_ref) {
var value = _ref.value;
var configCtx = React$a.useContext(_ConfigProvider.ConfigContext);
var t2 = translation(configCtx);
return /* @__PURE__ */ React__default.default.createElement(_Popover, {
content: /* @__PURE__ */ jsx("img", {
src: value || DEFAULT_IMG,
alt: t2("img_src_error"),
className: "fr-preview-image"
}),
className: "fr-preview",
placement: "bottom"
}, /* @__PURE__ */ React__default.default.createElement(default_1$8, null));
};
var ImageInput = function ImageInput2(_a) {
var value = _a.value, rest = __rest(_a, ["value"]);
return /* @__PURE__ */ React__default.default.createElement(Input$2, Object.assign({
value,
addonAfter: /* @__PURE__ */ jsx(PreviewNode, {
value
})
}, rest));
};
const ImageInput$1 = withFieldWrap(ImageInput);
var UrlNode = function UrlNode2(props) {
var configCtx = React$a.useContext(_ConfigProvider.ConfigContext);
var t2 = translation(configCtx);
var value = props.value, _props$addonText = props.addonText, addonText = _props$addonText === void 0 ? t2("test_src") : _props$addonText;
var useUrl = isUrl(value);
if (useUrl) {
return /* @__PURE__ */ jsx("a", {
target: "_blank",
href: value,
children: addonText
});
}
return /* @__PURE__ */ jsx("div", {
children: addonText
});
};
var UrlInput = function UrlInput2(_a) {
var value = _a.value, prefix = _a.prefix, suffix = _a.suffix, addonText = _a.addonText, onChange = _a.onChange, rest = __rest(_a, ["value", "prefix", "suffix", "addonText", "onChange"]);
var _value = value || "";
if (prefix) {
_value = _value.replace(prefix, "");
}
if (suffix) {
_value = _value.replace(suffix, "");
}
var handleChange = function handleChange2(e2) {
var _value2 = e2.target.value;
if (!_value2) {
onChange === null || onChange === void 0 ? void 0 : onChange(_value2);
return;
}
if (prefix) {
_value2 = prefix + _value2;
}
if (suffix) {
_value2 = _value2 + suffix;
}
onChange === null || onChange === void 0 ? void 0 : onChange(_value2);
};
return /* @__PURE__ */ React__default.default.createElement(Input$2, Object.assign({
value: _value,
prefix,
suffix,
onChange: handleChange,
addonAfter: /* @__PURE__ */ jsx(UrlNode, {
value,
addonText
})
}, rest));
};
const UrlInput$1 = withFieldWrap(UrlInput);
const index$x = "";
const index$w = "";
var SliderWithNumber = function SliderWithNumber2(_a) {
var schema2 = _a.schema, value = _a.value, onChange = _a.onChange, hideInput = _a.hideInput, inputProps = _a.inputProps, style2 = _a.style, rest = __rest(_a, ["schema", "value", "onChange", "hideInput", "inputProps", "style"]);
var max = schema2.max, min = schema2.min, step2 = schema2.step;
var setting = {};
if (max || max === 0) {
setting = {
max
};
}
if (min || min === 0) {
setting = Object.assign(Object.assign({}, setting), {
min
});
}
if (step2) {
setting = Object.assign(Object.assign({}, setting), {
step: step2
});
}
return /* @__PURE__ */ React__default.default.createElement("div", {
className: "fr-slider",
style: style2
}, /* @__PURE__ */ React__default.default.createElement(_Slider, Object.assign({
style: {
flexGrow: 1,
marginRight: hideInput ? 0 : 12
}
}, setting, {
onChange,
value: typeof value === "number" ? value : min || 0
}, rest)), hideInput ? null : /* @__PURE__ */ React__default.default.createElement(_InputNumber, Object.assign({}, setting, inputProps, {
style: {
width: "90px"
},
value,
onChange
})));
};
const Slider = withFieldWrap(SliderWithNumber, ["addons", "dependValues"]);
const index$v = "";
const index$u = "";
var UploadOutlined$2 = {};
var UploadOutlined$1 = {};
var hasRequiredUploadOutlined;
function requireUploadOutlined() {
if (hasRequiredUploadOutlined)
return UploadOutlined$1;
hasRequiredUploadOutlined = 1;
Object.defineProperty(UploadOutlined$1, "__esModule", { value: true });
var UploadOutlined2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M400 317.7h73.9V656c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V317.7H624c6.7 0 10.4-7.7 6.3-12.9L518.3 163a8 8 0 00-12.6 0l-112 141.7c-4.1 5.3-.4 13 6.3 13zM878 626h-60c-4.4 0-8 3.6-8 8v154H214V634c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v198c0 17.7 14.3 32 32 32h684c17.7 0 32-14.3 32-32V634c0-4.4-3.6-8-8-8z" } }] }, "name": "upload", "theme": "outlined" };
UploadOutlined$1.default = UploadOutlined2;
return UploadOutlined$1;
}
var _interopRequireDefault$7 = interopRequireDefault.exports;
var _typeof$e = _typeof$g.exports;
Object.defineProperty(UploadOutlined$2, "__esModule", {
value: true
});
var default_1$7 = UploadOutlined$2.default = void 0;
var _objectSpread2$7 = _interopRequireDefault$7(requireObjectSpread2());
var React$7 = _interopRequireWildcard$7(React__default.default);
var _UploadOutlined = _interopRequireDefault$7(requireUploadOutlined());
var _AntdIcon$7 = _interopRequireDefault$7(requireAntdIcon());
function _getRequireWildcardCache$7(nodeInterop) {
if (typeof WeakMap !== "function")
return null;
var cacheBabelInterop = /* @__PURE__ */ new WeakMap();
var cacheNodeInterop = /* @__PURE__ */ new WeakMap();
return (_getRequireWildcardCache$7 = function _getRequireWildcardCache2(nodeInterop2) {
return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard$7(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || _typeof$e(obj) !== "object" && typeof obj !== "function") {
return { default: obj };
}
var cache = _getRequireWildcardCache$7(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key2 in obj) {
if (key2 !== "default" && Object.prototype.hasOwnProperty.call(obj, key2)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key2) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key2, desc);
} else {
newObj[key2] = obj[key2];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
var UploadOutlined = function UploadOutlined2(props, ref) {
return /* @__PURE__ */ React$7.createElement(_AntdIcon$7.default, (0, _objectSpread2$7.default)((0, _objectSpread2$7.default)({}, props), {}, {
ref,
icon: _UploadOutlined.default
}));
};
UploadOutlined.displayName = "UploadOutlined";
var _default$7 = /* @__PURE__ */ React$7.forwardRef(UploadOutlined);
default_1$7 = UploadOutlined$2.default = _default$7;
const index$t = "";
var FrUpload = function FrUpload2(_ref) {
var action = _ref.action, value = _ref.value, _onChange = _ref.onChange, uploadProps = _ref.uploadProps, buttonProps = _ref.buttonProps, schema2 = _ref.schema;
var configCtx = React$a.useContext(_ConfigProvider.ConfigContext);
var t2 = translation(configCtx);
var props = Object.assign({
name: "file",
type: "file",
action,
onChange: function onChange(info) {
if (info.file.status === "done") {
_message.success("".concat(info.file.name, " ").concat(t2("upload_success")));
var path2 = get(schema2, "props.path", "");
var url = path2 ? get(info.file.response, path2) : info.file.response.url;
_onChange(url);
} else if (info.file.status === "error") {
_message.error("".concat(info.file.name, " ").concat(t2("upload_fail")));
}
},
onRemove: function onRemove() {
_onChange("");
}
}, uploadProps);
var defaultBtnProps = {
icon: /* @__PURE__ */ React__default.default.createElement(default_1$7, null),
children: t2("upload")
};
var btnProps = Object.assign(Object.assign({}, defaultBtnProps), buttonProps);
return /* @__PURE__ */ React__default.default.createElement("div", {
className: "fr-upload-mod"
}, /* @__PURE__ */ React__default.default.createElement(_Upload, Object.assign({}, props, {
className: "fr-upload-file"
}), /* @__PURE__ */ React__default.default.createElement(Button$2, Object.assign({}, btnProps))), value && /* @__PURE__ */ jsx("a", {
href: value,
target: "_blank",
rel: "noopener noreferrer",
className: "fr-upload-preview",
children: t2("uploaded_address")
}));
};
const index$s = "";
function _extends() {
_extends = Object.assign ? Object.assign.bind() : function(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = arguments[i2];
for (var key2 in source) {
if (Object.prototype.hasOwnProperty.call(source, key2)) {
target[key2] = source[key2];
}
}
}
return target;
};
return _extends.apply(this, arguments);
}
function _typeof$d(obj) {
"@babel/helpers - typeof";
return _typeof$d = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$d(obj);
}
function html(_ref) {
var value = _ref.value, options = _ref.options, _ref$schema = _ref.schema, schema2 = _ref$schema === void 0 ? {} : _ref$schema;
var __html = "-";
if (schema2.type === "boolean") {
__html = value === true ? "\u2714" : "\u2718";
} else if ((options === null || options === void 0 ? void 0 : options.length) > 0) {
if (["string", "number"].indexOf(_typeof$d(value)) > -1) {
var item = options.find(function(item2) {
return item2.value === value;
});
__html = (item === null || item === void 0 ? void 0 : item.label) || "-";
} else if (Array.isArray(value)) {
var idxStr = "-";
value.forEach(function(v2) {
var item2 = options.find(function(item3) {
return item3.value === v2;
});
var name2 = item2.label;
if (name2) {
idxStr += "," + name2;
}
});
__html = idxStr.replace("-,", "");
}
} else if (typeof value === "number") {
__html = String(value);
} else if (typeof value === "string") {
__html = value;
} else if (schema2.type === "range" && Array.isArray(value) && value[0] && value[1]) {
__html = "".concat(value[0], " - ").concat(value[1]);
} else if (value && ["number", "string"].indexOf(value) === -1) {
__html = JSON.stringify(value);
}
if (schema2.format === "image") {
return /* @__PURE__ */ React__default.default.createElement(_Image, _extends({
height: 56,
src: value
}, schema2.imageProps));
}
return /* @__PURE__ */ jsx("div", {
dangerouslySetInnerHTML: {
__html
}
});
}
var PercentSlider = function PercentSlider2(p2) {
var _p$schema = p2.schema, max = _p$schema.max, min = _p$schema.min, step2 = _p$schema.step;
var setting = {};
if (max || max === 0) {
setting = {
max
};
}
if (min || min === 0) {
setting = Object.assign(Object.assign({}, setting), {
min
});
}
if (step2) {
setting = Object.assign(Object.assign({}, setting), {
step: step2
});
}
var hideNumber = false;
if (p2.options && p2.options.hideNumber) {
hideNumber = true;
}
var isPercent = function isPercent2(string2) {
return typeof string2 === "string" && string2.endsWith("%");
};
var numberValue = 100;
if (isPercent(p2.value)) {
try {
numberValue = Number(p2.value.split("%")[0]);
if (Number.isNaN(numberValue))
numberValue = 100;
} catch (error) {
}
}
var handleChange = function handleChange2(newNumber) {
var a = newNumber + "%";
p2.onChange(a);
};
var renderNumber = p2.readonly ? /* @__PURE__ */ jsx("span", {
style: {
width: "80px"
},
children: p2.value === "" ? "-" : p2.value + "%"
}) : /* @__PURE__ */ React__namespace.createElement(_InputNumber, Object.assign({}, p2.options, setting, {
style: {
width: "80px"
},
value: numberValue,
disabled: p2.disabled,
onChange: handleChange,
formatter: function formatter(value) {
return "".concat(value, "%");
},
parser: function parser(value) {
return Number(value.replace("%", ""));
}
}));
return /* @__PURE__ */ React__namespace.createElement("div", {
className: "fr-slider"
}, /* @__PURE__ */ React__namespace.createElement(_Slider, Object.assign({
style: {
flexGrow: 1,
marginRight: hideNumber ? 0 : 12
}
}, setting, {
onChange: handleChange,
max: 100,
tooltip: {
formatter: function formatter(v2) {
return v2 + "%";
}
},
value: numberValue || 100,
disabled: p2.disabled || p2.readonly
})), hideNumber ? null : renderNumber);
};
const index$r = "";
const index$q = "";
const index$p = "";
const index$o = "";
var PanelView = function PanelView2(_ref) {
var children = _ref.children, bordered = _ref.bordered;
return /* @__PURE__ */ jsx("div", {
className: classnames("fr-panel", {
"fr-panel-bordered": bordered
}),
children
});
};
const index$n = "";
var BoxCard = function BoxCard2(_ref) {
var children = _ref.children, title = _ref.title, description = _ref.description;
if (!title) {
return /* @__PURE__ */ jsx(PanelView, {
children
});
}
return /* @__PURE__ */ React__default.default.createElement(_Card, {
className: "fr-obj-card",
title: /* @__PURE__ */ jsxs(Fragment, {
children: [title, description && /* @__PURE__ */ jsx("span", {
className: "fr-header-desc ",
children: description
})]
})
}, children);
};
var DownOutlined$2 = {};
var DownOutlined$1 = {};
var hasRequiredDownOutlined;
function requireDownOutlined() {
if (hasRequiredDownOutlined)
return DownOutlined$1;
hasRequiredDownOutlined = 1;
Object.defineProperty(DownOutlined$1, "__esModule", { value: true });
var DownOutlined2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z" } }] }, "name": "down", "theme": "outlined" };
DownOutlined$1.default = DownOutlined2;
return DownOutlined$1;
}
var _interopRequireDefault$6 = interopRequireDefault.exports;
var _typeof$c = _typeof$g.exports;
Object.defineProperty(DownOutlined$2, "__esModule", {
value: true
});
var default_1$6 = DownOutlined$2.default = void 0;
var _objectSpread2$6 = _interopRequireDefault$6(requireObjectSpread2());
var React$6 = _interopRequireWildcard$6(React__default.default);
var _DownOutlined = _interopRequireDefault$6(requireDownOutlined());
var _AntdIcon$6 = _interopRequireDefault$6(requireAntdIcon());
function _getRequireWildcardCache$6(nodeInterop) {
if (typeof WeakMap !== "function")
return null;
var cacheBabelInterop = /* @__PURE__ */ new WeakMap();
var cacheNodeInterop = /* @__PURE__ */ new WeakMap();
return (_getRequireWildcardCache$6 = function _getRequireWildcardCache2(nodeInterop2) {
return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard$6(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || _typeof$c(obj) !== "object" && typeof obj !== "function") {
return { default: obj };
}
var cache = _getRequireWildcardCache$6(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key2 in obj) {
if (key2 !== "default" && Object.prototype.hasOwnProperty.call(obj, key2)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key2) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key2, desc);
} else {
newObj[key2] = obj[key2];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
var DownOutlined = function DownOutlined2(props, ref) {
return /* @__PURE__ */ React$6.createElement(_AntdIcon$6.default, (0, _objectSpread2$6.default)((0, _objectSpread2$6.default)({}, props), {}, {
ref,
icon: _DownOutlined.default
}));
};
DownOutlined.displayName = "DownOutlined";
var _default$6 = /* @__PURE__ */ React$6.forwardRef(DownOutlined);
default_1$6 = DownOutlined$2.default = _default$6;
const index$m = "";
const index$l = "";
function _slicedToArray$8(arr, i2) {
return _arrayWithHoles$8(arr) || _iterableToArrayLimit$8(arr, i2) || _unsupportedIterableToArray$a(arr, i2) || _nonIterableRest$8();
}
function _nonIterableRest$8() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$a(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$a(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$a(o, minLen);
}
function _arrayLikeToArray$a(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$8(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$8(arr) {
if (Array.isArray(arr))
return arr;
}
var Panel = Collapse$1.Panel;
var BoxCollapse = function BoxCollapse2(props) {
var style2 = props.style, children = props.children, title = props.title, description = props.description, _props$collapsed = props.collapsed, collapsed = _props$collapsed === void 0 ? true : _props$collapsed, displayType = props.displayType, _props$bordered = props.bordered, bordered = _props$bordered === void 0 ? false : _props$bordered, _props$ghost = props.ghost, ghost = _props$ghost === void 0 ? true : _props$ghost;
if (!title) {
return /* @__PURE__ */ jsx(PanelView, {
bordered: displayType !== "inline",
children
});
}
var _useState = React$a.useState(collapsed ? "single" : ""), _useState2 = _slicedToArray$8(_useState, 2), activeKey = _useState2[0], setActiveKey = _useState2[1];
var collapseHeader = /* @__PURE__ */ jsxs(Fragment, {
children: [title && /* @__PURE__ */ jsx("div", {
className: "collapse-title",
children: title
}), description && /* @__PURE__ */ jsx("span", {
className: "fr-header-desc ",
children: description
})]
});
var renderExpandIcon2 = function renderExpandIcon3(_ref) {
var isActive2 = _ref.isActive;
return /* @__PURE__ */ React__default.default.createElement("div", {
className: "expand-icon-box"
}, /* @__PURE__ */ React__default.default.createElement(default_1$6, {
rotate: isActive2 ? 0 : -90,
style: {
fontSize: "16px"
}
}));
};
return /* @__PURE__ */ React__default.default.createElement(
Collapse$1,
{
className: "fr-obj-collapse",
style: style2,
bordered,
ghost,
activeKey: [activeKey],
expandIcon: renderExpandIcon2,
onChange: function onChange() {
return setActiveKey(activeKey ? "" : "single");
}
},
/* @__PURE__ */ jsx(Panel, {
header: collapseHeader,
forceRender: true,
children
}, "single")
);
};
const index$k = "";
var BoxSubInline = function BoxSubInline2(props) {
var children = props.children, title = props.title, _props$hasBackground = props.hasBackground, hasBackground = _props$hasBackground === void 0 ? true : _props$hasBackground, description = props.description, tooltip = props.tooltip, fieldCol = props.fieldCol, labelCol = props.labelCol, labelWidth = props.labelWidth;
props.displayType;
var rest = __rest(props, ["children", "title", "hasBackground", "description", "tooltip", "fieldCol", "labelCol", "labelWidth", "displayType"]);
var _tooltip = null;
var _labelCol = {
span: 3
};
var _fieldCol = {
flex: 1
};
if (description) {
_tooltip = {
title: description
};
}
if (tooltip) {
_tooltip = tooltip;
}
if (labelWidth) {
_labelCol = {
flex: labelWidth + "px"
};
}
if (labelCol) {
_labelCol = labelCol;
}
if (fieldCol) {
_fieldCol = fieldCol;
}
return /* @__PURE__ */ React__default.default.createElement(_Form.Item, Object.assign({}, rest, {
className: classnames("fr-obj-subinline", {
"fr-obj-subinline-label-hidden": !title,
"fr-obj-subinline-background": hasBackground
}),
label: title || "notitle",
labelCol: _labelCol,
wrapperCol: _fieldCol,
tooltip: _tooltip
}), children);
};
const index$j = "";
var FLineTitle = function FLineTitle2(_ref) {
var children = _ref.children, title = _ref.title, description = _ref.description;
if (!title) {
return /* @__PURE__ */ jsx(PanelView, {
children
});
}
return /* @__PURE__ */ jsxs("div", {
className: "fr-obj-line-title",
children: [/* @__PURE__ */ jsxs("div", {
className: "fr-obj-header",
children: [/* @__PURE__ */ jsx("span", {
className: "fr-header-title",
children: title
}), description && /* @__PURE__ */ jsx("span", {
className: "fr-header-desc",
children: description
})]
}), /* @__PURE__ */ jsx("div", {
className: "fr-obj-content",
children
})]
});
};
var PlusOutlined$2 = {};
var PlusOutlined$1 = {};
var hasRequiredPlusOutlined;
function requirePlusOutlined() {
if (hasRequiredPlusOutlined)
return PlusOutlined$1;
hasRequiredPlusOutlined = 1;
Object.defineProperty(PlusOutlined$1, "__esModule", { value: true });
var PlusOutlined2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "defs", "attrs": {}, "children": [{ "tag": "style", "attrs": {} }] }, { "tag": "path", "attrs": { "d": "M482 152h60q8 0 8 8v704q0 8-8 8h-60q-8 0-8-8V160q0-8 8-8z" } }, { "tag": "path", "attrs": { "d": "M176 474h672q8 0 8 8v60q0 8-8 8H176q-8 0-8-8v-60q0-8 8-8z" } }] }, "name": "plus", "theme": "outlined" };
PlusOutlined$1.default = PlusOutlined2;
return PlusOutlined$1;
}
var _interopRequireDefault$5 = interopRequireDefault.exports;
var _typeof$b = _typeof$g.exports;
Object.defineProperty(PlusOutlined$2, "__esModule", {
value: true
});
var default_1$5 = PlusOutlined$2.default = void 0;
var _objectSpread2$5 = _interopRequireDefault$5(requireObjectSpread2());
var React$5 = _interopRequireWildcard$5(React__default.default);
var _PlusOutlined = _interopRequireDefault$5(requirePlusOutlined());
var _AntdIcon$5 = _interopRequireDefault$5(requireAntdIcon());
function _getRequireWildcardCache$5(nodeInterop) {
if (typeof WeakMap !== "function")
return null;
var cacheBabelInterop = /* @__PURE__ */ new WeakMap();
var cacheNodeInterop = /* @__PURE__ */ new WeakMap();
return (_getRequireWildcardCache$5 = function _getRequireWildcardCache2(nodeInterop2) {
return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard$5(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || _typeof$b(obj) !== "object" && typeof obj !== "function") {
return { default: obj };
}
var cache = _getRequireWildcardCache$5(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key2 in obj) {
if (key2 !== "default" && Object.prototype.hasOwnProperty.call(obj, key2)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key2) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key2, desc);
} else {
newObj[key2] = obj[key2];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
var PlusOutlined = function PlusOutlined2(props, ref) {
return /* @__PURE__ */ React$5.createElement(_AntdIcon$5.default, (0, _objectSpread2$5.default)((0, _objectSpread2$5.default)({}, props), {}, {
ref,
icon: _PlusOutlined.default
}));
};
PlusOutlined.displayName = "PlusOutlined";
var _default$5 = /* @__PURE__ */ React$5.forwardRef(PlusOutlined);
default_1$5 = PlusOutlined$2.default = _default$5;
var CopyOutlined$2 = {};
var CopyOutlined$1 = {};
var hasRequiredCopyOutlined;
function requireCopyOutlined() {
if (hasRequiredCopyOutlined)
return CopyOutlined$1;
hasRequiredCopyOutlined = 1;
Object.defineProperty(CopyOutlined$1, "__esModule", { value: true });
var CopyOutlined2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M832 64H296c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h496v688c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V96c0-17.7-14.3-32-32-32zM704 192H192c-17.7 0-32 14.3-32 32v530.7c0 8.5 3.4 16.6 9.4 22.6l173.3 173.3c2.2 2.2 4.7 4 7.4 5.5v1.9h4.2c3.5 1.3 7.2 2 11 2H704c17.7 0 32-14.3 32-32V224c0-17.7-14.3-32-32-32zM350 856.2L263.9 770H350v86.2zM664 888H414V746c0-22.1-17.9-40-40-40H232V264h432v624z" } }] }, "name": "copy", "theme": "outlined" };
CopyOutlined$1.default = CopyOutlined2;
return CopyOutlined$1;
}
var _interopRequireDefault$4 = interopRequireDefault.exports;
var _typeof$a = _typeof$g.exports;
Object.defineProperty(CopyOutlined$2, "__esModule", {
value: true
});
var default_1$4 = CopyOutlined$2.default = void 0;
var _objectSpread2$4 = _interopRequireDefault$4(requireObjectSpread2());
var React$4 = _interopRequireWildcard$4(React__default.default);
var _CopyOutlined = _interopRequireDefault$4(requireCopyOutlined());
var _AntdIcon$4 = _interopRequireDefault$4(requireAntdIcon());
function _getRequireWildcardCache$4(nodeInterop) {
if (typeof WeakMap !== "function")
return null;
var cacheBabelInterop = /* @__PURE__ */ new WeakMap();
var cacheNodeInterop = /* @__PURE__ */ new WeakMap();
return (_getRequireWildcardCache$4 = function _getRequireWildcardCache2(nodeInterop2) {
return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard$4(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || _typeof$a(obj) !== "object" && typeof obj !== "function") {
return { default: obj };
}
var cache = _getRequireWildcardCache$4(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key2 in obj) {
if (key2 !== "default" && Object.prototype.hasOwnProperty.call(obj, key2)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key2) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key2, desc);
} else {
newObj[key2] = obj[key2];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
var CopyOutlined = function CopyOutlined2(props, ref) {
return /* @__PURE__ */ React$4.createElement(_AntdIcon$4.default, (0, _objectSpread2$4.default)((0, _objectSpread2$4.default)({}, props), {}, {
ref,
icon: _CopyOutlined.default
}));
};
CopyOutlined.displayName = "CopyOutlined";
var _default$4 = /* @__PURE__ */ React$4.forwardRef(CopyOutlined);
default_1$4 = CopyOutlined$2.default = _default$4;
var CloseOutlined$2 = {};
var CloseOutlined$1 = {};
var hasRequiredCloseOutlined;
function requireCloseOutlined() {
if (hasRequiredCloseOutlined)
return CloseOutlined$1;
hasRequiredCloseOutlined = 1;
Object.defineProperty(CloseOutlined$1, "__esModule", { value: true });
var CloseOutlined2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z" } }] }, "name": "close", "theme": "outlined" };
CloseOutlined$1.default = CloseOutlined2;
return CloseOutlined$1;
}
var _interopRequireDefault$3 = interopRequireDefault.exports;
var _typeof$9 = _typeof$g.exports;
Object.defineProperty(CloseOutlined$2, "__esModule", {
value: true
});
var default_1$3 = CloseOutlined$2.default = void 0;
var _objectSpread2$3 = _interopRequireDefault$3(requireObjectSpread2());
var React$3 = _interopRequireWildcard$3(React__default.default);
var _CloseOutlined = _interopRequireDefault$3(requireCloseOutlined());
var _AntdIcon$3 = _interopRequireDefault$3(requireAntdIcon());
function _getRequireWildcardCache$3(nodeInterop) {
if (typeof WeakMap !== "function")
return null;
var cacheBabelInterop = /* @__PURE__ */ new WeakMap();
var cacheNodeInterop = /* @__PURE__ */ new WeakMap();
return (_getRequireWildcardCache$3 = function _getRequireWildcardCache2(nodeInterop2) {
return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard$3(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || _typeof$9(obj) !== "object" && typeof obj !== "function") {
return { default: obj };
}
var cache = _getRequireWildcardCache$3(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key2 in obj) {
if (key2 !== "default" && Object.prototype.hasOwnProperty.call(obj, key2)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key2) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key2, desc);
} else {
newObj[key2] = obj[key2];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
var CloseOutlined = function CloseOutlined2(props, ref) {
return /* @__PURE__ */ React$3.createElement(_AntdIcon$3.default, (0, _objectSpread2$3.default)((0, _objectSpread2$3.default)({}, props), {}, {
ref,
icon: _CloseOutlined.default
}));
};
CloseOutlined.displayName = "CloseOutlined";
var _default$3 = /* @__PURE__ */ React$3.forwardRef(CloseOutlined);
default_1$3 = CloseOutlined$2.default = _default$3;
const index$i = "";
var ArrowDownOutlined$2 = {};
var ArrowDownOutlined$1 = {};
var hasRequiredArrowDownOutlined;
function requireArrowDownOutlined() {
if (hasRequiredArrowDownOutlined)
return ArrowDownOutlined$1;
hasRequiredArrowDownOutlined = 1;
Object.defineProperty(ArrowDownOutlined$1, "__esModule", { value: true });
var ArrowDownOutlined2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M862 465.3h-81c-4.6 0-9 2-12.1 5.5L550 723.1V160c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v563.1L255.1 470.8c-3-3.5-7.4-5.5-12.1-5.5h-81c-6.8 0-10.5 8.1-6 13.2L487.9 861a31.96 31.96 0 0048.3 0L868 478.5c4.5-5.2.8-13.2-6-13.2z" } }] }, "name": "arrow-down", "theme": "outlined" };
ArrowDownOutlined$1.default = ArrowDownOutlined2;
return ArrowDownOutlined$1;
}
var _interopRequireDefault$2 = interopRequireDefault.exports;
var _typeof$8 = _typeof$g.exports;
Object.defineProperty(ArrowDownOutlined$2, "__esModule", {
value: true
});
var default_1$2 = ArrowDownOutlined$2.default = void 0;
var _objectSpread2$2 = _interopRequireDefault$2(requireObjectSpread2());
var React$2 = _interopRequireWildcard$2(React__default.default);
var _ArrowDownOutlined = _interopRequireDefault$2(requireArrowDownOutlined());
var _AntdIcon$2 = _interopRequireDefault$2(requireAntdIcon());
function _getRequireWildcardCache$2(nodeInterop) {
if (typeof WeakMap !== "function")
return null;
var cacheBabelInterop = /* @__PURE__ */ new WeakMap();
var cacheNodeInterop = /* @__PURE__ */ new WeakMap();
return (_getRequireWildcardCache$2 = function _getRequireWildcardCache2(nodeInterop2) {
return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard$2(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || _typeof$8(obj) !== "object" && typeof obj !== "function") {
return { default: obj };
}
var cache = _getRequireWildcardCache$2(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key2 in obj) {
if (key2 !== "default" && Object.prototype.hasOwnProperty.call(obj, key2)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key2) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key2, desc);
} else {
newObj[key2] = obj[key2];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
var ArrowDownOutlined = function ArrowDownOutlined2(props, ref) {
return /* @__PURE__ */ React$2.createElement(_AntdIcon$2.default, (0, _objectSpread2$2.default)((0, _objectSpread2$2.default)({}, props), {}, {
ref,
icon: _ArrowDownOutlined.default
}));
};
ArrowDownOutlined.displayName = "ArrowDownOutlined";
var _default$2 = /* @__PURE__ */ React$2.forwardRef(ArrowDownOutlined);
default_1$2 = ArrowDownOutlined$2.default = _default$2;
var ArrowUpOutlined$2 = {};
var ArrowUpOutlined$1 = {};
var hasRequiredArrowUpOutlined;
function requireArrowUpOutlined() {
if (hasRequiredArrowUpOutlined)
return ArrowUpOutlined$1;
hasRequiredArrowUpOutlined = 1;
Object.defineProperty(ArrowUpOutlined$1, "__esModule", { value: true });
var ArrowUpOutlined2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M868 545.5L536.1 163a31.96 31.96 0 00-48.3 0L156 545.5a7.97 7.97 0 006 13.2h81c4.6 0 9-2 12.1-5.5L474 300.9V864c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V300.9l218.9 252.3c3 3.5 7.4 5.5 12.1 5.5h81c6.8 0 10.5-8 6-13.2z" } }] }, "name": "arrow-up", "theme": "outlined" };
ArrowUpOutlined$1.default = ArrowUpOutlined2;
return ArrowUpOutlined$1;
}
var _interopRequireDefault$1 = interopRequireDefault.exports;
var _typeof$7 = _typeof$g.exports;
Object.defineProperty(ArrowUpOutlined$2, "__esModule", {
value: true
});
var default_1$1 = ArrowUpOutlined$2.default = void 0;
var _objectSpread2$1 = _interopRequireDefault$1(requireObjectSpread2());
var React$1 = _interopRequireWildcard$1(React__default.default);
var _ArrowUpOutlined = _interopRequireDefault$1(requireArrowUpOutlined());
var _AntdIcon$1 = _interopRequireDefault$1(requireAntdIcon());
function _getRequireWildcardCache$1(nodeInterop) {
if (typeof WeakMap !== "function")
return null;
var cacheBabelInterop = /* @__PURE__ */ new WeakMap();
var cacheNodeInterop = /* @__PURE__ */ new WeakMap();
return (_getRequireWildcardCache$1 = function _getRequireWildcardCache2(nodeInterop2) {
return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard$1(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || _typeof$7(obj) !== "object" && typeof obj !== "function") {
return { default: obj };
}
var cache = _getRequireWildcardCache$1(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key2 in obj) {
if (key2 !== "default" && Object.prototype.hasOwnProperty.call(obj, key2)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key2) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key2, desc);
} else {
newObj[key2] = obj[key2];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
var ArrowUpOutlined = function ArrowUpOutlined2(props, ref) {
return /* @__PURE__ */ React$1.createElement(_AntdIcon$1.default, (0, _objectSpread2$1.default)((0, _objectSpread2$1.default)({}, props), {}, {
ref,
icon: _ArrowUpOutlined.default
}));
};
ArrowUpOutlined.displayName = "ArrowUpOutlined";
var _default$1 = /* @__PURE__ */ React$1.forwardRef(ArrowUpOutlined);
default_1$1 = ArrowUpOutlined$2.default = _default$1;
const index$h = "";
var HeaderTitle = function HeaderTitle2(props) {
var icon = props.icon, children = props.children, btnType = props.btnType, otherProps = __rest(props, ["icon", "children", "btnType"]);
var btnProps = Object.assign({}, otherProps);
if (btnType === "icon") {
btnProps.icon = icon;
btnProps.size = "small";
} else {
btnProps.children = children;
}
return /* @__PURE__ */ React__default.default.createElement(Button$2, Object.assign({
type: "link",
style: {
padding: 0
}
}, btnProps));
};
const index$g = "";
function _toConsumableArray$5(arr) {
return _arrayWithoutHoles$5(arr) || _iterableToArray$5(arr) || _unsupportedIterableToArray$9(arr) || _nonIterableSpread$5();
}
function _nonIterableSpread$5() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$9(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$9(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$9(o, minLen);
}
function _iterableToArray$5(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithoutHoles$5(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$9(arr);
}
function _arrayLikeToArray$9(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
var getHasBackground = function getHasBackground2(fields, hasBackground) {
var result = hasBackground;
if (fields.length === 0) {
result = false;
}
return result;
};
var SimpleList = function SimpleList2(props) {
var form = props.form, schema2 = props.schema, fields = props.fields, rootPath = props.rootPath, renderCore = props.renderCore, hasBackground = props.hasBackground, operateBtnType = props.operateBtnType, addBtnProps = props.addBtnProps, delConfirmProps = props.delConfirmProps, copyBtnProps = props.copyBtnProps, deleteBtnProps = props.deleteBtnProps, moveUpBtnProps = props.moveUpBtnProps, moveDownBtnProps = props.moveDownBtnProps, hideDelete = props.hideDelete, hideCopy = props.hideCopy, hideMove = props.hideMove, hideAdd = props.hideAdd, addItem = props.addItem, copyItem = props.copyItem, moveItem = props.moveItem, removeItem = props.removeItem, temporary = props.temporary;
if (!schema2.items.displayType) {
schema2.items.displayType = "inline";
schema2.items.inlineMode = true;
}
var handleCopy = function handleCopy2(name2) {
var value = form.getFieldValue(rootPath.concat(name2));
copyItem(value);
};
var isColumm = temporary.displayType === "column";
return /* @__PURE__ */ jsxs("div", {
className: classnames("fr-list-simple", {
"fr-list-simple-background": getHasBackground(fields, hasBackground),
"fr-list-simple-column": isColumm
}),
children: [fields.map(function(_ref) {
var key2 = _ref.key, name2 = _ref.name;
var length = fields.length;
return /* @__PURE__ */ React__default.default.createElement("div", {
key: key2,
className: "fr-list-item"
}, renderCore({
schema: schema2,
parentPath: [name2],
rootPath: [].concat(_toConsumableArray$5(rootPath), [name2])
}), /* @__PURE__ */ React__default.default.createElement(_Space, {
className: classnames("fr-list-item-operate"),
split: operateBtnType !== "icon" && /* @__PURE__ */ React__default.default.createElement(_Divider, {
type: "vertical"
})
}, !hideMove && /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
disabled: name2 === 0,
onClick: function onClick() {
return moveItem(name2, name2 - 1);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$1, null)
}, moveUpBtnProps)
}), /* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
disabled: name2 === length - 1,
onClick: function onClick() {
return moveItem(name2, name2 + 1);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$2, null),
children: "\u4E0B\u79FB"
}, moveDownBtnProps)
})]
}), !hideDelete && /* @__PURE__ */ React__default.default.createElement(
_Popconfirm,
Object.assign({
onConfirm: function onConfirm() {
return removeItem(name2);
}
}, delConfirmProps),
/* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
icon: /* @__PURE__ */ React__default.default.createElement(default_1$3, null),
children: "\u5220\u9664",
btnType: operateBtnType
}, deleteBtnProps)
})
), !hideCopy && /* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
onClick: function onClick() {
return handleCopy(name2);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$4, null),
children: "\u590D\u5236"
}, copyBtnProps)
})));
}), (!schema2.max || fields.length < schema2.max) && !hideAdd && /* @__PURE__ */ React__default.default.createElement(Button$2, Object.assign({
className: "add-btn",
icon: /* @__PURE__ */ React__default.default.createElement(default_1$5, null),
onClick: function onClick() {
return addItem();
},
block: fields.length > 0 ? true : false
}, addBtnProps))]
});
};
const index$f = "";
function _toConsumableArray$4(arr) {
return _arrayWithoutHoles$4(arr) || _iterableToArray$4(arr) || _unsupportedIterableToArray$8(arr) || _nonIterableSpread$4();
}
function _nonIterableSpread$4() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$8(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$8(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$8(o, minLen);
}
function _iterableToArray$4(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithoutHoles$4(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$8(arr);
}
function _arrayLikeToArray$8(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
var getOperateFixed = function getOperateFixed2(schema2) {
var _a, _b;
var fixed = true;
if ((_b = (_a = schema2 === null || schema2 === void 0 ? void 0 : schema2.items) === null || _a === void 0 ? void 0 : _a.props) === null || _b === void 0 ? void 0 : _b.extra) {
fixed = false;
}
return fixed;
};
var getOperateStyle = function getOperateStyle2(schema2) {
var _a, _b, _c, _d, _e;
var style2 = {};
var widgetName = ((_a = schema2 === null || schema2 === void 0 ? void 0 : schema2.items) === null || _a === void 0 ? void 0 : _a.theme) || ((_b = schema2 === null || schema2 === void 0 ? void 0 : schema2.items) === null || _b === void 0 ? void 0 : _b.widget) || "collapse";
if (["card", "collapse", "lineTitle"].includes(widgetName) && !((_d = (_c = schema2 === null || schema2 === void 0 ? void 0 : schema2.items) === null || _c === void 0 ? void 0 : _c.props) === null || _d === void 0 ? void 0 : _d.extra)) {
style2.top = "14px";
if (["lineTitle"].includes(widgetName)) {
style2.top = "3px";
style2.padding = 0;
}
if (!((_e = schema2 === null || schema2 === void 0 ? void 0 : schema2.items) === null || _e === void 0 ? void 0 : _e.title)) {
style2.right = "0";
}
}
return style2;
};
var CardList = function CardList2(props) {
var form = props.form, schema2 = props.schema, fields = props.fields, rootPath = props.rootPath, renderCore = props.renderCore, hasBackground = props.hasBackground, operateBtnType = props.operateBtnType, addBtnProps = props.addBtnProps, delConfirmProps = props.delConfirmProps, copyBtnProps = props.copyBtnProps, deleteBtnProps = props.deleteBtnProps, moveUpBtnProps = props.moveUpBtnProps, moveDownBtnProps = props.moveDownBtnProps, hideDelete = props.hideDelete, hideCopy = props.hideCopy, hideMove = props.hideMove, hideAdd = props.hideAdd, addItem = props.addItem, copyItem = props.copyItem, moveItem = props.moveItem, removeItem = props.removeItem;
var handleCopy = function handleCopy2(name2) {
var value = form.getFieldValue(rootPath.concat(name2));
copyItem(value);
};
return /* @__PURE__ */ jsx(Fragment, {
children: /* @__PURE__ */ jsxs("div", {
className: classnames("fr-list-card", {
"fr-list-card-background": hasBackground
}),
children: [fields.map(function(_ref) {
var key2 = _ref.key, name2 = _ref.name;
var length = fields.length;
var newSchema = cloneDeep(schema2);
if (newSchema.items.title && typeof newSchema.items.title === "string") {
newSchema.items.title += " ".concat(name2 + 1);
}
return /* @__PURE__ */ React__default.default.createElement(
"div",
{
key: key2,
className: "fr-list-item"
},
/* @__PURE__ */ jsx("div", {
style: {
width: 0,
flex: 1
},
children: renderCore({
schema: newSchema,
parentPath: [name2],
rootPath: [].concat(_toConsumableArray$4(rootPath), [name2])
})
}),
/* @__PURE__ */ React__default.default.createElement(_Space, {
className: classnames("fr-list-item-operate", {
"fr-list-item-operate-fixed": getOperateFixed(schema2)
}),
style: getOperateStyle(schema2),
split: operateBtnType !== "icon" && /* @__PURE__ */ React__default.default.createElement(_Divider, {
type: "vertical"
})
}, !hideMove && /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
disabled: name2 === 0,
onClick: function onClick() {
return moveItem(name2, name2 - 1);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$1, null)
}, moveUpBtnProps)
}), /* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
disabled: name2 === length - 1,
onClick: function onClick() {
return moveItem(name2, name2 + 1);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$2, null)
}, moveDownBtnProps)
})]
}), !hideDelete && /* @__PURE__ */ React__default.default.createElement(
_Popconfirm,
Object.assign({
onConfirm: function onConfirm() {
return removeItem(name2);
}
}, delConfirmProps),
/* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
icon: /* @__PURE__ */ React__default.default.createElement(default_1$3, null)
}, deleteBtnProps)
})
), !hideCopy && /* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
onClick: function onClick() {
return handleCopy(name2);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$4, null)
}, copyBtnProps)
}))
);
}), !hideAdd && /* @__PURE__ */ React__default.default.createElement("div", {
className: "fr-list-add-btn"
}, /* @__PURE__ */ React__default.default.createElement(Button$2, Object.assign({}, addBtnProps, {
onClick: function onClick() {
return addItem();
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$5, null),
block: fields.length > 0 ? true : false
})))]
})
});
};
const index$e = "";
const index$d = "";
const index$c = "";
const index$b = "";
const index$a = "";
const index$9 = "";
var InfoCircleOutlined$2 = {};
var InfoCircleOutlined$1 = {};
var hasRequiredInfoCircleOutlined;
function requireInfoCircleOutlined() {
if (hasRequiredInfoCircleOutlined)
return InfoCircleOutlined$1;
hasRequiredInfoCircleOutlined = 1;
Object.defineProperty(InfoCircleOutlined$1, "__esModule", { value: true });
var InfoCircleOutlined2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z" } }, { "tag": "path", "attrs": { "d": "M464 336a48 48 0 1096 0 48 48 0 10-96 0zm72 112h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V456c0-4.4-3.6-8-8-8z" } }] }, "name": "info-circle", "theme": "outlined" };
InfoCircleOutlined$1.default = InfoCircleOutlined2;
return InfoCircleOutlined$1;
}
var _interopRequireDefault = interopRequireDefault.exports;
var _typeof$6 = _typeof$g.exports;
Object.defineProperty(InfoCircleOutlined$2, "__esModule", {
value: true
});
var default_1 = InfoCircleOutlined$2.default = void 0;
var _objectSpread2 = _interopRequireDefault(requireObjectSpread2());
var React2 = _interopRequireWildcard(React__default.default);
var _InfoCircleOutlined = _interopRequireDefault(requireInfoCircleOutlined());
var _AntdIcon = _interopRequireDefault(requireAntdIcon());
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function")
return null;
var cacheBabelInterop = /* @__PURE__ */ new WeakMap();
var cacheNodeInterop = /* @__PURE__ */ new WeakMap();
return (_getRequireWildcardCache = function _getRequireWildcardCache2(nodeInterop2) {
return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || _typeof$6(obj) !== "object" && typeof obj !== "function") {
return { default: obj };
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key2 in obj) {
if (key2 !== "default" && Object.prototype.hasOwnProperty.call(obj, key2)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key2) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key2, desc);
} else {
newObj[key2] = obj[key2];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
var InfoCircleOutlined = function InfoCircleOutlined2(props, ref) {
return /* @__PURE__ */ React2.createElement(_AntdIcon.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, {
ref,
icon: _InfoCircleOutlined.default
}));
};
InfoCircleOutlined.displayName = "InfoCircleOutlined";
var _default = /* @__PURE__ */ React2.forwardRef(InfoCircleOutlined);
default_1 = InfoCircleOutlined$2.default = _default;
function _slicedToArray$7(arr, i2) {
return _arrayWithHoles$7(arr) || _iterableToArrayLimit$7(arr, i2) || _unsupportedIterableToArray$7(arr, i2) || _nonIterableRest$7();
}
function _nonIterableRest$7() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$7(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$7(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$7(o, minLen);
}
function _arrayLikeToArray$7(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$7(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$7(arr) {
if (Array.isArray(arr))
return arr;
}
var TableCell = function TableCell2(props) {
var renderCore = props.renderCore, schema2 = props.schema, dataIndex = props.dataIndex, otherProps = __rest(props, ["renderCore", "schema", "dataIndex"]);
var _useState = React$a.useState(null), _useState2 = _slicedToArray$7(_useState, 2), errorMsg = _useState2[0], setErrorMsg = _useState2[1];
var _useState3 = React$a.useState(), _useState4 = _slicedToArray$7(_useState3, 2), visible = _useState4[0], setVisible = _useState4[1];
var mouseRef = React$a.useRef();
var onStatusChange = function onStatusChange2(_, errors) {
var message = errors[0] || null;
setErrorMsg(message);
if (mouseRef.current && message) {
setVisible(true);
}
};
if (!schema2.properties[dataIndex].onStatusChange) {
schema2.properties[dataIndex].onStatusChange = onStatusChange;
}
return /* @__PURE__ */ React__default.default.createElement("div", {
className: "fr-table-cell-content",
onMouseEnter: function onMouseEnter() {
mouseRef.current = true;
setVisible(true);
},
onMouseLeave: function onMouseLeave() {
mouseRef.current = false;
setVisible(false);
}
}, /* @__PURE__ */ React__default.default.createElement(_Popover, {
overlayClassName: "fr-popover-error",
content: errorMsg,
placement: "topRight",
open: visible && errorMsg
}, renderCore(Object.assign(Object.assign({}, otherProps), {
schema: schema2
}))));
};
const index$8 = "";
function _typeof$5(obj) {
"@babel/helpers - typeof";
return _typeof$5 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$5(obj);
}
function _toConsumableArray$3(arr) {
return _arrayWithoutHoles$3(arr) || _iterableToArray$3(arr) || _unsupportedIterableToArray$6(arr) || _nonIterableSpread$3();
}
function _nonIterableSpread$3() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _iterableToArray$3(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithoutHoles$3(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$6(arr);
}
function _defineProperty$4(obj, key2, value) {
key2 = _toPropertyKey$4(key2);
if (key2 in obj) {
Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key2] = value;
}
return obj;
}
function _toPropertyKey$4(arg) {
var key2 = _toPrimitive$4(arg, "string");
return _typeof$5(key2) === "symbol" ? key2 : String(key2);
}
function _toPrimitive$4(input, hint) {
if (_typeof$5(input) !== "object" || input === null)
return input;
var prim = input[Symbol.toPrimitive];
if (prim !== void 0) {
var res = prim.call(input, hint || "default");
if (_typeof$5(res) !== "object")
return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
function _slicedToArray$6(arr, i2) {
return _arrayWithHoles$6(arr) || _iterableToArrayLimit$6(arr, i2) || _unsupportedIterableToArray$6(arr, i2) || _nonIterableRest$6();
}
function _nonIterableRest$6() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$6(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$6(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$6(o, minLen);
}
function _arrayLikeToArray$6(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$6(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$6(arr) {
if (Array.isArray(arr))
return arr;
}
var getTooltip$2 = function getTooltip2(tooltip) {
if (!tooltip) {
return;
}
if (typeof tooltip === "string") {
return {
title: /* @__PURE__ */ jsx("span", {
dangerouslySetInnerHTML: {
__html: tooltip
}
})
};
}
return Object.assign(Object.assign({}, tooltip), {
title: /* @__PURE__ */ jsx("span", {
dangerouslySetInnerHTML: {
__html: tooltip.title
}
})
});
};
var TableList$1 = function TableList2(props) {
var _a, _b;
var form = props.form, schema2 = props.schema, fields = props.fields, rootPath = props.rootPath, renderCore = props.renderCore, readOnly = props.readOnly, operateBtnType = props.operateBtnType, addBtnProps = props.addBtnProps, delConfirmProps = props.delConfirmProps, copyBtnProps = props.copyBtnProps, deleteBtnProps = props.deleteBtnProps, moveUpBtnProps = props.moveUpBtnProps, moveDownBtnProps = props.moveDownBtnProps, actionColumnProps = props.actionColumnProps, pagination = props.pagination, hideDelete = props.hideDelete, hideCopy = props.hideCopy, hideMove = props.hideMove, hideAdd = props.hideAdd, addItem = props.addItem, copyItem = props.copyItem, moveItem = props.moveItem, removeItem = props.removeItem, configContext = props.configContext, validatePopover = props.validatePopover;
var globalConfig2 = configContext.globalConfig;
var islidatePopover = (_a = validatePopover !== null && validatePopover !== void 0 ? validatePopover : globalConfig2 === null || globalConfig2 === void 0 ? void 0 : globalConfig2.listValidatePopover) !== null && _a !== void 0 ? _a : true;
var colHeaderText = actionColumnProps.colHeaderText, otherActionColumnProps = __rest(actionColumnProps, ["colHeaderText"]);
var itemSchema = ((_b = schema2 === null || schema2 === void 0 ? void 0 : schema2.items) === null || _b === void 0 ? void 0 : _b.properties) || {};
var paginationConfig = Object.assign({
size: "small",
hideOnSinglePage: true
}, pagination);
var handleCopy = function handleCopy2(name2) {
var value = form.getFieldValue(rootPath.concat(name2));
copyItem(value);
};
var columns = sortProperties(Object.entries(itemSchema)).map(function(_ref) {
var _ref2 = _slicedToArray$6(_ref, 2), dataIndex = _ref2[0], item = _ref2[1];
var required2 = item.required, title = item.title, width = item.width, tooltip = item.tooltip;
var tooltipProps = getTooltip$2(tooltip);
return {
dataIndex,
width,
title: /* @__PURE__ */ jsxs(Fragment, {
children: [required2 && /* @__PURE__ */ jsx("span", {
style: {
color: "red",
marginRight: "3px"
},
children: "*"
}), /* @__PURE__ */ jsx("span", {
children: title
}), tooltipProps && /* @__PURE__ */ React__default.default.createElement(_Tooltip, Object.assign({
placement: "top"
}, tooltipProps), /* @__PURE__ */ React__default.default.createElement(default_1, {
style: {
marginLeft: 6
}
}))]
}),
render: function render2(_, field) {
var fieldSchema = {
type: "object",
properties: _defineProperty$4({}, dataIndex, Object.assign(Object.assign({}, itemSchema[dataIndex]), {
fieldCol: 24
}))
};
if (!islidatePopover) {
return /* @__PURE__ */ jsx("div", {
className: "fr-table-cell-content",
children: renderCore({
parentPath: [field.name],
rootPath: [].concat(_toConsumableArray$3(rootPath), [field.name]),
schema: fieldSchema
})
});
}
return /* @__PURE__ */ jsx(TableCell, {
renderCore,
schema: fieldSchema,
parentPath: [field.name],
rootPath: [].concat(_toConsumableArray$3(rootPath), [field.name]),
dataIndex
});
}
};
});
if (!readOnly) {
columns.push(Object.assign(Object.assign({
title: colHeaderText,
width: "190px",
fixed: "right"
}, otherActionColumnProps), {
render: function render2(_, field) {
return /* @__PURE__ */ React__default.default.createElement(_Form.Item, null, /* @__PURE__ */ React__default.default.createElement(_Space, {
className: "fr-list-item-operate",
split: operateBtnType !== "icon" && /* @__PURE__ */ React__default.default.createElement(_Divider, {
type: "vertical"
})
}, !hideMove && /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
disabled: field.name === 0,
onClick: function onClick() {
return moveItem(field.name, field.name - 1);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$1, null)
}, moveUpBtnProps)
}), /* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
disabled: field.name === fields.length - 1,
onClick: function onClick() {
return moveItem(field.name, field.name + 1);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$2, null)
}, moveDownBtnProps)
})]
}), !hideDelete && /* @__PURE__ */ React__default.default.createElement(
_Popconfirm,
Object.assign({
onConfirm: function onConfirm() {
return removeItem(field.name);
}
}, delConfirmProps),
/* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
icon: /* @__PURE__ */ React__default.default.createElement(default_1$3, null),
btnType: operateBtnType
}, deleteBtnProps)
})
), !hideCopy && /* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
onClick: function onClick() {
return handleCopy(field.name);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$4, null)
}, copyBtnProps)
})));
}
}));
}
return /* @__PURE__ */ React__default.default.createElement("div", {
className: classnames("fr-table-list", {
"fr-table-list-no-popover": !islidatePopover
})
}, /* @__PURE__ */ React__default.default.createElement(Table$1, {
size: "middle",
columns,
dataSource: fields,
pagination: paginationConfig,
scroll: {
x: "max-content"
},
style: {
marginBottom: "12px"
}
}), (!schema2.max || fields.length < schema2.max) && !hideAdd && /* @__PURE__ */ React__default.default.createElement(Button$2, Object.assign({
icon: /* @__PURE__ */ React__default.default.createElement(default_1$5, null),
onClick: function onClick() {
return addItem();
}
}, addBtnProps)));
};
const index$7 = "";
var DrawerForm = function DrawerForm2(props) {
var schema2 = props.schema, widgets = props.widgets, onClose = props.onClose, data = props.data, configContext = props.configContext;
var form = useForm();
var configCtx = React$a.useContext(_ConfigProvider.ConfigContext);
var t2 = translation(configCtx);
var handleFinish = function handleFinish2(data2) {
onClose(data2);
};
var handleClose = function handleClose2() {
onClose();
};
var drawerProps = {
visible: true
};
return /* @__PURE__ */ React__default.default.createElement(
Drawer,
Object.assign({}, drawerProps, {
width: 600,
title: t2("operate"),
open: true,
onClose: handleClose,
extra: /* @__PURE__ */ React__default.default.createElement(_Space, null, /* @__PURE__ */ React__default.default.createElement(Button$2, {
onClick: handleClose
}, t2("cancel")), /* @__PURE__ */ React__default.default.createElement(Button$2, {
type: "primary",
onClick: form.submit
}, t2("confirm")))
}),
/* @__PURE__ */ jsx(FormRender, {
schema: schema2.items,
initialValues: data,
form,
labelCol: {
span: 8
},
widgets,
onFinish: handleFinish,
locale: configContext === null || configContext === void 0 ? void 0 : configContext.locale,
maxWidth: "auto"
})
);
};
const index$6 = "";
function _typeof$4(obj) {
"@babel/helpers - typeof";
return _typeof$4 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$4(obj);
}
function _defineProperty$3(obj, key2, value) {
key2 = _toPropertyKey$3(key2);
if (key2 in obj) {
Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key2] = value;
}
return obj;
}
function _toPropertyKey$3(arg) {
var key2 = _toPrimitive$3(arg, "string");
return _typeof$4(key2) === "symbol" ? key2 : String(key2);
}
function _toPrimitive$3(input, hint) {
if (_typeof$4(input) !== "object" || input === null)
return input;
var prim = input[Symbol.toPrimitive];
if (prim !== void 0) {
var res = prim.call(input, hint || "default");
if (_typeof$4(res) !== "object")
return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
function _toConsumableArray$2(arr) {
return _arrayWithoutHoles$2(arr) || _iterableToArray$2(arr) || _unsupportedIterableToArray$5(arr) || _nonIterableSpread$2();
}
function _nonIterableSpread$2() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _iterableToArray$2(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithoutHoles$2(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$5(arr);
}
function _slicedToArray$5(arr, i2) {
return _arrayWithHoles$5(arr) || _iterableToArrayLimit$5(arr, i2) || _unsupportedIterableToArray$5(arr, i2) || _nonIterableRest$5();
}
function _nonIterableRest$5() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$5(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$5(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$5(o, minLen);
}
function _arrayLikeToArray$5(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$5(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$5(arr) {
if (Array.isArray(arr))
return arr;
}
var getTooltip$1 = function getTooltip2(tooltip) {
if (!tooltip) {
return;
}
if (typeof tooltip === "string") {
return {
title: /* @__PURE__ */ jsx("span", {
dangerouslySetInnerHTML: {
__html: tooltip
}
})
};
}
return Object.assign(Object.assign({}, tooltip), {
title: /* @__PURE__ */ jsx("span", {
dangerouslySetInnerHTML: {
__html: tooltip.title
}
})
});
};
var TableList = function TableList2(props) {
var _a;
var form = props.form, schema2 = props.schema, fields = props.fields, rootPath = props.rootPath, renderCore = props.renderCore, readOnly = props.readOnly, widgets = props.widgets, pagination = props.pagination, operateBtnType = props.operateBtnType, addBtnProps = props.addBtnProps, delConfirmProps = props.delConfirmProps, copyBtnProps = props.copyBtnProps, deleteBtnProps = props.deleteBtnProps, moveUpBtnProps = props.moveUpBtnProps, moveDownBtnProps = props.moveDownBtnProps, actionColumnProps = props.actionColumnProps, editorBtnProps = props.editorBtnProps, hideDelete = props.hideDelete, hideCopy = props.hideCopy, hideMove = props.hideMove, hideAdd = props.hideAdd, hideEdit = props.hideEdit, addItem = props.addItem, copyItem = props.copyItem, moveItem = props.moveItem, removeItem = props.removeItem, configContext = props.configContext;
var colHeaderText = actionColumnProps.colHeaderText, otherActionColumnProps = __rest(actionColumnProps, ["colHeaderText"]);
React$a.useContext(_ConfigProvider.ConfigContext);
var paginationConfig = Object.assign({
size: "small",
hideOnSinglePage: true
}, pagination);
var columnSchema = ((_a = schema2 === null || schema2 === void 0 ? void 0 : schema2.items) === null || _a === void 0 ? void 0 : _a.properties) || {};
var _useState = React$a.useState(false), _useState2 = _slicedToArray$5(_useState, 2), visible = _useState2[0], setVisible = _useState2[1];
var _useState3 = React$a.useState(null), _useState4 = _slicedToArray$5(_useState3, 2), itemData = _useState4[0], setItemData = _useState4[1];
var indexRef = React$a.useRef(null);
var handleCopy = function handleCopy2(name2) {
var value = form.getFieldValue(rootPath.concat(name2));
copyItem(value);
};
var handleAdd = function handleAdd2() {
indexRef.current = -1;
setVisible(true);
};
var handleDrawerClose = function handleDrawerClose2(data) {
setVisible(false);
setItemData(null);
if (!data) {
return;
}
if (indexRef.current === -1) {
addItem(data);
} else {
form.setFieldValue([].concat(_toConsumableArray$2(rootPath), [indexRef.current]), data);
}
indexRef.current === null;
};
var columns = Object.keys(columnSchema).map(function(dataIndex) {
var _columnSchema$dataInd = columnSchema[dataIndex], title = _columnSchema$dataInd.title, tooltip = _columnSchema$dataInd.tooltip, width = _columnSchema$dataInd.width;
var tooltipProps = getTooltip$1(tooltip);
return {
dataIndex,
width,
title: /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx("span", {
children: title
}), tooltipProps && /* @__PURE__ */ React__default.default.createElement(_Tooltip, Object.assign({
placement: "top"
}, tooltipProps), /* @__PURE__ */ React__default.default.createElement(default_1, {
style: {
marginLeft: 6
}
}))]
}),
render: function render2(_, field) {
var fieldSchema = {
type: "object",
properties: _defineProperty$3({}, dataIndex, Object.assign(Object.assign({}, columnSchema[dataIndex]), {
noStyle: true,
readOnly: true
}))
};
return renderCore({
schema: fieldSchema,
parentPath: [field.name],
rootPath: [].concat(_toConsumableArray$2(rootPath), [field.name])
});
}
};
});
if (!readOnly) {
columns.push(Object.assign(Object.assign({
title: colHeaderText,
width: "190px",
fixed: "right"
}, otherActionColumnProps), {
render: function render2(_, field) {
return /* @__PURE__ */ React__default.default.createElement(_Form.Item, null, /* @__PURE__ */ React__default.default.createElement(_Space, {
className: "fr-list-item-operate",
split: operateBtnType !== "icon" && /* @__PURE__ */ React__default.default.createElement(_Divider, {
type: "vertical"
})
}, !hideMove && /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
disabled: field.name === 0,
onClick: function onClick() {
return moveItem(field.name, field.name - 1);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$1, null)
}, moveUpBtnProps)
}), /* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
disabled: field.name === fields.length - 1,
onClick: function onClick() {
return moveItem(field.name, field.name + 1);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$2, null)
}, moveDownBtnProps)
})]
}), !hideDelete && /* @__PURE__ */ React__default.default.createElement(
_Popconfirm,
Object.assign({
onConfirm: function onConfirm() {
return removeItem(field.name);
}
}, delConfirmProps),
/* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
icon: /* @__PURE__ */ React__default.default.createElement(default_1$3, null),
btnType: operateBtnType
}, deleteBtnProps)
})
), !hideCopy && /* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
onClick: function onClick() {
return handleCopy(field.name);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$4, null)
}, copyBtnProps)
}), !hideEdit && /* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
onClick: function onClick() {
setVisible(true);
indexRef.current = field.name;
setItemData(form.getFieldValue(rootPath.concat(field.name)));
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$4, null)
}, editorBtnProps)
})));
}
}));
}
return /* @__PURE__ */ React__default.default.createElement("div", {
className: "fr-list-drawer"
}, /* @__PURE__ */ React__default.default.createElement(Table$1, {
size: "middle",
dataSource: fields,
columns,
style: {
marginBottom: "12px"
},
scroll: {
x: "max-content"
},
pagination: paginationConfig
}), (!schema2.max || fields.length < schema2.max) && !hideAdd && /* @__PURE__ */ React__default.default.createElement(Button$2, Object.assign({
icon: /* @__PURE__ */ React__default.default.createElement(default_1$5, null),
onClick: handleAdd
}, addBtnProps)), visible && /* @__PURE__ */ jsx(DrawerForm, {
schema: schema2,
data: itemData,
widgets,
configContext,
onClose: handleDrawerClose
}));
};
function _slicedToArray$4(arr, i2) {
return _arrayWithHoles$4(arr) || _iterableToArrayLimit$4(arr, i2) || _unsupportedIterableToArray$4(arr, i2) || _nonIterableRest$4();
}
function _nonIterableRest$4() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$4(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$4(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$4(o, minLen);
}
function _arrayLikeToArray$4(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$4(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$4(arr) {
if (Array.isArray(arr))
return arr;
}
var VirtualCell = function VirtualCell2(props) {
var renderCore = props.renderCore, schema2 = props.schema, dataIndex = props.dataIndex, otherProps = __rest(props, ["renderCore", "schema", "dataIndex"]);
var _useState = React$a.useState(null), _useState2 = _slicedToArray$4(_useState, 2), errorMsg = _useState2[0], setErrorMsg = _useState2[1];
var _useState3 = React$a.useState(), _useState4 = _slicedToArray$4(_useState3, 2), visible = _useState4[0], setVisible = _useState4[1];
var mouseRef = React$a.useRef();
var onStatusChange = function onStatusChange2(_, errors) {
var message = errors[0] || null;
setErrorMsg(message);
if (mouseRef.current && message) {
setVisible(true);
}
};
if (!schema2.properties[dataIndex].onStatusChange) {
schema2.properties[dataIndex].onStatusChange = onStatusChange;
}
return /* @__PURE__ */ React__default.default.createElement("div", {
onMouseEnter: function onMouseEnter() {
mouseRef.current = true;
setVisible(true);
},
onMouseLeave: function onMouseLeave() {
mouseRef.current = false;
setVisible(false);
}
}, /* @__PURE__ */ React__default.default.createElement(_Popover, {
overlayClassName: "fr-popover-error",
content: errorMsg,
placement: "topRight",
open: visible && errorMsg
}, renderCore(Object.assign(Object.assign({}, otherProps), {
schema: schema2
}))));
};
function _typeof$3(obj) {
"@babel/helpers - typeof";
return _typeof$3 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$3(obj);
}
var _excluded = ["style", "context"], _excluded2 = ["ctx"];
function ownKeys(object2, enumerableOnly) {
var keys2 = Object.keys(object2);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object2);
enumerableOnly && (symbols = symbols.filter(function(sym) {
return Object.getOwnPropertyDescriptor(object2, sym).enumerable;
})), keys2.push.apply(keys2, symbols);
}
return keys2;
}
function _objectSpread(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = null != arguments[i2] ? arguments[i2] : {};
i2 % 2 ? ownKeys(Object(source), true).forEach(function(key2) {
_defineProperty$2(target, key2, source[key2]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function(key2) {
Object.defineProperty(target, key2, Object.getOwnPropertyDescriptor(source, key2));
});
}
return target;
}
function _defineProperty$2(obj, key2, value) {
key2 = _toPropertyKey$2(key2);
if (key2 in obj) {
Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key2] = value;
}
return obj;
}
function _toPropertyKey$2(arg) {
var key2 = _toPrimitive$2(arg, "string");
return _typeof$3(key2) === "symbol" ? key2 : String(key2);
}
function _toPrimitive$2(input, hint) {
if (_typeof$3(input) !== "object" || input === null)
return input;
var prim = input[Symbol.toPrimitive];
if (prim !== void 0) {
var res = prim.call(input, hint || "default");
if (_typeof$3(res) !== "object")
return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
function _objectWithoutProperties(source, excluded) {
if (source == null)
return {};
var target = _objectWithoutPropertiesLoose(source, excluded);
var key2, i2;
if (Object.getOwnPropertySymbols) {
var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
for (i2 = 0; i2 < sourceSymbolKeys.length; i2++) {
key2 = sourceSymbolKeys[i2];
if (excluded.indexOf(key2) >= 0)
continue;
if (!Object.prototype.propertyIsEnumerable.call(source, key2))
continue;
target[key2] = source[key2];
}
}
return target;
}
function _objectWithoutPropertiesLoose(source, excluded) {
if (source == null)
return {};
var target = {};
var sourceKeys = Object.keys(source);
var key2, i2;
for (i2 = 0; i2 < sourceKeys.length; i2++) {
key2 = sourceKeys[i2];
if (excluded.indexOf(key2) >= 0)
continue;
target[key2] = source[key2];
}
return target;
}
var SCROLLEVT_NULL = 0 << 0;
var SCROLLEVT_INIT = 1 << 0;
var SCROLLEVT_RECOMPUTE = 1 << 1;
var SCROLLEVT_NATIVE = 1 << 3;
var SCROLLEVT_BY_HOOK = 1 << 6;
var TOP_CONTINUE = 0;
var TOP_DONE = 1;
var e_VT_STATE;
(function(e_VT_STATE2) {
e_VT_STATE2[e_VT_STATE2["INIT"] = 1] = "INIT";
e_VT_STATE2[e_VT_STATE2["LOADED"] = 2] = "LOADED";
e_VT_STATE2[e_VT_STATE2["RUNNING"] = 4] = "RUNNING";
})(e_VT_STATE || (e_VT_STATE = {}));
function default_context() {
return {
vt_state: e_VT_STATE.INIT,
possible_hight_per_tr: -1,
computed_h: 0,
re_computed: 0,
row_height: [],
row_count: 0,
prev_row_count: 0,
_offset_top: 0 | 0,
_offset_head: 0 | 0,
_offset_tail: 0 | 1,
WH: 0,
top: 0,
left: 0,
evt: SCROLLEVT_NULL,
end: false,
final_top: 0,
f_final_top: TOP_DONE,
update_count: 0,
indexMap: /* @__PURE__ */ new WeakMap(),
HND_PAINT: 0,
retry_count: 5
};
}
function log_debug(ctx2, msg) {
if (ctx2.debug) {
if (msg[0] === "+") {
return console.debug(msg.slice(1));
}
var d2 = new Date();
var tid = "".concat(d2.toLocaleTimeString(), ".").concat(d2.getMilliseconds());
console.debug("%c[".concat(ctx2.id, "][").concat(tid, "][").concat(msg, "]"), "color:#a00", ctx2);
}
}
var TableImpl = /* @__PURE__ */ React__namespace.forwardRef(function TableImpl2(props, ref) {
return /* @__PURE__ */ jsx("table", {
ref,
...props
});
});
function WrapperImpl(props) {
return /* @__PURE__ */ jsx("tbody", {
...props
});
}
var RowImpl = /* @__PURE__ */ React__namespace.forwardRef(function RowImpl2(props, ref) {
return /* @__PURE__ */ jsx("tr", {
ref,
...props
});
});
function scroll_with_offset(ctx2, top) {
var row_height = ctx2.row_height, row_count = ctx2.row_count, overscanRowCount = ctx2.overscanRowCount;
ctx2._scroll_y = ctx2.scroll.y;
if (typeof ctx2._scroll_y === "number") {
ctx2._y = ctx2._scroll_y;
} else if (typeof ctx2._scroll_y === "string") {
ctx2._y = ctx2.wrap_inst.current.parentElement.offsetHeight;
} else {
console.assert(false, "VT: did you forget to set `scroll.y`?");
ctx2._y = ctx2.wrap_inst.current.parentElement.offsetHeight;
}
console.assert(ctx2._y >= 0);
var _top = 0, i2 = 0, j2 = 0;
var torender_h = 0;
if (top === -1 && row_count > 0) {
i2 = row_count;
while (i2 > 0 && torender_h < ctx2._y) {
torender_h += row_height[--i2];
}
return [0 | i2, 0 | row_count, 0 | ctx2.computed_h - torender_h];
}
for (; i2 < row_count && _top < top; ++i2) {
_top += row_height[i2];
}
j2 = i2;
for (; j2 < row_count && torender_h < ctx2._y; ++j2) {
torender_h += row_height[j2];
}
var overscan = overscanRowCount < 0 ? 0 : overscanRowCount;
while (i2 > 0 && overscan--) {
_top -= row_height[--i2];
}
j2 += overscanRowCount;
if (j2 > row_count)
j2 = row_count;
return [0 | i2, 0 | j2, 0 | _top];
}
function set_offset(ctx2, top, head, tail) {
ctx2._offset_top = 0 | top;
ctx2._offset_head = 0 | head;
ctx2._offset_tail = 0 | tail;
}
function set_scroll(ctx2, top, left, evt, end) {
ctx2.top = top;
ctx2.left = left;
ctx2.evt = evt;
ctx2.end = end;
}
function scroll_to(ctx2, top, left) {
if (!ctx2.wrap_inst.current)
return;
var ele = ctx2.wrap_inst.current.parentElement;
ele.scrollTop = top;
ele.scrollLeft = Math.max(left, ele.scrollLeft);
}
function repainting(ctx2) {
if (ctx2.HND_PAINT)
return;
var cq = ctx2.cq, wrap_inst = ctx2.wrap_inst;
var fn = function fn2() {
ctx2.HND_PAINT = 0;
for (var i2 = 0; i2 < cq.length; ++i2) {
if (cq[i2].index >= ctx2._offset_head && cq[i2].index < ctx2._offset_tail) {
cq[i2].func();
}
}
if (ctx2.vt_state !== e_VT_STATE.RUNNING || !wrap_inst.current)
return;
var h2 = ctx2.computed_h;
if (ctx2.WH === h2)
return;
ctx2.WH = h2;
var s = wrap_inst.current.style;
s.height = h2 ? (s.maxHeight = h2 + "px", s.maxHeight) : (s.maxHeight = "unset", s.maxHeight);
ctx2.on_update_wrap_style();
};
ctx2.HND_PAINT = ctx2.evt === SCROLLEVT_NATIVE ? window.requestAnimationFrame(fn) : window.setTimeout(fn);
}
function srs_expand(ctx2, len, prev_len, fill_value) {
var slen = len - prev_len;
var shadow_rows = new Array(slen).fill(fill_value);
ctx2.row_height = ctx2.row_height.concat(shadow_rows);
ctx2.computed_h += slen * fill_value;
}
function srs_shrink(ctx2, len, prev_len) {
if (len === 0) {
ctx2.computed_h = 0;
ctx2.row_height.length = 0;
ctx2.top = 0;
return;
}
var rows = ctx2.row_height;
var h2shrink = 0;
for (var i2 = len; i2 < prev_len; ++i2) {
h2shrink += rows[i2];
}
ctx2.computed_h -= h2shrink;
}
function set_tr_cnt(ctx2, n2) {
ctx2.re_computed = n2 - ctx2.row_count;
ctx2.prev_row_count = ctx2.row_count;
ctx2.row_count = n2;
}
var VTable = function VTable2(props, ref) {
var style2 = props.style, context2 = props.context, rest = _objectWithoutProperties(props, _excluded);
var force = React$a.useState(0);
var ref_func = React$a.useRef(function() {
});
var scroll_hook;
var wrap_inst = React$a.useMemo(function() {
return /* @__PURE__ */ React__namespace.createRef();
}, []);
var ctx2 = React$a.useContext(context2);
React$a.useMemo(function() {
Object.assign(ctx2, default_context());
if (ctx2.wrap_inst && ctx2.wrap_inst.current) {
ctx2.wrap_inst.current.parentElement.removeEventListener("scroll", scroll_hook);
}
ctx2.wrap_inst = wrap_inst;
ctx2.top = ctx2.initTop;
ctx2.on_update_wrap_style = function() {
if (ctx2._y === 0 && "".concat(ctx2._scroll_y).length) {
scroll_hook({
flag: SCROLLEVT_BY_HOOK,
target: {
scrollTop: ctx2.top,
scrollLeft: ctx2.left
}
});
}
};
ctx2.cq = [];
var pfirst = 0;
var circleBufferSize = 0;
ctx2.cq.push = function(item) {
if (ctx2.vt_state !== e_VT_STATE.RUNNING)
return;
var size = ctx2._offset_tail - ctx2._offset_head + ctx2.overscanRowCount * 2 + 10;
circleBufferSize = Math.max(circleBufferSize, size);
if (pfirst > circleBufferSize) {
pfirst = 0;
}
ctx2.cq[pfirst++] = item;
return 0;
};
}, []);
var event_queue = React$a.useRef([]).current;
var RAF_update_self;
scroll_hook = React$a.useCallback(function(ev) {
if (ctx2.vt_state !== e_VT_STATE.RUNNING)
return;
var t0 = performance.now();
if (ev) {
if ("flag" in ev) {
event_queue.push(ev);
} else {
var target = ev.target;
var top = Math.max(target.scrollTop, 0);
event_queue.push({
target: {
scrollTop: top,
scrollLeft: target.scrollLeft
},
end: Math.abs(target.scrollHeight - target.clientHeight - Math.round(top)) <= (ctx2.offset || 0),
flag: SCROLLEVT_NATIVE
});
}
if (ctx2.f_final_top === TOP_CONTINUE) {
return RAF_update_self(t0);
}
}
if (ctx2.HND_RAF)
return;
ctx2.HND_RAF = window.setTimeout(function() {
return Promise.resolve().then(function() {
return RAF_update_self(t0);
});
});
}, []);
RAF_update_self = React$a.useCallback(function(time) {
ctx2.HND_RAF = 0;
var t1 = performance.now();
if (t1 - time > 10 && ctx2.retry_count-- > 0) {
scroll_hook();
return;
}
ctx2.retry_count = 5;
if (ctx2.vt_state !== e_VT_STATE.RUNNING)
return;
var evq = event_queue;
var e2;
if (!evq.length) {
return;
}
e2 = evq.pop();
evq.length = 0;
var etop = e2.target.scrollTop;
var eleft = e2.target.scrollLeft;
var flag = e2.flag;
log_debug(ctx2, "top: ".concat(etop, ", left: ").concat(eleft));
var offset2 = scroll_with_offset(ctx2, ctx2.f_final_top === TOP_CONTINUE ? ctx2.final_top : etop);
var head = offset2[0];
var tail = offset2[1];
var top = offset2[2];
var prev_head = ctx2._offset_head;
var prev_tail = ctx2._offset_tail;
var prev_top = ctx2._offset_top;
var end = false;
switch (flag) {
case SCROLLEVT_INIT:
log_debug(ctx2, "SCROLLEVT_INIT");
break;
case SCROLLEVT_BY_HOOK:
log_debug(ctx2, "SCROLLEVT_BY_HOOK");
if (head === prev_head && tail === prev_tail && top === prev_top) {
ctx2.f_final_top = TOP_DONE;
if (ctx2.final_top === -1)
etop = ctx2.computed_h - ctx2._y;
end = true;
} else {
if (ctx2.final_top === -1)
etop = top;
}
break;
case SCROLLEVT_RECOMPUTE:
if (head === prev_head && tail === prev_tail && top === prev_top) {
return;
}
log_debug(ctx2, "SCROLLEVT_RECOMPUTE");
break;
case SCROLLEVT_NATIVE:
if (head === prev_head && tail === prev_tail && top === prev_top) {
return;
}
log_debug(ctx2, "SCROLLEVT_NATIVE");
if (ctx2.onScroll) {
ctx2.onScroll({
top: etop,
left: eleft,
isEnd: e2.end
});
}
end = e2.end;
break;
}
set_offset(ctx2, top, head, tail);
set_scroll(ctx2, etop, eleft, flag, end);
force[1](++ctx2.update_count);
}, []);
React$a.useImperativeHandle(ref, function() {
var _scrollTo = function scrollTo2(y2) {
ctx2.f_final_top = TOP_CONTINUE;
ctx2.final_top = y2;
scroll_hook({
target: {
scrollTop: y2,
scrollLeft: -1
},
flag: SCROLLEVT_BY_HOOK
});
};
return {
scrollTo: function scrollTo2(y2) {
ref_func.current = function() {
return _scrollTo(y2);
};
ref_func.current();
},
scrollToIndex: function scrollToIndex(idx) {
ref_func.current = function() {
if (idx > ctx2.row_count - 1)
idx = ctx2.row_count - 1;
if (idx < 0)
idx = 0;
var y2 = 0;
for (var i2 = 0; i2 < idx; ++i2) {
y2 += ctx2.row_height[i2];
}
_scrollTo(y2);
};
ref_func.current();
}
};
}, []);
React$a.useEffect(function() {
var el = wrap_inst.current.parentElement;
try {
el.addEventListener("scroll", scroll_hook, {
passive: true
});
} catch (_unused) {
el.addEventListener("scroll", scroll_hook, false);
}
}, [wrap_inst.current]);
React$a.useEffect(function() {
scroll_hook({
flag: SCROLLEVT_BY_HOOK,
target: {
scrollLeft: ctx2.left,
scrollTop: ctx2.top
}
});
}, [ctx2.scroll.y]);
React$a.useEffect(function() {
switch (ctx2.evt) {
case SCROLLEVT_BY_HOOK:
if (ctx2.f_final_top === TOP_CONTINUE) {
ref_func.current();
} else {
scroll_to(ctx2, ctx2.top, ctx2.left);
}
break;
case SCROLLEVT_INIT:
case SCROLLEVT_RECOMPUTE:
scroll_to(ctx2, ctx2.top, ctx2.left);
break;
}
}, [force[0]]);
React$a.useEffect(function() {
switch (ctx2.vt_state) {
case e_VT_STATE.LOADED:
ctx2.vt_state = e_VT_STATE.RUNNING;
scroll_hook({
target: {
scrollTop: ctx2.top,
scrollLeft: 0
},
flag: SCROLLEVT_BY_HOOK
});
break;
case e_VT_STATE.RUNNING:
if (ctx2.re_computed !== 0) {
ctx2.re_computed = 0;
scroll_hook({
target: {
scrollTop: ctx2.top,
scrollLeft: ctx2.left
},
flag: SCROLLEVT_RECOMPUTE
});
}
break;
}
});
var wrapStyle = React$a.useMemo(function() {
return {
width: style2.width,
minWidth: "100%",
position: "relative",
transform: "translate(0)"
};
}, [style2.width]);
var tableStyle = React$a.useMemo(function() {
return _objectSpread(_objectSpread({}, style2), {}, {
width: void 0,
position: "relative",
top: ctx2._offset_top,
transform: "translate(0)"
});
}, [ctx2._offset_top]);
var internalCtx = React$a.useMemo(function() {
return _objectSpread({}, ctx2);
}, [ctx2.update_count]);
var Table2 = ctx2.components.table;
return /* @__PURE__ */ React__namespace.createElement("div", {
ref: wrap_inst,
style: wrapStyle
}, /* @__PURE__ */ React__namespace.createElement(
context2.Provider,
{
value: internalCtx
},
/* @__PURE__ */ jsx(Table2, {
...rest,
style: tableStyle
})
));
};
var VWrapper = function VWrapper2(props) {
var children = props.children, className = props.className, ctx2 = props.ctx;
var measureRow = children[0];
var rows = children[1];
var len = Array.isArray(rows) ? rows.length : 0;
var head = ctx2._offset_head, tail = ctx2._offset_tail;
var trs = [];
switch (ctx2.vt_state) {
case e_VT_STATE.INIT:
if (len >= 0) {
console.assert(head === 0);
console.assert(tail === 1);
if (Array.isArray(rows)) {
trs = rows.slice(head, tail);
ctx2.indexMap.set(trs[0].props.record, 0);
} else {
trs = rows;
}
ctx2.re_computed = len;
ctx2.prev_row_count = len;
ctx2.row_count = len;
}
break;
case e_VT_STATE.RUNNING:
{
if (tail > len) {
var offset2 = tail - len;
tail -= offset2;
head -= offset2;
if (head < 0)
head = 0;
if (tail < 0)
tail = 0;
set_offset(ctx2, ctx2._offset_top, head, tail);
}
if (ctx2.row_count !== len) {
set_tr_cnt(ctx2, len);
}
len = ctx2.row_count;
var prev_len = ctx2.prev_row_count;
if (len < prev_len) {
srs_shrink(ctx2, len, prev_len);
} else if (len > prev_len) {
var row_h = ctx2.row_height;
if (len - row_h.length > 0) {
srs_expand(ctx2, len, prev_len, ctx2.possible_hight_per_tr);
} else {
row_h.fill(ctx2.possible_hight_per_tr, prev_len, len);
ctx2.computed_h += ctx2.possible_hight_per_tr * (len - prev_len);
}
}
if (len) {
var _idx = head;
trs = rows.slice(_idx, tail);
trs.forEach(function(el) {
return ctx2.indexMap.set(el.props.record, _idx++);
});
} else {
trs = rows;
}
ctx2.prev_row_count = ctx2.row_count;
}
break;
case e_VT_STATE.LOADED:
console.assert(false);
break;
}
var Wrapper = ctx2.components.body.wrapper;
return /* @__PURE__ */ jsxs(Wrapper, {
className,
children: [measureRow, trs]
});
};
var VTRow = function VTRow2(props) {
var ref = /* @__PURE__ */ React__namespace.createRef();
var ctx2 = props.ctx, rest = _objectWithoutProperties(props, _excluded2);
var children = props.children;
var Row2 = ctx2.components.body.row;
if (!Array.isArray(children)) {
return /* @__PURE__ */ jsx(Row2, {
...rest,
children
});
}
var row_props = children[0].props;
var index2 = ctx2.indexMap.get(row_props.record);
var last_index = React$a.useRef(index2);
var expanded_cls = React$a.useMemo(function() {
return ".".concat(row_props.prefixCls, "-expanded-row");
}, [row_props.prefixCls]);
var t0 = performance.now();
React$a.useLayoutEffect(function() {
var t1 = performance.now();
log_debug(ctx2, "+idx ".concat(index2, " tooks ").concat(t1 - t0, " ms"));
if (ctx2.vt_state === e_VT_STATE.RUNNING) {
repainting(ctx2);
} else {
ctx2.possible_hight_per_tr = ref.current.offsetHeight;
srs_expand(ctx2, ctx2.row_count, 0, ctx2.possible_hight_per_tr);
repainting(ctx2);
ctx2.vt_state = e_VT_STATE.LOADED;
}
return function() {
repainting(ctx2);
};
}, []);
React$a.useEffect(function() {
ctx2.cq.push({
index: index2,
func: function func() {
var rowElm = ref.current;
if (!rowElm)
return;
var h2 = rowElm.offsetHeight;
var sibling = rowElm.nextSibling;
while (sibling && sibling.matches(expanded_cls)) {
h2 += sibling.offsetHeight;
sibling = sibling.nextSibling;
}
var curr_h = ctx2.row_height[index2];
var last_h = ctx2.row_height[last_index.current];
ctx2.computed_h -= curr_h;
ctx2.computed_h += last_h;
ctx2.computed_h += h2 - last_h;
ctx2.row_height[index2] = h2;
}
});
repainting(ctx2);
});
return /* @__PURE__ */ jsx(Row2, {
...rest,
ref
});
};
function _set_components(ctx2, components) {
var table = components.table, body = components.body, header = components.header;
ctx2.components.body = _objectSpread(_objectSpread({}, ctx2.components.body), body);
if (body && body.cell) {
ctx2._vtcomponents.body.cell = body.cell;
}
if (header) {
ctx2.components.header = header;
ctx2._vtcomponents.header = header;
}
if (table) {
ctx2.components.table = table;
}
}
function init(fnOpts, deps) {
var ctx2 = React$a.useRef(/* @__PURE__ */ React__namespace.createContext({})).current;
var ctx_value = React$a.useContext(ctx2);
var default_ref = React$a.useRef({
scrollTo: function scrollTo2(y2) {
},
scrollToIndex: function scrollToIndex(idx) {
}
});
React$a.useMemo(function() {
return Object.assign(ctx_value, {
id: (+new Date()).toString(36).slice(4),
initTop: 0,
overscanRowCount: 5,
debug: false,
ref: default_ref
}, fnOpts());
}, deps);
React$a.useMemo(function() {
var VT = /* @__PURE__ */ React__namespace.forwardRef(VTable);
ctx_value._vtcomponents = {
table: function table(props) {
return /* @__PURE__ */ jsx(VT, {
...props,
context: ctx2,
ref: ctx_value.ref
});
},
body: {
wrapper: function wrapper(props) {
return /* @__PURE__ */ React__namespace.createElement(ctx2.Consumer, null, function() {
return /* @__PURE__ */ jsx(VWrapper, {
...props,
ctx: ctx_value
});
});
},
row: function row(props) {
return /* @__PURE__ */ jsx(VTRow, {
...props,
ctx: ctx_value
});
}
}
};
ctx_value.components = {};
_set_components(ctx_value, {
table: TableImpl,
body: {
wrapper: WrapperImpl,
row: RowImpl
}
});
ctx_value.vt_state = e_VT_STATE.INIT;
}, []);
return ctx_value;
}
function _typeof$2(obj) {
"@babel/helpers - typeof";
return _typeof$2 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$2(obj);
}
var _brower = 1;
var _node = 2;
(function() {
var env = (typeof window === "undefined" ? "undefined" : _typeof$2(window)) === "object" && window instanceof Window ? _brower : _node;
if (env & _brower) {
if (!Object.hasOwnProperty.call(window, "requestAnimationFrame") && !window.requestAnimationFrame)
throw new Error("Please using the modern browers or appropriate polyfill!");
}
})();
function useVT(fnOpts, deps) {
var ctx2 = init(fnOpts, deps || []);
return [ctx2._vtcomponents, function(components) {
return _set_components(ctx2, components);
}, ctx2.ref];
}
const index$5 = "";
function _typeof$1(obj) {
"@babel/helpers - typeof";
return _typeof$1 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$1(obj);
}
function _toConsumableArray$1(arr) {
return _arrayWithoutHoles$1(arr) || _iterableToArray$1(arr) || _unsupportedIterableToArray$3(arr) || _nonIterableSpread$1();
}
function _nonIterableSpread$1() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _iterableToArray$1(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithoutHoles$1(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$3(arr);
}
function _defineProperty$1(obj, key2, value) {
key2 = _toPropertyKey$1(key2);
if (key2 in obj) {
Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key2] = value;
}
return obj;
}
function _toPropertyKey$1(arg) {
var key2 = _toPrimitive$1(arg, "string");
return _typeof$1(key2) === "symbol" ? key2 : String(key2);
}
function _toPrimitive$1(input, hint) {
if (_typeof$1(input) !== "object" || input === null)
return input;
var prim = input[Symbol.toPrimitive];
if (prim !== void 0) {
var res = prim.call(input, hint || "default");
if (_typeof$1(res) !== "object")
return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
function _slicedToArray$3(arr, i2) {
return _arrayWithHoles$3(arr) || _iterableToArrayLimit$3(arr, i2) || _unsupportedIterableToArray$3(arr, i2) || _nonIterableRest$3();
}
function _nonIterableRest$3() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$3(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$3(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$3(o, minLen);
}
function _arrayLikeToArray$3(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$3(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$3(arr) {
if (Array.isArray(arr))
return arr;
}
var getTooltip = function getTooltip2(tooltip) {
if (!tooltip) {
return;
}
if (typeof tooltip === "string") {
return {
title: /* @__PURE__ */ jsx("span", {
dangerouslySetInnerHTML: {
__html: tooltip
}
})
};
}
return Object.assign(Object.assign({}, tooltip), {
title: /* @__PURE__ */ jsx("span", {
dangerouslySetInnerHTML: {
__html: tooltip.title
}
})
});
};
var VirtualList = function VirtualList2(props) {
var _a, _b;
var form = props.form, schema2 = props.schema, fields = props.fields, rootPath = props.rootPath, renderCore = props.renderCore, readOnly = props.readOnly, operateBtnType = props.operateBtnType, addBtnProps = props.addBtnProps, delConfirmProps = props.delConfirmProps, copyBtnProps = props.copyBtnProps, deleteBtnProps = props.deleteBtnProps, moveUpBtnProps = props.moveUpBtnProps, moveDownBtnProps = props.moveDownBtnProps, actionColumnProps = props.actionColumnProps, _props$scrollY = props.scrollY, scrollY = _props$scrollY === void 0 ? 600 : _props$scrollY, hideDelete = props.hideDelete, hideCopy = props.hideCopy, hideMove = props.hideMove, hideAdd = props.hideAdd, addItem = props.addItem, copyItem = props.copyItem, moveItem = props.moveItem, removeItem = props.removeItem, configContext = props.configContext, validatePopover = props.validatePopover;
var globalConfig2 = configContext.globalConfig;
var islidatePopover = (_a = validatePopover !== null && validatePopover !== void 0 ? validatePopover : globalConfig2 === null || globalConfig2 === void 0 ? void 0 : globalConfig2.listValidatePopover) !== null && _a !== void 0 ? _a : true;
var colHeaderText = actionColumnProps.colHeaderText, otherActionColumnProps = __rest(actionColumnProps, ["colHeaderText"]);
var itemSchema = ((_b = schema2 === null || schema2 === void 0 ? void 0 : schema2.items) === null || _b === void 0 ? void 0 : _b.properties) || {};
var _useVT = useVT(function() {
return {
scroll: {
y: scrollY
}
};
}, []), _useVT2 = _slicedToArray$3(_useVT, 2), vt = _useVT2[0];
_useVT2[1];
var handleCopy = function handleCopy2(name2) {
var value = form.getFieldValue(rootPath.concat(name2));
copyItem(value);
};
var columns = sortProperties(Object.entries(itemSchema)).map(function(_ref) {
var _ref2 = _slicedToArray$3(_ref, 2), dataIndex = _ref2[0], item = _ref2[1];
var required2 = item.required, title = item.title, width = item.width, tooltip = item.tooltip;
var tooltipProps = getTooltip(tooltip);
return {
dataIndex,
width,
title: /* @__PURE__ */ jsxs(Fragment, {
children: [required2 && /* @__PURE__ */ jsx("span", {
style: {
color: "red",
marginRight: "3px"
},
children: "*"
}), /* @__PURE__ */ jsx("span", {
children: title
}), tooltipProps && /* @__PURE__ */ React__default.default.createElement(_Tooltip, Object.assign({
placement: "top"
}, tooltipProps), /* @__PURE__ */ React__default.default.createElement(default_1, {
style: {
marginLeft: 6
}
}))]
}),
render: function render2(_, field) {
var fieldSchema = {
type: "object",
properties: _defineProperty$1({}, dataIndex, Object.assign(Object.assign({}, itemSchema[dataIndex]), {
fieldCol: 24
}))
};
if (!islidatePopover) {
return /* @__PURE__ */ jsx("div", {
className: "fr-table-cell-content",
children: renderCore({
parentPath: [field.name],
rootPath: [].concat(_toConsumableArray$1(rootPath), [field.name]),
schema: fieldSchema
})
});
}
return /* @__PURE__ */ jsx(VirtualCell, {
renderCore,
schema: fieldSchema,
parentPath: [field.name],
rootPath: [].concat(_toConsumableArray$1(rootPath), [field.name]),
dataIndex
});
}
};
});
if (!readOnly) {
columns.push(Object.assign(Object.assign({
title: colHeaderText,
width: "190px",
fixed: "right"
}, otherActionColumnProps), {
render: function render2(_, field) {
return /* @__PURE__ */ React__default.default.createElement(_Form.Item, null, /* @__PURE__ */ React__default.default.createElement(_Space, {
className: "fr-list-item-operate",
split: operateBtnType !== "icon" && /* @__PURE__ */ React__default.default.createElement(_Divider, {
type: "vertical"
})
}, !hideMove && /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
disabled: field.name === 0,
onClick: function onClick() {
return moveItem(field.name, field.name - 1);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$1, null)
}, moveUpBtnProps)
}), /* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
disabled: field.name === fields.length - 1,
onClick: function onClick() {
return moveItem(field.name, field.name + 1);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$2, null)
}, moveDownBtnProps)
})]
}), !hideDelete && /* @__PURE__ */ React__default.default.createElement(
_Popconfirm,
Object.assign({
onConfirm: function onConfirm() {
return removeItem(field.name);
}
}, delConfirmProps),
/* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
icon: /* @__PURE__ */ React__default.default.createElement(default_1$3, null),
btnType: operateBtnType
}, deleteBtnProps)
})
), !hideCopy && /* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
onClick: function onClick() {
return handleCopy(field.name);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$4, null)
}, copyBtnProps)
})));
}
}));
}
return /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, /* @__PURE__ */ React__default.default.createElement(Table$1, {
className: classnames("fr-virtual-list", {
"fr-virtual-list-no-popover": !islidatePopover
}),
size: "middle",
columns,
dataSource: fields,
pagination: false,
scroll: {
y: scrollY
},
components: vt
}), (!schema2.max || fields.length < schema2.max) && !hideAdd && /* @__PURE__ */ React__default.default.createElement(Button$2, Object.assign({
icon: /* @__PURE__ */ React__default.default.createElement(default_1$5, null),
onClick: function onClick() {
return addItem();
}
}, addBtnProps)));
};
const index$4 = "";
function _toConsumableArray(arr) {
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray$2(arr) || _nonIterableSpread();
}
function _nonIterableSpread() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _iterableToArray(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithoutHoles(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$2(arr);
}
function _slicedToArray$2(arr, i2) {
return _arrayWithHoles$2(arr) || _iterableToArrayLimit$2(arr, i2) || _unsupportedIterableToArray$2(arr, i2) || _nonIterableRest$2();
}
function _nonIterableRest$2() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$2(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$2(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$2(o, minLen);
}
function _arrayLikeToArray$2(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$2(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$2(arr) {
if (Array.isArray(arr))
return arr;
}
var TabPane = Tabs.TabPane;
var TabList = function TabList2(props) {
var schema2 = props.schema, fields = props.fields, rootPath = props.rootPath, renderCore = props.renderCore, readOnly = props.readOnly, delConfirmProps = props.delConfirmProps, tabName = props.tabName, hideDelete = props.hideDelete, hideAdd = props.hideAdd, addItem = props.addItem, removeItem = props.removeItem, _props$tabItemProps = props.tabItemProps, tabItemProps = _props$tabItemProps === void 0 ? {} : _props$tabItemProps;
var _useState = React$a.useState("0"), _useState2 = _slicedToArray$2(_useState, 2), activeKey = _useState2[0], setActiveKey = _useState2[1];
var configCtx = React$a.useContext(_ConfigProvider.ConfigContext);
var t2 = translation(configCtx);
var getCurrentTabPaneName = function getCurrentTabPaneName2(idx) {
return tabName instanceof Array ? tabName[idx] || idx + 1 : "".concat(tabName || t2("item"), " ").concat(idx + 1);
};
var handleDelete = function handleDelete2(targetKey) {
removeItem(targetKey);
setActiveKey("".concat(targetKey > 1 ? targetKey - 1 : 0));
};
var handleEdit = function handleEdit2(targetKey, action) {
if (action === "add") {
if ((!schema2.max || fields.length < schema2.max) && !readOnly && !hideAdd) {
addItem();
var currentKey = fields.length;
setActiveKey("".concat(currentKey));
}
} else if (action === "remove") {
return null;
} else {
return null;
}
};
var renderClose = function renderClose2(name2) {
return !readOnly && !hideDelete ? /* @__PURE__ */ React__default.default.createElement(_Popconfirm, Object.assign({
onConfirm: function onConfirm() {
return handleDelete(name2);
}
}, delConfirmProps), /* @__PURE__ */ React__default.default.createElement(default_1$3, null)) : /* @__PURE__ */ jsx(Fragment, {});
};
return /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, /* @__PURE__ */ React__default.default.createElement(Tabs, {
className: "fr-tab-list",
type: "editable-card",
onChange: setActiveKey,
activeKey: activeKey + "",
onEdit: handleEdit,
hideAdd: readOnly || hideAdd
}, fields.map(function(_ref) {
_ref.key;
var name2 = _ref.name;
return /* @__PURE__ */ jsx(TabPane, {
...Object.assign({}, tabItemProps, {
tab: getCurrentTabPaneName(name2),
key: name2,
className: "fr-list-item",
closeIcon: renderClose(name2)
}),
children: /* @__PURE__ */ jsx("div", {
style: {
flex: 1
},
children: renderCore({
schema: schema2,
parentPath: [name2],
rootPath: [].concat(_toConsumableArray(rootPath), [name2])
})
})
});
})));
};
const index$3 = "";
function _typeof(obj) {
"@babel/helpers - typeof";
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof(obj);
}
function _defineProperty(obj, key2, value) {
key2 = _toPropertyKey(key2);
if (key2 in obj) {
Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key2] = value;
}
return obj;
}
function _toPropertyKey(arg) {
var key2 = _toPrimitive(arg, "string");
return _typeof(key2) === "symbol" ? key2 : String(key2);
}
function _toPrimitive(input, hint) {
if (_typeof(input) !== "object" || input === null)
return input;
var prim = input[Symbol.toPrimitive];
if (prim !== void 0) {
var res = prim.call(input, hint || "default");
if (_typeof(res) !== "object")
return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
const index$2 = function(_ref) {
var schema2 = _ref.schema;
return /* @__PURE__ */ jsx("div", {
className: classnames("fr-void-title", _defineProperty({}, schema2 === null || schema2 === void 0 ? void 0 : schema2.className, !!(schema2 === null || schema2 === void 0 ? void 0 : schema2.className))),
children: schema2.title
});
};
var ErrorSchema = function ErrorSchema2(schema2) {
var configCtx = React$a.useContext(_ConfigProvider.ConfigContext);
var t2 = translation(configCtx);
return /* @__PURE__ */ jsxs("div", {
children: [/* @__PURE__ */ jsx("div", {
style: {
color: "red"
},
children: t2("schema_not_match")
}), /* @__PURE__ */ jsx("div", {
children: JSON.stringify(schema2)
})]
});
};
const defaultWidgets = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
Input,
InputNumber,
TextArea: TextArea$1,
Select: MultiSelect,
MultiSelect,
Switch,
Radio,
Rate: index$H,
TreeSelect,
Checkbox,
Checkboxes: Checkboxes$1,
Color,
DatePicker,
DateRange: DateRange$1,
TimePicker,
TimeRange,
ImageInput: ImageInput$1,
UrlInput: UrlInput$1,
Slider,
Upload: FrUpload,
Html: html,
PercentSlider,
Card: BoxCard,
Collapse: BoxCollapse,
SubInline: BoxSubInline,
LineTitle: FLineTitle,
SimpleList,
CardList,
TableList: TableList$1,
DrawerList: TableList,
VirtualList,
TabList,
VoidTitle: index$2,
ErrorSchema
}, Symbol.toStringTag, { value: "Module" }));
function _slicedToArray$1(arr, i2) {
return _arrayWithHoles$1(arr) || _iterableToArrayLimit$1(arr, i2) || _unsupportedIterableToArray$1(arr, i2) || _nonIterableRest$1();
}
function _nonIterableRest$1() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$1(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$1(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$1(o, minLen);
}
function _arrayLikeToArray$1(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$1(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$1(arr) {
if (Array.isArray(arr))
return arr;
}
function flattenSchema() {
var _schema = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
var name2 = arguments.length > 1 ? arguments[1] : void 0;
var parent2 = arguments.length > 2 ? arguments[2] : void 0;
var _result = arguments.length > 3 ? arguments[3] : void 0;
var result = _result || {};
var schema2 = _cloneDeep(_schema) || {};
var _name = name2 || "#";
if (!schema2.$id) {
schema2.$id = _name;
}
var children = [];
if (isObjType(schema2)) {
sortProperties(Object.entries(schema2.properties)).forEach(function(_ref) {
var _ref2 = _slicedToArray$1(_ref, 2), key2 = _ref2[0], value = _ref2[1];
var _key = isListType(value) ? key2 + "[]" : key2;
var uniqueName = _name === "#" ? _key : _name + "." + _key;
children.push(uniqueName);
flattenSchema(value, uniqueName, _name, result);
});
schema2.properties = {};
}
if (isListType(schema2)) {
sortProperties(Object.entries(schema2.items.properties)).forEach(function(_ref3) {
var _ref4 = _slicedToArray$1(_ref3, 2), key2 = _ref4[0], value = _ref4[1];
var _key = isListType(value) ? key2 + "[]" : key2;
var uniqueName = _name === "#" ? _key : _name + "." + _key;
children.push(uniqueName);
flattenSchema(value, uniqueName, _name, result);
});
schema2.items.properties = {};
}
if (schema2.type) {
result[_name] = {
parent: parent2,
schema: schema2,
children
};
}
return result;
}
function _slicedToArray(arr, i2) {
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i2) || _unsupportedIterableToArray(arr, i2) || _nonIterableRest();
}
function _nonIterableRest() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray(o, minLen);
}
function _arrayLikeToArray(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles(arr) {
if (Array.isArray(arr))
return arr;
}
var updateSchemaByPath = function updateSchemaByPath2(_path, _newSchema, formSchema) {
var path2 = getSchemaFullPath(_path, formSchema);
var currSchema = _get(formSchema, path2, {});
var newSchema = isFunction$2(_newSchema) ? _newSchema(currSchema) : _newSchema;
var result = Object.assign(Object.assign({}, currSchema), newSchema);
if (newSchema.props) {
result.props = Object.assign(Object.assign({}, currSchema === null || currSchema === void 0 ? void 0 : currSchema.props), newSchema.props);
}
_set(formSchema, path2, result);
};
var getFieldName = function getFieldName2(_path) {
if (!_path) {
return void 0;
}
if (typeof _path === "boolean") {
return _path;
}
var result = [];
if (isArray$2(_path)) {
result = _path.map(function(item) {
return item.split(".").map(function(ite) {
if (!isNaN(Number(ite))) {
return ite * 1;
}
return ite;
});
});
}
result = _path.split(".").map(function(item) {
if (!isNaN(Number(item))) {
return item * 1;
}
return item;
});
result = result.map(function(item) {
if (typeof item === "string" && (item === null || item === void 0 ? void 0 : item.indexOf("[")) === 0 && (item === null || item === void 0 ? void 0 : item.indexOf("]")) === (item === null || item === void 0 ? void 0 : item.length) - 1) {
return Number(item.substring(1, item.length - 1));
}
return item;
});
return result;
};
var useForm = function useForm2() {
var _Form$useForm = _Form.useForm(), _Form$useForm2 = _slicedToArray(_Form$useForm, 1), form = _Form$useForm2[0];
var flattenSchemaRef = React$a.useRef({});
var storeRef = React$a.useRef();
var schemaRef = React$a.useRef({});
var fieldRefs = React$a.useRef({});
form.getFieldError;
var getFieldsError = form.getFieldsError, getFieldInstance = form.getFieldInstance, setFieldsValue = form.setFieldsValue, setFields = form.setFields, scrollToField = form.scrollToField, isFieldsTouched = form.isFieldsTouched, isFieldTouched = form.isFieldTouched, isFieldValidating = form.isFieldValidating, resetFields = form.resetFields, validateFields = form.validateFields, otherForm = __rest(form, ["getFieldError", "getFieldsError", "getFieldInstance", "setFieldsValue", "setFields", "scrollToField", "isFieldsTouched", "isFieldTouched", "isFieldValidating", "resetFields", "validateFields"]);
var xform = otherForm;
var setStoreData = function setStoreData2(data) {
var setState = storeRef.current.setState;
if (!setState) {
setTimeout(function() {
setState({
schema: schemaRef.current,
flattenSchema: flattenSchemaRef.current
});
}, 0);
}
setState(data);
};
var handleSchemaUpdate = function handleSchemaUpdate2(newSchema) {
flattenSchemaRef.current = flattenSchema(newSchema) || {};
schemaRef.current = newSchema;
setStoreData({
schema: newSchema,
flattenSchema: flattenSchemaRef.current
});
};
xform.setSchema = function(obj) {
var cover = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
if (!isObject$5(obj)) {
return;
}
if (cover) {
handleSchemaUpdate(obj);
return;
}
var schema2 = _cloneDeep(schemaRef.current);
Object.keys(obj || {}).forEach(function(path2) {
updateSchemaByPath(path2, obj[path2], schema2);
});
handleSchemaUpdate(schema2);
};
xform.setSchemaByPath = function(_path, _newSchema) {
if (!hasFuncProperty(_newSchema) && _isMatch(_newSchema, xform.getSchemaByPath(_path))) {
return;
}
var schema2 = _cloneDeep(schemaRef.current);
updateSchemaByPath(_path, _newSchema, schema2);
handleSchemaUpdate(schema2);
};
xform.setValues = function(_values) {
var values = parseBindToValues(_values, flattenSchemaRef.current);
setFieldsValue(values);
};
xform.getValues = function(nameList, filterFunc) {
var values = form.getFieldsValue(getFieldName(nameList), filterFunc);
values = valueRemoveUndefined(values);
return parseValuesToBind(values, flattenSchemaRef.current);
};
xform.getValueByPath = function(path2) {
var name2 = getFieldName(path2);
return form.getFieldValue(name2);
};
xform.setValueByPath = function(path2, value) {
if (!form.setFieldValue) {
var values = form.getFieldsValue();
_set(values, path2, value);
xform.setValues(values);
return;
}
var name2 = getFieldName(path2);
form.setFieldValue(name2, value);
try {
if (JSON.stringify(form.getFieldValue(name2)) !== JSON.stringify(value)) {
form.setFieldValue(name2, value);
}
} catch (error) {
}
};
xform.getSchemaByPath = function(_path) {
if (typeof _path !== "string") {
console.warn("\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u8DEF\u5F84");
}
var path2 = getSchemaFullPath(_path, schemaRef.current);
return _get(schemaRef.current, path2);
};
xform.getSchema = function() {
return schemaRef.current;
};
xform.setErrorFields = function(fieldsError) {
var fieldsData = transformFieldsData(fieldsError, getFieldName);
if (!fieldsData) {
return;
}
setFields(fieldsData);
};
xform.removeErrorField = function(path2) {
setFields([{
name: getFieldName(path2),
errors: []
}]);
};
xform.getFieldError = function(path2) {
var name2 = getFieldName(path2);
return form.getFieldError(name2);
};
xform.getFieldsError = function(path2) {
var name2 = getFieldName(path2);
return getFieldsError(name2);
};
xform.getFieldInstance = function(path2) {
var name2 = getFieldName(path2);
return getFieldInstance(name2);
};
xform.getHiddenValues = function() {
var values = xform.getValues();
var allValues = xform.getValues(true);
var hiddenValues = {};
var recursion = function recursion2(obj1, obj2, path2) {
Object.keys(obj1).forEach(function(key2) {
var value = obj1[key2];
var _path = path2 ? "".concat(path2, ".").concat(key2) : key2;
if (!obj2.hasOwnProperty(key2)) {
_set(hiddenValues, _path, value);
return;
}
if (isObject$5(value)) {
recursion2(value, obj2[key2], _path);
}
if (isArray$2(value)) {
value.map(function(item, index2) {
recursion2(item, _get(obj2, "".concat(key2, "[").concat(index2, "]"), []), "".concat(_path, "[").concat(index2, "]"));
});
}
});
};
recursion(allValues, values, null);
return hiddenValues;
};
xform.setFields = function(nameList) {
var fieldsData = transformFieldsData(nameList, getFieldName);
if (!fieldsData) {
return;
}
setFields(fieldsData);
};
xform.__initStore = function(store2) {
storeRef.current = store2;
};
xform.scrollToPath = function(path2) {
var name2 = getFieldName(path2);
for (var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
rest[_key - 1] = arguments[_key];
}
scrollToField.apply(void 0, [name2].concat(rest));
};
xform.isFieldsTouched = function(pathList, allTouched) {
var nameList = (pathList || []).map(function(path2) {
return getFieldName(path2);
});
return isFieldsTouched(nameList, allTouched);
};
xform.isFieldTouched = function(path2) {
var name2 = getFieldName(path2);
return isFieldTouched(name2);
};
xform.isFieldValidating = function(path2) {
var name2 = getFieldName(path2);
return isFieldValidating(name2);
};
xform.resetFields = function(pathList) {
var nameList = (pathList || []).map(function(path2) {
return getFieldName(path2);
});
if (nameList.length > 0) {
resetFields(nameList);
} else {
resetFields();
}
};
xform.validateFields = function(pathList) {
var nameList = (pathList || []).map(function(path2) {
return getFieldName(path2);
});
if (nameList.length > 0) {
return validateFields(nameList);
}
return validateFields();
};
xform.getFlattenSchema = function(path2) {
var _a;
if (!path2) {
return flattenSchemaRef.current;
}
return (_a = flattenSchemaRef.current) === null || _a === void 0 ? void 0 : _a[path2];
};
xform.onItemChange = xform.setValueByPath;
xform.setFieldRef = function(path2, ref) {
if (!path2) {
return;
}
fieldRefs.current[path2] = ref;
};
xform.getFieldRef = function(path2) {
return fieldRefs.current[path2];
};
return xform;
};
const index$1 = "";
const FormRender = withProvider(FormCore, defaultWidgets);
const schema = {
type: "object",
properties: {
list: {
title: "\u6536\u85CF\u7F51\u5740\u5217\u8868",
type: "array",
widget: "CardList",
defaultValue: [{}],
items: {
type: "object",
widget: "card",
title: "List.Item",
properties: {
input1: {
title: "\u7F51\u5740\u540D\u5B57",
type: "string"
},
input2: {
title: "\u7F51\u5740\u94FE\u63A5",
type: "string"
},
jump: {
widget: "JumpButton",
props: {
hrefUrl: "{{ formData.list }}"
}
}
}
}
}
}
};
const antd = "";
const App$1 = "";
function bind(fn, thisArg) {
return function wrap2() {
return fn.apply(thisArg, arguments);
};
}
const { toString } = Object.prototype;
const { getPrototypeOf } = Object;
const kindOf = ((cache) => (thing) => {
const str = toString.call(thing);
return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());
})(/* @__PURE__ */ Object.create(null));
const kindOfTest = (type2) => {
type2 = type2.toLowerCase();
return (thing) => kindOf(thing) === type2;
};
const typeOfTest = (type2) => (thing) => typeof thing === type2;
const { isArray } = Array;
const isUndefined = typeOfTest("undefined");
function isBuffer(val) {
return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);
}
const isArrayBuffer = kindOfTest("ArrayBuffer");
function isArrayBufferView(val) {
let result;
if (typeof ArrayBuffer !== "undefined" && ArrayBuffer.isView) {
result = ArrayBuffer.isView(val);
} else {
result = val && val.buffer && isArrayBuffer(val.buffer);
}
return result;
}
const isString = typeOfTest("string");
const isFunction = typeOfTest("function");
const isNumber = typeOfTest("number");
const isObject = (thing) => thing !== null && typeof thing === "object";
const isBoolean = (thing) => thing === true || thing === false;
const isPlainObject = (val) => {
if (kindOf(val) !== "object") {
return false;
}
const prototype2 = getPrototypeOf(val);
return (prototype2 === null || prototype2 === Object.prototype || Object.getPrototypeOf(prototype2) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);
};
const isDate = kindOfTest("Date");
const isFile = kindOfTest("File");
const isBlob = kindOfTest("Blob");
const isFileList = kindOfTest("FileList");
const isStream = (val) => isObject(val) && isFunction(val.pipe);
const isFormData = (thing) => {
const pattern2 = "[object FormData]";
return thing && (typeof FormData === "function" && thing instanceof FormData || toString.call(thing) === pattern2 || isFunction(thing.toString) && thing.toString() === pattern2);
};
const isURLSearchParams = kindOfTest("URLSearchParams");
const trim = (str) => str.trim ? str.trim() : str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "");
function forEach(obj, fn, { allOwnKeys = false } = {}) {
if (obj === null || typeof obj === "undefined") {
return;
}
let i2;
let l2;
if (typeof obj !== "object") {
obj = [obj];
}
if (isArray(obj)) {
for (i2 = 0, l2 = obj.length; i2 < l2; i2++) {
fn.call(null, obj[i2], i2, obj);
}
} else {
const keys2 = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);
const len = keys2.length;
let key2;
for (i2 = 0; i2 < len; i2++) {
key2 = keys2[i2];
fn.call(null, obj[key2], key2, obj);
}
}
}
function findKey(obj, key2) {
key2 = key2.toLowerCase();
const keys2 = Object.keys(obj);
let i2 = keys2.length;
let _key;
while (i2-- > 0) {
_key = keys2[i2];
if (key2 === _key.toLowerCase()) {
return _key;
}
}
return null;
}
const _global = (() => {
if (typeof globalThis !== "undefined")
return globalThis;
return typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : global;
})();
const isContextDefined = (context2) => !isUndefined(context2) && context2 !== _global;
function merge() {
const { caseless } = isContextDefined(this) && this || {};
const result = {};
const assignValue2 = (val, key2) => {
const targetKey = caseless && findKey(result, key2) || key2;
if (isPlainObject(result[targetKey]) && isPlainObject(val)) {
result[targetKey] = merge(result[targetKey], val);
} else if (isPlainObject(val)) {
result[targetKey] = merge({}, val);
} else if (isArray(val)) {
result[targetKey] = val.slice();
} else {
result[targetKey] = val;
}
};
for (let i2 = 0, l2 = arguments.length; i2 < l2; i2++) {
arguments[i2] && forEach(arguments[i2], assignValue2);
}
return result;
}
const extend = (a, b2, thisArg, { allOwnKeys } = {}) => {
forEach(b2, (val, key2) => {
if (thisArg && isFunction(val)) {
a[key2] = bind(val, thisArg);
} else {
a[key2] = val;
}
}, { allOwnKeys });
return a;
};
const stripBOM = (content) => {
if (content.charCodeAt(0) === 65279) {
content = content.slice(1);
}
return content;
};
const inherits = (constructor, superConstructor, props, descriptors2) => {
constructor.prototype = Object.create(superConstructor.prototype, descriptors2);
constructor.prototype.constructor = constructor;
Object.defineProperty(constructor, "super", {
value: superConstructor.prototype
});
props && Object.assign(constructor.prototype, props);
};
const toFlatObject = (sourceObj, destObj, filter2, propFilter) => {
let props;
let i2;
let prop;
const merged = {};
destObj = destObj || {};
if (sourceObj == null)
return destObj;
do {
props = Object.getOwnPropertyNames(sourceObj);
i2 = props.length;
while (i2-- > 0) {
prop = props[i2];
if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {
destObj[prop] = sourceObj[prop];
merged[prop] = true;
}
}
sourceObj = filter2 !== false && getPrototypeOf(sourceObj);
} while (sourceObj && (!filter2 || filter2(sourceObj, destObj)) && sourceObj !== Object.prototype);
return destObj;
};
const endsWith = (str, searchString, position) => {
str = String(str);
if (position === void 0 || position > str.length) {
position = str.length;
}
position -= searchString.length;
const lastIndex = str.indexOf(searchString, position);
return lastIndex !== -1 && lastIndex === position;
};
const toArray = (thing) => {
if (!thing)
return null;
if (isArray(thing))
return thing;
let i2 = thing.length;
if (!isNumber(i2))
return null;
const arr = new Array(i2);
while (i2-- > 0) {
arr[i2] = thing[i2];
}
return arr;
};
const isTypedArray = ((TypedArray) => {
return (thing) => {
return TypedArray && thing instanceof TypedArray;
};
})(typeof Uint8Array !== "undefined" && getPrototypeOf(Uint8Array));
const forEachEntry = (obj, fn) => {
const generator = obj && obj[Symbol.iterator];
const iterator2 = generator.call(obj);
let result;
while ((result = iterator2.next()) && !result.done) {
const pair = result.value;
fn.call(obj, pair[0], pair[1]);
}
};
const matchAll = (regExp, str) => {
let matches;
const arr = [];
while ((matches = regExp.exec(str)) !== null) {
arr.push(matches);
}
return arr;
};
const isHTMLForm = kindOfTest("HTMLFormElement");
const toCamelCase = (str) => {
return str.toLowerCase().replace(
/[-_\s]([a-z\d])(\w*)/g,
function replacer(m2, p1, p2) {
return p1.toUpperCase() + p2;
}
);
};
const hasOwnProperty = (({ hasOwnProperty: hasOwnProperty2 }) => (obj, prop) => hasOwnProperty2.call(obj, prop))(Object.prototype);
const isRegExp = kindOfTest("RegExp");
const reduceDescriptors = (obj, reducer) => {
const descriptors2 = Object.getOwnPropertyDescriptors(obj);
const reducedDescriptors = {};
forEach(descriptors2, (descriptor2, name2) => {
if (reducer(descriptor2, name2, obj) !== false) {
reducedDescriptors[name2] = descriptor2;
}
});
Object.defineProperties(obj, reducedDescriptors);
};
const freezeMethods = (obj) => {
reduceDescriptors(obj, (descriptor2, name2) => {
if (isFunction(obj) && ["arguments", "caller", "callee"].indexOf(name2) !== -1) {
return false;
}
const value = obj[name2];
if (!isFunction(value))
return;
descriptor2.enumerable = false;
if ("writable" in descriptor2) {
descriptor2.writable = false;
return;
}
if (!descriptor2.set) {
descriptor2.set = () => {
throw Error("Can not rewrite read-only method '" + name2 + "'");
};
}
});
};
const toObjectSet = (arrayOrString, delimiter) => {
const obj = {};
const define = (arr) => {
arr.forEach((value) => {
obj[value] = true;
});
};
isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));
return obj;
};
const noop = () => {
};
const toFiniteNumber = (value, defaultValue) => {
value = +value;
return Number.isFinite(value) ? value : defaultValue;
};
const ALPHA = "abcdefghijklmnopqrstuvwxyz";
const DIGIT = "0123456789";
const ALPHABET = {
DIGIT,
ALPHA,
ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT
};
const generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {
let str = "";
const { length } = alphabet;
while (size--) {
str += alphabet[Math.random() * length | 0];
}
return str;
};
function isSpecCompliantForm(thing) {
return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === "FormData" && thing[Symbol.iterator]);
}
const toJSONObject = (obj) => {
const stack = new Array(10);
const visit = (source, i2) => {
if (isObject(source)) {
if (stack.indexOf(source) >= 0) {
return;
}
if (!("toJSON" in source)) {
stack[i2] = source;
const target = isArray(source) ? [] : {};
forEach(source, (value, key2) => {
const reducedValue = visit(value, i2 + 1);
!isUndefined(reducedValue) && (target[key2] = reducedValue);
});
stack[i2] = void 0;
return target;
}
}
return source;
};
return visit(obj, 0);
};
const utils = {
isArray,
isArrayBuffer,
isBuffer,
isFormData,
isArrayBufferView,
isString,
isNumber,
isBoolean,
isObject,
isPlainObject,
isUndefined,
isDate,
isFile,
isBlob,
isRegExp,
isFunction,
isStream,
isURLSearchParams,
isTypedArray,
isFileList,
forEach,
merge,
extend,
trim,
stripBOM,
inherits,
toFlatObject,
kindOf,
kindOfTest,
endsWith,
toArray,
forEachEntry,
matchAll,
isHTMLForm,
hasOwnProperty,
hasOwnProp: hasOwnProperty,
reduceDescriptors,
freezeMethods,
toObjectSet,
toCamelCase,
noop,
toFiniteNumber,
findKey,
global: _global,
isContextDefined,
ALPHABET,
generateString,
isSpecCompliantForm,
toJSONObject
};
function AxiosError(message, code, config, request, response) {
Error.call(this);
if (Error.captureStackTrace) {
Error.captureStackTrace(this, this.constructor);
} else {
this.stack = new Error().stack;
}
this.message = message;
this.name = "AxiosError";
code && (this.code = code);
config && (this.config = config);
request && (this.request = request);
response && (this.response = response);
}
utils.inherits(AxiosError, Error, {
toJSON: function toJSON() {
return {
message: this.message,
name: this.name,
description: this.description,
number: this.number,
fileName: this.fileName,
lineNumber: this.lineNumber,
columnNumber: this.columnNumber,
stack: this.stack,
config: utils.toJSONObject(this.config),
code: this.code,
status: this.response && this.response.status ? this.response.status : null
};
}
});
const prototype$1 = AxiosError.prototype;
const descriptors = {};
[
"ERR_BAD_OPTION_VALUE",
"ERR_BAD_OPTION",
"ECONNABORTED",
"ETIMEDOUT",
"ERR_NETWORK",
"ERR_FR_TOO_MANY_REDIRECTS",
"ERR_DEPRECATED",
"ERR_BAD_RESPONSE",
"ERR_BAD_REQUEST",
"ERR_CANCELED",
"ERR_NOT_SUPPORT",
"ERR_INVALID_URL"
].forEach((code) => {
descriptors[code] = { value: code };
});
Object.defineProperties(AxiosError, descriptors);
Object.defineProperty(prototype$1, "isAxiosError", { value: true });
AxiosError.from = (error, code, config, request, response, customProps) => {
const axiosError = Object.create(prototype$1);
utils.toFlatObject(error, axiosError, function filter2(obj) {
return obj !== Error.prototype;
}, (prop) => {
return prop !== "isAxiosError";
});
AxiosError.call(axiosError, error.message, code, config, request, response);
axiosError.cause = error;
axiosError.name = error.name;
customProps && Object.assign(axiosError, customProps);
return axiosError;
};
const httpAdapter = null;
function isVisitable(thing) {
return utils.isPlainObject(thing) || utils.isArray(thing);
}
function removeBrackets(key2) {
return utils.endsWith(key2, "[]") ? key2.slice(0, -2) : key2;
}
function renderKey(path2, key2, dots) {
if (!path2)
return key2;
return path2.concat(key2).map(function each2(token, i2) {
token = removeBrackets(token);
return !dots && i2 ? "[" + token + "]" : token;
}).join(dots ? "." : "");
}
function isFlatArray(arr) {
return utils.isArray(arr) && !arr.some(isVisitable);
}
const predicates = utils.toFlatObject(utils, {}, null, function filter2(prop) {
return /^is[A-Z]/.test(prop);
});
function toFormData(obj, formData, options) {
if (!utils.isObject(obj)) {
throw new TypeError("target must be an object");
}
formData = formData || new FormData();
options = utils.toFlatObject(options, {
metaTokens: true,
dots: false,
indexes: false
}, false, function defined2(option, source) {
return !utils.isUndefined(source[option]);
});
const metaTokens = options.metaTokens;
const visitor = options.visitor || defaultVisitor;
const dots = options.dots;
const indexes = options.indexes;
const _Blob = options.Blob || typeof Blob !== "undefined" && Blob;
const useBlob = _Blob && utils.isSpecCompliantForm(formData);
if (!utils.isFunction(visitor)) {
throw new TypeError("visitor must be a function");
}
function convertValue(value) {
if (value === null)
return "";
if (utils.isDate(value)) {
return value.toISOString();
}
if (!useBlob && utils.isBlob(value)) {
throw new AxiosError("Blob is not supported. Use a Buffer instead.");
}
if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {
return useBlob && typeof Blob === "function" ? new Blob([value]) : Buffer.from(value);
}
return value;
}
function defaultVisitor(value, key2, path2) {
let arr = value;
if (value && !path2 && typeof value === "object") {
if (utils.endsWith(key2, "{}")) {
key2 = metaTokens ? key2 : key2.slice(0, -2);
value = JSON.stringify(value);
} else if (utils.isArray(value) && isFlatArray(value) || (utils.isFileList(value) || utils.endsWith(key2, "[]")) && (arr = utils.toArray(value))) {
key2 = removeBrackets(key2);
arr.forEach(function each2(el, index2) {
!(utils.isUndefined(el) || el === null) && formData.append(
indexes === true ? renderKey([key2], index2, dots) : indexes === null ? key2 : key2 + "[]",
convertValue(el)
);
});
return false;
}
}
if (isVisitable(value)) {
return true;
}
formData.append(renderKey(path2, key2, dots), convertValue(value));
return false;
}
const stack = [];
const exposedHelpers = Object.assign(predicates, {
defaultVisitor,
convertValue,
isVisitable
});
function build(value, path2) {
if (utils.isUndefined(value))
return;
if (stack.indexOf(value) !== -1) {
throw Error("Circular reference detected in " + path2.join("."));
}
stack.push(value);
utils.forEach(value, function each2(el, key2) {
const result = !(utils.isUndefined(el) || el === null) && visitor.call(
formData,
el,
utils.isString(key2) ? key2.trim() : key2,
path2,
exposedHelpers
);
if (result === true) {
build(el, path2 ? path2.concat(key2) : [key2]);
}
});
stack.pop();
}
if (!utils.isObject(obj)) {
throw new TypeError("data must be an object");
}
build(obj);
return formData;
}
function encode$1(str) {
const charMap = {
"!": "%21",
"'": "%27",
"(": "%28",
")": "%29",
"~": "%7E",
"%20": "+",
"%00": "\0"
};
return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match2) {
return charMap[match2];
});
}
function AxiosURLSearchParams(params, options) {
this._pairs = [];
params && toFormData(params, this, options);
}
const prototype = AxiosURLSearchParams.prototype;
prototype.append = function append(name2, value) {
this._pairs.push([name2, value]);
};
prototype.toString = function toString2(encoder) {
const _encode = encoder ? function(value) {
return encoder.call(this, value, encode$1);
} : encode$1;
return this._pairs.map(function each2(pair) {
return _encode(pair[0]) + "=" + _encode(pair[1]);
}, "").join("&");
};
function encode(val) {
return encodeURIComponent(val).replace(/%3A/gi, ":").replace(/%24/g, "$").replace(/%2C/gi, ",").replace(/%20/g, "+").replace(/%5B/gi, "[").replace(/%5D/gi, "]");
}
function buildURL(url, params, options) {
if (!params) {
return url;
}
const _encode = options && options.encode || encode;
const serializeFn = options && options.serialize;
let serializedParams;
if (serializeFn) {
serializedParams = serializeFn(params, options);
} else {
serializedParams = utils.isURLSearchParams(params) ? params.toString() : new AxiosURLSearchParams(params, options).toString(_encode);
}
if (serializedParams) {
const hashmarkIndex = url.indexOf("#");
if (hashmarkIndex !== -1) {
url = url.slice(0, hashmarkIndex);
}
url += (url.indexOf("?") === -1 ? "?" : "&") + serializedParams;
}
return url;
}
class InterceptorManager {
constructor() {
this.handlers = [];
}
use(fulfilled, rejected, options) {
this.handlers.push({
fulfilled,
rejected,
synchronous: options ? options.synchronous : false,
runWhen: options ? options.runWhen : null
});
return this.handlers.length - 1;
}
eject(id2) {
if (this.handlers[id2]) {
this.handlers[id2] = null;
}
}
clear() {
if (this.handlers) {
this.handlers = [];
}
}
forEach(fn) {
utils.forEach(this.handlers, function forEachHandler(h2) {
if (h2 !== null) {
fn(h2);
}
});
}
}
const InterceptorManager$1 = InterceptorManager;
const transitionalDefaults = {
silentJSONParsing: true,
forcedJSONParsing: true,
clarifyTimeoutError: false
};
const URLSearchParams$1 = typeof URLSearchParams !== "undefined" ? URLSearchParams : AxiosURLSearchParams;
const FormData$1 = FormData;
const isStandardBrowserEnv = (() => {
let product;
if (typeof navigator !== "undefined" && ((product = navigator.product) === "ReactNative" || product === "NativeScript" || product === "NS")) {
return false;
}
return typeof window !== "undefined" && typeof document !== "undefined";
})();
const isStandardBrowserWebWorkerEnv = (() => {
return typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope && typeof self.importScripts === "function";
})();
const platform = {
isBrowser: true,
classes: {
URLSearchParams: URLSearchParams$1,
FormData: FormData$1,
Blob
},
isStandardBrowserEnv,
isStandardBrowserWebWorkerEnv,
protocols: ["http", "https", "file", "blob", "url", "data"]
};
function toURLEncodedForm(data, options) {
return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({
visitor: function(value, key2, path2, helpers) {
if (platform.isNode && utils.isBuffer(value)) {
this.append(key2, value.toString("base64"));
return false;
}
return helpers.defaultVisitor.apply(this, arguments);
}
}, options));
}
function parsePropPath(name2) {
return utils.matchAll(/\w+|\[(\w*)]/g, name2).map((match2) => {
return match2[0] === "[]" ? "" : match2[1] || match2[0];
});
}
function arrayToObject(arr) {
const obj = {};
const keys2 = Object.keys(arr);
let i2;
const len = keys2.length;
let key2;
for (i2 = 0; i2 < len; i2++) {
key2 = keys2[i2];
obj[key2] = arr[key2];
}
return obj;
}
function formDataToJSON(formData) {
function buildPath(path2, value, target, index2) {
let name2 = path2[index2++];
const isNumericKey = Number.isFinite(+name2);
const isLast = index2 >= path2.length;
name2 = !name2 && utils.isArray(target) ? target.length : name2;
if (isLast) {
if (utils.hasOwnProp(target, name2)) {
target[name2] = [target[name2], value];
} else {
target[name2] = value;
}
return !isNumericKey;
}
if (!target[name2] || !utils.isObject(target[name2])) {
target[name2] = [];
}
const result = buildPath(path2, value, target[name2], index2);
if (result && utils.isArray(target[name2])) {
target[name2] = arrayToObject(target[name2]);
}
return !isNumericKey;
}
if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {
const obj = {};
utils.forEachEntry(formData, (name2, value) => {
buildPath(parsePropPath(name2), value, obj, 0);
});
return obj;
}
return null;
}
const DEFAULT_CONTENT_TYPE = {
"Content-Type": void 0
};
function stringifySafely(rawValue, parser, encoder) {
if (utils.isString(rawValue)) {
try {
(parser || JSON.parse)(rawValue);
return utils.trim(rawValue);
} catch (e2) {
if (e2.name !== "SyntaxError") {
throw e2;
}
}
}
return (encoder || JSON.stringify)(rawValue);
}
const defaults = {
transitional: transitionalDefaults,
adapter: ["xhr", "http"],
transformRequest: [function transformRequest(data, headers) {
const contentType = headers.getContentType() || "";
const hasJSONContentType = contentType.indexOf("application/json") > -1;
const isObjectPayload = utils.isObject(data);
if (isObjectPayload && utils.isHTMLForm(data)) {
data = new FormData(data);
}
const isFormData2 = utils.isFormData(data);
if (isFormData2) {
if (!hasJSONContentType) {
return data;
}
return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;
}
if (utils.isArrayBuffer(data) || utils.isBuffer(data) || utils.isStream(data) || utils.isFile(data) || utils.isBlob(data)) {
return data;
}
if (utils.isArrayBufferView(data)) {
return data.buffer;
}
if (utils.isURLSearchParams(data)) {
headers.setContentType("application/x-www-form-urlencoded;charset=utf-8", false);
return data.toString();
}
let isFileList2;
if (isObjectPayload) {
if (contentType.indexOf("application/x-www-form-urlencoded") > -1) {
return toURLEncodedForm(data, this.formSerializer).toString();
}
if ((isFileList2 = utils.isFileList(data)) || contentType.indexOf("multipart/form-data") > -1) {
const _FormData = this.env && this.env.FormData;
return toFormData(
isFileList2 ? { "files[]": data } : data,
_FormData && new _FormData(),
this.formSerializer
);
}
}
if (isObjectPayload || hasJSONContentType) {
headers.setContentType("application/json", false);
return stringifySafely(data);
}
return data;
}],
transformResponse: [function transformResponse(data) {
const transitional = this.transitional || defaults.transitional;
const forcedJSONParsing = transitional && transitional.forcedJSONParsing;
const JSONRequested = this.responseType === "json";
if (data && utils.isString(data) && (forcedJSONParsing && !this.responseType || JSONRequested)) {
const silentJSONParsing = transitional && transitional.silentJSONParsing;
const strictJSONParsing = !silentJSONParsing && JSONRequested;
try {
return JSON.parse(data);
} catch (e2) {
if (strictJSONParsing) {
if (e2.name === "SyntaxError") {
throw AxiosError.from(e2, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);
}
throw e2;
}
}
}
return data;
}],
timeout: 0,
xsrfCookieName: "XSRF-TOKEN",
xsrfHeaderName: "X-XSRF-TOKEN",
maxContentLength: -1,
maxBodyLength: -1,
env: {
FormData: platform.classes.FormData,
Blob: platform.classes.Blob
},
validateStatus: function validateStatus(status) {
return status >= 200 && status < 300;
},
headers: {
common: {
"Accept": "application/json, text/plain, */*"
}
}
};
utils.forEach(["delete", "get", "head"], function forEachMethodNoData(method2) {
defaults.headers[method2] = {};
});
utils.forEach(["post", "put", "patch"], function forEachMethodWithData(method2) {
defaults.headers[method2] = utils.merge(DEFAULT_CONTENT_TYPE);
});
const defaults$1 = defaults;
const ignoreDuplicateOf = utils.toObjectSet([
"age",
"authorization",
"content-length",
"content-type",
"etag",
"expires",
"from",
"host",
"if-modified-since",
"if-unmodified-since",
"last-modified",
"location",
"max-forwards",
"proxy-authorization",
"referer",
"retry-after",
"user-agent"
]);
const parseHeaders = (rawHeaders) => {
const parsed = {};
let key2;
let val;
let i2;
rawHeaders && rawHeaders.split("\n").forEach(function parser(line) {
i2 = line.indexOf(":");
key2 = line.substring(0, i2).trim().toLowerCase();
val = line.substring(i2 + 1).trim();
if (!key2 || parsed[key2] && ignoreDuplicateOf[key2]) {
return;
}
if (key2 === "set-cookie") {
if (parsed[key2]) {
parsed[key2].push(val);
} else {
parsed[key2] = [val];
}
} else {
parsed[key2] = parsed[key2] ? parsed[key2] + ", " + val : val;
}
});
return parsed;
};
const $internals = Symbol("internals");
function normalizeHeader(header) {
return header && String(header).trim().toLowerCase();
}
function normalizeValue(value) {
if (value === false || value == null) {
return value;
}
return utils.isArray(value) ? value.map(normalizeValue) : String(value);
}
function parseTokens(str) {
const tokens = /* @__PURE__ */ Object.create(null);
const tokensRE = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;
let match2;
while (match2 = tokensRE.exec(str)) {
tokens[match2[1]] = match2[2];
}
return tokens;
}
function isValidHeaderName(str) {
return /^[-_a-zA-Z]+$/.test(str.trim());
}
function matchHeaderValue(context2, value, header, filter2) {
if (utils.isFunction(filter2)) {
return filter2.call(this, value, header);
}
if (!utils.isString(value))
return;
if (utils.isString(filter2)) {
return value.indexOf(filter2) !== -1;
}
if (utils.isRegExp(filter2)) {
return filter2.test(value);
}
}
function formatHeader(header) {
return header.trim().toLowerCase().replace(/([a-z\d])(\w*)/g, (w2, char, str) => {
return char.toUpperCase() + str;
});
}
function buildAccessors(obj, header) {
const accessorName = utils.toCamelCase(" " + header);
["get", "set", "has"].forEach((methodName) => {
Object.defineProperty(obj, methodName + accessorName, {
value: function(arg1, arg2, arg3) {
return this[methodName].call(this, header, arg1, arg2, arg3);
},
configurable: true
});
});
}
class AxiosHeaders {
constructor(headers) {
headers && this.set(headers);
}
set(header, valueOrRewrite, rewrite) {
const self2 = this;
function setHeader(_value, _header, _rewrite) {
const lHeader = normalizeHeader(_header);
if (!lHeader) {
throw new Error("header name must be a non-empty string");
}
const key2 = utils.findKey(self2, lHeader);
if (!key2 || self2[key2] === void 0 || _rewrite === true || _rewrite === void 0 && self2[key2] !== false) {
self2[key2 || _header] = normalizeValue(_value);
}
}
const setHeaders = (headers, _rewrite) => utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));
if (utils.isPlainObject(header) || header instanceof this.constructor) {
setHeaders(header, valueOrRewrite);
} else if (utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {
setHeaders(parseHeaders(header), valueOrRewrite);
} else {
header != null && setHeader(valueOrRewrite, header, rewrite);
}
return this;
}
get(header, parser) {
header = normalizeHeader(header);
if (header) {
const key2 = utils.findKey(this, header);
if (key2) {
const value = this[key2];
if (!parser) {
return value;
}
if (parser === true) {
return parseTokens(value);
}
if (utils.isFunction(parser)) {
return parser.call(this, value, key2);
}
if (utils.isRegExp(parser)) {
return parser.exec(value);
}
throw new TypeError("parser must be boolean|regexp|function");
}
}
}
has(header, matcher) {
header = normalizeHeader(header);
if (header) {
const key2 = utils.findKey(this, header);
return !!(key2 && this[key2] !== void 0 && (!matcher || matchHeaderValue(this, this[key2], key2, matcher)));
}
return false;
}
delete(header, matcher) {
const self2 = this;
let deleted = false;
function deleteHeader(_header) {
_header = normalizeHeader(_header);
if (_header) {
const key2 = utils.findKey(self2, _header);
if (key2 && (!matcher || matchHeaderValue(self2, self2[key2], key2, matcher))) {
delete self2[key2];
deleted = true;
}
}
}
if (utils.isArray(header)) {
header.forEach(deleteHeader);
} else {
deleteHeader(header);
}
return deleted;
}
clear(matcher) {
const keys2 = Object.keys(this);
let i2 = keys2.length;
let deleted = false;
while (i2--) {
const key2 = keys2[i2];
if (!matcher || matchHeaderValue(this, this[key2], key2, matcher)) {
delete this[key2];
deleted = true;
}
}
return deleted;
}
normalize(format2) {
const self2 = this;
const headers = {};
utils.forEach(this, (value, header) => {
const key2 = utils.findKey(headers, header);
if (key2) {
self2[key2] = normalizeValue(value);
delete self2[header];
return;
}
const normalized = format2 ? formatHeader(header) : String(header).trim();
if (normalized !== header) {
delete self2[header];
}
self2[normalized] = normalizeValue(value);
headers[normalized] = true;
});
return this;
}
concat(...targets) {
return this.constructor.concat(this, ...targets);
}
toJSON(asStrings) {
const obj = /* @__PURE__ */ Object.create(null);
utils.forEach(this, (value, header) => {
value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(", ") : value);
});
return obj;
}
[Symbol.iterator]() {
return Object.entries(this.toJSON())[Symbol.iterator]();
}
toString() {
return Object.entries(this.toJSON()).map(([header, value]) => header + ": " + value).join("\n");
}
get [Symbol.toStringTag]() {
return "AxiosHeaders";
}
static from(thing) {
return thing instanceof this ? thing : new this(thing);
}
static concat(first, ...targets) {
const computed = new this(first);
targets.forEach((target) => computed.set(target));
return computed;
}
static accessor(header) {
const internals = this[$internals] = this[$internals] = {
accessors: {}
};
const accessors = internals.accessors;
const prototype2 = this.prototype;
function defineAccessor(_header) {
const lHeader = normalizeHeader(_header);
if (!accessors[lHeader]) {
buildAccessors(prototype2, _header);
accessors[lHeader] = true;
}
}
utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);
return this;
}
}
AxiosHeaders.accessor(["Content-Type", "Content-Length", "Accept", "Accept-Encoding", "User-Agent", "Authorization"]);
utils.freezeMethods(AxiosHeaders.prototype);
utils.freezeMethods(AxiosHeaders);
const AxiosHeaders$1 = AxiosHeaders;
function transformData(fns, response) {
const config = this || defaults$1;
const context2 = response || config;
const headers = AxiosHeaders$1.from(context2.headers);
let data = context2.data;
utils.forEach(fns, function transform(fn) {
data = fn.call(config, data, headers.normalize(), response ? response.status : void 0);
});
headers.normalize();
return data;
}
function isCancel(value) {
return !!(value && value.__CANCEL__);
}
function CanceledError(message, config, request) {
AxiosError.call(this, message == null ? "canceled" : message, AxiosError.ERR_CANCELED, config, request);
this.name = "CanceledError";
}
utils.inherits(CanceledError, AxiosError, {
__CANCEL__: true
});
function settle(resolve, reject, response) {
const validateStatus = response.config.validateStatus;
if (!response.status || !validateStatus || validateStatus(response.status)) {
resolve(response);
} else {
reject(new AxiosError(
"Request failed with status code " + response.status,
[AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],
response.config,
response.request,
response
));
}
}
const cookies = platform.isStandardBrowserEnv ? function standardBrowserEnv() {
return {
write: function write(name2, value, expires, path2, domain, secure) {
const cookie = [];
cookie.push(name2 + "=" + encodeURIComponent(value));
if (utils.isNumber(expires)) {
cookie.push("expires=" + new Date(expires).toGMTString());
}
if (utils.isString(path2)) {
cookie.push("path=" + path2);
}
if (utils.isString(domain)) {
cookie.push("domain=" + domain);
}
if (secure === true) {
cookie.push("secure");
}
document.cookie = cookie.join("; ");
},
read: function read(name2) {
const match2 = document.cookie.match(new RegExp("(^|;\\s*)(" + name2 + ")=([^;]*)"));
return match2 ? decodeURIComponent(match2[3]) : null;
},
remove: function remove(name2) {
this.write(name2, "", Date.now() - 864e5);
}
};
}() : function nonStandardBrowserEnv() {
return {
write: function write() {
},
read: function read() {
return null;
},
remove: function remove() {
}
};
}();
function isAbsoluteURL(url) {
return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url);
}
function combineURLs(baseURL, relativeURL) {
return relativeURL ? baseURL.replace(/\/+$/, "") + "/" + relativeURL.replace(/^\/+/, "") : baseURL;
}
function buildFullPath(baseURL, requestedURL) {
if (baseURL && !isAbsoluteURL(requestedURL)) {
return combineURLs(baseURL, requestedURL);
}
return requestedURL;
}
const isURLSameOrigin = platform.isStandardBrowserEnv ? function standardBrowserEnv() {
const msie = /(msie|trident)/i.test(navigator.userAgent);
const urlParsingNode = document.createElement("a");
let originURL;
function resolveURL(url) {
let href = url;
if (msie) {
urlParsingNode.setAttribute("href", href);
href = urlParsingNode.href;
}
urlParsingNode.setAttribute("href", href);
return {
href: urlParsingNode.href,
protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, "") : "",
host: urlParsingNode.host,
search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, "") : "",
hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, "") : "",
hostname: urlParsingNode.hostname,
port: urlParsingNode.port,
pathname: urlParsingNode.pathname.charAt(0) === "/" ? urlParsingNode.pathname : "/" + urlParsingNode.pathname
};
}
originURL = resolveURL(window.location.href);
return function isURLSameOrigin2(requestURL) {
const parsed = utils.isString(requestURL) ? resolveURL(requestURL) : requestURL;
return parsed.protocol === originURL.protocol && parsed.host === originURL.host;
};
}() : function nonStandardBrowserEnv() {
return function isURLSameOrigin2() {
return true;
};
}();
function parseProtocol(url) {
const match2 = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url);
return match2 && match2[1] || "";
}
function speedometer(samplesCount, min) {
samplesCount = samplesCount || 10;
const bytes = new Array(samplesCount);
const timestamps = new Array(samplesCount);
let head = 0;
let tail = 0;
let firstSampleTS;
min = min !== void 0 ? min : 1e3;
return function push(chunkLength) {
const now2 = Date.now();
const startedAt = timestamps[tail];
if (!firstSampleTS) {
firstSampleTS = now2;
}
bytes[head] = chunkLength;
timestamps[head] = now2;
let i2 = tail;
let bytesCount = 0;
while (i2 !== head) {
bytesCount += bytes[i2++];
i2 = i2 % samplesCount;
}
head = (head + 1) % samplesCount;
if (head === tail) {
tail = (tail + 1) % samplesCount;
}
if (now2 - firstSampleTS < min) {
return;
}
const passed = startedAt && now2 - startedAt;
return passed ? Math.round(bytesCount * 1e3 / passed) : void 0;
};
}
function progressEventReducer(listener, isDownloadStream) {
let bytesNotified = 0;
const _speedometer = speedometer(50, 250);
return (e2) => {
const loaded = e2.loaded;
const total = e2.lengthComputable ? e2.total : void 0;
const progressBytes = loaded - bytesNotified;
const rate = _speedometer(progressBytes);
const inRange = loaded <= total;
bytesNotified = loaded;
const data = {
loaded,
total,
progress: total ? loaded / total : void 0,
bytes: progressBytes,
rate: rate ? rate : void 0,
estimated: rate && total && inRange ? (total - loaded) / rate : void 0,
event: e2
};
data[isDownloadStream ? "download" : "upload"] = true;
listener(data);
};
}
const isXHRAdapterSupported = typeof XMLHttpRequest !== "undefined";
const xhrAdapter = isXHRAdapterSupported && function(config) {
return new Promise(function dispatchXhrRequest(resolve, reject) {
let requestData = config.data;
const requestHeaders = AxiosHeaders$1.from(config.headers).normalize();
const responseType = config.responseType;
let onCanceled;
function done() {
if (config.cancelToken) {
config.cancelToken.unsubscribe(onCanceled);
}
if (config.signal) {
config.signal.removeEventListener("abort", onCanceled);
}
}
if (utils.isFormData(requestData) && (platform.isStandardBrowserEnv || platform.isStandardBrowserWebWorkerEnv)) {
requestHeaders.setContentType(false);
}
let request = new XMLHttpRequest();
if (config.auth) {
const username = config.auth.username || "";
const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : "";
requestHeaders.set("Authorization", "Basic " + btoa(username + ":" + password));
}
const fullPath = buildFullPath(config.baseURL, config.url);
request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);
request.timeout = config.timeout;
function onloadend() {
if (!request) {
return;
}
const responseHeaders = AxiosHeaders$1.from(
"getAllResponseHeaders" in request && request.getAllResponseHeaders()
);
const responseData = !responseType || responseType === "text" || responseType === "json" ? request.responseText : request.response;
const response = {
data: responseData,
status: request.status,
statusText: request.statusText,
headers: responseHeaders,
config,
request
};
settle(function _resolve(value) {
resolve(value);
done();
}, function _reject(err) {
reject(err);
done();
}, response);
request = null;
}
if ("onloadend" in request) {
request.onloadend = onloadend;
} else {
request.onreadystatechange = function handleLoad() {
if (!request || request.readyState !== 4) {
return;
}
if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf("file:") === 0)) {
return;
}
setTimeout(onloadend);
};
}
request.onabort = function handleAbort() {
if (!request) {
return;
}
reject(new AxiosError("Request aborted", AxiosError.ECONNABORTED, config, request));
request = null;
};
request.onerror = function handleError() {
reject(new AxiosError("Network Error", AxiosError.ERR_NETWORK, config, request));
request = null;
};
request.ontimeout = function handleTimeout() {
let timeoutErrorMessage = config.timeout ? "timeout of " + config.timeout + "ms exceeded" : "timeout exceeded";
const transitional = config.transitional || transitionalDefaults;
if (config.timeoutErrorMessage) {
timeoutErrorMessage = config.timeoutErrorMessage;
}
reject(new AxiosError(
timeoutErrorMessage,
transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,
config,
request
));
request = null;
};
if (platform.isStandardBrowserEnv) {
const xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName && cookies.read(config.xsrfCookieName);
if (xsrfValue) {
requestHeaders.set(config.xsrfHeaderName, xsrfValue);
}
}
requestData === void 0 && requestHeaders.setContentType(null);
if ("setRequestHeader" in request) {
utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key2) {
request.setRequestHeader(key2, val);
});
}
if (!utils.isUndefined(config.withCredentials)) {
request.withCredentials = !!config.withCredentials;
}
if (responseType && responseType !== "json") {
request.responseType = config.responseType;
}
if (typeof config.onDownloadProgress === "function") {
request.addEventListener("progress", progressEventReducer(config.onDownloadProgress, true));
}
if (typeof config.onUploadProgress === "function" && request.upload) {
request.upload.addEventListener("progress", progressEventReducer(config.onUploadProgress));
}
if (config.cancelToken || config.signal) {
onCanceled = (cancel) => {
if (!request) {
return;
}
reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);
request.abort();
request = null;
};
config.cancelToken && config.cancelToken.subscribe(onCanceled);
if (config.signal) {
config.signal.aborted ? onCanceled() : config.signal.addEventListener("abort", onCanceled);
}
}
const protocol = parseProtocol(fullPath);
if (protocol && platform.protocols.indexOf(protocol) === -1) {
reject(new AxiosError("Unsupported protocol " + protocol + ":", AxiosError.ERR_BAD_REQUEST, config));
return;
}
request.send(requestData || null);
});
};
const knownAdapters = {
http: httpAdapter,
xhr: xhrAdapter
};
utils.forEach(knownAdapters, (fn, value) => {
if (fn) {
try {
Object.defineProperty(fn, "name", { value });
} catch (e2) {
}
Object.defineProperty(fn, "adapterName", { value });
}
});
const adapters = {
getAdapter: (adapters2) => {
adapters2 = utils.isArray(adapters2) ? adapters2 : [adapters2];
const { length } = adapters2;
let nameOrAdapter;
let adapter;
for (let i2 = 0; i2 < length; i2++) {
nameOrAdapter = adapters2[i2];
if (adapter = utils.isString(nameOrAdapter) ? knownAdapters[nameOrAdapter.toLowerCase()] : nameOrAdapter) {
break;
}
}
if (!adapter) {
if (adapter === false) {
throw new AxiosError(
`Adapter ${nameOrAdapter} is not supported by the environment`,
"ERR_NOT_SUPPORT"
);
}
throw new Error(
utils.hasOwnProp(knownAdapters, nameOrAdapter) ? `Adapter '${nameOrAdapter}' is not available in the build` : `Unknown adapter '${nameOrAdapter}'`
);
}
if (!utils.isFunction(adapter)) {
throw new TypeError("adapter is not a function");
}
return adapter;
},
adapters: knownAdapters
};
function throwIfCancellationRequested(config) {
if (config.cancelToken) {
config.cancelToken.throwIfRequested();
}
if (config.signal && config.signal.aborted) {
throw new CanceledError(null, config);
}
}
function dispatchRequest(config) {
throwIfCancellationRequested(config);
config.headers = AxiosHeaders$1.from(config.headers);
config.data = transformData.call(
config,
config.transformRequest
);
if (["post", "put", "patch"].indexOf(config.method) !== -1) {
config.headers.setContentType("application/x-www-form-urlencoded", false);
}
const adapter = adapters.getAdapter(config.adapter || defaults$1.adapter);
return adapter(config).then(function onAdapterResolution(response) {
throwIfCancellationRequested(config);
response.data = transformData.call(
config,
config.transformResponse,
response
);
response.headers = AxiosHeaders$1.from(response.headers);
return response;
}, function onAdapterRejection(reason) {
if (!isCancel(reason)) {
throwIfCancellationRequested(config);
if (reason && reason.response) {
reason.response.data = transformData.call(
config,
config.transformResponse,
reason.response
);
reason.response.headers = AxiosHeaders$1.from(reason.response.headers);
}
}
return Promise.reject(reason);
});
}
const headersToObject = (thing) => thing instanceof AxiosHeaders$1 ? thing.toJSON() : thing;
function mergeConfig(config1, config2) {
config2 = config2 || {};
const config = {};
function getMergedValue(target, source, caseless) {
if (utils.isPlainObject(target) && utils.isPlainObject(source)) {
return utils.merge.call({ caseless }, target, source);
} else if (utils.isPlainObject(source)) {
return utils.merge({}, source);
} else if (utils.isArray(source)) {
return source.slice();
}
return source;
}
function mergeDeepProperties(a, b2, caseless) {
if (!utils.isUndefined(b2)) {
return getMergedValue(a, b2, caseless);
} else if (!utils.isUndefined(a)) {
return getMergedValue(void 0, a, caseless);
}
}
function valueFromConfig2(a, b2) {
if (!utils.isUndefined(b2)) {
return getMergedValue(void 0, b2);
}
}
function defaultToConfig2(a, b2) {
if (!utils.isUndefined(b2)) {
return getMergedValue(void 0, b2);
} else if (!utils.isUndefined(a)) {
return getMergedValue(void 0, a);
}
}
function mergeDirectKeys(a, b2, prop) {
if (prop in config2) {
return getMergedValue(a, b2);
} else if (prop in config1) {
return getMergedValue(void 0, a);
}
}
const mergeMap = {
url: valueFromConfig2,
method: valueFromConfig2,
data: valueFromConfig2,
baseURL: defaultToConfig2,
transformRequest: defaultToConfig2,
transformResponse: defaultToConfig2,
paramsSerializer: defaultToConfig2,
timeout: defaultToConfig2,
timeoutMessage: defaultToConfig2,
withCredentials: defaultToConfig2,
adapter: defaultToConfig2,
responseType: defaultToConfig2,
xsrfCookieName: defaultToConfig2,
xsrfHeaderName: defaultToConfig2,
onUploadProgress: defaultToConfig2,
onDownloadProgress: defaultToConfig2,
decompress: defaultToConfig2,
maxContentLength: defaultToConfig2,
maxBodyLength: defaultToConfig2,
beforeRedirect: defaultToConfig2,
transport: defaultToConfig2,
httpAgent: defaultToConfig2,
httpsAgent: defaultToConfig2,
cancelToken: defaultToConfig2,
socketPath: defaultToConfig2,
responseEncoding: defaultToConfig2,
validateStatus: mergeDirectKeys,
headers: (a, b2) => mergeDeepProperties(headersToObject(a), headersToObject(b2), true)
};
utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {
const merge2 = mergeMap[prop] || mergeDeepProperties;
const configValue = merge2(config1[prop], config2[prop], prop);
utils.isUndefined(configValue) && merge2 !== mergeDirectKeys || (config[prop] = configValue);
});
return config;
}
const VERSION = "1.3.2";
const validators$1 = {};
["object", "boolean", "number", "function", "string", "symbol"].forEach((type2, i2) => {
validators$1[type2] = function validator2(thing) {
return typeof thing === type2 || "a" + (i2 < 1 ? "n " : " ") + type2;
};
});
const deprecatedWarnings = {};
validators$1.transitional = function transitional(validator2, version2, message) {
function formatMessage(opt, desc) {
return "[Axios v" + VERSION + "] Transitional option '" + opt + "'" + desc + (message ? ". " + message : "");
}
return (value, opt, opts) => {
if (validator2 === false) {
throw new AxiosError(
formatMessage(opt, " has been removed" + (version2 ? " in " + version2 : "")),
AxiosError.ERR_DEPRECATED
);
}
if (version2 && !deprecatedWarnings[opt]) {
deprecatedWarnings[opt] = true;
console.warn(
formatMessage(
opt,
" has been deprecated since v" + version2 + " and will be removed in the near future"
)
);
}
return validator2 ? validator2(value, opt, opts) : true;
};
};
function assertOptions(options, schema2, allowUnknown) {
if (typeof options !== "object") {
throw new AxiosError("options must be an object", AxiosError.ERR_BAD_OPTION_VALUE);
}
const keys2 = Object.keys(options);
let i2 = keys2.length;
while (i2-- > 0) {
const opt = keys2[i2];
const validator2 = schema2[opt];
if (validator2) {
const value = options[opt];
const result = value === void 0 || validator2(value, opt, options);
if (result !== true) {
throw new AxiosError("option " + opt + " must be " + result, AxiosError.ERR_BAD_OPTION_VALUE);
}
continue;
}
if (allowUnknown !== true) {
throw new AxiosError("Unknown option " + opt, AxiosError.ERR_BAD_OPTION);
}
}
}
const validator = {
assertOptions,
validators: validators$1
};
const validators = validator.validators;
class Axios {
constructor(instanceConfig) {
this.defaults = instanceConfig;
this.interceptors = {
request: new InterceptorManager$1(),
response: new InterceptorManager$1()
};
}
request(configOrUrl, config) {
if (typeof configOrUrl === "string") {
config = config || {};
config.url = configOrUrl;
} else {
config = configOrUrl || {};
}
config = mergeConfig(this.defaults, config);
const { transitional, paramsSerializer, headers } = config;
if (transitional !== void 0) {
validator.assertOptions(transitional, {
silentJSONParsing: validators.transitional(validators.boolean),
forcedJSONParsing: validators.transitional(validators.boolean),
clarifyTimeoutError: validators.transitional(validators.boolean)
}, false);
}
if (paramsSerializer !== void 0) {
validator.assertOptions(paramsSerializer, {
encode: validators.function,
serialize: validators.function
}, true);
}
config.method = (config.method || this.defaults.method || "get").toLowerCase();
let contextHeaders;
contextHeaders = headers && utils.merge(
headers.common,
headers[config.method]
);
contextHeaders && utils.forEach(
["delete", "get", "head", "post", "put", "patch", "common"],
(method2) => {
delete headers[method2];
}
);
config.headers = AxiosHeaders$1.concat(contextHeaders, headers);
const requestInterceptorChain = [];
let synchronousRequestInterceptors = true;
this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
if (typeof interceptor.runWhen === "function" && interceptor.runWhen(config) === false) {
return;
}
synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;
requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);
});
const responseInterceptorChain = [];
this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);
});
let promise;
let i2 = 0;
let len;
if (!synchronousRequestInterceptors) {
const chain = [dispatchRequest.bind(this), void 0];
chain.unshift.apply(chain, requestInterceptorChain);
chain.push.apply(chain, responseInterceptorChain);
len = chain.length;
promise = Promise.resolve(config);
while (i2 < len) {
promise = promise.then(chain[i2++], chain[i2++]);
}
return promise;
}
len = requestInterceptorChain.length;
let newConfig = config;
i2 = 0;
while (i2 < len) {
const onFulfilled = requestInterceptorChain[i2++];
const onRejected = requestInterceptorChain[i2++];
try {
newConfig = onFulfilled(newConfig);
} catch (error) {
onRejected.call(this, error);
break;
}
}
try {
promise = dispatchRequest.call(this, newConfig);
} catch (error) {
return Promise.reject(error);
}
i2 = 0;
len = responseInterceptorChain.length;
while (i2 < len) {
promise = promise.then(responseInterceptorChain[i2++], responseInterceptorChain[i2++]);
}
return promise;
}
getUri(config) {
config = mergeConfig(this.defaults, config);
const fullPath = buildFullPath(config.baseURL, config.url);
return buildURL(fullPath, config.params, config.paramsSerializer);
}
}
utils.forEach(["delete", "get", "head", "options"], function forEachMethodNoData(method2) {
Axios.prototype[method2] = function(url, config) {
return this.request(mergeConfig(config || {}, {
method: method2,
url,
data: (config || {}).data
}));
};
});
utils.forEach(["post", "put", "patch"], function forEachMethodWithData(method2) {
function generateHTTPMethod(isForm) {
return function httpMethod(url, data, config) {
return this.request(mergeConfig(config || {}, {
method: method2,
headers: isForm ? {
"Content-Type": "multipart/form-data"
} : {},
url,
data
}));
};
}
Axios.prototype[method2] = generateHTTPMethod();
Axios.prototype[method2 + "Form"] = generateHTTPMethod(true);
});
const Axios$1 = Axios;
class CancelToken {
constructor(executor) {
if (typeof executor !== "function") {
throw new TypeError("executor must be a function.");
}
let resolvePromise;
this.promise = new Promise(function promiseExecutor(resolve) {
resolvePromise = resolve;
});
const token = this;
this.promise.then((cancel) => {
if (!token._listeners)
return;
let i2 = token._listeners.length;
while (i2-- > 0) {
token._listeners[i2](cancel);
}
token._listeners = null;
});
this.promise.then = (onfulfilled) => {
let _resolve;
const promise = new Promise((resolve) => {
token.subscribe(resolve);
_resolve = resolve;
}).then(onfulfilled);
promise.cancel = function reject() {
token.unsubscribe(_resolve);
};
return promise;
};
executor(function cancel(message, config, request) {
if (token.reason) {
return;
}
token.reason = new CanceledError(message, config, request);
resolvePromise(token.reason);
});
}
throwIfRequested() {
if (this.reason) {
throw this.reason;
}
}
subscribe(listener) {
if (this.reason) {
listener(this.reason);
return;
}
if (this._listeners) {
this._listeners.push(listener);
} else {
this._listeners = [listener];
}
}
unsubscribe(listener) {
if (!this._listeners) {
return;
}
const index2 = this._listeners.indexOf(listener);
if (index2 !== -1) {
this._listeners.splice(index2, 1);
}
}
static source() {
let cancel;
const token = new CancelToken(function executor(c2) {
cancel = c2;
});
return {
token,
cancel
};
}
}
const CancelToken$1 = CancelToken;
function spread(callback) {
return function wrap2(arr) {
return callback.apply(null, arr);
};
}
function isAxiosError(payload) {
return utils.isObject(payload) && payload.isAxiosError === true;
}
const HttpStatusCode = {
Continue: 100,
SwitchingProtocols: 101,
Processing: 102,
EarlyHints: 103,
Ok: 200,
Created: 201,
Accepted: 202,
NonAuthoritativeInformation: 203,
NoContent: 204,
ResetContent: 205,
PartialContent: 206,
MultiStatus: 207,
AlreadyReported: 208,
ImUsed: 226,
MultipleChoices: 300,
MovedPermanently: 301,
Found: 302,
SeeOther: 303,
NotModified: 304,
UseProxy: 305,
Unused: 306,
TemporaryRedirect: 307,
PermanentRedirect: 308,
BadRequest: 400,
Unauthorized: 401,
PaymentRequired: 402,
Forbidden: 403,
NotFound: 404,
MethodNotAllowed: 405,
NotAcceptable: 406,
ProxyAuthenticationRequired: 407,
RequestTimeout: 408,
Conflict: 409,
Gone: 410,
LengthRequired: 411,
PreconditionFailed: 412,
PayloadTooLarge: 413,
UriTooLong: 414,
UnsupportedMediaType: 415,
RangeNotSatisfiable: 416,
ExpectationFailed: 417,
ImATeapot: 418,
MisdirectedRequest: 421,
UnprocessableEntity: 422,
Locked: 423,
FailedDependency: 424,
TooEarly: 425,
UpgradeRequired: 426,
PreconditionRequired: 428,
TooManyRequests: 429,
RequestHeaderFieldsTooLarge: 431,
UnavailableForLegalReasons: 451,
InternalServerError: 500,
NotImplemented: 501,
BadGateway: 502,
ServiceUnavailable: 503,
GatewayTimeout: 504,
HttpVersionNotSupported: 505,
VariantAlsoNegotiates: 506,
InsufficientStorage: 507,
LoopDetected: 508,
NotExtended: 510,
NetworkAuthenticationRequired: 511
};
Object.entries(HttpStatusCode).forEach(([key2, value]) => {
HttpStatusCode[value] = key2;
});
const HttpStatusCode$1 = HttpStatusCode;
function createInstance(defaultConfig) {
const context2 = new Axios$1(defaultConfig);
const instance = bind(Axios$1.prototype.request, context2);
utils.extend(instance, Axios$1.prototype, context2, { allOwnKeys: true });
utils.extend(instance, context2, null, { allOwnKeys: true });
instance.create = function create2(instanceConfig) {
return createInstance(mergeConfig(defaultConfig, instanceConfig));
};
return instance;
}
const axios = createInstance(defaults$1);
axios.Axios = Axios$1;
axios.CanceledError = CanceledError;
axios.CancelToken = CancelToken$1;
axios.isCancel = isCancel;
axios.VERSION = VERSION;
axios.toFormData = toFormData;
axios.AxiosError = AxiosError;
axios.Cancel = axios.CanceledError;
axios.all = function all(promises) {
return Promise.all(promises);
};
axios.spread = spread;
axios.isAxiosError = isAxiosError;
axios.mergeConfig = mergeConfig;
axios.AxiosHeaders = AxiosHeaders$1;
axios.formToJSON = (thing) => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);
axios.HttpStatusCode = HttpStatusCode$1;
axios.default = axios;
const axios$1 = axios;
axios$1.defaults.withCredentials = true;
const JumpButton = (props) => {
const {
hrefUrl,
addons
} = props;
return /* @__PURE__ */ jsx(Button$2, {
onClick: () => {
console.log(addons["dataIndex"][0]);
console.log(hrefUrl[addons["dataIndex"][0]].input2);
window.open(hrefUrl[addons["dataIndex"][0]].input2);
},
children: "\u8DF3\u8F6C"
});
};
function App() {
const [open, setOpen] = React$a.useState(false);
const [jumpPageHref, setJumpPageHref] = React$a.useState("");
const [clipboardContent, setClipboardContent] = React$a.useState([]);
const form = useForm();
const showDrawer = () => {
setOpen(true);
};
const onClose = () => {
setOpen(false);
};
const onFinish = (formData) => {
console.log("formData:", formData);
GM_setValue("starPageHref", formData);
};
const jumpPage = (event) => {
setJumpPageHref(event.target.value);
GM_setValue("jumpPageHref", event.target.value);
};
const openJumpHref = () => {
let clipboardContent2 = [];
if (window.location.href.indexOf("bilibili") !== -1) {
clipboardContent2 = getBilibiliContent();
setClipboardContent(clipboardContent2);
console.log(clipboardContent2);
GM_setClipboard(clipboardContent2.join("\n"));
}
window.open(GM_getValue("jumpPageHref"));
};
const getBilibiliContent = () => {
const bilibiliList = [];
const bilibiliTitle = document.querySelector("#viewbox_report > h1").innerText;
const bilibiliUpName = document.querySelector(".up-detail-top a").innerText;
bilibiliList.push(window.location.href, bilibiliTitle, bilibiliUpName);
GM_setValue("clipboardContent", bilibiliList);
return bilibiliList;
};
React$a.useEffect(() => {
if (GM_getValue("starPageHref")) {
form.setValues(GM_getValue("starPageHref"));
}
if (GM_getValue("jumpPageHref")) {
setJumpPageHref(GM_getValue("jumpPageHref"));
}
}, []);
return /* @__PURE__ */ jsxs("div", {
children: [/* @__PURE__ */ jsx(Button$2, {
type: "primary",
onClick: showDrawer,
children: "\u6253\u5F00\u6536\u85CF\u94FE\u63A5"
}), /* @__PURE__ */ jsx("div", {
style: {
marginTop: "10px"
},
children: /* @__PURE__ */ jsx(Button$2, {
type: "primary",
onClick: openJumpHref,
children: "\u6536\u85CF"
})
}), /* @__PURE__ */ jsx(Drawer, {
title: "\u4F60\u6536\u85CF\u7684\u94FE\u63A5",
placement: "right",
onClose,
open,
children: /* @__PURE__ */ jsxs(Tabs, {
defaultActiveKey: "1",
onTabClick: (key2) => {
if (key2 == 2) {
const clipboardContent2 = GM_getValue("clipboardContent");
console.log(clipboardContent2);
setClipboardContent(clipboardContent2);
}
},
children: [/* @__PURE__ */ jsxs(Tabs.TabPane, {
tab: "\u6536\u85CF\u7F51\u5740",
children: [/* @__PURE__ */ jsxs("div", {
children: [/* @__PURE__ */ jsx("span", {
children: "\u8DF3\u8F6C\u5730\u5740:"
}), /* @__PURE__ */ jsx(Input$2, {
placeholder: "\u8BF7\u8F93\u5165\u4F60\u8981\u8DF3\u8F6C\u5230\u7684\u7F51\u5740",
onChange: jumpPage,
value: jumpPageHref
})]
}), /* @__PURE__ */ jsx(FormRender, {
schema,
form,
maxWidth: 400,
onFinish,
footer: true,
widgets: {
JumpButton
}
})]
}, "1"), /* @__PURE__ */ jsx(Tabs.TabPane, {
tab: "\u5185\u5BB9\u526A\u5207\u677F",
children: clipboardContent && clipboardContent.length > 0 ? clipboardContent.reverse().map((item, index2) => {
return /* @__PURE__ */ jsx("div", {
children: item
}, index2);
}) : null
}, "2")]
})
})]
});
}
const index = "";
client.createRoot((() => {
const app = document.createElement("div");
app.setAttribute("class", "upList");
document.body.append(app);
return app;
})()).render(/* @__PURE__ */ jsx(React__default.default.Fragment, {
children: /* @__PURE__ */ jsx(App, {})
}));
})(React, ReactDOM);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1wcm9qZWN0LXlvdWhvdXpob25nd2Vud2FuZy51c2VyLmpzIiwic291cmNlcyI6WyJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2NsaWVudC5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZi5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b1ByaW1pdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b1Byb3BlcnR5S2V5LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NldFByb3RvdHlwZU9mLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2dldFByb3RvdHlwZU9mLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdC5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcG9zc2libGVDb25zdHJ1Y3RvclJldHVybi5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlci5qcyIsIm5vZGVfbW9kdWxlcy9jbGFzc25hbWVzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy11dGlsL2VzL0NoaWxkcmVuL3RvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy93YXJuaW5nLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDIuanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9ob29rcy91c2VNZW1vLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvcmVmLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvRG9tL2ZpbmRET01Ob2RlLmpzIiwibm9kZV9tb2R1bGVzL3Jlc2l6ZS1vYnNlcnZlci1wb2x5ZmlsbC9kaXN0L1Jlc2l6ZU9ic2VydmVyLmVzLmpzIiwibm9kZV9tb2R1bGVzL3JjLXJlc2l6ZS1vYnNlcnZlci9lcy91dGlscy9vYnNlcnZlclV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtcmVzaXplLW9ic2VydmVyL2VzL1NpbmdsZU9ic2VydmVyL0RvbVdyYXBwZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LWpzeC1ydW50aW1lLnByb2R1Y3Rpb24ubWluLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0L2pzeC1ydW50aW1lLmpzIiwibm9kZV9tb2R1bGVzL3JjLXJlc2l6ZS1vYnNlcnZlci9lcy9Db2xsZWN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3JjLXJlc2l6ZS1vYnNlcnZlci9lcy9TaW5nbGVPYnNlcnZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1yZXNpemUtb2JzZXJ2ZXIvZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9vbWl0LmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2NvbXBvbmVudHMvQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FycmF5TGlrZVRvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXJyYXlXaXRob3V0SG9sZXMuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaXRlcmFibGVUb0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL25vbkl0ZXJhYmxlU3ByZWFkLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5LmpzIiwibm9kZV9tb2R1bGVzL3JjLWZpZWxkLWZvcm0vZXMvRmllbGRDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLWZpZWxkLWZvcm0vZXMvdXRpbHMvdHlwZVV0aWwuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcmVnZW5lcmF0b3JSdW50aW1lLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FzeW5jVG9HZW5lcmF0b3IuanMiLCJub2RlX21vZHVsZXMvYXN5bmMtdmFsaWRhdG9yL2Rpc3Qtd2ViL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLWZpZWxkLWZvcm0vZXMvdXRpbHMvbWVzc2FnZXMuanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy91dGlscy9nZXQuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXJyYXlXaXRoSG9sZXMuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vbm9uSXRlcmFibGVSZXN0LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy91dGlscy9zZXQuanMiLCJub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy91dGlscy9jbG9uZURlZXAuanMiLCJub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy91dGlscy92YWx1ZVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy91dGlscy92YWxpZGF0ZVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy9GaWVsZC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2VzL0xpc3RDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLWZpZWxkLWZvcm0vZXMvTGlzdC5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL3JjLWZpZWxkLWZvcm0vZXMvdXRpbHMvYXN5bmNVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLWZpZWxkLWZvcm0vZXMvdXRpbHMvTmFtZU1hcC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2VzL3VzZUZvcm0uanMiLCJub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy9Gb3JtQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2VzL0Zvcm0uanMiLCJub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy91c2VXYXRjaC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2VzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXBhZ2luYXRpb24vZXMvbG9jYWxlL2VuX1VTLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9sb2NhbGUvZW5fVVMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy90aW1lLXBpY2tlci9sb2NhbGUvZW5fVVMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9kYXRlLXBpY2tlci9sb2NhbGUvZW5fVVMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9sb2NhbGUvZGVmYXVsdC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL21vZGFsL2xvY2FsZS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2xvY2FsZS1wcm92aWRlci9jb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvbG9jYWxlLXByb3ZpZGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvbG9jYWxlLXByb3ZpZGVyL0xvY2FsZVJlY2VpdmVyLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2hlY2tDaXJjbGVGaWxsZWQuanMiLCJub2RlX21vZHVsZXMvQGN0cmwvdGlueWNvbG9yL2Rpc3QvbW9kdWxlL3V0aWwuanMiLCJub2RlX21vZHVsZXMvQGN0cmwvdGlueWNvbG9yL2Rpc3QvbW9kdWxlL2NvbnZlcnNpb24uanMiLCJub2RlX21vZHVsZXMvQGN0cmwvdGlueWNvbG9yL2Rpc3QvbW9kdWxlL2Nzcy1jb2xvci1uYW1lcy5qcyIsIm5vZGVfbW9kdWxlcy9AY3RybC90aW55Y29sb3IvZGlzdC9tb2R1bGUvZm9ybWF0LWlucHV0LmpzIiwibm9kZV9tb2R1bGVzL0BjdHJsL3Rpbnljb2xvci9kaXN0L21vZHVsZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jb2xvcnMvZGlzdC9pbmRleC5lc20uanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9Eb20vY2FuVXNlRG9tLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvRG9tL2NvbnRhaW5zLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvRG9tL2R5bmFtaWNDU1MuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvY29tcG9uZW50cy9JY29uQmFzZS5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9jb21wb25lbnRzL3R3b1RvbmVQcmltYXJ5Q29sb3IuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvY29tcG9uZW50cy9BbnRkSWNvbi5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DaGVja0NpcmNsZUZpbGxlZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0Nsb3NlQ2lyY2xlRmlsbGVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Nsb3NlQ2lyY2xlRmlsbGVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRXhjbGFtYXRpb25DaXJjbGVGaWxsZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvRXhjbGFtYXRpb25DaXJjbGVGaWxsZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9JbmZvQ2lyY2xlRmlsbGVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0luZm9DaXJjbGVGaWxsZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Mb2FkaW5nT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvTG9hZGluZ091dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvUmVhY3QvcmVuZGVyLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1vdGlvbi9lcy9jb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLW1vdGlvbi9lcy9Eb21XcmFwcGVyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvaG9va3MvdXNlU3RhdGUuanMiLCJub2RlX21vZHVsZXMvcmMtbW90aW9uL2VzL2ludGVyZmFjZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvdXRpbC9tb3Rpb24uanMiLCJub2RlX21vZHVsZXMvcmMtbW90aW9uL2VzL2hvb2tzL3VzZURvbU1vdGlvbkV2ZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvaG9va3MvdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9yYy11dGlsL2VzL3JhZi5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvaG9va3MvdXNlTmV4dEZyYW1lLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1vdGlvbi9lcy9ob29rcy91c2VTdGVwUXVldWUuanMiLCJub2RlX21vZHVsZXMvcmMtbW90aW9uL2VzL2hvb2tzL3VzZVN0YXR1cy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvQ1NTTW90aW9uLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1vdGlvbi9lcy91dGlsL2RpZmYuanMiLCJub2RlX21vZHVsZXMvcmMtbW90aW9uL2VzL0NTU01vdGlvbkxpc3QuanMiLCJub2RlX21vZHVsZXMvcmMtbm90aWZpY2F0aW9uL2VzL05vdGljZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1ub3RpZmljYXRpb24vZXMvdXNlTm90aWZpY2F0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3JjLW5vdGlmaWNhdGlvbi9lcy9Ob3RpZmljYXRpb24uanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9tZXNzYWdlL2hvb2tzL3VzZU1lc3NhZ2UuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9tZXNzYWdlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2hlY2tDaXJjbGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DaGVja0NpcmNsZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2xvc2VDaXJjbGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DbG9zZUNpcmNsZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2xvc2VPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DbG9zZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vSW5mb0NpcmNsZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0luZm9DaXJjbGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL25vdGlmaWNhdGlvbi9ob29rcy91c2VOb3RpZmljYXRpb24uanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9ub3RpZmljYXRpb24vaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9jb25maWctcHJvdmlkZXIvY29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2NvbmZpZy1wcm92aWRlci9jc3NWYXJpYWJsZXMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9jb25maWctcHJvdmlkZXIvRGlzYWJsZWRDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvY29uZmlnLXByb3ZpZGVyL1NpemVDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvY29uZmlnLXByb3ZpZGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvRG9tL2FkZEV2ZW50TGlzdGVuZXIuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9nZXREYXRhT3JBcmlhUHJvcHMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9yZWFjdE5vZGUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9nZXRTY3JvbGwuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9lYXNpbmdzLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvc2Nyb2xsVG8uanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9ob29rcy91c2VFdmVudC5qcyIsIm5vZGVfbW9kdWxlcy9yYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9yYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvaXNNb2JpbGUuanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9LZXlDb2RlLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9ob29rcy91c2VCYXNlUHJvcHMuanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL2hvb2tzL3VzZURlbGF5UmVzZXQuanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL2hvb2tzL3VzZUxvY2suanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL2hvb2tzL3VzZVNlbGVjdFRyaWdnZXJDb250cm9sLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvcGlja0F0dHJzLmpzIiwibm9kZV9tb2R1bGVzL3JjLW92ZXJmbG93L2VzL0l0ZW0uanMiLCJub2RlX21vZHVsZXMvcmMtb3ZlcmZsb3cvZXMvaG9va3MvY2hhbm5lbFVwZGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1vdmVyZmxvdy9lcy9ob29rcy91c2VFZmZlY3RTdGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1vdmVyZmxvdy9lcy9jb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLW92ZXJmbG93L2VzL1Jhd0l0ZW0uanMiLCJub2RlX21vZHVsZXMvcmMtb3ZlcmZsb3cvZXMvT3ZlcmZsb3cuanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL1RyYW5zQnRuLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9TZWxlY3Rvci9JbnB1dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvdXRpbHMvY29tbW9uVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvaG9va3MvdXNlTGF5b3V0RWZmZWN0LmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9TZWxlY3Rvci9NdWx0aXBsZVNlbGVjdG9yLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9TZWxlY3Rvci9TaW5nbGVTZWxlY3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvdXRpbHMva2V5VXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvU2VsZWN0b3IvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9Qb3J0YWwuanMiLCJub2RlX21vZHVsZXMvcmMtdHJpZ2dlci9lcy91dGlscy9hbGlnblV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtdHJpZ2dlci9lcy91dGlscy9sZWdhY3lVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyaWdnZXIvZXMvUG9wdXAvTWFzay5qcyIsIm5vZGVfbW9kdWxlcy9kb20tYWxpZ24vZGlzdC13ZWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9pc0VxdWFsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvRG9tL2lzVmlzaWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1hbGlnbi9lcy9ob29rcy91c2VCdWZmZXIuanMiLCJub2RlX21vZHVsZXMvcmMtYWxpZ24vZXMvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1hbGlnbi9lcy9BbGlnbi5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmlnZ2VyL2VzL1BvcHVwL3VzZVZpc2libGVTdGF0dXMuanMiLCJub2RlX21vZHVsZXMvcmMtdHJpZ2dlci9lcy9Qb3B1cC91c2VTdHJldGNoU3R5bGUuanMiLCJub2RlX21vZHVsZXMvcmMtdHJpZ2dlci9lcy9Qb3B1cC9Qb3B1cElubmVyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyaWdnZXIvZXMvUG9wdXAvTW9iaWxlUG9wdXBJbm5lci5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmlnZ2VyL2VzL1BvcHVwL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyaWdnZXIvZXMvY29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmlnZ2VyL2VzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9TZWxlY3RUcmlnZ2VyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy91dGlscy92YWx1ZVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL0Jhc2VTZWxlY3QuanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL2hvb2tzL3VzZUNhY2hlLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9ob29rcy91c2VGaWx0ZXJPcHRpb25zLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9ob29rcy91c2VJZC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvdXRpbHMvbGVnYWN5VXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvaG9va3MvdXNlT3B0aW9ucy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvaG9va3MvdXNlUmVmRnVuYy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvT3B0R3JvdXAuanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL09wdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvRmlsbGVyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9TY3JvbGxCYXIuanMiLCJub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL0l0ZW0uanMiLCJub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL2hvb2tzL3VzZUNoaWxkcmVuLmpzIiwibm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy91dGlscy9DYWNoZU1hcC5qcyIsIm5vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlSGVpZ2h0cy5qcyIsIm5vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlU2Nyb2xsVG8uanMiLCJub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL3V0aWxzL2FsZ29yaXRobVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL2hvb2tzL3VzZURpZmZJdGVtLmpzIiwibm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy91dGlscy9pc0ZpcmVmb3guanMiLCJub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL2hvb2tzL3VzZU9yaWdpblNjcm9sbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlRnJhbWVXaGVlbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlTW9iaWxlVG91Y2hNb3ZlLmpzIiwibm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9MaXN0LmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy91dGlscy9wbGF0Zm9ybVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL1NlbGVjdENvbnRleHQuanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL09wdGlvbkxpc3QuanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL1NlbGVjdC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2VtcHR5L2VtcHR5LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvZW1wdHkvc2ltcGxlLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvZW1wdHkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9jb25maWctcHJvdmlkZXIvZGVmYXVsdFJlbmRlckVtcHR5LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvZm9ybS9jb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvdHlwZS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL21vdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL3N0YXR1c1V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2hlY2tPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DaGVja091dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRG93bk91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Rvd25PdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1NlYXJjaE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1NlYXJjaE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvc2VsZWN0L3V0aWxzL2ljb25VdGlsLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvc3BhY2UvQ29tcGFjdC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3NlbGVjdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL2hvb2tzL3VzZUZvcmNlVXBkYXRlLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvcmVzcG9uc2l2ZU9ic2VydmUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9ncmlkL2hvb2tzL3VzZUJyZWFrcG9pbnQuanMiLCJub2RlX21vZHVsZXMvcmMtdG9vbHRpcC9lcy9wbGFjZW1lbnRzLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRvb2x0aXAvZXMvUG9wdXAuanMiLCJub2RlX21vZHVsZXMvcmMtdG9vbHRpcC9lcy9Ub29sdGlwLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvY29sb3JzLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvcGxhY2VtZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3Rvb2x0aXAvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9nZXRSZW5kZXJQcm9wVmFsdWUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9wb3BvdmVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRWxsaXBzaXNPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FbGxpcHNpc091dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvZXMvY29udGV4dC9JZENvbnRleHQuanMiLCJub2RlX21vZHVsZXMvcmMtbWVudS9lcy9jb250ZXh0L01lbnVDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvZXMvY29udGV4dC9QYXRoQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tZW51L2VzL2NvbnRleHQvUHJpdmF0ZUNvbnRleHQuanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9Eb20vZm9jdXMuanMiLCJub2RlX21vZHVsZXMvcmMtbWVudS9lcy9ob29rcy91c2VBY2Nlc3NpYmlsaXR5LmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvZXMvdXRpbHMvdGltZVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtbWVudS9lcy9ob29rcy91c2VLZXlSZWNvcmRzLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvZXMvaG9va3MvdXNlTWVtb0NhbGxiYWNrLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvZXMvaG9va3MvdXNlVVVJRC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tZW51L2VzL2hvb2tzL3VzZUFjdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tZW51L2VzL2hvb2tzL3VzZURpcmVjdGlvblN0eWxlLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvZXMvSWNvbi5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tZW51L2VzL3V0aWxzL3dhcm5VdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvZXMvTWVudUl0ZW0uanMiLCJub2RlX21vZHVsZXMvcmMtbWVudS9lcy9TdWJNZW51L1N1Yk1lbnVMaXN0LmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvZXMvdXRpbHMvbm9kZVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtbWVudS9lcy9wbGFjZW1lbnRzLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvZXMvdXRpbHMvbW90aW9uVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tZW51L2VzL1N1Yk1lbnUvUG9wdXBUcmlnZ2VyLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvZXMvU3ViTWVudS9JbmxpbmVTdWJNZW51TGlzdC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tZW51L2VzL1N1Yk1lbnUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtbWVudS9lcy9NZW51LmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvZXMvTWVudUl0ZW1Hcm91cC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tZW51L2VzL0RpdmlkZXIuanMiLCJub2RlX21vZHVsZXMvcmMtbWVudS9lcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0xlZnRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9MZWZ0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9SaWdodE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1JpZ2h0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9sYXlvdXQvU2lkZXIuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9tZW51L01lbnVEaXZpZGVyLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvbWVudS9NZW51Q29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL21lbnUvTWVudUl0ZW0uanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9tZW51L1N1Yk1lbnUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9tZW51L2hvb2tzL3VzZUl0ZW1zLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvbWVudS9PdmVycmlkZUNvbnRleHQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9tZW51L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLWRyb3Bkb3duL2VzL3BsYWNlbWVudHMuanMiLCJub2RlX21vZHVsZXMvcmMtZHJvcGRvd24vZXMvaG9va3MvdXNlQWNjZXNzaWJpbGl0eS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1kcm9wZG93bi9lcy9Ecm9wZG93bi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL3JhZi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL3dhdmUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9idXR0b24vYnV0dG9uLWdyb3VwLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvYnV0dG9uL0xvYWRpbmdJY29uLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvYnV0dG9uL2J1dHRvbi5qcyIsIm5vZGVfbW9kdWxlcy9yYy11dGlsL2VzL0RvbS9zdHlsZUNoZWNrZXIuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9zdHlsZUNoZWNrZXIuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9ob29rcy91c2VGbGV4R2FwU3VwcG9ydC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3NwYWNlL0l0ZW0uanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9zcGFjZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2Ryb3Bkb3duL2Ryb3Bkb3duLWJ1dHRvbi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2Ryb3Bkb3duL2Ryb3Bkb3duLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZnJlZUdsb2JhbC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3Jvb3QuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19TeW1ib2wuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRSYXdUYWcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19vYmplY3RUb1N0cmluZy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRUYWcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0TGlrZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNTeW1ib2wuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL190cmltbWVkRW5kSW5kZXguanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVHJpbS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3QuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL3RvTnVtYmVyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9QYW5lbENvbnRleHQuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3BhbmVscy9IZWFkZXIuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3BhbmVscy9EZWNhZGVQYW5lbC9EZWNhZGVIZWFkZXIuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3V0aWxzL3RpbWVVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9wYW5lbHMvUGFuZWxCb2R5LmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9wYW5lbHMvRGVjYWRlUGFuZWwvRGVjYWRlQm9keS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvdXRpbHMvdWlVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9wYW5lbHMvRGVjYWRlUGFuZWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3V0aWxzL2RhdGVVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9wYW5lbHMvVGltZVBhbmVsL1RpbWVIZWFkZXIuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3BhbmVscy9UaW1lUGFuZWwvVGltZVVuaXRDb2x1bW4uanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3V0aWxzL21pc2NVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9wYW5lbHMvVGltZVBhbmVsL1RpbWVCb2R5LmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9wYW5lbHMvVGltZVBhbmVsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9SYW5nZUNvbnRleHQuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL2hvb2tzL3VzZUNlbGxDbGFzc05hbWUuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3BhbmVscy9EYXRlUGFuZWwvRGF0ZUJvZHkuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3BhbmVscy9EYXRlUGFuZWwvRGF0ZUhlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvcGFuZWxzL0RhdGVQYW5lbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvcGFuZWxzL0RhdGV0aW1lUGFuZWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3BhbmVscy9XZWVrUGFuZWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3BhbmVscy9Nb250aFBhbmVsL01vbnRoSGVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9wYW5lbHMvTW9udGhQYW5lbC9Nb250aEJvZHkuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3BhbmVscy9Nb250aFBhbmVsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9wYW5lbHMvUXVhcnRlclBhbmVsL1F1YXJ0ZXJIZWFkZXIuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3BhbmVscy9RdWFydGVyUGFuZWwvUXVhcnRlckJvZHkuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3BhbmVscy9RdWFydGVyUGFuZWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3BhbmVscy9ZZWFyUGFuZWwvWWVhckhlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvcGFuZWxzL1llYXJQYW5lbC9ZZWFyQm9keS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvcGFuZWxzL1llYXJQYW5lbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvdXRpbHMvZ2V0RXh0cmFGb290ZXIuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3V0aWxzL2dldFJhbmdlcy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvUGlja2VyUGFuZWwuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL1BpY2tlclRyaWdnZXIuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL2hvb2tzL3VzZVBpY2tlcklucHV0LmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9ob29rcy91c2VUZXh0VmFsdWVNYXBwaW5nLmpzIiwibm9kZV9tb2R1bGVzL3NoYWxsb3dlcXVhbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvaG9va3MvdXNlVmFsdWVUZXh0cy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvaG9va3MvdXNlSG92ZXJWYWx1ZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvUGlja2VyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9ob29rcy91c2VSYW5nZURpc2FibGVkLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9ob29rcy91c2VSYW5nZVZpZXdEYXRlcy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvUmFuZ2VQaWNrZXIuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9yYWRpby9jb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLWNoZWNrYm94L2VzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvcmFkaW8vcmFkaW8uanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9yYWRpby9ncm91cC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3JhZGlvL3JhZGlvQnV0dG9uLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvcmFkaW8vaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9za2VsZXRvbi9FbGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvc2tlbGV0b24vQXZhdGFyLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvc2tlbGV0b24vQnV0dG9uLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRG90Q2hhcnRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Eb3RDaGFydE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvc2tlbGV0b24vTm9kZS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3NrZWxldG9uL0ltYWdlLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvc2tlbGV0b24vSW5wdXQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9za2VsZXRvbi9QYXJhZ3JhcGguanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9za2VsZXRvbi9UaXRsZS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3NrZWxldG9uL1NrZWxldG9uLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vUGx1c091dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1BsdXNPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJzL2VzL1RhYkNvbnRleHQuanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9lcy9UYWJQYW5lbExpc3QvVGFiUGFuZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJzL2VzL1RhYlBhbmVsTGlzdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJzL2VzL2hvb2tzL3VzZU9mZnNldHMuanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9lcy9ob29rcy91c2VTeW5jU3RhdGUuanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9lcy9ob29rcy91c2VUb3VjaE1vdmUuanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9lcy9ob29rcy91c2VVcGRhdGUuanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9lcy9ob29rcy91c2VWaXNpYmxlUmFuZ2UuanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9lcy91dGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYnMvZXMvVGFiTmF2TGlzdC9BZGRCdXR0b24uanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9lcy9UYWJOYXZMaXN0L0V4dHJhQ29udGVudC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJzL2VzL1RhYk5hdkxpc3QvT3BlcmF0aW9uTm9kZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJzL2VzL1RhYk5hdkxpc3QvVGFiTm9kZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJzL2VzL1RhYk5hdkxpc3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9lcy9UYWJOYXZMaXN0L1dyYXBwZXIuanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9lcy9ob29rcy91c2VBbmltYXRlQ29uZmlnLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYnMvZXMvVGFicy5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3RhYnMvaG9va3MvdXNlQW5pbWF0ZUNvbmZpZy5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3RhYnMvaG9va3MvdXNlTGVnYWN5SXRlbXMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy90YWJzL1RhYlBhbmUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy90YWJzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvY2FyZC9HcmlkLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvY2FyZC9DYXJkLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvY2FyZC9NZXRhLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvY2FyZC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvbm93LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9kZWJvdW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlL2VzL3V0aWxzL2NvbmR1Y3RVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUvZXMvdXRpbHMvdHJlZVV0aWwuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9jaGVja2JveC9Hcm91cC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2NoZWNrYm94L0NoZWNrYm94LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvY2hlY2tib3gvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9ncmlkL1Jvd0NvbnRleHQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9ncmlkL2NvbC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2dyaWQvcm93LmpzIiwibm9kZV9tb2R1bGVzL3JjLWNvbGxhcHNlL2VzL1BhbmVsQ29udGVudC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1jb2xsYXBzZS9lcy9QYW5lbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1jb2xsYXBzZS9lcy9Db2xsYXBzZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1jb2xsYXBzZS9lcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2NvbGxhcHNlL0NvbGxhcHNlUGFuZWwuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9jb2xsYXBzZS9Db2xsYXBzZS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2RhdGUtcGlja2VyL1BpY2tlckJ1dHRvbi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3RhZy9DaGVja2FibGVUYWcuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy90YWcvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9kYXRlLXBpY2tlci9QaWNrZXJUYWcuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9DYWxlbmRhck91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0NhbGVuZGFyT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9DbG9ja0NpcmNsZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Nsb2NrQ2lyY2xlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Td2FwUmlnaHRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Td2FwUmlnaHRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2RhdGUtcGlja2VyL3V0aWwuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9kYXRlLXBpY2tlci9nZW5lcmF0ZVBpY2tlci9nZW5lcmF0ZVJhbmdlUGlja2VyLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvZGF0ZS1waWNrZXIvZ2VuZXJhdGVQaWNrZXIvZ2VuZXJhdGVTaW5nbGVQaWNrZXIuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9kYXRlLXBpY2tlci9nZW5lcmF0ZVBpY2tlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2RpdmlkZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9wb3J0YWwvZXMvQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L3BvcnRhbC9lcy91c2VEb20uanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9nZXRTY3JvbGxCYXJTaXplLmpzIiwibm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvcG9ydGFsL2VzL3V0aWwuanMiLCJub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9wb3J0YWwvZXMvdXNlU2Nyb2xsTG9ja2VyLmpzIiwibm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvcG9ydGFsL2VzL21vY2suanMiLCJub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9wb3J0YWwvZXMvUG9ydGFsLmpzIiwibm9kZV9tb2R1bGVzL3JjLWRyYXdlci9lcy9EcmF3ZXJQYW5lbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1kcmF3ZXIvZXMvY29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1kcmF3ZXIvZXMvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1kcmF3ZXIvZXMvRHJhd2VyUG9wdXAuanMiLCJub2RlX21vZHVsZXMvcmMtZHJhd2VyL2VzL0RyYXdlci5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2RyYXdlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2Zvcm0vaG9va3MvdXNlRGVib3VuY2UuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9mb3JtL0Vycm9yTGlzdC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wdXRlLXNjcm9sbC1pbnRvLXZpZXcvZGlzdC9pbmRleC5tanMiLCJub2RlX21vZHVsZXMvc2Nyb2xsLWludG8tdmlldy1pZi1uZWVkZWQvZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9mb3JtL3V0aWwuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9mb3JtL2hvb2tzL3VzZUZvcm0uanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9mb3JtL0Zvcm0uanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9mb3JtL2hvb2tzL3VzZUZvcm1JdGVtU3RhdHVzLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvZm9ybS9ob29rcy91c2VGcmFtZVN0YXRlLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvZm9ybS9ob29rcy91c2VJdGVtUmVmLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vUXVlc3Rpb25DaXJjbGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9RdWVzdGlvbkNpcmNsZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvZm9ybS9Gb3JtSXRlbUxhYmVsLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvZm9ybS9Gb3JtSXRlbUlucHV0LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvZm9ybS9Gb3JtSXRlbS9JdGVtSG9sZGVyLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvZm9ybS9Gb3JtSXRlbS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2Zvcm0vRm9ybUxpc3QuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9mb3JtL2hvb2tzL3VzZUZvcm1JbnN0YW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2Zvcm0vaW5kZXguanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9FeWVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FeWVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9yYy11dGlsL2VzL0RvbS9jc3MuanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9ob29rcy91c2VJZC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1kaWFsb2cvZXMvRGlhbG9nL01hc2suanMiLCJub2RlX21vZHVsZXMvcmMtZGlhbG9nL2VzL3V0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtZGlhbG9nL2VzL0RpYWxvZy9Db250ZW50L01lbW9DaGlsZHJlbi5qcyIsIm5vZGVfbW9kdWxlcy9yYy1kaWFsb2cvZXMvRGlhbG9nL0NvbnRlbnQvUGFuZWwuanMiLCJub2RlX21vZHVsZXMvcmMtZGlhbG9nL2VzL0RpYWxvZy9Db250ZW50L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLWRpYWxvZy9lcy9EaWFsb2cvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtZGlhbG9nL2VzL0RpYWxvZ1dyYXAuanMiLCJub2RlX21vZHVsZXMvcmMtaW1hZ2UvZXMvUHJldmlld0dyb3VwLmpzIiwibm9kZV9tb2R1bGVzL3JjLWltYWdlL2VzL3ByZXZpZXdDb25maWcuanMiLCJub2RlX21vZHVsZXMvcmMtaW1hZ2UvZXMvT3BlcmF0aW9ucy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1pbWFnZS9lcy9ob29rcy91c2VJbWFnZVRyYW5zZm9ybS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1pbWFnZS9lcy9nZXRGaXhTY2FsZUVsZVRyYW5zUG9zaXRpb24uanMiLCJub2RlX21vZHVsZXMvcmMtaW1hZ2UvZXMvUHJldmlldy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1pbWFnZS9lcy9JbWFnZS5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1JvdGF0ZUxlZnRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Sb3RhdGVMZWZ0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Sb3RhdGVSaWdodE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1JvdGF0ZVJpZ2h0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9ab29tSW5PdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9ab29tSW5PdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1pvb21PdXRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9ab29tT3V0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9pbWFnZS9QcmV2aWV3R3JvdXAuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9pbWFnZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L0dyb3VwLmpzIiwibm9kZV9tb2R1bGVzL3JjLWlucHV0L2VzL3V0aWxzL2NvbW1vblV0aWxzLmpzIiwibm9kZV9tb2R1bGVzL3JjLWlucHV0L2VzL0Jhc2VJbnB1dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1pbnB1dC9lcy9JbnB1dC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L2hvb2tzL3VzZVJlbW92ZVBhc3N3b3JkVGltZW91dC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L3V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvaW5wdXQvSW5wdXQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9FeWVJbnZpc2libGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FeWVJbnZpc2libGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L1Bhc3N3b3JkLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvaW5wdXQvU2VhcmNoLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRleHRhcmVhL2VzL2NhbGN1bGF0ZU5vZGVIZWlnaHQuanMiLCJub2RlX21vZHVsZXMvcmMtdGV4dGFyZWEvZXMvUmVzaXphYmxlVGV4dEFyZWEuanMiLCJub2RlX21vZHVsZXMvcmMtdGV4dGFyZWEvZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9pbnB1dC9DbGVhcmFibGVMYWJlbGVkSW5wdXQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9pbnB1dC9UZXh0QXJlYS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vVXBPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9VcE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL3JjLWlucHV0LW51bWJlci9lcy91dGlscy9zdXBwb3J0VXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1pbnB1dC1udW1iZXIvZXMvdXRpbHMvbnVtYmVyVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1pbnB1dC1udW1iZXIvZXMvdXRpbHMvTWluaURlY2ltYWwuanMiLCJub2RlX21vZHVsZXMvcmMtaW5wdXQtbnVtYmVyL2VzL1N0ZXBIYW5kbGVyLmpzIiwibm9kZV9tb2R1bGVzL3JjLWlucHV0LW51bWJlci9lcy9ob29rcy91c2VDdXJzb3IuanMiLCJub2RlX21vZHVsZXMvcmMtaW5wdXQtbnVtYmVyL2VzL2hvb2tzL3VzZUZyYW1lLmpzIiwibm9kZV9tb2R1bGVzL3JjLWlucHV0LW51bWJlci9lcy9JbnB1dE51bWJlci5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0LW51bWJlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0RvdWJsZUxlZnRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Eb3VibGVMZWZ0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Eb3VibGVSaWdodE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0RvdWJsZVJpZ2h0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvcmMtcGFnaW5hdGlvbi9lcy9QYWdlci5qcyIsIm5vZGVfbW9kdWxlcy9yYy1wYWdpbmF0aW9uL2VzL0tleUNvZGUuanMiLCJub2RlX21vZHVsZXMvcmMtcGFnaW5hdGlvbi9lcy9PcHRpb25zLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBhZ2luYXRpb24vZXMvbG9jYWxlL3poX0NOLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBhZ2luYXRpb24vZXMvUGFnaW5hdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3BhZ2luYXRpb24vU2VsZWN0LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvcGFnaW5hdGlvbi9QYWdpbmF0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvc3Bpbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL0FjdGlvbkJ1dHRvbi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3BvcGNvbmZpcm0vUHVyZVBhbmVsLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvcG9wY29uZmlybS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1wcm9ncmVzcy9lcy9jb21tb24uanMiLCJub2RlX21vZHVsZXMvcmMtcHJvZ3Jlc3MvZXMvaG9va3MvdXNlSWQuanMiLCJub2RlX21vZHVsZXMvcmMtcHJvZ3Jlc3MvZXMvQ2lyY2xlLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvcHJvZ3Jlc3MvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9wcm9ncmVzcy9DaXJjbGUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9wcm9ncmVzcy9MaW5lLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvcHJvZ3Jlc3MvU3RlcHMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9wcm9ncmVzcy9wcm9ncmVzcy5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1N0YXJGaWxsZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvU3RhckZpbGxlZC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1yYXRlL2VzL3V0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtcmF0ZS9lcy9TdGFyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXJhdGUvZXMvUmF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3JhdGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtc2xpZGVyL2VzL2NvbnRleHQuanMiLCJub2RlX21vZHVsZXMvcmMtc2xpZGVyL2VzL3V0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtc2xpZGVyL2VzL0hhbmRsZXMvSGFuZGxlLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNsaWRlci9lcy9IYW5kbGVzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXNsaWRlci9lcy9ob29rcy91c2VEcmFnLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNsaWRlci9lcy9UcmFja3MvVHJhY2suanMiLCJub2RlX21vZHVsZXMvcmMtc2xpZGVyL2VzL1RyYWNrcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zbGlkZXIvZXMvTWFya3MvTWFyay5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zbGlkZXIvZXMvTWFya3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtc2xpZGVyL2VzL1N0ZXBzL0RvdC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zbGlkZXIvZXMvU3RlcHMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtc2xpZGVyL2VzL2hvb2tzL3VzZU9mZnNldC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zbGlkZXIvZXMvU2xpZGVyLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvc2xpZGVyL1NsaWRlclRvb2x0aXAuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9zbGlkZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtc3dpdGNoL2VzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvc3dpdGNoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2VzL3N1Z2FyL0NvbHVtbkdyb3VwLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2VzL3N1Z2FyL0NvbHVtbi5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy91dGlscy92YWx1ZVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvY29udGV4dC9TdGlja3lDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2VzL0NvbnRleHRTZWxlY3Rvci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9jb250ZXh0L0hvdmVyQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9jb250ZXh0L0JvZHlDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2VzL2NvbnRleHQvUGVyZkNvbnRleHQuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvQ2VsbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9jb250ZXh0L1RhYmxlQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy91dGlscy9maXhVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2VzL0hlYWRlci9IZWFkZXJSb3cuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvSGVhZGVyL0hlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9jb250ZXh0L0V4cGFuZGVkUm93Q29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9Cb2R5L0V4cGFuZGVkUm93LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2VzL2NvbnRleHQvUmVzaXplQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9Cb2R5L0JvZHlSb3cuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvaG9va3MvdXNlRmxhdHRlblJlY29yZHMuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvQm9keS9NZWFzdXJlQ2VsbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9Cb2R5L01lYXN1cmVSb3cuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvQm9keS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy91dGlscy9sZWdhY3lVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2VzL2NvbnN0YW50LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2VzL2hvb2tzL3VzZUNvbHVtbnMuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvaG9va3MvdXNlRnJhbWUuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvaG9va3MvdXNlU3RpY2t5T2Zmc2V0cy5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9Db2xHcm91cC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9QYW5lbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9Gb290ZXIvU3VtbWFyeUNvbnRleHQuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvRm9vdGVyL0NlbGwuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvRm9vdGVyL1Jvdy5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9Gb290ZXIvU3VtbWFyeS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9Gb290ZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvdXRpbHMvZXhwYW5kVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9zdGlja3lTY3JvbGxCYXIuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvaG9va3MvdXNlU3RpY2t5LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2VzL0ZpeGVkSG9sZGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2VzL1RhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdGFibGUvQ29sdW1uLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdGFibGUvQ29sdW1uR3JvdXAuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy90YWJsZS9FeHBhbmRJY29uLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdGFibGUvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0ZpbHRlckZpbGxlZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9GaWx0ZXJGaWxsZWQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVDbGVhci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvZXEuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19hc3NvY0luZGV4T2YuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVEZWxldGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVHZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVIYXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVTZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19MaXN0Q2FjaGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0NsZWFyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tEZWxldGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0dldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrSGFzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc0Z1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fY29yZUpzRGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzTWFza2VkLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fdG9Tb3VyY2UuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNOYXRpdmUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRWYWx1ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE5hdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX01hcC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hDbGVhci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hEZWxldGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoR2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaEhhcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hTZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19IYXNoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVDbGVhci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzS2V5YWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE1hcERhdGEuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZURlbGV0ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlR2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVIYXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZVNldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX01hcENhY2hlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tTZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19TdGFjay5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldENhY2hlQWRkLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0Q2FjaGVIYXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19TZXRDYWNoZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5U29tZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2NhY2hlSGFzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZXF1YWxBcnJheXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19VaW50OEFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwVG9BcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldFRvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbEJ5VGFnLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlQdXNoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldEFsbEtleXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUZpbHRlci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvc3R1YkFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0U3ltYm9scy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VUaW1lcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc0FyZ3VtZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcmd1bWVudHMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJGYWxzZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNCdWZmZXIuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19pc0luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc0xlbmd0aC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc1R5cGVkQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVW5hcnkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19ub2RlVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNUeXBlZEFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlMaWtlS2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzUHJvdG90eXBlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlckFyZy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUtleXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlS2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheUxpa2UuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2tleXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRBbGxLZXlzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZXF1YWxPYmplY3RzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fRGF0YVZpZXcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19Qcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fU2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fV2Vha01hcC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFRhZy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc0VxdWFsRGVlcC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc0VxdWFsLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc0VxdWFsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUvZXMvY29udGV4dFR5cGVzLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUvZXMvSW5kZW50LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUvZXMvVHJlZU5vZGUuanMiLCJub2RlX21vZHVsZXMvcmMtdHJlZS9lcy91dGlsLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdERlc3RydWN0dXJpbmdFbXB0eS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlL2VzL3VzZVVubW91bnQuanMiLCJub2RlX21vZHVsZXMvcmMtdHJlZS9lcy9Nb3Rpb25UcmVlTm9kZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlL2VzL3V0aWxzL2RpZmZVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUvZXMvTm9kZUxpc3QuanMiLCJub2RlX21vZHVsZXMvcmMtdHJlZS9lcy9Ecm9wSW5kaWNhdG9yLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUvZXMvVHJlZS5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0hvbGRlck91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0hvbGRlck91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdHJlZS91dGlscy9kcm9wSW5kaWNhdG9yLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2FyZXREb3duRmlsbGVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0NhcmV0RG93bkZpbGxlZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0ZpbGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9GaWxlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9NaW51c1NxdWFyZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL01pbnVzU3F1YXJlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9QbHVzU3F1YXJlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvUGx1c1NxdWFyZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdHJlZS91dGlscy9pY29uVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3RyZWUvVHJlZS5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0ZvbGRlck9wZW5PdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Gb2xkZXJPcGVuT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Gb2xkZXJPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Gb2xkZXJPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3RyZWUvdXRpbHMvZGljdFV0aWwuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy90cmVlL0RpcmVjdG9yeVRyZWUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy90cmVlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvaG9va3MvdXNlU3luY1N0YXRlLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdGFibGUvaG9va3MvdXNlRmlsdGVyL0ZpbHRlclNlYXJjaC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3RhYmxlL2hvb2tzL3VzZUZpbHRlci9GaWx0ZXJXcmFwcGVyLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdGFibGUvaG9va3MvdXNlRmlsdGVyL0ZpbHRlckRyb3Bkb3duLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdGFibGUvaG9va3MvdXNlRmlsdGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdGFibGUvaG9va3MvdXNlTGF6eUtWTWFwLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdGFibGUvaG9va3MvdXNlUGFnaW5hdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3RhYmxlL2hvb2tzL3VzZVNlbGVjdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0NhcmV0RG93bk91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0NhcmV0RG93bk91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2FyZXRVcE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0NhcmV0VXBPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3RhYmxlL2hvb2tzL3VzZVNvcnRlci5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3RhYmxlL2hvb2tzL3VzZVRpdGxlQ29sdW1ucy5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3RhYmxlL1RhYmxlLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRGVsZXRlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvRGVsZXRlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvcmMtdHJlZS1zZWxlY3QvZXMvTGVnYWN5Q29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9lcy9UcmVlU2VsZWN0Q29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9lcy91dGlscy92YWx1ZVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtdHJlZS1zZWxlY3QvZXMvT3B0aW9uTGlzdC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9lcy9UcmVlTm9kZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9lcy91dGlscy9zdHJhdGVneVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtdHJlZS1zZWxlY3QvZXMvdXRpbHMvbGVnYWN5VXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9lcy9ob29rcy91c2VUcmVlRGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9lcy9ob29rcy91c2VDYWNoZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9lcy9ob29rcy91c2VSZWZGdW5jLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUtc2VsZWN0L2VzL2hvb2tzL3VzZURhdGFFbnRpdGllcy5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9lcy9ob29rcy91c2VDaGVja2VkS2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9lcy9ob29rcy91c2VGaWx0ZXJUcmVlRGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9lcy9UcmVlU2VsZWN0LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdHJlZS1zZWxlY3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtdXBsb2FkL2VzL3JlcXVlc3QuanMiLCJub2RlX21vZHVsZXMvcmMtdXBsb2FkL2VzL3VpZC5qcyIsIm5vZGVfbW9kdWxlcy9yYy11cGxvYWQvZXMvYXR0ci1hY2NlcHQuanMiLCJub2RlX21vZHVsZXMvcmMtdXBsb2FkL2VzL3RyYXZlcnNlRmlsZVRyZWUuanMiLCJub2RlX21vZHVsZXMvcmMtdXBsb2FkL2VzL0FqYXhVcGxvYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9yYy11cGxvYWQvZXMvVXBsb2FkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRmlsZVR3b1RvbmUuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvRmlsZVR3b1RvbmUuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9QYXBlckNsaXBPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9QYXBlckNsaXBPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1BpY3R1cmVUd29Ub25lLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1BpY3R1cmVUd29Ub25lLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdXBsb2FkL3V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRG93bmxvYWRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Eb3dubG9hZE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdXBsb2FkL1VwbG9hZExpc3QvTGlzdEl0ZW0uanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy91cGxvYWQvVXBsb2FkTGlzdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3VwbG9hZC9VcGxvYWQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy91cGxvYWQvRHJhZ2dlci5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3VwbG9hZC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy92aXRlLXBsdWdpbi1tb25rZXkvZGlzdC9jbGllbnQvaW5kZXgubWpzIiwibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm5vZGVfbW9kdWxlcy96dXN0YW5kL2VzbS92YW5pbGxhLm1qcyIsIm5vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS5wcm9kdWN0aW9uLm1pbi5qcyIsIm5vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltL3dpdGgtc2VsZWN0b3IucHJvZHVjdGlvbi5taW4uanMiLCJub2RlX21vZHVsZXMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvc2hpbS93aXRoLXNlbGVjdG9yLmpzIiwibm9kZV9tb2R1bGVzL3p1c3RhbmQvZXNtL2luZGV4Lm1qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2ZyZWVHbG9iYWwuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19yb290LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fU3ltYm9sLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZ2V0UmF3VGFnLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fb2JqZWN0VG9TdHJpbmcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlR2V0VGFnLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc09iamVjdExpa2UuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzU3ltYm9sLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYXJyYXlNYXAuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlVG9TdHJpbmcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pZGVudGl0eS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNGdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NvcmVKc0RhdGEuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19pc01hc2tlZC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3RvU291cmNlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUlzTmF0aXZlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZ2V0VmFsdWUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXROYXRpdmUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19XZWFrTWFwLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NvcHlBcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2RlZmluZVByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYXJyYXlFYWNoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faXNJbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VBc3NpZ25WYWx1ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZXEuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hc3NpZ25WYWx1ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NvcHlPYmplY3QuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzTGVuZ3RoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc0FycmF5TGlrZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2lzSXRlcmF0ZWVDYWxsLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faXNQcm90b3R5cGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlVGltZXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSXNBcmd1bWVudHMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzQXJndW1lbnRzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9zdHViRmFsc2UuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzQnVmZmVyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUlzVHlwZWRBcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VVbmFyeS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX25vZGVVdGlsLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc1R5cGVkQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hcnJheUxpa2VLZXlzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fb3ZlckFyZy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX25hdGl2ZUtleXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlS2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMva2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX25hdGl2ZUtleXNJbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VLZXlzSW4uanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2tleXNJbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2lzS2V5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbmF0aXZlQ3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faGFzaENsZWFyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faGFzaERlbGV0ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2hhc2hHZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19oYXNoSGFzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faGFzaFNldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX0hhc2guanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19saXN0Q2FjaGVDbGVhci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Fzc29jSW5kZXhPZi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2xpc3RDYWNoZURlbGV0ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2xpc3RDYWNoZUdldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2xpc3RDYWNoZUhhcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2xpc3RDYWNoZVNldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX0xpc3RDYWNoZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX01hcC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX21hcENhY2hlQ2xlYXIuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19pc0tleWFibGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRNYXBEYXRhLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbWFwQ2FjaGVEZWxldGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19tYXBDYWNoZUdldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX21hcENhY2hlSGFzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbWFwQ2FjaGVTZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19NYXBDYWNoZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvbWVtb2l6ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX21lbW9pemVDYXBwZWQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zdHJpbmdUb1BhdGguanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL3RvU3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY2FzdFBhdGguanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL190b0tleS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VHZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2dldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2FycmF5UHVzaC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldFByb3RvdHlwZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VTbGljZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3N0YWNrQ2xlYXIuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zdGFja0RlbGV0ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3N0YWNrR2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fc3RhY2tIYXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zdGFja1NldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX1N0YWNrLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUFzc2lnbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VBc3NpZ25Jbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Nsb25lQnVmZmVyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYXJyYXlGaWx0ZXIuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL3N0dWJBcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldFN5bWJvbHMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jb3B5U3ltYm9scy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldFN5bWJvbHNJbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NvcHlTeW1ib2xzSW4uanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlR2V0QWxsS2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldEFsbEtleXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRBbGxLZXlzSW4uanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19EYXRhVmlldy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX1Byb21pc2UuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19TZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRUYWcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19pbml0Q2xvbmVBcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX1VpbnQ4QXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jbG9uZUFycmF5QnVmZmVyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY2xvbmVEYXRhVmlldy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Nsb25lUmVnRXhwLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY2xvbmVTeW1ib2wuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jbG9uZVR5cGVkQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19pbml0Q2xvbmVCeVRhZy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2luaXRDbG9uZU9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VJc01hcC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNNYXAuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSXNTZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzU2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUNsb25lLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9jbG9uZURlZXAuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zZXRDYWNoZUFkZC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3NldENhY2hlSGFzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fU2V0Q2FjaGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hcnJheVNvbWUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jYWNoZUhhcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2VxdWFsQXJyYXlzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbWFwVG9BcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3NldFRvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19lcXVhbEJ5VGFnLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZXF1YWxPYmplY3RzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUlzRXF1YWxEZWVwLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUlzRXF1YWwuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSXNNYXRjaC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2lzU3RyaWN0Q29tcGFyYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldE1hdGNoRGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX21hdGNoZXNTdHJpY3RDb21wYXJhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZU1hdGNoZXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSGFzSW4uanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19oYXNQYXRoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9oYXNJbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VNYXRjaGVzUHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlUHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlUHJvcGVydHlEZWVwLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9wcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VJdGVyYXRlZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NyZWF0ZUJhc2VGb3IuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlRm9yLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUZvck93bi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NyZWF0ZUJhc2VFYWNoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUVhY2guanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2xhc3QuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSGFzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9oYXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19wYXJlbnQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzTWF0Y2guanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzVW5kZWZpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9uZWdhdGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlVW5zZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlU2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVBpY2tCeS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvcGlja0J5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9vbWl0QnkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL3NldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VTb21lLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9zb21lLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy91bnNldC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy91dGlscy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy9tb2RlbHMvY29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy9tb2RlbHMvdHJhbnNmb3JtUHJvcHMuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvbW9kZWxzL2JpbmRWYWx1ZXMuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvbW9kZWxzL2xheW91dC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy9tb2RlbHMvZm9ybUNvcmVVdGlscy5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy9yZW5kZXItY29yZS9GaWVsZEl0ZW0vbW9kdWxlLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL21vZGVscy9mb3JtRGF0YVNrZWxldG9uLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL21vZGVscy9leHByZXNzaW9uLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL21vZGVscy9maWVsZFNob3VsZFVwZGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy9tb2RlbHMvbWFwcGluZy5qcyIsIm5vZGVfbW9kdWxlcy9jb2xvci1uYW1lL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2lzLWFycmF5aXNoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1zd2l6emxlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbG9yLXN0cmluZy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb2xvci1jb252ZXJ0L2NvbnZlcnNpb25zLmpzIiwibm9kZV9tb2R1bGVzL2NvbG9yLWNvbnZlcnQvcm91dGUuanMiLCJub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb2xvci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy9tb2RlbHMvdmFsaWRhdGVzLmpzIiwibm9kZV9tb2R1bGVzL2Fob29rcy9lcy9jcmVhdGVVcGRhdGVFZmZlY3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYWhvb2tzL2VzL3V0aWxzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Fob29rcy9lcy91dGlscy9pc0Rldi5qcyIsIm5vZGVfbW9kdWxlcy9haG9va3MvZXMvdXNlVXBkYXRlRWZmZWN0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Fob29rcy9lcy91c2VMYXRlc3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYWhvb2tzL2VzL3VzZVVubW91bnQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZGF5anMvZGF5anMubWluLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3JlbmRlci1jb3JlL0ZpZWxkSXRlbS9maWVsZC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy9yZW5kZXItY29yZS9GaWVsZEl0ZW0vbWFpbi5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy9yZW5kZXItY29yZS9GaWVsZEl0ZW0vaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvcmVuZGVyLWNvcmUvRmllbGRMaXN0L21vZHVsZXMuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvcmVuZGVyLWNvcmUvRmllbGRMaXN0L2ZpZWxkLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3JlbmRlci1jb3JlL0ZpZWxkTGlzdC9tYWluLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3JlbmRlci1jb3JlL0ZpZWxkTGlzdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy9tb2RlbHMvc29ydFByb3BlcnRpZXMuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvcmVuZGVyLWNvcmUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvZm9ybS1jb3JlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0LmpzIiwibm9kZV9tb2R1bGVzL3JjLXBhZ2luYXRpb24vbGliL2xvY2FsZS96aF9DTi5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHMuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2xpYi9sb2NhbGUvemhfQ04uanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvdGltZS1waWNrZXIvbG9jYWxlL3poX0NOLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2RhdGUtcGlja2VyL2xvY2FsZS96aF9DTi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9jYWxlbmRhci9sb2NhbGUvemhfQ04uanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvbG9jYWxlL3poX0NOLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBhZ2luYXRpb24vbGliL2xvY2FsZS9lbl9VUy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvbGliL2xvY2FsZS9lbl9VUy5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi90aW1lLXBpY2tlci9sb2NhbGUvZW5fVVMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvZGF0ZS1waWNrZXIvbG9jYWxlL2VuX1VTLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2NhbGVuZGFyL2xvY2FsZS9lbl9VUy5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9sb2NhbGUvZGVmYXVsdC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9sb2NhbGUvZW5fVVMuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvbG9jYWxlcy9lbl9VUy5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy9sb2NhbGVzL3poX0NOLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL2xvY2FsZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZGF5anMvbG9jYWxlL3poLWNuLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL21vZGVscy9zdG9yZS5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy9tb2RlbHMvdmFsaWRhdGVNZXNzYWdlLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3dpdGhQcm92aWRlci5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL3V0aWxzL3dpdGhGaWVsZFdyYXAuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9maWVsZHMvaW5wdXQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9maWVsZHMvbnVtYmVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3dpZGdldHMvZmllbGRzL3RleHRBcmVhL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3dpZGdldHMvZmllbGRzL3NlbGVjdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2ZpZWxkcy9zd2l0Y2gvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9maWVsZHMvcmFkaW8vaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9maWVsZHMvcmF0ZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2ZpZWxkcy90cmVlU2VsZWN0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3dpZGdldHMvZmllbGRzL2NoZWNrYm94L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3dpZGdldHMvZmllbGRzL2NoZWNrYm94ZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMuanMiLCJub2RlX21vZHVsZXMvcHJvcC10eXBlcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZ2xvYmFsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb3JlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jdHguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2lzLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19mYWlscy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2llOC1kb20tZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1wcmltaXRpdmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1kcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcHJvcGVydHktZGVzYy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faGlkZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faGFzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19leHBvcnQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NvZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVmaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW50ZWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1hYnNvbHV0ZS1pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2xpYnJhcnkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NoYXJlZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdWlkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zaGFyZWQta2V5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZW51bS1idWcta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWtleXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtcGllLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMuanMiLCJub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jcmVhdGUtcmVhY3QtY2xhc3MvZmFjdG9yeS5qcyIsIm5vZGVfbW9kdWxlcy9jcmVhdGUtcmVhY3QtY2xhc3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvbm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvRG9tL2NvbnRhaW5zLmpzIiwibm9kZV9tb2R1bGVzL2FkZC1kb20tZXZlbnQtbGlzdGVuZXIvbGliL0V2ZW50QmFzZU9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9hZGQtZG9tLWV2ZW50LWxpc3RlbmVyL2xpYi9FdmVudE9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9hZGQtZG9tLWV2ZW50LWxpc3RlbmVyL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9ub2RlX21vZHVsZXMvcmMtdXRpbC9saWIvRG9tL2FkZEV2ZW50TGlzdGVuZXIuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc3RyaW5nLWF0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19yZWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlcmF0b3JzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHBzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19odG1sLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NldC10by1zdHJpbmctdGFnLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdwby5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1kZWZpbmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1zdGVwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MtZXh0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9zeW1ib2wvaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL3N5bWJvbC9pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbWV0YS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fd2tzLWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZW51bS1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcG4uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BuLWV4dC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcGQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnN5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5zeW1ib2wub2JzZXJ2YWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9zeW1ib2wuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9oZWxwZXJzL3R5cGVvZi5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LXByb3RvLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L3NldC1wcm90b3R5cGUtb2YuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9zZXQtcHJvdG90eXBlLW9mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cy5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9Eb20vYWRkRXZlbnRMaXN0ZW5lci5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9ub2RlX21vZHVsZXMvcmMtYWxpZ24vZXMvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9ub2RlX21vZHVsZXMvcmMtYWxpZ24vZXMvQWxpZ24uanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL3JjLWFuaW1hdGUvbm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvdW5zYWZlTGlmZWN5Y2xlc1BvbHlmaWxsLmpzIiwibm9kZV9tb2R1bGVzL3JjLWFuaW1hdGUvZXMvQ2hpbGRyZW5VdGlscy5qcyIsIm5vZGVfbW9kdWxlcy9jc3MtYW5pbWF0aW9uL2VzL0V2ZW50LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvbmVudC1pbmRleG9mL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvbmVudC1jbGFzc2VzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Nzcy1hbmltYXRpb24vZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtYW5pbWF0ZS9lcy91dGlsL2FuaW1hdGUuanMiLCJub2RlX21vZHVsZXMvcmMtYW5pbWF0ZS9lcy9BbmltYXRlQ2hpbGQuanMiLCJub2RlX21vZHVsZXMvcmMtYW5pbWF0ZS9lcy9BbmltYXRlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcy5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9ub2RlX21vZHVsZXMvcmMtdHJpZ2dlci9lcy9MYXp5UmVuZGVyQm94LmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL25vZGVfbW9kdWxlcy9yYy10cmlnZ2VyL2VzL1BvcHVwSW5uZXIuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvbm9kZV9tb2R1bGVzL3JjLXRyaWdnZXIvZXMvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvbm9kZV9tb2R1bGVzL3JjLXRyaWdnZXIvZXMvUG9wdXAuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvbm9kZV9tb2R1bGVzL3JjLXV0aWwvbGliL2dldENvbnRhaW5lclJlbmRlck1peGluLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL25vZGVfbW9kdWxlcy9yYy10cmlnZ2VyL2VzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3Rpbnljb2xvcjIvY2pzL3Rpbnljb2xvci5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9ub2RlX21vZHVsZXMvcmMtY29sb3ItcGlja2VyL2xpYi9oZWxwZXJzL2NvbG9yLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL25vZGVfbW9kdWxlcy9yYy1jb2xvci1waWNrZXIvbGliL0JvYXJkLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL25vZGVfbW9kdWxlcy9yYy1jb2xvci1waWNrZXIvbGliL1ByZXZpZXcuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvbm9kZV9tb2R1bGVzL3JjLWNvbG9yLXBpY2tlci9saWIvUmliYm9uLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL25vZGVfbW9kdWxlcy9yYy1jb2xvci1waWNrZXIvbGliL0FscGhhLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL25vZGVfbW9kdWxlcy9yYy1jb2xvci1waWNrZXIvbGliL2hlbHBlcnMvcGVyY2VudGFnZS5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9ub2RlX21vZHVsZXMvcmMtY29sb3ItcGlja2VyL2xpYi9QYXJhbXMuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvbm9kZV9tb2R1bGVzL3JjLWNvbG9yLXBpY2tlci9saWIvdXRpbHMvdmFsaWRhdGlvbkNvbG9yLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL25vZGVfbW9kdWxlcy9yYy1jb2xvci1waWNrZXIvbGliL1BhbmVsLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL25vZGVfbW9kdWxlcy9yYy1jb2xvci1waWNrZXIvbGliL3BsYWNlbWVudHMuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvbm9kZV9tb2R1bGVzL3JjLWNvbG9yLXBpY2tlci9saWIvQ29sb3JQaWNrZXIuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvbm9kZV9tb2R1bGVzL3JjLWNvbG9yLXBpY2tlci9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9maWVsZHMvY29sb3IvYWxwaGFoZXhNYXAuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9maWVsZHMvY29sb3IvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL3F1YXJ0ZXJPZlllYXIuanMiLCJub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL3dlZWtPZlllYXIuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy91dGlscy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9kYXlqcy9wbHVnaW4vd2Vla2RheS5qcyIsIm5vZGVfbW9kdWxlcy9kYXlqcy9wbHVnaW4vbG9jYWxlRGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9kYXlqcy9wbHVnaW4vd2Vla1llYXIuanMiLCJub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL2FkdmFuY2VkRm9ybWF0LmpzIiwibm9kZV9tb2R1bGVzL2RheWpzL3BsdWdpbi9jdXN0b21QYXJzZUZvcm1hdC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvZ2VuZXJhdGUvZGF5anMuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9jb21wb25lbnRzL0RhdGVQaWNrZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9maWVsZHMvZGF0ZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2ZpZWxkcy9kYXRlUmFuZ2UvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9jb21wb25lbnRzL1RpbWVQaWNrZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9maWVsZHMvdGltZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2ZpZWxkcy90aW1lUmFuZ2UvaW5kZXguanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2YuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b1ByaW1pdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvUHJvcGVydHlLZXkuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDIuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vUGljdHVyZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRoSG9sZXMuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5TGlrZVRvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL25vbkl0ZXJhYmxlUmVzdC5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2NvbXBvbmVudHMvQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy11dGlsL2xpYi93YXJuaW5nLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvbGliL0RvbS9jYW5Vc2VEb20uanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9saWIvRG9tL2NvbnRhaW5zLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvbGliL0RvbS9keW5hbWljQ1NTLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvY29tcG9uZW50cy9JY29uQmFzZS5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvY29tcG9uZW50cy90d29Ub25lUHJpbWFyeUNvbG9yLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9jb21wb25lbnRzL0FudGRJY29uLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9QaWN0dXJlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9maWVsZHMvaW1hZ2VJbnB1dC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2ZpZWxkcy91cmxJbnB1dC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2ZpZWxkcy9zbGlkZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vVXBsb2FkT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL1VwbG9hZE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3dpZGdldHMvZmllbGRzL3VwbG9hZC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2ZpZWxkcy9odG1sL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3dpZGdldHMvZmllbGRzL3BlcmNlbnRTbGlkZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9jb21wb25lbnRzL1BhbmVsVmlldy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2JveGNhcmQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vRG93bk91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9Eb3duT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9ib3hDb2xsYXBzZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2JveFN1YklubGluZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2JveExpbmVUaXRsZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9QbHVzT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL1BsdXNPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9Db3B5T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0NvcHlPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9DbG9zZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9DbG9zZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0Fycm93RG93bk91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9BcnJvd0Rvd25PdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9BcnJvd1VwT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0Fycm93VXBPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2NvbXBvbmVudHMvRkJ1dHRvbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2xpc3RTaW1wbGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9saXN0Q2FyZC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9JbmZvQ2lyY2xlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0luZm9DaXJjbGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2xpc3RUYWJsZS90YWJsZUNlbGwuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9saXN0VGFibGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9saXN0RHJhd2VyL2RyYXdlckZvcm0uanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9saXN0RHJhd2VyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3dpZGdldHMvbGlzdFZpcnR1YWwvdmlydHVhbENlbGwuanMiLCJub2RlX21vZHVsZXMvdmlydHVhbGl6ZWR0YWJsZWZvcmFudGQ0L2Rpc3QvZXNtL3Z0LmpzIiwibm9kZV9tb2R1bGVzL3ZpcnR1YWxpemVkdGFibGVmb3JhbnRkNC9kaXN0L2VzbS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2xpc3RWaXJ0dWFsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3dpZGdldHMvbGlzdFRhYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL3ZvaWRUaXRsZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL0Vycm9yU2NoZW1hL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL21vZGVscy9mbGF0dGVuU2NoZW1hLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL21vZGVscy91c2VGb3JtLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL2luZGV4LmpzIiwic3JjL3NjaGVtYS9zdGFyUGFnZUhyZWYuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYmluZC5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvQXhpb3NFcnJvci5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9udWxsLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3RvRm9ybURhdGEuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvQXhpb3NVUkxTZWFyY2hQYXJhbXMuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYnVpbGRVUkwuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvSW50ZXJjZXB0b3JNYW5hZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9kZWZhdWx0cy90cmFuc2l0aW9uYWwuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2Jyb3dzZXIvY2xhc3Nlcy9VUkxTZWFyY2hQYXJhbXMuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2Jyb3dzZXIvY2xhc3Nlcy9Gb3JtRGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvcGxhdGZvcm0vYnJvd3Nlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy90b1VSTEVuY29kZWRGb3JtLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2Zvcm1EYXRhVG9KU09OLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9kZWZhdWx0cy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9wYXJzZUhlYWRlcnMuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvQXhpb3NIZWFkZXJzLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL3RyYW5zZm9ybURhdGEuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9pc0NhbmNlbC5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvc2V0dGxlLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2Nvb2tpZXMuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTC5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9jb21iaW5lVVJMcy5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9idWlsZEZ1bGxQYXRoLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzVVJMU2FtZU9yaWdpbi5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9wYXJzZVByb3RvY29sLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3NwZWVkb21ldGVyLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9hZGFwdGVycy94aHIuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL2FkYXB0ZXJzLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2Rpc3BhdGNoUmVxdWVzdC5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9tZXJnZUNvbmZpZy5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvZW52L2RhdGEuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdmFsaWRhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jYW5jZWwvQ2FuY2VsVG9rZW4uanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvc3ByZWFkLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzQXhpb3NFcnJvci5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9IdHRwU3RhdHVzQ29kZS5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvYXhpb3MuanMiLCJzcmMvYXBpL3JlcXVlc3QuanMiLCJzcmMvQXBwLmpzeCIsInNyYy9tYWluLmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBtID0gcmVxdWlyZSgncmVhY3QtZG9tJyk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBleHBvcnRzLmNyZWF0ZVJvb3QgPSBtLmNyZWF0ZVJvb3Q7XG4gIGV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBtLmh5ZHJhdGVSb290O1xufSBlbHNlIHtcbiAgdmFyIGkgPSBtLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEO1xuICBleHBvcnRzLmNyZWF0ZVJvb3QgPSBmdW5jdGlvbihjLCBvKSB7XG4gICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbS5jcmVhdGVSb290KGMsIG8pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgZXhwb3J0cy5oeWRyYXRlUm9vdCA9IGZ1bmN0aW9uKGMsIGgsIG8pIHtcbiAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBtLmh5ZHJhdGVSb290KGMsIGgsIG8pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IGZhbHNlO1xuICAgIH1cbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG4gIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgfSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gb2JqICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICB9LCBfdHlwZW9mKG9iaik7XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIi4vdHlwZW9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHtcbiAgaWYgKF90eXBlb2YoaW5wdXQpICE9PSBcIm9iamVjdFwiIHx8IGlucHV0ID09PSBudWxsKSByZXR1cm4gaW5wdXQ7XG4gIHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTtcbiAgaWYgKHByaW0gIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgXCJkZWZhdWx0XCIpO1xuICAgIGlmIChfdHlwZW9mKHJlcykgIT09IFwib2JqZWN0XCIpIHJldHVybiByZXM7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpO1xuICB9XG4gIHJldHVybiAoaGludCA9PT0gXCJzdHJpbmdcIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpO1xufSIsImltcG9ydCBfdHlwZW9mIGZyb20gXCIuL3R5cGVvZi5qc1wiO1xuaW1wb3J0IHRvUHJpbWl0aXZlIGZyb20gXCIuL3RvUHJpbWl0aXZlLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleShhcmcpIHtcbiAgdmFyIGtleSA9IHRvUHJpbWl0aXZlKGFyZywgXCJzdHJpbmdcIik7XG4gIHJldHVybiBfdHlwZW9mKGtleSkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTtcbn0iLCJpbXBvcnQgdG9Qcm9wZXJ0eUtleSBmcm9tIFwiLi90b1Byb3BlcnR5S2V5LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGtleSA9IHRvUHJvcGVydHlLZXkoa2V5KTtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufSIsImltcG9ydCB0b1Byb3BlcnR5S2V5IGZyb20gXCIuL3RvUHJvcGVydHlLZXkuanNcIjtcbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHRvUHJvcGVydHlLZXkoZGVzY3JpcHRvci5rZXkpLCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH07XG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59IiwiaW1wb3J0IHNldFByb3RvdHlwZU9mIGZyb20gXCIuL3NldFByb3RvdHlwZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgfVxuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHN1YkNsYXNzLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3ViQ2xhc3MsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSk7XG4gIGlmIChzdXBlckNsYXNzKSBzZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7XG4gIGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7XG4gIHRyeSB7XG4gICAgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7XG4gIGlmIChzZWxmID09PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cbiAgcmV0dXJuIHNlbGY7XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIi4vdHlwZW9mLmpzXCI7XG5pbXBvcnQgYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCIuL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkge1xuICBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgIHJldHVybiBjYWxsO1xuICB9IGVsc2UgaWYgKGNhbGwgIT09IHZvaWQgMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZFwiKTtcbiAgfVxuICByZXR1cm4gYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpO1xufSIsImltcG9ydCBnZXRQcm90b3R5cGVPZiBmcm9tIFwiLi9nZXRQcm90b3R5cGVPZi5qc1wiO1xuaW1wb3J0IGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCBmcm9tIFwiLi9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QuanNcIjtcbmltcG9ydCBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gXCIuL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4uanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7XG4gIHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7XG4gIHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHtcbiAgICB2YXIgU3VwZXIgPSBnZXRQcm90b3R5cGVPZihEZXJpdmVkKSxcbiAgICAgIHJlc3VsdDtcbiAgICBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkge1xuICAgICAgdmFyIE5ld1RhcmdldCA9IGdldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yO1xuICAgICAgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTtcbiAgfTtcbn0iLCIvKiFcblx0Q29weXJpZ2h0IChjKSAyMDE4IEplZCBXYXRzb24uXG5cdExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTUlUKSwgc2VlXG5cdGh0dHA6Ly9qZWR3YXRzb24uZ2l0aHViLmlvL2NsYXNzbmFtZXNcbiovXG4vKiBnbG9iYWwgZGVmaW5lICovXG5cbihmdW5jdGlvbiAoKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHR2YXIgaGFzT3duID0ge30uaGFzT3duUHJvcGVydHk7XG5cdHZhciBuYXRpdmVDb2RlU3RyaW5nID0gJ1tuYXRpdmUgY29kZV0nO1xuXG5cdGZ1bmN0aW9uIGNsYXNzTmFtZXMoKSB7XG5cdFx0dmFyIGNsYXNzZXMgPSBbXTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgYXJnID0gYXJndW1lbnRzW2ldO1xuXHRcdFx0aWYgKCFhcmcpIGNvbnRpbnVlO1xuXG5cdFx0XHR2YXIgYXJnVHlwZSA9IHR5cGVvZiBhcmc7XG5cblx0XHRcdGlmIChhcmdUeXBlID09PSAnc3RyaW5nJyB8fCBhcmdUeXBlID09PSAnbnVtYmVyJykge1xuXHRcdFx0XHRjbGFzc2VzLnB1c2goYXJnKTtcblx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG5cdFx0XHRcdGlmIChhcmcubGVuZ3RoKSB7XG5cdFx0XHRcdFx0dmFyIGlubmVyID0gY2xhc3NOYW1lcy5hcHBseShudWxsLCBhcmcpO1xuXHRcdFx0XHRcdGlmIChpbm5lcikge1xuXHRcdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGlubmVyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYXJnVHlwZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0aWYgKGFyZy50b1N0cmluZyAhPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyAmJiAhYXJnLnRvU3RyaW5nLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ1tuYXRpdmUgY29kZV0nKSkge1xuXHRcdFx0XHRcdGNsYXNzZXMucHVzaChhcmcudG9TdHJpbmcoKSk7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKHZhciBrZXkgaW4gYXJnKSB7XG5cdFx0XHRcdFx0aWYgKGhhc093bi5jYWxsKGFyZywga2V5KSAmJiBhcmdba2V5XSkge1xuXHRcdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNsYXNzZXMuam9pbignICcpO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG5cdFx0Y2xhc3NOYW1lcy5kZWZhdWx0ID0gY2xhc3NOYW1lcztcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGNsYXNzTmFtZXM7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIHJlZ2lzdGVyIGFzICdjbGFzc25hbWVzJywgY29uc2lzdGVudCB3aXRoIG5wbSBwYWNrYWdlIG5hbWVcblx0XHRkZWZpbmUoJ2NsYXNzbmFtZXMnLCBbXSwgZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGNsYXNzTmFtZXM7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0d2luZG93LmNsYXNzTmFtZXMgPSBjbGFzc05hbWVzO1xuXHR9XG59KCkpO1xuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNi4xMy4xXG4gKiByZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0Jzt2YXIgYj1cImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yLGM9Yj9TeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKTo2MDEwMyxkPWI/U3ltYm9sLmZvcihcInJlYWN0LnBvcnRhbFwiKTo2MDEwNixlPWI/U3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpOjYwMTA3LGY9Yj9TeW1ib2wuZm9yKFwicmVhY3Quc3RyaWN0X21vZGVcIik6NjAxMDgsZz1iP1N5bWJvbC5mb3IoXCJyZWFjdC5wcm9maWxlclwiKTo2MDExNCxoPWI/U3ltYm9sLmZvcihcInJlYWN0LnByb3ZpZGVyXCIpOjYwMTA5LGs9Yj9TeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKTo2MDExMCxsPWI/U3ltYm9sLmZvcihcInJlYWN0LmFzeW5jX21vZGVcIik6NjAxMTEsbT1iP1N5bWJvbC5mb3IoXCJyZWFjdC5jb25jdXJyZW50X21vZGVcIik6NjAxMTEsbj1iP1N5bWJvbC5mb3IoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKTo2MDExMixwPWI/U3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlXCIpOjYwMTEzLHE9Yj9cblN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZV9saXN0XCIpOjYwMTIwLHI9Yj9TeW1ib2wuZm9yKFwicmVhY3QubWVtb1wiKTo2MDExNSx0PWI/U3ltYm9sLmZvcihcInJlYWN0LmxhenlcIik6NjAxMTYsdj1iP1N5bWJvbC5mb3IoXCJyZWFjdC5ibG9ja1wiKTo2MDEyMSx3PWI/U3ltYm9sLmZvcihcInJlYWN0LmZ1bmRhbWVudGFsXCIpOjYwMTE3LHg9Yj9TeW1ib2wuZm9yKFwicmVhY3QucmVzcG9uZGVyXCIpOjYwMTE4LHk9Yj9TeW1ib2wuZm9yKFwicmVhY3Quc2NvcGVcIik6NjAxMTk7XG5mdW5jdGlvbiB6KGEpe2lmKFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEpe3ZhciB1PWEuJCR0eXBlb2Y7c3dpdGNoKHUpe2Nhc2UgYzpzd2l0Y2goYT1hLnR5cGUsYSl7Y2FzZSBsOmNhc2UgbTpjYXNlIGU6Y2FzZSBnOmNhc2UgZjpjYXNlIHA6cmV0dXJuIGE7ZGVmYXVsdDpzd2l0Y2goYT1hJiZhLiQkdHlwZW9mLGEpe2Nhc2UgazpjYXNlIG46Y2FzZSB0OmNhc2UgcjpjYXNlIGg6cmV0dXJuIGE7ZGVmYXVsdDpyZXR1cm4gdX19Y2FzZSBkOnJldHVybiB1fX19ZnVuY3Rpb24gQShhKXtyZXR1cm4geihhKT09PW19ZXhwb3J0cy5Bc3luY01vZGU9bDtleHBvcnRzLkNvbmN1cnJlbnRNb2RlPW07ZXhwb3J0cy5Db250ZXh0Q29uc3VtZXI9aztleHBvcnRzLkNvbnRleHRQcm92aWRlcj1oO2V4cG9ydHMuRWxlbWVudD1jO2V4cG9ydHMuRm9yd2FyZFJlZj1uO2V4cG9ydHMuRnJhZ21lbnQ9ZTtleHBvcnRzLkxhenk9dDtleHBvcnRzLk1lbW89cjtleHBvcnRzLlBvcnRhbD1kO1xuZXhwb3J0cy5Qcm9maWxlcj1nO2V4cG9ydHMuU3RyaWN0TW9kZT1mO2V4cG9ydHMuU3VzcGVuc2U9cDtleHBvcnRzLmlzQXN5bmNNb2RlPWZ1bmN0aW9uKGEpe3JldHVybiBBKGEpfHx6KGEpPT09bH07ZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlPUE7ZXhwb3J0cy5pc0NvbnRleHRDb25zdW1lcj1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PWt9O2V4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1ofTtleHBvcnRzLmlzRWxlbWVudD1mdW5jdGlvbihhKXtyZXR1cm5cIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hJiZhLiQkdHlwZW9mPT09Y307ZXhwb3J0cy5pc0ZvcndhcmRSZWY9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1ufTtleHBvcnRzLmlzRnJhZ21lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1lfTtleHBvcnRzLmlzTGF6eT1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PXR9O1xuZXhwb3J0cy5pc01lbW89ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1yfTtleHBvcnRzLmlzUG9ydGFsPWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09ZH07ZXhwb3J0cy5pc1Byb2ZpbGVyPWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09Z307ZXhwb3J0cy5pc1N0cmljdE1vZGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1mfTtleHBvcnRzLmlzU3VzcGVuc2U9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1wfTtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnRUeXBlPWZ1bmN0aW9uKGEpe3JldHVyblwic3RyaW5nXCI9PT10eXBlb2YgYXx8XCJmdW5jdGlvblwiPT09dHlwZW9mIGF8fGE9PT1lfHxhPT09bXx8YT09PWd8fGE9PT1mfHxhPT09cHx8YT09PXF8fFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEmJihhLiQkdHlwZW9mPT09dHx8YS4kJHR5cGVvZj09PXJ8fGEuJCR0eXBlb2Y9PT1ofHxhLiQkdHlwZW9mPT09a3x8YS4kJHR5cGVvZj09PW58fGEuJCR0eXBlb2Y9PT13fHxhLiQkdHlwZW9mPT09eHx8YS4kJHR5cGVvZj09PXl8fGEuJCR0eXBlb2Y9PT12KX07ZXhwb3J0cy50eXBlT2Y9ejtcbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGlzRnJhZ21lbnQgfSBmcm9tICdyZWFjdC1pcyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0b0FycmF5KGNoaWxkcmVuKSB7XG4gIHZhciBvcHRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgcmV0ID0gW107XG4gIFJlYWN0LkNoaWxkcmVuLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIGlmICgoY2hpbGQgPT09IHVuZGVmaW5lZCB8fCBjaGlsZCA9PT0gbnVsbCkgJiYgIW9wdGlvbi5rZWVwRW1wdHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGQpKSB7XG4gICAgICByZXQgPSByZXQuY29uY2F0KHRvQXJyYXkoY2hpbGQpKTtcbiAgICB9IGVsc2UgaWYgKGlzRnJhZ21lbnQoY2hpbGQpICYmIGNoaWxkLnByb3BzKSB7XG4gICAgICByZXQgPSByZXQuY29uY2F0KHRvQXJyYXkoY2hpbGQucHJvcHMuY2hpbGRyZW4sIG9wdGlvbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXQucHVzaChjaGlsZCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJldDtcbn0iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG52YXIgd2FybmVkID0ge307XG52YXIgcHJlV2FybmluZ0ZucyA9IFtdO1xuXG4vKipcbiAqIFByZSB3YXJuaW5nIGVuYWJsZSB5b3UgdG8gcGFyc2UgY29udGVudCBiZWZvcmUgY29uc29sZS5lcnJvci5cbiAqIE1vZGlmeSB0byBudWxsIHdpbGwgcHJldmVudCB3YXJuaW5nLlxuICovXG5leHBvcnQgdmFyIHByZU1lc3NhZ2UgPSBmdW5jdGlvbiBwcmVNZXNzYWdlKGZuKSB7XG4gIHByZVdhcm5pbmdGbnMucHVzaChmbik7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIHdhcm5pbmcodmFsaWQsIG1lc3NhZ2UpIHtcbiAgLy8gU3VwcG9ydCB1Z2xpZnlcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIXZhbGlkICYmIGNvbnNvbGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBmaW5hbE1lc3NhZ2UgPSBwcmVXYXJuaW5nRm5zLnJlZHVjZShmdW5jdGlvbiAobXNnLCBwcmVNZXNzYWdlRm4pIHtcbiAgICAgIHJldHVybiBwcmVNZXNzYWdlRm4obXNnICE9PSBudWxsICYmIG1zZyAhPT0gdm9pZCAwID8gbXNnIDogJycsICd3YXJuaW5nJyk7XG4gICAgfSwgbWVzc2FnZSk7XG4gICAgaWYgKGZpbmFsTWVzc2FnZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIldhcm5pbmc6IFwiLmNvbmNhdChmaW5hbE1lc3NhZ2UpKTtcbiAgICB9XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBub3RlKHZhbGlkLCBtZXNzYWdlKSB7XG4gIC8vIFN1cHBvcnQgdWdsaWZ5XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICF2YWxpZCAmJiBjb25zb2xlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZmluYWxNZXNzYWdlID0gcHJlV2FybmluZ0Zucy5yZWR1Y2UoZnVuY3Rpb24gKG1zZywgcHJlTWVzc2FnZUZuKSB7XG4gICAgICByZXR1cm4gcHJlTWVzc2FnZUZuKG1zZyAhPT0gbnVsbCAmJiBtc2cgIT09IHZvaWQgMCA/IG1zZyA6ICcnLCAnbm90ZScpO1xuICAgIH0sIG1lc3NhZ2UpO1xuICAgIGlmIChmaW5hbE1lc3NhZ2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIk5vdGU6IFwiLmNvbmNhdChmaW5hbE1lc3NhZ2UpKTtcbiAgICB9XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNldFdhcm5lZCgpIHtcbiAgd2FybmVkID0ge307XG59XG5leHBvcnQgZnVuY3Rpb24gY2FsbChtZXRob2QsIHZhbGlkLCBtZXNzYWdlKSB7XG4gIGlmICghdmFsaWQgJiYgIXdhcm5lZFttZXNzYWdlXSkge1xuICAgIG1ldGhvZChmYWxzZSwgbWVzc2FnZSk7XG4gICAgd2FybmVkW21lc3NhZ2VdID0gdHJ1ZTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHdhcm5pbmdPbmNlKHZhbGlkLCBtZXNzYWdlKSB7XG4gIGNhbGwod2FybmluZywgdmFsaWQsIG1lc3NhZ2UpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5vdGVPbmNlKHZhbGlkLCBtZXNzYWdlKSB7XG4gIGNhbGwobm90ZSwgdmFsaWQsIG1lc3NhZ2UpO1xufVxud2FybmluZ09uY2UucHJlTWVzc2FnZSA9IHByZU1lc3NhZ2U7XG53YXJuaW5nT25jZS5yZXNldFdhcm5lZCA9IHJlc2V0V2FybmVkO1xud2FybmluZ09uY2Uubm90ZU9uY2UgPSBub3RlT25jZTtcbmV4cG9ydCBkZWZhdWx0IHdhcm5pbmdPbmNlO1xuLyogZXNsaW50LWVuYWJsZSAqLyIsImltcG9ydCBkZWZpbmVQcm9wZXJ0eSBmcm9tIFwiLi9kZWZpbmVQcm9wZXJ0eS5qc1wiO1xuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG4gIHJldHVybiBrZXlzO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX29iamVjdFNwcmVhZDIodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307XG4gICAgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdGFyZ2V0O1xufSIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZU1lbW8oZ2V0VmFsdWUsIGNvbmRpdGlvbiwgc2hvdWxkVXBkYXRlKSB7XG4gIHZhciBjYWNoZVJlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG4gIGlmICghKCd2YWx1ZScgaW4gY2FjaGVSZWYuY3VycmVudCkgfHwgc2hvdWxkVXBkYXRlKGNhY2hlUmVmLmN1cnJlbnQuY29uZGl0aW9uLCBjb25kaXRpb24pKSB7XG4gICAgY2FjaGVSZWYuY3VycmVudC52YWx1ZSA9IGdldFZhbHVlKCk7XG4gICAgY2FjaGVSZWYuY3VycmVudC5jb25kaXRpb24gPSBjb25kaXRpb247XG4gIH1cbiAgcmV0dXJuIGNhY2hlUmVmLmN1cnJlbnQudmFsdWU7XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cblxuaW1wb3J0IHsgaXNNZW1vIH0gZnJvbSAncmVhY3QtaXMnO1xuaW1wb3J0IHVzZU1lbW8gZnJvbSBcIi4vaG9va3MvdXNlTWVtb1wiO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxSZWYocmVmLCBub2RlKSB7XG4gIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmVmKG5vZGUpO1xuICB9IGVsc2UgaWYgKF90eXBlb2YocmVmKSA9PT0gJ29iamVjdCcgJiYgcmVmICYmICdjdXJyZW50JyBpbiByZWYpIHtcbiAgICByZWYuY3VycmVudCA9IG5vZGU7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXJnZSByZWZzIGludG8gb25lIHJlZiBmdW5jdGlvbiB0byBzdXBwb3J0IHJlZiBwYXNzaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZVJlZigpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlZnMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgcmVmc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuICB2YXIgcmVmTGlzdCA9IHJlZnMuZmlsdGVyKGZ1bmN0aW9uIChyZWYpIHtcbiAgICByZXR1cm4gcmVmO1xuICB9KTtcbiAgaWYgKHJlZkxpc3QubGVuZ3RoIDw9IDEpIHtcbiAgICByZXR1cm4gcmVmTGlzdFswXTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZWZzLmZvckVhY2goZnVuY3Rpb24gKHJlZikge1xuICAgICAgZmlsbFJlZihyZWYsIG5vZGUpO1xuICAgIH0pO1xuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVzZUNvbXBvc2VSZWYoKSB7XG4gIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgcmVmcyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgIHJlZnNbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgfVxuICByZXR1cm4gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNvbXBvc2VSZWYuYXBwbHkodm9pZCAwLCByZWZzKTtcbiAgfSwgcmVmcywgZnVuY3Rpb24gKHByZXYsIG5leHQpIHtcbiAgICByZXR1cm4gcHJldi5sZW5ndGggPT09IG5leHQubGVuZ3RoICYmIHByZXYuZXZlcnkoZnVuY3Rpb24gKHJlZiwgaSkge1xuICAgICAgcmV0dXJuIHJlZiA9PT0gbmV4dFtpXTtcbiAgICB9KTtcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydFJlZihub2RlT3JDb21wb25lbnQpIHtcbiAgdmFyIF90eXBlJHByb3RvdHlwZSwgX25vZGVPckNvbXBvbmVudCRwcm90O1xuICB2YXIgdHlwZSA9IGlzTWVtbyhub2RlT3JDb21wb25lbnQpID8gbm9kZU9yQ29tcG9uZW50LnR5cGUudHlwZSA6IG5vZGVPckNvbXBvbmVudC50eXBlO1xuXG4gIC8vIEZ1bmN0aW9uIGNvbXBvbmVudCBub2RlXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhKChfdHlwZSRwcm90b3R5cGUgPSB0eXBlLnByb3RvdHlwZSkgIT09IG51bGwgJiYgX3R5cGUkcHJvdG90eXBlICE9PSB2b2lkIDAgJiYgX3R5cGUkcHJvdG90eXBlLnJlbmRlcikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBDbGFzcyBjb21wb25lbnRcbiAgaWYgKHR5cGVvZiBub2RlT3JDb21wb25lbnQgPT09ICdmdW5jdGlvbicgJiYgISgoX25vZGVPckNvbXBvbmVudCRwcm90ID0gbm9kZU9yQ29tcG9uZW50LnByb3RvdHlwZSkgIT09IG51bGwgJiYgX25vZGVPckNvbXBvbmVudCRwcm90ICE9PSB2b2lkIDAgJiYgX25vZGVPckNvbXBvbmVudCRwcm90LnJlbmRlcikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4vKiBlc2xpbnQtZW5hYmxlICovIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuZXhwb3J0IGZ1bmN0aW9uIGlzRE9NKG5vZGUpIHtcbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRcbiAgLy8gU2luY2UgWFVMRWxlbWVudCBpcyBhbHNvIHN1YmNsYXNzIG9mIEVsZW1lbnQsIHdlIG9ubHkgbmVlZCBIVE1MRWxlbWVudCBhbmQgU1ZHRWxlbWVudFxuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBTVkdFbGVtZW50O1xufVxuXG4vKipcbiAqIFJldHVybiBpZiBhIG5vZGUgaXMgYSBET00gbm9kZS4gRWxzZSB3aWxsIHJldHVybiBieSBgZmluZERPTU5vZGVgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZpbmRET01Ob2RlKG5vZGUpIHtcbiAgaWYgKGlzRE9NKG5vZGUpKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbiAgaWYgKG5vZGUgaW5zdGFuY2VvZiBSZWFjdC5Db21wb25lbnQpIHtcbiAgICByZXR1cm4gUmVhY3RET00uZmluZERPTU5vZGUobm9kZSk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59IiwiLyoqXHJcbiAqIEEgY29sbGVjdGlvbiBvZiBzaGltcyB0aGF0IHByb3ZpZGUgbWluaW1hbCBmdW5jdGlvbmFsaXR5IG9mIHRoZSBFUzYgY29sbGVjdGlvbnMuXHJcbiAqXHJcbiAqIFRoZXNlIGltcGxlbWVudGF0aW9ucyBhcmUgbm90IG1lYW50IHRvIGJlIHVzZWQgb3V0c2lkZSBvZiB0aGUgUmVzaXplT2JzZXJ2ZXJcclxuICogbW9kdWxlcyBhcyB0aGV5IGNvdmVyIG9ubHkgYSBsaW1pdGVkIHJhbmdlIG9mIHVzZSBjYXNlcy5cclxuICovXHJcbi8qIGVzbGludC1kaXNhYmxlIHJlcXVpcmUtanNkb2MsIHZhbGlkLWpzZG9jICovXHJcbnZhciBNYXBTaGltID0gKGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICh0eXBlb2YgTWFwICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiBNYXA7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgaW5kZXggaW4gcHJvdmlkZWQgYXJyYXkgdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQga2V5LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXk8QXJyYXk+fSBhcnJcclxuICAgICAqIEBwYXJhbSB7Kn0ga2V5XHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBnZXRJbmRleChhcnIsIGtleSkge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSAtMTtcclxuICAgICAgICBhcnIuc29tZShmdW5jdGlvbiAoZW50cnksIGluZGV4KSB7XHJcbiAgICAgICAgICAgIGlmIChlbnRyeVswXSA9PT0ga2V5KSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBpbmRleDtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBmdW5jdGlvbiBjbGFzc18xKCkge1xyXG4gICAgICAgICAgICB0aGlzLl9fZW50cmllc19fID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGFzc18xLnByb3RvdHlwZSwgXCJzaXplXCIsIHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fX2VudHJpZXNfXy5sZW5ndGg7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwYXJhbSB7Kn0ga2V5XHJcbiAgICAgICAgICogQHJldHVybnMgeyp9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY2xhc3NfMS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgICAgICB2YXIgaW5kZXggPSBnZXRJbmRleCh0aGlzLl9fZW50cmllc19fLCBrZXkpO1xyXG4gICAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLl9fZW50cmllc19fW2luZGV4XTtcclxuICAgICAgICAgICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5WzFdO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHBhcmFtIHsqfSBrZXlcclxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlXHJcbiAgICAgICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY2xhc3NfMS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXgodGhpcy5fX2VudHJpZXNfXywga2V5KTtcclxuICAgICAgICAgICAgaWYgKH5pbmRleCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fX2VudHJpZXNfX1tpbmRleF1bMV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX19lbnRyaWVzX18ucHVzaChba2V5LCB2YWx1ZV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcGFyYW0geyp9IGtleVxyXG4gICAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgdmFyIGVudHJpZXMgPSB0aGlzLl9fZW50cmllc19fO1xyXG4gICAgICAgICAgICB2YXIgaW5kZXggPSBnZXRJbmRleChlbnRyaWVzLCBrZXkpO1xyXG4gICAgICAgICAgICBpZiAofmluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICBlbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwYXJhbSB7Kn0ga2V5XHJcbiAgICAgICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY2xhc3NfMS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gISF+Z2V0SW5kZXgodGhpcy5fX2VudHJpZXNfXywga2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLl9fZW50cmllc19fLnNwbGljZSgwKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXHJcbiAgICAgICAgICogQHBhcmFtIHsqfSBbY3R4PW51bGxdXHJcbiAgICAgICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY2xhc3NfMS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaywgY3R4KSB7XHJcbiAgICAgICAgICAgIGlmIChjdHggPT09IHZvaWQgMCkgeyBjdHggPSBudWxsOyB9XHJcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSB0aGlzLl9fZW50cmllc19fOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gX2FbX2ldO1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbChjdHgsIGVudHJ5WzFdLCBlbnRyeVswXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBjbGFzc18xO1xyXG4gICAgfSgpKTtcclxufSkoKTtcblxuLyoqXHJcbiAqIERldGVjdHMgd2hldGhlciB3aW5kb3cgYW5kIGRvY3VtZW50IG9iamVjdHMgYXJlIGF2YWlsYWJsZSBpbiBjdXJyZW50IGVudmlyb25tZW50LlxyXG4gKi9cclxudmFyIGlzQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50ID09PSBkb2N1bWVudDtcblxuLy8gUmV0dXJucyBnbG9iYWwgb2JqZWN0IG9mIGEgY3VycmVudCBlbnZpcm9ubWVudC5cclxudmFyIGdsb2JhbCQxID0gKGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWwuTWF0aCA9PT0gTWF0aCkge1xyXG4gICAgICAgIHJldHVybiBnbG9iYWw7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PT0gTWF0aCkge1xyXG4gICAgICAgIHJldHVybiBzZWxmO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09PSBNYXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdztcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xyXG4gICAgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XHJcbn0pKCk7XG5cbi8qKlxyXG4gKiBBIHNoaW0gZm9yIHRoZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgd2hpY2ggZmFsbHMgYmFjayB0byB0aGUgc2V0VGltZW91dCBpZlxyXG4gKiBmaXJzdCBvbmUgaXMgbm90IHN1cHBvcnRlZC5cclxuICpcclxuICogQHJldHVybnMge251bWJlcn0gUmVxdWVzdHMnIGlkZW50aWZpZXIuXHJcbiAqL1xyXG52YXIgcmVxdWVzdEFuaW1hdGlvbkZyYW1lJDEgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAvLyBJdCdzIHJlcXVpcmVkIHRvIHVzZSBhIGJvdW5kZWQgZnVuY3Rpb24gYmVjYXVzZSBJRSBzb21ldGltZXMgdGhyb3dzXHJcbiAgICAgICAgLy8gYW4gXCJJbnZhbGlkIGNhbGxpbmcgb2JqZWN0XCIgZXJyb3IgaWYgckFGIGlzIGludm9rZWQgd2l0aG91dCB0aGUgZ2xvYmFsXHJcbiAgICAgICAgLy8gb2JqZWN0IG9uIHRoZSBsZWZ0IGhhbmQgc2lkZS5cclxuICAgICAgICByZXR1cm4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQoZ2xvYmFsJDEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChjYWxsYmFjaykgeyByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBjYWxsYmFjayhEYXRlLm5vdygpKTsgfSwgMTAwMCAvIDYwKTsgfTtcclxufSkoKTtcblxuLy8gRGVmaW5lcyBtaW5pbXVtIHRpbWVvdXQgYmVmb3JlIGFkZGluZyBhIHRyYWlsaW5nIGNhbGwuXHJcbnZhciB0cmFpbGluZ1RpbWVvdXQgPSAyO1xyXG4vKipcclxuICogQ3JlYXRlcyBhIHdyYXBwZXIgZnVuY3Rpb24gd2hpY2ggZW5zdXJlcyB0aGF0IHByb3ZpZGVkIGNhbGxiYWNrIHdpbGwgYmVcclxuICogaW52b2tlZCBvbmx5IG9uY2UgZHVyaW5nIHRoZSBzcGVjaWZpZWQgZGVsYXkgcGVyaW9kLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGJlIGludm9rZWQgYWZ0ZXIgdGhlIGRlbGF5IHBlcmlvZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGRlbGF5IC0gRGVsYXkgYWZ0ZXIgd2hpY2ggdG8gaW52b2tlIGNhbGxiYWNrLlxyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XHJcbiAqL1xyXG5mdW5jdGlvbiB0aHJvdHRsZSAoY2FsbGJhY2ssIGRlbGF5KSB7XHJcbiAgICB2YXIgbGVhZGluZ0NhbGwgPSBmYWxzZSwgdHJhaWxpbmdDYWxsID0gZmFsc2UsIGxhc3RDYWxsVGltZSA9IDA7XHJcbiAgICAvKipcclxuICAgICAqIEludm9rZXMgdGhlIG9yaWdpbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIGFuZCBzY2hlZHVsZXMgbmV3IGludm9jYXRpb24gaWZcclxuICAgICAqIHRoZSBcInByb3h5XCIgd2FzIGNhbGxlZCBkdXJpbmcgY3VycmVudCByZXF1ZXN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiByZXNvbHZlUGVuZGluZygpIHtcclxuICAgICAgICBpZiAobGVhZGluZ0NhbGwpIHtcclxuICAgICAgICAgICAgbGVhZGluZ0NhbGwgPSBmYWxzZTtcclxuICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRyYWlsaW5nQ2FsbCkge1xyXG4gICAgICAgICAgICBwcm94eSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgaW52b2tlZCBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5LiBJdCB3aWxsIGZ1cnRoZXIgcG9zdHBvbmVcclxuICAgICAqIGludm9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGRlbGVnYXRpbmcgaXQgdG8gdGhlXHJcbiAgICAgKiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIHRpbWVvdXRDYWxsYmFjaygpIHtcclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUkMShyZXNvbHZlUGVuZGluZyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFNjaGVkdWxlcyBpbnZvY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCBmdW5jdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gcHJveHkoKSB7XHJcbiAgICAgICAgdmFyIHRpbWVTdGFtcCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgaWYgKGxlYWRpbmdDYWxsKSB7XHJcbiAgICAgICAgICAgIC8vIFJlamVjdCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgY2FsbHMuXHJcbiAgICAgICAgICAgIGlmICh0aW1lU3RhbXAgLSBsYXN0Q2FsbFRpbWUgPCB0cmFpbGluZ1RpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBTY2hlZHVsZSBuZXcgY2FsbCB0byBiZSBpbiBpbnZva2VkIHdoZW4gdGhlIHBlbmRpbmcgb25lIGlzIHJlc29sdmVkLlxyXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGltcG9ydGFudCBmb3IgXCJ0cmFuc2l0aW9uc1wiIHdoaWNoIG5ldmVyIGFjdHVhbGx5IHN0YXJ0XHJcbiAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IHNvIHRoZXJlIGlzIGEgY2hhbmNlIHRoYXQgd2UgbWlnaHQgbWlzcyBvbmUgaWYgY2hhbmdlXHJcbiAgICAgICAgICAgIC8vIGhhcHBlbnMgYW1pZHMgdGhlIHBlbmRpbmcgaW52b2NhdGlvbi5cclxuICAgICAgICAgICAgdHJhaWxpbmdDYWxsID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxlYWRpbmdDYWxsID0gdHJ1ZTtcclxuICAgICAgICAgICAgdHJhaWxpbmdDYWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQodGltZW91dENhbGxiYWNrLCBkZWxheSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxhc3RDYWxsVGltZSA9IHRpbWVTdGFtcDtcclxuICAgIH1cclxuICAgIHJldHVybiBwcm94eTtcclxufVxuXG4vLyBNaW5pbXVtIGRlbGF5IGJlZm9yZSBpbnZva2luZyB0aGUgdXBkYXRlIG9mIG9ic2VydmVycy5cclxudmFyIFJFRlJFU0hfREVMQVkgPSAyMDtcclxuLy8gQSBsaXN0IG9mIHN1YnN0cmluZ3Mgb2YgQ1NTIHByb3BlcnRpZXMgdXNlZCB0byBmaW5kIHRyYW5zaXRpb24gZXZlbnRzIHRoYXRcclxuLy8gbWlnaHQgYWZmZWN0IGRpbWVuc2lvbnMgb2Ygb2JzZXJ2ZWQgZWxlbWVudHMuXHJcbnZhciB0cmFuc2l0aW9uS2V5cyA9IFsndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0JywgJ3dpZHRoJywgJ2hlaWdodCcsICdzaXplJywgJ3dlaWdodCddO1xyXG4vLyBDaGVjayBpZiBNdXRhdGlvbk9ic2VydmVyIGlzIGF2YWlsYWJsZS5cclxudmFyIG11dGF0aW9uT2JzZXJ2ZXJTdXBwb3J0ZWQgPSB0eXBlb2YgTXV0YXRpb25PYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCc7XHJcbi8qKlxyXG4gKiBTaW5nbGV0b24gY29udHJvbGxlciBjbGFzcyB3aGljaCBoYW5kbGVzIHVwZGF0ZXMgb2YgUmVzaXplT2JzZXJ2ZXIgaW5zdGFuY2VzLlxyXG4gKi9cclxudmFyIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyKCkge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEluZGljYXRlcyB3aGV0aGVyIERPTSBsaXN0ZW5lcnMgaGF2ZSBiZWVuIGFkZGVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHByaXZhdGUge2Jvb2xlYW59XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jb25uZWN0ZWRfID0gZmFsc2U7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGVsbHMgdGhhdCBjb250cm9sbGVyIGhhcyBzdWJzY3JpYmVkIGZvciBNdXRhdGlvbiBFdmVudHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcHJpdmF0ZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm11dGF0aW9uRXZlbnRzQWRkZWRfID0gZmFsc2U7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogS2VlcHMgcmVmZXJlbmNlIHRvIHRoZSBpbnN0YW5jZSBvZiBNdXRhdGlvbk9ic2VydmVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHByaXZhdGUge011dGF0aW9uT2JzZXJ2ZXJ9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tdXRhdGlvbnNPYnNlcnZlcl8gPSBudWxsO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgbGlzdCBvZiBjb25uZWN0ZWQgb2JzZXJ2ZXJzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHByaXZhdGUge0FycmF5PFJlc2l6ZU9ic2VydmVyU1BJPn1cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9ic2VydmVyc18gPSBbXTtcclxuICAgICAgICB0aGlzLm9uVHJhbnNpdGlvbkVuZF8gPSB0aGlzLm9uVHJhbnNpdGlvbkVuZF8uYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnJlZnJlc2ggPSB0aHJvdHRsZSh0aGlzLnJlZnJlc2guYmluZCh0aGlzKSwgUkVGUkVTSF9ERUxBWSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgb2JzZXJ2ZXIgdG8gb2JzZXJ2ZXJzIGxpc3QuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtSZXNpemVPYnNlcnZlclNQSX0gb2JzZXJ2ZXIgLSBPYnNlcnZlciB0byBiZSBhZGRlZC5cclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIucHJvdG90eXBlLmFkZE9ic2VydmVyID0gZnVuY3Rpb24gKG9ic2VydmVyKSB7XHJcbiAgICAgICAgaWYgKCF+dGhpcy5vYnNlcnZlcnNfLmluZGV4T2Yob2JzZXJ2ZXIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzXy5wdXNoKG9ic2VydmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQWRkIGxpc3RlbmVycyBpZiB0aGV5IGhhdmVuJ3QgYmVlbiBhZGRlZCB5ZXQuXHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3RlZF8pIHtcclxuICAgICAgICAgICAgdGhpcy5jb25uZWN0XygpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgb2JzZXJ2ZXIgZnJvbSBvYnNlcnZlcnMgbGlzdC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1Jlc2l6ZU9ic2VydmVyU1BJfSBvYnNlcnZlciAtIE9ic2VydmVyIHRvIGJlIHJlbW92ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnByb3RvdHlwZS5yZW1vdmVPYnNlcnZlciA9IGZ1bmN0aW9uIChvYnNlcnZlcikge1xyXG4gICAgICAgIHZhciBvYnNlcnZlcnMgPSB0aGlzLm9ic2VydmVyc187XHJcbiAgICAgICAgdmFyIGluZGV4ID0gb2JzZXJ2ZXJzLmluZGV4T2Yob2JzZXJ2ZXIpO1xyXG4gICAgICAgIC8vIFJlbW92ZSBvYnNlcnZlciBpZiBpdCdzIHByZXNlbnQgaW4gcmVnaXN0cnkuXHJcbiAgICAgICAgaWYgKH5pbmRleCkge1xyXG4gICAgICAgICAgICBvYnNlcnZlcnMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUmVtb3ZlIGxpc3RlbmVycyBpZiBjb250cm9sbGVyIGhhcyBubyBjb25uZWN0ZWQgb2JzZXJ2ZXJzLlxyXG4gICAgICAgIGlmICghb2JzZXJ2ZXJzLmxlbmd0aCAmJiB0aGlzLmNvbm5lY3RlZF8pIHtcclxuICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0XygpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIEludm9rZXMgdGhlIHVwZGF0ZSBvZiBvYnNlcnZlcnMuIEl0IHdpbGwgY29udGludWUgcnVubmluZyB1cGRhdGVzIGluc29mYXJcclxuICAgICAqIGl0IGRldGVjdHMgY2hhbmdlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnByb3RvdHlwZS5yZWZyZXNoID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBjaGFuZ2VzRGV0ZWN0ZWQgPSB0aGlzLnVwZGF0ZU9ic2VydmVyc18oKTtcclxuICAgICAgICAvLyBDb250aW51ZSBydW5uaW5nIHVwZGF0ZXMgaWYgY2hhbmdlcyBoYXZlIGJlZW4gZGV0ZWN0ZWQgYXMgdGhlcmUgbWlnaHRcclxuICAgICAgICAvLyBiZSBmdXR1cmUgb25lcyBjYXVzZWQgYnkgQ1NTIHRyYW5zaXRpb25zLlxyXG4gICAgICAgIGlmIChjaGFuZ2VzRGV0ZWN0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyBldmVyeSBvYnNlcnZlciBmcm9tIG9ic2VydmVycyBsaXN0IGFuZCBub3RpZmllcyB0aGVtIG9mIHF1ZXVlZFxyXG4gICAgICogZW50cmllcy5cclxuICAgICAqXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgXCJ0cnVlXCIgaWYgYW55IG9ic2VydmVyIGhhcyBkZXRlY3RlZCBjaGFuZ2VzIGluXHJcbiAgICAgKiAgICAgIGRpbWVuc2lvbnMgb2YgaXQncyBlbGVtZW50cy5cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnByb3RvdHlwZS51cGRhdGVPYnNlcnZlcnNfID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vIENvbGxlY3Qgb2JzZXJ2ZXJzIHRoYXQgaGF2ZSBhY3RpdmUgb2JzZXJ2YXRpb25zLlxyXG4gICAgICAgIHZhciBhY3RpdmVPYnNlcnZlcnMgPSB0aGlzLm9ic2VydmVyc18uZmlsdGVyKGZ1bmN0aW9uIChvYnNlcnZlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZ2F0aGVyQWN0aXZlKCksIG9ic2VydmVyLmhhc0FjdGl2ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIERlbGl2ZXIgbm90aWZpY2F0aW9ucyBpbiBhIHNlcGFyYXRlIGN5Y2xlIGluIG9yZGVyIHRvIGF2b2lkIGFueVxyXG4gICAgICAgIC8vIGNvbGxpc2lvbnMgYmV0d2VlbiBvYnNlcnZlcnMsIGUuZy4gd2hlbiBtdWx0aXBsZSBpbnN0YW5jZXMgb2ZcclxuICAgICAgICAvLyBSZXNpemVPYnNlcnZlciBhcmUgdHJhY2tpbmcgdGhlIHNhbWUgZWxlbWVudCBhbmQgdGhlIGNhbGxiYWNrIG9mIG9uZVxyXG4gICAgICAgIC8vIG9mIHRoZW0gY2hhbmdlcyBjb250ZW50IGRpbWVuc2lvbnMgb2YgdGhlIG9ic2VydmVkIHRhcmdldC4gU29tZXRpbWVzXHJcbiAgICAgICAgLy8gdGhpcyBtYXkgcmVzdWx0IGluIG5vdGlmaWNhdGlvbnMgYmVpbmcgYmxvY2tlZCBmb3IgdGhlIHJlc3Qgb2Ygb2JzZXJ2ZXJzLlxyXG4gICAgICAgIGFjdGl2ZU9ic2VydmVycy5mb3JFYWNoKGZ1bmN0aW9uIChvYnNlcnZlcikgeyByZXR1cm4gb2JzZXJ2ZXIuYnJvYWRjYXN0QWN0aXZlKCk7IH0pO1xyXG4gICAgICAgIHJldHVybiBhY3RpdmVPYnNlcnZlcnMubGVuZ3RoID4gMDtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIERPTSBsaXN0ZW5lcnMuXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIucHJvdG90eXBlLmNvbm5lY3RfID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vIERvIG5vdGhpbmcgaWYgcnVubmluZyBpbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50IG9yIGlmIGxpc3RlbmVyc1xyXG4gICAgICAgIC8vIGhhdmUgYmVlbiBhbHJlYWR5IGFkZGVkLlxyXG4gICAgICAgIGlmICghaXNCcm93c2VyIHx8IHRoaXMuY29ubmVjdGVkXykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFN1YnNjcmlwdGlvbiB0byB0aGUgXCJUcmFuc2l0aW9uZW5kXCIgZXZlbnQgaXMgdXNlZCBhcyBhIHdvcmthcm91bmQgZm9yXHJcbiAgICAgICAgLy8gZGVsYXllZCB0cmFuc2l0aW9ucy4gVGhpcyB3YXkgaXQncyBwb3NzaWJsZSB0byBjYXB0dXJlIGF0IGxlYXN0IHRoZVxyXG4gICAgICAgIC8vIGZpbmFsIHN0YXRlIG9mIGFuIGVsZW1lbnQuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHRoaXMub25UcmFuc2l0aW9uRW5kXyk7XHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucmVmcmVzaCk7XHJcbiAgICAgICAgaWYgKG11dGF0aW9uT2JzZXJ2ZXJTdXBwb3J0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tdXRhdGlvbnNPYnNlcnZlcl8gPSBuZXcgTXV0YXRpb25PYnNlcnZlcih0aGlzLnJlZnJlc2gpO1xyXG4gICAgICAgICAgICB0aGlzLm11dGF0aW9uc09ic2VydmVyXy5vYnNlcnZlKGRvY3VtZW50LCB7XHJcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHN1YnRyZWU6IHRydWVcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01TdWJ0cmVlTW9kaWZpZWQnLCB0aGlzLnJlZnJlc2gpO1xyXG4gICAgICAgICAgICB0aGlzLm11dGF0aW9uRXZlbnRzQWRkZWRfID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jb25uZWN0ZWRfID0gdHJ1ZTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgRE9NIGxpc3RlbmVycy5cclxuICAgICAqXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5wcm90b3R5cGUuZGlzY29ubmVjdF8gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gRG8gbm90aGluZyBpZiBydW5uaW5nIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnQgb3IgaWYgbGlzdGVuZXJzXHJcbiAgICAgICAgLy8gaGF2ZSBiZWVuIGFscmVhZHkgcmVtb3ZlZC5cclxuICAgICAgICBpZiAoIWlzQnJvd3NlciB8fCAhdGhpcy5jb25uZWN0ZWRfKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHRoaXMub25UcmFuc2l0aW9uRW5kXyk7XHJcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucmVmcmVzaCk7XHJcbiAgICAgICAgaWYgKHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfKSB7XHJcbiAgICAgICAgICAgIHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubXV0YXRpb25FdmVudHNBZGRlZF8pIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignRE9NU3VidHJlZU1vZGlmaWVkJywgdGhpcy5yZWZyZXNoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tdXRhdGlvbnNPYnNlcnZlcl8gPSBudWxsO1xyXG4gICAgICAgIHRoaXMubXV0YXRpb25FdmVudHNBZGRlZF8gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNvbm5lY3RlZF8gPSBmYWxzZTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIFwiVHJhbnNpdGlvbmVuZFwiIGV2ZW50IGhhbmRsZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBwYXJhbSB7VHJhbnNpdGlvbkV2ZW50fSBldmVudFxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5wcm90b3R5cGUub25UcmFuc2l0aW9uRW5kXyA9IGZ1bmN0aW9uIChfYSkge1xyXG4gICAgICAgIHZhciBfYiA9IF9hLnByb3BlcnR5TmFtZSwgcHJvcGVydHlOYW1lID0gX2IgPT09IHZvaWQgMCA/ICcnIDogX2I7XHJcbiAgICAgICAgLy8gRGV0ZWN0IHdoZXRoZXIgdHJhbnNpdGlvbiBtYXkgYWZmZWN0IGRpbWVuc2lvbnMgb2YgYW4gZWxlbWVudC5cclxuICAgICAgICB2YXIgaXNSZWZsb3dQcm9wZXJ0eSA9IHRyYW5zaXRpb25LZXlzLnNvbWUoZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gISF+cHJvcGVydHlOYW1lLmluZGV4T2Yoa2V5KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaXNSZWZsb3dQcm9wZXJ0eSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGluc3RhbmNlIG9mIHRoZSBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge1Jlc2l6ZU9ic2VydmVyQ29udHJvbGxlcn1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLmdldEluc3RhbmNlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZV8pIHtcclxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZV8gPSBuZXcgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlXztcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIEhvbGRzIHJlZmVyZW5jZSB0byB0aGUgY29udHJvbGxlcidzIGluc3RhbmNlLlxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlIHtSZXNpemVPYnNlcnZlckNvbnRyb2xsZXJ9XHJcbiAgICAgKi9cclxuICAgIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5pbnN0YW5jZV8gPSBudWxsO1xyXG4gICAgcmV0dXJuIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlcjtcclxufSgpKTtcblxuLyoqXHJcbiAqIERlZmluZXMgbm9uLXdyaXRhYmxlL2VudW1lcmFibGUgcHJvcGVydGllcyBvZiB0aGUgcHJvdmlkZWQgdGFyZ2V0IG9iamVjdC5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCAtIE9iamVjdCBmb3Igd2hpY2ggdG8gZGVmaW5lIHByb3BlcnRpZXMuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyAtIFByb3BlcnRpZXMgdG8gYmUgZGVmaW5lZC5cclxuICogQHJldHVybnMge09iamVjdH0gVGFyZ2V0IG9iamVjdC5cclxuICovXHJcbnZhciBkZWZpbmVDb25maWd1cmFibGUgPSAoZnVuY3Rpb24gKHRhcmdldCwgcHJvcHMpIHtcclxuICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBPYmplY3Qua2V5cyhwcm9wcyk7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgdmFyIGtleSA9IF9hW19pXTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcclxuICAgICAgICAgICAgdmFsdWU6IHByb3BzW2tleV0sXHJcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRhcmdldDtcclxufSk7XG5cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBnbG9iYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBwcm92aWRlZCBlbGVtZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XHJcbiAqIEByZXR1cm5zIHtPYmplY3R9XHJcbiAqL1xyXG52YXIgZ2V0V2luZG93T2YgPSAoZnVuY3Rpb24gKHRhcmdldCkge1xyXG4gICAgLy8gQXNzdW1lIHRoYXQgdGhlIGVsZW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgTm9kZSwgd2hpY2ggbWVhbnMgdGhhdCBpdFxyXG4gICAgLy8gaGFzIHRoZSBcIm93bmVyRG9jdW1lbnRcIiBwcm9wZXJ0eSBmcm9tIHdoaWNoIHdlIGNhbiByZXRyaWV2ZSBhXHJcbiAgICAvLyBjb3JyZXNwb25kaW5nIGdsb2JhbCBvYmplY3QuXHJcbiAgICB2YXIgb3duZXJHbG9iYWwgPSB0YXJnZXQgJiYgdGFyZ2V0Lm93bmVyRG9jdW1lbnQgJiYgdGFyZ2V0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XHJcbiAgICAvLyBSZXR1cm4gdGhlIGxvY2FsIGdsb2JhbCBvYmplY3QgaWYgaXQncyBub3QgcG9zc2libGUgZXh0cmFjdCBvbmUgZnJvbVxyXG4gICAgLy8gcHJvdmlkZWQgZWxlbWVudC5cclxuICAgIHJldHVybiBvd25lckdsb2JhbCB8fCBnbG9iYWwkMTtcclxufSk7XG5cbi8vIFBsYWNlaG9sZGVyIG9mIGFuIGVtcHR5IGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG52YXIgZW1wdHlSZWN0ID0gY3JlYXRlUmVjdEluaXQoMCwgMCwgMCwgMCk7XHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBwcm92aWRlZCBzdHJpbmcgdG8gYSBudW1iZXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gdmFsdWVcclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXHJcbmZ1bmN0aW9uIHRvRmxvYXQodmFsdWUpIHtcclxuICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKSB8fCAwO1xyXG59XHJcbi8qKlxyXG4gKiBFeHRyYWN0cyBib3JkZXJzIHNpemUgZnJvbSBwcm92aWRlZCBzdHlsZXMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7Q1NTU3R5bGVEZWNsYXJhdGlvbn0gc3R5bGVzXHJcbiAqIEBwYXJhbSB7Li4uc3RyaW5nfSBwb3NpdGlvbnMgLSBCb3JkZXJzIHBvc2l0aW9ucyAodG9wLCByaWdodCwgLi4uKVxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0Qm9yZGVyc1NpemUoc3R5bGVzKSB7XHJcbiAgICB2YXIgcG9zaXRpb25zID0gW107XHJcbiAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgIHBvc2l0aW9uc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcclxuICAgIH1cclxuICAgIHJldHVybiBwb3NpdGlvbnMucmVkdWNlKGZ1bmN0aW9uIChzaXplLCBwb3NpdGlvbikge1xyXG4gICAgICAgIHZhciB2YWx1ZSA9IHN0eWxlc1snYm9yZGVyLScgKyBwb3NpdGlvbiArICctd2lkdGgnXTtcclxuICAgICAgICByZXR1cm4gc2l6ZSArIHRvRmxvYXQodmFsdWUpO1xyXG4gICAgfSwgMCk7XHJcbn1cclxuLyoqXHJcbiAqIEV4dHJhY3RzIHBhZGRpbmdzIHNpemVzIGZyb20gcHJvdmlkZWQgc3R5bGVzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0NTU1N0eWxlRGVjbGFyYXRpb259IHN0eWxlc1xyXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBQYWRkaW5ncyBib3guXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRQYWRkaW5ncyhzdHlsZXMpIHtcclxuICAgIHZhciBwb3NpdGlvbnMgPSBbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddO1xyXG4gICAgdmFyIHBhZGRpbmdzID0ge307XHJcbiAgICBmb3IgKHZhciBfaSA9IDAsIHBvc2l0aW9uc18xID0gcG9zaXRpb25zOyBfaSA8IHBvc2l0aW9uc18xLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgIHZhciBwb3NpdGlvbiA9IHBvc2l0aW9uc18xW19pXTtcclxuICAgICAgICB2YXIgdmFsdWUgPSBzdHlsZXNbJ3BhZGRpbmctJyArIHBvc2l0aW9uXTtcclxuICAgICAgICBwYWRkaW5nc1twb3NpdGlvbl0gPSB0b0Zsb2F0KHZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYWRkaW5ncztcclxufVxyXG4vKipcclxuICogQ2FsY3VsYXRlcyBjb250ZW50IHJlY3RhbmdsZSBvZiBwcm92aWRlZCBTVkcgZWxlbWVudC5cclxuICpcclxuICogQHBhcmFtIHtTVkdHcmFwaGljc0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgY29udGVudCByZWN0YW5nbGUgb2Ygd2hpY2ggbmVlZHNcclxuICogICAgICB0byBiZSBjYWxjdWxhdGVkLlxyXG4gKiBAcmV0dXJucyB7RE9NUmVjdEluaXR9XHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRTVkdDb250ZW50UmVjdCh0YXJnZXQpIHtcclxuICAgIHZhciBiYm94ID0gdGFyZ2V0LmdldEJCb3goKTtcclxuICAgIHJldHVybiBjcmVhdGVSZWN0SW5pdCgwLCAwLCBiYm94LndpZHRoLCBiYm94LmhlaWdodCk7XHJcbn1cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgY29udGVudCByZWN0YW5nbGUgb2YgcHJvdmlkZWQgSFRNTEVsZW1lbnQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgZm9yIHdoaWNoIHRvIGNhbGN1bGF0ZSB0aGUgY29udGVudCByZWN0YW5nbGUuXHJcbiAqIEByZXR1cm5zIHtET01SZWN0SW5pdH1cclxuICovXHJcbmZ1bmN0aW9uIGdldEhUTUxFbGVtZW50Q29udGVudFJlY3QodGFyZ2V0KSB7XHJcbiAgICAvLyBDbGllbnQgd2lkdGggJiBoZWlnaHQgcHJvcGVydGllcyBjYW4ndCBiZVxyXG4gICAgLy8gdXNlZCBleGNsdXNpdmVseSBhcyB0aGV5IHByb3ZpZGUgcm91bmRlZCB2YWx1ZXMuXHJcbiAgICB2YXIgY2xpZW50V2lkdGggPSB0YXJnZXQuY2xpZW50V2lkdGgsIGNsaWVudEhlaWdodCA9IHRhcmdldC5jbGllbnRIZWlnaHQ7XHJcbiAgICAvLyBCeSB0aGlzIGNvbmRpdGlvbiB3ZSBjYW4gY2F0Y2ggYWxsIG5vbi1yZXBsYWNlZCBpbmxpbmUsIGhpZGRlbiBhbmRcclxuICAgIC8vIGRldGFjaGVkIGVsZW1lbnRzLiBUaG91Z2ggZWxlbWVudHMgd2l0aCB3aWR0aCAmIGhlaWdodCBwcm9wZXJ0aWVzIGxlc3NcclxuICAgIC8vIHRoYW4gMC41IHdpbGwgYmUgZGlzY2FyZGVkIGFzIHdlbGwuXHJcbiAgICAvL1xyXG4gICAgLy8gV2l0aG91dCBpdCB3ZSB3b3VsZCBuZWVkIHRvIGltcGxlbWVudCBzZXBhcmF0ZSBtZXRob2RzIGZvciBlYWNoIG9mXHJcbiAgICAvLyB0aG9zZSBjYXNlcyBhbmQgaXQncyBub3QgcG9zc2libGUgdG8gcGVyZm9ybSBhIHByZWNpc2UgYW5kIHBlcmZvcm1hbmNlXHJcbiAgICAvLyBlZmZlY3RpdmUgdGVzdCBmb3IgaGlkZGVuIGVsZW1lbnRzLiBFLmcuIGV2ZW4galF1ZXJ5J3MgJzp2aXNpYmxlJyBmaWx0ZXJcclxuICAgIC8vIGdpdmVzIHdyb25nIHJlc3VsdHMgZm9yIGVsZW1lbnRzIHdpdGggd2lkdGggJiBoZWlnaHQgbGVzcyB0aGFuIDAuNS5cclxuICAgIGlmICghY2xpZW50V2lkdGggJiYgIWNsaWVudEhlaWdodCkge1xyXG4gICAgICAgIHJldHVybiBlbXB0eVJlY3Q7XHJcbiAgICB9XHJcbiAgICB2YXIgc3R5bGVzID0gZ2V0V2luZG93T2YodGFyZ2V0KS5nZXRDb21wdXRlZFN0eWxlKHRhcmdldCk7XHJcbiAgICB2YXIgcGFkZGluZ3MgPSBnZXRQYWRkaW5ncyhzdHlsZXMpO1xyXG4gICAgdmFyIGhvcml6UGFkID0gcGFkZGluZ3MubGVmdCArIHBhZGRpbmdzLnJpZ2h0O1xyXG4gICAgdmFyIHZlcnRQYWQgPSBwYWRkaW5ncy50b3AgKyBwYWRkaW5ncy5ib3R0b207XHJcbiAgICAvLyBDb21wdXRlZCBzdHlsZXMgb2Ygd2lkdGggJiBoZWlnaHQgYXJlIGJlaW5nIHVzZWQgYmVjYXVzZSB0aGV5IGFyZSB0aGVcclxuICAgIC8vIG9ubHkgZGltZW5zaW9ucyBhdmFpbGFibGUgdG8gSlMgdGhhdCBjb250YWluIG5vbi1yb3VuZGVkIHZhbHVlcy4gSXQgY291bGRcclxuICAgIC8vIGJlIHBvc3NpYmxlIHRvIHV0aWxpemUgdGhlIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBpZiBvbmx5IGl0J3MgZGF0YSB3YXNuJ3RcclxuICAgIC8vIGFmZmVjdGVkIGJ5IENTUyB0cmFuc2Zvcm1hdGlvbnMgbGV0IGFsb25lIHBhZGRpbmdzLCBib3JkZXJzIGFuZCBzY3JvbGwgYmFycy5cclxuICAgIHZhciB3aWR0aCA9IHRvRmxvYXQoc3R5bGVzLndpZHRoKSwgaGVpZ2h0ID0gdG9GbG9hdChzdHlsZXMuaGVpZ2h0KTtcclxuICAgIC8vIFdpZHRoICYgaGVpZ2h0IGluY2x1ZGUgcGFkZGluZ3MgYW5kIGJvcmRlcnMgd2hlbiB0aGUgJ2JvcmRlci1ib3gnIGJveFxyXG4gICAgLy8gbW9kZWwgaXMgYXBwbGllZCAoZXhjZXB0IGZvciBJRSkuXHJcbiAgICBpZiAoc3R5bGVzLmJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnKSB7XHJcbiAgICAgICAgLy8gRm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHJlcXVpcmVkIHRvIGhhbmRsZSBJbnRlcm5ldCBFeHBsb3JlciB3aGljaFxyXG4gICAgICAgIC8vIGRvZXNuJ3QgaW5jbHVkZSBwYWRkaW5ncyBhbmQgYm9yZGVycyB0byBjb21wdXRlZCBDU1MgZGltZW5zaW9ucy5cclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIFdlIGNhbiBzYXkgdGhhdCBpZiBDU1MgZGltZW5zaW9ucyArIHBhZGRpbmdzIGFyZSBlcXVhbCB0byB0aGUgXCJjbGllbnRcIlxyXG4gICAgICAgIC8vIHByb3BlcnRpZXMgdGhlbiBpdCdzIGVpdGhlciBJRSwgYW5kIHRodXMgd2UgZG9uJ3QgbmVlZCB0byBzdWJ0cmFjdFxyXG4gICAgICAgIC8vIGFueXRoaW5nLCBvciBhbiBlbGVtZW50IG1lcmVseSBkb2Vzbid0IGhhdmUgcGFkZGluZ3MvYm9yZGVycyBzdHlsZXMuXHJcbiAgICAgICAgaWYgKE1hdGgucm91bmQod2lkdGggKyBob3JpelBhZCkgIT09IGNsaWVudFdpZHRoKSB7XHJcbiAgICAgICAgICAgIHdpZHRoIC09IGdldEJvcmRlcnNTaXplKHN0eWxlcywgJ2xlZnQnLCAncmlnaHQnKSArIGhvcml6UGFkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoTWF0aC5yb3VuZChoZWlnaHQgKyB2ZXJ0UGFkKSAhPT0gY2xpZW50SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIGhlaWdodCAtPSBnZXRCb3JkZXJzU2l6ZShzdHlsZXMsICd0b3AnLCAnYm90dG9tJykgKyB2ZXJ0UGFkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIEZvbGxvd2luZyBzdGVwcyBjYW4ndCBiZSBhcHBsaWVkIHRvIHRoZSBkb2N1bWVudCdzIHJvb3QgZWxlbWVudCBhcyBpdHNcclxuICAgIC8vIGNsaWVudFtXaWR0aC9IZWlnaHRdIHByb3BlcnRpZXMgcmVwcmVzZW50IHZpZXdwb3J0IGFyZWEgb2YgdGhlIHdpbmRvdy5cclxuICAgIC8vIEJlc2lkZXMsIGl0J3MgYXMgd2VsbCBub3QgbmVjZXNzYXJ5IGFzIHRoZSA8aHRtbD4gaXRzZWxmIG5laXRoZXIgaGFzXHJcbiAgICAvLyByZW5kZXJlZCBzY3JvbGwgYmFycyBub3IgaXQgY2FuIGJlIGNsaXBwZWQuXHJcbiAgICBpZiAoIWlzRG9jdW1lbnRFbGVtZW50KHRhcmdldCkpIHtcclxuICAgICAgICAvLyBJbiBzb21lIGJyb3dzZXJzIChvbmx5IGluIEZpcmVmb3gsIGFjdHVhbGx5KSBDU1Mgd2lkdGggJiBoZWlnaHRcclxuICAgICAgICAvLyBpbmNsdWRlIHNjcm9sbCBiYXJzIHNpemUgd2hpY2ggY2FuIGJlIHJlbW92ZWQgYXQgdGhpcyBzdGVwIGFzIHNjcm9sbFxyXG4gICAgICAgIC8vIGJhcnMgYXJlIHRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiByb3VuZGVkIGRpbWVuc2lvbnMgKyBwYWRkaW5nc1xyXG4gICAgICAgIC8vIGFuZCBcImNsaWVudFwiIHByb3BlcnRpZXMsIHRob3VnaCB0aGF0IGlzIG5vdCBhbHdheXMgdHJ1ZSBpbiBDaHJvbWUuXHJcbiAgICAgICAgdmFyIHZlcnRTY3JvbGxiYXIgPSBNYXRoLnJvdW5kKHdpZHRoICsgaG9yaXpQYWQpIC0gY2xpZW50V2lkdGg7XHJcbiAgICAgICAgdmFyIGhvcml6U2Nyb2xsYmFyID0gTWF0aC5yb3VuZChoZWlnaHQgKyB2ZXJ0UGFkKSAtIGNsaWVudEhlaWdodDtcclxuICAgICAgICAvLyBDaHJvbWUgaGFzIGEgcmF0aGVyIHdlaXJkIHJvdW5kaW5nIG9mIFwiY2xpZW50XCIgcHJvcGVydGllcy5cclxuICAgICAgICAvLyBFLmcuIGZvciBhbiBlbGVtZW50IHdpdGggY29udGVudCB3aWR0aCBvZiAzMTQuMnB4IGl0IHNvbWV0aW1lcyBnaXZlc1xyXG4gICAgICAgIC8vIHRoZSBjbGllbnQgd2lkdGggb2YgMzE1cHggYW5kIGZvciB0aGUgd2lkdGggb2YgMzE0LjdweCBpdCBtYXkgZ2l2ZVxyXG4gICAgICAgIC8vIDMxNHB4LiBBbmQgaXQgZG9lc24ndCBoYXBwZW4gYWxsIHRoZSB0aW1lLiBTbyBqdXN0IGlnbm9yZSB0aGlzIGRlbHRhXHJcbiAgICAgICAgLy8gYXMgYSBub24tcmVsZXZhbnQuXHJcbiAgICAgICAgaWYgKE1hdGguYWJzKHZlcnRTY3JvbGxiYXIpICE9PSAxKSB7XHJcbiAgICAgICAgICAgIHdpZHRoIC09IHZlcnRTY3JvbGxiYXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChNYXRoLmFicyhob3JpelNjcm9sbGJhcikgIT09IDEpIHtcclxuICAgICAgICAgICAgaGVpZ2h0IC09IGhvcml6U2Nyb2xsYmFyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjcmVhdGVSZWN0SW5pdChwYWRkaW5ncy5sZWZ0LCBwYWRkaW5ncy50b3AsIHdpZHRoLCBoZWlnaHQpO1xyXG59XHJcbi8qKlxyXG4gKiBDaGVja3Mgd2hldGhlciBwcm92aWRlZCBlbGVtZW50IGlzIGFuIGluc3RhbmNlIG9mIHRoZSBTVkdHcmFwaGljc0VsZW1lbnQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IC0gRWxlbWVudCB0byBiZSBjaGVja2VkLlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbnZhciBpc1NWR0dyYXBoaWNzRWxlbWVudCA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICAvLyBTb21lIGJyb3dzZXJzLCBuYW1lbHkgSUUgYW5kIEVkZ2UsIGRvbid0IGhhdmUgdGhlIFNWR0dyYXBoaWNzRWxlbWVudFxyXG4gICAgLy8gaW50ZXJmYWNlLlxyXG4gICAgaWYgKHR5cGVvZiBTVkdHcmFwaGljc0VsZW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQpIHsgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIGdldFdpbmRvd09mKHRhcmdldCkuU1ZHR3JhcGhpY3NFbGVtZW50OyB9O1xyXG4gICAgfVxyXG4gICAgLy8gSWYgaXQncyBzbywgdGhlbiBjaGVjayB0aGF0IGVsZW1lbnQgaXMgYXQgbGVhc3QgYW4gaW5zdGFuY2Ugb2YgdGhlXHJcbiAgICAvLyBTVkdFbGVtZW50IGFuZCB0aGF0IGl0IGhhcyB0aGUgXCJnZXRCQm94XCIgbWV0aG9kLlxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXBhcmVuc1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQpIHsgcmV0dXJuICh0YXJnZXQgaW5zdGFuY2VvZiBnZXRXaW5kb3dPZih0YXJnZXQpLlNWR0VsZW1lbnQgJiZcclxuICAgICAgICB0eXBlb2YgdGFyZ2V0LmdldEJCb3ggPT09ICdmdW5jdGlvbicpOyB9O1xyXG59KSgpO1xyXG4vKipcclxuICogQ2hlY2tzIHdoZXRoZXIgcHJvdmlkZWQgZWxlbWVudCBpcyBhIGRvY3VtZW50IGVsZW1lbnQgKDxodG1sPikuXHJcbiAqXHJcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IC0gRWxlbWVudCB0byBiZSBjaGVja2VkLlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbmZ1bmN0aW9uIGlzRG9jdW1lbnRFbGVtZW50KHRhcmdldCkge1xyXG4gICAgcmV0dXJuIHRhcmdldCA9PT0gZ2V0V2luZG93T2YodGFyZ2V0KS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XHJcbn1cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgYW4gYXBwcm9wcmlhdGUgY29udGVudCByZWN0YW5nbGUgZm9yIHByb3ZpZGVkIGh0bWwgb3Igc3ZnIGVsZW1lbnQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IC0gRWxlbWVudCBjb250ZW50IHJlY3RhbmdsZSBvZiB3aGljaCBuZWVkcyB0byBiZSBjYWxjdWxhdGVkLlxyXG4gKiBAcmV0dXJucyB7RE9NUmVjdEluaXR9XHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRDb250ZW50UmVjdCh0YXJnZXQpIHtcclxuICAgIGlmICghaXNCcm93c2VyKSB7XHJcbiAgICAgICAgcmV0dXJuIGVtcHR5UmVjdDtcclxuICAgIH1cclxuICAgIGlmIChpc1NWR0dyYXBoaWNzRWxlbWVudCh0YXJnZXQpKSB7XHJcbiAgICAgICAgcmV0dXJuIGdldFNWR0NvbnRlbnRSZWN0KHRhcmdldCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ2V0SFRNTEVsZW1lbnRDb250ZW50UmVjdCh0YXJnZXQpO1xyXG59XHJcbi8qKlxyXG4gKiBDcmVhdGVzIHJlY3RhbmdsZSB3aXRoIGFuIGludGVyZmFjZSBvZiB0aGUgRE9NUmVjdFJlYWRPbmx5LlxyXG4gKiBTcGVjOiBodHRwczovL2RyYWZ0cy5meHRmLm9yZy9nZW9tZXRyeS8jZG9tcmVjdHJlYWRvbmx5XHJcbiAqXHJcbiAqIEBwYXJhbSB7RE9NUmVjdEluaXR9IHJlY3RJbml0IC0gT2JqZWN0IHdpdGggcmVjdGFuZ2xlJ3MgeC95IGNvb3JkaW5hdGVzIGFuZCBkaW1lbnNpb25zLlxyXG4gKiBAcmV0dXJucyB7RE9NUmVjdFJlYWRPbmx5fVxyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlUmVhZE9ubHlSZWN0KF9hKSB7XHJcbiAgICB2YXIgeCA9IF9hLngsIHkgPSBfYS55LCB3aWR0aCA9IF9hLndpZHRoLCBoZWlnaHQgPSBfYS5oZWlnaHQ7XHJcbiAgICAvLyBJZiBET01SZWN0UmVhZE9ubHkgaXMgYXZhaWxhYmxlIHVzZSBpdCBhcyBhIHByb3RvdHlwZSBmb3IgdGhlIHJlY3RhbmdsZS5cclxuICAgIHZhciBDb25zdHIgPSB0eXBlb2YgRE9NUmVjdFJlYWRPbmx5ICE9PSAndW5kZWZpbmVkJyA/IERPTVJlY3RSZWFkT25seSA6IE9iamVjdDtcclxuICAgIHZhciByZWN0ID0gT2JqZWN0LmNyZWF0ZShDb25zdHIucHJvdG90eXBlKTtcclxuICAgIC8vIFJlY3RhbmdsZSdzIHByb3BlcnRpZXMgYXJlIG5vdCB3cml0YWJsZSBhbmQgbm9uLWVudW1lcmFibGUuXHJcbiAgICBkZWZpbmVDb25maWd1cmFibGUocmVjdCwge1xyXG4gICAgICAgIHg6IHgsIHk6IHksIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQsXHJcbiAgICAgICAgdG9wOiB5LFxyXG4gICAgICAgIHJpZ2h0OiB4ICsgd2lkdGgsXHJcbiAgICAgICAgYm90dG9tOiBoZWlnaHQgKyB5LFxyXG4gICAgICAgIGxlZnQ6IHhcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlY3Q7XHJcbn1cclxuLyoqXHJcbiAqIENyZWF0ZXMgRE9NUmVjdEluaXQgb2JqZWN0IGJhc2VkIG9uIHRoZSBwcm92aWRlZCBkaW1lbnNpb25zIGFuZCB0aGUgeC95IGNvb3JkaW5hdGVzLlxyXG4gKiBTcGVjOiBodHRwczovL2RyYWZ0cy5meHRmLm9yZy9nZW9tZXRyeS8jZGljdGRlZi1kb21yZWN0aW5pdFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFggY29vcmRpbmF0ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBZIGNvb3JkaW5hdGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFJlY3RhbmdsZSdzIHdpZHRoLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gUmVjdGFuZ2xlJ3MgaGVpZ2h0LlxyXG4gKiBAcmV0dXJucyB7RE9NUmVjdEluaXR9XHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVSZWN0SW5pdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XHJcbiAgICByZXR1cm4geyB4OiB4LCB5OiB5LCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XHJcbn1cblxuLyoqXHJcbiAqIENsYXNzIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIGNvbXB1dGF0aW9ucyBvZiB0aGUgY29udGVudCByZWN0YW5nbGUgb2ZcclxuICogcHJvdmlkZWQgRE9NIGVsZW1lbnQgYW5kIGZvciBrZWVwaW5nIHRyYWNrIG9mIGl0J3MgY2hhbmdlcy5cclxuICovXHJcbnZhciBSZXNpemVPYnNlcnZhdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSZXNpemVPYnNlcnZhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgdG8gYmUgb2JzZXJ2ZWQuXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIFJlc2l6ZU9ic2VydmF0aW9uKHRhcmdldCkge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEJyb2FkY2FzdGVkIHdpZHRoIG9mIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJyb2FkY2FzdFdpZHRoID0gMDtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBCcm9hZGNhc3RlZCBoZWlnaHQgb2YgY29udGVudCByZWN0YW5nbGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYnJvYWRjYXN0SGVpZ2h0ID0gMDtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBSZWZlcmVuY2UgdG8gdGhlIGxhc3Qgb2JzZXJ2ZWQgY29udGVudCByZWN0YW5nbGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcHJpdmF0ZSB7RE9NUmVjdEluaXR9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jb250ZW50UmVjdF8gPSBjcmVhdGVSZWN0SW5pdCgwLCAwLCAwLCAwKTtcclxuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyBjb250ZW50IHJlY3RhbmdsZSBhbmQgdGVsbHMgd2hldGhlciBpdCdzIHdpZHRoIG9yIGhlaWdodCBwcm9wZXJ0aWVzXHJcbiAgICAgKiBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgYnJvYWRjYXN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBSZXNpemVPYnNlcnZhdGlvbi5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHJlY3QgPSBnZXRDb250ZW50UmVjdCh0aGlzLnRhcmdldCk7XHJcbiAgICAgICAgdGhpcy5jb250ZW50UmVjdF8gPSByZWN0O1xyXG4gICAgICAgIHJldHVybiAocmVjdC53aWR0aCAhPT0gdGhpcy5icm9hZGNhc3RXaWR0aCB8fFxyXG4gICAgICAgICAgICByZWN0LmhlaWdodCAhPT0gdGhpcy5icm9hZGNhc3RIZWlnaHQpO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyAnYnJvYWRjYXN0V2lkdGgnIGFuZCAnYnJvYWRjYXN0SGVpZ2h0JyBwcm9wZXJ0aWVzIHdpdGggYSBkYXRhXHJcbiAgICAgKiBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnRpZXMgb2YgdGhlIGxhc3Qgb2JzZXJ2ZWQgY29udGVudCByZWN0YW5nbGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge0RPTVJlY3RJbml0fSBMYXN0IG9ic2VydmVkIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAgICovXHJcbiAgICBSZXNpemVPYnNlcnZhdGlvbi5wcm90b3R5cGUuYnJvYWRjYXN0UmVjdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgcmVjdCA9IHRoaXMuY29udGVudFJlY3RfO1xyXG4gICAgICAgIHRoaXMuYnJvYWRjYXN0V2lkdGggPSByZWN0LndpZHRoO1xyXG4gICAgICAgIHRoaXMuYnJvYWRjYXN0SGVpZ2h0ID0gcmVjdC5oZWlnaHQ7XHJcbiAgICAgICAgcmV0dXJuIHJlY3Q7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIFJlc2l6ZU9ic2VydmF0aW9uO1xyXG59KCkpO1xuXG52YXIgUmVzaXplT2JzZXJ2ZXJFbnRyeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSZXNpemVPYnNlcnZlckVudHJ5LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IC0gRWxlbWVudCB0aGF0IGlzIGJlaW5nIG9ic2VydmVkLlxyXG4gICAgICogQHBhcmFtIHtET01SZWN0SW5pdH0gcmVjdEluaXQgLSBEYXRhIG9mIHRoZSBlbGVtZW50J3MgY29udGVudCByZWN0YW5nbGUuXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIFJlc2l6ZU9ic2VydmVyRW50cnkodGFyZ2V0LCByZWN0SW5pdCkge1xyXG4gICAgICAgIHZhciBjb250ZW50UmVjdCA9IGNyZWF0ZVJlYWRPbmx5UmVjdChyZWN0SW5pdCk7XHJcbiAgICAgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBub3Qgd3JpdGFibGVcclxuICAgICAgICAvLyBhbmQgYXJlIGFsc28gbm90IGVudW1lcmFibGUgaW4gdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbi5cclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIFByb3BlcnR5IGFjY2Vzc29ycyBhcmUgbm90IGJlaW5nIHVzZWQgYXMgdGhleSdkIHJlcXVpcmUgdG8gZGVmaW5lIGFcclxuICAgICAgICAvLyBwcml2YXRlIFdlYWtNYXAgc3RvcmFnZSB3aGljaCBtYXkgY2F1c2UgbWVtb3J5IGxlYWtzIGluIGJyb3dzZXJzIHRoYXRcclxuICAgICAgICAvLyBkb24ndCBzdXBwb3J0IHRoaXMgdHlwZSBvZiBjb2xsZWN0aW9ucy5cclxuICAgICAgICBkZWZpbmVDb25maWd1cmFibGUodGhpcywgeyB0YXJnZXQ6IHRhcmdldCwgY29udGVudFJlY3Q6IGNvbnRlbnRSZWN0IH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFJlc2l6ZU9ic2VydmVyRW50cnk7XHJcbn0oKSk7XG5cbnZhciBSZXNpemVPYnNlcnZlclNQSSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBSZXNpemVPYnNlcnZlci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1Jlc2l6ZU9ic2VydmVyQ2FsbGJhY2t9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkXHJcbiAgICAgKiAgICAgIHdoZW4gb25lIG9mIHRoZSBvYnNlcnZlZCBlbGVtZW50cyBjaGFuZ2VzIGl0J3MgY29udGVudCBkaW1lbnNpb25zLlxyXG4gICAgICogQHBhcmFtIHtSZXNpemVPYnNlcnZlckNvbnRyb2xsZXJ9IGNvbnRyb2xsZXIgLSBDb250cm9sbGVyIGluc3RhbmNlIHdoaWNoXHJcbiAgICAgKiAgICAgIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgdXBkYXRlcyBvZiBvYnNlcnZlci5cclxuICAgICAqIEBwYXJhbSB7UmVzaXplT2JzZXJ2ZXJ9IGNhbGxiYWNrQ3R4IC0gUmVmZXJlbmNlIHRvIHRoZSBwdWJsaWNcclxuICAgICAqICAgICAgUmVzaXplT2JzZXJ2ZXIgaW5zdGFuY2Ugd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gY2FsbGJhY2sgZnVuY3Rpb24uXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIFJlc2l6ZU9ic2VydmVyU1BJKGNhbGxiYWNrLCBjb250cm9sbGVyLCBjYWxsYmFja0N0eCkge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIENvbGxlY3Rpb24gb2YgcmVzaXplIG9ic2VydmF0aW9ucyB0aGF0IGhhdmUgZGV0ZWN0ZWQgY2hhbmdlcyBpbiBkaW1lbnNpb25zXHJcbiAgICAgICAgICogb2YgZWxlbWVudHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcHJpdmF0ZSB7QXJyYXk8UmVzaXplT2JzZXJ2YXRpb24+fVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYWN0aXZlT2JzZXJ2YXRpb25zXyA9IFtdO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFJlZ2lzdHJ5IG9mIHRoZSBSZXNpemVPYnNlcnZhdGlvbiBpbnN0YW5jZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcHJpdmF0ZSB7TWFwPEVsZW1lbnQsIFJlc2l6ZU9ic2VydmF0aW9uPn1cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9ic2VydmF0aW9uc18gPSBuZXcgTWFwU2hpbSgpO1xyXG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGNhbGxiYWNrIHByb3ZpZGVkIGFzIHBhcmFtZXRlciAxIGlzIG5vdCBhIGZ1bmN0aW9uLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNhbGxiYWNrXyA9IGNhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMuY29udHJvbGxlcl8gPSBjb250cm9sbGVyO1xyXG4gICAgICAgIHRoaXMuY2FsbGJhY2tDdHhfID0gY2FsbGJhY2tDdHg7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFN0YXJ0cyBvYnNlcnZpbmcgcHJvdmlkZWQgZWxlbWVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgdG8gYmUgb2JzZXJ2ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJTUEkucHJvdG90eXBlLm9ic2VydmUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XHJcbiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJzEgYXJndW1lbnQgcmVxdWlyZWQsIGJ1dCBvbmx5IDAgcHJlc2VudC4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRG8gbm90aGluZyBpZiBjdXJyZW50IGVudmlyb25tZW50IGRvZXNuJ3QgaGF2ZSB0aGUgRWxlbWVudCBpbnRlcmZhY2UuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBFbGVtZW50ID09PSAndW5kZWZpbmVkJyB8fCAhKEVsZW1lbnQgaW5zdGFuY2VvZiBPYmplY3QpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgZ2V0V2luZG93T2YodGFyZ2V0KS5FbGVtZW50KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXJhbWV0ZXIgMSBpcyBub3Qgb2YgdHlwZSBcIkVsZW1lbnRcIi4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG9ic2VydmF0aW9ucyA9IHRoaXMub2JzZXJ2YXRpb25zXztcclxuICAgICAgICAvLyBEbyBub3RoaW5nIGlmIGVsZW1lbnQgaXMgYWxyZWFkeSBiZWluZyBvYnNlcnZlZC5cclxuICAgICAgICBpZiAob2JzZXJ2YXRpb25zLmhhcyh0YXJnZXQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb2JzZXJ2YXRpb25zLnNldCh0YXJnZXQsIG5ldyBSZXNpemVPYnNlcnZhdGlvbih0YXJnZXQpKTtcclxuICAgICAgICB0aGlzLmNvbnRyb2xsZXJfLmFkZE9ic2VydmVyKHRoaXMpO1xyXG4gICAgICAgIC8vIEZvcmNlIHRoZSB1cGRhdGUgb2Ygb2JzZXJ2YXRpb25zLlxyXG4gICAgICAgIHRoaXMuY29udHJvbGxlcl8ucmVmcmVzaCgpO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogU3RvcHMgb2JzZXJ2aW5nIHByb3ZpZGVkIGVsZW1lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgLSBFbGVtZW50IHRvIHN0b3Agb2JzZXJ2aW5nLlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIFJlc2l6ZU9ic2VydmVyU1BJLnByb3RvdHlwZS51bm9ic2VydmUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XHJcbiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJzEgYXJndW1lbnQgcmVxdWlyZWQsIGJ1dCBvbmx5IDAgcHJlc2VudC4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRG8gbm90aGluZyBpZiBjdXJyZW50IGVudmlyb25tZW50IGRvZXNuJ3QgaGF2ZSB0aGUgRWxlbWVudCBpbnRlcmZhY2UuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBFbGVtZW50ID09PSAndW5kZWZpbmVkJyB8fCAhKEVsZW1lbnQgaW5zdGFuY2VvZiBPYmplY3QpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgZ2V0V2luZG93T2YodGFyZ2V0KS5FbGVtZW50KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXJhbWV0ZXIgMSBpcyBub3Qgb2YgdHlwZSBcIkVsZW1lbnRcIi4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG9ic2VydmF0aW9ucyA9IHRoaXMub2JzZXJ2YXRpb25zXztcclxuICAgICAgICAvLyBEbyBub3RoaW5nIGlmIGVsZW1lbnQgaXMgbm90IGJlaW5nIG9ic2VydmVkLlxyXG4gICAgICAgIGlmICghb2JzZXJ2YXRpb25zLmhhcyh0YXJnZXQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb2JzZXJ2YXRpb25zLmRlbGV0ZSh0YXJnZXQpO1xyXG4gICAgICAgIGlmICghb2JzZXJ2YXRpb25zLnNpemUpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyXy5yZW1vdmVPYnNlcnZlcih0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9wcyBvYnNlcnZpbmcgYWxsIGVsZW1lbnRzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICBSZXNpemVPYnNlcnZlclNQSS5wcm90b3R5cGUuZGlzY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmNsZWFyQWN0aXZlKCk7XHJcbiAgICAgICAgdGhpcy5vYnNlcnZhdGlvbnNfLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5jb250cm9sbGVyXy5yZW1vdmVPYnNlcnZlcih0aGlzKTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIENvbGxlY3RzIG9ic2VydmF0aW9uIGluc3RhbmNlcyB0aGUgYXNzb2NpYXRlZCBlbGVtZW50IG9mIHdoaWNoIGhhcyBjaGFuZ2VkXHJcbiAgICAgKiBpdCdzIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICBSZXNpemVPYnNlcnZlclNQSS5wcm90b3R5cGUuZ2F0aGVyQWN0aXZlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xyXG4gICAgICAgIHRoaXMub2JzZXJ2YXRpb25zXy5mb3JFYWNoKGZ1bmN0aW9uIChvYnNlcnZhdGlvbikge1xyXG4gICAgICAgICAgICBpZiAob2JzZXJ2YXRpb24uaXNBY3RpdmUoKSkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYWN0aXZlT2JzZXJ2YXRpb25zXy5wdXNoKG9ic2VydmF0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogSW52b2tlcyBpbml0aWFsIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggYSBsaXN0IG9mIFJlc2l6ZU9ic2VydmVyRW50cnlcclxuICAgICAqIGluc3RhbmNlcyBjb2xsZWN0ZWQgZnJvbSBhY3RpdmUgcmVzaXplIG9ic2VydmF0aW9ucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJTUEkucHJvdG90eXBlLmJyb2FkY2FzdEFjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAvLyBEbyBub3RoaW5nIGlmIG9ic2VydmVyIGRvZXNuJ3QgaGF2ZSBhY3RpdmUgb2JzZXJ2YXRpb25zLlxyXG4gICAgICAgIGlmICghdGhpcy5oYXNBY3RpdmUoKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBjdHggPSB0aGlzLmNhbGxiYWNrQ3R4XztcclxuICAgICAgICAvLyBDcmVhdGUgUmVzaXplT2JzZXJ2ZXJFbnRyeSBpbnN0YW5jZSBmb3IgZXZlcnkgYWN0aXZlIG9ic2VydmF0aW9uLlxyXG4gICAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5hY3RpdmVPYnNlcnZhdGlvbnNfLm1hcChmdW5jdGlvbiAob2JzZXJ2YXRpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNpemVPYnNlcnZlckVudHJ5KG9ic2VydmF0aW9uLnRhcmdldCwgb2JzZXJ2YXRpb24uYnJvYWRjYXN0UmVjdCgpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmNhbGxiYWNrXy5jYWxsKGN0eCwgZW50cmllcywgY3R4KTtcclxuICAgICAgICB0aGlzLmNsZWFyQWN0aXZlKCk7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgdGhlIGNvbGxlY3Rpb24gb2YgYWN0aXZlIG9ic2VydmF0aW9ucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJTUEkucHJvdG90eXBlLmNsZWFyQWN0aXZlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlT2JzZXJ2YXRpb25zXy5zcGxpY2UoMCk7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBUZWxscyB3aGV0aGVyIG9ic2VydmVyIGhhcyBhY3RpdmUgb2JzZXJ2YXRpb25zLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBSZXNpemVPYnNlcnZlclNQSS5wcm90b3R5cGUuaGFzQWN0aXZlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZU9ic2VydmF0aW9uc18ubGVuZ3RoID4gMDtcclxuICAgIH07XHJcbiAgICByZXR1cm4gUmVzaXplT2JzZXJ2ZXJTUEk7XHJcbn0oKSk7XG5cbi8vIFJlZ2lzdHJ5IG9mIGludGVybmFsIG9ic2VydmVycy4gSWYgV2Vha01hcCBpcyBub3QgYXZhaWxhYmxlIHVzZSBjdXJyZW50IHNoaW1cclxuLy8gZm9yIHRoZSBNYXAgY29sbGVjdGlvbiBhcyBpdCBoYXMgYWxsIHJlcXVpcmVkIG1ldGhvZHMgYW5kIGJlY2F1c2UgV2Vha01hcFxyXG4vLyBjYW4ndCBiZSBmdWxseSBwb2x5ZmlsbGVkIGFueXdheS5cclxudmFyIG9ic2VydmVycyA9IHR5cGVvZiBXZWFrTWFwICE9PSAndW5kZWZpbmVkJyA/IG5ldyBXZWFrTWFwKCkgOiBuZXcgTWFwU2hpbSgpO1xyXG4vKipcclxuICogUmVzaXplT2JzZXJ2ZXIgQVBJLiBFbmNhcHN1bGF0ZXMgdGhlIFJlc2l6ZU9ic2VydmVyIFNQSSBpbXBsZW1lbnRhdGlvblxyXG4gKiBleHBvc2luZyBvbmx5IHRob3NlIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgc3BlYy5cclxuICovXHJcbnZhciBSZXNpemVPYnNlcnZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBSZXNpemVPYnNlcnZlci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1Jlc2l6ZU9ic2VydmVyQ2FsbGJhY2t9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIHdoZW5cclxuICAgICAqICAgICAgZGltZW5zaW9ucyBvZiB0aGUgb2JzZXJ2ZWQgZWxlbWVudHMgY2hhbmdlLlxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBSZXNpemVPYnNlcnZlcihjYWxsYmFjaykge1xyXG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZXNpemVPYnNlcnZlcikpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignMSBhcmd1bWVudCByZXF1aXJlZCwgYnV0IG9ubHkgMCBwcmVzZW50LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgY29udHJvbGxlciA9IFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICAgIHZhciBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlclNQSShjYWxsYmFjaywgY29udHJvbGxlciwgdGhpcyk7XHJcbiAgICAgICAgb2JzZXJ2ZXJzLnNldCh0aGlzLCBvYnNlcnZlcik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gUmVzaXplT2JzZXJ2ZXI7XHJcbn0oKSk7XHJcbi8vIEV4cG9zZSBwdWJsaWMgbWV0aG9kcyBvZiBSZXNpemVPYnNlcnZlci5cclxuW1xyXG4gICAgJ29ic2VydmUnLFxyXG4gICAgJ3Vub2JzZXJ2ZScsXHJcbiAgICAnZGlzY29ubmVjdCdcclxuXS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHtcclxuICAgIFJlc2l6ZU9ic2VydmVyLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICByZXR1cm4gKF9hID0gb2JzZXJ2ZXJzLmdldCh0aGlzKSlbbWV0aG9kXS5hcHBseShfYSwgYXJndW1lbnRzKTtcclxuICAgIH07XHJcbn0pO1xuXG52YXIgaW5kZXggPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgLy8gRXhwb3J0IGV4aXN0aW5nIGltcGxlbWVudGF0aW9uIGlmIGF2YWlsYWJsZS5cclxuICAgIGlmICh0eXBlb2YgZ2xvYmFsJDEuUmVzaXplT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIGdsb2JhbCQxLlJlc2l6ZU9ic2VydmVyO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFJlc2l6ZU9ic2VydmVyO1xyXG59KSgpO1xuXG5leHBvcnQgZGVmYXVsdCBpbmRleDtcbiIsImltcG9ydCBSZXNpemVPYnNlcnZlciBmcm9tICdyZXNpemUtb2JzZXJ2ZXItcG9seWZpbGwnO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb25zdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG52YXIgZWxlbWVudExpc3RlbmVycyA9IG5ldyBNYXAoKTtcbmZ1bmN0aW9uIG9uUmVzaXplKGVudGl0aWVzKSB7XG4gIGVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgIHZhciBfZWxlbWVudExpc3RlbmVycyRnZXQ7XG4gICAgdmFyIHRhcmdldCA9IGVudGl0eS50YXJnZXQ7XG4gICAgKF9lbGVtZW50TGlzdGVuZXJzJGdldCA9IGVsZW1lbnRMaXN0ZW5lcnMuZ2V0KHRhcmdldCkpID09PSBudWxsIHx8IF9lbGVtZW50TGlzdGVuZXJzJGdldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2VsZW1lbnRMaXN0ZW5lcnMkZ2V0LmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gbGlzdGVuZXIodGFyZ2V0KTtcbiAgICB9KTtcbiAgfSk7XG59XG4vLyBOb3RlOiBSZXNpemVPYnNlcnZlciBwb2x5ZmlsbCBub3Qgc3VwcG9ydCBvcHRpb24gdG8gbWVhc3VyZSBib3JkZXItYm94IHJlc2l6ZVxudmFyIHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKG9uUmVzaXplKTtcbi8vIERldiBlbnYgb25seVxuZXhwb3J0IHZhciBfZWwgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gZWxlbWVudExpc3RlbmVycyA6IG51bGw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbmV4cG9ydCB2YXIgX3JzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IG9uUmVzaXplIDogbnVsbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE9ic2VydmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZShlbGVtZW50LCBjYWxsYmFjaykge1xuICBpZiAoIWVsZW1lbnRMaXN0ZW5lcnMuaGFzKGVsZW1lbnQpKSB7XG4gICAgZWxlbWVudExpc3RlbmVycy5zZXQoZWxlbWVudCwgbmV3IFNldCgpKTtcbiAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQpO1xuICB9XG4gIGVsZW1lbnRMaXN0ZW5lcnMuZ2V0KGVsZW1lbnQpLmFkZChjYWxsYmFjayk7XG59XG5leHBvcnQgZnVuY3Rpb24gdW5vYnNlcnZlKGVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gIGlmIChlbGVtZW50TGlzdGVuZXJzLmhhcyhlbGVtZW50KSkge1xuICAgIGVsZW1lbnRMaXN0ZW5lcnMuZ2V0KGVsZW1lbnQpLmRlbGV0ZShjYWxsYmFjayk7XG4gICAgaWYgKCFlbGVtZW50TGlzdGVuZXJzLmdldChlbGVtZW50KS5zaXplKSB7XG4gICAgICByZXNpemVPYnNlcnZlci51bm9ic2VydmUoZWxlbWVudCk7XG4gICAgICBlbGVtZW50TGlzdGVuZXJzLmRlbGV0ZShlbGVtZW50KTtcbiAgICB9XG4gIH1cbn0iLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBGYWxsYmFjayB0byBmaW5kRE9NTm9kZSBpZiBvcmlnaW4gcmVmIGRvIG5vdCBwcm92aWRlIGFueSBkb20gZWxlbWVudFxuICovXG52YXIgRG9tV3JhcHBlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoRG9tV3JhcHBlciwgX1JlYWN0JENvbXBvbmVudCk7XG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoRG9tV3JhcHBlcik7XG4gIGZ1bmN0aW9uIERvbVdyYXBwZXIoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERvbVdyYXBwZXIpO1xuICAgIHJldHVybiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoRG9tV3JhcHBlciwgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gRG9tV3JhcHBlcjtcbn0oUmVhY3QuQ29tcG9uZW50KTtcbmV4cG9ydCB7IERvbVdyYXBwZXIgYXMgZGVmYXVsdCB9OyIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LWpzeC1ydW50aW1lLnByb2R1Y3Rpb24ubWluLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbid1c2Ugc3RyaWN0Jzt2YXIgZj1yZXF1aXJlKFwicmVhY3RcIiksaz1TeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKSxsPVN5bWJvbC5mb3IoXCJyZWFjdC5mcmFnbWVudFwiKSxtPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksbj1mLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVELlJlYWN0Q3VycmVudE93bmVyLHA9e2tleTohMCxyZWY6ITAsX19zZWxmOiEwLF9fc291cmNlOiEwfTtcbmZ1bmN0aW9uIHEoYyxhLGcpe3ZhciBiLGQ9e30sZT1udWxsLGg9bnVsbDt2b2lkIDAhPT1nJiYoZT1cIlwiK2cpO3ZvaWQgMCE9PWEua2V5JiYoZT1cIlwiK2Eua2V5KTt2b2lkIDAhPT1hLnJlZiYmKGg9YS5yZWYpO2ZvcihiIGluIGEpbS5jYWxsKGEsYikmJiFwLmhhc093blByb3BlcnR5KGIpJiYoZFtiXT1hW2JdKTtpZihjJiZjLmRlZmF1bHRQcm9wcylmb3IoYiBpbiBhPWMuZGVmYXVsdFByb3BzLGEpdm9pZCAwPT09ZFtiXSYmKGRbYl09YVtiXSk7cmV0dXJueyQkdHlwZW9mOmssdHlwZTpjLGtleTplLHJlZjpoLHByb3BzOmQsX293bmVyOm4uY3VycmVudH19ZXhwb3J0cy5GcmFnbWVudD1sO2V4cG9ydHMuanN4PXE7ZXhwb3J0cy5qc3hzPXE7XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtanN4LXJ1bnRpbWUucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtanN4LXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCB2YXIgQ29sbGVjdGlvbkNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbi8qKlxuICogQ29sbGVjdCBhbGwgdGhlIHJlc2l6ZSBldmVudCBmcm9tIGNoaWxkcmVuIFJlc2l6ZU9ic2VydmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2xsZWN0aW9uKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBvbkJhdGNoUmVzaXplID0gX3JlZi5vbkJhdGNoUmVzaXplO1xuICB2YXIgcmVzaXplSWRSZWYgPSBSZWFjdC51c2VSZWYoMCk7XG4gIHZhciByZXNpemVJbmZvc1JlZiA9IFJlYWN0LnVzZVJlZihbXSk7XG4gIHZhciBvbkNvbGxlY3Rpb25SZXNpemUgPSBSZWFjdC51c2VDb250ZXh0KENvbGxlY3Rpb25Db250ZXh0KTtcbiAgdmFyIG9uUmVzaXplID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHNpemUsIGVsZW1lbnQsIGRhdGEpIHtcbiAgICByZXNpemVJZFJlZi5jdXJyZW50ICs9IDE7XG4gICAgdmFyIGN1cnJlbnRJZCA9IHJlc2l6ZUlkUmVmLmN1cnJlbnQ7XG4gICAgcmVzaXplSW5mb3NSZWYuY3VycmVudC5wdXNoKHtcbiAgICAgIHNpemU6IHNpemUsXG4gICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgZGF0YTogZGF0YVxuICAgIH0pO1xuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGN1cnJlbnRJZCA9PT0gcmVzaXplSWRSZWYuY3VycmVudCkge1xuICAgICAgICBvbkJhdGNoUmVzaXplID09PSBudWxsIHx8IG9uQmF0Y2hSZXNpemUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQmF0Y2hSZXNpemUocmVzaXplSW5mb3NSZWYuY3VycmVudCk7XG4gICAgICAgIHJlc2l6ZUluZm9zUmVmLmN1cnJlbnQgPSBbXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBDb250aW51ZSBidWJibGluZyBpZiBwYXJlbnQgZXhpc3RcbiAgICBvbkNvbGxlY3Rpb25SZXNpemUgPT09IG51bGwgfHwgb25Db2xsZWN0aW9uUmVzaXplID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNvbGxlY3Rpb25SZXNpemUoc2l6ZSwgZWxlbWVudCwgZGF0YSk7XG4gIH0sIFtvbkJhdGNoUmVzaXplLCBvbkNvbGxlY3Rpb25SZXNpemVdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbGxlY3Rpb25Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IG9uUmVzaXplXG4gIH0sIGNoaWxkcmVuKTtcbn0iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IHsgY29tcG9zZVJlZiwgc3VwcG9ydFJlZiB9IGZyb20gXCJyYy11dGlsL2VzL3JlZlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGZpbmRET01Ob2RlIGZyb20gXCJyYy11dGlsL2VzL0RvbS9maW5kRE9NTm9kZVwiO1xuaW1wb3J0IHsgb2JzZXJ2ZSwgdW5vYnNlcnZlIH0gZnJvbSAnLi4vdXRpbHMvb2JzZXJ2ZXJVdGlsJztcbmltcG9ydCBEb21XcmFwcGVyIGZyb20gJy4vRG9tV3JhcHBlcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uQ29udGV4dCB9IGZyb20gJy4uL0NvbGxlY3Rpb24nO1xuZnVuY3Rpb24gU2luZ2xlT2JzZXJ2ZXIocHJvcHMsIHJlZikge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkO1xuICB2YXIgZWxlbWVudFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIHdyYXBwZXJSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBvbkNvbGxlY3Rpb25SZXNpemUgPSBSZWFjdC51c2VDb250ZXh0KENvbGxlY3Rpb25Db250ZXh0KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IENoaWxkcmVuID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZW5kZXJQcm9wcyA9IHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJztcbiAgdmFyIG1lcmdlZENoaWxkcmVuID0gaXNSZW5kZXJQcm9wcyA/IGNoaWxkcmVuKGVsZW1lbnRSZWYpIDogY2hpbGRyZW47XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNpemUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHNpemVSZWYgPSBSZWFjdC51c2VSZWYoe1xuICAgIHdpZHRoOiAtMSxcbiAgICBoZWlnaHQ6IC0xLFxuICAgIG9mZnNldFdpZHRoOiAtMSxcbiAgICBvZmZzZXRIZWlnaHQ6IC0xXG4gIH0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWYgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBjYW5SZWYgPSAhaXNSZW5kZXJQcm9wcyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQobWVyZ2VkQ2hpbGRyZW4pICYmIHN1cHBvcnRSZWYobWVyZ2VkQ2hpbGRyZW4pO1xuICB2YXIgb3JpZ2luUmVmID0gY2FuUmVmID8gbWVyZ2VkQ2hpbGRyZW4ucmVmIDogbnVsbDtcbiAgdmFyIG1lcmdlZFJlZiA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjb21wb3NlUmVmKG9yaWdpblJlZiwgZWxlbWVudFJlZik7XG4gIH0sIFtvcmlnaW5SZWYsIGVsZW1lbnRSZWZdKTtcbiAgdmFyIGdldERvbSA9IGZ1bmN0aW9uIGdldERvbSgpIHtcbiAgICByZXR1cm4gZmluZERPTU5vZGUoZWxlbWVudFJlZi5jdXJyZW50KSB8fCBmaW5kRE9NTm9kZSh3cmFwcGVyUmVmLmN1cnJlbnQpO1xuICB9O1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXREb20oKTtcbiAgfSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBPYnNlcnZlID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHByb3BzUmVmID0gUmVhY3QudXNlUmVmKHByb3BzKTtcbiAgcHJvcHNSZWYuY3VycmVudCA9IHByb3BzO1xuICAvLyBIYW5kbGVyXG4gIHZhciBvbkludGVybmFsUmVzaXplID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIHZhciBfcHJvcHNSZWYkY3VycmVudCA9IHByb3BzUmVmLmN1cnJlbnQsXG4gICAgICBvblJlc2l6ZSA9IF9wcm9wc1JlZiRjdXJyZW50Lm9uUmVzaXplLFxuICAgICAgZGF0YSA9IF9wcm9wc1JlZiRjdXJyZW50LmRhdGE7XG4gICAgdmFyIF90YXJnZXQkZ2V0Qm91bmRpbmdDbCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgIHdpZHRoID0gX3RhcmdldCRnZXRCb3VuZGluZ0NsLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gX3RhcmdldCRnZXRCb3VuZGluZ0NsLmhlaWdodDtcbiAgICB2YXIgb2Zmc2V0V2lkdGggPSB0YXJnZXQub2Zmc2V0V2lkdGgsXG4gICAgICBvZmZzZXRIZWlnaHQgPSB0YXJnZXQub2Zmc2V0SGVpZ2h0O1xuICAgIC8qKlxuICAgICAqIFJlc2l6ZSBvYnNlcnZlciB0cmlnZ2VyIHdoZW4gY29udGVudCBzaXplIGNoYW5nZWQuXG4gICAgICogSW4gbW9zdCBjYXNlIHdlIGp1c3QgY2FyZSBhYm91dCBlbGVtZW50IHNpemUsXG4gICAgICogbGV0J3MgdXNlIGBib3VuZGFyeWAgaW5zdGVhZCBvZiBgY29udGVudFJlY3RgIGhlcmUgdG8gYXZvaWQgc2hha2luZy5cbiAgICAgKi9cbiAgICB2YXIgZml4ZWRXaWR0aCA9IE1hdGguZmxvb3Iod2lkdGgpO1xuICAgIHZhciBmaXhlZEhlaWdodCA9IE1hdGguZmxvb3IoaGVpZ2h0KTtcbiAgICBpZiAoc2l6ZVJlZi5jdXJyZW50LndpZHRoICE9PSBmaXhlZFdpZHRoIHx8IHNpemVSZWYuY3VycmVudC5oZWlnaHQgIT09IGZpeGVkSGVpZ2h0IHx8IHNpemVSZWYuY3VycmVudC5vZmZzZXRXaWR0aCAhPT0gb2Zmc2V0V2lkdGggfHwgc2l6ZVJlZi5jdXJyZW50Lm9mZnNldEhlaWdodCAhPT0gb2Zmc2V0SGVpZ2h0KSB7XG4gICAgICB2YXIgc2l6ZSA9IHtcbiAgICAgICAgd2lkdGg6IGZpeGVkV2lkdGgsXG4gICAgICAgIGhlaWdodDogZml4ZWRIZWlnaHQsXG4gICAgICAgIG9mZnNldFdpZHRoOiBvZmZzZXRXaWR0aCxcbiAgICAgICAgb2Zmc2V0SGVpZ2h0OiBvZmZzZXRIZWlnaHRcbiAgICAgIH07XG4gICAgICBzaXplUmVmLmN1cnJlbnQgPSBzaXplO1xuICAgICAgLy8gSUUgaXMgc3RyYW5nZSwgcmlnaHQ/XG4gICAgICB2YXIgbWVyZ2VkT2Zmc2V0V2lkdGggPSBvZmZzZXRXaWR0aCA9PT0gTWF0aC5yb3VuZCh3aWR0aCkgPyB3aWR0aCA6IG9mZnNldFdpZHRoO1xuICAgICAgdmFyIG1lcmdlZE9mZnNldEhlaWdodCA9IG9mZnNldEhlaWdodCA9PT0gTWF0aC5yb3VuZChoZWlnaHQpID8gaGVpZ2h0IDogb2Zmc2V0SGVpZ2h0O1xuICAgICAgdmFyIHNpemVJbmZvID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzaXplKSwge30sIHtcbiAgICAgICAgb2Zmc2V0V2lkdGg6IG1lcmdlZE9mZnNldFdpZHRoLFxuICAgICAgICBvZmZzZXRIZWlnaHQ6IG1lcmdlZE9mZnNldEhlaWdodFxuICAgICAgfSk7XG4gICAgICAvLyBMZXQgY29sbGVjdGlvbiBrbm93IHdoYXQgaGFwcGVuZWRcbiAgICAgIG9uQ29sbGVjdGlvblJlc2l6ZSA9PT0gbnVsbCB8fCBvbkNvbGxlY3Rpb25SZXNpemUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ29sbGVjdGlvblJlc2l6ZShzaXplSW5mbywgdGFyZ2V0LCBkYXRhKTtcbiAgICAgIGlmIChvblJlc2l6ZSkge1xuICAgICAgICAvLyBkZWZlciB0aGUgY2FsbGJhY2sgYnV0IG5vdCBkZWZlciB0byBuZXh0IGZyYW1lXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIG9uUmVzaXplKHNpemVJbmZvLCB0YXJnZXQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtdKTtcbiAgLy8gRHluYW1pYyBvYnNlcnZlXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGN1cnJlbnRFbGVtZW50ID0gZ2V0RG9tKCk7XG4gICAgaWYgKGN1cnJlbnRFbGVtZW50ICYmICFkaXNhYmxlZCkge1xuICAgICAgb2JzZXJ2ZShjdXJyZW50RWxlbWVudCwgb25JbnRlcm5hbFJlc2l6ZSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdW5vYnNlcnZlKGN1cnJlbnRFbGVtZW50LCBvbkludGVybmFsUmVzaXplKTtcbiAgICB9O1xuICB9LCBbZWxlbWVudFJlZi5jdXJyZW50LCBkaXNhYmxlZF0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEb21XcmFwcGVyLCB7XG4gICAgcmVmOiB3cmFwcGVyUmVmXG4gIH0sIGNhblJlZiA/IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQobWVyZ2VkQ2hpbGRyZW4sIHtcbiAgICByZWY6IG1lcmdlZFJlZlxuICB9KSA6IG1lcmdlZENoaWxkcmVuKTtcbn1cbnZhciBSZWZTaW5nbGVPYnNlcnZlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFNpbmdsZU9ic2VydmVyKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlZlNpbmdsZU9ic2VydmVyLmRpc3BsYXlOYW1lID0gJ1NpbmdsZU9ic2VydmVyJztcbn1cbmV4cG9ydCBkZWZhdWx0IFJlZlNpbmdsZU9ic2VydmVyOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHRvQXJyYXkgZnJvbSBcInJjLXV0aWwvZXMvQ2hpbGRyZW4vdG9BcnJheVwiO1xuaW1wb3J0IHsgd2FybmluZyB9IGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmltcG9ydCBTaW5nbGVPYnNlcnZlciBmcm9tICcuL1NpbmdsZU9ic2VydmVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICcuL0NvbGxlY3Rpb24nO1xudmFyIElOVEVSTkFMX1BSRUZJWF9LRVkgPSAncmMtb2JzZXJ2ZXIta2V5JztcbmltcG9ydCB7IF9ycyB9IGZyb20gJy4vdXRpbHMvb2JzZXJ2ZXJVdGlsJztcbmV4cG9ydCB7IC8qKiBAcHJpdmF0ZSBUZXN0IG9ubHkgZm9yIG1vY2sgdHJpZ2dlciByZXNpemUgZXZlbnQgKi9cbl9ycyB9O1xuZnVuY3Rpb24gUmVzaXplT2JzZXJ2ZXIocHJvcHMsIHJlZikge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcbiAgdmFyIGNoaWxkTm9kZXMgPSB0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicgPyBbY2hpbGRyZW5dIDogdG9BcnJheShjaGlsZHJlbik7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKGNoaWxkTm9kZXMubGVuZ3RoID4gMSkge1xuICAgICAgd2FybmluZyhmYWxzZSwgJ0ZpbmQgbW9yZSB0aGFuIG9uZSBjaGlsZCBub2RlIHdpdGggYGNoaWxkcmVuYCBpbiBSZXNpemVPYnNlcnZlci4gUGxlYXNlIHVzZSBSZXNpemVPYnNlcnZlci5Db2xsZWN0aW9uIGluc3RlYWQuJyk7XG4gICAgfSBlbHNlIGlmIChjaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgd2FybmluZyhmYWxzZSwgJ2BjaGlsZHJlbmAgb2YgUmVzaXplT2JzZXJ2ZXIgaXMgZW1wdHkuIE5vdGhpbmcgaXMgaW4gb2JzZXJ2ZS4nKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkTm9kZXMubWFwKGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICB2YXIga2V5ID0gKGNoaWxkID09PSBudWxsIHx8IGNoaWxkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGlsZC5rZXkpIHx8IFwiXCIuY29uY2F0KElOVEVSTkFMX1BSRUZJWF9LRVksIFwiLVwiKS5jb25jYXQoaW5kZXgpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTaW5nbGVPYnNlcnZlciwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICBrZXk6IGtleSxcbiAgICAgIHJlZjogaW5kZXggPT09IDAgPyByZWYgOiB1bmRlZmluZWRcbiAgICB9KSwgY2hpbGQpO1xuICB9KTtcbn1cbnZhciBSZWZSZXNpemVPYnNlcnZlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFJlc2l6ZU9ic2VydmVyKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlZlJlc2l6ZU9ic2VydmVyLmRpc3BsYXlOYW1lID0gJ1Jlc2l6ZU9ic2VydmVyJztcbn1cblJlZlJlc2l6ZU9ic2VydmVyLkNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uO1xuZXhwb3J0IGRlZmF1bHQgUmVmUmVzaXplT2JzZXJ2ZXI7IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG9taXQob2JqLCBmaWVsZHMpIHtcbiAgdmFyIGNsb25lID0gX29iamVjdFNwcmVhZCh7fSwgb2JqKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGRzKSkge1xuICAgIGZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGRlbGV0ZSBjbG9uZVtrZXldO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBjbG9uZTtcbn0iLCJpbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xudmFyIEljb25Db250ZXh0ID0gLyojX19QVVJFX18qL2NyZWF0ZUNvbnRleHQoe30pO1xuZXhwb3J0IGRlZmF1bHQgSWNvbkNvbnRleHQ7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gIHZhciBrZXksIGk7XG4gIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0gc291cmNlS2V5c1tpXTtcbiAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn0iLCJpbXBvcnQgb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBmcm9tIFwiLi9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgdmFyIHRhcmdldCA9IG9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7XG4gIHZhciBrZXksIGk7XG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7XG4gICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07XG4gICAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTtcbiAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiB0YXJnZXQ7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTtcbiAgcmV0dXJuIGFycjI7XG59IiwiaW1wb3J0IGFycmF5TGlrZVRvQXJyYXkgZnJvbSBcIi4vYXJyYXlMaWtlVG9BcnJheS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShhcnIpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikge1xuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyW1wiQEBpdGVyYXRvclwiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTtcbn0iLCJpbXBvcnQgYXJyYXlMaWtlVG9BcnJheSBmcm9tIFwiLi9hcnJheUxpa2VUb0FycmF5LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7XG4gIGlmICghbykgcmV0dXJuO1xuICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59IiwiaW1wb3J0IGFycmF5V2l0aG91dEhvbGVzIGZyb20gXCIuL2FycmF5V2l0aG91dEhvbGVzLmpzXCI7XG5pbXBvcnQgaXRlcmFibGVUb0FycmF5IGZyb20gXCIuL2l0ZXJhYmxlVG9BcnJheS5qc1wiO1xuaW1wb3J0IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IGZyb20gXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzXCI7XG5pbXBvcnQgbm9uSXRlcmFibGVTcHJlYWQgZnJvbSBcIi4vbm9uSXRlcmFibGVTcHJlYWQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIGFycmF5V2l0aG91dEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5KGFycikgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBub25JdGVyYWJsZVNwcmVhZCgpO1xufSIsImltcG9ydCB3YXJuaW5nIGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCB2YXIgSE9PS19NQVJLID0gJ1JDX0ZPUk1fSU5URVJOQUxfSE9PS1MnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbnZhciB3YXJuaW5nRnVuYyA9IGZ1bmN0aW9uIHdhcm5pbmdGdW5jKCkge1xuICB3YXJuaW5nKGZhbHNlLCAnQ2FuIG5vdCBmaW5kIEZvcm1Db250ZXh0LiBQbGVhc2UgbWFrZSBzdXJlIHlvdSB3cmFwIEZpZWxkIHVuZGVyIEZvcm0uJyk7XG59O1xudmFyIENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIGdldEZpZWxkVmFsdWU6IHdhcm5pbmdGdW5jLFxuICBnZXRGaWVsZHNWYWx1ZTogd2FybmluZ0Z1bmMsXG4gIGdldEZpZWxkRXJyb3I6IHdhcm5pbmdGdW5jLFxuICBnZXRGaWVsZFdhcm5pbmc6IHdhcm5pbmdGdW5jLFxuICBnZXRGaWVsZHNFcnJvcjogd2FybmluZ0Z1bmMsXG4gIGlzRmllbGRzVG91Y2hlZDogd2FybmluZ0Z1bmMsXG4gIGlzRmllbGRUb3VjaGVkOiB3YXJuaW5nRnVuYyxcbiAgaXNGaWVsZFZhbGlkYXRpbmc6IHdhcm5pbmdGdW5jLFxuICBpc0ZpZWxkc1ZhbGlkYXRpbmc6IHdhcm5pbmdGdW5jLFxuICByZXNldEZpZWxkczogd2FybmluZ0Z1bmMsXG4gIHNldEZpZWxkczogd2FybmluZ0Z1bmMsXG4gIHNldEZpZWxkVmFsdWU6IHdhcm5pbmdGdW5jLFxuICBzZXRGaWVsZHNWYWx1ZTogd2FybmluZ0Z1bmMsXG4gIHZhbGlkYXRlRmllbGRzOiB3YXJuaW5nRnVuYyxcbiAgc3VibWl0OiB3YXJuaW5nRnVuYyxcbiAgZ2V0SW50ZXJuYWxIb29rczogZnVuY3Rpb24gZ2V0SW50ZXJuYWxIb29rcygpIHtcbiAgICB3YXJuaW5nRnVuYygpO1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwYXRjaDogd2FybmluZ0Z1bmMsXG4gICAgICBpbml0RW50aXR5VmFsdWU6IHdhcm5pbmdGdW5jLFxuICAgICAgcmVnaXN0ZXJGaWVsZDogd2FybmluZ0Z1bmMsXG4gICAgICB1c2VTdWJzY3JpYmU6IHdhcm5pbmdGdW5jLFxuICAgICAgc2V0SW5pdGlhbFZhbHVlczogd2FybmluZ0Z1bmMsXG4gICAgICBkZXN0cm95Rm9ybTogd2FybmluZ0Z1bmMsXG4gICAgICBzZXRDYWxsYmFja3M6IHdhcm5pbmdGdW5jLFxuICAgICAgcmVnaXN0ZXJXYXRjaDogd2FybmluZ0Z1bmMsXG4gICAgICBnZXRGaWVsZHM6IHdhcm5pbmdGdW5jLFxuICAgICAgc2V0VmFsaWRhdGVNZXNzYWdlczogd2FybmluZ0Z1bmMsXG4gICAgICBzZXRQcmVzZXJ2ZTogd2FybmluZ0Z1bmMsXG4gICAgICBnZXRJbml0aWFsVmFsdWU6IHdhcm5pbmdGdW5jXG4gICAgfTtcbiAgfVxufSk7XG5leHBvcnQgZGVmYXVsdCBDb250ZXh0OyIsImV4cG9ydCBmdW5jdGlvbiB0b0FycmF5KHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7XG4gIFwidXNlIHN0cmljdFwiOyAvKiEgcmVnZW5lcmF0b3ItcnVudGltZSAtLSBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4gLS0gbGljZW5zZSAoTUlUKTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2Jsb2IvbWFpbi9MSUNFTlNFICovXG4gIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSBmdW5jdGlvbiBfcmVnZW5lcmF0b3JSdW50aW1lKCkge1xuICAgIHJldHVybiBleHBvcnRzO1xuICB9O1xuICB2YXIgZXhwb3J0cyA9IHt9LFxuICAgIE9wID0gT2JqZWN0LnByb3RvdHlwZSxcbiAgICBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eSxcbiAgICBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBmdW5jdGlvbiAob2JqLCBrZXksIGRlc2MpIHtcbiAgICAgIG9ialtrZXldID0gZGVzYy52YWx1ZTtcbiAgICB9LFxuICAgICRTeW1ib2wgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCA/IFN5bWJvbCA6IHt9LFxuICAgIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIixcbiAgICBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCIsXG4gICAgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuICBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwXG4gICAgfSksIG9ialtrZXldO1xuICB9XG4gIHRyeSB7XG4gICAgZGVmaW5lKHt9LCBcIlwiKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3IsXG4gICAgICBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSksXG4gICAgICBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eShnZW5lcmF0b3IsIFwiX2ludm9rZVwiLCB7XG4gICAgICB2YWx1ZTogbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KVxuICAgIH0pLCBnZW5lcmF0b3I7XG4gIH1cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwibm9ybWFsXCIsXG4gICAgICAgIGFyZzogZm4uY2FsbChvYmosIGFyZylcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcInRocm93XCIsXG4gICAgICAgIGFyZzogZXJyXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBleHBvcnRzLndyYXAgPSB3cmFwO1xuICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9O1xuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIGRlZmluZShJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSk7XG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZixcbiAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiYgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkgJiYgKEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUpO1xuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPSBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICBkZWZpbmUocHJvdG90eXBlLCBtZXRob2QsIGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvciwgUHJvbWlzZUltcGwpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAoXCJ0aHJvd1wiICE9PSByZWNvcmQudHlwZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZyxcbiAgICAgICAgICB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlICYmIFwib2JqZWN0XCIgPT0gX3R5cGVvZih2YWx1ZSkgJiYgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSA/IFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KSA6IFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24gKHVud3JhcHBlZCkge1xuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZCwgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gaW52b2tlKFwidGhyb3dcIiwgZXJyb3IsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgIH1cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuICAgIGRlZmluZVByb3BlcnR5KHRoaXMsIFwiX2ludm9rZVwiLCB7XG4gICAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUobWV0aG9kLCBhcmcpIHtcbiAgICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlSW1wbChmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9IHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLCBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZykgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoXCJleGVjdXRpbmdcIiA9PT0gc3RhdGUpIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICBpZiAoXCJjb21wbGV0ZWRcIiA9PT0gc3RhdGUpIHtcbiAgICAgICAgaWYgKFwidGhyb3dcIiA9PT0gbWV0aG9kKSB0aHJvdyBhcmc7XG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnRleHQubWV0aG9kID0gbWV0aG9kLCBjb250ZXh0LmFyZyA9IGFyZzs7KSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFwibmV4dFwiID09PSBjb250ZXh0Lm1ldGhvZCkgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO2Vsc2UgaWYgKFwidGhyb3dcIiA9PT0gY29udGV4dC5tZXRob2QpIHtcbiAgICAgICAgICBpZiAoXCJzdXNwZW5kZWRTdGFydFwiID09PSBzdGF0ZSkgdGhyb3cgc3RhdGUgPSBcImNvbXBsZXRlZFwiLCBjb250ZXh0LmFyZztcbiAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTtcbiAgICAgICAgfSBlbHNlIFwicmV0dXJuXCIgPT09IGNvbnRleHQubWV0aG9kICYmIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgc3RhdGUgPSBcImV4ZWN1dGluZ1wiO1xuICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICAgIGlmIChcIm5vcm1hbFwiID09PSByZWNvcmQudHlwZSkge1xuICAgICAgICAgIGlmIChzdGF0ZSA9IGNvbnRleHQuZG9uZSA/IFwiY29tcGxldGVkXCIgOiBcInN1c3BlbmRlZFlpZWxkXCIsIHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXCJ0aHJvd1wiID09PSByZWNvcmQudHlwZSAmJiAoc3RhdGUgPSBcImNvbXBsZXRlZFwiLCBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIiwgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kTmFtZSA9IGNvbnRleHQubWV0aG9kLFxuICAgICAgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbbWV0aG9kTmFtZV07XG4gICAgaWYgKHVuZGVmaW5lZCA9PT0gbWV0aG9kKSByZXR1cm4gY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIFwidGhyb3dcIiA9PT0gbWV0aG9kTmFtZSAmJiBkZWxlZ2F0ZS5pdGVyYXRvcltcInJldHVyblwiXSAmJiAoY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCwgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCksIFwidGhyb3dcIiA9PT0gY29udGV4dC5tZXRob2QpIHx8IFwicmV0dXJuXCIgIT09IG1ldGhvZE5hbWUgJiYgKGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiLCBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICdcIiArIG1ldGhvZE5hbWUgKyBcIicgbWV0aG9kXCIpKSwgQ29udGludWVTZW50aW5lbDtcbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuICAgIGlmIChcInRocm93XCIgPT09IHJlY29yZC50eXBlKSByZXR1cm4gY29udGV4dC5tZXRob2QgPSBcInRocm93XCIsIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZywgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWw7XG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuICAgIHJldHVybiBpbmZvID8gaW5mby5kb25lID8gKGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlLCBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jLCBcInJldHVyblwiICE9PSBjb250ZXh0Lm1ldGhvZCAmJiAoY29udGV4dC5tZXRob2QgPSBcIm5leHRcIiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQpLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbCkgOiBpbmZvIDogKGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiLCBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKSwgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWwpO1xuICB9XG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0ge1xuICAgICAgdHJ5TG9jOiBsb2NzWzBdXG4gICAgfTtcbiAgICAxIGluIGxvY3MgJiYgKGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXSksIDIgaW4gbG9jcyAmJiAoZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl0sIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXSksIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiLCBkZWxldGUgcmVjb3JkLmFyZywgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3tcbiAgICAgIHRyeUxvYzogXCJyb290XCJcbiAgICB9XSwgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpLCB0aGlzLnJlc2V0KCEwKTtcbiAgfVxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgaXRlcmFibGUubmV4dCkgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsXG4gICAgICAgICAgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICBmb3IgKDsgKytpIDwgaXRlcmFibGUubGVuZ3RoOykgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkgcmV0dXJuIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXSwgbmV4dC5kb25lID0gITEsIG5leHQ7XG4gICAgICAgICAgICByZXR1cm4gbmV4dC52YWx1ZSA9IHVuZGVmaW5lZCwgbmV4dC5kb25lID0gITAsIG5leHQ7XG4gICAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuZXh0OiBkb25lUmVzdWx0XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgZG9uZTogITBcbiAgICB9O1xuICB9XG4gIHJldHVybiBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lUHJvcGVydHkoR3AsIFwiY29uc3RydWN0b3JcIiwge1xuICAgIHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSxcbiAgICBjb25maWd1cmFibGU6ICEwXG4gIH0pLCBkZWZpbmVQcm9wZXJ0eShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgXCJjb25zdHJ1Y3RvclwiLCB7XG4gICAgdmFsdWU6IEdlbmVyYXRvckZ1bmN0aW9uLFxuICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgfSksIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGVmaW5lKEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JGdW5jdGlvblwiKSwgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24gKGdlbkZ1bikge1xuICAgIHZhciBjdG9yID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBnZW5GdW4gJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiAhIWN0b3IgJiYgKGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8IFwiR2VuZXJhdG9yRnVuY3Rpb25cIiA9PT0gKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSk7XG4gIH0sIGV4cG9ydHMubWFyayA9IGZ1bmN0aW9uIChnZW5GdW4pIHtcbiAgICByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpIDogKGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lKGdlbkZ1biwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yRnVuY3Rpb25cIikpLCBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCksIGdlbkZ1bjtcbiAgfSwgZXhwb3J0cy5hd3JhcCA9IGZ1bmN0aW9uIChhcmcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX19hd2FpdDogYXJnXG4gICAgfTtcbiAgfSwgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKSwgZGVmaW5lKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlLCBhc3luY0l0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pLCBleHBvcnRzLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yLCBleHBvcnRzLmFzeW5jID0gZnVuY3Rpb24gKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0LCBQcm9taXNlSW1wbCkge1xuICAgIHZvaWQgMCA9PT0gUHJvbWlzZUltcGwgJiYgKFByb21pc2VJbXBsID0gUHJvbWlzZSk7XG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcih3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSwgUHJvbWlzZUltcGwpO1xuICAgIHJldHVybiBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbikgPyBpdGVyIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICB9KTtcbiAgfSwgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKSwgZGVmaW5lKEdwLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JcIiksIGRlZmluZShHcCwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSksIGRlZmluZShHcCwgXCJ0b1N0cmluZ1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH0pLCBleHBvcnRzLmtleXMgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgdmFyIG9iamVjdCA9IE9iamVjdCh2YWwpLFxuICAgICAga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIGtleXMucHVzaChrZXkpO1xuICAgIHJldHVybiBrZXlzLnJldmVyc2UoKSwgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIGZvciAoOyBrZXlzLmxlbmd0aDspIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSByZXR1cm4gbmV4dC52YWx1ZSA9IGtleSwgbmV4dC5kb25lID0gITEsIG5leHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV4dC5kb25lID0gITAsIG5leHQ7XG4gICAgfTtcbiAgfSwgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXMsIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldChza2lwVGVtcFJlc2V0KSB7XG4gICAgICBpZiAodGhpcy5wcmV2ID0gMCwgdGhpcy5uZXh0ID0gMCwgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZCwgdGhpcy5kb25lID0gITEsIHRoaXMuZGVsZWdhdGUgPSBudWxsLCB0aGlzLm1ldGhvZCA9IFwibmV4dFwiLCB0aGlzLmFyZyA9IHVuZGVmaW5lZCwgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSksICFza2lwVGVtcFJlc2V0KSBmb3IgKHZhciBuYW1lIGluIHRoaXMpIFwidFwiID09PSBuYW1lLmNoYXJBdCgwKSAmJiBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJiAhaXNOYU4oK25hbWUuc2xpY2UoMSkpICYmICh0aGlzW25hbWVdID0gdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgICB0aGlzLmRvbmUgPSAhMDtcbiAgICAgIHZhciByb290UmVjb3JkID0gdGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247XG4gICAgICBpZiAoXCJ0aHJvd1wiID09PSByb290UmVjb3JkLnR5cGUpIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbiBkaXNwYXRjaEV4Y2VwdGlvbihleGNlcHRpb24pIHtcbiAgICAgIGlmICh0aGlzLmRvbmUpIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZXR1cm4gcmVjb3JkLnR5cGUgPSBcInRocm93XCIsIHJlY29yZC5hcmcgPSBleGNlcHRpb24sIGNvbnRleHQubmV4dCA9IGxvYywgY2F1Z2h0ICYmIChjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCksICEhY2F1Z2h0O1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV0sXG4gICAgICAgICAgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgaWYgKFwicm9vdFwiID09PSBlbnRyeS50cnlMb2MpIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7XG4gICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksIFwiY2F0Y2hMb2NcIiksXG4gICAgICAgICAgICBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCAhMCk7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsICEwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNGaW5hbGx5KSB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgYWJydXB0OiBmdW5jdGlvbiBhYnJ1cHQodHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiYgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJiB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmaW5hbGx5RW50cnkgJiYgKFwiYnJlYWtcIiA9PT0gdHlwZSB8fCBcImNvbnRpbnVlXCIgPT09IHR5cGUpICYmIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYyAmJiAoZmluYWxseUVudHJ5ID0gbnVsbCk7XG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJldHVybiByZWNvcmQudHlwZSA9IHR5cGUsIHJlY29yZC5hcmcgPSBhcmcsIGZpbmFsbHlFbnRyeSA/ICh0aGlzLm1ldGhvZCA9IFwibmV4dFwiLCB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYywgQ29udGludWVTZW50aW5lbCkgOiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcbiAgICBjb21wbGV0ZTogZnVuY3Rpb24gY29tcGxldGUocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKFwidGhyb3dcIiA9PT0gcmVjb3JkLnR5cGUpIHRocm93IHJlY29yZC5hcmc7XG4gICAgICByZXR1cm4gXCJicmVha1wiID09PSByZWNvcmQudHlwZSB8fCBcImNvbnRpbnVlXCIgPT09IHJlY29yZC50eXBlID8gdGhpcy5uZXh0ID0gcmVjb3JkLmFyZyA6IFwicmV0dXJuXCIgPT09IHJlY29yZC50eXBlID8gKHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZywgdGhpcy5tZXRob2QgPSBcInJldHVyblwiLCB0aGlzLm5leHQgPSBcImVuZFwiKSA6IFwibm9ybWFsXCIgPT09IHJlY29yZC50eXBlICYmIGFmdGVyTG9jICYmICh0aGlzLm5leHQgPSBhZnRlckxvYyksIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcbiAgICBmaW5pc2g6IGZ1bmN0aW9uIGZpbmlzaChmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHJldHVybiB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKSwgcmVzZXRUcnlFbnRyeShlbnRyeSksIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG4gICAgfSxcbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uIF9jYXRjaCh0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAoXCJ0aHJvd1wiID09PSByZWNvcmQudHlwZSkge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24gZGVsZWdhdGVZaWVsZChpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9LCBcIm5leHRcIiA9PT0gdGhpcy5tZXRob2QgJiYgKHRoaXMuYXJnID0gdW5kZWZpbmVkKSwgQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH0sIGV4cG9ydHM7XG59IiwiZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykge1xuICB0cnkge1xuICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTtcbiAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlamVjdChlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChpbmZvLmRvbmUpIHtcbiAgICByZXNvbHZlKHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikge1xuICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTtcbiAgICAgIH1cbiAgICAgIF9uZXh0KHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gIH07XG59IiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG4gIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7XG5cbiAgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7XG4gIGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7XG5cbiAgdHJ5IHtcbiAgICBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7XG4gIGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkpIHtcbiAgICBfY29uc3RydWN0ID0gUmVmbGVjdC5jb25zdHJ1Y3QuYmluZCgpO1xuICB9IGVsc2Uge1xuICAgIF9jb25zdHJ1Y3QgPSBmdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgICAgIHZhciBhID0gW251bGxdO1xuICAgICAgYS5wdXNoLmFwcGx5KGEsIGFyZ3MpO1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gRnVuY3Rpb24uYmluZC5hcHBseShQYXJlbnQsIGEpO1xuICAgICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgICBpZiAoQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihpbnN0YW5jZSwgQ2xhc3MucHJvdG90eXBlKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF9jb25zdHJ1Y3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2lzTmF0aXZlRnVuY3Rpb24oZm4pIHtcbiAgcmV0dXJuIEZ1bmN0aW9uLnRvU3RyaW5nLmNhbGwoZm4pLmluZGV4T2YoXCJbbmF0aXZlIGNvZGVdXCIpICE9PSAtMTtcbn1cblxuZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykge1xuICB2YXIgX2NhY2hlID0gdHlwZW9mIE1hcCA9PT0gXCJmdW5jdGlvblwiID8gbmV3IE1hcCgpIDogdW5kZWZpbmVkO1xuXG4gIF93cmFwTmF0aXZlU3VwZXIgPSBmdW5jdGlvbiBfd3JhcE5hdGl2ZVN1cGVyKENsYXNzKSB7XG4gICAgaWYgKENsYXNzID09PSBudWxsIHx8ICFfaXNOYXRpdmVGdW5jdGlvbihDbGFzcykpIHJldHVybiBDbGFzcztcblxuICAgIGlmICh0eXBlb2YgQ2xhc3MgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgX2NhY2hlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoX2NhY2hlLmhhcyhDbGFzcykpIHJldHVybiBfY2FjaGUuZ2V0KENsYXNzKTtcblxuICAgICAgX2NhY2hlLnNldChDbGFzcywgV3JhcHBlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gV3JhcHBlcigpIHtcbiAgICAgIHJldHVybiBfY29uc3RydWN0KENsYXNzLCBhcmd1bWVudHMsIF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuXG4gICAgV3JhcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENsYXNzLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IFdyYXBwZXIsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihXcmFwcGVyLCBDbGFzcyk7XG4gIH07XG5cbiAgcmV0dXJuIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3MpO1xufVxuXG4vKiBlc2xpbnQgbm8tY29uc29sZTowICovXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbnZhciB3YXJuaW5nID0gZnVuY3Rpb24gd2FybmluZygpIHt9OyAvLyBkb24ndCBwcmludCB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiBpbiBwcm9kdWN0aW9uIGVudiBvciBub2RlIHJ1bnRpbWVcblxuaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgd2FybmluZyA9IGZ1bmN0aW9uIHdhcm5pbmcodHlwZSwgZXJyb3JzKSB7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlLndhcm4gJiYgdHlwZW9mIEFTWU5DX1ZBTElEQVRPUl9OT19XQVJOSU5HID09PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKGVycm9ycy5ldmVyeShmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGUgPT09ICdzdHJpbmcnO1xuICAgICAgfSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKHR5cGUsIGVycm9ycyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0RmllbGRzRXJyb3IoZXJyb3JzKSB7XG4gIGlmICghZXJyb3JzIHx8ICFlcnJvcnMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgdmFyIGZpZWxkcyA9IHt9O1xuICBlcnJvcnMuZm9yRWFjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICB2YXIgZmllbGQgPSBlcnJvci5maWVsZDtcbiAgICBmaWVsZHNbZmllbGRdID0gZmllbGRzW2ZpZWxkXSB8fCBbXTtcbiAgICBmaWVsZHNbZmllbGRdLnB1c2goZXJyb3IpO1xuICB9KTtcbiAgcmV0dXJuIGZpZWxkcztcbn1cbmZ1bmN0aW9uIGZvcm1hdCh0ZW1wbGF0ZSkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICB2YXIgaSA9IDA7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcblxuICBpZiAodHlwZW9mIHRlbXBsYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRlbXBsYXRlLmFwcGx5KG51bGwsIGFyZ3MpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0ZW1wbGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgc3RyID0gdGVtcGxhdGUucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uICh4KSB7XG4gICAgICBpZiAoeCA9PT0gJyUlJykge1xuICAgICAgICByZXR1cm4gJyUnO1xuICAgICAgfVxuXG4gICAgICBpZiAoaSA+PSBsZW4pIHtcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoeCkge1xuICAgICAgICBjYXNlICclcyc6XG4gICAgICAgICAgcmV0dXJuIFN0cmluZyhhcmdzW2krK10pO1xuXG4gICAgICAgIGNhc2UgJyVkJzpcbiAgICAgICAgICByZXR1cm4gTnVtYmVyKGFyZ3NbaSsrXSk7XG5cbiAgICAgICAgY2FzZSAnJWonOlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHg7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIHJldHVybiB0ZW1wbGF0ZTtcbn1cblxuZnVuY3Rpb24gaXNOYXRpdmVTdHJpbmdUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICd1cmwnIHx8IHR5cGUgPT09ICdoZXgnIHx8IHR5cGUgPT09ICdlbWFpbCcgfHwgdHlwZSA9PT0gJ2RhdGUnIHx8IHR5cGUgPT09ICdwYXR0ZXJuJztcbn1cblxuZnVuY3Rpb24gaXNFbXB0eVZhbHVlKHZhbHVlLCB0eXBlKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZSA9PT0gJ2FycmF5JyAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiAhdmFsdWUubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaXNOYXRpdmVTdHJpbmdUeXBlKHR5cGUpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgIXZhbHVlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGFzeW5jUGFyYWxsZWxBcnJheShhcnIsIGZ1bmMsIGNhbGxiYWNrKSB7XG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciB0b3RhbCA9IDA7XG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIGNvdW50KGVycm9ycykge1xuICAgIHJlc3VsdHMucHVzaC5hcHBseShyZXN1bHRzLCBlcnJvcnMgfHwgW10pO1xuICAgIHRvdGFsKys7XG5cbiAgICBpZiAodG90YWwgPT09IGFyckxlbmd0aCkge1xuICAgICAgY2FsbGJhY2socmVzdWx0cyk7XG4gICAgfVxuICB9XG5cbiAgYXJyLmZvckVhY2goZnVuY3Rpb24gKGEpIHtcbiAgICBmdW5jKGEsIGNvdW50KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFzeW5jU2VyaWFsQXJyYXkoYXJyLCBmdW5jLCBjYWxsYmFjaykge1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aDtcblxuICBmdW5jdGlvbiBuZXh0KGVycm9ycykge1xuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCkge1xuICAgICAgY2FsbGJhY2soZXJyb3JzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgb3JpZ2luYWwgPSBpbmRleDtcbiAgICBpbmRleCA9IGluZGV4ICsgMTtcblxuICAgIGlmIChvcmlnaW5hbCA8IGFyckxlbmd0aCkge1xuICAgICAgZnVuYyhhcnJbb3JpZ2luYWxdLCBuZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2soW10pO1xuICAgIH1cbiAgfVxuXG4gIG5leHQoW10pO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuT2JqQXJyKG9iakFycikge1xuICB2YXIgcmV0ID0gW107XG4gIE9iamVjdC5rZXlzKG9iakFycikuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgIHJldC5wdXNoLmFwcGx5KHJldCwgb2JqQXJyW2tdIHx8IFtdKTtcbiAgfSk7XG4gIHJldHVybiByZXQ7XG59XG5cbnZhciBBc3luY1ZhbGlkYXRpb25FcnJvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Vycm9yKSB7XG4gIF9pbmhlcml0c0xvb3NlKEFzeW5jVmFsaWRhdGlvbkVycm9yLCBfRXJyb3IpO1xuXG4gIGZ1bmN0aW9uIEFzeW5jVmFsaWRhdGlvbkVycm9yKGVycm9ycywgZmllbGRzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX3RoaXMgPSBfRXJyb3IuY2FsbCh0aGlzLCAnQXN5bmMgVmFsaWRhdGlvbiBFcnJvcicpIHx8IHRoaXM7XG4gICAgX3RoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgIF90aGlzLmZpZWxkcyA9IGZpZWxkcztcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICByZXR1cm4gQXN5bmNWYWxpZGF0aW9uRXJyb3I7XG59KCAvKiNfX1BVUkVfXyovX3dyYXBOYXRpdmVTdXBlcihFcnJvcikpO1xuZnVuY3Rpb24gYXN5bmNNYXAob2JqQXJyLCBvcHRpb24sIGZ1bmMsIGNhbGxiYWNrLCBzb3VyY2UpIHtcbiAgaWYgKG9wdGlvbi5maXJzdCkge1xuICAgIHZhciBfcGVuZGluZyA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBuZXh0ID0gZnVuY3Rpb24gbmV4dChlcnJvcnMpIHtcbiAgICAgICAgY2FsbGJhY2soZXJyb3JzKTtcbiAgICAgICAgcmV0dXJuIGVycm9ycy5sZW5ndGggPyByZWplY3QobmV3IEFzeW5jVmFsaWRhdGlvbkVycm9yKGVycm9ycywgY29udmVydEZpZWxkc0Vycm9yKGVycm9ycykpKSA6IHJlc29sdmUoc291cmNlKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBmbGF0dGVuQXJyID0gZmxhdHRlbk9iakFycihvYmpBcnIpO1xuICAgICAgYXN5bmNTZXJpYWxBcnJheShmbGF0dGVuQXJyLCBmdW5jLCBuZXh0KTtcbiAgICB9KTtcblxuICAgIF9wZW5kaW5nW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF9wZW5kaW5nO1xuICB9XG5cbiAgdmFyIGZpcnN0RmllbGRzID0gb3B0aW9uLmZpcnN0RmllbGRzID09PSB0cnVlID8gT2JqZWN0LmtleXMob2JqQXJyKSA6IG9wdGlvbi5maXJzdEZpZWxkcyB8fCBbXTtcbiAgdmFyIG9iakFycktleXMgPSBPYmplY3Qua2V5cyhvYmpBcnIpO1xuICB2YXIgb2JqQXJyTGVuZ3RoID0gb2JqQXJyS2V5cy5sZW5ndGg7XG4gIHZhciB0b3RhbCA9IDA7XG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciBwZW5kaW5nID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciBuZXh0ID0gZnVuY3Rpb24gbmV4dChlcnJvcnMpIHtcbiAgICAgIHJlc3VsdHMucHVzaC5hcHBseShyZXN1bHRzLCBlcnJvcnMpO1xuICAgICAgdG90YWwrKztcblxuICAgICAgaWYgKHRvdGFsID09PSBvYmpBcnJMZW5ndGgpIHtcbiAgICAgICAgY2FsbGJhY2socmVzdWx0cyk7XG4gICAgICAgIHJldHVybiByZXN1bHRzLmxlbmd0aCA/IHJlamVjdChuZXcgQXN5bmNWYWxpZGF0aW9uRXJyb3IocmVzdWx0cywgY29udmVydEZpZWxkc0Vycm9yKHJlc3VsdHMpKSkgOiByZXNvbHZlKHNvdXJjZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmICghb2JqQXJyS2V5cy5sZW5ndGgpIHtcbiAgICAgIGNhbGxiYWNrKHJlc3VsdHMpO1xuICAgICAgcmVzb2x2ZShzb3VyY2UpO1xuICAgIH1cblxuICAgIG9iakFycktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgYXJyID0gb2JqQXJyW2tleV07XG5cbiAgICAgIGlmIChmaXJzdEZpZWxkcy5pbmRleE9mKGtleSkgIT09IC0xKSB7XG4gICAgICAgIGFzeW5jU2VyaWFsQXJyYXkoYXJyLCBmdW5jLCBuZXh0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFzeW5jUGFyYWxsZWxBcnJheShhcnIsIGZ1bmMsIG5leHQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcGVuZGluZ1tcImNhdGNoXCJdKGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuIGU7XG4gIH0pO1xuICByZXR1cm4gcGVuZGluZztcbn1cblxuZnVuY3Rpb24gaXNFcnJvck9iaihvYmopIHtcbiAgcmV0dXJuICEhKG9iaiAmJiBvYmoubWVzc2FnZSAhPT0gdW5kZWZpbmVkKTtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUodmFsdWUsIHBhdGgpIHtcbiAgdmFyIHYgPSB2YWx1ZTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAodiA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB2O1xuICAgIH1cblxuICAgIHYgPSB2W3BhdGhbaV1dO1xuICB9XG5cbiAgcmV0dXJuIHY7XG59XG5cbmZ1bmN0aW9uIGNvbXBsZW1lbnRFcnJvcihydWxlLCBzb3VyY2UpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvZSkge1xuICAgIHZhciBmaWVsZFZhbHVlO1xuXG4gICAgaWYgKHJ1bGUuZnVsbEZpZWxkcykge1xuICAgICAgZmllbGRWYWx1ZSA9IGdldFZhbHVlKHNvdXJjZSwgcnVsZS5mdWxsRmllbGRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmllbGRWYWx1ZSA9IHNvdXJjZVtvZS5maWVsZCB8fCBydWxlLmZ1bGxGaWVsZF07XG4gICAgfVxuXG4gICAgaWYgKGlzRXJyb3JPYmoob2UpKSB7XG4gICAgICBvZS5maWVsZCA9IG9lLmZpZWxkIHx8IHJ1bGUuZnVsbEZpZWxkO1xuICAgICAgb2UuZmllbGRWYWx1ZSA9IGZpZWxkVmFsdWU7XG4gICAgICByZXR1cm4gb2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IHR5cGVvZiBvZSA9PT0gJ2Z1bmN0aW9uJyA/IG9lKCkgOiBvZSxcbiAgICAgIGZpZWxkVmFsdWU6IGZpZWxkVmFsdWUsXG4gICAgICBmaWVsZDogb2UuZmllbGQgfHwgcnVsZS5mdWxsRmllbGRcbiAgICB9O1xuICB9O1xufVxuZnVuY3Rpb24gZGVlcE1lcmdlKHRhcmdldCwgc291cmNlKSB7XG4gIGlmIChzb3VyY2UpIHtcbiAgICBmb3IgKHZhciBzIGluIHNvdXJjZSkge1xuICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShzKSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2Vbc107XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHRhcmdldFtzXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0YXJnZXRbc10gPSBfZXh0ZW5kcyh7fSwgdGFyZ2V0W3NdLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0W3NdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG52YXIgcmVxdWlyZWQkMSA9IGZ1bmN0aW9uIHJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgdHlwZSkge1xuICBpZiAocnVsZS5yZXF1aXJlZCAmJiAoIXNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKSB8fCBpc0VtcHR5VmFsdWUodmFsdWUsIHR5cGUgfHwgcnVsZS50eXBlKSkpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy5yZXF1aXJlZCwgcnVsZS5mdWxsRmllbGQpKTtcbiAgfVxufTtcblxuLyoqXG4gKiAgUnVsZSBmb3IgdmFsaWRhdGluZyB3aGl0ZXNwYWNlLlxuICpcbiAqICBAcGFyYW0gcnVsZSBUaGUgdmFsaWRhdGlvbiBydWxlLlxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxuICogIEBwYXJhbSBlcnJvcnMgQW4gYXJyYXkgb2YgZXJyb3JzIHRoYXQgdGhpcyBydWxlIG1heSBhZGRcbiAqICB2YWxpZGF0aW9uIGVycm9ycyB0by5cbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxuICovXG5cbnZhciB3aGl0ZXNwYWNlID0gZnVuY3Rpb24gd2hpdGVzcGFjZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpIHtcbiAgaWYgKC9eXFxzKyQvLnRlc3QodmFsdWUpIHx8IHZhbHVlID09PSAnJykge1xuICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLndoaXRlc3BhY2UsIHJ1bGUuZnVsbEZpZWxkKSk7XG4gIH1cbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rZXZ2YS91cmwtcmVnZXgvYmxvYi9tYXN0ZXIvaW5kZXguanNcbnZhciB1cmxSZWc7XG52YXIgZ2V0VXJsUmVnZXggPSAoZnVuY3Rpb24gKCkge1xuICBpZiAodXJsUmVnKSB7XG4gICAgcmV0dXJuIHVybFJlZztcbiAgfVxuXG4gIHZhciB3b3JkID0gJ1thLWZBLUZcXFxcZDpdJztcblxuICB2YXIgYiA9IGZ1bmN0aW9uIGIob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnMuaW5jbHVkZUJvdW5kYXJpZXMgPyBcIig/Oig/PD1cXFxcc3xeKSg/PVwiICsgd29yZCArIFwiKXwoPzw9XCIgKyB3b3JkICsgXCIpKD89XFxcXHN8JCkpXCIgOiAnJztcbiAgfTtcblxuICB2YXIgdjQgPSAnKD86MjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XVxcXFxkfFxcXFxkKSg/OlxcXFwuKD86MjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XVxcXFxkfFxcXFxkKSl7M30nO1xuICB2YXIgdjZzZWcgPSAnW2EtZkEtRlxcXFxkXXsxLDR9JztcbiAgdmFyIHY2ID0gKFwiXFxuKD86XFxuKD86XCIgKyB2NnNlZyArIFwiOil7N30oPzpcIiArIHY2c2VnICsgXCJ8Oil8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMToyOjM6NDo1OjY6Nzo6ICAxOjI6Mzo0OjU6Njo3OjhcXG4oPzpcIiArIHY2c2VnICsgXCI6KXs2fSg/OlwiICsgdjQgKyBcInw6XCIgKyB2NnNlZyArIFwifDopfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMToyOjM6NDo1OjY6OiAgICAxOjI6Mzo0OjU6Njo6OCAgIDE6MjozOjQ6NTo2Ojo4ICAxOjI6Mzo0OjU6Njo6MS4yLjMuNFxcbig/OlwiICsgdjZzZWcgKyBcIjopezV9KD86OlwiICsgdjQgKyBcInwoPzo6XCIgKyB2NnNlZyArIFwiKXsxLDJ9fDopfCAgICAgICAgICAgICAgICAgICAvLyAxOjI6Mzo0OjU6OiAgICAgIDE6MjozOjQ6NTo6Nzo4ICAgMToyOjM6NDo1Ojo4ICAgIDE6MjozOjQ6NTo6NzoxLjIuMy40XFxuKD86XCIgKyB2NnNlZyArIFwiOil7NH0oPzooPzo6XCIgKyB2NnNlZyArIFwiKXswLDF9OlwiICsgdjQgKyBcInwoPzo6XCIgKyB2NnNlZyArIFwiKXsxLDN9fDopfCAvLyAxOjI6Mzo0OjogICAgICAgIDE6MjozOjQ6OjY6Nzo4ICAgMToyOjM6NDo6OCAgICAgIDE6MjozOjQ6OjY6NzoxLjIuMy40XFxuKD86XCIgKyB2NnNlZyArIFwiOil7M30oPzooPzo6XCIgKyB2NnNlZyArIFwiKXswLDJ9OlwiICsgdjQgKyBcInwoPzo6XCIgKyB2NnNlZyArIFwiKXsxLDR9fDopfCAvLyAxOjI6Mzo6ICAgICAgICAgIDE6MjozOjo1OjY6Nzo4ICAgMToyOjM6OjggICAgICAgIDE6MjozOjo1OjY6NzoxLjIuMy40XFxuKD86XCIgKyB2NnNlZyArIFwiOil7Mn0oPzooPzo6XCIgKyB2NnNlZyArIFwiKXswLDN9OlwiICsgdjQgKyBcInwoPzo6XCIgKyB2NnNlZyArIFwiKXsxLDV9fDopfCAvLyAxOjI6OiAgICAgICAgICAgIDE6Mjo6NDo1OjY6Nzo4ICAgMToyOjo4ICAgICAgICAgIDE6Mjo6NDo1OjY6NzoxLjIuMy40XFxuKD86XCIgKyB2NnNlZyArIFwiOil7MX0oPzooPzo6XCIgKyB2NnNlZyArIFwiKXswLDR9OlwiICsgdjQgKyBcInwoPzo6XCIgKyB2NnNlZyArIFwiKXsxLDZ9fDopfCAvLyAxOjogICAgICAgICAgICAgIDE6OjM6NDo1OjY6Nzo4ICAgMTo6OCAgICAgICAgICAgIDE6OjM6NDo1OjY6NzoxLjIuMy40XFxuKD86Oig/Oig/OjpcIiArIHY2c2VnICsgXCIpezAsNX06XCIgKyB2NCArIFwifCg/OjpcIiArIHY2c2VnICsgXCIpezEsN318OikpICAgICAgICAgICAgIC8vIDo6MjozOjQ6NTo2Ojc6OCAgOjoyOjM6NDo1OjY6Nzo4ICA6OjggICAgICAgICAgICAgOjoxLjIuMy40XFxuKSg/OiVbMC05YS16QS1aXXsxLH0pPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICVldGgwICAgICAgICAgICAgJTFcXG5cIikucmVwbGFjZSgvXFxzKlxcL1xcLy4qJC9nbSwgJycpLnJlcGxhY2UoL1xcbi9nLCAnJykudHJpbSgpOyAvLyBQcmUtY29tcGlsZSBvbmx5IHRoZSBleGFjdCByZWdleGVzIGJlY2F1c2UgYWRkaW5nIGEgZ2xvYmFsIGZsYWcgbWFrZSByZWdleGVzIHN0YXRlZnVsXG5cbiAgdmFyIHY0NkV4YWN0ID0gbmV3IFJlZ0V4cChcIig/Ol5cIiArIHY0ICsgXCIkKXwoPzpeXCIgKyB2NiArIFwiJClcIik7XG4gIHZhciB2NGV4YWN0ID0gbmV3IFJlZ0V4cChcIl5cIiArIHY0ICsgXCIkXCIpO1xuICB2YXIgdjZleGFjdCA9IG5ldyBSZWdFeHAoXCJeXCIgKyB2NiArIFwiJFwiKTtcblxuICB2YXIgaXAgPSBmdW5jdGlvbiBpcChvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9ucy5leGFjdCA/IHY0NkV4YWN0IDogbmV3IFJlZ0V4cChcIig/OlwiICsgYihvcHRpb25zKSArIHY0ICsgYihvcHRpb25zKSArIFwiKXwoPzpcIiArIGIob3B0aW9ucykgKyB2NiArIGIob3B0aW9ucykgKyBcIilcIiwgJ2cnKTtcbiAgfTtcblxuICBpcC52NCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9ucy5leGFjdCA/IHY0ZXhhY3QgOiBuZXcgUmVnRXhwKFwiXCIgKyBiKG9wdGlvbnMpICsgdjQgKyBiKG9wdGlvbnMpLCAnZycpO1xuICB9O1xuXG4gIGlwLnY2ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zLmV4YWN0ID8gdjZleGFjdCA6IG5ldyBSZWdFeHAoXCJcIiArIGIob3B0aW9ucykgKyB2NiArIGIob3B0aW9ucyksICdnJyk7XG4gIH07XG5cbiAgdmFyIHByb3RvY29sID0gXCIoPzooPzpbYS16XSs6KT8vLylcIjtcbiAgdmFyIGF1dGggPSAnKD86XFxcXFMrKD86OlxcXFxTKik/QCk/JztcbiAgdmFyIGlwdjQgPSBpcC52NCgpLnNvdXJjZTtcbiAgdmFyIGlwdjYgPSBpcC52NigpLnNvdXJjZTtcbiAgdmFyIGhvc3QgPSBcIig/Oig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XVstX10qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKVwiO1xuICB2YXIgZG9tYWluID0gXCIoPzpcXFxcLig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XS0qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKSpcIjtcbiAgdmFyIHRsZCA9IFwiKD86XFxcXC4oPzpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZl17Mix9KSlcIjtcbiAgdmFyIHBvcnQgPSAnKD86OlxcXFxkezIsNX0pPyc7XG4gIHZhciBwYXRoID0gJyg/OlsvPyNdW15cXFxcc1wiXSopPyc7XG4gIHZhciByZWdleCA9IFwiKD86XCIgKyBwcm90b2NvbCArIFwifHd3d1xcXFwuKVwiICsgYXV0aCArIFwiKD86bG9jYWxob3N0fFwiICsgaXB2NCArIFwifFwiICsgaXB2NiArIFwifFwiICsgaG9zdCArIGRvbWFpbiArIHRsZCArIFwiKVwiICsgcG9ydCArIHBhdGg7XG4gIHVybFJlZyA9IG5ldyBSZWdFeHAoXCIoPzpeXCIgKyByZWdleCArIFwiJClcIiwgJ2knKTtcbiAgcmV0dXJuIHVybFJlZztcbn0pO1xuXG4vKiBlc2xpbnQgbWF4LWxlbjowICovXG5cbnZhciBwYXR0ZXJuJDIgPSB7XG4gIC8vIGh0dHA6Ly9lbWFpbHJlZ2V4LmNvbS9cbiAgZW1haWw6IC9eKChbXjw+KClcXFtcXF1cXFxcLiw7Olxcc0BcIl0rKFxcLltePD4oKVxcW1xcXVxcXFwuLDs6XFxzQFwiXSspKil8KFwiLitcIikpQCgoXFxbWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfV0pfCgoW2EtekEtWlxcLTAtOVxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0rXFwuKStbYS16QS1aXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXXsyLH0pKSQvLFxuICAvLyB1cmw6IG5ldyBSZWdFeHAoXG4gIC8vICAgJ14oPyFtYWlsdG86KSg/Oig/Omh0dHB8aHR0cHN8ZnRwKTovL3wvLykoPzpcXFxcUysoPzo6XFxcXFMqKT9AKT8oPzooPzooPzpbMS05XVxcXFxkP3wxXFxcXGRcXFxcZHwyWzAxXVxcXFxkfDIyWzAtM10pKD86XFxcXC4oPzoxP1xcXFxkezEsMn18MlswLTRdXFxcXGR8MjVbMC01XSkpezJ9KD86XFxcXC4oPzpbMC05XVxcXFxkP3wxXFxcXGRcXFxcZHwyWzAtNF1cXFxcZHwyNVswLTRdKSl8KD86KD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldKy0qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKSg/OlxcXFwuKD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldKy0qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKSooPzpcXFxcLig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmXXsyLH0pKSl8bG9jYWxob3N0KSg/OjpcXFxcZHsyLDV9KT8oPzooL3xcXFxcP3wjKVteXFxcXHNdKik/JCcsXG4gIC8vICAgJ2knLFxuICAvLyApLFxuICBoZXg6IC9eIz8oW2EtZjAtOV17Nn18W2EtZjAtOV17M30pJC9pXG59O1xudmFyIHR5cGVzID0ge1xuICBpbnRlZ2VyOiBmdW5jdGlvbiBpbnRlZ2VyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVzLm51bWJlcih2YWx1ZSkgJiYgcGFyc2VJbnQodmFsdWUsIDEwKSA9PT0gdmFsdWU7XG4gIH0sXG4gIFwiZmxvYXRcIjogZnVuY3Rpb24gZmxvYXQodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZXMubnVtYmVyKHZhbHVlKSAmJiAhdHlwZXMuaW50ZWdlcih2YWx1ZSk7XG4gIH0sXG4gIGFycmF5OiBmdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgfSxcbiAgcmVnZXhwOiBmdW5jdGlvbiByZWdleHAodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISFuZXcgUmVnRXhwKHZhbHVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxuICBkYXRlOiBmdW5jdGlvbiBkYXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZS5nZXRUaW1lID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZS5nZXRNb250aCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUuZ2V0WWVhciA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNOYU4odmFsdWUuZ2V0VGltZSgpKTtcbiAgfSxcbiAgbnVtYmVyOiBmdW5jdGlvbiBudW1iZXIodmFsdWUpIHtcbiAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gIH0sXG4gIG9iamVjdDogZnVuY3Rpb24gb2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIXR5cGVzLmFycmF5KHZhbHVlKTtcbiAgfSxcbiAgbWV0aG9kOiBmdW5jdGlvbiBtZXRob2QodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xuICB9LFxuICBlbWFpbDogZnVuY3Rpb24gZW1haWwodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPD0gMzIwICYmICEhdmFsdWUubWF0Y2gocGF0dGVybiQyLmVtYWlsKTtcbiAgfSxcbiAgdXJsOiBmdW5jdGlvbiB1cmwodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPD0gMjA0OCAmJiAhIXZhbHVlLm1hdGNoKGdldFVybFJlZ2V4KCkpO1xuICB9LFxuICBoZXg6IGZ1bmN0aW9uIGhleCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICEhdmFsdWUubWF0Y2gocGF0dGVybiQyLmhleCk7XG4gIH1cbn07XG5cbnZhciB0eXBlJDEgPSBmdW5jdGlvbiB0eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucykge1xuICBpZiAocnVsZS5yZXF1aXJlZCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmVxdWlyZWQkMShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBjdXN0b20gPSBbJ2ludGVnZXInLCAnZmxvYXQnLCAnYXJyYXknLCAncmVnZXhwJywgJ29iamVjdCcsICdtZXRob2QnLCAnZW1haWwnLCAnbnVtYmVyJywgJ2RhdGUnLCAndXJsJywgJ2hleCddO1xuICB2YXIgcnVsZVR5cGUgPSBydWxlLnR5cGU7XG5cbiAgaWYgKGN1c3RvbS5pbmRleE9mKHJ1bGVUeXBlKSA+IC0xKSB7XG4gICAgaWYgKCF0eXBlc1tydWxlVHlwZV0odmFsdWUpKSB7XG4gICAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy50eXBlc1tydWxlVHlwZV0sIHJ1bGUuZnVsbEZpZWxkLCBydWxlLnR5cGUpKTtcbiAgICB9IC8vIHN0cmFpZ2h0IHR5cGVvZiBjaGVja1xuXG4gIH0gZWxzZSBpZiAocnVsZVR5cGUgJiYgdHlwZW9mIHZhbHVlICE9PSBydWxlLnR5cGUpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy50eXBlc1tydWxlVHlwZV0sIHJ1bGUuZnVsbEZpZWxkLCBydWxlLnR5cGUpKTtcbiAgfVxufTtcblxudmFyIHJhbmdlID0gZnVuY3Rpb24gcmFuZ2UocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKSB7XG4gIHZhciBsZW4gPSB0eXBlb2YgcnVsZS5sZW4gPT09ICdudW1iZXInO1xuICB2YXIgbWluID0gdHlwZW9mIHJ1bGUubWluID09PSAnbnVtYmVyJztcbiAgdmFyIG1heCA9IHR5cGVvZiBydWxlLm1heCA9PT0gJ251bWJlcic7IC8vIOato+WImeWMuemFjeeggeeCueiMg+WbtOS7jlUrMDEwMDAw5LiA55u05YiwVSsxMEZGRkbnmoTmloflrZfvvIjooaXlhYXlubPpnaJTdXBwbGVtZW50YXJ5IFBsYW5l77yJXG5cbiAgdmFyIHNwUmVnZXhwID0gL1tcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl0vZztcbiAgdmFyIHZhbCA9IHZhbHVlO1xuICB2YXIga2V5ID0gbnVsbDtcbiAgdmFyIG51bSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gIHZhciBzdHIgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICB2YXIgYXJyID0gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG5cbiAgaWYgKG51bSkge1xuICAgIGtleSA9ICdudW1iZXInO1xuICB9IGVsc2UgaWYgKHN0cikge1xuICAgIGtleSA9ICdzdHJpbmcnO1xuICB9IGVsc2UgaWYgKGFycikge1xuICAgIGtleSA9ICdhcnJheSc7XG4gIH0gLy8gaWYgdGhlIHZhbHVlIGlzIG5vdCBvZiBhIHN1cHBvcnRlZCB0eXBlIGZvciByYW5nZSB2YWxpZGF0aW9uXG4gIC8vIHRoZSB2YWxpZGF0aW9uIHJ1bGUgcnVsZSBzaG91bGQgdXNlIHRoZVxuICAvLyB0eXBlIHByb3BlcnR5IHRvIGFsc28gdGVzdCBmb3IgYSBwYXJ0aWN1bGFyIHR5cGVcblxuXG4gIGlmICgha2V5KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGFycikge1xuICAgIHZhbCA9IHZhbHVlLmxlbmd0aDtcbiAgfVxuXG4gIGlmIChzdHIpIHtcbiAgICAvLyDlpITnkIbnoIHngrnlpKfkuo5VKzAxMDAwMOeahOaWh+Wtl2xlbmd0aOWxnuaAp+S4jeWHhuehrueahGJ1Z++8jOWmglwi8KCut/CgrrfwoK63XCIubGVuZ2h0ICE9PSAzXG4gICAgdmFsID0gdmFsdWUucmVwbGFjZShzcFJlZ2V4cCwgJ18nKS5sZW5ndGg7XG4gIH1cblxuICBpZiAobGVuKSB7XG4gICAgaWYgKHZhbCAhPT0gcnVsZS5sZW4pIHtcbiAgICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzW2tleV0ubGVuLCBydWxlLmZ1bGxGaWVsZCwgcnVsZS5sZW4pKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAobWluICYmICFtYXggJiYgdmFsIDwgcnVsZS5taW4pIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlc1trZXldLm1pbiwgcnVsZS5mdWxsRmllbGQsIHJ1bGUubWluKSk7XG4gIH0gZWxzZSBpZiAobWF4ICYmICFtaW4gJiYgdmFsID4gcnVsZS5tYXgpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlc1trZXldLm1heCwgcnVsZS5mdWxsRmllbGQsIHJ1bGUubWF4KSk7XG4gIH0gZWxzZSBpZiAobWluICYmIG1heCAmJiAodmFsIDwgcnVsZS5taW4gfHwgdmFsID4gcnVsZS5tYXgpKSB7XG4gICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXNba2V5XS5yYW5nZSwgcnVsZS5mdWxsRmllbGQsIHJ1bGUubWluLCBydWxlLm1heCkpO1xuICB9XG59O1xuXG52YXIgRU5VTSQxID0gJ2VudW0nO1xuXG52YXIgZW51bWVyYWJsZSQxID0gZnVuY3Rpb24gZW51bWVyYWJsZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpIHtcbiAgcnVsZVtFTlVNJDFdID0gQXJyYXkuaXNBcnJheShydWxlW0VOVU0kMV0pID8gcnVsZVtFTlVNJDFdIDogW107XG5cbiAgaWYgKHJ1bGVbRU5VTSQxXS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlc1tFTlVNJDFdLCBydWxlLmZ1bGxGaWVsZCwgcnVsZVtFTlVNJDFdLmpvaW4oJywgJykpKTtcbiAgfVxufTtcblxudmFyIHBhdHRlcm4kMSA9IGZ1bmN0aW9uIHBhdHRlcm4ocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKSB7XG4gIGlmIChydWxlLnBhdHRlcm4pIHtcbiAgICBpZiAocnVsZS5wYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAvLyBpZiBhIFJlZ0V4cCBpbnN0YW5jZSBpcyBwYXNzZWQsIHJlc2V0IGBsYXN0SW5kZXhgIGluIGNhc2UgaXRzIGBnbG9iYWxgXG4gICAgICAvLyBmbGFnIGlzIGFjY2lkZW50YWxseSBzZXQgdG8gYHRydWVgLCB3aGljaCBpbiBhIHZhbGlkYXRpb24gc2NlbmFyaW9cbiAgICAgIC8vIGlzIG5vdCBuZWNlc3NhcnkgYW5kIHRoZSByZXN1bHQgbWlnaHQgYmUgbWlzbGVhZGluZ1xuICAgICAgcnVsZS5wYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG5cbiAgICAgIGlmICghcnVsZS5wYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnBhdHRlcm4ubWlzbWF0Y2gsIHJ1bGUuZnVsbEZpZWxkLCB2YWx1ZSwgcnVsZS5wYXR0ZXJuKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcnVsZS5wYXR0ZXJuID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIF9wYXR0ZXJuID0gbmV3IFJlZ0V4cChydWxlLnBhdHRlcm4pO1xuXG4gICAgICBpZiAoIV9wYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnBhdHRlcm4ubWlzbWF0Y2gsIHJ1bGUuZnVsbEZpZWxkLCB2YWx1ZSwgcnVsZS5wYXR0ZXJuKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG52YXIgcnVsZXMgPSB7XG4gIHJlcXVpcmVkOiByZXF1aXJlZCQxLFxuICB3aGl0ZXNwYWNlOiB3aGl0ZXNwYWNlLFxuICB0eXBlOiB0eXBlJDEsXG4gIHJhbmdlOiByYW5nZSxcbiAgXCJlbnVtXCI6IGVudW1lcmFibGUkMSxcbiAgcGF0dGVybjogcGF0dGVybiQxXG59O1xuXG52YXIgc3RyaW5nID0gZnVuY3Rpb24gc3RyaW5nKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSwgJ3N0cmluZycpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMsICdzdHJpbmcnKTtcblxuICAgIGlmICghaXNFbXB0eVZhbHVlKHZhbHVlLCAnc3RyaW5nJykpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIHJ1bGVzLnJhbmdlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICBydWxlcy5wYXR0ZXJuKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICAgIGlmIChydWxlLndoaXRlc3BhY2UgPT09IHRydWUpIHtcbiAgICAgICAgcnVsZXMud2hpdGVzcGFjZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgbWV0aG9kID0gZnVuY3Rpb24gbWV0aG9kKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgbnVtYmVyID0gZnVuY3Rpb24gbnVtYmVyKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgcnVsZXMucmFuZ2UocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIF9ib29sZWFuID0gZnVuY3Rpb24gX2Jvb2xlYW4ocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5cbnZhciByZWdleHAgPSBmdW5jdGlvbiByZWdleHAocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICghaXNFbXB0eVZhbHVlKHZhbHVlKSkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgaW50ZWdlciA9IGZ1bmN0aW9uIGludGVnZXIocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICBydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgZmxvYXRGbiA9IGZ1bmN0aW9uIGZsb2F0Rm4ocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICBydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgYXJyYXkgPSBmdW5jdGlvbiBhcnJheShydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmICgodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgJ2FycmF5Jyk7XG5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgcnVsZXMucmFuZ2UocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIG9iamVjdCA9IGZ1bmN0aW9uIG9iamVjdChydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIEVOVU0gPSAnZW51bSc7XG5cbnZhciBlbnVtZXJhYmxlID0gZnVuY3Rpb24gZW51bWVyYWJsZShydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzW0VOVU1dKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5cbnZhciBwYXR0ZXJuID0gZnVuY3Rpb24gcGF0dGVybihydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUsICdzdHJpbmcnKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICghaXNFbXB0eVZhbHVlKHZhbHVlLCAnc3RyaW5nJykpIHtcbiAgICAgIHJ1bGVzLnBhdHRlcm4ocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIGRhdGUgPSBmdW5jdGlvbiBkYXRlKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdpbnRlZ2VyIHJ1bGUgY2FsbGVkICVqJywgcnVsZSk7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7IC8vIGNvbnNvbGUubG9nKCd2YWxpZGF0ZSBvbiAlcyB2YWx1ZScsIHZhbHVlKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlLCAnZGF0ZScpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKCFpc0VtcHR5VmFsdWUodmFsdWUsICdkYXRlJykpIHtcbiAgICAgIHZhciBkYXRlT2JqZWN0O1xuXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIGRhdGVPYmplY3QgPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGVPYmplY3QgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgZGF0ZU9iamVjdCwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgICBpZiAoZGF0ZU9iamVjdCkge1xuICAgICAgICBydWxlcy5yYW5nZShydWxlLCBkYXRlT2JqZWN0LmdldFRpbWUoKSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgcmVxdWlyZWQgPSBmdW5jdGlvbiByZXF1aXJlZChydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB0eXBlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAnYXJyYXknIDogdHlwZW9mIHZhbHVlO1xuICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMsIHR5cGUpO1xuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIHR5cGUgPSBmdW5jdGlvbiB0eXBlKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBydWxlVHlwZSA9IHJ1bGUudHlwZTtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlLCBydWxlVHlwZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgcnVsZVR5cGUpO1xuXG4gICAgaWYgKCFpc0VtcHR5VmFsdWUodmFsdWUsIHJ1bGVUeXBlKSkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgYW55ID0gZnVuY3Rpb24gYW55KHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIHZhbGlkYXRvcnMgPSB7XG4gIHN0cmluZzogc3RyaW5nLFxuICBtZXRob2Q6IG1ldGhvZCxcbiAgbnVtYmVyOiBudW1iZXIsXG4gIFwiYm9vbGVhblwiOiBfYm9vbGVhbixcbiAgcmVnZXhwOiByZWdleHAsXG4gIGludGVnZXI6IGludGVnZXIsXG4gIFwiZmxvYXRcIjogZmxvYXRGbixcbiAgYXJyYXk6IGFycmF5LFxuICBvYmplY3Q6IG9iamVjdCxcbiAgXCJlbnVtXCI6IGVudW1lcmFibGUsXG4gIHBhdHRlcm46IHBhdHRlcm4sXG4gIGRhdGU6IGRhdGUsXG4gIHVybDogdHlwZSxcbiAgaGV4OiB0eXBlLFxuICBlbWFpbDogdHlwZSxcbiAgcmVxdWlyZWQ6IHJlcXVpcmVkLFxuICBhbnk6IGFueVxufTtcblxuZnVuY3Rpb24gbmV3TWVzc2FnZXMoKSB7XG4gIHJldHVybiB7XG4gICAgXCJkZWZhdWx0XCI6ICdWYWxpZGF0aW9uIGVycm9yIG9uIGZpZWxkICVzJyxcbiAgICByZXF1aXJlZDogJyVzIGlzIHJlcXVpcmVkJyxcbiAgICBcImVudW1cIjogJyVzIG11c3QgYmUgb25lIG9mICVzJyxcbiAgICB3aGl0ZXNwYWNlOiAnJXMgY2Fubm90IGJlIGVtcHR5JyxcbiAgICBkYXRlOiB7XG4gICAgICBmb3JtYXQ6ICclcyBkYXRlICVzIGlzIGludmFsaWQgZm9yIGZvcm1hdCAlcycsXG4gICAgICBwYXJzZTogJyVzIGRhdGUgY291bGQgbm90IGJlIHBhcnNlZCwgJXMgaXMgaW52YWxpZCAnLFxuICAgICAgaW52YWxpZDogJyVzIGRhdGUgJXMgaXMgaW52YWxpZCdcbiAgICB9LFxuICAgIHR5cGVzOiB7XG4gICAgICBzdHJpbmc6ICclcyBpcyBub3QgYSAlcycsXG4gICAgICBtZXRob2Q6ICclcyBpcyBub3QgYSAlcyAoZnVuY3Rpb24pJyxcbiAgICAgIGFycmF5OiAnJXMgaXMgbm90IGFuICVzJyxcbiAgICAgIG9iamVjdDogJyVzIGlzIG5vdCBhbiAlcycsXG4gICAgICBudW1iZXI6ICclcyBpcyBub3QgYSAlcycsXG4gICAgICBkYXRlOiAnJXMgaXMgbm90IGEgJXMnLFxuICAgICAgXCJib29sZWFuXCI6ICclcyBpcyBub3QgYSAlcycsXG4gICAgICBpbnRlZ2VyOiAnJXMgaXMgbm90IGFuICVzJyxcbiAgICAgIFwiZmxvYXRcIjogJyVzIGlzIG5vdCBhICVzJyxcbiAgICAgIHJlZ2V4cDogJyVzIGlzIG5vdCBhIHZhbGlkICVzJyxcbiAgICAgIGVtYWlsOiAnJXMgaXMgbm90IGEgdmFsaWQgJXMnLFxuICAgICAgdXJsOiAnJXMgaXMgbm90IGEgdmFsaWQgJXMnLFxuICAgICAgaGV4OiAnJXMgaXMgbm90IGEgdmFsaWQgJXMnXG4gICAgfSxcbiAgICBzdHJpbmc6IHtcbiAgICAgIGxlbjogJyVzIG11c3QgYmUgZXhhY3RseSAlcyBjaGFyYWN0ZXJzJyxcbiAgICAgIG1pbjogJyVzIG11c3QgYmUgYXQgbGVhc3QgJXMgY2hhcmFjdGVycycsXG4gICAgICBtYXg6ICclcyBjYW5ub3QgYmUgbG9uZ2VyIHRoYW4gJXMgY2hhcmFjdGVycycsXG4gICAgICByYW5nZTogJyVzIG11c3QgYmUgYmV0d2VlbiAlcyBhbmQgJXMgY2hhcmFjdGVycydcbiAgICB9LFxuICAgIG51bWJlcjoge1xuICAgICAgbGVuOiAnJXMgbXVzdCBlcXVhbCAlcycsXG4gICAgICBtaW46ICclcyBjYW5ub3QgYmUgbGVzcyB0aGFuICVzJyxcbiAgICAgIG1heDogJyVzIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJXMnLFxuICAgICAgcmFuZ2U6ICclcyBtdXN0IGJlIGJldHdlZW4gJXMgYW5kICVzJ1xuICAgIH0sXG4gICAgYXJyYXk6IHtcbiAgICAgIGxlbjogJyVzIG11c3QgYmUgZXhhY3RseSAlcyBpbiBsZW5ndGgnLFxuICAgICAgbWluOiAnJXMgY2Fubm90IGJlIGxlc3MgdGhhbiAlcyBpbiBsZW5ndGgnLFxuICAgICAgbWF4OiAnJXMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAlcyBpbiBsZW5ndGgnLFxuICAgICAgcmFuZ2U6ICclcyBtdXN0IGJlIGJldHdlZW4gJXMgYW5kICVzIGluIGxlbmd0aCdcbiAgICB9LFxuICAgIHBhdHRlcm46IHtcbiAgICAgIG1pc21hdGNoOiAnJXMgdmFsdWUgJXMgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiAlcydcbiAgICB9LFxuICAgIGNsb25lOiBmdW5jdGlvbiBjbG9uZSgpIHtcbiAgICAgIHZhciBjbG9uZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMpKTtcbiAgICAgIGNsb25lZC5jbG9uZSA9IHRoaXMuY2xvbmU7XG4gICAgICByZXR1cm4gY2xvbmVkO1xuICAgIH1cbiAgfTtcbn1cbnZhciBtZXNzYWdlcyA9IG5ld01lc3NhZ2VzKCk7XG5cbi8qKlxuICogIEVuY2Fwc3VsYXRlcyBhIHZhbGlkYXRpb24gc2NoZW1hLlxuICpcbiAqICBAcGFyYW0gZGVzY3JpcHRvciBBbiBvYmplY3QgZGVjbGFyaW5nIHZhbGlkYXRpb24gcnVsZXNcbiAqICBmb3IgdGhpcyBzY2hlbWEuXG4gKi9cblxudmFyIFNjaGVtYSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gU3RhdGljID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IEluc3RhbmNlID09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBTY2hlbWEoZGVzY3JpcHRvcikge1xuICAgIHRoaXMucnVsZXMgPSBudWxsO1xuICAgIHRoaXMuX21lc3NhZ2VzID0gbWVzc2FnZXM7XG4gICAgdGhpcy5kZWZpbmUoZGVzY3JpcHRvcik7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gU2NoZW1hLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKHJ1bGVzKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmICghcnVsZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbmZpZ3VyZSBhIHNjaGVtYSB3aXRoIG5vIHJ1bGVzJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBydWxlcyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShydWxlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUnVsZXMgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICB0aGlzLnJ1bGVzID0ge307XG4gICAgT2JqZWN0LmtleXMocnVsZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciBpdGVtID0gcnVsZXNbbmFtZV07XG4gICAgICBfdGhpcy5ydWxlc1tuYW1lXSA9IEFycmF5LmlzQXJyYXkoaXRlbSkgPyBpdGVtIDogW2l0ZW1dO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5tZXNzYWdlcyA9IGZ1bmN0aW9uIG1lc3NhZ2VzKF9tZXNzYWdlcykge1xuICAgIGlmIChfbWVzc2FnZXMpIHtcbiAgICAgIHRoaXMuX21lc3NhZ2VzID0gZGVlcE1lcmdlKG5ld01lc3NhZ2VzKCksIF9tZXNzYWdlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VzO1xuICB9O1xuXG4gIF9wcm90by52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKHNvdXJjZV8sIG8sIG9jKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICBpZiAobyA9PT0gdm9pZCAwKSB7XG4gICAgICBvID0ge307XG4gICAgfVxuXG4gICAgaWYgKG9jID09PSB2b2lkIDApIHtcbiAgICAgIG9jID0gZnVuY3Rpb24gb2MoKSB7fTtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlID0gc291cmNlXztcbiAgICB2YXIgb3B0aW9ucyA9IG87XG4gICAgdmFyIGNhbGxiYWNrID0gb2M7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucnVsZXMgfHwgT2JqZWN0LmtleXModGhpcy5ydWxlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgc291cmNlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzb3VyY2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXBsZXRlKHJlc3VsdHMpIHtcbiAgICAgIHZhciBlcnJvcnMgPSBbXTtcbiAgICAgIHZhciBmaWVsZHMgPSB7fTtcblxuICAgICAgZnVuY3Rpb24gYWRkKGUpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgICAgICB2YXIgX2Vycm9ycztcblxuICAgICAgICAgIGVycm9ycyA9IChfZXJyb3JzID0gZXJyb3JzKS5jb25jYXQuYXBwbHkoX2Vycm9ycywgZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFkZChyZXN1bHRzW2ldKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHNvdXJjZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWVsZHMgPSBjb252ZXJ0RmllbGRzRXJyb3IoZXJyb3JzKTtcbiAgICAgICAgY2FsbGJhY2soZXJyb3JzLCBmaWVsZHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1lc3NhZ2VzKSB7XG4gICAgICB2YXIgbWVzc2FnZXMkMSA9IHRoaXMubWVzc2FnZXMoKTtcblxuICAgICAgaWYgKG1lc3NhZ2VzJDEgPT09IG1lc3NhZ2VzKSB7XG4gICAgICAgIG1lc3NhZ2VzJDEgPSBuZXdNZXNzYWdlcygpO1xuICAgICAgfVxuXG4gICAgICBkZWVwTWVyZ2UobWVzc2FnZXMkMSwgb3B0aW9ucy5tZXNzYWdlcyk7XG4gICAgICBvcHRpb25zLm1lc3NhZ2VzID0gbWVzc2FnZXMkMTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucy5tZXNzYWdlcyA9IHRoaXMubWVzc2FnZXMoKTtcbiAgICB9XG5cbiAgICB2YXIgc2VyaWVzID0ge307XG4gICAgdmFyIGtleXMgPSBvcHRpb25zLmtleXMgfHwgT2JqZWN0LmtleXModGhpcy5ydWxlcyk7XG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uICh6KSB7XG4gICAgICB2YXIgYXJyID0gX3RoaXMyLnJ1bGVzW3pdO1xuICAgICAgdmFyIHZhbHVlID0gc291cmNlW3pdO1xuICAgICAgYXJyLmZvckVhY2goZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgdmFyIHJ1bGUgPSByO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcnVsZS50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBpZiAoc291cmNlID09PSBzb3VyY2VfKSB7XG4gICAgICAgICAgICBzb3VyY2UgPSBfZXh0ZW5kcyh7fSwgc291cmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YWx1ZSA9IHNvdXJjZVt6XSA9IHJ1bGUudHJhbnNmb3JtKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgcnVsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJ1bGUgPSB7XG4gICAgICAgICAgICB2YWxpZGF0b3I6IHJ1bGVcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJ1bGUgPSBfZXh0ZW5kcyh7fSwgcnVsZSk7XG4gICAgICAgIH0gLy8gRmlsbCB2YWxpZGF0b3IuIFNraXAgaWYgbm90aGluZyBuZWVkIHRvIHZhbGlkYXRlXG5cblxuICAgICAgICBydWxlLnZhbGlkYXRvciA9IF90aGlzMi5nZXRWYWxpZGF0aW9uTWV0aG9kKHJ1bGUpO1xuXG4gICAgICAgIGlmICghcnVsZS52YWxpZGF0b3IpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBydWxlLmZpZWxkID0gejtcbiAgICAgICAgcnVsZS5mdWxsRmllbGQgPSBydWxlLmZ1bGxGaWVsZCB8fCB6O1xuICAgICAgICBydWxlLnR5cGUgPSBfdGhpczIuZ2V0VHlwZShydWxlKTtcbiAgICAgICAgc2VyaWVzW3pdID0gc2VyaWVzW3pdIHx8IFtdO1xuICAgICAgICBzZXJpZXNbel0ucHVzaCh7XG4gICAgICAgICAgcnVsZTogcnVsZSxcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgZmllbGQ6IHpcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB2YXIgZXJyb3JGaWVsZHMgPSB7fTtcbiAgICByZXR1cm4gYXN5bmNNYXAoc2VyaWVzLCBvcHRpb25zLCBmdW5jdGlvbiAoZGF0YSwgZG9JdCkge1xuICAgICAgdmFyIHJ1bGUgPSBkYXRhLnJ1bGU7XG4gICAgICB2YXIgZGVlcCA9IChydWxlLnR5cGUgPT09ICdvYmplY3QnIHx8IHJ1bGUudHlwZSA9PT0gJ2FycmF5JykgJiYgKHR5cGVvZiBydWxlLmZpZWxkcyA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHJ1bGUuZGVmYXVsdEZpZWxkID09PSAnb2JqZWN0Jyk7XG4gICAgICBkZWVwID0gZGVlcCAmJiAocnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBkYXRhLnZhbHVlKTtcbiAgICAgIHJ1bGUuZmllbGQgPSBkYXRhLmZpZWxkO1xuXG4gICAgICBmdW5jdGlvbiBhZGRGdWxsRmllbGQoa2V5LCBzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzY2hlbWEsIHtcbiAgICAgICAgICBmdWxsRmllbGQ6IHJ1bGUuZnVsbEZpZWxkICsgXCIuXCIgKyBrZXksXG4gICAgICAgICAgZnVsbEZpZWxkczogcnVsZS5mdWxsRmllbGRzID8gW10uY29uY2F0KHJ1bGUuZnVsbEZpZWxkcywgW2tleV0pIDogW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNiKGUpIHtcbiAgICAgICAgaWYgKGUgPT09IHZvaWQgMCkge1xuICAgICAgICAgIGUgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBlcnJvckxpc3QgPSBBcnJheS5pc0FycmF5KGUpID8gZSA6IFtlXTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMuc3VwcHJlc3NXYXJuaW5nICYmIGVycm9yTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICBTY2hlbWEud2FybmluZygnYXN5bmMtdmFsaWRhdG9yOicsIGVycm9yTGlzdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3JMaXN0Lmxlbmd0aCAmJiBydWxlLm1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGVycm9yTGlzdCA9IFtdLmNvbmNhdChydWxlLm1lc3NhZ2UpO1xuICAgICAgICB9IC8vIEZpbGwgZXJyb3IgaW5mb1xuXG5cbiAgICAgICAgdmFyIGZpbGxlZEVycm9ycyA9IGVycm9yTGlzdC5tYXAoY29tcGxlbWVudEVycm9yKHJ1bGUsIHNvdXJjZSkpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmZpcnN0ICYmIGZpbGxlZEVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICBlcnJvckZpZWxkc1tydWxlLmZpZWxkXSA9IDE7XG4gICAgICAgICAgcmV0dXJuIGRvSXQoZmlsbGVkRXJyb3JzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGVlcCkge1xuICAgICAgICAgIGRvSXQoZmlsbGVkRXJyb3JzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpZiBydWxlIGlzIHJlcXVpcmVkIGJ1dCB0aGUgdGFyZ2V0IG9iamVjdFxuICAgICAgICAgIC8vIGRvZXMgbm90IGV4aXN0IGZhaWwgYXQgdGhlIHJ1bGUgbGV2ZWwgYW5kIGRvbid0XG4gICAgICAgICAgLy8gZ28gZGVlcGVyXG4gICAgICAgICAgaWYgKHJ1bGUucmVxdWlyZWQgJiYgIWRhdGEudmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChydWxlLm1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBmaWxsZWRFcnJvcnMgPSBbXS5jb25jYXQocnVsZS5tZXNzYWdlKS5tYXAoY29tcGxlbWVudEVycm9yKHJ1bGUsIHNvdXJjZSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmVycm9yKSB7XG4gICAgICAgICAgICAgIGZpbGxlZEVycm9ycyA9IFtvcHRpb25zLmVycm9yKHJ1bGUsIGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnJlcXVpcmVkLCBydWxlLmZpZWxkKSldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZG9JdChmaWxsZWRFcnJvcnMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBmaWVsZHNTY2hlbWEgPSB7fTtcblxuICAgICAgICAgIGlmIChydWxlLmRlZmF1bHRGaWVsZCkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGF0YS52YWx1ZSkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgZmllbGRzU2NoZW1hW2tleV0gPSBydWxlLmRlZmF1bHRGaWVsZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpZWxkc1NjaGVtYSA9IF9leHRlbmRzKHt9LCBmaWVsZHNTY2hlbWEsIGRhdGEucnVsZS5maWVsZHMpO1xuICAgICAgICAgIHZhciBwYXJlZEZpZWxkc1NjaGVtYSA9IHt9O1xuICAgICAgICAgIE9iamVjdC5rZXlzKGZpZWxkc1NjaGVtYSkuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgICAgIHZhciBmaWVsZFNjaGVtYSA9IGZpZWxkc1NjaGVtYVtmaWVsZF07XG4gICAgICAgICAgICB2YXIgZmllbGRTY2hlbWFMaXN0ID0gQXJyYXkuaXNBcnJheShmaWVsZFNjaGVtYSkgPyBmaWVsZFNjaGVtYSA6IFtmaWVsZFNjaGVtYV07XG4gICAgICAgICAgICBwYXJlZEZpZWxkc1NjaGVtYVtmaWVsZF0gPSBmaWVsZFNjaGVtYUxpc3QubWFwKGFkZEZ1bGxGaWVsZC5iaW5kKG51bGwsIGZpZWxkKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIHNjaGVtYSA9IG5ldyBTY2hlbWEocGFyZWRGaWVsZHNTY2hlbWEpO1xuICAgICAgICAgIHNjaGVtYS5tZXNzYWdlcyhvcHRpb25zLm1lc3NhZ2VzKTtcblxuICAgICAgICAgIGlmIChkYXRhLnJ1bGUub3B0aW9ucykge1xuICAgICAgICAgICAgZGF0YS5ydWxlLm9wdGlvbnMubWVzc2FnZXMgPSBvcHRpb25zLm1lc3NhZ2VzO1xuICAgICAgICAgICAgZGF0YS5ydWxlLm9wdGlvbnMuZXJyb3IgPSBvcHRpb25zLmVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNjaGVtYS52YWxpZGF0ZShkYXRhLnZhbHVlLCBkYXRhLnJ1bGUub3B0aW9ucyB8fCBvcHRpb25zLCBmdW5jdGlvbiAoZXJycykge1xuICAgICAgICAgICAgdmFyIGZpbmFsRXJyb3JzID0gW107XG5cbiAgICAgICAgICAgIGlmIChmaWxsZWRFcnJvcnMgJiYgZmlsbGVkRXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBmaW5hbEVycm9ycy5wdXNoLmFwcGx5KGZpbmFsRXJyb3JzLCBmaWxsZWRFcnJvcnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXJycyAmJiBlcnJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBmaW5hbEVycm9ycy5wdXNoLmFwcGx5KGZpbmFsRXJyb3JzLCBlcnJzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9JdChmaW5hbEVycm9ycy5sZW5ndGggPyBmaW5hbEVycm9ycyA6IG51bGwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciByZXM7XG5cbiAgICAgIGlmIChydWxlLmFzeW5jVmFsaWRhdG9yKSB7XG4gICAgICAgIHJlcyA9IHJ1bGUuYXN5bmNWYWxpZGF0b3IocnVsZSwgZGF0YS52YWx1ZSwgY2IsIGRhdGEuc291cmNlLCBvcHRpb25zKTtcbiAgICAgIH0gZWxzZSBpZiAocnVsZS52YWxpZGF0b3IpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXMgPSBydWxlLnZhbGlkYXRvcihydWxlLCBkYXRhLnZhbHVlLCBjYiwgZGF0YS5zb3VyY2UsIG9wdGlvbnMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbnNvbGUuZXJyb3IoZXJyb3IpOyAvLyByZXRocm93IHRvIHJlcG9ydCBlcnJvclxuXG4gICAgICAgICAgaWYgKCFvcHRpb25zLnN1cHByZXNzVmFsaWRhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNiKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlcyA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGNiKCk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzID09PSBmYWxzZSkge1xuICAgICAgICAgIGNiKHR5cGVvZiBydWxlLm1lc3NhZ2UgPT09ICdmdW5jdGlvbicgPyBydWxlLm1lc3NhZ2UocnVsZS5mdWxsRmllbGQgfHwgcnVsZS5maWVsZCkgOiBydWxlLm1lc3NhZ2UgfHwgKHJ1bGUuZnVsbEZpZWxkIHx8IHJ1bGUuZmllbGQpICsgXCIgZmFpbHNcIik7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICBjYihyZXMpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgY2IocmVzLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXMgJiYgcmVzLnRoZW4pIHtcbiAgICAgICAgcmVzLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjYigpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHJldHVybiBjYihlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgIGNvbXBsZXRlKHJlc3VsdHMpO1xuICAgIH0sIHNvdXJjZSk7XG4gIH07XG5cbiAgX3Byb3RvLmdldFR5cGUgPSBmdW5jdGlvbiBnZXRUeXBlKHJ1bGUpIHtcbiAgICBpZiAocnVsZS50eXBlID09PSB1bmRlZmluZWQgJiYgcnVsZS5wYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICBydWxlLnR5cGUgPSAncGF0dGVybic7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBydWxlLnZhbGlkYXRvciAhPT0gJ2Z1bmN0aW9uJyAmJiBydWxlLnR5cGUgJiYgIXZhbGlkYXRvcnMuaGFzT3duUHJvcGVydHkocnVsZS50eXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGZvcm1hdCgnVW5rbm93biBydWxlIHR5cGUgJXMnLCBydWxlLnR5cGUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcnVsZS50eXBlIHx8ICdzdHJpbmcnO1xuICB9O1xuXG4gIF9wcm90by5nZXRWYWxpZGF0aW9uTWV0aG9kID0gZnVuY3Rpb24gZ2V0VmFsaWRhdGlvbk1ldGhvZChydWxlKSB7XG4gICAgaWYgKHR5cGVvZiBydWxlLnZhbGlkYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHJ1bGUudmFsaWRhdG9yO1xuICAgIH1cblxuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocnVsZSk7XG4gICAgdmFyIG1lc3NhZ2VJbmRleCA9IGtleXMuaW5kZXhPZignbWVzc2FnZScpO1xuXG4gICAgaWYgKG1lc3NhZ2VJbmRleCAhPT0gLTEpIHtcbiAgICAgIGtleXMuc3BsaWNlKG1lc3NhZ2VJbmRleCwgMSk7XG4gICAgfVxuXG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAxICYmIGtleXNbMF0gPT09ICdyZXF1aXJlZCcpIHtcbiAgICAgIHJldHVybiB2YWxpZGF0b3JzLnJlcXVpcmVkO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0b3JzW3RoaXMuZ2V0VHlwZShydWxlKV0gfHwgdW5kZWZpbmVkO1xuICB9O1xuXG4gIHJldHVybiBTY2hlbWE7XG59KCk7XG5cblNjaGVtYS5yZWdpc3RlciA9IGZ1bmN0aW9uIHJlZ2lzdGVyKHR5cGUsIHZhbGlkYXRvcikge1xuICBpZiAodHlwZW9mIHZhbGlkYXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlZ2lzdGVyIGEgdmFsaWRhdG9yIGJ5IHR5cGUsIHZhbGlkYXRvciBpcyBub3QgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgdmFsaWRhdG9yc1t0eXBlXSA9IHZhbGlkYXRvcjtcbn07XG5cblNjaGVtYS53YXJuaW5nID0gd2FybmluZztcblNjaGVtYS5tZXNzYWdlcyA9IG1lc3NhZ2VzO1xuU2NoZW1hLnZhbGlkYXRvcnMgPSB2YWxpZGF0b3JzO1xuXG5leHBvcnQgeyBTY2hlbWEgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iLCJ2YXIgdHlwZVRlbXBsYXRlID0gXCInJHtuYW1lfScgaXMgbm90IGEgdmFsaWQgJHt0eXBlfVwiO1xuZXhwb3J0IHZhciBkZWZhdWx0VmFsaWRhdGVNZXNzYWdlcyA9IHtcbiAgZGVmYXVsdDogXCJWYWxpZGF0aW9uIGVycm9yIG9uIGZpZWxkICcke25hbWV9J1wiLFxuICByZXF1aXJlZDogXCInJHtuYW1lfScgaXMgcmVxdWlyZWRcIixcbiAgZW51bTogXCInJHtuYW1lfScgbXVzdCBiZSBvbmUgb2YgWyR7ZW51bX1dXCIsXG4gIHdoaXRlc3BhY2U6IFwiJyR7bmFtZX0nIGNhbm5vdCBiZSBlbXB0eVwiLFxuICBkYXRlOiB7XG4gICAgZm9ybWF0OiBcIicke25hbWV9JyBpcyBpbnZhbGlkIGZvciBmb3JtYXQgZGF0ZVwiLFxuICAgIHBhcnNlOiBcIicke25hbWV9JyBjb3VsZCBub3QgYmUgcGFyc2VkIGFzIGRhdGVcIixcbiAgICBpbnZhbGlkOiBcIicke25hbWV9JyBpcyBpbnZhbGlkIGRhdGVcIlxuICB9LFxuICB0eXBlczoge1xuICAgIHN0cmluZzogdHlwZVRlbXBsYXRlLFxuICAgIG1ldGhvZDogdHlwZVRlbXBsYXRlLFxuICAgIGFycmF5OiB0eXBlVGVtcGxhdGUsXG4gICAgb2JqZWN0OiB0eXBlVGVtcGxhdGUsXG4gICAgbnVtYmVyOiB0eXBlVGVtcGxhdGUsXG4gICAgZGF0ZTogdHlwZVRlbXBsYXRlLFxuICAgIGJvb2xlYW46IHR5cGVUZW1wbGF0ZSxcbiAgICBpbnRlZ2VyOiB0eXBlVGVtcGxhdGUsXG4gICAgZmxvYXQ6IHR5cGVUZW1wbGF0ZSxcbiAgICByZWdleHA6IHR5cGVUZW1wbGF0ZSxcbiAgICBlbWFpbDogdHlwZVRlbXBsYXRlLFxuICAgIHVybDogdHlwZVRlbXBsYXRlLFxuICAgIGhleDogdHlwZVRlbXBsYXRlXG4gIH0sXG4gIHN0cmluZzoge1xuICAgIGxlbjogXCInJHtuYW1lfScgbXVzdCBiZSBleGFjdGx5ICR7bGVufSBjaGFyYWN0ZXJzXCIsXG4gICAgbWluOiBcIicke25hbWV9JyBtdXN0IGJlIGF0IGxlYXN0ICR7bWlufSBjaGFyYWN0ZXJzXCIsXG4gICAgbWF4OiBcIicke25hbWV9JyBjYW5ub3QgYmUgbG9uZ2VyIHRoYW4gJHttYXh9IGNoYXJhY3RlcnNcIixcbiAgICByYW5nZTogXCInJHtuYW1lfScgbXVzdCBiZSBiZXR3ZWVuICR7bWlufSBhbmQgJHttYXh9IGNoYXJhY3RlcnNcIlxuICB9LFxuICBudW1iZXI6IHtcbiAgICBsZW46IFwiJyR7bmFtZX0nIG11c3QgZXF1YWwgJHtsZW59XCIsXG4gICAgbWluOiBcIicke25hbWV9JyBjYW5ub3QgYmUgbGVzcyB0aGFuICR7bWlufVwiLFxuICAgIG1heDogXCInJHtuYW1lfScgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAke21heH1cIixcbiAgICByYW5nZTogXCInJHtuYW1lfScgbXVzdCBiZSBiZXR3ZWVuICR7bWlufSBhbmQgJHttYXh9XCJcbiAgfSxcbiAgYXJyYXk6IHtcbiAgICBsZW46IFwiJyR7bmFtZX0nIG11c3QgYmUgZXhhY3RseSAke2xlbn0gaW4gbGVuZ3RoXCIsXG4gICAgbWluOiBcIicke25hbWV9JyBjYW5ub3QgYmUgbGVzcyB0aGFuICR7bWlufSBpbiBsZW5ndGhcIixcbiAgICBtYXg6IFwiJyR7bmFtZX0nIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJHttYXh9IGluIGxlbmd0aFwiLFxuICAgIHJhbmdlOiBcIicke25hbWV9JyBtdXN0IGJlIGJldHdlZW4gJHttaW59IGFuZCAke21heH0gaW4gbGVuZ3RoXCJcbiAgfSxcbiAgcGF0dGVybjoge1xuICAgIG1pc21hdGNoOiBcIicke25hbWV9JyBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuICR7cGF0dGVybn1cIlxuICB9XG59OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldChlbnRpdHksIHBhdGgpIHtcbiAgdmFyIGN1cnJlbnQgPSBlbnRpdHk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRbcGF0aFtpXV07XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnQ7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59IiwiaW1wb3J0IGFycmF5V2l0aEhvbGVzIGZyb20gXCIuL2FycmF5V2l0aEhvbGVzLmpzXCI7XG5pbXBvcnQgaXRlcmFibGVUb0FycmF5IGZyb20gXCIuL2l0ZXJhYmxlVG9BcnJheS5qc1wiO1xuaW1wb3J0IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IGZyb20gXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzXCI7XG5pbXBvcnQgbm9uSXRlcmFibGVSZXN0IGZyb20gXCIuL25vbkl0ZXJhYmxlUmVzdC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3RvQXJyYXkoYXJyKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhhcnIpIHx8IGl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX3RvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQXJyYXlcIjtcbmltcG9ydCBnZXQgZnJvbSBcIi4vZ2V0XCI7XG5mdW5jdGlvbiBpbnRlcm5hbFNldChlbnRpdHksIHBhdGhzLCB2YWx1ZSwgcmVtb3ZlSWZVbmRlZmluZWQpIHtcbiAgaWYgKCFwYXRocy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdmFyIF9wYXRocyA9IF90b0FycmF5KHBhdGhzKSxcbiAgICBwYXRoID0gX3BhdGhzWzBdLFxuICAgIHJlc3RQYXRoID0gX3BhdGhzLnNsaWNlKDEpO1xuICB2YXIgY2xvbmU7XG4gIGlmICghZW50aXR5ICYmIHR5cGVvZiBwYXRoID09PSAnbnVtYmVyJykge1xuICAgIGNsb25lID0gW107XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShlbnRpdHkpKSB7XG4gICAgY2xvbmUgPSBfdG9Db25zdW1hYmxlQXJyYXkoZW50aXR5KTtcbiAgfSBlbHNlIHtcbiAgICBjbG9uZSA9IF9vYmplY3RTcHJlYWQoe30sIGVudGl0eSk7XG4gIH1cblxuICAvLyBEZWxldGUgcHJvcCBpZiBgcmVtb3ZlSWZVbmRlZmluZWRgIGFuZCB2YWx1ZSBpcyB1bmRlZmluZWRcbiAgaWYgKHJlbW92ZUlmVW5kZWZpbmVkICYmIHZhbHVlID09PSB1bmRlZmluZWQgJiYgcmVzdFBhdGgubGVuZ3RoID09PSAxKSB7XG4gICAgZGVsZXRlIGNsb25lW3BhdGhdW3Jlc3RQYXRoWzBdXTtcbiAgfSBlbHNlIHtcbiAgICBjbG9uZVtwYXRoXSA9IGludGVybmFsU2V0KGNsb25lW3BhdGhdLCByZXN0UGF0aCwgdmFsdWUsIHJlbW92ZUlmVW5kZWZpbmVkKTtcbiAgfVxuICByZXR1cm4gY2xvbmU7XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZXQoZW50aXR5LCBwYXRocywgdmFsdWUpIHtcbiAgdmFyIHJlbW92ZUlmVW5kZWZpbmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBmYWxzZTtcbiAgLy8gRG8gbm90aGluZyBpZiBgcmVtb3ZlSWZVbmRlZmluZWRgIGFuZCBwYXJlbnQgb2JqZWN0IG5vdCBleGlzdFxuICBpZiAocGF0aHMubGVuZ3RoICYmIHJlbW92ZUlmVW5kZWZpbmVkICYmIHZhbHVlID09PSB1bmRlZmluZWQgJiYgIWdldChlbnRpdHksIHBhdGhzLnNsaWNlKDAsIC0xKSkpIHtcbiAgICByZXR1cm4gZW50aXR5O1xuICB9XG4gIHJldHVybiBpbnRlcm5hbFNldChlbnRpdHksIHBhdGhzLCB2YWx1ZSwgcmVtb3ZlSWZVbmRlZmluZWQpO1xufVxuZnVuY3Rpb24gaXNPYmplY3Qob2JqKSB7XG4gIHJldHVybiBfdHlwZW9mKG9iaikgPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUVtcHR5KHNvdXJjZSkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShzb3VyY2UpID8gW10gOiB7fTtcbn1cbnZhciBrZXlzID0gdHlwZW9mIFJlZmxlY3QgPT09ICd1bmRlZmluZWQnID8gT2JqZWN0LmtleXMgOiBSZWZsZWN0Lm93bktleXM7XG5cbi8qKlxuICogTWVyZ2Ugb2JqZWN0cyB3aGljaCB3aWxsIGNyZWF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2UoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBzb3VyY2VzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHNvdXJjZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cbiAgdmFyIGNsb25lID0gY3JlYXRlRW1wdHkoc291cmNlc1swXSk7XG4gIHNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc3JjKSB7XG4gICAgZnVuY3Rpb24gaW50ZXJuYWxNZXJnZShwYXRoLCBwYXJlbnRMb29wU2V0KSB7XG4gICAgICB2YXIgbG9vcFNldCA9IG5ldyBTZXQocGFyZW50TG9vcFNldCk7XG4gICAgICB2YXIgdmFsdWUgPSBnZXQoc3JjLCBwYXRoKTtcbiAgICAgIHZhciBpc0FyciA9IEFycmF5LmlzQXJyYXkodmFsdWUpO1xuICAgICAgaWYgKGlzQXJyIHx8IGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAvLyBPbmx5IGFkZCBub3QgbG9vcCBvYmpcbiAgICAgICAgaWYgKCFsb29wU2V0Lmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICBsb29wU2V0LmFkZCh2YWx1ZSk7XG4gICAgICAgICAgdmFyIG9yaWdpblZhbHVlID0gZ2V0KGNsb25lLCBwYXRoKTtcbiAgICAgICAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgICAgIC8vIEFycmF5IHdpbGwgYWx3YXlzIGJlIG92ZXJyaWRlXG4gICAgICAgICAgICBjbG9uZSA9IHNldChjbG9uZSwgcGF0aCwgW10pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIW9yaWdpblZhbHVlIHx8IF90eXBlb2Yob3JpZ2luVmFsdWUpICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgLy8gSW5pdCBjb250YWluZXIgaWYgbm90IGV4aXN0XG4gICAgICAgICAgICBjbG9uZSA9IHNldChjbG9uZSwgcGF0aCwgY3JlYXRlRW1wdHkodmFsdWUpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAga2V5cyh2YWx1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBpbnRlcm5hbE1lcmdlKFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocGF0aCksIFtrZXldKSwgbG9vcFNldCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsb25lID0gc2V0KGNsb25lLCBwYXRoLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGludGVybmFsTWVyZ2UoW10pO1xuICB9KTtcbiAgcmV0dXJuIGNsb25lO1xufSIsImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmZ1bmN0aW9uIGNsb25lRGVlcCh2YWwpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgIHJldHVybiBjbG9uZUFycmF5RGVlcCh2YWwpO1xuICB9IGVsc2UgaWYgKF90eXBlb2YodmFsKSA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNsb25lT2JqZWN0RGVlcCh2YWwpO1xuICB9XG4gIHJldHVybiB2YWw7XG59XG5mdW5jdGlvbiBjbG9uZU9iamVjdERlZXAodmFsKSB7XG4gIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsKSA9PT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIHZhciByZXMgPSB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdmFsKSB7XG4gICAgICByZXNba2V5XSA9IGNsb25lRGVlcCh2YWxba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcmV0dXJuIHZhbDtcbn1cbmZ1bmN0aW9uIGNsb25lQXJyYXlEZWVwKHZhbCkge1xuICByZXR1cm4gdmFsLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgIHJldHVybiBjbG9uZURlZXAoaXRlbSk7XG4gIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgY2xvbmVEZWVwOyIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IGdldCBmcm9tIFwicmMtdXRpbC9lcy91dGlscy9nZXRcIjtcbmltcG9ydCBzZXQgZnJvbSBcInJjLXV0aWwvZXMvdXRpbHMvc2V0XCI7XG5pbXBvcnQgeyB0b0FycmF5IH0gZnJvbSAnLi90eXBlVXRpbCc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJy4uL3V0aWxzL2Nsb25lRGVlcCc7XG4vKipcbiAqIENvbnZlcnQgbmFtZSB0byBpbnRlcm5hbCBzdXBwb3J0ZWQgZm9ybWF0LlxuICogVGhpcyBmdW5jdGlvbiBzaG91bGQga2VlcCBzaW5jZSB3ZSBzdGlsbCB0aGlua2luZyBpZiBuZWVkIHN1cHBvcnQgbGlrZSBgYS5iLmNgIGZvcm1hdC5cbiAqICdhJyA9PiBbJ2EnXVxuICogMTIzID0+IFsxMjNdXG4gKiBbJ2EnLCAxMjNdID0+IFsnYScsIDEyM11cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbWVQYXRoKHBhdGgpIHtcbiAgcmV0dXJuIHRvQXJyYXkocGF0aCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWUoc3RvcmUsIG5hbWVQYXRoKSB7XG4gIHZhciB2YWx1ZSA9IGdldChzdG9yZSwgbmFtZVBhdGgpO1xuICByZXR1cm4gdmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gc2V0VmFsdWUoc3RvcmUsIG5hbWVQYXRoLCB2YWx1ZSkge1xuICB2YXIgcmVtb3ZlSWZVbmRlZmluZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlO1xuICB2YXIgbmV3U3RvcmUgPSBzZXQoc3RvcmUsIG5hbWVQYXRoLCB2YWx1ZSwgcmVtb3ZlSWZVbmRlZmluZWQpO1xuICByZXR1cm4gbmV3U3RvcmU7XG59XG5leHBvcnQgZnVuY3Rpb24gY2xvbmVCeU5hbWVQYXRoTGlzdChzdG9yZSwgbmFtZVBhdGhMaXN0KSB7XG4gIHZhciBuZXdTdG9yZSA9IHt9O1xuICBuYW1lUGF0aExpc3QuZm9yRWFjaChmdW5jdGlvbiAobmFtZVBhdGgpIHtcbiAgICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShzdG9yZSwgbmFtZVBhdGgpO1xuICAgIG5ld1N0b3JlID0gc2V0VmFsdWUobmV3U3RvcmUsIG5hbWVQYXRoLCB2YWx1ZSk7XG4gIH0pO1xuICByZXR1cm4gbmV3U3RvcmU7XG59XG5leHBvcnQgZnVuY3Rpb24gY29udGFpbnNOYW1lUGF0aChuYW1lUGF0aExpc3QsIG5hbWVQYXRoKSB7XG4gIHJldHVybiBuYW1lUGF0aExpc3QgJiYgbmFtZVBhdGhMaXN0LnNvbWUoZnVuY3Rpb24gKHBhdGgpIHtcbiAgICByZXR1cm4gbWF0Y2hOYW1lUGF0aChwYXRoLCBuYW1lUGF0aCk7XG4gIH0pO1xufVxuZnVuY3Rpb24gaXNPYmplY3Qob2JqKSB7XG4gIHJldHVybiBfdHlwZW9mKG9iaikgPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbn1cbi8qKlxuICogQ29weSB2YWx1ZXMgaW50byBzdG9yZSBhbmQgcmV0dXJuIGEgbmV3IHZhbHVlcyBvYmplY3RcbiAqICh7IGE6IDEsIGI6IHsgYzogMiB9IH0sIHsgYTogNCwgYjogeyBkOiA1IH0gfSkgPT4geyBhOiA0LCBiOiB7IGM6IDIsIGQ6IDUgfSB9XG4gKi9cbmZ1bmN0aW9uIGludGVybmFsU2V0VmFsdWVzKHN0b3JlLCB2YWx1ZXMpIHtcbiAgdmFyIG5ld1N0b3JlID0gQXJyYXkuaXNBcnJheShzdG9yZSkgPyBfdG9Db25zdW1hYmxlQXJyYXkoc3RvcmUpIDogX29iamVjdFNwcmVhZCh7fSwgc3RvcmUpO1xuICBpZiAoIXZhbHVlcykge1xuICAgIHJldHVybiBuZXdTdG9yZTtcbiAgfVxuICBPYmplY3Qua2V5cyh2YWx1ZXMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBwcmV2VmFsdWUgPSBuZXdTdG9yZVtrZXldO1xuICAgIHZhciB2YWx1ZSA9IHZhbHVlc1trZXldO1xuICAgIC8vIElmIGJvdGggYXJlIG9iamVjdCAoYnV0IHRhcmdldCBpcyBub3QgYXJyYXkpLCB3ZSB1c2UgcmVjdXJzaW9uIHRvIHNldCBkZWVwIHZhbHVlXG4gICAgdmFyIHJlY3Vyc2l2ZSA9IGlzT2JqZWN0KHByZXZWYWx1ZSkgJiYgaXNPYmplY3QodmFsdWUpO1xuICAgIG5ld1N0b3JlW2tleV0gPSByZWN1cnNpdmUgPyBpbnRlcm5hbFNldFZhbHVlcyhwcmV2VmFsdWUsIHZhbHVlIHx8IHt9KSA6IGNsb25lRGVlcCh2YWx1ZSk7IC8vIENsb25lIGRlZXAgZm9yIGFycmF5c1xuICB9KTtcblxuICByZXR1cm4gbmV3U3RvcmU7XG59XG5leHBvcnQgZnVuY3Rpb24gc2V0VmFsdWVzKHN0b3JlKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCByZXN0VmFsdWVzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICByZXN0VmFsdWVzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuICByZXR1cm4gcmVzdFZhbHVlcy5yZWR1Y2UoZnVuY3Rpb24gKGN1cnJlbnQsIG5ld1N0b3JlKSB7XG4gICAgcmV0dXJuIGludGVybmFsU2V0VmFsdWVzKGN1cnJlbnQsIG5ld1N0b3JlKTtcbiAgfSwgc3RvcmUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoTmFtZVBhdGgobmFtZVBhdGgsIGNoYW5nZWROYW1lUGF0aCkge1xuICBpZiAoIW5hbWVQYXRoIHx8ICFjaGFuZ2VkTmFtZVBhdGggfHwgbmFtZVBhdGgubGVuZ3RoICE9PSBjaGFuZ2VkTmFtZVBhdGgubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBuYW1lUGF0aC5ldmVyeShmdW5jdGlvbiAobmFtZVVuaXQsIGkpIHtcbiAgICByZXR1cm4gY2hhbmdlZE5hbWVQYXRoW2ldID09PSBuYW1lVW5pdDtcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTaW1pbGFyKHNvdXJjZSwgdGFyZ2V0KSB7XG4gIGlmIChzb3VyY2UgPT09IHRhcmdldCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICghc291cmNlICYmIHRhcmdldCB8fCBzb3VyY2UgJiYgIXRhcmdldCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoIXNvdXJjZSB8fCAhdGFyZ2V0IHx8IF90eXBlb2Yoc291cmNlKSAhPT0gJ29iamVjdCcgfHwgX3R5cGVvZih0YXJnZXQpICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gIHZhciB0YXJnZXRLZXlzID0gT2JqZWN0LmtleXModGFyZ2V0KTtcbiAgdmFyIGtleXMgPSBuZXcgU2V0KFtdLmNvbmNhdChzb3VyY2VLZXlzLCB0YXJnZXRLZXlzKSk7XG4gIHJldHVybiBfdG9Db25zdW1hYmxlQXJyYXkoa2V5cykuZXZlcnkoZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBzb3VyY2VWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgIHZhciB0YXJnZXRWYWx1ZSA9IHRhcmdldFtrZXldO1xuICAgIGlmICh0eXBlb2Ygc291cmNlVmFsdWUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHRhcmdldFZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZVZhbHVlID09PSB0YXJnZXRWYWx1ZTtcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdEdldFZhbHVlRnJvbUV2ZW50KHZhbHVlUHJvcE5hbWUpIHtcbiAgdmFyIGV2ZW50ID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzFdO1xuICBpZiAoZXZlbnQgJiYgZXZlbnQudGFyZ2V0ICYmIF90eXBlb2YoZXZlbnQudGFyZ2V0KSA9PT0gJ29iamVjdCcgJiYgdmFsdWVQcm9wTmFtZSBpbiBldmVudC50YXJnZXQpIHtcbiAgICByZXR1cm4gZXZlbnQudGFyZ2V0W3ZhbHVlUHJvcE5hbWVdO1xuICB9XG4gIHJldHVybiBldmVudDtcbn1cbi8qKlxuICogTW92ZXMgYW4gYXJyYXkgaXRlbSBmcm9tIG9uZSBwb3NpdGlvbiBpbiBhbiBhcnJheSB0byBhbm90aGVyLlxuICpcbiAqIE5vdGU6IFRoaXMgaXMgYSBwdXJlIGZ1bmN0aW9uIHNvIGEgbmV3IGFycmF5IHdpbGwgYmUgcmV0dXJuZWQsIGluc3RlYWRcbiAqIG9mIGFsdGVyaW5nIHRoZSBhcnJheSBhcmd1bWVudC5cbiAqXG4gKiBAcGFyYW0gYXJyYXkgICAgICAgICBBcnJheSBpbiB3aGljaCB0byBtb3ZlIGFuIGl0ZW0uICAgICAgICAgKHJlcXVpcmVkKVxuICogQHBhcmFtIG1vdmVJbmRleCAgICAgVGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIG1vdmUuICAgICAgICAgIChyZXF1aXJlZClcbiAqIEBwYXJhbSB0b0luZGV4ICAgICAgIFRoZSBpbmRleCB0byBtb3ZlIGl0ZW0gYXQgbW92ZUluZGV4IHRvLiAocmVxdWlyZWQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb3ZlKGFycmF5LCBtb3ZlSW5kZXgsIHRvSW5kZXgpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgaWYgKG1vdmVJbmRleCA8IDAgfHwgbW92ZUluZGV4ID49IGxlbmd0aCB8fCB0b0luZGV4IDwgMCB8fCB0b0luZGV4ID49IGxlbmd0aCkge1xuICAgIHJldHVybiBhcnJheTtcbiAgfVxuICB2YXIgaXRlbSA9IGFycmF5W21vdmVJbmRleF07XG4gIHZhciBkaWZmID0gbW92ZUluZGV4IC0gdG9JbmRleDtcbiAgaWYgKGRpZmYgPiAwKSB7XG4gICAgLy8gbW92ZSBsZWZ0XG4gICAgcmV0dXJuIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoYXJyYXkuc2xpY2UoMCwgdG9JbmRleCkpLCBbaXRlbV0sIF90b0NvbnN1bWFibGVBcnJheShhcnJheS5zbGljZSh0b0luZGV4LCBtb3ZlSW5kZXgpKSwgX3RvQ29uc3VtYWJsZUFycmF5KGFycmF5LnNsaWNlKG1vdmVJbmRleCArIDEsIGxlbmd0aCkpKTtcbiAgfVxuICBpZiAoZGlmZiA8IDApIHtcbiAgICAvLyBtb3ZlIHJpZ2h0XG4gICAgcmV0dXJuIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoYXJyYXkuc2xpY2UoMCwgbW92ZUluZGV4KSksIF90b0NvbnN1bWFibGVBcnJheShhcnJheS5zbGljZShtb3ZlSW5kZXggKyAxLCB0b0luZGV4ICsgMSkpLCBbaXRlbV0sIF90b0NvbnN1bWFibGVBcnJheShhcnJheS5zbGljZSh0b0luZGV4ICsgMSwgbGVuZ3RoKSkpO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn0iLCJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfcmVnZW5lcmF0b3JSdW50aW1lIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9yZWdlbmVyYXRvclJ1bnRpbWVcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FzeW5jVG9HZW5lcmF0b3JcIjtcbmltcG9ydCBSYXdBc3luY1ZhbGlkYXRvciBmcm9tICdhc3luYy12YWxpZGF0b3InO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IHsgZGVmYXVsdFZhbGlkYXRlTWVzc2FnZXMgfSBmcm9tICcuL21lc3NhZ2VzJztcbmltcG9ydCB7IHNldFZhbHVlcyB9IGZyb20gJy4vdmFsdWVVdGlsJztcbi8vIFJlbW92ZSBpbmNvcnJlY3Qgb3JpZ2luYWwgdHMgZGVmaW5lXG52YXIgQXN5bmNWYWxpZGF0b3IgPSBSYXdBc3luY1ZhbGlkYXRvcjtcbi8qKlxuICogUmVwbGFjZSB3aXRoIHRlbXBsYXRlLlxuICogICBgSSdtICR7bmFtZX1gICsgeyBuYW1lOiAnYmFtYm9vJyB9ID0gSSdtIGJhbWJvb1xuICovXG5mdW5jdGlvbiByZXBsYWNlTWVzc2FnZSh0ZW1wbGF0ZSwga3YpIHtcbiAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoL1xcJFxce1xcdytcXH0vZywgZnVuY3Rpb24gKHN0cikge1xuICAgIHZhciBrZXkgPSBzdHIuc2xpY2UoMiwgLTEpO1xuICAgIHJldHVybiBrdltrZXldO1xuICB9KTtcbn1cbnZhciBDT0RFX0xPR0lDX0VSUk9SID0gJ0NPREVfTE9HSUNfRVJST1InO1xuZnVuY3Rpb24gdmFsaWRhdGVSdWxlKF94LCBfeDIsIF94MywgX3g0LCBfeDUpIHtcbiAgcmV0dXJuIF92YWxpZGF0ZVJ1bGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbi8qKlxuICogV2UgdXNlIGBhc3luYy12YWxpZGF0b3JgIHRvIHZhbGlkYXRlIHRoZSB2YWx1ZS5cbiAqIEJ1dCBvbmx5IGNoZWNrIG9uZSB2YWx1ZSBpbiBhIHRpbWUgdG8gYXZvaWQgbmFtZVBhdGggdmFsaWRhdGUgaXNzdWUuXG4gKi9cbmZ1bmN0aW9uIF92YWxpZGF0ZVJ1bGUoKSB7XG4gIF92YWxpZGF0ZVJ1bGUgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKG5hbWUsIHZhbHVlLCBydWxlLCBvcHRpb25zLCBtZXNzYWdlVmFyaWFibGVzKSB7XG4gICAgdmFyIGNsb25lUnVsZSwgb3JpZ2luVmFsaWRhdG9yLCBzdWJSdWxlRmllbGQsIHZhbGlkYXRvciwgbWVzc2FnZXMsIHJlc3VsdCwgc3ViUmVzdWx0cywga3YsIGZpbGxWYXJpYWJsZVJlc3VsdDtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY2xvbmVSdWxlID0gX29iamVjdFNwcmVhZCh7fSwgcnVsZSk7IC8vIEJ1ZyBvZiBgYXN5bmMtdmFsaWRhdG9yYFxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvZmllbGQtZm9ybS9pc3N1ZXMvMzE2XG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWNvbXBvbmVudC9maWVsZC1mb3JtL2lzc3Vlcy8zMTNcbiAgICAgICAgICBkZWxldGUgY2xvbmVSdWxlLnJ1bGVJbmRleDtcbiAgICAgICAgICBpZiAoY2xvbmVSdWxlLnZhbGlkYXRvcikge1xuICAgICAgICAgICAgb3JpZ2luVmFsaWRhdG9yID0gY2xvbmVSdWxlLnZhbGlkYXRvcjtcbiAgICAgICAgICAgIGNsb25lUnVsZS52YWxpZGF0b3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpblZhbGlkYXRvci5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KENPREVfTE9HSUNfRVJST1IpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBXZSBzaG91bGQgc3BlY2lhbCBoYW5kbGUgYXJyYXkgdmFsaWRhdGVcbiAgICAgICAgICBzdWJSdWxlRmllbGQgPSBudWxsO1xuICAgICAgICAgIGlmIChjbG9uZVJ1bGUgJiYgY2xvbmVSdWxlLnR5cGUgPT09ICdhcnJheScgJiYgY2xvbmVSdWxlLmRlZmF1bHRGaWVsZCkge1xuICAgICAgICAgICAgc3ViUnVsZUZpZWxkID0gY2xvbmVSdWxlLmRlZmF1bHRGaWVsZDtcbiAgICAgICAgICAgIGRlbGV0ZSBjbG9uZVJ1bGUuZGVmYXVsdEZpZWxkO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YWxpZGF0b3IgPSBuZXcgQXN5bmNWYWxpZGF0b3IoX2RlZmluZVByb3BlcnR5KHt9LCBuYW1lLCBbY2xvbmVSdWxlXSkpO1xuICAgICAgICAgIG1lc3NhZ2VzID0gc2V0VmFsdWVzKHt9LCBkZWZhdWx0VmFsaWRhdGVNZXNzYWdlcywgb3B0aW9ucy52YWxpZGF0ZU1lc3NhZ2VzKTtcbiAgICAgICAgICB2YWxpZGF0b3IubWVzc2FnZXMobWVzc2FnZXMpO1xuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICAgIF9jb250ZXh0Mi5wcmV2ID0gOTtcbiAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDEyO1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsaWRhdG9yLnZhbGlkYXRlKF9kZWZpbmVQcm9wZXJ0eSh7fSwgbmFtZSwgdmFsdWUpLCBfb2JqZWN0U3ByZWFkKHt9LCBvcHRpb25zKSkpO1xuICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgX2NvbnRleHQyLnByZXYgPSAxNDtcbiAgICAgICAgICBfY29udGV4dDIudDAgPSBfY29udGV4dDJbXCJjYXRjaFwiXSg5KTtcbiAgICAgICAgICBpZiAoX2NvbnRleHQyLnQwLmVycm9ycykge1xuICAgICAgICAgICAgcmVzdWx0ID0gX2NvbnRleHQyLnQwLmVycm9ycy5tYXAoZnVuY3Rpb24gKF9yZWY0LCBpbmRleCkge1xuICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IF9yZWY0Lm1lc3NhZ2U7XG4gICAgICAgICAgICAgIHZhciBtZXJnZWRNZXNzYWdlID0gbWVzc2FnZSA9PT0gQ09ERV9MT0dJQ19FUlJPUiA/IG1lc3NhZ2VzLmRlZmF1bHQgOiBtZXNzYWdlO1xuICAgICAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KG1lcmdlZE1lc3NhZ2UpID9cbiAgICAgICAgICAgICAgLyojX19QVVJFX18qL1xuICAgICAgICAgICAgICAvLyBXcmFwIFJlYWN0Tm9kZSB3aXRoIGBrZXlgXG4gICAgICAgICAgICAgIFJlYWN0LmNsb25lRWxlbWVudChtZXJnZWRNZXNzYWdlLCB7XG4gICAgICAgICAgICAgICAga2V5OiBcImVycm9yX1wiLmNvbmNhdChpbmRleClcbiAgICAgICAgICAgICAgfSkgOiBtZXJnZWRNZXNzYWdlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgIGlmICghKCFyZXN1bHQubGVuZ3RoICYmIHN1YlJ1bGVGaWVsZCkpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyMDtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwodmFsdWUubWFwKGZ1bmN0aW9uIChzdWJWYWx1ZSwgaSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlUnVsZShcIlwiLmNvbmNhdChuYW1lLCBcIi5cIikuY29uY2F0KGkpLCBzdWJWYWx1ZSwgc3ViUnVsZUZpZWxkLCBvcHRpb25zLCBtZXNzYWdlVmFyaWFibGVzKTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgc3ViUmVzdWx0cyA9IF9jb250ZXh0Mi5zZW50O1xuICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIsIHN1YlJlc3VsdHMucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBlcnJvcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHByZXYpLCBfdG9Db25zdW1hYmxlQXJyYXkoZXJyb3JzKSk7XG4gICAgICAgICAgfSwgW10pKTtcbiAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAvLyBSZXBsYWNlIG1lc3NhZ2Ugd2l0aCB2YXJpYWJsZXNcbiAgICAgICAgICBrdiA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcnVsZSksIHt9LCB7XG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgZW51bTogKHJ1bGUuZW51bSB8fCBbXSkuam9pbignLCAnKVxuICAgICAgICAgIH0sIG1lc3NhZ2VWYXJpYWJsZXMpO1xuICAgICAgICAgIGZpbGxWYXJpYWJsZVJlc3VsdCA9IHJlc3VsdC5tYXAoZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICByZXR1cm4gcmVwbGFjZU1lc3NhZ2UoZXJyb3IsIGt2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCBmaWxsVmFyaWFibGVSZXN1bHQpO1xuICAgICAgICBjYXNlIDI1OlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTIsIG51bGwsIFtbOSwgMTRdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF92YWxpZGF0ZVJ1bGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVJ1bGVzKG5hbWVQYXRoLCB2YWx1ZSwgcnVsZXMsIG9wdGlvbnMsIHZhbGlkYXRlRmlyc3QsIG1lc3NhZ2VWYXJpYWJsZXMpIHtcbiAgdmFyIG5hbWUgPSBuYW1lUGF0aC5qb2luKCcuJyk7XG4gIC8vIEZpbGwgcnVsZSB3aXRoIGNvbnRleHRcbiAgdmFyIGZpbGxlZFJ1bGVzID0gcnVsZXMubWFwKGZ1bmN0aW9uIChjdXJyZW50UnVsZSwgcnVsZUluZGV4KSB7XG4gICAgdmFyIG9yaWdpblZhbGlkYXRvckZ1bmMgPSBjdXJyZW50UnVsZS52YWxpZGF0b3I7XG4gICAgdmFyIGNsb25lUnVsZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY3VycmVudFJ1bGUpLCB7fSwge1xuICAgICAgcnVsZUluZGV4OiBydWxlSW5kZXhcbiAgICB9KTtcbiAgICAvLyBSZXBsYWNlIHZhbGlkYXRvciBpZiBuZWVkZWRcbiAgICBpZiAob3JpZ2luVmFsaWRhdG9yRnVuYykge1xuICAgICAgY2xvbmVSdWxlLnZhbGlkYXRvciA9IGZ1bmN0aW9uIChydWxlLCB2YWwsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBoYXNQcm9taXNlID0gZmFsc2U7XG4gICAgICAgIC8vIFdyYXAgY2FsbGJhY2sgb25seSBhY2NlcHQgd2hlbiBwcm9taXNlIG5vdCBwcm92aWRlZFxuICAgICAgICB2YXIgd3JhcHBlZENhbGxiYWNrID0gZnVuY3Rpb24gd3JhcHBlZENhbGxiYWNrKCkge1xuICAgICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gV2FpdCBhIHRpY2sgdG8gbWFrZSBzdXJlIHJldHVybiB0eXBlIGlzIGEgcHJvbWlzZVxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgd2FybmluZyghaGFzUHJvbWlzZSwgJ1lvdXIgdmFsaWRhdG9yIGZ1bmN0aW9uIGhhcyBhbHJlYWR5IHJldHVybiBhIHByb21pc2UuIGBjYWxsYmFja2Agd2lsbCBiZSBpZ25vcmVkLicpO1xuICAgICAgICAgICAgaWYgKCFoYXNQcm9taXNlKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHZvaWQgMCwgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIC8vIEdldCBwcm9taXNlXG4gICAgICAgIHZhciBwcm9taXNlID0gb3JpZ2luVmFsaWRhdG9yRnVuYyhydWxlLCB2YWwsIHdyYXBwZWRDYWxsYmFjayk7XG4gICAgICAgIGhhc1Byb21pc2UgPSBwcm9taXNlICYmIHR5cGVvZiBwcm9taXNlLnRoZW4gPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHByb21pc2UuY2F0Y2ggPT09ICdmdW5jdGlvbic7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAxLiBVc2UgcHJvbWlzZSBhcyB0aGUgZmlyc3QgcHJpb3JpdHkuXG4gICAgICAgICAqIDIuIElmIHByb21pc2Ugbm90IGV4aXN0LCB1c2UgY2FsbGJhY2sgd2l0aCB3YXJuaW5nIGluc3RlYWRcbiAgICAgICAgICovXG4gICAgICAgIHdhcm5pbmcoaGFzUHJvbWlzZSwgJ2BjYWxsYmFja2AgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHJldHVybiBhIHByb21pc2UgaW5zdGVhZC4nKTtcbiAgICAgICAgaWYgKGhhc1Byb21pc2UpIHtcbiAgICAgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnIgfHwgJyAnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGNsb25lUnVsZTtcbiAgfSkuc29ydChmdW5jdGlvbiAoX3JlZiwgX3JlZjIpIHtcbiAgICB2YXIgdzEgPSBfcmVmLndhcm5pbmdPbmx5LFxuICAgICAgaTEgPSBfcmVmLnJ1bGVJbmRleDtcbiAgICB2YXIgdzIgPSBfcmVmMi53YXJuaW5nT25seSxcbiAgICAgIGkyID0gX3JlZjIucnVsZUluZGV4O1xuICAgIGlmICghIXcxID09PSAhIXcyKSB7XG4gICAgICAvLyBMZXQga2VlcCBvcmlnaW4gb3JkZXJcbiAgICAgIHJldHVybiBpMSAtIGkyO1xuICAgIH1cbiAgICBpZiAodzEpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH0pO1xuICAvLyBEbyB2YWxpZGF0ZSBydWxlc1xuICB2YXIgc3VtbWFyeVByb21pc2U7XG4gIGlmICh2YWxpZGF0ZUZpcnN0ID09PSB0cnVlKSB7XG4gICAgLy8gPj4+Pj4gVmFsaWRhdGUgYnkgc2VyaWFsaXphdGlvblxuICAgIHN1bW1hcnlQcm9taXNlID0gbmV3IFByb21pc2UoIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3JlZjMgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBpLCBydWxlLCBlcnJvcnM7XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICBpZiAoIShpIDwgZmlsbGVkUnVsZXMubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBydWxlID0gZmlsbGVkUnVsZXNbaV07XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVSdWxlKG5hbWUsIHZhbHVlLCBydWxlLCBvcHRpb25zLCBtZXNzYWdlVmFyaWFibGVzKTtcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgZXJyb3JzID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgICAgaWYgKCFlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVqZWN0KFt7XG4gICAgICAgICAgICAgICAgZXJyb3JzOiBlcnJvcnMsXG4gICAgICAgICAgICAgICAgcnVsZTogcnVsZVxuICAgICAgICAgICAgICB9XSk7XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIik7XG4gICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSAqL1xuICAgICAgICAgICAgICByZXNvbHZlKFtdKTtcbiAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlKTtcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g2LCBfeDcpIHtcbiAgICAgICAgcmV0dXJuIF9yZWYzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIH0oKSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gPj4+Pj4gVmFsaWRhdGUgYnkgcGFyYWxsZWxcbiAgICB2YXIgcnVsZVByb21pc2VzID0gZmlsbGVkUnVsZXMubWFwKGZ1bmN0aW9uIChydWxlKSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGVSdWxlKG5hbWUsIHZhbHVlLCBydWxlLCBvcHRpb25zLCBtZXNzYWdlVmFyaWFibGVzKS50aGVuKGZ1bmN0aW9uIChlcnJvcnMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcnM6IGVycm9ycyxcbiAgICAgICAgICBydWxlOiBydWxlXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBzdW1tYXJ5UHJvbWlzZSA9ICh2YWxpZGF0ZUZpcnN0ID8gZmluaXNoT25GaXJzdEZhaWxlZChydWxlUHJvbWlzZXMpIDogZmluaXNoT25BbGxGYWlsZWQocnVsZVByb21pc2VzKSkudGhlbihmdW5jdGlvbiAoZXJyb3JzKSB7XG4gICAgICAvLyBBbHdheXMgY2hhbmdlIHRvIHJlamVjdGlvbiBmb3IgRmllbGQgdG8gY2F0Y2hcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcnMpO1xuICAgIH0pO1xuICB9XG4gIC8vIEludGVybmFsIGNhdGNoIGVycm9yIHRvIGF2b2lkIGNvbnNvbGUgZXJyb3IgbG9nLlxuICBzdW1tYXJ5UHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiBlO1xuICB9KTtcbiAgcmV0dXJuIHN1bW1hcnlQcm9taXNlO1xufVxuZnVuY3Rpb24gZmluaXNoT25BbGxGYWlsZWQoX3g4KSB7XG4gIHJldHVybiBfZmluaXNoT25BbGxGYWlsZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9maW5pc2hPbkFsbEZhaWxlZCgpIHtcbiAgX2ZpbmlzaE9uQWxsRmFpbGVkID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhydWxlUHJvbWlzZXMpIHtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0Mykge1xuICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoXCJyZXR1cm5cIiwgUHJvbWlzZS5hbGwocnVsZVByb21pc2VzKS50aGVuKGZ1bmN0aW9uIChlcnJvcnNMaXN0KSB7XG4gICAgICAgICAgICB2YXIgX3JlZjU7XG4gICAgICAgICAgICB2YXIgZXJyb3JzID0gKF9yZWY1ID0gW10pLmNvbmNhdC5hcHBseShfcmVmNSwgX3RvQ29uc3VtYWJsZUFycmF5KGVycm9yc0xpc3QpKTtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgICAgICAgfSkpO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMyk7XG4gIH0pKTtcbiAgcmV0dXJuIF9maW5pc2hPbkFsbEZhaWxlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gZmluaXNoT25GaXJzdEZhaWxlZChfeDkpIHtcbiAgcmV0dXJuIF9maW5pc2hPbkZpcnN0RmFpbGVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBfZmluaXNoT25GaXJzdEZhaWxlZCgpIHtcbiAgX2ZpbmlzaE9uRmlyc3RGYWlsZWQgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0KHJ1bGVQcm9taXNlcykge1xuICAgIHZhciBjb3VudDtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTQkKF9jb250ZXh0NCkge1xuICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ0LnByZXYgPSBfY29udGV4dDQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY291bnQgPSAwO1xuICAgICAgICAgIHJldHVybiBfY29udGV4dDQuYWJydXB0KFwicmV0dXJuXCIsIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICBydWxlUHJvbWlzZXMuZm9yRWFjaChmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICAgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKHJ1bGVFcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChydWxlRXJyb3IuZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbcnVsZUVycm9yXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSBydWxlUHJvbWlzZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlKFtdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlNCk7XG4gIH0pKTtcbiAgcmV0dXJuIF9maW5pc2hPbkZpcnN0RmFpbGVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJuYW1lXCJdO1xuaW1wb3J0IHRvQ2hpbGRyZW5BcnJheSBmcm9tIFwicmMtdXRpbC9lcy9DaGlsZHJlbi90b0FycmF5XCI7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRmllbGRDb250ZXh0LCB7IEhPT0tfTUFSSyB9IGZyb20gJy4vRmllbGRDb250ZXh0JztcbmltcG9ydCB7IHRvQXJyYXkgfSBmcm9tICcuL3V0aWxzL3R5cGVVdGlsJztcbmltcG9ydCB7IHZhbGlkYXRlUnVsZXMgfSBmcm9tICcuL3V0aWxzL3ZhbGlkYXRlVXRpbCc7XG5pbXBvcnQgeyBjb250YWluc05hbWVQYXRoLCBkZWZhdWx0R2V0VmFsdWVGcm9tRXZlbnQsIGdldE5hbWVQYXRoLCBnZXRWYWx1ZSB9IGZyb20gJy4vdXRpbHMvdmFsdWVVdGlsJztcbnZhciBFTVBUWV9FUlJPUlMgPSBbXTtcbmZ1bmN0aW9uIHJlcXVpcmVVcGRhdGUoc2hvdWxkVXBkYXRlLCBwcmV2LCBuZXh0LCBwcmV2VmFsdWUsIG5leHRWYWx1ZSwgaW5mbykge1xuICBpZiAodHlwZW9mIHNob3VsZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzaG91bGRVcGRhdGUocHJldiwgbmV4dCwgJ3NvdXJjZScgaW4gaW5mbyA/IHtcbiAgICAgIHNvdXJjZTogaW5mby5zb3VyY2VcbiAgICB9IDoge30pO1xuICB9XG4gIHJldHVybiBwcmV2VmFsdWUgIT09IG5leHRWYWx1ZTtcbn1cbi8vIFdlIHVzZSBDbGFzcyBpbnN0ZWFkIG9mIEhvb2tzIGhlcmUgc2luY2UgaXQgd2lsbCBjb3N0IG11Y2ggY29kZSBieSB1c2luZyBIb29rcy5cbnZhciBGaWVsZCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoRmllbGQsIF9SZWFjdCRDb21wb25lbnQpO1xuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEZpZWxkKTtcbiAgLyoqXG4gICAqIEZvbGxvdyBzdGF0ZSBzaG91bGQgbm90IG1hbmFnZW1lbnQgaW4gU3RhdGUgc2luY2UgaXQgd2lsbCBhc3luYyB1cGRhdGUgYnkgUmVhY3QuXG4gICAqIFRoaXMgbWFrZXMgZmlyc3QgcmVuZGVyIG9mIGZvcm0gY2FuIG5vdCBnZXQgY29ycmVjdCBzdGF0ZSB2YWx1ZS5cbiAgICovXG5cbiAgLyoqXG4gICAqIE1hcmsgd2hlbiB0b3VjaGVkICYgdmFsaWRhdGVkLiBDdXJyZW50bHkgb25seSB1c2VkIGZvciBgZGVwZW5kZW5jaWVzYC5cbiAgICogTm90ZSB0aGF0IHdlIGRvIG5vdCB0aGluayBmaWVsZCB3aXRoIGBpbml0aWFsVmFsdWVgIGlzIGRpcnR5XG4gICAqIGJ1dCB0aGlzIHdpbGwgYmUgYnkgYGlzRmllbGREaXJ0eWAgZnVuYy5cbiAgICovXG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN1YnNjcmlwdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGZ1bmN0aW9uIEZpZWxkKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGaWVsZCk7XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7XG4gICAgLy8gUmVnaXN0ZXIgb24gaW5pdFxuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgcmVzZXRDb3VudDogMFxuICAgIH07XG4gICAgX3RoaXMuY2FuY2VsUmVnaXN0ZXJGdW5jID0gbnVsbDtcbiAgICBfdGhpcy5tb3VudGVkID0gZmFsc2U7XG4gICAgX3RoaXMudG91Y2hlZCA9IGZhbHNlO1xuICAgIF90aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgX3RoaXMudmFsaWRhdGVQcm9taXNlID0gbnVsbDtcbiAgICBfdGhpcy5wcmV2VmFsaWRhdGluZyA9IHZvaWQgMDtcbiAgICBfdGhpcy5lcnJvcnMgPSBFTVBUWV9FUlJPUlM7XG4gICAgX3RoaXMud2FybmluZ3MgPSBFTVBUWV9FUlJPUlM7XG4gICAgX3RoaXMuY2FuY2VsUmVnaXN0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgcHJlc2VydmUgPSBfdGhpcyRwcm9wcy5wcmVzZXJ2ZSxcbiAgICAgICAgaXNMaXN0RmllbGQgPSBfdGhpcyRwcm9wcy5pc0xpc3RGaWVsZCxcbiAgICAgICAgbmFtZSA9IF90aGlzJHByb3BzLm5hbWU7XG4gICAgICBpZiAoX3RoaXMuY2FuY2VsUmVnaXN0ZXJGdW5jKSB7XG4gICAgICAgIF90aGlzLmNhbmNlbFJlZ2lzdGVyRnVuYyhpc0xpc3RGaWVsZCwgcHJlc2VydmUsIGdldE5hbWVQYXRoKG5hbWUpKTtcbiAgICAgIH1cbiAgICAgIF90aGlzLmNhbmNlbFJlZ2lzdGVyRnVuYyA9IG51bGw7XG4gICAgfTtcbiAgICBfdGhpcy5nZXROYW1lUGF0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgbmFtZSA9IF90aGlzJHByb3BzMi5uYW1lLFxuICAgICAgICBmaWVsZENvbnRleHQgPSBfdGhpcyRwcm9wczIuZmllbGRDb250ZXh0O1xuICAgICAgdmFyIF9maWVsZENvbnRleHQkcHJlZml4TiA9IGZpZWxkQ29udGV4dC5wcmVmaXhOYW1lLFxuICAgICAgICBwcmVmaXhOYW1lID0gX2ZpZWxkQ29udGV4dCRwcmVmaXhOID09PSB2b2lkIDAgPyBbXSA6IF9maWVsZENvbnRleHQkcHJlZml4TjtcbiAgICAgIHJldHVybiBuYW1lICE9PSB1bmRlZmluZWQgPyBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHByZWZpeE5hbWUpLCBfdG9Db25zdW1hYmxlQXJyYXkobmFtZSkpIDogW107XG4gICAgfTtcbiAgICBfdGhpcy5nZXRSdWxlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgX3RoaXMkcHJvcHMzJHJ1bGVzID0gX3RoaXMkcHJvcHMzLnJ1bGVzLFxuICAgICAgICBydWxlcyA9IF90aGlzJHByb3BzMyRydWxlcyA9PT0gdm9pZCAwID8gW10gOiBfdGhpcyRwcm9wczMkcnVsZXMsXG4gICAgICAgIGZpZWxkQ29udGV4dCA9IF90aGlzJHByb3BzMy5maWVsZENvbnRleHQ7XG4gICAgICByZXR1cm4gcnVsZXMubWFwKGZ1bmN0aW9uIChydWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcnVsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBydWxlKGZpZWxkQ29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJ1bGU7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIF90aGlzLnJlZnJlc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIV90aGlzLm1vdW50ZWQpIHJldHVybjtcbiAgICAgIC8qKlxuICAgICAgICogQ2xlYW4gdXAgY3VycmVudCBub2RlLlxuICAgICAgICovXG4gICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgcmVzZXRDb3VudCA9IF9yZWYucmVzZXRDb3VudDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXNldENvdW50OiByZXNldENvdW50ICsgMVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBfdGhpcy50cmlnZ2VyTWV0YUV2ZW50ID0gZnVuY3Rpb24gKGRlc3Ryb3kpIHtcbiAgICAgIHZhciBvbk1ldGFDaGFuZ2UgPSBfdGhpcy5wcm9wcy5vbk1ldGFDaGFuZ2U7XG4gICAgICBvbk1ldGFDaGFuZ2UgPT09IG51bGwgfHwgb25NZXRhQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbk1ldGFDaGFuZ2UoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdGhpcy5nZXRNZXRhKCkpLCB7fSwge1xuICAgICAgICBkZXN0cm95OiBkZXN0cm95XG4gICAgICB9KSk7XG4gICAgfTtcbiAgICBfdGhpcy5vblN0b3JlQ2hhbmdlID0gZnVuY3Rpb24gKHByZXZTdG9yZSwgbmFtZVBhdGhMaXN0LCBpbmZvKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gX3RoaXMucHJvcHMsXG4gICAgICAgIHNob3VsZFVwZGF0ZSA9IF90aGlzJHByb3BzNC5zaG91bGRVcGRhdGUsXG4gICAgICAgIF90aGlzJHByb3BzNCRkZXBlbmRlbiA9IF90aGlzJHByb3BzNC5kZXBlbmRlbmNpZXMsXG4gICAgICAgIGRlcGVuZGVuY2llcyA9IF90aGlzJHByb3BzNCRkZXBlbmRlbiA9PT0gdm9pZCAwID8gW10gOiBfdGhpcyRwcm9wczQkZGVwZW5kZW4sXG4gICAgICAgIG9uUmVzZXQgPSBfdGhpcyRwcm9wczQub25SZXNldDtcbiAgICAgIHZhciBzdG9yZSA9IGluZm8uc3RvcmU7XG4gICAgICB2YXIgbmFtZVBhdGggPSBfdGhpcy5nZXROYW1lUGF0aCgpO1xuICAgICAgdmFyIHByZXZWYWx1ZSA9IF90aGlzLmdldFZhbHVlKHByZXZTdG9yZSk7XG4gICAgICB2YXIgY3VyVmFsdWUgPSBfdGhpcy5nZXRWYWx1ZShzdG9yZSk7XG4gICAgICB2YXIgbmFtZVBhdGhNYXRjaCA9IG5hbWVQYXRoTGlzdCAmJiBjb250YWluc05hbWVQYXRoKG5hbWVQYXRoTGlzdCwgbmFtZVBhdGgpO1xuICAgICAgLy8gYHNldEZpZWxkc1ZhbHVlYCBpcyBhIHF1aWNrIGFjY2VzcyB0byB1cGRhdGUgcmVsYXRlZCBzdGF0dXNcbiAgICAgIGlmIChpbmZvLnR5cGUgPT09ICd2YWx1ZVVwZGF0ZScgJiYgaW5mby5zb3VyY2UgPT09ICdleHRlcm5hbCcgJiYgcHJldlZhbHVlICE9PSBjdXJWYWx1ZSkge1xuICAgICAgICBfdGhpcy50b3VjaGVkID0gdHJ1ZTtcbiAgICAgICAgX3RoaXMuZGlydHkgPSB0cnVlO1xuICAgICAgICBfdGhpcy52YWxpZGF0ZVByb21pc2UgPSBudWxsO1xuICAgICAgICBfdGhpcy5lcnJvcnMgPSBFTVBUWV9FUlJPUlM7XG4gICAgICAgIF90aGlzLndhcm5pbmdzID0gRU1QVFlfRVJST1JTO1xuICAgICAgICBfdGhpcy50cmlnZ2VyTWV0YUV2ZW50KCk7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGluZm8udHlwZSkge1xuICAgICAgICBjYXNlICdyZXNldCc6XG4gICAgICAgICAgaWYgKCFuYW1lUGF0aExpc3QgfHwgbmFtZVBhdGhNYXRjaCkge1xuICAgICAgICAgICAgLy8gQ2xlYW4gdXAgc3RhdGVcbiAgICAgICAgICAgIF90aGlzLnRvdWNoZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIF90aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICBfdGhpcy52YWxpZGF0ZVByb21pc2UgPSBudWxsO1xuICAgICAgICAgICAgX3RoaXMuZXJyb3JzID0gRU1QVFlfRVJST1JTO1xuICAgICAgICAgICAgX3RoaXMud2FybmluZ3MgPSBFTVBUWV9FUlJPUlM7XG4gICAgICAgICAgICBfdGhpcy50cmlnZ2VyTWV0YUV2ZW50KCk7XG4gICAgICAgICAgICBvblJlc2V0ID09PSBudWxsIHx8IG9uUmVzZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uUmVzZXQoKTtcbiAgICAgICAgICAgIF90aGlzLnJlZnJlc2goKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBjYXNlIGZpZWxkIHdpdGggYHByZXNlcnZlID0gZmFsc2VgIG5lc3QgZGVwcyBsaWtlOlxuICAgICAgICAgKiAtIEEgPSAxID0+IHNob3cgQlxuICAgICAgICAgKiAtIEIgPSAxID0+IHNob3cgQ1xuICAgICAgICAgKiAtIFJlc2V0IEEsIG5lZWQgY2xlYW4gQiwgQ1xuICAgICAgICAgKi9cbiAgICAgICAgY2FzZSAncmVtb3ZlJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICAgICAgICAgIF90aGlzLnJlUmVuZGVyKCk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2V0RmllbGQnOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChuYW1lUGF0aE1hdGNoKSB7XG4gICAgICAgICAgICAgIHZhciBkYXRhID0gaW5mby5kYXRhO1xuICAgICAgICAgICAgICBpZiAoJ3RvdWNoZWQnIGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy50b3VjaGVkID0gZGF0YS50b3VjaGVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICgndmFsaWRhdGluZycgaW4gZGF0YSAmJiAhKCdvcmlnaW5SQ0ZpZWxkJyBpbiBkYXRhKSkge1xuICAgICAgICAgICAgICAgIF90aGlzLnZhbGlkYXRlUHJvbWlzZSA9IGRhdGEudmFsaWRhdGluZyA/IFByb21pc2UucmVzb2x2ZShbXSkgOiBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICgnZXJyb3JzJyBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuZXJyb3JzID0gZGF0YS5lcnJvcnMgfHwgRU1QVFlfRVJST1JTO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICgnd2FybmluZ3MnIGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy53YXJuaW5ncyA9IGRhdGEud2FybmluZ3MgfHwgRU1QVFlfRVJST1JTO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF90aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgX3RoaXMudHJpZ2dlck1ldGFFdmVudCgpO1xuICAgICAgICAgICAgICBfdGhpcy5yZVJlbmRlcigpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBIYW5kbGUgdXBkYXRlIGJ5IGBzZXRGaWVsZGAgd2l0aCBgc2hvdWxkVXBkYXRlYFxuICAgICAgICAgICAgaWYgKHNob3VsZFVwZGF0ZSAmJiAhbmFtZVBhdGgubGVuZ3RoICYmIHJlcXVpcmVVcGRhdGUoc2hvdWxkVXBkYXRlLCBwcmV2U3RvcmUsIHN0b3JlLCBwcmV2VmFsdWUsIGN1clZhbHVlLCBpbmZvKSkge1xuICAgICAgICAgICAgICBfdGhpcy5yZVJlbmRlcigpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlcGVuZGVuY2llc1VwZGF0ZSc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUcmlnZ2VyIHdoZW4gbWFya2VkIGBkZXBlbmRlbmNpZXNgIHVwZGF0ZWQuIFJlbGF0ZWQgZmllbGRzIHdpbGwgYWxsIHVwZGF0ZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB2YXIgZGVwZW5kZW5jeUxpc3QgPSBkZXBlbmRlbmNpZXMubWFwKGdldE5hbWVQYXRoKTtcbiAgICAgICAgICAgIC8vIE5vIG5lZWQgZm9yIGBuYW1lUGF0aE1hdGhgIGNoZWNrIGFuZCBgc2hvdWxkVXBkYXRlYCBjaGVjaywgc2luY2UgYHZhbHVlVXBkYXRlYCB3aWxsIGJlXG4gICAgICAgICAgICAvLyBlbWl0dGVkIGVhcmxpZXIgYW5kIHRoZXkgd2lsbCB3b3JrIHRoZXJlXG4gICAgICAgICAgICAvLyBJZiBzZXQgaXQgbWF5IGNhdXNlIHVubmVjZXNzYXJ5IHR3aWNlIHJlcmVuZGVyaW5nXG4gICAgICAgICAgICBpZiAoZGVwZW5kZW5jeUxpc3Quc29tZShmdW5jdGlvbiAoZGVwZW5kZW5jeSkge1xuICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNOYW1lUGF0aChpbmZvLnJlbGF0ZWRGaWVsZHMsIGRlcGVuZGVuY3kpO1xuICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgX3RoaXMucmVSZW5kZXIoKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIDEuIElmIGBuYW1lUGF0aGAgZXhpc3RzIGluIGBuYW1lUGF0aExpc3RgLCBtZWFucyBpdCdzIHJlbGF0ZWQgdmFsdWUgYW5kIHNob3VsZCB1cGRhdGVcbiAgICAgICAgICAvLyAgICAgIEZvciBleGFtcGxlIDxMaXN0IG5hbWU9XCJsaXN0XCI+PEZpZWxkIG5hbWU9e1snbGlzdCcsIDBdfT48L0xpc3Q+XG4gICAgICAgICAgLy8gICAgICBJZiBgbmFtZVBhdGhMaXN0YCBpcyBbWydsaXN0J11dIChMaXN0IHZhbHVlIHVwZGF0ZSksIEZpZWxkIHNob3VsZCBiZSB1cGRhdGVkXG4gICAgICAgICAgLy8gICAgICBJZiBgbmFtZVBhdGhMaXN0YCBpcyBbWydsaXN0JywgMF1dIChGaWVsZCB2YWx1ZSB1cGRhdGUpLCBMaXN0IHNob3VsZG4ndCBiZSB1cGRhdGVkXG4gICAgICAgICAgLy8gMi5cbiAgICAgICAgICAvLyAgIDIuMSBJZiBgZGVwZW5kZW5jaWVzYCBpcyBzZXQsIGBuYW1lYCBpcyBub3Qgc2V0IGFuZCBgc2hvdWxkVXBkYXRlYCBpcyBub3Qgc2V0LFxuICAgICAgICAgIC8vICAgICAgIGRvbid0IHVzZSBgc2hvdWxkVXBkYXRlYC4gYGRlcGVuZGVuY2llc2AgaXMgdmlldyBhcyBhIHNob3J0Y3V0IGlmIGBzaG91bGRVcGRhdGVgXG4gICAgICAgICAgLy8gICAgICAgaXMgbm90IHByb3ZpZGVkXG4gICAgICAgICAgLy8gICAyLjIgSWYgYHNob3VsZFVwZGF0ZWAgcHJvdmlkZWQsIHVzZSBjdXN0b21pemUgbG9naWMgdG8gdXBkYXRlIHRoZSBmaWVsZFxuICAgICAgICAgIC8vICAgICAgIGVsc2UgdG8gY2hlY2sgaWYgdmFsdWUgY2hhbmdlZFxuICAgICAgICAgIGlmIChuYW1lUGF0aE1hdGNoIHx8ICghZGVwZW5kZW5jaWVzLmxlbmd0aCB8fCBuYW1lUGF0aC5sZW5ndGggfHwgc2hvdWxkVXBkYXRlKSAmJiByZXF1aXJlVXBkYXRlKHNob3VsZFVwZGF0ZSwgcHJldlN0b3JlLCBzdG9yZSwgcHJldlZhbHVlLCBjdXJWYWx1ZSwgaW5mbykpIHtcbiAgICAgICAgICAgIF90aGlzLnJlUmVuZGVyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFVwZGF0ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBfdGhpcy5yZVJlbmRlcigpO1xuICAgICAgfVxuICAgIH07XG4gICAgX3RoaXMudmFsaWRhdGVSdWxlcyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAvLyBXZSBzaG91bGQgZml4ZWQgbmFtZVBhdGggJiB2YWx1ZSB0byBhdm9pZCBkZXZlbG9wZXIgY2hhbmdlIHRoZW4gYnkgZm9ybSBmdW5jdGlvblxuICAgICAgdmFyIG5hbWVQYXRoID0gX3RoaXMuZ2V0TmFtZVBhdGgoKTtcbiAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBfdGhpcy5nZXRWYWx1ZSgpO1xuICAgICAgLy8gRm9yY2UgY2hhbmdlIHRvIGFzeW5jIHRvIGF2b2lkIHJ1bGUgT09EIHVuZGVyIHJlbmRlclByb3BzIGZpZWxkXG4gICAgICB2YXIgcm9vdFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFfdGhpcy5tb3VudGVkKSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfdGhpcyRwcm9wczUgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBfdGhpcyRwcm9wczUkdmFsaWRhdGUgPSBfdGhpcyRwcm9wczUudmFsaWRhdGVGaXJzdCxcbiAgICAgICAgICB2YWxpZGF0ZUZpcnN0ID0gX3RoaXMkcHJvcHM1JHZhbGlkYXRlID09PSB2b2lkIDAgPyBmYWxzZSA6IF90aGlzJHByb3BzNSR2YWxpZGF0ZSxcbiAgICAgICAgICBtZXNzYWdlVmFyaWFibGVzID0gX3RoaXMkcHJvcHM1Lm1lc3NhZ2VWYXJpYWJsZXM7XG4gICAgICAgIHZhciBfcmVmMiA9IG9wdGlvbnMgfHwge30sXG4gICAgICAgICAgdHJpZ2dlck5hbWUgPSBfcmVmMi50cmlnZ2VyTmFtZTtcbiAgICAgICAgdmFyIGZpbHRlcmVkUnVsZXMgPSBfdGhpcy5nZXRSdWxlcygpO1xuICAgICAgICBpZiAodHJpZ2dlck5hbWUpIHtcbiAgICAgICAgICBmaWx0ZXJlZFJ1bGVzID0gZmlsdGVyZWRSdWxlcy5maWx0ZXIoZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICAgICAgICAgIHJldHVybiBydWxlO1xuICAgICAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAocnVsZSkge1xuICAgICAgICAgICAgdmFyIHZhbGlkYXRlVHJpZ2dlciA9IHJ1bGUudmFsaWRhdGVUcmlnZ2VyO1xuICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZVRyaWdnZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdHJpZ2dlckxpc3QgPSB0b0FycmF5KHZhbGlkYXRlVHJpZ2dlcik7XG4gICAgICAgICAgICByZXR1cm4gdHJpZ2dlckxpc3QuaW5jbHVkZXModHJpZ2dlck5hbWUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcm9taXNlID0gdmFsaWRhdGVSdWxlcyhuYW1lUGF0aCwgY3VycmVudFZhbHVlLCBmaWx0ZXJlZFJ1bGVzLCBvcHRpb25zLCB2YWxpZGF0ZUZpcnN0LCBtZXNzYWdlVmFyaWFibGVzKTtcbiAgICAgICAgcHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgcnVsZUVycm9ycyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogRU1QVFlfRVJST1JTO1xuICAgICAgICAgIGlmIChfdGhpcy52YWxpZGF0ZVByb21pc2UgPT09IHJvb3RQcm9taXNlKSB7XG4gICAgICAgICAgICB2YXIgX3J1bGVFcnJvcnMkZm9yRWFjaDtcbiAgICAgICAgICAgIF90aGlzLnZhbGlkYXRlUHJvbWlzZSA9IG51bGw7XG4gICAgICAgICAgICAvLyBHZXQgZXJyb3JzICYgd2FybmluZ3NcbiAgICAgICAgICAgIHZhciBuZXh0RXJyb3JzID0gW107XG4gICAgICAgICAgICB2YXIgbmV4dFdhcm5pbmdzID0gW107XG4gICAgICAgICAgICAoX3J1bGVFcnJvcnMkZm9yRWFjaCA9IHJ1bGVFcnJvcnMuZm9yRWFjaCkgPT09IG51bGwgfHwgX3J1bGVFcnJvcnMkZm9yRWFjaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3J1bGVFcnJvcnMkZm9yRWFjaC5jYWxsKHJ1bGVFcnJvcnMsIGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICAgICAgICB2YXIgd2FybmluZ09ubHkgPSBfcmVmMy5ydWxlLndhcm5pbmdPbmx5LFxuICAgICAgICAgICAgICAgIF9yZWYzJGVycm9ycyA9IF9yZWYzLmVycm9ycyxcbiAgICAgICAgICAgICAgICBlcnJvcnMgPSBfcmVmMyRlcnJvcnMgPT09IHZvaWQgMCA/IEVNUFRZX0VSUk9SUyA6IF9yZWYzJGVycm9ycztcbiAgICAgICAgICAgICAgaWYgKHdhcm5pbmdPbmx5KSB7XG4gICAgICAgICAgICAgICAgbmV4dFdhcm5pbmdzLnB1c2guYXBwbHkobmV4dFdhcm5pbmdzLCBfdG9Db25zdW1hYmxlQXJyYXkoZXJyb3JzKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV4dEVycm9ycy5wdXNoLmFwcGx5KG5leHRFcnJvcnMsIF90b0NvbnN1bWFibGVBcnJheShlcnJvcnMpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBfdGhpcy5lcnJvcnMgPSBuZXh0RXJyb3JzO1xuICAgICAgICAgICAgX3RoaXMud2FybmluZ3MgPSBuZXh0V2FybmluZ3M7XG4gICAgICAgICAgICBfdGhpcy50cmlnZ2VyTWV0YUV2ZW50KCk7XG4gICAgICAgICAgICBfdGhpcy5yZVJlbmRlcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgfSk7XG4gICAgICBfdGhpcy52YWxpZGF0ZVByb21pc2UgPSByb290UHJvbWlzZTtcbiAgICAgIF90aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICAgIF90aGlzLmVycm9ycyA9IEVNUFRZX0VSUk9SUztcbiAgICAgIF90aGlzLndhcm5pbmdzID0gRU1QVFlfRVJST1JTO1xuICAgICAgX3RoaXMudHJpZ2dlck1ldGFFdmVudCgpO1xuICAgICAgLy8gRm9yY2UgdHJpZ2dlciByZS1yZW5kZXIgc2luY2Ugd2UgbmVlZCBzeW5jIHJlbmRlclByb3BzIHdpdGggbmV3IG1ldGFcbiAgICAgIF90aGlzLnJlUmVuZGVyKCk7XG4gICAgICByZXR1cm4gcm9vdFByb21pc2U7XG4gICAgfTtcbiAgICBfdGhpcy5pc0ZpZWxkVmFsaWRhdGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhIV90aGlzLnZhbGlkYXRlUHJvbWlzZTtcbiAgICB9O1xuICAgIF90aGlzLmlzRmllbGRUb3VjaGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnRvdWNoZWQ7XG4gICAgfTtcbiAgICBfdGhpcy5pc0ZpZWxkRGlydHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBUb3VjaGVkIG9yIHZhbGlkYXRlIG9yIGhhcyBpbml0aWFsVmFsdWVcbiAgICAgIGlmIChfdGhpcy5kaXJ0eSB8fCBfdGhpcy5wcm9wcy5pbml0aWFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8vIEZvcm0gc2V0IGluaXRpYWxWYWx1ZVxuICAgICAgdmFyIGZpZWxkQ29udGV4dCA9IF90aGlzLnByb3BzLmZpZWxkQ29udGV4dDtcbiAgICAgIHZhciBfZmllbGRDb250ZXh0JGdldEludGUgPSBmaWVsZENvbnRleHQuZ2V0SW50ZXJuYWxIb29rcyhIT09LX01BUkspLFxuICAgICAgICBnZXRJbml0aWFsVmFsdWUgPSBfZmllbGRDb250ZXh0JGdldEludGUuZ2V0SW5pdGlhbFZhbHVlO1xuICAgICAgaWYgKGdldEluaXRpYWxWYWx1ZShfdGhpcy5nZXROYW1lUGF0aCgpKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgX3RoaXMuZ2V0RXJyb3JzID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLmVycm9ycztcbiAgICB9O1xuICAgIF90aGlzLmdldFdhcm5pbmdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLndhcm5pbmdzO1xuICAgIH07XG4gICAgX3RoaXMuaXNMaXN0RmllbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMucHJvcHMuaXNMaXN0RmllbGQ7XG4gICAgfTtcbiAgICBfdGhpcy5pc0xpc3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMucHJvcHMuaXNMaXN0O1xuICAgIH07XG4gICAgX3RoaXMuaXNQcmVzZXJ2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5wcm9wcy5wcmVzZXJ2ZTtcbiAgICB9O1xuICAgIF90aGlzLmdldE1ldGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBNYWtlIGVycm9yICYgdmFsaWRhdGluZyBpbiBjYWNoZSB0byBzYXZlIHBlcmZcbiAgICAgIF90aGlzLnByZXZWYWxpZGF0aW5nID0gX3RoaXMuaXNGaWVsZFZhbGlkYXRpbmcoKTtcbiAgICAgIHZhciBtZXRhID0ge1xuICAgICAgICB0b3VjaGVkOiBfdGhpcy5pc0ZpZWxkVG91Y2hlZCgpLFxuICAgICAgICB2YWxpZGF0aW5nOiBfdGhpcy5wcmV2VmFsaWRhdGluZyxcbiAgICAgICAgZXJyb3JzOiBfdGhpcy5lcnJvcnMsXG4gICAgICAgIHdhcm5pbmdzOiBfdGhpcy53YXJuaW5ncyxcbiAgICAgICAgbmFtZTogX3RoaXMuZ2V0TmFtZVBhdGgoKVxuICAgICAgfTtcbiAgICAgIHJldHVybiBtZXRhO1xuICAgIH07XG4gICAgX3RoaXMuZ2V0T25seUNoaWxkID0gZnVuY3Rpb24gKGNoaWxkcmVuKSB7XG4gICAgICAvLyBTdXBwb3J0IHJlbmRlciBwcm9wc1xuICAgICAgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgbWV0YSA9IF90aGlzLmdldE1ldGEoKTtcbiAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMuZ2V0T25seUNoaWxkKGNoaWxkcmVuKF90aGlzLmdldENvbnRyb2xsZWQoKSwgbWV0YSwgX3RoaXMucHJvcHMuZmllbGRDb250ZXh0KSkpLCB7fSwge1xuICAgICAgICAgIGlzRnVuY3Rpb246IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBGaWxlZCBlbGVtZW50IG9ubHlcbiAgICAgIHZhciBjaGlsZExpc3QgPSB0b0NoaWxkcmVuQXJyYXkoY2hpbGRyZW4pO1xuICAgICAgaWYgKGNoaWxkTGlzdC5sZW5ndGggIT09IDEgfHwgISAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGRMaXN0WzBdKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNoaWxkOiBjaGlsZExpc3QsXG4gICAgICAgICAgaXNGdW5jdGlvbjogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNoaWxkOiBjaGlsZExpc3RbMF0sXG4gICAgICAgIGlzRnVuY3Rpb246IGZhbHNlXG4gICAgICB9O1xuICAgIH07XG4gICAgX3RoaXMuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoc3RvcmUpIHtcbiAgICAgIHZhciBnZXRGaWVsZHNWYWx1ZSA9IF90aGlzLnByb3BzLmZpZWxkQ29udGV4dC5nZXRGaWVsZHNWYWx1ZTtcbiAgICAgIHZhciBuYW1lUGF0aCA9IF90aGlzLmdldE5hbWVQYXRoKCk7XG4gICAgICByZXR1cm4gZ2V0VmFsdWUoc3RvcmUgfHwgZ2V0RmllbGRzVmFsdWUodHJ1ZSksIG5hbWVQYXRoKTtcbiAgICB9O1xuICAgIF90aGlzLmdldENvbnRyb2xsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY2hpbGRQcm9wcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICB2YXIgX3RoaXMkcHJvcHM2ID0gX3RoaXMucHJvcHMsXG4gICAgICAgIHRyaWdnZXIgPSBfdGhpcyRwcm9wczYudHJpZ2dlcixcbiAgICAgICAgdmFsaWRhdGVUcmlnZ2VyID0gX3RoaXMkcHJvcHM2LnZhbGlkYXRlVHJpZ2dlcixcbiAgICAgICAgZ2V0VmFsdWVGcm9tRXZlbnQgPSBfdGhpcyRwcm9wczYuZ2V0VmFsdWVGcm9tRXZlbnQsXG4gICAgICAgIG5vcm1hbGl6ZSA9IF90aGlzJHByb3BzNi5ub3JtYWxpemUsXG4gICAgICAgIHZhbHVlUHJvcE5hbWUgPSBfdGhpcyRwcm9wczYudmFsdWVQcm9wTmFtZSxcbiAgICAgICAgZ2V0VmFsdWVQcm9wcyA9IF90aGlzJHByb3BzNi5nZXRWYWx1ZVByb3BzLFxuICAgICAgICBmaWVsZENvbnRleHQgPSBfdGhpcyRwcm9wczYuZmllbGRDb250ZXh0O1xuICAgICAgdmFyIG1lcmdlZFZhbGlkYXRlVHJpZ2dlciA9IHZhbGlkYXRlVHJpZ2dlciAhPT0gdW5kZWZpbmVkID8gdmFsaWRhdGVUcmlnZ2VyIDogZmllbGRDb250ZXh0LnZhbGlkYXRlVHJpZ2dlcjtcbiAgICAgIHZhciBuYW1lUGF0aCA9IF90aGlzLmdldE5hbWVQYXRoKCk7XG4gICAgICB2YXIgZ2V0SW50ZXJuYWxIb29rcyA9IGZpZWxkQ29udGV4dC5nZXRJbnRlcm5hbEhvb2tzLFxuICAgICAgICBnZXRGaWVsZHNWYWx1ZSA9IGZpZWxkQ29udGV4dC5nZXRGaWVsZHNWYWx1ZTtcbiAgICAgIHZhciBfZ2V0SW50ZXJuYWxIb29rcyA9IGdldEludGVybmFsSG9va3MoSE9PS19NQVJLKSxcbiAgICAgICAgZGlzcGF0Y2ggPSBfZ2V0SW50ZXJuYWxIb29rcy5kaXNwYXRjaDtcbiAgICAgIHZhciB2YWx1ZSA9IF90aGlzLmdldFZhbHVlKCk7XG4gICAgICB2YXIgbWVyZ2VkR2V0VmFsdWVQcm9wcyA9IGdldFZhbHVlUHJvcHMgfHwgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gX2RlZmluZVByb3BlcnR5KHt9LCB2YWx1ZVByb3BOYW1lLCB2YWwpO1xuICAgICAgfTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICB2YXIgb3JpZ2luVHJpZ2dlckZ1bmMgPSBjaGlsZFByb3BzW3RyaWdnZXJdO1xuICAgICAgdmFyIGNvbnRyb2wgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGNoaWxkUHJvcHMpLCBtZXJnZWRHZXRWYWx1ZVByb3BzKHZhbHVlKSk7XG4gICAgICAvLyBBZGQgdHJpZ2dlclxuICAgICAgY29udHJvbFt0cmlnZ2VyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gTWFyayBhcyB0b3VjaGVkXG4gICAgICAgIF90aGlzLnRvdWNoZWQgPSB0cnVlO1xuICAgICAgICBfdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgICAgIF90aGlzLnRyaWdnZXJNZXRhRXZlbnQoKTtcbiAgICAgICAgdmFyIG5ld1ZhbHVlO1xuICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnZXRWYWx1ZUZyb21FdmVudCkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gZ2V0VmFsdWVGcm9tRXZlbnQuYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IGRlZmF1bHRHZXRWYWx1ZUZyb21FdmVudC5hcHBseSh2b2lkIDAsIFt2YWx1ZVByb3BOYW1lXS5jb25jYXQoYXJncykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub3JtYWxpemUpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IG5vcm1hbGl6ZShuZXdWYWx1ZSwgdmFsdWUsIGdldEZpZWxkc1ZhbHVlKHRydWUpKTtcbiAgICAgICAgfVxuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogJ3VwZGF0ZVZhbHVlJyxcbiAgICAgICAgICBuYW1lUGF0aDogbmFtZVBhdGgsXG4gICAgICAgICAgdmFsdWU6IG5ld1ZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3JpZ2luVHJpZ2dlckZ1bmMpIHtcbiAgICAgICAgICBvcmlnaW5UcmlnZ2VyRnVuYy5hcHBseSh2b2lkIDAsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLy8gQWRkIHZhbGlkYXRlVHJpZ2dlclxuICAgICAgdmFyIHZhbGlkYXRlVHJpZ2dlckxpc3QgPSB0b0FycmF5KG1lcmdlZFZhbGlkYXRlVHJpZ2dlciB8fCBbXSk7XG4gICAgICB2YWxpZGF0ZVRyaWdnZXJMaXN0LmZvckVhY2goZnVuY3Rpb24gKHRyaWdnZXJOYW1lKSB7XG4gICAgICAgIC8vIFdyYXAgYWRkaXRpb25hbCBmdW5jdGlvbiBvZiBjb21wb25lbnQsIHNvIHRoYXQgd2UgY2FuIGdldCBsYXRlc3QgdmFsdWUgZnJvbSBzdG9yZVxuICAgICAgICB2YXIgb3JpZ2luVHJpZ2dlciA9IGNvbnRyb2xbdHJpZ2dlck5hbWVdO1xuICAgICAgICBjb250cm9sW3RyaWdnZXJOYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAob3JpZ2luVHJpZ2dlcikge1xuICAgICAgICAgICAgb3JpZ2luVHJpZ2dlci5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEFsd2F5cyB1c2UgbGF0ZXN0IHJ1bGVzXG4gICAgICAgICAgdmFyIHJ1bGVzID0gX3RoaXMucHJvcHMucnVsZXM7XG4gICAgICAgICAgaWYgKHJ1bGVzICYmIHJ1bGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gV2UgZGlzcGF0Y2ggdmFsaWRhdGUgdG8gcm9vdCxcbiAgICAgICAgICAgIC8vIHNpbmNlIGl0IHdpbGwgdXBkYXRlIHJlbGF0ZWQgZGF0YSB3aXRoIG90aGVyIGZpZWxkIHdpdGggc2FtZSBuYW1lXG4gICAgICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgICAgIHR5cGU6ICd2YWxpZGF0ZUZpZWxkJyxcbiAgICAgICAgICAgICAgbmFtZVBhdGg6IG5hbWVQYXRoLFxuICAgICAgICAgICAgICB0cmlnZ2VyTmFtZTogdHJpZ2dlck5hbWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNvbnRyb2w7XG4gICAgfTtcbiAgICBpZiAocHJvcHMuZmllbGRDb250ZXh0KSB7XG4gICAgICB2YXIgZ2V0SW50ZXJuYWxIb29rcyA9IHByb3BzLmZpZWxkQ29udGV4dC5nZXRJbnRlcm5hbEhvb2tzO1xuICAgICAgdmFyIF9nZXRJbnRlcm5hbEhvb2tzMiA9IGdldEludGVybmFsSG9va3MoSE9PS19NQVJLKSxcbiAgICAgICAgaW5pdEVudGl0eVZhbHVlID0gX2dldEludGVybmFsSG9va3MyLmluaXRFbnRpdHlWYWx1ZTtcbiAgICAgIGluaXRFbnRpdHlWYWx1ZShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfVxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBfY3JlYXRlQ2xhc3MoRmllbGQsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzNyA9IHRoaXMucHJvcHMsXG4gICAgICAgIHNob3VsZFVwZGF0ZSA9IF90aGlzJHByb3BzNy5zaG91bGRVcGRhdGUsXG4gICAgICAgIGZpZWxkQ29udGV4dCA9IF90aGlzJHByb3BzNy5maWVsZENvbnRleHQ7XG4gICAgICB0aGlzLm1vdW50ZWQgPSB0cnVlO1xuICAgICAgLy8gUmVnaXN0ZXIgb24gaW5pdFxuICAgICAgaWYgKGZpZWxkQ29udGV4dCkge1xuICAgICAgICB2YXIgZ2V0SW50ZXJuYWxIb29rcyA9IGZpZWxkQ29udGV4dC5nZXRJbnRlcm5hbEhvb2tzO1xuICAgICAgICB2YXIgX2dldEludGVybmFsSG9va3MzID0gZ2V0SW50ZXJuYWxIb29rcyhIT09LX01BUkspLFxuICAgICAgICAgIHJlZ2lzdGVyRmllbGQgPSBfZ2V0SW50ZXJuYWxIb29rczMucmVnaXN0ZXJGaWVsZDtcbiAgICAgICAgdGhpcy5jYW5jZWxSZWdpc3RlckZ1bmMgPSByZWdpc3RlckZpZWxkKHRoaXMpO1xuICAgICAgfVxuICAgICAgLy8gT25lIG1vcmUgcmVuZGVyIGZvciBjb21wb25lbnQgaW4gY2FzZSBmaWVsZHMgbm90IHJlYWR5XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMucmVSZW5kZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLmNhbmNlbFJlZ2lzdGVyKCk7XG4gICAgICB0aGlzLnRyaWdnZXJNZXRhRXZlbnQodHJ1ZSk7XG4gICAgICB0aGlzLm1vdW50ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVSZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVSZW5kZXIoKSB7XG4gICAgICBpZiAoIXRoaXMubW91bnRlZCkgcmV0dXJuO1xuICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIHJlc2V0Q291bnQgPSB0aGlzLnN0YXRlLnJlc2V0Q291bnQ7XG4gICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIF90aGlzJGdldE9ubHlDaGlsZCA9IHRoaXMuZ2V0T25seUNoaWxkKGNoaWxkcmVuKSxcbiAgICAgICAgY2hpbGQgPSBfdGhpcyRnZXRPbmx5Q2hpbGQuY2hpbGQsXG4gICAgICAgIGlzRnVuY3Rpb24gPSBfdGhpcyRnZXRPbmx5Q2hpbGQuaXNGdW5jdGlvbjtcbiAgICAgIC8vIE5vdCBuZWVkIHRvIGBjbG9uZUVsZW1lbnRgIHNpbmNlIHVzZXIgY2FuIGhhbmRsZSB0aGlzIGluIHJlbmRlciBmdW5jdGlvbiBzZWxmXG4gICAgICB2YXIgcmV0dXJuQ2hpbGROb2RlO1xuICAgICAgaWYgKGlzRnVuY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuQ2hpbGROb2RlID0gY2hpbGQ7XG4gICAgICB9IGVsc2UgaWYgKCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgIHJldHVybkNoaWxkTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIHRoaXMuZ2V0Q29udHJvbGxlZChjaGlsZC5wcm9wcykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybmluZyghY2hpbGQsICdgY2hpbGRyZW5gIG9mIEZpZWxkIGlzIG5vdCB2YWxpZGF0ZSBSZWFjdEVsZW1lbnQuJyk7XG4gICAgICAgIHJldHVybkNoaWxkTm9kZSA9IGNoaWxkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCB7XG4gICAgICAgIGtleTogcmVzZXRDb3VudFxuICAgICAgfSwgcmV0dXJuQ2hpbGROb2RlKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIEZpZWxkO1xufShSZWFjdC5Db21wb25lbnQpO1xuRmllbGQuY29udGV4dFR5cGUgPSBGaWVsZENvbnRleHQ7XG5GaWVsZC5kZWZhdWx0UHJvcHMgPSB7XG4gIHRyaWdnZXI6ICdvbkNoYW5nZScsXG4gIHZhbHVlUHJvcE5hbWU6ICd2YWx1ZSdcbn07XG5mdW5jdGlvbiBXcmFwcGVyRmllbGQoX3JlZjUpIHtcbiAgdmFyIG5hbWUgPSBfcmVmNS5uYW1lLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmNSwgX2V4Y2x1ZGVkKTtcbiAgdmFyIGZpZWxkQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRmllbGRDb250ZXh0KTtcbiAgdmFyIG5hbWVQYXRoID0gbmFtZSAhPT0gdW5kZWZpbmVkID8gZ2V0TmFtZVBhdGgobmFtZSkgOiB1bmRlZmluZWQ7XG4gIHZhciBrZXkgPSAna2VlcCc7XG4gIGlmICghcmVzdFByb3BzLmlzTGlzdEZpZWxkKSB7XG4gICAga2V5ID0gXCJfXCIuY29uY2F0KChuYW1lUGF0aCB8fCBbXSkuam9pbignXycpKTtcbiAgfVxuICAvLyBXYXJuaW5nIGlmIGl0J3MgYSBkaXJlY3RseSBsaXN0IGZpZWxkLlxuICAvLyBXZSBjYW4gc3RpbGwgc3VwcG9ydCBtdWx0aXBsZSBsZXZlbCBmaWVsZCBwcmVzZXJ2ZS5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgcmVzdFByb3BzLnByZXNlcnZlID09PSBmYWxzZSAmJiByZXN0UHJvcHMuaXNMaXN0RmllbGQgJiYgbmFtZVBhdGgubGVuZ3RoIDw9IDEpIHtcbiAgICB3YXJuaW5nKGZhbHNlLCAnYHByZXNlcnZlYCBzaG91bGQgbm90IGFwcGx5IG9uIEZvcm0uTGlzdCBmaWVsZHMuJyk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZpZWxkLCBfZXh0ZW5kcyh7XG4gICAga2V5OiBrZXksXG4gICAgbmFtZTogbmFtZVBhdGhcbiAgfSwgcmVzdFByb3BzLCB7XG4gICAgZmllbGRDb250ZXh0OiBmaWVsZENvbnRleHRcbiAgfSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgV3JhcHBlckZpZWxkOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBMaXN0Q29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IGRlZmF1bHQgTGlzdENvbnRleHQ7IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgRmllbGRDb250ZXh0IGZyb20gJy4vRmllbGRDb250ZXh0JztcbmltcG9ydCBGaWVsZCBmcm9tICcuL0ZpZWxkJztcbmltcG9ydCB7IG1vdmUgYXMgX21vdmUsIGdldE5hbWVQYXRoIH0gZnJvbSAnLi91dGlscy92YWx1ZVV0aWwnO1xuaW1wb3J0IExpc3RDb250ZXh0IGZyb20gJy4vTGlzdENvbnRleHQnO1xudmFyIExpc3QgPSBmdW5jdGlvbiBMaXN0KF9yZWYpIHtcbiAgdmFyIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgaW5pdGlhbFZhbHVlID0gX3JlZi5pbml0aWFsVmFsdWUsXG4gICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgIHJ1bGVzID0gX3JlZi5ydWxlcyxcbiAgICB2YWxpZGF0ZVRyaWdnZXIgPSBfcmVmLnZhbGlkYXRlVHJpZ2dlcjtcbiAgdmFyIGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KEZpZWxkQ29udGV4dCk7XG4gIHZhciBrZXlSZWYgPSBSZWFjdC51c2VSZWYoe1xuICAgIGtleXM6IFtdLFxuICAgIGlkOiAwXG4gIH0pO1xuICB2YXIga2V5TWFuYWdlciA9IGtleVJlZi5jdXJyZW50O1xuICB2YXIgcHJlZml4TmFtZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnRQcmVmaXhOYW1lID0gZ2V0TmFtZVBhdGgoY29udGV4dC5wcmVmaXhOYW1lKSB8fCBbXTtcbiAgICByZXR1cm4gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShwYXJlbnRQcmVmaXhOYW1lKSwgX3RvQ29uc3VtYWJsZUFycmF5KGdldE5hbWVQYXRoKG5hbWUpKSk7XG4gIH0sIFtjb250ZXh0LnByZWZpeE5hbWUsIG5hbWVdKTtcbiAgdmFyIGZpZWxkQ29udGV4dCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGNvbnRleHQpLCB7fSwge1xuICAgICAgcHJlZml4TmFtZTogcHJlZml4TmFtZVxuICAgIH0pO1xuICB9LCBbY29udGV4dCwgcHJlZml4TmFtZV0pO1xuICAvLyBMaXN0IGNvbnRleHRcbiAgdmFyIGxpc3RDb250ZXh0ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldEtleTogZnVuY3Rpb24gZ2V0S2V5KG5hbWVQYXRoKSB7XG4gICAgICAgIHZhciBsZW4gPSBwcmVmaXhOYW1lLmxlbmd0aDtcbiAgICAgICAgdmFyIHBhdGhOYW1lID0gbmFtZVBhdGhbbGVuXTtcbiAgICAgICAgcmV0dXJuIFtrZXlNYW5hZ2VyLmtleXNbcGF0aE5hbWVdLCBuYW1lUGF0aC5zbGljZShsZW4gKyAxKV07XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW3ByZWZpeE5hbWVdKTtcbiAgLy8gVXNlciBzaG91bGQgbm90IHBhc3MgYGNoaWxkcmVuYCBhcyBvdGhlciB0eXBlLlxuICBpZiAodHlwZW9mIGNoaWxkcmVuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgd2FybmluZyhmYWxzZSwgJ0Zvcm0uTGlzdCBvbmx5IGFjY2VwdHMgZnVuY3Rpb24gYXMgY2hpbGRyZW4uJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIHNob3VsZFVwZGF0ZSA9IGZ1bmN0aW9uIHNob3VsZFVwZGF0ZShwcmV2VmFsdWUsIG5leHRWYWx1ZSwgX3JlZjIpIHtcbiAgICB2YXIgc291cmNlID0gX3JlZjIuc291cmNlO1xuICAgIGlmIChzb3VyY2UgPT09ICdpbnRlcm5hbCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHByZXZWYWx1ZSAhPT0gbmV4dFZhbHVlO1xuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGlzdENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogbGlzdENvbnRleHRcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmllbGRDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGZpZWxkQ29udGV4dFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGaWVsZCwge1xuICAgIG5hbWU6IFtdLFxuICAgIHNob3VsZFVwZGF0ZTogc2hvdWxkVXBkYXRlLFxuICAgIHJ1bGVzOiBydWxlcyxcbiAgICB2YWxpZGF0ZVRyaWdnZXI6IHZhbGlkYXRlVHJpZ2dlcixcbiAgICBpbml0aWFsVmFsdWU6IGluaXRpYWxWYWx1ZSxcbiAgICBpc0xpc3Q6IHRydWVcbiAgfSwgZnVuY3Rpb24gKF9yZWYzLCBtZXRhKSB7XG4gICAgdmFyIF9yZWYzJHZhbHVlID0gX3JlZjMudmFsdWUsXG4gICAgICB2YWx1ZSA9IF9yZWYzJHZhbHVlID09PSB2b2lkIDAgPyBbXSA6IF9yZWYzJHZhbHVlLFxuICAgICAgb25DaGFuZ2UgPSBfcmVmMy5vbkNoYW5nZTtcbiAgICB2YXIgZ2V0RmllbGRWYWx1ZSA9IGNvbnRleHQuZ2V0RmllbGRWYWx1ZTtcbiAgICB2YXIgZ2V0TmV3VmFsdWUgPSBmdW5jdGlvbiBnZXROZXdWYWx1ZSgpIHtcbiAgICAgIHZhciB2YWx1ZXMgPSBnZXRGaWVsZFZhbHVlKHByZWZpeE5hbWUgfHwgW10pO1xuICAgICAgcmV0dXJuIHZhbHVlcyB8fCBbXTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsd2F5cyBnZXQgbGF0ZXN0IHZhbHVlIGluIGNhc2UgdXNlciB1cGRhdGUgZmllbGRzIGJ5IGBmb3JtYCBhcGkuXG4gICAgICovXG4gICAgdmFyIG9wZXJhdGlvbnMgPSB7XG4gICAgICBhZGQ6IGZ1bmN0aW9uIGFkZChkZWZhdWx0VmFsdWUsIGluZGV4KSB7XG4gICAgICAgIC8vIE1hcHBpbmcga2V5c1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSBnZXROZXdWYWx1ZSgpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8PSBuZXdWYWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICBrZXlNYW5hZ2VyLmtleXMgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGtleU1hbmFnZXIua2V5cy5zbGljZSgwLCBpbmRleCkpLCBba2V5TWFuYWdlci5pZF0sIF90b0NvbnN1bWFibGVBcnJheShrZXlNYW5hZ2VyLmtleXMuc2xpY2UoaW5kZXgpKSk7XG4gICAgICAgICAgb25DaGFuZ2UoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShuZXdWYWx1ZS5zbGljZSgwLCBpbmRleCkpLCBbZGVmYXVsdFZhbHVlXSwgX3RvQ29uc3VtYWJsZUFycmF5KG5ld1ZhbHVlLnNsaWNlKGluZGV4KSkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAoaW5kZXggPCAwIHx8IGluZGV4ID4gbmV3VmFsdWUubGVuZ3RoKSkge1xuICAgICAgICAgICAgd2FybmluZyhmYWxzZSwgJ1RoZSBzZWNvbmQgcGFyYW1ldGVyIG9mIHRoZSBhZGQgZnVuY3Rpb24gc2hvdWxkIGJlIGEgdmFsaWQgcG9zaXRpdmUgbnVtYmVyLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrZXlNYW5hZ2VyLmtleXMgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGtleU1hbmFnZXIua2V5cyksIFtrZXlNYW5hZ2VyLmlkXSk7XG4gICAgICAgICAgb25DaGFuZ2UoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShuZXdWYWx1ZSksIFtkZWZhdWx0VmFsdWVdKSk7XG4gICAgICAgIH1cbiAgICAgICAga2V5TWFuYWdlci5pZCArPSAxO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKGluZGV4KSB7XG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IGdldE5ld1ZhbHVlKCk7XG4gICAgICAgIHZhciBpbmRleFNldCA9IG5ldyBTZXQoQXJyYXkuaXNBcnJheShpbmRleCkgPyBpbmRleCA6IFtpbmRleF0pO1xuICAgICAgICBpZiAoaW5kZXhTZXQuc2l6ZSA8PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGtleU1hbmFnZXIua2V5cyA9IGtleU1hbmFnZXIua2V5cy5maWx0ZXIoZnVuY3Rpb24gKF8sIGtleXNJbmRleCkge1xuICAgICAgICAgIHJldHVybiAhaW5kZXhTZXQuaGFzKGtleXNJbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBUcmlnZ2VyIHN0b3JlIGNoYW5nZVxuICAgICAgICBvbkNoYW5nZShuZXdWYWx1ZS5maWx0ZXIoZnVuY3Rpb24gKF8sIHZhbHVlSW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gIWluZGV4U2V0Lmhhcyh2YWx1ZUluZGV4KTtcbiAgICAgICAgfSkpO1xuICAgICAgfSxcbiAgICAgIG1vdmU6IGZ1bmN0aW9uIG1vdmUoZnJvbSwgdG8pIHtcbiAgICAgICAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IGdldE5ld1ZhbHVlKCk7XG4gICAgICAgIC8vIERvIG5vdCBoYW5kbGUgb3V0IG9mIHJhbmdlXG4gICAgICAgIGlmIChmcm9tIDwgMCB8fCBmcm9tID49IG5ld1ZhbHVlLmxlbmd0aCB8fCB0byA8IDAgfHwgdG8gPj0gbmV3VmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGtleU1hbmFnZXIua2V5cyA9IF9tb3ZlKGtleU1hbmFnZXIua2V5cywgZnJvbSwgdG8pO1xuICAgICAgICAvLyBUcmlnZ2VyIHN0b3JlIGNoYW5nZVxuICAgICAgICBvbkNoYW5nZShfbW92ZShuZXdWYWx1ZSwgZnJvbSwgdG8pKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBsaXN0VmFsdWUgPSB2YWx1ZSB8fCBbXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdFZhbHVlKSkge1xuICAgICAgbGlzdFZhbHVlID0gW107XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB3YXJuaW5nKGZhbHNlLCBcIkN1cnJlbnQgdmFsdWUgb2YgJ1wiLmNvbmNhdChwcmVmaXhOYW1lLmpvaW4oJyA+ICcpLCBcIicgaXMgbm90IGFuIGFycmF5IHR5cGUuXCIpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkcmVuKGxpc3RWYWx1ZS5tYXAoZnVuY3Rpb24gKF9fLCBpbmRleCkge1xuICAgICAgdmFyIGtleSA9IGtleU1hbmFnZXIua2V5c1tpbmRleF07XG4gICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAga2V5TWFuYWdlci5rZXlzW2luZGV4XSA9IGtleU1hbmFnZXIuaWQ7XG4gICAgICAgIGtleSA9IGtleU1hbmFnZXIua2V5c1tpbmRleF07XG4gICAgICAgIGtleU1hbmFnZXIuaWQgKz0gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGluZGV4LFxuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgaXNMaXN0RmllbGQ6IHRydWVcbiAgICAgIH07XG4gICAgfSksIG9wZXJhdGlvbnMsIG1ldGEpO1xuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IExpc3Q7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICB2YXIgX2kgPSBudWxsID09IGFyciA/IG51bGwgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXTtcbiAgaWYgKG51bGwgIT0gX2kpIHtcbiAgICB2YXIgX3MsXG4gICAgICBfZSxcbiAgICAgIF94LFxuICAgICAgX3IsXG4gICAgICBfYXJyID0gW10sXG4gICAgICBfbiA9ICEwLFxuICAgICAgX2QgPSAhMTtcbiAgICB0cnkge1xuICAgICAgaWYgKF94ID0gKF9pID0gX2kuY2FsbChhcnIpKS5uZXh0LCAwID09PSBpKSB7XG4gICAgICAgIGlmIChPYmplY3QoX2kpICE9PSBfaSkgcmV0dXJuO1xuICAgICAgICBfbiA9ICExO1xuICAgICAgfSBlbHNlIGZvciAoOyAhKF9uID0gKF9zID0gX3guY2FsbChfaSkpLmRvbmUpICYmIChfYXJyLnB1c2goX3MudmFsdWUpLCBfYXJyLmxlbmd0aCAhPT0gaSk7IF9uID0gITApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgX2QgPSAhMCwgX2UgPSBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghX24gJiYgbnVsbCAhPSBfaVtcInJldHVyblwiXSAmJiAoX3IgPSBfaVtcInJldHVyblwiXSgpLCBPYmplY3QoX3IpICE9PSBfcikpIHJldHVybjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBfYXJyO1xuICB9XG59IiwiaW1wb3J0IGFycmF5V2l0aEhvbGVzIGZyb20gXCIuL2FycmF5V2l0aEhvbGVzLmpzXCI7XG5pbXBvcnQgaXRlcmFibGVUb0FycmF5TGltaXQgZnJvbSBcIi4vaXRlcmFibGVUb0FycmF5TGltaXQuanNcIjtcbmltcG9ydCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSBmcm9tIFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qc1wiO1xuaW1wb3J0IG5vbkl0ZXJhYmxlUmVzdCBmcm9tIFwiLi9ub25JdGVyYWJsZVJlc3QuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkge1xuICByZXR1cm4gYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBpdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59IiwiZXhwb3J0IGZ1bmN0aW9uIGFsbFByb21pc2VGaW5pc2gocHJvbWlzZUxpc3QpIHtcbiAgdmFyIGhhc0Vycm9yID0gZmFsc2U7XG4gIHZhciBjb3VudCA9IHByb21pc2VMaXN0Lmxlbmd0aDtcbiAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgaWYgKCFwcm9taXNlTGlzdC5sZW5ndGgpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcbiAgfVxuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHByb21pc2VMaXN0LmZvckVhY2goZnVuY3Rpb24gKHByb21pc2UsIGluZGV4KSB7XG4gICAgICBwcm9taXNlLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgY291bnQgLT0gMTtcbiAgICAgICAgcmVzdWx0c1tpbmRleF0gPSByZXN1bHQ7XG4gICAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0Vycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdHMpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVzdWx0cyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG52YXIgU1BMSVQgPSAnX19AZmllbGRfc3BsaXRfXyc7XG4vKipcbiAqIENvbnZlcnQgbmFtZSBwYXRoIGludG8gc3RyaW5nIHRvIGZhc3QgdGhlIGZldGNoIHNwZWVkIG9mIE1hcC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplKG5hbWVQYXRoKSB7XG4gIHJldHVybiBuYW1lUGF0aC5tYXAoZnVuY3Rpb24gKGNlbGwpIHtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQoX3R5cGVvZihjZWxsKSwgXCI6XCIpLmNvbmNhdChjZWxsKTtcbiAgfSlcbiAgLy8gTWFnaWMgc3BsaXRcbiAgLmpvaW4oU1BMSVQpO1xufVxuLyoqXG4gKiBOYW1lTWFwIGxpa2UgYSBgTWFwYCBidXQgYWNjZXB0cyBgc3RyaW5nW11gIGFzIGtleS5cbiAqL1xudmFyIE5hbWVNYXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBOYW1lTWFwKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOYW1lTWFwKTtcbiAgICB0aGlzLmt2cyA9IG5ldyBNYXAoKTtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoTmFtZU1hcCwgW3tcbiAgICBrZXk6IFwic2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICB0aGlzLmt2cy5zZXQobm9ybWFsaXplKGtleSksIHZhbHVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLmt2cy5nZXQobm9ybWFsaXplKGtleSkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlKGtleSwgdXBkYXRlcikge1xuICAgICAgdmFyIG9yaWdpbiA9IHRoaXMuZ2V0KGtleSk7XG4gICAgICB2YXIgbmV4dCA9IHVwZGF0ZXIob3JpZ2luKTtcbiAgICAgIGlmICghbmV4dCkge1xuICAgICAgICB0aGlzLmRlbGV0ZShrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXQoa2V5LCBuZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9kZWxldGUoa2V5KSB7XG4gICAgICB0aGlzLmt2cy5kZWxldGUobm9ybWFsaXplKGtleSkpO1xuICAgIH1cbiAgICAvLyBTaW5jZSB3ZSBvbmx5IHVzZSB0aGlzIGluIHRlc3QsIGxldCBzaW1wbHkgcmVhbGl6ZSB0aGlzXG4gIH0sIHtcbiAgICBrZXk6IFwibWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hcChjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIF90b0NvbnN1bWFibGVBcnJheSh0aGlzLmt2cy5lbnRyaWVzKCkpLm1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKSxcbiAgICAgICAgICBrZXkgPSBfcmVmMlswXSxcbiAgICAgICAgICB2YWx1ZSA9IF9yZWYyWzFdO1xuICAgICAgICB2YXIgY2VsbHMgPSBrZXkuc3BsaXQoU1BMSVQpO1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soe1xuICAgICAgICAgIGtleTogY2VsbHMubWFwKGZ1bmN0aW9uIChjZWxsKSB7XG4gICAgICAgICAgICB2YXIgX2NlbGwkbWF0Y2ggPSBjZWxsLm1hdGNoKC9eKFteOl0qKTooLiopJC8pLFxuICAgICAgICAgICAgICBfY2VsbCRtYXRjaDIgPSBfc2xpY2VkVG9BcnJheShfY2VsbCRtYXRjaCwgMyksXG4gICAgICAgICAgICAgIHR5cGUgPSBfY2VsbCRtYXRjaDJbMV0sXG4gICAgICAgICAgICAgIHVuaXQgPSBfY2VsbCRtYXRjaDJbMl07XG4gICAgICAgICAgICByZXR1cm4gdHlwZSA9PT0gJ251bWJlcicgPyBOdW1iZXIodW5pdCkgOiB1bml0O1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b0pTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9KU09OKCkge1xuICAgICAgdmFyIGpzb24gPSB7fTtcbiAgICAgIHRoaXMubWFwKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICB2YXIga2V5ID0gX3JlZjMua2V5LFxuICAgICAgICAgIHZhbHVlID0gX3JlZjMudmFsdWU7XG4gICAgICAgIGpzb25ba2V5LmpvaW4oJy4nKV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gTmFtZU1hcDtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IE5hbWVNYXA7IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJuYW1lXCIsIFwiZXJyb3JzXCJdO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgSE9PS19NQVJLIH0gZnJvbSAnLi9GaWVsZENvbnRleHQnO1xuaW1wb3J0IHsgYWxsUHJvbWlzZUZpbmlzaCB9IGZyb20gJy4vdXRpbHMvYXN5bmNVdGlsJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnLi91dGlscy9jbG9uZURlZXAnO1xuaW1wb3J0IHsgZGVmYXVsdFZhbGlkYXRlTWVzc2FnZXMgfSBmcm9tICcuL3V0aWxzL21lc3NhZ2VzJztcbmltcG9ydCBOYW1lTWFwIGZyb20gJy4vdXRpbHMvTmFtZU1hcCc7XG5pbXBvcnQgeyBjbG9uZUJ5TmFtZVBhdGhMaXN0LCBjb250YWluc05hbWVQYXRoLCBnZXROYW1lUGF0aCwgZ2V0VmFsdWUsIG1hdGNoTmFtZVBhdGgsIHNldFZhbHVlLCBzZXRWYWx1ZXMgfSBmcm9tICcuL3V0aWxzL3ZhbHVlVXRpbCc7XG5leHBvcnQgdmFyIEZvcm1TdG9yZSA9IC8qI19fUFVSRV9fKi9fY3JlYXRlQ2xhc3MoZnVuY3Rpb24gRm9ybVN0b3JlKGZvcmNlUm9vdFVwZGF0ZSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRm9ybVN0b3JlKTtcbiAgdGhpcy5mb3JtSG9va2VkID0gZmFsc2U7XG4gIHRoaXMuZm9yY2VSb290VXBkYXRlID0gdm9pZCAwO1xuICB0aGlzLnN1YnNjcmliYWJsZSA9IHRydWU7XG4gIHRoaXMuc3RvcmUgPSB7fTtcbiAgdGhpcy5maWVsZEVudGl0aWVzID0gW107XG4gIHRoaXMuaW5pdGlhbFZhbHVlcyA9IHt9O1xuICB0aGlzLmNhbGxiYWNrcyA9IHt9O1xuICB0aGlzLnZhbGlkYXRlTWVzc2FnZXMgPSBudWxsO1xuICB0aGlzLnByZXNlcnZlID0gbnVsbDtcbiAgdGhpcy5sYXN0VmFsaWRhdGVQcm9taXNlID0gbnVsbDtcbiAgdGhpcy5nZXRGb3JtID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBnZXRGaWVsZFZhbHVlOiBfdGhpcy5nZXRGaWVsZFZhbHVlLFxuICAgICAgZ2V0RmllbGRzVmFsdWU6IF90aGlzLmdldEZpZWxkc1ZhbHVlLFxuICAgICAgZ2V0RmllbGRFcnJvcjogX3RoaXMuZ2V0RmllbGRFcnJvcixcbiAgICAgIGdldEZpZWxkV2FybmluZzogX3RoaXMuZ2V0RmllbGRXYXJuaW5nLFxuICAgICAgZ2V0RmllbGRzRXJyb3I6IF90aGlzLmdldEZpZWxkc0Vycm9yLFxuICAgICAgaXNGaWVsZHNUb3VjaGVkOiBfdGhpcy5pc0ZpZWxkc1RvdWNoZWQsXG4gICAgICBpc0ZpZWxkVG91Y2hlZDogX3RoaXMuaXNGaWVsZFRvdWNoZWQsXG4gICAgICBpc0ZpZWxkVmFsaWRhdGluZzogX3RoaXMuaXNGaWVsZFZhbGlkYXRpbmcsXG4gICAgICBpc0ZpZWxkc1ZhbGlkYXRpbmc6IF90aGlzLmlzRmllbGRzVmFsaWRhdGluZyxcbiAgICAgIHJlc2V0RmllbGRzOiBfdGhpcy5yZXNldEZpZWxkcyxcbiAgICAgIHNldEZpZWxkczogX3RoaXMuc2V0RmllbGRzLFxuICAgICAgc2V0RmllbGRWYWx1ZTogX3RoaXMuc2V0RmllbGRWYWx1ZSxcbiAgICAgIHNldEZpZWxkc1ZhbHVlOiBfdGhpcy5zZXRGaWVsZHNWYWx1ZSxcbiAgICAgIHZhbGlkYXRlRmllbGRzOiBfdGhpcy52YWxpZGF0ZUZpZWxkcyxcbiAgICAgIHN1Ym1pdDogX3RoaXMuc3VibWl0LFxuICAgICAgX2luaXQ6IHRydWUsXG4gICAgICBnZXRJbnRlcm5hbEhvb2tzOiBfdGhpcy5nZXRJbnRlcm5hbEhvb2tzXG4gICAgfTtcbiAgfTtcbiAgdGhpcy5nZXRJbnRlcm5hbEhvb2tzID0gZnVuY3Rpb24gKGtleSkge1xuICAgIGlmIChrZXkgPT09IEhPT0tfTUFSSykge1xuICAgICAgX3RoaXMuZm9ybUhvb2tlZCA9IHRydWU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXNwYXRjaDogX3RoaXMuZGlzcGF0Y2gsXG4gICAgICAgIGluaXRFbnRpdHlWYWx1ZTogX3RoaXMuaW5pdEVudGl0eVZhbHVlLFxuICAgICAgICByZWdpc3RlckZpZWxkOiBfdGhpcy5yZWdpc3RlckZpZWxkLFxuICAgICAgICB1c2VTdWJzY3JpYmU6IF90aGlzLnVzZVN1YnNjcmliZSxcbiAgICAgICAgc2V0SW5pdGlhbFZhbHVlczogX3RoaXMuc2V0SW5pdGlhbFZhbHVlcyxcbiAgICAgICAgZGVzdHJveUZvcm06IF90aGlzLmRlc3Ryb3lGb3JtLFxuICAgICAgICBzZXRDYWxsYmFja3M6IF90aGlzLnNldENhbGxiYWNrcyxcbiAgICAgICAgc2V0VmFsaWRhdGVNZXNzYWdlczogX3RoaXMuc2V0VmFsaWRhdGVNZXNzYWdlcyxcbiAgICAgICAgZ2V0RmllbGRzOiBfdGhpcy5nZXRGaWVsZHMsXG4gICAgICAgIHNldFByZXNlcnZlOiBfdGhpcy5zZXRQcmVzZXJ2ZSxcbiAgICAgICAgZ2V0SW5pdGlhbFZhbHVlOiBfdGhpcy5nZXRJbml0aWFsVmFsdWUsXG4gICAgICAgIHJlZ2lzdGVyV2F0Y2g6IF90aGlzLnJlZ2lzdGVyV2F0Y2hcbiAgICAgIH07XG4gICAgfVxuICAgIHdhcm5pbmcoZmFsc2UsICdgZ2V0SW50ZXJuYWxIb29rc2AgaXMgaW50ZXJuYWwgdXNhZ2UuIFNob3VsZCBub3QgY2FsbCBkaXJlY3RseS4nKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbiAgdGhpcy51c2VTdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJhYmxlKSB7XG4gICAgX3RoaXMuc3Vic2NyaWJhYmxlID0gc3Vic2NyaWJhYmxlO1xuICB9O1xuICB0aGlzLnByZXZXaXRob3V0UHJlc2VydmVzID0gbnVsbDtcbiAgdGhpcy5zZXRJbml0aWFsVmFsdWVzID0gZnVuY3Rpb24gKGluaXRpYWxWYWx1ZXMsIGluaXQpIHtcbiAgICBfdGhpcy5pbml0aWFsVmFsdWVzID0gaW5pdGlhbFZhbHVlcyB8fCB7fTtcbiAgICBpZiAoaW5pdCkge1xuICAgICAgdmFyIF90aGlzJHByZXZXaXRob3V0UHJlcztcbiAgICAgIHZhciBuZXh0U3RvcmUgPSBzZXRWYWx1ZXMoe30sIGluaXRpYWxWYWx1ZXMsIF90aGlzLnN0b3JlKTtcbiAgICAgIC8vIFdlIHdpbGwgdGFrZSBjb25zaWRlciBwcmV2IGZvcm0gdW5tb3VudCBmaWVsZHMuXG4gICAgICAvLyBXaGVuIHRoZSBmaWVsZCBpcyBub3QgYHByZXNlcnZlYCwgd2UgbmVlZCBmaWxsIHRoaXMgd2l0aCBpbml0aWFsVmFsdWVzIGluc3RlYWQgb2Ygc3RvcmUuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgYXJyYXktY2FsbGJhY2stcmV0dXJuXG4gICAgICAoX3RoaXMkcHJldldpdGhvdXRQcmVzID0gX3RoaXMucHJldldpdGhvdXRQcmVzZXJ2ZXMpID09PSBudWxsIHx8IF90aGlzJHByZXZXaXRob3V0UHJlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkcHJldldpdGhvdXRQcmVzLm1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgbmFtZVBhdGggPSBfcmVmLmtleTtcbiAgICAgICAgbmV4dFN0b3JlID0gc2V0VmFsdWUobmV4dFN0b3JlLCBuYW1lUGF0aCwgZ2V0VmFsdWUoaW5pdGlhbFZhbHVlcywgbmFtZVBhdGgpKTtcbiAgICAgIH0pO1xuICAgICAgX3RoaXMucHJldldpdGhvdXRQcmVzZXJ2ZXMgPSBudWxsO1xuICAgICAgX3RoaXMudXBkYXRlU3RvcmUobmV4dFN0b3JlKTtcbiAgICB9XG4gIH07XG4gIHRoaXMuZGVzdHJveUZvcm0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByZXZXaXRob3V0UHJlc2VydmVzID0gbmV3IE5hbWVNYXAoKTtcbiAgICBfdGhpcy5nZXRGaWVsZEVudGl0aWVzKHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgaWYgKCFfdGhpcy5pc01lcmdlZFByZXNlcnZlKGVudGl0eS5pc1ByZXNlcnZlKCkpKSB7XG4gICAgICAgIHByZXZXaXRob3V0UHJlc2VydmVzLnNldChlbnRpdHkuZ2V0TmFtZVBhdGgoKSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgX3RoaXMucHJldldpdGhvdXRQcmVzZXJ2ZXMgPSBwcmV2V2l0aG91dFByZXNlcnZlcztcbiAgfTtcbiAgdGhpcy5nZXRJbml0aWFsVmFsdWUgPSBmdW5jdGlvbiAobmFtZVBhdGgpIHtcbiAgICB2YXIgaW5pdFZhbHVlID0gZ2V0VmFsdWUoX3RoaXMuaW5pdGlhbFZhbHVlcywgbmFtZVBhdGgpO1xuICAgIC8vIE5vdCBjbG9uZURlZXAgd2hlbiB3aXRob3V0IGBuYW1lUGF0aGBcbiAgICByZXR1cm4gbmFtZVBhdGgubGVuZ3RoID8gY2xvbmVEZWVwKGluaXRWYWx1ZSkgOiBpbml0VmFsdWU7XG4gIH07XG4gIHRoaXMuc2V0Q2FsbGJhY2tzID0gZnVuY3Rpb24gKGNhbGxiYWNrcykge1xuICAgIF90aGlzLmNhbGxiYWNrcyA9IGNhbGxiYWNrcztcbiAgfTtcbiAgdGhpcy5zZXRWYWxpZGF0ZU1lc3NhZ2VzID0gZnVuY3Rpb24gKHZhbGlkYXRlTWVzc2FnZXMpIHtcbiAgICBfdGhpcy52YWxpZGF0ZU1lc3NhZ2VzID0gdmFsaWRhdGVNZXNzYWdlcztcbiAgfTtcbiAgdGhpcy5zZXRQcmVzZXJ2ZSA9IGZ1bmN0aW9uIChwcmVzZXJ2ZSkge1xuICAgIF90aGlzLnByZXNlcnZlID0gcHJlc2VydmU7XG4gIH07XG4gIHRoaXMud2F0Y2hMaXN0ID0gW107XG4gIHRoaXMucmVnaXN0ZXJXYXRjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIF90aGlzLndhdGNoTGlzdC5wdXNoKGNhbGxiYWNrKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMud2F0Y2hMaXN0ID0gX3RoaXMud2F0Y2hMaXN0LmZpbHRlcihmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgcmV0dXJuIGZuICE9PSBjYWxsYmFjaztcbiAgICAgIH0pO1xuICAgIH07XG4gIH07XG4gIHRoaXMubm90aWZ5V2F0Y2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5hbWVQYXRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcbiAgICAvLyBObyBuZWVkIHRvIGNvc3QgcGVyZiB3aGVuIG5vdGhpbmcgbmVlZCB0byB3YXRjaFxuICAgIGlmIChfdGhpcy53YXRjaExpc3QubGVuZ3RoKSB7XG4gICAgICB2YXIgdmFsdWVzID0gX3RoaXMuZ2V0RmllbGRzVmFsdWUoKTtcbiAgICAgIF90aGlzLndhdGNoTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjayh2YWx1ZXMsIG5hbWVQYXRoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgdGhpcy50aW1lb3V0SWQgPSBudWxsO1xuICB0aGlzLndhcm5pbmdVbmhvb2tlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhX3RoaXMudGltZW91dElkICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBfdGhpcy50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMudGltZW91dElkID0gbnVsbDtcbiAgICAgICAgaWYgKCFfdGhpcy5mb3JtSG9va2VkKSB7XG4gICAgICAgICAgd2FybmluZyhmYWxzZSwgJ0luc3RhbmNlIGNyZWF0ZWQgYnkgYHVzZUZvcm1gIGlzIG5vdCBjb25uZWN0ZWQgdG8gYW55IEZvcm0gZWxlbWVudC4gRm9yZ2V0IHRvIHBhc3MgYGZvcm1gIHByb3A/Jyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgdGhpcy51cGRhdGVTdG9yZSA9IGZ1bmN0aW9uIChuZXh0U3RvcmUpIHtcbiAgICBfdGhpcy5zdG9yZSA9IG5leHRTdG9yZTtcbiAgfTtcbiAgdGhpcy5nZXRGaWVsZEVudGl0aWVzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwdXJlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICBpZiAoIXB1cmUpIHtcbiAgICAgIHJldHVybiBfdGhpcy5maWVsZEVudGl0aWVzO1xuICAgIH1cbiAgICByZXR1cm4gX3RoaXMuZmllbGRFbnRpdGllcy5maWx0ZXIoZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICByZXR1cm4gZmllbGQuZ2V0TmFtZVBhdGgoKS5sZW5ndGg7XG4gICAgfSk7XG4gIH07XG4gIHRoaXMuZ2V0RmllbGRzTWFwID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwdXJlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICB2YXIgY2FjaGUgPSBuZXcgTmFtZU1hcCgpO1xuICAgIF90aGlzLmdldEZpZWxkRW50aXRpZXMocHVyZSkuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgIHZhciBuYW1lUGF0aCA9IGZpZWxkLmdldE5hbWVQYXRoKCk7XG4gICAgICBjYWNoZS5zZXQobmFtZVBhdGgsIGZpZWxkKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2FjaGU7XG4gIH07XG4gIHRoaXMuZ2V0RmllbGRFbnRpdGllc0Zvck5hbWVQYXRoTGlzdCA9IGZ1bmN0aW9uIChuYW1lTGlzdCkge1xuICAgIGlmICghbmFtZUxpc3QpIHtcbiAgICAgIHJldHVybiBfdGhpcy5nZXRGaWVsZEVudGl0aWVzKHRydWUpO1xuICAgIH1cbiAgICB2YXIgY2FjaGUgPSBfdGhpcy5nZXRGaWVsZHNNYXAodHJ1ZSk7XG4gICAgcmV0dXJuIG5hbWVMaXN0Lm1hcChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIG5hbWVQYXRoID0gZ2V0TmFtZVBhdGgobmFtZSk7XG4gICAgICByZXR1cm4gY2FjaGUuZ2V0KG5hbWVQYXRoKSB8fCB7XG4gICAgICAgIElOVkFMSURBVEVfTkFNRV9QQVRIOiBnZXROYW1lUGF0aChuYW1lKVxuICAgICAgfTtcbiAgICB9KTtcbiAgfTtcbiAgdGhpcy5nZXRGaWVsZHNWYWx1ZSA9IGZ1bmN0aW9uIChuYW1lTGlzdCwgZmlsdGVyRnVuYykge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIGlmIChuYW1lTGlzdCA9PT0gdHJ1ZSAmJiAhZmlsdGVyRnVuYykge1xuICAgICAgcmV0dXJuIF90aGlzLnN0b3JlO1xuICAgIH1cbiAgICB2YXIgZmllbGRFbnRpdGllcyA9IF90aGlzLmdldEZpZWxkRW50aXRpZXNGb3JOYW1lUGF0aExpc3QoQXJyYXkuaXNBcnJheShuYW1lTGlzdCkgPyBuYW1lTGlzdCA6IG51bGwpO1xuICAgIHZhciBmaWx0ZXJlZE5hbWVMaXN0ID0gW107XG4gICAgZmllbGRFbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgIHZhciBfZW50aXR5JGlzTGlzdEZpZWxkO1xuICAgICAgdmFyIG5hbWVQYXRoID0gJ0lOVkFMSURBVEVfTkFNRV9QQVRIJyBpbiBlbnRpdHkgPyBlbnRpdHkuSU5WQUxJREFURV9OQU1FX1BBVEggOiBlbnRpdHkuZ2V0TmFtZVBhdGgoKTtcbiAgICAgIC8vIElnbm9yZSB3aGVuIGl0J3MgYSBsaXN0IGl0ZW0gYW5kIG5vdCBzcGVjaWZpYyB0aGUgbmFtZVBhdGgsXG4gICAgICAvLyBzaW5jZSBwYXJlbnQgZmllbGQgaXMgYWxyZWFkeSB0YWtlIGluIGNvdW50XG4gICAgICBpZiAoIW5hbWVMaXN0ICYmICgoX2VudGl0eSRpc0xpc3RGaWVsZCA9IGVudGl0eS5pc0xpc3RGaWVsZCkgPT09IG51bGwgfHwgX2VudGl0eSRpc0xpc3RGaWVsZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2VudGl0eSRpc0xpc3RGaWVsZC5jYWxsKGVudGl0eSkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghZmlsdGVyRnVuYykge1xuICAgICAgICBmaWx0ZXJlZE5hbWVMaXN0LnB1c2gobmFtZVBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG1ldGEgPSAnZ2V0TWV0YScgaW4gZW50aXR5ID8gZW50aXR5LmdldE1ldGEoKSA6IG51bGw7XG4gICAgICAgIGlmIChmaWx0ZXJGdW5jKG1ldGEpKSB7XG4gICAgICAgICAgZmlsdGVyZWROYW1lTGlzdC5wdXNoKG5hbWVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZUJ5TmFtZVBhdGhMaXN0KF90aGlzLnN0b3JlLCBmaWx0ZXJlZE5hbWVMaXN0Lm1hcChnZXROYW1lUGF0aCkpO1xuICB9O1xuICB0aGlzLmdldEZpZWxkVmFsdWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIHZhciBuYW1lUGF0aCA9IGdldE5hbWVQYXRoKG5hbWUpO1xuICAgIHJldHVybiBnZXRWYWx1ZShfdGhpcy5zdG9yZSwgbmFtZVBhdGgpO1xuICB9O1xuICB0aGlzLmdldEZpZWxkc0Vycm9yID0gZnVuY3Rpb24gKG5hbWVMaXN0KSB7XG4gICAgX3RoaXMud2FybmluZ1VuaG9va2VkKCk7XG4gICAgdmFyIGZpZWxkRW50aXRpZXMgPSBfdGhpcy5nZXRGaWVsZEVudGl0aWVzRm9yTmFtZVBhdGhMaXN0KG5hbWVMaXN0KTtcbiAgICByZXR1cm4gZmllbGRFbnRpdGllcy5tYXAoZnVuY3Rpb24gKGVudGl0eSwgaW5kZXgpIHtcbiAgICAgIGlmIChlbnRpdHkgJiYgISgnSU5WQUxJREFURV9OQU1FX1BBVEgnIGluIGVudGl0eSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBlbnRpdHkuZ2V0TmFtZVBhdGgoKSxcbiAgICAgICAgICBlcnJvcnM6IGVudGl0eS5nZXRFcnJvcnMoKSxcbiAgICAgICAgICB3YXJuaW5nczogZW50aXR5LmdldFdhcm5pbmdzKClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGdldE5hbWVQYXRoKG5hbWVMaXN0W2luZGV4XSksXG4gICAgICAgIGVycm9yczogW10sXG4gICAgICAgIHdhcm5pbmdzOiBbXVxuICAgICAgfTtcbiAgICB9KTtcbiAgfTtcbiAgdGhpcy5nZXRGaWVsZEVycm9yID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBfdGhpcy53YXJuaW5nVW5ob29rZWQoKTtcbiAgICB2YXIgbmFtZVBhdGggPSBnZXROYW1lUGF0aChuYW1lKTtcbiAgICB2YXIgZmllbGRFcnJvciA9IF90aGlzLmdldEZpZWxkc0Vycm9yKFtuYW1lUGF0aF0pWzBdO1xuICAgIHJldHVybiBmaWVsZEVycm9yLmVycm9ycztcbiAgfTtcbiAgdGhpcy5nZXRGaWVsZFdhcm5pbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIHZhciBuYW1lUGF0aCA9IGdldE5hbWVQYXRoKG5hbWUpO1xuICAgIHZhciBmaWVsZEVycm9yID0gX3RoaXMuZ2V0RmllbGRzRXJyb3IoW25hbWVQYXRoXSlbMF07XG4gICAgcmV0dXJuIGZpZWxkRXJyb3Iud2FybmluZ3M7XG4gIH07XG4gIHRoaXMuaXNGaWVsZHNUb3VjaGVkID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgdmFyIGFyZzAgPSBhcmdzWzBdLFxuICAgICAgYXJnMSA9IGFyZ3NbMV07XG4gICAgdmFyIG5hbWVQYXRoTGlzdDtcbiAgICB2YXIgaXNBbGxGaWVsZHNUb3VjaGVkID0gZmFsc2U7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBuYW1lUGF0aExpc3QgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZzApKSB7XG4gICAgICAgIG5hbWVQYXRoTGlzdCA9IGFyZzAubWFwKGdldE5hbWVQYXRoKTtcbiAgICAgICAgaXNBbGxGaWVsZHNUb3VjaGVkID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuYW1lUGF0aExpc3QgPSBudWxsO1xuICAgICAgICBpc0FsbEZpZWxkc1RvdWNoZWQgPSBhcmcwO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lUGF0aExpc3QgPSBhcmcwLm1hcChnZXROYW1lUGF0aCk7XG4gICAgICBpc0FsbEZpZWxkc1RvdWNoZWQgPSBhcmcxO1xuICAgIH1cbiAgICB2YXIgZmllbGRFbnRpdGllcyA9IF90aGlzLmdldEZpZWxkRW50aXRpZXModHJ1ZSk7XG4gICAgdmFyIGlzRmllbGRUb3VjaGVkID0gZnVuY3Rpb24gaXNGaWVsZFRvdWNoZWQoZmllbGQpIHtcbiAgICAgIHJldHVybiBmaWVsZC5pc0ZpZWxkVG91Y2hlZCgpO1xuICAgIH07XG4gICAgLy8gPT09PT0gV2lsbCBnZXQgZnVsbHkgY29tcGFyZSB3aGVuIG5vdCBjb25maWcgbmFtZVBhdGhMaXN0ID09PT09XG4gICAgaWYgKCFuYW1lUGF0aExpc3QpIHtcbiAgICAgIHJldHVybiBpc0FsbEZpZWxkc1RvdWNoZWQgPyBmaWVsZEVudGl0aWVzLmV2ZXJ5KGlzRmllbGRUb3VjaGVkKSA6IGZpZWxkRW50aXRpZXMuc29tZShpc0ZpZWxkVG91Y2hlZCk7XG4gICAgfVxuICAgIC8vIEdlbmVyYXRlIGEgbmVzdCB0cmVlIGZvciB2YWxpZGF0ZVxuICAgIHZhciBtYXAgPSBuZXcgTmFtZU1hcCgpO1xuICAgIG5hbWVQYXRoTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChzaG9ydE5hbWVQYXRoKSB7XG4gICAgICBtYXAuc2V0KHNob3J0TmFtZVBhdGgsIFtdKTtcbiAgICB9KTtcbiAgICBmaWVsZEVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICB2YXIgZmllbGROYW1lUGF0aCA9IGZpZWxkLmdldE5hbWVQYXRoKCk7XG4gICAgICAvLyBGaW5kIG1hdGNoZWQgZW50aXR5IGFuZCBwdXQgaW50byBsaXN0XG4gICAgICBuYW1lUGF0aExpc3QuZm9yRWFjaChmdW5jdGlvbiAoc2hvcnROYW1lUGF0aCkge1xuICAgICAgICBpZiAoc2hvcnROYW1lUGF0aC5ldmVyeShmdW5jdGlvbiAobmFtZVVuaXQsIGkpIHtcbiAgICAgICAgICByZXR1cm4gZmllbGROYW1lUGF0aFtpXSA9PT0gbmFtZVVuaXQ7XG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgbWFwLnVwZGF0ZShzaG9ydE5hbWVQYXRoLCBmdW5jdGlvbiAobGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkobGlzdCksIFtmaWVsZF0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAvLyBDaGVjayBpZiBOYW1lTWFwIHZhbHVlIGlzIHRvdWNoZWRcbiAgICB2YXIgaXNOYW1lUGF0aExpc3RUb3VjaGVkID0gZnVuY3Rpb24gaXNOYW1lUGF0aExpc3RUb3VjaGVkKGVudGl0aWVzKSB7XG4gICAgICByZXR1cm4gZW50aXRpZXMuc29tZShpc0ZpZWxkVG91Y2hlZCk7XG4gICAgfTtcbiAgICB2YXIgbmFtZVBhdGhMaXN0RW50aXRpZXMgPSBtYXAubWFwKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgdmFyIHZhbHVlID0gX3JlZjIudmFsdWU7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIGlzQWxsRmllbGRzVG91Y2hlZCA/IG5hbWVQYXRoTGlzdEVudGl0aWVzLmV2ZXJ5KGlzTmFtZVBhdGhMaXN0VG91Y2hlZCkgOiBuYW1lUGF0aExpc3RFbnRpdGllcy5zb21lKGlzTmFtZVBhdGhMaXN0VG91Y2hlZCk7XG4gIH07XG4gIHRoaXMuaXNGaWVsZFRvdWNoZWQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIHJldHVybiBfdGhpcy5pc0ZpZWxkc1RvdWNoZWQoW25hbWVdKTtcbiAgfTtcbiAgdGhpcy5pc0ZpZWxkc1ZhbGlkYXRpbmcgPSBmdW5jdGlvbiAobmFtZUxpc3QpIHtcbiAgICBfdGhpcy53YXJuaW5nVW5ob29rZWQoKTtcbiAgICB2YXIgZmllbGRFbnRpdGllcyA9IF90aGlzLmdldEZpZWxkRW50aXRpZXMoKTtcbiAgICBpZiAoIW5hbWVMaXN0KSB7XG4gICAgICByZXR1cm4gZmllbGRFbnRpdGllcy5zb21lKGZ1bmN0aW9uICh0ZXN0RmllbGQpIHtcbiAgICAgICAgcmV0dXJuIHRlc3RGaWVsZC5pc0ZpZWxkVmFsaWRhdGluZygpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHZhciBuYW1lUGF0aExpc3QgPSBuYW1lTGlzdC5tYXAoZ2V0TmFtZVBhdGgpO1xuICAgIHJldHVybiBmaWVsZEVudGl0aWVzLnNvbWUoZnVuY3Rpb24gKHRlc3RGaWVsZCkge1xuICAgICAgdmFyIGZpZWxkTmFtZVBhdGggPSB0ZXN0RmllbGQuZ2V0TmFtZVBhdGgoKTtcbiAgICAgIHJldHVybiBjb250YWluc05hbWVQYXRoKG5hbWVQYXRoTGlzdCwgZmllbGROYW1lUGF0aCkgJiYgdGVzdEZpZWxkLmlzRmllbGRWYWxpZGF0aW5nKCk7XG4gICAgfSk7XG4gIH07XG4gIHRoaXMuaXNGaWVsZFZhbGlkYXRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIHJldHVybiBfdGhpcy5pc0ZpZWxkc1ZhbGlkYXRpbmcoW25hbWVdKTtcbiAgfTtcbiAgdGhpcy5yZXNldFdpdGhGaWVsZEluaXRpYWxWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaW5mbyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgLy8gQ3JlYXRlIGNhY2hlXG4gICAgdmFyIGNhY2hlID0gbmV3IE5hbWVNYXAoKTtcbiAgICB2YXIgZmllbGRFbnRpdGllcyA9IF90aGlzLmdldEZpZWxkRW50aXRpZXModHJ1ZSk7XG4gICAgZmllbGRFbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgdmFyIGluaXRpYWxWYWx1ZSA9IGZpZWxkLnByb3BzLmluaXRpYWxWYWx1ZTtcbiAgICAgIHZhciBuYW1lUGF0aCA9IGZpZWxkLmdldE5hbWVQYXRoKCk7XG4gICAgICAvLyBSZWNvcmQgb25seSBpZiBoYXMgYGluaXRpYWxWYWx1ZWBcbiAgICAgIGlmIChpbml0aWFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgcmVjb3JkcyA9IGNhY2hlLmdldChuYW1lUGF0aCkgfHwgbmV3IFNldCgpO1xuICAgICAgICByZWNvcmRzLmFkZCh7XG4gICAgICAgICAgZW50aXR5OiBmaWVsZCxcbiAgICAgICAgICB2YWx1ZTogaW5pdGlhbFZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBjYWNoZS5zZXQobmFtZVBhdGgsIHJlY29yZHMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIFJlc2V0XG4gICAgdmFyIHJlc2V0V2l0aEZpZWxkcyA9IGZ1bmN0aW9uIHJlc2V0V2l0aEZpZWxkcyhlbnRpdGllcykge1xuICAgICAgZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxWYWx1ZSA9IGZpZWxkLnByb3BzLmluaXRpYWxWYWx1ZTtcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFyIG5hbWVQYXRoID0gZmllbGQuZ2V0TmFtZVBhdGgoKTtcbiAgICAgICAgICB2YXIgZm9ybUluaXRpYWxWYWx1ZSA9IF90aGlzLmdldEluaXRpYWxWYWx1ZShuYW1lUGF0aCk7XG4gICAgICAgICAgaWYgKGZvcm1Jbml0aWFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gV2FybmluZyBpZiBjb25mbGljdCB3aXRoIGZvcm0gaW5pdGlhbFZhbHVlcyBhbmQgZG8gbm90IG1vZGlmeSB2YWx1ZVxuICAgICAgICAgICAgd2FybmluZyhmYWxzZSwgXCJGb3JtIGFscmVhZHkgc2V0ICdpbml0aWFsVmFsdWVzJyB3aXRoIHBhdGggJ1wiLmNvbmNhdChuYW1lUGF0aC5qb2luKCcuJyksIFwiJy4gRmllbGQgY2FuIG5vdCBvdmVyd3JpdGUgaXQuXCIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHJlY29yZHMgPSBjYWNoZS5nZXQobmFtZVBhdGgpO1xuICAgICAgICAgICAgaWYgKHJlY29yZHMgJiYgcmVjb3Jkcy5zaXplID4gMSkge1xuICAgICAgICAgICAgICAvLyBXYXJuaW5nIGlmIG11bHRpcGxlIGZpZWxkIHNldCBgaW5pdGlhbFZhbHVlYGFuZCBkbyBub3QgbW9kaWZ5IHZhbHVlXG4gICAgICAgICAgICAgIHdhcm5pbmcoZmFsc2UsIFwiTXVsdGlwbGUgRmllbGQgd2l0aCBwYXRoICdcIi5jb25jYXQobmFtZVBhdGguam9pbignLicpLCBcIicgc2V0ICdpbml0aWFsVmFsdWUnLiBDYW4gbm90IGRlY2lkZSB3aGljaCBvbmUgdG8gcGljay5cIikpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyZWNvcmRzKSB7XG4gICAgICAgICAgICAgIHZhciBvcmlnaW5WYWx1ZSA9IF90aGlzLmdldEZpZWxkVmFsdWUobmFtZVBhdGgpO1xuICAgICAgICAgICAgICAvLyBTZXQgYGluaXRpYWxWYWx1ZWBcbiAgICAgICAgICAgICAgaWYgKCFpbmZvLnNraXBFeGlzdCB8fCBvcmlnaW5WYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMudXBkYXRlU3RvcmUoc2V0VmFsdWUoX3RoaXMuc3RvcmUsIG5hbWVQYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkocmVjb3JkcylbMF0udmFsdWUpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgICB2YXIgcmVxdWlyZWRGaWVsZEVudGl0aWVzO1xuICAgIGlmIChpbmZvLmVudGl0aWVzKSB7XG4gICAgICByZXF1aXJlZEZpZWxkRW50aXRpZXMgPSBpbmZvLmVudGl0aWVzO1xuICAgIH0gZWxzZSBpZiAoaW5mby5uYW1lUGF0aExpc3QpIHtcbiAgICAgIHJlcXVpcmVkRmllbGRFbnRpdGllcyA9IFtdO1xuICAgICAgaW5mby5uYW1lUGF0aExpc3QuZm9yRWFjaChmdW5jdGlvbiAobmFtZVBhdGgpIHtcbiAgICAgICAgdmFyIHJlY29yZHMgPSBjYWNoZS5nZXQobmFtZVBhdGgpO1xuICAgICAgICBpZiAocmVjb3Jkcykge1xuICAgICAgICAgIHZhciBfcmVxdWlyZWRGaWVsZEVudGl0aWU7XG4gICAgICAgICAgKF9yZXF1aXJlZEZpZWxkRW50aXRpZSA9IHJlcXVpcmVkRmllbGRFbnRpdGllcykucHVzaC5hcHBseShfcmVxdWlyZWRGaWVsZEVudGl0aWUsIF90b0NvbnN1bWFibGVBcnJheShfdG9Db25zdW1hYmxlQXJyYXkocmVjb3JkcykubWFwKGZ1bmN0aW9uIChyKSB7XG4gICAgICAgICAgICByZXR1cm4gci5lbnRpdHk7XG4gICAgICAgICAgfSkpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcXVpcmVkRmllbGRFbnRpdGllcyA9IGZpZWxkRW50aXRpZXM7XG4gICAgfVxuICAgIHJlc2V0V2l0aEZpZWxkcyhyZXF1aXJlZEZpZWxkRW50aXRpZXMpO1xuICB9O1xuICB0aGlzLnJlc2V0RmllbGRzID0gZnVuY3Rpb24gKG5hbWVMaXN0KSB7XG4gICAgX3RoaXMud2FybmluZ1VuaG9va2VkKCk7XG4gICAgdmFyIHByZXZTdG9yZSA9IF90aGlzLnN0b3JlO1xuICAgIGlmICghbmFtZUxpc3QpIHtcbiAgICAgIF90aGlzLnVwZGF0ZVN0b3JlKHNldFZhbHVlcyh7fSwgX3RoaXMuaW5pdGlhbFZhbHVlcykpO1xuICAgICAgX3RoaXMucmVzZXRXaXRoRmllbGRJbml0aWFsVmFsdWUoKTtcbiAgICAgIF90aGlzLm5vdGlmeU9ic2VydmVycyhwcmV2U3RvcmUsIG51bGwsIHtcbiAgICAgICAgdHlwZTogJ3Jlc2V0J1xuICAgICAgfSk7XG4gICAgICBfdGhpcy5ub3RpZnlXYXRjaCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSZXNldCBieSBgbmFtZUxpc3RgXG4gICAgdmFyIG5hbWVQYXRoTGlzdCA9IG5hbWVMaXN0Lm1hcChnZXROYW1lUGF0aCk7XG4gICAgbmFtZVBhdGhMaXN0LmZvckVhY2goZnVuY3Rpb24gKG5hbWVQYXRoKSB7XG4gICAgICB2YXIgaW5pdGlhbFZhbHVlID0gX3RoaXMuZ2V0SW5pdGlhbFZhbHVlKG5hbWVQYXRoKTtcbiAgICAgIF90aGlzLnVwZGF0ZVN0b3JlKHNldFZhbHVlKF90aGlzLnN0b3JlLCBuYW1lUGF0aCwgaW5pdGlhbFZhbHVlKSk7XG4gICAgfSk7XG4gICAgX3RoaXMucmVzZXRXaXRoRmllbGRJbml0aWFsVmFsdWUoe1xuICAgICAgbmFtZVBhdGhMaXN0OiBuYW1lUGF0aExpc3RcbiAgICB9KTtcbiAgICBfdGhpcy5ub3RpZnlPYnNlcnZlcnMocHJldlN0b3JlLCBuYW1lUGF0aExpc3QsIHtcbiAgICAgIHR5cGU6ICdyZXNldCdcbiAgICB9KTtcbiAgICBfdGhpcy5ub3RpZnlXYXRjaChuYW1lUGF0aExpc3QpO1xuICB9O1xuICB0aGlzLnNldEZpZWxkcyA9IGZ1bmN0aW9uIChmaWVsZHMpIHtcbiAgICBfdGhpcy53YXJuaW5nVW5ob29rZWQoKTtcbiAgICB2YXIgcHJldlN0b3JlID0gX3RoaXMuc3RvcmU7XG4gICAgdmFyIG5hbWVQYXRoTGlzdCA9IFtdO1xuICAgIGZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZERhdGEpIHtcbiAgICAgIHZhciBuYW1lID0gZmllbGREYXRhLm5hbWUsXG4gICAgICAgIGVycm9ycyA9IGZpZWxkRGF0YS5lcnJvcnMsXG4gICAgICAgIGRhdGEgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoZmllbGREYXRhLCBfZXhjbHVkZWQpO1xuICAgICAgdmFyIG5hbWVQYXRoID0gZ2V0TmFtZVBhdGgobmFtZSk7XG4gICAgICBuYW1lUGF0aExpc3QucHVzaChuYW1lUGF0aCk7XG4gICAgICAvLyBWYWx1ZVxuICAgICAgaWYgKCd2YWx1ZScgaW4gZGF0YSkge1xuICAgICAgICBfdGhpcy51cGRhdGVTdG9yZShzZXRWYWx1ZShfdGhpcy5zdG9yZSwgbmFtZVBhdGgsIGRhdGEudmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIF90aGlzLm5vdGlmeU9ic2VydmVycyhwcmV2U3RvcmUsIFtuYW1lUGF0aF0sIHtcbiAgICAgICAgdHlwZTogJ3NldEZpZWxkJyxcbiAgICAgICAgZGF0YTogZmllbGREYXRhXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBfdGhpcy5ub3RpZnlXYXRjaChuYW1lUGF0aExpc3QpO1xuICB9O1xuICB0aGlzLmdldEZpZWxkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZW50aXRpZXMgPSBfdGhpcy5nZXRGaWVsZEVudGl0aWVzKHRydWUpO1xuICAgIHZhciBmaWVsZHMgPSBlbnRpdGllcy5tYXAoZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICB2YXIgbmFtZVBhdGggPSBmaWVsZC5nZXROYW1lUGF0aCgpO1xuICAgICAgdmFyIG1ldGEgPSBmaWVsZC5nZXRNZXRhKCk7XG4gICAgICB2YXIgZmllbGREYXRhID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtZXRhKSwge30sIHtcbiAgICAgICAgbmFtZTogbmFtZVBhdGgsXG4gICAgICAgIHZhbHVlOiBfdGhpcy5nZXRGaWVsZFZhbHVlKG5hbWVQYXRoKVxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZmllbGREYXRhLCAnb3JpZ2luUkNGaWVsZCcsIHtcbiAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZpZWxkRGF0YTtcbiAgICB9KTtcbiAgICByZXR1cm4gZmllbGRzO1xuICB9O1xuICB0aGlzLmluaXRFbnRpdHlWYWx1ZSA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICB2YXIgaW5pdGlhbFZhbHVlID0gZW50aXR5LnByb3BzLmluaXRpYWxWYWx1ZTtcbiAgICBpZiAoaW5pdGlhbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBuYW1lUGF0aCA9IGVudGl0eS5nZXROYW1lUGF0aCgpO1xuICAgICAgdmFyIHByZXZWYWx1ZSA9IGdldFZhbHVlKF90aGlzLnN0b3JlLCBuYW1lUGF0aCk7XG4gICAgICBpZiAocHJldlZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgX3RoaXMudXBkYXRlU3RvcmUoc2V0VmFsdWUoX3RoaXMuc3RvcmUsIG5hbWVQYXRoLCBpbml0aWFsVmFsdWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHRoaXMuaXNNZXJnZWRQcmVzZXJ2ZSA9IGZ1bmN0aW9uIChmaWVsZFByZXNlcnZlKSB7XG4gICAgdmFyIG1lcmdlZFByZXNlcnZlID0gZmllbGRQcmVzZXJ2ZSAhPT0gdW5kZWZpbmVkID8gZmllbGRQcmVzZXJ2ZSA6IF90aGlzLnByZXNlcnZlO1xuICAgIHJldHVybiBtZXJnZWRQcmVzZXJ2ZSAhPT0gbnVsbCAmJiBtZXJnZWRQcmVzZXJ2ZSAhPT0gdm9pZCAwID8gbWVyZ2VkUHJlc2VydmUgOiB0cnVlO1xuICB9O1xuICB0aGlzLnJlZ2lzdGVyRmllbGQgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgX3RoaXMuZmllbGRFbnRpdGllcy5wdXNoKGVudGl0eSk7XG4gICAgdmFyIG5hbWVQYXRoID0gZW50aXR5LmdldE5hbWVQYXRoKCk7XG4gICAgX3RoaXMubm90aWZ5V2F0Y2goW25hbWVQYXRoXSk7XG4gICAgLy8gU2V0IGluaXRpYWwgdmFsdWVzXG4gICAgaWYgKGVudGl0eS5wcm9wcy5pbml0aWFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHByZXZTdG9yZSA9IF90aGlzLnN0b3JlO1xuICAgICAgX3RoaXMucmVzZXRXaXRoRmllbGRJbml0aWFsVmFsdWUoe1xuICAgICAgICBlbnRpdGllczogW2VudGl0eV0sXG4gICAgICAgIHNraXBFeGlzdDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBfdGhpcy5ub3RpZnlPYnNlcnZlcnMocHJldlN0b3JlLCBbZW50aXR5LmdldE5hbWVQYXRoKCldLCB7XG4gICAgICAgIHR5cGU6ICd2YWx1ZVVwZGF0ZScsXG4gICAgICAgIHNvdXJjZTogJ2ludGVybmFsJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIHVuLXJlZ2lzdGVyIGZpZWxkIGNhbGxiYWNrXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChpc0xpc3RGaWVsZCwgcHJlc2VydmUpIHtcbiAgICAgIHZhciBzdWJOYW1lUGF0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogW107XG4gICAgICBfdGhpcy5maWVsZEVudGl0aWVzID0gX3RoaXMuZmllbGRFbnRpdGllcy5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0gIT09IGVudGl0eTtcbiAgICAgIH0pO1xuICAgICAgLy8gQ2xlYW4gdXAgc3RvcmUgdmFsdWUgaWYgbm90IHByZXNlcnZlXG4gICAgICBpZiAoIV90aGlzLmlzTWVyZ2VkUHJlc2VydmUocHJlc2VydmUpICYmICghaXNMaXN0RmllbGQgfHwgc3ViTmFtZVBhdGgubGVuZ3RoID4gMSkpIHtcbiAgICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IGlzTGlzdEZpZWxkID8gdW5kZWZpbmVkIDogX3RoaXMuZ2V0SW5pdGlhbFZhbHVlKG5hbWVQYXRoKTtcbiAgICAgICAgaWYgKG5hbWVQYXRoLmxlbmd0aCAmJiBfdGhpcy5nZXRGaWVsZFZhbHVlKG5hbWVQYXRoKSAhPT0gZGVmYXVsdFZhbHVlICYmIF90aGlzLmZpZWxkRW50aXRpZXMuZXZlcnkoZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIC8vIE9ubHkgcmVzZXQgd2hlbiBubyBuYW1lUGF0aCBleGlzdFxuICAgICAgICAgICAgIW1hdGNoTmFtZVBhdGgoZmllbGQuZ2V0TmFtZVBhdGgoKSwgbmFtZVBhdGgpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICB2YXIgX3ByZXZTdG9yZSA9IF90aGlzLnN0b3JlO1xuICAgICAgICAgIF90aGlzLnVwZGF0ZVN0b3JlKHNldFZhbHVlKF9wcmV2U3RvcmUsIG5hbWVQYXRoLCBkZWZhdWx0VmFsdWUsIHRydWUpKTtcbiAgICAgICAgICAvLyBOb3RpZnkgdGhhdCBmaWVsZCBpcyB1bm1vdW50XG4gICAgICAgICAgX3RoaXMubm90aWZ5T2JzZXJ2ZXJzKF9wcmV2U3RvcmUsIFtuYW1lUGF0aF0sIHtcbiAgICAgICAgICAgIHR5cGU6ICdyZW1vdmUnXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gRGVwZW5kZW5jaWVzIHVwZGF0ZVxuICAgICAgICAgIF90aGlzLnRyaWdnZXJEZXBlbmRlbmNpZXNVcGRhdGUoX3ByZXZTdG9yZSwgbmFtZVBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfdGhpcy5ub3RpZnlXYXRjaChbbmFtZVBhdGhdKTtcbiAgICB9O1xuICB9O1xuICB0aGlzLmRpc3BhdGNoID0gZnVuY3Rpb24gKGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3VwZGF0ZVZhbHVlJzpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBuYW1lUGF0aCA9IGFjdGlvbi5uYW1lUGF0aCxcbiAgICAgICAgICAgIHZhbHVlID0gYWN0aW9uLnZhbHVlO1xuICAgICAgICAgIF90aGlzLnVwZGF0ZVZhbHVlKG5hbWVQYXRoLCB2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ3ZhbGlkYXRlRmllbGQnOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9uYW1lUGF0aCA9IGFjdGlvbi5uYW1lUGF0aCxcbiAgICAgICAgICAgIHRyaWdnZXJOYW1lID0gYWN0aW9uLnRyaWdnZXJOYW1lO1xuICAgICAgICAgIF90aGlzLnZhbGlkYXRlRmllbGRzKFtfbmFtZVBhdGhdLCB7XG4gICAgICAgICAgICB0cmlnZ2VyTmFtZTogdHJpZ2dlck5hbWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgIC8vIEN1cnJlbnRseSB3ZSBkb24ndCBoYXZlIG90aGVyIGFjdGlvbi4gRG8gbm90aGluZy5cbiAgICB9XG4gIH07XG4gIHRoaXMubm90aWZ5T2JzZXJ2ZXJzID0gZnVuY3Rpb24gKHByZXZTdG9yZSwgbmFtZVBhdGhMaXN0LCBpbmZvKSB7XG4gICAgaWYgKF90aGlzLnN1YnNjcmliYWJsZSkge1xuICAgICAgdmFyIG1lcmdlZEluZm8gPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGluZm8pLCB7fSwge1xuICAgICAgICBzdG9yZTogX3RoaXMuZ2V0RmllbGRzVmFsdWUodHJ1ZSlcbiAgICAgIH0pO1xuICAgICAgX3RoaXMuZ2V0RmllbGRFbnRpdGllcygpLmZvckVhY2goZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICAgIHZhciBvblN0b3JlQ2hhbmdlID0gX3JlZjMub25TdG9yZUNoYW5nZTtcbiAgICAgICAgb25TdG9yZUNoYW5nZShwcmV2U3RvcmUsIG5hbWVQYXRoTGlzdCwgbWVyZ2VkSW5mbyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMuZm9yY2VSb290VXBkYXRlKCk7XG4gICAgfVxuICB9O1xuICB0aGlzLnRyaWdnZXJEZXBlbmRlbmNpZXNVcGRhdGUgPSBmdW5jdGlvbiAocHJldlN0b3JlLCBuYW1lUGF0aCkge1xuICAgIHZhciBjaGlsZHJlbkZpZWxkcyA9IF90aGlzLmdldERlcGVuZGVuY3lDaGlsZHJlbkZpZWxkcyhuYW1lUGF0aCk7XG4gICAgaWYgKGNoaWxkcmVuRmllbGRzLmxlbmd0aCkge1xuICAgICAgX3RoaXMudmFsaWRhdGVGaWVsZHMoY2hpbGRyZW5GaWVsZHMpO1xuICAgIH1cbiAgICBfdGhpcy5ub3RpZnlPYnNlcnZlcnMocHJldlN0b3JlLCBjaGlsZHJlbkZpZWxkcywge1xuICAgICAgdHlwZTogJ2RlcGVuZGVuY2llc1VwZGF0ZScsXG4gICAgICByZWxhdGVkRmllbGRzOiBbbmFtZVBhdGhdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoY2hpbGRyZW5GaWVsZHMpKVxuICAgIH0pO1xuICAgIHJldHVybiBjaGlsZHJlbkZpZWxkcztcbiAgfTtcbiAgdGhpcy51cGRhdGVWYWx1ZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBuYW1lUGF0aCA9IGdldE5hbWVQYXRoKG5hbWUpO1xuICAgIHZhciBwcmV2U3RvcmUgPSBfdGhpcy5zdG9yZTtcbiAgICBfdGhpcy51cGRhdGVTdG9yZShzZXRWYWx1ZShfdGhpcy5zdG9yZSwgbmFtZVBhdGgsIHZhbHVlKSk7XG4gICAgX3RoaXMubm90aWZ5T2JzZXJ2ZXJzKHByZXZTdG9yZSwgW25hbWVQYXRoXSwge1xuICAgICAgdHlwZTogJ3ZhbHVlVXBkYXRlJyxcbiAgICAgIHNvdXJjZTogJ2ludGVybmFsJ1xuICAgIH0pO1xuICAgIF90aGlzLm5vdGlmeVdhdGNoKFtuYW1lUGF0aF0pO1xuICAgIC8vIERlcGVuZGVuY2llcyB1cGRhdGVcbiAgICB2YXIgY2hpbGRyZW5GaWVsZHMgPSBfdGhpcy50cmlnZ2VyRGVwZW5kZW5jaWVzVXBkYXRlKHByZXZTdG9yZSwgbmFtZVBhdGgpO1xuICAgIC8vIHRyaWdnZXIgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICB2YXIgb25WYWx1ZXNDaGFuZ2UgPSBfdGhpcy5jYWxsYmFja3Mub25WYWx1ZXNDaGFuZ2U7XG4gICAgaWYgKG9uVmFsdWVzQ2hhbmdlKSB7XG4gICAgICB2YXIgY2hhbmdlZFZhbHVlcyA9IGNsb25lQnlOYW1lUGF0aExpc3QoX3RoaXMuc3RvcmUsIFtuYW1lUGF0aF0pO1xuICAgICAgb25WYWx1ZXNDaGFuZ2UoY2hhbmdlZFZhbHVlcywgX3RoaXMuZ2V0RmllbGRzVmFsdWUoKSk7XG4gICAgfVxuICAgIF90aGlzLnRyaWdnZXJPbkZpZWxkc0NoYW5nZShbbmFtZVBhdGhdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoY2hpbGRyZW5GaWVsZHMpKSk7XG4gIH07XG4gIHRoaXMuc2V0RmllbGRzVmFsdWUgPSBmdW5jdGlvbiAoc3RvcmUpIHtcbiAgICBfdGhpcy53YXJuaW5nVW5ob29rZWQoKTtcbiAgICB2YXIgcHJldlN0b3JlID0gX3RoaXMuc3RvcmU7XG4gICAgaWYgKHN0b3JlKSB7XG4gICAgICB2YXIgbmV4dFN0b3JlID0gc2V0VmFsdWVzKF90aGlzLnN0b3JlLCBzdG9yZSk7XG4gICAgICBfdGhpcy51cGRhdGVTdG9yZShuZXh0U3RvcmUpO1xuICAgIH1cbiAgICBfdGhpcy5ub3RpZnlPYnNlcnZlcnMocHJldlN0b3JlLCBudWxsLCB7XG4gICAgICB0eXBlOiAndmFsdWVVcGRhdGUnLFxuICAgICAgc291cmNlOiAnZXh0ZXJuYWwnXG4gICAgfSk7XG4gICAgX3RoaXMubm90aWZ5V2F0Y2goKTtcbiAgfTtcbiAgdGhpcy5zZXRGaWVsZFZhbHVlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgX3RoaXMuc2V0RmllbGRzKFt7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfV0pO1xuICB9O1xuICB0aGlzLmdldERlcGVuZGVuY3lDaGlsZHJlbkZpZWxkcyA9IGZ1bmN0aW9uIChyb290TmFtZVBhdGgpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBuZXcgU2V0KCk7XG4gICAgdmFyIGNoaWxkcmVuRmllbGRzID0gW107XG4gICAgdmFyIGRlcGVuZGVuY2llczJmaWVsZHMgPSBuZXcgTmFtZU1hcCgpO1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIG1hcHNcbiAgICAgKiBDYW4gdXNlIGNhY2hlIHRvIHNhdmUgcGVyZiBpZiB1c2VyIHJlcG9ydCBwZXJmb3JtYW5jZSBpc3N1ZSB3aXRoIHRoaXNcbiAgICAgKi9cbiAgICBfdGhpcy5nZXRGaWVsZEVudGl0aWVzKCkuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgIHZhciBkZXBlbmRlbmNpZXMgPSBmaWVsZC5wcm9wcy5kZXBlbmRlbmNpZXM7XG4gICAgICAoZGVwZW5kZW5jaWVzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChkZXBlbmRlbmN5KSB7XG4gICAgICAgIHZhciBkZXBlbmRlbmN5TmFtZVBhdGggPSBnZXROYW1lUGF0aChkZXBlbmRlbmN5KTtcbiAgICAgICAgZGVwZW5kZW5jaWVzMmZpZWxkcy51cGRhdGUoZGVwZW5kZW5jeU5hbWVQYXRoLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGZpZWxkcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbmV3IFNldCgpO1xuICAgICAgICAgIGZpZWxkcy5hZGQoZmllbGQpO1xuICAgICAgICAgIHJldHVybiBmaWVsZHM7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdmFyIGZpbGxDaGlsZHJlbiA9IGZ1bmN0aW9uIGZpbGxDaGlsZHJlbihuYW1lUGF0aCkge1xuICAgICAgdmFyIGZpZWxkcyA9IGRlcGVuZGVuY2llczJmaWVsZHMuZ2V0KG5hbWVQYXRoKSB8fCBuZXcgU2V0KCk7XG4gICAgICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgaWYgKCFjaGlsZHJlbi5oYXMoZmllbGQpKSB7XG4gICAgICAgICAgY2hpbGRyZW4uYWRkKGZpZWxkKTtcbiAgICAgICAgICB2YXIgZmllbGROYW1lUGF0aCA9IGZpZWxkLmdldE5hbWVQYXRoKCk7XG4gICAgICAgICAgaWYgKGZpZWxkLmlzRmllbGREaXJ0eSgpICYmIGZpZWxkTmFtZVBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICBjaGlsZHJlbkZpZWxkcy5wdXNoKGZpZWxkTmFtZVBhdGgpO1xuICAgICAgICAgICAgZmlsbENoaWxkcmVuKGZpZWxkTmFtZVBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgICBmaWxsQ2hpbGRyZW4ocm9vdE5hbWVQYXRoKTtcbiAgICByZXR1cm4gY2hpbGRyZW5GaWVsZHM7XG4gIH07XG4gIHRoaXMudHJpZ2dlck9uRmllbGRzQ2hhbmdlID0gZnVuY3Rpb24gKG5hbWVQYXRoTGlzdCwgZmlsZWRFcnJvcnMpIHtcbiAgICB2YXIgb25GaWVsZHNDaGFuZ2UgPSBfdGhpcy5jYWxsYmFja3Mub25GaWVsZHNDaGFuZ2U7XG4gICAgaWYgKG9uRmllbGRzQ2hhbmdlKSB7XG4gICAgICB2YXIgZmllbGRzID0gX3RoaXMuZ2V0RmllbGRzKCk7XG4gICAgICAvKipcbiAgICAgICAqIEZpbGwgZXJyb3JzIHNpbmNlIGBmaWVsZHNgIG1heSBiZSByZXBsYWNlZCBieSBjb250cm9sbGVkIGZpZWxkc1xuICAgICAgICovXG4gICAgICBpZiAoZmlsZWRFcnJvcnMpIHtcbiAgICAgICAgdmFyIGNhY2hlID0gbmV3IE5hbWVNYXAoKTtcbiAgICAgICAgZmlsZWRFcnJvcnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjQpIHtcbiAgICAgICAgICB2YXIgbmFtZSA9IF9yZWY0Lm5hbWUsXG4gICAgICAgICAgICBlcnJvcnMgPSBfcmVmNC5lcnJvcnM7XG4gICAgICAgICAgY2FjaGUuc2V0KG5hbWUsIGVycm9ycyk7XG4gICAgICAgIH0pO1xuICAgICAgICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICBmaWVsZC5lcnJvcnMgPSBjYWNoZS5nZXQoZmllbGQubmFtZSkgfHwgZmllbGQuZXJyb3JzO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHZhciBjaGFuZ2VkRmllbGRzID0gZmllbGRzLmZpbHRlcihmdW5jdGlvbiAoX3JlZjUpIHtcbiAgICAgICAgdmFyIGZpZWxkTmFtZSA9IF9yZWY1Lm5hbWU7XG4gICAgICAgIHJldHVybiBjb250YWluc05hbWVQYXRoKG5hbWVQYXRoTGlzdCwgZmllbGROYW1lKTtcbiAgICAgIH0pO1xuICAgICAgb25GaWVsZHNDaGFuZ2UoY2hhbmdlZEZpZWxkcywgZmllbGRzKTtcbiAgICB9XG4gIH07XG4gIHRoaXMudmFsaWRhdGVGaWVsZHMgPSBmdW5jdGlvbiAobmFtZUxpc3QsIG9wdGlvbnMpIHtcbiAgICBfdGhpcy53YXJuaW5nVW5ob29rZWQoKTtcbiAgICB2YXIgcHJvdmlkZU5hbWVMaXN0ID0gISFuYW1lTGlzdDtcbiAgICB2YXIgbmFtZVBhdGhMaXN0ID0gcHJvdmlkZU5hbWVMaXN0ID8gbmFtZUxpc3QubWFwKGdldE5hbWVQYXRoKSA6IFtdO1xuICAgIC8vIENvbGxlY3QgcmVzdWx0IGluIHByb21pc2UgbGlzdFxuICAgIHZhciBwcm9taXNlTGlzdCA9IFtdO1xuICAgIF90aGlzLmdldEZpZWxkRW50aXRpZXModHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgIC8vIEFkZCBmaWVsZCBpZiBub3QgcHJvdmlkZSBgbmFtZUxpc3RgXG4gICAgICBpZiAoIXByb3ZpZGVOYW1lTGlzdCkge1xuICAgICAgICBuYW1lUGF0aExpc3QucHVzaChmaWVsZC5nZXROYW1lUGF0aCgpKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogUmVjdXJzaXZlIHZhbGlkYXRlIGlmIGNvbmZpZ3VyZWQuXG4gICAgICAgKiBUT0RPOiBwZXJmIGltcHJvdmVtZW50IEB6b21iaWVKXG4gICAgICAgKi9cbiAgICAgIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnJlY3Vyc2l2ZSkgJiYgcHJvdmlkZU5hbWVMaXN0KSB7XG4gICAgICAgIHZhciBuYW1lUGF0aCA9IGZpZWxkLmdldE5hbWVQYXRoKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgLy8gbmFtZUxpc3RbaV0gPT09IHVuZGVmaW5lZCDor7TmmI7mmK/ku6UgbmFtZUxpc3Qg5byA5aS055qEXG4gICAgICAgIC8vIFsnbmFtZSddIC0+IFsnbmFtZScsJ2xpc3QnXVxuICAgICAgICBuYW1lUGF0aC5ldmVyeShmdW5jdGlvbiAobmFtZVVuaXQsIGkpIHtcbiAgICAgICAgICByZXR1cm4gbmFtZUxpc3RbaV0gPT09IG5hbWVVbml0IHx8IG5hbWVMaXN0W2ldID09PSB1bmRlZmluZWQ7XG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgbmFtZVBhdGhMaXN0LnB1c2gobmFtZVBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTa2lwIGlmIHdpdGhvdXQgcnVsZVxuICAgICAgaWYgKCFmaWVsZC5wcm9wcy5ydWxlcyB8fCAhZmllbGQucHJvcHMucnVsZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBmaWVsZE5hbWVQYXRoID0gZmllbGQuZ2V0TmFtZVBhdGgoKTtcbiAgICAgIC8vIEFkZCBmaWVsZCB2YWxpZGF0ZSBydWxlIGluIHRvIHByb21pc2UgbGlzdFxuICAgICAgaWYgKCFwcm92aWRlTmFtZUxpc3QgfHwgY29udGFpbnNOYW1lUGF0aChuYW1lUGF0aExpc3QsIGZpZWxkTmFtZVBhdGgpKSB7XG4gICAgICAgIHZhciBwcm9taXNlID0gZmllbGQudmFsaWRhdGVSdWxlcyhfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICB2YWxpZGF0ZU1lc3NhZ2VzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRlZmF1bHRWYWxpZGF0ZU1lc3NhZ2VzKSwgX3RoaXMudmFsaWRhdGVNZXNzYWdlcylcbiAgICAgICAgfSwgb3B0aW9ucykpO1xuICAgICAgICAvLyBXcmFwIHByb21pc2Ugd2l0aCBmaWVsZFxuICAgICAgICBwcm9taXNlTGlzdC5wdXNoKHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGZpZWxkTmFtZVBhdGgsXG4gICAgICAgICAgICBlcnJvcnM6IFtdLFxuICAgICAgICAgICAgd2FybmluZ3M6IFtdXG4gICAgICAgICAgfTtcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJ1bGVFcnJvcnMpIHtcbiAgICAgICAgICB2YXIgX3J1bGVFcnJvcnMkZm9yRWFjaDtcbiAgICAgICAgICB2YXIgbWVyZ2VkRXJyb3JzID0gW107XG4gICAgICAgICAgdmFyIG1lcmdlZFdhcm5pbmdzID0gW107XG4gICAgICAgICAgKF9ydWxlRXJyb3JzJGZvckVhY2ggPSBydWxlRXJyb3JzLmZvckVhY2gpID09PSBudWxsIHx8IF9ydWxlRXJyb3JzJGZvckVhY2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ydWxlRXJyb3JzJGZvckVhY2guY2FsbChydWxlRXJyb3JzLCBmdW5jdGlvbiAoX3JlZjYpIHtcbiAgICAgICAgICAgIHZhciB3YXJuaW5nT25seSA9IF9yZWY2LnJ1bGUud2FybmluZ09ubHksXG4gICAgICAgICAgICAgIGVycm9ycyA9IF9yZWY2LmVycm9ycztcbiAgICAgICAgICAgIGlmICh3YXJuaW5nT25seSkge1xuICAgICAgICAgICAgICBtZXJnZWRXYXJuaW5ncy5wdXNoLmFwcGx5KG1lcmdlZFdhcm5pbmdzLCBfdG9Db25zdW1hYmxlQXJyYXkoZXJyb3JzKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtZXJnZWRFcnJvcnMucHVzaC5hcHBseShtZXJnZWRFcnJvcnMsIF90b0NvbnN1bWFibGVBcnJheShlcnJvcnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAobWVyZ2VkRXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHtcbiAgICAgICAgICAgICAgbmFtZTogZmllbGROYW1lUGF0aCxcbiAgICAgICAgICAgICAgZXJyb3JzOiBtZXJnZWRFcnJvcnMsXG4gICAgICAgICAgICAgIHdhcm5pbmdzOiBtZXJnZWRXYXJuaW5nc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBmaWVsZE5hbWVQYXRoLFxuICAgICAgICAgICAgZXJyb3JzOiBtZXJnZWRFcnJvcnMsXG4gICAgICAgICAgICB3YXJuaW5nczogbWVyZ2VkV2FybmluZ3NcbiAgICAgICAgICB9O1xuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdmFyIHN1bW1hcnlQcm9taXNlID0gYWxsUHJvbWlzZUZpbmlzaChwcm9taXNlTGlzdCk7XG4gICAgX3RoaXMubGFzdFZhbGlkYXRlUHJvbWlzZSA9IHN1bW1hcnlQcm9taXNlO1xuICAgIC8vIE5vdGlmeSBmaWVsZHMgd2l0aCBydWxlIHRoYXQgdmFsaWRhdGUgaGFzIGZpbmlzaGVkIGFuZCBuZWVkIHVwZGF0ZVxuICAgIHN1bW1hcnlQcm9taXNlLmNhdGNoKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICB2YXIgcmVzdWx0TmFtZVBhdGhMaXN0ID0gcmVzdWx0cy5tYXAoZnVuY3Rpb24gKF9yZWY3KSB7XG4gICAgICAgIHZhciBuYW1lID0gX3JlZjcubmFtZTtcbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICB9KTtcbiAgICAgIF90aGlzLm5vdGlmeU9ic2VydmVycyhfdGhpcy5zdG9yZSwgcmVzdWx0TmFtZVBhdGhMaXN0LCB7XG4gICAgICAgIHR5cGU6ICd2YWxpZGF0ZUZpbmlzaCdcbiAgICAgIH0pO1xuICAgICAgX3RoaXMudHJpZ2dlck9uRmllbGRzQ2hhbmdlKHJlc3VsdE5hbWVQYXRoTGlzdCwgcmVzdWx0cyk7XG4gICAgfSk7XG4gICAgdmFyIHJldHVyblByb21pc2UgPSBzdW1tYXJ5UHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5sYXN0VmFsaWRhdGVQcm9taXNlID09PSBzdW1tYXJ5UHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKF90aGlzLmdldEZpZWxkc1ZhbHVlKG5hbWVQYXRoTGlzdCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFtdKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVzdWx0cykge1xuICAgICAgdmFyIGVycm9yTGlzdCA9IHJlc3VsdHMuZmlsdGVyKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZXJyb3JzLmxlbmd0aDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHtcbiAgICAgICAgdmFsdWVzOiBfdGhpcy5nZXRGaWVsZHNWYWx1ZShuYW1lUGF0aExpc3QpLFxuICAgICAgICBlcnJvckZpZWxkczogZXJyb3JMaXN0LFxuICAgICAgICBvdXRPZkRhdGU6IF90aGlzLmxhc3RWYWxpZGF0ZVByb21pc2UgIT09IHN1bW1hcnlQcm9taXNlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAvLyBEbyBub3QgdGhyb3cgaW4gY29uc29sZVxuICAgIHJldHVyblByb21pc2UuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBlO1xuICAgIH0pO1xuICAgIHJldHVybiByZXR1cm5Qcm9taXNlO1xuICB9O1xuICB0aGlzLnN1Ym1pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpcy53YXJuaW5nVW5ob29rZWQoKTtcbiAgICBfdGhpcy52YWxpZGF0ZUZpZWxkcygpLnRoZW4oZnVuY3Rpb24gKHZhbHVlcykge1xuICAgICAgdmFyIG9uRmluaXNoID0gX3RoaXMuY2FsbGJhY2tzLm9uRmluaXNoO1xuICAgICAgaWYgKG9uRmluaXNoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgb25GaW5pc2godmFsdWVzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gU2hvdWxkIHByaW50IGVycm9yIGlmIHVzZXIgYG9uRmluaXNoYCBjYWxsYmFjayBmYWlsZWRcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uRmluaXNoRmFpbGVkID0gX3RoaXMuY2FsbGJhY2tzLm9uRmluaXNoRmFpbGVkO1xuICAgICAgaWYgKG9uRmluaXNoRmFpbGVkKSB7XG4gICAgICAgIG9uRmluaXNoRmFpbGVkKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICB0aGlzLmZvcmNlUm9vdFVwZGF0ZSA9IGZvcmNlUm9vdFVwZGF0ZTtcbn0pO1xuZnVuY3Rpb24gdXNlRm9ybShmb3JtKSB7XG4gIHZhciBmb3JtUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSh7fSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgZm9yY2VVcGRhdGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICBpZiAoIWZvcm1SZWYuY3VycmVudCkge1xuICAgIGlmIChmb3JtKSB7XG4gICAgICBmb3JtUmVmLmN1cnJlbnQgPSBmb3JtO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgRm9ybVN0b3JlIGlmIG5vdCBwcm92aWRlZFxuICAgICAgdmFyIGZvcmNlUmVSZW5kZXIgPSBmdW5jdGlvbiBmb3JjZVJlUmVuZGVyKCkge1xuICAgICAgICBmb3JjZVVwZGF0ZSh7fSk7XG4gICAgICB9O1xuICAgICAgdmFyIGZvcm1TdG9yZSA9IG5ldyBGb3JtU3RvcmUoZm9yY2VSZVJlbmRlcik7XG4gICAgICBmb3JtUmVmLmN1cnJlbnQgPSBmb3JtU3RvcmUuZ2V0Rm9ybSgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2Zvcm1SZWYuY3VycmVudF07XG59XG5leHBvcnQgZGVmYXVsdCB1c2VGb3JtOyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIEZvcm1Db250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICB0cmlnZ2VyRm9ybUNoYW5nZTogZnVuY3Rpb24gdHJpZ2dlckZvcm1DaGFuZ2UoKSB7fSxcbiAgdHJpZ2dlckZvcm1GaW5pc2g6IGZ1bmN0aW9uIHRyaWdnZXJGb3JtRmluaXNoKCkge30sXG4gIHJlZ2lzdGVyRm9ybTogZnVuY3Rpb24gcmVnaXN0ZXJGb3JtKCkge30sXG4gIHVucmVnaXN0ZXJGb3JtOiBmdW5jdGlvbiB1bnJlZ2lzdGVyRm9ybSgpIHt9XG59KTtcbnZhciBGb3JtUHJvdmlkZXIgPSBmdW5jdGlvbiBGb3JtUHJvdmlkZXIoX3JlZikge1xuICB2YXIgdmFsaWRhdGVNZXNzYWdlcyA9IF9yZWYudmFsaWRhdGVNZXNzYWdlcyxcbiAgICBvbkZvcm1DaGFuZ2UgPSBfcmVmLm9uRm9ybUNoYW5nZSxcbiAgICBvbkZvcm1GaW5pc2ggPSBfcmVmLm9uRm9ybUZpbmlzaCxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gIHZhciBmb3JtQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRm9ybUNvbnRleHQpO1xuICB2YXIgZm9ybXNSZWYgPSBSZWFjdC51c2VSZWYoe30pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9ybUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmb3JtQ29udGV4dCksIHt9LCB7XG4gICAgICB2YWxpZGF0ZU1lc3NhZ2VzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGZvcm1Db250ZXh0LnZhbGlkYXRlTWVzc2FnZXMpLCB2YWxpZGF0ZU1lc3NhZ2VzKSxcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gPSAgICAgICAgICAgICAgICAgIEdsb2JhbCBGb3JtIENvbnRyb2wgICAgICAgICAgICAgICAgICA9XG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIHRyaWdnZXJGb3JtQ2hhbmdlOiBmdW5jdGlvbiB0cmlnZ2VyRm9ybUNoYW5nZShuYW1lLCBjaGFuZ2VkRmllbGRzKSB7XG4gICAgICAgIGlmIChvbkZvcm1DaGFuZ2UpIHtcbiAgICAgICAgICBvbkZvcm1DaGFuZ2UobmFtZSwge1xuICAgICAgICAgICAgY2hhbmdlZEZpZWxkczogY2hhbmdlZEZpZWxkcyxcbiAgICAgICAgICAgIGZvcm1zOiBmb3Jtc1JlZi5jdXJyZW50XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9ybUNvbnRleHQudHJpZ2dlckZvcm1DaGFuZ2UobmFtZSwgY2hhbmdlZEZpZWxkcyk7XG4gICAgICB9LFxuICAgICAgdHJpZ2dlckZvcm1GaW5pc2g6IGZ1bmN0aW9uIHRyaWdnZXJGb3JtRmluaXNoKG5hbWUsIHZhbHVlcykge1xuICAgICAgICBpZiAob25Gb3JtRmluaXNoKSB7XG4gICAgICAgICAgb25Gb3JtRmluaXNoKG5hbWUsIHtcbiAgICAgICAgICAgIHZhbHVlczogdmFsdWVzLFxuICAgICAgICAgICAgZm9ybXM6IGZvcm1zUmVmLmN1cnJlbnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3JtQ29udGV4dC50cmlnZ2VyRm9ybUZpbmlzaChuYW1lLCB2YWx1ZXMpO1xuICAgICAgfSxcbiAgICAgIHJlZ2lzdGVyRm9ybTogZnVuY3Rpb24gcmVnaXN0ZXJGb3JtKG5hbWUsIGZvcm0pIHtcbiAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICBmb3Jtc1JlZi5jdXJyZW50ID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmb3Jtc1JlZi5jdXJyZW50KSwge30sIF9kZWZpbmVQcm9wZXJ0eSh7fSwgbmFtZSwgZm9ybSkpO1xuICAgICAgICB9XG4gICAgICAgIGZvcm1Db250ZXh0LnJlZ2lzdGVyRm9ybShuYW1lLCBmb3JtKTtcbiAgICAgIH0sXG4gICAgICB1bnJlZ2lzdGVyRm9ybTogZnVuY3Rpb24gdW5yZWdpc3RlckZvcm0obmFtZSkge1xuICAgICAgICB2YXIgbmV3Rm9ybXMgPSBfb2JqZWN0U3ByZWFkKHt9LCBmb3Jtc1JlZi5jdXJyZW50KTtcbiAgICAgICAgZGVsZXRlIG5ld0Zvcm1zW25hbWVdO1xuICAgICAgICBmb3Jtc1JlZi5jdXJyZW50ID0gbmV3Rm9ybXM7XG4gICAgICAgIGZvcm1Db250ZXh0LnVucmVnaXN0ZXJGb3JtKG5hbWUpO1xuICAgICAgfVxuICAgIH0pXG4gIH0sIGNoaWxkcmVuKTtcbn07XG5leHBvcnQgeyBGb3JtUHJvdmlkZXIgfTtcbmV4cG9ydCBkZWZhdWx0IEZvcm1Db250ZXh0OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJuYW1lXCIsIFwiaW5pdGlhbFZhbHVlc1wiLCBcImZpZWxkc1wiLCBcImZvcm1cIiwgXCJwcmVzZXJ2ZVwiLCBcImNoaWxkcmVuXCIsIFwiY29tcG9uZW50XCIsIFwidmFsaWRhdGVNZXNzYWdlc1wiLCBcInZhbGlkYXRlVHJpZ2dlclwiLCBcIm9uVmFsdWVzQ2hhbmdlXCIsIFwib25GaWVsZHNDaGFuZ2VcIiwgXCJvbkZpbmlzaFwiLCBcIm9uRmluaXNoRmFpbGVkXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUZvcm0gZnJvbSAnLi91c2VGb3JtJztcbmltcG9ydCBGaWVsZENvbnRleHQsIHsgSE9PS19NQVJLIH0gZnJvbSAnLi9GaWVsZENvbnRleHQnO1xuaW1wb3J0IEZvcm1Db250ZXh0IGZyb20gJy4vRm9ybUNvbnRleHQnO1xuaW1wb3J0IHsgaXNTaW1pbGFyIH0gZnJvbSAnLi91dGlscy92YWx1ZVV0aWwnO1xudmFyIEZvcm0gPSBmdW5jdGlvbiBGb3JtKF9yZWYsIHJlZikge1xuICB2YXIgbmFtZSA9IF9yZWYubmFtZSxcbiAgICBpbml0aWFsVmFsdWVzID0gX3JlZi5pbml0aWFsVmFsdWVzLFxuICAgIGZpZWxkcyA9IF9yZWYuZmllbGRzLFxuICAgIGZvcm0gPSBfcmVmLmZvcm0sXG4gICAgcHJlc2VydmUgPSBfcmVmLnByZXNlcnZlLFxuICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBfcmVmJGNvbXBvbmVudCA9IF9yZWYuY29tcG9uZW50LFxuICAgIENvbXBvbmVudCA9IF9yZWYkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnZm9ybScgOiBfcmVmJGNvbXBvbmVudCxcbiAgICB2YWxpZGF0ZU1lc3NhZ2VzID0gX3JlZi52YWxpZGF0ZU1lc3NhZ2VzLFxuICAgIF9yZWYkdmFsaWRhdGVUcmlnZ2VyID0gX3JlZi52YWxpZGF0ZVRyaWdnZXIsXG4gICAgdmFsaWRhdGVUcmlnZ2VyID0gX3JlZiR2YWxpZGF0ZVRyaWdnZXIgPT09IHZvaWQgMCA/ICdvbkNoYW5nZScgOiBfcmVmJHZhbGlkYXRlVHJpZ2dlcixcbiAgICBvblZhbHVlc0NoYW5nZSA9IF9yZWYub25WYWx1ZXNDaGFuZ2UsXG4gICAgX29uRmllbGRzQ2hhbmdlID0gX3JlZi5vbkZpZWxkc0NoYW5nZSxcbiAgICBfb25GaW5pc2ggPSBfcmVmLm9uRmluaXNoLFxuICAgIG9uRmluaXNoRmFpbGVkID0gX3JlZi5vbkZpbmlzaEZhaWxlZCxcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgdmFyIGZvcm1Db250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChGb3JtQ29udGV4dCk7XG4gIC8vIFdlIGN1c3RvbWl6ZSBoYW5kbGUgZXZlbnQgc2luY2UgQ29udGV4dCB3aWxsIG1ha2VzIGFsbCB0aGUgY29uc3VtZXIgcmUtcmVuZGVyOlxuICAvLyBodHRwczovL3JlYWN0anMub3JnL2RvY3MvY29udGV4dC5odG1sI2NvbnRleHRwcm92aWRlclxuICB2YXIgX3VzZUZvcm0gPSB1c2VGb3JtKGZvcm0pLFxuICAgIF91c2VGb3JtMiA9IF9zbGljZWRUb0FycmF5KF91c2VGb3JtLCAxKSxcbiAgICBmb3JtSW5zdGFuY2UgPSBfdXNlRm9ybTJbMF07XG4gIHZhciBfZm9ybUluc3RhbmNlJGdldEludGUgPSBmb3JtSW5zdGFuY2UuZ2V0SW50ZXJuYWxIb29rcyhIT09LX01BUkspLFxuICAgIHVzZVN1YnNjcmliZSA9IF9mb3JtSW5zdGFuY2UkZ2V0SW50ZS51c2VTdWJzY3JpYmUsXG4gICAgc2V0SW5pdGlhbFZhbHVlcyA9IF9mb3JtSW5zdGFuY2UkZ2V0SW50ZS5zZXRJbml0aWFsVmFsdWVzLFxuICAgIHNldENhbGxiYWNrcyA9IF9mb3JtSW5zdGFuY2UkZ2V0SW50ZS5zZXRDYWxsYmFja3MsXG4gICAgc2V0VmFsaWRhdGVNZXNzYWdlcyA9IF9mb3JtSW5zdGFuY2UkZ2V0SW50ZS5zZXRWYWxpZGF0ZU1lc3NhZ2VzLFxuICAgIHNldFByZXNlcnZlID0gX2Zvcm1JbnN0YW5jZSRnZXRJbnRlLnNldFByZXNlcnZlLFxuICAgIGRlc3Ryb3lGb3JtID0gX2Zvcm1JbnN0YW5jZSRnZXRJbnRlLmRlc3Ryb3lGb3JtO1xuICAvLyBQYXNzIHJlZiB3aXRoIGZvcm0gaW5zdGFuY2VcbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZm9ybUluc3RhbmNlO1xuICB9KTtcbiAgLy8gUmVnaXN0ZXIgZm9ybSBpbnRvIENvbnRleHRcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBmb3JtQ29udGV4dC5yZWdpc3RlckZvcm0obmFtZSwgZm9ybUluc3RhbmNlKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZm9ybUNvbnRleHQudW5yZWdpc3RlckZvcm0obmFtZSk7XG4gICAgfTtcbiAgfSwgW2Zvcm1Db250ZXh0LCBmb3JtSW5zdGFuY2UsIG5hbWVdKTtcbiAgLy8gUGFzcyBwcm9wcyB0byBzdG9yZVxuICBzZXRWYWxpZGF0ZU1lc3NhZ2VzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZm9ybUNvbnRleHQudmFsaWRhdGVNZXNzYWdlcyksIHZhbGlkYXRlTWVzc2FnZXMpKTtcbiAgc2V0Q2FsbGJhY2tzKHtcbiAgICBvblZhbHVlc0NoYW5nZTogb25WYWx1ZXNDaGFuZ2UsXG4gICAgb25GaWVsZHNDaGFuZ2U6IGZ1bmN0aW9uIG9uRmllbGRzQ2hhbmdlKGNoYW5nZWRGaWVsZHMpIHtcbiAgICAgIGZvcm1Db250ZXh0LnRyaWdnZXJGb3JtQ2hhbmdlKG5hbWUsIGNoYW5nZWRGaWVsZHMpO1xuICAgICAgaWYgKF9vbkZpZWxkc0NoYW5nZSkge1xuICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcmVzdCA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgcmVzdFtfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgIH1cbiAgICAgICAgX29uRmllbGRzQ2hhbmdlLmFwcGx5KHZvaWQgMCwgW2NoYW5nZWRGaWVsZHNdLmNvbmNhdChyZXN0KSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkZpbmlzaDogZnVuY3Rpb24gb25GaW5pc2godmFsdWVzKSB7XG4gICAgICBmb3JtQ29udGV4dC50cmlnZ2VyRm9ybUZpbmlzaChuYW1lLCB2YWx1ZXMpO1xuICAgICAgaWYgKF9vbkZpbmlzaCkge1xuICAgICAgICBfb25GaW5pc2godmFsdWVzKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uRmluaXNoRmFpbGVkOiBvbkZpbmlzaEZhaWxlZFxuICB9KTtcbiAgc2V0UHJlc2VydmUocHJlc2VydmUpO1xuICAvLyBTZXQgaW5pdGlhbCB2YWx1ZSwgaW5pdCBzdG9yZSB2YWx1ZSB3aGVuIGZpcnN0IG1vdW50XG4gIHZhciBtb3VudFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgc2V0SW5pdGlhbFZhbHVlcyhpbml0aWFsVmFsdWVzLCAhbW91bnRSZWYuY3VycmVudCk7XG4gIGlmICghbW91bnRSZWYuY3VycmVudCkge1xuICAgIG1vdW50UmVmLmN1cnJlbnQgPSB0cnVlO1xuICB9XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGRlc3Ryb3lGb3JtO1xuICB9LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIFtdKTtcbiAgLy8gUHJlcGFyZSBjaGlsZHJlbiBieSBgY2hpbGRyZW5gIHR5cGVcbiAgdmFyIGNoaWxkcmVuTm9kZTtcbiAgdmFyIGNoaWxkcmVuUmVuZGVyUHJvcHMgPSB0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbic7XG4gIGlmIChjaGlsZHJlblJlbmRlclByb3BzKSB7XG4gICAgdmFyIHZhbHVlcyA9IGZvcm1JbnN0YW5jZS5nZXRGaWVsZHNWYWx1ZSh0cnVlKTtcbiAgICBjaGlsZHJlbk5vZGUgPSBjaGlsZHJlbih2YWx1ZXMsIGZvcm1JbnN0YW5jZSk7XG4gIH0gZWxzZSB7XG4gICAgY2hpbGRyZW5Ob2RlID0gY2hpbGRyZW47XG4gIH1cbiAgLy8gTm90IHVzZSBzdWJzY3JpYmUgd2hlbiB1c2luZyByZW5kZXIgcHJvcHNcbiAgdXNlU3Vic2NyaWJlKCFjaGlsZHJlblJlbmRlclByb3BzKTtcbiAgLy8gTGlzdGVuIGlmIGZpZWxkcyBwcm92aWRlZC4gV2UgdXNlIHJlZiB0byBzYXZlIHByZXYgZGF0YSBoZXJlIHRvIGF2b2lkIGFkZGl0aW9uYWwgcmVuZGVyXG4gIHZhciBwcmV2RmllbGRzUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFpc1NpbWlsYXIocHJldkZpZWxkc1JlZi5jdXJyZW50IHx8IFtdLCBmaWVsZHMgfHwgW10pKSB7XG4gICAgICBmb3JtSW5zdGFuY2Uuc2V0RmllbGRzKGZpZWxkcyB8fCBbXSk7XG4gICAgfVxuICAgIHByZXZGaWVsZHNSZWYuY3VycmVudCA9IGZpZWxkcztcbiAgfSwgW2ZpZWxkcywgZm9ybUluc3RhbmNlXSk7XG4gIHZhciBmb3JtQ29udGV4dFZhbHVlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZm9ybUluc3RhbmNlKSwge30sIHtcbiAgICAgIHZhbGlkYXRlVHJpZ2dlcjogdmFsaWRhdGVUcmlnZ2VyXG4gICAgfSk7XG4gIH0sIFtmb3JtSW5zdGFuY2UsIHZhbGlkYXRlVHJpZ2dlcl0pO1xuICB2YXIgd3JhcHBlck5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGaWVsZENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogZm9ybUNvbnRleHRWYWx1ZVxuICB9LCBjaGlsZHJlbk5vZGUpO1xuICBpZiAoQ29tcG9uZW50ID09PSBmYWxzZSkge1xuICAgIHJldHVybiB3cmFwcGVyTm9kZTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBfZXh0ZW5kcyh7fSwgcmVzdFByb3BzLCB7XG4gICAgb25TdWJtaXQ6IGZ1bmN0aW9uIG9uU3VibWl0KGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBmb3JtSW5zdGFuY2Uuc3VibWl0KCk7XG4gICAgfSxcbiAgICBvblJlc2V0OiBmdW5jdGlvbiBvblJlc2V0KGV2ZW50KSB7XG4gICAgICB2YXIgX3Jlc3RQcm9wcyRvblJlc2V0O1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGZvcm1JbnN0YW5jZS5yZXNldEZpZWxkcygpO1xuICAgICAgKF9yZXN0UHJvcHMkb25SZXNldCA9IHJlc3RQcm9wcy5vblJlc2V0KSA9PT0gbnVsbCB8fCBfcmVzdFByb3BzJG9uUmVzZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9yZXN0UHJvcHMkb25SZXNldC5jYWxsKHJlc3RQcm9wcywgZXZlbnQpO1xuICAgIH1cbiAgfSksIHdyYXBwZXJOb2RlKTtcbn07XG5leHBvcnQgZGVmYXVsdCBGb3JtOyIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IHsgRmllbGRDb250ZXh0IH0gZnJvbSAnLic7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgeyBIT09LX01BUksgfSBmcm9tICcuL0ZpZWxkQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXROYW1lUGF0aCwgZ2V0VmFsdWUgfSBmcm9tICcuL3V0aWxzL3ZhbHVlVXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5KHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIE1hdGgucmFuZG9tKCk7XG4gIH1cbn1cbnZhciB1c2VXYXRjaFdhcm5pbmcgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gZnVuY3Rpb24gKG5hbWVQYXRoKSB7XG4gIHZhciBmdWxseVN0ciA9IG5hbWVQYXRoLmpvaW4oJ19fUkNfRklFTERfRk9STV9TUExJVF9fJyk7XG4gIHZhciBuYW1lU3RyUmVmID0gdXNlUmVmKGZ1bGx5U3RyKTtcbiAgd2FybmluZyhuYW1lU3RyUmVmLmN1cnJlbnQgPT09IGZ1bGx5U3RyLCAnYHVzZVdhdGNoYCBpcyBub3Qgc3VwcG9ydCBkeW5hbWljIGBuYW1lUGF0aGAuIFBsZWFzZSBwcm92aWRlIHN0YXRpYyBpbnN0ZWFkLicpO1xufSA6IGZ1bmN0aW9uICgpIHt9O1xuZnVuY3Rpb24gdXNlV2F0Y2goKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cbiAgdmFyIF9hcmdzJCA9IGFyZ3NbMF0sXG4gICAgZGVwZW5kZW5jaWVzID0gX2FyZ3MkID09PSB2b2lkIDAgPyBbXSA6IF9hcmdzJCxcbiAgICBmb3JtID0gYXJnc1sxXTtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKCksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgdmFsdWUgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldFZhbHVlID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIHZhbHVlU3RyID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHN0cmluZ2lmeSh2YWx1ZSk7XG4gIH0sIFt2YWx1ZV0pO1xuICB2YXIgdmFsdWVTdHJSZWYgPSB1c2VSZWYodmFsdWVTdHIpO1xuICB2YWx1ZVN0clJlZi5jdXJyZW50ID0gdmFsdWVTdHI7XG4gIHZhciBmaWVsZENvbnRleHQgPSB1c2VDb250ZXh0KEZpZWxkQ29udGV4dCk7XG4gIHZhciBmb3JtSW5zdGFuY2UgPSBmb3JtIHx8IGZpZWxkQ29udGV4dDtcbiAgdmFyIGlzVmFsaWRGb3JtID0gZm9ybUluc3RhbmNlICYmIGZvcm1JbnN0YW5jZS5faW5pdDtcbiAgLy8gV2FybmluZyBpZiBub3QgZXhpc3QgZm9ybSBpbnN0YW5jZVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHdhcm5pbmcoYXJncy5sZW5ndGggPT09IDIgPyBmb3JtID8gaXNWYWxpZEZvcm0gOiB0cnVlIDogaXNWYWxpZEZvcm0sICd1c2VXYXRjaCByZXF1aXJlcyBhIGZvcm0gaW5zdGFuY2Ugc2luY2UgaXQgY2FuIG5vdCBhdXRvIGRldGVjdCBmcm9tIGNvbnRleHQuJyk7XG4gIH1cbiAgdmFyIG5hbWVQYXRoID0gZ2V0TmFtZVBhdGgoZGVwZW5kZW5jaWVzKTtcbiAgdmFyIG5hbWVQYXRoUmVmID0gdXNlUmVmKG5hbWVQYXRoKTtcbiAgbmFtZVBhdGhSZWYuY3VycmVudCA9IG5hbWVQYXRoO1xuICB1c2VXYXRjaFdhcm5pbmcobmFtZVBhdGgpO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIC8vIFNraXAgaWYgbm90IGV4aXN0IGZvcm0gaW5zdGFuY2VcbiAgICBpZiAoIWlzVmFsaWRGb3JtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBnZXRGaWVsZHNWYWx1ZSA9IGZvcm1JbnN0YW5jZS5nZXRGaWVsZHNWYWx1ZSxcbiAgICAgIGdldEludGVybmFsSG9va3MgPSBmb3JtSW5zdGFuY2UuZ2V0SW50ZXJuYWxIb29rcztcbiAgICB2YXIgX2dldEludGVybmFsSG9va3MgPSBnZXRJbnRlcm5hbEhvb2tzKEhPT0tfTUFSSyksXG4gICAgICByZWdpc3RlcldhdGNoID0gX2dldEludGVybmFsSG9va3MucmVnaXN0ZXJXYXRjaDtcbiAgICB2YXIgY2FuY2VsUmVnaXN0ZXIgPSByZWdpc3RlcldhdGNoKGZ1bmN0aW9uIChzdG9yZSkge1xuICAgICAgdmFyIG5ld1ZhbHVlID0gZ2V0VmFsdWUoc3RvcmUsIG5hbWVQYXRoUmVmLmN1cnJlbnQpO1xuICAgICAgdmFyIG5leHRWYWx1ZVN0ciA9IHN0cmluZ2lmeShuZXdWYWx1ZSk7XG4gICAgICAvLyBDb21wYXJlIHN0cmluZ2lmeSBpbiBjYXNlIGl0J3MgbmVzdCBvYmplY3RcbiAgICAgIGlmICh2YWx1ZVN0clJlZi5jdXJyZW50ICE9PSBuZXh0VmFsdWVTdHIpIHtcbiAgICAgICAgdmFsdWVTdHJSZWYuY3VycmVudCA9IG5leHRWYWx1ZVN0cjtcbiAgICAgICAgc2V0VmFsdWUobmV3VmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIFRPRE86IFdlIGNhbiBpbXByb3ZlIHRoaXMgcGVyZiBpbiBmdXR1cmVcbiAgICB2YXIgaW5pdGlhbFZhbHVlID0gZ2V0VmFsdWUoZ2V0RmllbGRzVmFsdWUoKSwgbmFtZVBhdGhSZWYuY3VycmVudCk7XG4gICAgc2V0VmFsdWUoaW5pdGlhbFZhbHVlKTtcbiAgICByZXR1cm4gY2FuY2VsUmVnaXN0ZXI7XG4gIH0sXG4gIC8vIFdlIGRvIG5vdCBuZWVkIHJlLXJlZ2lzdGVyIHNpbmNlIG5hbWVQYXRoIGNvbnRlbnQgaXMgdGhlIHNhbWVcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICBbaXNWYWxpZEZvcm1dKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuZXhwb3J0IGRlZmF1bHQgdXNlV2F0Y2g7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEZpZWxkIGZyb20gJy4vRmllbGQnO1xuaW1wb3J0IExpc3QgZnJvbSAnLi9MaXN0JztcbmltcG9ydCB1c2VGb3JtIGZyb20gJy4vdXNlRm9ybSc7XG5pbXBvcnQgRmllbGRGb3JtIGZyb20gJy4vRm9ybSc7XG5pbXBvcnQgeyBGb3JtUHJvdmlkZXIgfSBmcm9tICcuL0Zvcm1Db250ZXh0JztcbmltcG9ydCBGaWVsZENvbnRleHQgZnJvbSAnLi9GaWVsZENvbnRleHQnO1xuaW1wb3J0IExpc3RDb250ZXh0IGZyb20gJy4vTGlzdENvbnRleHQnO1xuaW1wb3J0IHVzZVdhdGNoIGZyb20gJy4vdXNlV2F0Y2gnO1xudmFyIEludGVybmFsRm9ybSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEZpZWxkRm9ybSk7XG52YXIgUmVmRm9ybSA9IEludGVybmFsRm9ybTtcblJlZkZvcm0uRm9ybVByb3ZpZGVyID0gRm9ybVByb3ZpZGVyO1xuUmVmRm9ybS5GaWVsZCA9IEZpZWxkO1xuUmVmRm9ybS5MaXN0ID0gTGlzdDtcblJlZkZvcm0udXNlRm9ybSA9IHVzZUZvcm07XG5SZWZGb3JtLnVzZVdhdGNoID0gdXNlV2F0Y2g7XG5leHBvcnQgeyBGaWVsZCwgTGlzdCwgdXNlRm9ybSwgRm9ybVByb3ZpZGVyLCBGaWVsZENvbnRleHQsIExpc3RDb250ZXh0LCB1c2VXYXRjaCB9O1xuZXhwb3J0IGRlZmF1bHQgUmVmRm9ybTsiLCJleHBvcnQgZGVmYXVsdCB7XG4gIC8vIE9wdGlvbnMuanN4XG4gIGl0ZW1zX3Blcl9wYWdlOiAnLyBwYWdlJyxcbiAganVtcF90bzogJ0dvIHRvJyxcbiAganVtcF90b19jb25maXJtOiAnY29uZmlybScsXG4gIHBhZ2U6ICdQYWdlJyxcbiAgLy8gUGFnaW5hdGlvbi5qc3hcbiAgcHJldl9wYWdlOiAnUHJldmlvdXMgUGFnZScsXG4gIG5leHRfcGFnZTogJ05leHQgUGFnZScsXG4gIHByZXZfNTogJ1ByZXZpb3VzIDUgUGFnZXMnLFxuICBuZXh0XzU6ICdOZXh0IDUgUGFnZXMnLFxuICBwcmV2XzM6ICdQcmV2aW91cyAzIFBhZ2VzJyxcbiAgbmV4dF8zOiAnTmV4dCAzIFBhZ2VzJyxcbiAgcGFnZV9zaXplOiAnUGFnZSBTaXplJ1xufTsiLCJ2YXIgbG9jYWxlID0ge1xuICBsb2NhbGU6ICdlbl9VUycsXG4gIHRvZGF5OiAnVG9kYXknLFxuICBub3c6ICdOb3cnLFxuICBiYWNrVG9Ub2RheTogJ0JhY2sgdG8gdG9kYXknLFxuICBvazogJ09LJyxcbiAgY2xlYXI6ICdDbGVhcicsXG4gIG1vbnRoOiAnTW9udGgnLFxuICB5ZWFyOiAnWWVhcicsXG4gIHRpbWVTZWxlY3Q6ICdzZWxlY3QgdGltZScsXG4gIGRhdGVTZWxlY3Q6ICdzZWxlY3QgZGF0ZScsXG4gIHdlZWtTZWxlY3Q6ICdDaG9vc2UgYSB3ZWVrJyxcbiAgbW9udGhTZWxlY3Q6ICdDaG9vc2UgYSBtb250aCcsXG4gIHllYXJTZWxlY3Q6ICdDaG9vc2UgYSB5ZWFyJyxcbiAgZGVjYWRlU2VsZWN0OiAnQ2hvb3NlIGEgZGVjYWRlJyxcbiAgeWVhckZvcm1hdDogJ1lZWVknLFxuICBkYXRlRm9ybWF0OiAnTS9EL1lZWVknLFxuICBkYXlGb3JtYXQ6ICdEJyxcbiAgZGF0ZVRpbWVGb3JtYXQ6ICdNL0QvWVlZWSBISDptbTpzcycsXG4gIG1vbnRoQmVmb3JlWWVhcjogdHJ1ZSxcbiAgcHJldmlvdXNNb250aDogJ1ByZXZpb3VzIG1vbnRoIChQYWdlVXApJyxcbiAgbmV4dE1vbnRoOiAnTmV4dCBtb250aCAoUGFnZURvd24pJyxcbiAgcHJldmlvdXNZZWFyOiAnTGFzdCB5ZWFyIChDb250cm9sICsgbGVmdCknLFxuICBuZXh0WWVhcjogJ05leHQgeWVhciAoQ29udHJvbCArIHJpZ2h0KScsXG4gIHByZXZpb3VzRGVjYWRlOiAnTGFzdCBkZWNhZGUnLFxuICBuZXh0RGVjYWRlOiAnTmV4dCBkZWNhZGUnLFxuICBwcmV2aW91c0NlbnR1cnk6ICdMYXN0IGNlbnR1cnknLFxuICBuZXh0Q2VudHVyeTogJ05leHQgY2VudHVyeSdcbn07XG5leHBvcnQgZGVmYXVsdCBsb2NhbGU7IiwidmFyIGxvY2FsZSA9IHtcbiAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgdGltZScsXG4gIHJhbmdlUGxhY2Vob2xkZXI6IFsnU3RhcnQgdGltZScsICdFbmQgdGltZSddXG59O1xuZXhwb3J0IGRlZmF1bHQgbG9jYWxlOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IENhbGVuZGFyTG9jYWxlIGZyb20gXCJyYy1waWNrZXIvZXMvbG9jYWxlL2VuX1VTXCI7XG5pbXBvcnQgVGltZVBpY2tlckxvY2FsZSBmcm9tICcuLi8uLi90aW1lLXBpY2tlci9sb2NhbGUvZW5fVVMnO1xuLy8gTWVyZ2UgaW50byBhIGxvY2FsZSBvYmplY3RcbnZhciBsb2NhbGUgPSB7XG4gIGxhbmc6IF9leHRlbmRzKHtcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBkYXRlJyxcbiAgICB5ZWFyUGxhY2Vob2xkZXI6ICdTZWxlY3QgeWVhcicsXG4gICAgcXVhcnRlclBsYWNlaG9sZGVyOiAnU2VsZWN0IHF1YXJ0ZXInLFxuICAgIG1vbnRoUGxhY2Vob2xkZXI6ICdTZWxlY3QgbW9udGgnLFxuICAgIHdlZWtQbGFjZWhvbGRlcjogJ1NlbGVjdCB3ZWVrJyxcbiAgICByYW5nZVBsYWNlaG9sZGVyOiBbJ1N0YXJ0IGRhdGUnLCAnRW5kIGRhdGUnXSxcbiAgICByYW5nZVllYXJQbGFjZWhvbGRlcjogWydTdGFydCB5ZWFyJywgJ0VuZCB5ZWFyJ10sXG4gICAgcmFuZ2VRdWFydGVyUGxhY2Vob2xkZXI6IFsnU3RhcnQgcXVhcnRlcicsICdFbmQgcXVhcnRlciddLFxuICAgIHJhbmdlTW9udGhQbGFjZWhvbGRlcjogWydTdGFydCBtb250aCcsICdFbmQgbW9udGgnXSxcbiAgICByYW5nZVdlZWtQbGFjZWhvbGRlcjogWydTdGFydCB3ZWVrJywgJ0VuZCB3ZWVrJ11cbiAgfSwgQ2FsZW5kYXJMb2NhbGUpLFxuICB0aW1lUGlja2VyTG9jYWxlOiBfZXh0ZW5kcyh7fSwgVGltZVBpY2tlckxvY2FsZSlcbn07XG4vLyBBbGwgc2V0dGluZ3MgYXQ6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2Jsb2IvbWFzdGVyL2NvbXBvbmVudHMvZGF0ZS1waWNrZXIvbG9jYWxlL2V4YW1wbGUuanNvblxuZXhwb3J0IGRlZmF1bHQgbG9jYWxlOyIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZyAqL1xuaW1wb3J0IFBhZ2luYXRpb24gZnJvbSBcInJjLXBhZ2luYXRpb24vZXMvbG9jYWxlL2VuX1VTXCI7XG5pbXBvcnQgQ2FsZW5kYXIgZnJvbSAnLi4vY2FsZW5kYXIvbG9jYWxlL2VuX1VTJztcbmltcG9ydCBEYXRlUGlja2VyIGZyb20gJy4uL2RhdGUtcGlja2VyL2xvY2FsZS9lbl9VUyc7XG5pbXBvcnQgVGltZVBpY2tlciBmcm9tICcuLi90aW1lLXBpY2tlci9sb2NhbGUvZW5fVVMnO1xudmFyIHR5cGVUZW1wbGF0ZSA9ICcke2xhYmVsfSBpcyBub3QgYSB2YWxpZCAke3R5cGV9JztcbnZhciBsb2NhbGVWYWx1ZXMgPSB7XG4gIGxvY2FsZTogJ2VuJyxcbiAgUGFnaW5hdGlvbjogUGFnaW5hdGlvbixcbiAgRGF0ZVBpY2tlcjogRGF0ZVBpY2tlcixcbiAgVGltZVBpY2tlcjogVGltZVBpY2tlcixcbiAgQ2FsZW5kYXI6IENhbGVuZGFyLFxuICBnbG9iYWw6IHtcbiAgICBwbGFjZWhvbGRlcjogJ1BsZWFzZSBzZWxlY3QnXG4gIH0sXG4gIFRhYmxlOiB7XG4gICAgZmlsdGVyVGl0bGU6ICdGaWx0ZXIgbWVudScsXG4gICAgZmlsdGVyQ29uZmlybTogJ09LJyxcbiAgICBmaWx0ZXJSZXNldDogJ1Jlc2V0JyxcbiAgICBmaWx0ZXJFbXB0eVRleHQ6ICdObyBmaWx0ZXJzJyxcbiAgICBmaWx0ZXJDaGVja2FsbDogJ1NlbGVjdCBhbGwgaXRlbXMnLFxuICAgIGZpbHRlclNlYXJjaFBsYWNlaG9sZGVyOiAnU2VhcmNoIGluIGZpbHRlcnMnLFxuICAgIGVtcHR5VGV4dDogJ05vIGRhdGEnLFxuICAgIHNlbGVjdEFsbDogJ1NlbGVjdCBjdXJyZW50IHBhZ2UnLFxuICAgIHNlbGVjdEludmVydDogJ0ludmVydCBjdXJyZW50IHBhZ2UnLFxuICAgIHNlbGVjdE5vbmU6ICdDbGVhciBhbGwgZGF0YScsXG4gICAgc2VsZWN0aW9uQWxsOiAnU2VsZWN0IGFsbCBkYXRhJyxcbiAgICBzb3J0VGl0bGU6ICdTb3J0JyxcbiAgICBleHBhbmQ6ICdFeHBhbmQgcm93JyxcbiAgICBjb2xsYXBzZTogJ0NvbGxhcHNlIHJvdycsXG4gICAgdHJpZ2dlckRlc2M6ICdDbGljayB0byBzb3J0IGRlc2NlbmRpbmcnLFxuICAgIHRyaWdnZXJBc2M6ICdDbGljayB0byBzb3J0IGFzY2VuZGluZycsXG4gICAgY2FuY2VsU29ydDogJ0NsaWNrIHRvIGNhbmNlbCBzb3J0aW5nJ1xuICB9LFxuICBNb2RhbDoge1xuICAgIG9rVGV4dDogJ09LJyxcbiAgICBjYW5jZWxUZXh0OiAnQ2FuY2VsJyxcbiAgICBqdXN0T2tUZXh0OiAnT0snXG4gIH0sXG4gIFBvcGNvbmZpcm06IHtcbiAgICBva1RleHQ6ICdPSycsXG4gICAgY2FuY2VsVGV4dDogJ0NhbmNlbCdcbiAgfSxcbiAgVHJhbnNmZXI6IHtcbiAgICB0aXRsZXM6IFsnJywgJyddLFxuICAgIHNlYXJjaFBsYWNlaG9sZGVyOiAnU2VhcmNoIGhlcmUnLFxuICAgIGl0ZW1Vbml0OiAnaXRlbScsXG4gICAgaXRlbXNVbml0OiAnaXRlbXMnLFxuICAgIHJlbW92ZTogJ1JlbW92ZScsXG4gICAgc2VsZWN0Q3VycmVudDogJ1NlbGVjdCBjdXJyZW50IHBhZ2UnLFxuICAgIHJlbW92ZUN1cnJlbnQ6ICdSZW1vdmUgY3VycmVudCBwYWdlJyxcbiAgICBzZWxlY3RBbGw6ICdTZWxlY3QgYWxsIGRhdGEnLFxuICAgIHJlbW92ZUFsbDogJ1JlbW92ZSBhbGwgZGF0YScsXG4gICAgc2VsZWN0SW52ZXJ0OiAnSW52ZXJ0IGN1cnJlbnQgcGFnZSdcbiAgfSxcbiAgVXBsb2FkOiB7XG4gICAgdXBsb2FkaW5nOiAnVXBsb2FkaW5nLi4uJyxcbiAgICByZW1vdmVGaWxlOiAnUmVtb3ZlIGZpbGUnLFxuICAgIHVwbG9hZEVycm9yOiAnVXBsb2FkIGVycm9yJyxcbiAgICBwcmV2aWV3RmlsZTogJ1ByZXZpZXcgZmlsZScsXG4gICAgZG93bmxvYWRGaWxlOiAnRG93bmxvYWQgZmlsZSdcbiAgfSxcbiAgRW1wdHk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ05vIGRhdGEnXG4gIH0sXG4gIEljb246IHtcbiAgICBpY29uOiAnaWNvbidcbiAgfSxcbiAgVGV4dDoge1xuICAgIGVkaXQ6ICdFZGl0JyxcbiAgICBjb3B5OiAnQ29weScsXG4gICAgY29waWVkOiAnQ29waWVkJyxcbiAgICBleHBhbmQ6ICdFeHBhbmQnXG4gIH0sXG4gIFBhZ2VIZWFkZXI6IHtcbiAgICBiYWNrOiAnQmFjaydcbiAgfSxcbiAgRm9ybToge1xuICAgIG9wdGlvbmFsOiAnKG9wdGlvbmFsKScsXG4gICAgZGVmYXVsdFZhbGlkYXRlTWVzc2FnZXM6IHtcbiAgICAgIFwiZGVmYXVsdFwiOiAnRmllbGQgdmFsaWRhdGlvbiBlcnJvciBmb3IgJHtsYWJlbH0nLFxuICAgICAgcmVxdWlyZWQ6ICdQbGVhc2UgZW50ZXIgJHtsYWJlbH0nLFxuICAgICAgXCJlbnVtXCI6ICcke2xhYmVsfSBtdXN0IGJlIG9uZSBvZiBbJHtlbnVtfV0nLFxuICAgICAgd2hpdGVzcGFjZTogJyR7bGFiZWx9IGNhbm5vdCBiZSBhIGJsYW5rIGNoYXJhY3RlcicsXG4gICAgICBkYXRlOiB7XG4gICAgICAgIGZvcm1hdDogJyR7bGFiZWx9IGRhdGUgZm9ybWF0IGlzIGludmFsaWQnLFxuICAgICAgICBwYXJzZTogJyR7bGFiZWx9IGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYSBkYXRlJyxcbiAgICAgICAgaW52YWxpZDogJyR7bGFiZWx9IGlzIGFuIGludmFsaWQgZGF0ZSdcbiAgICAgIH0sXG4gICAgICB0eXBlczoge1xuICAgICAgICBzdHJpbmc6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgbWV0aG9kOiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIGFycmF5OiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIG9iamVjdDogdHlwZVRlbXBsYXRlLFxuICAgICAgICBudW1iZXI6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgZGF0ZTogdHlwZVRlbXBsYXRlLFxuICAgICAgICBcImJvb2xlYW5cIjogdHlwZVRlbXBsYXRlLFxuICAgICAgICBpbnRlZ2VyOiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIFwiZmxvYXRcIjogdHlwZVRlbXBsYXRlLFxuICAgICAgICByZWdleHA6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgZW1haWw6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgdXJsOiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIGhleDogdHlwZVRlbXBsYXRlXG4gICAgICB9LFxuICAgICAgc3RyaW5nOiB7XG4gICAgICAgIGxlbjogJyR7bGFiZWx9IG11c3QgYmUgJHtsZW59IGNoYXJhY3RlcnMnLFxuICAgICAgICBtaW46ICcke2xhYmVsfSBtdXN0IGJlIGF0IGxlYXN0ICR7bWlufSBjaGFyYWN0ZXJzJyxcbiAgICAgICAgbWF4OiAnJHtsYWJlbH0gbXVzdCBiZSB1cCB0byAke21heH0gY2hhcmFjdGVycycsXG4gICAgICAgIHJhbmdlOiAnJHtsYWJlbH0gbXVzdCBiZSBiZXR3ZWVuICR7bWlufS0ke21heH0gY2hhcmFjdGVycydcbiAgICAgIH0sXG4gICAgICBudW1iZXI6IHtcbiAgICAgICAgbGVuOiAnJHtsYWJlbH0gbXVzdCBiZSBlcXVhbCB0byAke2xlbn0nLFxuICAgICAgICBtaW46ICcke2xhYmVsfSBtdXN0IGJlIG1pbmltdW0gJHttaW59JyxcbiAgICAgICAgbWF4OiAnJHtsYWJlbH0gbXVzdCBiZSBtYXhpbXVtICR7bWF4fScsXG4gICAgICAgIHJhbmdlOiAnJHtsYWJlbH0gbXVzdCBiZSBiZXR3ZWVuICR7bWlufS0ke21heH0nXG4gICAgICB9LFxuICAgICAgYXJyYXk6IHtcbiAgICAgICAgbGVuOiAnTXVzdCBiZSAke2xlbn0gJHtsYWJlbH0nLFxuICAgICAgICBtaW46ICdBdCBsZWFzdCAke21pbn0gJHtsYWJlbH0nLFxuICAgICAgICBtYXg6ICdBdCBtb3N0ICR7bWF4fSAke2xhYmVsfScsXG4gICAgICAgIHJhbmdlOiAnVGhlIGFtb3VudCBvZiAke2xhYmVsfSBtdXN0IGJlIGJldHdlZW4gJHttaW59LSR7bWF4fSdcbiAgICAgIH0sXG4gICAgICBwYXR0ZXJuOiB7XG4gICAgICAgIG1pc21hdGNoOiAnJHtsYWJlbH0gZG9lcyBub3QgbWF0Y2ggdGhlIHBhdHRlcm4gJHtwYXR0ZXJufSdcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIEltYWdlOiB7XG4gICAgcHJldmlldzogJ1ByZXZpZXcnXG4gIH1cbn07XG5leHBvcnQgZGVmYXVsdCBsb2NhbGVWYWx1ZXM7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgZGVmYXVsdExvY2FsZSBmcm9tICcuLi9sb2NhbGUvZGVmYXVsdCc7XG52YXIgcnVudGltZUxvY2FsZSA9IF9leHRlbmRzKHt9LCBkZWZhdWx0TG9jYWxlLk1vZGFsKTtcbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VDb25maXJtTG9jYWxlKG5ld0xvY2FsZSkge1xuICBpZiAobmV3TG9jYWxlKSB7XG4gICAgcnVudGltZUxvY2FsZSA9IF9leHRlbmRzKF9leHRlbmRzKHt9LCBydW50aW1lTG9jYWxlKSwgbmV3TG9jYWxlKTtcbiAgfSBlbHNlIHtcbiAgICBydW50aW1lTG9jYWxlID0gX2V4dGVuZHMoe30sIGRlZmF1bHRMb2NhbGUuTW9kYWwpO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlybUxvY2FsZSgpIHtcbiAgcmV0dXJuIHJ1bnRpbWVMb2NhbGU7XG59IiwiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbnZhciBMb2NhbGVDb250ZXh0ID0gLyojX19QVVJFX18qL2NyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcbmV4cG9ydCBkZWZhdWx0IExvY2FsZUNvbnRleHQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCB7IGNoYW5nZUNvbmZpcm1Mb2NhbGUgfSBmcm9tICcuLi9tb2RhbC9sb2NhbGUnO1xuaW1wb3J0IExvY2FsZUNvbnRleHQgZnJvbSAnLi9jb250ZXh0JztcbmV4cG9ydCB2YXIgQU5UX01BUksgPSAnaW50ZXJuYWxNYXJrJztcbnZhciBMb2NhbGVQcm92aWRlciA9IGZ1bmN0aW9uIExvY2FsZVByb3ZpZGVyKHByb3BzKSB7XG4gIHZhciBfcHJvcHMkbG9jYWxlID0gcHJvcHMubG9jYWxlLFxuICAgIGxvY2FsZSA9IF9wcm9wcyRsb2NhbGUgPT09IHZvaWQgMCA/IHt9IDogX3Byb3BzJGxvY2FsZSxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIF9BTlRfTUFSS19fID0gcHJvcHMuX0FOVF9NQVJLX187XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhfQU5UX01BUktfXyA9PT0gQU5UX01BUkssICdMb2NhbGVQcm92aWRlcicsICdgTG9jYWxlUHJvdmlkZXJgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYGxvY2FsZWAgd2l0aCBgQ29uZmlnUHJvdmlkZXJgIGluc3RlYWQ6IGh0dHA6Ly91LmFudC5kZXNpZ24vbG9jYWxlJykgOiB2b2lkIDA7XG4gIH1cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBjaGFuZ2VDb25maXJtTG9jYWxlKGxvY2FsZSAmJiBsb2NhbGUuTW9kYWwpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBjaGFuZ2VDb25maXJtTG9jYWxlKCk7XG4gICAgfTtcbiAgfSwgW2xvY2FsZV0pO1xuICB2YXIgZ2V0TWVtb2l6ZWRDb250ZXh0VmFsdWUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX2V4dGVuZHMoX2V4dGVuZHMoe30sIGxvY2FsZSksIHtcbiAgICAgIGV4aXN0OiB0cnVlXG4gICAgfSk7XG4gIH0sIFtsb2NhbGVdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExvY2FsZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogZ2V0TWVtb2l6ZWRDb250ZXh0VmFsdWVcbiAgfSwgY2hpbGRyZW4pO1xufTtcbmV4cG9ydCBkZWZhdWx0IExvY2FsZVByb3ZpZGVyOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IExvY2FsZUNvbnRleHQgZnJvbSAnLi9jb250ZXh0JztcbmltcG9ydCBkZWZhdWx0TG9jYWxlRGF0YSBmcm9tICcuL2RlZmF1bHQnO1xudmFyIExvY2FsZVJlY2VpdmVyID0gZnVuY3Rpb24gTG9jYWxlUmVjZWl2ZXIocHJvcHMpIHtcbiAgdmFyIF9wcm9wcyRjb21wb25lbnROYW1lID0gcHJvcHMuY29tcG9uZW50TmFtZSxcbiAgICBjb21wb25lbnROYW1lID0gX3Byb3BzJGNvbXBvbmVudE5hbWUgPT09IHZvaWQgMCA/ICdnbG9iYWwnIDogX3Byb3BzJGNvbXBvbmVudE5hbWUsXG4gICAgZGVmYXVsdExvY2FsZSA9IHByb3BzLmRlZmF1bHRMb2NhbGUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcbiAgdmFyIGFudExvY2FsZSA9IFJlYWN0LnVzZUNvbnRleHQoTG9jYWxlQ29udGV4dCk7XG4gIHZhciBnZXRMb2NhbGUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGxvY2FsZSA9IGRlZmF1bHRMb2NhbGUgfHwgZGVmYXVsdExvY2FsZURhdGFbY29tcG9uZW50TmFtZV07XG4gICAgdmFyIGxvY2FsZUZyb21Db250ZXh0ID0gKF9hID0gYW50TG9jYWxlID09PSBudWxsIHx8IGFudExvY2FsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogYW50TG9jYWxlW2NvbXBvbmVudE5hbWVdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB7fTtcbiAgICByZXR1cm4gX2V4dGVuZHMoX2V4dGVuZHMoe30sIGxvY2FsZSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gbG9jYWxlKCkgOiBsb2NhbGUpLCBsb2NhbGVGcm9tQ29udGV4dCB8fCB7fSk7XG4gIH0sIFtjb21wb25lbnROYW1lLCBkZWZhdWx0TG9jYWxlLCBhbnRMb2NhbGVdKTtcbiAgdmFyIGdldExvY2FsZUNvZGUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbG9jYWxlQ29kZSA9IGFudExvY2FsZSAmJiBhbnRMb2NhbGUubG9jYWxlO1xuICAgIC8vIEhhZCB1c2UgTG9jYWxlUHJvdmlkZSBidXQgZGlkbid0IHNldCBsb2NhbGVcbiAgICBpZiAoYW50TG9jYWxlICYmIGFudExvY2FsZS5leGlzdCAmJiAhbG9jYWxlQ29kZSkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRMb2NhbGVEYXRhLmxvY2FsZTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsZUNvZGU7XG4gIH0sIFthbnRMb2NhbGVdKTtcbiAgcmV0dXJuIGNoaWxkcmVuKGdldExvY2FsZSwgZ2V0TG9jYWxlQ29kZSwgYW50TG9jYWxlKTtcbn07XG5leHBvcnQgZGVmYXVsdCBMb2NhbGVSZWNlaXZlcjtcbmV4cG9ydCB2YXIgdXNlTG9jYWxlUmVjZWl2ZXIgPSBmdW5jdGlvbiB1c2VMb2NhbGVSZWNlaXZlcihjb21wb25lbnROYW1lLCBkZWZhdWx0TG9jYWxlKSB7XG4gIHZhciBhbnRMb2NhbGUgPSBSZWFjdC51c2VDb250ZXh0KExvY2FsZUNvbnRleHQpO1xuICB2YXIgZ2V0TG9jYWxlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBsb2NhbGUgPSBkZWZhdWx0TG9jYWxlIHx8IGRlZmF1bHRMb2NhbGVEYXRhW2NvbXBvbmVudE5hbWVdO1xuICAgIHZhciBsb2NhbGVGcm9tQ29udGV4dCA9IChfYSA9IGFudExvY2FsZSA9PT0gbnVsbCB8fCBhbnRMb2NhbGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFudExvY2FsZVtjb21wb25lbnROYW1lXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge307XG4gICAgcmV0dXJuIF9leHRlbmRzKF9leHRlbmRzKHt9LCB0eXBlb2YgbG9jYWxlID09PSAnZnVuY3Rpb24nID8gbG9jYWxlKCkgOiBsb2NhbGUpLCBsb2NhbGVGcm9tQ29udGV4dCB8fCB7fSk7XG4gIH0sIFtjb21wb25lbnROYW1lLCBkZWZhdWx0TG9jYWxlLCBhbnRMb2NhbGVdKTtcbiAgcmV0dXJuIFtnZXRMb2NhbGVdO1xufTsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBDaGVja0NpcmNsZUZpbGxlZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTEyIDY0QzI2NC42IDY0IDY0IDI2NC42IDY0IDUxMnMyMDAuNiA0NDggNDQ4IDQ0OCA0NDgtMjAwLjYgNDQ4LTQ0OFM3NTkuNCA2NCA1MTIgNjR6bTE5My41IDMwMS43bC0yMTAuNiAyOTJhMzEuOCAzMS44IDAgMDEtNTEuNyAwTDMxOC41IDQ4NC45Yy0zLjgtNS4zIDAtMTIuNyA2LjUtMTIuN2g0Ni45YzEwLjIgMCAxOS45IDQuOSAyNS45IDEzLjNsNzEuMiA5OC44IDE1Ny4yLTIxOGM2LTguMyAxNS42LTEzLjMgMjUuOS0xMy4zSDY5OWM2LjUgMCAxMC4zIDcuNCA2LjUgMTIuN3pcIiB9IH1dIH0sIFwibmFtZVwiOiBcImNoZWNrLWNpcmNsZVwiLCBcInRoZW1lXCI6IFwiZmlsbGVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IENoZWNrQ2lyY2xlRmlsbGVkO1xuIiwiLyoqXG4gKiBUYWtlIGlucHV0IGZyb20gWzAsIG5dIGFuZCByZXR1cm4gaXQgYXMgWzAsIDFdXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib3VuZDAxKG4sIG1heCkge1xuICAgIGlmIChpc09uZVBvaW50WmVybyhuKSkge1xuICAgICAgICBuID0gJzEwMCUnO1xuICAgIH1cbiAgICB2YXIgaXNQZXJjZW50ID0gaXNQZXJjZW50YWdlKG4pO1xuICAgIG4gPSBtYXggPT09IDM2MCA/IG4gOiBNYXRoLm1pbihtYXgsIE1hdGgubWF4KDAsIHBhcnNlRmxvYXQobikpKTtcbiAgICAvLyBBdXRvbWF0aWNhbGx5IGNvbnZlcnQgcGVyY2VudGFnZSBpbnRvIG51bWJlclxuICAgIGlmIChpc1BlcmNlbnQpIHtcbiAgICAgICAgbiA9IHBhcnNlSW50KFN0cmluZyhuICogbWF4KSwgMTApIC8gMTAwO1xuICAgIH1cbiAgICAvLyBIYW5kbGUgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgZXJyb3JzXG4gICAgaWYgKE1hdGguYWJzKG4gLSBtYXgpIDwgMC4wMDAwMDEpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIC8vIENvbnZlcnQgaW50byBbMCwgMV0gcmFuZ2UgaWYgaXQgaXNuJ3QgYWxyZWFkeVxuICAgIGlmIChtYXggPT09IDM2MCkge1xuICAgICAgICAvLyBJZiBuIGlzIGEgaHVlIGdpdmVuIGluIGRlZ3JlZXMsXG4gICAgICAgIC8vIHdyYXAgYXJvdW5kIG91dC1vZi1yYW5nZSB2YWx1ZXMgaW50byBbMCwgMzYwXSByYW5nZVxuICAgICAgICAvLyB0aGVuIGNvbnZlcnQgaW50byBbMCwgMV0uXG4gICAgICAgIG4gPSAobiA8IDAgPyAobiAlIG1heCkgKyBtYXggOiBuICUgbWF4KSAvIHBhcnNlRmxvYXQoU3RyaW5nKG1heCkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gSWYgbiBub3QgYSBodWUgZ2l2ZW4gaW4gZGVncmVlc1xuICAgICAgICAvLyBDb252ZXJ0IGludG8gWzAsIDFdIHJhbmdlIGlmIGl0IGlzbid0IGFscmVhZHkuXG4gICAgICAgIG4gPSAobiAlIG1heCkgLyBwYXJzZUZsb2F0KFN0cmluZyhtYXgpKTtcbiAgICB9XG4gICAgcmV0dXJuIG47XG59XG4vKipcbiAqIEZvcmNlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMVxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhbXAwMSh2YWwpIHtcbiAgICByZXR1cm4gTWF0aC5taW4oMSwgTWF0aC5tYXgoMCwgdmFsKSk7XG59XG4vKipcbiAqIE5lZWQgdG8gaGFuZGxlIDEuMCBhcyAxMDAlLCBzaW5jZSBvbmNlIGl0IGlzIGEgbnVtYmVyLCB0aGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4gaXQgYW5kIDFcbiAqIDxodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc0MjIwNzIvamF2YXNjcmlwdC1ob3ctdG8tZGV0ZWN0LW51bWJlci1hcy1hLWRlY2ltYWwtaW5jbHVkaW5nLTEtMD5cbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT25lUG9pbnRaZXJvKG4pIHtcbiAgICByZXR1cm4gdHlwZW9mIG4gPT09ICdzdHJpbmcnICYmIG4uaW5kZXhPZignLicpICE9PSAtMSAmJiBwYXJzZUZsb2F0KG4pID09PSAxO1xufVxuLyoqXG4gKiBDaGVjayB0byBzZWUgaWYgc3RyaW5nIHBhc3NlZCBpbiBpcyBhIHBlcmNlbnRhZ2VcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGVyY2VudGFnZShuKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBuID09PSAnc3RyaW5nJyAmJiBuLmluZGV4T2YoJyUnKSAhPT0gLTE7XG59XG4vKipcbiAqIFJldHVybiBhIHZhbGlkIGFscGhhIHZhbHVlIFswLDFdIHdpdGggYWxsIGludmFsaWQgdmFsdWVzIGJlaW5nIHNldCB0byAxXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib3VuZEFscGhhKGEpIHtcbiAgICBhID0gcGFyc2VGbG9hdChhKTtcbiAgICBpZiAoaXNOYU4oYSkgfHwgYSA8IDAgfHwgYSA+IDEpIHtcbiAgICAgICAgYSA9IDE7XG4gICAgfVxuICAgIHJldHVybiBhO1xufVxuLyoqXG4gKiBSZXBsYWNlIGEgZGVjaW1hbCB3aXRoIGl0J3MgcGVyY2VudGFnZSB2YWx1ZVxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRvUGVyY2VudGFnZShuKSB7XG4gICAgaWYgKG4gPD0gMSkge1xuICAgICAgICByZXR1cm4gXCJcIi5jb25jYXQoTnVtYmVyKG4pICogMTAwLCBcIiVcIik7XG4gICAgfVxuICAgIHJldHVybiBuO1xufVxuLyoqXG4gKiBGb3JjZSBhIGhleCB2YWx1ZSB0byBoYXZlIDIgY2hhcmFjdGVyc1xuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFkMihjKSB7XG4gICAgcmV0dXJuIGMubGVuZ3RoID09PSAxID8gJzAnICsgYyA6IFN0cmluZyhjKTtcbn1cbiIsImltcG9ydCB7IGJvdW5kMDEsIHBhZDIgfSBmcm9tICcuL3V0aWwnO1xuLy8gYHJnYlRvSHNsYCwgYHJnYlRvSHN2YCwgYGhzbFRvUmdiYCwgYGhzdlRvUmdiYCBtb2RpZmllZCBmcm9tOlxuLy8gPGh0dHA6Ly9tamlqYWNrc29uLmNvbS8yMDA4LzAyL3JnYi10by1oc2wtYW5kLXJnYi10by1oc3YtY29sb3ItbW9kZWwtY29udmVyc2lvbi1hbGdvcml0aG1zLWluLWphdmFzY3JpcHQ+XG4vKipcbiAqIEhhbmRsZSBib3VuZHMgLyBwZXJjZW50YWdlIGNoZWNraW5nIHRvIGNvbmZvcm0gdG8gQ1NTIGNvbG9yIHNwZWNcbiAqIDxodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yLz5cbiAqICpBc3N1bWVzOiogciwgZywgYiBpbiBbMCwgMjU1XSBvciBbMCwgMV1cbiAqICpSZXR1cm5zOiogeyByLCBnLCBiIH0gaW4gWzAsIDI1NV1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJnYlRvUmdiKHIsIGcsIGIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICByOiBib3VuZDAxKHIsIDI1NSkgKiAyNTUsXG4gICAgICAgIGc6IGJvdW5kMDEoZywgMjU1KSAqIDI1NSxcbiAgICAgICAgYjogYm91bmQwMShiLCAyNTUpICogMjU1LFxuICAgIH07XG59XG4vKipcbiAqIENvbnZlcnRzIGFuIFJHQiBjb2xvciB2YWx1ZSB0byBIU0wuXG4gKiAqQXNzdW1lczoqIHIsIGcsIGFuZCBiIGFyZSBjb250YWluZWQgaW4gWzAsIDI1NV0gb3IgWzAsIDFdXG4gKiAqUmV0dXJuczoqIHsgaCwgcywgbCB9IGluIFswLDFdXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZ2JUb0hzbChyLCBnLCBiKSB7XG4gICAgciA9IGJvdW5kMDEociwgMjU1KTtcbiAgICBnID0gYm91bmQwMShnLCAyNTUpO1xuICAgIGIgPSBib3VuZDAxKGIsIDI1NSk7XG4gICAgdmFyIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xuICAgIHZhciBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcbiAgICB2YXIgaCA9IDA7XG4gICAgdmFyIHMgPSAwO1xuICAgIHZhciBsID0gKG1heCArIG1pbikgLyAyO1xuICAgIGlmIChtYXggPT09IG1pbikge1xuICAgICAgICBzID0gMDtcbiAgICAgICAgaCA9IDA7IC8vIGFjaHJvbWF0aWNcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBkID0gbWF4IC0gbWluO1xuICAgICAgICBzID0gbCA+IDAuNSA/IGQgLyAoMiAtIG1heCAtIG1pbikgOiBkIC8gKG1heCArIG1pbik7XG4gICAgICAgIHN3aXRjaCAobWF4KSB7XG4gICAgICAgICAgICBjYXNlIHI6XG4gICAgICAgICAgICAgICAgaCA9IChnIC0gYikgLyBkICsgKGcgPCBiID8gNiA6IDApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBnOlxuICAgICAgICAgICAgICAgIGggPSAoYiAtIHIpIC8gZCArIDI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGI6XG4gICAgICAgICAgICAgICAgaCA9IChyIC0gZykgLyBkICsgNDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaCAvPSA2O1xuICAgIH1cbiAgICByZXR1cm4geyBoOiBoLCBzOiBzLCBsOiBsIH07XG59XG5mdW5jdGlvbiBodWUycmdiKHAsIHEsIHQpIHtcbiAgICBpZiAodCA8IDApIHtcbiAgICAgICAgdCArPSAxO1xuICAgIH1cbiAgICBpZiAodCA+IDEpIHtcbiAgICAgICAgdCAtPSAxO1xuICAgIH1cbiAgICBpZiAodCA8IDEgLyA2KSB7XG4gICAgICAgIHJldHVybiBwICsgKHEgLSBwKSAqICg2ICogdCk7XG4gICAgfVxuICAgIGlmICh0IDwgMSAvIDIpIHtcbiAgICAgICAgcmV0dXJuIHE7XG4gICAgfVxuICAgIGlmICh0IDwgMiAvIDMpIHtcbiAgICAgICAgcmV0dXJuIHAgKyAocSAtIHApICogKDIgLyAzIC0gdCkgKiA2O1xuICAgIH1cbiAgICByZXR1cm4gcDtcbn1cbi8qKlxuICogQ29udmVydHMgYW4gSFNMIGNvbG9yIHZhbHVlIHRvIFJHQi5cbiAqXG4gKiAqQXNzdW1lczoqIGggaXMgY29udGFpbmVkIGluIFswLCAxXSBvciBbMCwgMzYwXSBhbmQgcyBhbmQgbCBhcmUgY29udGFpbmVkIFswLCAxXSBvciBbMCwgMTAwXVxuICogKlJldHVybnM6KiB7IHIsIGcsIGIgfSBpbiB0aGUgc2V0IFswLCAyNTVdXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoc2xUb1JnYihoLCBzLCBsKSB7XG4gICAgdmFyIHI7XG4gICAgdmFyIGc7XG4gICAgdmFyIGI7XG4gICAgaCA9IGJvdW5kMDEoaCwgMzYwKTtcbiAgICBzID0gYm91bmQwMShzLCAxMDApO1xuICAgIGwgPSBib3VuZDAxKGwsIDEwMCk7XG4gICAgaWYgKHMgPT09IDApIHtcbiAgICAgICAgLy8gYWNocm9tYXRpY1xuICAgICAgICBnID0gbDtcbiAgICAgICAgYiA9IGw7XG4gICAgICAgIHIgPSBsO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIHEgPSBsIDwgMC41ID8gbCAqICgxICsgcykgOiBsICsgcyAtIGwgKiBzO1xuICAgICAgICB2YXIgcCA9IDIgKiBsIC0gcTtcbiAgICAgICAgciA9IGh1ZTJyZ2IocCwgcSwgaCArIDEgLyAzKTtcbiAgICAgICAgZyA9IGh1ZTJyZ2IocCwgcSwgaCk7XG4gICAgICAgIGIgPSBodWUycmdiKHAsIHEsIGggLSAxIC8gMyk7XG4gICAgfVxuICAgIHJldHVybiB7IHI6IHIgKiAyNTUsIGc6IGcgKiAyNTUsIGI6IGIgKiAyNTUgfTtcbn1cbi8qKlxuICogQ29udmVydHMgYW4gUkdCIGNvbG9yIHZhbHVlIHRvIEhTVlxuICpcbiAqICpBc3N1bWVzOiogciwgZywgYW5kIGIgYXJlIGNvbnRhaW5lZCBpbiB0aGUgc2V0IFswLCAyNTVdIG9yIFswLCAxXVxuICogKlJldHVybnM6KiB7IGgsIHMsIHYgfSBpbiBbMCwxXVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmdiVG9Ic3YociwgZywgYikge1xuICAgIHIgPSBib3VuZDAxKHIsIDI1NSk7XG4gICAgZyA9IGJvdW5kMDEoZywgMjU1KTtcbiAgICBiID0gYm91bmQwMShiLCAyNTUpO1xuICAgIHZhciBtYXggPSBNYXRoLm1heChyLCBnLCBiKTtcbiAgICB2YXIgbWluID0gTWF0aC5taW4ociwgZywgYik7XG4gICAgdmFyIGggPSAwO1xuICAgIHZhciB2ID0gbWF4O1xuICAgIHZhciBkID0gbWF4IC0gbWluO1xuICAgIHZhciBzID0gbWF4ID09PSAwID8gMCA6IGQgLyBtYXg7XG4gICAgaWYgKG1heCA9PT0gbWluKSB7XG4gICAgICAgIGggPSAwOyAvLyBhY2hyb21hdGljXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzd2l0Y2ggKG1heCkge1xuICAgICAgICAgICAgY2FzZSByOlxuICAgICAgICAgICAgICAgIGggPSAoZyAtIGIpIC8gZCArIChnIDwgYiA/IDYgOiAwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgZzpcbiAgICAgICAgICAgICAgICBoID0gKGIgLSByKSAvIGQgKyAyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBiOlxuICAgICAgICAgICAgICAgIGggPSAociAtIGcpIC8gZCArIDQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGggLz0gNjtcbiAgICB9XG4gICAgcmV0dXJuIHsgaDogaCwgczogcywgdjogdiB9O1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhbiBIU1YgY29sb3IgdmFsdWUgdG8gUkdCLlxuICpcbiAqICpBc3N1bWVzOiogaCBpcyBjb250YWluZWQgaW4gWzAsIDFdIG9yIFswLCAzNjBdIGFuZCBzIGFuZCB2IGFyZSBjb250YWluZWQgaW4gWzAsIDFdIG9yIFswLCAxMDBdXG4gKiAqUmV0dXJuczoqIHsgciwgZywgYiB9IGluIHRoZSBzZXQgWzAsIDI1NV1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhzdlRvUmdiKGgsIHMsIHYpIHtcbiAgICBoID0gYm91bmQwMShoLCAzNjApICogNjtcbiAgICBzID0gYm91bmQwMShzLCAxMDApO1xuICAgIHYgPSBib3VuZDAxKHYsIDEwMCk7XG4gICAgdmFyIGkgPSBNYXRoLmZsb29yKGgpO1xuICAgIHZhciBmID0gaCAtIGk7XG4gICAgdmFyIHAgPSB2ICogKDEgLSBzKTtcbiAgICB2YXIgcSA9IHYgKiAoMSAtIGYgKiBzKTtcbiAgICB2YXIgdCA9IHYgKiAoMSAtICgxIC0gZikgKiBzKTtcbiAgICB2YXIgbW9kID0gaSAlIDY7XG4gICAgdmFyIHIgPSBbdiwgcSwgcCwgcCwgdCwgdl1bbW9kXTtcbiAgICB2YXIgZyA9IFt0LCB2LCB2LCBxLCBwLCBwXVttb2RdO1xuICAgIHZhciBiID0gW3AsIHAsIHQsIHYsIHYsIHFdW21vZF07XG4gICAgcmV0dXJuIHsgcjogciAqIDI1NSwgZzogZyAqIDI1NSwgYjogYiAqIDI1NSB9O1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhbiBSR0IgY29sb3IgdG8gaGV4XG4gKlxuICogQXNzdW1lcyByLCBnLCBhbmQgYiBhcmUgY29udGFpbmVkIGluIHRoZSBzZXQgWzAsIDI1NV1cbiAqIFJldHVybnMgYSAzIG9yIDYgY2hhcmFjdGVyIGhleFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmdiVG9IZXgociwgZywgYiwgYWxsb3czQ2hhcikge1xuICAgIHZhciBoZXggPSBbXG4gICAgICAgIHBhZDIoTWF0aC5yb3VuZChyKS50b1N0cmluZygxNikpLFxuICAgICAgICBwYWQyKE1hdGgucm91bmQoZykudG9TdHJpbmcoMTYpKSxcbiAgICAgICAgcGFkMihNYXRoLnJvdW5kKGIpLnRvU3RyaW5nKDE2KSksXG4gICAgXTtcbiAgICAvLyBSZXR1cm4gYSAzIGNoYXJhY3RlciBoZXggaWYgcG9zc2libGVcbiAgICBpZiAoYWxsb3czQ2hhciAmJlxuICAgICAgICBoZXhbMF0uc3RhcnRzV2l0aChoZXhbMF0uY2hhckF0KDEpKSAmJlxuICAgICAgICBoZXhbMV0uc3RhcnRzV2l0aChoZXhbMV0uY2hhckF0KDEpKSAmJlxuICAgICAgICBoZXhbMl0uc3RhcnRzV2l0aChoZXhbMl0uY2hhckF0KDEpKSkge1xuICAgICAgICByZXR1cm4gaGV4WzBdLmNoYXJBdCgwKSArIGhleFsxXS5jaGFyQXQoMCkgKyBoZXhbMl0uY2hhckF0KDApO1xuICAgIH1cbiAgICByZXR1cm4gaGV4LmpvaW4oJycpO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhbiBSR0JBIGNvbG9yIHBsdXMgYWxwaGEgdHJhbnNwYXJlbmN5IHRvIGhleFxuICpcbiAqIEFzc3VtZXMgciwgZywgYiBhcmUgY29udGFpbmVkIGluIHRoZSBzZXQgWzAsIDI1NV0gYW5kXG4gKiBhIGluIFswLCAxXS4gUmV0dXJucyBhIDQgb3IgOCBjaGFyYWN0ZXIgcmdiYSBoZXhcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXNcbmV4cG9ydCBmdW5jdGlvbiByZ2JhVG9IZXgociwgZywgYiwgYSwgYWxsb3c0Q2hhcikge1xuICAgIHZhciBoZXggPSBbXG4gICAgICAgIHBhZDIoTWF0aC5yb3VuZChyKS50b1N0cmluZygxNikpLFxuICAgICAgICBwYWQyKE1hdGgucm91bmQoZykudG9TdHJpbmcoMTYpKSxcbiAgICAgICAgcGFkMihNYXRoLnJvdW5kKGIpLnRvU3RyaW5nKDE2KSksXG4gICAgICAgIHBhZDIoY29udmVydERlY2ltYWxUb0hleChhKSksXG4gICAgXTtcbiAgICAvLyBSZXR1cm4gYSA0IGNoYXJhY3RlciBoZXggaWYgcG9zc2libGVcbiAgICBpZiAoYWxsb3c0Q2hhciAmJlxuICAgICAgICBoZXhbMF0uc3RhcnRzV2l0aChoZXhbMF0uY2hhckF0KDEpKSAmJlxuICAgICAgICBoZXhbMV0uc3RhcnRzV2l0aChoZXhbMV0uY2hhckF0KDEpKSAmJlxuICAgICAgICBoZXhbMl0uc3RhcnRzV2l0aChoZXhbMl0uY2hhckF0KDEpKSAmJlxuICAgICAgICBoZXhbM10uc3RhcnRzV2l0aChoZXhbM10uY2hhckF0KDEpKSkge1xuICAgICAgICByZXR1cm4gaGV4WzBdLmNoYXJBdCgwKSArIGhleFsxXS5jaGFyQXQoMCkgKyBoZXhbMl0uY2hhckF0KDApICsgaGV4WzNdLmNoYXJBdCgwKTtcbiAgICB9XG4gICAgcmV0dXJuIGhleC5qb2luKCcnKTtcbn1cbi8qKlxuICogQ29udmVydHMgYW4gUkdCQSBjb2xvciB0byBhbiBBUkdCIEhleDggc3RyaW5nXG4gKiBSYXJlbHkgdXNlZCwgYnV0IHJlcXVpcmVkIGZvciBcInRvRmlsdGVyKClcIlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmdiYVRvQXJnYkhleChyLCBnLCBiLCBhKSB7XG4gICAgdmFyIGhleCA9IFtcbiAgICAgICAgcGFkMihjb252ZXJ0RGVjaW1hbFRvSGV4KGEpKSxcbiAgICAgICAgcGFkMihNYXRoLnJvdW5kKHIpLnRvU3RyaW5nKDE2KSksXG4gICAgICAgIHBhZDIoTWF0aC5yb3VuZChnKS50b1N0cmluZygxNikpLFxuICAgICAgICBwYWQyKE1hdGgucm91bmQoYikudG9TdHJpbmcoMTYpKSxcbiAgICBdO1xuICAgIHJldHVybiBoZXguam9pbignJyk7XG59XG4vKiogQ29udmVydHMgYSBkZWNpbWFsIHRvIGEgaGV4IHZhbHVlICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydERlY2ltYWxUb0hleChkKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQocGFyc2VGbG9hdChkKSAqIDI1NSkudG9TdHJpbmcoMTYpO1xufVxuLyoqIENvbnZlcnRzIGEgaGV4IHZhbHVlIHRvIGEgZGVjaW1hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRIZXhUb0RlY2ltYWwoaCkge1xuICAgIHJldHVybiBwYXJzZUludEZyb21IZXgoaCkgLyAyNTU7XG59XG4vKiogUGFyc2UgYSBiYXNlLTE2IGhleCB2YWx1ZSBpbnRvIGEgYmFzZS0xMCBpbnRlZ2VyICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJbnRGcm9tSGV4KHZhbCkge1xuICAgIHJldHVybiBwYXJzZUludCh2YWwsIDE2KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJJbnB1dFRvT2JqZWN0KGNvbG9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcjogY29sb3IgPj4gMTYsXG4gICAgICAgIGc6IChjb2xvciAmIDB4ZmYwMCkgPj4gOCxcbiAgICAgICAgYjogY29sb3IgJiAweGZmLFxuICAgIH07XG59XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vYmFoYW1hczEwL2Nzcy1jb2xvci1uYW1lcy9ibG9iL21hc3Rlci9jc3MtY29sb3ItbmFtZXMuanNvblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCB2YXIgbmFtZXMgPSB7XG4gICAgYWxpY2VibHVlOiAnI2YwZjhmZicsXG4gICAgYW50aXF1ZXdoaXRlOiAnI2ZhZWJkNycsXG4gICAgYXF1YTogJyMwMGZmZmYnLFxuICAgIGFxdWFtYXJpbmU6ICcjN2ZmZmQ0JyxcbiAgICBhenVyZTogJyNmMGZmZmYnLFxuICAgIGJlaWdlOiAnI2Y1ZjVkYycsXG4gICAgYmlzcXVlOiAnI2ZmZTRjNCcsXG4gICAgYmxhY2s6ICcjMDAwMDAwJyxcbiAgICBibGFuY2hlZGFsbW9uZDogJyNmZmViY2QnLFxuICAgIGJsdWU6ICcjMDAwMGZmJyxcbiAgICBibHVldmlvbGV0OiAnIzhhMmJlMicsXG4gICAgYnJvd246ICcjYTUyYTJhJyxcbiAgICBidXJseXdvb2Q6ICcjZGViODg3JyxcbiAgICBjYWRldGJsdWU6ICcjNWY5ZWEwJyxcbiAgICBjaGFydHJldXNlOiAnIzdmZmYwMCcsXG4gICAgY2hvY29sYXRlOiAnI2QyNjkxZScsXG4gICAgY29yYWw6ICcjZmY3ZjUwJyxcbiAgICBjb3JuZmxvd2VyYmx1ZTogJyM2NDk1ZWQnLFxuICAgIGNvcm5zaWxrOiAnI2ZmZjhkYycsXG4gICAgY3JpbXNvbjogJyNkYzE0M2MnLFxuICAgIGN5YW46ICcjMDBmZmZmJyxcbiAgICBkYXJrYmx1ZTogJyMwMDAwOGInLFxuICAgIGRhcmtjeWFuOiAnIzAwOGI4YicsXG4gICAgZGFya2dvbGRlbnJvZDogJyNiODg2MGInLFxuICAgIGRhcmtncmF5OiAnI2E5YTlhOScsXG4gICAgZGFya2dyZWVuOiAnIzAwNjQwMCcsXG4gICAgZGFya2dyZXk6ICcjYTlhOWE5JyxcbiAgICBkYXJra2hha2k6ICcjYmRiNzZiJyxcbiAgICBkYXJrbWFnZW50YTogJyM4YjAwOGInLFxuICAgIGRhcmtvbGl2ZWdyZWVuOiAnIzU1NmIyZicsXG4gICAgZGFya29yYW5nZTogJyNmZjhjMDAnLFxuICAgIGRhcmtvcmNoaWQ6ICcjOTkzMmNjJyxcbiAgICBkYXJrcmVkOiAnIzhiMDAwMCcsXG4gICAgZGFya3NhbG1vbjogJyNlOTk2N2EnLFxuICAgIGRhcmtzZWFncmVlbjogJyM4ZmJjOGYnLFxuICAgIGRhcmtzbGF0ZWJsdWU6ICcjNDgzZDhiJyxcbiAgICBkYXJrc2xhdGVncmF5OiAnIzJmNGY0ZicsXG4gICAgZGFya3NsYXRlZ3JleTogJyMyZjRmNGYnLFxuICAgIGRhcmt0dXJxdW9pc2U6ICcjMDBjZWQxJyxcbiAgICBkYXJrdmlvbGV0OiAnIzk0MDBkMycsXG4gICAgZGVlcHBpbms6ICcjZmYxNDkzJyxcbiAgICBkZWVwc2t5Ymx1ZTogJyMwMGJmZmYnLFxuICAgIGRpbWdyYXk6ICcjNjk2OTY5JyxcbiAgICBkaW1ncmV5OiAnIzY5Njk2OScsXG4gICAgZG9kZ2VyYmx1ZTogJyMxZTkwZmYnLFxuICAgIGZpcmVicmljazogJyNiMjIyMjInLFxuICAgIGZsb3JhbHdoaXRlOiAnI2ZmZmFmMCcsXG4gICAgZm9yZXN0Z3JlZW46ICcjMjI4YjIyJyxcbiAgICBmdWNoc2lhOiAnI2ZmMDBmZicsXG4gICAgZ2FpbnNib3JvOiAnI2RjZGNkYycsXG4gICAgZ2hvc3R3aGl0ZTogJyNmOGY4ZmYnLFxuICAgIGdvbGRlbnJvZDogJyNkYWE1MjAnLFxuICAgIGdvbGQ6ICcjZmZkNzAwJyxcbiAgICBncmF5OiAnIzgwODA4MCcsXG4gICAgZ3JlZW46ICcjMDA4MDAwJyxcbiAgICBncmVlbnllbGxvdzogJyNhZGZmMmYnLFxuICAgIGdyZXk6ICcjODA4MDgwJyxcbiAgICBob25leWRldzogJyNmMGZmZjAnLFxuICAgIGhvdHBpbms6ICcjZmY2OWI0JyxcbiAgICBpbmRpYW5yZWQ6ICcjY2Q1YzVjJyxcbiAgICBpbmRpZ286ICcjNGIwMDgyJyxcbiAgICBpdm9yeTogJyNmZmZmZjAnLFxuICAgIGtoYWtpOiAnI2YwZTY4YycsXG4gICAgbGF2ZW5kZXJibHVzaDogJyNmZmYwZjUnLFxuICAgIGxhdmVuZGVyOiAnI2U2ZTZmYScsXG4gICAgbGF3bmdyZWVuOiAnIzdjZmMwMCcsXG4gICAgbGVtb25jaGlmZm9uOiAnI2ZmZmFjZCcsXG4gICAgbGlnaHRibHVlOiAnI2FkZDhlNicsXG4gICAgbGlnaHRjb3JhbDogJyNmMDgwODAnLFxuICAgIGxpZ2h0Y3lhbjogJyNlMGZmZmYnLFxuICAgIGxpZ2h0Z29sZGVucm9keWVsbG93OiAnI2ZhZmFkMicsXG4gICAgbGlnaHRncmF5OiAnI2QzZDNkMycsXG4gICAgbGlnaHRncmVlbjogJyM5MGVlOTAnLFxuICAgIGxpZ2h0Z3JleTogJyNkM2QzZDMnLFxuICAgIGxpZ2h0cGluazogJyNmZmI2YzEnLFxuICAgIGxpZ2h0c2FsbW9uOiAnI2ZmYTA3YScsXG4gICAgbGlnaHRzZWFncmVlbjogJyMyMGIyYWEnLFxuICAgIGxpZ2h0c2t5Ymx1ZTogJyM4N2NlZmEnLFxuICAgIGxpZ2h0c2xhdGVncmF5OiAnIzc3ODg5OScsXG4gICAgbGlnaHRzbGF0ZWdyZXk6ICcjNzc4ODk5JyxcbiAgICBsaWdodHN0ZWVsYmx1ZTogJyNiMGM0ZGUnLFxuICAgIGxpZ2h0eWVsbG93OiAnI2ZmZmZlMCcsXG4gICAgbGltZTogJyMwMGZmMDAnLFxuICAgIGxpbWVncmVlbjogJyMzMmNkMzInLFxuICAgIGxpbmVuOiAnI2ZhZjBlNicsXG4gICAgbWFnZW50YTogJyNmZjAwZmYnLFxuICAgIG1hcm9vbjogJyM4MDAwMDAnLFxuICAgIG1lZGl1bWFxdWFtYXJpbmU6ICcjNjZjZGFhJyxcbiAgICBtZWRpdW1ibHVlOiAnIzAwMDBjZCcsXG4gICAgbWVkaXVtb3JjaGlkOiAnI2JhNTVkMycsXG4gICAgbWVkaXVtcHVycGxlOiAnIzkzNzBkYicsXG4gICAgbWVkaXVtc2VhZ3JlZW46ICcjM2NiMzcxJyxcbiAgICBtZWRpdW1zbGF0ZWJsdWU6ICcjN2I2OGVlJyxcbiAgICBtZWRpdW1zcHJpbmdncmVlbjogJyMwMGZhOWEnLFxuICAgIG1lZGl1bXR1cnF1b2lzZTogJyM0OGQxY2MnLFxuICAgIG1lZGl1bXZpb2xldHJlZDogJyNjNzE1ODUnLFxuICAgIG1pZG5pZ2h0Ymx1ZTogJyMxOTE5NzAnLFxuICAgIG1pbnRjcmVhbTogJyNmNWZmZmEnLFxuICAgIG1pc3R5cm9zZTogJyNmZmU0ZTEnLFxuICAgIG1vY2Nhc2luOiAnI2ZmZTRiNScsXG4gICAgbmF2YWpvd2hpdGU6ICcjZmZkZWFkJyxcbiAgICBuYXZ5OiAnIzAwMDA4MCcsXG4gICAgb2xkbGFjZTogJyNmZGY1ZTYnLFxuICAgIG9saXZlOiAnIzgwODAwMCcsXG4gICAgb2xpdmVkcmFiOiAnIzZiOGUyMycsXG4gICAgb3JhbmdlOiAnI2ZmYTUwMCcsXG4gICAgb3JhbmdlcmVkOiAnI2ZmNDUwMCcsXG4gICAgb3JjaGlkOiAnI2RhNzBkNicsXG4gICAgcGFsZWdvbGRlbnJvZDogJyNlZWU4YWEnLFxuICAgIHBhbGVncmVlbjogJyM5OGZiOTgnLFxuICAgIHBhbGV0dXJxdW9pc2U6ICcjYWZlZWVlJyxcbiAgICBwYWxldmlvbGV0cmVkOiAnI2RiNzA5MycsXG4gICAgcGFwYXlhd2hpcDogJyNmZmVmZDUnLFxuICAgIHBlYWNocHVmZjogJyNmZmRhYjknLFxuICAgIHBlcnU6ICcjY2Q4NTNmJyxcbiAgICBwaW5rOiAnI2ZmYzBjYicsXG4gICAgcGx1bTogJyNkZGEwZGQnLFxuICAgIHBvd2RlcmJsdWU6ICcjYjBlMGU2JyxcbiAgICBwdXJwbGU6ICcjODAwMDgwJyxcbiAgICByZWJlY2NhcHVycGxlOiAnIzY2MzM5OScsXG4gICAgcmVkOiAnI2ZmMDAwMCcsXG4gICAgcm9zeWJyb3duOiAnI2JjOGY4ZicsXG4gICAgcm95YWxibHVlOiAnIzQxNjllMScsXG4gICAgc2FkZGxlYnJvd246ICcjOGI0NTEzJyxcbiAgICBzYWxtb246ICcjZmE4MDcyJyxcbiAgICBzYW5keWJyb3duOiAnI2Y0YTQ2MCcsXG4gICAgc2VhZ3JlZW46ICcjMmU4YjU3JyxcbiAgICBzZWFzaGVsbDogJyNmZmY1ZWUnLFxuICAgIHNpZW5uYTogJyNhMDUyMmQnLFxuICAgIHNpbHZlcjogJyNjMGMwYzAnLFxuICAgIHNreWJsdWU6ICcjODdjZWViJyxcbiAgICBzbGF0ZWJsdWU6ICcjNmE1YWNkJyxcbiAgICBzbGF0ZWdyYXk6ICcjNzA4MDkwJyxcbiAgICBzbGF0ZWdyZXk6ICcjNzA4MDkwJyxcbiAgICBzbm93OiAnI2ZmZmFmYScsXG4gICAgc3ByaW5nZ3JlZW46ICcjMDBmZjdmJyxcbiAgICBzdGVlbGJsdWU6ICcjNDY4MmI0JyxcbiAgICB0YW46ICcjZDJiNDhjJyxcbiAgICB0ZWFsOiAnIzAwODA4MCcsXG4gICAgdGhpc3RsZTogJyNkOGJmZDgnLFxuICAgIHRvbWF0bzogJyNmZjYzNDcnLFxuICAgIHR1cnF1b2lzZTogJyM0MGUwZDAnLFxuICAgIHZpb2xldDogJyNlZTgyZWUnLFxuICAgIHdoZWF0OiAnI2Y1ZGViMycsXG4gICAgd2hpdGU6ICcjZmZmZmZmJyxcbiAgICB3aGl0ZXNtb2tlOiAnI2Y1ZjVmNScsXG4gICAgeWVsbG93OiAnI2ZmZmYwMCcsXG4gICAgeWVsbG93Z3JlZW46ICcjOWFjZDMyJyxcbn07XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVkdW5kYW50LXR5cGUtY29uc3RpdHVlbnRzICovXG5pbXBvcnQgeyBjb252ZXJ0SGV4VG9EZWNpbWFsLCBoc2xUb1JnYiwgaHN2VG9SZ2IsIHBhcnNlSW50RnJvbUhleCwgcmdiVG9SZ2IgfSBmcm9tICcuL2NvbnZlcnNpb24nO1xuaW1wb3J0IHsgbmFtZXMgfSBmcm9tICcuL2Nzcy1jb2xvci1uYW1lcyc7XG5pbXBvcnQgeyBib3VuZEFscGhhLCBjb252ZXJ0VG9QZXJjZW50YWdlIH0gZnJvbSAnLi91dGlsJztcbi8qKlxuICogR2l2ZW4gYSBzdHJpbmcgb3Igb2JqZWN0LCBjb252ZXJ0IHRoYXQgaW5wdXQgdG8gUkdCXG4gKlxuICogUG9zc2libGUgc3RyaW5nIGlucHV0czpcbiAqIGBgYFxuICogXCJyZWRcIlxuICogXCIjZjAwXCIgb3IgXCJmMDBcIlxuICogXCIjZmYwMDAwXCIgb3IgXCJmZjAwMDBcIlxuICogXCIjZmYwMDAwMDBcIiBvciBcImZmMDAwMDAwXCJcbiAqIFwicmdiIDI1NSAwIDBcIiBvciBcInJnYiAoMjU1LCAwLCAwKVwiXG4gKiBcInJnYiAxLjAgMCAwXCIgb3IgXCJyZ2IgKDEsIDAsIDApXCJcbiAqIFwicmdiYSAoMjU1LCAwLCAwLCAxKVwiIG9yIFwicmdiYSAyNTUsIDAsIDAsIDFcIlxuICogXCJyZ2JhICgxLjAsIDAsIDAsIDEpXCIgb3IgXCJyZ2JhIDEuMCwgMCwgMCwgMVwiXG4gKiBcImhzbCgwLCAxMDAlLCA1MCUpXCIgb3IgXCJoc2wgMCAxMDAlIDUwJVwiXG4gKiBcImhzbGEoMCwgMTAwJSwgNTAlLCAxKVwiIG9yIFwiaHNsYSAwIDEwMCUgNTAlLCAxXCJcbiAqIFwiaHN2KDAsIDEwMCUsIDEwMCUpXCIgb3IgXCJoc3YgMCAxMDAlIDEwMCVcIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnB1dFRvUkdCKGNvbG9yKSB7XG4gICAgdmFyIHJnYiA9IHsgcjogMCwgZzogMCwgYjogMCB9O1xuICAgIHZhciBhID0gMTtcbiAgICB2YXIgcyA9IG51bGw7XG4gICAgdmFyIHYgPSBudWxsO1xuICAgIHZhciBsID0gbnVsbDtcbiAgICB2YXIgb2sgPSBmYWxzZTtcbiAgICB2YXIgZm9ybWF0ID0gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiBjb2xvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29sb3IgPSBzdHJpbmdJbnB1dFRvT2JqZWN0KGNvbG9yKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb2xvciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGlzVmFsaWRDU1NVbml0KGNvbG9yLnIpICYmIGlzVmFsaWRDU1NVbml0KGNvbG9yLmcpICYmIGlzVmFsaWRDU1NVbml0KGNvbG9yLmIpKSB7XG4gICAgICAgICAgICByZ2IgPSByZ2JUb1JnYihjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iKTtcbiAgICAgICAgICAgIG9rID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvcm1hdCA9IFN0cmluZyhjb2xvci5yKS5zdWJzdHIoLTEpID09PSAnJScgPyAncHJnYicgOiAncmdiJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1ZhbGlkQ1NTVW5pdChjb2xvci5oKSAmJiBpc1ZhbGlkQ1NTVW5pdChjb2xvci5zKSAmJiBpc1ZhbGlkQ1NTVW5pdChjb2xvci52KSkge1xuICAgICAgICAgICAgcyA9IGNvbnZlcnRUb1BlcmNlbnRhZ2UoY29sb3Iucyk7XG4gICAgICAgICAgICB2ID0gY29udmVydFRvUGVyY2VudGFnZShjb2xvci52KTtcbiAgICAgICAgICAgIHJnYiA9IGhzdlRvUmdiKGNvbG9yLmgsIHMsIHYpO1xuICAgICAgICAgICAgb2sgPSB0cnVlO1xuICAgICAgICAgICAgZm9ybWF0ID0gJ2hzdic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNWYWxpZENTU1VuaXQoY29sb3IuaCkgJiYgaXNWYWxpZENTU1VuaXQoY29sb3IucykgJiYgaXNWYWxpZENTU1VuaXQoY29sb3IubCkpIHtcbiAgICAgICAgICAgIHMgPSBjb252ZXJ0VG9QZXJjZW50YWdlKGNvbG9yLnMpO1xuICAgICAgICAgICAgbCA9IGNvbnZlcnRUb1BlcmNlbnRhZ2UoY29sb3IubCk7XG4gICAgICAgICAgICByZ2IgPSBoc2xUb1JnYihjb2xvci5oLCBzLCBsKTtcbiAgICAgICAgICAgIG9rID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvcm1hdCA9ICdoc2wnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29sb3IsICdhJykpIHtcbiAgICAgICAgICAgIGEgPSBjb2xvci5hO1xuICAgICAgICB9XG4gICAgfVxuICAgIGEgPSBib3VuZEFscGhhKGEpO1xuICAgIHJldHVybiB7XG4gICAgICAgIG9rOiBvayxcbiAgICAgICAgZm9ybWF0OiBjb2xvci5mb3JtYXQgfHwgZm9ybWF0LFxuICAgICAgICByOiBNYXRoLm1pbigyNTUsIE1hdGgubWF4KHJnYi5yLCAwKSksXG4gICAgICAgIGc6IE1hdGgubWluKDI1NSwgTWF0aC5tYXgocmdiLmcsIDApKSxcbiAgICAgICAgYjogTWF0aC5taW4oMjU1LCBNYXRoLm1heChyZ2IuYiwgMCkpLFxuICAgICAgICBhOiBhLFxuICAgIH07XG59XG4vLyA8aHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy12YWx1ZXMvI2ludGVnZXJzPlxudmFyIENTU19JTlRFR0VSID0gJ1stXFxcXCtdP1xcXFxkKyU/Jztcbi8vIDxodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXZhbHVlcy8jbnVtYmVyLXZhbHVlPlxudmFyIENTU19OVU1CRVIgPSAnWy1cXFxcK10/XFxcXGQqXFxcXC5cXFxcZCslPyc7XG4vLyBBbGxvdyBwb3NpdGl2ZS9uZWdhdGl2ZSBpbnRlZ2VyL251bWJlci4gIERvbid0IGNhcHR1cmUgdGhlIGVpdGhlci9vciwganVzdCB0aGUgZW50aXJlIG91dGNvbWUuXG52YXIgQ1NTX1VOSVQgPSBcIig/OlwiLmNvbmNhdChDU1NfTlVNQkVSLCBcIil8KD86XCIpLmNvbmNhdChDU1NfSU5URUdFUiwgXCIpXCIpO1xuLy8gQWN0dWFsIG1hdGNoaW5nLlxuLy8gUGFyZW50aGVzZXMgYW5kIGNvbW1hcyBhcmUgb3B0aW9uYWwsIGJ1dCBub3QgcmVxdWlyZWQuXG4vLyBXaGl0ZXNwYWNlIGNhbiB0YWtlIHRoZSBwbGFjZSBvZiBjb21tYXMgb3Igb3BlbmluZyBwYXJlblxudmFyIFBFUk1JU1NJVkVfTUFUQ0gzID0gXCJbXFxcXHN8XFxcXChdKyhcIi5jb25jYXQoQ1NTX1VOSVQsIFwiKVssfFxcXFxzXSsoXCIpLmNvbmNhdChDU1NfVU5JVCwgXCIpWyx8XFxcXHNdKyhcIikuY29uY2F0KENTU19VTklULCBcIilcXFxccypcXFxcKT9cIik7XG52YXIgUEVSTUlTU0lWRV9NQVRDSDQgPSBcIltcXFxcc3xcXFxcKF0rKFwiLmNvbmNhdChDU1NfVU5JVCwgXCIpWyx8XFxcXHNdKyhcIikuY29uY2F0KENTU19VTklULCBcIilbLHxcXFxcc10rKFwiKS5jb25jYXQoQ1NTX1VOSVQsIFwiKVssfFxcXFxzXSsoXCIpLmNvbmNhdChDU1NfVU5JVCwgXCIpXFxcXHMqXFxcXCk/XCIpO1xudmFyIG1hdGNoZXJzID0ge1xuICAgIENTU19VTklUOiBuZXcgUmVnRXhwKENTU19VTklUKSxcbiAgICByZ2I6IG5ldyBSZWdFeHAoJ3JnYicgKyBQRVJNSVNTSVZFX01BVENIMyksXG4gICAgcmdiYTogbmV3IFJlZ0V4cCgncmdiYScgKyBQRVJNSVNTSVZFX01BVENINCksXG4gICAgaHNsOiBuZXcgUmVnRXhwKCdoc2wnICsgUEVSTUlTU0lWRV9NQVRDSDMpLFxuICAgIGhzbGE6IG5ldyBSZWdFeHAoJ2hzbGEnICsgUEVSTUlTU0lWRV9NQVRDSDQpLFxuICAgIGhzdjogbmV3IFJlZ0V4cCgnaHN2JyArIFBFUk1JU1NJVkVfTUFUQ0gzKSxcbiAgICBoc3ZhOiBuZXcgUmVnRXhwKCdoc3ZhJyArIFBFUk1JU1NJVkVfTUFUQ0g0KSxcbiAgICBoZXgzOiAvXiM/KFswLTlhLWZBLUZdezF9KShbMC05YS1mQS1GXXsxfSkoWzAtOWEtZkEtRl17MX0pJC8sXG4gICAgaGV4NjogL14jPyhbMC05YS1mQS1GXXsyfSkoWzAtOWEtZkEtRl17Mn0pKFswLTlhLWZBLUZdezJ9KSQvLFxuICAgIGhleDQ6IC9eIz8oWzAtOWEtZkEtRl17MX0pKFswLTlhLWZBLUZdezF9KShbMC05YS1mQS1GXXsxfSkoWzAtOWEtZkEtRl17MX0pJC8sXG4gICAgaGV4ODogL14jPyhbMC05YS1mQS1GXXsyfSkoWzAtOWEtZkEtRl17Mn0pKFswLTlhLWZBLUZdezJ9KShbMC05YS1mQS1GXXsyfSkkLyxcbn07XG4vKipcbiAqIFBlcm1pc3NpdmUgc3RyaW5nIHBhcnNpbmcuICBUYWtlIGluIGEgbnVtYmVyIG9mIGZvcm1hdHMsIGFuZCBvdXRwdXQgYW4gb2JqZWN0XG4gKiBiYXNlZCBvbiBkZXRlY3RlZCBmb3JtYXQuICBSZXR1cm5zIGB7IHIsIGcsIGIgfWAgb3IgYHsgaCwgcywgbCB9YCBvciBgeyBoLCBzLCB2fWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0lucHV0VG9PYmplY3QoY29sb3IpIHtcbiAgICBjb2xvciA9IGNvbG9yLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChjb2xvci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgbmFtZWQgPSBmYWxzZTtcbiAgICBpZiAobmFtZXNbY29sb3JdKSB7XG4gICAgICAgIGNvbG9yID0gbmFtZXNbY29sb3JdO1xuICAgICAgICBuYW1lZCA9IHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvbG9yID09PSAndHJhbnNwYXJlbnQnKSB7XG4gICAgICAgIHJldHVybiB7IHI6IDAsIGc6IDAsIGI6IDAsIGE6IDAsIGZvcm1hdDogJ25hbWUnIH07XG4gICAgfVxuICAgIC8vIFRyeSB0byBtYXRjaCBzdHJpbmcgaW5wdXQgdXNpbmcgcmVndWxhciBleHByZXNzaW9ucy5cbiAgICAvLyBLZWVwIG1vc3Qgb2YgdGhlIG51bWJlciBib3VuZGluZyBvdXQgb2YgdGhpcyBmdW5jdGlvbiAtIGRvbid0IHdvcnJ5IGFib3V0IFswLDFdIG9yIFswLDEwMF0gb3IgWzAsMzYwXVxuICAgIC8vIEp1c3QgcmV0dXJuIGFuIG9iamVjdCBhbmQgbGV0IHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBoYW5kbGUgdGhhdC5cbiAgICAvLyBUaGlzIHdheSB0aGUgcmVzdWx0IHdpbGwgYmUgdGhlIHNhbWUgd2hldGhlciB0aGUgdGlueWNvbG9yIGlzIGluaXRpYWxpemVkIHdpdGggc3RyaW5nIG9yIG9iamVjdC5cbiAgICB2YXIgbWF0Y2ggPSBtYXRjaGVycy5yZ2IuZXhlYyhjb2xvcik7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiB7IHI6IG1hdGNoWzFdLCBnOiBtYXRjaFsyXSwgYjogbWF0Y2hbM10gfTtcbiAgICB9XG4gICAgbWF0Y2ggPSBtYXRjaGVycy5yZ2JhLmV4ZWMoY29sb3IpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4geyByOiBtYXRjaFsxXSwgZzogbWF0Y2hbMl0sIGI6IG1hdGNoWzNdLCBhOiBtYXRjaFs0XSB9O1xuICAgIH1cbiAgICBtYXRjaCA9IG1hdGNoZXJzLmhzbC5leGVjKGNvbG9yKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHsgaDogbWF0Y2hbMV0sIHM6IG1hdGNoWzJdLCBsOiBtYXRjaFszXSB9O1xuICAgIH1cbiAgICBtYXRjaCA9IG1hdGNoZXJzLmhzbGEuZXhlYyhjb2xvcik7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiB7IGg6IG1hdGNoWzFdLCBzOiBtYXRjaFsyXSwgbDogbWF0Y2hbM10sIGE6IG1hdGNoWzRdIH07XG4gICAgfVxuICAgIG1hdGNoID0gbWF0Y2hlcnMuaHN2LmV4ZWMoY29sb3IpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4geyBoOiBtYXRjaFsxXSwgczogbWF0Y2hbMl0sIHY6IG1hdGNoWzNdIH07XG4gICAgfVxuICAgIG1hdGNoID0gbWF0Y2hlcnMuaHN2YS5leGVjKGNvbG9yKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHsgaDogbWF0Y2hbMV0sIHM6IG1hdGNoWzJdLCB2OiBtYXRjaFszXSwgYTogbWF0Y2hbNF0gfTtcbiAgICB9XG4gICAgbWF0Y2ggPSBtYXRjaGVycy5oZXg4LmV4ZWMoY29sb3IpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcjogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzFdKSxcbiAgICAgICAgICAgIGc6IHBhcnNlSW50RnJvbUhleChtYXRjaFsyXSksXG4gICAgICAgICAgICBiOiBwYXJzZUludEZyb21IZXgobWF0Y2hbM10pLFxuICAgICAgICAgICAgYTogY29udmVydEhleFRvRGVjaW1hbChtYXRjaFs0XSksXG4gICAgICAgICAgICBmb3JtYXQ6IG5hbWVkID8gJ25hbWUnIDogJ2hleDgnLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBtYXRjaCA9IG1hdGNoZXJzLmhleDYuZXhlYyhjb2xvcik7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMV0pLFxuICAgICAgICAgICAgZzogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzJdKSxcbiAgICAgICAgICAgIGI6IHBhcnNlSW50RnJvbUhleChtYXRjaFszXSksXG4gICAgICAgICAgICBmb3JtYXQ6IG5hbWVkID8gJ25hbWUnIDogJ2hleCcsXG4gICAgICAgIH07XG4gICAgfVxuICAgIG1hdGNoID0gbWF0Y2hlcnMuaGV4NC5leGVjKGNvbG9yKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHI6IHBhcnNlSW50RnJvbUhleChtYXRjaFsxXSArIG1hdGNoWzFdKSxcbiAgICAgICAgICAgIGc6IHBhcnNlSW50RnJvbUhleChtYXRjaFsyXSArIG1hdGNoWzJdKSxcbiAgICAgICAgICAgIGI6IHBhcnNlSW50RnJvbUhleChtYXRjaFszXSArIG1hdGNoWzNdKSxcbiAgICAgICAgICAgIGE6IGNvbnZlcnRIZXhUb0RlY2ltYWwobWF0Y2hbNF0gKyBtYXRjaFs0XSksXG4gICAgICAgICAgICBmb3JtYXQ6IG5hbWVkID8gJ25hbWUnIDogJ2hleDgnLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBtYXRjaCA9IG1hdGNoZXJzLmhleDMuZXhlYyhjb2xvcik7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMV0gKyBtYXRjaFsxXSksXG4gICAgICAgICAgICBnOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMl0gKyBtYXRjaFsyXSksXG4gICAgICAgICAgICBiOiBwYXJzZUludEZyb21IZXgobWF0Y2hbM10gKyBtYXRjaFszXSksXG4gICAgICAgICAgICBmb3JtYXQ6IG5hbWVkID8gJ25hbWUnIDogJ2hleCcsXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogQ2hlY2sgdG8gc2VlIGlmIGl0IGxvb2tzIGxpa2UgYSBDU1MgdW5pdFxuICogKHNlZSBgbWF0Y2hlcnNgIGFib3ZlIGZvciBkZWZpbml0aW9uKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRDU1NVbml0KGNvbG9yKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4obWF0Y2hlcnMuQ1NTX1VOSVQuZXhlYyhTdHJpbmcoY29sb3IpKSk7XG59XG4iLCJpbXBvcnQgeyBudW1iZXJJbnB1dFRvT2JqZWN0LCByZ2JhVG9IZXgsIHJnYlRvSGV4LCByZ2JUb0hzbCwgcmdiVG9Ic3YgfSBmcm9tICcuL2NvbnZlcnNpb24nO1xuaW1wb3J0IHsgbmFtZXMgfSBmcm9tICcuL2Nzcy1jb2xvci1uYW1lcyc7XG5pbXBvcnQgeyBpbnB1dFRvUkdCIH0gZnJvbSAnLi9mb3JtYXQtaW5wdXQnO1xuaW1wb3J0IHsgYm91bmQwMSwgYm91bmRBbHBoYSwgY2xhbXAwMSB9IGZyb20gJy4vdXRpbCc7XG52YXIgVGlueUNvbG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRpbnlDb2xvcihjb2xvciwgb3B0cykge1xuICAgICAgICBpZiAoY29sb3IgPT09IHZvaWQgMCkgeyBjb2xvciA9ICcnOyB9XG4gICAgICAgIGlmIChvcHRzID09PSB2b2lkIDApIHsgb3B0cyA9IHt9OyB9XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgLy8gSWYgaW5wdXQgaXMgYWxyZWFkeSBhIHRpbnljb2xvciwgcmV0dXJuIGl0c2VsZlxuICAgICAgICBpZiAoY29sb3IgaW5zdGFuY2VvZiBUaW55Q29sb3IpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdHJ1Y3Rvci1yZXR1cm5cbiAgICAgICAgICAgIHJldHVybiBjb2xvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbG9yID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgY29sb3IgPSBudW1iZXJJbnB1dFRvT2JqZWN0KGNvbG9yKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9yaWdpbmFsSW5wdXQgPSBjb2xvcjtcbiAgICAgICAgdmFyIHJnYiA9IGlucHV0VG9SR0IoY29sb3IpO1xuICAgICAgICB0aGlzLm9yaWdpbmFsSW5wdXQgPSBjb2xvcjtcbiAgICAgICAgdGhpcy5yID0gcmdiLnI7XG4gICAgICAgIHRoaXMuZyA9IHJnYi5nO1xuICAgICAgICB0aGlzLmIgPSByZ2IuYjtcbiAgICAgICAgdGhpcy5hID0gcmdiLmE7XG4gICAgICAgIHRoaXMucm91bmRBID0gTWF0aC5yb3VuZCgxMDAgKiB0aGlzLmEpIC8gMTAwO1xuICAgICAgICB0aGlzLmZvcm1hdCA9IChfYSA9IG9wdHMuZm9ybWF0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiByZ2IuZm9ybWF0O1xuICAgICAgICB0aGlzLmdyYWRpZW50VHlwZSA9IG9wdHMuZ3JhZGllbnRUeXBlO1xuICAgICAgICAvLyBEb24ndCBsZXQgdGhlIHJhbmdlIG9mIFswLDI1NV0gY29tZSBiYWNrIGluIFswLDFdLlxuICAgICAgICAvLyBQb3RlbnRpYWxseSBsb3NlIGEgbGl0dGxlIGJpdCBvZiBwcmVjaXNpb24gaGVyZSwgYnV0IHdpbGwgZml4IGlzc3VlcyB3aGVyZVxuICAgICAgICAvLyAuNSBnZXRzIGludGVycHJldGVkIGFzIGhhbGYgb2YgdGhlIHRvdGFsLCBpbnN0ZWFkIG9mIGhhbGYgb2YgMVxuICAgICAgICAvLyBJZiBpdCB3YXMgc3VwcG9zZWQgdG8gYmUgMTI4LCB0aGlzIHdhcyBhbHJlYWR5IHRha2VuIGNhcmUgb2YgYnkgYGlucHV0VG9SZ2JgXG4gICAgICAgIGlmICh0aGlzLnIgPCAxKSB7XG4gICAgICAgICAgICB0aGlzLnIgPSBNYXRoLnJvdW5kKHRoaXMucik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZyA8IDEpIHtcbiAgICAgICAgICAgIHRoaXMuZyA9IE1hdGgucm91bmQodGhpcy5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5iIDwgMSkge1xuICAgICAgICAgICAgdGhpcy5iID0gTWF0aC5yb3VuZCh0aGlzLmIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNWYWxpZCA9IHJnYi5vaztcbiAgICB9XG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS5pc0RhcmsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJyaWdodG5lc3MoKSA8IDEyODtcbiAgICB9O1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUuaXNMaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzRGFyaygpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcGVyY2VpdmVkIGJyaWdodG5lc3Mgb2YgdGhlIGNvbG9yLCBmcm9tIDAtMjU1LlxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUuZ2V0QnJpZ2h0bmVzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvQUVSVCNjb2xvci1jb250cmFzdFxuICAgICAgICB2YXIgcmdiID0gdGhpcy50b1JnYigpO1xuICAgICAgICByZXR1cm4gKHJnYi5yICogMjk5ICsgcmdiLmcgKiA1ODcgKyByZ2IuYiAqIDExNCkgLyAxMDAwO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcGVyY2VpdmVkIGx1bWluYW5jZSBvZiBhIGNvbG9yLCBmcm9tIDAtMS5cbiAgICAgKi9cbiAgICBUaW55Q29sb3IucHJvdG90eXBlLmdldEx1bWluYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwOC9SRUMtV0NBRzIwLTIwMDgxMjExLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuICAgICAgICB2YXIgcmdiID0gdGhpcy50b1JnYigpO1xuICAgICAgICB2YXIgUjtcbiAgICAgICAgdmFyIEc7XG4gICAgICAgIHZhciBCO1xuICAgICAgICB2YXIgUnNSR0IgPSByZ2IuciAvIDI1NTtcbiAgICAgICAgdmFyIEdzUkdCID0gcmdiLmcgLyAyNTU7XG4gICAgICAgIHZhciBCc1JHQiA9IHJnYi5iIC8gMjU1O1xuICAgICAgICBpZiAoUnNSR0IgPD0gMC4wMzkyOCkge1xuICAgICAgICAgICAgUiA9IFJzUkdCIC8gMTIuOTI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWV4cG9uZW50aWF0aW9uLW9wZXJhdG9yXG4gICAgICAgICAgICBSID0gTWF0aC5wb3coKFJzUkdCICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEdzUkdCIDw9IDAuMDM5MjgpIHtcbiAgICAgICAgICAgIEcgPSBHc1JHQiAvIDEyLjkyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1leHBvbmVudGlhdGlvbi1vcGVyYXRvclxuICAgICAgICAgICAgRyA9IE1hdGgucG93KChHc1JHQiArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChCc1JHQiA8PSAwLjAzOTI4KSB7XG4gICAgICAgICAgICBCID0gQnNSR0IgLyAxMi45MjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItZXhwb25lbnRpYXRpb24tb3BlcmF0b3JcbiAgICAgICAgICAgIEIgPSBNYXRoLnBvdygoQnNSR0IgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMC4yMTI2ICogUiArIDAuNzE1MiAqIEcgKyAwLjA3MjIgKiBCO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYWxwaGEgdmFsdWUgb2YgYSBjb2xvciwgZnJvbSAwLTEuXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS5nZXRBbHBoYSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGFscGhhIHZhbHVlIG9uIHRoZSBjdXJyZW50IGNvbG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFscGhhIC0gVGhlIG5ldyBhbHBoYSB2YWx1ZS4gVGhlIGFjY2VwdGVkIHJhbmdlIGlzIDAtMS5cbiAgICAgKi9cbiAgICBUaW55Q29sb3IucHJvdG90eXBlLnNldEFscGhhID0gZnVuY3Rpb24gKGFscGhhKSB7XG4gICAgICAgIHRoaXMuYSA9IGJvdW5kQWxwaGEoYWxwaGEpO1xuICAgICAgICB0aGlzLnJvdW5kQSA9IE1hdGgucm91bmQoMTAwICogdGhpcy5hKSAvIDEwMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbG9yIGlzIG1vbm9jaHJvbWUuXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS5pc01vbm9jaHJvbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzID0gdGhpcy50b0hzbCgpLnM7XG4gICAgICAgIHJldHVybiBzID09PSAwO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgb2JqZWN0IGFzIGEgSFNWQSBvYmplY3QuXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS50b0hzdiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGhzdiA9IHJnYlRvSHN2KHRoaXMuciwgdGhpcy5nLCB0aGlzLmIpO1xuICAgICAgICByZXR1cm4geyBoOiBoc3YuaCAqIDM2MCwgczogaHN2LnMsIHY6IGhzdi52LCBhOiB0aGlzLmEgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGhzdmEgdmFsdWVzIGludGVycG9sYXRlZCBpbnRvIGEgc3RyaW5nIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gICAgICogXCJoc3ZhKHh4eCwgeHh4LCB4eHgsIHh4KVwiLlxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudG9Ic3ZTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBoc3YgPSByZ2JUb0hzdih0aGlzLnIsIHRoaXMuZywgdGhpcy5iKTtcbiAgICAgICAgdmFyIGggPSBNYXRoLnJvdW5kKGhzdi5oICogMzYwKTtcbiAgICAgICAgdmFyIHMgPSBNYXRoLnJvdW5kKGhzdi5zICogMTAwKTtcbiAgICAgICAgdmFyIHYgPSBNYXRoLnJvdW5kKGhzdi52ICogMTAwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYSA9PT0gMSA/IFwiaHN2KFwiLmNvbmNhdChoLCBcIiwgXCIpLmNvbmNhdChzLCBcIiUsIFwiKS5jb25jYXQodiwgXCIlKVwiKSA6IFwiaHN2YShcIi5jb25jYXQoaCwgXCIsIFwiKS5jb25jYXQocywgXCIlLCBcIikuY29uY2F0KHYsIFwiJSwgXCIpLmNvbmNhdCh0aGlzLnJvdW5kQSwgXCIpXCIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgb2JqZWN0IGFzIGEgSFNMQSBvYmplY3QuXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS50b0hzbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGhzbCA9IHJnYlRvSHNsKHRoaXMuciwgdGhpcy5nLCB0aGlzLmIpO1xuICAgICAgICByZXR1cm4geyBoOiBoc2wuaCAqIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sLCBhOiB0aGlzLmEgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGhzbGEgdmFsdWVzIGludGVycG9sYXRlZCBpbnRvIGEgc3RyaW5nIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gICAgICogXCJoc2xhKHh4eCwgeHh4LCB4eHgsIHh4KVwiLlxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudG9Ic2xTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBoc2wgPSByZ2JUb0hzbCh0aGlzLnIsIHRoaXMuZywgdGhpcy5iKTtcbiAgICAgICAgdmFyIGggPSBNYXRoLnJvdW5kKGhzbC5oICogMzYwKTtcbiAgICAgICAgdmFyIHMgPSBNYXRoLnJvdW5kKGhzbC5zICogMTAwKTtcbiAgICAgICAgdmFyIGwgPSBNYXRoLnJvdW5kKGhzbC5sICogMTAwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYSA9PT0gMSA/IFwiaHNsKFwiLmNvbmNhdChoLCBcIiwgXCIpLmNvbmNhdChzLCBcIiUsIFwiKS5jb25jYXQobCwgXCIlKVwiKSA6IFwiaHNsYShcIi5jb25jYXQoaCwgXCIsIFwiKS5jb25jYXQocywgXCIlLCBcIikuY29uY2F0KGwsIFwiJSwgXCIpLmNvbmNhdCh0aGlzLnJvdW5kQSwgXCIpXCIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaGV4IHZhbHVlIG9mIHRoZSBjb2xvci5cbiAgICAgKiBAcGFyYW0gYWxsb3czQ2hhciB3aWxsIHNob3J0ZW4gaGV4IHZhbHVlIHRvIDMgY2hhciBpZiBwb3NzaWJsZVxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudG9IZXggPSBmdW5jdGlvbiAoYWxsb3czQ2hhcikge1xuICAgICAgICBpZiAoYWxsb3czQ2hhciA9PT0gdm9pZCAwKSB7IGFsbG93M0NoYXIgPSBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gcmdiVG9IZXgodGhpcy5yLCB0aGlzLmcsIHRoaXMuYiwgYWxsb3czQ2hhcik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBoZXggdmFsdWUgb2YgdGhlIGNvbG9yIC13aXRoIGEgIyBwcmVmaXhlZC5cbiAgICAgKiBAcGFyYW0gYWxsb3czQ2hhciB3aWxsIHNob3J0ZW4gaGV4IHZhbHVlIHRvIDMgY2hhciBpZiBwb3NzaWJsZVxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudG9IZXhTdHJpbmcgPSBmdW5jdGlvbiAoYWxsb3czQ2hhcikge1xuICAgICAgICBpZiAoYWxsb3czQ2hhciA9PT0gdm9pZCAwKSB7IGFsbG93M0NoYXIgPSBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gJyMnICsgdGhpcy50b0hleChhbGxvdzNDaGFyKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGhleCA4IHZhbHVlIG9mIHRoZSBjb2xvci5cbiAgICAgKiBAcGFyYW0gYWxsb3c0Q2hhciB3aWxsIHNob3J0ZW4gaGV4IHZhbHVlIHRvIDQgY2hhciBpZiBwb3NzaWJsZVxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudG9IZXg4ID0gZnVuY3Rpb24gKGFsbG93NENoYXIpIHtcbiAgICAgICAgaWYgKGFsbG93NENoYXIgPT09IHZvaWQgMCkgeyBhbGxvdzRDaGFyID0gZmFsc2U7IH1cbiAgICAgICAgcmV0dXJuIHJnYmFUb0hleCh0aGlzLnIsIHRoaXMuZywgdGhpcy5iLCB0aGlzLmEsIGFsbG93NENoYXIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaGV4IDggdmFsdWUgb2YgdGhlIGNvbG9yIC13aXRoIGEgIyBwcmVmaXhlZC5cbiAgICAgKiBAcGFyYW0gYWxsb3c0Q2hhciB3aWxsIHNob3J0ZW4gaGV4IHZhbHVlIHRvIDQgY2hhciBpZiBwb3NzaWJsZVxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudG9IZXg4U3RyaW5nID0gZnVuY3Rpb24gKGFsbG93NENoYXIpIHtcbiAgICAgICAgaWYgKGFsbG93NENoYXIgPT09IHZvaWQgMCkgeyBhbGxvdzRDaGFyID0gZmFsc2U7IH1cbiAgICAgICAgcmV0dXJuICcjJyArIHRoaXMudG9IZXg4KGFsbG93NENoYXIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2hvcnRlciBoZXggdmFsdWUgb2YgdGhlIGNvbG9yIGRlcGVuZHMgb24gaXRzIGFscGhhIC13aXRoIGEgIyBwcmVmaXhlZC5cbiAgICAgKiBAcGFyYW0gYWxsb3dTaG9ydENoYXIgd2lsbCBzaG9ydGVuIGhleCB2YWx1ZSB0byAzIG9yIDQgY2hhciBpZiBwb3NzaWJsZVxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudG9IZXhTaG9ydFN0cmluZyA9IGZ1bmN0aW9uIChhbGxvd1Nob3J0Q2hhcikge1xuICAgICAgICBpZiAoYWxsb3dTaG9ydENoYXIgPT09IHZvaWQgMCkgeyBhbGxvd1Nob3J0Q2hhciA9IGZhbHNlOyB9XG4gICAgICAgIHJldHVybiB0aGlzLmEgPT09IDEgPyB0aGlzLnRvSGV4U3RyaW5nKGFsbG93U2hvcnRDaGFyKSA6IHRoaXMudG9IZXg4U3RyaW5nKGFsbG93U2hvcnRDaGFyKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG9iamVjdCBhcyBhIFJHQkEgb2JqZWN0LlxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudG9SZ2IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByOiBNYXRoLnJvdW5kKHRoaXMuciksXG4gICAgICAgICAgICBnOiBNYXRoLnJvdW5kKHRoaXMuZyksXG4gICAgICAgICAgICBiOiBNYXRoLnJvdW5kKHRoaXMuYiksXG4gICAgICAgICAgICBhOiB0aGlzLmEsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBSR0JBIHZhbHVlcyBpbnRlcnBvbGF0ZWQgaW50byBhIHN0cmluZyB3aXRoIHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuICAgICAqIFwiUkdCQSh4eHgsIHh4eCwgeHh4LCB4eClcIi5cbiAgICAgKi9cbiAgICBUaW55Q29sb3IucHJvdG90eXBlLnRvUmdiU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgciA9IE1hdGgucm91bmQodGhpcy5yKTtcbiAgICAgICAgdmFyIGcgPSBNYXRoLnJvdW5kKHRoaXMuZyk7XG4gICAgICAgIHZhciBiID0gTWF0aC5yb3VuZCh0aGlzLmIpO1xuICAgICAgICByZXR1cm4gdGhpcy5hID09PSAxID8gXCJyZ2IoXCIuY29uY2F0KHIsIFwiLCBcIikuY29uY2F0KGcsIFwiLCBcIikuY29uY2F0KGIsIFwiKVwiKSA6IFwicmdiYShcIi5jb25jYXQociwgXCIsIFwiKS5jb25jYXQoZywgXCIsIFwiKS5jb25jYXQoYiwgXCIsIFwiKS5jb25jYXQodGhpcy5yb3VuZEEsIFwiKVwiKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG9iamVjdCBhcyBhIFJHQkEgb2JqZWN0LlxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudG9QZXJjZW50YWdlUmdiID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZm10ID0gZnVuY3Rpb24gKHgpIHsgcmV0dXJuIFwiXCIuY29uY2F0KE1hdGgucm91bmQoYm91bmQwMSh4LCAyNTUpICogMTAwKSwgXCIlXCIpOyB9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcjogZm10KHRoaXMuciksXG4gICAgICAgICAgICBnOiBmbXQodGhpcy5nKSxcbiAgICAgICAgICAgIGI6IGZtdCh0aGlzLmIpLFxuICAgICAgICAgICAgYTogdGhpcy5hLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgUkdCQSByZWxhdGl2ZSB2YWx1ZXMgaW50ZXJwb2xhdGVkIGludG8gYSBzdHJpbmdcbiAgICAgKi9cbiAgICBUaW55Q29sb3IucHJvdG90eXBlLnRvUGVyY2VudGFnZVJnYlN0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJuZCA9IGZ1bmN0aW9uICh4KSB7IHJldHVybiBNYXRoLnJvdW5kKGJvdW5kMDEoeCwgMjU1KSAqIDEwMCk7IH07XG4gICAgICAgIHJldHVybiB0aGlzLmEgPT09IDFcbiAgICAgICAgICAgID8gXCJyZ2IoXCIuY29uY2F0KHJuZCh0aGlzLnIpLCBcIiUsIFwiKS5jb25jYXQocm5kKHRoaXMuZyksIFwiJSwgXCIpLmNvbmNhdChybmQodGhpcy5iKSwgXCIlKVwiKVxuICAgICAgICAgICAgOiBcInJnYmEoXCIuY29uY2F0KHJuZCh0aGlzLnIpLCBcIiUsIFwiKS5jb25jYXQocm5kKHRoaXMuZyksIFwiJSwgXCIpLmNvbmNhdChybmQodGhpcy5iKSwgXCIlLCBcIikuY29uY2F0KHRoaXMucm91bmRBLCBcIilcIik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUaGUgJ3JlYWwnIG5hbWUgb2YgdGhlIGNvbG9yIC1pZiB0aGVyZSBpcyBvbmUuXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS50b05hbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmEgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAndHJhbnNwYXJlbnQnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmEgPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhleCA9ICcjJyArIHJnYlRvSGV4KHRoaXMuciwgdGhpcy5nLCB0aGlzLmIsIGZhbHNlKTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IE9iamVjdC5lbnRyaWVzKG5hbWVzKTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBfYiA9IF9hW19pXSwga2V5ID0gX2JbMF0sIHZhbHVlID0gX2JbMV07XG4gICAgICAgICAgICBpZiAoaGV4ID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgdmFyIGZvcm1hdFNldCA9IEJvb2xlYW4oZm9ybWF0KTtcbiAgICAgICAgZm9ybWF0ID0gZm9ybWF0ICE9PSBudWxsICYmIGZvcm1hdCAhPT0gdm9pZCAwID8gZm9ybWF0IDogdGhpcy5mb3JtYXQ7XG4gICAgICAgIHZhciBmb3JtYXR0ZWRTdHJpbmcgPSBmYWxzZTtcbiAgICAgICAgdmFyIGhhc0FscGhhID0gdGhpcy5hIDwgMSAmJiB0aGlzLmEgPj0gMDtcbiAgICAgICAgdmFyIG5lZWRzQWxwaGFGb3JtYXQgPSAhZm9ybWF0U2V0ICYmIGhhc0FscGhhICYmIChmb3JtYXQuc3RhcnRzV2l0aCgnaGV4JykgfHwgZm9ybWF0ID09PSAnbmFtZScpO1xuICAgICAgICBpZiAobmVlZHNBbHBoYUZvcm1hdCkge1xuICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBcInRyYW5zcGFyZW50XCIsIGFsbCBvdGhlciBub24tYWxwaGEgZm9ybWF0c1xuICAgICAgICAgICAgLy8gd2lsbCByZXR1cm4gcmdiYSB3aGVuIHRoZXJlIGlzIHRyYW5zcGFyZW5jeS5cbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICduYW1lJyAmJiB0aGlzLmEgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b05hbWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvUmdiU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ3JnYicpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9SZ2JTdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybWF0ID09PSAncHJnYicpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9QZXJjZW50YWdlUmdiU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2hleCcgfHwgZm9ybWF0ID09PSAnaGV4NicpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9IZXhTdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybWF0ID09PSAnaGV4MycpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9IZXhTdHJpbmcodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2hleDQnKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvSGV4OFN0cmluZyh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybWF0ID09PSAnaGV4OCcpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9IZXg4U3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ25hbWUnKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvTmFtZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdoc2wnKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvSHNsU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2hzdicpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9Ic3ZTdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybWF0dGVkU3RyaW5nIHx8IHRoaXMudG9IZXhTdHJpbmcoKTtcbiAgICB9O1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudG9OdW1iZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAoTWF0aC5yb3VuZCh0aGlzLnIpIDw8IDE2KSArIChNYXRoLnJvdW5kKHRoaXMuZykgPDwgOCkgKyBNYXRoLnJvdW5kKHRoaXMuYik7XG4gICAgfTtcbiAgICBUaW55Q29sb3IucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRpbnlDb2xvcih0aGlzLnRvU3RyaW5nKCkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTGlnaHRlbiB0aGUgY29sb3IgYSBnaXZlbiBhbW91bnQuIFByb3ZpZGluZyAxMDAgd2lsbCBhbHdheXMgcmV0dXJuIHdoaXRlLlxuICAgICAqIEBwYXJhbSBhbW91bnQgLSB2YWxpZCBiZXR3ZWVuIDEtMTAwXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS5saWdodGVuID0gZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICBpZiAoYW1vdW50ID09PSB2b2lkIDApIHsgYW1vdW50ID0gMTA7IH1cbiAgICAgICAgdmFyIGhzbCA9IHRoaXMudG9Ic2woKTtcbiAgICAgICAgaHNsLmwgKz0gYW1vdW50IC8gMTAwO1xuICAgICAgICBoc2wubCA9IGNsYW1wMDEoaHNsLmwpO1xuICAgICAgICByZXR1cm4gbmV3IFRpbnlDb2xvcihoc2wpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnJpZ2h0ZW4gdGhlIGNvbG9yIGEgZ2l2ZW4gYW1vdW50LCBmcm9tIDAgdG8gMTAwLlxuICAgICAqIEBwYXJhbSBhbW91bnQgLSB2YWxpZCBiZXR3ZWVuIDEtMTAwXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS5icmlnaHRlbiA9IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgaWYgKGFtb3VudCA9PT0gdm9pZCAwKSB7IGFtb3VudCA9IDEwOyB9XG4gICAgICAgIHZhciByZ2IgPSB0aGlzLnRvUmdiKCk7XG4gICAgICAgIHJnYi5yID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCByZ2IuciAtIE1hdGgucm91bmQoMjU1ICogLShhbW91bnQgLyAxMDApKSkpO1xuICAgICAgICByZ2IuZyA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgcmdiLmcgLSBNYXRoLnJvdW5kKDI1NSAqIC0oYW1vdW50IC8gMTAwKSkpKTtcbiAgICAgICAgcmdiLmIgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIHJnYi5iIC0gTWF0aC5yb3VuZCgyNTUgKiAtKGFtb3VudCAvIDEwMCkpKSk7XG4gICAgICAgIHJldHVybiBuZXcgVGlueUNvbG9yKHJnYik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEYXJrZW4gdGhlIGNvbG9yIGEgZ2l2ZW4gYW1vdW50LCBmcm9tIDAgdG8gMTAwLlxuICAgICAqIFByb3ZpZGluZyAxMDAgd2lsbCBhbHdheXMgcmV0dXJuIGJsYWNrLlxuICAgICAqIEBwYXJhbSBhbW91bnQgLSB2YWxpZCBiZXR3ZWVuIDEtMTAwXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS5kYXJrZW4gPSBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgIGlmIChhbW91bnQgPT09IHZvaWQgMCkgeyBhbW91bnQgPSAxMDsgfVxuICAgICAgICB2YXIgaHNsID0gdGhpcy50b0hzbCgpO1xuICAgICAgICBoc2wubCAtPSBhbW91bnQgLyAxMDA7XG4gICAgICAgIGhzbC5sID0gY2xhbXAwMShoc2wubCk7XG4gICAgICAgIHJldHVybiBuZXcgVGlueUNvbG9yKGhzbCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNaXggdGhlIGNvbG9yIHdpdGggcHVyZSB3aGl0ZSwgZnJvbSAwIHRvIDEwMC5cbiAgICAgKiBQcm92aWRpbmcgMCB3aWxsIGRvIG5vdGhpbmcsIHByb3ZpZGluZyAxMDAgd2lsbCBhbHdheXMgcmV0dXJuIHdoaXRlLlxuICAgICAqIEBwYXJhbSBhbW91bnQgLSB2YWxpZCBiZXR3ZWVuIDEtMTAwXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS50aW50ID0gZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICBpZiAoYW1vdW50ID09PSB2b2lkIDApIHsgYW1vdW50ID0gMTA7IH1cbiAgICAgICAgcmV0dXJuIHRoaXMubWl4KCd3aGl0ZScsIGFtb3VudCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNaXggdGhlIGNvbG9yIHdpdGggcHVyZSBibGFjaywgZnJvbSAwIHRvIDEwMC5cbiAgICAgKiBQcm92aWRpbmcgMCB3aWxsIGRvIG5vdGhpbmcsIHByb3ZpZGluZyAxMDAgd2lsbCBhbHdheXMgcmV0dXJuIGJsYWNrLlxuICAgICAqIEBwYXJhbSBhbW91bnQgLSB2YWxpZCBiZXR3ZWVuIDEtMTAwXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS5zaGFkZSA9IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgaWYgKGFtb3VudCA9PT0gdm9pZCAwKSB7IGFtb3VudCA9IDEwOyB9XG4gICAgICAgIHJldHVybiB0aGlzLm1peCgnYmxhY2snLCBhbW91bnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGVzYXR1cmF0ZSB0aGUgY29sb3IgYSBnaXZlbiBhbW91bnQsIGZyb20gMCB0byAxMDAuXG4gICAgICogUHJvdmlkaW5nIDEwMCB3aWxsIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcgZ3JleXNjYWxlXG4gICAgICogQHBhcmFtIGFtb3VudCAtIHZhbGlkIGJldHdlZW4gMS0xMDBcbiAgICAgKi9cbiAgICBUaW55Q29sb3IucHJvdG90eXBlLmRlc2F0dXJhdGUgPSBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgIGlmIChhbW91bnQgPT09IHZvaWQgMCkgeyBhbW91bnQgPSAxMDsgfVxuICAgICAgICB2YXIgaHNsID0gdGhpcy50b0hzbCgpO1xuICAgICAgICBoc2wucyAtPSBhbW91bnQgLyAxMDA7XG4gICAgICAgIGhzbC5zID0gY2xhbXAwMShoc2wucyk7XG4gICAgICAgIHJldHVybiBuZXcgVGlueUNvbG9yKGhzbCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTYXR1cmF0ZSB0aGUgY29sb3IgYSBnaXZlbiBhbW91bnQsIGZyb20gMCB0byAxMDAuXG4gICAgICogQHBhcmFtIGFtb3VudCAtIHZhbGlkIGJldHdlZW4gMS0xMDBcbiAgICAgKi9cbiAgICBUaW55Q29sb3IucHJvdG90eXBlLnNhdHVyYXRlID0gZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICBpZiAoYW1vdW50ID09PSB2b2lkIDApIHsgYW1vdW50ID0gMTA7IH1cbiAgICAgICAgdmFyIGhzbCA9IHRoaXMudG9Ic2woKTtcbiAgICAgICAgaHNsLnMgKz0gYW1vdW50IC8gMTAwO1xuICAgICAgICBoc2wucyA9IGNsYW1wMDEoaHNsLnMpO1xuICAgICAgICByZXR1cm4gbmV3IFRpbnlDb2xvcihoc2wpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29tcGxldGVseSBkZXNhdHVyYXRlcyBhIGNvbG9yIGludG8gZ3JleXNjYWxlLlxuICAgICAqIFNhbWUgYXMgY2FsbGluZyBgZGVzYXR1cmF0ZSgxMDApYFxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUuZ3JleXNjYWxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZXNhdHVyYXRlKDEwMCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTcGluIHRha2VzIGEgcG9zaXRpdmUgb3IgbmVnYXRpdmUgYW1vdW50IHdpdGhpbiBbLTM2MCwgMzYwXSBpbmRpY2F0aW5nIHRoZSBjaGFuZ2Ugb2YgaHVlLlxuICAgICAqIFZhbHVlcyBvdXRzaWRlIG9mIHRoaXMgcmFuZ2Ugd2lsbCBiZSB3cmFwcGVkIGludG8gdGhpcyByYW5nZS5cbiAgICAgKi9cbiAgICBUaW55Q29sb3IucHJvdG90eXBlLnNwaW4gPSBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgIHZhciBoc2wgPSB0aGlzLnRvSHNsKCk7XG4gICAgICAgIHZhciBodWUgPSAoaHNsLmggKyBhbW91bnQpICUgMzYwO1xuICAgICAgICBoc2wuaCA9IGh1ZSA8IDAgPyAzNjAgKyBodWUgOiBodWU7XG4gICAgICAgIHJldHVybiBuZXcgVGlueUNvbG9yKGhzbCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNaXggdGhlIGN1cnJlbnQgY29sb3IgYSBnaXZlbiBhbW91bnQgd2l0aCBhbm90aGVyIGNvbG9yLCBmcm9tIDAgdG8gMTAwLlxuICAgICAqIDAgbWVhbnMgbm8gbWl4aW5nIChyZXR1cm4gY3VycmVudCBjb2xvcikuXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS5taXggPSBmdW5jdGlvbiAoY29sb3IsIGFtb3VudCkge1xuICAgICAgICBpZiAoYW1vdW50ID09PSB2b2lkIDApIHsgYW1vdW50ID0gNTA7IH1cbiAgICAgICAgdmFyIHJnYjEgPSB0aGlzLnRvUmdiKCk7XG4gICAgICAgIHZhciByZ2IyID0gbmV3IFRpbnlDb2xvcihjb2xvcikudG9SZ2IoKTtcbiAgICAgICAgdmFyIHAgPSBhbW91bnQgLyAxMDA7XG4gICAgICAgIHZhciByZ2JhID0ge1xuICAgICAgICAgICAgcjogKHJnYjIuciAtIHJnYjEucikgKiBwICsgcmdiMS5yLFxuICAgICAgICAgICAgZzogKHJnYjIuZyAtIHJnYjEuZykgKiBwICsgcmdiMS5nLFxuICAgICAgICAgICAgYjogKHJnYjIuYiAtIHJnYjEuYikgKiBwICsgcmdiMS5iLFxuICAgICAgICAgICAgYTogKHJnYjIuYSAtIHJnYjEuYSkgKiBwICsgcmdiMS5hLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3IFRpbnlDb2xvcihyZ2JhKTtcbiAgICB9O1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUuYW5hbG9nb3VzID0gZnVuY3Rpb24gKHJlc3VsdHMsIHNsaWNlcykge1xuICAgICAgICBpZiAocmVzdWx0cyA9PT0gdm9pZCAwKSB7IHJlc3VsdHMgPSA2OyB9XG4gICAgICAgIGlmIChzbGljZXMgPT09IHZvaWQgMCkgeyBzbGljZXMgPSAzMDsgfVxuICAgICAgICB2YXIgaHNsID0gdGhpcy50b0hzbCgpO1xuICAgICAgICB2YXIgcGFydCA9IDM2MCAvIHNsaWNlcztcbiAgICAgICAgdmFyIHJldCA9IFt0aGlzXTtcbiAgICAgICAgZm9yIChoc2wuaCA9IChoc2wuaCAtICgocGFydCAqIHJlc3VsdHMpID4+IDEpICsgNzIwKSAlIDM2MDsgLS1yZXN1bHRzOykge1xuICAgICAgICAgICAgaHNsLmggPSAoaHNsLmggKyBwYXJ0KSAlIDM2MDtcbiAgICAgICAgICAgIHJldC5wdXNoKG5ldyBUaW55Q29sb3IoaHNsKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2luZnVzaW9uL2pRdWVyeS14Y29sb3IvYmxvYi9tYXN0ZXIvanF1ZXJ5Lnhjb2xvci5qc1xuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUuY29tcGxlbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGhzbCA9IHRoaXMudG9Ic2woKTtcbiAgICAgICAgaHNsLmggPSAoaHNsLmggKyAxODApICUgMzYwO1xuICAgICAgICByZXR1cm4gbmV3IFRpbnlDb2xvcihoc2wpO1xuICAgIH07XG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS5tb25vY2hyb21hdGljID0gZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgICAgaWYgKHJlc3VsdHMgPT09IHZvaWQgMCkgeyByZXN1bHRzID0gNjsgfVxuICAgICAgICB2YXIgaHN2ID0gdGhpcy50b0hzdigpO1xuICAgICAgICB2YXIgaCA9IGhzdi5oO1xuICAgICAgICB2YXIgcyA9IGhzdi5zO1xuICAgICAgICB2YXIgdiA9IGhzdi52O1xuICAgICAgICB2YXIgcmVzID0gW107XG4gICAgICAgIHZhciBtb2RpZmljYXRpb24gPSAxIC8gcmVzdWx0cztcbiAgICAgICAgd2hpbGUgKHJlc3VsdHMtLSkge1xuICAgICAgICAgICAgcmVzLnB1c2gobmV3IFRpbnlDb2xvcih7IGg6IGgsIHM6IHMsIHY6IHYgfSkpO1xuICAgICAgICAgICAgdiA9ICh2ICsgbW9kaWZpY2F0aW9uKSAlIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUuc3BsaXRjb21wbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaHNsID0gdGhpcy50b0hzbCgpO1xuICAgICAgICB2YXIgaCA9IGhzbC5oO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIG5ldyBUaW55Q29sb3IoeyBoOiAoaCArIDcyKSAlIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sIH0pLFxuICAgICAgICAgICAgbmV3IFRpbnlDb2xvcih7IGg6IChoICsgMjE2KSAlIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sIH0pLFxuICAgICAgICBdO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSBob3cgdGhlIGNvbG9yIHdvdWxkIGFwcGVhciBvbiBhIGJhY2tncm91bmRcbiAgICAgKi9cbiAgICBUaW55Q29sb3IucHJvdG90eXBlLm9uQmFja2dyb3VuZCA9IGZ1bmN0aW9uIChiYWNrZ3JvdW5kKSB7XG4gICAgICAgIHZhciBmZyA9IHRoaXMudG9SZ2IoKTtcbiAgICAgICAgdmFyIGJnID0gbmV3IFRpbnlDb2xvcihiYWNrZ3JvdW5kKS50b1JnYigpO1xuICAgICAgICB2YXIgYWxwaGEgPSBmZy5hICsgYmcuYSAqICgxIC0gZmcuYSk7XG4gICAgICAgIHJldHVybiBuZXcgVGlueUNvbG9yKHtcbiAgICAgICAgICAgIHI6IChmZy5yICogZmcuYSArIGJnLnIgKiBiZy5hICogKDEgLSBmZy5hKSkgLyBhbHBoYSxcbiAgICAgICAgICAgIGc6IChmZy5nICogZmcuYSArIGJnLmcgKiBiZy5hICogKDEgLSBmZy5hKSkgLyBhbHBoYSxcbiAgICAgICAgICAgIGI6IChmZy5iICogZmcuYSArIGJnLmIgKiBiZy5hICogKDEgLSBmZy5hKSkgLyBhbHBoYSxcbiAgICAgICAgICAgIGE6IGFscGhhLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBgcG9seWFkKDMpYFxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudHJpYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvbHlhZCgzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBgcG9seWFkKDQpYFxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudGV0cmFkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wb2x5YWQoNCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgcG9seWFkIGNvbG9ycywgbGlrZSAoZm9yIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIGV0Yy4uLilcbiAgICAgKiBtb25hZCwgZHlhZCwgdHJpYWQsIHRldHJhZCwgcGVudGFkLCBoZXhhZCwgaGVwdGFkLCBvY3RhZCwgZXRjLi4uXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS5wb2x5YWQgPSBmdW5jdGlvbiAobikge1xuICAgICAgICB2YXIgaHNsID0gdGhpcy50b0hzbCgpO1xuICAgICAgICB2YXIgaCA9IGhzbC5oO1xuICAgICAgICB2YXIgcmVzdWx0ID0gW3RoaXNdO1xuICAgICAgICB2YXIgaW5jcmVtZW50ID0gMzYwIC8gbjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBUaW55Q29sb3IoeyBoOiAoaCArIGkgKiBpbmNyZW1lbnQpICUgMzYwLCBzOiBoc2wucywgbDogaHNsLmwgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBjb21wYXJlIGNvbG9yIHZzIGN1cnJlbnQgY29sb3JcbiAgICAgKi9cbiAgICBUaW55Q29sb3IucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICByZXR1cm4gdGhpcy50b1JnYlN0cmluZygpID09PSBuZXcgVGlueUNvbG9yKGNvbG9yKS50b1JnYlN0cmluZygpO1xuICAgIH07XG4gICAgcmV0dXJuIFRpbnlDb2xvcjtcbn0oKSk7XG5leHBvcnQgeyBUaW55Q29sb3IgfTtcbi8vIGtlcHQgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5IHdpdGggdjFcbmV4cG9ydCBmdW5jdGlvbiB0aW55Y29sb3IoY29sb3IsIG9wdHMpIHtcbiAgICBpZiAoY29sb3IgPT09IHZvaWQgMCkgeyBjb2xvciA9ICcnOyB9XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkgeyBvcHRzID0ge307IH1cbiAgICByZXR1cm4gbmV3IFRpbnlDb2xvcihjb2xvciwgb3B0cyk7XG59XG4iLCJpbXBvcnQgeyBpbnB1dFRvUkdCLCByZ2JUb0hleCwgcmdiVG9Ic3YgfSBmcm9tICdAY3RybC90aW55Y29sb3InO1xuXG52YXIgaHVlU3RlcCA9IDI7IC8vIOiJsuebuOmYtuair1xuXG52YXIgc2F0dXJhdGlvblN0ZXAgPSAwLjE2OyAvLyDppbHlkozluqbpmLbmoq/vvIzmtYXoibLpg6jliIZcblxudmFyIHNhdHVyYXRpb25TdGVwMiA9IDAuMDU7IC8vIOmlseWSjOW6pumYtuair++8jOa3seiJsumDqOWIhlxuXG52YXIgYnJpZ2h0bmVzc1N0ZXAxID0gMC4wNTsgLy8g5Lqu5bqm6Zi25qKv77yM5rWF6Imy6YOo5YiGXG5cbnZhciBicmlnaHRuZXNzU3RlcDIgPSAwLjE1OyAvLyDkuq7luqbpmLbmoq/vvIzmt7HoibLpg6jliIZcblxudmFyIGxpZ2h0Q29sb3JDb3VudCA9IDU7IC8vIOa1heiJsuaVsOmHj++8jOS4u+iJsuS4ilxuXG52YXIgZGFya0NvbG9yQ291bnQgPSA0OyAvLyDmt7HoibLmlbDph4/vvIzkuLvoibLkuItcbi8vIOaal+iJsuS4u+mimOminOiJsuaYoOWwhOWFs+ezu+ihqFxuXG52YXIgZGFya0NvbG9yTWFwID0gW3tcbiAgaW5kZXg6IDcsXG4gIG9wYWNpdHk6IDAuMTVcbn0sIHtcbiAgaW5kZXg6IDYsXG4gIG9wYWNpdHk6IDAuMjVcbn0sIHtcbiAgaW5kZXg6IDUsXG4gIG9wYWNpdHk6IDAuM1xufSwge1xuICBpbmRleDogNSxcbiAgb3BhY2l0eTogMC40NVxufSwge1xuICBpbmRleDogNSxcbiAgb3BhY2l0eTogMC42NVxufSwge1xuICBpbmRleDogNSxcbiAgb3BhY2l0eTogMC44NVxufSwge1xuICBpbmRleDogNCxcbiAgb3BhY2l0eTogMC45XG59LCB7XG4gIGluZGV4OiAzLFxuICBvcGFjaXR5OiAwLjk1XG59LCB7XG4gIGluZGV4OiAyLFxuICBvcGFjaXR5OiAwLjk3XG59LCB7XG4gIGluZGV4OiAxLFxuICBvcGFjaXR5OiAwLjk4XG59XTsgLy8gV3JhcHBlciBmdW5jdGlvbiBwb3J0ZWQgZnJvbSBUaW55Q29sb3IucHJvdG90eXBlLnRvSHN2XG4vLyBLZWVwIGl0IGhlcmUgYmVjYXVzZSBvZiBgaHN2LmggKiAzNjBgXG5cbmZ1bmN0aW9uIHRvSHN2KF9yZWYpIHtcbiAgdmFyIHIgPSBfcmVmLnIsXG4gICAgICBnID0gX3JlZi5nLFxuICAgICAgYiA9IF9yZWYuYjtcbiAgdmFyIGhzdiA9IHJnYlRvSHN2KHIsIGcsIGIpO1xuICByZXR1cm4ge1xuICAgIGg6IGhzdi5oICogMzYwLFxuICAgIHM6IGhzdi5zLFxuICAgIHY6IGhzdi52XG4gIH07XG59IC8vIFdyYXBwZXIgZnVuY3Rpb24gcG9ydGVkIGZyb20gVGlueUNvbG9yLnByb3RvdHlwZS50b0hleFN0cmluZ1xuLy8gS2VlcCBpdCBoZXJlIGJlY2F1c2Ugb2YgdGhlIHByZWZpeCBgI2BcblxuXG5mdW5jdGlvbiB0b0hleChfcmVmMikge1xuICB2YXIgciA9IF9yZWYyLnIsXG4gICAgICBnID0gX3JlZjIuZyxcbiAgICAgIGIgPSBfcmVmMi5iO1xuICByZXR1cm4gXCIjXCIuY29uY2F0KHJnYlRvSGV4KHIsIGcsIGIsIGZhbHNlKSk7XG59IC8vIFdyYXBwZXIgZnVuY3Rpb24gcG9ydGVkIGZyb20gVGlueUNvbG9yLnByb3RvdHlwZS5taXgsIG5vdCB0cmVlc2hha2FibGUuXG4vLyBBbW91bnQgaW4gcmFuZ2UgWzAsIDFdXG4vLyBBc3N1bWUgY29sb3IxICYgY29sb3IyIGhhcyBubyBhbHBoYSwgc2luY2UgdGhlIGZvbGxvd2luZyBzcmMgY29kZSBkaWQgc28uXG5cblxuZnVuY3Rpb24gbWl4KHJnYjEsIHJnYjIsIGFtb3VudCkge1xuICB2YXIgcCA9IGFtb3VudCAvIDEwMDtcbiAgdmFyIHJnYiA9IHtcbiAgICByOiAocmdiMi5yIC0gcmdiMS5yKSAqIHAgKyByZ2IxLnIsXG4gICAgZzogKHJnYjIuZyAtIHJnYjEuZykgKiBwICsgcmdiMS5nLFxuICAgIGI6IChyZ2IyLmIgLSByZ2IxLmIpICogcCArIHJnYjEuYlxuICB9O1xuICByZXR1cm4gcmdiO1xufVxuXG5mdW5jdGlvbiBnZXRIdWUoaHN2LCBpLCBsaWdodCkge1xuICB2YXIgaHVlOyAvLyDmoLnmja7oibLnm7jkuI3lkIzvvIzoibLnm7jovazlkJHkuI3lkIxcblxuICBpZiAoTWF0aC5yb3VuZChoc3YuaCkgPj0gNjAgJiYgTWF0aC5yb3VuZChoc3YuaCkgPD0gMjQwKSB7XG4gICAgaHVlID0gbGlnaHQgPyBNYXRoLnJvdW5kKGhzdi5oKSAtIGh1ZVN0ZXAgKiBpIDogTWF0aC5yb3VuZChoc3YuaCkgKyBodWVTdGVwICogaTtcbiAgfSBlbHNlIHtcbiAgICBodWUgPSBsaWdodCA/IE1hdGgucm91bmQoaHN2LmgpICsgaHVlU3RlcCAqIGkgOiBNYXRoLnJvdW5kKGhzdi5oKSAtIGh1ZVN0ZXAgKiBpO1xuICB9XG5cbiAgaWYgKGh1ZSA8IDApIHtcbiAgICBodWUgKz0gMzYwO1xuICB9IGVsc2UgaWYgKGh1ZSA+PSAzNjApIHtcbiAgICBodWUgLT0gMzYwO1xuICB9XG5cbiAgcmV0dXJuIGh1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0U2F0dXJhdGlvbihoc3YsIGksIGxpZ2h0KSB7XG4gIC8vIGdyZXkgY29sb3IgZG9uJ3QgY2hhbmdlIHNhdHVyYXRpb25cbiAgaWYgKGhzdi5oID09PSAwICYmIGhzdi5zID09PSAwKSB7XG4gICAgcmV0dXJuIGhzdi5zO1xuICB9XG5cbiAgdmFyIHNhdHVyYXRpb247XG5cbiAgaWYgKGxpZ2h0KSB7XG4gICAgc2F0dXJhdGlvbiA9IGhzdi5zIC0gc2F0dXJhdGlvblN0ZXAgKiBpO1xuICB9IGVsc2UgaWYgKGkgPT09IGRhcmtDb2xvckNvdW50KSB7XG4gICAgc2F0dXJhdGlvbiA9IGhzdi5zICsgc2F0dXJhdGlvblN0ZXA7XG4gIH0gZWxzZSB7XG4gICAgc2F0dXJhdGlvbiA9IGhzdi5zICsgc2F0dXJhdGlvblN0ZXAyICogaTtcbiAgfSAvLyDovrnnlYzlgLzkv67mraNcblxuXG4gIGlmIChzYXR1cmF0aW9uID4gMSkge1xuICAgIHNhdHVyYXRpb24gPSAxO1xuICB9IC8vIOesrOS4gOagvOeahCBzIOmZkOWItuWcqCAwLjA2LTAuMSDkuYvpl7RcblxuXG4gIGlmIChsaWdodCAmJiBpID09PSBsaWdodENvbG9yQ291bnQgJiYgc2F0dXJhdGlvbiA+IDAuMSkge1xuICAgIHNhdHVyYXRpb24gPSAwLjE7XG4gIH1cblxuICBpZiAoc2F0dXJhdGlvbiA8IDAuMDYpIHtcbiAgICBzYXR1cmF0aW9uID0gMC4wNjtcbiAgfVxuXG4gIHJldHVybiBOdW1iZXIoc2F0dXJhdGlvbi50b0ZpeGVkKDIpKTtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUoaHN2LCBpLCBsaWdodCkge1xuICB2YXIgdmFsdWU7XG5cbiAgaWYgKGxpZ2h0KSB7XG4gICAgdmFsdWUgPSBoc3YudiArIGJyaWdodG5lc3NTdGVwMSAqIGk7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBoc3YudiAtIGJyaWdodG5lc3NTdGVwMiAqIGk7XG4gIH1cblxuICBpZiAodmFsdWUgPiAxKSB7XG4gICAgdmFsdWUgPSAxO1xuICB9XG5cbiAgcmV0dXJuIE51bWJlcih2YWx1ZS50b0ZpeGVkKDIpKTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGUoY29sb3IpIHtcbiAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgcGF0dGVybnMgPSBbXTtcbiAgdmFyIHBDb2xvciA9IGlucHV0VG9SR0IoY29sb3IpO1xuXG4gIGZvciAodmFyIGkgPSBsaWdodENvbG9yQ291bnQ7IGkgPiAwOyBpIC09IDEpIHtcbiAgICB2YXIgaHN2ID0gdG9Ic3YocENvbG9yKTtcbiAgICB2YXIgY29sb3JTdHJpbmcgPSB0b0hleChpbnB1dFRvUkdCKHtcbiAgICAgIGg6IGdldEh1ZShoc3YsIGksIHRydWUpLFxuICAgICAgczogZ2V0U2F0dXJhdGlvbihoc3YsIGksIHRydWUpLFxuICAgICAgdjogZ2V0VmFsdWUoaHN2LCBpLCB0cnVlKVxuICAgIH0pKTtcbiAgICBwYXR0ZXJucy5wdXNoKGNvbG9yU3RyaW5nKTtcbiAgfVxuXG4gIHBhdHRlcm5zLnB1c2godG9IZXgocENvbG9yKSk7XG5cbiAgZm9yICh2YXIgX2kgPSAxOyBfaSA8PSBkYXJrQ29sb3JDb3VudDsgX2kgKz0gMSkge1xuICAgIHZhciBfaHN2ID0gdG9Ic3YocENvbG9yKTtcblxuICAgIHZhciBfY29sb3JTdHJpbmcgPSB0b0hleChpbnB1dFRvUkdCKHtcbiAgICAgIGg6IGdldEh1ZShfaHN2LCBfaSksXG4gICAgICBzOiBnZXRTYXR1cmF0aW9uKF9oc3YsIF9pKSxcbiAgICAgIHY6IGdldFZhbHVlKF9oc3YsIF9pKVxuICAgIH0pKTtcblxuICAgIHBhdHRlcm5zLnB1c2goX2NvbG9yU3RyaW5nKTtcbiAgfSAvLyBkYXJrIHRoZW1lIHBhdHRlcm5zXG5cblxuICBpZiAob3B0cy50aGVtZSA9PT0gJ2RhcmsnKSB7XG4gICAgcmV0dXJuIGRhcmtDb2xvck1hcC5tYXAoZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICB2YXIgaW5kZXggPSBfcmVmMy5pbmRleCxcbiAgICAgICAgICBvcGFjaXR5ID0gX3JlZjMub3BhY2l0eTtcbiAgICAgIHZhciBkYXJrQ29sb3JTdHJpbmcgPSB0b0hleChtaXgoaW5wdXRUb1JHQihvcHRzLmJhY2tncm91bmRDb2xvciB8fCAnIzE0MTQxNCcpLCBpbnB1dFRvUkdCKHBhdHRlcm5zW2luZGV4XSksIG9wYWNpdHkgKiAxMDApKTtcbiAgICAgIHJldHVybiBkYXJrQ29sb3JTdHJpbmc7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcGF0dGVybnM7XG59XG5cbnZhciBwcmVzZXRQcmltYXJ5Q29sb3JzID0ge1xuICByZWQ6ICcjRjUyMjJEJyxcbiAgdm9sY2FubzogJyNGQTU0MUMnLFxuICBvcmFuZ2U6ICcjRkE4QzE2JyxcbiAgZ29sZDogJyNGQUFEMTQnLFxuICB5ZWxsb3c6ICcjRkFEQjE0JyxcbiAgbGltZTogJyNBMEQ5MTEnLFxuICBncmVlbjogJyM1MkM0MUEnLFxuICBjeWFuOiAnIzEzQzJDMicsXG4gIGJsdWU6ICcjMTg5MEZGJyxcbiAgZ2Vla2JsdWU6ICcjMkY1NEVCJyxcbiAgcHVycGxlOiAnIzcyMkVEMScsXG4gIG1hZ2VudGE6ICcjRUIyRjk2JyxcbiAgZ3JleTogJyM2NjY2NjYnXG59O1xudmFyIHByZXNldFBhbGV0dGVzID0ge307XG52YXIgcHJlc2V0RGFya1BhbGV0dGVzID0ge307XG5PYmplY3Qua2V5cyhwcmVzZXRQcmltYXJ5Q29sb3JzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgcHJlc2V0UGFsZXR0ZXNba2V5XSA9IGdlbmVyYXRlKHByZXNldFByaW1hcnlDb2xvcnNba2V5XSk7XG4gIHByZXNldFBhbGV0dGVzW2tleV0ucHJpbWFyeSA9IHByZXNldFBhbGV0dGVzW2tleV1bNV07IC8vIGRhcmsgcHJlc2V0UGFsZXR0ZXNcblxuICBwcmVzZXREYXJrUGFsZXR0ZXNba2V5XSA9IGdlbmVyYXRlKHByZXNldFByaW1hcnlDb2xvcnNba2V5XSwge1xuICAgIHRoZW1lOiAnZGFyaycsXG4gICAgYmFja2dyb3VuZENvbG9yOiAnIzE0MTQxNCdcbiAgfSk7XG4gIHByZXNldERhcmtQYWxldHRlc1trZXldLnByaW1hcnkgPSBwcmVzZXREYXJrUGFsZXR0ZXNba2V5XVs1XTtcbn0pO1xudmFyIHJlZCA9IHByZXNldFBhbGV0dGVzLnJlZDtcbnZhciB2b2xjYW5vID0gcHJlc2V0UGFsZXR0ZXMudm9sY2FubztcbnZhciBnb2xkID0gcHJlc2V0UGFsZXR0ZXMuZ29sZDtcbnZhciBvcmFuZ2UgPSBwcmVzZXRQYWxldHRlcy5vcmFuZ2U7XG52YXIgeWVsbG93ID0gcHJlc2V0UGFsZXR0ZXMueWVsbG93O1xudmFyIGxpbWUgPSBwcmVzZXRQYWxldHRlcy5saW1lO1xudmFyIGdyZWVuID0gcHJlc2V0UGFsZXR0ZXMuZ3JlZW47XG52YXIgY3lhbiA9IHByZXNldFBhbGV0dGVzLmN5YW47XG52YXIgYmx1ZSA9IHByZXNldFBhbGV0dGVzLmJsdWU7XG52YXIgZ2Vla2JsdWUgPSBwcmVzZXRQYWxldHRlcy5nZWVrYmx1ZTtcbnZhciBwdXJwbGUgPSBwcmVzZXRQYWxldHRlcy5wdXJwbGU7XG52YXIgbWFnZW50YSA9IHByZXNldFBhbGV0dGVzLm1hZ2VudGE7XG52YXIgZ3JleSA9IHByZXNldFBhbGV0dGVzLmdyZXk7XG5cbmV4cG9ydCB7IGJsdWUsIGN5YW4sIGdlZWtibHVlLCBnZW5lcmF0ZSwgZ29sZCwgZ3JlZW4sIGdyZXksIGxpbWUsIG1hZ2VudGEsIG9yYW5nZSwgcHJlc2V0RGFya1BhbGV0dGVzLCBwcmVzZXRQYWxldHRlcywgcHJlc2V0UHJpbWFyeUNvbG9ycywgcHVycGxlLCByZWQsIHZvbGNhbm8sIHllbGxvdyB9O1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2FuVXNlRG9tKCkge1xuICByZXR1cm4gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb250YWlucyhyb290LCBuKSB7XG4gIGlmICghcm9vdCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFVzZSBuYXRpdmUgaWYgc3VwcG9ydFxuICBpZiAocm9vdC5jb250YWlucykge1xuICAgIHJldHVybiByb290LmNvbnRhaW5zKG4pO1xuICB9XG5cbiAgLy8gYGRvY3VtZW50LmNvbnRhaW5zYCBub3Qgc3VwcG9ydCB3aXRoIElFMTFcbiAgdmFyIG5vZGUgPSBuO1xuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlID09PSByb290KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59IiwiaW1wb3J0IGNhblVzZURvbSBmcm9tIFwiLi9jYW5Vc2VEb21cIjtcbmltcG9ydCBjb250YWlucyBmcm9tIFwiLi9jb250YWluc1wiO1xudmFyIEFQUEVORF9PUkRFUiA9ICdkYXRhLXJjLW9yZGVyJztcbnZhciBNQVJLX0tFWSA9IFwicmMtdXRpbC1rZXlcIjtcbnZhciBjb250YWluZXJDYWNoZSA9IG5ldyBNYXAoKTtcbmZ1bmN0aW9uIGdldE1hcmsoKSB7XG4gIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICBtYXJrID0gX3JlZi5tYXJrO1xuICBpZiAobWFyaykge1xuICAgIHJldHVybiBtYXJrLnN0YXJ0c1dpdGgoJ2RhdGEtJykgPyBtYXJrIDogXCJkYXRhLVwiLmNvbmNhdChtYXJrKTtcbiAgfVxuICByZXR1cm4gTUFSS19LRVk7XG59XG5mdW5jdGlvbiBnZXRDb250YWluZXIob3B0aW9uKSB7XG4gIGlmIChvcHRpb24uYXR0YWNoVG8pIHtcbiAgICByZXR1cm4gb3B0aW9uLmF0dGFjaFRvO1xuICB9XG4gIHZhciBoZWFkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZCcpO1xuICByZXR1cm4gaGVhZCB8fCBkb2N1bWVudC5ib2R5O1xufVxuZnVuY3Rpb24gZ2V0T3JkZXIocHJlcGVuZCkge1xuICBpZiAocHJlcGVuZCA9PT0gJ3F1ZXVlJykge1xuICAgIHJldHVybiAncHJlcGVuZFF1ZXVlJztcbiAgfVxuICByZXR1cm4gcHJlcGVuZCA/ICdwcmVwZW5kJyA6ICdhcHBlbmQnO1xufVxuXG4vKipcbiAqIEZpbmQgc3R5bGUgd2hpY2ggaW5qZWN0IGJ5IHJjLXV0aWxcbiAqL1xuZnVuY3Rpb24gZmluZFN0eWxlcyhjb250YWluZXIpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20oKGNvbnRhaW5lckNhY2hlLmdldChjb250YWluZXIpIHx8IGNvbnRhaW5lcikuY2hpbGRyZW4pLmZpbHRlcihmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBub2RlLnRhZ05hbWUgPT09ICdTVFlMRSc7XG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdENTUyhjc3MpIHtcbiAgdmFyIG9wdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIGlmICghY2FuVXNlRG9tKCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgY3NwID0gb3B0aW9uLmNzcCxcbiAgICBwcmVwZW5kID0gb3B0aW9uLnByZXBlbmQ7XG4gIHZhciBzdHlsZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICBzdHlsZU5vZGUuc2V0QXR0cmlidXRlKEFQUEVORF9PUkRFUiwgZ2V0T3JkZXIocHJlcGVuZCkpO1xuICBpZiAoY3NwICE9PSBudWxsICYmIGNzcCAhPT0gdm9pZCAwICYmIGNzcC5ub25jZSkge1xuICAgIHN0eWxlTm9kZS5ub25jZSA9IGNzcCA9PT0gbnVsbCB8fCBjc3AgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNzcC5ub25jZTtcbiAgfVxuICBzdHlsZU5vZGUuaW5uZXJIVE1MID0gY3NzO1xuICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKG9wdGlvbik7XG4gIHZhciBmaXJzdENoaWxkID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gIGlmIChwcmVwZW5kKSB7XG4gICAgLy8gSWYgaXMgcXVldWUgYHByZXBlbmRgLCBpdCB3aWxsIHByZXBlbmQgZmlyc3Qgc3R5bGUgYW5kIHRoZW4gYXBwZW5kIHJlc3Qgc3R5bGVcbiAgICBpZiAocHJlcGVuZCA9PT0gJ3F1ZXVlJykge1xuICAgICAgdmFyIGV4aXN0U3R5bGUgPSBmaW5kU3R5bGVzKGNvbnRhaW5lcikuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHJldHVybiBbJ3ByZXBlbmQnLCAncHJlcGVuZFF1ZXVlJ10uaW5jbHVkZXMobm9kZS5nZXRBdHRyaWJ1dGUoQVBQRU5EX09SREVSKSk7XG4gICAgICB9KTtcbiAgICAgIGlmIChleGlzdFN0eWxlLmxlbmd0aCkge1xuICAgICAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHN0eWxlTm9kZSwgZXhpc3RTdHlsZVtleGlzdFN0eWxlLmxlbmd0aCAtIDFdLm5leHRTaWJsaW5nKTtcbiAgICAgICAgcmV0dXJuIHN0eWxlTm9kZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVc2UgYGluc2VydEJlZm9yZWAgYXMgYHByZXBlbmRgXG4gICAgY29udGFpbmVyLmluc2VydEJlZm9yZShzdHlsZU5vZGUsIGZpcnN0Q2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChzdHlsZU5vZGUpO1xuICB9XG4gIHJldHVybiBzdHlsZU5vZGU7XG59XG5mdW5jdGlvbiBmaW5kRXhpc3ROb2RlKGtleSkge1xuICB2YXIgb3B0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgdmFyIGNvbnRhaW5lciA9IGdldENvbnRhaW5lcihvcHRpb24pO1xuICByZXR1cm4gZmluZFN0eWxlcyhjb250YWluZXIpLmZpbmQoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUoZ2V0TWFyayhvcHRpb24pKSA9PT0ga2V5O1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVDU1Moa2V5KSB7XG4gIHZhciBvcHRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgZXhpc3ROb2RlID0gZmluZEV4aXN0Tm9kZShrZXksIG9wdGlvbik7XG4gIGlmIChleGlzdE5vZGUpIHtcbiAgICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKG9wdGlvbik7XG4gICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGV4aXN0Tm9kZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBxaWFua3VuIHdpbGwgaW5qZWN0IGBhcHBlbmRDaGlsZGAgdG8gaW5zZXJ0IGludG8gb3RoZXJcbiAqL1xuZnVuY3Rpb24gc3luY1JlYWxDb250YWluZXIoY29udGFpbmVyLCBvcHRpb24pIHtcbiAgdmFyIGNhY2hlZFJlYWxDb250YWluZXIgPSBjb250YWluZXJDYWNoZS5nZXQoY29udGFpbmVyKTtcblxuICAvLyBGaW5kIHJlYWwgY29udGFpbmVyIHdoZW4gbm90IGNhY2hlZCBvciBjYWNoZWQgY29udGFpbmVyIHJlbW92ZWRcbiAgaWYgKCFjYWNoZWRSZWFsQ29udGFpbmVyIHx8ICFjb250YWlucyhkb2N1bWVudCwgY2FjaGVkUmVhbENvbnRhaW5lcikpIHtcbiAgICB2YXIgcGxhY2Vob2xkZXJTdHlsZSA9IGluamVjdENTUygnJywgb3B0aW9uKTtcbiAgICB2YXIgcGFyZW50Tm9kZSA9IHBsYWNlaG9sZGVyU3R5bGUucGFyZW50Tm9kZTtcbiAgICBjb250YWluZXJDYWNoZS5zZXQoY29udGFpbmVyLCBwYXJlbnROb2RlKTtcbiAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQocGxhY2Vob2xkZXJTdHlsZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBtYW51YWxseSBjbGVhciBjb250YWluZXIgY2FjaGUgdG8gYXZvaWQgZ2xvYmFsIGNhY2hlIGluIHVuaXQgdGVzdGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNvbnRhaW5lckNhY2hlKCkge1xuICBjb250YWluZXJDYWNoZS5jbGVhcigpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUNTUyhjc3MsIGtleSkge1xuICB2YXIgb3B0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgdmFyIGNvbnRhaW5lciA9IGdldENvbnRhaW5lcihvcHRpb24pO1xuXG4gIC8vIFN5bmMgcmVhbCBwYXJlbnRcbiAgc3luY1JlYWxDb250YWluZXIoY29udGFpbmVyLCBvcHRpb24pO1xuICB2YXIgZXhpc3ROb2RlID0gZmluZEV4aXN0Tm9kZShrZXksIG9wdGlvbik7XG4gIGlmIChleGlzdE5vZGUpIHtcbiAgICB2YXIgX29wdGlvbiRjc3AsIF9vcHRpb24kY3NwMjtcbiAgICBpZiAoKF9vcHRpb24kY3NwID0gb3B0aW9uLmNzcCkgIT09IG51bGwgJiYgX29wdGlvbiRjc3AgIT09IHZvaWQgMCAmJiBfb3B0aW9uJGNzcC5ub25jZSAmJiBleGlzdE5vZGUubm9uY2UgIT09ICgoX29wdGlvbiRjc3AyID0gb3B0aW9uLmNzcCkgPT09IG51bGwgfHwgX29wdGlvbiRjc3AyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9uJGNzcDIubm9uY2UpKSB7XG4gICAgICB2YXIgX29wdGlvbiRjc3AzO1xuICAgICAgZXhpc3ROb2RlLm5vbmNlID0gKF9vcHRpb24kY3NwMyA9IG9wdGlvbi5jc3ApID09PSBudWxsIHx8IF9vcHRpb24kY3NwMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbiRjc3AzLm5vbmNlO1xuICAgIH1cbiAgICBpZiAoZXhpc3ROb2RlLmlubmVySFRNTCAhPT0gY3NzKSB7XG4gICAgICBleGlzdE5vZGUuaW5uZXJIVE1MID0gY3NzO1xuICAgIH1cbiAgICByZXR1cm4gZXhpc3ROb2RlO1xuICB9XG4gIHZhciBuZXdOb2RlID0gaW5qZWN0Q1NTKGNzcywgb3B0aW9uKTtcbiAgbmV3Tm9kZS5zZXRBdHRyaWJ1dGUoZ2V0TWFyayhvcHRpb24pLCBrZXkpO1xuICByZXR1cm4gbmV3Tm9kZTtcbn0iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IHsgZ2VuZXJhdGUgYXMgZ2VuZXJhdGVDb2xvciB9IGZyb20gJ0BhbnQtZGVzaWduL2NvbG9ycyc7XG5pbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHdhcm4gZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IHsgdXBkYXRlQ1NTIH0gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2R5bmFtaWNDU1NcIjtcbmltcG9ydCBJY29uQ29udGV4dCBmcm9tICcuL2NvbXBvbmVudHMvQ29udGV4dCc7XG5leHBvcnQgZnVuY3Rpb24gd2FybmluZyh2YWxpZCwgbWVzc2FnZSkge1xuICB3YXJuKHZhbGlkLCBcIltAYW50LWRlc2lnbi9pY29uc10gXCIuY29uY2F0KG1lc3NhZ2UpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ljb25EZWZpbml0aW9uKHRhcmdldCkge1xuICByZXR1cm4gX3R5cGVvZih0YXJnZXQpID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdGFyZ2V0Lm5hbWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB0YXJnZXQudGhlbWUgPT09ICdzdHJpbmcnICYmIChfdHlwZW9mKHRhcmdldC5pY29uKSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHRhcmdldC5pY29uID09PSAnZnVuY3Rpb24nKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBdHRycygpIHtcbiAgdmFyIGF0dHJzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGF0dHJzKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgdmFyIHZhbCA9IGF0dHJzW2tleV07XG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgYWNjLmNsYXNzTmFtZSA9IHZhbDtcbiAgICAgICAgZGVsZXRlIGFjYy5jbGFzcztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhY2Nba2V5XSA9IHZhbDtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlKG5vZGUsIGtleSwgcm9vdFByb3BzKSB7XG4gIGlmICghcm9vdFByb3BzKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KG5vZGUudGFnLCBfb2JqZWN0U3ByZWFkKHtcbiAgICAgIGtleToga2V5XG4gICAgfSwgbm9ybWFsaXplQXR0cnMobm9kZS5hdHRycykpLCAobm9kZS5jaGlsZHJlbiB8fCBbXSkubWFwKGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiBnZW5lcmF0ZShjaGlsZCwgXCJcIi5jb25jYXQoa2V5LCBcIi1cIikuY29uY2F0KG5vZGUudGFnLCBcIi1cIikuY29uY2F0KGluZGV4KSk7XG4gICAgfSkpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChub2RlLnRhZywgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICBrZXk6IGtleVxuICB9LCBub3JtYWxpemVBdHRycyhub2RlLmF0dHJzKSksIHJvb3RQcm9wcyksIChub2RlLmNoaWxkcmVuIHx8IFtdKS5tYXAoZnVuY3Rpb24gKGNoaWxkLCBpbmRleCkge1xuICAgIHJldHVybiBnZW5lcmF0ZShjaGlsZCwgXCJcIi5jb25jYXQoa2V5LCBcIi1cIikuY29uY2F0KG5vZGUudGFnLCBcIi1cIikuY29uY2F0KGluZGV4KSk7XG4gIH0pKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWNvbmRhcnlDb2xvcihwcmltYXJ5Q29sb3IpIHtcbiAgLy8gY2hvb3NlIHRoZSBzZWNvbmQgY29sb3JcbiAgcmV0dXJuIGdlbmVyYXRlQ29sb3IocHJpbWFyeUNvbG9yKVswXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVUd29Ub25lQ29sb3JzKHR3b1RvbmVDb2xvcikge1xuICBpZiAoIXR3b1RvbmVDb2xvcikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gQXJyYXkuaXNBcnJheSh0d29Ub25lQ29sb3IpID8gdHdvVG9uZUNvbG9yIDogW3R3b1RvbmVDb2xvcl07XG59XG4vLyBUaGVzZSBwcm9wcyBtYWtlIHN1cmUgdGhhdCB0aGUgU1ZHIGJlaGF2aW91cnMgbGlrZSBnZW5lcmFsIHRleHQuXG4vLyBSZWZlcmVuY2U6IGh0dHBzOi8vYmxvZy5wcm90b3R5cHIuaW8vYWxpZ24tc3ZnLWljb25zLXRvLXRleHQtYW5kLXNheS1nb29kYnllLXRvLWZvbnQtaWNvbnMtZDQ0YjNkN2IyNmI0XG5leHBvcnQgdmFyIHN2Z0Jhc2VQcm9wcyA9IHtcbiAgd2lkdGg6ICcxZW0nLFxuICBoZWlnaHQ6ICcxZW0nLFxuICBmaWxsOiAnY3VycmVudENvbG9yJyxcbiAgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLFxuICBmb2N1c2FibGU6ICdmYWxzZSdcbn07XG5leHBvcnQgdmFyIGljb25TdHlsZXMgPSBcIlxcbi5hbnRpY29uIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIGNvbG9yOiBpbmhlcml0O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGluZS1oZWlnaHQ6IDA7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG4gIHZlcnRpY2FsLWFsaWduOiAtMC4xMjVlbTtcXG4gIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7XFxuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcXG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XFxufVxcblxcbi5hbnRpY29uID4gKiB7XFxuICBsaW5lLWhlaWdodDogMTtcXG59XFxuXFxuLmFudGljb24gc3ZnIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuXFxuLmFudGljb246OmJlZm9yZSB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4uYW50aWNvbiAuYW50aWNvbi1pY29uIHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG4uYW50aWNvblt0YWJpbmRleF0ge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG5cXG4uYW50aWNvbi1zcGluOjpiZWZvcmUsXFxuLmFudGljb24tc3BpbiB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAtd2Via2l0LWFuaW1hdGlvbjogbG9hZGluZ0NpcmNsZSAxcyBpbmZpbml0ZSBsaW5lYXI7XFxuICBhbmltYXRpb246IGxvYWRpbmdDaXJjbGUgMXMgaW5maW5pdGUgbGluZWFyO1xcbn1cXG5cXG5ALXdlYmtpdC1rZXlmcmFtZXMgbG9hZGluZ0NpcmNsZSB7XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbiAgfVxcbn1cXG5cXG5Aa2V5ZnJhbWVzIGxvYWRpbmdDaXJjbGUge1xcbiAgMTAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcXG4gIH1cXG59XFxuXCI7XG5leHBvcnQgdmFyIHVzZUluc2VydFN0eWxlcyA9IGZ1bmN0aW9uIHVzZUluc2VydFN0eWxlcygpIHtcbiAgdmFyIHN0eWxlU3RyID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBpY29uU3R5bGVzO1xuICB2YXIgX3VzZUNvbnRleHQgPSB1c2VDb250ZXh0KEljb25Db250ZXh0KSxcbiAgICBjc3AgPSBfdXNlQ29udGV4dC5jc3A7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdXBkYXRlQ1NTKHN0eWxlU3RyLCAnQGFudC1kZXNpZ24taWNvbnMnLCB7XG4gICAgICBwcmVwZW5kOiB0cnVlLFxuICAgICAgY3NwOiBjc3BcbiAgICB9KTtcbiAgfSwgW10pO1xufTsiLCJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJpY29uXCIsIFwiY2xhc3NOYW1lXCIsIFwib25DbGlja1wiLCBcInN0eWxlXCIsIFwicHJpbWFyeUNvbG9yXCIsIFwic2Vjb25kYXJ5Q29sb3JcIl07XG5pbXBvcnQgeyBnZW5lcmF0ZSwgZ2V0U2Vjb25kYXJ5Q29sb3IsIGlzSWNvbkRlZmluaXRpb24sIHdhcm5pbmcsIHVzZUluc2VydFN0eWxlcyB9IGZyb20gJy4uL3V0aWxzJztcbnZhciB0d29Ub25lQ29sb3JQYWxldHRlID0ge1xuICBwcmltYXJ5Q29sb3I6ICcjMzMzJyxcbiAgc2Vjb25kYXJ5Q29sb3I6ICcjRTZFNkU2JyxcbiAgY2FsY3VsYXRlZDogZmFsc2Vcbn07XG5mdW5jdGlvbiBzZXRUd29Ub25lQ29sb3JzKF9yZWYpIHtcbiAgdmFyIHByaW1hcnlDb2xvciA9IF9yZWYucHJpbWFyeUNvbG9yLFxuICAgIHNlY29uZGFyeUNvbG9yID0gX3JlZi5zZWNvbmRhcnlDb2xvcjtcbiAgdHdvVG9uZUNvbG9yUGFsZXR0ZS5wcmltYXJ5Q29sb3IgPSBwcmltYXJ5Q29sb3I7XG4gIHR3b1RvbmVDb2xvclBhbGV0dGUuc2Vjb25kYXJ5Q29sb3IgPSBzZWNvbmRhcnlDb2xvciB8fCBnZXRTZWNvbmRhcnlDb2xvcihwcmltYXJ5Q29sb3IpO1xuICB0d29Ub25lQ29sb3JQYWxldHRlLmNhbGN1bGF0ZWQgPSAhIXNlY29uZGFyeUNvbG9yO1xufVxuZnVuY3Rpb24gZ2V0VHdvVG9uZUNvbG9ycygpIHtcbiAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIHR3b1RvbmVDb2xvclBhbGV0dGUpO1xufVxudmFyIEljb25CYXNlID0gZnVuY3Rpb24gSWNvbkJhc2UocHJvcHMpIHtcbiAgdmFyIGljb24gPSBwcm9wcy5pY29uLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBvbkNsaWNrID0gcHJvcHMub25DbGljayxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIHByaW1hcnlDb2xvciA9IHByb3BzLnByaW1hcnlDb2xvcixcbiAgICBzZWNvbmRhcnlDb2xvciA9IHByb3BzLnNlY29uZGFyeUNvbG9yLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIGNvbG9ycyA9IHR3b1RvbmVDb2xvclBhbGV0dGU7XG4gIGlmIChwcmltYXJ5Q29sb3IpIHtcbiAgICBjb2xvcnMgPSB7XG4gICAgICBwcmltYXJ5Q29sb3I6IHByaW1hcnlDb2xvcixcbiAgICAgIHNlY29uZGFyeUNvbG9yOiBzZWNvbmRhcnlDb2xvciB8fCBnZXRTZWNvbmRhcnlDb2xvcihwcmltYXJ5Q29sb3IpXG4gICAgfTtcbiAgfVxuICB1c2VJbnNlcnRTdHlsZXMoKTtcbiAgd2FybmluZyhpc0ljb25EZWZpbml0aW9uKGljb24pLCBcImljb24gc2hvdWxkIGJlIGljb24gZGVmaW5pdG9uLCBidXQgZ290IFwiLmNvbmNhdChpY29uKSk7XG4gIGlmICghaXNJY29uRGVmaW5pdGlvbihpY29uKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciB0YXJnZXQgPSBpY29uO1xuICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQuaWNvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRhcmdldCA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGFyZ2V0KSwge30sIHtcbiAgICAgIGljb246IHRhcmdldC5pY29uKGNvbG9ycy5wcmltYXJ5Q29sb3IsIGNvbG9ycy5zZWNvbmRhcnlDb2xvcilcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZ2VuZXJhdGUodGFyZ2V0Lmljb24sIFwic3ZnLVwiLmNvbmNhdCh0YXJnZXQubmFtZSksIF9vYmplY3RTcHJlYWQoe1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgICdkYXRhLWljb24nOiB0YXJnZXQubmFtZSxcbiAgICB3aWR0aDogJzFlbScsXG4gICAgaGVpZ2h0OiAnMWVtJyxcbiAgICBmaWxsOiAnY3VycmVudENvbG9yJyxcbiAgICAnYXJpYS1oaWRkZW4nOiAndHJ1ZSdcbiAgfSwgcmVzdFByb3BzKSk7XG59O1xuSWNvbkJhc2UuZGlzcGxheU5hbWUgPSAnSWNvblJlYWN0Jztcbkljb25CYXNlLmdldFR3b1RvbmVDb2xvcnMgPSBnZXRUd29Ub25lQ29sb3JzO1xuSWNvbkJhc2Uuc2V0VHdvVG9uZUNvbG9ycyA9IHNldFR3b1RvbmVDb2xvcnM7XG5leHBvcnQgZGVmYXVsdCBJY29uQmFzZTsiLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBSZWFjdEljb24gZnJvbSAnLi9JY29uQmFzZSc7XG5pbXBvcnQgeyBub3JtYWxpemVUd29Ub25lQ29sb3JzIH0gZnJvbSAnLi4vdXRpbHMnO1xuZXhwb3J0IGZ1bmN0aW9uIHNldFR3b1RvbmVDb2xvcih0d29Ub25lQ29sb3IpIHtcbiAgdmFyIF9ub3JtYWxpemVUd29Ub25lQ29sbyA9IG5vcm1hbGl6ZVR3b1RvbmVDb2xvcnModHdvVG9uZUNvbG9yKSxcbiAgICBfbm9ybWFsaXplVHdvVG9uZUNvbG8yID0gX3NsaWNlZFRvQXJyYXkoX25vcm1hbGl6ZVR3b1RvbmVDb2xvLCAyKSxcbiAgICBwcmltYXJ5Q29sb3IgPSBfbm9ybWFsaXplVHdvVG9uZUNvbG8yWzBdLFxuICAgIHNlY29uZGFyeUNvbG9yID0gX25vcm1hbGl6ZVR3b1RvbmVDb2xvMlsxXTtcbiAgcmV0dXJuIFJlYWN0SWNvbi5zZXRUd29Ub25lQ29sb3JzKHtcbiAgICBwcmltYXJ5Q29sb3I6IHByaW1hcnlDb2xvcixcbiAgICBzZWNvbmRhcnlDb2xvcjogc2Vjb25kYXJ5Q29sb3JcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VHdvVG9uZUNvbG9yKCkge1xuICB2YXIgY29sb3JzID0gUmVhY3RJY29uLmdldFR3b1RvbmVDb2xvcnMoKTtcbiAgaWYgKCFjb2xvcnMuY2FsY3VsYXRlZCkge1xuICAgIHJldHVybiBjb2xvcnMucHJpbWFyeUNvbG9yO1xuICB9XG4gIHJldHVybiBbY29sb3JzLnByaW1hcnlDb2xvciwgY29sb3JzLnNlY29uZGFyeUNvbG9yXTtcbn0iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJjbGFzc05hbWVcIiwgXCJpY29uXCIsIFwic3BpblwiLCBcInJvdGF0ZVwiLCBcInRhYkluZGV4XCIsIFwib25DbGlja1wiLCBcInR3b1RvbmVDb2xvclwiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IENvbnRleHQgZnJvbSAnLi9Db250ZXh0JztcbmltcG9ydCBSZWFjdEljb24gZnJvbSAnLi9JY29uQmFzZSc7XG5pbXBvcnQgeyBnZXRUd29Ub25lQ29sb3IsIHNldFR3b1RvbmVDb2xvciB9IGZyb20gJy4vdHdvVG9uZVByaW1hcnlDb2xvcic7XG5pbXBvcnQgeyBub3JtYWxpemVUd29Ub25lQ29sb3JzIH0gZnJvbSAnLi4vdXRpbHMnO1xuLy8gSW5pdGlhbCBzZXR0aW5nXG4vLyBzaG91bGQgbW92ZSBpdCB0byBhbnRkIG1haW4gcmVwbz9cbnNldFR3b1RvbmVDb2xvcignIzE4OTBmZicpO1xudmFyIEljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgX2NsYXNzTmFtZXM7XG4gIHZhciBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgaWNvbiA9IHByb3BzLmljb24sXG4gICAgc3BpbiA9IHByb3BzLnNwaW4sXG4gICAgcm90YXRlID0gcHJvcHMucm90YXRlLFxuICAgIHRhYkluZGV4ID0gcHJvcHMudGFiSW5kZXgsXG4gICAgb25DbGljayA9IHByb3BzLm9uQ2xpY2ssXG4gICAgdHdvVG9uZUNvbG9yID0gcHJvcHMudHdvVG9uZUNvbG9yLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb250ZXh0KSxcbiAgICBfUmVhY3QkdXNlQ29udGV4dCRwcmUgPSBfUmVhY3QkdXNlQ29udGV4dC5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQkcHJlID09PSB2b2lkIDAgPyAnYW50aWNvbicgOiBfUmVhY3QkdXNlQ29udGV4dCRwcmUsXG4gICAgcm9vdENsYXNzTmFtZSA9IF9SZWFjdCR1c2VDb250ZXh0LnJvb3RDbGFzc05hbWU7XG4gIHZhciBjbGFzc1N0cmluZyA9IGNsYXNzTmFtZXMocm9vdENsYXNzTmFtZSwgcHJlZml4Q2xzLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoaWNvbi5uYW1lKSwgISFpY29uLm5hbWUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3BpblwiKSwgISFzcGluIHx8IGljb24ubmFtZSA9PT0gJ2xvYWRpbmcnKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICB2YXIgaWNvblRhYkluZGV4ID0gdGFiSW5kZXg7XG4gIGlmIChpY29uVGFiSW5kZXggPT09IHVuZGVmaW5lZCAmJiBvbkNsaWNrKSB7XG4gICAgaWNvblRhYkluZGV4ID0gLTE7XG4gIH1cbiAgdmFyIHN2Z1N0eWxlID0gcm90YXRlID8ge1xuICAgIG1zVHJhbnNmb3JtOiBcInJvdGF0ZShcIi5jb25jYXQocm90YXRlLCBcImRlZylcIiksXG4gICAgdHJhbnNmb3JtOiBcInJvdGF0ZShcIi5jb25jYXQocm90YXRlLCBcImRlZylcIilcbiAgfSA6IHVuZGVmaW5lZDtcbiAgdmFyIF9ub3JtYWxpemVUd29Ub25lQ29sbyA9IG5vcm1hbGl6ZVR3b1RvbmVDb2xvcnModHdvVG9uZUNvbG9yKSxcbiAgICBfbm9ybWFsaXplVHdvVG9uZUNvbG8yID0gX3NsaWNlZFRvQXJyYXkoX25vcm1hbGl6ZVR3b1RvbmVDb2xvLCAyKSxcbiAgICBwcmltYXJ5Q29sb3IgPSBfbm9ybWFsaXplVHdvVG9uZUNvbG8yWzBdLFxuICAgIHNlY29uZGFyeUNvbG9yID0gX25vcm1hbGl6ZVR3b1RvbmVDb2xvMlsxXTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe1xuICAgIHJvbGU6IFwiaW1nXCIsXG4gICAgXCJhcmlhLWxhYmVsXCI6IGljb24ubmFtZVxuICB9LCByZXN0UHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIHRhYkluZGV4OiBpY29uVGFiSW5kZXgsXG4gICAgb25DbGljazogb25DbGljayxcbiAgICBjbGFzc05hbWU6IGNsYXNzU3RyaW5nXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdEljb24sIHtcbiAgICBpY29uOiBpY29uLFxuICAgIHByaW1hcnlDb2xvcjogcHJpbWFyeUNvbG9yLFxuICAgIHNlY29uZGFyeUNvbG9yOiBzZWNvbmRhcnlDb2xvcixcbiAgICBzdHlsZTogc3ZnU3R5bGVcbiAgfSkpO1xufSk7XG5JY29uLmRpc3BsYXlOYW1lID0gJ0FudGRJY29uJztcbkljb24uZ2V0VHdvVG9uZUNvbG9yID0gZ2V0VHdvVG9uZUNvbG9yO1xuSWNvbi5zZXRUd29Ub25lQ29sb3IgPSBzZXRUd29Ub25lQ29sb3I7XG5leHBvcnQgZGVmYXVsdCBJY29uOyIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IENoZWNrQ2lyY2xlRmlsbGVkU3ZnIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0NoZWNrQ2lyY2xlRmlsbGVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSAnLi4vY29tcG9uZW50cy9BbnRkSWNvbic7XG52YXIgQ2hlY2tDaXJjbGVGaWxsZWQgPSBmdW5jdGlvbiBDaGVja0NpcmNsZUZpbGxlZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogQ2hlY2tDaXJjbGVGaWxsZWRTdmdcbiAgfSkpO1xufTtcbkNoZWNrQ2lyY2xlRmlsbGVkLmRpc3BsYXlOYW1lID0gJ0NoZWNrQ2lyY2xlRmlsbGVkJztcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKENoZWNrQ2lyY2xlRmlsbGVkKTsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBDbG9zZUNpcmNsZUZpbGxlZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTEyIDY0QzI2NC42IDY0IDY0IDI2NC42IDY0IDUxMnMyMDAuNiA0NDggNDQ4IDQ0OCA0NDgtMjAwLjYgNDQ4LTQ0OFM3NTkuNCA2NCA1MTIgNjR6bTE2NS40IDYxOC4ybC02Ni0uM0w1MTIgNTYzLjRsLTk5LjMgMTE4LjQtNjYuMS4zYy00LjQgMC04LTMuNS04LTggMC0xLjkuNy0zLjcgMS45LTUuMmwxMzAuMS0xNTVMMzQwLjUgMzU5YTguMzIgOC4zMiAwIDAxLTEuOS01LjJjMC00LjQgMy42LTggOC04bDY2LjEuM0w1MTIgNDY0LjZsOTkuMy0xMTguNCA2Ni0uM2M0LjQgMCA4IDMuNSA4IDggMCAxLjktLjcgMy43LTEuOSA1LjJMNTUzLjUgNTE0bDEzMCAxNTVjMS4yIDEuNSAxLjkgMy4zIDEuOSA1LjIgMCA0LjQtMy42IDgtOCA4elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiY2xvc2UtY2lyY2xlXCIsIFwidGhlbWVcIjogXCJmaWxsZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgQ2xvc2VDaXJjbGVGaWxsZWQ7XG4iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDbG9zZUNpcmNsZUZpbGxlZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9DbG9zZUNpcmNsZUZpbGxlZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIENsb3NlQ2lyY2xlRmlsbGVkID0gZnVuY3Rpb24gQ2xvc2VDaXJjbGVGaWxsZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IENsb3NlQ2lyY2xlRmlsbGVkU3ZnXG4gIH0pKTtcbn07XG5DbG9zZUNpcmNsZUZpbGxlZC5kaXNwbGF5TmFtZSA9ICdDbG9zZUNpcmNsZUZpbGxlZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihDbG9zZUNpcmNsZUZpbGxlZCk7IiwiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgRXhjbGFtYXRpb25DaXJjbGVGaWxsZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTUxMiA2NEMyNjQuNiA2NCA2NCAyNjQuNiA2NCA1MTJzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjQgNTEyIDY0em0tMzIgMjMyYzAtNC40IDMuNi04IDgtOGg0OGM0LjQgMCA4IDMuNiA4IDh2MjcyYzAgNC40LTMuNiA4LTggOGgtNDhjLTQuNCAwLTgtMy42LTgtOFYyOTZ6bTMyIDQ0MGE0OC4wMSA0OC4wMSAwIDAxMC05NiA0OC4wMSA0OC4wMSAwIDAxMCA5NnpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImV4Y2xhbWF0aW9uLWNpcmNsZVwiLCBcInRoZW1lXCI6IFwiZmlsbGVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IEV4Y2xhbWF0aW9uQ2lyY2xlRmlsbGVkO1xuIiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRXhjbGFtYXRpb25DaXJjbGVGaWxsZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRXhjbGFtYXRpb25DaXJjbGVGaWxsZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tICcuLi9jb21wb25lbnRzL0FudGRJY29uJztcbnZhciBFeGNsYW1hdGlvbkNpcmNsZUZpbGxlZCA9IGZ1bmN0aW9uIEV4Y2xhbWF0aW9uQ2lyY2xlRmlsbGVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBFeGNsYW1hdGlvbkNpcmNsZUZpbGxlZFN2Z1xuICB9KSk7XG59O1xuRXhjbGFtYXRpb25DaXJjbGVGaWxsZWQuZGlzcGxheU5hbWUgPSAnRXhjbGFtYXRpb25DaXJjbGVGaWxsZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoRXhjbGFtYXRpb25DaXJjbGVGaWxsZWQpOyIsIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIEluZm9DaXJjbGVGaWxsZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTUxMiA2NEMyNjQuNiA2NCA2NCAyNjQuNiA2NCA1MTJzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjQgNTEyIDY0em0zMiA2NjRjMCA0LjQtMy42IDgtOCA4aC00OGMtNC40IDAtOC0zLjYtOC04VjQ1NmMwLTQuNCAzLjYtOCA4LThoNDhjNC40IDAgOCAzLjYgOCA4djI3MnptLTMyLTM0NGE0OC4wMSA0OC4wMSAwIDAxMC05NiA0OC4wMSA0OC4wMSAwIDAxMCA5NnpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImluZm8tY2lyY2xlXCIsIFwidGhlbWVcIjogXCJmaWxsZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgSW5mb0NpcmNsZUZpbGxlZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEluZm9DaXJjbGVGaWxsZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vSW5mb0NpcmNsZUZpbGxlZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIEluZm9DaXJjbGVGaWxsZWQgPSBmdW5jdGlvbiBJbmZvQ2lyY2xlRmlsbGVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBJbmZvQ2lyY2xlRmlsbGVkU3ZnXG4gIH0pKTtcbn07XG5JbmZvQ2lyY2xlRmlsbGVkLmRpc3BsYXlOYW1lID0gJ0luZm9DaXJjbGVGaWxsZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoSW5mb0NpcmNsZUZpbGxlZCk7IiwiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgTG9hZGluZ091dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiMCAwIDEwMjQgMTAyNFwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk05ODggNTQ4Yy0xOS45IDAtMzYtMTYuMS0zNi0zNiAwLTU5LjQtMTEuNi0xMTctMzQuNi0xNzEuM2E0NDAuNDUgNDQwLjQ1IDAgMDAtOTQuMy0xMzkuOSA0MzcuNzEgNDM3LjcxIDAgMDAtMTM5LjktOTQuM0M2MjkgODMuNiA1NzEuNCA3MiA1MTIgNzJjLTE5LjkgMC0zNi0xNi4xLTM2LTM2czE2LjEtMzYgMzYtMzZjNjkuMSAwIDEzNi4yIDEzLjUgMTk5LjMgNDAuM0M3NzIuMyA2NiA4MjcgMTAzIDg3NCAxNTBjNDcgNDcgODMuOSAxMDEuOCAxMDkuNyAxNjIuNyAyNi43IDYzLjEgNDAuMiAxMzAuMiA0MC4yIDE5OS4zLjEgMTkuOS0xNiAzNi0zNS45IDM2elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwibG9hZGluZ1wiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgTG9hZGluZ091dGxpbmVkO1xuIiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTG9hZGluZ091dGxpbmVkU3ZnIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0xvYWRpbmdPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIExvYWRpbmdPdXRsaW5lZCA9IGZ1bmN0aW9uIExvYWRpbmdPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogTG9hZGluZ091dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5Mb2FkaW5nT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnTG9hZGluZ091dGxpbmVkJztcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKExvYWRpbmdPdXRsaW5lZCk7IiwiaW1wb3J0IF9yZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3JlZ2VuZXJhdG9yUnVudGltZVwiO1xuaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3luY1RvR2VuZXJhdG9yXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbi8vIExldCBjb21waWxlciBub3QgdG8gc2VhcmNoIG1vZHVsZSB1c2FnZVxudmFyIGZ1bGxDbG9uZSA9IF9vYmplY3RTcHJlYWQoe30sIFJlYWN0RE9NKTtcbnZhciB2ZXJzaW9uID0gZnVsbENsb25lLnZlcnNpb24sXG4gIHJlYWN0UmVuZGVyID0gZnVsbENsb25lLnJlbmRlcixcbiAgdW5tb3VudENvbXBvbmVudEF0Tm9kZSA9IGZ1bGxDbG9uZS51bm1vdW50Q29tcG9uZW50QXROb2RlO1xudmFyIGNyZWF0ZVJvb3Q7XG50cnkge1xuICB2YXIgbWFpblZlcnNpb24gPSBOdW1iZXIoKHZlcnNpb24gfHwgJycpLnNwbGl0KCcuJylbMF0pO1xuICBpZiAobWFpblZlcnNpb24gPj0gMTgpIHtcbiAgICBjcmVhdGVSb290ID0gZnVsbENsb25lLmNyZWF0ZVJvb3Q7XG4gIH1cbn0gY2F0Y2ggKGUpIHtcbiAgLy8gRG8gbm90aGluZztcbn1cbmZ1bmN0aW9uIHRvZ2dsZVdhcm5pbmcoc2tpcCkge1xuICB2YXIgX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQgPSBmdWxsQ2xvbmUuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7XG4gIGlmIChfX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCAmJiBfdHlwZW9mKF9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEKSA9PT0gJ29iamVjdCcpIHtcbiAgICBfX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRC51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBza2lwO1xuICB9XG59XG52YXIgTUFSSyA9ICdfX3JjX3JlYWN0X3Jvb3RfXyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBtb2Rlcm5SZW5kZXIobm9kZSwgY29udGFpbmVyKSB7XG4gIHRvZ2dsZVdhcm5pbmcodHJ1ZSk7XG4gIHZhciByb290ID0gY29udGFpbmVyW01BUktdIHx8IGNyZWF0ZVJvb3QoY29udGFpbmVyKTtcbiAgdG9nZ2xlV2FybmluZyhmYWxzZSk7XG4gIHJvb3QucmVuZGVyKG5vZGUpO1xuICBjb250YWluZXJbTUFSS10gPSByb290O1xufVxuZnVuY3Rpb24gbGVnYWN5UmVuZGVyKG5vZGUsIGNvbnRhaW5lcikge1xuICByZWFjdFJlbmRlcihub2RlLCBjb250YWluZXIpO1xufVxuXG4vKiogQHByaXZhdGUgVGVzdCB1c2FnZS4gTm90IHdvcmsgaW4gcHJvZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yKG5vZGUsIGNvbnRhaW5lcikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHJldHVybiBsZWdhY3lSZW5kZXIobm9kZSwgY29udGFpbmVyKTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlcihub2RlLCBjb250YWluZXIpIHtcbiAgaWYgKGNyZWF0ZVJvb3QpIHtcbiAgICBtb2Rlcm5SZW5kZXIobm9kZSwgY29udGFpbmVyKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbGVnYWN5UmVuZGVyKG5vZGUsIGNvbnRhaW5lcik7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT0gVW5tb3VudCA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuZnVuY3Rpb24gbW9kZXJuVW5tb3VudChfeCkge1xuICByZXR1cm4gX21vZGVyblVubW91bnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9tb2Rlcm5Vbm1vdW50KCkge1xuICBfbW9kZXJuVW5tb3VudCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShjb250YWluZXIpIHtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9jb250YWluZXIkTUFSSztcbiAgICAgICAgICAgIChfY29udGFpbmVyJE1BUksgPSBjb250YWluZXJbTUFSS10pID09PSBudWxsIHx8IF9jb250YWluZXIkTUFSSyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2NvbnRhaW5lciRNQVJLLnVubW91bnQoKTtcbiAgICAgICAgICAgIGRlbGV0ZSBjb250YWluZXJbTUFSS107XG4gICAgICAgICAgfSkpO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgfVxuICAgIH0sIF9jYWxsZWUpO1xuICB9KSk7XG4gIHJldHVybiBfbW9kZXJuVW5tb3VudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gbGVnYWN5VW5tb3VudChjb250YWluZXIpIHtcbiAgdW5tb3VudENvbXBvbmVudEF0Tm9kZShjb250YWluZXIpO1xufVxuXG4vKiogQHByaXZhdGUgVGVzdCB1c2FnZS4gTm90IHdvcmsgaW4gcHJvZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF91KGNvbnRhaW5lcikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHJldHVybiBsZWdhY3lVbm1vdW50KGNvbnRhaW5lcik7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB1bm1vdW50KF94Mikge1xuICByZXR1cm4gX3VubW91bnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF91bm1vdW50KCkge1xuICBfdW5tb3VudCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGlmICghKGNyZWF0ZVJvb3QgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCBtb2Rlcm5Vbm1vdW50KGNvbnRhaW5lcikpO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgbGVnYWN5VW5tb3VudChjb250YWluZXIpO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMik7XG4gIH0pKTtcbiAgcmV0dXJuIF91bm1vdW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59IiwiaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJjaGlsZHJlblwiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCB2YXIgQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHt9KTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1vdGlvblByb3ZpZGVyKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBwcm9wc1xuICB9LCBjaGlsZHJlbik7XG59IiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBEb21XcmFwcGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhEb21XcmFwcGVyLCBfUmVhY3QkQ29tcG9uZW50KTtcbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihEb21XcmFwcGVyKTtcbiAgZnVuY3Rpb24gRG9tV3JhcHBlcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRG9tV3JhcHBlcik7XG4gICAgcmV0dXJuIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhEb21XcmFwcGVyLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBEb21XcmFwcGVyO1xufShSZWFjdC5Db21wb25lbnQpO1xuZXhwb3J0IGRlZmF1bHQgRG9tV3JhcHBlcjsiLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogU2FtZSBhcyBSZWFjdC51c2VTdGF0ZSBidXQgYHNldFN0YXRlYCBhY2NlcHQgYGlnbm9yZURlc3Ryb3lgIHBhcmFtIHRvIG5vdCB0byBzZXRTdGF0ZSBhZnRlciBkZXN0cm95ZWQuXG4gKiBXZSBkbyBub3QgbWFrZSB0aGlzIGF1dG8gaXMgdG8gYXZvaWQgcmVhbCBtZW1vcnkgbGVhay5cbiAqIERldmVsb3BlciBzaG91bGQgY29uZmlybSBpdCdzIHNhZmUgdG8gaWdub3JlIHRoZW1zZWx2ZXMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVNhZmVTdGF0ZShkZWZhdWx0VmFsdWUpIHtcbiAgdmFyIGRlc3Ryb3lSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZGVmYXVsdFZhbHVlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICB2YWx1ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0VmFsdWUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGRlc3Ryb3lSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBkZXN0cm95UmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgZnVuY3Rpb24gc2FmZVNldFN0YXRlKHVwZGF0ZXIsIGlnbm9yZURlc3Ryb3kpIHtcbiAgICBpZiAoaWdub3JlRGVzdHJveSAmJiBkZXN0cm95UmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0VmFsdWUodXBkYXRlcik7XG4gIH1cbiAgcmV0dXJuIFt2YWx1ZSwgc2FmZVNldFN0YXRlXTtcbn0iLCJleHBvcnQgdmFyIFNUQVRVU19OT05FID0gJ25vbmUnO1xuZXhwb3J0IHZhciBTVEFUVVNfQVBQRUFSID0gJ2FwcGVhcic7XG5leHBvcnQgdmFyIFNUQVRVU19FTlRFUiA9ICdlbnRlcic7XG5leHBvcnQgdmFyIFNUQVRVU19MRUFWRSA9ICdsZWF2ZSc7XG5leHBvcnQgdmFyIFNURVBfTk9ORSA9ICdub25lJztcbmV4cG9ydCB2YXIgU1RFUF9QUkVQQVJFID0gJ3ByZXBhcmUnO1xuZXhwb3J0IHZhciBTVEVQX1NUQVJUID0gJ3N0YXJ0JztcbmV4cG9ydCB2YXIgU1RFUF9BQ1RJVkUgPSAnYWN0aXZlJztcbmV4cG9ydCB2YXIgU1RFUF9BQ1RJVkFURUQgPSAnZW5kJztcbi8qKlxuICogVXNlZCBmb3IgZGlzYWJsZWQgbW90aW9uIGNhc2UuXG4gKiBQcmVwYXJlIHN0YWdlIHdpbGwgc3RpbGwgd29yayBidXQgc3RhcnQgJiBhY3RpdmUgd2lsbCBiZSBza2lwcGVkLlxuICovXG5leHBvcnQgdmFyIFNURVBfUFJFUEFSRUQgPSAncHJlcGFyZWQnOyIsImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBjYW5Vc2VET00gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2NhblVzZURvbVwiO1xuLy8gPT09PT09PT09PT09PT09PT0gVHJhbnNpdGlvbiA9PT09PT09PT09PT09PT09PVxuLy8gRXZlbnQgd3JhcHBlci4gQ29weSBmcm9tIHJlYWN0IHNvdXJjZSBjb2RlXG5mdW5jdGlvbiBtYWtlUHJlZml4TWFwKHN0eWxlUHJvcCwgZXZlbnROYW1lKSB7XG4gIHZhciBwcmVmaXhlcyA9IHt9O1xuICBwcmVmaXhlc1tzdHlsZVByb3AudG9Mb3dlckNhc2UoKV0gPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcHJlZml4ZXNbXCJXZWJraXRcIi5jb25jYXQoc3R5bGVQcm9wKV0gPSBcIndlYmtpdFwiLmNvbmNhdChldmVudE5hbWUpO1xuICBwcmVmaXhlc1tcIk1velwiLmNvbmNhdChzdHlsZVByb3ApXSA9IFwibW96XCIuY29uY2F0KGV2ZW50TmFtZSk7XG4gIHByZWZpeGVzW1wibXNcIi5jb25jYXQoc3R5bGVQcm9wKV0gPSBcIk1TXCIuY29uY2F0KGV2ZW50TmFtZSk7XG4gIHByZWZpeGVzW1wiT1wiLmNvbmNhdChzdHlsZVByb3ApXSA9IFwib1wiLmNvbmNhdChldmVudE5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIHJldHVybiBwcmVmaXhlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXhlcyhkb21TdXBwb3J0LCB3aW4pIHtcbiAgdmFyIHByZWZpeGVzID0ge1xuICAgIGFuaW1hdGlvbmVuZDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkVuZCcpLFxuICAgIHRyYW5zaXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ1RyYW5zaXRpb24nLCAnVHJhbnNpdGlvbkVuZCcpXG4gIH07XG4gIGlmIChkb21TdXBwb3J0KSB7XG4gICAgaWYgKCEoJ0FuaW1hdGlvbkV2ZW50JyBpbiB3aW4pKSB7XG4gICAgICBkZWxldGUgcHJlZml4ZXMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbjtcbiAgICB9XG4gICAgaWYgKCEoJ1RyYW5zaXRpb25FdmVudCcgaW4gd2luKSkge1xuICAgICAgZGVsZXRlIHByZWZpeGVzLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByZWZpeGVzO1xufVxudmFyIHZlbmRvclByZWZpeGVzID0gZ2V0VmVuZG9yUHJlZml4ZXMoY2FuVXNlRE9NKCksIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDoge30pO1xudmFyIHN0eWxlID0ge307XG5pZiAoY2FuVXNlRE9NKCkpIHtcbiAgdmFyIF9kb2N1bWVudCRjcmVhdGVFbGVtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBzdHlsZSA9IF9kb2N1bWVudCRjcmVhdGVFbGVtZS5zdHlsZTtcbn1cbnZhciBwcmVmaXhlZEV2ZW50TmFtZXMgPSB7fTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShldmVudE5hbWUpIHtcbiAgaWYgKHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdO1xuICB9XG4gIHZhciBwcmVmaXhNYXAgPSB2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdO1xuICBpZiAocHJlZml4TWFwKSB7XG4gICAgdmFyIHN0eWxlUHJvcExpc3QgPSBPYmplY3Qua2V5cyhwcmVmaXhNYXApO1xuICAgIHZhciBsZW4gPSBzdHlsZVByb3BMaXN0Lmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICB2YXIgc3R5bGVQcm9wID0gc3R5bGVQcm9wTGlzdFtpXTtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocHJlZml4TWFwLCBzdHlsZVByb3ApICYmIHN0eWxlUHJvcCBpbiBzdHlsZSkge1xuICAgICAgICBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXSA9IHByZWZpeE1hcFtzdHlsZVByb3BdO1xuICAgICAgICByZXR1cm4gcHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cbnZhciBpbnRlcm5hbEFuaW1hdGlvbkVuZE5hbWUgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uZW5kJyk7XG52YXIgaW50ZXJuYWxUcmFuc2l0aW9uRW5kTmFtZSA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCd0cmFuc2l0aW9uZW5kJyk7XG5leHBvcnQgdmFyIHN1cHBvcnRUcmFuc2l0aW9uID0gISEoaW50ZXJuYWxBbmltYXRpb25FbmROYW1lICYmIGludGVybmFsVHJhbnNpdGlvbkVuZE5hbWUpO1xuZXhwb3J0IHZhciBhbmltYXRpb25FbmROYW1lID0gaW50ZXJuYWxBbmltYXRpb25FbmROYW1lIHx8ICdhbmltYXRpb25lbmQnO1xuZXhwb3J0IHZhciB0cmFuc2l0aW9uRW5kTmFtZSA9IGludGVybmFsVHJhbnNpdGlvbkVuZE5hbWUgfHwgJ3RyYW5zaXRpb25lbmQnO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRyYW5zaXRpb25OYW1lKHRyYW5zaXRpb25OYW1lLCB0cmFuc2l0aW9uVHlwZSkge1xuICBpZiAoIXRyYW5zaXRpb25OYW1lKSByZXR1cm4gbnVsbDtcbiAgaWYgKF90eXBlb2YodHJhbnNpdGlvbk5hbWUpID09PSAnb2JqZWN0Jykge1xuICAgIHZhciB0eXBlID0gdHJhbnNpdGlvblR5cGUucmVwbGFjZSgvLVxcdy9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXRjaFsxXS50b1VwcGVyQ2FzZSgpO1xuICAgIH0pO1xuICAgIHJldHVybiB0cmFuc2l0aW9uTmFtZVt0eXBlXTtcbiAgfVxuICByZXR1cm4gXCJcIi5jb25jYXQodHJhbnNpdGlvbk5hbWUsIFwiLVwiKS5jb25jYXQodHJhbnNpdGlvblR5cGUpO1xufSIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGFuaW1hdGlvbkVuZE5hbWUsIHRyYW5zaXRpb25FbmROYW1lIH0gZnJvbSBcIi4uL3V0aWwvbW90aW9uXCI7XG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHZhciBjYWNoZUVsZW1lbnRSZWYgPSB1c2VSZWYoKTtcblxuICAvLyBDYWNoZSBjYWxsYmFja1xuICB2YXIgY2FsbGJhY2tSZWYgPSB1c2VSZWYoY2FsbGJhY2spO1xuICBjYWxsYmFja1JlZi5jdXJyZW50ID0gY2FsbGJhY2s7XG5cbiAgLy8gSW50ZXJuYWwgbW90aW9uIGV2ZW50IGhhbmRsZXJcbiAgdmFyIG9uSW50ZXJuYWxNb3Rpb25FbmQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBjYWxsYmFja1JlZi5jdXJyZW50KGV2ZW50KTtcbiAgfSwgW10pO1xuXG4gIC8vIFJlbW92ZSBldmVudHNcbiAgZnVuY3Rpb24gcmVtb3ZlTW90aW9uRXZlbnRzKGVsZW1lbnQpIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHRyYW5zaXRpb25FbmROYW1lLCBvbkludGVybmFsTW90aW9uRW5kKTtcbiAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhbmltYXRpb25FbmROYW1lLCBvbkludGVybmFsTW90aW9uRW5kKTtcbiAgICB9XG4gIH1cblxuICAvLyBQYXRjaCBldmVudHNcbiAgZnVuY3Rpb24gcGF0Y2hNb3Rpb25FdmVudHMoZWxlbWVudCkge1xuICAgIGlmIChjYWNoZUVsZW1lbnRSZWYuY3VycmVudCAmJiBjYWNoZUVsZW1lbnRSZWYuY3VycmVudCAhPT0gZWxlbWVudCkge1xuICAgICAgcmVtb3ZlTW90aW9uRXZlbnRzKGNhY2hlRWxlbWVudFJlZi5jdXJyZW50KTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudCAhPT0gY2FjaGVFbGVtZW50UmVmLmN1cnJlbnQpIHtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0cmFuc2l0aW9uRW5kTmFtZSwgb25JbnRlcm5hbE1vdGlvbkVuZCk7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoYW5pbWF0aW9uRW5kTmFtZSwgb25JbnRlcm5hbE1vdGlvbkVuZCk7XG5cbiAgICAgIC8vIFNhdmUgYXMgY2FjaGUgaW4gY2FzZSBkb20gcmVtb3ZlZCB0cmlnZ2VyIGJ5IGBtb3Rpb25EZWFkbGluZWBcbiAgICAgIGNhY2hlRWxlbWVudFJlZi5jdXJyZW50ID0gZWxlbWVudDtcbiAgICB9XG4gIH1cblxuICAvLyBDbGVhbiB1cCB3aGVuIHJlbW92ZWRcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVtb3ZlTW90aW9uRXZlbnRzKGNhY2hlRWxlbWVudFJlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBbcGF0Y2hNb3Rpb25FdmVudHMsIHJlbW92ZU1vdGlvbkV2ZW50c107XG59KTsiLCJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZUxheW91dEVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjYW5Vc2VEb20gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2NhblVzZURvbVwiO1xuXG4vLyBJdCdzIHNhZmUgdG8gdXNlIGB1c2VMYXlvdXRFZmZlY3RgIGJ1dCB0aGUgd2FybmluZyBpcyBhbm5veWluZ1xudmFyIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgPSBjYW5Vc2VEb20oKSA/IHVzZUxheW91dEVmZmVjdCA6IHVzZUVmZmVjdDtcbmV4cG9ydCBkZWZhdWx0IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3Q7IiwidmFyIHJhZiA9IGZ1bmN0aW9uIHJhZihjYWxsYmFjaykge1xuICByZXR1cm4gK3NldFRpbWVvdXQoY2FsbGJhY2ssIDE2KTtcbn07XG52YXIgY2FmID0gZnVuY3Rpb24gY2FmKG51bSkge1xuICByZXR1cm4gY2xlYXJUaW1lb3V0KG51bSk7XG59O1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmICdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUnIGluIHdpbmRvdykge1xuICByYWYgPSBmdW5jdGlvbiByYWYoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShjYWxsYmFjayk7XG4gIH07XG4gIGNhZiA9IGZ1bmN0aW9uIGNhZihoYW5kbGUpIHtcbiAgICByZXR1cm4gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKGhhbmRsZSk7XG4gIH07XG59XG52YXIgcmFmVVVJRCA9IDA7XG52YXIgcmFmSWRzID0gbmV3IE1hcCgpO1xuZnVuY3Rpb24gY2xlYW51cChpZCkge1xuICByYWZJZHMuZGVsZXRlKGlkKTtcbn1cbnZhciB3cmFwcGVyUmFmID0gZnVuY3Rpb24gd3JhcHBlclJhZihjYWxsYmFjaykge1xuICB2YXIgdGltZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDE7XG4gIHJhZlVVSUQgKz0gMTtcbiAgdmFyIGlkID0gcmFmVVVJRDtcbiAgZnVuY3Rpb24gY2FsbFJlZihsZWZ0VGltZXMpIHtcbiAgICBpZiAobGVmdFRpbWVzID09PSAwKSB7XG4gICAgICAvLyBDbGVhbiB1cFxuICAgICAgY2xlYW51cChpZCk7XG5cbiAgICAgIC8vIFRyaWdnZXJcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5leHQgcmFmXG4gICAgICB2YXIgcmVhbElkID0gcmFmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbFJlZihsZWZ0VGltZXMgLSAxKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBCaW5kIHJlYWwgcmFmIGlkXG4gICAgICByYWZJZHMuc2V0KGlkLCByZWFsSWQpO1xuICAgIH1cbiAgfVxuICBjYWxsUmVmKHRpbWVzKTtcbiAgcmV0dXJuIGlkO1xufTtcbndyYXBwZXJSYWYuY2FuY2VsID0gZnVuY3Rpb24gKGlkKSB7XG4gIHZhciByZWFsSWQgPSByYWZJZHMuZ2V0KGlkKTtcbiAgY2xlYW51cChyZWFsSWQpO1xuICByZXR1cm4gY2FmKHJlYWxJZCk7XG59O1xuZXhwb3J0IGRlZmF1bHQgd3JhcHBlclJhZjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5leHRGcmFtZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgZnVuY3Rpb24gY2FuY2VsTmV4dEZyYW1lKCkge1xuICAgIHJhZi5jYW5jZWwobmV4dEZyYW1lUmVmLmN1cnJlbnQpO1xuICB9XG4gIGZ1bmN0aW9uIG5leHRGcmFtZShjYWxsYmFjaykge1xuICAgIHZhciBkZWxheSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMjtcbiAgICBjYW5jZWxOZXh0RnJhbWUoKTtcbiAgICB2YXIgbmV4dEZyYW1lSWQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGRlbGF5IDw9IDEpIHtcbiAgICAgICAgY2FsbGJhY2soe1xuICAgICAgICAgIGlzQ2FuY2VsZWQ6IGZ1bmN0aW9uIGlzQ2FuY2VsZWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV4dEZyYW1lSWQgIT09IG5leHRGcmFtZVJlZi5jdXJyZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0RnJhbWUoY2FsbGJhY2ssIGRlbGF5IC0gMSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbmV4dEZyYW1lUmVmLmN1cnJlbnQgPSBuZXh0RnJhbWVJZDtcbiAgfVxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBjYW5jZWxOZXh0RnJhbWUoKTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBbbmV4dEZyYW1lLCBjYW5jZWxOZXh0RnJhbWVdO1xufSk7IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgdXNlU3RhdGUgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlU3RhdGVcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFNURVBfQUNUSVZBVEVELCBTVEVQX0FDVElWRSwgU1RFUF9OT05FLCBTVEVQX1BSRVBBUkUsIFNURVBfUFJFUEFSRUQsIFNURVBfU1RBUlQgfSBmcm9tIFwiLi4vaW50ZXJmYWNlXCI7XG5pbXBvcnQgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCBmcm9tIFwiLi91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgdXNlTmV4dEZyYW1lIGZyb20gXCIuL3VzZU5leHRGcmFtZVwiO1xudmFyIEZVTExfU1RFUF9RVUVVRSA9IFtTVEVQX1BSRVBBUkUsIFNURVBfU1RBUlQsIFNURVBfQUNUSVZFLCBTVEVQX0FDVElWQVRFRF07XG52YXIgU0lNUExFX1NURVBfUVVFVUUgPSBbU1RFUF9QUkVQQVJFLCBTVEVQX1BSRVBBUkVEXTtcblxuLyoqIFNraXAgY3VycmVudCBzdGVwICovXG5leHBvcnQgdmFyIFNraXBTdGVwID0gZmFsc2U7XG4vKiogQ3VycmVudCBzdGVwIHNob3VsZCBiZSB1cGRhdGUgaW4gKi9cbmV4cG9ydCB2YXIgRG9TdGVwID0gdHJ1ZTtcbmV4cG9ydCBmdW5jdGlvbiBpc0FjdGl2ZShzdGVwKSB7XG4gIHJldHVybiBzdGVwID09PSBTVEVQX0FDVElWRSB8fCBzdGVwID09PSBTVEVQX0FDVElWQVRFRDtcbn1cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoc3RhdHVzLCBwcmVwYXJlT25seSwgY2FsbGJhY2spIHtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKFNURVBfTk9ORSksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgc3RlcCA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0U3RlcCA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciBfdXNlTmV4dEZyYW1lID0gdXNlTmV4dEZyYW1lKCksXG4gICAgX3VzZU5leHRGcmFtZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTmV4dEZyYW1lLCAyKSxcbiAgICBuZXh0RnJhbWUgPSBfdXNlTmV4dEZyYW1lMlswXSxcbiAgICBjYW5jZWxOZXh0RnJhbWUgPSBfdXNlTmV4dEZyYW1lMlsxXTtcbiAgZnVuY3Rpb24gc3RhcnRRdWV1ZSgpIHtcbiAgICBzZXRTdGVwKFNURVBfUFJFUEFSRSwgdHJ1ZSk7XG4gIH1cbiAgdmFyIFNURVBfUVVFVUUgPSBwcmVwYXJlT25seSA/IFNJTVBMRV9TVEVQX1FVRVVFIDogRlVMTF9TVEVQX1FVRVVFO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc3RlcCAhPT0gU1RFUF9OT05FICYmIHN0ZXAgIT09IFNURVBfQUNUSVZBVEVEKSB7XG4gICAgICB2YXIgaW5kZXggPSBTVEVQX1FVRVVFLmluZGV4T2Yoc3RlcCk7XG4gICAgICB2YXIgbmV4dFN0ZXAgPSBTVEVQX1FVRVVFW2luZGV4ICsgMV07XG4gICAgICB2YXIgcmVzdWx0ID0gY2FsbGJhY2soc3RlcCk7XG4gICAgICBpZiAocmVzdWx0ID09PSBTa2lwU3RlcCkge1xuICAgICAgICAvLyBTa2lwIHdoZW4gbm8gbmVlZGVkXG4gICAgICAgIHNldFN0ZXAobmV4dFN0ZXAsIHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChuZXh0U3RlcCkge1xuICAgICAgICAvLyBEbyBhcyBmcmFtZSBmb3Igc3RlcCB1cGRhdGVcbiAgICAgICAgbmV4dEZyYW1lKGZ1bmN0aW9uIChpbmZvKSB7XG4gICAgICAgICAgZnVuY3Rpb24gZG9OZXh0KCkge1xuICAgICAgICAgICAgLy8gU2tpcCBzaW5jZSBjdXJyZW50IHF1ZXVlIGlzIG9vZFxuICAgICAgICAgICAgaWYgKGluZm8uaXNDYW5jZWxlZCgpKSByZXR1cm47XG4gICAgICAgICAgICBzZXRTdGVwKG5leHRTdGVwLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgZG9OZXh0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE9ubHkgcHJvbWlzZSBzaG91bGQgYmUgYXN5bmNcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4oZG9OZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW3N0YXR1cywgc3RlcF0pO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBjYW5jZWxOZXh0RnJhbWUoKTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBbc3RhcnRRdWV1ZSwgc3RlcF07XG59KTsiLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IHVzZVN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZVN0YXRlXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFNUQVRVU19BUFBFQVIsIFNUQVRVU19FTlRFUiwgU1RBVFVTX0xFQVZFLCBTVEFUVVNfTk9ORSwgU1RFUF9BQ1RJVkUsIFNURVBfUFJFUEFSRSwgU1RFUF9QUkVQQVJFRCwgU1RFUF9TVEFSVCB9IGZyb20gXCIuLi9pbnRlcmZhY2VcIjtcbmltcG9ydCB1c2VEb21Nb3Rpb25FdmVudHMgZnJvbSBcIi4vdXNlRG9tTW90aW9uRXZlbnRzXCI7XG5pbXBvcnQgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCBmcm9tIFwiLi91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgdXNlU3RlcFF1ZXVlLCB7IERvU3RlcCwgaXNBY3RpdmUsIFNraXBTdGVwIH0gZnJvbSBcIi4vdXNlU3RlcFF1ZXVlXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTdGF0dXMoc3VwcG9ydE1vdGlvbiwgdmlzaWJsZSwgZ2V0RWxlbWVudCwgX3JlZikge1xuICB2YXIgX3JlZiRtb3Rpb25FbnRlciA9IF9yZWYubW90aW9uRW50ZXIsXG4gICAgbW90aW9uRW50ZXIgPSBfcmVmJG1vdGlvbkVudGVyID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZiRtb3Rpb25FbnRlcixcbiAgICBfcmVmJG1vdGlvbkFwcGVhciA9IF9yZWYubW90aW9uQXBwZWFyLFxuICAgIG1vdGlvbkFwcGVhciA9IF9yZWYkbW90aW9uQXBwZWFyID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZiRtb3Rpb25BcHBlYXIsXG4gICAgX3JlZiRtb3Rpb25MZWF2ZSA9IF9yZWYubW90aW9uTGVhdmUsXG4gICAgbW90aW9uTGVhdmUgPSBfcmVmJG1vdGlvbkxlYXZlID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZiRtb3Rpb25MZWF2ZSxcbiAgICBtb3Rpb25EZWFkbGluZSA9IF9yZWYubW90aW9uRGVhZGxpbmUsXG4gICAgbW90aW9uTGVhdmVJbW1lZGlhdGVseSA9IF9yZWYubW90aW9uTGVhdmVJbW1lZGlhdGVseSxcbiAgICBvbkFwcGVhclByZXBhcmUgPSBfcmVmLm9uQXBwZWFyUHJlcGFyZSxcbiAgICBvbkVudGVyUHJlcGFyZSA9IF9yZWYub25FbnRlclByZXBhcmUsXG4gICAgb25MZWF2ZVByZXBhcmUgPSBfcmVmLm9uTGVhdmVQcmVwYXJlLFxuICAgIG9uQXBwZWFyU3RhcnQgPSBfcmVmLm9uQXBwZWFyU3RhcnQsXG4gICAgb25FbnRlclN0YXJ0ID0gX3JlZi5vbkVudGVyU3RhcnQsXG4gICAgb25MZWF2ZVN0YXJ0ID0gX3JlZi5vbkxlYXZlU3RhcnQsXG4gICAgb25BcHBlYXJBY3RpdmUgPSBfcmVmLm9uQXBwZWFyQWN0aXZlLFxuICAgIG9uRW50ZXJBY3RpdmUgPSBfcmVmLm9uRW50ZXJBY3RpdmUsXG4gICAgb25MZWF2ZUFjdGl2ZSA9IF9yZWYub25MZWF2ZUFjdGl2ZSxcbiAgICBvbkFwcGVhckVuZCA9IF9yZWYub25BcHBlYXJFbmQsXG4gICAgb25FbnRlckVuZCA9IF9yZWYub25FbnRlckVuZCxcbiAgICBvbkxlYXZlRW5kID0gX3JlZi5vbkxlYXZlRW5kLFxuICAgIG9uVmlzaWJsZUNoYW5nZWQgPSBfcmVmLm9uVmlzaWJsZUNoYW5nZWQ7XG4gIC8vIFVzZWQgZm9yIG91dGVyIHJlbmRlciB1c2FnZSB0byBhdm9pZCBgdmlzaWJsZTogZmFsc2UgJiBzdGF0dXM6IG5vbmVgIHRvIHJlbmRlciBub3RoaW5nXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZSgpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGFzeW5jVmlzaWJsZSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0QXN5bmNWaXNpYmxlID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZShTVEFUVVNfTk9ORSksXG4gICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgIHN0YXR1cyA9IF91c2VTdGF0ZTRbMF0sXG4gICAgc2V0U3RhdHVzID0gX3VzZVN0YXRlNFsxXTtcbiAgdmFyIF91c2VTdGF0ZTUgPSB1c2VTdGF0ZShudWxsKSxcbiAgICBfdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlNSwgMiksXG4gICAgc3R5bGUgPSBfdXNlU3RhdGU2WzBdLFxuICAgIHNldFN0eWxlID0gX3VzZVN0YXRlNlsxXTtcbiAgdmFyIG1vdW50ZWRSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICB2YXIgZGVhZGxpbmVSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IERvbSBOb2RlID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBnZXREb21FbGVtZW50KCkge1xuICAgIHJldHVybiBnZXRFbGVtZW50KCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBNb3Rpb24gRW5kID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBhY3RpdmVSZWYgPSB1c2VSZWYoZmFsc2UpO1xuXG4gIC8qKlxuICAgKiBDbGVhbiB1cCBzdGF0dXMgJiBzdHlsZVxuICAgKi9cbiAgZnVuY3Rpb24gdXBkYXRlTW90aW9uRW5kU3RhdHVzKCkge1xuICAgIHNldFN0YXR1cyhTVEFUVVNfTk9ORSwgdHJ1ZSk7XG4gICAgc2V0U3R5bGUobnVsbCwgdHJ1ZSk7XG4gIH1cbiAgZnVuY3Rpb24gb25JbnRlcm5hbE1vdGlvbkVuZChldmVudCkge1xuICAgIHZhciBlbGVtZW50ID0gZ2V0RG9tRWxlbWVudCgpO1xuICAgIGlmIChldmVudCAmJiAhZXZlbnQuZGVhZGxpbmUgJiYgZXZlbnQudGFyZ2V0ICE9PSBlbGVtZW50KSB7XG4gICAgICAvLyBldmVudCBleGlzdHNcbiAgICAgIC8vIG5vdCBpbml0aWF0ZWQgYnkgZGVhZGxpbmVcbiAgICAgIC8vIHRyYW5zaXRpb25FbmQgbm90IGZpcmVkIGJ5IGlubmVyIGVsZW1lbnRzXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBjdXJyZW50QWN0aXZlID0gYWN0aXZlUmVmLmN1cnJlbnQ7XG4gICAgdmFyIGNhbkVuZDtcbiAgICBpZiAoc3RhdHVzID09PSBTVEFUVVNfQVBQRUFSICYmIGN1cnJlbnRBY3RpdmUpIHtcbiAgICAgIGNhbkVuZCA9IG9uQXBwZWFyRW5kID09PSBudWxsIHx8IG9uQXBwZWFyRW5kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFwcGVhckVuZChlbGVtZW50LCBldmVudCk7XG4gICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IFNUQVRVU19FTlRFUiAmJiBjdXJyZW50QWN0aXZlKSB7XG4gICAgICBjYW5FbmQgPSBvbkVudGVyRW5kID09PSBudWxsIHx8IG9uRW50ZXJFbmQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRW50ZXJFbmQoZWxlbWVudCwgZXZlbnQpO1xuICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSBTVEFUVVNfTEVBVkUgJiYgY3VycmVudEFjdGl2ZSkge1xuICAgICAgY2FuRW5kID0gb25MZWF2ZUVuZCA9PT0gbnVsbCB8fCBvbkxlYXZlRW5kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkxlYXZlRW5kKGVsZW1lbnQsIGV2ZW50KTtcbiAgICB9XG5cbiAgICAvLyBPbmx5IHVwZGF0ZSBzdGF0dXMgd2hlbiBgY2FuRW5kYCBhbmQgbm90IGRlc3Ryb3llZFxuICAgIGlmIChzdGF0dXMgIT09IFNUQVRVU19OT05FICYmIGN1cnJlbnRBY3RpdmUgJiYgY2FuRW5kICE9PSBmYWxzZSkge1xuICAgICAgdXBkYXRlTW90aW9uRW5kU3RhdHVzKCk7XG4gICAgfVxuICB9XG4gIHZhciBfdXNlRG9tTW90aW9uRXZlbnRzID0gdXNlRG9tTW90aW9uRXZlbnRzKG9uSW50ZXJuYWxNb3Rpb25FbmQpLFxuICAgIF91c2VEb21Nb3Rpb25FdmVudHMyID0gX3NsaWNlZFRvQXJyYXkoX3VzZURvbU1vdGlvbkV2ZW50cywgMSksXG4gICAgcGF0Y2hNb3Rpb25FdmVudHMgPSBfdXNlRG9tTW90aW9uRXZlbnRzMlswXTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTdGVwID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBnZXRFdmVudEhhbmRsZXJzID0gZnVuY3Rpb24gZ2V0RXZlbnRIYW5kbGVycyh0YXJnZXRTdGF0dXMpIHtcbiAgICB2YXIgX3JlZjIsIF9yZWYzLCBfcmVmNDtcbiAgICBzd2l0Y2ggKHRhcmdldFN0YXR1cykge1xuICAgICAgY2FzZSBTVEFUVVNfQVBQRUFSOlxuICAgICAgICByZXR1cm4gX3JlZjIgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9yZWYyLCBTVEVQX1BSRVBBUkUsIG9uQXBwZWFyUHJlcGFyZSksIF9kZWZpbmVQcm9wZXJ0eShfcmVmMiwgU1RFUF9TVEFSVCwgb25BcHBlYXJTdGFydCksIF9kZWZpbmVQcm9wZXJ0eShfcmVmMiwgU1RFUF9BQ1RJVkUsIG9uQXBwZWFyQWN0aXZlKSwgX3JlZjI7XG4gICAgICBjYXNlIFNUQVRVU19FTlRFUjpcbiAgICAgICAgcmV0dXJuIF9yZWYzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfcmVmMywgU1RFUF9QUkVQQVJFLCBvbkVudGVyUHJlcGFyZSksIF9kZWZpbmVQcm9wZXJ0eShfcmVmMywgU1RFUF9TVEFSVCwgb25FbnRlclN0YXJ0KSwgX2RlZmluZVByb3BlcnR5KF9yZWYzLCBTVEVQX0FDVElWRSwgb25FbnRlckFjdGl2ZSksIF9yZWYzO1xuICAgICAgY2FzZSBTVEFUVVNfTEVBVkU6XG4gICAgICAgIHJldHVybiBfcmVmNCA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX3JlZjQsIFNURVBfUFJFUEFSRSwgb25MZWF2ZVByZXBhcmUpLCBfZGVmaW5lUHJvcGVydHkoX3JlZjQsIFNURVBfU1RBUlQsIG9uTGVhdmVTdGFydCksIF9kZWZpbmVQcm9wZXJ0eShfcmVmNCwgU1RFUF9BQ1RJVkUsIG9uTGVhdmVBY3RpdmUpLCBfcmVmNDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH07XG4gIHZhciBldmVudEhhbmRsZXJzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldEV2ZW50SGFuZGxlcnMoc3RhdHVzKTtcbiAgfSwgW3N0YXR1c10pO1xuICB2YXIgX3VzZVN0ZXBRdWV1ZSA9IHVzZVN0ZXBRdWV1ZShzdGF0dXMsICFzdXBwb3J0TW90aW9uLCBmdW5jdGlvbiAobmV3U3RlcCkge1xuICAgICAgLy8gT25seSBwcmVwYXJlIHN0ZXAgY2FuIGJlIHNraXBcbiAgICAgIGlmIChuZXdTdGVwID09PSBTVEVQX1BSRVBBUkUpIHtcbiAgICAgICAgdmFyIG9uUHJlcGFyZSA9IGV2ZW50SGFuZGxlcnNbU1RFUF9QUkVQQVJFXTtcbiAgICAgICAgaWYgKCFvblByZXBhcmUpIHtcbiAgICAgICAgICByZXR1cm4gU2tpcFN0ZXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9uUHJlcGFyZShnZXREb21FbGVtZW50KCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXN0IHN0ZXAgaXMgc3luYyB1cGRhdGVcbiAgICAgIGlmIChzdGVwIGluIGV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgdmFyIF9ldmVudEhhbmRsZXJzJHN0ZXA7XG4gICAgICAgIHNldFN0eWxlKCgoX2V2ZW50SGFuZGxlcnMkc3RlcCA9IGV2ZW50SGFuZGxlcnNbc3RlcF0pID09PSBudWxsIHx8IF9ldmVudEhhbmRsZXJzJHN0ZXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ldmVudEhhbmRsZXJzJHN0ZXAuY2FsbChldmVudEhhbmRsZXJzLCBnZXREb21FbGVtZW50KCksIG51bGwpKSB8fCBudWxsKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGVwID09PSBTVEVQX0FDVElWRSkge1xuICAgICAgICAvLyBQYXRjaCBldmVudHMgd2hlbiBtb3Rpb24gbmVlZGVkXG4gICAgICAgIHBhdGNoTW90aW9uRXZlbnRzKGdldERvbUVsZW1lbnQoKSk7XG4gICAgICAgIGlmIChtb3Rpb25EZWFkbGluZSA+IDApIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoZGVhZGxpbmVSZWYuY3VycmVudCk7XG4gICAgICAgICAgZGVhZGxpbmVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgb25JbnRlcm5hbE1vdGlvbkVuZCh7XG4gICAgICAgICAgICAgIGRlYWRsaW5lOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LCBtb3Rpb25EZWFkbGluZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdGVwID09PSBTVEVQX1BSRVBBUkVEKSB7XG4gICAgICAgIHVwZGF0ZU1vdGlvbkVuZFN0YXR1cygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIERvU3RlcDtcbiAgICB9KSxcbiAgICBfdXNlU3RlcFF1ZXVlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGVwUXVldWUsIDIpLFxuICAgIHN0YXJ0U3RlcCA9IF91c2VTdGVwUXVldWUyWzBdLFxuICAgIHN0ZXAgPSBfdXNlU3RlcFF1ZXVlMlsxXTtcbiAgdmFyIGFjdGl2ZSA9IGlzQWN0aXZlKHN0ZXApO1xuICBhY3RpdmVSZWYuY3VycmVudCA9IGFjdGl2ZTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN0YXR1cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFVwZGF0ZSB3aXRoIG5ldyBzdGF0dXNcbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0QXN5bmNWaXNpYmxlKHZpc2libGUpO1xuICAgIHZhciBpc01vdW50ZWQgPSBtb3VudGVkUmVmLmN1cnJlbnQ7XG4gICAgbW91bnRlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcblxuICAgIC8vIGlmICghc3VwcG9ydE1vdGlvbikge1xuICAgIC8vICAgcmV0dXJuO1xuICAgIC8vIH1cblxuICAgIHZhciBuZXh0U3RhdHVzO1xuXG4gICAgLy8gQXBwZWFyXG4gICAgaWYgKCFpc01vdW50ZWQgJiYgdmlzaWJsZSAmJiBtb3Rpb25BcHBlYXIpIHtcbiAgICAgIG5leHRTdGF0dXMgPSBTVEFUVVNfQVBQRUFSO1xuICAgIH1cblxuICAgIC8vIEVudGVyXG4gICAgaWYgKGlzTW91bnRlZCAmJiB2aXNpYmxlICYmIG1vdGlvbkVudGVyKSB7XG4gICAgICBuZXh0U3RhdHVzID0gU1RBVFVTX0VOVEVSO1xuICAgIH1cblxuICAgIC8vIExlYXZlXG4gICAgaWYgKGlzTW91bnRlZCAmJiAhdmlzaWJsZSAmJiBtb3Rpb25MZWF2ZSB8fCAhaXNNb3VudGVkICYmIG1vdGlvbkxlYXZlSW1tZWRpYXRlbHkgJiYgIXZpc2libGUgJiYgbW90aW9uTGVhdmUpIHtcbiAgICAgIG5leHRTdGF0dXMgPSBTVEFUVVNfTEVBVkU7XG4gICAgfVxuICAgIHZhciBuZXh0RXZlbnRIYW5kbGVycyA9IGdldEV2ZW50SGFuZGxlcnMobmV4dFN0YXR1cyk7XG5cbiAgICAvLyBVcGRhdGUgdG8gbmV4dCBzdGF0dXNcbiAgICBpZiAobmV4dFN0YXR1cyAmJiAoc3VwcG9ydE1vdGlvbiB8fCBuZXh0RXZlbnRIYW5kbGVyc1tTVEVQX1BSRVBBUkVdKSkge1xuICAgICAgc2V0U3RhdHVzKG5leHRTdGF0dXMpO1xuICAgICAgc3RhcnRTdGVwKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNldCBiYWNrIGluIGNhc2Ugbm8gbW90aW9uIGJ1dCBwcmV2IHN0YXR1cyBoYXMgcHJlcGFyZSBzdGVwXG4gICAgICBzZXRTdGF0dXMoU1RBVFVTX05PTkUpO1xuICAgIH1cbiAgfSwgW3Zpc2libGVdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJlc2V0IHdoZW4gbW90aW9uIGNoYW5nZWRcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoXG4gICAgLy8gQ2FuY2VsIGFwcGVhclxuICAgIHN0YXR1cyA9PT0gU1RBVFVTX0FQUEVBUiAmJiAhbW90aW9uQXBwZWFyIHx8XG4gICAgLy8gQ2FuY2VsIGVudGVyXG4gICAgc3RhdHVzID09PSBTVEFUVVNfRU5URVIgJiYgIW1vdGlvbkVudGVyIHx8XG4gICAgLy8gQ2FuY2VsIGxlYXZlXG4gICAgc3RhdHVzID09PSBTVEFUVVNfTEVBVkUgJiYgIW1vdGlvbkxlYXZlKSB7XG4gICAgICBzZXRTdGF0dXMoU1RBVFVTX05PTkUpO1xuICAgIH1cbiAgfSwgW21vdGlvbkFwcGVhciwgbW90aW9uRW50ZXIsIG1vdGlvbkxlYXZlXSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vdW50ZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgY2xlYXJUaW1lb3V0KGRlYWRsaW5lUmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtdKTtcblxuICAvLyBUcmlnZ2VyIGBvblZpc2libGVDaGFuZ2VkYFxuICB2YXIgZmlyc3RNb3VudENoYW5nZVJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgLy8gW3Zpc2libGUgJiBtb3Rpb24gbm90IGVuZF0gPT4gWyF2aXNpYmxlICYgbW90aW9uIGVuZF0gc3RpbGwgbmVlZCB0cmlnZ2VyIG9uVmlzaWJsZUNoYW5nZWRcbiAgICBpZiAoYXN5bmNWaXNpYmxlKSB7XG4gICAgICBmaXJzdE1vdW50Q2hhbmdlUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoYXN5bmNWaXNpYmxlICE9PSB1bmRlZmluZWQgJiYgc3RhdHVzID09PSBTVEFUVVNfTk9ORSkge1xuICAgICAgLy8gU2tpcCBmaXJzdCByZW5kZXIgaXMgaW52aXNpYmxlIHNpbmNlIGl0J3Mgbm90aGluZyBjaGFuZ2VkXG4gICAgICBpZiAoZmlyc3RNb3VudENoYW5nZVJlZi5jdXJyZW50IHx8IGFzeW5jVmlzaWJsZSkge1xuICAgICAgICBvblZpc2libGVDaGFuZ2VkID09PSBudWxsIHx8IG9uVmlzaWJsZUNoYW5nZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uVmlzaWJsZUNoYW5nZWQoYXN5bmNWaXNpYmxlKTtcbiAgICAgIH1cbiAgICAgIGZpcnN0TW91bnRDaGFuZ2VSZWYuY3VycmVudCA9IHRydWU7XG4gICAgfVxuICB9LCBbYXN5bmNWaXNpYmxlLCBzdGF0dXNdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN0eWxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZXJnZWRTdHlsZSA9IHN0eWxlO1xuICBpZiAoZXZlbnRIYW5kbGVyc1tTVEVQX1BSRVBBUkVdICYmIHN0ZXAgPT09IFNURVBfU1RBUlQpIHtcbiAgICBtZXJnZWRTdHlsZSA9IF9vYmplY3RTcHJlYWQoe1xuICAgICAgdHJhbnNpdGlvbjogJ25vbmUnXG4gICAgfSwgbWVyZ2VkU3R5bGUpO1xuICB9XG4gIHJldHVybiBbc3RhdHVzLCBzdGVwLCBtZXJnZWRTdHlsZSwgYXN5bmNWaXNpYmxlICE9PSBudWxsICYmIGFzeW5jVmlzaWJsZSAhPT0gdm9pZCAwID8gYXN5bmNWaXNpYmxlIDogdmlzaWJsZV07XG59IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L2RlZmF1bHQtcHJvcHMtbWF0Y2gtcHJvcC10eXBlcywgcmVhY3Qvbm8tbXVsdGktY29tcCwgcmVhY3QvcHJvcC10eXBlcyAqL1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgZmluZERPTU5vZGUgZnJvbSBcInJjLXV0aWwvZXMvRG9tL2ZpbmRET01Ob2RlXCI7XG5pbXBvcnQgeyBmaWxsUmVmLCBzdXBwb3J0UmVmIH0gZnJvbSBcInJjLXV0aWwvZXMvcmVmXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiO1xuaW1wb3J0IERvbVdyYXBwZXIgZnJvbSBcIi4vRG9tV3JhcHBlclwiO1xuaW1wb3J0IHVzZVN0YXR1cyBmcm9tIFwiLi9ob29rcy91c2VTdGF0dXNcIjtcbmltcG9ydCB7IGlzQWN0aXZlIH0gZnJvbSBcIi4vaG9va3MvdXNlU3RlcFF1ZXVlXCI7XG5pbXBvcnQgeyBTVEFUVVNfTk9ORSwgU1RFUF9QUkVQQVJFLCBTVEVQX1NUQVJUIH0gZnJvbSBcIi4vaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBnZXRUcmFuc2l0aW9uTmFtZSwgc3VwcG9ydFRyYW5zaXRpb24gfSBmcm9tIFwiLi91dGlsL21vdGlvblwiO1xuLyoqXG4gKiBgdHJhbnNpdGlvblN1cHBvcnRgIGlzIHVzZWQgZm9yIG5vbmUgdHJhbnNpdGlvbiB0ZXN0IGNhc2UuXG4gKiBEZWZhdWx0IHdlIHVzZSBicm93c2VyIHRyYW5zaXRpb24gZXZlbnQgc3VwcG9ydCBjaGVjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbkNTU01vdGlvbihjb25maWcpIHtcbiAgdmFyIHRyYW5zaXRpb25TdXBwb3J0ID0gY29uZmlnO1xuICBpZiAoX3R5cGVvZihjb25maWcpID09PSAnb2JqZWN0Jykge1xuICAgIHRyYW5zaXRpb25TdXBwb3J0ID0gY29uZmlnLnRyYW5zaXRpb25TdXBwb3J0O1xuICB9XG4gIGZ1bmN0aW9uIGlzU3VwcG9ydFRyYW5zaXRpb24ocHJvcHMsIGNvbnRleHRNb3Rpb24pIHtcbiAgICByZXR1cm4gISEocHJvcHMubW90aW9uTmFtZSAmJiB0cmFuc2l0aW9uU3VwcG9ydCAmJiBjb250ZXh0TW90aW9uICE9PSBmYWxzZSk7XG4gIH1cbiAgdmFyIENTU01vdGlvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gICAgdmFyIF9wcm9wcyR2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICAgIHZpc2libGUgPSBfcHJvcHMkdmlzaWJsZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyR2aXNpYmxlLFxuICAgICAgX3Byb3BzJHJlbW92ZU9uTGVhdmUgPSBwcm9wcy5yZW1vdmVPbkxlYXZlLFxuICAgICAgcmVtb3ZlT25MZWF2ZSA9IF9wcm9wcyRyZW1vdmVPbkxlYXZlID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJHJlbW92ZU9uTGVhdmUsXG4gICAgICBmb3JjZVJlbmRlciA9IHByb3BzLmZvcmNlUmVuZGVyLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIG1vdGlvbk5hbWUgPSBwcm9wcy5tb3Rpb25OYW1lLFxuICAgICAgbGVhdmVkQ2xhc3NOYW1lID0gcHJvcHMubGVhdmVkQ2xhc3NOYW1lLFxuICAgICAgZXZlbnRQcm9wcyA9IHByb3BzLmV2ZW50UHJvcHM7XG4gICAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb250ZXh0KSxcbiAgICAgIGNvbnRleHRNb3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5tb3Rpb247XG4gICAgdmFyIHN1cHBvcnRNb3Rpb24gPSBpc1N1cHBvcnRUcmFuc2l0aW9uKHByb3BzLCBjb250ZXh0TW90aW9uKTtcblxuICAgIC8vIFJlZiB0byB0aGUgcmVhY3Qgbm9kZSwgaXQgbWF5IGJlIGEgSFRNTEVsZW1lbnRcbiAgICB2YXIgbm9kZVJlZiA9IHVzZVJlZigpO1xuICAgIC8vIFJlZiB0byB0aGUgZG9tIHdyYXBwZXIgaW4gY2FzZSByZWYgY2FuIG5vdCBwYXNzIHRvIEhUTUxFbGVtZW50XG4gICAgdmFyIHdyYXBwZXJOb2RlUmVmID0gdXNlUmVmKCk7XG4gICAgZnVuY3Rpb24gZ2V0RG9tRWxlbWVudCgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEhlcmUgd2UncmUgYXZvaWRpbmcgY2FsbCBmb3IgZmluZERPTU5vZGUgc2luY2UgaXQncyBkZXByZWNhdGVkXG4gICAgICAgIC8vIGluIHN0cmljdCBtb2RlLiBXZSdyZSBjYWxsaW5nIGl0IG9ubHkgd2hlbiBub2RlIHJlZiBpcyBub3RcbiAgICAgICAgLy8gYW4gaW5zdGFuY2Ugb2YgRE9NIEhUTUxFbGVtZW50LiBPdGhlcndpc2UgdXNlXG4gICAgICAgIC8vIGZpbmRET01Ob2RlIGFzIGEgZmluYWwgcmVzb3J0XG4gICAgICAgIHJldHVybiBub2RlUmVmLmN1cnJlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IG5vZGVSZWYuY3VycmVudCA6IGZpbmRET01Ob2RlKHdyYXBwZXJOb2RlUmVmLmN1cnJlbnQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBPbmx5IGhhcHBlbiB3aGVuIGBtb3Rpb25EZWFkbGluZWAgdHJpZ2dlciBidXQgZWxlbWVudCByZW1vdmVkLlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIF91c2VTdGF0dXMgPSB1c2VTdGF0dXMoc3VwcG9ydE1vdGlvbiwgdmlzaWJsZSwgZ2V0RG9tRWxlbWVudCwgcHJvcHMpLFxuICAgICAgX3VzZVN0YXR1czIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdHVzLCA0KSxcbiAgICAgIHN0YXR1cyA9IF91c2VTdGF0dXMyWzBdLFxuICAgICAgc3RhdHVzU3RlcCA9IF91c2VTdGF0dXMyWzFdLFxuICAgICAgc3RhdHVzU3R5bGUgPSBfdXNlU3RhdHVzMlsyXSxcbiAgICAgIG1lcmdlZFZpc2libGUgPSBfdXNlU3RhdHVzMlszXTtcblxuICAgIC8vIFJlY29yZCB3aGV0aGVyIGNvbnRlbnQgaGFzIHJlbmRlcmVkXG4gICAgLy8gV2lsbCByZXR1cm4gbnVsbCBmb3IgdW4tcmVuZGVyZWQgZXZlbiB3aGVuIGByZW1vdmVPbkxlYXZlPXtmYWxzZX1gXG4gICAgdmFyIHJlbmRlcmVkUmVmID0gUmVhY3QudXNlUmVmKG1lcmdlZFZpc2libGUpO1xuICAgIGlmIChtZXJnZWRWaXNpYmxlKSB7XG4gICAgICByZW5kZXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09IFJlZnMgPT09PT09PT09PT09PT09PT09PT09PVxuICAgIHZhciBzZXROb2RlUmVmID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIG5vZGVSZWYuY3VycmVudCA9IG5vZGU7XG4gICAgICBmaWxsUmVmKHJlZiwgbm9kZSk7XG4gICAgfSwgW3JlZl0pO1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT1cbiAgICB2YXIgbW90aW9uQ2hpbGRyZW47XG4gICAgdmFyIG1lcmdlZFByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBldmVudFByb3BzKSwge30sIHtcbiAgICAgIHZpc2libGU6IHZpc2libGVcbiAgICB9KTtcbiAgICBpZiAoIWNoaWxkcmVuKSB7XG4gICAgICAvLyBObyBjaGlsZHJlblxuICAgICAgbW90aW9uQ2hpbGRyZW4gPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSBTVEFUVVNfTk9ORSkge1xuICAgICAgLy8gU3RhYmxlIGNoaWxkcmVuXG4gICAgICBpZiAobWVyZ2VkVmlzaWJsZSkge1xuICAgICAgICBtb3Rpb25DaGlsZHJlbiA9IGNoaWxkcmVuKF9vYmplY3RTcHJlYWQoe30sIG1lcmdlZFByb3BzKSwgc2V0Tm9kZVJlZik7XG4gICAgICB9IGVsc2UgaWYgKCFyZW1vdmVPbkxlYXZlICYmIHJlbmRlcmVkUmVmLmN1cnJlbnQgJiYgbGVhdmVkQ2xhc3NOYW1lKSB7XG4gICAgICAgIG1vdGlvbkNoaWxkcmVuID0gY2hpbGRyZW4oX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtZXJnZWRQcm9wcyksIHt9LCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBsZWF2ZWRDbGFzc05hbWVcbiAgICAgICAgfSksIHNldE5vZGVSZWYpO1xuICAgICAgfSBlbHNlIGlmIChmb3JjZVJlbmRlciB8fCAhcmVtb3ZlT25MZWF2ZSAmJiAhbGVhdmVkQ2xhc3NOYW1lKSB7XG4gICAgICAgIG1vdGlvbkNoaWxkcmVuID0gY2hpbGRyZW4oX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtZXJnZWRQcm9wcyksIHt9LCB7XG4gICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSksIHNldE5vZGVSZWYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW90aW9uQ2hpbGRyZW4gPSBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NsYXNzTmFtZXM7XG4gICAgICAvLyBJbiBtb3Rpb25cbiAgICAgIHZhciBzdGF0dXNTdWZmaXg7XG4gICAgICBpZiAoc3RhdHVzU3RlcCA9PT0gU1RFUF9QUkVQQVJFKSB7XG4gICAgICAgIHN0YXR1c1N1ZmZpeCA9ICdwcmVwYXJlJztcbiAgICAgIH0gZWxzZSBpZiAoaXNBY3RpdmUoc3RhdHVzU3RlcCkpIHtcbiAgICAgICAgc3RhdHVzU3VmZml4ID0gJ2FjdGl2ZSc7XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1c1N0ZXAgPT09IFNURVBfU1RBUlQpIHtcbiAgICAgICAgc3RhdHVzU3VmZml4ID0gJ3N0YXJ0JztcbiAgICAgIH1cbiAgICAgIHZhciBtb3Rpb25DbHMgPSBnZXRUcmFuc2l0aW9uTmFtZShtb3Rpb25OYW1lLCBcIlwiLmNvbmNhdChzdGF0dXMsIFwiLVwiKS5jb25jYXQoc3RhdHVzU3VmZml4KSk7XG4gICAgICBtb3Rpb25DaGlsZHJlbiA9IGNoaWxkcmVuKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgbWVyZ2VkUHJvcHMpLCB7fSwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoZ2V0VHJhbnNpdGlvbk5hbWUobW90aW9uTmFtZSwgc3RhdHVzKSwgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgbW90aW9uQ2xzLCBtb3Rpb25DbHMgJiYgc3RhdHVzU3VmZml4KSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBtb3Rpb25OYW1lLCB0eXBlb2YgbW90aW9uTmFtZSA9PT0gJ3N0cmluZycpLCBfY2xhc3NOYW1lcykpLFxuICAgICAgICBzdHlsZTogc3RhdHVzU3R5bGVcbiAgICAgIH0pLCBzZXROb2RlUmVmKTtcbiAgICB9XG5cbiAgICAvLyBBdXRvIGluamVjdCByZWYgaWYgY2hpbGQgbm9kZSBub3QgaGF2ZSBgcmVmYCBwcm9wc1xuICAgIGlmICggLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KG1vdGlvbkNoaWxkcmVuKSAmJiBzdXBwb3J0UmVmKG1vdGlvbkNoaWxkcmVuKSkge1xuICAgICAgdmFyIF9yZWYgPSBtb3Rpb25DaGlsZHJlbixcbiAgICAgICAgb3JpZ2luTm9kZVJlZiA9IF9yZWYucmVmO1xuICAgICAgaWYgKCFvcmlnaW5Ob2RlUmVmKSB7XG4gICAgICAgIG1vdGlvbkNoaWxkcmVuID0gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChtb3Rpb25DaGlsZHJlbiwge1xuICAgICAgICAgIHJlZjogc2V0Tm9kZVJlZlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERvbVdyYXBwZXIsIHtcbiAgICAgIHJlZjogd3JhcHBlck5vZGVSZWZcbiAgICB9LCBtb3Rpb25DaGlsZHJlbik7XG4gIH0pO1xuICBDU1NNb3Rpb24uZGlzcGxheU5hbWUgPSAnQ1NTTW90aW9uJztcbiAgcmV0dXJuIENTU01vdGlvbjtcbn1cbmV4cG9ydCBkZWZhdWx0IGdlbkNTU01vdGlvbihzdXBwb3J0VHJhbnNpdGlvbik7IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmV4cG9ydCB2YXIgU1RBVFVTX0FERCA9ICdhZGQnO1xuZXhwb3J0IHZhciBTVEFUVVNfS0VFUCA9ICdrZWVwJztcbmV4cG9ydCB2YXIgU1RBVFVTX1JFTU9WRSA9ICdyZW1vdmUnO1xuZXhwb3J0IHZhciBTVEFUVVNfUkVNT1ZFRCA9ICdyZW1vdmVkJztcbmV4cG9ydCBmdW5jdGlvbiB3cmFwS2V5VG9PYmplY3Qoa2V5KSB7XG4gIHZhciBrZXlPYmo7XG4gIGlmIChrZXkgJiYgX3R5cGVvZihrZXkpID09PSAnb2JqZWN0JyAmJiAna2V5JyBpbiBrZXkpIHtcbiAgICBrZXlPYmogPSBrZXk7XG4gIH0gZWxzZSB7XG4gICAga2V5T2JqID0ge1xuICAgICAga2V5OiBrZXlcbiAgICB9O1xuICB9XG4gIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGtleU9iaiksIHt9LCB7XG4gICAga2V5OiBTdHJpbmcoa2V5T2JqLmtleSlcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VLZXlzKCkge1xuICB2YXIga2V5cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107XG4gIHJldHVybiBrZXlzLm1hcCh3cmFwS2V5VG9PYmplY3QpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZLZXlzKCkge1xuICB2YXIgcHJldktleXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuICB2YXIgY3VycmVudEtleXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFtdO1xuICB2YXIgbGlzdCA9IFtdO1xuICB2YXIgY3VycmVudEluZGV4ID0gMDtcbiAgdmFyIGN1cnJlbnRMZW4gPSBjdXJyZW50S2V5cy5sZW5ndGg7XG4gIHZhciBwcmV2S2V5T2JqZWN0cyA9IHBhcnNlS2V5cyhwcmV2S2V5cyk7XG4gIHZhciBjdXJyZW50S2V5T2JqZWN0cyA9IHBhcnNlS2V5cyhjdXJyZW50S2V5cyk7XG5cbiAgLy8gQ2hlY2sgcHJldiBrZXlzIHRvIGluc2VydCBvciBrZWVwXG4gIHByZXZLZXlPYmplY3RzLmZvckVhY2goZnVuY3Rpb24gKGtleU9iaikge1xuICAgIHZhciBoaXQgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gY3VycmVudEluZGV4OyBpIDwgY3VycmVudExlbjsgaSArPSAxKSB7XG4gICAgICB2YXIgY3VycmVudEtleU9iaiA9IGN1cnJlbnRLZXlPYmplY3RzW2ldO1xuICAgICAgaWYgKGN1cnJlbnRLZXlPYmoua2V5ID09PSBrZXlPYmoua2V5KSB7XG4gICAgICAgIC8vIE5ldyBhZGRlZCBrZXlzIHNob3VsZCBhZGQgYmVmb3JlIGN1cnJlbnQga2V5XG4gICAgICAgIGlmIChjdXJyZW50SW5kZXggPCBpKSB7XG4gICAgICAgICAgbGlzdCA9IGxpc3QuY29uY2F0KGN1cnJlbnRLZXlPYmplY3RzLnNsaWNlKGN1cnJlbnRJbmRleCwgaSkubWFwKGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9iaiksIHt9LCB7XG4gICAgICAgICAgICAgIHN0YXR1czogU1RBVFVTX0FERFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIGN1cnJlbnRJbmRleCA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgbGlzdC5wdXNoKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY3VycmVudEtleU9iaiksIHt9LCB7XG4gICAgICAgICAgc3RhdHVzOiBTVEFUVVNfS0VFUFxuICAgICAgICB9KSk7XG4gICAgICAgIGN1cnJlbnRJbmRleCArPSAxO1xuICAgICAgICBoaXQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBub3QgaGl0LCBpdCBtZWFucyBrZXkgaXMgcmVtb3ZlZFxuICAgIGlmICghaGl0KSB7XG4gICAgICBsaXN0LnB1c2goX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBrZXlPYmopLCB7fSwge1xuICAgICAgICBzdGF0dXM6IFNUQVRVU19SRU1PVkVcbiAgICAgIH0pKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEFkZCByZXN0IHRvIHRoZSBsaXN0XG4gIGlmIChjdXJyZW50SW5kZXggPCBjdXJyZW50TGVuKSB7XG4gICAgbGlzdCA9IGxpc3QuY29uY2F0KGN1cnJlbnRLZXlPYmplY3RzLnNsaWNlKGN1cnJlbnRJbmRleCkubWFwKGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9iaiksIHt9LCB7XG4gICAgICAgIHN0YXR1czogU1RBVFVTX0FERFxuICAgICAgfSk7XG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIHNhbWUga2V5IHdoZW4gaXQgcmVtb3ZlIGFuZCBhZGQgYWdhaW46XG4gICAqICAgIFsxIC0gYWRkLCAyIC0ga2VlcCwgMSAtIHJlbW92ZV0gLT4gWzEgLSBrZWVwLCAyIC0ga2VlcF1cbiAgICovXG4gIHZhciBrZXlzID0ge307XG4gIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBrZXkgPSBfcmVmLmtleTtcbiAgICBrZXlzW2tleV0gPSAoa2V5c1trZXldIHx8IDApICsgMTtcbiAgfSk7XG4gIHZhciBkdXBsaWNhdGVkS2V5cyA9IE9iamVjdC5rZXlzKGtleXMpLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIGtleXNba2V5XSA+IDE7XG4gIH0pO1xuICBkdXBsaWNhdGVkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChtYXRjaEtleSkge1xuICAgIC8vIFJlbW92ZSBgU1RBVFVTX1JFTU9WRWAgbm9kZS5cbiAgICBsaXN0ID0gbGlzdC5maWx0ZXIoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICB2YXIga2V5ID0gX3JlZjIua2V5LFxuICAgICAgICBzdGF0dXMgPSBfcmVmMi5zdGF0dXM7XG4gICAgICByZXR1cm4ga2V5ICE9PSBtYXRjaEtleSB8fCBzdGF0dXMgIT09IFNUQVRVU19SRU1PVkU7XG4gICAgfSk7XG5cbiAgICAvLyBVcGRhdGUgYFNUQVRVU19BRERgIHRvIGBTVEFUVVNfS0VFUGBcbiAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLmtleSA9PT0gbWF0Y2hLZXkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIG5vZGUuc3RhdHVzID0gU1RBVFVTX0tFRVA7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gbGlzdDtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiY29tcG9uZW50XCIsIFwiY2hpbGRyZW5cIiwgXCJvblZpc2libGVDaGFuZ2VkXCIsIFwib25BbGxSZW1vdmVkXCJdLFxuICBfZXhjbHVkZWQyID0gW1wic3RhdHVzXCJdO1xuLyogZXNsaW50IHJlYWN0L3Byb3AtdHlwZXM6IDAgKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBPcmlnaW5DU1NNb3Rpb24gZnJvbSBcIi4vQ1NTTW90aW9uXCI7XG5pbXBvcnQgeyBzdXBwb3J0VHJhbnNpdGlvbiB9IGZyb20gXCIuL3V0aWwvbW90aW9uXCI7XG5pbXBvcnQgeyBTVEFUVVNfQURELCBTVEFUVVNfS0VFUCwgU1RBVFVTX1JFTU9WRSwgU1RBVFVTX1JFTU9WRUQsIGRpZmZLZXlzLCBwYXJzZUtleXMgfSBmcm9tIFwiLi91dGlsL2RpZmZcIjtcbnZhciBNT1RJT05fUFJPUF9OQU1FUyA9IFsnZXZlbnRQcm9wcycsICd2aXNpYmxlJywgJ2NoaWxkcmVuJywgJ21vdGlvbk5hbWUnLCAnbW90aW9uQXBwZWFyJywgJ21vdGlvbkVudGVyJywgJ21vdGlvbkxlYXZlJywgJ21vdGlvbkxlYXZlSW1tZWRpYXRlbHknLCAnbW90aW9uRGVhZGxpbmUnLCAncmVtb3ZlT25MZWF2ZScsICdsZWF2ZWRDbGFzc05hbWUnLCAnb25BcHBlYXJTdGFydCcsICdvbkFwcGVhckFjdGl2ZScsICdvbkFwcGVhckVuZCcsICdvbkVudGVyU3RhcnQnLCAnb25FbnRlckFjdGl2ZScsICdvbkVudGVyRW5kJywgJ29uTGVhdmVTdGFydCcsICdvbkxlYXZlQWN0aXZlJywgJ29uTGVhdmVFbmQnXTtcbi8qKlxuICogR2VuZXJhdGUgYSBDU1NNb3Rpb25MaXN0IGNvbXBvbmVudCB3aXRoIGNvbmZpZ1xuICogQHBhcmFtIHRyYW5zaXRpb25TdXBwb3J0IE5vIG5lZWQgc2luY2UgQ1NTTW90aW9uTGlzdCBubyBsb25nZXIgZGVwZW5kcyBvbiB0cmFuc2l0aW9uIHN1cHBvcnRcbiAqIEBwYXJhbSBDU1NNb3Rpb24gQ1NTTW90aW9uIGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuQ1NTTW90aW9uTGlzdCh0cmFuc2l0aW9uU3VwcG9ydCkge1xuICB2YXIgQ1NTTW90aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBPcmlnaW5DU1NNb3Rpb247XG4gIHZhciBDU1NNb3Rpb25MaXN0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICAgX2luaGVyaXRzKENTU01vdGlvbkxpc3QsIF9SZWFjdCRDb21wb25lbnQpO1xuICAgIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQ1NTTW90aW9uTGlzdCk7XG4gICAgZnVuY3Rpb24gQ1NTTW90aW9uTGlzdCgpIHtcbiAgICAgIHZhciBfdGhpcztcbiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDU1NNb3Rpb25MaXN0KTtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbC5hcHBseShfc3VwZXIsIFt0aGlzXS5jb25jYXQoYXJncykpO1xuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInN0YXRlXCIsIHtcbiAgICAgICAga2V5RW50aXRpZXM6IFtdXG4gICAgICB9KTtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJyZW1vdmVLZXlcIiwgZnVuY3Rpb24gKHJlbW92ZUtleSkge1xuICAgICAgICB2YXIga2V5RW50aXRpZXMgPSBfdGhpcy5zdGF0ZS5rZXlFbnRpdGllcztcbiAgICAgICAgdmFyIG5leHRLZXlFbnRpdGllcyA9IGtleUVudGl0aWVzLm1hcChmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgICAgaWYgKGVudGl0eS5rZXkgIT09IHJlbW92ZUtleSkgcmV0dXJuIGVudGl0eTtcbiAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBlbnRpdHkpLCB7fSwge1xuICAgICAgICAgICAgc3RhdHVzOiBTVEFUVVNfUkVNT1ZFRFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGtleUVudGl0aWVzOiBuZXh0S2V5RW50aXRpZXNcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXh0S2V5RW50aXRpZXMuZmlsdGVyKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgICAgdmFyIHN0YXR1cyA9IF9yZWYuc3RhdHVzO1xuICAgICAgICAgIHJldHVybiBzdGF0dXMgIT09IFNUQVRVU19SRU1PVkVEO1xuICAgICAgICB9KS5sZW5ndGg7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgX2NyZWF0ZUNsYXNzKENTU01vdGlvbkxpc3QsIFt7XG4gICAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgICAgdmFyIGtleUVudGl0aWVzID0gdGhpcy5zdGF0ZS5rZXlFbnRpdGllcztcbiAgICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBjb21wb25lbnQgPSBfdGhpcyRwcm9wcy5jb21wb25lbnQsXG4gICAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICBfb25WaXNpYmxlQ2hhbmdlZCA9IF90aGlzJHByb3BzLm9uVmlzaWJsZUNoYW5nZWQsXG4gICAgICAgICAgb25BbGxSZW1vdmVkID0gX3RoaXMkcHJvcHMub25BbGxSZW1vdmVkLFxuICAgICAgICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfdGhpcyRwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IGNvbXBvbmVudCB8fCBSZWFjdC5GcmFnbWVudDtcbiAgICAgICAgdmFyIG1vdGlvblByb3BzID0ge307XG4gICAgICAgIE1PVElPTl9QUk9QX05BTUVTLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICBtb3Rpb25Qcm9wc1twcm9wXSA9IHJlc3RQcm9wc1twcm9wXTtcbiAgICAgICAgICBkZWxldGUgcmVzdFByb3BzW3Byb3BdO1xuICAgICAgICB9KTtcbiAgICAgICAgZGVsZXRlIHJlc3RQcm9wcy5rZXlzO1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCByZXN0UHJvcHMsIGtleUVudGl0aWVzLm1hcChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgICB2YXIgc3RhdHVzID0gX3JlZjIuc3RhdHVzLFxuICAgICAgICAgICAgZXZlbnRQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmMiwgX2V4Y2x1ZGVkMik7XG4gICAgICAgICAgdmFyIHZpc2libGUgPSBzdGF0dXMgPT09IFNUQVRVU19BREQgfHwgc3RhdHVzID09PSBTVEFUVVNfS0VFUDtcbiAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ1NTTW90aW9uLCBfZXh0ZW5kcyh7fSwgbW90aW9uUHJvcHMsIHtcbiAgICAgICAgICAgIGtleTogZXZlbnRQcm9wcy5rZXksXG4gICAgICAgICAgICB2aXNpYmxlOiB2aXNpYmxlLFxuICAgICAgICAgICAgZXZlbnRQcm9wczogZXZlbnRQcm9wcyxcbiAgICAgICAgICAgIG9uVmlzaWJsZUNoYW5nZWQ6IGZ1bmN0aW9uIG9uVmlzaWJsZUNoYW5nZWQoY2hhbmdlZFZpc2libGUpIHtcbiAgICAgICAgICAgICAgX29uVmlzaWJsZUNoYW5nZWQgPT09IG51bGwgfHwgX29uVmlzaWJsZUNoYW5nZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vblZpc2libGVDaGFuZ2VkKGNoYW5nZWRWaXNpYmxlLCB7XG4gICAgICAgICAgICAgICAga2V5OiBldmVudFByb3BzLmtleVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKCFjaGFuZ2VkVmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIHZhciByZXN0S2V5c0NvdW50ID0gX3RoaXMyLnJlbW92ZUtleShldmVudFByb3BzLmtleSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3RLZXlzQ291bnQgPT09IDAgJiYgb25BbGxSZW1vdmVkKSB7XG4gICAgICAgICAgICAgICAgICBvbkFsbFJlbW92ZWQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSwgY2hpbGRyZW4pO1xuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfV0sIFt7XG4gICAgICBrZXk6IFwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKF9yZWYzLCBfcmVmNCkge1xuICAgICAgICB2YXIga2V5cyA9IF9yZWYzLmtleXM7XG4gICAgICAgIHZhciBrZXlFbnRpdGllcyA9IF9yZWY0LmtleUVudGl0aWVzO1xuICAgICAgICB2YXIgcGFyc2VkS2V5T2JqZWN0cyA9IHBhcnNlS2V5cyhrZXlzKTtcbiAgICAgICAgdmFyIG1peGVkS2V5RW50aXRpZXMgPSBkaWZmS2V5cyhrZXlFbnRpdGllcywgcGFyc2VkS2V5T2JqZWN0cyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAga2V5RW50aXRpZXM6IG1peGVkS2V5RW50aXRpZXMuZmlsdGVyKGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgICAgIHZhciBwcmV2RW50aXR5ID0ga2V5RW50aXRpZXMuZmluZChmdW5jdGlvbiAoX3JlZjUpIHtcbiAgICAgICAgICAgICAgdmFyIGtleSA9IF9yZWY1LmtleTtcbiAgICAgICAgICAgICAgcmV0dXJuIGVudGl0eS5rZXkgPT09IGtleTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBSZW1vdmUgaWYgYWxyZWFkeSBtYXJrIGFzIHJlbW92ZWRcbiAgICAgICAgICAgIGlmIChwcmV2RW50aXR5ICYmIHByZXZFbnRpdHkuc3RhdHVzID09PSBTVEFUVVNfUkVNT1ZFRCAmJiBlbnRpdHkuc3RhdHVzID09PSBTVEFUVVNfUkVNT1ZFKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFpvbWJpZUo6IFJldHVybiB0aGUgY291bnQgb2YgcmVzdCBrZXlzLiBJdCdzIHNhZmUgdG8gcmVmYWN0b3IgaWYgbmVlZCBtb3JlIGluZm8uXG4gICAgfV0pO1xuICAgIHJldHVybiBDU1NNb3Rpb25MaXN0O1xuICB9KFJlYWN0LkNvbXBvbmVudCk7XG4gIF9kZWZpbmVQcm9wZXJ0eShDU1NNb3Rpb25MaXN0LCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gICAgY29tcG9uZW50OiAnZGl2J1xuICB9KTtcbiAgcmV0dXJuIENTU01vdGlvbkxpc3Q7XG59XG5leHBvcnQgZGVmYXVsdCBnZW5DU1NNb3Rpb25MaXN0KHN1cHBvcnRUcmFuc2l0aW9uKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbnZhciBOb3RpY2UgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKE5vdGljZSwgX0NvbXBvbmVudCk7XG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoTm90aWNlKTtcbiAgZnVuY3Rpb24gTm90aWNlKCkge1xuICAgIHZhciBfdGhpcztcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTm90aWNlKTtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcbiAgICBfdGhpcy5jbG9zZVRpbWVyID0gbnVsbDtcbiAgICBfdGhpcy5jbG9zZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuICAgICAgX3RoaXMuY2xlYXJDbG9zZVRpbWVyKCk7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgb25DbG9zZSA9IF90aGlzJHByb3BzLm9uQ2xvc2UsXG4gICAgICAgIG5vdGljZUtleSA9IF90aGlzJHByb3BzLm5vdGljZUtleTtcbiAgICAgIGlmIChvbkNsb3NlKSB7XG4gICAgICAgIG9uQ2xvc2Uobm90aWNlS2V5KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIF90aGlzLnN0YXJ0Q2xvc2VUaW1lciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5wcm9wcy5kdXJhdGlvbikge1xuICAgICAgICBfdGhpcy5jbG9zZVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzLmNsb3NlKCk7XG4gICAgICAgIH0sIF90aGlzLnByb3BzLmR1cmF0aW9uICogMTAwMCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBfdGhpcy5jbGVhckNsb3NlVGltZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMuY2xvc2VUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQoX3RoaXMuY2xvc2VUaW1lcik7XG4gICAgICAgIF90aGlzLmNsb3NlVGltZXIgPSBudWxsO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhOb3RpY2UsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5zdGFydENsb3NlVGltZXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgIGlmICh0aGlzLnByb3BzLmR1cmF0aW9uICE9PSBwcmV2UHJvcHMuZHVyYXRpb24gfHwgdGhpcy5wcm9wcy51cGRhdGVNYXJrICE9PSBwcmV2UHJvcHMudXBkYXRlTWFyayB8fFxuICAgICAgLy8gVmlzaWJsZSBhZ2FpbiBuZWVkIHJlc2V0IHRpbWVyXG4gICAgICB0aGlzLnByb3BzLnZpc2libGUgIT09IHByZXZQcm9wcy52aXNpYmxlICYmIHRoaXMucHJvcHMudmlzaWJsZSkge1xuICAgICAgICB0aGlzLnJlc3RhcnRDbG9zZVRpbWVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdGhpcy5jbGVhckNsb3NlVGltZXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzdGFydENsb3NlVGltZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzdGFydENsb3NlVGltZXIoKSB7XG4gICAgICB0aGlzLmNsZWFyQ2xvc2VUaW1lcigpO1xuICAgICAgdGhpcy5zdGFydENsb3NlVGltZXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgIHByZWZpeENscyA9IF90aGlzJHByb3BzMi5wcmVmaXhDbHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzMi5jbGFzc05hbWUsXG4gICAgICAgIGNsb3NhYmxlID0gX3RoaXMkcHJvcHMyLmNsb3NhYmxlLFxuICAgICAgICBjbG9zZUljb24gPSBfdGhpcyRwcm9wczIuY2xvc2VJY29uLFxuICAgICAgICBzdHlsZSA9IF90aGlzJHByb3BzMi5zdHlsZSxcbiAgICAgICAgb25DbGljayA9IF90aGlzJHByb3BzMi5vbkNsaWNrLFxuICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzMi5jaGlsZHJlbixcbiAgICAgICAgaG9sZGVyID0gX3RoaXMkcHJvcHMyLmhvbGRlcjtcbiAgICAgIHZhciBjb21wb25lbnRDbGFzcyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbm90aWNlXCIpO1xuICAgICAgdmFyIGRhdGFPckFyaWFBdHRyaWJ1dGVQcm9wcyA9IE9iamVjdC5rZXlzKHRoaXMucHJvcHMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgaWYgKGtleS5zdWJzdHIoMCwgNSkgPT09ICdkYXRhLScgfHwga2V5LnN1YnN0cigwLCA1KSA9PT0gJ2FyaWEtJyB8fCBrZXkgPT09ICdyb2xlJykge1xuICAgICAgICAgIGFjY1trZXldID0gX3RoaXMyLnByb3BzW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9KTtcbiAgICAgIHZhciBub2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY29tcG9uZW50Q2xhc3MsIGNsYXNzTmFtZSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChjb21wb25lbnRDbGFzcywgXCItY2xvc2FibGVcIiksIGNsb3NhYmxlKSksXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgb25Nb3VzZUVudGVyOiB0aGlzLmNsZWFyQ2xvc2VUaW1lcixcbiAgICAgICAgb25Nb3VzZUxlYXZlOiB0aGlzLnN0YXJ0Q2xvc2VUaW1lcixcbiAgICAgICAgb25DbGljazogb25DbGlja1xuICAgICAgfSwgZGF0YU9yQXJpYUF0dHJpYnV0ZVByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KGNvbXBvbmVudENsYXNzLCBcIi1jb250ZW50XCIpXG4gICAgICB9LCBjaGlsZHJlbiksIGNsb3NhYmxlID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtcbiAgICAgICAgdGFiSW5kZXg6IDAsXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuY2xvc2UsXG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoY29tcG9uZW50Q2xhc3MsIFwiLWNsb3NlXCIpXG4gICAgICB9LCBjbG9zZUljb24gfHwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChjb21wb25lbnRDbGFzcywgXCItY2xvc2UteFwiKVxuICAgICAgfSkpIDogbnVsbCk7XG4gICAgICBpZiAoaG9sZGVyKSB7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3RET00uY3JlYXRlUG9ydGFsKG5vZGUsIGhvbGRlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIE5vdGljZTtcbn0oQ29tcG9uZW50KTtcbk5vdGljZS5kZWZhdWx0UHJvcHMgPSB7XG4gIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7fSxcbiAgZHVyYXRpb246IDEuNVxufTtcbmV4cG9ydCB7IE5vdGljZSBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTm90aWNlIGZyb20gJy4vTm90aWNlJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb25JbnN0YW5jZSkge1xuICB2YXIgY3JlYXRlZFJlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShbXSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgZWxlbWVudHMgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEVsZW1lbnRzID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgZnVuY3Rpb24gbm90aWZ5KG5vdGljZVByb3BzKSB7XG4gICAgdmFyIGZpcnN0TW91bnQgPSB0cnVlO1xuICAgIG5vdGlmaWNhdGlvbkluc3RhbmNlLmFkZChub3RpY2VQcm9wcywgZnVuY3Rpb24gKGRpdiwgcHJvcHMpIHtcbiAgICAgIHZhciBrZXkgPSBwcm9wcy5rZXk7XG4gICAgICBpZiAoZGl2ICYmICghY3JlYXRlZFJlZi5jdXJyZW50W2tleV0gfHwgZmlyc3RNb3VudCkpIHtcbiAgICAgICAgdmFyIG5vdGljZUVsZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE5vdGljZSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICAgICAgaG9sZGVyOiBkaXZcbiAgICAgICAgfSkpO1xuICAgICAgICBjcmVhdGVkUmVmLmN1cnJlbnRba2V5XSA9IG5vdGljZUVsZTtcbiAgICAgICAgc2V0RWxlbWVudHMoZnVuY3Rpb24gKG9yaWdpbkVsZW1lbnRzKSB7XG4gICAgICAgICAgdmFyIGluZGV4ID0gb3JpZ2luRWxlbWVudHMuZmluZEluZGV4KGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGUua2V5ID09PSBwcm9wcy5rZXk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkob3JpZ2luRWxlbWVudHMpLCBbbm90aWNlRWxlXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBjbG9uZUxpc3QgPSBfdG9Db25zdW1hYmxlQXJyYXkob3JpZ2luRWxlbWVudHMpO1xuICAgICAgICAgIGNsb25lTGlzdFtpbmRleF0gPSBub3RpY2VFbGU7XG4gICAgICAgICAgcmV0dXJuIGNsb25lTGlzdDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmaXJzdE1vdW50ID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIFtub3RpZnksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBlbGVtZW50cyldO1xufSIsImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xudmFyIF9leGNsdWRlZCA9IFtcImdldENvbnRhaW5lclwiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHJlbmRlciwgdW5tb3VudCB9IGZyb20gXCJyYy11dGlsL2VzL1JlYWN0L3JlbmRlclwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBDU1NNb3Rpb25MaXN0IH0gZnJvbSAncmMtbW90aW9uJztcbmltcG9ydCBOb3RpY2UgZnJvbSAnLi9Ob3RpY2UnO1xuaW1wb3J0IF91c2VOb3RpZmljYXRpb24gZnJvbSAnLi91c2VOb3RpZmljYXRpb24nO1xudmFyIHNlZWQgPSAwO1xudmFyIG5vdyA9IERhdGUubm93KCk7XG5mdW5jdGlvbiBnZXRVdWlkKCkge1xuICB2YXIgaWQgPSBzZWVkO1xuICBzZWVkICs9IDE7XG4gIHJldHVybiBcInJjTm90aWZpY2F0aW9uX1wiLmNvbmNhdChub3csIFwiX1wiKS5jb25jYXQoaWQpO1xufVxudmFyIE5vdGlmaWNhdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoTm90aWZpY2F0aW9uLCBfQ29tcG9uZW50KTtcbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihOb3RpZmljYXRpb24pO1xuICBmdW5jdGlvbiBOb3RpZmljYXRpb24oKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOb3RpZmljYXRpb24pO1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbC5hcHBseShfc3VwZXIsIFt0aGlzXS5jb25jYXQoYXJncykpO1xuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgbm90aWNlczogW11cbiAgICB9O1xuICAgIF90aGlzLmhvb2tSZWZzID0gbmV3IE1hcCgpO1xuICAgIF90aGlzLmFkZCA9IGZ1bmN0aW9uIChvcmlnaW5Ob3RpY2UsIGhvbGRlckNhbGxiYWNrKSB7XG4gICAgICB2YXIgX29yaWdpbk5vdGljZSRrZXk7XG4gICAgICB2YXIga2V5ID0gKF9vcmlnaW5Ob3RpY2Uka2V5ID0gb3JpZ2luTm90aWNlLmtleSkgIT09IG51bGwgJiYgX29yaWdpbk5vdGljZSRrZXkgIT09IHZvaWQgMCA/IF9vcmlnaW5Ob3RpY2Uka2V5IDogZ2V0VXVpZCgpO1xuICAgICAgdmFyIG5vdGljZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3JpZ2luTm90aWNlKSwge30sIHtcbiAgICAgICAga2V5OiBrZXlcbiAgICAgIH0pO1xuICAgICAgdmFyIG1heENvdW50ID0gX3RoaXMucHJvcHMubWF4Q291bnQ7XG4gICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldmlvdXNTdGF0ZSkge1xuICAgICAgICB2YXIgbm90aWNlcyA9IHByZXZpb3VzU3RhdGUubm90aWNlcztcbiAgICAgICAgdmFyIG5vdGljZUluZGV4ID0gbm90aWNlcy5tYXAoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICByZXR1cm4gdi5ub3RpY2Uua2V5O1xuICAgICAgICB9KS5pbmRleE9mKGtleSk7XG4gICAgICAgIHZhciB1cGRhdGVkTm90aWNlcyA9IG5vdGljZXMuY29uY2F0KCk7XG4gICAgICAgIGlmIChub3RpY2VJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICB1cGRhdGVkTm90aWNlcy5zcGxpY2Uobm90aWNlSW5kZXgsIDEsIHtcbiAgICAgICAgICAgIG5vdGljZTogbm90aWNlLFxuICAgICAgICAgICAgaG9sZGVyQ2FsbGJhY2s6IGhvbGRlckNhbGxiYWNrXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG1heENvdW50ICYmIG5vdGljZXMubGVuZ3RoID49IG1heENvdW50KSB7XG4gICAgICAgICAgICAvLyBYWFgsIHVzZSBrZXkgb2YgZmlyc3QgaXRlbSB0byB1cGRhdGUgbmV3IGFkZGVkIChsZXQgUmVhY3QgdG8gbW92ZSBleHNpdGluZ1xuICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiByZW1vdmUgYW5kIG1vdW50KS4gU2FtZSBrZXkgd2FzIHVzZWQgYmVmb3JlIGZvciBib3RoIGEpIGV4dGVybmFsXG4gICAgICAgICAgICAvLyBtYW51YWwgY29udHJvbCBhbmQgYikgaW50ZXJuYWwgcmVhY3QgJ2tleScgcHJvcCAsIHdoaWNoIGlzIG5vdCB0aGF0IGdvb2QuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIC8vIHpvbWJpZUo6IE5vdCBrbm93IHdoeSB1c2UgYHVwZGF0ZUtleWAuIFRoaXMgbWFrZXMgTm90aWNlIGluZmluaXRlIGxvb3AgaW4gamVzdC5cbiAgICAgICAgICAgIC8vIENoYW5nZSB0byBgdXBkYXRlTWFya2AgZm9yIGNvbXBhcmUgaW5zdGVhZC5cbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvbm90aWZpY2F0aW9uL2NvbW1pdC8zMjI5OWU2YmUzOTZmOTQwNDBiZmE4MjUxN2VlYTk0MGRiOTQ3ZWNlXG4gICAgICAgICAgICBub3RpY2Uua2V5ID0gdXBkYXRlZE5vdGljZXNbMF0ubm90aWNlLmtleTtcbiAgICAgICAgICAgIG5vdGljZS51cGRhdGVNYXJrID0gZ2V0VXVpZCgpO1xuICAgICAgICAgICAgLy8gem9tYmllSjogVGhhdCdzIHdoeS4gVXNlciBtYXkgY2xvc2UgYnkga2V5IGRpcmVjdGx5LlxuICAgICAgICAgICAgLy8gV2UgbmVlZCByZWNvcmQgdGhpcyBidXQgbm90IHJlLXJlbmRlciB0byBhdm9pZCB1cHBlciBpc3N1ZVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWNvbXBvbmVudC9ub3RpZmljYXRpb24vaXNzdWVzLzEyOVxuICAgICAgICAgICAgbm90aWNlLnVzZXJQYXNzS2V5ID0ga2V5O1xuICAgICAgICAgICAgdXBkYXRlZE5vdGljZXMuc2hpZnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdXBkYXRlZE5vdGljZXMucHVzaCh7XG4gICAgICAgICAgICBub3RpY2U6IG5vdGljZSxcbiAgICAgICAgICAgIGhvbGRlckNhbGxiYWNrOiBob2xkZXJDYWxsYmFja1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbm90aWNlczogdXBkYXRlZE5vdGljZXNcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgX3RoaXMucmVtb3ZlID0gZnVuY3Rpb24gKHJlbW92ZUtleSkge1xuICAgICAgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIG5vdGljZXMgPSBfcmVmLm5vdGljZXM7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbm90aWNlczogbm90aWNlcy5maWx0ZXIoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgICAgICB2YXIgX3JlZjIkbm90aWNlID0gX3JlZjIubm90aWNlLFxuICAgICAgICAgICAgICBrZXkgPSBfcmVmMiRub3RpY2Uua2V5LFxuICAgICAgICAgICAgICB1c2VyUGFzc0tleSA9IF9yZWYyJG5vdGljZS51c2VyUGFzc0tleTtcbiAgICAgICAgICAgIHZhciBtZXJnZWRLZXkgPSB1c2VyUGFzc0tleSAhPT0gbnVsbCAmJiB1c2VyUGFzc0tleSAhPT0gdm9pZCAwID8gdXNlclBhc3NLZXkgOiBrZXk7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VkS2V5ICE9PSByZW1vdmVLZXk7XG4gICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgX3RoaXMubm90aWNlUHJvcHNNYXAgPSB7fTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKE5vdGlmaWNhdGlvbiwgW3tcbiAgICBrZXk6IFwiZ2V0VHJhbnNpdGlvbk5hbWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbk5hbWUoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wcy5wcmVmaXhDbHMsXG4gICAgICAgIGFuaW1hdGlvbiA9IF90aGlzJHByb3BzLmFuaW1hdGlvbjtcbiAgICAgIHZhciB0cmFuc2l0aW9uTmFtZSA9IHRoaXMucHJvcHMudHJhbnNpdGlvbk5hbWU7XG4gICAgICBpZiAoIXRyYW5zaXRpb25OYW1lICYmIGFuaW1hdGlvbikge1xuICAgICAgICB0cmFuc2l0aW9uTmFtZSA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChhbmltYXRpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRyYW5zaXRpb25OYW1lO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG4gICAgICB2YXIgbm90aWNlcyA9IHRoaXMuc3RhdGUubm90aWNlcztcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczIucHJlZml4Q2xzLFxuICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczIuY2xhc3NOYW1lLFxuICAgICAgICBjbG9zZUljb24gPSBfdGhpcyRwcm9wczIuY2xvc2VJY29uLFxuICAgICAgICBzdHlsZSA9IF90aGlzJHByb3BzMi5zdHlsZTtcbiAgICAgIHZhciBub3RpY2VLZXlzID0gW107XG4gICAgICBub3RpY2VzLmZvckVhY2goZnVuY3Rpb24gKF9yZWYzLCBpbmRleCkge1xuICAgICAgICB2YXIgbm90aWNlID0gX3JlZjMubm90aWNlLFxuICAgICAgICAgIGhvbGRlckNhbGxiYWNrID0gX3JlZjMuaG9sZGVyQ2FsbGJhY2s7XG4gICAgICAgIHZhciB1cGRhdGVNYXJrID0gaW5kZXggPT09IG5vdGljZXMubGVuZ3RoIC0gMSA/IG5vdGljZS51cGRhdGVNYXJrIDogdW5kZWZpbmVkO1xuICAgICAgICB2YXIga2V5ID0gbm90aWNlLmtleSxcbiAgICAgICAgICB1c2VyUGFzc0tleSA9IG5vdGljZS51c2VyUGFzc0tleTtcbiAgICAgICAgdmFyIG5vdGljZVByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICAgIGNsb3NlSWNvbjogY2xvc2VJY29uXG4gICAgICAgIH0sIG5vdGljZSksIG5vdGljZS5wcm9wcyksIHt9LCB7XG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgbm90aWNlS2V5OiB1c2VyUGFzc0tleSB8fCBrZXksXG4gICAgICAgICAgdXBkYXRlTWFyazogdXBkYXRlTWFyayxcbiAgICAgICAgICBvbkNsb3NlOiBmdW5jdGlvbiBvbkNsb3NlKG5vdGljZUtleSkge1xuICAgICAgICAgICAgdmFyIF9ub3RpY2Ukb25DbG9zZTtcbiAgICAgICAgICAgIF90aGlzMi5yZW1vdmUobm90aWNlS2V5KTtcbiAgICAgICAgICAgIChfbm90aWNlJG9uQ2xvc2UgPSBub3RpY2Uub25DbG9zZSkgPT09IG51bGwgfHwgX25vdGljZSRvbkNsb3NlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbm90aWNlJG9uQ2xvc2UuY2FsbChub3RpY2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25DbGljazogbm90aWNlLm9uQ2xpY2ssXG4gICAgICAgICAgY2hpbGRyZW46IG5vdGljZS5jb250ZW50XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBHaXZlIHRvIG1vdGlvblxuICAgICAgICBub3RpY2VLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgX3RoaXMyLm5vdGljZVByb3BzTWFwW2tleV0gPSB7XG4gICAgICAgICAgcHJvcHM6IG5vdGljZVByb3BzLFxuICAgICAgICAgIGhvbGRlckNhbGxiYWNrOiBob2xkZXJDYWxsYmFja1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBjbGFzc05hbWUpLFxuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbkxpc3QsIHtcbiAgICAgICAga2V5czogbm90aWNlS2V5cyxcbiAgICAgICAgbW90aW9uTmFtZTogdGhpcy5nZXRUcmFuc2l0aW9uTmFtZSgpLFxuICAgICAgICBvblZpc2libGVDaGFuZ2VkOiBmdW5jdGlvbiBvblZpc2libGVDaGFuZ2VkKGNoYW5nZWRWaXNpYmxlLCBfcmVmNCkge1xuICAgICAgICAgIHZhciBrZXkgPSBfcmVmNC5rZXk7XG4gICAgICAgICAgaWYgKCFjaGFuZ2VkVmlzaWJsZSkge1xuICAgICAgICAgICAgZGVsZXRlIF90aGlzMi5ub3RpY2VQcm9wc01hcFtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgZnVuY3Rpb24gKF9yZWY1KSB7XG4gICAgICAgIHZhciBrZXkgPSBfcmVmNS5rZXksXG4gICAgICAgICAgbW90aW9uQ2xhc3NOYW1lID0gX3JlZjUuY2xhc3NOYW1lLFxuICAgICAgICAgIG1vdGlvblN0eWxlID0gX3JlZjUuc3R5bGUsXG4gICAgICAgICAgdmlzaWJsZSA9IF9yZWY1LnZpc2libGU7XG4gICAgICAgIHZhciBfdGhpczIkbm90aWNlUHJvcHNNYXAgPSBfdGhpczIubm90aWNlUHJvcHNNYXBba2V5XSxcbiAgICAgICAgICBub3RpY2VQcm9wcyA9IF90aGlzMiRub3RpY2VQcm9wc01hcC5wcm9wcyxcbiAgICAgICAgICBob2xkZXJDYWxsYmFjayA9IF90aGlzMiRub3RpY2VQcm9wc01hcC5ob2xkZXJDYWxsYmFjaztcbiAgICAgICAgaWYgKGhvbGRlckNhbGxiYWNrKSB7XG4gICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKG1vdGlvbkNsYXNzTmFtZSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ob29rLWhvbGRlclwiKSksXG4gICAgICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZCh7fSwgbW90aW9uU3R5bGUpLFxuICAgICAgICAgICAgcmVmOiBmdW5jdGlvbiByZWYoZGl2KSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZGl2KSB7XG4gICAgICAgICAgICAgICAgX3RoaXMyLmhvb2tSZWZzLnNldChrZXksIGRpdik7XG4gICAgICAgICAgICAgICAgaG9sZGVyQ2FsbGJhY2soZGl2LCBub3RpY2VQcm9wcyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgX3RoaXMyLmhvb2tSZWZzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE5vdGljZSwgX2V4dGVuZHMoe30sIG5vdGljZVByb3BzLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKG1vdGlvbkNsYXNzTmFtZSwgbm90aWNlUHJvcHMgPT09IG51bGwgfHwgbm90aWNlUHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5vdGljZVByb3BzLmNsYXNzTmFtZSksXG4gICAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgbW90aW9uU3R5bGUpLCBub3RpY2VQcm9wcyA9PT0gbnVsbCB8fCBub3RpY2VQcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogbm90aWNlUHJvcHMuc3R5bGUpLFxuICAgICAgICAgIHZpc2libGU6IHZpc2libGVcbiAgICAgICAgfSkpO1xuICAgICAgfSkpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gTm90aWZpY2F0aW9uO1xufShDb21wb25lbnQpO1xuTm90aWZpY2F0aW9uLm5ld0luc3RhbmNlID0gdm9pZCAwO1xuTm90aWZpY2F0aW9uLmRlZmF1bHRQcm9wcyA9IHtcbiAgcHJlZml4Q2xzOiAncmMtbm90aWZpY2F0aW9uJyxcbiAgYW5pbWF0aW9uOiAnZmFkZScsXG4gIHN0eWxlOiB7XG4gICAgdG9wOiA2NSxcbiAgICBsZWZ0OiAnNTAlJ1xuICB9XG59O1xuTm90aWZpY2F0aW9uLm5ld0luc3RhbmNlID0gZnVuY3Rpb24gbmV3Tm90aWZpY2F0aW9uSW5zdGFuY2UocHJvcGVydGllcywgY2FsbGJhY2spIHtcbiAgdmFyIF9yZWY2ID0gcHJvcGVydGllcyB8fCB7fSxcbiAgICBnZXRDb250YWluZXIgPSBfcmVmNi5nZXRDb250YWluZXIsXG4gICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjYsIF9leGNsdWRlZCk7XG4gIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgaWYgKGdldENvbnRhaW5lcikge1xuICAgIHZhciByb290ID0gZ2V0Q29udGFpbmVyKCk7XG4gICAgcm9vdC5hcHBlbmRDaGlsZChkaXYpO1xuICB9IGVsc2Uge1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgfVxuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIHJlZihub3RpZmljYXRpb24pIHtcbiAgICBpZiAoY2FsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhbGxlZCA9IHRydWU7XG4gICAgY2FsbGJhY2soe1xuICAgICAgbm90aWNlOiBmdW5jdGlvbiBub3RpY2Uobm90aWNlUHJvcHMpIHtcbiAgICAgICAgbm90aWZpY2F0aW9uLmFkZChub3RpY2VQcm9wcyk7XG4gICAgICB9LFxuICAgICAgcmVtb3ZlTm90aWNlOiBmdW5jdGlvbiByZW1vdmVOb3RpY2Uoa2V5KSB7XG4gICAgICAgIG5vdGlmaWNhdGlvbi5yZW1vdmUoa2V5KTtcbiAgICAgIH0sXG4gICAgICBjb21wb25lbnQ6IG5vdGlmaWNhdGlvbixcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIHVubW91bnQoZGl2KTtcbiAgICAgICAgaWYgKGRpdi5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgZGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZGl2KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIEhvb2tzXG4gICAgICB1c2VOb3RpZmljYXRpb246IGZ1bmN0aW9uIHVzZU5vdGlmaWNhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF91c2VOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvLyBPbmx5IHVzZWQgZm9yIHRlc3QgY2FzZSB1c2FnZVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0JyAmJiBwcm9wZXJ0aWVzLlRFU1RfUkVOREVSKSB7XG4gICAgcHJvcGVydGllcy5URVNUX1JFTkRFUiggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTm90aWZpY2F0aW9uLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgIHJlZjogcmVmXG4gICAgfSkpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgcmVuZGVyKCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChOb3RpZmljYXRpb24sIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmXG4gIH0pKSwgZGl2KTtcbn07XG5leHBvcnQgZGVmYXVsdCBOb3RpZmljYXRpb247IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCB1c2VSQ05vdGlmaWNhdGlvbiBmcm9tIFwicmMtbm90aWZpY2F0aW9uL2VzL3VzZU5vdGlmaWNhdGlvblwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgYXR0YWNoVHlwZUFwaSwgZ2V0S2V5VGhlbkluY3JlYXNlS2V5LCB0eXBlTGlzdCB9IGZyb20gJy4uJztcbmltcG9ydCB7IENvbmZpZ0NvbnN1bWVyIH0gZnJvbSAnLi4vLi4vY29uZmlnLXByb3ZpZGVyJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVVzZU1lc3NhZ2UoZ2V0UmNOb3RpZmljYXRpb25JbnN0YW5jZSwgZ2V0UkNOb3RpY2VQcm9wcykge1xuICB2YXIgdXNlTWVzc2FnZSA9IGZ1bmN0aW9uIHVzZU1lc3NhZ2UoKSB7XG4gICAgLy8gV2UgY2FuIG9ubHkgZ2V0IGNvbnRlbnQgYnkgcmVuZGVyXG4gICAgdmFyIGdldFByZWZpeENscztcbiAgICB2YXIgZ2V0UG9wdXBDb250YWluZXI7XG4gICAgLy8gV2UgY3JlYXRlIGEgcHJveHkgdG8gaGFuZGxlIGRlbGF5IGNyZWF0ZWQgaW5zdGFuY2VcbiAgICB2YXIgaW5uZXJJbnN0YW5jZSA9IG51bGw7XG4gICAgdmFyIHByb3h5ID0ge1xuICAgICAgYWRkOiBmdW5jdGlvbiBhZGQobm90aWNlUHJvcHMsIGhvbGRlckNhbGxiYWNrKSB7XG4gICAgICAgIGlubmVySW5zdGFuY2UgPT09IG51bGwgfHwgaW5uZXJJbnN0YW5jZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5uZXJJbnN0YW5jZS5jb21wb25lbnQuYWRkKG5vdGljZVByb3BzLCBob2xkZXJDYWxsYmFjayk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgX3VzZVJDTm90aWZpY2F0aW9uID0gdXNlUkNOb3RpZmljYXRpb24ocHJveHkpLFxuICAgICAgX3VzZVJDTm90aWZpY2F0aW9uMiA9IF9zbGljZWRUb0FycmF5KF91c2VSQ05vdGlmaWNhdGlvbiwgMiksXG4gICAgICBob29rTm90aWZ5ID0gX3VzZVJDTm90aWZpY2F0aW9uMlswXSxcbiAgICAgIGhvbGRlciA9IF91c2VSQ05vdGlmaWNhdGlvbjJbMV07XG4gICAgZnVuY3Rpb24gbm90aWZ5KGFyZ3MpIHtcbiAgICAgIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBhcmdzLnByZWZpeENscztcbiAgICAgIHZhciBtZXJnZWRQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ21lc3NhZ2UnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgICAgdmFyIHJvb3RQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoKTtcbiAgICAgIHZhciB0YXJnZXQgPSBhcmdzLmtleSB8fCBnZXRLZXlUaGVuSW5jcmVhc2VLZXkoKTtcbiAgICAgIHZhciBjbG9zZVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGFyZ3Mub25DbG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgYXJncy5vbkNsb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXNvbHZlKHRydWUpO1xuICAgICAgICB9O1xuICAgICAgICBnZXRSY05vdGlmaWNhdGlvbkluc3RhbmNlKF9leHRlbmRzKF9leHRlbmRzKHt9LCBhcmdzKSwge1xuICAgICAgICAgIHByZWZpeENsczogbWVyZ2VkUHJlZml4Q2xzLFxuICAgICAgICAgIHJvb3RQcmVmaXhDbHM6IHJvb3RQcmVmaXhDbHMsXG4gICAgICAgICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyXG4gICAgICAgIH0pLCBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICAgICAgICAgIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZTtcbiAgICAgICAgICBpbm5lckluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgICAgaG9va05vdGlmeShnZXRSQ05vdGljZVByb3BzKF9leHRlbmRzKF9leHRlbmRzKHt9LCBhcmdzKSwge1xuICAgICAgICAgICAga2V5OiB0YXJnZXQsXG4gICAgICAgICAgICBvbkNsb3NlOiBjYWxsYmFja1xuICAgICAgICAgIH0pLCBwcmVmaXhDbHMpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHZhciByZXN1bHQgPSBmdW5jdGlvbiByZXN1bHQoKSB7XG4gICAgICAgIGlmIChpbm5lckluc3RhbmNlKSB7XG4gICAgICAgICAgaW5uZXJJbnN0YW5jZS5yZW1vdmVOb3RpY2UodGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJlc3VsdC50aGVuID0gZnVuY3Rpb24gKGZpbGxlZCwgcmVqZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGNsb3NlUHJvbWlzZS50aGVuKGZpbGxlZCwgcmVqZWN0ZWQpO1xuICAgICAgfTtcbiAgICAgIHJlc3VsdC5wcm9taXNlID0gY2xvc2VQcm9taXNlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gRmlsbCBmdW5jdGlvbnNcbiAgICB2YXIgaG9va0FwaVJlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG4gICAgaG9va0FwaVJlZi5jdXJyZW50Lm9wZW4gPSBub3RpZnk7XG4gICAgdHlwZUxpc3QuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICAgICAgcmV0dXJuIGF0dGFjaFR5cGVBcGkoaG9va0FwaVJlZi5jdXJyZW50LCB0eXBlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gW2hvb2tBcGlSZWYuY3VycmVudCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29uZmlnQ29uc3VtZXIsIHtcbiAgICAgIGtleTogXCJob2xkZXJcIlxuICAgIH0sIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBnZXRQcmVmaXhDbHMgPSBjb250ZXh0LmdldFByZWZpeENscztcbiAgICAgIGdldFBvcHVwQ29udGFpbmVyID0gY29udGV4dC5nZXRQb3B1cENvbnRhaW5lcjtcbiAgICAgIHJldHVybiBob2xkZXI7XG4gICAgfSldO1xuICB9O1xuICByZXR1cm4gdXNlTWVzc2FnZTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgQ2hlY2tDaXJjbGVGaWxsZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0NoZWNrQ2lyY2xlRmlsbGVkXCI7XG5pbXBvcnQgQ2xvc2VDaXJjbGVGaWxsZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Nsb3NlQ2lyY2xlRmlsbGVkXCI7XG5pbXBvcnQgRXhjbGFtYXRpb25DaXJjbGVGaWxsZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0V4Y2xhbWF0aW9uQ2lyY2xlRmlsbGVkXCI7XG5pbXBvcnQgSW5mb0NpcmNsZUZpbGxlZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvSW5mb0NpcmNsZUZpbGxlZFwiO1xuaW1wb3J0IExvYWRpbmdPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvTG9hZGluZ091dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSQ05vdGlmaWNhdGlvbiBmcm9tICdyYy1ub3RpZmljYXRpb24nO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IENvbmZpZ1Byb3ZpZGVyLCB7IGdsb2JhbENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgY3JlYXRlVXNlTWVzc2FnZSBmcm9tICcuL2hvb2tzL3VzZU1lc3NhZ2UnO1xudmFyIG1lc3NhZ2VJbnN0YW5jZTtcbnZhciBkZWZhdWx0RHVyYXRpb24gPSAzO1xudmFyIGRlZmF1bHRUb3A7XG52YXIga2V5ID0gMTtcbnZhciBsb2NhbFByZWZpeENscyA9ICcnO1xudmFyIHRyYW5zaXRpb25OYW1lID0gJ21vdmUtdXAnO1xudmFyIGhhc1RyYW5zaXRpb25OYW1lID0gZmFsc2U7XG52YXIgZ2V0Q29udGFpbmVyO1xudmFyIG1heENvdW50O1xudmFyIHJ0bCA9IGZhbHNlO1xuZXhwb3J0IGZ1bmN0aW9uIGdldEtleVRoZW5JbmNyZWFzZUtleSgpIHtcbiAgcmV0dXJuIGtleSsrO1xufVxuZnVuY3Rpb24gc2V0TWVzc2FnZUNvbmZpZyhvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zLnRvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZGVmYXVsdFRvcCA9IG9wdGlvbnMudG9wO1xuICAgIG1lc3NhZ2VJbnN0YW5jZSA9IG51bGw7IC8vIGRlbGV0ZSBtZXNzYWdlSW5zdGFuY2UgZm9yIG5ldyBkZWZhdWx0VG9wXG4gIH1cblxuICBpZiAob3B0aW9ucy5kdXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZGVmYXVsdER1cmF0aW9uID0gb3B0aW9ucy5kdXJhdGlvbjtcbiAgfVxuICBpZiAob3B0aW9ucy5wcmVmaXhDbHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGxvY2FsUHJlZml4Q2xzID0gb3B0aW9ucy5wcmVmaXhDbHM7XG4gIH1cbiAgaWYgKG9wdGlvbnMuZ2V0Q29udGFpbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICBnZXRDb250YWluZXIgPSBvcHRpb25zLmdldENvbnRhaW5lcjtcbiAgICBtZXNzYWdlSW5zdGFuY2UgPSBudWxsOyAvLyBkZWxldGUgbWVzc2FnZUluc3RhbmNlIGZvciBuZXcgZ2V0Q29udGFpbmVyXG4gIH1cblxuICBpZiAob3B0aW9ucy50cmFuc2l0aW9uTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdHJhbnNpdGlvbk5hbWUgPSBvcHRpb25zLnRyYW5zaXRpb25OYW1lO1xuICAgIG1lc3NhZ2VJbnN0YW5jZSA9IG51bGw7IC8vIGRlbGV0ZSBtZXNzYWdlSW5zdGFuY2UgZm9yIG5ldyB0cmFuc2l0aW9uTmFtZVxuICAgIGhhc1RyYW5zaXRpb25OYW1lID0gdHJ1ZTtcbiAgfVxuICBpZiAob3B0aW9ucy5tYXhDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbWF4Q291bnQgPSBvcHRpb25zLm1heENvdW50O1xuICAgIG1lc3NhZ2VJbnN0YW5jZSA9IG51bGw7XG4gIH1cbiAgaWYgKG9wdGlvbnMucnRsICE9PSB1bmRlZmluZWQpIHtcbiAgICBydGwgPSBvcHRpb25zLnJ0bDtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0UkNOb3RpZmljYXRpb25JbnN0YW5jZShhcmdzLCBjYWxsYmFjaykge1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gYXJncy5wcmVmaXhDbHMsXG4gICAgZ2V0Q29udGV4dFBvcHVwQ29udGFpbmVyID0gYXJncy5nZXRQb3B1cENvbnRhaW5lcjtcbiAgdmFyIF9nbG9iYWxDb25maWcgPSBnbG9iYWxDb25maWcoKSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfZ2xvYmFsQ29uZmlnLmdldFByZWZpeENscyxcbiAgICBnZXRSb290UHJlZml4Q2xzID0gX2dsb2JhbENvbmZpZy5nZXRSb290UHJlZml4Q2xzLFxuICAgIGdldEljb25QcmVmaXhDbHMgPSBfZ2xvYmFsQ29uZmlnLmdldEljb25QcmVmaXhDbHM7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ21lc3NhZ2UnLCBjdXN0b21pemVQcmVmaXhDbHMgfHwgbG9jYWxQcmVmaXhDbHMpO1xuICB2YXIgcm9vdFByZWZpeENscyA9IGdldFJvb3RQcmVmaXhDbHMoYXJncy5yb290UHJlZml4Q2xzLCBwcmVmaXhDbHMpO1xuICB2YXIgaWNvblByZWZpeENscyA9IGdldEljb25QcmVmaXhDbHMoKTtcbiAgaWYgKG1lc3NhZ2VJbnN0YW5jZSkge1xuICAgIGNhbGxiYWNrKHtcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgcm9vdFByZWZpeENsczogcm9vdFByZWZpeENscyxcbiAgICAgIGljb25QcmVmaXhDbHM6IGljb25QcmVmaXhDbHMsXG4gICAgICBpbnN0YW5jZTogbWVzc2FnZUluc3RhbmNlXG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBpbnN0YW5jZUNvbmZpZyA9IHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICB0cmFuc2l0aW9uTmFtZTogaGFzVHJhbnNpdGlvbk5hbWUgPyB0cmFuc2l0aW9uTmFtZSA6IFwiXCIuY29uY2F0KHJvb3RQcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQodHJhbnNpdGlvbk5hbWUpLFxuICAgIHN0eWxlOiB7XG4gICAgICB0b3A6IGRlZmF1bHRUb3BcbiAgICB9LFxuICAgIGdldENvbnRhaW5lcjogZ2V0Q29udGFpbmVyIHx8IGdldENvbnRleHRQb3B1cENvbnRhaW5lcixcbiAgICBtYXhDb3VudDogbWF4Q291bnRcbiAgfTtcbiAgUkNOb3RpZmljYXRpb24ubmV3SW5zdGFuY2UoaW5zdGFuY2VDb25maWcsIGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgIGlmIChtZXNzYWdlSW5zdGFuY2UpIHtcbiAgICAgIGNhbGxiYWNrKHtcbiAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgIHJvb3RQcmVmaXhDbHM6IHJvb3RQcmVmaXhDbHMsXG4gICAgICAgIGljb25QcmVmaXhDbHM6IGljb25QcmVmaXhDbHMsXG4gICAgICAgIGluc3RhbmNlOiBtZXNzYWdlSW5zdGFuY2VcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBtZXNzYWdlSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0Jykge1xuICAgICAgbWVzc2FnZUluc3RhbmNlLmNvbmZpZyA9IGluc3RhbmNlQ29uZmlnO1xuICAgIH1cbiAgICBjYWxsYmFjayh7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIHJvb3RQcmVmaXhDbHM6IHJvb3RQcmVmaXhDbHMsXG4gICAgICBpY29uUHJlZml4Q2xzOiBpY29uUHJlZml4Q2xzLFxuICAgICAgaW5zdGFuY2U6IGluc3RhbmNlXG4gICAgfSk7XG4gIH0pO1xufVxudmFyIHR5cGVUb0ljb24gPSB7XG4gIGluZm86IEluZm9DaXJjbGVGaWxsZWQsXG4gIHN1Y2Nlc3M6IENoZWNrQ2lyY2xlRmlsbGVkLFxuICBlcnJvcjogQ2xvc2VDaXJjbGVGaWxsZWQsXG4gIHdhcm5pbmc6IEV4Y2xhbWF0aW9uQ2lyY2xlRmlsbGVkLFxuICBsb2FkaW5nOiBMb2FkaW5nT3V0bGluZWRcbn07XG5leHBvcnQgdmFyIHR5cGVMaXN0ID0gT2JqZWN0LmtleXModHlwZVRvSWNvbik7XG5mdW5jdGlvbiBnZXRSQ05vdGljZVByb3BzKGFyZ3MsIHByZWZpeENscywgaWNvblByZWZpeENscykge1xuICB2YXIgX2NsYXNzTmFtZXM7XG4gIHZhciBkdXJhdGlvbiA9IGFyZ3MuZHVyYXRpb24gIT09IHVuZGVmaW5lZCA/IGFyZ3MuZHVyYXRpb24gOiBkZWZhdWx0RHVyYXRpb247XG4gIHZhciBJY29uQ29tcG9uZW50ID0gdHlwZVRvSWNvblthcmdzLnR5cGVdO1xuICB2YXIgbWVzc2FnZUNsYXNzID0gY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWN1c3RvbS1jb250ZW50XCIpLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoYXJncy50eXBlKSwgYXJncy50eXBlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgcnRsID09PSB0cnVlKSwgX2NsYXNzTmFtZXMpKTtcbiAgcmV0dXJuIHtcbiAgICBrZXk6IGFyZ3Mua2V5LFxuICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICBzdHlsZTogYXJncy5zdHlsZSB8fCB7fSxcbiAgICBjbGFzc05hbWU6IGFyZ3MuY2xhc3NOYW1lLFxuICAgIGNvbnRlbnQ6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbmZpZ1Byb3ZpZGVyLCB7XG4gICAgICBpY29uUHJlZml4Q2xzOiBpY29uUHJlZml4Q2xzXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBtZXNzYWdlQ2xhc3NcbiAgICB9LCBhcmdzLmljb24gfHwgSWNvbkNvbXBvbmVudCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJY29uQ29tcG9uZW50LCBudWxsKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIGFyZ3MuY29udGVudCkpKSxcbiAgICBvbkNsb3NlOiBhcmdzLm9uQ2xvc2UsXG4gICAgb25DbGljazogYXJncy5vbkNsaWNrXG4gIH07XG59XG5mdW5jdGlvbiBub3RpY2UoYXJncykge1xuICB2YXIgdGFyZ2V0ID0gYXJncy5rZXkgfHwgZ2V0S2V5VGhlbkluY3JlYXNlS2V5KCk7XG4gIHZhciBjbG9zZVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uIGNhbGxiYWNrKCkge1xuICAgICAgaWYgKHR5cGVvZiBhcmdzLm9uQ2xvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgYXJncy5vbkNsb3NlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb2x2ZSh0cnVlKTtcbiAgICB9O1xuICAgIGdldFJDTm90aWZpY2F0aW9uSW5zdGFuY2UoYXJncywgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICAgICAgaWNvblByZWZpeENscyA9IF9yZWYuaWNvblByZWZpeENscyxcbiAgICAgICAgaW5zdGFuY2UgPSBfcmVmLmluc3RhbmNlO1xuICAgICAgaW5zdGFuY2Uubm90aWNlKGdldFJDTm90aWNlUHJvcHMoX2V4dGVuZHMoX2V4dGVuZHMoe30sIGFyZ3MpLCB7XG4gICAgICAgIGtleTogdGFyZ2V0LFxuICAgICAgICBvbkNsb3NlOiBjYWxsYmFja1xuICAgICAgfSksIHByZWZpeENscywgaWNvblByZWZpeENscykpO1xuICAgIH0pO1xuICB9KTtcbiAgdmFyIHJlc3VsdCA9IGZ1bmN0aW9uIHJlc3VsdCgpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKG1lc3NhZ2VJbnN0YW5jZSkge1xuICAgICAgbWVzc2FnZUluc3RhbmNlLnJlbW92ZU5vdGljZSh0YXJnZXQpO1xuICAgICAgKF9hID0gYXJncy5vbkNsb3NlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChhcmdzKTtcbiAgICB9XG4gIH07XG4gIHJlc3VsdC50aGVuID0gZnVuY3Rpb24gKGZpbGxlZCwgcmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gY2xvc2VQcm9taXNlLnRoZW4oZmlsbGVkLCByZWplY3RlZCk7XG4gIH07XG4gIHJlc3VsdC5wcm9taXNlID0gY2xvc2VQcm9taXNlO1xuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gaXNBcmdzUHJvcHMoY29udGVudCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGNvbnRlbnQpID09PSAnW29iamVjdCBPYmplY3RdJyAmJiAhIWNvbnRlbnQuY29udGVudDtcbn1cbnZhciBhcGkgPSB7XG4gIG9wZW46IG5vdGljZSxcbiAgY29uZmlnOiBzZXRNZXNzYWdlQ29uZmlnLFxuICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KG1lc3NhZ2VLZXkpIHtcbiAgICBpZiAobWVzc2FnZUluc3RhbmNlKSB7XG4gICAgICBpZiAobWVzc2FnZUtleSkge1xuICAgICAgICB2YXIgX21lc3NhZ2VJbnN0YW5jZSA9IG1lc3NhZ2VJbnN0YW5jZSxcbiAgICAgICAgICByZW1vdmVOb3RpY2UgPSBfbWVzc2FnZUluc3RhbmNlLnJlbW92ZU5vdGljZTtcbiAgICAgICAgcmVtb3ZlTm90aWNlKG1lc3NhZ2VLZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIF9tZXNzYWdlSW5zdGFuY2UyID0gbWVzc2FnZUluc3RhbmNlLFxuICAgICAgICAgIGRlc3Ryb3kgPSBfbWVzc2FnZUluc3RhbmNlMi5kZXN0cm95O1xuICAgICAgICBkZXN0cm95KCk7XG4gICAgICAgIG1lc3NhZ2VJbnN0YW5jZSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaFR5cGVBcGkob3JpZ2luYWxBcGksIHR5cGUpIHtcbiAgb3JpZ2luYWxBcGlbdHlwZV0gPSBmdW5jdGlvbiAoY29udGVudCwgZHVyYXRpb24sIG9uQ2xvc2UpIHtcbiAgICBpZiAoaXNBcmdzUHJvcHMoY29udGVudCkpIHtcbiAgICAgIHJldHVybiBvcmlnaW5hbEFwaS5vcGVuKF9leHRlbmRzKF9leHRlbmRzKHt9LCBjb250ZW50KSwge1xuICAgICAgICB0eXBlOiB0eXBlXG4gICAgICB9KSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZHVyYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9uQ2xvc2UgPSBkdXJhdGlvbjtcbiAgICAgIGR1cmF0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gb3JpZ2luYWxBcGkub3Blbih7XG4gICAgICBjb250ZW50OiBjb250ZW50LFxuICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIG9uQ2xvc2U6IG9uQ2xvc2VcbiAgICB9KTtcbiAgfTtcbn1cbnR5cGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgcmV0dXJuIGF0dGFjaFR5cGVBcGkoYXBpLCB0eXBlKTtcbn0pO1xuYXBpLndhcm4gPSBhcGkud2FybmluZztcbmFwaS51c2VNZXNzYWdlID0gY3JlYXRlVXNlTWVzc2FnZShnZXRSQ05vdGlmaWNhdGlvbkluc3RhbmNlLCBnZXRSQ05vdGljZVByb3BzKTtcbi8qKiBAaW50ZXJuYWwgdGVzdCBPbmx5IGZ1bmN0aW9uLiBOb3Qgd29yayBvbiBwcm9kdWN0aW9uICovXG5leHBvcnQgdmFyIGdldEluc3RhbmNlID0gZnVuY3Rpb24gZ2V0SW5zdGFuY2UoKSB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnID8gbWVzc2FnZUluc3RhbmNlIDogbnVsbDtcbn07XG5leHBvcnQgZGVmYXVsdCBhcGk7IiwiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgQ2hlY2tDaXJjbGVPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNjk5IDM1M2gtNDYuOWMtMTAuMiAwLTE5LjkgNC45LTI1LjkgMTMuM0w0NjkgNTg0LjNsLTcxLjItOTguOGMtNi04LjMtMTUuNi0xMy4zLTI1LjktMTMuM0gzMjVjLTYuNSAwLTEwLjMgNy40LTYuNSAxMi43bDEyNC42IDE3Mi44YTMxLjggMzEuOCAwIDAwNTEuNyAwbDIxMC42LTI5MmMzLjktNS4zLjEtMTIuNy02LjQtMTIuN3pcIiB9IH0sIHsgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTEyIDY0QzI2NC42IDY0IDY0IDI2NC42IDY0IDUxMnMyMDAuNiA0NDggNDQ4IDQ0OCA0NDgtMjAwLjYgNDQ4LTQ0OFM3NTkuNCA2NCA1MTIgNjR6bTAgODIwYy0yMDUuNCAwLTM3Mi0xNjYuNi0zNzItMzcyczE2Ni42LTM3MiAzNzItMzcyIDM3MiAxNjYuNiAzNzIgMzcyLTE2Ni42IDM3Mi0zNzIgMzcyelwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiY2hlY2stY2lyY2xlXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBDaGVja0NpcmNsZU91dGxpbmVkO1xuIiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ2hlY2tDaXJjbGVPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9DaGVja0NpcmNsZU91dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSAnLi4vY29tcG9uZW50cy9BbnRkSWNvbic7XG52YXIgQ2hlY2tDaXJjbGVPdXRsaW5lZCA9IGZ1bmN0aW9uIENoZWNrQ2lyY2xlT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IENoZWNrQ2lyY2xlT3V0bGluZWRTdmdcbiAgfSkpO1xufTtcbkNoZWNrQ2lyY2xlT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnQ2hlY2tDaXJjbGVPdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihDaGVja0NpcmNsZU91dGxpbmVkKTsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBDbG9zZUNpcmNsZU91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk02ODUuNCAzNTQuOGMwLTQuNC0zLjYtOC04LThsLTY2IC4zTDUxMiA0NjUuNmwtOTkuMy0xMTguNC02Ni4xLS4zYy00LjQgMC04IDMuNS04IDggMCAxLjkuNyAzLjcgMS45IDUuMmwxMzAuMSAxNTVMMzQwLjUgNjcwYTguMzIgOC4zMiAwIDAwLTEuOSA1LjJjMCA0LjQgMy42IDggOCA4bDY2LjEtLjNMNTEyIDU2NC40bDk5LjMgMTE4LjQgNjYgLjNjNC40IDAgOC0zLjUgOC04IDAtMS45LS43LTMuNy0xLjktNS4yTDU1My41IDUxNWwxMzAuMS0xNTVjMS4yLTEuNCAxLjgtMy4zIDEuOC01LjJ6XCIgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTUxMiA2NUMyNjQuNiA2NSA2NCAyNjUuNiA2NCA1MTNzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjUgNTEyIDY1em0wIDgyMGMtMjA1LjQgMC0zNzItMTY2LjYtMzcyLTM3MnMxNjYuNi0zNzIgMzcyLTM3MiAzNzIgMTY2LjYgMzcyIDM3Mi0xNjYuNiAzNzItMzcyIDM3MnpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImNsb3NlLWNpcmNsZVwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgQ2xvc2VDaXJjbGVPdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IENsb3NlQ2lyY2xlT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2xvc2VDaXJjbGVPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIENsb3NlQ2lyY2xlT3V0bGluZWQgPSBmdW5jdGlvbiBDbG9zZUNpcmNsZU91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBDbG9zZUNpcmNsZU91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5DbG9zZUNpcmNsZU91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0Nsb3NlQ2lyY2xlT3V0bGluZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoQ2xvc2VDaXJjbGVPdXRsaW5lZCk7IiwiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgQ2xvc2VPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTYzLjggNTEybDI2Mi41LTMxMi45YzQuNC01LjIuNy0xMy4xLTYuMS0xMy4xaC03OS44Yy00LjcgMC05LjIgMi4xLTEyLjMgNS43TDUxMS42IDQ0OS44IDI5NS4xIDE5MS43Yy0zLTMuNi03LjUtNS43LTEyLjMtNS43SDIwM2MtNi44IDAtMTAuNSA3LjktNi4xIDEzLjFMNDU5LjQgNTEyIDE5Ni45IDgyNC45QTcuOTUgNy45NSAwIDAwMjAzIDgzOGg3OS44YzQuNyAwIDkuMi0yLjEgMTIuMy01LjdsMjE2LjUtMjU4LjEgMjE2LjUgMjU4LjFjMyAzLjYgNy41IDUuNyAxMi4zIDUuN2g3OS44YzYuOCAwIDEwLjUtNy45IDYuMS0xMy4xTDU2My44IDUxMnpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImNsb3NlXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBDbG9zZU91dGxpbmVkO1xuIiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ2xvc2VPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9DbG9zZU91dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSAnLi4vY29tcG9uZW50cy9BbnRkSWNvbic7XG52YXIgQ2xvc2VPdXRsaW5lZCA9IGZ1bmN0aW9uIENsb3NlT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IENsb3NlT3V0bGluZWRTdmdcbiAgfSkpO1xufTtcbkNsb3NlT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnQ2xvc2VPdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihDbG9zZU91dGxpbmVkKTsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBFeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk01MTIgNjRDMjY0LjYgNjQgNjQgMjY0LjYgNjQgNTEyczIwMC42IDQ0OCA0NDggNDQ4IDQ0OC0yMDAuNiA0NDgtNDQ4Uzc1OS40IDY0IDUxMiA2NHptMCA4MjBjLTIwNS40IDAtMzcyLTE2Ni42LTM3Mi0zNzJzMTY2LjYtMzcyIDM3Mi0zNzIgMzcyIDE2Ni42IDM3MiAzNzItMTY2LjYgMzcyLTM3MiAzNzJ6XCIgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTQ2NCA2ODhhNDggNDggMCAxMDk2IDAgNDggNDggMCAxMC05NiAwem0yNC0xMTJoNDhjNC40IDAgOC0zLjYgOC04VjI5NmMwLTQuNC0zLjYtOC04LThoLTQ4Yy00LjQgMC04IDMuNi04IDh2MjcyYzAgNC40IDMuNiA4IDggOHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImV4Y2xhbWF0aW9uLWNpcmNsZVwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEV4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIEV4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWQgPSBmdW5jdGlvbiBFeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBFeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5FeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0V4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCk7IiwiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgSW5mb0NpcmNsZU91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk01MTIgNjRDMjY0LjYgNjQgNjQgMjY0LjYgNjQgNTEyczIwMC42IDQ0OCA0NDggNDQ4IDQ0OC0yMDAuNiA0NDgtNDQ4Uzc1OS40IDY0IDUxMiA2NHptMCA4MjBjLTIwNS40IDAtMzcyLTE2Ni42LTM3Mi0zNzJzMTY2LjYtMzcyIDM3Mi0zNzIgMzcyIDE2Ni42IDM3MiAzNzItMTY2LjYgMzcyLTM3MiAzNzJ6XCIgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTQ2NCAzMzZhNDggNDggMCAxMDk2IDAgNDggNDggMCAxMC05NiAwem03MiAxMTJoLTQ4Yy00LjQgMC04IDMuNi04IDh2MjcyYzAgNC40IDMuNiA4IDggOGg0OGM0LjQgMCA4LTMuNiA4LThWNDU2YzAtNC40LTMuNi04LTgtOHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImluZm8tY2lyY2xlXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBJbmZvQ2lyY2xlT3V0bGluZWQ7XG4iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBJbmZvQ2lyY2xlT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vSW5mb0NpcmNsZU91dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSAnLi4vY29tcG9uZW50cy9BbnRkSWNvbic7XG52YXIgSW5mb0NpcmNsZU91dGxpbmVkID0gZnVuY3Rpb24gSW5mb0NpcmNsZU91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBJbmZvQ2lyY2xlT3V0bGluZWRTdmdcbiAgfSkpO1xufTtcbkluZm9DaXJjbGVPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdJbmZvQ2lyY2xlT3V0bGluZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoSW5mb0NpcmNsZU91dGxpbmVkKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IHVzZVJDTm90aWZpY2F0aW9uIGZyb20gXCJyYy1ub3RpZmljYXRpb24vZXMvdXNlTm90aWZpY2F0aW9uXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb25zdW1lciB9IGZyb20gJy4uLy4uL2NvbmZpZy1wcm92aWRlcic7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVVc2VOb3RpZmljYXRpb24oZ2V0Tm90aWZpY2F0aW9uSW5zdGFuY2UsIGdldFJDTm90aWNlUHJvcHMpIHtcbiAgdmFyIHVzZU5vdGlmaWNhdGlvbiA9IGZ1bmN0aW9uIHVzZU5vdGlmaWNhdGlvbigpIHtcbiAgICAvLyBXZSBjYW4gb25seSBnZXQgY29udGVudCBieSByZW5kZXJcbiAgICB2YXIgZ2V0UHJlZml4Q2xzO1xuICAgIC8vIFdlIGNyZWF0ZSBhIHByb3h5IHRvIGhhbmRsZSBkZWxheSBjcmVhdGVkIGluc3RhbmNlXG4gICAgdmFyIGlubmVySW5zdGFuY2UgPSBudWxsO1xuICAgIHZhciBwcm94eSA9IHtcbiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKG5vdGljZVByb3BzLCBob2xkZXJDYWxsYmFjaykge1xuICAgICAgICBpbm5lckluc3RhbmNlID09PSBudWxsIHx8IGlubmVySW5zdGFuY2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGlubmVySW5zdGFuY2UuY29tcG9uZW50LmFkZChub3RpY2VQcm9wcywgaG9sZGVyQ2FsbGJhY2spO1xuICAgICAgfVxuICAgIH07XG4gICAgdmFyIF91c2VSQ05vdGlmaWNhdGlvbiA9IHVzZVJDTm90aWZpY2F0aW9uKHByb3h5KSxcbiAgICAgIF91c2VSQ05vdGlmaWNhdGlvbjIgPSBfc2xpY2VkVG9BcnJheShfdXNlUkNOb3RpZmljYXRpb24sIDIpLFxuICAgICAgaG9va05vdGlmeSA9IF91c2VSQ05vdGlmaWNhdGlvbjJbMF0sXG4gICAgICBob2xkZXIgPSBfdXNlUkNOb3RpZmljYXRpb24yWzFdO1xuICAgIGZ1bmN0aW9uIG5vdGlmeShhcmdzKSB7XG4gICAgICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gYXJncy5wcmVmaXhDbHM7XG4gICAgICB2YXIgbWVyZ2VkUHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdub3RpZmljYXRpb24nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgICAgZ2V0Tm90aWZpY2F0aW9uSW5zdGFuY2UoX2V4dGVuZHMoX2V4dGVuZHMoe30sIGFyZ3MpLCB7XG4gICAgICAgIHByZWZpeENsczogbWVyZ2VkUHJlZml4Q2xzXG4gICAgICB9KSwgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgICAgICAgIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZTtcbiAgICAgICAgaW5uZXJJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICBob29rTm90aWZ5KGdldFJDTm90aWNlUHJvcHMoYXJncywgcHJlZml4Q2xzKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gRmlsbCBmdW5jdGlvbnNcbiAgICB2YXIgaG9va0FwaVJlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG4gICAgaG9va0FwaVJlZi5jdXJyZW50Lm9wZW4gPSBub3RpZnk7XG4gICAgWydzdWNjZXNzJywgJ2luZm8nLCAnd2FybmluZycsICdlcnJvciddLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgIGhvb2tBcGlSZWYuY3VycmVudFt0eXBlXSA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgIHJldHVybiBob29rQXBpUmVmLmN1cnJlbnQub3BlbihfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgYXJncyksIHtcbiAgICAgICAgICB0eXBlOiB0eXBlXG4gICAgICAgIH0pKTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIFtob29rQXBpUmVmLmN1cnJlbnQsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbmZpZ0NvbnN1bWVyLCB7XG4gICAgICBrZXk6IFwiaG9sZGVyXCJcbiAgICB9LCBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgZ2V0UHJlZml4Q2xzID0gY29udGV4dC5nZXRQcmVmaXhDbHM7XG4gICAgICByZXR1cm4gaG9sZGVyO1xuICAgIH0pXTtcbiAgfTtcbiAgcmV0dXJuIHVzZU5vdGlmaWNhdGlvbjtcbn0iLCJpbXBvcnQgX3JlZ2VuZXJhdG9yUnVudGltZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcmVnZW5lcmF0b3JSdW50aW1lXCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG52YXIgX19hd2FpdGVyID0gdGhpcyAmJiB0aGlzLl9fYXdhaXRlciB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHtcbiAgICAgIHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpO1xuICAgIH1cbiAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufTtcbmltcG9ydCBDaGVja0NpcmNsZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DaGVja0NpcmNsZU91dGxpbmVkXCI7XG5pbXBvcnQgQ2xvc2VDaXJjbGVPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQ2xvc2VDaXJjbGVPdXRsaW5lZFwiO1xuaW1wb3J0IENsb3NlT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Nsb3NlT3V0bGluZWRcIjtcbmltcG9ydCBFeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkXCI7XG5pbXBvcnQgSW5mb0NpcmNsZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9JbmZvQ2lyY2xlT3V0bGluZWRcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IE5vdGlmaWNhdGlvbiBmcm9tICdyYy1ub3RpZmljYXRpb24nO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IENvbmZpZ1Byb3ZpZGVyLCB7IGdsb2JhbENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgY3JlYXRlVXNlTm90aWZpY2F0aW9uIGZyb20gJy4vaG9va3MvdXNlTm90aWZpY2F0aW9uJztcbnZhciBub3RpZmljYXRpb25JbnN0YW5jZSA9IHt9O1xudmFyIGRlZmF1bHREdXJhdGlvbiA9IDQuNTtcbnZhciBkZWZhdWx0VG9wID0gMjQ7XG52YXIgZGVmYXVsdEJvdHRvbSA9IDI0O1xudmFyIGRlZmF1bHRQcmVmaXhDbHMgPSAnJztcbnZhciBkZWZhdWx0UGxhY2VtZW50ID0gJ3RvcFJpZ2h0JztcbnZhciBkZWZhdWx0R2V0Q29udGFpbmVyO1xudmFyIGRlZmF1bHRDbG9zZUljb247XG52YXIgcnRsID0gZmFsc2U7XG52YXIgbWF4Q291bnQ7XG5mdW5jdGlvbiBzZXROb3RpZmljYXRpb25Db25maWcob3B0aW9ucykge1xuICB2YXIgZHVyYXRpb24gPSBvcHRpb25zLmR1cmF0aW9uLFxuICAgIHBsYWNlbWVudCA9IG9wdGlvbnMucGxhY2VtZW50LFxuICAgIGJvdHRvbSA9IG9wdGlvbnMuYm90dG9tLFxuICAgIHRvcCA9IG9wdGlvbnMudG9wLFxuICAgIGdldENvbnRhaW5lciA9IG9wdGlvbnMuZ2V0Q29udGFpbmVyLFxuICAgIGNsb3NlSWNvbiA9IG9wdGlvbnMuY2xvc2VJY29uLFxuICAgIHByZWZpeENscyA9IG9wdGlvbnMucHJlZml4Q2xzO1xuICBpZiAocHJlZml4Q2xzICE9PSB1bmRlZmluZWQpIHtcbiAgICBkZWZhdWx0UHJlZml4Q2xzID0gcHJlZml4Q2xzO1xuICB9XG4gIGlmIChkdXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZGVmYXVsdER1cmF0aW9uID0gZHVyYXRpb247XG4gIH1cbiAgaWYgKHBsYWNlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZGVmYXVsdFBsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgfSBlbHNlIGlmIChvcHRpb25zLnJ0bCkge1xuICAgIGRlZmF1bHRQbGFjZW1lbnQgPSAndG9wTGVmdCc7XG4gIH1cbiAgaWYgKGJvdHRvbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZGVmYXVsdEJvdHRvbSA9IGJvdHRvbTtcbiAgfVxuICBpZiAodG9wICE9PSB1bmRlZmluZWQpIHtcbiAgICBkZWZhdWx0VG9wID0gdG9wO1xuICB9XG4gIGlmIChnZXRDb250YWluZXIgIT09IHVuZGVmaW5lZCkge1xuICAgIGRlZmF1bHRHZXRDb250YWluZXIgPSBnZXRDb250YWluZXI7XG4gIH1cbiAgaWYgKGNsb3NlSWNvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZGVmYXVsdENsb3NlSWNvbiA9IGNsb3NlSWNvbjtcbiAgfVxuICBpZiAob3B0aW9ucy5ydGwgIT09IHVuZGVmaW5lZCkge1xuICAgIHJ0bCA9IG9wdGlvbnMucnRsO1xuICB9XG4gIGlmIChvcHRpb25zLm1heENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICBtYXhDb3VudCA9IG9wdGlvbnMubWF4Q291bnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFBsYWNlbWVudFN0eWxlKHBsYWNlbWVudCkge1xuICB2YXIgdG9wID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBkZWZhdWx0VG9wO1xuICB2YXIgYm90dG9tID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBkZWZhdWx0Qm90dG9tO1xuICB2YXIgc3R5bGU7XG4gIHN3aXRjaCAocGxhY2VtZW50KSB7XG4gICAgY2FzZSAndG9wJzpcbiAgICAgIHN0eWxlID0ge1xuICAgICAgICBsZWZ0OiAnNTAlJyxcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtNTAlKScsXG4gICAgICAgIHJpZ2h0OiAnYXV0bycsXG4gICAgICAgIHRvcDogdG9wLFxuICAgICAgICBib3R0b206ICdhdXRvJ1xuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RvcExlZnQnOlxuICAgICAgc3R5bGUgPSB7XG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIHRvcDogdG9wLFxuICAgICAgICBib3R0b206ICdhdXRvJ1xuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RvcFJpZ2h0JzpcbiAgICAgIHN0eWxlID0ge1xuICAgICAgICByaWdodDogMCxcbiAgICAgICAgdG9wOiB0b3AsXG4gICAgICAgIGJvdHRvbTogJ2F1dG8nXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICAgIHN0eWxlID0ge1xuICAgICAgICBsZWZ0OiAnNTAlJyxcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtNTAlKScsXG4gICAgICAgIHJpZ2h0OiAnYXV0bycsXG4gICAgICAgIHRvcDogJ2F1dG8nLFxuICAgICAgICBib3R0b206IGJvdHRvbVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2JvdHRvbUxlZnQnOlxuICAgICAgc3R5bGUgPSB7XG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIHRvcDogJ2F1dG8nLFxuICAgICAgICBib3R0b206IGJvdHRvbVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdHlsZSA9IHtcbiAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgIHRvcDogJ2F1dG8nLFxuICAgICAgICBib3R0b206IGJvdHRvbVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBzdHlsZTtcbn1cbmZ1bmN0aW9uIGdldE5vdGlmaWNhdGlvbkluc3RhbmNlKGFyZ3MsIGNhbGxiYWNrKSB7XG4gIHZhciBfYXJncyRwbGFjZW1lbnQgPSBhcmdzLnBsYWNlbWVudCxcbiAgICBwbGFjZW1lbnQgPSBfYXJncyRwbGFjZW1lbnQgPT09IHZvaWQgMCA/IGRlZmF1bHRQbGFjZW1lbnQgOiBfYXJncyRwbGFjZW1lbnQsXG4gICAgdG9wID0gYXJncy50b3AsXG4gICAgYm90dG9tID0gYXJncy5ib3R0b20sXG4gICAgX2FyZ3MkZ2V0Q29udGFpbmVyID0gYXJncy5nZXRDb250YWluZXIsXG4gICAgZ2V0Q29udGFpbmVyID0gX2FyZ3MkZ2V0Q29udGFpbmVyID09PSB2b2lkIDAgPyBkZWZhdWx0R2V0Q29udGFpbmVyIDogX2FyZ3MkZ2V0Q29udGFpbmVyLFxuICAgIGN1c3RvbWl6ZVByZWZpeENscyA9IGFyZ3MucHJlZml4Q2xzO1xuICB2YXIgX2dsb2JhbENvbmZpZyA9IGdsb2JhbENvbmZpZygpLFxuICAgIGdldFByZWZpeENscyA9IF9nbG9iYWxDb25maWcuZ2V0UHJlZml4Q2xzLFxuICAgIGdldEljb25QcmVmaXhDbHMgPSBfZ2xvYmFsQ29uZmlnLmdldEljb25QcmVmaXhDbHM7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ25vdGlmaWNhdGlvbicsIGN1c3RvbWl6ZVByZWZpeENscyB8fCBkZWZhdWx0UHJlZml4Q2xzKTtcbiAgdmFyIGljb25QcmVmaXhDbHMgPSBnZXRJY29uUHJlZml4Q2xzKCk7XG4gIHZhciBjYWNoZUtleSA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChwbGFjZW1lbnQpO1xuICB2YXIgY2FjaGVJbnN0YW5jZSA9IG5vdGlmaWNhdGlvbkluc3RhbmNlW2NhY2hlS2V5XTtcbiAgaWYgKGNhY2hlSW5zdGFuY2UpIHtcbiAgICBQcm9taXNlLnJlc29sdmUoY2FjaGVJbnN0YW5jZSkudGhlbihmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgIGNhbGxiYWNrKHtcbiAgICAgICAgcHJlZml4Q2xzOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5vdGljZVwiKSxcbiAgICAgICAgaWNvblByZWZpeENsczogaWNvblByZWZpeENscyxcbiAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG5vdGlmaWNhdGlvbkNsYXNzID0gY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQocGxhY2VtZW50KSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgcnRsID09PSB0cnVlKSk7XG4gIG5vdGlmaWNhdGlvbkluc3RhbmNlW2NhY2hlS2V5XSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgTm90aWZpY2F0aW9uLm5ld0luc3RhbmNlKHtcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgY2xhc3NOYW1lOiBub3RpZmljYXRpb25DbGFzcyxcbiAgICAgIHN0eWxlOiBnZXRQbGFjZW1lbnRTdHlsZShwbGFjZW1lbnQsIHRvcCwgYm90dG9tKSxcbiAgICAgIGdldENvbnRhaW5lcjogZ2V0Q29udGFpbmVyLFxuICAgICAgbWF4Q291bnQ6IG1heENvdW50XG4gICAgfSwgZnVuY3Rpb24gKG5vdGlmaWNhdGlvbikge1xuICAgICAgcmVzb2x2ZShub3RpZmljYXRpb24pO1xuICAgICAgY2FsbGJhY2soe1xuICAgICAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbm90aWNlXCIpLFxuICAgICAgICBpY29uUHJlZml4Q2xzOiBpY29uUHJlZml4Q2xzLFxuICAgICAgICBpbnN0YW5jZTogbm90aWZpY2F0aW9uXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG52YXIgdHlwZVRvSWNvbiA9IHtcbiAgc3VjY2VzczogQ2hlY2tDaXJjbGVPdXRsaW5lZCxcbiAgaW5mbzogSW5mb0NpcmNsZU91dGxpbmVkLFxuICBlcnJvcjogQ2xvc2VDaXJjbGVPdXRsaW5lZCxcbiAgd2FybmluZzogRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZFxufTtcbmZ1bmN0aW9uIGdldFJDTm90aWNlUHJvcHMoYXJncywgcHJlZml4Q2xzLCBpY29uUHJlZml4Q2xzKSB7XG4gIHZhciBkdXJhdGlvbkFyZyA9IGFyZ3MuZHVyYXRpb24sXG4gICAgaWNvbiA9IGFyZ3MuaWNvbixcbiAgICB0eXBlID0gYXJncy50eXBlLFxuICAgIGRlc2NyaXB0aW9uID0gYXJncy5kZXNjcmlwdGlvbixcbiAgICBtZXNzYWdlID0gYXJncy5tZXNzYWdlLFxuICAgIGJ0biA9IGFyZ3MuYnRuLFxuICAgIG9uQ2xvc2UgPSBhcmdzLm9uQ2xvc2UsXG4gICAgb25DbGljayA9IGFyZ3Mub25DbGljayxcbiAgICBrZXkgPSBhcmdzLmtleSxcbiAgICBzdHlsZSA9IGFyZ3Muc3R5bGUsXG4gICAgY2xhc3NOYW1lID0gYXJncy5jbGFzc05hbWUsXG4gICAgX2FyZ3MkY2xvc2VJY29uID0gYXJncy5jbG9zZUljb24sXG4gICAgY2xvc2VJY29uID0gX2FyZ3MkY2xvc2VJY29uID09PSB2b2lkIDAgPyBkZWZhdWx0Q2xvc2VJY29uIDogX2FyZ3MkY2xvc2VJY29uLFxuICAgIHByb3BzID0gYXJncy5wcm9wcztcbiAgdmFyIGR1cmF0aW9uID0gZHVyYXRpb25BcmcgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHREdXJhdGlvbiA6IGR1cmF0aW9uQXJnO1xuICB2YXIgaWNvbk5vZGUgPSBudWxsO1xuICBpZiAoaWNvbikge1xuICAgIGljb25Ob2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pY29uXCIpXG4gICAgfSwgYXJncy5pY29uKTtcbiAgfSBlbHNlIGlmICh0eXBlKSB7XG4gICAgaWNvbk5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudCh0eXBlVG9JY29uW3R5cGVdIHx8IG51bGwsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pY29uIFwiKS5jb25jYXQocHJlZml4Q2xzLCBcIi1pY29uLVwiKS5jb25jYXQodHlwZSlcbiAgICB9KTtcbiAgfVxuICB2YXIgY2xvc2VJY29uVG9SZW5kZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jbG9zZS14XCIpXG4gIH0sIGNsb3NlSWNvbiB8fCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDbG9zZU91dGxpbmVkLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNsb3NlLWljb25cIilcbiAgfSkpO1xuICB2YXIgYXV0b01hcmdpblRhZyA9ICFkZXNjcmlwdGlvbiAmJiBpY29uTm9kZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1lc3NhZ2Utc2luZ2xlLWxpbmUtYXV0by1tYXJnaW5cIilcbiAgfSkgOiBudWxsO1xuICByZXR1cm4ge1xuICAgIGNvbnRlbnQ6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbmZpZ1Byb3ZpZGVyLCB7XG4gICAgICBpY29uUHJlZml4Q2xzOiBpY29uUHJlZml4Q2xzXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBpY29uTm9kZSA/IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd2l0aC1pY29uXCIpIDogJycsXG4gICAgICByb2xlOiBcImFsZXJ0XCJcbiAgICB9LCBpY29uTm9kZSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1lc3NhZ2VcIilcbiAgICB9LCBhdXRvTWFyZ2luVGFnLCBtZXNzYWdlKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRlc2NyaXB0aW9uXCIpXG4gICAgfSwgZGVzY3JpcHRpb24pLCBidG4gPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWJ0blwiKVxuICAgIH0sIGJ0bikgOiBudWxsKSksXG4gICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgIGNsb3NhYmxlOiB0cnVlLFxuICAgIGNsb3NlSWNvbjogY2xvc2VJY29uVG9SZW5kZXIsXG4gICAgb25DbG9zZTogb25DbG9zZSxcbiAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgIGtleToga2V5LFxuICAgIHN0eWxlOiBzdHlsZSB8fCB7fSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdCh0eXBlKSwgISF0eXBlKSksXG4gICAgcHJvcHM6IHByb3BzXG4gIH07XG59XG5mdW5jdGlvbiBub3RpY2UoYXJncykge1xuICBnZXROb3RpZmljYXRpb25JbnN0YW5jZShhcmdzLCBmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICAgIGljb25QcmVmaXhDbHMgPSBfcmVmLmljb25QcmVmaXhDbHMsXG4gICAgICBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2U7XG4gICAgaW5zdGFuY2Uubm90aWNlKGdldFJDTm90aWNlUHJvcHMoYXJncywgcHJlZml4Q2xzLCBpY29uUHJlZml4Q2xzKSk7XG4gIH0pO1xufVxudmFyIGFwaSA9IHtcbiAgb3Blbjogbm90aWNlLFxuICBjbG9zZTogZnVuY3Rpb24gY2xvc2Uoa2V5KSB7XG4gICAgT2JqZWN0LmtleXMobm90aWZpY2F0aW9uSW5zdGFuY2UpLmZvckVhY2goZnVuY3Rpb24gKGNhY2hlS2V5KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5vdGlmaWNhdGlvbkluc3RhbmNlW2NhY2hlS2V5XSkudGhlbihmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgaW5zdGFuY2UucmVtb3ZlTm90aWNlKGtleSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgY29uZmlnOiBzZXROb3RpZmljYXRpb25Db25maWcsXG4gIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgT2JqZWN0LmtleXMobm90aWZpY2F0aW9uSW5zdGFuY2UpLmZvckVhY2goZnVuY3Rpb24gKGNhY2hlS2V5KSB7XG4gICAgICBQcm9taXNlLnJlc29sdmUobm90aWZpY2F0aW9uSW5zdGFuY2VbY2FjaGVLZXldKS50aGVuKGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICBpbnN0YW5jZS5kZXN0cm95KCk7XG4gICAgICB9KTtcbiAgICAgIGRlbGV0ZSBub3RpZmljYXRpb25JbnN0YW5jZVtjYWNoZUtleV07IC8vIGxndG1banMvbWlzc2luZy1hd2FpdF1cbiAgICB9KTtcbiAgfVxufTtcblxuWydzdWNjZXNzJywgJ2luZm8nLCAnd2FybmluZycsICdlcnJvciddLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgYXBpW3R5cGVdID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICByZXR1cm4gYXBpLm9wZW4oX2V4dGVuZHMoX2V4dGVuZHMoe30sIGFyZ3MpLCB7XG4gICAgICB0eXBlOiB0eXBlXG4gICAgfSkpO1xuICB9O1xufSk7XG5hcGkud2FybiA9IGFwaS53YXJuaW5nO1xuYXBpLnVzZU5vdGlmaWNhdGlvbiA9IGNyZWF0ZVVzZU5vdGlmaWNhdGlvbihnZXROb3RpZmljYXRpb25JbnN0YW5jZSwgZ2V0UkNOb3RpY2VQcm9wcyk7XG4vKiogQGludGVybmFsIHRlc3QgT25seSBmdW5jdGlvbi4gTm90IHdvcmsgb24gcHJvZHVjdGlvbiAqL1xuZXhwb3J0IHZhciBnZXRJbnN0YW5jZSA9IGZ1bmN0aW9uIGdldEluc3RhbmNlKGNhY2hlS2V5KSB7XG4gIHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnID8gbm90aWZpY2F0aW9uSW5zdGFuY2VbY2FjaGVLZXldIDogbnVsbCk7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSk7XG4gIH0pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBhcGk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgZGVmYXVsdEdldFByZWZpeENscyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRQcmVmaXhDbHMoc3VmZml4Q2xzLCBjdXN0b21pemVQcmVmaXhDbHMpIHtcbiAgaWYgKGN1c3RvbWl6ZVByZWZpeENscykgcmV0dXJuIGN1c3RvbWl6ZVByZWZpeENscztcbiAgcmV0dXJuIHN1ZmZpeENscyA/IFwiYW50LVwiLmNvbmNhdChzdWZmaXhDbHMpIDogJ2FudCc7XG59O1xuLy8gem9tYmllSjog8J+aqCBEbyBub3QgcGFzcyBgZGVmYXVsdFJlbmRlckVtcHR5YCBoZXJlIHNpbmNlIGl0IHdpbGwgY2FzZSBjaXJjdWxhciBkZXBlbmRlbmN5LlxuZXhwb3J0IHZhciBDb25maWdDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICAvLyBXZSBwcm92aWRlIGEgZGVmYXVsdCBmdW5jdGlvbiBmb3IgQ29udGV4dCB3aXRob3V0IHByb3ZpZGVyXG4gIGdldFByZWZpeENsczogZGVmYXVsdEdldFByZWZpeENsc1xufSk7XG5leHBvcnQgdmFyIENvbmZpZ0NvbnN1bWVyID0gQ29uZmlnQ29udGV4dC5Db25zdW1lcjtcbi8qKiBAZGVwcmVjYXRlZCBVc2UgaG9va3MgaW5zdGVhZC4gVGhpcyBpcyBhIGxlZ2FjeSBmdW5jdGlvbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhDb25maWdDb25zdW1lcihjb25maWcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdpdGhDb25maWdDb25zdW1lckZ1bmMoQ29tcG9uZW50KSB7XG4gICAgLy8gV3JhcCB3aXRoIENvbmZpZ0NvbnN1bWVyLiBTaW5jZSB3ZSBuZWVkIGNvbXBhdGlibGUgd2l0aCByZWFjdCAxNSwgYmUgY2FyZSB3aGVuIHVzaW5nIHJlZiBtZXRob2RzXG4gICAgdmFyIFNGQyA9IGZ1bmN0aW9uIFNGQyhwcm9wcykge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbmZpZ0NvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoY29uZmlnUHJvcHMpIHtcbiAgICAgICAgdmFyIGJhc2ljUHJlZml4Q2xzID0gY29uZmlnLnByZWZpeENscztcbiAgICAgICAgdmFyIGdldFByZWZpeENscyA9IGNvbmZpZ1Byb3BzLmdldFByZWZpeENscztcbiAgICAgICAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscztcbiAgICAgICAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscyhiYXNpY1ByZWZpeENscywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe30sIGNvbmZpZ1Byb3BzLCBwcm9wcywge1xuICAgICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzXG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgdmFyIGNvbnMgPSBDb21wb25lbnQuY29uc3RydWN0b3I7XG4gICAgdmFyIG5hbWUgPSBjb25zICYmIGNvbnMuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCc7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIFNGQy5kaXNwbGF5TmFtZSA9IFwid2l0aENvbmZpZ0NvbnN1bWVyKFwiLmNvbmNhdChuYW1lLCBcIilcIik7XG4gICAgfVxuICAgIHJldHVybiBTRkM7XG4gIH07XG59IiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L3ByZWZlci1kZWZhdWx0LWV4cG9ydCwgcHJlZmVyLWRlc3RydWN0dXJpbmcgKi9cbmltcG9ydCB7IGdlbmVyYXRlIH0gZnJvbSAnQGFudC1kZXNpZ24vY29sb3JzJztcbmltcG9ydCB7IFRpbnlDb2xvciB9IGZyb20gJ0BjdHJsL3Rpbnljb2xvcic7XG5pbXBvcnQgY2FuVXNlRG9tIGZyb20gXCJyYy11dGlsL2VzL0RvbS9jYW5Vc2VEb21cIjtcbmltcG9ydCB7IHVwZGF0ZUNTUyB9IGZyb20gXCJyYy11dGlsL2VzL0RvbS9keW5hbWljQ1NTXCI7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbnZhciBkeW5hbWljU3R5bGVNYXJrID0gXCItYW50LVwiLmNvbmNhdChEYXRlLm5vdygpLCBcIi1cIikuY29uY2F0KE1hdGgucmFuZG9tKCkpO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0eWxlKGdsb2JhbFByZWZpeENscywgdGhlbWUpIHtcbiAgdmFyIHZhcmlhYmxlcyA9IHt9O1xuICB2YXIgZm9ybWF0Q29sb3IgPSBmdW5jdGlvbiBmb3JtYXRDb2xvcihjb2xvciwgdXBkYXRlcikge1xuICAgIHZhciBjbG9uZSA9IGNvbG9yLmNsb25lKCk7XG4gICAgY2xvbmUgPSAodXBkYXRlciA9PT0gbnVsbCB8fCB1cGRhdGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB1cGRhdGVyKGNsb25lKSkgfHwgY2xvbmU7XG4gICAgcmV0dXJuIGNsb25lLnRvUmdiU3RyaW5nKCk7XG4gIH07XG4gIHZhciBmaWxsQ29sb3IgPSBmdW5jdGlvbiBmaWxsQ29sb3IoY29sb3JWYWwsIHR5cGUpIHtcbiAgICB2YXIgYmFzZUNvbG9yID0gbmV3IFRpbnlDb2xvcihjb2xvclZhbCk7XG4gICAgdmFyIGNvbG9yUGFsZXR0ZXMgPSBnZW5lcmF0ZShiYXNlQ29sb3IudG9SZ2JTdHJpbmcoKSk7XG4gICAgdmFyaWFibGVzW1wiXCIuY29uY2F0KHR5cGUsIFwiLWNvbG9yXCIpXSA9IGZvcm1hdENvbG9yKGJhc2VDb2xvcik7XG4gICAgdmFyaWFibGVzW1wiXCIuY29uY2F0KHR5cGUsIFwiLWNvbG9yLWRpc2FibGVkXCIpXSA9IGNvbG9yUGFsZXR0ZXNbMV07XG4gICAgdmFyaWFibGVzW1wiXCIuY29uY2F0KHR5cGUsIFwiLWNvbG9yLWhvdmVyXCIpXSA9IGNvbG9yUGFsZXR0ZXNbNF07XG4gICAgdmFyaWFibGVzW1wiXCIuY29uY2F0KHR5cGUsIFwiLWNvbG9yLWFjdGl2ZVwiKV0gPSBjb2xvclBhbGV0dGVzWzZdO1xuICAgIHZhcmlhYmxlc1tcIlwiLmNvbmNhdCh0eXBlLCBcIi1jb2xvci1vdXRsaW5lXCIpXSA9IGJhc2VDb2xvci5jbG9uZSgpLnNldEFscGhhKDAuMikudG9SZ2JTdHJpbmcoKTtcbiAgICB2YXJpYWJsZXNbXCJcIi5jb25jYXQodHlwZSwgXCItY29sb3ItZGVwcmVjYXRlZC1iZ1wiKV0gPSBjb2xvclBhbGV0dGVzWzBdO1xuICAgIHZhcmlhYmxlc1tcIlwiLmNvbmNhdCh0eXBlLCBcIi1jb2xvci1kZXByZWNhdGVkLWJvcmRlclwiKV0gPSBjb2xvclBhbGV0dGVzWzJdO1xuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09IFByaW1hcnkgQ29sb3IgPT09PT09PT09PT09PT09PVxuICBpZiAodGhlbWUucHJpbWFyeUNvbG9yKSB7XG4gICAgZmlsbENvbG9yKHRoZW1lLnByaW1hcnlDb2xvciwgJ3ByaW1hcnknKTtcbiAgICB2YXIgcHJpbWFyeUNvbG9yID0gbmV3IFRpbnlDb2xvcih0aGVtZS5wcmltYXJ5Q29sb3IpO1xuICAgIHZhciBwcmltYXJ5Q29sb3JzID0gZ2VuZXJhdGUocHJpbWFyeUNvbG9yLnRvUmdiU3RyaW5nKCkpO1xuICAgIC8vIExlZ2FjeSAtIFdlIHNob3VsZCB1c2Ugc2VtYW50aWMgbmFtaW5nIHN0YW5kYXJkXG4gICAgcHJpbWFyeUNvbG9ycy5mb3JFYWNoKGZ1bmN0aW9uIChjb2xvciwgaW5kZXgpIHtcbiAgICAgIHZhcmlhYmxlc1tcInByaW1hcnktXCIuY29uY2F0KGluZGV4ICsgMSldID0gY29sb3I7XG4gICAgfSk7XG4gICAgLy8gRGVwcmVjYXRlZFxuICAgIHZhcmlhYmxlc1sncHJpbWFyeS1jb2xvci1kZXByZWNhdGVkLWwtMzUnXSA9IGZvcm1hdENvbG9yKHByaW1hcnlDb2xvciwgZnVuY3Rpb24gKGMpIHtcbiAgICAgIHJldHVybiBjLmxpZ2h0ZW4oMzUpO1xuICAgIH0pO1xuICAgIHZhcmlhYmxlc1sncHJpbWFyeS1jb2xvci1kZXByZWNhdGVkLWwtMjAnXSA9IGZvcm1hdENvbG9yKHByaW1hcnlDb2xvciwgZnVuY3Rpb24gKGMpIHtcbiAgICAgIHJldHVybiBjLmxpZ2h0ZW4oMjApO1xuICAgIH0pO1xuICAgIHZhcmlhYmxlc1sncHJpbWFyeS1jb2xvci1kZXByZWNhdGVkLXQtMjAnXSA9IGZvcm1hdENvbG9yKHByaW1hcnlDb2xvciwgZnVuY3Rpb24gKGMpIHtcbiAgICAgIHJldHVybiBjLnRpbnQoMjApO1xuICAgIH0pO1xuICAgIHZhcmlhYmxlc1sncHJpbWFyeS1jb2xvci1kZXByZWNhdGVkLXQtNTAnXSA9IGZvcm1hdENvbG9yKHByaW1hcnlDb2xvciwgZnVuY3Rpb24gKGMpIHtcbiAgICAgIHJldHVybiBjLnRpbnQoNTApO1xuICAgIH0pO1xuICAgIHZhcmlhYmxlc1sncHJpbWFyeS1jb2xvci1kZXByZWNhdGVkLWYtMTInXSA9IGZvcm1hdENvbG9yKHByaW1hcnlDb2xvciwgZnVuY3Rpb24gKGMpIHtcbiAgICAgIHJldHVybiBjLnNldEFscGhhKGMuZ2V0QWxwaGEoKSAqIDAuMTIpO1xuICAgIH0pO1xuICAgIHZhciBwcmltYXJ5QWN0aXZlQ29sb3IgPSBuZXcgVGlueUNvbG9yKHByaW1hcnlDb2xvcnNbMF0pO1xuICAgIHZhcmlhYmxlc1sncHJpbWFyeS1jb2xvci1hY3RpdmUtZGVwcmVjYXRlZC1mLTMwJ10gPSBmb3JtYXRDb2xvcihwcmltYXJ5QWN0aXZlQ29sb3IsIGZ1bmN0aW9uIChjKSB7XG4gICAgICByZXR1cm4gYy5zZXRBbHBoYShjLmdldEFscGhhKCkgKiAwLjMpO1xuICAgIH0pO1xuICAgIHZhcmlhYmxlc1sncHJpbWFyeS1jb2xvci1hY3RpdmUtZGVwcmVjYXRlZC1kLTAyJ10gPSBmb3JtYXRDb2xvcihwcmltYXJ5QWN0aXZlQ29sb3IsIGZ1bmN0aW9uIChjKSB7XG4gICAgICByZXR1cm4gYy5kYXJrZW4oMik7XG4gICAgfSk7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PSBTdWNjZXNzIENvbG9yID09PT09PT09PT09PT09PT1cbiAgaWYgKHRoZW1lLnN1Y2Nlc3NDb2xvcikge1xuICAgIGZpbGxDb2xvcih0aGVtZS5zdWNjZXNzQ29sb3IsICdzdWNjZXNzJyk7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PSBXYXJuaW5nIENvbG9yID09PT09PT09PT09PT09PT1cbiAgaWYgKHRoZW1lLndhcm5pbmdDb2xvcikge1xuICAgIGZpbGxDb2xvcih0aGVtZS53YXJuaW5nQ29sb3IsICd3YXJuaW5nJyk7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT0gRXJyb3IgQ29sb3IgPT09PT09PT09PT09PT09PT1cbiAgaWYgKHRoZW1lLmVycm9yQ29sb3IpIHtcbiAgICBmaWxsQ29sb3IodGhlbWUuZXJyb3JDb2xvciwgJ2Vycm9yJyk7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT0gSW5mbyBDb2xvciA9PT09PT09PT09PT09PT09PT1cbiAgaWYgKHRoZW1lLmluZm9Db2xvcikge1xuICAgIGZpbGxDb2xvcih0aGVtZS5pbmZvQ29sb3IsICdpbmZvJyk7XG4gIH1cbiAgLy8gQ29udmVydCB0byBjc3MgdmFyaWFibGVzXG4gIHZhciBjc3NMaXN0ID0gT2JqZWN0LmtleXModmFyaWFibGVzKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBcIi0tXCIuY29uY2F0KGdsb2JhbFByZWZpeENscywgXCItXCIpLmNvbmNhdChrZXksIFwiOiBcIikuY29uY2F0KHZhcmlhYmxlc1trZXldLCBcIjtcIik7XG4gIH0pO1xuICByZXR1cm4gXCJcXG4gIDpyb290IHtcXG4gICAgXCIuY29uY2F0KGNzc0xpc3Quam9pbignXFxuJyksIFwiXFxuICB9XFxuICBcIikudHJpbSgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyVGhlbWUoZ2xvYmFsUHJlZml4Q2xzLCB0aGVtZSkge1xuICB2YXIgc3R5bGUgPSBnZXRTdHlsZShnbG9iYWxQcmVmaXhDbHMsIHRoZW1lKTtcbiAgaWYgKGNhblVzZURvbSgpKSB7XG4gICAgdXBkYXRlQ1NTKHN0eWxlLCBcIlwiLmNvbmNhdChkeW5hbWljU3R5bGVNYXJrLCBcIi1keW5hbWljLXRoZW1lXCIpKTtcbiAgfSBlbHNlIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGZhbHNlLCAnQ29uZmlnUHJvdmlkZXInLCAnU1NSIGRvIG5vdCBzdXBwb3J0IGR5bmFtaWMgdGhlbWUgd2l0aCBjc3MgdmFyaWFibGVzLicpIDogdm9pZCAwO1xuICB9XG59IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIERpc2FibGVkQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KGZhbHNlKTtcbmV4cG9ydCB2YXIgRGlzYWJsZWRDb250ZXh0UHJvdmlkZXIgPSBmdW5jdGlvbiBEaXNhYmxlZENvbnRleHRQcm92aWRlcihfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgZGlzYWJsZWQgPSBfcmVmLmRpc2FibGVkO1xuICB2YXIgb3JpZ2luRGlzYWJsZWQgPSBSZWFjdC51c2VDb250ZXh0KERpc2FibGVkQ29udGV4dCk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEaXNhYmxlZENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogZGlzYWJsZWQgIT09IG51bGwgJiYgZGlzYWJsZWQgIT09IHZvaWQgMCA/IGRpc2FibGVkIDogb3JpZ2luRGlzYWJsZWRcbiAgfSwgY2hpbGRyZW4pO1xufTtcbmV4cG9ydCBkZWZhdWx0IERpc2FibGVkQ29udGV4dDsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgU2l6ZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpO1xuZXhwb3J0IHZhciBTaXplQ29udGV4dFByb3ZpZGVyID0gZnVuY3Rpb24gU2l6ZUNvbnRleHRQcm92aWRlcihfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgc2l6ZSA9IF9yZWYuc2l6ZTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNpemVDb250ZXh0LkNvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAob3JpZ2luU2l6ZSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTaXplQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IHNpemUgfHwgb3JpZ2luU2l6ZVxuICAgIH0sIGNoaWxkcmVuKTtcbiAgfSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgU2l6ZUNvbnRleHQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgSWNvbkNvbnRleHQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2NvbXBvbmVudHMvQ29udGV4dFwiO1xuaW1wb3J0IHsgRm9ybVByb3ZpZGVyIGFzIFJjRm9ybVByb3ZpZGVyIH0gZnJvbSAncmMtZmllbGQtZm9ybSc7XG5pbXBvcnQgdXNlTWVtbyBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZW1vXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTG9jYWxlUHJvdmlkZXIsIHsgQU5UX01BUksgfSBmcm9tICcuLi9sb2NhbGUtcHJvdmlkZXInO1xuaW1wb3J0IExvY2FsZVJlY2VpdmVyIGZyb20gJy4uL2xvY2FsZS1wcm92aWRlci9Mb2NhbGVSZWNlaXZlcic7XG5pbXBvcnQgZGVmYXVsdExvY2FsZSBmcm9tICcuLi9sb2NhbGUvZGVmYXVsdCc7XG5pbXBvcnQgbWVzc2FnZSBmcm9tICcuLi9tZXNzYWdlJztcbmltcG9ydCBub3RpZmljYXRpb24gZnJvbSAnLi4vbm90aWZpY2F0aW9uJztcbmltcG9ydCB7IENvbmZpZ0NvbnN1bWVyLCBDb25maWdDb250ZXh0IH0gZnJvbSAnLi9jb250ZXh0JztcbmltcG9ydCB7IHJlZ2lzdGVyVGhlbWUgfSBmcm9tICcuL2Nzc1ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBEaXNhYmxlZENvbnRleHRQcm92aWRlciB9IGZyb20gJy4vRGlzYWJsZWRDb250ZXh0JztcbmltcG9ydCBTaXplQ29udGV4dCwgeyBTaXplQ29udGV4dFByb3ZpZGVyIH0gZnJvbSAnLi9TaXplQ29udGV4dCc7XG5leHBvcnQgeyBDb25maWdDb250ZXh0LCBDb25maWdDb25zdW1lciB9O1xuZXhwb3J0IHZhciBjb25maWdDb25zdW1lclByb3BzID0gWydnZXRUYXJnZXRDb250YWluZXInLCAnZ2V0UG9wdXBDb250YWluZXInLCAncm9vdFByZWZpeENscycsICdnZXRQcmVmaXhDbHMnLCAncmVuZGVyRW1wdHknLCAnY3NwJywgJ2F1dG9JbnNlcnRTcGFjZUluQnV0dG9uJywgJ2xvY2FsZScsICdwYWdlSGVhZGVyJ107XG4vLyBUaGVzZSBwcm9wcyBpcyB1c2VkIGJ5IGB1c2VDb250ZXh0YCBkaXJlY3RseSBpbiBzdWIgY29tcG9uZW50XG52YXIgUEFTU0VEX1BST1BTID0gWydnZXRUYXJnZXRDb250YWluZXInLCAnZ2V0UG9wdXBDb250YWluZXInLCAncmVuZGVyRW1wdHknLCAncGFnZUhlYWRlcicsICdpbnB1dCcsICdwYWdpbmF0aW9uJywgJ2Zvcm0nXTtcbmV4cG9ydCB2YXIgZGVmYXVsdFByZWZpeENscyA9ICdhbnQnO1xuZXhwb3J0IHZhciBkZWZhdWx0SWNvblByZWZpeENscyA9ICdhbnRpY29uJztcbnZhciBnbG9iYWxQcmVmaXhDbHM7XG52YXIgZ2xvYmFsSWNvblByZWZpeENscztcbmZ1bmN0aW9uIGdldEdsb2JhbFByZWZpeENscygpIHtcbiAgcmV0dXJuIGdsb2JhbFByZWZpeENscyB8fCBkZWZhdWx0UHJlZml4Q2xzO1xufVxuZnVuY3Rpb24gZ2V0R2xvYmFsSWNvblByZWZpeENscygpIHtcbiAgcmV0dXJuIGdsb2JhbEljb25QcmVmaXhDbHMgfHwgZGVmYXVsdEljb25QcmVmaXhDbHM7XG59XG52YXIgc2V0R2xvYmFsQ29uZmlnID0gZnVuY3Rpb24gc2V0R2xvYmFsQ29uZmlnKF9yZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIGljb25QcmVmaXhDbHMgPSBfcmVmLmljb25QcmVmaXhDbHMsXG4gICAgdGhlbWUgPSBfcmVmLnRoZW1lO1xuICBpZiAocHJlZml4Q2xzICE9PSB1bmRlZmluZWQpIHtcbiAgICBnbG9iYWxQcmVmaXhDbHMgPSBwcmVmaXhDbHM7XG4gIH1cbiAgaWYgKGljb25QcmVmaXhDbHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGdsb2JhbEljb25QcmVmaXhDbHMgPSBpY29uUHJlZml4Q2xzO1xuICB9XG4gIGlmICh0aGVtZSkge1xuICAgIHJlZ2lzdGVyVGhlbWUoZ2V0R2xvYmFsUHJlZml4Q2xzKCksIHRoZW1lKTtcbiAgfVxufTtcbmV4cG9ydCB2YXIgZ2xvYmFsQ29uZmlnID0gZnVuY3Rpb24gZ2xvYmFsQ29uZmlnKCkge1xuICByZXR1cm4ge1xuICAgIGdldFByZWZpeENsczogZnVuY3Rpb24gZ2V0UHJlZml4Q2xzKHN1ZmZpeENscywgY3VzdG9taXplUHJlZml4Q2xzKSB7XG4gICAgICBpZiAoY3VzdG9taXplUHJlZml4Q2xzKSByZXR1cm4gY3VzdG9taXplUHJlZml4Q2xzO1xuICAgICAgcmV0dXJuIHN1ZmZpeENscyA/IFwiXCIuY29uY2F0KGdldEdsb2JhbFByZWZpeENscygpLCBcIi1cIikuY29uY2F0KHN1ZmZpeENscykgOiBnZXRHbG9iYWxQcmVmaXhDbHMoKTtcbiAgICB9LFxuICAgIGdldEljb25QcmVmaXhDbHM6IGdldEdsb2JhbEljb25QcmVmaXhDbHMsXG4gICAgZ2V0Um9vdFByZWZpeENsczogZnVuY3Rpb24gZ2V0Um9vdFByZWZpeENscyhyb290UHJlZml4Q2xzLCBjdXN0b21pemVQcmVmaXhDbHMpIHtcbiAgICAgIC8vIEN1c3RvbWl6ZSByb290UHJlZml4Q2xzIGlzIGZpcnN0IHByaW9yaXR5XG4gICAgICBpZiAocm9vdFByZWZpeENscykge1xuICAgICAgICByZXR1cm4gcm9vdFByZWZpeENscztcbiAgICAgIH1cbiAgICAgIC8vIElmIEdsb2JhbCBwcmVmaXhDbHMgcHJvdmlkZWQsIHVzZSB0aGlzXG4gICAgICBpZiAoZ2xvYmFsUHJlZml4Q2xzKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWxQcmVmaXhDbHM7XG4gICAgICB9XG4gICAgICAvLyBbTGVnYWN5XSBJZiBjdXN0b21pemUgcHJlZml4Q2xzIHByb3ZpZGVkLCB3ZSBjdXQgaXQgdG8gZ2V0IHRoZSBwcmVmaXhDbHNcbiAgICAgIGlmIChjdXN0b21pemVQcmVmaXhDbHMgJiYgY3VzdG9taXplUHJlZml4Q2xzLmluY2x1ZGVzKCctJykpIHtcbiAgICAgICAgcmV0dXJuIGN1c3RvbWl6ZVByZWZpeENscy5yZXBsYWNlKC9eKC4qKS1bXi1dKiQvLCAnJDEnKTtcbiAgICAgIH1cbiAgICAgIC8vIEZhbGxiYWNrIHRvIGRlZmF1bHQgcHJlZml4Q2xzXG4gICAgICByZXR1cm4gZ2V0R2xvYmFsUHJlZml4Q2xzKCk7XG4gICAgfVxuICB9O1xufTtcbnZhciBQcm92aWRlckNoaWxkcmVuID0gZnVuY3Rpb24gUHJvdmlkZXJDaGlsZHJlbihwcm9wcykge1xuICB2YXIgX2EsIF9iO1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBjc3AgPSBwcm9wcy5jc3AsXG4gICAgYXV0b0luc2VydFNwYWNlSW5CdXR0b24gPSBwcm9wcy5hdXRvSW5zZXJ0U3BhY2VJbkJ1dHRvbixcbiAgICBmb3JtID0gcHJvcHMuZm9ybSxcbiAgICBsb2NhbGUgPSBwcm9wcy5sb2NhbGUsXG4gICAgY29tcG9uZW50U2l6ZSA9IHByb3BzLmNvbXBvbmVudFNpemUsXG4gICAgZGlyZWN0aW9uID0gcHJvcHMuZGlyZWN0aW9uLFxuICAgIHNwYWNlID0gcHJvcHMuc3BhY2UsXG4gICAgdmlydHVhbCA9IHByb3BzLnZpcnR1YWwsXG4gICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoID0gcHJvcHMuZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoLFxuICAgIGxlZ2FjeUxvY2FsZSA9IHByb3BzLmxlZ2FjeUxvY2FsZSxcbiAgICBwYXJlbnRDb250ZXh0ID0gcHJvcHMucGFyZW50Q29udGV4dCxcbiAgICBpY29uUHJlZml4Q2xzID0gcHJvcHMuaWNvblByZWZpeENscyxcbiAgICBjb21wb25lbnREaXNhYmxlZCA9IHByb3BzLmNvbXBvbmVudERpc2FibGVkO1xuICB2YXIgZ2V0UHJlZml4Q2xzID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHN1ZmZpeENscywgY3VzdG9taXplUHJlZml4Q2xzKSB7XG4gICAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscztcbiAgICBpZiAoY3VzdG9taXplUHJlZml4Q2xzKSByZXR1cm4gY3VzdG9taXplUHJlZml4Q2xzO1xuICAgIHZhciBtZXJnZWRQcmVmaXhDbHMgPSBwcmVmaXhDbHMgfHwgcGFyZW50Q29udGV4dC5nZXRQcmVmaXhDbHMoJycpO1xuICAgIHJldHVybiBzdWZmaXhDbHMgPyBcIlwiLmNvbmNhdChtZXJnZWRQcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoc3VmZml4Q2xzKSA6IG1lcmdlZFByZWZpeENscztcbiAgfSwgW3BhcmVudENvbnRleHQuZ2V0UHJlZml4Q2xzLCBwcm9wcy5wcmVmaXhDbHNdKTtcbiAgdmFyIGNvbmZpZyA9IF9leHRlbmRzKF9leHRlbmRzKHt9LCBwYXJlbnRDb250ZXh0KSwge1xuICAgIGNzcDogY3NwLFxuICAgIGF1dG9JbnNlcnRTcGFjZUluQnV0dG9uOiBhdXRvSW5zZXJ0U3BhY2VJbkJ1dHRvbixcbiAgICBsb2NhbGU6IGxvY2FsZSB8fCBsZWdhY3lMb2NhbGUsXG4gICAgZGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgc3BhY2U6IHNwYWNlLFxuICAgIHZpcnR1YWw6IHZpcnR1YWwsXG4gICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoOiBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGgsXG4gICAgZ2V0UHJlZml4Q2xzOiBnZXRQcmVmaXhDbHNcbiAgfSk7XG4gIC8vIFBhc3MgdGhlIHByb3BzIHVzZWQgYnkgYHVzZUNvbnRleHRgIGRpcmVjdGx5IHdpdGggY2hpbGQgY29tcG9uZW50LlxuICAvLyBUaGVzZSBwcm9wcyBzaG91bGQgbWVyZ2VkIGludG8gYGNvbmZpZ2AuXG4gIFBBU1NFRF9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgaWYgKHByb3BWYWx1ZSkge1xuICAgICAgY29uZmlnW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICB9XG4gIH0pO1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yNzYxN1xuICB2YXIgbWVtb2VkQ29uZmlnID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfSwgY29uZmlnLCBmdW5jdGlvbiAocHJldkNvbmZpZywgY3VycmVudENvbmZpZykge1xuICAgIHZhciBwcmV2S2V5cyA9IE9iamVjdC5rZXlzKHByZXZDb25maWcpO1xuICAgIHZhciBjdXJyZW50S2V5cyA9IE9iamVjdC5rZXlzKGN1cnJlbnRDb25maWcpO1xuICAgIHJldHVybiBwcmV2S2V5cy5sZW5ndGggIT09IGN1cnJlbnRLZXlzLmxlbmd0aCB8fCBwcmV2S2V5cy5zb21lKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHJldHVybiBwcmV2Q29uZmlnW2tleV0gIT09IGN1cnJlbnRDb25maWdba2V5XTtcbiAgICB9KTtcbiAgfSk7XG4gIHZhciBtZW1vSWNvbkNvbnRleHRWYWx1ZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwcmVmaXhDbHM6IGljb25QcmVmaXhDbHMsXG4gICAgICBjc3A6IGNzcFxuICAgIH07XG4gIH0sIFtpY29uUHJlZml4Q2xzLCBjc3BdKTtcbiAgdmFyIGNoaWxkTm9kZSA9IGNoaWxkcmVuO1xuICAvLyBBZGRpdGlvbmFsIEZvcm0gcHJvdmlkZXJcbiAgdmFyIHZhbGlkYXRlTWVzc2FnZXMgPSB7fTtcbiAgaWYgKGxvY2FsZSkge1xuICAgIHZhbGlkYXRlTWVzc2FnZXMgPSAoKF9hID0gbG9jYWxlLkZvcm0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kZWZhdWx0VmFsaWRhdGVNZXNzYWdlcykgfHwgKChfYiA9IGRlZmF1bHRMb2NhbGUuRm9ybSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmRlZmF1bHRWYWxpZGF0ZU1lc3NhZ2VzKSB8fCB7fTtcbiAgfVxuICBpZiAoZm9ybSAmJiBmb3JtLnZhbGlkYXRlTWVzc2FnZXMpIHtcbiAgICB2YWxpZGF0ZU1lc3NhZ2VzID0gX2V4dGVuZHMoX2V4dGVuZHMoe30sIHZhbGlkYXRlTWVzc2FnZXMpLCBmb3JtLnZhbGlkYXRlTWVzc2FnZXMpO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyh2YWxpZGF0ZU1lc3NhZ2VzKS5sZW5ndGggPiAwKSB7XG4gICAgY2hpbGROb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmNGb3JtUHJvdmlkZXIsIHtcbiAgICAgIHZhbGlkYXRlTWVzc2FnZXM6IHZhbGlkYXRlTWVzc2FnZXNcbiAgICB9LCBjaGlsZHJlbik7XG4gIH1cbiAgaWYgKGxvY2FsZSkge1xuICAgIGNoaWxkTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExvY2FsZVByb3ZpZGVyLCB7XG4gICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgIF9BTlRfTUFSS19fOiBBTlRfTUFSS1xuICAgIH0sIGNoaWxkTm9kZSk7XG4gIH1cbiAgaWYgKGljb25QcmVmaXhDbHMgfHwgY3NwKSB7XG4gICAgY2hpbGROb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSWNvbkNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiBtZW1vSWNvbkNvbnRleHRWYWx1ZVxuICAgIH0sIGNoaWxkTm9kZSk7XG4gIH1cbiAgaWYgKGNvbXBvbmVudFNpemUpIHtcbiAgICBjaGlsZE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTaXplQ29udGV4dFByb3ZpZGVyLCB7XG4gICAgICBzaXplOiBjb21wb25lbnRTaXplXG4gICAgfSwgY2hpbGROb2RlKTtcbiAgfVxuICBpZiAoY29tcG9uZW50RGlzYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNoaWxkTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERpc2FibGVkQ29udGV4dFByb3ZpZGVyLCB7XG4gICAgICBkaXNhYmxlZDogY29tcG9uZW50RGlzYWJsZWRcbiAgICB9LCBjaGlsZE5vZGUpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb25maWdDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IG1lbW9lZENvbmZpZ1xuICB9LCBjaGlsZE5vZGUpO1xufTtcbnZhciBDb25maWdQcm92aWRlciA9IGZ1bmN0aW9uIENvbmZpZ1Byb3ZpZGVyKHByb3BzKSB7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHByb3BzLmRpcmVjdGlvbikge1xuICAgICAgbWVzc2FnZS5jb25maWcoe1xuICAgICAgICBydGw6IHByb3BzLmRpcmVjdGlvbiA9PT0gJ3J0bCdcbiAgICAgIH0pO1xuICAgICAgbm90aWZpY2F0aW9uLmNvbmZpZyh7XG4gICAgICAgIHJ0bDogcHJvcHMuZGlyZWN0aW9uID09PSAncnRsJ1xuICAgICAgfSk7XG4gICAgfVxuICB9LCBbcHJvcHMuZGlyZWN0aW9uXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMb2NhbGVSZWNlaXZlciwgbnVsbCwgZnVuY3Rpb24gKF8sIF9fLCBsZWdhY3lMb2NhbGUpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29uZmlnQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUHJvdmlkZXJDaGlsZHJlbiwgX2V4dGVuZHMoe1xuICAgICAgICBwYXJlbnRDb250ZXh0OiBjb250ZXh0LFxuICAgICAgICBsZWdhY3lMb2NhbGU6IGxlZ2FjeUxvY2FsZVxuICAgICAgfSwgcHJvcHMpKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuLyoqIEBwcml2YXRlIGludGVybmFsIFVzYWdlLiBkbyBub3QgdXNlIGluIHlvdXIgcHJvZHVjdGlvbiAqL1xuQ29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCA9IENvbmZpZ0NvbnRleHQ7XG5Db25maWdQcm92aWRlci5TaXplQ29udGV4dCA9IFNpemVDb250ZXh0O1xuQ29uZmlnUHJvdmlkZXIuY29uZmlnID0gc2V0R2xvYmFsQ29uZmlnO1xuZXhwb3J0IGRlZmF1bHQgQ29uZmlnUHJvdmlkZXI7IiwiaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyV3JhcCh0YXJnZXQsIGV2ZW50VHlwZSwgY2IsIG9wdGlvbikge1xuICAvKiBlc2xpbnQgY2FtZWxjYXNlOiAyICovXG4gIHZhciBjYWxsYmFjayA9IFJlYWN0RE9NLnVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzID8gZnVuY3Rpb24gcnVuKGUpIHtcbiAgICBSZWFjdERPTS51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyhjYiwgZSk7XG4gIH0gOiBjYjtcbiAgaWYgKHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCAmJiB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2ssIG9wdGlvbik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIGlmICh0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgJiYgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBjYWxsYmFjaywgb3B0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RGF0YU9yQXJpYVByb3BzKHByb3BzKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhwcm9wcykucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBrZXkpIHtcbiAgICBpZiAoKGtleS5zdGFydHNXaXRoKCdkYXRhLScpIHx8IGtleS5zdGFydHNXaXRoKCdhcmlhLScpIHx8IGtleSA9PT0gJ3JvbGUnKSAmJiAha2V5LnN0YXJ0c1dpdGgoJ2RhdGEtX18nKSkge1xuICAgICAgcHJldltrZXldID0gcHJvcHNba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHByZXY7XG4gIH0sIHt9KTtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgaXNWYWxpZEVsZW1lbnQgPSBSZWFjdC5pc1ZhbGlkRWxlbWVudDtcbmV4cG9ydCB7IGlzVmFsaWRFbGVtZW50IH07XG5leHBvcnQgZnVuY3Rpb24gaXNGcmFnbWVudChjaGlsZCkge1xuICByZXR1cm4gY2hpbGQgJiYgaXNWYWxpZEVsZW1lbnQoY2hpbGQpICYmIGNoaWxkLnR5cGUgPT09IFJlYWN0LkZyYWdtZW50O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VFbGVtZW50KGVsZW1lbnQsIHJlcGxhY2VtZW50LCBwcm9wcykge1xuICBpZiAoIWlzVmFsaWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIHJlcGxhY2VtZW50O1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGVsZW1lbnQsIHR5cGVvZiBwcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/IHByb3BzKGVsZW1lbnQucHJvcHMgfHwge30pIDogcHJvcHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lRWxlbWVudChlbGVtZW50LCBwcm9wcykge1xuICByZXR1cm4gcmVwbGFjZUVsZW1lbnQoZWxlbWVudCwgZWxlbWVudCwgcHJvcHMpO1xufSIsImV4cG9ydCBmdW5jdGlvbiBpc1dpbmRvdyhvYmopIHtcbiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogPT09IG9iai53aW5kb3c7XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTY3JvbGwodGFyZ2V0LCB0b3ApIHtcbiAgdmFyIF9hLCBfYjtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgdmFyIG1ldGhvZCA9IHRvcCA/ICdzY3JvbGxUb3AnIDogJ3Njcm9sbExlZnQnO1xuICB2YXIgcmVzdWx0ID0gMDtcbiAgaWYgKGlzV2luZG93KHRhcmdldCkpIHtcbiAgICByZXN1bHQgPSB0YXJnZXRbdG9wID8gJ3BhZ2VZT2Zmc2V0JyA6ICdwYWdlWE9mZnNldCddO1xuICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgcmVzdWx0ID0gdGFyZ2V0LmRvY3VtZW50RWxlbWVudFttZXRob2RdO1xuICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgcmVzdWx0ID0gdGFyZ2V0W21ldGhvZF07XG4gIH0gZWxzZSBpZiAodGFyZ2V0KSB7XG4gICAgLy8gQWNjb3JkaW5nIHRvIHRoZSB0eXBlIGluZmVyZW5jZSwgdGhlIGB0YXJnZXRgIGlzIGBuZXZlcmAgdHlwZS5cbiAgICAvLyBTaW5jZSB3ZSBjb25maWd1cmVkIHRoZSBsb29zZSBtb2RlIHR5cGUgY2hlY2tpbmcsIGFuZCBzdXBwb3J0cyBtb2NraW5nIHRoZSB0YXJnZXQgd2l0aCBzdWNoIHNoYXBlIGJlbG93OjpcbiAgICAvLyAgICBgeyBkb2N1bWVudEVsZW1lbnQ6IHsgc2Nyb2xsTGVmdDogMjAwLCBzY3JvbGxUb3A6IDQwMCB9IH1gLFxuICAgIC8vICAgIHRoZSBwcm9ncmFtIG1heSBmYWxscyBpbnRvIHRoaXMgYnJhbmNoLlxuICAgIC8vIENoZWNrIHRoZSBjb3JyZXNwb25kaW5nIHRlc3RzIGZvciBkZXRhaWxzLiBEb24ndCBzdXJlIHdoYXQgaXMgdGhlIHJlYWwgc2NlbmFyaW8gdGhpcyBoYXBwZW5zLlxuICAgIHJlc3VsdCA9IHRhcmdldFttZXRob2RdO1xuICB9XG4gIGlmICh0YXJnZXQgJiYgIWlzV2luZG93KHRhcmdldCkgJiYgdHlwZW9mIHJlc3VsdCAhPT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQgPSAoX2IgPSAoKF9hID0gdGFyZ2V0Lm93bmVyRG9jdW1lbnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRhcmdldCkuZG9jdW1lbnRFbGVtZW50KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2JbbWV0aG9kXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSIsIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvcHJlZmVyLWRlZmF1bHQtZXhwb3J0XG5leHBvcnQgZnVuY3Rpb24gZWFzZUluT3V0Q3ViaWModCwgYiwgYywgZCkge1xuICB2YXIgY2MgPSBjIC0gYjtcbiAgdCAvPSBkIC8gMjtcbiAgaWYgKHQgPCAxKSB7XG4gICAgcmV0dXJuIGNjIC8gMiAqIHQgKiB0ICogdCArIGI7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJldHVybi1hc3NpZ25cbiAgcmV0dXJuIGNjIC8gMiAqICgodCAtPSAyKSAqIHQgKiB0ICsgMikgKyBiO1xufSIsImltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5pbXBvcnQgeyBlYXNlSW5PdXRDdWJpYyB9IGZyb20gJy4vZWFzaW5ncyc7XG5pbXBvcnQgZ2V0U2Nyb2xsLCB7IGlzV2luZG93IH0gZnJvbSAnLi9nZXRTY3JvbGwnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2Nyb2xsVG8oeSkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIHZhciBfb3B0aW9ucyRnZXRDb250YWluZXIgPSBvcHRpb25zLmdldENvbnRhaW5lcixcbiAgICBnZXRDb250YWluZXIgPSBfb3B0aW9ucyRnZXRDb250YWluZXIgPT09IHZvaWQgMCA/IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgfSA6IF9vcHRpb25zJGdldENvbnRhaW5lcixcbiAgICBjYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2ssXG4gICAgX29wdGlvbnMkZHVyYXRpb24gPSBvcHRpb25zLmR1cmF0aW9uLFxuICAgIGR1cmF0aW9uID0gX29wdGlvbnMkZHVyYXRpb24gPT09IHZvaWQgMCA/IDQ1MCA6IF9vcHRpb25zJGR1cmF0aW9uO1xuICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7XG4gIHZhciBzY3JvbGxUb3AgPSBnZXRTY3JvbGwoY29udGFpbmVyLCB0cnVlKTtcbiAgdmFyIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gIHZhciBmcmFtZUZ1bmMgPSBmdW5jdGlvbiBmcmFtZUZ1bmMoKSB7XG4gICAgdmFyIHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgdmFyIHRpbWUgPSB0aW1lc3RhbXAgLSBzdGFydFRpbWU7XG4gICAgdmFyIG5leHRTY3JvbGxUb3AgPSBlYXNlSW5PdXRDdWJpYyh0aW1lID4gZHVyYXRpb24gPyBkdXJhdGlvbiA6IHRpbWUsIHNjcm9sbFRvcCwgeSwgZHVyYXRpb24pO1xuICAgIGlmIChpc1dpbmRvdyhjb250YWluZXIpKSB7XG4gICAgICBjb250YWluZXIuc2Nyb2xsVG8od2luZG93LnBhZ2VYT2Zmc2V0LCBuZXh0U2Nyb2xsVG9wKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIERvY3VtZW50IHx8IGNvbnRhaW5lci5jb25zdHJ1Y3Rvci5uYW1lID09PSAnSFRNTERvY3VtZW50Jykge1xuICAgICAgY29udGFpbmVyLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPSBuZXh0U2Nyb2xsVG9wO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIuc2Nyb2xsVG9wID0gbmV4dFNjcm9sbFRvcDtcbiAgICB9XG4gICAgaWYgKHRpbWUgPCBkdXJhdGlvbikge1xuICAgICAgcmFmKGZyYW1lRnVuYyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuICB9O1xuICByYWYoZnJhbWVGdW5jKTtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VFdmVudChjYWxsYmFjaykge1xuICB2YXIgZm5SZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgZm5SZWYuY3VycmVudCA9IGNhbGxiYWNrO1xuICB2YXIgbWVtb0ZuID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIHZhciBfZm5SZWYkY3VycmVudDtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIHJldHVybiAoX2ZuUmVmJGN1cnJlbnQgPSBmblJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfZm5SZWYkY3VycmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ZuUmVmJGN1cnJlbnQuY2FsbC5hcHBseShfZm5SZWYkY3VycmVudCwgW2ZuUmVmXS5jb25jYXQoYXJncykpO1xuICB9LCBbXSk7XG4gIHJldHVybiBtZW1vRm47XG59IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNhblVzZURvbSBmcm9tIFwiLi4vRG9tL2NhblVzZURvbVwiO1xuXG4vKipcbiAqIFdyYXAgYFJlYWN0LnVzZUxheW91dEVmZmVjdGAgd2hpY2ggd2lsbCBub3QgdGhyb3cgd2FybmluZyBtZXNzYWdlIGluIHRlc3QgZW52XG4gKi9cbnZhciB1c2VJbnRlcm5hbExheW91dEVmZmVjdCA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcgJiYgY2FuVXNlRG9tKCkgPyBSZWFjdC51c2VMYXlvdXRFZmZlY3QgOiBSZWFjdC51c2VFZmZlY3Q7XG52YXIgdXNlTGF5b3V0RWZmZWN0ID0gZnVuY3Rpb24gdXNlTGF5b3V0RWZmZWN0KGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBmaXJzdE1vdW50UmVmID0gUmVhY3QudXNlUmVmKHRydWUpO1xuICB1c2VJbnRlcm5hbExheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGZpcnN0TW91bnRSZWYuY3VycmVudCk7XG4gIH0sIGRlcHMpO1xuXG4gIC8vIFdlIHRlbGwgcmVhY3QgdGhhdCBmaXJzdCBtb3VudCBoYXMgcGFzc2VkXG4gIHVzZUludGVybmFsTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBmaXJzdE1vdW50UmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZmlyc3RNb3VudFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9O1xuICB9LCBbXSk7XG59O1xuZXhwb3J0IHZhciB1c2VMYXlvdXRVcGRhdGVFZmZlY3QgPSBmdW5jdGlvbiB1c2VMYXlvdXRVcGRhdGVFZmZlY3QoY2FsbGJhY2ssIGRlcHMpIHtcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uIChmaXJzdE1vdW50KSB7XG4gICAgaWYgKCFmaXJzdE1vdW50KSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG4gIH0sIGRlcHMpO1xufTtcbmV4cG9ydCBkZWZhdWx0IHVzZUxheW91dEVmZmVjdDsiLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCB1c2VFdmVudCBmcm9tIFwiLi91c2VFdmVudFwiO1xuaW1wb3J0IHsgdXNlTGF5b3V0VXBkYXRlRWZmZWN0IH0gZnJvbSBcIi4vdXNlTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgdXNlU3RhdGUgZnJvbSBcIi4vdXNlU3RhdGVcIjtcbi8qKiBXZSBvbmx5IHRoaW5rIGB1bmRlZmluZWRgIGlzIGVtcHR5ICovXG5mdW5jdGlvbiBoYXNWYWx1ZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTaW1pbGFyIHRvIGB1c2VTdGF0ZWAgYnV0IHdpbGwgdXNlIHByb3BzIHZhbHVlIGlmIHByb3ZpZGVkLlxuICogTm90ZSB0aGF0IGludGVybmFsIHVzZSByYy11dGlsIGB1c2VTdGF0ZWAgaG9vay5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlTWVyZ2VkU3RhdGUoZGVmYXVsdFN0YXRlVmFsdWUsIG9wdGlvbikge1xuICB2YXIgX3JlZiA9IG9wdGlvbiB8fCB7fSxcbiAgICBkZWZhdWx0VmFsdWUgPSBfcmVmLmRlZmF1bHRWYWx1ZSxcbiAgICB2YWx1ZSA9IF9yZWYudmFsdWUsXG4gICAgb25DaGFuZ2UgPSBfcmVmLm9uQ2hhbmdlLFxuICAgIHBvc3RTdGF0ZSA9IF9yZWYucG9zdFN0YXRlO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IEluaXQgPT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChoYXNWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChoYXNWYWx1ZShkZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZGVmYXVsdFZhbHVlID09PSAnZnVuY3Rpb24nID8gZGVmYXVsdFZhbHVlKCkgOiBkZWZhdWx0VmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGRlZmF1bHRTdGF0ZVZhbHVlID09PSAnZnVuY3Rpb24nID8gZGVmYXVsdFN0YXRlVmFsdWUoKSA6IGRlZmF1bHRTdGF0ZVZhbHVlO1xuICAgICAgfVxuICAgIH0pLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGlubmVyVmFsdWUgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldElubmVyVmFsdWUgPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgbWVyZ2VkVmFsdWUgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBpbm5lclZhbHVlO1xuICB2YXIgcG9zdE1lcmdlZFZhbHVlID0gcG9zdFN0YXRlID8gcG9zdFN0YXRlKG1lcmdlZFZhbHVlKSA6IG1lcmdlZFZhbHVlO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gQ2hhbmdlID09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9uQ2hhbmdlRm4gPSB1c2VFdmVudChvbkNoYW5nZSk7XG4gIHZhciBfdXNlU3RhdGUzID0gdXNlU3RhdGUoW21lcmdlZFZhbHVlXSksXG4gICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgIHByZXZWYWx1ZSA9IF91c2VTdGF0ZTRbMF0sXG4gICAgc2V0UHJldlZhbHVlID0gX3VzZVN0YXRlNFsxXTtcbiAgdXNlTGF5b3V0VXBkYXRlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJldiA9IHByZXZWYWx1ZVswXTtcbiAgICBpZiAoaW5uZXJWYWx1ZSAhPT0gcHJldikge1xuICAgICAgb25DaGFuZ2VGbihpbm5lclZhbHVlLCBwcmV2KTtcbiAgICB9XG4gIH0sIFtwcmV2VmFsdWVdKTtcblxuICAvLyBTeW5jIHZhbHVlIGJhY2sgdG8gYHVuZGVmaW5lZGAgd2hlbiBpdCBmcm9tIGNvbnRyb2wgdG8gdW4tY29udHJvbFxuICB1c2VMYXlvdXRVcGRhdGVFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghaGFzVmFsdWUodmFsdWUpKSB7XG4gICAgICBzZXRJbm5lclZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH0sIFt2YWx1ZV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gVXBkYXRlID09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHRyaWdnZXJDaGFuZ2UgPSB1c2VFdmVudChmdW5jdGlvbiAodXBkYXRlciwgaWdub3JlRGVzdHJveSkge1xuICAgIHNldElubmVyVmFsdWUodXBkYXRlciwgaWdub3JlRGVzdHJveSk7XG4gICAgc2V0UHJldlZhbHVlKFttZXJnZWRWYWx1ZV0sIGlnbm9yZURlc3Ryb3kpO1xuICB9KTtcbiAgcmV0dXJuIFtwb3N0TWVyZ2VkVmFsdWUsIHRyaWdnZXJDaGFuZ2VdO1xufSIsImV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgYWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50IHx8IG5hdmlnYXRvci52ZW5kb3IgfHwgd2luZG93Lm9wZXJhO1xuICByZXR1cm4gLyhhbmRyb2lkfGJiXFxkK3xtZWVnbykuK21vYmlsZXxhdmFudGdvfGJhZGFcXC98YmxhY2tiZXJyeXxibGF6ZXJ8Y29tcGFsfGVsYWluZXxmZW5uZWN8aGlwdG9wfGllbW9iaWxlfGlwKGhvbmV8b2QpfGlyaXN8a2luZGxlfGxnZSB8bWFlbW98bWlkcHxtbXB8bW9iaWxlLitmaXJlZm94fG5ldGZyb250fG9wZXJhIG0ob2J8aW4paXxwYWxtKCBvcyk/fHBob25lfHAoaXhpfHJlKVxcL3xwbHVja2VyfHBvY2tldHxwc3B8c2VyaWVzKDR8NikwfHN5bWJpYW58dHJlb3x1cFxcLihicm93c2VyfGxpbmspfHZvZGFmb25lfHdhcHx3aW5kb3dzIGNlfHhkYXx4aWlub3xhbmRyb2lkfGlwYWR8cGxheWJvb2t8c2lsay9pLnRlc3QoYWdlbnQpIHx8IC8xMjA3fDYzMTB8NjU5MHwzZ3NvfDR0aHB8NTBbMS02XWl8Nzcwc3w4MDJzfGEgd2F8YWJhY3xhYyhlcnxvb3xzLSl8YWkoa298cm4pfGFsKGF2fGNhfGNvKXxhbW9pfGFuKGV4fG55fHl3KXxhcHR1fGFyKGNofGdvKXxhcyh0ZXx1cyl8YXR0d3xhdShkaXwtbXxyIHxzICl8YXZhbnxiZShja3xsbHxucSl8YmkobGJ8cmQpfGJsKGFjfGF6KXxicihlfHYpd3xidW1ifGJ3LShufHUpfGM1NVxcL3xjYXBpfGNjd2F8Y2RtLXxjZWxsfGNodG18Y2xkY3xjbWQtfGNvKG1wfG5kKXxjcmF3fGRhKGl0fGxsfG5nKXxkYnRlfGRjLXN8ZGV2aXxkaWNhfGRtb2J8ZG8oY3xwKW98ZHMoMTJ8LWQpfGVsKDQ5fGFpKXxlbShsMnx1bCl8ZXIoaWN8azApfGVzbDh8ZXooWzQtN10wfG9zfHdhfHplKXxmZXRjfGZseSgtfF8pfGcxIHV8ZzU2MHxnZW5lfGdmLTV8Zy1tb3xnbyhcXC53fG9kKXxncihhZHx1bil8aGFpZXxoY2l0fGhkLShtfHB8dCl8aGVpLXxoaShwdHx0YSl8aHAoIGl8aXApfGhzLWN8aHQoYygtfCB8X3xhfGd8cHxzfHQpfHRwKXxodShhd3x0Yyl8aS0oMjB8Z298bWEpfGkyMzB8aWFjKCB8LXxcXC8pfGlicm98aWRlYXxpZzAxfGlrb218aW0xa3xpbm5vfGlwYXF8aXJpc3xqYSh0fHYpYXxqYnJvfGplbXV8amlnc3xrZGRpfGtlaml8a2d0KCB8XFwvKXxrbG9ufGtwdCB8a3djLXxreW8oY3xrKXxsZShub3x4aSl8bGcoIGd8XFwvKGt8bHx1KXw1MHw1NHwtW2Etd10pfGxpYnd8bHlueHxtMS13fG0zZ2F8bTUwXFwvfG1hKHRlfHVpfHhvKXxtYygwMXwyMXxjYSl8bS1jcnxtZShyY3xyaSl8bWkobzh8b2F8dHMpfG1tZWZ8bW8oMDF8MDJ8Yml8ZGV8ZG98dCgtfCB8b3x2KXx6eil8bXQoNTB8cDF8diApfG13YnB8bXl3YXxuMTBbMC0yXXxuMjBbMi0zXXxuMzAoMHwyKXxuNTAoMHwyfDUpfG43KDAoMHwxKXwxMCl8bmUoKGN8bSktfG9ufHRmfHdmfHdnfHd0KXxub2soNnxpKXxuenBofG8yaW18b3AodGl8d3YpfG9yYW58b3dnMXxwODAwfHBhbihhfGR8dCl8cGR4Z3xwZygxM3wtKFsxLThdfGMpKXxwaGlsfHBpcmV8cGwoYXl8dWMpfHBuLTJ8cG8oY2t8cnR8c2UpfHByb3h8cHNpb3xwdC1nfHFhLWF8cWMoMDd8MTJ8MjF8MzJ8NjB8LVsyLTddfGktKXxxdGVrfHIzODB8cjYwMHxyYWtzfHJpbTl8cm8odmV8em8pfHM1NVxcL3xzYShnZXxtYXxtbXxtc3xueXx2YSl8c2MoMDF8aC18b298cC0pfHNka1xcL3xzZShjKC18MHwxKXw0N3xtY3xuZHxyaSl8c2doLXxzaGFyfHNpZSgtfG0pfHNrLTB8c2woNDV8aWQpfHNtKGFsfGFyfGIzfGl0fHQ1KXxzbyhmdHxueSl8c3AoMDF8aC18di18diApfHN5KDAxfG1iKXx0MigxOHw1MCl8dDYoMDB8MTB8MTgpfHRhKGd0fGxrKXx0Y2wtfHRkZy18dGVsKGl8bSl8dGltLXx0LW1vfHRvKHBsfHNoKXx0cyg3MHxtLXxtM3xtNSl8dHgtOXx1cChcXC5ifGcxfHNpKXx1dHN0fHY0MDB8djc1MHx2ZXJpfHZpKHJnfHRlKXx2ayg0MHw1WzAtM118LXYpfHZtNDB8dm9kYXx2dWxjfHZ4KDUyfDUzfDYwfDYxfDcwfDgwfDgxfDgzfDg1fDk4KXx3M2MoLXwgKXx3ZWJjfHdoaXR8d2koZyB8bmN8bncpfHdtbGJ8d29udXx4NzAwfHlhcy18eW91cnx6ZXRvfHp0ZS0vaS50ZXN0KGFnZW50ID09PSBudWxsIHx8IGFnZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhZ2VudC5zdWJzdHIoMCwgNCkpO1xufSk7IiwiLyoqXG4gKiBAaWdub3JlXG4gKiBzb21lIGtleS1jb2RlcyBkZWZpbml0aW9uIGFuZCB1dGlscyBmcm9tIGNsb3N1cmUtbGlicmFyeVxuICogQGF1dGhvciB5aW1pbmdoZUBnbWFpbC5jb21cbiAqL1xuXG52YXIgS2V5Q29kZSA9IHtcbiAgLyoqXG4gICAqIE1BQ19FTlRFUlxuICAgKi9cbiAgTUFDX0VOVEVSOiAzLFxuICAvKipcbiAgICogQkFDS1NQQUNFXG4gICAqL1xuICBCQUNLU1BBQ0U6IDgsXG4gIC8qKlxuICAgKiBUQUJcbiAgICovXG4gIFRBQjogOSxcbiAgLyoqXG4gICAqIE5VTUxPQ0sgb24gRkYvU2FmYXJpIE1hY1xuICAgKi9cbiAgTlVNX0NFTlRFUjogMTIsXG4gIC8vIE5VTUxPQ0sgb24gRkYvU2FmYXJpIE1hY1xuICAvKipcbiAgICogRU5URVJcbiAgICovXG4gIEVOVEVSOiAxMyxcbiAgLyoqXG4gICAqIFNISUZUXG4gICAqL1xuICBTSElGVDogMTYsXG4gIC8qKlxuICAgKiBDVFJMXG4gICAqL1xuICBDVFJMOiAxNyxcbiAgLyoqXG4gICAqIEFMVFxuICAgKi9cbiAgQUxUOiAxOCxcbiAgLyoqXG4gICAqIFBBVVNFXG4gICAqL1xuICBQQVVTRTogMTksXG4gIC8qKlxuICAgKiBDQVBTX0xPQ0tcbiAgICovXG4gIENBUFNfTE9DSzogMjAsXG4gIC8qKlxuICAgKiBFU0NcbiAgICovXG4gIEVTQzogMjcsXG4gIC8qKlxuICAgKiBTUEFDRVxuICAgKi9cbiAgU1BBQ0U6IDMyLFxuICAvKipcbiAgICogUEFHRV9VUFxuICAgKi9cbiAgUEFHRV9VUDogMzMsXG4gIC8vIGFsc28gTlVNX05PUlRIX0VBU1RcbiAgLyoqXG4gICAqIFBBR0VfRE9XTlxuICAgKi9cbiAgUEFHRV9ET1dOOiAzNCxcbiAgLy8gYWxzbyBOVU1fU09VVEhfRUFTVFxuICAvKipcbiAgICogRU5EXG4gICAqL1xuICBFTkQ6IDM1LFxuICAvLyBhbHNvIE5VTV9TT1VUSF9XRVNUXG4gIC8qKlxuICAgKiBIT01FXG4gICAqL1xuICBIT01FOiAzNixcbiAgLy8gYWxzbyBOVU1fTk9SVEhfV0VTVFxuICAvKipcbiAgICogTEVGVFxuICAgKi9cbiAgTEVGVDogMzcsXG4gIC8vIGFsc28gTlVNX1dFU1RcbiAgLyoqXG4gICAqIFVQXG4gICAqL1xuICBVUDogMzgsXG4gIC8vIGFsc28gTlVNX05PUlRIXG4gIC8qKlxuICAgKiBSSUdIVFxuICAgKi9cbiAgUklHSFQ6IDM5LFxuICAvLyBhbHNvIE5VTV9FQVNUXG4gIC8qKlxuICAgKiBET1dOXG4gICAqL1xuICBET1dOOiA0MCxcbiAgLy8gYWxzbyBOVU1fU09VVEhcbiAgLyoqXG4gICAqIFBSSU5UX1NDUkVFTlxuICAgKi9cbiAgUFJJTlRfU0NSRUVOOiA0NCxcbiAgLyoqXG4gICAqIElOU0VSVFxuICAgKi9cbiAgSU5TRVJUOiA0NSxcbiAgLy8gYWxzbyBOVU1fSU5TRVJUXG4gIC8qKlxuICAgKiBERUxFVEVcbiAgICovXG4gIERFTEVURTogNDYsXG4gIC8vIGFsc28gTlVNX0RFTEVURVxuICAvKipcbiAgICogWkVST1xuICAgKi9cbiAgWkVSTzogNDgsXG4gIC8qKlxuICAgKiBPTkVcbiAgICovXG4gIE9ORTogNDksXG4gIC8qKlxuICAgKiBUV09cbiAgICovXG4gIFRXTzogNTAsXG4gIC8qKlxuICAgKiBUSFJFRVxuICAgKi9cbiAgVEhSRUU6IDUxLFxuICAvKipcbiAgICogRk9VUlxuICAgKi9cbiAgRk9VUjogNTIsXG4gIC8qKlxuICAgKiBGSVZFXG4gICAqL1xuICBGSVZFOiA1MyxcbiAgLyoqXG4gICAqIFNJWFxuICAgKi9cbiAgU0lYOiA1NCxcbiAgLyoqXG4gICAqIFNFVkVOXG4gICAqL1xuICBTRVZFTjogNTUsXG4gIC8qKlxuICAgKiBFSUdIVFxuICAgKi9cbiAgRUlHSFQ6IDU2LFxuICAvKipcbiAgICogTklORVxuICAgKi9cbiAgTklORTogNTcsXG4gIC8qKlxuICAgKiBRVUVTVElPTl9NQVJLXG4gICAqL1xuICBRVUVTVElPTl9NQVJLOiA2MyxcbiAgLy8gbmVlZHMgbG9jYWxpemF0aW9uXG4gIC8qKlxuICAgKiBBXG4gICAqL1xuICBBOiA2NSxcbiAgLyoqXG4gICAqIEJcbiAgICovXG4gIEI6IDY2LFxuICAvKipcbiAgICogQ1xuICAgKi9cbiAgQzogNjcsXG4gIC8qKlxuICAgKiBEXG4gICAqL1xuICBEOiA2OCxcbiAgLyoqXG4gICAqIEVcbiAgICovXG4gIEU6IDY5LFxuICAvKipcbiAgICogRlxuICAgKi9cbiAgRjogNzAsXG4gIC8qKlxuICAgKiBHXG4gICAqL1xuICBHOiA3MSxcbiAgLyoqXG4gICAqIEhcbiAgICovXG4gIEg6IDcyLFxuICAvKipcbiAgICogSVxuICAgKi9cbiAgSTogNzMsXG4gIC8qKlxuICAgKiBKXG4gICAqL1xuICBKOiA3NCxcbiAgLyoqXG4gICAqIEtcbiAgICovXG4gIEs6IDc1LFxuICAvKipcbiAgICogTFxuICAgKi9cbiAgTDogNzYsXG4gIC8qKlxuICAgKiBNXG4gICAqL1xuICBNOiA3NyxcbiAgLyoqXG4gICAqIE5cbiAgICovXG4gIE46IDc4LFxuICAvKipcbiAgICogT1xuICAgKi9cbiAgTzogNzksXG4gIC8qKlxuICAgKiBQXG4gICAqL1xuICBQOiA4MCxcbiAgLyoqXG4gICAqIFFcbiAgICovXG4gIFE6IDgxLFxuICAvKipcbiAgICogUlxuICAgKi9cbiAgUjogODIsXG4gIC8qKlxuICAgKiBTXG4gICAqL1xuICBTOiA4MyxcbiAgLyoqXG4gICAqIFRcbiAgICovXG4gIFQ6IDg0LFxuICAvKipcbiAgICogVVxuICAgKi9cbiAgVTogODUsXG4gIC8qKlxuICAgKiBWXG4gICAqL1xuICBWOiA4NixcbiAgLyoqXG4gICAqIFdcbiAgICovXG4gIFc6IDg3LFxuICAvKipcbiAgICogWFxuICAgKi9cbiAgWDogODgsXG4gIC8qKlxuICAgKiBZXG4gICAqL1xuICBZOiA4OSxcbiAgLyoqXG4gICAqIFpcbiAgICovXG4gIFo6IDkwLFxuICAvKipcbiAgICogTUVUQVxuICAgKi9cbiAgTUVUQTogOTEsXG4gIC8vIFdJTl9LRVlfTEVGVFxuICAvKipcbiAgICogV0lOX0tFWV9SSUdIVFxuICAgKi9cbiAgV0lOX0tFWV9SSUdIVDogOTIsXG4gIC8qKlxuICAgKiBDT05URVhUX01FTlVcbiAgICovXG4gIENPTlRFWFRfTUVOVTogOTMsXG4gIC8qKlxuICAgKiBOVU1fWkVST1xuICAgKi9cbiAgTlVNX1pFUk86IDk2LFxuICAvKipcbiAgICogTlVNX09ORVxuICAgKi9cbiAgTlVNX09ORTogOTcsXG4gIC8qKlxuICAgKiBOVU1fVFdPXG4gICAqL1xuICBOVU1fVFdPOiA5OCxcbiAgLyoqXG4gICAqIE5VTV9USFJFRVxuICAgKi9cbiAgTlVNX1RIUkVFOiA5OSxcbiAgLyoqXG4gICAqIE5VTV9GT1VSXG4gICAqL1xuICBOVU1fRk9VUjogMTAwLFxuICAvKipcbiAgICogTlVNX0ZJVkVcbiAgICovXG4gIE5VTV9GSVZFOiAxMDEsXG4gIC8qKlxuICAgKiBOVU1fU0lYXG4gICAqL1xuICBOVU1fU0lYOiAxMDIsXG4gIC8qKlxuICAgKiBOVU1fU0VWRU5cbiAgICovXG4gIE5VTV9TRVZFTjogMTAzLFxuICAvKipcbiAgICogTlVNX0VJR0hUXG4gICAqL1xuICBOVU1fRUlHSFQ6IDEwNCxcbiAgLyoqXG4gICAqIE5VTV9OSU5FXG4gICAqL1xuICBOVU1fTklORTogMTA1LFxuICAvKipcbiAgICogTlVNX01VTFRJUExZXG4gICAqL1xuICBOVU1fTVVMVElQTFk6IDEwNixcbiAgLyoqXG4gICAqIE5VTV9QTFVTXG4gICAqL1xuICBOVU1fUExVUzogMTA3LFxuICAvKipcbiAgICogTlVNX01JTlVTXG4gICAqL1xuICBOVU1fTUlOVVM6IDEwOSxcbiAgLyoqXG4gICAqIE5VTV9QRVJJT0RcbiAgICovXG4gIE5VTV9QRVJJT0Q6IDExMCxcbiAgLyoqXG4gICAqIE5VTV9ESVZJU0lPTlxuICAgKi9cbiAgTlVNX0RJVklTSU9OOiAxMTEsXG4gIC8qKlxuICAgKiBGMVxuICAgKi9cbiAgRjE6IDExMixcbiAgLyoqXG4gICAqIEYyXG4gICAqL1xuICBGMjogMTEzLFxuICAvKipcbiAgICogRjNcbiAgICovXG4gIEYzOiAxMTQsXG4gIC8qKlxuICAgKiBGNFxuICAgKi9cbiAgRjQ6IDExNSxcbiAgLyoqXG4gICAqIEY1XG4gICAqL1xuICBGNTogMTE2LFxuICAvKipcbiAgICogRjZcbiAgICovXG4gIEY2OiAxMTcsXG4gIC8qKlxuICAgKiBGN1xuICAgKi9cbiAgRjc6IDExOCxcbiAgLyoqXG4gICAqIEY4XG4gICAqL1xuICBGODogMTE5LFxuICAvKipcbiAgICogRjlcbiAgICovXG4gIEY5OiAxMjAsXG4gIC8qKlxuICAgKiBGMTBcbiAgICovXG4gIEYxMDogMTIxLFxuICAvKipcbiAgICogRjExXG4gICAqL1xuICBGMTE6IDEyMixcbiAgLyoqXG4gICAqIEYxMlxuICAgKi9cbiAgRjEyOiAxMjMsXG4gIC8qKlxuICAgKiBOVU1MT0NLXG4gICAqL1xuICBOVU1MT0NLOiAxNDQsXG4gIC8qKlxuICAgKiBTRU1JQ09MT05cbiAgICovXG4gIFNFTUlDT0xPTjogMTg2LFxuICAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXG4gICAqIERBU0hcbiAgICovXG4gIERBU0g6IDE4OSxcbiAgLy8gbmVlZHMgbG9jYWxpemF0aW9uXG4gIC8qKlxuICAgKiBFUVVBTFNcbiAgICovXG4gIEVRVUFMUzogMTg3LFxuICAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXG4gICAqIENPTU1BXG4gICAqL1xuICBDT01NQTogMTg4LFxuICAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXG4gICAqIFBFUklPRFxuICAgKi9cbiAgUEVSSU9EOiAxOTAsXG4gIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcbiAgICogU0xBU0hcbiAgICovXG4gIFNMQVNIOiAxOTEsXG4gIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcbiAgICogQVBPU1RST1BIRVxuICAgKi9cbiAgQVBPU1RST1BIRTogMTkyLFxuICAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXG4gICAqIFNJTkdMRV9RVU9URVxuICAgKi9cbiAgU0lOR0xFX1FVT1RFOiAyMjIsXG4gIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcbiAgICogT1BFTl9TUVVBUkVfQlJBQ0tFVFxuICAgKi9cbiAgT1BFTl9TUVVBUkVfQlJBQ0tFVDogMjE5LFxuICAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXG4gICAqIEJBQ0tTTEFTSFxuICAgKi9cbiAgQkFDS1NMQVNIOiAyMjAsXG4gIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcbiAgICogQ0xPU0VfU1FVQVJFX0JSQUNLRVRcbiAgICovXG4gIENMT1NFX1NRVUFSRV9CUkFDS0VUOiAyMjEsXG4gIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcbiAgICogV0lOX0tFWVxuICAgKi9cbiAgV0lOX0tFWTogMjI0LFxuICAvKipcbiAgICogTUFDX0ZGX01FVEFcbiAgICovXG4gIE1BQ19GRl9NRVRBOiAyMjQsXG4gIC8vIEZpcmVmb3ggKEdlY2tvKSBmaXJlcyB0aGlzIGZvciB0aGUgbWV0YSBrZXkgaW5zdGVhZCBvZiA5MVxuICAvKipcbiAgICogV0lOX0lNRVxuICAgKi9cbiAgV0lOX0lNRTogMjI5LFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gRnVuY3Rpb24gPT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8qKlxuICAgKiB3aGV0aGVyIHRleHQgYW5kIG1vZGlmaWVkIGtleSBpcyBlbnRlcmVkIGF0IHRoZSBzYW1lIHRpbWUuXG4gICAqL1xuICBpc1RleHRNb2RpZnlpbmdLZXlFdmVudDogZnVuY3Rpb24gaXNUZXh0TW9kaWZ5aW5nS2V5RXZlbnQoZSkge1xuICAgIHZhciBrZXlDb2RlID0gZS5rZXlDb2RlO1xuICAgIGlmIChlLmFsdEtleSAmJiAhZS5jdHJsS2V5IHx8IGUubWV0YUtleSB8fFxuICAgIC8vIEZ1bmN0aW9uIGtleXMgZG9uJ3QgZ2VuZXJhdGUgdGV4dFxuICAgIGtleUNvZGUgPj0gS2V5Q29kZS5GMSAmJiBrZXlDb2RlIDw9IEtleUNvZGUuRjEyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBrZXlzIGFyZSBxdWl0ZSBoYXJtbGVzcywgZXZlbiBpbiBjb21iaW5hdGlvbiB3aXRoXG4gICAgLy8gQ1RSTCwgQUxUIG9yIFNISUZULlxuICAgIHN3aXRjaCAoa2V5Q29kZSkge1xuICAgICAgY2FzZSBLZXlDb2RlLkFMVDpcbiAgICAgIGNhc2UgS2V5Q29kZS5DQVBTX0xPQ0s6XG4gICAgICBjYXNlIEtleUNvZGUuQ09OVEVYVF9NRU5VOlxuICAgICAgY2FzZSBLZXlDb2RlLkNUUkw6XG4gICAgICBjYXNlIEtleUNvZGUuRE9XTjpcbiAgICAgIGNhc2UgS2V5Q29kZS5FTkQ6XG4gICAgICBjYXNlIEtleUNvZGUuRVNDOlxuICAgICAgY2FzZSBLZXlDb2RlLkhPTUU6XG4gICAgICBjYXNlIEtleUNvZGUuSU5TRVJUOlxuICAgICAgY2FzZSBLZXlDb2RlLkxFRlQ6XG4gICAgICBjYXNlIEtleUNvZGUuTUFDX0ZGX01FVEE6XG4gICAgICBjYXNlIEtleUNvZGUuTUVUQTpcbiAgICAgIGNhc2UgS2V5Q29kZS5OVU1MT0NLOlxuICAgICAgY2FzZSBLZXlDb2RlLk5VTV9DRU5URVI6XG4gICAgICBjYXNlIEtleUNvZGUuUEFHRV9ET1dOOlxuICAgICAgY2FzZSBLZXlDb2RlLlBBR0VfVVA6XG4gICAgICBjYXNlIEtleUNvZGUuUEFVU0U6XG4gICAgICBjYXNlIEtleUNvZGUuUFJJTlRfU0NSRUVOOlxuICAgICAgY2FzZSBLZXlDb2RlLlJJR0hUOlxuICAgICAgY2FzZSBLZXlDb2RlLlNISUZUOlxuICAgICAgY2FzZSBLZXlDb2RlLlVQOlxuICAgICAgY2FzZSBLZXlDb2RlLldJTl9LRVk6XG4gICAgICBjYXNlIEtleUNvZGUuV0lOX0tFWV9SSUdIVDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogd2hldGhlciBjaGFyYWN0ZXIgaXMgZW50ZXJlZC5cbiAgICovXG4gIGlzQ2hhcmFjdGVyS2V5OiBmdW5jdGlvbiBpc0NoYXJhY3RlcktleShrZXlDb2RlKSB7XG4gICAgaWYgKGtleUNvZGUgPj0gS2V5Q29kZS5aRVJPICYmIGtleUNvZGUgPD0gS2V5Q29kZS5OSU5FKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGtleUNvZGUgPj0gS2V5Q29kZS5OVU1fWkVSTyAmJiBrZXlDb2RlIDw9IEtleUNvZGUuTlVNX01VTFRJUExZKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGtleUNvZGUgPj0gS2V5Q29kZS5BICYmIGtleUNvZGUgPD0gS2V5Q29kZS5aKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBTYWZhcmkgc2VuZHMgemVybyBrZXkgY29kZSBmb3Igbm9uLWxhdGluIGNoYXJhY3RlcnMuXG4gICAgaWYgKHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1dlYktpdCcpICE9PSAtMSAmJiBrZXlDb2RlID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc3dpdGNoIChrZXlDb2RlKSB7XG4gICAgICBjYXNlIEtleUNvZGUuU1BBQ0U6XG4gICAgICBjYXNlIEtleUNvZGUuUVVFU1RJT05fTUFSSzpcbiAgICAgIGNhc2UgS2V5Q29kZS5OVU1fUExVUzpcbiAgICAgIGNhc2UgS2V5Q29kZS5OVU1fTUlOVVM6XG4gICAgICBjYXNlIEtleUNvZGUuTlVNX1BFUklPRDpcbiAgICAgIGNhc2UgS2V5Q29kZS5OVU1fRElWSVNJT046XG4gICAgICBjYXNlIEtleUNvZGUuU0VNSUNPTE9OOlxuICAgICAgY2FzZSBLZXlDb2RlLkRBU0g6XG4gICAgICBjYXNlIEtleUNvZGUuRVFVQUxTOlxuICAgICAgY2FzZSBLZXlDb2RlLkNPTU1BOlxuICAgICAgY2FzZSBLZXlDb2RlLlBFUklPRDpcbiAgICAgIGNhc2UgS2V5Q29kZS5TTEFTSDpcbiAgICAgIGNhc2UgS2V5Q29kZS5BUE9TVFJPUEhFOlxuICAgICAgY2FzZSBLZXlDb2RlLlNJTkdMRV9RVU9URTpcbiAgICAgIGNhc2UgS2V5Q29kZS5PUEVOX1NRVUFSRV9CUkFDS0VUOlxuICAgICAgY2FzZSBLZXlDb2RlLkJBQ0tTTEFTSDpcbiAgICAgIGNhc2UgS2V5Q29kZS5DTE9TRV9TUVVBUkVfQlJBQ0tFVDpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgS2V5Q29kZTsiLCIvKipcbiAqIEJhc2VTZWxlY3QgcHJvdmlkZSBzb21lIHBhcnNlZCBkYXRhIGludG8gY29udGV4dC5cbiAqIFlvdSBjYW4gdXNlIHRoaXMgaG9va3MgdG8gZ2V0IHRoZW0uXG4gKi9cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciBCYXNlU2VsZWN0Q29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQmFzZVByb3BzKCkge1xuICByZXR1cm4gUmVhY3QudXNlQ29udGV4dChCYXNlU2VsZWN0Q29udGV4dCk7XG59IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbi8qKlxuICogU2ltaWxhciB3aXRoIGB1c2VMb2NrYCwgYnV0IHRoaXMgaG9vayB3aWxsIGFsd2F5cyBleGVjdXRlIGxhc3QgdmFsdWUuXG4gKiBXaGVuIHNldCB0byBgdHJ1ZWAsIGl0IHdpbGwga2VlcCBgdHJ1ZWAgZm9yIGEgc2hvcnQgdGltZSBldmVuIGlmIGBmYWxzZWAgaXMgc2V0LlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VEZWxheVJlc2V0KCkge1xuICB2YXIgdGltZW91dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMTA7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgYm9vbCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0Qm9vbCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBkZWxheVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIGNhbmNlbExhdGVzdCA9IGZ1bmN0aW9uIGNhbmNlbExhdGVzdCgpIHtcbiAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGRlbGF5UmVmLmN1cnJlbnQpO1xuICB9O1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjYW5jZWxMYXRlc3Q7XG4gIH0sIFtdKTtcbiAgdmFyIGRlbGF5U2V0Qm9vbCA9IGZ1bmN0aW9uIGRlbGF5U2V0Qm9vbCh2YWx1ZSwgY2FsbGJhY2spIHtcbiAgICBjYW5jZWxMYXRlc3QoKTtcbiAgICBkZWxheVJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgc2V0Qm9vbCh2YWx1ZSk7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9LCB0aW1lb3V0KTtcbiAgfTtcbiAgcmV0dXJuIFtib29sLCBkZWxheVNldEJvb2wsIGNhbmNlbExhdGVzdF07XG59IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG4vKipcbiAqIExvY2tlciByZXR1cm4gY2FjaGVkIG1hcmsuXG4gKiBJZiBzZXQgdG8gYHRydWVgLCB3aWxsIHJldHVybiBgdHJ1ZWAgaW4gYSBzaG9ydCB0aW1lIGV2ZW4gaWYgc2V0IGBmYWxzZWAuXG4gKiBJZiBzZXQgdG8gYGZhbHNlYCBhbmQgdGhlbiBzZXQgdG8gYHRydWVgLCB3aWxsIGNoYW5nZSB0byBgdHJ1ZWAuXG4gKiBBbmQgYWZ0ZXIgdGltZSBkdXJhdGlvbiwgaXQgd2lsbCBiYWNrIHRvIGBudWxsYCBhdXRvbWF0aWNhbGx5LlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VMb2NrKCkge1xuICB2YXIgZHVyYXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDI1MDtcbiAgdmFyIGxvY2tSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciB0aW1lb3V0UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuXG4gIC8vIENsZWFuIHVwXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dFJlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIGZ1bmN0aW9uIGRvTG9jayhsb2NrZWQpIHtcbiAgICBpZiAobG9ja2VkIHx8IGxvY2tSZWYuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgbG9ja1JlZi5jdXJyZW50ID0gbG9ja2VkO1xuICAgIH1cbiAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgdGltZW91dFJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgbG9ja1JlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9LCBkdXJhdGlvbik7XG4gIH1cbiAgcmV0dXJuIFtmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGxvY2tSZWYuY3VycmVudDtcbiAgfSwgZG9Mb2NrXTtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTZWxlY3RUcmlnZ2VyQ29udHJvbChlbGVtZW50cywgb3BlbiwgdHJpZ2dlck9wZW4sIGN1c3RvbWl6ZWRUcmlnZ2VyKSB7XG4gIHZhciBwcm9wc1JlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgcHJvcHNSZWYuY3VycmVudCA9IHtcbiAgICBvcGVuOiBvcGVuLFxuICAgIHRyaWdnZXJPcGVuOiB0cmlnZ2VyT3BlbixcbiAgICBjdXN0b21pemVkVHJpZ2dlcjogY3VzdG9taXplZFRyaWdnZXJcbiAgfTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBvbkdsb2JhbE1vdXNlRG93bihldmVudCkge1xuICAgICAgdmFyIF9wcm9wc1JlZiRjdXJyZW50O1xuICAgICAgLy8gSWYgdHJpZ2dlciBpcyBjdXN0b21pemVkLCBUcmlnZ2VyIHdpbGwgdGFrZSBjb250cm9sIG9mIHBvcHVwVmlzaWJsZVxuICAgICAgaWYgKChfcHJvcHNSZWYkY3VycmVudCA9IHByb3BzUmVmLmN1cnJlbnQpICE9PSBudWxsICYmIF9wcm9wc1JlZiRjdXJyZW50ICE9PSB2b2lkIDAgJiYgX3Byb3BzUmVmJGN1cnJlbnQuY3VzdG9taXplZFRyaWdnZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgIGlmICh0YXJnZXQuc2hhZG93Um9vdCAmJiBldmVudC5jb21wb3NlZCkge1xuICAgICAgICB0YXJnZXQgPSBldmVudC5jb21wb3NlZFBhdGgoKVswXSB8fCB0YXJnZXQ7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHNSZWYuY3VycmVudC5vcGVuICYmIGVsZW1lbnRzKCkuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgfSkuZXZlcnkoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuICFlbGVtZW50LmNvbnRhaW5zKHRhcmdldCkgJiYgZWxlbWVudCAhPT0gdGFyZ2V0O1xuICAgICAgfSkpIHtcbiAgICAgICAgLy8gU2hvdWxkIHRyaWdnZXIgY2xvc2VcbiAgICAgICAgcHJvcHNSZWYuY3VycmVudC50cmlnZ2VyT3BlbihmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbkdsb2JhbE1vdXNlRG93bik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25HbG9iYWxNb3VzZURvd24pO1xuICAgIH07XG4gIH0sIFtdKTtcbn0iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xudmFyIGF0dHJpYnV0ZXMgPSBcImFjY2VwdCBhY2NlcHRDaGFyc2V0IGFjY2Vzc0tleSBhY3Rpb24gYWxsb3dGdWxsU2NyZWVuIGFsbG93VHJhbnNwYXJlbmN5XFxuICAgIGFsdCBhc3luYyBhdXRvQ29tcGxldGUgYXV0b0ZvY3VzIGF1dG9QbGF5IGNhcHR1cmUgY2VsbFBhZGRpbmcgY2VsbFNwYWNpbmcgY2hhbGxlbmdlXFxuICAgIGNoYXJTZXQgY2hlY2tlZCBjbGFzc0lEIGNsYXNzTmFtZSBjb2xTcGFuIGNvbHMgY29udGVudCBjb250ZW50RWRpdGFibGUgY29udGV4dE1lbnVcXG4gICAgY29udHJvbHMgY29vcmRzIGNyb3NzT3JpZ2luIGRhdGEgZGF0ZVRpbWUgZGVmYXVsdCBkZWZlciBkaXIgZGlzYWJsZWQgZG93bmxvYWQgZHJhZ2dhYmxlXFxuICAgIGVuY1R5cGUgZm9ybSBmb3JtQWN0aW9uIGZvcm1FbmNUeXBlIGZvcm1NZXRob2QgZm9ybU5vVmFsaWRhdGUgZm9ybVRhcmdldCBmcmFtZUJvcmRlclxcbiAgICBoZWFkZXJzIGhlaWdodCBoaWRkZW4gaGlnaCBocmVmIGhyZWZMYW5nIGh0bWxGb3IgaHR0cEVxdWl2IGljb24gaWQgaW5wdXRNb2RlIGludGVncml0eVxcbiAgICBpcyBrZXlQYXJhbXMga2V5VHlwZSBraW5kIGxhYmVsIGxhbmcgbGlzdCBsb29wIGxvdyBtYW5pZmVzdCBtYXJnaW5IZWlnaHQgbWFyZ2luV2lkdGggbWF4IG1heExlbmd0aCBtZWRpYVxcbiAgICBtZWRpYUdyb3VwIG1ldGhvZCBtaW4gbWluTGVuZ3RoIG11bHRpcGxlIG11dGVkIG5hbWUgbm9WYWxpZGF0ZSBub25jZSBvcGVuXFxuICAgIG9wdGltdW0gcGF0dGVybiBwbGFjZWhvbGRlciBwb3N0ZXIgcHJlbG9hZCByYWRpb0dyb3VwIHJlYWRPbmx5IHJlbCByZXF1aXJlZFxcbiAgICByZXZlcnNlZCByb2xlIHJvd1NwYW4gcm93cyBzYW5kYm94IHNjb3BlIHNjb3BlZCBzY3JvbGxpbmcgc2VhbWxlc3Mgc2VsZWN0ZWRcXG4gICAgc2hhcGUgc2l6ZSBzaXplcyBzcGFuIHNwZWxsQ2hlY2sgc3JjIHNyY0RvYyBzcmNMYW5nIHNyY1NldCBzdGFydCBzdGVwIHN0eWxlXFxuICAgIHN1bW1hcnkgdGFiSW5kZXggdGFyZ2V0IHRpdGxlIHR5cGUgdXNlTWFwIHZhbHVlIHdpZHRoIHdtb2RlIHdyYXBcIjtcbnZhciBldmVudHNOYW1lID0gXCJvbkNvcHkgb25DdXQgb25QYXN0ZSBvbkNvbXBvc2l0aW9uRW5kIG9uQ29tcG9zaXRpb25TdGFydCBvbkNvbXBvc2l0aW9uVXBkYXRlIG9uS2V5RG93blxcbiAgICBvbktleVByZXNzIG9uS2V5VXAgb25Gb2N1cyBvbkJsdXIgb25DaGFuZ2Ugb25JbnB1dCBvblN1Ym1pdCBvbkNsaWNrIG9uQ29udGV4dE1lbnUgb25Eb3VibGVDbGlja1xcbiAgICBvbkRyYWcgb25EcmFnRW5kIG9uRHJhZ0VudGVyIG9uRHJhZ0V4aXQgb25EcmFnTGVhdmUgb25EcmFnT3ZlciBvbkRyYWdTdGFydCBvbkRyb3Agb25Nb3VzZURvd25cXG4gICAgb25Nb3VzZUVudGVyIG9uTW91c2VMZWF2ZSBvbk1vdXNlTW92ZSBvbk1vdXNlT3V0IG9uTW91c2VPdmVyIG9uTW91c2VVcCBvblNlbGVjdCBvblRvdWNoQ2FuY2VsXFxuICAgIG9uVG91Y2hFbmQgb25Ub3VjaE1vdmUgb25Ub3VjaFN0YXJ0IG9uU2Nyb2xsIG9uV2hlZWwgb25BYm9ydCBvbkNhblBsYXkgb25DYW5QbGF5VGhyb3VnaFxcbiAgICBvbkR1cmF0aW9uQ2hhbmdlIG9uRW1wdGllZCBvbkVuY3J5cHRlZCBvbkVuZGVkIG9uRXJyb3Igb25Mb2FkZWREYXRhIG9uTG9hZGVkTWV0YWRhdGFcXG4gICAgb25Mb2FkU3RhcnQgb25QYXVzZSBvblBsYXkgb25QbGF5aW5nIG9uUHJvZ3Jlc3Mgb25SYXRlQ2hhbmdlIG9uU2Vla2VkIG9uU2Vla2luZyBvblN0YWxsZWQgb25TdXNwZW5kIG9uVGltZVVwZGF0ZSBvblZvbHVtZUNoYW5nZSBvbldhaXRpbmcgb25Mb2FkIG9uRXJyb3JcIjtcbnZhciBwcm9wTGlzdCA9IFwiXCIuY29uY2F0KGF0dHJpYnV0ZXMsIFwiIFwiKS5jb25jYXQoZXZlbnRzTmFtZSkuc3BsaXQoL1tcXHNcXG5dKy8pO1xuXG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi9cbnZhciBhcmlhUHJlZml4ID0gJ2FyaWEtJztcbnZhciBkYXRhUHJlZml4ID0gJ2RhdGEtJztcbmZ1bmN0aW9uIG1hdGNoKGtleSwgcHJlZml4KSB7XG4gIHJldHVybiBrZXkuaW5kZXhPZihwcmVmaXgpID09PSAwO1xufVxuLyoqXG4gKiBQaWNrZXIgcHJvcHMgZnJvbSBleGlzdCBwcm9wcyB3aXRoIGZpbHRlclxuICogQHBhcmFtIHByb3BzIFBhc3NlZCBwcm9wc1xuICogQHBhcmFtIGFyaWFPbmx5IGJvb2xlYW4gfCB7IGFyaWE/OiBib29sZWFuOyBkYXRhPzogYm9vbGVhbjsgYXR0cj86IGJvb2xlYW47IH0gZmlsdGVyIGNvbmZpZ1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwaWNrQXR0cnMocHJvcHMpIHtcbiAgdmFyIGFyaWFPbmx5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgdmFyIG1lcmdlZENvbmZpZztcbiAgaWYgKGFyaWFPbmx5ID09PSBmYWxzZSkge1xuICAgIG1lcmdlZENvbmZpZyA9IHtcbiAgICAgIGFyaWE6IHRydWUsXG4gICAgICBkYXRhOiB0cnVlLFxuICAgICAgYXR0cjogdHJ1ZVxuICAgIH07XG4gIH0gZWxzZSBpZiAoYXJpYU9ubHkgPT09IHRydWUpIHtcbiAgICBtZXJnZWRDb25maWcgPSB7XG4gICAgICBhcmlhOiB0cnVlXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBtZXJnZWRDb25maWcgPSBfb2JqZWN0U3ByZWFkKHt9LCBhcmlhT25seSk7XG4gIH1cbiAgdmFyIGF0dHJzID0ge307XG4gIE9iamVjdC5rZXlzKHByb3BzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoXG4gICAgLy8gQXJpYVxuICAgIG1lcmdlZENvbmZpZy5hcmlhICYmIChrZXkgPT09ICdyb2xlJyB8fCBtYXRjaChrZXksIGFyaWFQcmVmaXgpKSB8fFxuICAgIC8vIERhdGFcbiAgICBtZXJnZWRDb25maWcuZGF0YSAmJiBtYXRjaChrZXksIGRhdGFQcmVmaXgpIHx8XG4gICAgLy8gQXR0clxuICAgIG1lcmdlZENvbmZpZy5hdHRyICYmIHByb3BMaXN0LmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIGF0dHJzW2tleV0gPSBwcm9wc1trZXldO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBhdHRycztcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInByZWZpeENsc1wiLCBcImludmFsaWRhdGVcIiwgXCJpdGVtXCIsIFwicmVuZGVySXRlbVwiLCBcInJlc3BvbnNpdmVcIiwgXCJyZXNwb25zaXZlRGlzYWJsZWRcIiwgXCJyZWdpc3RlclNpemVcIiwgXCJpdGVtS2V5XCIsIFwiY2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJjaGlsZHJlblwiLCBcImRpc3BsYXlcIiwgXCJvcmRlclwiLCBcImNvbXBvbmVudFwiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3JjLXJlc2l6ZS1vYnNlcnZlcic7XG4vLyBVc2Ugc2hhcmVkIHZhcmlhYmxlIHRvIHNhdmUgYnVuZGxlIHNpemVcbnZhciBVTkRFRklORUQgPSB1bmRlZmluZWQ7XG5mdW5jdGlvbiBJbnRlcm5hbEl0ZW0ocHJvcHMsIHJlZikge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGludmFsaWRhdGUgPSBwcm9wcy5pbnZhbGlkYXRlLFxuICAgIGl0ZW0gPSBwcm9wcy5pdGVtLFxuICAgIHJlbmRlckl0ZW0gPSBwcm9wcy5yZW5kZXJJdGVtLFxuICAgIHJlc3BvbnNpdmUgPSBwcm9wcy5yZXNwb25zaXZlLFxuICAgIHJlc3BvbnNpdmVEaXNhYmxlZCA9IHByb3BzLnJlc3BvbnNpdmVEaXNhYmxlZCxcbiAgICByZWdpc3RlclNpemUgPSBwcm9wcy5yZWdpc3RlclNpemUsXG4gICAgaXRlbUtleSA9IHByb3BzLml0ZW1LZXksXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBkaXNwbGF5ID0gcHJvcHMuZGlzcGxheSxcbiAgICBvcmRlciA9IHByb3BzLm9yZGVyLFxuICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgQ29tcG9uZW50ID0gX3Byb3BzJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2RpdicgOiBfcHJvcHMkY29tcG9uZW50LFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIG1lcmdlZEhpZGRlbiA9IHJlc3BvbnNpdmUgJiYgIWRpc3BsYXk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBpbnRlcm5hbFJlZ2lzdGVyU2l6ZSh3aWR0aCkge1xuICAgIHJlZ2lzdGVyU2l6ZShpdGVtS2V5LCB3aWR0aCk7XG4gIH1cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgaW50ZXJuYWxSZWdpc3RlclNpemUobnVsbCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGNoaWxkTm9kZSA9IHJlbmRlckl0ZW0gJiYgaXRlbSAhPT0gVU5ERUZJTkVEID8gcmVuZGVySXRlbShpdGVtKSA6IGNoaWxkcmVuO1xuICB2YXIgb3ZlcmZsb3dTdHlsZTtcbiAgaWYgKCFpbnZhbGlkYXRlKSB7XG4gICAgb3ZlcmZsb3dTdHlsZSA9IHtcbiAgICAgIG9wYWNpdHk6IG1lcmdlZEhpZGRlbiA/IDAgOiAxLFxuICAgICAgaGVpZ2h0OiBtZXJnZWRIaWRkZW4gPyAwIDogVU5ERUZJTkVELFxuICAgICAgb3ZlcmZsb3dZOiBtZXJnZWRIaWRkZW4gPyAnaGlkZGVuJyA6IFVOREVGSU5FRCxcbiAgICAgIG9yZGVyOiByZXNwb25zaXZlID8gb3JkZXIgOiBVTkRFRklORUQsXG4gICAgICBwb2ludGVyRXZlbnRzOiBtZXJnZWRIaWRkZW4gPyAnbm9uZScgOiBVTkRFRklORUQsXG4gICAgICBwb3NpdGlvbjogbWVyZ2VkSGlkZGVuID8gJ2Fic29sdXRlJyA6IFVOREVGSU5FRFxuICAgIH07XG4gIH1cbiAgdmFyIG92ZXJmbG93UHJvcHMgPSB7fTtcbiAgaWYgKG1lcmdlZEhpZGRlbikge1xuICAgIG92ZXJmbG93UHJvcHNbJ2FyaWEtaGlkZGVuJ10gPSB0cnVlO1xuICB9XG4gIHZhciBpdGVtTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyghaW52YWxpZGF0ZSAmJiBwcmVmaXhDbHMsIGNsYXNzTmFtZSksXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3ZlcmZsb3dTdHlsZSksIHN0eWxlKVxuICB9LCBvdmVyZmxvd1Byb3BzLCByZXN0UHJvcHMsIHtcbiAgICByZWY6IHJlZlxuICB9KSwgY2hpbGROb2RlKTtcbiAgaWYgKHJlc3BvbnNpdmUpIHtcbiAgICBpdGVtTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlc2l6ZU9ic2VydmVyLCB7XG4gICAgICBvblJlc2l6ZTogZnVuY3Rpb24gb25SZXNpemUoX3JlZikge1xuICAgICAgICB2YXIgb2Zmc2V0V2lkdGggPSBfcmVmLm9mZnNldFdpZHRoO1xuICAgICAgICBpbnRlcm5hbFJlZ2lzdGVyU2l6ZShvZmZzZXRXaWR0aCk7XG4gICAgICB9LFxuICAgICAgZGlzYWJsZWQ6IHJlc3BvbnNpdmVEaXNhYmxlZFxuICAgIH0sIGl0ZW1Ob2RlKTtcbiAgfVxuICByZXR1cm4gaXRlbU5vZGU7XG59XG52YXIgSXRlbSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEludGVybmFsSXRlbSk7XG5JdGVtLmRpc3BsYXlOYW1lID0gJ0l0ZW0nO1xuZXhwb3J0IGRlZmF1bHQgSXRlbTsiLCJpbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2hhbm5lbFVwZGF0ZShjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsID09PSAndW5kZWZpbmVkJykge1xuICAgIHJhZihjYWxsYmFjayk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH07XG4gICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSh1bmRlZmluZWQpO1xuICB9XG59IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgdXNlRXZlbnQgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlRXZlbnRcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzIH0gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCBjaGFubmVsVXBkYXRlIGZyb20gJy4vY2hhbm5lbFVwZGF0ZSc7XG4vKipcbiAqIEJhdGNoZXIgZm9yIHJlY29yZCBhbnkgYHVzZUVmZmVjdFN0YXRlYCBuZWVkIHVwZGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUJhdGNoZXIoKSB7XG4gIC8vIFVwZGF0ZXIgVHJpZ2dlclxuICB2YXIgdXBkYXRlRnVuY1JlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgLy8gTm90aWZ5IHVwZGF0ZVxuICB2YXIgbm90aWZ5RWZmZWN0VXBkYXRlID0gZnVuY3Rpb24gbm90aWZ5RWZmZWN0VXBkYXRlKGNhbGxiYWNrKSB7XG4gICAgaWYgKCF1cGRhdGVGdW5jUmVmLmN1cnJlbnQpIHtcbiAgICAgIHVwZGF0ZUZ1bmNSZWYuY3VycmVudCA9IFtdO1xuICAgICAgY2hhbm5lbFVwZGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB1cGRhdGVGdW5jUmVmLmN1cnJlbnQuZm9yRWFjaChmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgIGZuKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdXBkYXRlRnVuY1JlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdXBkYXRlRnVuY1JlZi5jdXJyZW50LnB1c2goY2FsbGJhY2spO1xuICB9O1xuICByZXR1cm4gbm90aWZ5RWZmZWN0VXBkYXRlO1xufVxuLyoqXG4gKiBUcmlnZ2VyIHN0YXRlIHVwZGF0ZSBieSBgdXNlTGF5b3V0RWZmZWN0YCB0byBzYXZlIHBlcmYuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUVmZmVjdFN0YXRlKG5vdGlmeUVmZmVjdFVwZGF0ZSwgZGVmYXVsdFZhbHVlKSB7XG4gIC8vIFZhbHVlXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShkZWZhdWx0VmFsdWUpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHN0YXRlVmFsdWUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFN0YXRlVmFsdWUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICAvLyBTZXQgU3RhdGVcbiAgdmFyIHNldEVmZmVjdFZhbCA9IHVzZUV2ZW50KGZ1bmN0aW9uIChuZXh0VmFsdWUpIHtcbiAgICBub3RpZnlFZmZlY3RVcGRhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgc2V0U3RhdGVWYWx1ZShuZXh0VmFsdWUpO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIFtzdGF0ZVZhbHVlLCBzZXRFZmZlY3RWYWxdO1xufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgdmFyIE92ZXJmbG93Q29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJjb21wb25lbnRcIl0sXG4gIF9leGNsdWRlZDIgPSBbXCJjbGFzc05hbWVcIl0sXG4gIF9leGNsdWRlZDMgPSBbXCJjbGFzc05hbWVcIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBJdGVtIGZyb20gJy4vSXRlbSc7XG5pbXBvcnQgeyBPdmVyZmxvd0NvbnRleHQgfSBmcm9tICcuL2NvbnRleHQnO1xudmFyIEludGVybmFsUmF3SXRlbSA9IGZ1bmN0aW9uIEludGVybmFsUmF3SXRlbShwcm9wcywgcmVmKSB7XG4gIHZhciBjb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChPdmVyZmxvd0NvbnRleHQpO1xuICAvLyBSZW5kZXIgZGlyZWN0bHkgd2hlbiBjb250ZXh0IG5vdCBwcm92aWRlZFxuICBpZiAoIWNvbnRleHQpIHtcbiAgICB2YXIgX3Byb3BzJGNvbXBvbmVudCA9IHByb3BzLmNvbXBvbmVudCxcbiAgICAgIENvbXBvbmVudCA9IF9wcm9wcyRjb21wb25lbnQgPT09IHZvaWQgMCA/ICdkaXYnIDogX3Byb3BzJGNvbXBvbmVudCxcbiAgICAgIF9yZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe30sIF9yZXN0UHJvcHMsIHtcbiAgICAgIHJlZjogcmVmXG4gICAgfSkpO1xuICB9XG4gIHZhciBjb250ZXh0Q2xhc3NOYW1lID0gY29udGV4dC5jbGFzc05hbWUsXG4gICAgcmVzdENvbnRleHQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoY29udGV4dCwgX2V4Y2x1ZGVkMik7XG4gIHZhciBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQzKTtcbiAgLy8gRG8gbm90IHBhc3MgY29udGV4dCB0byBzdWIgaXRlbSB0byBhdm9pZCBtdWx0aXBsZSBtZWFzdXJlXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPdmVyZmxvd0NvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogbnVsbFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJdGVtLCBfZXh0ZW5kcyh7XG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNvbnRleHRDbGFzc05hbWUsIGNsYXNzTmFtZSlcbiAgfSwgcmVzdENvbnRleHQsIHJlc3RQcm9wcykpKTtcbn07XG52YXIgUmF3SXRlbSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEludGVybmFsUmF3SXRlbSk7XG5SYXdJdGVtLmRpc3BsYXlOYW1lID0gJ1Jhd0l0ZW0nO1xuZXhwb3J0IGRlZmF1bHQgUmF3SXRlbTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wicHJlZml4Q2xzXCIsIFwiZGF0YVwiLCBcInJlbmRlckl0ZW1cIiwgXCJyZW5kZXJSYXdJdGVtXCIsIFwiaXRlbUtleVwiLCBcIml0ZW1XaWR0aFwiLCBcInNzclwiLCBcInN0eWxlXCIsIFwiY2xhc3NOYW1lXCIsIFwibWF4Q291bnRcIiwgXCJyZW5kZXJSZXN0XCIsIFwicmVuZGVyUmF3UmVzdFwiLCBcInN1ZmZpeFwiLCBcImNvbXBvbmVudFwiLCBcIml0ZW1Db21wb25lbnRcIiwgXCJvblZpc2libGVDaGFuZ2VcIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlTWVtbywgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSZXNpemVPYnNlcnZlciBmcm9tICdyYy1yZXNpemUtb2JzZXJ2ZXInO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCBJdGVtIGZyb20gJy4vSXRlbSc7XG5pbXBvcnQgdXNlRWZmZWN0U3RhdGUsIHsgdXNlQmF0Y2hlciB9IGZyb20gJy4vaG9va3MvdXNlRWZmZWN0U3RhdGUnO1xuaW1wb3J0IFJhd0l0ZW0gZnJvbSAnLi9SYXdJdGVtJztcbmltcG9ydCB7IE92ZXJmbG93Q29udGV4dCB9IGZyb20gJy4vY29udGV4dCc7XG52YXIgUkVTUE9OU0lWRSA9ICdyZXNwb25zaXZlJztcbnZhciBJTlZBTElEQVRFID0gJ2ludmFsaWRhdGUnO1xuZXhwb3J0IHsgT3ZlcmZsb3dDb250ZXh0IH0gZnJvbSAnLi9jb250ZXh0JztcbmZ1bmN0aW9uIGRlZmF1bHRSZW5kZXJSZXN0KG9taXR0ZWRJdGVtcykge1xuICByZXR1cm4gXCIrIFwiLmNvbmNhdChvbWl0dGVkSXRlbXMubGVuZ3RoLCBcIiAuLi5cIik7XG59XG5mdW5jdGlvbiBPdmVyZmxvdyhwcm9wcywgcmVmKSB7XG4gIHZhciBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy1vdmVyZmxvdycgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgIF9wcm9wcyRkYXRhID0gcHJvcHMuZGF0YSxcbiAgICBkYXRhID0gX3Byb3BzJGRhdGEgPT09IHZvaWQgMCA/IFtdIDogX3Byb3BzJGRhdGEsXG4gICAgcmVuZGVySXRlbSA9IHByb3BzLnJlbmRlckl0ZW0sXG4gICAgcmVuZGVyUmF3SXRlbSA9IHByb3BzLnJlbmRlclJhd0l0ZW0sXG4gICAgaXRlbUtleSA9IHByb3BzLml0ZW1LZXksXG4gICAgX3Byb3BzJGl0ZW1XaWR0aCA9IHByb3BzLml0ZW1XaWR0aCxcbiAgICBpdGVtV2lkdGggPSBfcHJvcHMkaXRlbVdpZHRoID09PSB2b2lkIDAgPyAxMCA6IF9wcm9wcyRpdGVtV2lkdGgsXG4gICAgc3NyID0gcHJvcHMuc3NyLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIG1heENvdW50ID0gcHJvcHMubWF4Q291bnQsXG4gICAgcmVuZGVyUmVzdCA9IHByb3BzLnJlbmRlclJlc3QsXG4gICAgcmVuZGVyUmF3UmVzdCA9IHByb3BzLnJlbmRlclJhd1Jlc3QsXG4gICAgc3VmZml4ID0gcHJvcHMuc3VmZml4LFxuICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgQ29tcG9uZW50ID0gX3Byb3BzJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2RpdicgOiBfcHJvcHMkY29tcG9uZW50LFxuICAgIGl0ZW1Db21wb25lbnQgPSBwcm9wcy5pdGVtQ29tcG9uZW50LFxuICAgIG9uVmlzaWJsZUNoYW5nZSA9IHByb3BzLm9uVmlzaWJsZUNoYW5nZSxcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG4gIHZhciBmdWxseVNTUiA9IHNzciA9PT0gJ2Z1bGwnO1xuICB2YXIgbm90aWZ5RWZmZWN0VXBkYXRlID0gdXNlQmF0Y2hlcigpO1xuICB2YXIgX3VzZUVmZmVjdFN0YXRlID0gdXNlRWZmZWN0U3RhdGUobm90aWZ5RWZmZWN0VXBkYXRlLCBudWxsKSxcbiAgICBfdXNlRWZmZWN0U3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZUVmZmVjdFN0YXRlLCAyKSxcbiAgICBjb250YWluZXJXaWR0aCA9IF91c2VFZmZlY3RTdGF0ZTJbMF0sXG4gICAgc2V0Q29udGFpbmVyV2lkdGggPSBfdXNlRWZmZWN0U3RhdGUyWzFdO1xuICB2YXIgbWVyZ2VkQ29udGFpbmVyV2lkdGggPSBjb250YWluZXJXaWR0aCB8fCAwO1xuICB2YXIgX3VzZUVmZmVjdFN0YXRlMyA9IHVzZUVmZmVjdFN0YXRlKG5vdGlmeUVmZmVjdFVwZGF0ZSwgbmV3IE1hcCgpKSxcbiAgICBfdXNlRWZmZWN0U3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZUVmZmVjdFN0YXRlMywgMiksXG4gICAgaXRlbVdpZHRocyA9IF91c2VFZmZlY3RTdGF0ZTRbMF0sXG4gICAgc2V0SXRlbVdpZHRocyA9IF91c2VFZmZlY3RTdGF0ZTRbMV07XG4gIHZhciBfdXNlRWZmZWN0U3RhdGU1ID0gdXNlRWZmZWN0U3RhdGUobm90aWZ5RWZmZWN0VXBkYXRlLCAwKSxcbiAgICBfdXNlRWZmZWN0U3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX3VzZUVmZmVjdFN0YXRlNSwgMiksXG4gICAgcHJldlJlc3RXaWR0aCA9IF91c2VFZmZlY3RTdGF0ZTZbMF0sXG4gICAgc2V0UHJldlJlc3RXaWR0aCA9IF91c2VFZmZlY3RTdGF0ZTZbMV07XG4gIHZhciBfdXNlRWZmZWN0U3RhdGU3ID0gdXNlRWZmZWN0U3RhdGUobm90aWZ5RWZmZWN0VXBkYXRlLCAwKSxcbiAgICBfdXNlRWZmZWN0U3RhdGU4ID0gX3NsaWNlZFRvQXJyYXkoX3VzZUVmZmVjdFN0YXRlNywgMiksXG4gICAgcmVzdFdpZHRoID0gX3VzZUVmZmVjdFN0YXRlOFswXSxcbiAgICBzZXRSZXN0V2lkdGggPSBfdXNlRWZmZWN0U3RhdGU4WzFdO1xuICB2YXIgX3VzZUVmZmVjdFN0YXRlOSA9IHVzZUVmZmVjdFN0YXRlKG5vdGlmeUVmZmVjdFVwZGF0ZSwgMCksXG4gICAgX3VzZUVmZmVjdFN0YXRlMTAgPSBfc2xpY2VkVG9BcnJheShfdXNlRWZmZWN0U3RhdGU5LCAyKSxcbiAgICBzdWZmaXhXaWR0aCA9IF91c2VFZmZlY3RTdGF0ZTEwWzBdLFxuICAgIHNldFN1ZmZpeFdpZHRoID0gX3VzZUVmZmVjdFN0YXRlMTBbMV07XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShudWxsKSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICBzdWZmaXhGaXhlZFN0YXJ0ID0gX3VzZVN0YXRlMlswXSxcbiAgICBzZXRTdWZmaXhGaXhlZFN0YXJ0ID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZShudWxsKSxcbiAgICBfdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlMywgMiksXG4gICAgZGlzcGxheUNvdW50ID0gX3VzZVN0YXRlNFswXSxcbiAgICBzZXREaXNwbGF5Q291bnQgPSBfdXNlU3RhdGU0WzFdO1xuICB2YXIgbWVyZ2VkRGlzcGxheUNvdW50ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGRpc3BsYXlDb3VudCA9PT0gbnVsbCAmJiBmdWxseVNTUikge1xuICAgICAgcmV0dXJuIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgIH1cbiAgICByZXR1cm4gZGlzcGxheUNvdW50IHx8IDA7XG4gIH0sIFtkaXNwbGF5Q291bnQsIGNvbnRhaW5lcldpZHRoXSk7XG4gIHZhciBfdXNlU3RhdGU1ID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgIF91c2VTdGF0ZTYgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGU1LCAyKSxcbiAgICByZXN0UmVhZHkgPSBfdXNlU3RhdGU2WzBdLFxuICAgIHNldFJlc3RSZWFkeSA9IF91c2VTdGF0ZTZbMV07XG4gIHZhciBpdGVtUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtXCIpO1xuICAvLyBBbHdheXMgdXNlIHRoZSBtYXggd2lkdGggdG8gYXZvaWQgYmxpbmtcbiAgdmFyIG1lcmdlZFJlc3RXaWR0aCA9IE1hdGgubWF4KHByZXZSZXN0V2lkdGgsIHJlc3RXaWR0aCk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBEYXRhID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZXNwb25zaXZlID0gbWF4Q291bnQgPT09IFJFU1BPTlNJVkU7XG4gIHZhciBzaG91bGRSZXNwb25zaXZlID0gZGF0YS5sZW5ndGggJiYgaXNSZXNwb25zaXZlO1xuICB2YXIgaW52YWxpZGF0ZSA9IG1heENvdW50ID09PSBJTlZBTElEQVRFO1xuICAvKipcbiAgICogV2hlbiBpcyBgcmVzcG9uc2l2ZWAsIHdlIHdpbGwgYWx3YXlzIHJlbmRlciByZXN0IG5vZGUgdG8gZ2V0IHRoZSByZWFsIHdpZHRoIG9mIGl0IGZvciBjYWxjdWxhdGlvblxuICAgKi9cbiAgdmFyIHNob3dSZXN0ID0gc2hvdWxkUmVzcG9uc2l2ZSB8fCB0eXBlb2YgbWF4Q291bnQgPT09ICdudW1iZXInICYmIGRhdGEubGVuZ3RoID4gbWF4Q291bnQ7XG4gIHZhciBtZXJnZWREYXRhID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGl0ZW1zID0gZGF0YTtcbiAgICBpZiAoc2hvdWxkUmVzcG9uc2l2ZSkge1xuICAgICAgaWYgKGNvbnRhaW5lcldpZHRoID09PSBudWxsICYmIGZ1bGx5U1NSKSB7XG4gICAgICAgIGl0ZW1zID0gZGF0YTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1zID0gZGF0YS5zbGljZSgwLCBNYXRoLm1pbihkYXRhLmxlbmd0aCwgbWVyZ2VkQ29udGFpbmVyV2lkdGggLyBpdGVtV2lkdGgpKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtYXhDb3VudCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGl0ZW1zID0gZGF0YS5zbGljZSgwLCBtYXhDb3VudCk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfSwgW2RhdGEsIGl0ZW1XaWR0aCwgY29udGFpbmVyV2lkdGgsIG1heENvdW50LCBzaG91bGRSZXNwb25zaXZlXSk7XG4gIHZhciBvbWl0dGVkSXRlbXMgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc2hvdWxkUmVzcG9uc2l2ZSkge1xuICAgICAgcmV0dXJuIGRhdGEuc2xpY2UobWVyZ2VkRGlzcGxheUNvdW50ICsgMSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhLnNsaWNlKG1lcmdlZERhdGEubGVuZ3RoKTtcbiAgfSwgW2RhdGEsIG1lcmdlZERhdGEsIHNob3VsZFJlc3BvbnNpdmUsIG1lcmdlZERpc3BsYXlDb3VudF0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSXRlbSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGdldEtleSA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xuICAgIHZhciBfcmVmO1xuICAgIGlmICh0eXBlb2YgaXRlbUtleSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZW1LZXkoaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiAoX3JlZiA9IGl0ZW1LZXkgJiYgKGl0ZW0gPT09IG51bGwgfHwgaXRlbSA9PT0gdm9pZCAwID8gdm9pZCAwIDogaXRlbVtpdGVtS2V5XSkpICE9PSBudWxsICYmIF9yZWYgIT09IHZvaWQgMCA/IF9yZWYgOiBpbmRleDtcbiAgfSwgW2l0ZW1LZXldKTtcbiAgdmFyIG1lcmdlZFJlbmRlckl0ZW0gPSB1c2VDYWxsYmFjayhyZW5kZXJJdGVtIHx8IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW07XG4gIH0sIFtyZW5kZXJJdGVtXSk7XG4gIGZ1bmN0aW9uIHVwZGF0ZURpc3BsYXlDb3VudChjb3VudCwgc3VmZml4Rml4ZWRTdGFydFZhbCwgbm90UmVhZHkpIHtcbiAgICAvLyBSZWFjdCAxOCB3aWxsIHN5bmMgcmVuZGVyIGV2ZW4gd2hlbiB0aGUgdmFsdWUgaXMgc2FtZSBpbiBzb21lIGNhc2UuXG4gICAgLy8gV2UgdGFrZSBgbWVyZ2VkRGF0YWAgYXMgZGVwcyB3aGljaCBtYXkgY2F1c2UgZGVhZCBsb29wIGlmIGl0J3MgZHluYW1pYyBnZW5lcmF0ZS5cbiAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzM2NTU5XG4gICAgaWYgKGRpc3BsYXlDb3VudCA9PT0gY291bnQgJiYgKHN1ZmZpeEZpeGVkU3RhcnRWYWwgPT09IHVuZGVmaW5lZCB8fCBzdWZmaXhGaXhlZFN0YXJ0VmFsID09PSBzdWZmaXhGaXhlZFN0YXJ0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXREaXNwbGF5Q291bnQoY291bnQpO1xuICAgIGlmICghbm90UmVhZHkpIHtcbiAgICAgIHNldFJlc3RSZWFkeShjb3VudCA8IGRhdGEubGVuZ3RoIC0gMSk7XG4gICAgICBvblZpc2libGVDaGFuZ2UgPT09IG51bGwgfHwgb25WaXNpYmxlQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblZpc2libGVDaGFuZ2UoY291bnQpO1xuICAgIH1cbiAgICBpZiAoc3VmZml4Rml4ZWRTdGFydFZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZXRTdWZmaXhGaXhlZFN0YXJ0KHN1ZmZpeEZpeGVkU3RhcnRWYWwpO1xuICAgIH1cbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2l6ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gb25PdmVyZmxvd1Jlc2l6ZShfLCBlbGVtZW50KSB7XG4gICAgc2V0Q29udGFpbmVyV2lkdGgoZWxlbWVudC5jbGllbnRXaWR0aCk7XG4gIH1cbiAgZnVuY3Rpb24gcmVnaXN0ZXJTaXplKGtleSwgd2lkdGgpIHtcbiAgICBzZXRJdGVtV2lkdGhzKGZ1bmN0aW9uIChvcmlnaW4pIHtcbiAgICAgIHZhciBjbG9uZSA9IG5ldyBNYXAob3JpZ2luKTtcbiAgICAgIGlmICh3aWR0aCA9PT0gbnVsbCkge1xuICAgICAgICBjbG9uZS5kZWxldGUoa2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsb25lLnNldChrZXksIHdpZHRoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiByZWdpc3Rlck92ZXJmbG93U2l6ZShfLCB3aWR0aCkge1xuICAgIHNldFJlc3RXaWR0aCh3aWR0aCk7XG4gICAgc2V0UHJldlJlc3RXaWR0aChyZXN0V2lkdGgpO1xuICB9XG4gIGZ1bmN0aW9uIHJlZ2lzdGVyU3VmZml4U2l6ZShfLCB3aWR0aCkge1xuICAgIHNldFN1ZmZpeFdpZHRoKHdpZHRoKTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gZ2V0SXRlbVdpZHRoKGluZGV4KSB7XG4gICAgcmV0dXJuIGl0ZW1XaWR0aHMuZ2V0KGdldEtleShtZXJnZWREYXRhW2luZGV4XSwgaW5kZXgpKTtcbiAgfVxuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChtZXJnZWRDb250YWluZXJXaWR0aCAmJiB0eXBlb2YgbWVyZ2VkUmVzdFdpZHRoID09PSAnbnVtYmVyJyAmJiBtZXJnZWREYXRhKSB7XG4gICAgICB2YXIgdG90YWxXaWR0aCA9IHN1ZmZpeFdpZHRoO1xuICAgICAgdmFyIGxlbiA9IG1lcmdlZERhdGEubGVuZ3RoO1xuICAgICAgdmFyIGxhc3RJbmRleCA9IGxlbiAtIDE7XG4gICAgICAvLyBXaGVuIGRhdGEgY291bnQgY2hhbmdlIHRvIDAsIHJlc2V0IHRoaXMgc2luY2Ugbm90IGxvb3Agd2lsbCByZWFjaFxuICAgICAgaWYgKCFsZW4pIHtcbiAgICAgICAgdXBkYXRlRGlzcGxheUNvdW50KDAsIG51bGwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIHZhciBjdXJyZW50SXRlbVdpZHRoID0gZ2V0SXRlbVdpZHRoKGkpO1xuICAgICAgICAvLyBGdWxseSB3aWxsIGFsd2F5cyByZW5kZXJcbiAgICAgICAgaWYgKGZ1bGx5U1NSKSB7XG4gICAgICAgICAgY3VycmVudEl0ZW1XaWR0aCA9IGN1cnJlbnRJdGVtV2lkdGggfHwgMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBCcmVhayBzaW5jZSBkYXRhIG5vdCByZWFkeVxuICAgICAgICBpZiAoY3VycmVudEl0ZW1XaWR0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdXBkYXRlRGlzcGxheUNvdW50KGkgLSAxLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpbmQgYmVzdCBtYXRjaFxuICAgICAgICB0b3RhbFdpZHRoICs9IGN1cnJlbnRJdGVtV2lkdGg7XG4gICAgICAgIGlmIChcbiAgICAgICAgLy8gT25seSBvbmUgbWVhbnMgYHRvdGFsV2lkdGhgIGlzIHRoZSBmaW5hbCB3aWR0aFxuICAgICAgICBsYXN0SW5kZXggPT09IDAgJiYgdG90YWxXaWR0aCA8PSBtZXJnZWRDb250YWluZXJXaWR0aCB8fFxuICAgICAgICAvLyBMYXN0IHR3byB3aWR0aCB3aWxsIGJlIHRoZSBmaW5hbCB3aWR0aFxuICAgICAgICBpID09PSBsYXN0SW5kZXggLSAxICYmIHRvdGFsV2lkdGggKyBnZXRJdGVtV2lkdGgobGFzdEluZGV4KSA8PSBtZXJnZWRDb250YWluZXJXaWR0aCkge1xuICAgICAgICAgIC8vIEFkZGl0aW9uYWwgY2hlY2sgaWYgbWF0Y2ggdGhlIGVuZFxuICAgICAgICAgIHVwZGF0ZURpc3BsYXlDb3VudChsYXN0SW5kZXgsIG51bGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKHRvdGFsV2lkdGggKyBtZXJnZWRSZXN0V2lkdGggPiBtZXJnZWRDb250YWluZXJXaWR0aCkge1xuICAgICAgICAgIC8vIENhbiBub3QgaG9sZCBhbGwgdGhlIGNvbnRlbnQgdG8gc2hvdyByZXN0XG4gICAgICAgICAgdXBkYXRlRGlzcGxheUNvdW50KGkgLSAxLCB0b3RhbFdpZHRoIC0gY3VycmVudEl0ZW1XaWR0aCAtIHN1ZmZpeFdpZHRoICsgcmVzdFdpZHRoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN1ZmZpeCAmJiBnZXRJdGVtV2lkdGgoMCkgKyBzdWZmaXhXaWR0aCA+IG1lcmdlZENvbnRhaW5lcldpZHRoKSB7XG4gICAgICAgIHNldFN1ZmZpeEZpeGVkU3RhcnQobnVsbCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbbWVyZ2VkQ29udGFpbmVyV2lkdGgsIGl0ZW1XaWR0aHMsIHJlc3RXaWR0aCwgc3VmZml4V2lkdGgsIGdldEtleSwgbWVyZ2VkRGF0YV0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGRpc3BsYXlSZXN0ID0gcmVzdFJlYWR5ICYmICEhb21pdHRlZEl0ZW1zLmxlbmd0aDtcbiAgdmFyIHN1ZmZpeFN0eWxlID0ge307XG4gIGlmIChzdWZmaXhGaXhlZFN0YXJ0ICE9PSBudWxsICYmIHNob3VsZFJlc3BvbnNpdmUpIHtcbiAgICBzdWZmaXhTdHlsZSA9IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogc3VmZml4Rml4ZWRTdGFydCxcbiAgICAgIHRvcDogMFxuICAgIH07XG4gIH1cbiAgdmFyIGl0ZW1TaGFyZWRQcm9wcyA9IHtcbiAgICBwcmVmaXhDbHM6IGl0ZW1QcmVmaXhDbHMsXG4gICAgcmVzcG9uc2l2ZTogc2hvdWxkUmVzcG9uc2l2ZSxcbiAgICBjb21wb25lbnQ6IGl0ZW1Db21wb25lbnQsXG4gICAgaW52YWxpZGF0ZTogaW52YWxpZGF0ZVxuICB9O1xuICAvLyA+Pj4+PiBDaG9pY2UgcmVuZGVyIGZ1biBieSBgcmVuZGVyUmF3SXRlbWBcbiAgdmFyIGludGVybmFsUmVuZGVySXRlbU5vZGUgPSByZW5kZXJSYXdJdGVtID8gZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XG4gICAgdmFyIGtleSA9IGdldEtleShpdGVtLCBpbmRleCk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE92ZXJmbG93Q29udGV4dC5Qcm92aWRlciwge1xuICAgICAga2V5OiBrZXksXG4gICAgICB2YWx1ZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpdGVtU2hhcmVkUHJvcHMpLCB7fSwge1xuICAgICAgICBvcmRlcjogaW5kZXgsXG4gICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgIGl0ZW1LZXk6IGtleSxcbiAgICAgICAgcmVnaXN0ZXJTaXplOiByZWdpc3RlclNpemUsXG4gICAgICAgIGRpc3BsYXk6IGluZGV4IDw9IG1lcmdlZERpc3BsYXlDb3VudFxuICAgICAgfSlcbiAgICB9LCByZW5kZXJSYXdJdGVtKGl0ZW0sIGluZGV4KSk7XG4gIH0gOiBmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICB2YXIga2V5ID0gZ2V0S2V5KGl0ZW0sIGluZGV4KTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSXRlbSwgX2V4dGVuZHMoe30sIGl0ZW1TaGFyZWRQcm9wcywge1xuICAgICAgb3JkZXI6IGluZGV4LFxuICAgICAga2V5OiBrZXksXG4gICAgICBpdGVtOiBpdGVtLFxuICAgICAgcmVuZGVySXRlbTogbWVyZ2VkUmVuZGVySXRlbSxcbiAgICAgIGl0ZW1LZXk6IGtleSxcbiAgICAgIHJlZ2lzdGVyU2l6ZTogcmVnaXN0ZXJTaXplLFxuICAgICAgZGlzcGxheTogaW5kZXggPD0gbWVyZ2VkRGlzcGxheUNvdW50XG4gICAgfSkpO1xuICB9O1xuICAvLyA+Pj4+PiBSZXN0IG5vZGVcbiAgdmFyIHJlc3ROb2RlO1xuICB2YXIgcmVzdENvbnRleHRQcm9wcyA9IHtcbiAgICBvcmRlcjogZGlzcGxheVJlc3QgPyBtZXJnZWREaXNwbGF5Q291bnQgOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KGl0ZW1QcmVmaXhDbHMsIFwiLXJlc3RcIiksXG4gICAgcmVnaXN0ZXJTaXplOiByZWdpc3Rlck92ZXJmbG93U2l6ZSxcbiAgICBkaXNwbGF5OiBkaXNwbGF5UmVzdFxuICB9O1xuICBpZiAoIXJlbmRlclJhd1Jlc3QpIHtcbiAgICB2YXIgbWVyZ2VkUmVuZGVyUmVzdCA9IHJlbmRlclJlc3QgfHwgZGVmYXVsdFJlbmRlclJlc3Q7XG4gICAgcmVzdE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJdGVtLCBfZXh0ZW5kcyh7fSwgaXRlbVNoYXJlZFByb3BzLCByZXN0Q29udGV4dFByb3BzKSwgdHlwZW9mIG1lcmdlZFJlbmRlclJlc3QgPT09ICdmdW5jdGlvbicgPyBtZXJnZWRSZW5kZXJSZXN0KG9taXR0ZWRJdGVtcykgOiBtZXJnZWRSZW5kZXJSZXN0KTtcbiAgfSBlbHNlIGlmIChyZW5kZXJSYXdSZXN0KSB7XG4gICAgcmVzdE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPdmVyZmxvd0NvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGl0ZW1TaGFyZWRQcm9wcyksIHJlc3RDb250ZXh0UHJvcHMpXG4gICAgfSwgcmVuZGVyUmF3UmVzdChvbWl0dGVkSXRlbXMpKTtcbiAgfVxuICB2YXIgb3ZlcmZsb3dOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKCFpbnZhbGlkYXRlICYmIHByZWZpeENscywgY2xhc3NOYW1lKSxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgcmVmOiByZWZcbiAgfSwgcmVzdFByb3BzKSwgbWVyZ2VkRGF0YS5tYXAoaW50ZXJuYWxSZW5kZXJJdGVtTm9kZSksIHNob3dSZXN0ID8gcmVzdE5vZGUgOiBudWxsLCBzdWZmaXggJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSXRlbSwgX2V4dGVuZHMoe30sIGl0ZW1TaGFyZWRQcm9wcywge1xuICAgIHJlc3BvbnNpdmU6IGlzUmVzcG9uc2l2ZSxcbiAgICByZXNwb25zaXZlRGlzYWJsZWQ6ICFzaG91bGRSZXNwb25zaXZlLFxuICAgIG9yZGVyOiBtZXJnZWREaXNwbGF5Q291bnQsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChpdGVtUHJlZml4Q2xzLCBcIi1zdWZmaXhcIiksXG4gICAgcmVnaXN0ZXJTaXplOiByZWdpc3RlclN1ZmZpeFNpemUsXG4gICAgZGlzcGxheTogdHJ1ZSxcbiAgICBzdHlsZTogc3VmZml4U3R5bGVcbiAgfSksIHN1ZmZpeCkpO1xuICBpZiAoaXNSZXNwb25zaXZlKSB7XG4gICAgb3ZlcmZsb3dOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVzaXplT2JzZXJ2ZXIsIHtcbiAgICAgIG9uUmVzaXplOiBvbk92ZXJmbG93UmVzaXplLFxuICAgICAgZGlzYWJsZWQ6ICFzaG91bGRSZXNwb25zaXZlXG4gICAgfSwgb3ZlcmZsb3dOb2RlKTtcbiAgfVxuICByZXR1cm4gb3ZlcmZsb3dOb2RlO1xufVxudmFyIEZvcndhcmRPdmVyZmxvdyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKE92ZXJmbG93KTtcbkZvcndhcmRPdmVyZmxvdy5kaXNwbGF5TmFtZSA9ICdPdmVyZmxvdyc7XG5Gb3J3YXJkT3ZlcmZsb3cuSXRlbSA9IFJhd0l0ZW07XG5Gb3J3YXJkT3ZlcmZsb3cuUkVTUE9OU0lWRSA9IFJFU1BPTlNJVkU7XG5Gb3J3YXJkT3ZlcmZsb3cuSU5WQUxJREFURSA9IElOVkFMSURBVEU7XG4vLyBDb252ZXJ0IHRvIGdlbmVyaWMgdHlwZVxuZXhwb3J0IGRlZmF1bHQgRm9yd2FyZE92ZXJmbG93OyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xudmFyIFRyYW5zQnRuID0gZnVuY3Rpb24gVHJhbnNCdG4oX3JlZikge1xuICB2YXIgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgY3VzdG9taXplSWNvbiA9IF9yZWYuY3VzdG9taXplSWNvbixcbiAgICBjdXN0b21pemVJY29uUHJvcHMgPSBfcmVmLmN1c3RvbWl6ZUljb25Qcm9wcyxcbiAgICBfb25Nb3VzZURvd24gPSBfcmVmLm9uTW91c2VEb3duLFxuICAgIG9uQ2xpY2sgPSBfcmVmLm9uQ2xpY2ssXG4gICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuO1xuICB2YXIgaWNvbjtcbiAgaWYgKHR5cGVvZiBjdXN0b21pemVJY29uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWNvbiA9IGN1c3RvbWl6ZUljb24oY3VzdG9taXplSWNvblByb3BzKTtcbiAgfSBlbHNlIHtcbiAgICBpY29uID0gY3VzdG9taXplSWNvbjtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICBvbk1vdXNlRG93bjogZnVuY3Rpb24gb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoX29uTW91c2VEb3duKSB7XG4gICAgICAgIF9vbk1vdXNlRG93bihldmVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzdHlsZToge1xuICAgICAgdXNlclNlbGVjdDogJ25vbmUnLFxuICAgICAgV2Via2l0VXNlclNlbGVjdDogJ25vbmUnXG4gICAgfSxcbiAgICB1bnNlbGVjdGFibGU6IFwib25cIixcbiAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogdHJ1ZVxuICB9LCBpY29uICE9PSB1bmRlZmluZWQgPyBpY29uIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLnNwbGl0KC9cXHMrLykubWFwKGZ1bmN0aW9uIChjbHMpIHtcbiAgICAgIHJldHVybiBcIlwiLmNvbmNhdChjbHMsIFwiLWljb25cIik7XG4gICAgfSkpXG4gIH0sIGNoaWxkcmVuKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgVHJhbnNCdG47IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgY29tcG9zZVJlZiB9IGZyb20gXCJyYy11dGlsL2VzL3JlZlwiO1xuaW1wb3J0IHsgd2FybmluZyB9IGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbnZhciBJbnB1dCA9IGZ1bmN0aW9uIElucHV0KF9yZWYsIHJlZikge1xuICB2YXIgX2lucHV0Tm9kZTIsIF9pbnB1dE5vZGUyJHByb3BzO1xuICB2YXIgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgaWQgPSBfcmVmLmlkLFxuICAgIGlucHV0RWxlbWVudCA9IF9yZWYuaW5wdXRFbGVtZW50LFxuICAgIGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZCxcbiAgICB0YWJJbmRleCA9IF9yZWYudGFiSW5kZXgsXG4gICAgYXV0b0ZvY3VzID0gX3JlZi5hdXRvRm9jdXMsXG4gICAgYXV0b0NvbXBsZXRlID0gX3JlZi5hdXRvQ29tcGxldGUsXG4gICAgZWRpdGFibGUgPSBfcmVmLmVkaXRhYmxlLFxuICAgIGFjdGl2ZURlc2NlbmRhbnRJZCA9IF9yZWYuYWN0aXZlRGVzY2VuZGFudElkLFxuICAgIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICBtYXhMZW5ndGggPSBfcmVmLm1heExlbmd0aCxcbiAgICBfb25LZXlEb3duID0gX3JlZi5vbktleURvd24sXG4gICAgX29uTW91c2VEb3duID0gX3JlZi5vbk1vdXNlRG93bixcbiAgICBfb25DaGFuZ2UgPSBfcmVmLm9uQ2hhbmdlLFxuICAgIG9uUGFzdGUgPSBfcmVmLm9uUGFzdGUsXG4gICAgX29uQ29tcG9zaXRpb25TdGFydCA9IF9yZWYub25Db21wb3NpdGlvblN0YXJ0LFxuICAgIF9vbkNvbXBvc2l0aW9uRW5kID0gX3JlZi5vbkNvbXBvc2l0aW9uRW5kLFxuICAgIG9wZW4gPSBfcmVmLm9wZW4sXG4gICAgYXR0cnMgPSBfcmVmLmF0dHJzO1xuICB2YXIgaW5wdXROb2RlID0gaW5wdXRFbGVtZW50IHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgbnVsbCk7XG4gIHZhciBfaW5wdXROb2RlID0gaW5wdXROb2RlLFxuICAgIG9yaWdpblJlZiA9IF9pbnB1dE5vZGUucmVmLFxuICAgIG9yaWdpblByb3BzID0gX2lucHV0Tm9kZS5wcm9wcztcbiAgdmFyIG9uT3JpZ2luS2V5RG93biA9IG9yaWdpblByb3BzLm9uS2V5RG93bixcbiAgICBvbk9yaWdpbkNoYW5nZSA9IG9yaWdpblByb3BzLm9uQ2hhbmdlLFxuICAgIG9uT3JpZ2luTW91c2VEb3duID0gb3JpZ2luUHJvcHMub25Nb3VzZURvd24sXG4gICAgb25PcmlnaW5Db21wb3NpdGlvblN0YXJ0ID0gb3JpZ2luUHJvcHMub25Db21wb3NpdGlvblN0YXJ0LFxuICAgIG9uT3JpZ2luQ29tcG9zaXRpb25FbmQgPSBvcmlnaW5Qcm9wcy5vbkNvbXBvc2l0aW9uRW5kLFxuICAgIHN0eWxlID0gb3JpZ2luUHJvcHMuc3R5bGU7XG4gIHdhcm5pbmcoISgnbWF4TGVuZ3RoJyBpbiBpbnB1dE5vZGUucHJvcHMpLCBcIlBhc3NpbmcgJ21heExlbmd0aCcgdG8gaW5wdXQgZWxlbWVudCBkaXJlY3RseSBtYXkgbm90IHdvcmsgYmVjYXVzZSBpbnB1dCBpbiBCYXNlU2VsZWN0IGlzIGNvbnRyb2xsZWQuXCIpO1xuICBpbnB1dE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGlucHV0Tm9kZSwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe1xuICAgIHR5cGU6ICdzZWFyY2gnXG4gIH0sIG9yaWdpblByb3BzKSwge30sIHtcbiAgICAvLyBPdmVycmlkZSBvdmVyIG9yaWdpbiBwcm9wc1xuICAgIGlkOiBpZCxcbiAgICByZWY6IGNvbXBvc2VSZWYocmVmLCBvcmlnaW5SZWYpLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICB0YWJJbmRleDogdGFiSW5kZXgsXG4gICAgYXV0b0NvbXBsZXRlOiBhdXRvQ29tcGxldGUgfHwgJ29mZicsXG4gICAgYXV0b0ZvY3VzOiBhdXRvRm9jdXMsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2VsZWN0aW9uLXNlYXJjaC1pbnB1dFwiKSwgKF9pbnB1dE5vZGUyID0gaW5wdXROb2RlKSA9PT0gbnVsbCB8fCBfaW5wdXROb2RlMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9pbnB1dE5vZGUyJHByb3BzID0gX2lucHV0Tm9kZTIucHJvcHMpID09PSBudWxsIHx8IF9pbnB1dE5vZGUyJHByb3BzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfaW5wdXROb2RlMiRwcm9wcy5jbGFzc05hbWUpLFxuICAgIHJvbGU6ICdjb21ib2JveCcsXG4gICAgJ2FyaWEtZXhwYW5kZWQnOiBvcGVuLFxuICAgICdhcmlhLWhhc3BvcHVwJzogJ2xpc3Rib3gnLFxuICAgICdhcmlhLW93bnMnOiBcIlwiLmNvbmNhdChpZCwgXCJfbGlzdFwiKSxcbiAgICAnYXJpYS1hdXRvY29tcGxldGUnOiAnbGlzdCcsXG4gICAgJ2FyaWEtY29udHJvbHMnOiBcIlwiLmNvbmNhdChpZCwgXCJfbGlzdFwiKSxcbiAgICAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JzogYWN0aXZlRGVzY2VuZGFudElkXG4gIH0sIGF0dHJzKSwge30sIHtcbiAgICB2YWx1ZTogZWRpdGFibGUgPyB2YWx1ZSA6ICcnLFxuICAgIG1heExlbmd0aDogbWF4TGVuZ3RoLFxuICAgIHJlYWRPbmx5OiAhZWRpdGFibGUsXG4gICAgdW5zZWxlY3RhYmxlOiAhZWRpdGFibGUgPyAnb24nIDogbnVsbCxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICBvcGFjaXR5OiBlZGl0YWJsZSA/IG51bGwgOiAwXG4gICAgfSksXG4gICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIF9vbktleURvd24oZXZlbnQpO1xuICAgICAgaWYgKG9uT3JpZ2luS2V5RG93bikge1xuICAgICAgICBvbk9yaWdpbktleURvd24oZXZlbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25Nb3VzZURvd246IGZ1bmN0aW9uIG9uTW91c2VEb3duKGV2ZW50KSB7XG4gICAgICBfb25Nb3VzZURvd24oZXZlbnQpO1xuICAgICAgaWYgKG9uT3JpZ2luTW91c2VEb3duKSB7XG4gICAgICAgIG9uT3JpZ2luTW91c2VEb3duKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShldmVudCkge1xuICAgICAgX29uQ2hhbmdlKGV2ZW50KTtcbiAgICAgIGlmIChvbk9yaWdpbkNoYW5nZSkge1xuICAgICAgICBvbk9yaWdpbkNoYW5nZShldmVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkNvbXBvc2l0aW9uU3RhcnQ6IGZ1bmN0aW9uIG9uQ29tcG9zaXRpb25TdGFydChldmVudCkge1xuICAgICAgX29uQ29tcG9zaXRpb25TdGFydChldmVudCk7XG4gICAgICBpZiAob25PcmlnaW5Db21wb3NpdGlvblN0YXJ0KSB7XG4gICAgICAgIG9uT3JpZ2luQ29tcG9zaXRpb25TdGFydChldmVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkNvbXBvc2l0aW9uRW5kOiBmdW5jdGlvbiBvbkNvbXBvc2l0aW9uRW5kKGV2ZW50KSB7XG4gICAgICBfb25Db21wb3NpdGlvbkVuZChldmVudCk7XG4gICAgICBpZiAob25PcmlnaW5Db21wb3NpdGlvbkVuZCkge1xuICAgICAgICBvbk9yaWdpbkNvbXBvc2l0aW9uRW5kKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uUGFzdGU6IG9uUGFzdGVcbiAgfSkpO1xuICByZXR1cm4gaW5wdXROb2RlO1xufTtcbnZhciBSZWZJbnB1dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKElucHV0KTtcblJlZklucHV0LmRpc3BsYXlOYW1lID0gJ0lucHV0JztcbmV4cG9ydCBkZWZhdWx0IFJlZklucHV0OyIsImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmV4cG9ydCBmdW5jdGlvbiB0b0FycmF5KHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IFt2YWx1ZV0gOiBbXTtcbn1cbmV4cG9ydCB2YXIgaXNDbGllbnQgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuZG9jdW1lbnQgJiYgd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuLyoqIElzIGNsaWVudCBzaWRlIGFuZCBub3QganNkb20gKi9cbmV4cG9ydCB2YXIgaXNCcm93c2VyQ2xpZW50ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICd0ZXN0JyAmJiBpc0NsaWVudDtcbmV4cG9ydCBmdW5jdGlvbiBoYXNWYWx1ZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cbmZ1bmN0aW9uIGlzVGl0bGVUeXBlKHRpdGxlKSB7XG4gIHJldHVybiBbJ3N0cmluZycsICdudW1iZXInXS5pbmNsdWRlcyhfdHlwZW9mKHRpdGxlKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VGl0bGUoaXRlbSkge1xuICB2YXIgdGl0bGUgPSB1bmRlZmluZWQ7XG4gIGlmIChpdGVtKSB7XG4gICAgaWYgKGlzVGl0bGVUeXBlKGl0ZW0udGl0bGUpKSB7XG4gICAgICB0aXRsZSA9IGl0ZW0udGl0bGUudG9TdHJpbmcoKTtcbiAgICB9IGVsc2UgaWYgKGlzVGl0bGVUeXBlKGl0ZW0ubGFiZWwpKSB7XG4gICAgICB0aXRsZSA9IGl0ZW0ubGFiZWwudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRpdGxlO1xufSIsIi8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWhvb2tzL3J1bGVzLW9mLWhvb2tzICovXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpc0Jyb3dzZXJDbGllbnQgfSBmcm9tIFwiLi4vdXRpbHMvY29tbW9uVXRpbFwiO1xuXG4vKipcbiAqIFdyYXAgYFJlYWN0LnVzZUxheW91dEVmZmVjdGAgd2hpY2ggd2lsbCBub3QgdGhyb3cgd2FybmluZyBtZXNzYWdlIGluIHRlc3QgZW52XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUxheW91dEVmZmVjdChlZmZlY3QsIGRlcHMpIHtcbiAgLy8gTmV2ZXIgaGFwcGVuIGluIHRlc3QgZW52XG4gIGlmIChpc0Jyb3dzZXJDbGllbnQpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIFJlYWN0LnVzZUxheW91dEVmZmVjdChlZmZlY3QsIGRlcHMpO1xuICB9IGVsc2Uge1xuICAgIFJlYWN0LnVzZUVmZmVjdChlZmZlY3QsIGRlcHMpO1xuICB9XG59XG4vKiBlc2xpbnQtZW5hYmxlICovIiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBwaWNrQXR0cnMgZnJvbSBcInJjLXV0aWwvZXMvcGlja0F0dHJzXCI7XG5pbXBvcnQgT3ZlcmZsb3cgZnJvbSAncmMtb3ZlcmZsb3cnO1xuaW1wb3J0IFRyYW5zQnRuIGZyb20gXCIuLi9UcmFuc0J0blwiO1xuaW1wb3J0IElucHV0IGZyb20gXCIuL0lucHV0XCI7XG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCIuLi9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCB7IGdldFRpdGxlIH0gZnJvbSBcIi4uL3V0aWxzL2NvbW1vblV0aWxcIjtcbmZ1bmN0aW9uIGl0ZW1LZXkodmFsdWUpIHtcbiAgdmFyIF92YWx1ZSRrZXk7XG4gIHJldHVybiAoX3ZhbHVlJGtleSA9IHZhbHVlLmtleSkgIT09IG51bGwgJiYgX3ZhbHVlJGtleSAhPT0gdm9pZCAwID8gX3ZhbHVlJGtleSA6IHZhbHVlLnZhbHVlO1xufVxudmFyIG9uUHJldmVudE1vdXNlRG93biA9IGZ1bmN0aW9uIG9uUHJldmVudE1vdXNlRG93bihldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbn07XG52YXIgU2VsZWN0U2VsZWN0b3IgPSBmdW5jdGlvbiBTZWxlY3RTZWxlY3Rvcihwcm9wcykge1xuICB2YXIgaWQgPSBwcm9wcy5pZCxcbiAgICBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgdmFsdWVzID0gcHJvcHMudmFsdWVzLFxuICAgIG9wZW4gPSBwcm9wcy5vcGVuLFxuICAgIHNlYXJjaFZhbHVlID0gcHJvcHMuc2VhcmNoVmFsdWUsXG4gICAgYXV0b0NsZWFyU2VhcmNoVmFsdWUgPSBwcm9wcy5hdXRvQ2xlYXJTZWFyY2hWYWx1ZSxcbiAgICBpbnB1dFJlZiA9IHByb3BzLmlucHV0UmVmLFxuICAgIHBsYWNlaG9sZGVyID0gcHJvcHMucGxhY2Vob2xkZXIsXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBtb2RlID0gcHJvcHMubW9kZSxcbiAgICBzaG93U2VhcmNoID0gcHJvcHMuc2hvd1NlYXJjaCxcbiAgICBhdXRvRm9jdXMgPSBwcm9wcy5hdXRvRm9jdXMsXG4gICAgYXV0b0NvbXBsZXRlID0gcHJvcHMuYXV0b0NvbXBsZXRlLFxuICAgIGFjdGl2ZURlc2NlbmRhbnRJZCA9IHByb3BzLmFjdGl2ZURlc2NlbmRhbnRJZCxcbiAgICB0YWJJbmRleCA9IHByb3BzLnRhYkluZGV4LFxuICAgIHJlbW92ZUljb24gPSBwcm9wcy5yZW1vdmVJY29uLFxuICAgIG1heFRhZ0NvdW50ID0gcHJvcHMubWF4VGFnQ291bnQsXG4gICAgbWF4VGFnVGV4dExlbmd0aCA9IHByb3BzLm1heFRhZ1RleHRMZW5ndGgsXG4gICAgX3Byb3BzJG1heFRhZ1BsYWNlaG9sID0gcHJvcHMubWF4VGFnUGxhY2Vob2xkZXIsXG4gICAgbWF4VGFnUGxhY2Vob2xkZXIgPSBfcHJvcHMkbWF4VGFnUGxhY2Vob2wgPT09IHZvaWQgMCA/IGZ1bmN0aW9uIChvbWl0dGVkVmFsdWVzKSB7XG4gICAgICByZXR1cm4gXCIrIFwiLmNvbmNhdChvbWl0dGVkVmFsdWVzLmxlbmd0aCwgXCIgLi4uXCIpO1xuICAgIH0gOiBfcHJvcHMkbWF4VGFnUGxhY2Vob2wsXG4gICAgdGFnUmVuZGVyID0gcHJvcHMudGFnUmVuZGVyLFxuICAgIG9uVG9nZ2xlT3BlbiA9IHByb3BzLm9uVG9nZ2xlT3BlbixcbiAgICBvblJlbW92ZSA9IHByb3BzLm9uUmVtb3ZlLFxuICAgIG9uSW5wdXRDaGFuZ2UgPSBwcm9wcy5vbklucHV0Q2hhbmdlLFxuICAgIG9uSW5wdXRQYXN0ZSA9IHByb3BzLm9uSW5wdXRQYXN0ZSxcbiAgICBvbklucHV0S2V5RG93biA9IHByb3BzLm9uSW5wdXRLZXlEb3duLFxuICAgIG9uSW5wdXRNb3VzZURvd24gPSBwcm9wcy5vbklucHV0TW91c2VEb3duLFxuICAgIG9uSW5wdXRDb21wb3NpdGlvblN0YXJ0ID0gcHJvcHMub25JbnB1dENvbXBvc2l0aW9uU3RhcnQsXG4gICAgb25JbnB1dENvbXBvc2l0aW9uRW5kID0gcHJvcHMub25JbnB1dENvbXBvc2l0aW9uRW5kO1xuICB2YXIgbWVhc3VyZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKDApLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGlucHV0V2lkdGggPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldElucHV0V2lkdGggPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgX3VzZVN0YXRlMyA9IHVzZVN0YXRlKGZhbHNlKSxcbiAgICBfdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlMywgMiksXG4gICAgZm9jdXNlZCA9IF91c2VTdGF0ZTRbMF0sXG4gICAgc2V0Rm9jdXNlZCA9IF91c2VTdGF0ZTRbMV07XG4gIHZhciBzZWxlY3Rpb25QcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNlbGVjdGlvblwiKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gU2VhcmNoID09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGlucHV0VmFsdWUgPSBvcGVuIHx8IG1vZGUgPT09IFwibXVsdGlwbGVcIiAmJiBhdXRvQ2xlYXJTZWFyY2hWYWx1ZSA9PT0gZmFsc2UgfHwgbW9kZSA9PT0gJ3RhZ3MnID8gc2VhcmNoVmFsdWUgOiAnJztcbiAgdmFyIGlucHV0RWRpdGFibGUgPSBtb2RlID09PSAndGFncycgfHwgbW9kZSA9PT0gXCJtdWx0aXBsZVwiICYmIGF1dG9DbGVhclNlYXJjaFZhbHVlID09PSBmYWxzZSB8fCBzaG93U2VhcmNoICYmIChvcGVuIHx8IGZvY3VzZWQpO1xuXG4gIC8vIFdlIG1lYXN1cmUgd2lkdGggYW5kIHNldCB0byB0aGUgaW5wdXQgaW1tZWRpYXRlbHlcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRJbnB1dFdpZHRoKG1lYXN1cmVSZWYuY3VycmVudC5zY3JvbGxXaWR0aCk7XG4gIH0sIFtpbnB1dFZhbHVlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID4+PiBSZW5kZXIgU2VsZWN0b3IgTm9kZS4gSW5jbHVkZXMgSXRlbSAmIFJlc3RcbiAgZnVuY3Rpb24gZGVmYXVsdFJlbmRlclNlbGVjdG9yKGl0ZW0sIGNvbnRlbnQsIGl0ZW1EaXNhYmxlZCwgY2xvc2FibGUsIG9uQ2xvc2UpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChzZWxlY3Rpb25QcmVmaXhDbHMsIFwiLWl0ZW1cIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQoc2VsZWN0aW9uUHJlZml4Q2xzLCBcIi1pdGVtLWRpc2FibGVkXCIpLCBpdGVtRGlzYWJsZWQpKSxcbiAgICAgIHRpdGxlOiBnZXRUaXRsZShpdGVtKVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHNlbGVjdGlvblByZWZpeENscywgXCItaXRlbS1jb250ZW50XCIpXG4gICAgfSwgY29udGVudCksIGNsb3NhYmxlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyYW5zQnRuLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHNlbGVjdGlvblByZWZpeENscywgXCItaXRlbS1yZW1vdmVcIiksXG4gICAgICBvbk1vdXNlRG93bjogb25QcmV2ZW50TW91c2VEb3duLFxuICAgICAgb25DbGljazogb25DbG9zZSxcbiAgICAgIGN1c3RvbWl6ZUljb246IHJlbW92ZUljb25cbiAgICB9LCBcIlxceEQ3XCIpKTtcbiAgfVxuICBmdW5jdGlvbiBjdXN0b21pemVSZW5kZXJTZWxlY3Rvcih2YWx1ZSwgY29udGVudCwgaXRlbURpc2FibGVkLCBjbG9zYWJsZSwgb25DbG9zZSkge1xuICAgIHZhciBvbk1vdXNlRG93biA9IGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgIG9uUHJldmVudE1vdXNlRG93bihlKTtcbiAgICAgIG9uVG9nZ2xlT3Blbighb3Blbik7XG4gICAgfTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIG9uTW91c2VEb3duOiBvbk1vdXNlRG93blxuICAgIH0sIHRhZ1JlbmRlcih7XG4gICAgICBsYWJlbDogY29udGVudCxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGRpc2FibGVkOiBpdGVtRGlzYWJsZWQsXG4gICAgICBjbG9zYWJsZTogY2xvc2FibGUsXG4gICAgICBvbkNsb3NlOiBvbkNsb3NlXG4gICAgfSkpO1xuICB9XG4gIGZ1bmN0aW9uIHJlbmRlckl0ZW0odmFsdWVJdGVtKSB7XG4gICAgdmFyIGl0ZW1EaXNhYmxlZCA9IHZhbHVlSXRlbS5kaXNhYmxlZCxcbiAgICAgIGxhYmVsID0gdmFsdWVJdGVtLmxhYmVsLFxuICAgICAgdmFsdWUgPSB2YWx1ZUl0ZW0udmFsdWU7XG4gICAgdmFyIGNsb3NhYmxlID0gIWRpc2FibGVkICYmICFpdGVtRGlzYWJsZWQ7XG4gICAgdmFyIGRpc3BsYXlMYWJlbCA9IGxhYmVsO1xuICAgIGlmICh0eXBlb2YgbWF4VGFnVGV4dExlbmd0aCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmICh0eXBlb2YgbGFiZWwgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBsYWJlbCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdmFyIHN0ckxhYmVsID0gU3RyaW5nKGRpc3BsYXlMYWJlbCk7XG4gICAgICAgIGlmIChzdHJMYWJlbC5sZW5ndGggPiBtYXhUYWdUZXh0TGVuZ3RoKSB7XG4gICAgICAgICAgZGlzcGxheUxhYmVsID0gXCJcIi5jb25jYXQoc3RyTGFiZWwuc2xpY2UoMCwgbWF4VGFnVGV4dExlbmd0aCksIFwiLi4uXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBvbkNsb3NlID0gZnVuY3Rpb24gb25DbG9zZShldmVudCkge1xuICAgICAgaWYgKGV2ZW50KSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIG9uUmVtb3ZlKHZhbHVlSXRlbSk7XG4gICAgfTtcbiAgICByZXR1cm4gdHlwZW9mIHRhZ1JlbmRlciA9PT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZVJlbmRlclNlbGVjdG9yKHZhbHVlLCBkaXNwbGF5TGFiZWwsIGl0ZW1EaXNhYmxlZCwgY2xvc2FibGUsIG9uQ2xvc2UpIDogZGVmYXVsdFJlbmRlclNlbGVjdG9yKHZhbHVlSXRlbSwgZGlzcGxheUxhYmVsLCBpdGVtRGlzYWJsZWQsIGNsb3NhYmxlLCBvbkNsb3NlKTtcbiAgfVxuICBmdW5jdGlvbiByZW5kZXJSZXN0KG9taXR0ZWRWYWx1ZXMpIHtcbiAgICB2YXIgY29udGVudCA9IHR5cGVvZiBtYXhUYWdQbGFjZWhvbGRlciA9PT0gJ2Z1bmN0aW9uJyA/IG1heFRhZ1BsYWNlaG9sZGVyKG9taXR0ZWRWYWx1ZXMpIDogbWF4VGFnUGxhY2Vob2xkZXI7XG4gICAgcmV0dXJuIGRlZmF1bHRSZW5kZXJTZWxlY3Rvcih7XG4gICAgICB0aXRsZTogY29udGVudFxuICAgIH0sIGNvbnRlbnQsIGZhbHNlKTtcbiAgfVxuXG4gIC8vID4+PiBJbnB1dCBOb2RlXG4gIHZhciBpbnB1dE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChzZWxlY3Rpb25QcmVmaXhDbHMsIFwiLXNlYXJjaFwiKSxcbiAgICBzdHlsZToge1xuICAgICAgd2lkdGg6IGlucHV0V2lkdGhcbiAgICB9LFxuICAgIG9uRm9jdXM6IGZ1bmN0aW9uIG9uRm9jdXMoKSB7XG4gICAgICBzZXRGb2N1c2VkKHRydWUpO1xuICAgIH0sXG4gICAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoKSB7XG4gICAgICBzZXRGb2N1c2VkKGZhbHNlKTtcbiAgICB9XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KElucHV0LCB7XG4gICAgcmVmOiBpbnB1dFJlZixcbiAgICBvcGVuOiBvcGVuLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGlkOiBpZCxcbiAgICBpbnB1dEVsZW1lbnQ6IG51bGwsXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIGF1dG9Gb2N1czogYXV0b0ZvY3VzLFxuICAgIGF1dG9Db21wbGV0ZTogYXV0b0NvbXBsZXRlLFxuICAgIGVkaXRhYmxlOiBpbnB1dEVkaXRhYmxlLFxuICAgIGFjdGl2ZURlc2NlbmRhbnRJZDogYWN0aXZlRGVzY2VuZGFudElkLFxuICAgIHZhbHVlOiBpbnB1dFZhbHVlLFxuICAgIG9uS2V5RG93bjogb25JbnB1dEtleURvd24sXG4gICAgb25Nb3VzZURvd246IG9uSW5wdXRNb3VzZURvd24sXG4gICAgb25DaGFuZ2U6IG9uSW5wdXRDaGFuZ2UsXG4gICAgb25QYXN0ZTogb25JbnB1dFBhc3RlLFxuICAgIG9uQ29tcG9zaXRpb25TdGFydDogb25JbnB1dENvbXBvc2l0aW9uU3RhcnQsXG4gICAgb25Db21wb3NpdGlvbkVuZDogb25JbnB1dENvbXBvc2l0aW9uRW5kLFxuICAgIHRhYkluZGV4OiB0YWJJbmRleCxcbiAgICBhdHRyczogcGlja0F0dHJzKHByb3BzLCB0cnVlKVxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICByZWY6IG1lYXN1cmVSZWYsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChzZWxlY3Rpb25QcmVmaXhDbHMsIFwiLXNlYXJjaC1taXJyb3JcIiksXG4gICAgXCJhcmlhLWhpZGRlblwiOiB0cnVlXG4gIH0sIGlucHV0VmFsdWUsIFwiXFx4QTBcIikpO1xuXG4gIC8vID4+PiBTZWxlY3Rpb25zXG4gIHZhciBzZWxlY3Rpb25Ob2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoT3ZlcmZsb3csIHtcbiAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KHNlbGVjdGlvblByZWZpeENscywgXCItb3ZlcmZsb3dcIiksXG4gICAgZGF0YTogdmFsdWVzLFxuICAgIHJlbmRlckl0ZW06IHJlbmRlckl0ZW0sXG4gICAgcmVuZGVyUmVzdDogcmVuZGVyUmVzdCxcbiAgICBzdWZmaXg6IGlucHV0Tm9kZSxcbiAgICBpdGVtS2V5OiBpdGVtS2V5LFxuICAgIG1heENvdW50OiBtYXhUYWdDb3VudFxuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBzZWxlY3Rpb25Ob2RlLCAhdmFsdWVzLmxlbmd0aCAmJiAhaW5wdXRWYWx1ZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoc2VsZWN0aW9uUHJlZml4Q2xzLCBcIi1wbGFjZWhvbGRlclwiKVxuICB9LCBwbGFjZWhvbGRlcikpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFNlbGVjdFNlbGVjdG9yOyIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHBpY2tBdHRycyBmcm9tIFwicmMtdXRpbC9lcy9waWNrQXR0cnNcIjtcbmltcG9ydCBJbnB1dCBmcm9tIFwiLi9JbnB1dFwiO1xuaW1wb3J0IHsgZ2V0VGl0bGUgfSBmcm9tIFwiLi4vdXRpbHMvY29tbW9uVXRpbFwiO1xudmFyIFNpbmdsZVNlbGVjdG9yID0gZnVuY3Rpb24gU2luZ2xlU2VsZWN0b3IocHJvcHMpIHtcbiAgdmFyIGlucHV0RWxlbWVudCA9IHByb3BzLmlucHV0RWxlbWVudCxcbiAgICBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgaWQgPSBwcm9wcy5pZCxcbiAgICBpbnB1dFJlZiA9IHByb3BzLmlucHV0UmVmLFxuICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgYXV0b0ZvY3VzID0gcHJvcHMuYXV0b0ZvY3VzLFxuICAgIGF1dG9Db21wbGV0ZSA9IHByb3BzLmF1dG9Db21wbGV0ZSxcbiAgICBhY3RpdmVEZXNjZW5kYW50SWQgPSBwcm9wcy5hY3RpdmVEZXNjZW5kYW50SWQsXG4gICAgbW9kZSA9IHByb3BzLm1vZGUsXG4gICAgb3BlbiA9IHByb3BzLm9wZW4sXG4gICAgdmFsdWVzID0gcHJvcHMudmFsdWVzLFxuICAgIHBsYWNlaG9sZGVyID0gcHJvcHMucGxhY2Vob2xkZXIsXG4gICAgdGFiSW5kZXggPSBwcm9wcy50YWJJbmRleCxcbiAgICBzaG93U2VhcmNoID0gcHJvcHMuc2hvd1NlYXJjaCxcbiAgICBzZWFyY2hWYWx1ZSA9IHByb3BzLnNlYXJjaFZhbHVlLFxuICAgIGFjdGl2ZVZhbHVlID0gcHJvcHMuYWN0aXZlVmFsdWUsXG4gICAgbWF4TGVuZ3RoID0gcHJvcHMubWF4TGVuZ3RoLFxuICAgIG9uSW5wdXRLZXlEb3duID0gcHJvcHMub25JbnB1dEtleURvd24sXG4gICAgb25JbnB1dE1vdXNlRG93biA9IHByb3BzLm9uSW5wdXRNb3VzZURvd24sXG4gICAgb25JbnB1dENoYW5nZSA9IHByb3BzLm9uSW5wdXRDaGFuZ2UsXG4gICAgb25JbnB1dFBhc3RlID0gcHJvcHMub25JbnB1dFBhc3RlLFxuICAgIG9uSW5wdXRDb21wb3NpdGlvblN0YXJ0ID0gcHJvcHMub25JbnB1dENvbXBvc2l0aW9uU3RhcnQsXG4gICAgb25JbnB1dENvbXBvc2l0aW9uRW5kID0gcHJvcHMub25JbnB1dENvbXBvc2l0aW9uRW5kO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIGlucHV0Q2hhbmdlZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0SW5wdXRDaGFuZ2VkID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIGNvbWJvYm94ID0gbW9kZSA9PT0gJ2NvbWJvYm94JztcbiAgdmFyIGlucHV0RWRpdGFibGUgPSBjb21ib2JveCB8fCBzaG93U2VhcmNoO1xuICB2YXIgaXRlbSA9IHZhbHVlc1swXTtcbiAgdmFyIGlucHV0VmFsdWUgPSBzZWFyY2hWYWx1ZSB8fCAnJztcbiAgaWYgKGNvbWJvYm94ICYmIGFjdGl2ZVZhbHVlICYmICFpbnB1dENoYW5nZWQpIHtcbiAgICBpbnB1dFZhbHVlID0gYWN0aXZlVmFsdWU7XG4gIH1cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY29tYm9ib3gpIHtcbiAgICAgIHNldElucHV0Q2hhbmdlZChmYWxzZSk7XG4gICAgfVxuICB9LCBbY29tYm9ib3gsIGFjdGl2ZVZhbHVlXSk7XG5cbiAgLy8gTm90IHNob3cgdGV4dCB3aGVuIGNsb3NlZCBleHBlY3QgY29tYm9ib3ggbW9kZVxuICB2YXIgaGFzVGV4dElucHV0ID0gbW9kZSAhPT0gJ2NvbWJvYm94JyAmJiAhb3BlbiAmJiAhc2hvd1NlYXJjaCA/IGZhbHNlIDogISFpbnB1dFZhbHVlO1xuXG4gIC8vIEdldCB0aXRsZVxuICB2YXIgdGl0bGUgPSBnZXRUaXRsZShpdGVtKTtcbiAgdmFyIHJlbmRlclBsYWNlaG9sZGVyID0gZnVuY3Rpb24gcmVuZGVyUGxhY2Vob2xkZXIoKSB7XG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgaGlkZGVuU3R5bGUgPSBoYXNUZXh0SW5wdXQgPyB7XG4gICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJ1xuICAgIH0gOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2VsZWN0aW9uLXBsYWNlaG9sZGVyXCIpLFxuICAgICAgc3R5bGU6IGhpZGRlblN0eWxlXG4gICAgfSwgcGxhY2Vob2xkZXIpO1xuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNlbGVjdGlvbi1zZWFyY2hcIilcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSW5wdXQsIHtcbiAgICByZWY6IGlucHV0UmVmLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGlkOiBpZCxcbiAgICBvcGVuOiBvcGVuLFxuICAgIGlucHV0RWxlbWVudDogaW5wdXRFbGVtZW50LFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICBhdXRvRm9jdXM6IGF1dG9Gb2N1cyxcbiAgICBhdXRvQ29tcGxldGU6IGF1dG9Db21wbGV0ZSxcbiAgICBlZGl0YWJsZTogaW5wdXRFZGl0YWJsZSxcbiAgICBhY3RpdmVEZXNjZW5kYW50SWQ6IGFjdGl2ZURlc2NlbmRhbnRJZCxcbiAgICB2YWx1ZTogaW5wdXRWYWx1ZSxcbiAgICBvbktleURvd246IG9uSW5wdXRLZXlEb3duLFxuICAgIG9uTW91c2VEb3duOiBvbklucHV0TW91c2VEb3duLFxuICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgICBzZXRJbnB1dENoYW5nZWQodHJ1ZSk7XG4gICAgICBvbklucHV0Q2hhbmdlKGUpO1xuICAgIH0sXG4gICAgb25QYXN0ZTogb25JbnB1dFBhc3RlLFxuICAgIG9uQ29tcG9zaXRpb25TdGFydDogb25JbnB1dENvbXBvc2l0aW9uU3RhcnQsXG4gICAgb25Db21wb3NpdGlvbkVuZDogb25JbnB1dENvbXBvc2l0aW9uRW5kLFxuICAgIHRhYkluZGV4OiB0YWJJbmRleCxcbiAgICBhdHRyczogcGlja0F0dHJzKHByb3BzLCB0cnVlKSxcbiAgICBtYXhMZW5ndGg6IGNvbWJvYm94ID8gbWF4TGVuZ3RoIDogdW5kZWZpbmVkXG4gIH0pKSwgIWNvbWJvYm94ICYmIGl0ZW0gPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zZWxlY3Rpb24taXRlbVwiKSxcbiAgICB0aXRsZTogdGl0bGVcbiAgICAvLyDlvZMgU2VsZWN0IOW3sue7j+mAieS4remAiemhueaXtu+8jOi/mOmcgCBzZWxlY3Rpb24g6ZqQ6JeP5L2G55WZ5Zyo5Y6f5Zyw5Y2g5L2NXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjc2ODhcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80MTUzMFxuICAgICxcbiAgICBzdHlsZTogaGFzVGV4dElucHV0ID8ge1xuICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbidcbiAgICB9IDogdW5kZWZpbmVkXG4gIH0sIGl0ZW0ubGFiZWwpIDogbnVsbCwgcmVuZGVyUGxhY2Vob2xkZXIoKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgU2luZ2xlU2VsZWN0b3I7IiwiaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuXG4vKioga2V5Q29kZSBKdWRnbWVudCBmdW5jdGlvbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRhdGVPcGVuS2V5KGN1cnJlbnRLZXlDb2RlKSB7XG4gIHJldHVybiAhW1xuICAvLyBTeXN0ZW0gZnVuY3Rpb24gYnV0dG9uXG4gIEtleUNvZGUuRVNDLCBLZXlDb2RlLlNISUZULCBLZXlDb2RlLkJBQ0tTUEFDRSwgS2V5Q29kZS5UQUIsIEtleUNvZGUuV0lOX0tFWSwgS2V5Q29kZS5BTFQsIEtleUNvZGUuTUVUQSwgS2V5Q29kZS5XSU5fS0VZX1JJR0hULCBLZXlDb2RlLkNUUkwsIEtleUNvZGUuU0VNSUNPTE9OLCBLZXlDb2RlLkVRVUFMUywgS2V5Q29kZS5DQVBTX0xPQ0ssIEtleUNvZGUuQ09OVEVYVF9NRU5VLFxuICAvLyBGMS1GMTJcbiAgS2V5Q29kZS5GMSwgS2V5Q29kZS5GMiwgS2V5Q29kZS5GMywgS2V5Q29kZS5GNCwgS2V5Q29kZS5GNSwgS2V5Q29kZS5GNiwgS2V5Q29kZS5GNywgS2V5Q29kZS5GOCwgS2V5Q29kZS5GOSwgS2V5Q29kZS5GMTAsIEtleUNvZGUuRjExLCBLZXlDb2RlLkYxMl0uaW5jbHVkZXMoY3VycmVudEtleUNvZGUpO1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG4vKipcbiAqIEN1cnNvciBydWxlOlxuICogMS4gT25seSBgc2hvd1NlYXJjaGAgZW5hYmxlZFxuICogMi4gT25seSBgb3BlbmAgaXMgYHRydWVgXG4gKiAzLiBXaGVuIHR5cGluZywgc2V0IGBvcGVuYCB0byBgdHJ1ZWAgd2hpY2ggaGl0IHJ1bGUgb2YgMlxuICpcbiAqIEFjY2Vzc2liaWxpdHk6XG4gKiAtIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS1wcmFjdGljZXMvZXhhbXBsZXMvY29tYm9ib3gvYXJpYTEuMXBhdHRlcm4vbGlzdGJveC1jb21iby5odG1sXG4gKi9cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuaW1wb3J0IE11bHRpcGxlU2VsZWN0b3IgZnJvbSBcIi4vTXVsdGlwbGVTZWxlY3RvclwiO1xuaW1wb3J0IFNpbmdsZVNlbGVjdG9yIGZyb20gXCIuL1NpbmdsZVNlbGVjdG9yXCI7XG5pbXBvcnQgdXNlTG9jayBmcm9tIFwiLi4vaG9va3MvdXNlTG9ja1wiO1xuaW1wb3J0IHsgaXNWYWxpZGF0ZU9wZW5LZXkgfSBmcm9tIFwiLi4vdXRpbHMva2V5VXRpbFwiO1xudmFyIFNlbGVjdG9yID0gZnVuY3Rpb24gU2VsZWN0b3IocHJvcHMsIHJlZikge1xuICB2YXIgaW5wdXRSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBjb21wb3NpdGlvblN0YXR1c1JlZiA9IHVzZVJlZihmYWxzZSk7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgb3BlbiA9IHByb3BzLm9wZW4sXG4gICAgbW9kZSA9IHByb3BzLm1vZGUsXG4gICAgc2hvd1NlYXJjaCA9IHByb3BzLnNob3dTZWFyY2gsXG4gICAgdG9rZW5XaXRoRW50ZXIgPSBwcm9wcy50b2tlbldpdGhFbnRlcixcbiAgICBhdXRvQ2xlYXJTZWFyY2hWYWx1ZSA9IHByb3BzLmF1dG9DbGVhclNlYXJjaFZhbHVlLFxuICAgIG9uU2VhcmNoID0gcHJvcHMub25TZWFyY2gsXG4gICAgb25TZWFyY2hTdWJtaXQgPSBwcm9wcy5vblNlYXJjaFN1Ym1pdCxcbiAgICBvblRvZ2dsZU9wZW4gPSBwcm9wcy5vblRvZ2dsZU9wZW4sXG4gICAgb25JbnB1dEtleURvd24gPSBwcm9wcy5vbklucHV0S2V5RG93bixcbiAgICBkb21SZWYgPSBwcm9wcy5kb21SZWY7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gUmVmID09PT09PT09PT09PT09PT09PT09PT09XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvY3VzOiBmdW5jdGlvbiBmb2N1cygpIHtcbiAgICAgICAgaW5wdXRSZWYuY3VycmVudC5mb2N1cygpO1xuICAgICAgfSxcbiAgICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG4gICAgICAgIGlucHV0UmVmLmN1cnJlbnQuYmx1cigpO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gSW5wdXQgPT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZUxvY2sgPSB1c2VMb2NrKDApLFxuICAgIF91c2VMb2NrMiA9IF9zbGljZWRUb0FycmF5KF91c2VMb2NrLCAyKSxcbiAgICBnZXRJbnB1dE1vdXNlRG93biA9IF91c2VMb2NrMlswXSxcbiAgICBzZXRJbnB1dE1vdXNlRG93biA9IF91c2VMb2NrMlsxXTtcbiAgdmFyIG9uSW50ZXJuYWxJbnB1dEtleURvd24gPSBmdW5jdGlvbiBvbkludGVybmFsSW5wdXRLZXlEb3duKGV2ZW50KSB7XG4gICAgdmFyIHdoaWNoID0gZXZlbnQud2hpY2g7XG4gICAgaWYgKHdoaWNoID09PSBLZXlDb2RlLlVQIHx8IHdoaWNoID09PSBLZXlDb2RlLkRPV04pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGlmIChvbklucHV0S2V5RG93bikge1xuICAgICAgb25JbnB1dEtleURvd24oZXZlbnQpO1xuICAgIH1cbiAgICBpZiAod2hpY2ggPT09IEtleUNvZGUuRU5URVIgJiYgbW9kZSA9PT0gJ3RhZ3MnICYmICFjb21wb3NpdGlvblN0YXR1c1JlZi5jdXJyZW50ICYmICFvcGVuKSB7XG4gICAgICAvLyBXaGVuIG1lbnUgaXNuJ3Qgb3BlbiwgT3B0aW9uTGlzdCB3b24ndCB0cmlnZ2VyIGEgdmFsdWUgY2hhbmdlXG4gICAgICAvLyBTbyB3aGVuIGVudGVyIGlzIHByZXNzZWQsIHRoZSB0YWcncyBpbnB1dCB2YWx1ZSBzaG91bGQgYmUgZW1pdHRlZCBoZXJlIHRvIGxldCBzZWxlY3RvciBrbm93XG4gICAgICBvblNlYXJjaFN1Ym1pdCA9PT0gbnVsbCB8fCBvblNlYXJjaFN1Ym1pdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25TZWFyY2hTdWJtaXQoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGlzVmFsaWRhdGVPcGVuS2V5KHdoaWNoKSkge1xuICAgICAgb25Ub2dnbGVPcGVuKHRydWUpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogV2UgY2FuIG5vdCB1c2UgYGZpbmRET01Ob2RlYCBzaW5lIGl0IHdpbGwgZ2V0IHdhcm5pbmcsXG4gICAqIGhhdmUgdG8gdXNlIHRpbWVyIHRvIGNoZWNrIGlmIGlzIGlucHV0IGVsZW1lbnQuXG4gICAqL1xuICB2YXIgb25JbnRlcm5hbElucHV0TW91c2VEb3duID0gZnVuY3Rpb24gb25JbnRlcm5hbElucHV0TW91c2VEb3duKCkge1xuICAgIHNldElucHV0TW91c2VEb3duKHRydWUpO1xuICB9O1xuXG4gIC8vIFdoZW4gcGFzdGUgY29tZSwgaWdub3JlIG5leHQgb25DaGFuZ2VcbiAgdmFyIHBhc3RlZFRleHRSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciB0cmlnZ2VyT25TZWFyY2ggPSBmdW5jdGlvbiB0cmlnZ2VyT25TZWFyY2godmFsdWUpIHtcbiAgICBpZiAob25TZWFyY2godmFsdWUsIHRydWUsIGNvbXBvc2l0aW9uU3RhdHVzUmVmLmN1cnJlbnQpICE9PSBmYWxzZSkge1xuICAgICAgb25Ub2dnbGVPcGVuKHRydWUpO1xuICAgIH1cbiAgfTtcbiAgdmFyIG9uSW5wdXRDb21wb3NpdGlvblN0YXJ0ID0gZnVuY3Rpb24gb25JbnB1dENvbXBvc2l0aW9uU3RhcnQoKSB7XG4gICAgY29tcG9zaXRpb25TdGF0dXNSZWYuY3VycmVudCA9IHRydWU7XG4gIH07XG4gIHZhciBvbklucHV0Q29tcG9zaXRpb25FbmQgPSBmdW5jdGlvbiBvbklucHV0Q29tcG9zaXRpb25FbmQoZSkge1xuICAgIGNvbXBvc2l0aW9uU3RhdHVzUmVmLmN1cnJlbnQgPSBmYWxzZTtcblxuICAgIC8vIFRyaWdnZXIgc2VhcmNoIGFnYWluIHRvIHN1cHBvcnQgYHRva2VuU2VwYXJhdG9yc2Agd2l0aCB0eXBld3JpdGluZ1xuICAgIGlmIChtb2RlICE9PSAnY29tYm9ib3gnKSB7XG4gICAgICB0cmlnZ2VyT25TZWFyY2goZS50YXJnZXQudmFsdWUpO1xuICAgIH1cbiAgfTtcbiAgdmFyIG9uSW5wdXRDaGFuZ2UgPSBmdW5jdGlvbiBvbklucHV0Q2hhbmdlKGV2ZW50KSB7XG4gICAgdmFyIHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuXG4gICAgLy8gUGFzdGVkIHRleHQgc2hvdWxkIHJlcGxhY2UgYmFjayB0byBvcmlnaW4gY29udGVudFxuICAgIGlmICh0b2tlbldpdGhFbnRlciAmJiBwYXN0ZWRUZXh0UmVmLmN1cnJlbnQgJiYgL1tcXHJcXG5dLy50ZXN0KHBhc3RlZFRleHRSZWYuY3VycmVudCkpIHtcbiAgICAgIC8vIENSTEYgd2lsbCBiZSB0cmVhdGVkIGFzIGEgc2luZ2xlIHNwYWNlIGZvciBpbnB1dCBlbGVtZW50XG4gICAgICB2YXIgcmVwbGFjZWRUZXh0ID0gcGFzdGVkVGV4dFJlZi5jdXJyZW50LnJlcGxhY2UoL1tcXHJcXG5dKyQvLCAnJykucmVwbGFjZSgvXFxyXFxuL2csICcgJykucmVwbGFjZSgvW1xcclxcbl0vZywgJyAnKTtcbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZXBsYWNlZFRleHQsIHBhc3RlZFRleHRSZWYuY3VycmVudCk7XG4gICAgfVxuICAgIHBhc3RlZFRleHRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgdHJpZ2dlck9uU2VhcmNoKHZhbHVlKTtcbiAgfTtcbiAgdmFyIG9uSW5wdXRQYXN0ZSA9IGZ1bmN0aW9uIG9uSW5wdXRQYXN0ZShlKSB7XG4gICAgdmFyIGNsaXBib2FyZERhdGEgPSBlLmNsaXBib2FyZERhdGE7XG4gICAgdmFyIHZhbHVlID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XG4gICAgcGFzdGVkVGV4dFJlZi5jdXJyZW50ID0gdmFsdWU7XG4gIH07XG4gIHZhciBvbkNsaWNrID0gZnVuY3Rpb24gb25DbGljayhfcmVmKSB7XG4gICAgdmFyIHRhcmdldCA9IF9yZWYudGFyZ2V0O1xuICAgIGlmICh0YXJnZXQgIT09IGlucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgIC8vIFNob3VsZCBmb2N1cyBpbnB1dCBpZiBjbGljayB0aGUgc2VsZWN0b3JcbiAgICAgIHZhciBpc0lFID0gZG9jdW1lbnQuYm9keS5zdHlsZS5tc1RvdWNoQWN0aW9uICE9PSB1bmRlZmluZWQ7XG4gICAgICBpZiAoaXNJRSkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpbnB1dFJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5wdXRSZWYuY3VycmVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdmFyIG9uTW91c2VEb3duID0gZnVuY3Rpb24gb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICB2YXIgaW5wdXRNb3VzZURvd24gPSBnZXRJbnB1dE1vdXNlRG93bigpO1xuXG4gICAgLy8gd2hlbiBtb2RlIGlzIGNvbWJvYm94LCBkb24ndCBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3JcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8zNzMyMFxuICAgIGlmIChldmVudC50YXJnZXQgIT09IGlucHV0UmVmLmN1cnJlbnQgJiYgIWlucHV0TW91c2VEb3duICYmIG1vZGUgIT09ICdjb21ib2JveCcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGlmIChtb2RlICE9PSAnY29tYm9ib3gnICYmICghc2hvd1NlYXJjaCB8fCAhaW5wdXRNb3VzZURvd24pIHx8ICFvcGVuKSB7XG4gICAgICBpZiAob3BlbiAmJiBhdXRvQ2xlYXJTZWFyY2hWYWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgb25TZWFyY2goJycsIHRydWUsIGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIG9uVG9nZ2xlT3BlbigpO1xuICAgIH1cbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PSBJbm5lciBTZWxlY3RvciA9PT09PT09PT09PT09PT09PT1cbiAgdmFyIHNoYXJlZFByb3BzID0ge1xuICAgIGlucHV0UmVmOiBpbnB1dFJlZixcbiAgICBvbklucHV0S2V5RG93bjogb25JbnRlcm5hbElucHV0S2V5RG93bixcbiAgICBvbklucHV0TW91c2VEb3duOiBvbkludGVybmFsSW5wdXRNb3VzZURvd24sXG4gICAgb25JbnB1dENoYW5nZTogb25JbnB1dENoYW5nZSxcbiAgICBvbklucHV0UGFzdGU6IG9uSW5wdXRQYXN0ZSxcbiAgICBvbklucHV0Q29tcG9zaXRpb25TdGFydDogb25JbnB1dENvbXBvc2l0aW9uU3RhcnQsXG4gICAgb25JbnB1dENvbXBvc2l0aW9uRW5kOiBvbklucHV0Q29tcG9zaXRpb25FbmRcbiAgfTtcbiAgdmFyIHNlbGVjdE5vZGUgPSBtb2RlID09PSAnbXVsdGlwbGUnIHx8IG1vZGUgPT09ICd0YWdzJyA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE11bHRpcGxlU2VsZWN0b3IsIF9leHRlbmRzKHt9LCBwcm9wcywgc2hhcmVkUHJvcHMpKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNpbmdsZVNlbGVjdG9yLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHNoYXJlZFByb3BzKSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiBkb21SZWYsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNlbGVjdG9yXCIpLFxuICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgb25Nb3VzZURvd246IG9uTW91c2VEb3duXG4gIH0sIHNlbGVjdE5vZGUpO1xufTtcbnZhciBGb3J3YXJkU2VsZWN0b3IgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihTZWxlY3Rvcik7XG5Gb3J3YXJkU2VsZWN0b3IuZGlzcGxheU5hbWUgPSAnU2VsZWN0b3InO1xuZXhwb3J0IGRlZmF1bHQgRm9yd2FyZFNlbGVjdG9yOyIsImltcG9ydCB7IHVzZVJlZiwgdXNlRWZmZWN0LCBmb3J3YXJkUmVmLCB1c2VJbXBlcmF0aXZlSGFuZGxlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgY2FuVXNlRG9tIGZyb20gXCIuL0RvbS9jYW5Vc2VEb21cIjtcbnZhciBQb3J0YWwgPSAvKiNfX1BVUkVfXyovZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgZGlkVXBkYXRlID0gcHJvcHMuZGlkVXBkYXRlLFxuICAgIGdldENvbnRhaW5lciA9IHByb3BzLmdldENvbnRhaW5lcixcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICB2YXIgcGFyZW50UmVmID0gdXNlUmVmKCk7XG4gIHZhciBjb250YWluZXJSZWYgPSB1c2VSZWYoKTtcblxuICAvLyBSZWYgcmV0dXJuIG5vdGhpbmcsIG9ubHkgZm9yIHdyYXBwZXIgY2hlY2sgZXhpc3RcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge307XG4gIH0pO1xuXG4gIC8vIENyZWF0ZSBjb250YWluZXIgaW4gY2xpZW50IHNpZGUgd2l0aCBzeW5jIHRvIGF2b2lkIHVzZUVmZmVjdCBub3QgZ2V0IHJlZlxuICB2YXIgaW5pdFJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIGlmICghaW5pdFJlZi5jdXJyZW50ICYmIGNhblVzZURvbSgpKSB7XG4gICAgY29udGFpbmVyUmVmLmN1cnJlbnQgPSBnZXRDb250YWluZXIoKTtcbiAgICBwYXJlbnRSZWYuY3VycmVudCA9IGNvbnRhaW5lclJlZi5jdXJyZW50LnBhcmVudE5vZGU7XG4gICAgaW5pdFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIFtMZWdhY3ldIFVzZWQgYnkgYHJjLXRyaWdnZXJgXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgZGlkVXBkYXRlID09PSBudWxsIHx8IGRpZFVwZGF0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGlkVXBkYXRlKHByb3BzKTtcbiAgfSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgLy8gUmVzdG9yZSBjb250YWluZXIgdG8gb3JpZ2luYWwgcGxhY2VcbiAgICAvLyBSZWFjdCAxOCBTdHJpY3RNb2RlIHdpbGwgdW5tb3VudCBmaXJzdCBhbmQgbW91bnQgYmFjayBmb3IgZWZmZWN0IHRlc3Q6XG4gICAgLy8gaHR0cHM6Ly9yZWFjdGpzLm9yZy9ibG9nLzIwMjIvMDMvMjkvcmVhY3QtdjE4Lmh0bWwjbmV3LXN0cmljdC1tb2RlLWJlaGF2aW9yc1xuICAgIGlmIChjb250YWluZXJSZWYuY3VycmVudC5wYXJlbnROb2RlID09PSBudWxsICYmIHBhcmVudFJlZi5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICBwYXJlbnRSZWYuY3VycmVudC5hcHBlbmRDaGlsZChjb250YWluZXJSZWYuY3VycmVudCk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2NvbnRhaW5lclJlZiRjdXJyZW50LCBfY29udGFpbmVyUmVmJGN1cnJlbnQyO1xuICAgICAgLy8gW0xlZ2FjeV0gVGhpcyBzaG91bGQgbm90IGJlIGhhbmRsZSBieSBQb3J0YWwgYnV0IHBhcmVudCBQb3J0YWxXcmFwcGVyIGluc3RlYWQuXG4gICAgICAvLyBTaW5jZSBzb21lIGNvbXBvbmVudCB1c2UgYFBvcnRhbGAgZGlyZWN0bHksIHdlIGhhdmUgdG8ga2VlcCB0aGUgbG9naWMgaGVyZS5cbiAgICAgIChfY29udGFpbmVyUmVmJGN1cnJlbnQgPSBjb250YWluZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2NvbnRhaW5lclJlZiRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX2NvbnRhaW5lclJlZiRjdXJyZW50MiA9IF9jb250YWluZXJSZWYkY3VycmVudC5wYXJlbnROb2RlKSA9PT0gbnVsbCB8fCBfY29udGFpbmVyUmVmJGN1cnJlbnQyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY29udGFpbmVyUmVmJGN1cnJlbnQyLnJlbW92ZUNoaWxkKGNvbnRhaW5lclJlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBjb250YWluZXJSZWYuY3VycmVudCA/IC8qI19fUFVSRV9fKi9SZWFjdERPTS5jcmVhdGVQb3J0YWwoY2hpbGRyZW4sIGNvbnRhaW5lclJlZi5jdXJyZW50KSA6IG51bGw7XG59KTtcbmV4cG9ydCBkZWZhdWx0IFBvcnRhbDsiLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuXG5mdW5jdGlvbiBpc1BvaW50c0VxKGExLCBhMiwgaXNBbGlnblBvaW50KSB7XG4gIGlmIChpc0FsaWduUG9pbnQpIHtcbiAgICByZXR1cm4gYTFbMF0gPT09IGEyWzBdO1xuICB9XG5cbiAgcmV0dXJuIGExWzBdID09PSBhMlswXSAmJiBhMVsxXSA9PT0gYTJbMV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGlnbkZyb21QbGFjZW1lbnQoYnVpbHRpblBsYWNlbWVudHMsIHBsYWNlbWVudFN0ciwgYWxpZ24pIHtcbiAgdmFyIGJhc2VBbGlnbiA9IGJ1aWx0aW5QbGFjZW1lbnRzW3BsYWNlbWVudFN0cl0gfHwge307XG4gIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGJhc2VBbGlnbiksIGFsaWduKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGlnblBvcHVwQ2xhc3NOYW1lKGJ1aWx0aW5QbGFjZW1lbnRzLCBwcmVmaXhDbHMsIGFsaWduLCBpc0FsaWduUG9pbnQpIHtcbiAgdmFyIHBvaW50cyA9IGFsaWduLnBvaW50cztcbiAgdmFyIHBsYWNlbWVudHMgPSBPYmplY3Qua2V5cyhidWlsdGluUGxhY2VtZW50cyk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbGFjZW1lbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIHBsYWNlbWVudCA9IHBsYWNlbWVudHNbaV07XG5cbiAgICBpZiAoaXNQb2ludHNFcShidWlsdGluUGxhY2VtZW50c1twbGFjZW1lbnRdLnBvaW50cywgcG9pbnRzLCBpc0FsaWduUG9pbnQpKSB7XG4gICAgICByZXR1cm4gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wbGFjZW1lbnQtXCIpLmNvbmNhdChwbGFjZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn0iLCJleHBvcnQgZnVuY3Rpb24gZ2V0TW90aW9uKF9yZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgICAgbW90aW9uID0gX3JlZi5tb3Rpb24sXG4gICAgICBhbmltYXRpb24gPSBfcmVmLmFuaW1hdGlvbixcbiAgICAgIHRyYW5zaXRpb25OYW1lID0gX3JlZi50cmFuc2l0aW9uTmFtZTtcblxuICBpZiAobW90aW9uKSB7XG4gICAgcmV0dXJuIG1vdGlvbjtcbiAgfVxuXG4gIGlmIChhbmltYXRpb24pIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW90aW9uTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KGFuaW1hdGlvbilcbiAgICB9O1xuICB9XG5cbiAgaWYgKHRyYW5zaXRpb25OYW1lKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IENTU01vdGlvbiBmcm9tICdyYy1tb3Rpb24nO1xuaW1wb3J0IHsgZ2V0TW90aW9uIH0gZnJvbSBcIi4uL3V0aWxzL2xlZ2FjeVV0aWxcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1hc2socHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIHZpc2libGUgPSBwcm9wcy52aXNpYmxlLFxuICAgICAgekluZGV4ID0gcHJvcHMuekluZGV4LFxuICAgICAgbWFzayA9IHByb3BzLm1hc2ssXG4gICAgICBtYXNrTW90aW9uID0gcHJvcHMubWFza01vdGlvbixcbiAgICAgIG1hc2tBbmltYXRpb24gPSBwcm9wcy5tYXNrQW5pbWF0aW9uLFxuICAgICAgbWFza1RyYW5zaXRpb25OYW1lID0gcHJvcHMubWFza1RyYW5zaXRpb25OYW1lO1xuXG4gIGlmICghbWFzaykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG1vdGlvbiA9IHt9O1xuXG4gIGlmIChtYXNrTW90aW9uIHx8IG1hc2tUcmFuc2l0aW9uTmFtZSB8fCBtYXNrQW5pbWF0aW9uKSB7XG4gICAgbW90aW9uID0gX29iamVjdFNwcmVhZCh7XG4gICAgICBtb3Rpb25BcHBlYXI6IHRydWVcbiAgICB9LCBnZXRNb3Rpb24oe1xuICAgICAgbW90aW9uOiBtYXNrTW90aW9uLFxuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICB0cmFuc2l0aW9uTmFtZTogbWFza1RyYW5zaXRpb25OYW1lLFxuICAgICAgYW5pbWF0aW9uOiBtYXNrQW5pbWF0aW9uXG4gICAgfSkpO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbiwgX2V4dGVuZHMoe30sIG1vdGlvbiwge1xuICAgIHZpc2libGU6IHZpc2libGUsXG4gICAgcmVtb3ZlT25MZWF2ZTogdHJ1ZVxuICB9KSwgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWU7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIHpJbmRleDogekluZGV4XG4gICAgICB9LFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWFza1wiKSwgY2xhc3NOYW1lKVxuICAgIH0pO1xuICB9KTtcbn0iLCJmdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMih0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTtcbiAgICBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICB9IDogZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gIH0sIF90eXBlb2Yob2JqKTtcbn1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxudmFyIHZlbmRvclByZWZpeDtcbnZhciBqc0Nzc01hcCA9IHtcbiAgV2Via2l0OiAnLXdlYmtpdC0nLFxuICBNb3o6ICctbW96LScsXG4gIC8vIElFIGRpZCBpdCB3cm9uZyBhZ2FpbiAuLi5cbiAgbXM6ICctbXMtJyxcbiAgTzogJy1vLSdcbn07XG5mdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXgoKSB7XG4gIGlmICh2ZW5kb3JQcmVmaXggIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB2ZW5kb3JQcmVmaXg7XG4gIH1cbiAgdmVuZG9yUHJlZml4ID0gJyc7XG4gIHZhciBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKS5zdHlsZTtcbiAgdmFyIHRlc3RQcm9wID0gJ1RyYW5zZm9ybSc7XG4gIGZvciAodmFyIGtleSBpbiBqc0Nzc01hcCkge1xuICAgIGlmIChrZXkgKyB0ZXN0UHJvcCBpbiBzdHlsZSkge1xuICAgICAgdmVuZG9yUHJlZml4ID0ga2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmVuZG9yUHJlZml4O1xufVxuZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbk5hbWUoKSB7XG4gIHJldHVybiBnZXRWZW5kb3JQcmVmaXgoKSA/IFwiXCIuY29uY2F0KGdldFZlbmRvclByZWZpeCgpLCBcIlRyYW5zaXRpb25Qcm9wZXJ0eVwiKSA6ICd0cmFuc2l0aW9uUHJvcGVydHknO1xufVxuZnVuY3Rpb24gZ2V0VHJhbnNmb3JtTmFtZSgpIHtcbiAgcmV0dXJuIGdldFZlbmRvclByZWZpeCgpID8gXCJcIi5jb25jYXQoZ2V0VmVuZG9yUHJlZml4KCksIFwiVHJhbnNmb3JtXCIpIDogJ3RyYW5zZm9ybSc7XG59XG5mdW5jdGlvbiBzZXRUcmFuc2l0aW9uUHJvcGVydHkobm9kZSwgdmFsdWUpIHtcbiAgdmFyIG5hbWUgPSBnZXRUcmFuc2l0aW9uTmFtZSgpO1xuICBpZiAobmFtZSkge1xuICAgIG5vZGUuc3R5bGVbbmFtZV0gPSB2YWx1ZTtcbiAgICBpZiAobmFtZSAhPT0gJ3RyYW5zaXRpb25Qcm9wZXJ0eScpIHtcbiAgICAgIG5vZGUuc3R5bGUudHJhbnNpdGlvblByb3BlcnR5ID0gdmFsdWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzZXRUcmFuc2Zvcm0obm9kZSwgdmFsdWUpIHtcbiAgdmFyIG5hbWUgPSBnZXRUcmFuc2Zvcm1OYW1lKCk7XG4gIGlmIChuYW1lKSB7XG4gICAgbm9kZS5zdHlsZVtuYW1lXSA9IHZhbHVlO1xuICAgIGlmIChuYW1lICE9PSAndHJhbnNmb3JtJykge1xuICAgICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFRyYW5zaXRpb25Qcm9wZXJ0eShub2RlKSB7XG4gIHJldHVybiBub2RlLnN0eWxlLnRyYW5zaXRpb25Qcm9wZXJ0eSB8fCBub2RlLnN0eWxlW2dldFRyYW5zaXRpb25OYW1lKCldO1xufVxuZnVuY3Rpb24gZ2V0VHJhbnNmb3JtWFkobm9kZSkge1xuICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKTtcbiAgdmFyIHRyYW5zZm9ybSA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3RyYW5zZm9ybScpIHx8IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoZ2V0VHJhbnNmb3JtTmFtZSgpKTtcbiAgaWYgKHRyYW5zZm9ybSAmJiB0cmFuc2Zvcm0gIT09ICdub25lJykge1xuICAgIHZhciBtYXRyaXggPSB0cmFuc2Zvcm0ucmVwbGFjZSgvW14wLTlcXC0uLF0vZywgJycpLnNwbGl0KCcsJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHBhcnNlRmxvYXQobWF0cml4WzEyXSB8fCBtYXRyaXhbNF0sIDApLFxuICAgICAgeTogcGFyc2VGbG9hdChtYXRyaXhbMTNdIHx8IG1hdHJpeFs1XSwgMClcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG59XG52YXIgbWF0cml4MmQgPSAvbWF0cml4XFwoKC4qKVxcKS87XG52YXIgbWF0cml4M2QgPSAvbWF0cml4M2RcXCgoLiopXFwpLztcbmZ1bmN0aW9uIHNldFRyYW5zZm9ybVhZKG5vZGUsIHh5KSB7XG4gIHZhciBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpO1xuICB2YXIgdHJhbnNmb3JtID0gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgndHJhbnNmb3JtJykgfHwgc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShnZXRUcmFuc2Zvcm1OYW1lKCkpO1xuICBpZiAodHJhbnNmb3JtICYmIHRyYW5zZm9ybSAhPT0gJ25vbmUnKSB7XG4gICAgdmFyIGFycjtcbiAgICB2YXIgbWF0Y2gyZCA9IHRyYW5zZm9ybS5tYXRjaChtYXRyaXgyZCk7XG4gICAgaWYgKG1hdGNoMmQpIHtcbiAgICAgIG1hdGNoMmQgPSBtYXRjaDJkWzFdO1xuICAgICAgYXJyID0gbWF0Y2gyZC5zcGxpdCgnLCcpLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChpdGVtLCAxMCk7XG4gICAgICB9KTtcbiAgICAgIGFycls0XSA9IHh5Lng7XG4gICAgICBhcnJbNV0gPSB4eS55O1xuICAgICAgc2V0VHJhbnNmb3JtKG5vZGUsIFwibWF0cml4KFwiLmNvbmNhdChhcnIuam9pbignLCcpLCBcIilcIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbWF0Y2gzZCA9IHRyYW5zZm9ybS5tYXRjaChtYXRyaXgzZClbMV07XG4gICAgICBhcnIgPSBtYXRjaDNkLnNwbGl0KCcsJykubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KGl0ZW0sIDEwKTtcbiAgICAgIH0pO1xuICAgICAgYXJyWzEyXSA9IHh5Lng7XG4gICAgICBhcnJbMTNdID0geHkueTtcbiAgICAgIHNldFRyYW5zZm9ybShub2RlLCBcIm1hdHJpeDNkKFwiLmNvbmNhdChhcnIuam9pbignLCcpLCBcIilcIikpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzZXRUcmFuc2Zvcm0obm9kZSwgXCJ0cmFuc2xhdGVYKFwiLmNvbmNhdCh4eS54LCBcInB4KSB0cmFuc2xhdGVZKFwiKS5jb25jYXQoeHkueSwgXCJweCkgdHJhbnNsYXRlWigwKVwiKSk7XG4gIH1cbn1cblxudmFyIFJFX05VTSA9IC9bXFwtK10/KD86XFxkKlxcLnwpXFxkKyg/OltlRV1bXFwtK10/XFxkK3wpLy5zb3VyY2U7XG52YXIgZ2V0Q29tcHV0ZWRTdHlsZVg7XG5cbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNDg1NjU0LzMwNDA2MDVcbmZ1bmN0aW9uIGZvcmNlUmVsYXlvdXQoZWxlbSkge1xuICB2YXIgb3JpZ2luYWxTdHlsZSA9IGVsZW0uc3R5bGUuZGlzcGxheTtcbiAgZWxlbS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBlbGVtLm9mZnNldEhlaWdodDsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBlbGVtLnN0eWxlLmRpc3BsYXkgPSBvcmlnaW5hbFN0eWxlO1xufVxuZnVuY3Rpb24gY3NzKGVsLCBuYW1lLCB2KSB7XG4gIHZhciB2YWx1ZSA9IHY7XG4gIGlmIChfdHlwZW9mKG5hbWUpID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAodmFyIGkgaW4gbmFtZSkge1xuICAgICAgaWYgKG5hbWUuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgY3NzKGVsLCBpLCBuYW1lW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICB2YWx1ZSA9IFwiXCIuY29uY2F0KHZhbHVlLCBcInB4XCIpO1xuICAgIH1cbiAgICBlbC5zdHlsZVtuYW1lXSA9IHZhbHVlO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGVYKGVsLCBuYW1lKTtcbn1cbmZ1bmN0aW9uIGdldENsaWVudFBvc2l0aW9uKGVsZW0pIHtcbiAgdmFyIGJveDtcbiAgdmFyIHg7XG4gIHZhciB5O1xuICB2YXIgZG9jID0gZWxlbS5vd25lckRvY3VtZW50O1xuICB2YXIgYm9keSA9IGRvYy5ib2R5O1xuICB2YXIgZG9jRWxlbSA9IGRvYyAmJiBkb2MuZG9jdW1lbnRFbGVtZW50O1xuICAvLyDmoLnmja4gR0JTIOacgOaWsOaVsOaNru+8jEEtR3JhZGUgQnJvd3NlcnMg6YO95bey5pSv5oyBIGdldEJvdW5kaW5nQ2xpZW50UmVjdCDmlrnms5XvvIzkuI3nlKjlho3ogIPomZHkvKDnu5/nmoTlrp7njrDmlrnlvI9cbiAgYm94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAvLyDms6jvvJpqUXVlcnkg6L+Y6ICD6JmR5YeP5Y67IGRvY0VsZW0uY2xpZW50TGVmdC9jbGllbnRUb3BcbiAgLy8g5L2G5rWL6K+V5Y+R546w77yM6L+Z5qC35Y+N6ICM5Lya5a+86Ie05b2TIGh0bWwg5ZKMIGJvZHkg5pyJ6L656LedL+i+ueahhuagt+W8j+aXtu+8jOiOt+WPlueahOWAvOS4jeato+ehrlxuICAvLyDmraTlpJbvvIxpZTYg5Lya5b+955WlIGh0bWwg55qEIG1hcmdpbiDlgLzvvIzlubjov5DlnLDmmK/msqHmnInosIHkvJrljrvorr7nva4gaHRtbCDnmoQgbWFyZ2luXG5cbiAgeCA9IE1hdGguZmxvb3IoYm94LmxlZnQpO1xuICB5ID0gTWF0aC5mbG9vcihib3gudG9wKTtcblxuICAvLyBJbiBJRSwgbW9zdCBvZiB0aGUgdGltZSwgMiBleHRyYSBwaXhlbHMgYXJlIGFkZGVkIHRvIHRoZSB0b3AgYW5kIGxlZnRcbiAgLy8gZHVlIHRvIHRoZSBpbXBsaWNpdCAyLXBpeGVsIGluc2V0IGJvcmRlci4gIEluIElFNi83IHF1aXJrcyBtb2RlIGFuZFxuICAvLyBJRTYgc3RhbmRhcmRzIG1vZGUsIHRoaXMgYm9yZGVyIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHNldHRpbmcgdGhlXG4gIC8vIGRvY3VtZW50IGVsZW1lbnQncyBib3JkZXIgdG8gemVybyAtLSB0aHVzLCB3ZSBjYW5ub3QgcmVseSBvbiB0aGVcbiAgLy8gb2Zmc2V0IGFsd2F5cyBiZWluZyAyIHBpeGVscy5cblxuICAvLyBJbiBxdWlya3MgbW9kZSwgdGhlIG9mZnNldCBjYW4gYmUgZGV0ZXJtaW5lZCBieSBxdWVyeWluZyB0aGUgYm9keSdzXG4gIC8vIGNsaWVudExlZnQvY2xpZW50VG9wLCBidXQgaW4gc3RhbmRhcmRzIG1vZGUsIGl0IGlzIGZvdW5kIGJ5IHF1ZXJ5aW5nXG4gIC8vIHRoZSBkb2N1bWVudCBlbGVtZW50J3MgY2xpZW50TGVmdC9jbGllbnRUb3AuICBTaW5jZSB3ZSBhbHJlYWR5IGNhbGxlZFxuICAvLyBnZXRDbGllbnRCb3VuZGluZ1JlY3Qgd2UgaGF2ZSBhbHJlYWR5IGZvcmNlZCBhIHJlZmxvdywgc28gaXQgaXMgbm90XG4gIC8vIHRvbyBleHBlbnNpdmUganVzdCB0byBxdWVyeSB0aGVtIGFsbC5cblxuICAvLyBpZSDkuIvlupTor6Xlh4/ljrvnqpflj6PnmoTovrnmoYblkKfvvIzmr5Xnq5/pu5jorqQgYWJzb2x1dGUg6YO95piv55u45a+556qX5Y+j5a6a5L2N55qEXG4gIC8vIOeql+WPo+i+ueahhuagh+WHhuaYr+iuviBkb2N1bWVudEVsZW1lbnQgLHF1aXJrcyDml7borr7nva4gYm9keVxuICAvLyDmnIDlpb3npoHmraLlnKggYm9keSDlkowgaHRtbCDkuIrovrnmoYYg77yM5L2GIGllIDwgOSBodG1sIOm7mOiupOaciSAycHgg77yM5YeP5Y67XG4gIC8vIOS9huaYr+mdniBpZSDkuI3lj6/og73orr7nva7nqpflj6PovrnmoYbvvIxib2R5IGh0bWwg5Lmf5LiN5piv56qX5Y+jICxpZSDlj6/ku6XpgJrov4cgaHRtbCxib2R5IOiuvue9rlxuICAvLyDmoIflh4YgaWUg5LiLIGRvY0VsZW0uY2xpZW50VG9wIOWwseaYryBib3JkZXItdG9wXG4gIC8vIGllNyBodG1sIOWNs+eql+WPo+i+ueahhuaUueWPmOS4jeS6huOAguawuOi/nOS4uiAyXG4gIC8vIOS9huagh+WHhiBmaXJlZm94L2Nocm9tZS9pZTkg5LiLIGRvY0VsZW0uY2xpZW50VG9wIOaYr+eql+WPo+i+ueahhu+8jOWNs+S9v+iuvuS6hiBib3JkZXItdG9wIOS5n+S4uiAwXG5cbiAgeCAtPSBkb2NFbGVtLmNsaWVudExlZnQgfHwgYm9keS5jbGllbnRMZWZ0IHx8IDA7XG4gIHkgLT0gZG9jRWxlbS5jbGllbnRUb3AgfHwgYm9keS5jbGllbnRUb3AgfHwgMDtcbiAgcmV0dXJuIHtcbiAgICBsZWZ0OiB4LFxuICAgIHRvcDogeVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0U2Nyb2xsKHcsIHRvcCkge1xuICB2YXIgcmV0ID0gd1tcInBhZ2VcIi5jb25jYXQodG9wID8gJ1knIDogJ1gnLCBcIk9mZnNldFwiKV07XG4gIHZhciBtZXRob2QgPSBcInNjcm9sbFwiLmNvbmNhdCh0b3AgPyAnVG9wJyA6ICdMZWZ0Jyk7XG4gIGlmICh0eXBlb2YgcmV0ICE9PSAnbnVtYmVyJykge1xuICAgIHZhciBkID0gdy5kb2N1bWVudDtcbiAgICAvLyBpZTYsNyw4IHN0YW5kYXJkIG1vZGVcbiAgICByZXQgPSBkLmRvY3VtZW50RWxlbWVudFttZXRob2RdO1xuICAgIGlmICh0eXBlb2YgcmV0ICE9PSAnbnVtYmVyJykge1xuICAgICAgLy8gcXVpcmtzIG1vZGVcbiAgICAgIHJldCA9IGQuYm9keVttZXRob2RdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuZnVuY3Rpb24gZ2V0U2Nyb2xsTGVmdCh3KSB7XG4gIHJldHVybiBnZXRTY3JvbGwodyk7XG59XG5mdW5jdGlvbiBnZXRTY3JvbGxUb3Aodykge1xuICByZXR1cm4gZ2V0U2Nyb2xsKHcsIHRydWUpO1xufVxuZnVuY3Rpb24gZ2V0T2Zmc2V0KGVsKSB7XG4gIHZhciBwb3MgPSBnZXRDbGllbnRQb3NpdGlvbihlbCk7XG4gIHZhciBkb2MgPSBlbC5vd25lckRvY3VtZW50O1xuICB2YXIgdyA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICBwb3MubGVmdCArPSBnZXRTY3JvbGxMZWZ0KHcpO1xuICBwb3MudG9wICs9IGdldFNjcm9sbFRvcCh3KTtcbiAgcmV0dXJuIHBvcztcbn1cblxuLyoqXG4gKiBBIGNydWRlIHdheSBvZiBkZXRlcm1pbmluZyBpZiBhbiBvYmplY3QgaXMgYSB3aW5kb3dcbiAqIEBtZW1iZXIgdXRpbFxuICovXG5mdW5jdGlvbiBpc1dpbmRvdyhvYmopIHtcbiAgLy8gbXVzdCB1c2UgPT0gZm9yIGllOFxuICAvKiBlc2xpbnQgZXFlcWVxOjAgKi9cbiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogPT0gb2JqLndpbmRvdztcbn1cbmZ1bmN0aW9uIGdldERvY3VtZW50KG5vZGUpIHtcbiAgaWYgKGlzV2luZG93KG5vZGUpKSB7XG4gICAgcmV0dXJuIG5vZGUuZG9jdW1lbnQ7XG4gIH1cbiAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDkpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50O1xufVxuZnVuY3Rpb24gX2dldENvbXB1dGVkU3R5bGUoZWxlbSwgbmFtZSwgY3MpIHtcbiAgdmFyIGNvbXB1dGVkU3R5bGUgPSBjcztcbiAgdmFyIHZhbCA9ICcnO1xuICB2YXIgZCA9IGdldERvY3VtZW50KGVsZW0pO1xuICBjb21wdXRlZFN0eWxlID0gY29tcHV0ZWRTdHlsZSB8fCBkLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSwgbnVsbCk7XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2tpc3N5dGVhbS9raXNzeS9pc3N1ZXMvNjFcbiAgaWYgKGNvbXB1dGVkU3R5bGUpIHtcbiAgICB2YWwgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSkgfHwgY29tcHV0ZWRTdHlsZVtuYW1lXTtcbiAgfVxuICByZXR1cm4gdmFsO1xufVxudmFyIF9SRV9OVU1fTk9fUFggPSBuZXcgUmVnRXhwKFwiXihcIi5jb25jYXQoUkVfTlVNLCBcIikoPyFweClbYS16JV0rJFwiKSwgJ2knKTtcbnZhciBSRV9QT1MgPSAvXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87XG52YXIgQ1VSUkVOVF9TVFlMRSA9ICdjdXJyZW50U3R5bGUnO1xudmFyIFJVTlRJTUVfU1RZTEUgPSAncnVudGltZVN0eWxlJztcbnZhciBMRUZUID0gJ2xlZnQnO1xudmFyIFBYID0gJ3B4JztcbmZ1bmN0aW9uIF9nZXRDb21wdXRlZFN0eWxlSUUoZWxlbSwgbmFtZSkge1xuICAvLyBjdXJyZW50U3R5bGUgbWF5YmUgbnVsbFxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzUyMzEuYXNweFxuICB2YXIgcmV0ID0gZWxlbVtDVVJSRU5UX1NUWUxFXSAmJiBlbGVtW0NVUlJFTlRfU1RZTEVdW25hbWVdO1xuXG4gIC8vIOW9kyB3aWR0aC9oZWlnaHQg6K6+572u5Li655m+5YiG5q+U5pe277yM6YCa6L+HIHBpeGVsTGVmdCDmlrnlvI/ovazmjaLnmoQgd2lkdGgvaGVpZ2h0IOWAvFxuICAvLyDkuIDlvIDlp4vlsLHlpITnkIbkuoYhIENVU1RPTV9TVFlMRS5oZWlnaHQsQ1VTVE9NX1NUWUxFLndpZHRoICxjc3NIb29rIOino+WGs0AyMDExLTA4LTE5XG4gIC8vIOWcqCBpZSDkuIvkuI3lr7nvvIzpnIDopoHnm7TmjqXnlKggb2Zmc2V0IOaWueW8j1xuICAvLyBib3JkZXJXaWR0aCDnrYnlgLzkuZ/mnInpl67popjvvIzkvYbogIPomZHliLAgYm9yZGVyV2lkdGgg6K6+5Li655m+5YiG5q+U55qE5qaC546H5b6I5bCP77yM6L+Z6YeM5bCx5LiN6ICD6JmR5LqGXG5cbiAgLy8gRnJvbSB0aGUgYXdlc29tZSBoYWNrIGJ5IERlYW4gRWR3YXJkc1xuICAvLyBodHRwOi8vZXJpay5lYWUubmV0L2FyY2hpdmVzLzIwMDcvMDcvMjcvMTguNTQuMTUvI2NvbW1lbnQtMTAyMjkxXG4gIC8vIElmIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSByZWd1bGFyIHBpeGVsIG51bWJlclxuICAvLyBidXQgYSBudW1iZXIgdGhhdCBoYXMgYSB3ZWlyZCBlbmRpbmcsIHdlIG5lZWQgdG8gY29udmVydCBpdCB0byBwaXhlbHNcbiAgLy8gZXhjbHVkZSBsZWZ0IHJpZ2h0IGZvciByZWxhdGl2aXR5XG4gIGlmIChfUkVfTlVNX05PX1BYLnRlc3QocmV0KSAmJiAhUkVfUE9TLnRlc3QobmFtZSkpIHtcbiAgICAvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzXG4gICAgdmFyIHN0eWxlID0gZWxlbS5zdHlsZTtcbiAgICB2YXIgbGVmdCA9IHN0eWxlW0xFRlRdO1xuICAgIHZhciByc0xlZnQgPSBlbGVtW1JVTlRJTUVfU1RZTEVdW0xFRlRdO1xuXG4gICAgLy8gcHJldmVudCBmbGFzaGluZyBvZiBjb250ZW50XG4gICAgZWxlbVtSVU5USU1FX1NUWUxFXVtMRUZUXSA9IGVsZW1bQ1VSUkVOVF9TVFlMRV1bTEVGVF07XG5cbiAgICAvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0XG4gICAgc3R5bGVbTEVGVF0gPSBuYW1lID09PSAnZm9udFNpemUnID8gJzFlbScgOiByZXQgfHwgMDtcbiAgICByZXQgPSBzdHlsZS5waXhlbExlZnQgKyBQWDtcblxuICAgIC8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXNcbiAgICBzdHlsZVtMRUZUXSA9IGxlZnQ7XG4gICAgZWxlbVtSVU5USU1FX1NUWUxFXVtMRUZUXSA9IHJzTGVmdDtcbiAgfVxuICByZXR1cm4gcmV0ID09PSAnJyA/ICdhdXRvJyA6IHJldDtcbn1cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICBnZXRDb21wdXRlZFN0eWxlWCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlID8gX2dldENvbXB1dGVkU3R5bGUgOiBfZ2V0Q29tcHV0ZWRTdHlsZUlFO1xufVxuZnVuY3Rpb24gZ2V0T2Zmc2V0RGlyZWN0aW9uKGRpciwgb3B0aW9uKSB7XG4gIGlmIChkaXIgPT09ICdsZWZ0Jykge1xuICAgIHJldHVybiBvcHRpb24udXNlQ3NzUmlnaHQgPyAncmlnaHQnIDogZGlyO1xuICB9XG4gIHJldHVybiBvcHRpb24udXNlQ3NzQm90dG9tID8gJ2JvdHRvbScgOiBkaXI7XG59XG5mdW5jdGlvbiBvcHBvc2l0ZU9mZnNldERpcmVjdGlvbihkaXIpIHtcbiAgaWYgKGRpciA9PT0gJ2xlZnQnKSB7XG4gICAgcmV0dXJuICdyaWdodCc7XG4gIH0gZWxzZSBpZiAoZGlyID09PSAncmlnaHQnKSB7XG4gICAgcmV0dXJuICdsZWZ0JztcbiAgfSBlbHNlIGlmIChkaXIgPT09ICd0b3AnKSB7XG4gICAgcmV0dXJuICdib3R0b20nO1xuICB9IGVsc2UgaWYgKGRpciA9PT0gJ2JvdHRvbScpIHtcbiAgICByZXR1cm4gJ3RvcCc7XG4gIH1cbn1cblxuLy8g6K6+572uIGVsZW0g55u45a+5IGVsZW0ub3duZXJEb2N1bWVudCDnmoTlnZDmoIdcbmZ1bmN0aW9uIHNldExlZnRUb3AoZWxlbSwgb2Zmc2V0LCBvcHRpb24pIHtcbiAgLy8gc2V0IHBvc2l0aW9uIGZpcnN0LCBpbi1jYXNlIHRvcC9sZWZ0IGFyZSBzZXQgZXZlbiBvbiBzdGF0aWMgZWxlbVxuICBpZiAoY3NzKGVsZW0sICdwb3NpdGlvbicpID09PSAnc3RhdGljJykge1xuICAgIGVsZW0uc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICB9XG4gIHZhciBwcmVzZXRIID0gLTk5OTtcbiAgdmFyIHByZXNldFYgPSAtOTk5O1xuICB2YXIgaG9yaXpvbnRhbFByb3BlcnR5ID0gZ2V0T2Zmc2V0RGlyZWN0aW9uKCdsZWZ0Jywgb3B0aW9uKTtcbiAgdmFyIHZlcnRpY2FsUHJvcGVydHkgPSBnZXRPZmZzZXREaXJlY3Rpb24oJ3RvcCcsIG9wdGlvbik7XG4gIHZhciBvcHBvc2l0ZUhvcml6b250YWxQcm9wZXJ0eSA9IG9wcG9zaXRlT2Zmc2V0RGlyZWN0aW9uKGhvcml6b250YWxQcm9wZXJ0eSk7XG4gIHZhciBvcHBvc2l0ZVZlcnRpY2FsUHJvcGVydHkgPSBvcHBvc2l0ZU9mZnNldERpcmVjdGlvbih2ZXJ0aWNhbFByb3BlcnR5KTtcbiAgaWYgKGhvcml6b250YWxQcm9wZXJ0eSAhPT0gJ2xlZnQnKSB7XG4gICAgcHJlc2V0SCA9IDk5OTtcbiAgfVxuICBpZiAodmVydGljYWxQcm9wZXJ0eSAhPT0gJ3RvcCcpIHtcbiAgICBwcmVzZXRWID0gOTk5O1xuICB9XG4gIHZhciBvcmlnaW5hbFRyYW5zaXRpb24gPSAnJztcbiAgdmFyIG9yaWdpbmFsT2Zmc2V0ID0gZ2V0T2Zmc2V0KGVsZW0pO1xuICBpZiAoJ2xlZnQnIGluIG9mZnNldCB8fCAndG9wJyBpbiBvZmZzZXQpIHtcbiAgICBvcmlnaW5hbFRyYW5zaXRpb24gPSBnZXRUcmFuc2l0aW9uUHJvcGVydHkoZWxlbSkgfHwgJyc7XG4gICAgc2V0VHJhbnNpdGlvblByb3BlcnR5KGVsZW0sICdub25lJyk7XG4gIH1cbiAgaWYgKCdsZWZ0JyBpbiBvZmZzZXQpIHtcbiAgICBlbGVtLnN0eWxlW29wcG9zaXRlSG9yaXpvbnRhbFByb3BlcnR5XSA9ICcnO1xuICAgIGVsZW0uc3R5bGVbaG9yaXpvbnRhbFByb3BlcnR5XSA9IFwiXCIuY29uY2F0KHByZXNldEgsIFwicHhcIik7XG4gIH1cbiAgaWYgKCd0b3AnIGluIG9mZnNldCkge1xuICAgIGVsZW0uc3R5bGVbb3Bwb3NpdGVWZXJ0aWNhbFByb3BlcnR5XSA9ICcnO1xuICAgIGVsZW0uc3R5bGVbdmVydGljYWxQcm9wZXJ0eV0gPSBcIlwiLmNvbmNhdChwcmVzZXRWLCBcInB4XCIpO1xuICB9XG4gIC8vIGZvcmNlIHJlbGF5b3V0XG4gIGZvcmNlUmVsYXlvdXQoZWxlbSk7XG4gIHZhciBvbGQgPSBnZXRPZmZzZXQoZWxlbSk7XG4gIHZhciBvcmlnaW5hbFN0eWxlID0ge307XG4gIGZvciAodmFyIGtleSBpbiBvZmZzZXQpIHtcbiAgICBpZiAob2Zmc2V0Lmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIHZhciBkaXIgPSBnZXRPZmZzZXREaXJlY3Rpb24oa2V5LCBvcHRpb24pO1xuICAgICAgdmFyIHByZXNldCA9IGtleSA9PT0gJ2xlZnQnID8gcHJlc2V0SCA6IHByZXNldFY7XG4gICAgICB2YXIgb2ZmID0gb3JpZ2luYWxPZmZzZXRba2V5XSAtIG9sZFtrZXldO1xuICAgICAgaWYgKGRpciA9PT0ga2V5KSB7XG4gICAgICAgIG9yaWdpbmFsU3R5bGVbZGlyXSA9IHByZXNldCArIG9mZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9yaWdpbmFsU3R5bGVbZGlyXSA9IHByZXNldCAtIG9mZjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY3NzKGVsZW0sIG9yaWdpbmFsU3R5bGUpO1xuICAvLyBmb3JjZSByZWxheW91dFxuICBmb3JjZVJlbGF5b3V0KGVsZW0pO1xuICBpZiAoJ2xlZnQnIGluIG9mZnNldCB8fCAndG9wJyBpbiBvZmZzZXQpIHtcbiAgICBzZXRUcmFuc2l0aW9uUHJvcGVydHkoZWxlbSwgb3JpZ2luYWxUcmFuc2l0aW9uKTtcbiAgfVxuICB2YXIgcmV0ID0ge307XG4gIGZvciAodmFyIF9rZXkgaW4gb2Zmc2V0KSB7XG4gICAgaWYgKG9mZnNldC5oYXNPd25Qcm9wZXJ0eShfa2V5KSkge1xuICAgICAgdmFyIF9kaXIgPSBnZXRPZmZzZXREaXJlY3Rpb24oX2tleSwgb3B0aW9uKTtcbiAgICAgIHZhciBfb2ZmID0gb2Zmc2V0W19rZXldIC0gb3JpZ2luYWxPZmZzZXRbX2tleV07XG4gICAgICBpZiAoX2tleSA9PT0gX2Rpcikge1xuICAgICAgICByZXRbX2Rpcl0gPSBvcmlnaW5hbFN0eWxlW19kaXJdICsgX29mZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldFtfZGlyXSA9IG9yaWdpbmFsU3R5bGVbX2Rpcl0gLSBfb2ZmO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjc3MoZWxlbSwgcmV0KTtcbn1cbmZ1bmN0aW9uIHNldFRyYW5zZm9ybSQxKGVsZW0sIG9mZnNldCkge1xuICB2YXIgb3JpZ2luYWxPZmZzZXQgPSBnZXRPZmZzZXQoZWxlbSk7XG4gIHZhciBvcmlnaW5hbFhZID0gZ2V0VHJhbnNmb3JtWFkoZWxlbSk7XG4gIHZhciByZXN1bHRYWSA9IHtcbiAgICB4OiBvcmlnaW5hbFhZLngsXG4gICAgeTogb3JpZ2luYWxYWS55XG4gIH07XG4gIGlmICgnbGVmdCcgaW4gb2Zmc2V0KSB7XG4gICAgcmVzdWx0WFkueCA9IG9yaWdpbmFsWFkueCArIG9mZnNldC5sZWZ0IC0gb3JpZ2luYWxPZmZzZXQubGVmdDtcbiAgfVxuICBpZiAoJ3RvcCcgaW4gb2Zmc2V0KSB7XG4gICAgcmVzdWx0WFkueSA9IG9yaWdpbmFsWFkueSArIG9mZnNldC50b3AgLSBvcmlnaW5hbE9mZnNldC50b3A7XG4gIH1cbiAgc2V0VHJhbnNmb3JtWFkoZWxlbSwgcmVzdWx0WFkpO1xufVxuZnVuY3Rpb24gc2V0T2Zmc2V0KGVsZW0sIG9mZnNldCwgb3B0aW9uKSB7XG4gIGlmIChvcHRpb24uaWdub3JlU2hha2UpIHtcbiAgICB2YXIgb3JpT2Zmc2V0ID0gZ2V0T2Zmc2V0KGVsZW0pO1xuICAgIHZhciBvTGVmdCA9IG9yaU9mZnNldC5sZWZ0LnRvRml4ZWQoMCk7XG4gICAgdmFyIG9Ub3AgPSBvcmlPZmZzZXQudG9wLnRvRml4ZWQoMCk7XG4gICAgdmFyIHRMZWZ0ID0gb2Zmc2V0LmxlZnQudG9GaXhlZCgwKTtcbiAgICB2YXIgdFRvcCA9IG9mZnNldC50b3AudG9GaXhlZCgwKTtcbiAgICBpZiAob0xlZnQgPT09IHRMZWZ0ICYmIG9Ub3AgPT09IHRUb3ApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgaWYgKG9wdGlvbi51c2VDc3NSaWdodCB8fCBvcHRpb24udXNlQ3NzQm90dG9tKSB7XG4gICAgc2V0TGVmdFRvcChlbGVtLCBvZmZzZXQsIG9wdGlvbik7XG4gIH0gZWxzZSBpZiAob3B0aW9uLnVzZUNzc1RyYW5zZm9ybSAmJiBnZXRUcmFuc2Zvcm1OYW1lKCkgaW4gZG9jdW1lbnQuYm9keS5zdHlsZSkge1xuICAgIHNldFRyYW5zZm9ybSQxKGVsZW0sIG9mZnNldCk7XG4gIH0gZWxzZSB7XG4gICAgc2V0TGVmdFRvcChlbGVtLCBvZmZzZXQsIG9wdGlvbik7XG4gIH1cbn1cbmZ1bmN0aW9uIGVhY2goYXJyLCBmbikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIGZuKGFycltpXSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzQm9yZGVyQm94Rm4oZWxlbSkge1xuICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZVgoZWxlbSwgJ2JveFNpemluZycpID09PSAnYm9yZGVyLWJveCc7XG59XG52YXIgQk9YX01PREVMUyA9IFsnbWFyZ2luJywgJ2JvcmRlcicsICdwYWRkaW5nJ107XG52YXIgQ09OVEVOVF9JTkRFWCA9IC0xO1xudmFyIFBBRERJTkdfSU5ERVggPSAyO1xudmFyIEJPUkRFUl9JTkRFWCA9IDE7XG52YXIgTUFSR0lOX0lOREVYID0gMDtcbmZ1bmN0aW9uIHN3YXAoZWxlbSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIG9sZCA9IHt9O1xuICB2YXIgc3R5bGUgPSBlbGVtLnN0eWxlO1xuICB2YXIgbmFtZTtcblxuICAvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXNcbiAgZm9yIChuYW1lIGluIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgb2xkW25hbWVdID0gc3R5bGVbbmFtZV07XG4gICAgICBzdHlsZVtuYW1lXSA9IG9wdGlvbnNbbmFtZV07XG4gICAgfVxuICB9XG4gIGNhbGxiYWNrLmNhbGwoZWxlbSk7XG5cbiAgLy8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzXG4gIGZvciAobmFtZSBpbiBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIHN0eWxlW25hbWVdID0gb2xkW25hbWVdO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZ2V0UEJNV2lkdGgoZWxlbSwgcHJvcHMsIHdoaWNoKSB7XG4gIHZhciB2YWx1ZSA9IDA7XG4gIHZhciBwcm9wO1xuICB2YXIgajtcbiAgdmFyIGk7XG4gIGZvciAoaiA9IDA7IGogPCBwcm9wcy5sZW5ndGg7IGorKykge1xuICAgIHByb3AgPSBwcm9wc1tqXTtcbiAgICBpZiAocHJvcCkge1xuICAgICAgZm9yIChpID0gMDsgaSA8IHdoaWNoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjc3NQcm9wID0gdm9pZCAwO1xuICAgICAgICBpZiAocHJvcCA9PT0gJ2JvcmRlcicpIHtcbiAgICAgICAgICBjc3NQcm9wID0gXCJcIi5jb25jYXQocHJvcCkuY29uY2F0KHdoaWNoW2ldLCBcIldpZHRoXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNzc1Byb3AgPSBwcm9wICsgd2hpY2hbaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgKz0gcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlWChlbGVtLCBjc3NQcm9wKSkgfHwgMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxudmFyIGRvbVV0aWxzID0ge1xuICBnZXRQYXJlbnQ6IGZ1bmN0aW9uIGdldFBhcmVudChlbGVtZW50KSB7XG4gICAgdmFyIHBhcmVudCA9IGVsZW1lbnQ7XG4gICAgZG8ge1xuICAgICAgaWYgKHBhcmVudC5ub2RlVHlwZSA9PT0gMTEgJiYgcGFyZW50Lmhvc3QpIHtcbiAgICAgICAgcGFyZW50ID0gcGFyZW50Lmhvc3Q7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTtcbiAgICAgIH1cbiAgICB9IHdoaWxlIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAxICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gOSk7XG4gICAgcmV0dXJuIHBhcmVudDtcbiAgfVxufTtcbmVhY2goWydXaWR0aCcsICdIZWlnaHQnXSwgZnVuY3Rpb24gKG5hbWUpIHtcbiAgZG9tVXRpbHNbXCJkb2NcIi5jb25jYXQobmFtZSldID0gZnVuY3Rpb24gKHJlZldpbikge1xuICAgIHZhciBkID0gcmVmV2luLmRvY3VtZW50O1xuICAgIHJldHVybiBNYXRoLm1heChcbiAgICAvLyBmaXJlZm94IGNocm9tZSBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0PCBib2R5LnNjcm9sbEhlaWdodFxuICAgIC8vIGllIHN0YW5kYXJkIG1vZGUgOiBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0PiBib2R5LnNjcm9sbEhlaWdodFxuICAgIGQuZG9jdW1lbnRFbGVtZW50W1wic2Nyb2xsXCIuY29uY2F0KG5hbWUpXSxcbiAgICAvLyBxdWlya3MgOiBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IOacgOWkp+etieS6juWPr+inhueql+WPo+WkmuS4gOeCue+8n1xuICAgIGQuYm9keVtcInNjcm9sbFwiLmNvbmNhdChuYW1lKV0sIGRvbVV0aWxzW1widmlld3BvcnRcIi5jb25jYXQobmFtZSldKGQpKTtcbiAgfTtcbiAgZG9tVXRpbHNbXCJ2aWV3cG9ydFwiLmNvbmNhdChuYW1lKV0gPSBmdW5jdGlvbiAod2luKSB7XG4gICAgLy8gcGMgYnJvd3NlciBpbmNsdWRlcyBzY3JvbGxiYXIgaW4gd2luZG93LmlubmVyV2lkdGhcbiAgICB2YXIgcHJvcCA9IFwiY2xpZW50XCIuY29uY2F0KG5hbWUpO1xuICAgIHZhciBkb2MgPSB3aW4uZG9jdW1lbnQ7XG4gICAgdmFyIGJvZHkgPSBkb2MuYm9keTtcbiAgICB2YXIgZG9jdW1lbnRFbGVtZW50ID0gZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICB2YXIgZG9jdW1lbnRFbGVtZW50UHJvcCA9IGRvY3VtZW50RWxlbWVudFtwcm9wXTtcbiAgICAvLyDmoIflh4bmqKHlvI/lj5YgZG9jdW1lbnRFbGVtZW50XG4gICAgLy8gYmFja2NvbXBhdCDlj5YgYm9keVxuICAgIHJldHVybiBkb2MuY29tcGF0TW9kZSA9PT0gJ0NTUzFDb21wYXQnICYmIGRvY3VtZW50RWxlbWVudFByb3AgfHwgYm9keSAmJiBib2R5W3Byb3BdIHx8IGRvY3VtZW50RWxlbWVudFByb3A7XG4gIH07XG59KTtcblxuLypcbiDlvpfliLDlhYPntKDnmoTlpKflsI/kv6Hmga9cbiBAcGFyYW0gZWxlbVxuIEBwYXJhbSBuYW1lXG4gQHBhcmFtIHtTdHJpbmd9IFtleHRyYV0gICdwYWRkaW5nJyA6IChjc3Mgd2lkdGgpICsgcGFkZGluZ1xuICdib3JkZXInIDogKGNzcyB3aWR0aCkgKyBwYWRkaW5nICsgYm9yZGVyXG4gJ21hcmdpbicgOiAoY3NzIHdpZHRoKSArIHBhZGRpbmcgKyBib3JkZXIgKyBtYXJnaW5cbiAqL1xuZnVuY3Rpb24gZ2V0V0goZWxlbSwgbmFtZSwgZXgpIHtcbiAgdmFyIGV4dHJhID0gZXg7XG4gIGlmIChpc1dpbmRvdyhlbGVtKSkge1xuICAgIHJldHVybiBuYW1lID09PSAnd2lkdGgnID8gZG9tVXRpbHMudmlld3BvcnRXaWR0aChlbGVtKSA6IGRvbVV0aWxzLnZpZXdwb3J0SGVpZ2h0KGVsZW0pO1xuICB9IGVsc2UgaWYgKGVsZW0ubm9kZVR5cGUgPT09IDkpIHtcbiAgICByZXR1cm4gbmFtZSA9PT0gJ3dpZHRoJyA/IGRvbVV0aWxzLmRvY1dpZHRoKGVsZW0pIDogZG9tVXRpbHMuZG9jSGVpZ2h0KGVsZW0pO1xuICB9XG4gIHZhciB3aGljaCA9IG5hbWUgPT09ICd3aWR0aCcgPyBbJ0xlZnQnLCAnUmlnaHQnXSA6IFsnVG9wJywgJ0JvdHRvbSddO1xuICB2YXIgYm9yZGVyQm94VmFsdWUgPSBuYW1lID09PSAnd2lkdGgnID8gTWF0aC5mbG9vcihlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKSA6IE1hdGguZmxvb3IoZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpO1xuICB2YXIgaXNCb3JkZXJCb3ggPSBpc0JvcmRlckJveEZuKGVsZW0pO1xuICB2YXIgY3NzQm94VmFsdWUgPSAwO1xuICBpZiAoYm9yZGVyQm94VmFsdWUgPT09IG51bGwgfHwgYm9yZGVyQm94VmFsdWUgPT09IHVuZGVmaW5lZCB8fCBib3JkZXJCb3hWYWx1ZSA8PSAwKSB7XG4gICAgYm9yZGVyQm94VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgLy8gRmFsbCBiYWNrIHRvIGNvbXB1dGVkIHRoZW4gdW4gY29tcHV0ZWQgY3NzIGlmIG5lY2Vzc2FyeVxuICAgIGNzc0JveFZhbHVlID0gZ2V0Q29tcHV0ZWRTdHlsZVgoZWxlbSwgbmFtZSk7XG4gICAgaWYgKGNzc0JveFZhbHVlID09PSBudWxsIHx8IGNzc0JveFZhbHVlID09PSB1bmRlZmluZWQgfHwgTnVtYmVyKGNzc0JveFZhbHVlKSA8IDApIHtcbiAgICAgIGNzc0JveFZhbHVlID0gZWxlbS5zdHlsZVtuYW1lXSB8fCAwO1xuICAgIH1cbiAgICAvLyBOb3JtYWxpemUgJycsIGF1dG8sIGFuZCBwcmVwYXJlIGZvciBleHRyYVxuICAgIGNzc0JveFZhbHVlID0gTWF0aC5mbG9vcihwYXJzZUZsb2F0KGNzc0JveFZhbHVlKSkgfHwgMDtcbiAgfVxuICBpZiAoZXh0cmEgPT09IHVuZGVmaW5lZCkge1xuICAgIGV4dHJhID0gaXNCb3JkZXJCb3ggPyBCT1JERVJfSU5ERVggOiBDT05URU5UX0lOREVYO1xuICB9XG4gIHZhciBib3JkZXJCb3hWYWx1ZU9ySXNCb3JkZXJCb3ggPSBib3JkZXJCb3hWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8IGlzQm9yZGVyQm94O1xuICB2YXIgdmFsID0gYm9yZGVyQm94VmFsdWUgfHwgY3NzQm94VmFsdWU7XG4gIGlmIChleHRyYSA9PT0gQ09OVEVOVF9JTkRFWCkge1xuICAgIGlmIChib3JkZXJCb3hWYWx1ZU9ySXNCb3JkZXJCb3gpIHtcbiAgICAgIHJldHVybiB2YWwgLSBnZXRQQk1XaWR0aChlbGVtLCBbJ2JvcmRlcicsICdwYWRkaW5nJ10sIHdoaWNoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNzc0JveFZhbHVlO1xuICB9IGVsc2UgaWYgKGJvcmRlckJveFZhbHVlT3JJc0JvcmRlckJveCkge1xuICAgIGlmIChleHRyYSA9PT0gQk9SREVSX0lOREVYKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gdmFsICsgKGV4dHJhID09PSBQQURESU5HX0lOREVYID8gLWdldFBCTVdpZHRoKGVsZW0sIFsnYm9yZGVyJ10sIHdoaWNoKSA6IGdldFBCTVdpZHRoKGVsZW0sIFsnbWFyZ2luJ10sIHdoaWNoKSk7XG4gIH1cbiAgcmV0dXJuIGNzc0JveFZhbHVlICsgZ2V0UEJNV2lkdGgoZWxlbSwgQk9YX01PREVMUy5zbGljZShleHRyYSksIHdoaWNoKTtcbn1cbnZhciBjc3NTaG93ID0ge1xuICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgdmlzaWJpbGl0eTogJ2hpZGRlbicsXG4gIGRpc3BsYXk6ICdibG9jaydcbn07XG5cbi8vIGZpeCAjMTE5IDogaHR0cHM6Ly9naXRodWIuY29tL2tpc3N5dGVhbS9raXNzeS9pc3N1ZXMvMTE5XG5mdW5jdGlvbiBnZXRXSElnbm9yZURpc3BsYXkoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjsgX2tleTIrKykge1xuICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgfVxuICB2YXIgdmFsO1xuICB2YXIgZWxlbSA9IGFyZ3NbMF07XG4gIC8vIGluIGNhc2UgZWxlbSBpcyB3aW5kb3dcbiAgLy8gZWxlbS5vZmZzZXRXaWR0aCA9PT0gdW5kZWZpbmVkXG4gIGlmIChlbGVtLm9mZnNldFdpZHRoICE9PSAwKSB7XG4gICAgdmFsID0gZ2V0V0guYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICBzd2FwKGVsZW0sIGNzc1Nob3csIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhbCA9IGdldFdILmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbDtcbn1cbmVhY2goWyd3aWR0aCcsICdoZWlnaHQnXSwgZnVuY3Rpb24gKG5hbWUpIHtcbiAgdmFyIGZpcnN0ID0gbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSk7XG4gIGRvbVV0aWxzW1wib3V0ZXJcIi5jb25jYXQoZmlyc3QpXSA9IGZ1bmN0aW9uIChlbCwgaW5jbHVkZU1hcmdpbikge1xuICAgIHJldHVybiBlbCAmJiBnZXRXSElnbm9yZURpc3BsYXkoZWwsIG5hbWUsIGluY2x1ZGVNYXJnaW4gPyBNQVJHSU5fSU5ERVggOiBCT1JERVJfSU5ERVgpO1xuICB9O1xuICB2YXIgd2hpY2ggPSBuYW1lID09PSAnd2lkdGgnID8gWydMZWZ0JywgJ1JpZ2h0J10gOiBbJ1RvcCcsICdCb3R0b20nXTtcbiAgZG9tVXRpbHNbbmFtZV0gPSBmdW5jdGlvbiAoZWxlbSwgdikge1xuICAgIHZhciB2YWwgPSB2O1xuICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGVsZW0pIHtcbiAgICAgICAgdmFyIGlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3hGbihlbGVtKTtcbiAgICAgICAgaWYgKGlzQm9yZGVyQm94KSB7XG4gICAgICAgICAgdmFsICs9IGdldFBCTVdpZHRoKGVsZW0sIFsncGFkZGluZycsICdib3JkZXInXSwgd2hpY2gpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjc3MoZWxlbSwgbmFtZSwgdmFsKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBlbGVtICYmIGdldFdISWdub3JlRGlzcGxheShlbGVtLCBuYW1lLCBDT05URU5UX0lOREVYKTtcbiAgfTtcbn0pO1xuZnVuY3Rpb24gbWl4KHRvLCBmcm9tKSB7XG4gIGZvciAodmFyIGkgaW4gZnJvbSkge1xuICAgIGlmIChmcm9tLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICB0b1tpXSA9IGZyb21baV07XG4gICAgfVxuICB9XG4gIHJldHVybiB0bztcbn1cbnZhciB1dGlscyA9IHtcbiAgZ2V0V2luZG93OiBmdW5jdGlvbiBnZXRXaW5kb3cobm9kZSkge1xuICAgIGlmIChub2RlICYmIG5vZGUuZG9jdW1lbnQgJiYgbm9kZS5zZXRUaW1lb3V0KSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgdmFyIGRvYyA9IG5vZGUub3duZXJEb2N1bWVudCB8fCBub2RlO1xuICAgIHJldHVybiBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgfSxcbiAgZ2V0RG9jdW1lbnQ6IGdldERvY3VtZW50LFxuICBvZmZzZXQ6IGZ1bmN0aW9uIG9mZnNldChlbCwgdmFsdWUsIG9wdGlvbikge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBzZXRPZmZzZXQoZWwsIHZhbHVlLCBvcHRpb24gfHwge30pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0T2Zmc2V0KGVsKTtcbiAgICB9XG4gIH0sXG4gIGlzV2luZG93OiBpc1dpbmRvdyxcbiAgZWFjaDogZWFjaCxcbiAgY3NzOiBjc3MsXG4gIGNsb25lOiBmdW5jdGlvbiBjbG9uZShvYmopIHtcbiAgICB2YXIgaTtcbiAgICB2YXIgcmV0ID0ge307XG4gICAgZm9yIChpIGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICByZXRbaV0gPSBvYmpbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBvdmVyZmxvdyA9IG9iai5vdmVyZmxvdztcbiAgICBpZiAob3ZlcmZsb3cpIHtcbiAgICAgIGZvciAoaSBpbiBvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgIHJldC5vdmVyZmxvd1tpXSA9IG9iai5vdmVyZmxvd1tpXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9LFxuICBtaXg6IG1peCxcbiAgZ2V0V2luZG93U2Nyb2xsTGVmdDogZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsTGVmdCh3KSB7XG4gICAgcmV0dXJuIGdldFNjcm9sbExlZnQodyk7XG4gIH0sXG4gIGdldFdpbmRvd1Njcm9sbFRvcDogZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsVG9wKHcpIHtcbiAgICByZXR1cm4gZ2V0U2Nyb2xsVG9wKHcpO1xuICB9LFxuICBtZXJnZTogZnVuY3Rpb24gbWVyZ2UoKSB7XG4gICAgdmFyIHJldCA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB1dGlscy5taXgocmV0LCBpIDwgMCB8fCBhcmd1bWVudHMubGVuZ3RoIDw9IGkgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9LFxuICB2aWV3cG9ydFdpZHRoOiAwLFxuICB2aWV3cG9ydEhlaWdodDogMFxufTtcbm1peCh1dGlscywgZG9tVXRpbHMpO1xuXG4vKipcbiAqIOW+l+WIsOS8muWvvOiHtOWFg+e0oOaYvuekuuS4jeWFqOeahOelluWFiOWFg+e0oFxuICovXG52YXIgZ2V0UGFyZW50ID0gdXRpbHMuZ2V0UGFyZW50O1xuZnVuY3Rpb24gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgaWYgKHV0aWxzLmlzV2luZG93KGVsZW1lbnQpIHx8IGVsZW1lbnQubm9kZVR5cGUgPT09IDkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBpZSDov5nkuKrkuZ/kuI3mmK/lrozlhajlj6/ooYxcbiAgLypcbiAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogNTBweDtoZWlnaHQ6IDEwMHB4O292ZXJmbG93OiBoaWRkZW5cIj5cbiAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogNTBweDtoZWlnaHQ6IDEwMHB4O3Bvc2l0aW9uOiByZWxhdGl2ZTtcIiBpZD1cImQ2XCI+XG4gICDlhYPntKAgNiDpq5ggMTAwcHgg5a69IDUwcHg8YnIvPlxuICAgPC9kaXY+XG4gICA8L2Rpdj5cbiAgICovXG4gIC8vIGVsZW1lbnQub2Zmc2V0UGFyZW50IGRvZXMgdGhlIHJpZ2h0IHRoaW5nIGluIGllNyBhbmQgYmVsb3cuIFJldHVybiBwYXJlbnQgd2l0aCBsYXlvdXQhXG4gIC8vICBJbiBvdGhlciBicm93c2VycyBpdCBvbmx5IGluY2x1ZGVzIGVsZW1lbnRzIHdpdGggcG9zaXRpb24gYWJzb2x1dGUsIHJlbGF0aXZlIG9yXG4gIC8vIGZpeGVkLCBub3QgZWxlbWVudHMgd2l0aCBvdmVyZmxvdyBzZXQgdG8gYXV0byBvciBzY3JvbGwuXG4gIC8vICAgICAgICBpZiAoVUEuaWUgJiYgaWVNb2RlIDwgOCkge1xuICAvLyAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDtcbiAgLy8gICAgICAgIH1cbiAgLy8g57uf5LiA55qEIG9mZnNldFBhcmVudCDmlrnms5VcbiAgdmFyIGRvYyA9IHV0aWxzLmdldERvY3VtZW50KGVsZW1lbnQpO1xuICB2YXIgYm9keSA9IGRvYy5ib2R5O1xuICB2YXIgcGFyZW50O1xuICB2YXIgcG9zaXRpb25TdHlsZSA9IHV0aWxzLmNzcyhlbGVtZW50LCAncG9zaXRpb24nKTtcbiAgdmFyIHNraXBTdGF0aWMgPSBwb3NpdGlvblN0eWxlID09PSAnZml4ZWQnIHx8IHBvc2l0aW9uU3R5bGUgPT09ICdhYnNvbHV0ZSc7XG4gIGlmICghc2tpcFN0YXRpYykge1xuICAgIHJldHVybiBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdodG1sJyA/IG51bGwgOiBnZXRQYXJlbnQoZWxlbWVudCk7XG4gIH1cbiAgZm9yIChwYXJlbnQgPSBnZXRQYXJlbnQoZWxlbWVudCk7IHBhcmVudCAmJiBwYXJlbnQgIT09IGJvZHkgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSA5OyBwYXJlbnQgPSBnZXRQYXJlbnQocGFyZW50KSkge1xuICAgIHBvc2l0aW9uU3R5bGUgPSB1dGlscy5jc3MocGFyZW50LCAncG9zaXRpb24nKTtcbiAgICBpZiAocG9zaXRpb25TdHlsZSAhPT0gJ3N0YXRpYycpIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgZ2V0UGFyZW50JDEgPSB1dGlscy5nZXRQYXJlbnQ7XG5mdW5jdGlvbiBpc0FuY2VzdG9yRml4ZWQoZWxlbWVudCkge1xuICBpZiAodXRpbHMuaXNXaW5kb3coZWxlbWVudCkgfHwgZWxlbWVudC5ub2RlVHlwZSA9PT0gOSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgZG9jID0gdXRpbHMuZ2V0RG9jdW1lbnQoZWxlbWVudCk7XG4gIHZhciBib2R5ID0gZG9jLmJvZHk7XG4gIHZhciBwYXJlbnQgPSBudWxsO1xuICBmb3IgKHBhcmVudCA9IGdldFBhcmVudCQxKGVsZW1lbnQpO1xuICAvLyDkv67lpI3lhYPntKDkvY3kuo4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IOS4i+WvvOiHtOW0qea6g+mXrumimFxuICBwYXJlbnQgJiYgcGFyZW50ICE9PSBib2R5ICYmIHBhcmVudCAhPT0gZG9jOyBwYXJlbnQgPSBnZXRQYXJlbnQkMShwYXJlbnQpKSB7XG4gICAgdmFyIHBvc2l0aW9uU3R5bGUgPSB1dGlscy5jc3MocGFyZW50LCAncG9zaXRpb24nKTtcbiAgICBpZiAocG9zaXRpb25TdHlsZSA9PT0gJ2ZpeGVkJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiDojrflvpflhYPntKDnmoTmmL7npLrpg6jliIbnmoTljLrln59cbiAqL1xuZnVuY3Rpb24gZ2V0VmlzaWJsZVJlY3RGb3JFbGVtZW50KGVsZW1lbnQsIGFsd2F5c0J5Vmlld3BvcnQpIHtcbiAgdmFyIHZpc2libGVSZWN0ID0ge1xuICAgIGxlZnQ6IDAsXG4gICAgcmlnaHQ6IEluZmluaXR5LFxuICAgIHRvcDogMCxcbiAgICBib3R0b206IEluZmluaXR5XG4gIH07XG4gIHZhciBlbCA9IGdldE9mZnNldFBhcmVudChlbGVtZW50KTtcbiAgdmFyIGRvYyA9IHV0aWxzLmdldERvY3VtZW50KGVsZW1lbnQpO1xuICB2YXIgd2luID0gZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3c7XG4gIHZhciBib2R5ID0gZG9jLmJvZHk7XG4gIHZhciBkb2N1bWVudEVsZW1lbnQgPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXG4gIC8vIERldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgdmlzaWJsZSByZWN0IGJ5IGNsaW1iaW5nIHRoZSBkb20gYWNjb3VudGluZyBmb3JcbiAgLy8gYWxsIHNjcm9sbGFibGUgY29udGFpbmVycy5cbiAgd2hpbGUgKGVsKSB7XG4gICAgLy8gY2xpZW50V2lkdGggaXMgemVybyBmb3IgaW5saW5lIGJsb2NrIGVsZW1lbnRzIGluIGllLlxuICAgIGlmICgobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNU0lFJykgPT09IC0xIHx8IGVsLmNsaWVudFdpZHRoICE9PSAwKSAmJlxuICAgIC8vIGJvZHkgbWF5IGhhdmUgb3ZlcmZsb3cgc2V0IG9uIGl0LCB5ZXQgd2Ugc3RpbGwgZ2V0IHRoZSBlbnRpcmVcbiAgICAvLyB2aWV3cG9ydC4gSW4gc29tZSBicm93c2VycywgZWwub2Zmc2V0UGFyZW50IG1heSBiZVxuICAgIC8vIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgc28gY2hlY2sgZm9yIHRoYXQgdG9vLlxuICAgIGVsICE9PSBib2R5ICYmIGVsICE9PSBkb2N1bWVudEVsZW1lbnQgJiYgdXRpbHMuY3NzKGVsLCAnb3ZlcmZsb3cnKSAhPT0gJ3Zpc2libGUnKSB7XG4gICAgICB2YXIgcG9zID0gdXRpbHMub2Zmc2V0KGVsKTtcbiAgICAgIC8vIGFkZCBib3JkZXJcbiAgICAgIHBvcy5sZWZ0ICs9IGVsLmNsaWVudExlZnQ7XG4gICAgICBwb3MudG9wICs9IGVsLmNsaWVudFRvcDtcbiAgICAgIHZpc2libGVSZWN0LnRvcCA9IE1hdGgubWF4KHZpc2libGVSZWN0LnRvcCwgcG9zLnRvcCk7XG4gICAgICB2aXNpYmxlUmVjdC5yaWdodCA9IE1hdGgubWluKHZpc2libGVSZWN0LnJpZ2h0LFxuICAgICAgLy8gY29uc2lkZXIgYXJlYSB3aXRob3V0IHNjcm9sbEJhclxuICAgICAgcG9zLmxlZnQgKyBlbC5jbGllbnRXaWR0aCk7XG4gICAgICB2aXNpYmxlUmVjdC5ib3R0b20gPSBNYXRoLm1pbih2aXNpYmxlUmVjdC5ib3R0b20sIHBvcy50b3AgKyBlbC5jbGllbnRIZWlnaHQpO1xuICAgICAgdmlzaWJsZVJlY3QubGVmdCA9IE1hdGgubWF4KHZpc2libGVSZWN0LmxlZnQsIHBvcy5sZWZ0KTtcbiAgICB9IGVsc2UgaWYgKGVsID09PSBib2R5IHx8IGVsID09PSBkb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBlbCA9IGdldE9mZnNldFBhcmVudChlbCk7XG4gIH1cblxuICAvLyBTZXQgZWxlbWVudCBwb3NpdGlvbiB0byBmaXhlZFxuICAvLyBtYWtlIHN1cmUgYWJzb2x1dGUgZWxlbWVudCBpdHNlbGYgZG9uJ3QgYWZmZWN0IGl0J3MgdmlzaWJsZSBhcmVhXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzc2MDFcbiAgdmFyIG9yaWdpbmFsUG9zaXRpb24gPSBudWxsO1xuICBpZiAoIXV0aWxzLmlzV2luZG93KGVsZW1lbnQpICYmIGVsZW1lbnQubm9kZVR5cGUgIT09IDkpIHtcbiAgICBvcmlnaW5hbFBvc2l0aW9uID0gZWxlbWVudC5zdHlsZS5wb3NpdGlvbjtcbiAgICB2YXIgcG9zaXRpb24gPSB1dGlscy5jc3MoZWxlbWVudCwgJ3Bvc2l0aW9uJyk7XG4gICAgaWYgKHBvc2l0aW9uID09PSAnYWJzb2x1dGUnKSB7XG4gICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICB9XG4gIH1cbiAgdmFyIHNjcm9sbFggPSB1dGlscy5nZXRXaW5kb3dTY3JvbGxMZWZ0KHdpbik7XG4gIHZhciBzY3JvbGxZID0gdXRpbHMuZ2V0V2luZG93U2Nyb2xsVG9wKHdpbik7XG4gIHZhciB2aWV3cG9ydFdpZHRoID0gdXRpbHMudmlld3BvcnRXaWR0aCh3aW4pO1xuICB2YXIgdmlld3BvcnRIZWlnaHQgPSB1dGlscy52aWV3cG9ydEhlaWdodCh3aW4pO1xuICB2YXIgZG9jdW1lbnRXaWR0aCA9IGRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aDtcbiAgdmFyIGRvY3VtZW50SGVpZ2h0ID0gZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodDtcblxuICAvLyBzY3JvbGxYWFggb24gaHRtbCBpcyBzeW5jIHdpdGggYm9keSB3aGljaCBtZWFucyBvdmVyZmxvdzogaGlkZGVuIG9uIGJvZHkgZ2V0cyB3cm9uZyBzY3JvbGxYWFguXG4gIC8vIFdlIHNob3VsZCBjdXQgdGhpcyBvdXJzZWxmLlxuICB2YXIgYm9keVN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoYm9keSk7XG4gIGlmIChib2R5U3R5bGUub3ZlcmZsb3dYID09PSAnaGlkZGVuJykge1xuICAgIGRvY3VtZW50V2lkdGggPSB3aW4uaW5uZXJXaWR0aDtcbiAgfVxuICBpZiAoYm9keVN0eWxlLm92ZXJmbG93WSA9PT0gJ2hpZGRlbicpIHtcbiAgICBkb2N1bWVudEhlaWdodCA9IHdpbi5pbm5lckhlaWdodDtcbiAgfVxuXG4gIC8vIFJlc2V0IGVsZW1lbnQgcG9zaXRpb24gYWZ0ZXIgY2FsY3VsYXRlIHRoZSB2aXNpYmxlIGFyZWFcbiAgaWYgKGVsZW1lbnQuc3R5bGUpIHtcbiAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gb3JpZ2luYWxQb3NpdGlvbjtcbiAgfVxuICBpZiAoYWx3YXlzQnlWaWV3cG9ydCB8fCBpc0FuY2VzdG9yRml4ZWQoZWxlbWVudCkpIHtcbiAgICAvLyBDbGlwIGJ5IHZpZXdwb3J0J3Mgc2l6ZS5cbiAgICB2aXNpYmxlUmVjdC5sZWZ0ID0gTWF0aC5tYXgodmlzaWJsZVJlY3QubGVmdCwgc2Nyb2xsWCk7XG4gICAgdmlzaWJsZVJlY3QudG9wID0gTWF0aC5tYXgodmlzaWJsZVJlY3QudG9wLCBzY3JvbGxZKTtcbiAgICB2aXNpYmxlUmVjdC5yaWdodCA9IE1hdGgubWluKHZpc2libGVSZWN0LnJpZ2h0LCBzY3JvbGxYICsgdmlld3BvcnRXaWR0aCk7XG4gICAgdmlzaWJsZVJlY3QuYm90dG9tID0gTWF0aC5taW4odmlzaWJsZVJlY3QuYm90dG9tLCBzY3JvbGxZICsgdmlld3BvcnRIZWlnaHQpO1xuICB9IGVsc2Uge1xuICAgIC8vIENsaXAgYnkgZG9jdW1lbnQncyBzaXplLlxuICAgIHZhciBtYXhWaXNpYmxlV2lkdGggPSBNYXRoLm1heChkb2N1bWVudFdpZHRoLCBzY3JvbGxYICsgdmlld3BvcnRXaWR0aCk7XG4gICAgdmlzaWJsZVJlY3QucmlnaHQgPSBNYXRoLm1pbih2aXNpYmxlUmVjdC5yaWdodCwgbWF4VmlzaWJsZVdpZHRoKTtcbiAgICB2YXIgbWF4VmlzaWJsZUhlaWdodCA9IE1hdGgubWF4KGRvY3VtZW50SGVpZ2h0LCBzY3JvbGxZICsgdmlld3BvcnRIZWlnaHQpO1xuICAgIHZpc2libGVSZWN0LmJvdHRvbSA9IE1hdGgubWluKHZpc2libGVSZWN0LmJvdHRvbSwgbWF4VmlzaWJsZUhlaWdodCk7XG4gIH1cbiAgcmV0dXJuIHZpc2libGVSZWN0LnRvcCA+PSAwICYmIHZpc2libGVSZWN0LmxlZnQgPj0gMCAmJiB2aXNpYmxlUmVjdC5ib3R0b20gPiB2aXNpYmxlUmVjdC50b3AgJiYgdmlzaWJsZVJlY3QucmlnaHQgPiB2aXNpYmxlUmVjdC5sZWZ0ID8gdmlzaWJsZVJlY3QgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBhZGp1c3RGb3JWaWV3cG9ydChlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0LCBvdmVyZmxvdykge1xuICB2YXIgcG9zID0gdXRpbHMuY2xvbmUoZWxGdXR1cmVQb3MpO1xuICB2YXIgc2l6ZSA9IHtcbiAgICB3aWR0aDogZWxSZWdpb24ud2lkdGgsXG4gICAgaGVpZ2h0OiBlbFJlZ2lvbi5oZWlnaHRcbiAgfTtcbiAgaWYgKG92ZXJmbG93LmFkanVzdFggJiYgcG9zLmxlZnQgPCB2aXNpYmxlUmVjdC5sZWZ0KSB7XG4gICAgcG9zLmxlZnQgPSB2aXNpYmxlUmVjdC5sZWZ0O1xuICB9XG5cbiAgLy8gTGVmdCBlZGdlIGluc2lkZSBhbmQgcmlnaHQgZWRnZSBvdXRzaWRlIHZpZXdwb3J0LCB0cnkgdG8gcmVzaXplIGl0LlxuICBpZiAob3ZlcmZsb3cucmVzaXplV2lkdGggJiYgcG9zLmxlZnQgPj0gdmlzaWJsZVJlY3QubGVmdCAmJiBwb3MubGVmdCArIHNpemUud2lkdGggPiB2aXNpYmxlUmVjdC5yaWdodCkge1xuICAgIHNpemUud2lkdGggLT0gcG9zLmxlZnQgKyBzaXplLndpZHRoIC0gdmlzaWJsZVJlY3QucmlnaHQ7XG4gIH1cblxuICAvLyBSaWdodCBlZGdlIG91dHNpZGUgdmlld3BvcnQsIHRyeSB0byBtb3ZlIGl0LlxuICBpZiAob3ZlcmZsb3cuYWRqdXN0WCAmJiBwb3MubGVmdCArIHNpemUud2lkdGggPiB2aXNpYmxlUmVjdC5yaWdodCkge1xuICAgIC8vIOS/neivgeW3pui+ueeVjOWSjOWPr+inhuWMuuWfn+W3pui+ueeVjOWvuem9kFxuICAgIHBvcy5sZWZ0ID0gTWF0aC5tYXgodmlzaWJsZVJlY3QucmlnaHQgLSBzaXplLndpZHRoLCB2aXNpYmxlUmVjdC5sZWZ0KTtcbiAgfVxuXG4gIC8vIFRvcCBlZGdlIG91dHNpZGUgdmlld3BvcnQsIHRyeSB0byBtb3ZlIGl0LlxuICBpZiAob3ZlcmZsb3cuYWRqdXN0WSAmJiBwb3MudG9wIDwgdmlzaWJsZVJlY3QudG9wKSB7XG4gICAgcG9zLnRvcCA9IHZpc2libGVSZWN0LnRvcDtcbiAgfVxuXG4gIC8vIFRvcCBlZGdlIGluc2lkZSBhbmQgYm90dG9tIGVkZ2Ugb3V0c2lkZSB2aWV3cG9ydCwgdHJ5IHRvIHJlc2l6ZSBpdC5cbiAgaWYgKG92ZXJmbG93LnJlc2l6ZUhlaWdodCAmJiBwb3MudG9wID49IHZpc2libGVSZWN0LnRvcCAmJiBwb3MudG9wICsgc2l6ZS5oZWlnaHQgPiB2aXNpYmxlUmVjdC5ib3R0b20pIHtcbiAgICBzaXplLmhlaWdodCAtPSBwb3MudG9wICsgc2l6ZS5oZWlnaHQgLSB2aXNpYmxlUmVjdC5ib3R0b207XG4gIH1cblxuICAvLyBCb3R0b20gZWRnZSBvdXRzaWRlIHZpZXdwb3J0LCB0cnkgdG8gbW92ZSBpdC5cbiAgaWYgKG92ZXJmbG93LmFkanVzdFkgJiYgcG9zLnRvcCArIHNpemUuaGVpZ2h0ID4gdmlzaWJsZVJlY3QuYm90dG9tKSB7XG4gICAgLy8g5L+d6K+B5LiK6L6555WM5ZKM5Y+v6KeG5Yy65Z+f5LiK6L6555WM5a+56b2QXG4gICAgcG9zLnRvcCA9IE1hdGgubWF4KHZpc2libGVSZWN0LmJvdHRvbSAtIHNpemUuaGVpZ2h0LCB2aXNpYmxlUmVjdC50b3ApO1xuICB9XG4gIHJldHVybiB1dGlscy5taXgocG9zLCBzaXplKTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVnaW9uKG5vZGUpIHtcbiAgdmFyIG9mZnNldDtcbiAgdmFyIHc7XG4gIHZhciBoO1xuICBpZiAoIXV0aWxzLmlzV2luZG93KG5vZGUpICYmIG5vZGUubm9kZVR5cGUgIT09IDkpIHtcbiAgICBvZmZzZXQgPSB1dGlscy5vZmZzZXQobm9kZSk7XG4gICAgdyA9IHV0aWxzLm91dGVyV2lkdGgobm9kZSk7XG4gICAgaCA9IHV0aWxzLm91dGVySGVpZ2h0KG5vZGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciB3aW4gPSB1dGlscy5nZXRXaW5kb3cobm9kZSk7XG4gICAgb2Zmc2V0ID0ge1xuICAgICAgbGVmdDogdXRpbHMuZ2V0V2luZG93U2Nyb2xsTGVmdCh3aW4pLFxuICAgICAgdG9wOiB1dGlscy5nZXRXaW5kb3dTY3JvbGxUb3Aod2luKVxuICAgIH07XG4gICAgdyA9IHV0aWxzLnZpZXdwb3J0V2lkdGgod2luKTtcbiAgICBoID0gdXRpbHMudmlld3BvcnRIZWlnaHQod2luKTtcbiAgfVxuICBvZmZzZXQud2lkdGggPSB3O1xuICBvZmZzZXQuaGVpZ2h0ID0gaDtcbiAgcmV0dXJuIG9mZnNldDtcbn1cblxuLyoqXG4gKiDojrflj5Ygbm9kZSDkuIrnmoQgYWxpZ24g5a+56b2Q54K5IOebuOWvueS6jumhtemdoueahOWdkOagh1xuICovXG5cbmZ1bmN0aW9uIGdldEFsaWduT2Zmc2V0KHJlZ2lvbiwgYWxpZ24pIHtcbiAgdmFyIFYgPSBhbGlnbi5jaGFyQXQoMCk7XG4gIHZhciBIID0gYWxpZ24uY2hhckF0KDEpO1xuICB2YXIgdyA9IHJlZ2lvbi53aWR0aDtcbiAgdmFyIGggPSByZWdpb24uaGVpZ2h0O1xuICB2YXIgeCA9IHJlZ2lvbi5sZWZ0O1xuICB2YXIgeSA9IHJlZ2lvbi50b3A7XG4gIGlmIChWID09PSAnYycpIHtcbiAgICB5ICs9IGggLyAyO1xuICB9IGVsc2UgaWYgKFYgPT09ICdiJykge1xuICAgIHkgKz0gaDtcbiAgfVxuICBpZiAoSCA9PT0gJ2MnKSB7XG4gICAgeCArPSB3IC8gMjtcbiAgfSBlbHNlIGlmIChIID09PSAncicpIHtcbiAgICB4ICs9IHc7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBsZWZ0OiB4LFxuICAgIHRvcDogeVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRFbEZ1dHVyZVBvcyhlbFJlZ2lvbiwgcmVmTm9kZVJlZ2lvbiwgcG9pbnRzLCBvZmZzZXQsIHRhcmdldE9mZnNldCkge1xuICB2YXIgcDEgPSBnZXRBbGlnbk9mZnNldChyZWZOb2RlUmVnaW9uLCBwb2ludHNbMV0pO1xuICB2YXIgcDIgPSBnZXRBbGlnbk9mZnNldChlbFJlZ2lvbiwgcG9pbnRzWzBdKTtcbiAgdmFyIGRpZmYgPSBbcDIubGVmdCAtIHAxLmxlZnQsIHAyLnRvcCAtIHAxLnRvcF07XG4gIHJldHVybiB7XG4gICAgbGVmdDogTWF0aC5yb3VuZChlbFJlZ2lvbi5sZWZ0IC0gZGlmZlswXSArIG9mZnNldFswXSAtIHRhcmdldE9mZnNldFswXSksXG4gICAgdG9wOiBNYXRoLnJvdW5kKGVsUmVnaW9uLnRvcCAtIGRpZmZbMV0gKyBvZmZzZXRbMV0gLSB0YXJnZXRPZmZzZXRbMV0pXG4gIH07XG59XG5cbi8qKlxuICogYWxpZ24gZG9tIG5vZGUgZmxleGlibHlcbiAqIEBhdXRob3IgeWltaW5naGVAZ21haWwuY29tXG4gKi9cblxuLy8gaHR0cDovL3lpbWluZ2hlLml0ZXllLmNvbS9ibG9nLzExMjQ3MjBcblxuZnVuY3Rpb24gaXNGYWlsWChlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSB7XG4gIHJldHVybiBlbEZ1dHVyZVBvcy5sZWZ0IDwgdmlzaWJsZVJlY3QubGVmdCB8fCBlbEZ1dHVyZVBvcy5sZWZ0ICsgZWxSZWdpb24ud2lkdGggPiB2aXNpYmxlUmVjdC5yaWdodDtcbn1cbmZ1bmN0aW9uIGlzRmFpbFkoZWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCkge1xuICByZXR1cm4gZWxGdXR1cmVQb3MudG9wIDwgdmlzaWJsZVJlY3QudG9wIHx8IGVsRnV0dXJlUG9zLnRvcCArIGVsUmVnaW9uLmhlaWdodCA+IHZpc2libGVSZWN0LmJvdHRvbTtcbn1cbmZ1bmN0aW9uIGlzQ29tcGxldGVGYWlsWChlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSB7XG4gIHJldHVybiBlbEZ1dHVyZVBvcy5sZWZ0ID4gdmlzaWJsZVJlY3QucmlnaHQgfHwgZWxGdXR1cmVQb3MubGVmdCArIGVsUmVnaW9uLndpZHRoIDwgdmlzaWJsZVJlY3QubGVmdDtcbn1cbmZ1bmN0aW9uIGlzQ29tcGxldGVGYWlsWShlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSB7XG4gIHJldHVybiBlbEZ1dHVyZVBvcy50b3AgPiB2aXNpYmxlUmVjdC5ib3R0b20gfHwgZWxGdXR1cmVQb3MudG9wICsgZWxSZWdpb24uaGVpZ2h0IDwgdmlzaWJsZVJlY3QudG9wO1xufVxuZnVuY3Rpb24gZmxpcChwb2ludHMsIHJlZywgbWFwKSB7XG4gIHZhciByZXQgPSBbXTtcbiAgdXRpbHMuZWFjaChwb2ludHMsIGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0LnB1c2gocC5yZXBsYWNlKHJlZywgZnVuY3Rpb24gKG0pIHtcbiAgICAgIHJldHVybiBtYXBbbV07XG4gICAgfSkpO1xuICB9KTtcbiAgcmV0dXJuIHJldDtcbn1cbmZ1bmN0aW9uIGZsaXBPZmZzZXQob2Zmc2V0LCBpbmRleCkge1xuICBvZmZzZXRbaW5kZXhdID0gLW9mZnNldFtpbmRleF07XG4gIHJldHVybiBvZmZzZXQ7XG59XG5mdW5jdGlvbiBjb252ZXJ0T2Zmc2V0KHN0ciwgb2Zmc2V0TGVuKSB7XG4gIHZhciBuO1xuICBpZiAoLyUkLy50ZXN0KHN0cikpIHtcbiAgICBuID0gcGFyc2VJbnQoc3RyLnN1YnN0cmluZygwLCBzdHIubGVuZ3RoIC0gMSksIDEwKSAvIDEwMCAqIG9mZnNldExlbjtcbiAgfSBlbHNlIHtcbiAgICBuID0gcGFyc2VJbnQoc3RyLCAxMCk7XG4gIH1cbiAgcmV0dXJuIG4gfHwgMDtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9mZnNldChvZmZzZXQsIGVsKSB7XG4gIG9mZnNldFswXSA9IGNvbnZlcnRPZmZzZXQob2Zmc2V0WzBdLCBlbC53aWR0aCk7XG4gIG9mZnNldFsxXSA9IGNvbnZlcnRPZmZzZXQob2Zmc2V0WzFdLCBlbC5oZWlnaHQpO1xufVxuXG4vKipcbiAqIEBwYXJhbSBlbFxuICogQHBhcmFtIHRndFJlZ2lvbiDlj4LnhafoioLngrnmiYDljaDnmoTljLrln586IHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH1cbiAqIEBwYXJhbSBhbGlnblxuICovXG5mdW5jdGlvbiBkb0FsaWduKGVsLCB0Z3RSZWdpb24sIGFsaWduLCBpc1RndFJlZ2lvblZpc2libGUpIHtcbiAgdmFyIHBvaW50cyA9IGFsaWduLnBvaW50cztcbiAgdmFyIG9mZnNldCA9IGFsaWduLm9mZnNldCB8fCBbMCwgMF07XG4gIHZhciB0YXJnZXRPZmZzZXQgPSBhbGlnbi50YXJnZXRPZmZzZXQgfHwgWzAsIDBdO1xuICB2YXIgb3ZlcmZsb3cgPSBhbGlnbi5vdmVyZmxvdztcbiAgdmFyIHNvdXJjZSA9IGFsaWduLnNvdXJjZSB8fCBlbDtcbiAgb2Zmc2V0ID0gW10uY29uY2F0KG9mZnNldCk7XG4gIHRhcmdldE9mZnNldCA9IFtdLmNvbmNhdCh0YXJnZXRPZmZzZXQpO1xuICBvdmVyZmxvdyA9IG92ZXJmbG93IHx8IHt9O1xuICB2YXIgbmV3T3ZlcmZsb3dDZmcgPSB7fTtcbiAgdmFyIGZhaWwgPSAwO1xuICB2YXIgYWx3YXlzQnlWaWV3cG9ydCA9ICEhKG92ZXJmbG93ICYmIG92ZXJmbG93LmFsd2F5c0J5Vmlld3BvcnQpO1xuICAvLyDlvZPliY3oioLngrnlj6/ku6XooqvmlL7nva7nmoTmmL7npLrljLrln59cbiAgdmFyIHZpc2libGVSZWN0ID0gZ2V0VmlzaWJsZVJlY3RGb3JFbGVtZW50KHNvdXJjZSwgYWx3YXlzQnlWaWV3cG9ydCk7XG4gIC8vIOW9k+WJjeiKgueCueaJgOWNoOeahOWMuuWfnywgbGVmdC90b3Avd2lkdGgvaGVpZ2h0XG4gIHZhciBlbFJlZ2lvbiA9IGdldFJlZ2lvbihzb3VyY2UpO1xuICAvLyDlsIYgb2Zmc2V0IOi9rOaNouaIkOaVsOWAvO+8jOaUr+aMgeeZvuWIhuavlFxuICBub3JtYWxpemVPZmZzZXQob2Zmc2V0LCBlbFJlZ2lvbik7XG4gIG5vcm1hbGl6ZU9mZnNldCh0YXJnZXRPZmZzZXQsIHRndFJlZ2lvbik7XG4gIC8vIOW9k+WJjeiKgueCueWwhuimgeiiq+aUvue9rueahOS9jee9rlxuICB2YXIgZWxGdXR1cmVQb3MgPSBnZXRFbEZ1dHVyZVBvcyhlbFJlZ2lvbiwgdGd0UmVnaW9uLCBwb2ludHMsIG9mZnNldCwgdGFyZ2V0T2Zmc2V0KTtcbiAgLy8g5b2T5YmN6IqC54K55bCG6KaB5omA5aSE55qE5Yy65Z+fXG4gIHZhciBuZXdFbFJlZ2lvbiA9IHV0aWxzLm1lcmdlKGVsUmVnaW9uLCBlbEZ1dHVyZVBvcyk7XG5cbiAgLy8g5aaC5p6c5Y+v6KeG5Yy65Z+f5LiN6IO95a6M5YWo5pS+572u5b2T5YmN6IqC54K55pe25YWB6K646LCD5pW0XG4gIGlmICh2aXNpYmxlUmVjdCAmJiAob3ZlcmZsb3cuYWRqdXN0WCB8fCBvdmVyZmxvdy5hZGp1c3RZKSAmJiBpc1RndFJlZ2lvblZpc2libGUpIHtcbiAgICBpZiAob3ZlcmZsb3cuYWRqdXN0WCkge1xuICAgICAgLy8g5aaC5p6c5qiq5ZCR5LiN6IO95pS+5LiLXG4gICAgICBpZiAoaXNGYWlsWChlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSkge1xuICAgICAgICAvLyDlr7npvZDkvY3nva7lj43kuItcbiAgICAgICAgdmFyIG5ld1BvaW50cyA9IGZsaXAocG9pbnRzLCAvW2xyXS9naSwge1xuICAgICAgICAgIGw6ICdyJyxcbiAgICAgICAgICByOiAnbCdcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIOWBj+enu+mHj+S5n+WPjeS4i1xuICAgICAgICB2YXIgbmV3T2Zmc2V0ID0gZmxpcE9mZnNldChvZmZzZXQsIDApO1xuICAgICAgICB2YXIgbmV3VGFyZ2V0T2Zmc2V0ID0gZmxpcE9mZnNldCh0YXJnZXRPZmZzZXQsIDApO1xuICAgICAgICB2YXIgbmV3RWxGdXR1cmVQb3MgPSBnZXRFbEZ1dHVyZVBvcyhlbFJlZ2lvbiwgdGd0UmVnaW9uLCBuZXdQb2ludHMsIG5ld09mZnNldCwgbmV3VGFyZ2V0T2Zmc2V0KTtcbiAgICAgICAgaWYgKCFpc0NvbXBsZXRlRmFpbFgobmV3RWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCkpIHtcbiAgICAgICAgICBmYWlsID0gMTtcbiAgICAgICAgICBwb2ludHMgPSBuZXdQb2ludHM7XG4gICAgICAgICAgb2Zmc2V0ID0gbmV3T2Zmc2V0O1xuICAgICAgICAgIHRhcmdldE9mZnNldCA9IG5ld1RhcmdldE9mZnNldDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3ZlcmZsb3cuYWRqdXN0WSkge1xuICAgICAgLy8g5aaC5p6c57q15ZCR5LiN6IO95pS+5LiLXG4gICAgICBpZiAoaXNGYWlsWShlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSkge1xuICAgICAgICAvLyDlr7npvZDkvY3nva7lj43kuItcbiAgICAgICAgdmFyIF9uZXdQb2ludHMgPSBmbGlwKHBvaW50cywgL1t0Yl0vZ2ksIHtcbiAgICAgICAgICB0OiAnYicsXG4gICAgICAgICAgYjogJ3QnXG4gICAgICAgIH0pO1xuICAgICAgICAvLyDlgY/np7vph4/kuZ/lj43kuItcbiAgICAgICAgdmFyIF9uZXdPZmZzZXQgPSBmbGlwT2Zmc2V0KG9mZnNldCwgMSk7XG4gICAgICAgIHZhciBfbmV3VGFyZ2V0T2Zmc2V0ID0gZmxpcE9mZnNldCh0YXJnZXRPZmZzZXQsIDEpO1xuICAgICAgICB2YXIgX25ld0VsRnV0dXJlUG9zID0gZ2V0RWxGdXR1cmVQb3MoZWxSZWdpb24sIHRndFJlZ2lvbiwgX25ld1BvaW50cywgX25ld09mZnNldCwgX25ld1RhcmdldE9mZnNldCk7XG4gICAgICAgIGlmICghaXNDb21wbGV0ZUZhaWxZKF9uZXdFbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSkge1xuICAgICAgICAgIGZhaWwgPSAxO1xuICAgICAgICAgIHBvaW50cyA9IF9uZXdQb2ludHM7XG4gICAgICAgICAgb2Zmc2V0ID0gX25ld09mZnNldDtcbiAgICAgICAgICB0YXJnZXRPZmZzZXQgPSBfbmV3VGFyZ2V0T2Zmc2V0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g5aaC5p6c5aSx6LSl77yM6YeN5paw6K6h566X5b2T5YmN6IqC54K55bCG6KaB6KKr5pS+572u55qE5L2N572uXG4gICAgaWYgKGZhaWwpIHtcbiAgICAgIGVsRnV0dXJlUG9zID0gZ2V0RWxGdXR1cmVQb3MoZWxSZWdpb24sIHRndFJlZ2lvbiwgcG9pbnRzLCBvZmZzZXQsIHRhcmdldE9mZnNldCk7XG4gICAgICB1dGlscy5taXgobmV3RWxSZWdpb24sIGVsRnV0dXJlUG9zKTtcbiAgICB9XG4gICAgdmFyIGlzU3RpbGxGYWlsWCA9IGlzRmFpbFgoZWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCk7XG4gICAgdmFyIGlzU3RpbGxGYWlsWSA9IGlzRmFpbFkoZWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCk7XG4gICAgLy8g5qOA5p+l5Y+N5LiL5ZCO55qE5L2N572u5piv5ZCm5Y+v5Lul5pS+5LiL5LqG77yM5aaC5p6c5LuN54S25pS+5LiN5LiL77yaXG4gICAgLy8gMS4g5aSN5Y6f5L+u5pS56L+H55qE5a6a5L2N5Y+C5pWwXG4gICAgaWYgKGlzU3RpbGxGYWlsWCB8fCBpc1N0aWxsRmFpbFkpIHtcbiAgICAgIHZhciBfbmV3UG9pbnRzMiA9IHBvaW50cztcblxuICAgICAgLy8g6YeN572u5a+55bqU6YOo5YiG55qE57+76L2s6YC76L6RXG4gICAgICBpZiAoaXNTdGlsbEZhaWxYKSB7XG4gICAgICAgIF9uZXdQb2ludHMyID0gZmxpcChwb2ludHMsIC9bbHJdL2dpLCB7XG4gICAgICAgICAgbDogJ3InLFxuICAgICAgICAgIHI6ICdsJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1N0aWxsRmFpbFkpIHtcbiAgICAgICAgX25ld1BvaW50czIgPSBmbGlwKHBvaW50cywgL1t0Yl0vZ2ksIHtcbiAgICAgICAgICB0OiAnYicsXG4gICAgICAgICAgYjogJ3QnXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcG9pbnRzID0gX25ld1BvaW50czI7XG4gICAgICBvZmZzZXQgPSBhbGlnbi5vZmZzZXQgfHwgWzAsIDBdO1xuICAgICAgdGFyZ2V0T2Zmc2V0ID0gYWxpZ24udGFyZ2V0T2Zmc2V0IHx8IFswLCAwXTtcbiAgICB9XG4gICAgLy8gMi4g5Y+q5pyJ5oyH5a6a5LqG5Y+v5Lul6LCD5pW05b2T5YmN5pa55ZCR5omN6LCD5pW0XG4gICAgbmV3T3ZlcmZsb3dDZmcuYWRqdXN0WCA9IG92ZXJmbG93LmFkanVzdFggJiYgaXNTdGlsbEZhaWxYO1xuICAgIG5ld092ZXJmbG93Q2ZnLmFkanVzdFkgPSBvdmVyZmxvdy5hZGp1c3RZICYmIGlzU3RpbGxGYWlsWTtcblxuICAgIC8vIOehruWunuimgeiwg+aVtO+8jOeUmuiHs+WPr+iDveS8muiwg+aVtOmrmOW6puWuveW6plxuICAgIGlmIChuZXdPdmVyZmxvd0NmZy5hZGp1c3RYIHx8IG5ld092ZXJmbG93Q2ZnLmFkanVzdFkpIHtcbiAgICAgIG5ld0VsUmVnaW9uID0gYWRqdXN0Rm9yVmlld3BvcnQoZWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCwgbmV3T3ZlcmZsb3dDZmcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIG5lZWQganVkZ2UgdG8gaW4gY2FzZSBzZXQgZml4ZWQgd2l0aCBpbiBjc3Mgb24gaGVpZ2h0IGF1dG8gZWxlbWVudFxuICBpZiAobmV3RWxSZWdpb24ud2lkdGggIT09IGVsUmVnaW9uLndpZHRoKSB7XG4gICAgdXRpbHMuY3NzKHNvdXJjZSwgJ3dpZHRoJywgdXRpbHMud2lkdGgoc291cmNlKSArIG5ld0VsUmVnaW9uLndpZHRoIC0gZWxSZWdpb24ud2lkdGgpO1xuICB9XG4gIGlmIChuZXdFbFJlZ2lvbi5oZWlnaHQgIT09IGVsUmVnaW9uLmhlaWdodCkge1xuICAgIHV0aWxzLmNzcyhzb3VyY2UsICdoZWlnaHQnLCB1dGlscy5oZWlnaHQoc291cmNlKSArIG5ld0VsUmVnaW9uLmhlaWdodCAtIGVsUmVnaW9uLmhlaWdodCk7XG4gIH1cblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20va2lzc3l0ZWFtL2tpc3N5L2lzc3Vlcy8xOTBcbiAgLy8g55u45a+55LqO5bGP5bmV5L2N572u5rKh5Y+Y77yM6ICMIGxlZnQvdG9wIOWPmOS6hlxuICAvLyDkvovlpoIgPGRpdiAncmVsYXRpdmUnPjxlbCBhYnNvbHV0ZT48L2Rpdj5cbiAgdXRpbHMub2Zmc2V0KHNvdXJjZSwge1xuICAgIGxlZnQ6IG5ld0VsUmVnaW9uLmxlZnQsXG4gICAgdG9wOiBuZXdFbFJlZ2lvbi50b3BcbiAgfSwge1xuICAgIHVzZUNzc1JpZ2h0OiBhbGlnbi51c2VDc3NSaWdodCxcbiAgICB1c2VDc3NCb3R0b206IGFsaWduLnVzZUNzc0JvdHRvbSxcbiAgICB1c2VDc3NUcmFuc2Zvcm06IGFsaWduLnVzZUNzc1RyYW5zZm9ybSxcbiAgICBpZ25vcmVTaGFrZTogYWxpZ24uaWdub3JlU2hha2VcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgcG9pbnRzOiBwb2ludHMsXG4gICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXQsXG4gICAgb3ZlcmZsb3c6IG5ld092ZXJmbG93Q2ZnXG4gIH07XG59XG4vKipcbiAqICAyMDEyLTA0LTI2IHlpbWluZ2hlQGdtYWlsLmNvbVxuICogICAtIOS8mOWMluaZuuiDveWvuem9kOeul+azlVxuICogICAtIOaFjueUqCByZXNpemVYWFxuICpcbiAqICAyMDExLTA3LTEzIHlpbWluZ2hlQGdtYWlsLmNvbSBub3RlOlxuICogICAtIOWinuWKoOaZuuiDveWvuem9kO+8jOS7peWPiuWkp+Wwj+iwg+aVtOmAiemhuVxuICoqL1xuXG5mdW5jdGlvbiBpc091dE9mVmlzaWJsZVJlY3QodGFyZ2V0LCBhbHdheXNCeVZpZXdwb3J0KSB7XG4gIHZhciB2aXNpYmxlUmVjdCA9IGdldFZpc2libGVSZWN0Rm9yRWxlbWVudCh0YXJnZXQsIGFsd2F5c0J5Vmlld3BvcnQpO1xuICB2YXIgdGFyZ2V0UmVnaW9uID0gZ2V0UmVnaW9uKHRhcmdldCk7XG4gIHJldHVybiAhdmlzaWJsZVJlY3QgfHwgdGFyZ2V0UmVnaW9uLmxlZnQgKyB0YXJnZXRSZWdpb24ud2lkdGggPD0gdmlzaWJsZVJlY3QubGVmdCB8fCB0YXJnZXRSZWdpb24udG9wICsgdGFyZ2V0UmVnaW9uLmhlaWdodCA8PSB2aXNpYmxlUmVjdC50b3AgfHwgdGFyZ2V0UmVnaW9uLmxlZnQgPj0gdmlzaWJsZVJlY3QucmlnaHQgfHwgdGFyZ2V0UmVnaW9uLnRvcCA+PSB2aXNpYmxlUmVjdC5ib3R0b207XG59XG5mdW5jdGlvbiBhbGlnbkVsZW1lbnQoZWwsIHJlZk5vZGUsIGFsaWduKSB7XG4gIHZhciB0YXJnZXQgPSBhbGlnbi50YXJnZXQgfHwgcmVmTm9kZTtcbiAgdmFyIHJlZk5vZGVSZWdpb24gPSBnZXRSZWdpb24odGFyZ2V0KTtcbiAgdmFyIGlzVGFyZ2V0Tm90T3V0T2ZWaXNpYmxlID0gIWlzT3V0T2ZWaXNpYmxlUmVjdCh0YXJnZXQsIGFsaWduLm92ZXJmbG93ICYmIGFsaWduLm92ZXJmbG93LmFsd2F5c0J5Vmlld3BvcnQpO1xuICByZXR1cm4gZG9BbGlnbihlbCwgcmVmTm9kZVJlZ2lvbiwgYWxpZ24sIGlzVGFyZ2V0Tm90T3V0T2ZWaXNpYmxlKTtcbn1cbmFsaWduRWxlbWVudC5fX2dldE9mZnNldFBhcmVudCA9IGdldE9mZnNldFBhcmVudDtcbmFsaWduRWxlbWVudC5fX2dldFZpc2libGVSZWN0Rm9yRWxlbWVudCA9IGdldFZpc2libGVSZWN0Rm9yRWxlbWVudDtcblxuLyoqXG4gKiBgdGd0UG9pbnRgOiB7IHBhZ2VYLCBwYWdlWSB9IG9yIHsgY2xpZW50WCwgY2xpZW50WSB9LlxuICogSWYgY2xpZW50IHBvc2l0aW9uIHByb3ZpZGVkLCB3aWxsIGludGVybmFsIGNvbnZlcnQgdG8gcGFnZSBwb3NpdGlvbi5cbiAqL1xuXG5mdW5jdGlvbiBhbGlnblBvaW50KGVsLCB0Z3RQb2ludCwgYWxpZ24pIHtcbiAgdmFyIHBhZ2VYO1xuICB2YXIgcGFnZVk7XG4gIHZhciBkb2MgPSB1dGlscy5nZXREb2N1bWVudChlbCk7XG4gIHZhciB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgdmFyIHNjcm9sbFggPSB1dGlscy5nZXRXaW5kb3dTY3JvbGxMZWZ0KHdpbik7XG4gIHZhciBzY3JvbGxZID0gdXRpbHMuZ2V0V2luZG93U2Nyb2xsVG9wKHdpbik7XG4gIHZhciB2aWV3cG9ydFdpZHRoID0gdXRpbHMudmlld3BvcnRXaWR0aCh3aW4pO1xuICB2YXIgdmlld3BvcnRIZWlnaHQgPSB1dGlscy52aWV3cG9ydEhlaWdodCh3aW4pO1xuICBpZiAoJ3BhZ2VYJyBpbiB0Z3RQb2ludCkge1xuICAgIHBhZ2VYID0gdGd0UG9pbnQucGFnZVg7XG4gIH0gZWxzZSB7XG4gICAgcGFnZVggPSBzY3JvbGxYICsgdGd0UG9pbnQuY2xpZW50WDtcbiAgfVxuICBpZiAoJ3BhZ2VZJyBpbiB0Z3RQb2ludCkge1xuICAgIHBhZ2VZID0gdGd0UG9pbnQucGFnZVk7XG4gIH0gZWxzZSB7XG4gICAgcGFnZVkgPSBzY3JvbGxZICsgdGd0UG9pbnQuY2xpZW50WTtcbiAgfVxuICB2YXIgdGd0UmVnaW9uID0ge1xuICAgIGxlZnQ6IHBhZ2VYLFxuICAgIHRvcDogcGFnZVksXG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwXG4gIH07XG4gIHZhciBwb2ludEluVmlldyA9IHBhZ2VYID49IDAgJiYgcGFnZVggPD0gc2Nyb2xsWCArIHZpZXdwb3J0V2lkdGggJiYgcGFnZVkgPj0gMCAmJiBwYWdlWSA8PSBzY3JvbGxZICsgdmlld3BvcnRIZWlnaHQ7XG5cbiAgLy8gUHJvdmlkZSBkZWZhdWx0IHRhcmdldCBwb2ludFxuICB2YXIgcG9pbnRzID0gW2FsaWduLnBvaW50c1swXSwgJ2NjJ107XG4gIHJldHVybiBkb0FsaWduKGVsLCB0Z3RSZWdpb24sIF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBhbGlnbiksIHt9LCB7XG4gICAgcG9pbnRzOiBwb2ludHNcbiAgfSksIHBvaW50SW5WaWV3KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWxpZ25FbGVtZW50O1xuZXhwb3J0IHsgYWxpZ25FbGVtZW50LCBhbGlnblBvaW50IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCB3YXJuaW5nIGZyb20gXCIuL3dhcm5pbmdcIjtcblxuLyoqXG4gKiBEZWVwbHkgY29tcGFyZXMgdHdvIG9iamVjdCBsaXRlcmFscy5cbiAqIEBwYXJhbSBvYmoxIG9iamVjdCAxXG4gKiBAcGFyYW0gb2JqMiBvYmplY3QgMlxuICogQHBhcmFtIHNoYWxsb3cgc2hhbGxvdyBjb21wYXJlXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiBpc0VxdWFsKG9iajEsIG9iajIpIHtcbiAgdmFyIHNoYWxsb3cgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9wdWxsLzU5NzkvZmlsZXMjZGlmZi1mZGU3MTQ1MDUwYzQ3Y2MzYTMwNjg1NmVmZDVmOWMzMDE2ZTg2ZTg1OWRlOWFmYmQwMmM4NzliZTUwNjdlNThmXG4gIHZhciByZWZTZXQgPSBuZXcgU2V0KCk7XG4gIGZ1bmN0aW9uIGRlZXBFcXVhbChhLCBiKSB7XG4gICAgdmFyIGxldmVsID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAxO1xuICAgIHZhciBjaXJjdWxhciA9IHJlZlNldC5oYXMoYSk7XG4gICAgd2FybmluZyghY2lyY3VsYXIsICdXYXJuaW5nOiBUaGVyZSBtYXkgYmUgY2lyY3VsYXIgcmVmZXJlbmNlcycpO1xuICAgIGlmIChjaXJjdWxhcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYSA9PT0gYikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChzaGFsbG93ICYmIGxldmVsID4gMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZWZTZXQuYWRkKGEpO1xuICAgIHZhciBuZXdMZXZlbCA9IGxldmVsICsgMTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGIpIHx8IGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFkZWVwRXF1YWwoYVtpXSwgYltpXSwgbmV3TGV2ZWwpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGEgJiYgYiAmJiBfdHlwZW9mKGEpID09PSAnb2JqZWN0JyAmJiBfdHlwZW9mKGIpID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYikubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBrZXlzLmV2ZXJ5KGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIGRlZXBFcXVhbChhW2tleV0sIGJba2V5XSwgbmV3TGV2ZWwpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIG90aGVyXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBkZWVwRXF1YWwob2JqMSwgb2JqMik7XG59XG5leHBvcnQgZGVmYXVsdCBpc0VxdWFsOyIsImV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoZWxlbWVudCkge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgaWYgKGVsZW1lbnQub2Zmc2V0UGFyZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnQuZ2V0QkJveCkge1xuICAgICAgdmFyIF9nZXRCQm94ID0gZWxlbWVudC5nZXRCQm94KCksXG4gICAgICAgIHdpZHRoID0gX2dldEJCb3gud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF9nZXRCQm94LmhlaWdodDtcbiAgICAgIGlmICh3aWR0aCB8fCBoZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCkge1xuICAgICAgdmFyIF9lbGVtZW50JGdldEJvdW5kaW5nQyA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgIF93aWR0aCA9IF9lbGVtZW50JGdldEJvdW5kaW5nQy53aWR0aCxcbiAgICAgICAgX2hlaWdodCA9IF9lbGVtZW50JGdldEJvdW5kaW5nQy5oZWlnaHQ7XG4gICAgICBpZiAoX3dpZHRoIHx8IF9oZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn0pOyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKGNhbGxiYWNrLCBidWZmZXIpIHtcbiAgdmFyIGNhbGxlZFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIHZhciB0aW1lb3V0UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuXG4gIGZ1bmN0aW9uIGNhbmNlbFRyaWdnZXIoKSB7XG4gICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lb3V0UmVmLmN1cnJlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJpZ2dlcihmb3JjZSkge1xuICAgIGNhbmNlbFRyaWdnZXIoKTtcblxuICAgIGlmICghY2FsbGVkUmVmLmN1cnJlbnQgfHwgZm9yY2UgPT09IHRydWUpIHtcbiAgICAgIGlmIChjYWxsYmFjayhmb3JjZSkgPT09IGZhbHNlKSB7XG4gICAgICAgIC8vIE5vdCBkZWxheSBzaW5jZSBjYWxsYmFjayBjYW5jZWxsZWQgc2VsZlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNhbGxlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIHRpbWVvdXRSZWYuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbGVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIH0sIGJ1ZmZlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRpbWVvdXRSZWYuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbGVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgdHJpZ2dlcigpO1xuICAgICAgfSwgYnVmZmVyKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW3RyaWdnZXIsIGZ1bmN0aW9uICgpIHtcbiAgICBjYWxsZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIGNhbmNlbFRyaWdnZXIoKTtcbiAgfV07XG59KTsiLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBSZXNpemVPYnNlcnZlciBmcm9tICdyZXNpemUtb2JzZXJ2ZXItcG9seWZpbGwnO1xuaW1wb3J0IGNvbnRhaW5zIGZyb20gXCJyYy11dGlsL2VzL0RvbS9jb250YWluc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2FtZVBvaW50KHByZXYsIG5leHQpIHtcbiAgaWYgKHByZXYgPT09IG5leHQpIHJldHVybiB0cnVlO1xuICBpZiAoIXByZXYgfHwgIW5leHQpIHJldHVybiBmYWxzZTtcblxuICBpZiAoJ3BhZ2VYJyBpbiBuZXh0ICYmICdwYWdlWScgaW4gbmV4dCkge1xuICAgIHJldHVybiBwcmV2LnBhZ2VYID09PSBuZXh0LnBhZ2VYICYmIHByZXYucGFnZVkgPT09IG5leHQucGFnZVk7XG4gIH1cblxuICBpZiAoJ2NsaWVudFgnIGluIG5leHQgJiYgJ2NsaWVudFknIGluIG5leHQpIHtcbiAgICByZXR1cm4gcHJldi5jbGllbnRYID09PSBuZXh0LmNsaWVudFggJiYgcHJldi5jbGllbnRZID09PSBuZXh0LmNsaWVudFk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzdG9yZUZvY3VzKGFjdGl2ZUVsZW1lbnQsIGNvbnRhaW5lcikge1xuICAvLyBGb2N1cyBiYWNrIGlmIGlzIGluIHRoZSBjb250YWluZXJcbiAgaWYgKGFjdGl2ZUVsZW1lbnQgIT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgY29udGFpbnMoY29udGFpbmVyLCBhY3RpdmVFbGVtZW50KSAmJiB0eXBlb2YgYWN0aXZlRWxlbWVudC5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFjdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIG1vbml0b3JSZXNpemUoZWxlbWVudCwgY2FsbGJhY2spIHtcbiAgdmFyIHByZXZXaWR0aCA9IG51bGw7XG4gIHZhciBwcmV2SGVpZ2h0ID0gbnVsbDtcblxuICBmdW5jdGlvbiBvblJlc2l6ZShfcmVmKSB7XG4gICAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMSksXG4gICAgICAgIHRhcmdldCA9IF9yZWYyWzBdLnRhcmdldDtcblxuICAgIGlmICghZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHJldHVybjtcblxuICAgIHZhciBfdGFyZ2V0JGdldEJvdW5kaW5nQ2wgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgIHdpZHRoID0gX3RhcmdldCRnZXRCb3VuZGluZ0NsLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBfdGFyZ2V0JGdldEJvdW5kaW5nQ2wuaGVpZ2h0O1xuXG4gICAgdmFyIGZpeGVkV2lkdGggPSBNYXRoLmZsb29yKHdpZHRoKTtcbiAgICB2YXIgZml4ZWRIZWlnaHQgPSBNYXRoLmZsb29yKGhlaWdodCk7XG5cbiAgICBpZiAocHJldldpZHRoICE9PSBmaXhlZFdpZHRoIHx8IHByZXZIZWlnaHQgIT09IGZpeGVkSGVpZ2h0KSB7XG4gICAgICAvLyBodHRwczovL3dlYmtpdC5vcmcvYmxvZy85OTk3L3Jlc2l6ZW9ic2VydmVyLWluLXdlYmtpdC9cbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICBjYWxsYmFjayh7XG4gICAgICAgICAgd2lkdGg6IGZpeGVkV2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBmaXhlZEhlaWdodFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByZXZXaWR0aCA9IGZpeGVkV2lkdGg7XG4gICAgcHJldkhlaWdodCA9IGZpeGVkSGVpZ2h0O1xuICB9XG5cbiAgdmFyIHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKG9uUmVzaXplKTtcblxuICBpZiAoZWxlbWVudCkge1xuICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZWxlbWVudCk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfTtcbn0iLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcblxuLyoqXG4gKiBSZW1vdmVkIHByb3BzOlxuICogIC0gY2hpbGRyZW5Qcm9wc1xuICovXG5pbXBvcnQgeyBhbGlnbkVsZW1lbnQsIGFsaWduUG9pbnQgfSBmcm9tICdkb20tYWxpZ24nO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSBcInJjLXV0aWwvZXMvaXNFcXVhbFwiO1xuaW1wb3J0IGFkZEV2ZW50TGlzdGVuZXIgZnJvbSBcInJjLXV0aWwvZXMvRG9tL2FkZEV2ZW50TGlzdGVuZXJcIjtcbmltcG9ydCBpc1Zpc2libGUgZnJvbSBcInJjLXV0aWwvZXMvRG9tL2lzVmlzaWJsZVwiO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCB7IGNvbXBvc2VSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlQnVmZmVyIGZyb20gXCIuL2hvb2tzL3VzZUJ1ZmZlclwiO1xuaW1wb3J0IHsgaXNTYW1lUG9pbnQsIG1vbml0b3JSZXNpemUsIHJlc3RvcmVGb2N1cyB9IGZyb20gXCIuL3V0aWxcIjtcblxuZnVuY3Rpb24gZ2V0RWxlbWVudChmdW5jKSB7XG4gIGlmICh0eXBlb2YgZnVuYyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG51bGw7XG4gIHJldHVybiBmdW5jKCk7XG59XG5cbmZ1bmN0aW9uIGdldFBvaW50KHBvaW50KSB7XG4gIGlmIChfdHlwZW9mKHBvaW50KSAhPT0gJ29iamVjdCcgfHwgIXBvaW50KSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHBvaW50O1xufVxuXG52YXIgQWxpZ24gPSBmdW5jdGlvbiBBbGlnbihfcmVmLCByZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICAgIGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZCxcbiAgICAgIHRhcmdldCA9IF9yZWYudGFyZ2V0LFxuICAgICAgYWxpZ24gPSBfcmVmLmFsaWduLFxuICAgICAgb25BbGlnbiA9IF9yZWYub25BbGlnbixcbiAgICAgIG1vbml0b3JXaW5kb3dSZXNpemUgPSBfcmVmLm1vbml0b3JXaW5kb3dSZXNpemUsXG4gICAgICBfcmVmJG1vbml0b3JCdWZmZXJUaW0gPSBfcmVmLm1vbml0b3JCdWZmZXJUaW1lLFxuICAgICAgbW9uaXRvckJ1ZmZlclRpbWUgPSBfcmVmJG1vbml0b3JCdWZmZXJUaW0gPT09IHZvaWQgMCA/IDAgOiBfcmVmJG1vbml0b3JCdWZmZXJUaW07XG4gIHZhciBjYWNoZVJlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG4gIC8qKiBQb3B1cCBub2RlIHJlZiAqL1xuXG4gIHZhciBub2RlUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBjaGlsZE5vZGUgPSBSZWFjdC5DaGlsZHJlbi5vbmx5KGNoaWxkcmVuKTsgLy8gPT09PT09PT09PT09PT09PT09PT09IEFsaWduID09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gV2Ugc2F2ZSB0aGUgcHJvcHMgaGVyZSB0byBhdm9pZCBjbG9zdXJlIG1ha2VzIHByb3BzIG9vZFxuXG4gIHZhciBmb3JjZUFsaWduUHJvcHNSZWYgPSBSZWFjdC51c2VSZWYoe30pO1xuICBmb3JjZUFsaWduUHJvcHNSZWYuY3VycmVudC5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICBmb3JjZUFsaWduUHJvcHNSZWYuY3VycmVudC50YXJnZXQgPSB0YXJnZXQ7XG4gIGZvcmNlQWxpZ25Qcm9wc1JlZi5jdXJyZW50LmFsaWduID0gYWxpZ247XG4gIGZvcmNlQWxpZ25Qcm9wc1JlZi5jdXJyZW50Lm9uQWxpZ24gPSBvbkFsaWduO1xuXG4gIHZhciBfdXNlQnVmZmVyID0gdXNlQnVmZmVyKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2ZvcmNlQWxpZ25Qcm9wc1JlZiRjID0gZm9yY2VBbGlnblByb3BzUmVmLmN1cnJlbnQsXG4gICAgICAgIGxhdGVzdERpc2FibGVkID0gX2ZvcmNlQWxpZ25Qcm9wc1JlZiRjLmRpc2FibGVkLFxuICAgICAgICBsYXRlc3RUYXJnZXQgPSBfZm9yY2VBbGlnblByb3BzUmVmJGMudGFyZ2V0LFxuICAgICAgICBsYXRlc3RBbGlnbiA9IF9mb3JjZUFsaWduUHJvcHNSZWYkYy5hbGlnbixcbiAgICAgICAgbGF0ZXN0T25BbGlnbiA9IF9mb3JjZUFsaWduUHJvcHNSZWYkYy5vbkFsaWduO1xuICAgIHZhciBzb3VyY2UgPSBub2RlUmVmLmN1cnJlbnQ7XG5cbiAgICBpZiAoIWxhdGVzdERpc2FibGVkICYmIGxhdGVzdFRhcmdldCAmJiBzb3VyY2UpIHtcbiAgICAgIHZhciBfcmVzdWx0O1xuXG4gICAgICB2YXIgX2VsZW1lbnQgPSBnZXRFbGVtZW50KGxhdGVzdFRhcmdldCk7XG5cbiAgICAgIHZhciBfcG9pbnQgPSBnZXRQb2ludChsYXRlc3RUYXJnZXQpO1xuXG4gICAgICBjYWNoZVJlZi5jdXJyZW50LmVsZW1lbnQgPSBfZWxlbWVudDtcbiAgICAgIGNhY2hlUmVmLmN1cnJlbnQucG9pbnQgPSBfcG9pbnQ7XG4gICAgICBjYWNoZVJlZi5jdXJyZW50LmFsaWduID0gbGF0ZXN0QWxpZ247IC8vIElFIGxvc2UgZm9jdXMgYWZ0ZXIgZWxlbWVudCByZWFsaWduXG4gICAgICAvLyBXZSBzaG91bGQgcmVjb3JkIGFjdGl2ZUVsZW1lbnQgYW5kIHJlc3RvcmUgbGF0ZXJcblxuICAgICAgdmFyIF9kb2N1bWVudCA9IGRvY3VtZW50LFxuICAgICAgICAgIGFjdGl2ZUVsZW1lbnQgPSBfZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsgLy8gV2Ugb25seSBhbGlnbiB3aGVuIGVsZW1lbnQgaXMgdmlzaWJsZVxuXG4gICAgICBpZiAoX2VsZW1lbnQgJiYgaXNWaXNpYmxlKF9lbGVtZW50KSkge1xuICAgICAgICBfcmVzdWx0ID0gYWxpZ25FbGVtZW50KHNvdXJjZSwgX2VsZW1lbnQsIGxhdGVzdEFsaWduKTtcbiAgICAgIH0gZWxzZSBpZiAoX3BvaW50KSB7XG4gICAgICAgIF9yZXN1bHQgPSBhbGlnblBvaW50KHNvdXJjZSwgX3BvaW50LCBsYXRlc3RBbGlnbik7XG4gICAgICB9XG5cbiAgICAgIHJlc3RvcmVGb2N1cyhhY3RpdmVFbGVtZW50LCBzb3VyY2UpO1xuXG4gICAgICBpZiAobGF0ZXN0T25BbGlnbiAmJiBfcmVzdWx0KSB7XG4gICAgICAgIGxhdGVzdE9uQWxpZ24oc291cmNlLCBfcmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LCBtb25pdG9yQnVmZmVyVGltZSksXG4gICAgICBfdXNlQnVmZmVyMiA9IF9zbGljZWRUb0FycmF5KF91c2VCdWZmZXIsIDIpLFxuICAgICAgX2ZvcmNlQWxpZ24gPSBfdXNlQnVmZmVyMlswXSxcbiAgICAgIGNhbmNlbEZvcmNlQWxpZ24gPSBfdXNlQnVmZmVyMlsxXTsgLy8gPT09PT09PT09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSGFuZGxlIHByb3BzIGNoYW5nZVxuXG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKCksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIGVsZW1lbnQgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0RWxlbWVudCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZSgpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgICAgcG9pbnQgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgICAgc2V0UG9pbnQgPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuXG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0RWxlbWVudChnZXRFbGVtZW50KHRhcmdldCkpO1xuICAgIHNldFBvaW50KGdldFBvaW50KHRhcmdldCkpO1xuICB9KTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2FjaGVSZWYuY3VycmVudC5lbGVtZW50ICE9PSBlbGVtZW50IHx8ICFpc1NhbWVQb2ludChjYWNoZVJlZi5jdXJyZW50LnBvaW50LCBwb2ludCkgfHwgIWlzRXF1YWwoY2FjaGVSZWYuY3VycmVudC5hbGlnbiwgYWxpZ24pKSB7XG4gICAgICBfZm9yY2VBbGlnbigpO1xuICAgIH1cbiAgfSk7IC8vIFdhdGNoIHBvcHVwIGVsZW1lbnQgcmVzaXplXG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2FuY2VsRm4gPSBtb25pdG9yUmVzaXplKG5vZGVSZWYuY3VycmVudCwgX2ZvcmNlQWxpZ24pO1xuICAgIHJldHVybiBjYW5jZWxGbjtcbiAgfSwgW25vZGVSZWYuY3VycmVudF0pOyAvLyBXYXRjaCB0YXJnZXQgZWxlbWVudCByZXNpemVcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjYW5jZWxGbiA9IG1vbml0b3JSZXNpemUoZWxlbWVudCwgX2ZvcmNlQWxpZ24pO1xuICAgIHJldHVybiBjYW5jZWxGbjtcbiAgfSwgW2VsZW1lbnRdKTsgLy8gTGlzdGVuIGZvciBkaXNhYmxlZCBjaGFuZ2VcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgIF9mb3JjZUFsaWduKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbmNlbEZvcmNlQWxpZ24oKTtcbiAgICB9XG4gIH0sIFtkaXNhYmxlZF0pOyAvLyBMaXN0ZW4gZm9yIHdpbmRvdyByZXNpemVcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChtb25pdG9yV2luZG93UmVzaXplKSB7XG4gICAgICB2YXIgY2FuY2VsRm4gPSBhZGRFdmVudExpc3RlbmVyKHdpbmRvdywgJ3Jlc2l6ZScsIF9mb3JjZUFsaWduKTtcbiAgICAgIHJldHVybiBjYW5jZWxGbi5yZW1vdmU7XG4gICAgfVxuICB9LCBbbW9uaXRvcldpbmRvd1Jlc2l6ZV0pOyAvLyBDbGVhciBhbGwgaWYgdW5tb3VudFxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbmNlbEZvcmNlQWxpZ24oKTtcbiAgICB9O1xuICB9LCBbXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT0gUmVmID09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZm9yY2VBbGlnbjogZnVuY3Rpb24gZm9yY2VBbGlnbigpIHtcbiAgICAgICAgcmV0dXJuIF9mb3JjZUFsaWduKHRydWUpO1xuICAgICAgfVxuICAgIH07XG4gIH0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PVxuXG4gIGlmICggLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkTm9kZSkpIHtcbiAgICBjaGlsZE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkTm9kZSwge1xuICAgICAgcmVmOiBjb21wb3NlUmVmKGNoaWxkTm9kZS5yZWYsIG5vZGVSZWYpXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gY2hpbGROb2RlO1xufTtcblxudmFyIFJjQWxpZ24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihBbGlnbik7XG5SY0FsaWduLmRpc3BsYXlOYW1lID0gJ0FsaWduJztcbmV4cG9ydCBkZWZhdWx0IFJjQWxpZ247IiwiaW1wb3J0IF9yZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3JlZ2VuZXJhdG9yUnVudGltZVwiO1xuaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3luY1RvR2VuZXJhdG9yXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbmltcG9ydCB1c2VTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VTdGF0ZVwiO1xuLyoqXG4gKiBQb3B1cCBzaG91bGQgZm9sbG93IHRoZSBzdGVwcyBmb3IgZWFjaCBjb21wb25lbnQgd29yayBjb3JyZWN0bHk6XG4gKiBtZWFzdXJlIC0gY2hlY2sgZm9yIHRoZSBjdXJyZW50IHN0cmV0Y2ggc2l6ZVxuICogYWxpZ24gLSBsZXQgY29tcG9uZW50IGFsaWduIHRoZSBwb3NpdGlvblxuICogYWxpZ25lZCAtIHJlLWFsaWduIGFnYWluIGluIGNhc2UgYWRkaXRpb25hbCBjbGFzc05hbWUgY2hhbmdlZCB0aGUgc2l6ZVxuICogYWZ0ZXJBbGlnbiAtIGNob2ljZSBuZXh0IHN0ZXAgaXMgdHJpZ2dlciBtb3Rpb24gb3IgZmluaXNoZWRcbiAqIGJlZm9yZU1vdGlvbiAtIHNob3VsZCByZXNldCBtb3Rpb24gdG8gaW52aXNpYmxlIHNvIHRoYXQgQ1NTTW90aW9uIGNhbiBkbyBub3JtYWwgbW90aW9uXG4gKiBtb3Rpb24gLSBwbGF5IHRoZSBtb3Rpb25cbiAqIHN0YWJsZSAtIGV2ZXJ5dGhpbmcgaXMgZG9uZVxuICovXG5cbnZhciBTdGF0dXNRdWV1ZSA9IFsnbWVhc3VyZScsICdhbGlnblByZScsICdhbGlnbicsIG51bGwsICdtb3Rpb24nXTtcbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAodmlzaWJsZSwgZG9NZWFzdXJlKSB7XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShudWxsKSxcbiAgICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgICAgc3RhdHVzID0gX3VzZVN0YXRlMlswXSxcbiAgICAgIHNldEludGVybmFsU3RhdHVzID0gX3VzZVN0YXRlMlsxXTtcblxuICB2YXIgcmFmUmVmID0gdXNlUmVmKCk7XG5cbiAgZnVuY3Rpb24gc2V0U3RhdHVzKG5leHRTdGF0dXMpIHtcbiAgICBzZXRJbnRlcm5hbFN0YXR1cyhuZXh0U3RhdHVzLCB0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbFJhZigpIHtcbiAgICByYWYuY2FuY2VsKHJhZlJlZi5jdXJyZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdvTmV4dFN0YXR1cyhjYWxsYmFjaykge1xuICAgIGNhbmNlbFJhZigpO1xuICAgIHJhZlJlZi5jdXJyZW50ID0gcmFmKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIE9ubHkgYWxpZ24gc2hvdWxkIGJlIG1hbnVhbGx5IHRyaWdnZXJcbiAgICAgIHNldFN0YXR1cyhmdW5jdGlvbiAocHJldikge1xuICAgICAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgICAgIGNhc2UgJ2FsaWduJzpcbiAgICAgICAgICAgIHJldHVybiAnbW90aW9uJztcblxuICAgICAgICAgIGNhc2UgJ21vdGlvbic6XG4gICAgICAgICAgICByZXR1cm4gJ3N0YWJsZSc7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgICB9KTtcbiAgICAgIGNhbGxiYWNrID09PSBudWxsIHx8IGNhbGxiYWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjYWxsYmFjaygpO1xuICAgIH0pO1xuICB9IC8vIEluaXQgc3RhdHVzXG5cblxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHNldFN0YXR1cygnbWVhc3VyZScpO1xuICB9LCBbdmlzaWJsZV0pOyAvLyBHbyBuZXh0IHN0YXR1c1xuXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgIGNhc2UgJ21lYXN1cmUnOlxuICAgICAgICBkb01lYXN1cmUoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cykge1xuICAgICAgcmFmUmVmLmN1cnJlbnQgPSByYWYoIC8qI19fUFVSRV9fKi9fYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICAgIHZhciBpbmRleCwgbmV4dFN0YXR1cztcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGluZGV4ID0gU3RhdHVzUXVldWUuaW5kZXhPZihzdGF0dXMpO1xuICAgICAgICAgICAgICAgIG5leHRTdGF0dXMgPSBTdGF0dXNRdWV1ZVtpbmRleCArIDFdO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5leHRTdGF0dXMgJiYgaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICBzZXRTdGF0dXMobmV4dFN0YXR1cyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlKTtcbiAgICAgIH0pKSk7XG4gICAgfVxuICB9LCBbc3RhdHVzXSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbmNlbFJhZigpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgcmV0dXJuIFtzdGF0dXMsIGdvTmV4dFN0YXR1c107XG59KTsiLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoc3RyZXRjaCkge1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoe1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMFxuICB9KSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgdGFyZ2V0U2l6ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRUYXJnZXRTaXplID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICBmdW5jdGlvbiBtZWFzdXJlU3RyZXRjaChlbGVtZW50KSB7XG4gICAgdmFyIHRndFdpZHRoID0gZWxlbWVudC5vZmZzZXRXaWR0aCxcbiAgICAgICAgdGd0SGVpZ2h0ID0gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG5cbiAgICB2YXIgX2VsZW1lbnQkZ2V0Qm91bmRpbmdDID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgd2lkdGggPSBfZWxlbWVudCRnZXRCb3VuZGluZ0Mud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF9lbGVtZW50JGdldEJvdW5kaW5nQy5oZWlnaHQ7IC8vIFJlY3QgaXMgbW9yZSBhY2N1cmF0ZSB0aGFuIG9mZnNldCwgdXNlIGlmIG5lYXJcblxuXG4gICAgaWYgKE1hdGguYWJzKHRndFdpZHRoIC0gd2lkdGgpIDwgMSAmJiBNYXRoLmFicyh0Z3RIZWlnaHQgLSBoZWlnaHQpIDwgMSkge1xuICAgICAgdGd0V2lkdGggPSB3aWR0aDtcbiAgICAgIHRndEhlaWdodCA9IGhlaWdodDtcbiAgICB9XG5cbiAgICBzZXRUYXJnZXRTaXplKHtcbiAgICAgIHdpZHRoOiB0Z3RXaWR0aCxcbiAgICAgIGhlaWdodDogdGd0SGVpZ2h0XG4gICAgfSk7XG4gIH0gLy8gTWVyZ2Ugc3RyZXRjaCBzdHlsZVxuXG5cbiAgdmFyIHN0eWxlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNpemVTdHlsZSA9IHt9O1xuXG4gICAgaWYgKHN0cmV0Y2gpIHtcbiAgICAgIHZhciB3aWR0aCA9IHRhcmdldFNpemUud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gdGFyZ2V0U2l6ZS5oZWlnaHQ7IC8vIFN0cmV0Y2ggd2l0aCB0YXJnZXRcblxuICAgICAgaWYgKHN0cmV0Y2guaW5kZXhPZignaGVpZ2h0JykgIT09IC0xICYmIGhlaWdodCkge1xuICAgICAgICBzaXplU3R5bGUuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgfSBlbHNlIGlmIChzdHJldGNoLmluZGV4T2YoJ21pbkhlaWdodCcpICE9PSAtMSAmJiBoZWlnaHQpIHtcbiAgICAgICAgc2l6ZVN0eWxlLm1pbkhlaWdodCA9IGhlaWdodDtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0cmV0Y2guaW5kZXhPZignd2lkdGgnKSAhPT0gLTEgJiYgd2lkdGgpIHtcbiAgICAgICAgc2l6ZVN0eWxlLndpZHRoID0gd2lkdGg7XG4gICAgICB9IGVsc2UgaWYgKHN0cmV0Y2guaW5kZXhPZignbWluV2lkdGgnKSAhPT0gLTEgJiYgd2lkdGgpIHtcbiAgICAgICAgc2l6ZVN0eWxlLm1pbldpZHRoID0gd2lkdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNpemVTdHlsZTtcbiAgfSwgW3N0cmV0Y2gsIHRhcmdldFNpemVdKTtcbiAgcmV0dXJuIFtzdHlsZSwgbWVhc3VyZVN0cmV0Y2hdO1xufSk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEFsaWduIGZyb20gJ3JjLWFsaWduJztcbmltcG9ydCB1c2VMYXlvdXRFZmZlY3QgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgQ1NTTW90aW9uIGZyb20gJ3JjLW1vdGlvbic7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB1c2VWaXNpYmxlU3RhdHVzIGZyb20gXCIuL3VzZVZpc2libGVTdGF0dXNcIjtcbmltcG9ydCB7IGdldE1vdGlvbiB9IGZyb20gXCIuLi91dGlscy9sZWdhY3lVdGlsXCI7XG5pbXBvcnQgdXNlU3RyZXRjaFN0eWxlIGZyb20gXCIuL3VzZVN0cmV0Y2hTdHlsZVwiO1xudmFyIFBvcHVwSW5uZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgdmlzaWJsZSA9IHByb3BzLnZpc2libGUsXG4gICAgICBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIHpJbmRleCA9IHByb3BzLnpJbmRleCxcbiAgICAgIHN0cmV0Y2ggPSBwcm9wcy5zdHJldGNoLFxuICAgICAgZGVzdHJveVBvcHVwT25IaWRlID0gcHJvcHMuZGVzdHJveVBvcHVwT25IaWRlLFxuICAgICAgZm9yY2VSZW5kZXIgPSBwcm9wcy5mb3JjZVJlbmRlcixcbiAgICAgIGFsaWduID0gcHJvcHMuYWxpZ24sXG4gICAgICBwb2ludCA9IHByb3BzLnBvaW50LFxuICAgICAgZ2V0Um9vdERvbU5vZGUgPSBwcm9wcy5nZXRSb290RG9tTm9kZSxcbiAgICAgIGdldENsYXNzTmFtZUZyb21BbGlnbiA9IHByb3BzLmdldENsYXNzTmFtZUZyb21BbGlnbixcbiAgICAgIG9uQWxpZ24gPSBwcm9wcy5vbkFsaWduLFxuICAgICAgb25Nb3VzZUVudGVyID0gcHJvcHMub25Nb3VzZUVudGVyLFxuICAgICAgb25Nb3VzZUxlYXZlID0gcHJvcHMub25Nb3VzZUxlYXZlLFxuICAgICAgb25Nb3VzZURvd24gPSBwcm9wcy5vbk1vdXNlRG93bixcbiAgICAgIG9uVG91Y2hTdGFydCA9IHByb3BzLm9uVG91Y2hTdGFydCxcbiAgICAgIG9uQ2xpY2sgPSBwcm9wcy5vbkNsaWNrO1xuICB2YXIgYWxpZ25SZWYgPSB1c2VSZWYoKTtcbiAgdmFyIGVsZW1lbnRSZWYgPSB1c2VSZWYoKTtcblxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoKSxcbiAgICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgICAgYWxpZ25lZENsYXNzTmFtZSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRBbGlnbmVkQ2xhc3NOYW1lID0gX3VzZVN0YXRlMlsxXTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gTWVhc3VyZSA9PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciBfdXNlU3RyZXRjaFN0eWxlID0gdXNlU3RyZXRjaFN0eWxlKHN0cmV0Y2gpLFxuICAgICAgX3VzZVN0cmV0Y2hTdHlsZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RyZXRjaFN0eWxlLCAyKSxcbiAgICAgIHN0cmV0Y2hTdHlsZSA9IF91c2VTdHJldGNoU3R5bGUyWzBdLFxuICAgICAgbWVhc3VyZVN0cmV0Y2hTdHlsZSA9IF91c2VTdHJldGNoU3R5bGUyWzFdO1xuXG4gIGZ1bmN0aW9uIGRvTWVhc3VyZSgpIHtcbiAgICBpZiAoc3RyZXRjaCkge1xuICAgICAgbWVhc3VyZVN0cmV0Y2hTdHlsZShnZXRSb290RG9tTm9kZSgpKTtcbiAgICB9XG4gIH0gLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFN0YXR1cyA9PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciBfdXNlVmlzaWJsZVN0YXR1cyA9IHVzZVZpc2libGVTdGF0dXModmlzaWJsZSwgZG9NZWFzdXJlKSxcbiAgICAgIF91c2VWaXNpYmxlU3RhdHVzMiA9IF9zbGljZWRUb0FycmF5KF91c2VWaXNpYmxlU3RhdHVzLCAyKSxcbiAgICAgIHN0YXR1cyA9IF91c2VWaXNpYmxlU3RhdHVzMlswXSxcbiAgICAgIGdvTmV4dFN0YXR1cyA9IF91c2VWaXNpYmxlU3RhdHVzMlsxXTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IEFsaWducyA9PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogYGFsaWduZWRDbGFzc05hbWVgIG1heSBtb2RpZnkgYHNvdXJjZWAgc2l6ZSxcbiAgICogd2hpY2ggbWVhbnMgb25lIHRpbWUgYWxpZ24gbWF5IG5vdCBtb3ZlIHRvIHRoZSBjb3JyZWN0IHBvc2l0aW9uIGF0IG9uY2UuXG4gICAqXG4gICAqIFdlIHdpbGwgcmVzZXQgYGFsaWduVGltZXNgIGZvciBlYWNoIHN0YXR1cyBzd2l0Y2ggdG8gYGFsaWduUHJlYFxuICAgKiBhbmQgbGV0IGByYy1hbGlnbmAgdG8gYWxpZ24gZm9yIG11bHRpcGxlIHRpbWVzIHRvIGVuc3VyZSBnZXQgZmluYWwgc3RhYmxlIHBsYWNlLlxuICAgKiBDdXJyZW50bHkgd2UgbWFyayBgYWxpZ25UaW1lcyA8IDJgIHJlcGVhdCBhbGlnbiwgaXQgd2lsbCBpbmNyZWFzZSBpZiB1c2VyIHJlcG9ydCBmb3IgYWxpZ24gaXNzdWUuXG4gICAqIFxuICAgKiBVcGRhdGU6XG4gICAqIEluIFJlYWN0IDE4LiBgcmMtYWxpZ25gIGVmZmVjdCBvZiBhbGlnbiBtYXkgZmFzdGVyIHRoYW4gcmVmIGNhbGxlZCB0cmlnZ2VyIGBmb3JjZUFsaWduYC5cbiAgICogV2UgYWRqdXN0IHRoaXMgdG8gYGFsaWduVGltZXMgPCAyYC5cbiAgICogV2UgbmVlZCByZWZhY3RvciBgcmMtYWxpZ25gIHRvIHN1cHBvcnQgbWFyayBvZiBgZm9yY2VBbGlnbmAgY2FsbCBpZiB0aGlzIHN0aWxsIGhhcHBlbi5cbiAgICovXG5cblxuICB2YXIgX3VzZVN0YXRlMyA9IHVzZVN0YXRlKDApLFxuICAgICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgICAgYWxpZ25UaW1lcyA9IF91c2VTdGF0ZTRbMF0sXG4gICAgICBzZXRBbGlnblRpbWVzID0gX3VzZVN0YXRlNFsxXTtcblxuICB2YXIgcHJlcGFyZVJlc29sdmVSZWYgPSB1c2VSZWYoKTtcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc3RhdHVzID09PSAnYWxpZ25QcmUnKSB7XG4gICAgICBzZXRBbGlnblRpbWVzKDApO1xuICAgIH1cbiAgfSwgW3N0YXR1c10pOyAvLyBgdGFyZ2V0YCBvbiBgcmMtYWxpZ25gIGNhbiBhY2NlcHQgYXMgYSBmdW5jdGlvbiB0byBnZXQgdGhlIGJpbmQgZWxlbWVudCBvciBhIHBvaW50LlxuICAvLyByZWY6IGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL3JjLWFsaWduXG5cbiAgZnVuY3Rpb24gZ2V0QWxpZ25UYXJnZXQoKSB7XG4gICAgaWYgKHBvaW50KSB7XG4gICAgICByZXR1cm4gcG9pbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldFJvb3REb21Ob2RlO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9yY2VBbGlnbigpIHtcbiAgICB2YXIgX2FsaWduUmVmJGN1cnJlbnQ7XG5cbiAgICAoX2FsaWduUmVmJGN1cnJlbnQgPSBhbGlnblJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYWxpZ25SZWYkY3VycmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FsaWduUmVmJGN1cnJlbnQuZm9yY2VBbGlnbigpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25JbnRlcm5hbEFsaWduKHBvcHVwRG9tTm9kZSwgbWF0Y2hBbGlnbikge1xuICAgIHZhciBuZXh0QWxpZ25lZENsYXNzTmFtZSA9IGdldENsYXNzTmFtZUZyb21BbGlnbihtYXRjaEFsaWduKTtcblxuICAgIGlmIChhbGlnbmVkQ2xhc3NOYW1lICE9PSBuZXh0QWxpZ25lZENsYXNzTmFtZSkge1xuICAgICAgc2V0QWxpZ25lZENsYXNzTmFtZShuZXh0QWxpZ25lZENsYXNzTmFtZSk7XG4gICAgfSAvLyBXZSB3aWxsIHJldHJ5IG11bHRpIHRpbWVzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBlbGVtZW50IGhhcyBiZWVuIGFsaWduIGluIHRoZSByaWdodCBwb3NpdGlvbi5cblxuXG4gICAgc2V0QWxpZ25UaW1lcyhmdW5jdGlvbiAodmFsKSB7XG4gICAgICByZXR1cm4gdmFsICsgMTtcbiAgICB9KTtcblxuICAgIGlmIChzdGF0dXMgPT09ICdhbGlnbicpIHtcbiAgICAgIG9uQWxpZ24gPT09IG51bGwgfHwgb25BbGlnbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbGlnbihwb3B1cERvbU5vZGUsIG1hdGNoQWxpZ24pO1xuICAgIH1cbiAgfSAvLyBEZWxheSB0byBnbyB0byBuZXh0IHN0YXR1c1xuXG5cbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc3RhdHVzID09PSAnYWxpZ24nKSB7XG4gICAgICAvLyBSZXBlYXQgdW50aWwgbm90IG1vcmUgYWxpZ24gbmVlZGVkXG4gICAgICBpZiAoYWxpZ25UaW1lcyA8IDMpIHtcbiAgICAgICAgZm9yY2VBbGlnbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ29OZXh0U3RhdHVzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgX3ByZXBhcmVSZXNvbHZlUmVmJGN1O1xuXG4gICAgICAgICAgKF9wcmVwYXJlUmVzb2x2ZVJlZiRjdSA9IHByZXBhcmVSZXNvbHZlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9wcmVwYXJlUmVzb2x2ZVJlZiRjdSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3ByZXBhcmVSZXNvbHZlUmVmJGN1LmNhbGwocHJlcGFyZVJlc29sdmVSZWYpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFthbGlnblRpbWVzXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PSBNb3Rpb24gPT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIG1vdGlvbiA9IF9vYmplY3RTcHJlYWQoe30sIGdldE1vdGlvbihwcm9wcykpO1xuXG4gIFsnb25BcHBlYXJFbmQnLCAnb25FbnRlckVuZCcsICdvbkxlYXZlRW5kJ10uZm9yRWFjaChmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgdmFyIG9yaWdpbkhhbmRsZXIgPSBtb3Rpb25bZXZlbnROYW1lXTtcblxuICAgIG1vdGlvbltldmVudE5hbWVdID0gZnVuY3Rpb24gKGVsZW1lbnQsIGV2ZW50KSB7XG4gICAgICBnb05leHRTdGF0dXMoKTtcbiAgICAgIHJldHVybiBvcmlnaW5IYW5kbGVyID09PSBudWxsIHx8IG9yaWdpbkhhbmRsZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbkhhbmRsZXIoZWxlbWVudCwgZXZlbnQpO1xuICAgIH07XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIG9uU2hvd1ByZXBhcmUoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICBwcmVwYXJlUmVzb2x2ZVJlZi5jdXJyZW50ID0gcmVzb2x2ZTtcbiAgICB9KTtcbiAgfSAvLyBHbyB0byBzdGFibGUgZGlyZWN0bHkgd2hlbiBtb3Rpb24gbm90IHByb3ZpZGVkXG5cblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghbW90aW9uLm1vdGlvbk5hbWUgJiYgc3RhdHVzID09PSAnbW90aW9uJykge1xuICAgICAgZ29OZXh0U3RhdHVzKCk7XG4gICAgfVxuICB9LCBbbW90aW9uLm1vdGlvbk5hbWUsIHN0YXR1c10pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IFJlZnMgPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvcmNlQWxpZ246IGZvcmNlQWxpZ24sXG4gICAgICBnZXRFbGVtZW50OiBmdW5jdGlvbiBnZXRFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudFJlZi5jdXJyZW50O1xuICAgICAgfVxuICAgIH07XG4gIH0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBtZXJnZWRTdHlsZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3RyZXRjaFN0eWxlKSwge30sIHtcbiAgICB6SW5kZXg6IHpJbmRleCxcbiAgICBvcGFjaXR5OiBzdGF0dXMgPT09ICdtb3Rpb24nIHx8IHN0YXR1cyA9PT0gJ3N0YWJsZScgfHwgIXZpc2libGUgPyB1bmRlZmluZWQgOiAwLFxuICAgIC8vIENhbm5vdCBpbnRlcmFjdCB3aXRoIGRpc2FwcGVhcmluZyBlbGVtZW50c1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzM1MDUxI2lzc3VlY29tbWVudC0xMTAxMzQwNzE0XG4gICAgcG9pbnRlckV2ZW50czogIXZpc2libGUgJiYgc3RhdHVzICE9PSAnc3RhYmxlJyA/ICdub25lJyA6IHVuZGVmaW5lZFxuICB9LCBzdHlsZSk7IC8vIEFsaWduIHN0YXR1c1xuXG5cbiAgdmFyIGFsaWduRGlzYWJsZWQgPSB0cnVlO1xuXG4gIGlmIChhbGlnbiAhPT0gbnVsbCAmJiBhbGlnbiAhPT0gdm9pZCAwICYmIGFsaWduLnBvaW50cyAmJiAoc3RhdHVzID09PSAnYWxpZ24nIHx8IHN0YXR1cyA9PT0gJ3N0YWJsZScpKSB7XG4gICAgYWxpZ25EaXNhYmxlZCA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGNoaWxkTm9kZSA9IGNoaWxkcmVuOyAvLyBXcmFwcGVyIHdoZW4gbXVsdGlwbGUgY2hpbGRyZW5cblxuICBpZiAoUmVhY3QuQ2hpbGRyZW4uY291bnQoY2hpbGRyZW4pID4gMSkge1xuICAgIGNoaWxkTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50XCIpXG4gICAgfSwgY2hpbGRyZW4pO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbiwgX2V4dGVuZHMoe1xuICAgIHZpc2libGU6IHZpc2libGUsXG4gICAgcmVmOiBlbGVtZW50UmVmLFxuICAgIGxlYXZlZENsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oaWRkZW5cIilcbiAgfSwgbW90aW9uLCB7XG4gICAgb25BcHBlYXJQcmVwYXJlOiBvblNob3dQcmVwYXJlLFxuICAgIG9uRW50ZXJQcmVwYXJlOiBvblNob3dQcmVwYXJlLFxuICAgIHJlbW92ZU9uTGVhdmU6IGRlc3Ryb3lQb3B1cE9uSGlkZSxcbiAgICBmb3JjZVJlbmRlcjogZm9yY2VSZW5kZXJcbiAgfSksIGZ1bmN0aW9uIChfcmVmLCBtb3Rpb25SZWYpIHtcbiAgICB2YXIgbW90aW9uQ2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgICAgIG1vdGlvblN0eWxlID0gX3JlZi5zdHlsZTtcbiAgICB2YXIgbWVyZ2VkQ2xhc3NOYW1lID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIGNsYXNzTmFtZSwgYWxpZ25lZENsYXNzTmFtZSwgbW90aW9uQ2xhc3NOYW1lKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQWxpZ24sIHtcbiAgICAgIHRhcmdldDogZ2V0QWxpZ25UYXJnZXQoKSxcbiAgICAgIGtleTogXCJwb3B1cFwiLFxuICAgICAgcmVmOiBhbGlnblJlZixcbiAgICAgIG1vbml0b3JXaW5kb3dSZXNpemU6IHRydWUsXG4gICAgICBkaXNhYmxlZDogYWxpZ25EaXNhYmxlZCxcbiAgICAgIGFsaWduOiBhbGlnbixcbiAgICAgIG9uQWxpZ246IG9uSW50ZXJuYWxBbGlnblxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIHJlZjogbW90aW9uUmVmLFxuICAgICAgY2xhc3NOYW1lOiBtZXJnZWRDbGFzc05hbWUsXG4gICAgICBvbk1vdXNlRW50ZXI6IG9uTW91c2VFbnRlcixcbiAgICAgIG9uTW91c2VMZWF2ZTogb25Nb3VzZUxlYXZlLFxuICAgICAgb25Nb3VzZURvd25DYXB0dXJlOiBvbk1vdXNlRG93bixcbiAgICAgIG9uVG91Y2hTdGFydENhcHR1cmU6IG9uVG91Y2hTdGFydCxcbiAgICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtb3Rpb25TdHlsZSksIG1lcmdlZFN0eWxlKVxuICAgIH0sIGNoaWxkTm9kZSkpO1xuICB9KTtcbn0pO1xuUG9wdXBJbm5lci5kaXNwbGF5TmFtZSA9ICdQb3B1cElubmVyJztcbmV4cG9ydCBkZWZhdWx0IFBvcHVwSW5uZXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IENTU01vdGlvbiBmcm9tICdyYy1tb3Rpb24nO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG52YXIgTW9iaWxlUG9wdXBJbm5lciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICB2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICAgIHpJbmRleCA9IHByb3BzLnpJbmRleCxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBfcHJvcHMkbW9iaWxlID0gcHJvcHMubW9iaWxlO1xuICBfcHJvcHMkbW9iaWxlID0gX3Byb3BzJG1vYmlsZSA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkbW9iaWxlO1xuICB2YXIgcG9wdXBDbGFzc05hbWUgPSBfcHJvcHMkbW9iaWxlLnBvcHVwQ2xhc3NOYW1lLFxuICAgICAgcG9wdXBTdHlsZSA9IF9wcm9wcyRtb2JpbGUucG9wdXBTdHlsZSxcbiAgICAgIF9wcm9wcyRtb2JpbGUkcG9wdXBNbyA9IF9wcm9wcyRtb2JpbGUucG9wdXBNb3Rpb24sXG4gICAgICBwb3B1cE1vdGlvbiA9IF9wcm9wcyRtb2JpbGUkcG9wdXBNbyA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkbW9iaWxlJHBvcHVwTW8sXG4gICAgICBwb3B1cFJlbmRlciA9IF9wcm9wcyRtb2JpbGUucG9wdXBSZW5kZXIsXG4gICAgICBvbkNsaWNrID0gcHJvcHMub25DbGljaztcbiAgdmFyIGVsZW1lbnRSZWYgPSBSZWFjdC51c2VSZWYoKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBSZWZzID09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JjZUFsaWduOiBmdW5jdGlvbiBmb3JjZUFsaWduKCkge30sXG4gICAgICBnZXRFbGVtZW50OiBmdW5jdGlvbiBnZXRFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudFJlZi5jdXJyZW50O1xuICAgICAgfVxuICAgIH07XG4gIH0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBtZXJnZWRTdHlsZSA9IF9vYmplY3RTcHJlYWQoe1xuICAgIHpJbmRleDogekluZGV4XG4gIH0sIHBvcHVwU3R5bGUpO1xuXG4gIHZhciBjaGlsZE5vZGUgPSBjaGlsZHJlbjsgLy8gV3JhcHBlciB3aGVuIG11bHRpcGxlIGNoaWxkcmVuXG5cbiAgaWYgKFJlYWN0LkNoaWxkcmVuLmNvdW50KGNoaWxkcmVuKSA+IDEpIHtcbiAgICBjaGlsZE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudFwiKVxuICAgIH0sIGNoaWxkcmVuKTtcbiAgfSAvLyBNb2JpbGUgc3VwcG9ydCBhZGRpdGlvbmFsIHJlbmRlclxuXG5cbiAgaWYgKHBvcHVwUmVuZGVyKSB7XG4gICAgY2hpbGROb2RlID0gcG9wdXBSZW5kZXIoY2hpbGROb2RlKTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDU1NNb3Rpb24sIF9leHRlbmRzKHtcbiAgICB2aXNpYmxlOiB2aXNpYmxlLFxuICAgIHJlZjogZWxlbWVudFJlZixcbiAgICByZW1vdmVPbkxlYXZlOiB0cnVlXG4gIH0sIHBvcHVwTW90aW9uKSwgZnVuY3Rpb24gKF9yZWYsIG1vdGlvblJlZikge1xuICAgIHZhciBtb3Rpb25DbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICAgICAgbW90aW9uU3R5bGUgPSBfcmVmLnN0eWxlO1xuICAgIHZhciBtZXJnZWRDbGFzc05hbWUgPSBjbGFzc05hbWVzKHByZWZpeENscywgcG9wdXBDbGFzc05hbWUsIG1vdGlvbkNsYXNzTmFtZSk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIHJlZjogbW90aW9uUmVmLFxuICAgICAgY2xhc3NOYW1lOiBtZXJnZWRDbGFzc05hbWUsXG4gICAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgbW90aW9uU3R5bGUpLCBtZXJnZWRTdHlsZSlcbiAgICB9LCBjaGlsZE5vZGUpO1xuICB9KTtcbn0pO1xuTW9iaWxlUG9wdXBJbm5lci5kaXNwbGF5TmFtZSA9ICdNb2JpbGVQb3B1cElubmVyJztcbmV4cG9ydCBkZWZhdWx0IE1vYmlsZVBvcHVwSW5uZXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInZpc2libGVcIiwgXCJtb2JpbGVcIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGlzTW9iaWxlIGZyb20gXCJyYy11dGlsL2VzL2lzTW9iaWxlXCI7XG5pbXBvcnQgTWFzayBmcm9tIFwiLi9NYXNrXCI7XG5pbXBvcnQgUG9wdXBJbm5lciBmcm9tIFwiLi9Qb3B1cElubmVyXCI7XG5pbXBvcnQgTW9iaWxlUG9wdXBJbm5lciBmcm9tIFwiLi9Nb2JpbGVQb3B1cElubmVyXCI7XG52YXIgUG9wdXAgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAoX3JlZiwgcmVmKSB7XG4gIHZhciB2aXNpYmxlID0gX3JlZi52aXNpYmxlLFxuICAgICAgbW9iaWxlID0gX3JlZi5tb2JpbGUsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZSh2aXNpYmxlKSxcbiAgICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgICAgaW5uZXJWaXNpYmxlID0gX3VzZVN0YXRlMlswXSxcbiAgICAgIHNlcklubmVyVmlzaWJsZSA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZShmYWxzZSksXG4gICAgICBfdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlMywgMiksXG4gICAgICBpbk1vYmlsZSA9IF91c2VTdGF0ZTRbMF0sXG4gICAgICBzZXRJbk1vYmlsZSA9IF91c2VTdGF0ZTRbMV07XG5cbiAgdmFyIGNsb25lUHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICB2aXNpYmxlOiBpbm5lclZpc2libGVcbiAgfSk7IC8vIFdlIGNoZWNrIG1vYmlsZSBpbiB2aXNpYmxlIGNoYW5nZWQgaGVyZS5cbiAgLy8gQW5kIHRoaXMgYWxzbyBkZWxheSBzZXQgYGlubmVyVmlzaWJsZWAgdG8gYXZvaWQgcG9wdXAgY29tcG9uZW50IHJlbmRlciBmbGFzaFxuXG5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXJJbm5lclZpc2libGUodmlzaWJsZSk7XG5cbiAgICBpZiAodmlzaWJsZSAmJiBtb2JpbGUpIHtcbiAgICAgIHNldEluTW9iaWxlKGlzTW9iaWxlKCkpO1xuICAgIH1cbiAgfSwgW3Zpc2libGUsIG1vYmlsZV0pO1xuICB2YXIgcG9wdXBOb2RlID0gaW5Nb2JpbGUgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNb2JpbGVQb3B1cElubmVyLCBfZXh0ZW5kcyh7fSwgY2xvbmVQcm9wcywge1xuICAgIG1vYmlsZTogbW9iaWxlLFxuICAgIHJlZjogcmVmXG4gIH0pKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBvcHVwSW5uZXIsIF9leHRlbmRzKHt9LCBjbG9uZVByb3BzLCB7XG4gICAgcmVmOiByZWZcbiAgfSkpOyAvLyBXZSBjYW4gdXNlIGZyYWdtZW50IGRpcmVjdGx5IGJ1dCB0aGlzIG1heSBmYWlsZWQgc29tZSBzZWxlY3RvciB1c2FnZS4gS2VlcCBhcyBvcmlnaW4gbG9naWNcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTWFzaywgY2xvbmVQcm9wcyksIHBvcHVwTm9kZSk7XG59KTtcblBvcHVwLmRpc3BsYXlOYW1lID0gJ1BvcHVwJztcbmV4cG9ydCBkZWZhdWx0IFBvcHVwOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBUcmlnZ2VyQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IGRlZmF1bHQgVHJpZ2dlckNvbnRleHQ7IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5pbXBvcnQgY29udGFpbnMgZnJvbSBcInJjLXV0aWwvZXMvRG9tL2NvbnRhaW5zXCI7XG5pbXBvcnQgZmluZERPTU5vZGUgZnJvbSBcInJjLXV0aWwvZXMvRG9tL2ZpbmRET01Ob2RlXCI7XG5pbXBvcnQgeyBjb21wb3NlUmVmLCBzdXBwb3J0UmVmIH0gZnJvbSBcInJjLXV0aWwvZXMvcmVmXCI7XG5pbXBvcnQgYWRkRXZlbnRMaXN0ZW5lciBmcm9tIFwicmMtdXRpbC9lcy9Eb20vYWRkRXZlbnRMaXN0ZW5lclwiO1xuaW1wb3J0IFBvcnRhbCBmcm9tIFwicmMtdXRpbC9lcy9Qb3J0YWxcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgZ2V0QWxpZ25Gcm9tUGxhY2VtZW50LCBnZXRBbGlnblBvcHVwQ2xhc3NOYW1lIH0gZnJvbSBcIi4vdXRpbHMvYWxpZ25VdGlsXCI7XG5pbXBvcnQgUG9wdXAgZnJvbSBcIi4vUG9wdXBcIjtcbmltcG9ydCBUcmlnZ2VyQ29udGV4dCBmcm9tIFwiLi9jb250ZXh0XCI7XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiByZXR1cm5FbXB0eVN0cmluZygpIHtcbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiByZXR1cm5Eb2N1bWVudChlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgfVxuXG4gIHJldHVybiB3aW5kb3cuZG9jdW1lbnQ7XG59XG5cbnZhciBBTExfSEFORExFUlMgPSBbJ29uQ2xpY2snLCAnb25Nb3VzZURvd24nLCAnb25Ub3VjaFN0YXJ0JywgJ29uTW91c2VFbnRlcicsICdvbk1vdXNlTGVhdmUnLCAnb25Gb2N1cycsICdvbkJsdXInLCAnb25Db250ZXh0TWVudSddO1xuXG4vKipcbiAqIEludGVybmFsIHVzYWdlLiBEbyBub3QgdXNlIGluIHlvdXIgY29kZSBzaW5jZSB0aGlzIHdpbGwgYmUgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVHJpZ2dlcihQb3J0YWxDb21wb25lbnQpIHtcbiAgdmFyIFRyaWdnZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgICBfaW5oZXJpdHMoVHJpZ2dlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFRyaWdnZXIpO1xuXG4gICAgLy8gZW5zdXJlIGBnZXRDb250YWluZXJgIHdpbGwgYmUgY2FsbGVkIG9ubHkgb25jZVxuICAgIGZ1bmN0aW9uIFRyaWdnZXIocHJvcHMpIHtcbiAgICAgIHZhciBfdGhpcztcblxuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRyaWdnZXIpO1xuXG4gICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInBvcHVwUmVmXCIsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVSZWYoKSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJ0cmlnZ2VyUmVmXCIsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVSZWYoKSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJwb3J0YWxDb250YWluZXJcIiwgdm9pZCAwKTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImF0dGFjaElkXCIsIHZvaWQgMCk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjbGlja091dHNpZGVIYW5kbGVyXCIsIHZvaWQgMCk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJ0b3VjaE91dHNpZGVIYW5kbGVyXCIsIHZvaWQgMCk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjb250ZXh0TWVudU91dHNpZGVIYW5kbGVyMVwiLCB2b2lkIDApO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiY29udGV4dE1lbnVPdXRzaWRlSGFuZGxlcjJcIiwgdm9pZCAwKTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm1vdXNlRG93blRpbWVvdXRcIiwgdm9pZCAwKTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImZvY3VzVGltZVwiLCB2b2lkIDApO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwicHJlQ2xpY2tUaW1lXCIsIHZvaWQgMCk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJwcmVUb3VjaFRpbWVcIiwgdm9pZCAwKTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImRlbGF5VGltZXJcIiwgdm9pZCAwKTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImhhc1BvcHVwTW91c2VEb3duXCIsIHZvaWQgMCk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbk1vdXNlRW50ZXJcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIG1vdXNlRW50ZXJEZWxheSA9IF90aGlzLnByb3BzLm1vdXNlRW50ZXJEZWxheTtcblxuICAgICAgICBfdGhpcy5maXJlRXZlbnRzKCdvbk1vdXNlRW50ZXInLCBlKTtcblxuICAgICAgICBfdGhpcy5kZWxheVNldFBvcHVwVmlzaWJsZSh0cnVlLCBtb3VzZUVudGVyRGVsYXksIG1vdXNlRW50ZXJEZWxheSA/IG51bGwgOiBlKTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25Nb3VzZU1vdmVcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgX3RoaXMuZmlyZUV2ZW50cygnb25Nb3VzZU1vdmUnLCBlKTtcblxuICAgICAgICBfdGhpcy5zZXRQb2ludChlKTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25Nb3VzZUxlYXZlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIF90aGlzLmZpcmVFdmVudHMoJ29uTW91c2VMZWF2ZScsIGUpO1xuXG4gICAgICAgIF90aGlzLmRlbGF5U2V0UG9wdXBWaXNpYmxlKGZhbHNlLCBfdGhpcy5wcm9wcy5tb3VzZUxlYXZlRGVsYXkpO1xuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvblBvcHVwTW91c2VFbnRlclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLmNsZWFyRGVsYXlUaW1lcigpO1xuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvblBvcHVwTW91c2VMZWF2ZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgX3RoaXMkcG9wdXBSZWYkY3VycmVuO1xuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvdHJpZ2dlci9wdWxsLzEzXG4gICAgICAgIC8vIHJlYWN0IGJ1Zz9cbiAgICAgICAgaWYgKGUucmVsYXRlZFRhcmdldCAmJiAhZS5yZWxhdGVkVGFyZ2V0LnNldFRpbWVvdXQgJiYgY29udGFpbnMoKF90aGlzJHBvcHVwUmVmJGN1cnJlbiA9IF90aGlzLnBvcHVwUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF90aGlzJHBvcHVwUmVmJGN1cnJlbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkcG9wdXBSZWYkY3VycmVuLmdldEVsZW1lbnQoKSwgZS5yZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLmRlbGF5U2V0UG9wdXBWaXNpYmxlKGZhbHNlLCBfdGhpcy5wcm9wcy5tb3VzZUxlYXZlRGVsYXkpO1xuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkZvY3VzXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIF90aGlzLmZpcmVFdmVudHMoJ29uRm9jdXMnLCBlKTsgLy8gaW5jYXNlIGZvY3VzaW4gYW5kIGZvY3Vzb3V0XG5cblxuICAgICAgICBfdGhpcy5jbGVhckRlbGF5VGltZXIoKTtcblxuICAgICAgICBpZiAoX3RoaXMuaXNGb2N1c1RvU2hvdygpKSB7XG4gICAgICAgICAgX3RoaXMuZm9jdXNUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgICAgICAgIF90aGlzLmRlbGF5U2V0UG9wdXBWaXNpYmxlKHRydWUsIF90aGlzLnByb3BzLmZvY3VzRGVsYXkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uTW91c2VEb3duXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIF90aGlzLmZpcmVFdmVudHMoJ29uTW91c2VEb3duJywgZSk7XG5cbiAgICAgICAgX3RoaXMucHJlQ2xpY2tUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25Ub3VjaFN0YXJ0XCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIF90aGlzLmZpcmVFdmVudHMoJ29uVG91Y2hTdGFydCcsIGUpO1xuXG4gICAgICAgIF90aGlzLnByZVRvdWNoVGltZSA9IERhdGUubm93KCk7XG4gICAgICB9KTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uQmx1clwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBfdGhpcy5maXJlRXZlbnRzKCdvbkJsdXInLCBlKTtcblxuICAgICAgICBfdGhpcy5jbGVhckRlbGF5VGltZXIoKTtcblxuICAgICAgICBpZiAoX3RoaXMuaXNCbHVyVG9IaWRlKCkpIHtcbiAgICAgICAgICBfdGhpcy5kZWxheVNldFBvcHVwVmlzaWJsZShmYWxzZSwgX3RoaXMucHJvcHMuYmx1ckRlbGF5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkNvbnRleHRNZW51XCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBfdGhpcy5maXJlRXZlbnRzKCdvbkNvbnRleHRNZW51JywgZSk7XG5cbiAgICAgICAgX3RoaXMuc2V0UG9wdXBWaXNpYmxlKHRydWUsIGUpO1xuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkNvbnRleHRNZW51Q2xvc2VcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3RoaXMuaXNDb250ZXh0TWVudVRvU2hvdygpKSB7XG4gICAgICAgICAgX3RoaXMuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkNsaWNrXCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBfdGhpcy5maXJlRXZlbnRzKCdvbkNsaWNrJywgZXZlbnQpOyAvLyBmb2N1cyB3aWxsIHRyaWdnZXIgY2xpY2tcblxuXG4gICAgICAgIGlmIChfdGhpcy5mb2N1c1RpbWUpIHtcbiAgICAgICAgICB2YXIgcHJlVGltZTtcblxuICAgICAgICAgIGlmIChfdGhpcy5wcmVDbGlja1RpbWUgJiYgX3RoaXMucHJlVG91Y2hUaW1lKSB7XG4gICAgICAgICAgICBwcmVUaW1lID0gTWF0aC5taW4oX3RoaXMucHJlQ2xpY2tUaW1lLCBfdGhpcy5wcmVUb3VjaFRpbWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoX3RoaXMucHJlQ2xpY2tUaW1lKSB7XG4gICAgICAgICAgICBwcmVUaW1lID0gX3RoaXMucHJlQ2xpY2tUaW1lO1xuICAgICAgICAgIH0gZWxzZSBpZiAoX3RoaXMucHJlVG91Y2hUaW1lKSB7XG4gICAgICAgICAgICBwcmVUaW1lID0gX3RoaXMucHJlVG91Y2hUaW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChNYXRoLmFicyhwcmVUaW1lIC0gX3RoaXMuZm9jdXNUaW1lKSA8IDIwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXMuZm9jdXNUaW1lID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLnByZUNsaWNrVGltZSA9IDA7XG4gICAgICAgIF90aGlzLnByZVRvdWNoVGltZSA9IDA7IC8vIE9ubHkgcHJldmVudCBkZWZhdWx0IHdoZW4gYWxsIHRoZSBhY3Rpb24gaXMgY2xpY2suXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzE3MDQzXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzE3MjkxXG5cbiAgICAgICAgaWYgKF90aGlzLmlzQ2xpY2tUb1Nob3coKSAmJiAoX3RoaXMuaXNDbGlja1RvSGlkZSgpIHx8IF90aGlzLmlzQmx1clRvSGlkZSgpKSAmJiBldmVudCAmJiBldmVudC5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbmV4dFZpc2libGUgPSAhX3RoaXMuc3RhdGUucG9wdXBWaXNpYmxlO1xuXG4gICAgICAgIGlmIChfdGhpcy5pc0NsaWNrVG9IaWRlKCkgJiYgIW5leHRWaXNpYmxlIHx8IG5leHRWaXNpYmxlICYmIF90aGlzLmlzQ2xpY2tUb1Nob3coKSkge1xuICAgICAgICAgIF90aGlzLnNldFBvcHVwVmlzaWJsZSghX3RoaXMuc3RhdGUucG9wdXBWaXNpYmxlLCBldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25Qb3B1cE1vdXNlRG93blwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLmhhc1BvcHVwTW91c2VEb3duID0gdHJ1ZTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KF90aGlzLm1vdXNlRG93blRpbWVvdXQpO1xuICAgICAgICBfdGhpcy5tb3VzZURvd25UaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzLmhhc1BvcHVwTW91c2VEb3duID0gZmFsc2U7XG4gICAgICAgIH0sIDApO1xuXG4gICAgICAgIGlmIChfdGhpcy5jb250ZXh0KSB7XG4gICAgICAgICAgdmFyIF90aGlzJGNvbnRleHQ7XG5cbiAgICAgICAgICAoX3RoaXMkY29udGV4dCA9IF90aGlzLmNvbnRleHQpLm9uUG9wdXBNb3VzZURvd24uYXBwbHkoX3RoaXMkY29udGV4dCwgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkRvY3VtZW50Q2xpY2tcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmIChfdGhpcy5wcm9wcy5tYXNrICYmICFfdGhpcy5wcm9wcy5tYXNrQ2xvc2FibGUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICAgIHZhciByb290ID0gX3RoaXMuZ2V0Um9vdERvbU5vZGUoKTtcblxuICAgICAgICB2YXIgcG9wdXBOb2RlID0gX3RoaXMuZ2V0UG9wdXBEb21Ob2RlKCk7XG5cbiAgICAgICAgaWYgKCAvLyBtb3VzZWRvd24gb24gdGhlIHRhcmdldCBzaG91bGQgYWxzbyBjbG9zZSBwb3B1cCB3aGVuIGFjdGlvbiBpcyBjb250ZXh0TWVudS5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjk4NTNcbiAgICAgICAgKCFjb250YWlucyhyb290LCB0YXJnZXQpIHx8IF90aGlzLmlzQ29udGV4dE1lbnVPbmx5KCkpICYmICFjb250YWlucyhwb3B1cE5vZGUsIHRhcmdldCkgJiYgIV90aGlzLmhhc1BvcHVwTW91c2VEb3duKSB7XG4gICAgICAgICAgX3RoaXMuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJnZXRSb290RG9tTm9kZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBnZXRUcmlnZ2VyRE9NTm9kZSA9IF90aGlzLnByb3BzLmdldFRyaWdnZXJET01Ob2RlO1xuXG4gICAgICAgIGlmIChnZXRUcmlnZ2VyRE9NTm9kZSkge1xuICAgICAgICAgIHJldHVybiBnZXRUcmlnZ2VyRE9NTm9kZShfdGhpcy50cmlnZ2VyUmVmLmN1cnJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgZG9tTm9kZSA9IGZpbmRET01Ob2RlKF90aGlzLnRyaWdnZXJSZWYuY3VycmVudCk7XG5cbiAgICAgICAgICBpZiAoZG9tTm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGRvbU5vZGU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHsvLyBEbyBub3RoaW5nXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUmVhY3RET00uZmluZERPTU5vZGUoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJnZXRQb3B1cENsYXNzTmFtZUZyb21BbGlnblwiLCBmdW5jdGlvbiAoYWxpZ24pIHtcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IFtdO1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIHBvcHVwUGxhY2VtZW50ID0gX3RoaXMkcHJvcHMucG9wdXBQbGFjZW1lbnQsXG4gICAgICAgICAgICBidWlsdGluUGxhY2VtZW50cyA9IF90aGlzJHByb3BzLmJ1aWx0aW5QbGFjZW1lbnRzLFxuICAgICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHMucHJlZml4Q2xzLFxuICAgICAgICAgICAgYWxpZ25Qb2ludCA9IF90aGlzJHByb3BzLmFsaWduUG9pbnQsXG4gICAgICAgICAgICBnZXRQb3B1cENsYXNzTmFtZUZyb21BbGlnbiA9IF90aGlzJHByb3BzLmdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduO1xuXG4gICAgICAgIGlmIChwb3B1cFBsYWNlbWVudCAmJiBidWlsdGluUGxhY2VtZW50cykge1xuICAgICAgICAgIGNsYXNzTmFtZS5wdXNoKGdldEFsaWduUG9wdXBDbGFzc05hbWUoYnVpbHRpblBsYWNlbWVudHMsIHByZWZpeENscywgYWxpZ24sIGFsaWduUG9pbnQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnZXRQb3B1cENsYXNzTmFtZUZyb21BbGlnbikge1xuICAgICAgICAgIGNsYXNzTmFtZS5wdXNoKGdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduKGFsaWduKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2xhc3NOYW1lLmpvaW4oJyAnKTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiZ2V0Q29tcG9uZW50XCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzJHByb3BzMiA9IF90aGlzLnByb3BzLFxuICAgICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHMyLnByZWZpeENscyxcbiAgICAgICAgICAgIGRlc3Ryb3lQb3B1cE9uSGlkZSA9IF90aGlzJHByb3BzMi5kZXN0cm95UG9wdXBPbkhpZGUsXG4gICAgICAgICAgICBwb3B1cENsYXNzTmFtZSA9IF90aGlzJHByb3BzMi5wb3B1cENsYXNzTmFtZSxcbiAgICAgICAgICAgIG9uUG9wdXBBbGlnbiA9IF90aGlzJHByb3BzMi5vblBvcHVwQWxpZ24sXG4gICAgICAgICAgICBwb3B1cE1vdGlvbiA9IF90aGlzJHByb3BzMi5wb3B1cE1vdGlvbixcbiAgICAgICAgICAgIHBvcHVwQW5pbWF0aW9uID0gX3RoaXMkcHJvcHMyLnBvcHVwQW5pbWF0aW9uLFxuICAgICAgICAgICAgcG9wdXBUcmFuc2l0aW9uTmFtZSA9IF90aGlzJHByb3BzMi5wb3B1cFRyYW5zaXRpb25OYW1lLFxuICAgICAgICAgICAgcG9wdXBTdHlsZSA9IF90aGlzJHByb3BzMi5wb3B1cFN0eWxlLFxuICAgICAgICAgICAgbWFzayA9IF90aGlzJHByb3BzMi5tYXNrLFxuICAgICAgICAgICAgbWFza0FuaW1hdGlvbiA9IF90aGlzJHByb3BzMi5tYXNrQW5pbWF0aW9uLFxuICAgICAgICAgICAgbWFza1RyYW5zaXRpb25OYW1lID0gX3RoaXMkcHJvcHMyLm1hc2tUcmFuc2l0aW9uTmFtZSxcbiAgICAgICAgICAgIG1hc2tNb3Rpb24gPSBfdGhpcyRwcm9wczIubWFza01vdGlvbixcbiAgICAgICAgICAgIHpJbmRleCA9IF90aGlzJHByb3BzMi56SW5kZXgsXG4gICAgICAgICAgICBwb3B1cCA9IF90aGlzJHByb3BzMi5wb3B1cCxcbiAgICAgICAgICAgIHN0cmV0Y2ggPSBfdGhpcyRwcm9wczIuc3RyZXRjaCxcbiAgICAgICAgICAgIGFsaWduUG9pbnQgPSBfdGhpcyRwcm9wczIuYWxpZ25Qb2ludCxcbiAgICAgICAgICAgIG1vYmlsZSA9IF90aGlzJHByb3BzMi5tb2JpbGUsXG4gICAgICAgICAgICBmb3JjZVJlbmRlciA9IF90aGlzJHByb3BzMi5mb3JjZVJlbmRlcixcbiAgICAgICAgICAgIG9uUG9wdXBDbGljayA9IF90aGlzJHByb3BzMi5vblBvcHVwQ2xpY2s7XG4gICAgICAgIHZhciBfdGhpcyRzdGF0ZSA9IF90aGlzLnN0YXRlLFxuICAgICAgICAgICAgcG9wdXBWaXNpYmxlID0gX3RoaXMkc3RhdGUucG9wdXBWaXNpYmxlLFxuICAgICAgICAgICAgcG9pbnQgPSBfdGhpcyRzdGF0ZS5wb2ludDtcblxuICAgICAgICB2YXIgYWxpZ24gPSBfdGhpcy5nZXRQb3B1cEFsaWduKCk7XG5cbiAgICAgICAgdmFyIG1vdXNlUHJvcHMgPSB7fTtcblxuICAgICAgICBpZiAoX3RoaXMuaXNNb3VzZUVudGVyVG9TaG93KCkpIHtcbiAgICAgICAgICBtb3VzZVByb3BzLm9uTW91c2VFbnRlciA9IF90aGlzLm9uUG9wdXBNb3VzZUVudGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF90aGlzLmlzTW91c2VMZWF2ZVRvSGlkZSgpKSB7XG4gICAgICAgICAgbW91c2VQcm9wcy5vbk1vdXNlTGVhdmUgPSBfdGhpcy5vblBvcHVwTW91c2VMZWF2ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1vdXNlUHJvcHMub25Nb3VzZURvd24gPSBfdGhpcy5vblBvcHVwTW91c2VEb3duO1xuICAgICAgICBtb3VzZVByb3BzLm9uVG91Y2hTdGFydCA9IF90aGlzLm9uUG9wdXBNb3VzZURvd247XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQb3B1cCwgX2V4dGVuZHMoe1xuICAgICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICAgIGRlc3Ryb3lQb3B1cE9uSGlkZTogZGVzdHJveVBvcHVwT25IaWRlLFxuICAgICAgICAgIHZpc2libGU6IHBvcHVwVmlzaWJsZSxcbiAgICAgICAgICBwb2ludDogYWxpZ25Qb2ludCAmJiBwb2ludCxcbiAgICAgICAgICBjbGFzc05hbWU6IHBvcHVwQ2xhc3NOYW1lLFxuICAgICAgICAgIGFsaWduOiBhbGlnbixcbiAgICAgICAgICBvbkFsaWduOiBvblBvcHVwQWxpZ24sXG4gICAgICAgICAgYW5pbWF0aW9uOiBwb3B1cEFuaW1hdGlvbixcbiAgICAgICAgICBnZXRDbGFzc05hbWVGcm9tQWxpZ246IF90aGlzLmdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduXG4gICAgICAgIH0sIG1vdXNlUHJvcHMsIHtcbiAgICAgICAgICBzdHJldGNoOiBzdHJldGNoLFxuICAgICAgICAgIGdldFJvb3REb21Ob2RlOiBfdGhpcy5nZXRSb290RG9tTm9kZSxcbiAgICAgICAgICBzdHlsZTogcG9wdXBTdHlsZSxcbiAgICAgICAgICBtYXNrOiBtYXNrLFxuICAgICAgICAgIHpJbmRleDogekluZGV4LFxuICAgICAgICAgIHRyYW5zaXRpb25OYW1lOiBwb3B1cFRyYW5zaXRpb25OYW1lLFxuICAgICAgICAgIG1hc2tBbmltYXRpb246IG1hc2tBbmltYXRpb24sXG4gICAgICAgICAgbWFza1RyYW5zaXRpb25OYW1lOiBtYXNrVHJhbnNpdGlvbk5hbWUsXG4gICAgICAgICAgbWFza01vdGlvbjogbWFza01vdGlvbixcbiAgICAgICAgICByZWY6IF90aGlzLnBvcHVwUmVmLFxuICAgICAgICAgIG1vdGlvbjogcG9wdXBNb3Rpb24sXG4gICAgICAgICAgbW9iaWxlOiBtb2JpbGUsXG4gICAgICAgICAgZm9yY2VSZW5kZXI6IGZvcmNlUmVuZGVyLFxuICAgICAgICAgIG9uQ2xpY2s6IG9uUG9wdXBDbGlja1xuICAgICAgICB9KSwgdHlwZW9mIHBvcHVwID09PSAnZnVuY3Rpb24nID8gcG9wdXAoKSA6IHBvcHVwKTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiYXR0YWNoUGFyZW50XCIsIGZ1bmN0aW9uIChwb3B1cENvbnRhaW5lcikge1xuICAgICAgICByYWYuY2FuY2VsKF90aGlzLmF0dGFjaElkKTtcbiAgICAgICAgdmFyIF90aGlzJHByb3BzMyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgICAgZ2V0UG9wdXBDb250YWluZXIgPSBfdGhpcyRwcm9wczMuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgICAgICAgICBnZXREb2N1bWVudCA9IF90aGlzJHByb3BzMy5nZXREb2N1bWVudDtcblxuICAgICAgICB2YXIgZG9tTm9kZSA9IF90aGlzLmdldFJvb3REb21Ob2RlKCk7XG5cbiAgICAgICAgdmFyIG1vdW50Tm9kZTtcblxuICAgICAgICBpZiAoIWdldFBvcHVwQ29udGFpbmVyKSB7XG4gICAgICAgICAgbW91bnROb2RlID0gZ2V0RG9jdW1lbnQoX3RoaXMuZ2V0Um9vdERvbU5vZGUoKSkuYm9keTtcbiAgICAgICAgfSBlbHNlIGlmIChkb21Ob2RlIHx8IGdldFBvcHVwQ29udGFpbmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIC8vIENvbXBhdGlibGUgZm9yIGxlZ2FjeSBnZXRQb3B1cENvbnRhaW5lciB3aXRoIGRvbU5vZGUgYXJndW1lbnQuXG4gICAgICAgICAgLy8gSWYgbm8gbmVlZCBgZG9tTm9kZWAgYXJndW1lbnQsIHdpbGwgY2FsbCBkaXJlY3RseS5cbiAgICAgICAgICAvLyBodHRwczovL2NvZGVzYW5kYm94LmlvL3MvZWxvcXVlbnQtbWNsZWFuLXNzOTNtP2ZpbGU9L3NyYy9BcHAuanNcbiAgICAgICAgICBtb3VudE5vZGUgPSBnZXRQb3B1cENvbnRhaW5lcihkb21Ob2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb3VudE5vZGUpIHtcbiAgICAgICAgICBtb3VudE5vZGUuYXBwZW5kQ2hpbGQocG9wdXBDb250YWluZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFJldHJ5IGFmdGVyIGZyYW1lIHJlbmRlciBpbiBjYXNlIHBhcmVudCBub3QgcmVhZHlcbiAgICAgICAgICBfdGhpcy5hdHRhY2hJZCA9IHJhZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5hdHRhY2hQYXJlbnQocG9wdXBDb250YWluZXIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImdldENvbnRhaW5lclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghX3RoaXMucG9ydGFsQ29udGFpbmVyKSB7XG4gICAgICAgICAgLy8gSW4gUmVhY3QuU3RyaWN0TW9kZSBjb21wb25lbnQgd2lsbCBjYWxsIHJlbmRlciBtdWx0aXBsZSB0aW1lIGluIGZpcnN0IG1vdW50LlxuICAgICAgICAgIC8vIFdoZW4geW91IHdhbnQgdG8gcmVmYWN0b3Igd2l0aCBGQywgdXNlUmVmIHdpbGwgYWxzbyBpbml0IG11bHRpcGxlIHRpbWUgYW5kXG4gICAgICAgICAgLy8gcG9pbnQgdG8gZGlmZmVyZW50IHVzZVJlZiBpbnN0YW5jZSB3aGljaCB3aWxsIGNyZWF0ZSBtdWx0aXBsZSBlbGVtZW50XG4gICAgICAgICAgLy8gKFRoaXMgbXVsdGlwbGUgcmVuZGVyIHdpbGwgbm90IHRyaWdnZXIgZWZmZWN0IHNvIHlvdSBjYW4gbm90IGNsZWFuIHVwIHRoaXNcbiAgICAgICAgICAvLyBpbiBlZmZlY3QpLiBCdXQgdGhpcyBpcyBzYWZlIHdpdGggY2xhc3MgY29tcG9uZW50IHNpbmNlIGl0IGFsd2F5cyBwb2ludCB0byBzYW1lIGNsYXNzIGluc3RhbmNlLlxuICAgICAgICAgIHZhciBnZXREb2N1bWVudCA9IF90aGlzLnByb3BzLmdldERvY3VtZW50O1xuICAgICAgICAgIHZhciBwb3B1cENvbnRhaW5lciA9IGdldERvY3VtZW50KF90aGlzLmdldFJvb3REb21Ob2RlKCkpLmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyAvLyBNYWtlIHN1cmUgZGVmYXVsdCBwb3B1cCBjb250YWluZXIgd2lsbCBuZXZlciBjYXVzZSBzY3JvbGxiYXIgYXBwZWFyaW5nXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWNvbXBvbmVudC90cmlnZ2VyL2lzc3Vlcy80MVxuXG4gICAgICAgICAgcG9wdXBDb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICAgIHBvcHVwQ29udGFpbmVyLnN0eWxlLnRvcCA9ICcwJztcbiAgICAgICAgICBwb3B1cENvbnRhaW5lci5zdHlsZS5sZWZ0ID0gJzAnO1xuICAgICAgICAgIHBvcHVwQ29udGFpbmVyLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgICAgIF90aGlzLnBvcnRhbENvbnRhaW5lciA9IHBvcHVwQ29udGFpbmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMuYXR0YWNoUGFyZW50KF90aGlzLnBvcnRhbENvbnRhaW5lcik7XG5cbiAgICAgICAgcmV0dXJuIF90aGlzLnBvcnRhbENvbnRhaW5lcjtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwic2V0UG9pbnRcIiwgZnVuY3Rpb24gKHBvaW50KSB7XG4gICAgICAgIHZhciBhbGlnblBvaW50ID0gX3RoaXMucHJvcHMuYWxpZ25Qb2ludDtcbiAgICAgICAgaWYgKCFhbGlnblBvaW50IHx8ICFwb2ludCkgcmV0dXJuO1xuXG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBwb2ludDoge1xuICAgICAgICAgICAgcGFnZVg6IHBvaW50LnBhZ2VYLFxuICAgICAgICAgICAgcGFnZVk6IHBvaW50LnBhZ2VZXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlUG9ydGFsVXBkYXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKF90aGlzLnN0YXRlLnByZXZQb3B1cFZpc2libGUgIT09IF90aGlzLnN0YXRlLnBvcHVwVmlzaWJsZSkge1xuICAgICAgICAgIF90aGlzLnByb3BzLmFmdGVyUG9wdXBWaXNpYmxlQ2hhbmdlKF90aGlzLnN0YXRlLnBvcHVwVmlzaWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwidHJpZ2dlckNvbnRleHRWYWx1ZVwiLCB7XG4gICAgICAgIG9uUG9wdXBNb3VzZURvd246IF90aGlzLm9uUG9wdXBNb3VzZURvd25cbiAgICAgIH0pO1xuXG4gICAgICB2YXIgX3BvcHVwVmlzaWJsZTtcblxuICAgICAgaWYgKCdwb3B1cFZpc2libGUnIGluIHByb3BzKSB7XG4gICAgICAgIF9wb3B1cFZpc2libGUgPSAhIXByb3BzLnBvcHVwVmlzaWJsZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9wb3B1cFZpc2libGUgPSAhIXByb3BzLmRlZmF1bHRQb3B1cFZpc2libGU7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgICBwcmV2UG9wdXBWaXNpYmxlOiBfcG9wdXBWaXNpYmxlLFxuICAgICAgICBwb3B1cFZpc2libGU6IF9wb3B1cFZpc2libGVcbiAgICAgIH07XG4gICAgICBBTExfSEFORExFUlMuZm9yRWFjaChmdW5jdGlvbiAoaCkge1xuICAgICAgICBfdGhpc1tcImZpcmVcIi5jb25jYXQoaCldID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBfdGhpcy5maXJlRXZlbnRzKGgsIGUpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUNsYXNzKFRyaWdnZXIsIFt7XG4gICAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnREaWRVcGRhdGUoKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLnN0YXRlOyAvLyBXZSBtdXN0IGxpc3RlbiB0byBgbW91c2Vkb3duYCBvciBgdG91Y2hzdGFydGAsIGVkZ2UgY2FzZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNTgwNFxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtY29tcG9uZW50L2NhbGVuZGFyL2lzc3Vlcy8yNTBcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWNvbXBvbmVudC90cmlnZ2VyL2lzc3Vlcy81MFxuXG4gICAgICAgIGlmIChzdGF0ZS5wb3B1cFZpc2libGUpIHtcbiAgICAgICAgICB2YXIgY3VycmVudERvY3VtZW50O1xuXG4gICAgICAgICAgaWYgKCF0aGlzLmNsaWNrT3V0c2lkZUhhbmRsZXIgJiYgKHRoaXMuaXNDbGlja1RvSGlkZSgpIHx8IHRoaXMuaXNDb250ZXh0TWVudVRvU2hvdygpKSkge1xuICAgICAgICAgICAgY3VycmVudERvY3VtZW50ID0gcHJvcHMuZ2V0RG9jdW1lbnQodGhpcy5nZXRSb290RG9tTm9kZSgpKTtcbiAgICAgICAgICAgIHRoaXMuY2xpY2tPdXRzaWRlSGFuZGxlciA9IGFkZEV2ZW50TGlzdGVuZXIoY3VycmVudERvY3VtZW50LCAnbW91c2Vkb3duJywgdGhpcy5vbkRvY3VtZW50Q2xpY2spO1xuICAgICAgICAgIH0gLy8gYWx3YXlzIGhpZGUgb24gbW9iaWxlXG5cblxuICAgICAgICAgIGlmICghdGhpcy50b3VjaE91dHNpZGVIYW5kbGVyKSB7XG4gICAgICAgICAgICBjdXJyZW50RG9jdW1lbnQgPSBjdXJyZW50RG9jdW1lbnQgfHwgcHJvcHMuZ2V0RG9jdW1lbnQodGhpcy5nZXRSb290RG9tTm9kZSgpKTtcbiAgICAgICAgICAgIHRoaXMudG91Y2hPdXRzaWRlSGFuZGxlciA9IGFkZEV2ZW50TGlzdGVuZXIoY3VycmVudERvY3VtZW50LCAndG91Y2hzdGFydCcsIHRoaXMub25Eb2N1bWVudENsaWNrKTtcbiAgICAgICAgICB9IC8vIGNsb3NlIHBvcHVwIHdoZW4gdHJpZ2dlciB0eXBlIGNvbnRhaW5zICdvbkNvbnRleHRNZW51JyBhbmQgZG9jdW1lbnQgaXMgc2Nyb2xsaW5nLlxuXG5cbiAgICAgICAgICBpZiAoIXRoaXMuY29udGV4dE1lbnVPdXRzaWRlSGFuZGxlcjEgJiYgdGhpcy5pc0NvbnRleHRNZW51VG9TaG93KCkpIHtcbiAgICAgICAgICAgIGN1cnJlbnREb2N1bWVudCA9IGN1cnJlbnREb2N1bWVudCB8fCBwcm9wcy5nZXREb2N1bWVudCh0aGlzLmdldFJvb3REb21Ob2RlKCkpO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0TWVudU91dHNpZGVIYW5kbGVyMSA9IGFkZEV2ZW50TGlzdGVuZXIoY3VycmVudERvY3VtZW50LCAnc2Nyb2xsJywgdGhpcy5vbkNvbnRleHRNZW51Q2xvc2UpO1xuICAgICAgICAgIH0gLy8gY2xvc2UgcG9wdXAgd2hlbiB0cmlnZ2VyIHR5cGUgY29udGFpbnMgJ29uQ29udGV4dE1lbnUnIGFuZCB3aW5kb3cgaXMgYmx1ci5cblxuXG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHRNZW51T3V0c2lkZUhhbmRsZXIyICYmIHRoaXMuaXNDb250ZXh0TWVudVRvU2hvdygpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51T3V0c2lkZUhhbmRsZXIyID0gYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csICdibHVyJywgdGhpcy5vbkNvbnRleHRNZW51Q2xvc2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYXJPdXRzaWRlSGFuZGxlcigpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICB0aGlzLmNsZWFyRGVsYXlUaW1lcigpO1xuICAgICAgICB0aGlzLmNsZWFyT3V0c2lkZUhhbmRsZXIoKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubW91c2VEb3duVGltZW91dCk7XG4gICAgICAgIHJhZi5jYW5jZWwodGhpcy5hdHRhY2hJZCk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImdldFBvcHVwRG9tTm9kZVwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBvcHVwRG9tTm9kZSgpIHtcbiAgICAgICAgdmFyIF90aGlzJHBvcHVwUmVmJGN1cnJlbjI7XG5cbiAgICAgICAgLy8gZm9yIHRlc3RcbiAgICAgICAgcmV0dXJuICgoX3RoaXMkcG9wdXBSZWYkY3VycmVuMiA9IHRoaXMucG9wdXBSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3RoaXMkcG9wdXBSZWYkY3VycmVuMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkcG9wdXBSZWYkY3VycmVuMi5nZXRFbGVtZW50KCkpIHx8IG51bGw7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImdldFBvcHVwQWxpZ25cIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQb3B1cEFsaWduKCkge1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICB2YXIgcG9wdXBQbGFjZW1lbnQgPSBwcm9wcy5wb3B1cFBsYWNlbWVudCxcbiAgICAgICAgICAgIHBvcHVwQWxpZ24gPSBwcm9wcy5wb3B1cEFsaWduLFxuICAgICAgICAgICAgYnVpbHRpblBsYWNlbWVudHMgPSBwcm9wcy5idWlsdGluUGxhY2VtZW50cztcblxuICAgICAgICBpZiAocG9wdXBQbGFjZW1lbnQgJiYgYnVpbHRpblBsYWNlbWVudHMpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0QWxpZ25Gcm9tUGxhY2VtZW50KGJ1aWx0aW5QbGFjZW1lbnRzLCBwb3B1cFBsYWNlbWVudCwgcG9wdXBBbGlnbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcG9wdXBBbGlnbjtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwic2V0UG9wdXBWaXNpYmxlXCIsXG4gICAgICB2YWx1ZTpcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHBvcHVwVmlzaWJsZSAgICBTaG93IG9yIG5vdCB0aGUgcG9wdXAgZWxlbWVudFxuICAgICAgICogQHBhcmFtIGV2ZW50ICAgICAgICAgICBTeW50aGV0aWNFdmVudCwgdXNlZCBmb3IgYHBvaW50QWxpZ25gXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIHNldFBvcHVwVmlzaWJsZShwb3B1cFZpc2libGUsIGV2ZW50KSB7XG4gICAgICAgIHZhciBhbGlnblBvaW50ID0gdGhpcy5wcm9wcy5hbGlnblBvaW50O1xuICAgICAgICB2YXIgcHJldlBvcHVwVmlzaWJsZSA9IHRoaXMuc3RhdGUucG9wdXBWaXNpYmxlO1xuICAgICAgICB0aGlzLmNsZWFyRGVsYXlUaW1lcigpO1xuXG4gICAgICAgIGlmIChwcmV2UG9wdXBWaXNpYmxlICE9PSBwb3B1cFZpc2libGUpIHtcbiAgICAgICAgICBpZiAoISgncG9wdXBWaXNpYmxlJyBpbiB0aGlzLnByb3BzKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIHBvcHVwVmlzaWJsZTogcG9wdXBWaXNpYmxlLFxuICAgICAgICAgICAgICBwcmV2UG9wdXBWaXNpYmxlOiBwcmV2UG9wdXBWaXNpYmxlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnByb3BzLm9uUG9wdXBWaXNpYmxlQ2hhbmdlKHBvcHVwVmlzaWJsZSk7XG4gICAgICAgIH0gLy8gQWx3YXlzIHJlY29yZCB0aGUgcG9pbnQgcG9zaXRpb24gc2luY2UgbW91c2VFbnRlckRlbGF5IHdpbGwgZGVsYXkgdGhlIHNob3dcblxuXG4gICAgICAgIGlmIChhbGlnblBvaW50ICYmIGV2ZW50ICYmIHBvcHVwVmlzaWJsZSkge1xuICAgICAgICAgIHRoaXMuc2V0UG9pbnQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImRlbGF5U2V0UG9wdXBWaXNpYmxlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZGVsYXlTZXRQb3B1cFZpc2libGUodmlzaWJsZSwgZGVsYXlTLCBldmVudCkge1xuICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgICB2YXIgZGVsYXkgPSBkZWxheVMgKiAxMDAwO1xuICAgICAgICB0aGlzLmNsZWFyRGVsYXlUaW1lcigpO1xuXG4gICAgICAgIGlmIChkZWxheSkge1xuICAgICAgICAgIHZhciBwb2ludCA9IGV2ZW50ID8ge1xuICAgICAgICAgICAgcGFnZVg6IGV2ZW50LnBhZ2VYLFxuICAgICAgICAgICAgcGFnZVk6IGV2ZW50LnBhZ2VZXG4gICAgICAgICAgfSA6IG51bGw7XG4gICAgICAgICAgdGhpcy5kZWxheVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMyLnNldFBvcHVwVmlzaWJsZSh2aXNpYmxlLCBwb2ludCk7XG5cbiAgICAgICAgICAgIF90aGlzMi5jbGVhckRlbGF5VGltZXIoKTtcbiAgICAgICAgICB9LCBkZWxheSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRQb3B1cFZpc2libGUodmlzaWJsZSwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImNsZWFyRGVsYXlUaW1lclwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyRGVsYXlUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVsYXlUaW1lcikge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmRlbGF5VGltZXIpO1xuICAgICAgICAgIHRoaXMuZGVsYXlUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiY2xlYXJPdXRzaWRlSGFuZGxlclwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyT3V0c2lkZUhhbmRsZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmNsaWNrT3V0c2lkZUhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLmNsaWNrT3V0c2lkZUhhbmRsZXIucmVtb3ZlKCk7XG4gICAgICAgICAgdGhpcy5jbGlja091dHNpZGVIYW5kbGVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbnRleHRNZW51T3V0c2lkZUhhbmRsZXIxKSB7XG4gICAgICAgICAgdGhpcy5jb250ZXh0TWVudU91dHNpZGVIYW5kbGVyMS5yZW1vdmUoKTtcbiAgICAgICAgICB0aGlzLmNvbnRleHRNZW51T3V0c2lkZUhhbmRsZXIxID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbnRleHRNZW51T3V0c2lkZUhhbmRsZXIyKSB7XG4gICAgICAgICAgdGhpcy5jb250ZXh0TWVudU91dHNpZGVIYW5kbGVyMi5yZW1vdmUoKTtcbiAgICAgICAgICB0aGlzLmNvbnRleHRNZW51T3V0c2lkZUhhbmRsZXIyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnRvdWNoT3V0c2lkZUhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLnRvdWNoT3V0c2lkZUhhbmRsZXIucmVtb3ZlKCk7XG4gICAgICAgICAgdGhpcy50b3VjaE91dHNpZGVIYW5kbGVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJjcmVhdGVUd29DaGFpbnNcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVUd29DaGFpbnMoZXZlbnQpIHtcbiAgICAgICAgdmFyIGNoaWxkUHJvcyA9IHRoaXMucHJvcHMuY2hpbGRyZW4ucHJvcHM7XG4gICAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG5cbiAgICAgICAgaWYgKGNoaWxkUHJvc1tldmVudF0gJiYgcHJvcHNbZXZlbnRdKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXNbXCJmaXJlXCIuY29uY2F0KGV2ZW50KV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hpbGRQcm9zW2V2ZW50XSB8fCBwcm9wc1tldmVudF07XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImlzQ2xpY2tUb1Nob3dcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBpc0NsaWNrVG9TaG93KCkge1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIGFjdGlvbiA9IF90aGlzJHByb3BzNC5hY3Rpb24sXG4gICAgICAgICAgICBzaG93QWN0aW9uID0gX3RoaXMkcHJvcHM0LnNob3dBY3Rpb247XG4gICAgICAgIHJldHVybiBhY3Rpb24uaW5kZXhPZignY2xpY2snKSAhPT0gLTEgfHwgc2hvd0FjdGlvbi5pbmRleE9mKCdjbGljaycpICE9PSAtMTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiaXNDb250ZXh0TWVudU9ubHlcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBpc0NvbnRleHRNZW51T25seSgpIHtcbiAgICAgICAgdmFyIGFjdGlvbiA9IHRoaXMucHJvcHMuYWN0aW9uO1xuICAgICAgICByZXR1cm4gYWN0aW9uID09PSAnY29udGV4dE1lbnUnIHx8IGFjdGlvbi5sZW5ndGggPT09IDEgJiYgYWN0aW9uWzBdID09PSAnY29udGV4dE1lbnUnO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJpc0NvbnRleHRNZW51VG9TaG93XCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gaXNDb250ZXh0TWVudVRvU2hvdygpIHtcbiAgICAgICAgdmFyIF90aGlzJHByb3BzNSA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgICBhY3Rpb24gPSBfdGhpcyRwcm9wczUuYWN0aW9uLFxuICAgICAgICAgICAgc2hvd0FjdGlvbiA9IF90aGlzJHByb3BzNS5zaG93QWN0aW9uO1xuICAgICAgICByZXR1cm4gYWN0aW9uLmluZGV4T2YoJ2NvbnRleHRNZW51JykgIT09IC0xIHx8IHNob3dBY3Rpb24uaW5kZXhPZignY29udGV4dE1lbnUnKSAhPT0gLTE7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImlzQ2xpY2tUb0hpZGVcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBpc0NsaWNrVG9IaWRlKCkge1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHM2ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIGFjdGlvbiA9IF90aGlzJHByb3BzNi5hY3Rpb24sXG4gICAgICAgICAgICBoaWRlQWN0aW9uID0gX3RoaXMkcHJvcHM2LmhpZGVBY3Rpb247XG4gICAgICAgIHJldHVybiBhY3Rpb24uaW5kZXhPZignY2xpY2snKSAhPT0gLTEgfHwgaGlkZUFjdGlvbi5pbmRleE9mKCdjbGljaycpICE9PSAtMTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiaXNNb3VzZUVudGVyVG9TaG93XCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gaXNNb3VzZUVudGVyVG9TaG93KCkge1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHM3ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIGFjdGlvbiA9IF90aGlzJHByb3BzNy5hY3Rpb24sXG4gICAgICAgICAgICBzaG93QWN0aW9uID0gX3RoaXMkcHJvcHM3LnNob3dBY3Rpb247XG4gICAgICAgIHJldHVybiBhY3Rpb24uaW5kZXhPZignaG92ZXInKSAhPT0gLTEgfHwgc2hvd0FjdGlvbi5pbmRleE9mKCdtb3VzZUVudGVyJykgIT09IC0xO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJpc01vdXNlTGVhdmVUb0hpZGVcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBpc01vdXNlTGVhdmVUb0hpZGUoKSB7XG4gICAgICAgIHZhciBfdGhpcyRwcm9wczggPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgYWN0aW9uID0gX3RoaXMkcHJvcHM4LmFjdGlvbixcbiAgICAgICAgICAgIGhpZGVBY3Rpb24gPSBfdGhpcyRwcm9wczguaGlkZUFjdGlvbjtcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5pbmRleE9mKCdob3ZlcicpICE9PSAtMSB8fCBoaWRlQWN0aW9uLmluZGV4T2YoJ21vdXNlTGVhdmUnKSAhPT0gLTE7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImlzRm9jdXNUb1Nob3dcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBpc0ZvY3VzVG9TaG93KCkge1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHM5ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIGFjdGlvbiA9IF90aGlzJHByb3BzOS5hY3Rpb24sXG4gICAgICAgICAgICBzaG93QWN0aW9uID0gX3RoaXMkcHJvcHM5LnNob3dBY3Rpb247XG4gICAgICAgIHJldHVybiBhY3Rpb24uaW5kZXhPZignZm9jdXMnKSAhPT0gLTEgfHwgc2hvd0FjdGlvbi5pbmRleE9mKCdmb2N1cycpICE9PSAtMTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiaXNCbHVyVG9IaWRlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gaXNCbHVyVG9IaWRlKCkge1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHMxMCA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgICBhY3Rpb24gPSBfdGhpcyRwcm9wczEwLmFjdGlvbixcbiAgICAgICAgICAgIGhpZGVBY3Rpb24gPSBfdGhpcyRwcm9wczEwLmhpZGVBY3Rpb247XG4gICAgICAgIHJldHVybiBhY3Rpb24uaW5kZXhPZignZm9jdXMnKSAhPT0gLTEgfHwgaGlkZUFjdGlvbi5pbmRleE9mKCdibHVyJykgIT09IC0xO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJmb3JjZVBvcHVwQWxpZ25cIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JjZVBvcHVwQWxpZ24oKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnBvcHVwVmlzaWJsZSkge1xuICAgICAgICAgIHZhciBfdGhpcyRwb3B1cFJlZiRjdXJyZW4zO1xuXG4gICAgICAgICAgKF90aGlzJHBvcHVwUmVmJGN1cnJlbjMgPSB0aGlzLnBvcHVwUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF90aGlzJHBvcHVwUmVmJGN1cnJlbjMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJHBvcHVwUmVmJGN1cnJlbjMuZm9yY2VBbGlnbigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImZpcmVFdmVudHNcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBmaXJlRXZlbnRzKHR5cGUsIGUpIHtcbiAgICAgICAgdmFyIGNoaWxkQ2FsbGJhY2sgPSB0aGlzLnByb3BzLmNoaWxkcmVuLnByb3BzW3R5cGVdO1xuXG4gICAgICAgIGlmIChjaGlsZENhbGxiYWNrKSB7XG4gICAgICAgICAgY2hpbGRDYWxsYmFjayhlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjYWxsYmFjayA9IHRoaXMucHJvcHNbdHlwZV07XG5cbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY2FsbGJhY2soZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiY2xvc2VcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy5zZXRQb3B1cFZpc2libGUoZmFsc2UpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJyZW5kZXJcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgIHZhciBwb3B1cFZpc2libGUgPSB0aGlzLnN0YXRlLnBvcHVwVmlzaWJsZTtcbiAgICAgICAgdmFyIF90aGlzJHByb3BzMTEgPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wczExLmNoaWxkcmVuLFxuICAgICAgICAgICAgZm9yY2VSZW5kZXIgPSBfdGhpcyRwcm9wczExLmZvcmNlUmVuZGVyLFxuICAgICAgICAgICAgYWxpZ25Qb2ludCA9IF90aGlzJHByb3BzMTEuYWxpZ25Qb2ludCxcbiAgICAgICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzMTEuY2xhc3NOYW1lLFxuICAgICAgICAgICAgYXV0b0Rlc3Ryb3kgPSBfdGhpcyRwcm9wczExLmF1dG9EZXN0cm95O1xuICAgICAgICB2YXIgY2hpbGQgPSBSZWFjdC5DaGlsZHJlbi5vbmx5KGNoaWxkcmVuKTtcbiAgICAgICAgdmFyIG5ld0NoaWxkUHJvcHMgPSB7XG4gICAgICAgICAga2V5OiAndHJpZ2dlcidcbiAgICAgICAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFZpc2libGUgSGFuZGxlcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vID4+PiBDb250ZXh0TWVudVxuXG4gICAgICAgIGlmICh0aGlzLmlzQ29udGV4dE1lbnVUb1Nob3coKSkge1xuICAgICAgICAgIG5ld0NoaWxkUHJvcHMub25Db250ZXh0TWVudSA9IHRoaXMub25Db250ZXh0TWVudTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdDaGlsZFByb3BzLm9uQ29udGV4dE1lbnUgPSB0aGlzLmNyZWF0ZVR3b0NoYWlucygnb25Db250ZXh0TWVudScpO1xuICAgICAgICB9IC8vID4+PiBDbGlja1xuXG5cbiAgICAgICAgaWYgKHRoaXMuaXNDbGlja1RvSGlkZSgpIHx8IHRoaXMuaXNDbGlja1RvU2hvdygpKSB7XG4gICAgICAgICAgbmV3Q2hpbGRQcm9wcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrO1xuICAgICAgICAgIG5ld0NoaWxkUHJvcHMub25Nb3VzZURvd24gPSB0aGlzLm9uTW91c2VEb3duO1xuICAgICAgICAgIG5ld0NoaWxkUHJvcHMub25Ub3VjaFN0YXJ0ID0gdGhpcy5vblRvdWNoU3RhcnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3Q2hpbGRQcm9wcy5vbkNsaWNrID0gdGhpcy5jcmVhdGVUd29DaGFpbnMoJ29uQ2xpY2snKTtcbiAgICAgICAgICBuZXdDaGlsZFByb3BzLm9uTW91c2VEb3duID0gdGhpcy5jcmVhdGVUd29DaGFpbnMoJ29uTW91c2VEb3duJyk7XG4gICAgICAgICAgbmV3Q2hpbGRQcm9wcy5vblRvdWNoU3RhcnQgPSB0aGlzLmNyZWF0ZVR3b0NoYWlucygnb25Ub3VjaFN0YXJ0Jyk7XG4gICAgICAgIH0gLy8gPj4+IEhvdmVyKGVudGVyKVxuXG5cbiAgICAgICAgaWYgKHRoaXMuaXNNb3VzZUVudGVyVG9TaG93KCkpIHtcbiAgICAgICAgICBuZXdDaGlsZFByb3BzLm9uTW91c2VFbnRlciA9IHRoaXMub25Nb3VzZUVudGVyOyAvLyBQb2ludCBhbGlnblxuXG4gICAgICAgICAgaWYgKGFsaWduUG9pbnQpIHtcbiAgICAgICAgICAgIG5ld0NoaWxkUHJvcHMub25Nb3VzZU1vdmUgPSB0aGlzLm9uTW91c2VNb3ZlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdDaGlsZFByb3BzLm9uTW91c2VFbnRlciA9IHRoaXMuY3JlYXRlVHdvQ2hhaW5zKCdvbk1vdXNlRW50ZXInKTtcbiAgICAgICAgfSAvLyA+Pj4gSG92ZXIobGVhdmUpXG5cblxuICAgICAgICBpZiAodGhpcy5pc01vdXNlTGVhdmVUb0hpZGUoKSkge1xuICAgICAgICAgIG5ld0NoaWxkUHJvcHMub25Nb3VzZUxlYXZlID0gdGhpcy5vbk1vdXNlTGVhdmU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3Q2hpbGRQcm9wcy5vbk1vdXNlTGVhdmUgPSB0aGlzLmNyZWF0ZVR3b0NoYWlucygnb25Nb3VzZUxlYXZlJyk7XG4gICAgICAgIH0gLy8gPj4+IEZvY3VzXG5cblxuICAgICAgICBpZiAodGhpcy5pc0ZvY3VzVG9TaG93KCkgfHwgdGhpcy5pc0JsdXJUb0hpZGUoKSkge1xuICAgICAgICAgIG5ld0NoaWxkUHJvcHMub25Gb2N1cyA9IHRoaXMub25Gb2N1cztcbiAgICAgICAgICBuZXdDaGlsZFByb3BzLm9uQmx1ciA9IHRoaXMub25CbHVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0NoaWxkUHJvcHMub25Gb2N1cyA9IHRoaXMuY3JlYXRlVHdvQ2hhaW5zKCdvbkZvY3VzJyk7XG4gICAgICAgICAgbmV3Q2hpbGRQcm9wcy5vbkJsdXIgPSB0aGlzLmNyZWF0ZVR3b0NoYWlucygnb25CbHVyJyk7XG4gICAgICAgIH0gLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICAgICAgICB2YXIgY2hpbGRyZW5DbGFzc05hbWUgPSBjbGFzc05hbWVzKGNoaWxkICYmIGNoaWxkLnByb3BzICYmIGNoaWxkLnByb3BzLmNsYXNzTmFtZSwgY2xhc3NOYW1lKTtcblxuICAgICAgICBpZiAoY2hpbGRyZW5DbGFzc05hbWUpIHtcbiAgICAgICAgICBuZXdDaGlsZFByb3BzLmNsYXNzTmFtZSA9IGNoaWxkcmVuQ2xhc3NOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNsb25lUHJvcHMgPSBfb2JqZWN0U3ByZWFkKHt9LCBuZXdDaGlsZFByb3BzKTtcblxuICAgICAgICBpZiAoc3VwcG9ydFJlZihjaGlsZCkpIHtcbiAgICAgICAgICBjbG9uZVByb3BzLnJlZiA9IGNvbXBvc2VSZWYodGhpcy50cmlnZ2VyUmVmLCBjaGlsZC5yZWYpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRyaWdnZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkLCBjbG9uZVByb3BzKTtcbiAgICAgICAgdmFyIHBvcnRhbDsgLy8gcHJldmVudCB1bm1vdW50aW5nIGFmdGVyIGl0J3MgcmVuZGVyZWRcblxuICAgICAgICBpZiAocG9wdXBWaXNpYmxlIHx8IHRoaXMucG9wdXBSZWYuY3VycmVudCB8fCBmb3JjZVJlbmRlcikge1xuICAgICAgICAgIHBvcnRhbCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBvcnRhbENvbXBvbmVudCwge1xuICAgICAgICAgICAga2V5OiBcInBvcnRhbFwiLFxuICAgICAgICAgICAgZ2V0Q29udGFpbmVyOiB0aGlzLmdldENvbnRhaW5lcixcbiAgICAgICAgICAgIGRpZFVwZGF0ZTogdGhpcy5oYW5kbGVQb3J0YWxVcGRhdGVcbiAgICAgICAgICB9LCB0aGlzLmdldENvbXBvbmVudCgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcG9wdXBWaXNpYmxlICYmIGF1dG9EZXN0cm95KSB7XG4gICAgICAgICAgcG9ydGFsID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmlnZ2VyQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgICAgIHZhbHVlOiB0aGlzLnRyaWdnZXJDb250ZXh0VmFsdWVcbiAgICAgICAgfSwgdHJpZ2dlciwgcG9ydGFsKTtcbiAgICAgIH1cbiAgICB9XSwgW3tcbiAgICAgIGtleTogXCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoX3JlZiwgcHJldlN0YXRlKSB7XG4gICAgICAgIHZhciBwb3B1cFZpc2libGUgPSBfcmVmLnBvcHVwVmlzaWJsZTtcbiAgICAgICAgdmFyIG5ld1N0YXRlID0ge307XG5cbiAgICAgICAgaWYgKHBvcHVwVmlzaWJsZSAhPT0gdW5kZWZpbmVkICYmIHByZXZTdGF0ZS5wb3B1cFZpc2libGUgIT09IHBvcHVwVmlzaWJsZSkge1xuICAgICAgICAgIG5ld1N0YXRlLnBvcHVwVmlzaWJsZSA9IHBvcHVwVmlzaWJsZTtcbiAgICAgICAgICBuZXdTdGF0ZS5wcmV2UG9wdXBWaXNpYmxlID0gcHJldlN0YXRlLnBvcHVwVmlzaWJsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gVHJpZ2dlcjtcbiAgfShSZWFjdC5Db21wb25lbnQpO1xuXG4gIF9kZWZpbmVQcm9wZXJ0eShUcmlnZ2VyLCBcImNvbnRleHRUeXBlXCIsIFRyaWdnZXJDb250ZXh0KTtcblxuICBfZGVmaW5lUHJvcGVydHkoVHJpZ2dlciwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICAgIHByZWZpeENsczogJ3JjLXRyaWdnZXItcG9wdXAnLFxuICAgIGdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduOiByZXR1cm5FbXB0eVN0cmluZyxcbiAgICBnZXREb2N1bWVudDogcmV0dXJuRG9jdW1lbnQsXG4gICAgb25Qb3B1cFZpc2libGVDaGFuZ2U6IG5vb3AsXG4gICAgYWZ0ZXJQb3B1cFZpc2libGVDaGFuZ2U6IG5vb3AsXG4gICAgb25Qb3B1cEFsaWduOiBub29wLFxuICAgIHBvcHVwQ2xhc3NOYW1lOiAnJyxcbiAgICBtb3VzZUVudGVyRGVsYXk6IDAsXG4gICAgbW91c2VMZWF2ZURlbGF5OiAwLjEsXG4gICAgZm9jdXNEZWxheTogMCxcbiAgICBibHVyRGVsYXk6IDAuMTUsXG4gICAgcG9wdXBTdHlsZToge30sXG4gICAgZGVzdHJveVBvcHVwT25IaWRlOiBmYWxzZSxcbiAgICBwb3B1cEFsaWduOiB7fSxcbiAgICBkZWZhdWx0UG9wdXBWaXNpYmxlOiBmYWxzZSxcbiAgICBtYXNrOiBmYWxzZSxcbiAgICBtYXNrQ2xvc2FibGU6IHRydWUsXG4gICAgYWN0aW9uOiBbXSxcbiAgICBzaG93QWN0aW9uOiBbXSxcbiAgICBoaWRlQWN0aW9uOiBbXSxcbiAgICBhdXRvRGVzdHJveTogZmFsc2VcbiAgfSk7XG5cbiAgcmV0dXJuIFRyaWdnZXI7XG59XG5leHBvcnQgZGVmYXVsdCBnZW5lcmF0ZVRyaWdnZXIoUG9ydGFsKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJwcmVmaXhDbHNcIiwgXCJkaXNhYmxlZFwiLCBcInZpc2libGVcIiwgXCJjaGlsZHJlblwiLCBcInBvcHVwRWxlbWVudFwiLCBcImNvbnRhaW5lcldpZHRoXCIsIFwiYW5pbWF0aW9uXCIsIFwidHJhbnNpdGlvbk5hbWVcIiwgXCJkcm9wZG93blN0eWxlXCIsIFwiZHJvcGRvd25DbGFzc05hbWVcIiwgXCJkaXJlY3Rpb25cIiwgXCJwbGFjZW1lbnRcIiwgXCJkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGhcIiwgXCJkcm9wZG93blJlbmRlclwiLCBcImRyb3Bkb3duQWxpZ25cIiwgXCJnZXRQb3B1cENvbnRhaW5lclwiLCBcImVtcHR5XCIsIFwiZ2V0VHJpZ2dlckRPTU5vZGVcIiwgXCJvblBvcHVwVmlzaWJsZUNoYW5nZVwiLCBcIm9uUG9wdXBNb3VzZUVudGVyXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFRyaWdnZXIgZnJvbSAncmMtdHJpZ2dlcic7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbnZhciBnZXRCdWlsdEluUGxhY2VtZW50cyA9IGZ1bmN0aW9uIGdldEJ1aWx0SW5QbGFjZW1lbnRzKGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCkge1xuICAvLyBFbmFibGUgaG9yaXpvbnRhbCBvdmVyZmxvdyBhdXRvLWFkanVzdG1lbnQgd2hlbiBhIGN1c3RvbSBkcm9wZG93biB3aWR0aCBpcyBwcm92aWRlZFxuICB2YXIgYWRqdXN0WCA9IGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCA9PT0gdHJ1ZSA/IDAgOiAxO1xuICByZXR1cm4ge1xuICAgIGJvdHRvbUxlZnQ6IHtcbiAgICAgIHBvaW50czogWyd0bCcsICdibCddLFxuICAgICAgb2Zmc2V0OiBbMCwgNF0sXG4gICAgICBvdmVyZmxvdzoge1xuICAgICAgICBhZGp1c3RYOiBhZGp1c3RYLFxuICAgICAgICBhZGp1c3RZOiAxXG4gICAgICB9XG4gICAgfSxcbiAgICBib3R0b21SaWdodDoge1xuICAgICAgcG9pbnRzOiBbJ3RyJywgJ2JyJ10sXG4gICAgICBvZmZzZXQ6IFswLCA0XSxcbiAgICAgIG92ZXJmbG93OiB7XG4gICAgICAgIGFkanVzdFg6IGFkanVzdFgsXG4gICAgICAgIGFkanVzdFk6IDFcbiAgICAgIH1cbiAgICB9LFxuICAgIHRvcExlZnQ6IHtcbiAgICAgIHBvaW50czogWydibCcsICd0bCddLFxuICAgICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgICAgb3ZlcmZsb3c6IHtcbiAgICAgICAgYWRqdXN0WDogYWRqdXN0WCxcbiAgICAgICAgYWRqdXN0WTogMVxuICAgICAgfVxuICAgIH0sXG4gICAgdG9wUmlnaHQ6IHtcbiAgICAgIHBvaW50czogWydicicsICd0ciddLFxuICAgICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgICAgb3ZlcmZsb3c6IHtcbiAgICAgICAgYWRqdXN0WDogYWRqdXN0WCxcbiAgICAgICAgYWRqdXN0WTogMVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG52YXIgU2VsZWN0VHJpZ2dlciA9IGZ1bmN0aW9uIFNlbGVjdFRyaWdnZXIocHJvcHMsIHJlZikge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgdmlzaWJsZSA9IHByb3BzLnZpc2libGUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBwb3B1cEVsZW1lbnQgPSBwcm9wcy5wb3B1cEVsZW1lbnQsXG4gICAgY29udGFpbmVyV2lkdGggPSBwcm9wcy5jb250YWluZXJXaWR0aCxcbiAgICBhbmltYXRpb24gPSBwcm9wcy5hbmltYXRpb24sXG4gICAgdHJhbnNpdGlvbk5hbWUgPSBwcm9wcy50cmFuc2l0aW9uTmFtZSxcbiAgICBkcm9wZG93blN0eWxlID0gcHJvcHMuZHJvcGRvd25TdHlsZSxcbiAgICBkcm9wZG93bkNsYXNzTmFtZSA9IHByb3BzLmRyb3Bkb3duQ2xhc3NOYW1lLFxuICAgIF9wcm9wcyRkaXJlY3Rpb24gPSBwcm9wcy5kaXJlY3Rpb24sXG4gICAgZGlyZWN0aW9uID0gX3Byb3BzJGRpcmVjdGlvbiA9PT0gdm9pZCAwID8gJ2x0cicgOiBfcHJvcHMkZGlyZWN0aW9uLFxuICAgIHBsYWNlbWVudCA9IHByb3BzLnBsYWNlbWVudCxcbiAgICBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGggPSBwcm9wcy5kcm9wZG93bk1hdGNoU2VsZWN0V2lkdGgsXG4gICAgZHJvcGRvd25SZW5kZXIgPSBwcm9wcy5kcm9wZG93blJlbmRlcixcbiAgICBkcm9wZG93bkFsaWduID0gcHJvcHMuZHJvcGRvd25BbGlnbixcbiAgICBnZXRQb3B1cENvbnRhaW5lciA9IHByb3BzLmdldFBvcHVwQ29udGFpbmVyLFxuICAgIGVtcHR5ID0gcHJvcHMuZW1wdHksXG4gICAgZ2V0VHJpZ2dlckRPTU5vZGUgPSBwcm9wcy5nZXRUcmlnZ2VyRE9NTm9kZSxcbiAgICBvblBvcHVwVmlzaWJsZUNoYW5nZSA9IHByb3BzLm9uUG9wdXBWaXNpYmxlQ2hhbmdlLFxuICAgIG9uUG9wdXBNb3VzZUVudGVyID0gcHJvcHMub25Qb3B1cE1vdXNlRW50ZXIsXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuICB2YXIgZHJvcGRvd25QcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRyb3Bkb3duXCIpO1xuICB2YXIgcG9wdXBOb2RlID0gcG9wdXBFbGVtZW50O1xuICBpZiAoZHJvcGRvd25SZW5kZXIpIHtcbiAgICBwb3B1cE5vZGUgPSBkcm9wZG93blJlbmRlcihwb3B1cEVsZW1lbnQpO1xuICB9XG4gIHZhciBidWlsdEluUGxhY2VtZW50cyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXRCdWlsdEluUGxhY2VtZW50cyhkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGgpO1xuICB9LCBbZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IE1vdGlvbiA9PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZXJnZWRUcmFuc2l0aW9uTmFtZSA9IGFuaW1hdGlvbiA/IFwiXCIuY29uY2F0KGRyb3Bkb3duUHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KGFuaW1hdGlvbikgOiB0cmFuc2l0aW9uTmFtZTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBSZWYgPT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHBvcHVwUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBnZXRQb3B1cEVsZW1lbnQ6IGZ1bmN0aW9uIGdldFBvcHVwRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHBvcHVwUmVmLmN1cnJlbnQ7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG4gIHZhciBwb3B1cFN0eWxlID0gX29iamVjdFNwcmVhZCh7XG4gICAgbWluV2lkdGg6IGNvbnRhaW5lcldpZHRoXG4gIH0sIGRyb3Bkb3duU3R5bGUpO1xuICBpZiAodHlwZW9mIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCA9PT0gJ251bWJlcicpIHtcbiAgICBwb3B1cFN0eWxlLndpZHRoID0gZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoO1xuICB9IGVsc2UgaWYgKGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCkge1xuICAgIHBvcHVwU3R5bGUud2lkdGggPSBjb250YWluZXJXaWR0aDtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJpZ2dlciwgX2V4dGVuZHMoe30sIHJlc3RQcm9wcywge1xuICAgIHNob3dBY3Rpb246IG9uUG9wdXBWaXNpYmxlQ2hhbmdlID8gWydjbGljayddIDogW10sXG4gICAgaGlkZUFjdGlvbjogb25Qb3B1cFZpc2libGVDaGFuZ2UgPyBbJ2NsaWNrJ10gOiBbXSxcbiAgICBwb3B1cFBsYWNlbWVudDogcGxhY2VtZW50IHx8IChkaXJlY3Rpb24gPT09ICdydGwnID8gJ2JvdHRvbVJpZ2h0JyA6ICdib3R0b21MZWZ0JyksXG4gICAgYnVpbHRpblBsYWNlbWVudHM6IGJ1aWx0SW5QbGFjZW1lbnRzLFxuICAgIHByZWZpeENsczogZHJvcGRvd25QcmVmaXhDbHMsXG4gICAgcG9wdXBUcmFuc2l0aW9uTmFtZTogbWVyZ2VkVHJhbnNpdGlvbk5hbWUsXG4gICAgcG9wdXA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIHJlZjogcG9wdXBSZWYsXG4gICAgICBvbk1vdXNlRW50ZXI6IG9uUG9wdXBNb3VzZUVudGVyXG4gICAgfSwgcG9wdXBOb2RlKSxcbiAgICBwb3B1cEFsaWduOiBkcm9wZG93bkFsaWduLFxuICAgIHBvcHVwVmlzaWJsZTogdmlzaWJsZSxcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIsXG4gICAgcG9wdXBDbGFzc05hbWU6IGNsYXNzTmFtZXMoZHJvcGRvd25DbGFzc05hbWUsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQoZHJvcGRvd25QcmVmaXhDbHMsIFwiLWVtcHR5XCIpLCBlbXB0eSkpLFxuICAgIHBvcHVwU3R5bGU6IHBvcHVwU3R5bGUsXG4gICAgZ2V0VHJpZ2dlckRPTU5vZGU6IGdldFRyaWdnZXJET01Ob2RlLFxuICAgIG9uUG9wdXBWaXNpYmxlQ2hhbmdlOiBvblBvcHVwVmlzaWJsZUNoYW5nZVxuICB9KSwgY2hpbGRyZW4pO1xufTtcbnZhciBSZWZTZWxlY3RUcmlnZ2VyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoU2VsZWN0VHJpZ2dlcik7XG5SZWZTZWxlY3RUcmlnZ2VyLmRpc3BsYXlOYW1lID0gJ1NlbGVjdFRyaWdnZXInO1xuZXhwb3J0IGRlZmF1bHQgUmVmU2VsZWN0VHJpZ2dlcjsiLCJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF90b0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuZnVuY3Rpb24gZ2V0S2V5KGRhdGEsIGluZGV4KSB7XG4gIHZhciBrZXkgPSBkYXRhLmtleTtcbiAgdmFyIHZhbHVlO1xuICBpZiAoJ3ZhbHVlJyBpbiBkYXRhKSB7XG4gICAgdmFsdWUgPSBkYXRhLnZhbHVlO1xuICB9XG4gIGlmIChrZXkgIT09IG51bGwgJiYga2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ga2V5O1xuICB9XG4gIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiBcInJjLWluZGV4LWtleS1cIi5jb25jYXQoaW5kZXgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbGxGaWVsZE5hbWVzKGZpZWxkTmFtZXMsIGNoaWxkcmVuQXNEYXRhKSB7XG4gIHZhciBfcmVmID0gZmllbGROYW1lcyB8fCB7fSxcbiAgICBsYWJlbCA9IF9yZWYubGFiZWwsXG4gICAgdmFsdWUgPSBfcmVmLnZhbHVlLFxuICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnM7XG4gIHJldHVybiB7XG4gICAgbGFiZWw6IGxhYmVsIHx8IChjaGlsZHJlbkFzRGF0YSA/ICdjaGlsZHJlbicgOiAnbGFiZWwnKSxcbiAgICB2YWx1ZTogdmFsdWUgfHwgJ3ZhbHVlJyxcbiAgICBvcHRpb25zOiBvcHRpb25zIHx8ICdvcHRpb25zJ1xuICB9O1xufVxuXG4vKipcbiAqIEZsYXQgb3B0aW9ucyBpbnRvIGZsYXR0ZW4gbGlzdC5cbiAqIFdlIHVzZSBgb3B0aW9uT25seWAgaGVyZSBpcyBhaW0gdG8gYXZvaWQgdXNlciB1c2UgbmVzdGVkIG9wdGlvbiBncm91cC5cbiAqIEhlcmUgaXMgc2ltcGx5IHNldCBga2V5YCB0byB0aGUgaW5kZXggaWYgbm90IHByb3ZpZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbk9wdGlvbnMob3B0aW9ucykge1xuICB2YXIgX3JlZjIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgIGZpZWxkTmFtZXMgPSBfcmVmMi5maWVsZE5hbWVzLFxuICAgIGNoaWxkcmVuQXNEYXRhID0gX3JlZjIuY2hpbGRyZW5Bc0RhdGE7XG4gIHZhciBmbGF0dGVuTGlzdCA9IFtdO1xuICB2YXIgX2ZpbGxGaWVsZE5hbWVzID0gZmlsbEZpZWxkTmFtZXMoZmllbGROYW1lcywgZmFsc2UpLFxuICAgIGZpZWxkTGFiZWwgPSBfZmlsbEZpZWxkTmFtZXMubGFiZWwsXG4gICAgZmllbGRWYWx1ZSA9IF9maWxsRmllbGROYW1lcy52YWx1ZSxcbiAgICBmaWVsZE9wdGlvbnMgPSBfZmlsbEZpZWxkTmFtZXMub3B0aW9ucztcbiAgZnVuY3Rpb24gZGlnKGxpc3QsIGlzR3JvdXBPcHRpb24pIHtcbiAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHZhciBsYWJlbCA9IGRhdGFbZmllbGRMYWJlbF07XG4gICAgICBpZiAoaXNHcm91cE9wdGlvbiB8fCAhKGZpZWxkT3B0aW9ucyBpbiBkYXRhKSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBkYXRhW2ZpZWxkVmFsdWVdO1xuXG4gICAgICAgIC8vIE9wdGlvblxuICAgICAgICBmbGF0dGVuTGlzdC5wdXNoKHtcbiAgICAgICAgICBrZXk6IGdldEtleShkYXRhLCBmbGF0dGVuTGlzdC5sZW5ndGgpLFxuICAgICAgICAgIGdyb3VwT3B0aW9uOiBpc0dyb3VwT3B0aW9uLFxuICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBncnBMYWJlbCA9IGxhYmVsO1xuICAgICAgICBpZiAoZ3JwTGFiZWwgPT09IHVuZGVmaW5lZCAmJiBjaGlsZHJlbkFzRGF0YSkge1xuICAgICAgICAgIGdycExhYmVsID0gZGF0YS5sYWJlbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdGlvbiBHcm91cFxuICAgICAgICBmbGF0dGVuTGlzdC5wdXNoKHtcbiAgICAgICAgICBrZXk6IGdldEtleShkYXRhLCBmbGF0dGVuTGlzdC5sZW5ndGgpLFxuICAgICAgICAgIGdyb3VwOiB0cnVlLFxuICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgbGFiZWw6IGdycExhYmVsXG4gICAgICAgIH0pO1xuICAgICAgICBkaWcoZGF0YVtmaWVsZE9wdGlvbnNdLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBkaWcob3B0aW9ucywgZmFsc2UpO1xuICByZXR1cm4gZmxhdHRlbkxpc3Q7XG59XG5cbi8qKlxuICogSW5qZWN0IGBwcm9wc2AgaW50byBgb3B0aW9uYCBmb3IgbGVnYWN5IHVzYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RQcm9wc1dpdGhPcHRpb24ob3B0aW9uKSB7XG4gIHZhciBuZXdPcHRpb24gPSBfb2JqZWN0U3ByZWFkKHt9LCBvcHRpb24pO1xuICBpZiAoISgncHJvcHMnIGluIG5ld09wdGlvbikpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T3B0aW9uLCAncHJvcHMnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgd2FybmluZyhmYWxzZSwgJ1JldHVybiB0eXBlIGlzIG9wdGlvbiBpbnN0ZWFkIG9mIE9wdGlvbiBpbnN0YW5jZS4gUGxlYXNlIHJlYWQgdmFsdWUgZGlyZWN0bHkgaW5zdGVhZCBvZiByZWFkaW5nIGZyb20gYHByb3BzYC4nKTtcbiAgICAgICAgcmV0dXJuIG5ld09wdGlvbjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbmV3T3B0aW9uO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlcGFyYXRlZENvbnRlbnQodGV4dCwgdG9rZW5zKSB7XG4gIGlmICghdG9rZW5zIHx8ICF0b2tlbnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIG1hdGNoID0gZmFsc2U7XG4gIGZ1bmN0aW9uIHNlcGFyYXRlKHN0ciwgX3JlZjMpIHtcbiAgICB2YXIgX3JlZjQgPSBfdG9BcnJheShfcmVmMyksXG4gICAgICB0b2tlbiA9IF9yZWY0WzBdLFxuICAgICAgcmVzdFRva2VucyA9IF9yZWY0LnNsaWNlKDEpO1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiBbc3RyXTtcbiAgICB9XG4gICAgdmFyIGxpc3QgPSBzdHIuc3BsaXQodG9rZW4pO1xuICAgIG1hdGNoID0gbWF0Y2ggfHwgbGlzdC5sZW5ndGggPiAxO1xuICAgIHJldHVybiBsaXN0LnJlZHVjZShmdW5jdGlvbiAocHJldkxpc3QsIHVuaXRTdHIpIHtcbiAgICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHByZXZMaXN0KSwgX3RvQ29uc3VtYWJsZUFycmF5KHNlcGFyYXRlKHVuaXRTdHIsIHJlc3RUb2tlbnMpKSk7XG4gICAgfSwgW10pLmZpbHRlcihmdW5jdGlvbiAodW5pdCkge1xuICAgICAgcmV0dXJuIHVuaXQ7XG4gICAgfSk7XG4gIH1cbiAgdmFyIGxpc3QgPSBzZXBhcmF0ZSh0ZXh0LCB0b2tlbnMpO1xuICByZXR1cm4gbWF0Y2ggPyBsaXN0IDogbnVsbDtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJpZFwiLCBcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcInNob3dTZWFyY2hcIiwgXCJ0YWdSZW5kZXJcIiwgXCJkaXJlY3Rpb25cIiwgXCJvbWl0RG9tUHJvcHNcIiwgXCJkaXNwbGF5VmFsdWVzXCIsIFwib25EaXNwbGF5VmFsdWVzQ2hhbmdlXCIsIFwiZW1wdHlPcHRpb25zXCIsIFwibm90Rm91bmRDb250ZW50XCIsIFwib25DbGVhclwiLCBcIm1vZGVcIiwgXCJkaXNhYmxlZFwiLCBcImxvYWRpbmdcIiwgXCJnZXRJbnB1dEVsZW1lbnRcIiwgXCJnZXRSYXdJbnB1dEVsZW1lbnRcIiwgXCJvcGVuXCIsIFwiZGVmYXVsdE9wZW5cIiwgXCJvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZVwiLCBcImFjdGl2ZVZhbHVlXCIsIFwib25BY3RpdmVWYWx1ZUNoYW5nZVwiLCBcImFjdGl2ZURlc2NlbmRhbnRJZFwiLCBcInNlYXJjaFZhbHVlXCIsIFwiYXV0b0NsZWFyU2VhcmNoVmFsdWVcIiwgXCJvblNlYXJjaFwiLCBcIm9uU2VhcmNoU3BsaXRcIiwgXCJ0b2tlblNlcGFyYXRvcnNcIiwgXCJhbGxvd0NsZWFyXCIsIFwic2hvd0Fycm93XCIsIFwiaW5wdXRJY29uXCIsIFwiY2xlYXJJY29uXCIsIFwiT3B0aW9uTGlzdFwiLCBcImFuaW1hdGlvblwiLCBcInRyYW5zaXRpb25OYW1lXCIsIFwiZHJvcGRvd25TdHlsZVwiLCBcImRyb3Bkb3duQ2xhc3NOYW1lXCIsIFwiZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoXCIsIFwiZHJvcGRvd25SZW5kZXJcIiwgXCJkcm9wZG93bkFsaWduXCIsIFwicGxhY2VtZW50XCIsIFwiZ2V0UG9wdXBDb250YWluZXJcIiwgXCJzaG93QWN0aW9uXCIsIFwib25Gb2N1c1wiLCBcIm9uQmx1clwiLCBcIm9uS2V5VXBcIiwgXCJvbktleURvd25cIiwgXCJvbk1vdXNlRG93blwiXTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IGlzTW9iaWxlIGZyb20gXCJyYy11dGlsL2VzL2lzTW9iaWxlXCI7XG5pbXBvcnQgS2V5Q29kZSBmcm9tIFwicmMtdXRpbC9lcy9LZXlDb2RlXCI7XG5pbXBvcnQgeyB1c2VDb21wb3NlUmVmIH0gZnJvbSBcInJjLXV0aWwvZXMvcmVmXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBCYXNlU2VsZWN0Q29udGV4dCB9IGZyb20gXCIuL2hvb2tzL3VzZUJhc2VQcm9wc1wiO1xuaW1wb3J0IHVzZURlbGF5UmVzZXQgZnJvbSBcIi4vaG9va3MvdXNlRGVsYXlSZXNldFwiO1xuaW1wb3J0IHVzZUxvY2sgZnJvbSBcIi4vaG9va3MvdXNlTG9ja1wiO1xuaW1wb3J0IHVzZVNlbGVjdFRyaWdnZXJDb250cm9sIGZyb20gXCIuL2hvb2tzL3VzZVNlbGVjdFRyaWdnZXJDb250cm9sXCI7XG5pbXBvcnQgU2VsZWN0b3IgZnJvbSBcIi4vU2VsZWN0b3JcIjtcbmltcG9ydCBTZWxlY3RUcmlnZ2VyIGZyb20gXCIuL1NlbGVjdFRyaWdnZXJcIjtcbmltcG9ydCBUcmFuc0J0biBmcm9tIFwiLi9UcmFuc0J0blwiO1xuaW1wb3J0IHsgZ2V0U2VwYXJhdGVkQ29udGVudCB9IGZyb20gXCIuL3V0aWxzL3ZhbHVlVXRpbFwiO1xudmFyIERFRkFVTFRfT01JVF9QUk9QUyA9IFsndmFsdWUnLCAnb25DaGFuZ2UnLCAncmVtb3ZlSWNvbicsICdwbGFjZWhvbGRlcicsICdhdXRvRm9jdXMnLCAnbWF4VGFnQ291bnQnLCAnbWF4VGFnVGV4dExlbmd0aCcsICdtYXhUYWdQbGFjZWhvbGRlcicsICdjaG9pY2VUcmFuc2l0aW9uTmFtZScsICdvbklucHV0S2V5RG93bicsICdvblBvcHVwU2Nyb2xsJywgJ3RhYkluZGV4J107XG5leHBvcnQgZnVuY3Rpb24gaXNNdWx0aXBsZShtb2RlKSB7XG4gIHJldHVybiBtb2RlID09PSAndGFncycgfHwgbW9kZSA9PT0gJ211bHRpcGxlJztcbn1cbnZhciBCYXNlU2VsZWN0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9jdXN0b21pemVSYXdJbnB1dEVsZSwgX2NsYXNzTmFtZXMyO1xuICB2YXIgaWQgPSBwcm9wcy5pZCxcbiAgICBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHNob3dTZWFyY2ggPSBwcm9wcy5zaG93U2VhcmNoLFxuICAgIHRhZ1JlbmRlciA9IHByb3BzLnRhZ1JlbmRlcixcbiAgICBkaXJlY3Rpb24gPSBwcm9wcy5kaXJlY3Rpb24sXG4gICAgb21pdERvbVByb3BzID0gcHJvcHMub21pdERvbVByb3BzLFxuICAgIGRpc3BsYXlWYWx1ZXMgPSBwcm9wcy5kaXNwbGF5VmFsdWVzLFxuICAgIG9uRGlzcGxheVZhbHVlc0NoYW5nZSA9IHByb3BzLm9uRGlzcGxheVZhbHVlc0NoYW5nZSxcbiAgICBlbXB0eU9wdGlvbnMgPSBwcm9wcy5lbXB0eU9wdGlvbnMsXG4gICAgX3Byb3BzJG5vdEZvdW5kQ29udGVuID0gcHJvcHMubm90Rm91bmRDb250ZW50LFxuICAgIG5vdEZvdW5kQ29udGVudCA9IF9wcm9wcyRub3RGb3VuZENvbnRlbiA9PT0gdm9pZCAwID8gJ05vdCBGb3VuZCcgOiBfcHJvcHMkbm90Rm91bmRDb250ZW4sXG4gICAgb25DbGVhciA9IHByb3BzLm9uQ2xlYXIsXG4gICAgbW9kZSA9IHByb3BzLm1vZGUsXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBsb2FkaW5nID0gcHJvcHMubG9hZGluZyxcbiAgICBnZXRJbnB1dEVsZW1lbnQgPSBwcm9wcy5nZXRJbnB1dEVsZW1lbnQsXG4gICAgZ2V0UmF3SW5wdXRFbGVtZW50ID0gcHJvcHMuZ2V0UmF3SW5wdXRFbGVtZW50LFxuICAgIG9wZW4gPSBwcm9wcy5vcGVuLFxuICAgIGRlZmF1bHRPcGVuID0gcHJvcHMuZGVmYXVsdE9wZW4sXG4gICAgb25Ecm9wZG93blZpc2libGVDaGFuZ2UgPSBwcm9wcy5vbkRyb3Bkb3duVmlzaWJsZUNoYW5nZSxcbiAgICBhY3RpdmVWYWx1ZSA9IHByb3BzLmFjdGl2ZVZhbHVlLFxuICAgIG9uQWN0aXZlVmFsdWVDaGFuZ2UgPSBwcm9wcy5vbkFjdGl2ZVZhbHVlQ2hhbmdlLFxuICAgIGFjdGl2ZURlc2NlbmRhbnRJZCA9IHByb3BzLmFjdGl2ZURlc2NlbmRhbnRJZCxcbiAgICBzZWFyY2hWYWx1ZSA9IHByb3BzLnNlYXJjaFZhbHVlLFxuICAgIGF1dG9DbGVhclNlYXJjaFZhbHVlID0gcHJvcHMuYXV0b0NsZWFyU2VhcmNoVmFsdWUsXG4gICAgb25TZWFyY2ggPSBwcm9wcy5vblNlYXJjaCxcbiAgICBvblNlYXJjaFNwbGl0ID0gcHJvcHMub25TZWFyY2hTcGxpdCxcbiAgICB0b2tlblNlcGFyYXRvcnMgPSBwcm9wcy50b2tlblNlcGFyYXRvcnMsXG4gICAgYWxsb3dDbGVhciA9IHByb3BzLmFsbG93Q2xlYXIsXG4gICAgc2hvd0Fycm93ID0gcHJvcHMuc2hvd0Fycm93LFxuICAgIGlucHV0SWNvbiA9IHByb3BzLmlucHV0SWNvbixcbiAgICBjbGVhckljb24gPSBwcm9wcy5jbGVhckljb24sXG4gICAgT3B0aW9uTGlzdCA9IHByb3BzLk9wdGlvbkxpc3QsXG4gICAgYW5pbWF0aW9uID0gcHJvcHMuYW5pbWF0aW9uLFxuICAgIHRyYW5zaXRpb25OYW1lID0gcHJvcHMudHJhbnNpdGlvbk5hbWUsXG4gICAgZHJvcGRvd25TdHlsZSA9IHByb3BzLmRyb3Bkb3duU3R5bGUsXG4gICAgZHJvcGRvd25DbGFzc05hbWUgPSBwcm9wcy5kcm9wZG93bkNsYXNzTmFtZSxcbiAgICBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGggPSBwcm9wcy5kcm9wZG93bk1hdGNoU2VsZWN0V2lkdGgsXG4gICAgZHJvcGRvd25SZW5kZXIgPSBwcm9wcy5kcm9wZG93blJlbmRlcixcbiAgICBkcm9wZG93bkFsaWduID0gcHJvcHMuZHJvcGRvd25BbGlnbixcbiAgICBwbGFjZW1lbnQgPSBwcm9wcy5wbGFjZW1lbnQsXG4gICAgZ2V0UG9wdXBDb250YWluZXIgPSBwcm9wcy5nZXRQb3B1cENvbnRhaW5lcixcbiAgICBfcHJvcHMkc2hvd0FjdGlvbiA9IHByb3BzLnNob3dBY3Rpb24sXG4gICAgc2hvd0FjdGlvbiA9IF9wcm9wcyRzaG93QWN0aW9uID09PSB2b2lkIDAgPyBbXSA6IF9wcm9wcyRzaG93QWN0aW9uLFxuICAgIG9uRm9jdXMgPSBwcm9wcy5vbkZvY3VzLFxuICAgIG9uQmx1ciA9IHByb3BzLm9uQmx1cixcbiAgICBvbktleVVwID0gcHJvcHMub25LZXlVcCxcbiAgICBvbktleURvd24gPSBwcm9wcy5vbktleURvd24sXG4gICAgb25Nb3VzZURvd24gPSBwcm9wcy5vbk1vdXNlRG93bixcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1JU0MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtdWx0aXBsZSA9IGlzTXVsdGlwbGUobW9kZSk7XG4gIHZhciBtZXJnZWRTaG93U2VhcmNoID0gKHNob3dTZWFyY2ggIT09IHVuZGVmaW5lZCA/IHNob3dTZWFyY2ggOiBtdWx0aXBsZSkgfHwgbW9kZSA9PT0gJ2NvbWJvYm94JztcbiAgdmFyIGRvbVByb3BzID0gX29iamVjdFNwcmVhZCh7fSwgcmVzdFByb3BzKTtcbiAgREVGQVVMVF9PTUlUX1BST1BTLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gICAgZGVsZXRlIGRvbVByb3BzW3Byb3BOYW1lXTtcbiAgfSk7XG4gIG9taXREb21Qcm9wcyA9PT0gbnVsbCB8fCBvbWl0RG9tUHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9taXREb21Qcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgIGRlbGV0ZSBkb21Qcm9wc1twcm9wTmFtZV07XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1vYmlsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIG1vYmlsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0TW9iaWxlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBPbmx5IHVwZGF0ZSBvbiB0aGUgY2xpZW50IHNpZGVcbiAgICBzZXRNb2JpbGUoaXNNb2JpbGUoKSk7XG4gIH0sIFtdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVmcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGNvbnRhaW5lclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIHNlbGVjdG9yRG9tUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgdHJpZ2dlclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIHNlbGVjdG9yUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgbGlzdFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcblxuICAvKiogVXNlZCBmb3IgY29tcG9uZW50IGZvY3VzZWQgbWFuYWdlbWVudCAqL1xuICB2YXIgX3VzZURlbGF5UmVzZXQgPSB1c2VEZWxheVJlc2V0KCksXG4gICAgX3VzZURlbGF5UmVzZXQyID0gX3NsaWNlZFRvQXJyYXkoX3VzZURlbGF5UmVzZXQsIDMpLFxuICAgIG1vY2tGb2N1c2VkID0gX3VzZURlbGF5UmVzZXQyWzBdLFxuICAgIHNldE1vY2tGb2N1c2VkID0gX3VzZURlbGF5UmVzZXQyWzFdLFxuICAgIGNhbmNlbFNldE1vY2tGb2N1c2VkID0gX3VzZURlbGF5UmVzZXQyWzJdO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBJbXBlcmF0aXZlID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBfc2VsZWN0b3JSZWYkY3VycmVudCwgX3NlbGVjdG9yUmVmJGN1cnJlbnQyO1xuICAgIHJldHVybiB7XG4gICAgICBmb2N1czogKF9zZWxlY3RvclJlZiRjdXJyZW50ID0gc2VsZWN0b3JSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3NlbGVjdG9yUmVmJGN1cnJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zZWxlY3RvclJlZiRjdXJyZW50LmZvY3VzLFxuICAgICAgYmx1cjogKF9zZWxlY3RvclJlZiRjdXJyZW50MiA9IHNlbGVjdG9yUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9zZWxlY3RvclJlZiRjdXJyZW50MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3NlbGVjdG9yUmVmJGN1cnJlbnQyLmJsdXIsXG4gICAgICBzY3JvbGxUbzogZnVuY3Rpb24gc2Nyb2xsVG8oYXJnKSB7XG4gICAgICAgIHZhciBfbGlzdFJlZiRjdXJyZW50O1xuICAgICAgICByZXR1cm4gKF9saXN0UmVmJGN1cnJlbnQgPSBsaXN0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9saXN0UmVmJGN1cnJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9saXN0UmVmJGN1cnJlbnQuc2Nyb2xsVG8oYXJnKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBTZWFyY2ggVmFsdWUgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG1lcmdlZFNlYXJjaFZhbHVlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9kaXNwbGF5VmFsdWVzJDtcbiAgICBpZiAobW9kZSAhPT0gJ2NvbWJvYm94Jykge1xuICAgICAgcmV0dXJuIHNlYXJjaFZhbHVlO1xuICAgIH1cbiAgICB2YXIgdmFsID0gKF9kaXNwbGF5VmFsdWVzJCA9IGRpc3BsYXlWYWx1ZXNbMF0pID09PSBudWxsIHx8IF9kaXNwbGF5VmFsdWVzJCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Rpc3BsYXlWYWx1ZXMkLnZhbHVlO1xuICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyA/IFN0cmluZyh2YWwpIDogJyc7XG4gIH0sIFtzZWFyY2hWYWx1ZSwgbW9kZSwgZGlzcGxheVZhbHVlc10pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IEN1c3RvbSBJbnB1dCA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBPbmx5IHdvcmtzIGluIGBjb21ib2JveGBcbiAgdmFyIGN1c3RvbWl6ZUlucHV0RWxlbWVudCA9IG1vZGUgPT09ICdjb21ib2JveCcgJiYgdHlwZW9mIGdldElucHV0RWxlbWVudCA9PT0gJ2Z1bmN0aW9uJyAmJiBnZXRJbnB1dEVsZW1lbnQoKSB8fCBudWxsO1xuXG4gIC8vIFVzZWQgZm9yIGN1c3RvbWl6ZSByZXBsYWNlbWVudCBmb3IgYHJjLWNhc2NhZGVyYFxuICB2YXIgY3VzdG9taXplUmF3SW5wdXRFbGVtZW50ID0gdHlwZW9mIGdldFJhd0lucHV0RWxlbWVudCA9PT0gJ2Z1bmN0aW9uJyAmJiBnZXRSYXdJbnB1dEVsZW1lbnQoKTtcbiAgdmFyIGN1c3RvbWl6ZVJhd0lucHV0UmVmID0gdXNlQ29tcG9zZVJlZihzZWxlY3RvckRvbVJlZiwgY3VzdG9taXplUmF3SW5wdXRFbGVtZW50ID09PSBudWxsIHx8IGN1c3RvbWl6ZVJhd0lucHV0RWxlbWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9jdXN0b21pemVSYXdJbnB1dEVsZSA9IGN1c3RvbWl6ZVJhd0lucHV0RWxlbWVudC5wcm9wcykgPT09IG51bGwgfHwgX2N1c3RvbWl6ZVJhd0lucHV0RWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY3VzdG9taXplUmF3SW5wdXRFbGUucmVmKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gT3BlbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKHVuZGVmaW5lZCwge1xuICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0T3BlbixcbiAgICAgIHZhbHVlOiBvcGVuXG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgaW5uZXJPcGVuID0gX3VzZU1lcmdlZFN0YXRlMlswXSxcbiAgICBzZXRJbm5lck9wZW4gPSBfdXNlTWVyZ2VkU3RhdGUyWzFdO1xuICB2YXIgbWVyZ2VkT3BlbiA9IGlubmVyT3BlbjtcblxuICAvLyBOb3QgdHJpZ2dlciBgb3BlbmAgaW4gYGNvbWJvYm94YCB3aGVuIGBub3RGb3VuZENvbnRlbnRgIGlzIGVtcHR5XG4gIHZhciBlbXB0eUxpc3RDb250ZW50ID0gIW5vdEZvdW5kQ29udGVudCAmJiBlbXB0eU9wdGlvbnM7XG4gIGlmIChkaXNhYmxlZCB8fCBlbXB0eUxpc3RDb250ZW50ICYmIG1lcmdlZE9wZW4gJiYgbW9kZSA9PT0gJ2NvbWJvYm94Jykge1xuICAgIG1lcmdlZE9wZW4gPSBmYWxzZTtcbiAgfVxuICB2YXIgdHJpZ2dlck9wZW4gPSBlbXB0eUxpc3RDb250ZW50ID8gZmFsc2UgOiBtZXJnZWRPcGVuO1xuICB2YXIgb25Ub2dnbGVPcGVuID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKG5ld09wZW4pIHtcbiAgICB2YXIgbmV4dE9wZW4gPSBuZXdPcGVuICE9PSB1bmRlZmluZWQgPyBuZXdPcGVuIDogIW1lcmdlZE9wZW47XG4gICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgc2V0SW5uZXJPcGVuKG5leHRPcGVuKTtcbiAgICAgIGlmIChtZXJnZWRPcGVuICE9PSBuZXh0T3Blbikge1xuICAgICAgICBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZSA9PT0gbnVsbCB8fCBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25Ecm9wZG93blZpc2libGVDaGFuZ2UobmV4dE9wZW4pO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW2Rpc2FibGVkLCBtZXJnZWRPcGVuLCBzZXRJbm5lck9wZW4sIG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2VhcmNoID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciB0b2tlbldpdGhFbnRlciA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAodG9rZW5TZXBhcmF0b3JzIHx8IFtdKS5zb21lKGZ1bmN0aW9uICh0b2tlblNlcGFyYXRvcikge1xuICAgICAgcmV0dXJuIFsnXFxuJywgJ1xcclxcbiddLmluY2x1ZGVzKHRva2VuU2VwYXJhdG9yKTtcbiAgICB9KTtcbiAgfSwgW3Rva2VuU2VwYXJhdG9yc10pO1xuICB2YXIgb25JbnRlcm5hbFNlYXJjaCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxTZWFyY2goc2VhcmNoVGV4dCwgZnJvbVR5cGluZywgaXNDb21wb3NpdGluZykge1xuICAgIHZhciByZXQgPSB0cnVlO1xuICAgIHZhciBuZXdTZWFyY2hUZXh0ID0gc2VhcmNoVGV4dDtcbiAgICBvbkFjdGl2ZVZhbHVlQ2hhbmdlID09PSBudWxsIHx8IG9uQWN0aXZlVmFsdWVDaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQWN0aXZlVmFsdWVDaGFuZ2UobnVsbCk7XG5cbiAgICAvLyBDaGVjayBpZiBtYXRjaCB0aGUgYHRva2VuU2VwYXJhdG9yc2BcbiAgICB2YXIgcGF0Y2hMYWJlbHMgPSBpc0NvbXBvc2l0aW5nID8gbnVsbCA6IGdldFNlcGFyYXRlZENvbnRlbnQoc2VhcmNoVGV4dCwgdG9rZW5TZXBhcmF0b3JzKTtcblxuICAgIC8vIElnbm9yZSBjb21ib2JveCBzaW5jZSBpdCdzIG5vdCBzcGxpdC1hYmxlXG4gICAgaWYgKG1vZGUgIT09ICdjb21ib2JveCcgJiYgcGF0Y2hMYWJlbHMpIHtcbiAgICAgIG5ld1NlYXJjaFRleHQgPSAnJztcbiAgICAgIG9uU2VhcmNoU3BsaXQgPT09IG51bGwgfHwgb25TZWFyY2hTcGxpdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25TZWFyY2hTcGxpdChwYXRjaExhYmVscyk7XG5cbiAgICAgIC8vIFNob3VsZCBjbG9zZSB3aGVuIHBhc3RlIGZpbmlzaFxuICAgICAgb25Ub2dnbGVPcGVuKGZhbHNlKTtcblxuICAgICAgLy8gVGVsbCBTZWxlY3RvciB0aGF0IGJyZWFrIG5leHQgYWN0aW9uc1xuICAgICAgcmV0ID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChvblNlYXJjaCAmJiBtZXJnZWRTZWFyY2hWYWx1ZSAhPT0gbmV3U2VhcmNoVGV4dCkge1xuICAgICAgb25TZWFyY2gobmV3U2VhcmNoVGV4dCwge1xuICAgICAgICBzb3VyY2U6IGZyb21UeXBpbmcgPyAndHlwaW5nJyA6ICdlZmZlY3QnXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcblxuICAvLyBPbmx5IHRyaWdnZXJlZCB3aGVuIG1lbnUgaXMgY2xvc2VkICYgbW9kZSBpcyB0YWdzXG4gIC8vIElmIG1lbnUgaXMgb3BlbiwgT3B0aW9uTGlzdCB3aWxsIHRha2UgY2hhcmdlXG4gIC8vIElmIG1vZGUgaXNuJ3QgdGFncywgcHJlc3MgZW50ZXIgaXMgbm90IG1lYW5pbmdmdWwgd2hlbiB5b3UgY2FuJ3Qgc2VlIGFueSBvcHRpb25cbiAgdmFyIG9uSW50ZXJuYWxTZWFyY2hTdWJtaXQgPSBmdW5jdGlvbiBvbkludGVybmFsU2VhcmNoU3VibWl0KHNlYXJjaFRleHQpIHtcbiAgICAvLyBwcmV2ZW50IGVtcHR5IHRhZ3MgZnJvbSBhcHBlYXJpbmcgd2hlbiB5b3UgY2xpY2sgdGhlIEVudGVyIGJ1dHRvblxuICAgIGlmICghc2VhcmNoVGV4dCB8fCAhc2VhcmNoVGV4dC50cmltKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgb25TZWFyY2goc2VhcmNoVGV4dCwge1xuICAgICAgc291cmNlOiAnc3VibWl0J1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIENsb3NlIHdpbGwgY2xlYW4gdXAgc2luZ2xlIG1vZGUgc2VhcmNoIHRleHRcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIW1lcmdlZE9wZW4gJiYgIW11bHRpcGxlICYmIG1vZGUgIT09ICdjb21ib2JveCcpIHtcbiAgICAgIG9uSW50ZXJuYWxTZWFyY2goJycsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuICB9LCBbbWVyZ2VkT3Blbl0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRGlzYWJsZWQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDbG9zZSBkcm9wZG93biAmIHJlbW92ZSBmb2N1cyBzdGF0ZSB3aGVuIGRpc2FibGVkIGNoYW5nZVxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpbm5lck9wZW4gJiYgZGlzYWJsZWQpIHtcbiAgICAgIHNldElubmVyT3BlbihmYWxzZSk7XG4gICAgfVxuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgc2V0TW9ja0ZvY3VzZWQoZmFsc2UpO1xuICAgIH1cbiAgfSwgW2Rpc2FibGVkXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBLZXlib2FyZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8qKlxuICAgKiBXZSByZWNvcmQgaW5wdXQgdmFsdWUgaGVyZSB0byBjaGVjayBpZiBjYW4gcHJlc3MgdG8gY2xlYW4gdXAgYnkgYmFja3NwYWNlXG4gICAqIC0gbnVsbDogS2V5IGlzIG5vdCBkb3duLCB0aGlzIGlzIHJlc2V0IGJ5IGtleSB1cFxuICAgKiAtIHRydWU6IFNlYXJjaCB0ZXh0IGlzIGVtcHR5IHdoZW4gZmlyc3QgdGltZSBiYWNrc3BhY2UgZG93blxuICAgKiAtIGZhbHNlOiBTZWFyY2ggdGV4dCBpcyBub3QgZW1wdHkgd2hlbiBmaXJzdCB0aW1lIGJhY2tzcGFjZSBkb3duXG4gICAqL1xuICB2YXIgX3VzZUxvY2sgPSB1c2VMb2NrKCksXG4gICAgX3VzZUxvY2syID0gX3NsaWNlZFRvQXJyYXkoX3VzZUxvY2ssIDIpLFxuICAgIGdldENsZWFyTG9jayA9IF91c2VMb2NrMlswXSxcbiAgICBzZXRDbGVhckxvY2sgPSBfdXNlTG9jazJbMV07XG5cbiAgLy8gS2V5RG93blxuICB2YXIgb25JbnRlcm5hbEtleURvd24gPSBmdW5jdGlvbiBvbkludGVybmFsS2V5RG93bihldmVudCkge1xuICAgIHZhciBjbGVhckxvY2sgPSBnZXRDbGVhckxvY2soKTtcbiAgICB2YXIgd2hpY2ggPSBldmVudC53aGljaDtcbiAgICBpZiAod2hpY2ggPT09IEtleUNvZGUuRU5URVIpIHtcbiAgICAgIC8vIERvIG5vdCBzdWJtaXQgZm9ybSB3aGVuIHR5cGUgaW4gdGhlIGlucHV0XG4gICAgICBpZiAobW9kZSAhPT0gJ2NvbWJvYm94Jykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBvbmx5IG1hbmFnZSBvcGVuIHN0YXRlIGhlcmUsIGNsb3NlIGxvZ2ljIHNob3VsZCBoYW5kbGUgYnkgbGlzdCBjb21wb25lbnRcbiAgICAgIGlmICghbWVyZ2VkT3Blbikge1xuICAgICAgICBvblRvZ2dsZU9wZW4odHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHNldENsZWFyTG9jayghIW1lcmdlZFNlYXJjaFZhbHVlKTtcblxuICAgIC8vIFJlbW92ZSB2YWx1ZSBieSBgYmFja3NwYWNlYFxuICAgIGlmICh3aGljaCA9PT0gS2V5Q29kZS5CQUNLU1BBQ0UgJiYgIWNsZWFyTG9jayAmJiBtdWx0aXBsZSAmJiAhbWVyZ2VkU2VhcmNoVmFsdWUgJiYgZGlzcGxheVZhbHVlcy5sZW5ndGgpIHtcbiAgICAgIHZhciBjbG9uZURpc3BsYXlWYWx1ZXMgPSBfdG9Db25zdW1hYmxlQXJyYXkoZGlzcGxheVZhbHVlcyk7XG4gICAgICB2YXIgcmVtb3ZlZERpc3BsYXlWYWx1ZSA9IG51bGw7XG4gICAgICBmb3IgKHZhciBpID0gY2xvbmVEaXNwbGF5VmFsdWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgICAgIHZhciBjdXJyZW50ID0gY2xvbmVEaXNwbGF5VmFsdWVzW2ldO1xuICAgICAgICBpZiAoIWN1cnJlbnQuZGlzYWJsZWQpIHtcbiAgICAgICAgICBjbG9uZURpc3BsYXlWYWx1ZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIHJlbW92ZWREaXNwbGF5VmFsdWUgPSBjdXJyZW50O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmVtb3ZlZERpc3BsYXlWYWx1ZSkge1xuICAgICAgICBvbkRpc3BsYXlWYWx1ZXNDaGFuZ2UoY2xvbmVEaXNwbGF5VmFsdWVzLCB7XG4gICAgICAgICAgdHlwZTogJ3JlbW92ZScsXG4gICAgICAgICAgdmFsdWVzOiBbcmVtb3ZlZERpc3BsYXlWYWx1ZV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCByZXN0ID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIHJlc3RbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICBpZiAobWVyZ2VkT3BlbiAmJiBsaXN0UmVmLmN1cnJlbnQpIHtcbiAgICAgIHZhciBfbGlzdFJlZiRjdXJyZW50MjtcbiAgICAgIChfbGlzdFJlZiRjdXJyZW50MiA9IGxpc3RSZWYuY3VycmVudCkub25LZXlEb3duLmFwcGx5KF9saXN0UmVmJGN1cnJlbnQyLCBbZXZlbnRdLmNvbmNhdChyZXN0KSk7XG4gICAgfVxuICAgIG9uS2V5RG93biA9PT0gbnVsbCB8fCBvbktleURvd24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uS2V5RG93bi5hcHBseSh2b2lkIDAsIFtldmVudF0uY29uY2F0KHJlc3QpKTtcbiAgfTtcblxuICAvLyBLZXlVcFxuICB2YXIgb25JbnRlcm5hbEtleVVwID0gZnVuY3Rpb24gb25JbnRlcm5hbEtleVVwKGV2ZW50KSB7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCByZXN0ID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIHJlc3RbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuICAgIGlmIChtZXJnZWRPcGVuICYmIGxpc3RSZWYuY3VycmVudCkge1xuICAgICAgdmFyIF9saXN0UmVmJGN1cnJlbnQzO1xuICAgICAgKF9saXN0UmVmJGN1cnJlbnQzID0gbGlzdFJlZi5jdXJyZW50KS5vbktleVVwLmFwcGx5KF9saXN0UmVmJGN1cnJlbnQzLCBbZXZlbnRdLmNvbmNhdChyZXN0KSk7XG4gICAgfVxuICAgIG9uS2V5VXAgPT09IG51bGwgfHwgb25LZXlVcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25LZXlVcC5hcHBseSh2b2lkIDAsIFtldmVudF0uY29uY2F0KHJlc3QpKTtcbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNlbGVjdG9yID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9uU2VsZWN0b3JSZW1vdmUgPSBmdW5jdGlvbiBvblNlbGVjdG9yUmVtb3ZlKHZhbCkge1xuICAgIHZhciBuZXdWYWx1ZXMgPSBkaXNwbGF5VmFsdWVzLmZpbHRlcihmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGkgIT09IHZhbDtcbiAgICB9KTtcbiAgICBvbkRpc3BsYXlWYWx1ZXNDaGFuZ2UobmV3VmFsdWVzLCB7XG4gICAgICB0eXBlOiAncmVtb3ZlJyxcbiAgICAgIHZhbHVlczogW3ZhbF1cbiAgICB9KTtcbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBGb2N1cyAvIEJsdXIgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqIFJlY29yZCByZWFsIGZvY3VzIHN0YXR1cyAqL1xuICB2YXIgZm9jdXNSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICB2YXIgb25Db250YWluZXJGb2N1cyA9IGZ1bmN0aW9uIG9uQ29udGFpbmVyRm9jdXMoKSB7XG4gICAgc2V0TW9ja0ZvY3VzZWQodHJ1ZSk7XG4gICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgaWYgKG9uRm9jdXMgJiYgIWZvY3VzUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgb25Gb2N1cy5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGBzaG93QWN0aW9uYCBzaG91bGQgaGFuZGxlIGBmb2N1c2AgaWYgc2V0XG4gICAgICBpZiAoc2hvd0FjdGlvbi5pbmNsdWRlcygnZm9jdXMnKSkge1xuICAgICAgICBvblRvZ2dsZU9wZW4odHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvY3VzUmVmLmN1cnJlbnQgPSB0cnVlO1xuICB9O1xuICB2YXIgb25Db250YWluZXJCbHVyID0gZnVuY3Rpb24gb25Db250YWluZXJCbHVyKCkge1xuICAgIHNldE1vY2tGb2N1c2VkKGZhbHNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICBmb2N1c1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICBvblRvZ2dsZU9wZW4oZmFsc2UpO1xuICAgIH0pO1xuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobWVyZ2VkU2VhcmNoVmFsdWUpIHtcbiAgICAgIC8vIGB0YWdzYCBtb2RlIHNob3VsZCBtb3ZlIGBzZWFyY2hWYWx1ZWAgaW50byB2YWx1ZXNcbiAgICAgIGlmIChtb2RlID09PSAndGFncycpIHtcbiAgICAgICAgb25TZWFyY2gobWVyZ2VkU2VhcmNoVmFsdWUsIHtcbiAgICAgICAgICBzb3VyY2U6ICdzdWJtaXQnXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICAgIC8vIGBtdWx0aXBsZWAgbW9kZSBvbmx5IGNsZWFuIHRoZSBzZWFyY2ggdmFsdWUgYnV0IG5vdCB0cmlnZ2VyIGV2ZW50XG4gICAgICAgIG9uU2VhcmNoKCcnLCB7XG4gICAgICAgICAgc291cmNlOiAnYmx1cidcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvbkJsdXIpIHtcbiAgICAgIG9uQmx1ci5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9O1xuXG4gIC8vIEdpdmUgZm9jdXMgYmFjayBvZiBTZWxlY3RcbiAgdmFyIGFjdGl2ZVRpbWVvdXRJZHMgPSBbXTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgYWN0aXZlVGltZW91dElkcy5mb3JFYWNoKGZ1bmN0aW9uICh0aW1lb3V0SWQpIHtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgfSk7XG4gICAgICBhY3RpdmVUaW1lb3V0SWRzLnNwbGljZSgwLCBhY3RpdmVUaW1lb3V0SWRzLmxlbmd0aCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICB2YXIgb25JbnRlcm5hbE1vdXNlRG93biA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxNb3VzZURvd24oZXZlbnQpIHtcbiAgICB2YXIgX3RyaWdnZXJSZWYkY3VycmVudDtcbiAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIHZhciBwb3B1cEVsZW1lbnQgPSAoX3RyaWdnZXJSZWYkY3VycmVudCA9IHRyaWdnZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3RyaWdnZXJSZWYkY3VycmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RyaWdnZXJSZWYkY3VycmVudC5nZXRQb3B1cEVsZW1lbnQoKTtcblxuICAgIC8vIFdlIHNob3VsZCBnaXZlIGZvY3VzIGJhY2sgdG8gc2VsZWN0b3IgaWYgY2xpY2tlZCBpdGVtIGlzIG5vdCBmb2N1c2FibGVcbiAgICBpZiAocG9wdXBFbGVtZW50ICYmIHBvcHVwRWxlbWVudC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICB2YXIgdGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGFjdGl2ZVRpbWVvdXRJZHMuaW5kZXhPZih0aW1lb3V0SWQpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgYWN0aXZlVGltZW91dElkcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICAgIGNhbmNlbFNldE1vY2tGb2N1c2VkKCk7XG4gICAgICAgIGlmICghbW9iaWxlICYmICFwb3B1cEVsZW1lbnQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICB2YXIgX3NlbGVjdG9yUmVmJGN1cnJlbnQzO1xuICAgICAgICAgIChfc2VsZWN0b3JSZWYkY3VycmVudDMgPSBzZWxlY3RvclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfc2VsZWN0b3JSZWYkY3VycmVudDMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zZWxlY3RvclJlZiRjdXJyZW50My5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFjdGl2ZVRpbWVvdXRJZHMucHVzaCh0aW1lb3V0SWQpO1xuICAgIH1cbiAgICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlc3RBcmdzID0gbmV3IEFycmF5KF9sZW4zID4gMSA/IF9sZW4zIC0gMSA6IDApLCBfa2V5MyA9IDE7IF9rZXkzIDwgX2xlbjM7IF9rZXkzKyspIHtcbiAgICAgIHJlc3RBcmdzW19rZXkzIC0gMV0gPSBhcmd1bWVudHNbX2tleTNdO1xuICAgIH1cbiAgICBvbk1vdXNlRG93biA9PT0gbnVsbCB8fCBvbk1vdXNlRG93biA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25Nb3VzZURvd24uYXBwbHkodm9pZCAwLCBbZXZlbnRdLmNvbmNhdChyZXN0QXJncykpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRHJvcGRvd24gPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKG51bGwpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICBjb250YWluZXJXaWR0aCA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgc2V0Q29udGFpbmVyV2lkdGggPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlNSA9IFJlYWN0LnVzZVN0YXRlKHt9KSxcbiAgICBfUmVhY3QkdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlNSwgMiksXG4gICAgZm9yY2VVcGRhdGUgPSBfUmVhY3QkdXNlU3RhdGU2WzFdO1xuICAvLyBXZSBuZWVkIGZvcmNlIHVwZGF0ZSBoZXJlIHNpbmNlIHBvcHVwIGRvbSBpcyByZW5kZXIgYXN5bmNcbiAgZnVuY3Rpb24gb25Qb3B1cE1vdXNlRW50ZXIoKSB7XG4gICAgZm9yY2VVcGRhdGUoe30pO1xuICB9XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRyaWdnZXJPcGVuKSB7XG4gICAgICB2YXIgX2NvbnRhaW5lclJlZiRjdXJyZW50O1xuICAgICAgdmFyIG5ld1dpZHRoID0gTWF0aC5jZWlsKChfY29udGFpbmVyUmVmJGN1cnJlbnQgPSBjb250YWluZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2NvbnRhaW5lclJlZiRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY29udGFpbmVyUmVmJGN1cnJlbnQub2Zmc2V0V2lkdGgpO1xuICAgICAgaWYgKGNvbnRhaW5lcldpZHRoICE9PSBuZXdXaWR0aCAmJiAhTnVtYmVyLmlzTmFOKG5ld1dpZHRoKSkge1xuICAgICAgICBzZXRDb250YWluZXJXaWR0aChuZXdXaWR0aCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbdHJpZ2dlck9wZW5dKTtcblxuICAvLyBVc2VkIGZvciByYXcgY3VzdG9tIGlucHV0IHRyaWdnZXJcbiAgdmFyIG9uVHJpZ2dlclZpc2libGVDaGFuZ2U7XG4gIGlmIChjdXN0b21pemVSYXdJbnB1dEVsZW1lbnQpIHtcbiAgICBvblRyaWdnZXJWaXNpYmxlQ2hhbmdlID0gZnVuY3Rpb24gb25UcmlnZ2VyVmlzaWJsZUNoYW5nZShuZXdPcGVuKSB7XG4gICAgICBvblRvZ2dsZU9wZW4obmV3T3Blbik7XG4gICAgfTtcbiAgfVxuXG4gIC8vIENsb3NlIHdoZW4gY2xpY2sgb24gbm9uLXNlbGVjdCBlbGVtZW50XG4gIHVzZVNlbGVjdFRyaWdnZXJDb250cm9sKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3RyaWdnZXJSZWYkY3VycmVudDI7XG4gICAgcmV0dXJuIFtjb250YWluZXJSZWYuY3VycmVudCwgKF90cmlnZ2VyUmVmJGN1cnJlbnQyID0gdHJpZ2dlclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfdHJpZ2dlclJlZiRjdXJyZW50MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RyaWdnZXJSZWYkY3VycmVudDIuZ2V0UG9wdXBFbGVtZW50KCldO1xuICB9LCB0cmlnZ2VyT3Blbiwgb25Ub2dnbGVPcGVuLCAhIWN1c3RvbWl6ZVJhd0lucHV0RWxlbWVudCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb250ZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBiYXNlU2VsZWN0Q29udGV4dCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICAgIG5vdEZvdW5kQ29udGVudDogbm90Rm91bmRDb250ZW50LFxuICAgICAgb3BlbjogbWVyZ2VkT3BlbixcbiAgICAgIHRyaWdnZXJPcGVuOiB0cmlnZ2VyT3BlbixcbiAgICAgIGlkOiBpZCxcbiAgICAgIHNob3dTZWFyY2g6IG1lcmdlZFNob3dTZWFyY2gsXG4gICAgICBtdWx0aXBsZTogbXVsdGlwbGUsXG4gICAgICB0b2dnbGVPcGVuOiBvblRvZ2dsZU9wZW5cbiAgICB9KTtcbiAgfSwgW3Byb3BzLCBub3RGb3VuZENvbnRlbnQsIHRyaWdnZXJPcGVuLCBtZXJnZWRPcGVuLCBpZCwgbWVyZ2VkU2hvd1NlYXJjaCwgbXVsdGlwbGUsIG9uVG9nZ2xlT3Blbl0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQXJyb3cgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZXJnZWRTaG93QXJyb3cgPSBzaG93QXJyb3cgIT09IHVuZGVmaW5lZCA/IHNob3dBcnJvdyA6IGxvYWRpbmcgfHwgIW11bHRpcGxlICYmIG1vZGUgIT09ICdjb21ib2JveCc7XG4gIHZhciBhcnJvd05vZGU7XG4gIGlmIChtZXJnZWRTaG93QXJyb3cpIHtcbiAgICBhcnJvd05vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmFuc0J0biwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYXJyb3dcIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hcnJvdy1sb2FkaW5nXCIpLCBsb2FkaW5nKSksXG4gICAgICBjdXN0b21pemVJY29uOiBpbnB1dEljb24sXG4gICAgICBjdXN0b21pemVJY29uUHJvcHM6IHtcbiAgICAgICAgbG9hZGluZzogbG9hZGluZyxcbiAgICAgICAgc2VhcmNoVmFsdWU6IG1lcmdlZFNlYXJjaFZhbHVlLFxuICAgICAgICBvcGVuOiBtZXJnZWRPcGVuLFxuICAgICAgICBmb2N1c2VkOiBtb2NrRm9jdXNlZCxcbiAgICAgICAgc2hvd1NlYXJjaDogbWVyZ2VkU2hvd1NlYXJjaFxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ2xlYXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBjbGVhck5vZGU7XG4gIHZhciBvbkNsZWFyTW91c2VEb3duID0gZnVuY3Rpb24gb25DbGVhck1vdXNlRG93bigpIHtcbiAgICB2YXIgX3NlbGVjdG9yUmVmJGN1cnJlbnQ0O1xuICAgIG9uQ2xlYXIgPT09IG51bGwgfHwgb25DbGVhciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DbGVhcigpO1xuICAgIChfc2VsZWN0b3JSZWYkY3VycmVudDQgPSBzZWxlY3RvclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfc2VsZWN0b3JSZWYkY3VycmVudDQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zZWxlY3RvclJlZiRjdXJyZW50NC5mb2N1cygpO1xuICAgIG9uRGlzcGxheVZhbHVlc0NoYW5nZShbXSwge1xuICAgICAgdHlwZTogJ2NsZWFyJyxcbiAgICAgIHZhbHVlczogZGlzcGxheVZhbHVlc1xuICAgIH0pO1xuICAgIG9uSW50ZXJuYWxTZWFyY2goJycsIGZhbHNlLCBmYWxzZSk7XG4gIH07XG4gIGlmICghZGlzYWJsZWQgJiYgYWxsb3dDbGVhciAmJiAoZGlzcGxheVZhbHVlcy5sZW5ndGggfHwgbWVyZ2VkU2VhcmNoVmFsdWUpICYmICEobW9kZSA9PT0gJ2NvbWJvYm94JyAmJiBtZXJnZWRTZWFyY2hWYWx1ZSA9PT0gJycpKSB7XG4gICAgY2xlYXJOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJhbnNCdG4sIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jbGVhclwiKSxcbiAgICAgIG9uTW91c2VEb3duOiBvbkNsZWFyTW91c2VEb3duLFxuICAgICAgY3VzdG9taXplSWNvbjogY2xlYXJJY29uXG4gICAgfSwgXCJcXHhEN1wiKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBPcHRpb25MaXN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb3B0aW9uTGlzdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE9wdGlvbkxpc3QsIHtcbiAgICByZWY6IGxpc3RSZWZcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2VsZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZXJnZWRDbGFzc05hbWUgPSBjbGFzc05hbWVzKHByZWZpeENscywgY2xhc3NOYW1lLCAoX2NsYXNzTmFtZXMyID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZm9jdXNlZFwiKSwgbW9ja0ZvY3VzZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW11bHRpcGxlXCIpLCBtdWx0aXBsZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2luZ2xlXCIpLCAhbXVsdGlwbGUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFsbG93LWNsZWFyXCIpLCBhbGxvd0NsZWFyKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zaG93LWFycm93XCIpLCBtZXJnZWRTaG93QXJyb3cpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbG9hZGluZ1wiKSwgbG9hZGluZyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItb3BlblwiKSwgbWVyZ2VkT3BlbiksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY3VzdG9taXplLWlucHV0XCIpLCBjdXN0b21pemVJbnB1dEVsZW1lbnQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNob3ctc2VhcmNoXCIpLCBtZXJnZWRTaG93U2VhcmNoKSwgX2NsYXNzTmFtZXMyKSk7XG5cbiAgLy8gPj4+IFNlbGVjdG9yXG4gIHZhciBzZWxlY3Rvck5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RUcmlnZ2VyLCB7XG4gICAgcmVmOiB0cmlnZ2VyUmVmLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICB2aXNpYmxlOiB0cmlnZ2VyT3BlbixcbiAgICBwb3B1cEVsZW1lbnQ6IG9wdGlvbkxpc3QsXG4gICAgY29udGFpbmVyV2lkdGg6IGNvbnRhaW5lcldpZHRoLFxuICAgIGFuaW1hdGlvbjogYW5pbWF0aW9uLFxuICAgIHRyYW5zaXRpb25OYW1lOiB0cmFuc2l0aW9uTmFtZSxcbiAgICBkcm9wZG93blN0eWxlOiBkcm9wZG93blN0eWxlLFxuICAgIGRyb3Bkb3duQ2xhc3NOYW1lOiBkcm9wZG93bkNsYXNzTmFtZSxcbiAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGg6IGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCxcbiAgICBkcm9wZG93blJlbmRlcjogZHJvcGRvd25SZW5kZXIsXG4gICAgZHJvcGRvd25BbGlnbjogZHJvcGRvd25BbGlnbixcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIsXG4gICAgZW1wdHk6IGVtcHR5T3B0aW9ucyxcbiAgICBnZXRUcmlnZ2VyRE9NTm9kZTogZnVuY3Rpb24gZ2V0VHJpZ2dlckRPTU5vZGUoKSB7XG4gICAgICByZXR1cm4gc2VsZWN0b3JEb21SZWYuY3VycmVudDtcbiAgICB9LFxuICAgIG9uUG9wdXBWaXNpYmxlQ2hhbmdlOiBvblRyaWdnZXJWaXNpYmxlQ2hhbmdlLFxuICAgIG9uUG9wdXBNb3VzZUVudGVyOiBvblBvcHVwTW91c2VFbnRlclxuICB9LCBjdXN0b21pemVSYXdJbnB1dEVsZW1lbnQgPyAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGN1c3RvbWl6ZVJhd0lucHV0RWxlbWVudCwge1xuICAgIHJlZjogY3VzdG9taXplUmF3SW5wdXRSZWZcbiAgfSkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RvciwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgZG9tUmVmOiBzZWxlY3RvckRvbVJlZixcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBpbnB1dEVsZW1lbnQ6IGN1c3RvbWl6ZUlucHV0RWxlbWVudCxcbiAgICByZWY6IHNlbGVjdG9yUmVmLFxuICAgIGlkOiBpZCxcbiAgICBzaG93U2VhcmNoOiBtZXJnZWRTaG93U2VhcmNoLFxuICAgIGF1dG9DbGVhclNlYXJjaFZhbHVlOiBhdXRvQ2xlYXJTZWFyY2hWYWx1ZSxcbiAgICBtb2RlOiBtb2RlLFxuICAgIGFjdGl2ZURlc2NlbmRhbnRJZDogYWN0aXZlRGVzY2VuZGFudElkLFxuICAgIHRhZ1JlbmRlcjogdGFnUmVuZGVyLFxuICAgIHZhbHVlczogZGlzcGxheVZhbHVlcyxcbiAgICBvcGVuOiBtZXJnZWRPcGVuLFxuICAgIG9uVG9nZ2xlT3Blbjogb25Ub2dnbGVPcGVuLFxuICAgIGFjdGl2ZVZhbHVlOiBhY3RpdmVWYWx1ZSxcbiAgICBzZWFyY2hWYWx1ZTogbWVyZ2VkU2VhcmNoVmFsdWUsXG4gICAgb25TZWFyY2g6IG9uSW50ZXJuYWxTZWFyY2gsXG4gICAgb25TZWFyY2hTdWJtaXQ6IG9uSW50ZXJuYWxTZWFyY2hTdWJtaXQsXG4gICAgb25SZW1vdmU6IG9uU2VsZWN0b3JSZW1vdmUsXG4gICAgdG9rZW5XaXRoRW50ZXI6IHRva2VuV2l0aEVudGVyXG4gIH0pKSk7XG5cbiAgLy8gPj4+IFJlbmRlclxuICB2YXIgcmVuZGVyTm9kZTtcblxuICAvLyBSZW5kZXIgcmF3XG4gIGlmIChjdXN0b21pemVSYXdJbnB1dEVsZW1lbnQpIHtcbiAgICByZW5kZXJOb2RlID0gc2VsZWN0b3JOb2RlO1xuICB9IGVsc2Uge1xuICAgIHJlbmRlck5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgICBjbGFzc05hbWU6IG1lcmdlZENsYXNzTmFtZVxuICAgIH0sIGRvbVByb3BzLCB7XG4gICAgICByZWY6IGNvbnRhaW5lclJlZixcbiAgICAgIG9uTW91c2VEb3duOiBvbkludGVybmFsTW91c2VEb3duLFxuICAgICAgb25LZXlEb3duOiBvbkludGVybmFsS2V5RG93bixcbiAgICAgIG9uS2V5VXA6IG9uSW50ZXJuYWxLZXlVcCxcbiAgICAgIG9uRm9jdXM6IG9uQ29udGFpbmVyRm9jdXMsXG4gICAgICBvbkJsdXI6IG9uQ29udGFpbmVyQmx1clxuICAgIH0pLCBtb2NrRm9jdXNlZCAmJiAhbWVyZ2VkT3BlbiAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgb3BhY2l0eTogMFxuICAgICAgfSxcbiAgICAgIFwiYXJpYS1saXZlXCI6IFwicG9saXRlXCJcbiAgICB9LCBcIlwiLmNvbmNhdChkaXNwbGF5VmFsdWVzLm1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIGxhYmVsID0gX3JlZi5sYWJlbCxcbiAgICAgICAgdmFsdWUgPSBfcmVmLnZhbHVlO1xuICAgICAgcmV0dXJuIFsnbnVtYmVyJywgJ3N0cmluZyddLmluY2x1ZGVzKF90eXBlb2YobGFiZWwpKSA/IGxhYmVsIDogdmFsdWU7XG4gICAgfSkuam9pbignLCAnKSkpLCBzZWxlY3Rvck5vZGUsIGFycm93Tm9kZSwgY2xlYXJOb2RlKTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQmFzZVNlbGVjdENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogYmFzZVNlbGVjdENvbnRleHRcbiAgfSwgcmVuZGVyTm9kZSk7XG59KTtcblxuLy8gU2V0IGRpc3BsYXkgbmFtZSBmb3IgZGV2XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBCYXNlU2VsZWN0LmRpc3BsYXlOYW1lID0gJ0Jhc2VTZWxlY3QnO1xufVxuZXhwb3J0IGRlZmF1bHQgQmFzZVNlbGVjdDsiLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBDYWNoZSBgdmFsdWVgIHJlbGF0ZWQgTGFiZWxlZFZhbHVlICYgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChsYWJlbGVkVmFsdWVzLCB2YWx1ZU9wdGlvbnMpIHtcbiAgdmFyIGNhY2hlUmVmID0gUmVhY3QudXNlUmVmKHtcbiAgICB2YWx1ZXM6IG5ldyBNYXAoKSxcbiAgICBvcHRpb25zOiBuZXcgTWFwKClcbiAgfSk7XG4gIHZhciBmaWxsZWRMYWJlbGVkVmFsdWVzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9jYWNoZVJlZiRjdXJyZW50ID0gY2FjaGVSZWYuY3VycmVudCxcbiAgICAgIHByZXZWYWx1ZUNhY2hlID0gX2NhY2hlUmVmJGN1cnJlbnQudmFsdWVzLFxuICAgICAgcHJldk9wdGlvbkNhY2hlID0gX2NhY2hlUmVmJGN1cnJlbnQub3B0aW9ucztcblxuICAgIC8vIEZpbGwgbGFiZWwgYnkgY2FjaGVcbiAgICB2YXIgcGF0Y2hlZFZhbHVlcyA9IGxhYmVsZWRWYWx1ZXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBfcHJldlZhbHVlQ2FjaGUkZ2V0O1xuICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpdGVtKSwge30sIHtcbiAgICAgICAgICBsYWJlbDogKF9wcmV2VmFsdWVDYWNoZSRnZXQgPSBwcmV2VmFsdWVDYWNoZS5nZXQoaXRlbS52YWx1ZSkpID09PSBudWxsIHx8IF9wcmV2VmFsdWVDYWNoZSRnZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9wcmV2VmFsdWVDYWNoZSRnZXQubGFiZWxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9KTtcblxuICAgIC8vIFJlZnJlc2ggY2FjaGVcbiAgICB2YXIgdmFsdWVDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICB2YXIgb3B0aW9uQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgcGF0Y2hlZFZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YWx1ZUNhY2hlLnNldChpdGVtLnZhbHVlLCBpdGVtKTtcbiAgICAgIG9wdGlvbkNhY2hlLnNldChpdGVtLnZhbHVlLCB2YWx1ZU9wdGlvbnMuZ2V0KGl0ZW0udmFsdWUpIHx8IHByZXZPcHRpb25DYWNoZS5nZXQoaXRlbS52YWx1ZSkpO1xuICAgIH0pO1xuICAgIGNhY2hlUmVmLmN1cnJlbnQudmFsdWVzID0gdmFsdWVDYWNoZTtcbiAgICBjYWNoZVJlZi5jdXJyZW50Lm9wdGlvbnMgPSBvcHRpb25DYWNoZTtcbiAgICByZXR1cm4gcGF0Y2hlZFZhbHVlcztcbiAgfSwgW2xhYmVsZWRWYWx1ZXMsIHZhbHVlT3B0aW9uc10pO1xuICB2YXIgZ2V0T3B0aW9uID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiB2YWx1ZU9wdGlvbnMuZ2V0KHZhbCkgfHwgY2FjaGVSZWYuY3VycmVudC5vcHRpb25zLmdldCh2YWwpO1xuICB9LCBbdmFsdWVPcHRpb25zXSk7XG4gIHJldHVybiBbZmlsbGVkTGFiZWxlZFZhbHVlcywgZ2V0T3B0aW9uXTtcbn0pOyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdG9BcnJheSB9IGZyb20gXCIuLi91dGlscy9jb21tb25VdGlsXCI7XG5pbXBvcnQgeyBpbmplY3RQcm9wc1dpdGhPcHRpb24gfSBmcm9tIFwiLi4vdXRpbHMvdmFsdWVVdGlsXCI7XG5mdW5jdGlvbiBpbmNsdWRlcyh0ZXN0LCBzZWFyY2gpIHtcbiAgcmV0dXJuIHRvQXJyYXkodGVzdCkuam9pbignJykudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gpO1xufVxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChvcHRpb25zLCBmaWVsZE5hbWVzLCBzZWFyY2hWYWx1ZSwgZmlsdGVyT3B0aW9uLCBvcHRpb25GaWx0ZXJQcm9wKSB7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXNlYXJjaFZhbHVlIHx8IGZpbHRlck9wdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cbiAgICB2YXIgZmllbGRPcHRpb25zID0gZmllbGROYW1lcy5vcHRpb25zLFxuICAgICAgZmllbGRMYWJlbCA9IGZpZWxkTmFtZXMubGFiZWwsXG4gICAgICBmaWVsZFZhbHVlID0gZmllbGROYW1lcy52YWx1ZTtcbiAgICB2YXIgZmlsdGVyZWRPcHRpb25zID0gW107XG4gICAgdmFyIGN1c3RvbWl6ZUZpbHRlciA9IHR5cGVvZiBmaWx0ZXJPcHRpb24gPT09ICdmdW5jdGlvbic7XG4gICAgdmFyIHVwcGVyU2VhcmNoID0gc2VhcmNoVmFsdWUudG9VcHBlckNhc2UoKTtcbiAgICB2YXIgZmlsdGVyRnVuYyA9IGN1c3RvbWl6ZUZpbHRlciA/IGZpbHRlck9wdGlvbiA6IGZ1bmN0aW9uIChfLCBvcHRpb24pIHtcbiAgICAgIC8vIFVzZSBwcm92aWRlZCBgb3B0aW9uRmlsdGVyUHJvcGBcbiAgICAgIGlmIChvcHRpb25GaWx0ZXJQcm9wKSB7XG4gICAgICAgIHJldHVybiBpbmNsdWRlcyhvcHRpb25bb3B0aW9uRmlsdGVyUHJvcF0sIHVwcGVyU2VhcmNoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXV0byBzZWxlY3QgYGxhYmVsYCBvciBgdmFsdWVgIGJ5IG9wdGlvbiB0eXBlXG4gICAgICBpZiAob3B0aW9uW2ZpZWxkT3B0aW9uc10pIHtcbiAgICAgICAgLy8gaGFjayBgZmllbGRMYWJlbGAgc2luY2UgYE9wdGlvbkdyb3VwYCBjaGlsZHJlbiBpcyBub3QgYGxhYmVsYFxuICAgICAgICByZXR1cm4gaW5jbHVkZXMob3B0aW9uW2ZpZWxkTGFiZWwgIT09ICdjaGlsZHJlbicgPyBmaWVsZExhYmVsIDogJ2xhYmVsJ10sIHVwcGVyU2VhcmNoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpbmNsdWRlcyhvcHRpb25bZmllbGRWYWx1ZV0sIHVwcGVyU2VhcmNoKTtcbiAgICB9O1xuICAgIHZhciB3cmFwT3B0aW9uID0gY3VzdG9taXplRmlsdGVyID8gZnVuY3Rpb24gKG9wdCkge1xuICAgICAgcmV0dXJuIGluamVjdFByb3BzV2l0aE9wdGlvbihvcHQpO1xuICAgIH0gOiBmdW5jdGlvbiAob3B0KSB7XG4gICAgICByZXR1cm4gb3B0O1xuICAgIH07XG4gICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAvLyBHcm91cCBzaG91bGQgY2hlY2sgY2hpbGQgb3B0aW9uc1xuICAgICAgaWYgKGl0ZW1bZmllbGRPcHRpb25zXSkge1xuICAgICAgICAvLyBDaGVjayBncm91cCBmaXJzdFxuICAgICAgICB2YXIgbWF0Y2hHcm91cCA9IGZpbHRlckZ1bmMoc2VhcmNoVmFsdWUsIHdyYXBPcHRpb24oaXRlbSkpO1xuICAgICAgICBpZiAobWF0Y2hHcm91cCkge1xuICAgICAgICAgIGZpbHRlcmVkT3B0aW9ucy5wdXNoKGl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENoZWNrIG9wdGlvblxuICAgICAgICAgIHZhciBzdWJPcHRpb25zID0gaXRlbVtmaWVsZE9wdGlvbnNdLmZpbHRlcihmdW5jdGlvbiAoc3ViSXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlckZ1bmMoc2VhcmNoVmFsdWUsIHdyYXBPcHRpb24oc3ViSXRlbSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChzdWJPcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgZmlsdGVyZWRPcHRpb25zLnB1c2goX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpdGVtKSwge30sIF9kZWZpbmVQcm9wZXJ0eSh7fSwgZmllbGRPcHRpb25zLCBzdWJPcHRpb25zKSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZmlsdGVyRnVuYyhzZWFyY2hWYWx1ZSwgd3JhcE9wdGlvbihpdGVtKSkpIHtcbiAgICAgICAgZmlsdGVyZWRPcHRpb25zLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZpbHRlcmVkT3B0aW9ucztcbiAgfSwgW29wdGlvbnMsIGZpbHRlck9wdGlvbiwgb3B0aW9uRmlsdGVyUHJvcCwgc2VhcmNoVmFsdWUsIGZpZWxkTmFtZXNdKTtcbn0pOyIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNhblVzZURvbSBmcm9tIFwicmMtdXRpbC9lcy9Eb20vY2FuVXNlRG9tXCI7XG52YXIgdXVpZCA9IDA7XG5cbi8qKiBJcyBjbGllbnQgc2lkZSBhbmQgbm90IGpzZG9tICovXG5leHBvcnQgdmFyIGlzQnJvd3NlckNsaWVudCA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcgJiYgY2FuVXNlRG9tKCk7XG5cbi8qKiBHZXQgdW5pcXVlIGlkIGZvciBhY2Nlc3NpYmlsaXR5IHVzYWdlICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VVVJRCgpIHtcbiAgdmFyIHJldElkO1xuXG4gIC8vIFRlc3QgbmV2ZXIgcmVhY2hcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChpc0Jyb3dzZXJDbGllbnQpIHtcbiAgICByZXRJZCA9IHV1aWQ7XG4gICAgdXVpZCArPSAxO1xuICB9IGVsc2Uge1xuICAgIHJldElkID0gJ1RFU1RfT1JfU1NSJztcbiAgfVxuICByZXR1cm4gcmV0SWQ7XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VJZChpZCkge1xuICAvLyBJbm5lciBpZCBmb3IgYWNjZXNzaWJpbGl0eSB1c2FnZS4gT25seSB3b3JrIGluIGNsaWVudCBzaWRlXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSgpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIGlubmVySWQgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldElubmVySWQgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHNldElubmVySWQoXCJyY19zZWxlY3RfXCIuY29uY2F0KGdldFVVSUQoKSkpO1xuICB9LCBbXSk7XG4gIHJldHVybiBpZCB8fCBpbm5lcklkO1xufSIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImNoaWxkcmVuXCIsIFwidmFsdWVcIl0sXG4gIF9leGNsdWRlZDIgPSBbXCJjaGlsZHJlblwiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0b0FycmF5IGZyb20gXCJyYy11dGlsL2VzL0NoaWxkcmVuL3RvQXJyYXlcIjtcbmZ1bmN0aW9uIGNvbnZlcnROb2RlVG9PcHRpb24obm9kZSkge1xuICB2YXIgX3JlZiA9IG5vZGUsXG4gICAga2V5ID0gX3JlZi5rZXksXG4gICAgX3JlZiRwcm9wcyA9IF9yZWYucHJvcHMsXG4gICAgY2hpbGRyZW4gPSBfcmVmJHByb3BzLmNoaWxkcmVuLFxuICAgIHZhbHVlID0gX3JlZiRwcm9wcy52YWx1ZSxcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiRwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgIGtleToga2V5LFxuICAgIHZhbHVlOiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrZXksXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gIH0sIHJlc3RQcm9wcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29udmVydENoaWxkcmVuVG9EYXRhKG5vZGVzKSB7XG4gIHZhciBvcHRpb25Pbmx5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgcmV0dXJuIHRvQXJyYXkobm9kZXMpLm1hcChmdW5jdGlvbiAobm9kZSwgaW5kZXgpIHtcbiAgICBpZiAoISAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQobm9kZSkgfHwgIW5vZGUudHlwZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBfcmVmMiA9IG5vZGUsXG4gICAgICBpc1NlbGVjdE9wdEdyb3VwID0gX3JlZjIudHlwZS5pc1NlbGVjdE9wdEdyb3VwLFxuICAgICAga2V5ID0gX3JlZjIua2V5LFxuICAgICAgX3JlZjIkcHJvcHMgPSBfcmVmMi5wcm9wcyxcbiAgICAgIGNoaWxkcmVuID0gX3JlZjIkcHJvcHMuY2hpbGRyZW4sXG4gICAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjIkcHJvcHMsIF9leGNsdWRlZDIpO1xuICAgIGlmIChvcHRpb25Pbmx5IHx8ICFpc1NlbGVjdE9wdEdyb3VwKSB7XG4gICAgICByZXR1cm4gY29udmVydE5vZGVUb09wdGlvbihub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgICBrZXk6IFwiX19SQ19TRUxFQ1RfR1JQX19cIi5jb25jYXQoa2V5ID09PSBudWxsID8gaW5kZXggOiBrZXksIFwiX19cIiksXG4gICAgICBsYWJlbDoga2V5XG4gICAgfSwgcmVzdFByb3BzKSwge30sIHtcbiAgICAgIG9wdGlvbnM6IGNvbnZlcnRDaGlsZHJlblRvRGF0YShjaGlsZHJlbilcbiAgICB9KTtcbiAgfSkuZmlsdGVyKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH0pO1xufSIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNvbnZlcnRDaGlsZHJlblRvRGF0YSB9IGZyb20gXCIuLi91dGlscy9sZWdhY3lVdGlsXCI7XG5cbi8qKlxuICogUGFyc2UgYGNoaWxkcmVuYCB0byBgb3B0aW9uc2AgaWYgYG9wdGlvbnNgIGlzIG5vdCBwcm92aWRlZC5cbiAqIFRoZW4gZmxhdHRlbiB0aGUgYG9wdGlvbnNgLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VPcHRpb25zKG9wdGlvbnMsIGNoaWxkcmVuLCBmaWVsZE5hbWVzLCBvcHRpb25GaWx0ZXJQcm9wLCBvcHRpb25MYWJlbFByb3ApIHtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBtZXJnZWRPcHRpb25zID0gb3B0aW9ucztcbiAgICB2YXIgY2hpbGRyZW5Bc0RhdGEgPSAhb3B0aW9ucztcbiAgICBpZiAoY2hpbGRyZW5Bc0RhdGEpIHtcbiAgICAgIG1lcmdlZE9wdGlvbnMgPSBjb252ZXJ0Q2hpbGRyZW5Ub0RhdGEoY2hpbGRyZW4pO1xuICAgIH1cbiAgICB2YXIgdmFsdWVPcHRpb25zID0gbmV3IE1hcCgpO1xuICAgIHZhciBsYWJlbE9wdGlvbnMgPSBuZXcgTWFwKCk7XG4gICAgdmFyIHNldExhYmVsT3B0aW9ucyA9IGZ1bmN0aW9uIHNldExhYmVsT3B0aW9ucyhsYWJlbE9wdGlvbnNNYXAsIG9wdGlvbiwga2V5KSB7XG4gICAgICBpZiAoa2V5ICYmIHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGxhYmVsT3B0aW9uc01hcC5zZXQob3B0aW9uW2tleV0sIG9wdGlvbik7XG4gICAgICB9XG4gICAgfTtcbiAgICBmdW5jdGlvbiBkaWcob3B0aW9uTGlzdCkge1xuICAgICAgdmFyIGlzQ2hpbGRyZW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgICAgLy8gZm9yIGxvb3AgdG8gc3BlZWQgdXAgY29sbGVjdGlvbiBzcGVlZFxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRpb25MaXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBvcHRpb24gPSBvcHRpb25MaXN0W2ldO1xuICAgICAgICBpZiAoIW9wdGlvbltmaWVsZE5hbWVzLm9wdGlvbnNdIHx8IGlzQ2hpbGRyZW4pIHtcbiAgICAgICAgICB2YWx1ZU9wdGlvbnMuc2V0KG9wdGlvbltmaWVsZE5hbWVzLnZhbHVlXSwgb3B0aW9uKTtcbiAgICAgICAgICBzZXRMYWJlbE9wdGlvbnMobGFiZWxPcHRpb25zLCBvcHRpb24sIGZpZWxkTmFtZXMubGFiZWwpO1xuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzM1MzA0XG4gICAgICAgICAgc2V0TGFiZWxPcHRpb25zKGxhYmVsT3B0aW9ucywgb3B0aW9uLCBvcHRpb25GaWx0ZXJQcm9wKTtcbiAgICAgICAgICBzZXRMYWJlbE9wdGlvbnMobGFiZWxPcHRpb25zLCBvcHRpb24sIG9wdGlvbkxhYmVsUHJvcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGlnKG9wdGlvbltmaWVsZE5hbWVzLm9wdGlvbnNdLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBkaWcobWVyZ2VkT3B0aW9ucyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wdGlvbnM6IG1lcmdlZE9wdGlvbnMsXG4gICAgICB2YWx1ZU9wdGlvbnM6IHZhbHVlT3B0aW9ucyxcbiAgICAgIGxhYmVsT3B0aW9uczogbGFiZWxPcHRpb25zXG4gICAgfTtcbiAgfSwgW29wdGlvbnMsIGNoaWxkcmVuLCBmaWVsZE5hbWVzLCBvcHRpb25GaWx0ZXJQcm9wLCBvcHRpb25MYWJlbFByb3BdKTtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbi8qKlxuICogU2FtZSBhcyBgUmVhY3QudXNlQ2FsbGJhY2tgIGJ1dCBhbHdheXMgcmV0dXJuIGEgbWVtb2l6ZWQgZnVuY3Rpb25cbiAqIGJ1dCByZWRpcmVjdCB0byByZWFsIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VSZWZGdW5jKGNhbGxiYWNrKSB7XG4gIHZhciBmdW5jUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIGZ1bmNSZWYuY3VycmVudCA9IGNhbGxiYWNrO1xuICB2YXIgY2FjaGVGbiA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY1JlZi5jdXJyZW50LmFwcGx5KGZ1bmNSZWYsIGFyZ3VtZW50cyk7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIGNhY2hlRm47XG59IiwiLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cblxuLyoqIFRoaXMgaXMgYSBwbGFjZWhvbGRlciwgbm90IHJlYWwgcmVuZGVyIGluIGRvbSAqL1xudmFyIE9wdEdyb3VwID0gZnVuY3Rpb24gT3B0R3JvdXAoKSB7XG4gIHJldHVybiBudWxsO1xufTtcbk9wdEdyb3VwLmlzU2VsZWN0T3B0R3JvdXAgPSB0cnVlO1xuZXhwb3J0IGRlZmF1bHQgT3B0R3JvdXA7IiwiLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cblxuLyoqIFRoaXMgaXMgYSBwbGFjZWhvbGRlciwgbm90IHJlYWwgcmVuZGVyIGluIGRvbSAqL1xudmFyIE9wdGlvbiA9IGZ1bmN0aW9uIE9wdGlvbigpIHtcbiAgcmV0dXJuIG51bGw7XG59O1xuT3B0aW9uLmlzU2VsZWN0T3B0aW9uID0gdHJ1ZTtcbmV4cG9ydCBkZWZhdWx0IE9wdGlvbjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3JjLXJlc2l6ZS1vYnNlcnZlcic7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbi8qKlxuICogRmlsbCBjb21wb25lbnQgdG8gcHJvdmlkZWQgdGhlIHNjcm9sbCBjb250ZW50IHJlYWwgaGVpZ2h0LlxuICovXG52YXIgRmlsbGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKF9yZWYsIHJlZikge1xuICB2YXIgaGVpZ2h0ID0gX3JlZi5oZWlnaHQsXG4gICAgb2Zmc2V0ID0gX3JlZi5vZmZzZXQsXG4gICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIG9uSW5uZXJSZXNpemUgPSBfcmVmLm9uSW5uZXJSZXNpemUsXG4gICAgaW5uZXJQcm9wcyA9IF9yZWYuaW5uZXJQcm9wcztcbiAgdmFyIG91dGVyU3R5bGUgPSB7fTtcbiAgdmFyIGlubmVyU3R5bGUgPSB7XG4gICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nXG4gIH07XG4gIGlmIChvZmZzZXQgIT09IHVuZGVmaW5lZCkge1xuICAgIG91dGVyU3R5bGUgPSB7XG4gICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgfTtcbiAgICBpbm5lclN0eWxlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpbm5lclN0eWxlKSwge30sIHtcbiAgICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGVZKFwiLmNvbmNhdChvZmZzZXQsIFwicHgpXCIpLFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgcmlnaHQ6IDAsXG4gICAgICB0b3A6IDBcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHN0eWxlOiBvdXRlclN0eWxlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlc2l6ZU9ic2VydmVyLCB7XG4gICAgb25SZXNpemU6IGZ1bmN0aW9uIG9uUmVzaXplKF9yZWYyKSB7XG4gICAgICB2YXIgb2Zmc2V0SGVpZ2h0ID0gX3JlZjIub2Zmc2V0SGVpZ2h0O1xuICAgICAgaWYgKG9mZnNldEhlaWdodCAmJiBvbklubmVyUmVzaXplKSB7XG4gICAgICAgIG9uSW5uZXJSZXNpemUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICBzdHlsZTogaW5uZXJTdHlsZSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhvbGRlci1pbm5lclwiKSwgcHJlZml4Q2xzKSksXG4gICAgcmVmOiByZWZcbiAgfSwgaW5uZXJQcm9wcyksIGNoaWxkcmVuKSkpO1xufSk7XG5GaWxsZXIuZGlzcGxheU5hbWUgPSAnRmlsbGVyJztcbmV4cG9ydCBkZWZhdWx0IEZpbGxlcjsiLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNcIjtcbmltcG9ydCBfY3JlYXRlU3VwZXIgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZVN1cGVyXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG52YXIgTUlOX1NJWkUgPSAyMDtcbmZ1bmN0aW9uIGdldFBhZ2VZKGUpIHtcbiAgcmV0dXJuICd0b3VjaGVzJyBpbiBlID8gZS50b3VjaGVzWzBdLnBhZ2VZIDogZS5wYWdlWTtcbn1cbnZhciBTY3JvbGxCYXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFNjcm9sbEJhciwgX1JlYWN0JENvbXBvbmVudCk7XG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoU2Nyb2xsQmFyKTtcbiAgZnVuY3Rpb24gU2Nyb2xsQmFyKCkge1xuICAgIHZhciBfdGhpcztcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU2Nyb2xsQmFyKTtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcbiAgICBfdGhpcy5tb3ZlUmFmID0gbnVsbDtcbiAgICBfdGhpcy5zY3JvbGxiYXJSZWYgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlUmVmKCk7XG4gICAgX3RoaXMudGh1bWJSZWYgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlUmVmKCk7XG4gICAgX3RoaXMudmlzaWJsZVRpbWVvdXQgPSBudWxsO1xuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgZHJhZ2dpbmc6IGZhbHNlLFxuICAgICAgcGFnZVk6IG51bGwsXG4gICAgICBzdGFydFRvcDogbnVsbCxcbiAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgfTtcbiAgICBfdGhpcy5kZWxheUhpZGRlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNsZWFyVGltZW91dChfdGhpcy52aXNpYmxlVGltZW91dCk7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHZpc2libGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgX3RoaXMudmlzaWJsZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSwgMjAwMCk7XG4gICAgfTtcbiAgICBfdGhpcy5vblNjcm9sbGJhclRvdWNoU3RhcnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG4gICAgX3RoaXMub25Db250YWluZXJNb3VzZURvd24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9O1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09IENsZWFuID09PT09PT09PT09PT09PT09PT09PT09XG4gICAgX3RoaXMucGF0Y2hFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgX3RoaXMub25Nb3VzZU1vdmUpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBfdGhpcy5vbk1vdXNlVXApO1xuICAgICAgX3RoaXMudGh1bWJSZWYuY3VycmVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBfdGhpcy5vbk1vdXNlTW92ZSk7XG4gICAgICBfdGhpcy50aHVtYlJlZi5jdXJyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgX3RoaXMub25Nb3VzZVVwKTtcbiAgICB9O1xuICAgIF90aGlzLnJlbW92ZUV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRzY3JvbGxiYXJSZWYkY3U7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgX3RoaXMub25Nb3VzZU1vdmUpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBfdGhpcy5vbk1vdXNlVXApO1xuICAgICAgKF90aGlzJHNjcm9sbGJhclJlZiRjdSA9IF90aGlzLnNjcm9sbGJhclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfdGhpcyRzY3JvbGxiYXJSZWYkY3UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJHNjcm9sbGJhclJlZiRjdS5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgX3RoaXMub25TY3JvbGxiYXJUb3VjaFN0YXJ0KTtcbiAgICAgIGlmIChfdGhpcy50aHVtYlJlZi5jdXJyZW50KSB7XG4gICAgICAgIF90aGlzLnRodW1iUmVmLmN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIF90aGlzLm9uTW91c2VEb3duKTtcbiAgICAgICAgX3RoaXMudGh1bWJSZWYuY3VycmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBfdGhpcy5vbk1vdXNlTW92ZSk7XG4gICAgICAgIF90aGlzLnRodW1iUmVmLmN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBfdGhpcy5vbk1vdXNlVXApO1xuICAgICAgfVxuICAgICAgcmFmLmNhbmNlbChfdGhpcy5tb3ZlUmFmKTtcbiAgICB9O1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09IFRodW1iID09PT09PT09PT09PT09PT09PT09PT09XG4gICAgX3RoaXMub25Nb3VzZURvd24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uU3RhcnRNb3ZlID0gX3RoaXMucHJvcHMub25TdGFydE1vdmU7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdnaW5nOiB0cnVlLFxuICAgICAgICBwYWdlWTogZ2V0UGFnZVkoZSksXG4gICAgICAgIHN0YXJ0VG9wOiBfdGhpcy5nZXRUb3AoKVxuICAgICAgfSk7XG4gICAgICBvblN0YXJ0TW92ZSgpO1xuICAgICAgX3RoaXMucGF0Y2hFdmVudHMoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcbiAgICBfdGhpcy5vbk1vdXNlTW92ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgZHJhZ2dpbmcgPSBfdGhpcyRzdGF0ZS5kcmFnZ2luZyxcbiAgICAgICAgcGFnZVkgPSBfdGhpcyRzdGF0ZS5wYWdlWSxcbiAgICAgICAgc3RhcnRUb3AgPSBfdGhpcyRzdGF0ZS5zdGFydFRvcDtcbiAgICAgIHZhciBvblNjcm9sbCA9IF90aGlzLnByb3BzLm9uU2Nyb2xsO1xuICAgICAgcmFmLmNhbmNlbChfdGhpcy5tb3ZlUmFmKTtcbiAgICAgIGlmIChkcmFnZ2luZykge1xuICAgICAgICB2YXIgb2Zmc2V0WSA9IGdldFBhZ2VZKGUpIC0gcGFnZVk7XG4gICAgICAgIHZhciBuZXdUb3AgPSBzdGFydFRvcCArIG9mZnNldFk7XG4gICAgICAgIHZhciBlbmFibGVTY3JvbGxSYW5nZSA9IF90aGlzLmdldEVuYWJsZVNjcm9sbFJhbmdlKCk7XG4gICAgICAgIHZhciBlbmFibGVIZWlnaHRSYW5nZSA9IF90aGlzLmdldEVuYWJsZUhlaWdodFJhbmdlKCk7XG4gICAgICAgIHZhciBwdGcgPSBlbmFibGVIZWlnaHRSYW5nZSA/IG5ld1RvcCAvIGVuYWJsZUhlaWdodFJhbmdlIDogMDtcbiAgICAgICAgdmFyIG5ld1Njcm9sbFRvcCA9IE1hdGguY2VpbChwdGcgKiBlbmFibGVTY3JvbGxSYW5nZSk7XG4gICAgICAgIF90aGlzLm1vdmVSYWYgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIG9uU2Nyb2xsKG5ld1Njcm9sbFRvcCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgX3RoaXMub25Nb3VzZVVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG9uU3RvcE1vdmUgPSBfdGhpcy5wcm9wcy5vblN0b3BNb3ZlO1xuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcmFnZ2luZzogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgb25TdG9wTW92ZSgpO1xuICAgICAgX3RoaXMucmVtb3ZlRXZlbnRzKCk7XG4gICAgfTtcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gQ2FsY3VsYXRlID09PT09PT09PT09PT09PT09PT09PVxuICAgIF90aGlzLmdldFNwaW5IZWlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgaGVpZ2h0ID0gX3RoaXMkcHJvcHMuaGVpZ2h0LFxuICAgICAgICBjb3VudCA9IF90aGlzJHByb3BzLmNvdW50O1xuICAgICAgdmFyIGJhc2VIZWlnaHQgPSBoZWlnaHQgLyBjb3VudCAqIDEwO1xuICAgICAgYmFzZUhlaWdodCA9IE1hdGgubWF4KGJhc2VIZWlnaHQsIE1JTl9TSVpFKTtcbiAgICAgIGJhc2VIZWlnaHQgPSBNYXRoLm1pbihiYXNlSGVpZ2h0LCBoZWlnaHQgLyAyKTtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKGJhc2VIZWlnaHQpO1xuICAgIH07XG4gICAgX3RoaXMuZ2V0RW5hYmxlU2Nyb2xsUmFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gX3RoaXMucHJvcHMsXG4gICAgICAgIHNjcm9sbEhlaWdodCA9IF90aGlzJHByb3BzMi5zY3JvbGxIZWlnaHQsXG4gICAgICAgIGhlaWdodCA9IF90aGlzJHByb3BzMi5oZWlnaHQ7XG4gICAgICByZXR1cm4gc2Nyb2xsSGVpZ2h0IC0gaGVpZ2h0IHx8IDA7XG4gICAgfTtcbiAgICBfdGhpcy5nZXRFbmFibGVIZWlnaHRSYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBoZWlnaHQgPSBfdGhpcy5wcm9wcy5oZWlnaHQ7XG4gICAgICB2YXIgc3BpbkhlaWdodCA9IF90aGlzLmdldFNwaW5IZWlnaHQoKTtcbiAgICAgIHJldHVybiBoZWlnaHQgLSBzcGluSGVpZ2h0IHx8IDA7XG4gICAgfTtcbiAgICBfdGhpcy5nZXRUb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc2Nyb2xsVG9wID0gX3RoaXMucHJvcHMuc2Nyb2xsVG9wO1xuICAgICAgdmFyIGVuYWJsZVNjcm9sbFJhbmdlID0gX3RoaXMuZ2V0RW5hYmxlU2Nyb2xsUmFuZ2UoKTtcbiAgICAgIHZhciBlbmFibGVIZWlnaHRSYW5nZSA9IF90aGlzLmdldEVuYWJsZUhlaWdodFJhbmdlKCk7XG4gICAgICBpZiAoc2Nyb2xsVG9wID09PSAwIHx8IGVuYWJsZVNjcm9sbFJhbmdlID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgdmFyIHB0ZyA9IHNjcm9sbFRvcCAvIGVuYWJsZVNjcm9sbFJhbmdlO1xuICAgICAgcmV0dXJuIHB0ZyAqIGVuYWJsZUhlaWdodFJhbmdlO1xuICAgIH07XG4gICAgLy8gTm90IHNob3cgc2Nyb2xsYmFyIHdoZW4gaGVpZ2h0IGlzIGxhcmdlIHRoYW4gc2Nyb2xsSGVpZ2h0XG4gICAgX3RoaXMuc2hvd1Njcm9sbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgaGVpZ2h0ID0gX3RoaXMkcHJvcHMzLmhlaWdodCxcbiAgICAgICAgc2Nyb2xsSGVpZ2h0ID0gX3RoaXMkcHJvcHMzLnNjcm9sbEhlaWdodDtcbiAgICAgIHJldHVybiBzY3JvbGxIZWlnaHQgPiBoZWlnaHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKFNjcm9sbEJhciwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLnNjcm9sbGJhclJlZi5jdXJyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLm9uU2Nyb2xsYmFyVG91Y2hTdGFydCk7XG4gICAgICB0aGlzLnRodW1iUmVmLmN1cnJlbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMub25Nb3VzZURvd24pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgICAgaWYgKHByZXZQcm9wcy5zY3JvbGxUb3AgIT09IHRoaXMucHJvcHMuc2Nyb2xsVG9wKSB7XG4gICAgICAgIHRoaXMuZGVsYXlIaWRkZW4oKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50cygpO1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudmlzaWJsZVRpbWVvdXQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTpcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZTIgPSB0aGlzLnN0YXRlLFxuICAgICAgICBkcmFnZ2luZyA9IF90aGlzJHN0YXRlMi5kcmFnZ2luZyxcbiAgICAgICAgdmlzaWJsZSA9IF90aGlzJHN0YXRlMi52aXNpYmxlO1xuICAgICAgdmFyIF90aGlzJHByb3BzNCA9IHRoaXMucHJvcHMsXG4gICAgICAgIHByZWZpeENscyA9IF90aGlzJHByb3BzNC5wcmVmaXhDbHMsXG4gICAgICAgIGRpcmVjdGlvbiA9IF90aGlzJHByb3BzNC5kaXJlY3Rpb247XG4gICAgICB2YXIgc3BpbkhlaWdodCA9IHRoaXMuZ2V0U3BpbkhlaWdodCgpO1xuICAgICAgdmFyIHRvcCA9IHRoaXMuZ2V0VG9wKCk7XG4gICAgICB2YXIgY2FuU2Nyb2xsID0gdGhpcy5zaG93U2Nyb2xsKCk7XG4gICAgICB2YXIgbWVyZ2VkVmlzaWJsZSA9IGNhblNjcm9sbCAmJiB2aXNpYmxlO1xuICAgICAgdmFyIHNjcm9sbEJhckRpcmVjdGlvbiA9IGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyB7XG4gICAgICAgIGxlZnQ6IDBcbiAgICAgIH0gOiB7XG4gICAgICAgIHJpZ2h0OiAwXG4gICAgICB9O1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgcmVmOiB0aGlzLnNjcm9sbGJhclJlZixcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2Nyb2xsYmFyXCIpLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2Nyb2xsYmFyLXNob3dcIiksIGNhblNjcm9sbCkpLFxuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICB3aWR0aDogOCxcbiAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgYm90dG9tOiAwXG4gICAgICAgIH0sIHNjcm9sbEJhckRpcmVjdGlvbiksIHt9LCB7XG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgZGlzcGxheTogbWVyZ2VkVmlzaWJsZSA/IG51bGwgOiAnbm9uZSdcbiAgICAgICAgfSksXG4gICAgICAgIG9uTW91c2VEb3duOiB0aGlzLm9uQ29udGFpbmVyTW91c2VEb3duLFxuICAgICAgICBvbk1vdXNlTW92ZTogdGhpcy5kZWxheUhpZGRlblxuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICByZWY6IHRoaXMudGh1bWJSZWYsXG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNjcm9sbGJhci10aHVtYlwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNjcm9sbGJhci10aHVtYi1tb3ZpbmdcIiksIGRyYWdnaW5nKSksXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICBoZWlnaHQ6IHNwaW5IZWlnaHQsXG4gICAgICAgICAgdG9wOiB0b3AsXG4gICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICBiYWNrZ3JvdW5kOiAncmdiYSgwLCAwLCAwLCAwLjUpJyxcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IDk5LFxuICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICAgIHVzZXJTZWxlY3Q6ICdub25lJ1xuICAgICAgICB9LFxuICAgICAgICBvbk1vdXNlRG93bjogdGhpcy5vbk1vdXNlRG93blxuICAgICAgfSkpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gU2Nyb2xsQmFyO1xufShSZWFjdC5Db21wb25lbnQpO1xuZXhwb3J0IHsgU2Nyb2xsQmFyIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZnVuY3Rpb24gSXRlbShfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgc2V0UmVmID0gX3JlZi5zZXRSZWY7XG4gIHZhciByZWZGdW5jID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBzZXRSZWYobm9kZSk7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIHtcbiAgICByZWY6IHJlZkZ1bmNcbiAgfSk7XG59IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgSXRlbSB9IGZyb20gJy4uL0l0ZW0nO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQ2hpbGRyZW4obGlzdCwgc3RhcnRJbmRleCwgZW5kSW5kZXgsIHNldE5vZGVSZWYsIHJlbmRlckZ1bmMsIF9yZWYpIHtcbiAgdmFyIGdldEtleSA9IF9yZWYuZ2V0S2V5O1xuICByZXR1cm4gbGlzdC5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCArIDEpLm1hcChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICB2YXIgZWxlSW5kZXggPSBzdGFydEluZGV4ICsgaW5kZXg7XG4gICAgdmFyIG5vZGUgPSByZW5kZXJGdW5jKGl0ZW0sIGVsZUluZGV4LCB7XG4gICAgICAvLyBzdHlsZTogc3RhdHVzID09PSAnTUVBU1VSRV9TVEFSVCcgPyB7IHZpc2liaWxpdHk6ICdoaWRkZW4nIH0gOiB7fSxcbiAgICB9KTtcbiAgICB2YXIga2V5ID0gZ2V0S2V5KGl0ZW0pO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJdGVtLCB7XG4gICAgICBrZXk6IGtleSxcbiAgICAgIHNldFJlZjogZnVuY3Rpb24gc2V0UmVmKGVsZSkge1xuICAgICAgICByZXR1cm4gc2V0Tm9kZVJlZihpdGVtLCBlbGUpO1xuICAgICAgfVxuICAgIH0sIG5vZGUpO1xuICB9KTtcbn0iLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbi8vIEZpcmVmb3ggaGFzIGxvdyBwZXJmb3JtYW5jZSBvZiBtYXAuXG52YXIgQ2FjaGVNYXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDYWNoZU1hcCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2FjaGVNYXApO1xuICAgIHRoaXMubWFwcyA9IHZvaWQgMDtcbiAgICB0aGlzLm1hcHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhDYWNoZU1hcCwgW3tcbiAgICBrZXk6IFwic2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICB0aGlzLm1hcHNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMubWFwc1trZXldO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQ2FjaGVNYXA7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBDYWNoZU1hcDsiLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZiwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGZpbmRET01Ob2RlIGZyb20gXCJyYy11dGlsL2VzL0RvbS9maW5kRE9NTm9kZVwiO1xuaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbmltcG9ydCBDYWNoZU1hcCBmcm9tICcuLi91dGlscy9DYWNoZU1hcCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VIZWlnaHRzKGdldEtleSwgb25JdGVtQWRkLCBvbkl0ZW1SZW1vdmUpIHtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKDApLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHVwZGF0ZWRNYXJrID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRVcGRhdGVkTWFyayA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBpbnN0YW5jZVJlZiA9IHVzZVJlZihuZXcgTWFwKCkpO1xuICB2YXIgaGVpZ2h0c1JlZiA9IHVzZVJlZihuZXcgQ2FjaGVNYXAoKSk7XG4gIHZhciBjb2xsZWN0UmFmUmVmID0gdXNlUmVmKCk7XG4gIGZ1bmN0aW9uIGNhbmNlbFJhZigpIHtcbiAgICByYWYuY2FuY2VsKGNvbGxlY3RSYWZSZWYuY3VycmVudCk7XG4gIH1cbiAgZnVuY3Rpb24gY29sbGVjdEhlaWdodCgpIHtcbiAgICBjYW5jZWxSYWYoKTtcbiAgICBjb2xsZWN0UmFmUmVmLmN1cnJlbnQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgaW5zdGFuY2VSZWYuY3VycmVudC5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50LCBrZXkpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5vZmZzZXRQYXJlbnQpIHtcbiAgICAgICAgICB2YXIgaHRtbEVsZW1lbnQgPSBmaW5kRE9NTm9kZShlbGVtZW50KTtcbiAgICAgICAgICB2YXIgb2Zmc2V0SGVpZ2h0ID0gaHRtbEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgIGlmIChoZWlnaHRzUmVmLmN1cnJlbnQuZ2V0KGtleSkgIT09IG9mZnNldEhlaWdodCkge1xuICAgICAgICAgICAgaGVpZ2h0c1JlZi5jdXJyZW50LnNldChrZXksIGh0bWxFbGVtZW50Lm9mZnNldEhlaWdodCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIEFsd2F5cyB0cmlnZ2VyIHVwZGF0ZSBtYXJrIHRvIHRlbGwgcGFyZW50IHRoYXQgc2hvdWxkIHJlLWNhbGN1bGF0ZSBoZWlnaHRzIHdoZW4gcmVzaXplZFxuICAgICAgc2V0VXBkYXRlZE1hcmsoZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgcmV0dXJuIGMgKyAxO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gc2V0SW5zdGFuY2VSZWYoaXRlbSwgaW5zdGFuY2UpIHtcbiAgICB2YXIga2V5ID0gZ2V0S2V5KGl0ZW0pO1xuICAgIHZhciBvcmlnaW4gPSBpbnN0YW5jZVJlZi5jdXJyZW50LmdldChrZXkpO1xuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgaW5zdGFuY2VSZWYuY3VycmVudC5zZXQoa2V5LCBpbnN0YW5jZSk7XG4gICAgICBjb2xsZWN0SGVpZ2h0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlUmVmLmN1cnJlbnQuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIC8vIEluc3RhbmNlIGNoYW5nZWRcbiAgICBpZiAoIW9yaWdpbiAhPT0gIWluc3RhbmNlKSB7XG4gICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgb25JdGVtQWRkID09PSBudWxsIHx8IG9uSXRlbUFkZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25JdGVtQWRkKGl0ZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25JdGVtUmVtb3ZlID09PSBudWxsIHx8IG9uSXRlbVJlbW92ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25JdGVtUmVtb3ZlKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjYW5jZWxSYWY7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIFtzZXRJbnN0YW5jZVJlZiwgY29sbGVjdEhlaWdodCwgaGVpZ2h0c1JlZi5jdXJyZW50LCB1cGRhdGVkTWFya107XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTY3JvbGxUbyhjb250YWluZXJSZWYsIGRhdGEsIGhlaWdodHMsIGl0ZW1IZWlnaHQsIGdldEtleSwgY29sbGVjdEhlaWdodCwgc3luY1Njcm9sbFRvcCwgdHJpZ2dlckZsYXNoKSB7XG4gIHZhciBzY3JvbGxSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhcmcpIHtcbiAgICAvLyBXaGVuIG5vdCBhcmd1bWVudCBwcm92aWRlZCwgd2UgdGhpbmsgZGV2IG1heSB3YW50IHRvIHNob3cgdGhlIHNjcm9sbGJhclxuICAgIGlmIChhcmcgPT09IG51bGwgfHwgYXJnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyaWdnZXJGbGFzaCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBOb3JtYWwgc2Nyb2xsIGxvZ2ljXG4gICAgcmFmLmNhbmNlbChzY3JvbGxSZWYuY3VycmVudCk7XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgICBzeW5jU2Nyb2xsVG9wKGFyZyk7XG4gICAgfSBlbHNlIGlmIChhcmcgJiYgX3R5cGVvZihhcmcpID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIGluZGV4O1xuICAgICAgdmFyIGFsaWduID0gYXJnLmFsaWduO1xuICAgICAgaWYgKCdpbmRleCcgaW4gYXJnKSB7XG4gICAgICAgIGluZGV4ID0gYXJnLmluZGV4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5kZXggPSBkYXRhLmZpbmRJbmRleChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIHJldHVybiBnZXRLZXkoaXRlbSkgPT09IGFyZy5rZXk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdmFyIF9hcmckb2Zmc2V0ID0gYXJnLm9mZnNldCxcbiAgICAgICAgb2Zmc2V0ID0gX2FyZyRvZmZzZXQgPT09IHZvaWQgMCA/IDAgOiBfYXJnJG9mZnNldDtcbiAgICAgIC8vIFdlIHdpbGwgcmV0cnkgMyB0aW1lcyBpbiBjYXNlIGR5bmFtaWMgaGVpZ2h0IHNoYWtpbmdcbiAgICAgIHZhciBzeW5jU2Nyb2xsID0gZnVuY3Rpb24gc3luY1Njcm9sbCh0aW1lcywgdGFyZ2V0QWxpZ24pIHtcbiAgICAgICAgaWYgKHRpbWVzIDwgMCB8fCAhY29udGFpbmVyUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICAgICAgdmFyIGhlaWdodCA9IGNvbnRhaW5lclJlZi5jdXJyZW50LmNsaWVudEhlaWdodDtcbiAgICAgICAgdmFyIG5lZWRDb2xsZWN0SGVpZ2h0ID0gZmFsc2U7XG4gICAgICAgIHZhciBuZXdUYXJnZXRBbGlnbiA9IHRhcmdldEFsaWduO1xuICAgICAgICAvLyBHbyB0byBuZXh0IGZyYW1lIGlmIGhlaWdodCBub3QgZXhpc3RcbiAgICAgICAgaWYgKGhlaWdodCkge1xuICAgICAgICAgIHZhciBtZXJnZWRBbGlnbiA9IHRhcmdldEFsaWduIHx8IGFsaWduO1xuICAgICAgICAgIC8vIEdldCB0b3AgJiBib3R0b21cbiAgICAgICAgICB2YXIgc3RhY2tUb3AgPSAwO1xuICAgICAgICAgIHZhciBpdGVtVG9wID0gMDtcbiAgICAgICAgICB2YXIgaXRlbUJvdHRvbSA9IDA7XG4gICAgICAgICAgdmFyIG1heExlbiA9IE1hdGgubWluKGRhdGEubGVuZ3RoLCBpbmRleCk7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gbWF4TGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBnZXRLZXkoZGF0YVtpXSk7XG4gICAgICAgICAgICBpdGVtVG9wID0gc3RhY2tUb3A7XG4gICAgICAgICAgICB2YXIgY2FjaGVIZWlnaHQgPSBoZWlnaHRzLmdldChrZXkpO1xuICAgICAgICAgICAgaXRlbUJvdHRvbSA9IGl0ZW1Ub3AgKyAoY2FjaGVIZWlnaHQgPT09IHVuZGVmaW5lZCA/IGl0ZW1IZWlnaHQgOiBjYWNoZUhlaWdodCk7XG4gICAgICAgICAgICBzdGFja1RvcCA9IGl0ZW1Cb3R0b207XG4gICAgICAgICAgICBpZiAoaSA9PT0gaW5kZXggJiYgY2FjaGVIZWlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBuZWVkQ29sbGVjdEhlaWdodCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFNjcm9sbCB0b1xuICAgICAgICAgIHZhciB0YXJnZXRUb3AgPSBudWxsO1xuICAgICAgICAgIHN3aXRjaCAobWVyZ2VkQWxpZ24pIHtcbiAgICAgICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgICAgIHRhcmdldFRvcCA9IGl0ZW1Ub3AgLSBvZmZzZXQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICAgICAgdGFyZ2V0VG9wID0gaXRlbUJvdHRvbSAtIGhlaWdodCArIG9mZnNldDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIHNjcm9sbFRvcCA9IGNvbnRhaW5lclJlZi5jdXJyZW50LnNjcm9sbFRvcDtcbiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsQm90dG9tID0gc2Nyb2xsVG9wICsgaGVpZ2h0O1xuICAgICAgICAgICAgICAgIGlmIChpdGVtVG9wIDwgc2Nyb2xsVG9wKSB7XG4gICAgICAgICAgICAgICAgICBuZXdUYXJnZXRBbGlnbiA9ICd0b3AnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbUJvdHRvbSA+IHNjcm9sbEJvdHRvbSkge1xuICAgICAgICAgICAgICAgICAgbmV3VGFyZ2V0QWxpZ24gPSAnYm90dG9tJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRhcmdldFRvcCAhPT0gbnVsbCAmJiB0YXJnZXRUb3AgIT09IGNvbnRhaW5lclJlZi5jdXJyZW50LnNjcm9sbFRvcCkge1xuICAgICAgICAgICAgc3luY1Njcm9sbFRvcCh0YXJnZXRUb3ApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBXZSB3aWxsIHJldHJ5IHNpbmNlIGVsZW1lbnQgbWF5IG5vdCBzeW5jIGhlaWdodCBhcyBpdCBkZXNjcmliZWRcbiAgICAgICAgc2Nyb2xsUmVmLmN1cnJlbnQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChuZWVkQ29sbGVjdEhlaWdodCkge1xuICAgICAgICAgICAgY29sbGVjdEhlaWdodCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzeW5jU2Nyb2xsKHRpbWVzIC0gMSwgbmV3VGFyZ2V0QWxpZ24pO1xuICAgICAgICB9LCAyKTsgLy8gRGVsYXkgMiB0byB3YWl0IGZvciBMaXN0IGNvbGxlY3QgaGVpZ2h0c1xuICAgICAgfTtcblxuICAgICAgc3luY1Njcm9sbCgzKTtcbiAgICB9XG4gIH07XG59IiwiLyoqXG4gKiBHZXQgaW5kZXggd2l0aCBzcGVjaWZpYyBzdGFydCBpbmRleCBvbmUgYnkgb25lLiBlLmcuXG4gKiBtaW46IDMsIG1heDogOSwgc3RhcnQ6IDZcbiAqXG4gKiBSZXR1cm4gaW5kZXggaXM6XG4gKiBbMF06IDZcbiAqIFsxXTogN1xuICogWzJdOiA1XG4gKiBbM106IDhcbiAqIFs0XTogNFxuICogWzVdOiA5XG4gKiBbNl06IDNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluZGV4QnlTdGFydExvYyhtaW4sIG1heCwgc3RhcnQsIGluZGV4KSB7XG4gIHZhciBiZWZvcmVDb3VudCA9IHN0YXJ0IC0gbWluO1xuICB2YXIgYWZ0ZXJDb3VudCA9IG1heCAtIHN0YXJ0O1xuICB2YXIgYmFsYW5jZUNvdW50ID0gTWF0aC5taW4oYmVmb3JlQ291bnQsIGFmdGVyQ291bnQpICogMjtcbiAgLy8gQmFsYW5jZVxuICBpZiAoaW5kZXggPD0gYmFsYW5jZUNvdW50KSB7XG4gICAgdmFyIHN0ZXBJbmRleCA9IE1hdGguZmxvb3IoaW5kZXggLyAyKTtcbiAgICBpZiAoaW5kZXggJSAyKSB7XG4gICAgICByZXR1cm4gc3RhcnQgKyBzdGVwSW5kZXggKyAxO1xuICAgIH1cbiAgICByZXR1cm4gc3RhcnQgLSBzdGVwSW5kZXg7XG4gIH1cbiAgLy8gT25lIGlzIG91dCBvZiByYW5nZVxuICBpZiAoYmVmb3JlQ291bnQgPiBhZnRlckNvdW50KSB7XG4gICAgcmV0dXJuIHN0YXJ0IC0gKGluZGV4IC0gYWZ0ZXJDb3VudCk7XG4gIH1cbiAgcmV0dXJuIHN0YXJ0ICsgKGluZGV4IC0gYmVmb3JlQ291bnQpO1xufVxuLyoqXG4gKiBXZSBhc3N1bWUgdGhhdCAyIGxpc3QgaGFzIG9ubHkgMSBpdGVtIGRpZmYgYW5kIG90aGVycyBrZWVwaW5nIHRoZSBvcmRlci5cbiAqIFNvIHdlIGNhbiB1c2UgZGljaG90b215IGFsZ29yaXRobSB0byBmaW5kIGNoYW5nZWQgb25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZExpc3REaWZmSW5kZXgob3JpZ2luTGlzdCwgdGFyZ2V0TGlzdCwgZ2V0S2V5KSB7XG4gIHZhciBvcmlnaW5MZW4gPSBvcmlnaW5MaXN0Lmxlbmd0aDtcbiAgdmFyIHRhcmdldExlbiA9IHRhcmdldExpc3QubGVuZ3RoO1xuICB2YXIgc2hvcnRMaXN0O1xuICB2YXIgbG9uZ0xpc3Q7XG4gIGlmIChvcmlnaW5MZW4gPT09IDAgJiYgdGFyZ2V0TGVuID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKG9yaWdpbkxlbiA8IHRhcmdldExlbikge1xuICAgIHNob3J0TGlzdCA9IG9yaWdpbkxpc3Q7XG4gICAgbG9uZ0xpc3QgPSB0YXJnZXRMaXN0O1xuICB9IGVsc2Uge1xuICAgIHNob3J0TGlzdCA9IHRhcmdldExpc3Q7XG4gICAgbG9uZ0xpc3QgPSBvcmlnaW5MaXN0O1xuICB9XG4gIHZhciBub3RFeGlzdEtleSA9IHtcbiAgICBfX0VNUFRZX0lURU1fXzogdHJ1ZVxuICB9O1xuICBmdW5jdGlvbiBnZXRJdGVtS2V5KGl0ZW0pIHtcbiAgICBpZiAoaXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZ2V0S2V5KGl0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gbm90RXhpc3RLZXk7XG4gIH1cbiAgLy8gTG9vcCB0byBmaW5kIGRpZmYgb25lXG4gIHZhciBkaWZmSW5kZXggPSBudWxsO1xuICB2YXIgbXVsdGlwbGUgPSBNYXRoLmFicyhvcmlnaW5MZW4gLSB0YXJnZXRMZW4pICE9PSAxO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxvbmdMaXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIHNob3J0S2V5ID0gZ2V0SXRlbUtleShzaG9ydExpc3RbaV0pO1xuICAgIHZhciBsb25nS2V5ID0gZ2V0SXRlbUtleShsb25nTGlzdFtpXSk7XG4gICAgaWYgKHNob3J0S2V5ICE9PSBsb25nS2V5KSB7XG4gICAgICBkaWZmSW5kZXggPSBpO1xuICAgICAgbXVsdGlwbGUgPSBtdWx0aXBsZSB8fCBzaG9ydEtleSAhPT0gZ2V0SXRlbUtleShsb25nTGlzdFtpICsgMV0pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBkaWZmSW5kZXggPT09IG51bGwgPyBudWxsIDoge1xuICAgIGluZGV4OiBkaWZmSW5kZXgsXG4gICAgbXVsdGlwbGU6IG11bHRpcGxlXG4gIH07XG59IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmaW5kTGlzdERpZmZJbmRleCB9IGZyb20gJy4uL3V0aWxzL2FsZ29yaXRobVV0aWwnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRGlmZkl0ZW0oZGF0YSwgZ2V0S2V5LCBvbkRpZmYpIHtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGRhdGEpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHByZXZEYXRhID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRQcmV2RGF0YSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUobnVsbCksXG4gICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgIGRpZmZJdGVtID0gX1JlYWN0JHVzZVN0YXRlNFswXSxcbiAgICBzZXREaWZmSXRlbSA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRpZmYgPSBmaW5kTGlzdERpZmZJbmRleChwcmV2RGF0YSB8fCBbXSwgZGF0YSB8fCBbXSwgZ2V0S2V5KTtcbiAgICBpZiAoKGRpZmYgPT09IG51bGwgfHwgZGlmZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGlmZi5pbmRleCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb25EaWZmID09PSBudWxsIHx8IG9uRGlmZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25EaWZmKGRpZmYuaW5kZXgpO1xuICAgICAgc2V0RGlmZkl0ZW0oZGF0YVtkaWZmLmluZGV4XSk7XG4gICAgfVxuICAgIHNldFByZXZEYXRhKGRhdGEpO1xuICB9LCBbZGF0YV0pO1xuICByZXR1cm4gW2RpZmZJdGVtXTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG52YXIgaXNGRiA9ICh0eXBlb2YgbmF2aWdhdG9yID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YobmF2aWdhdG9yKSkgPT09ICdvYmplY3QnICYmIC9GaXJlZm94L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbmV4cG9ydCBkZWZhdWx0IGlzRkY7IiwiaW1wb3J0IHsgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChpc1Njcm9sbEF0VG9wLCBpc1Njcm9sbEF0Qm90dG9tKSB7XG4gIC8vIERvIGxvY2sgZm9yIGEgd2hlZWwgd2hlbiBzY3JvbGxpbmdcbiAgdmFyIGxvY2tSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICB2YXIgbG9ja1RpbWVvdXRSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGZ1bmN0aW9uIGxvY2tTY3JvbGwoKSB7XG4gICAgY2xlYXJUaW1lb3V0KGxvY2tUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgIGxvY2tSZWYuY3VycmVudCA9IHRydWU7XG4gICAgbG9ja1RpbWVvdXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgbG9ja1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfSwgNTApO1xuICB9XG4gIC8vIFBhc3MgdG8gcmVmIHNpbmNlIGdsb2JhbCBhZGQgaXMgaW4gY2xvc3VyZVxuICB2YXIgc2Nyb2xsUGluZ1JlZiA9IHVzZVJlZih7XG4gICAgdG9wOiBpc1Njcm9sbEF0VG9wLFxuICAgIGJvdHRvbTogaXNTY3JvbGxBdEJvdHRvbVxuICB9KTtcbiAgc2Nyb2xsUGluZ1JlZi5jdXJyZW50LnRvcCA9IGlzU2Nyb2xsQXRUb3A7XG4gIHNjcm9sbFBpbmdSZWYuY3VycmVudC5ib3R0b20gPSBpc1Njcm9sbEF0Qm90dG9tO1xuICByZXR1cm4gZnVuY3Rpb24gKGRlbHRhWSkge1xuICAgIHZhciBzbW9vdGhPZmZzZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgIHZhciBvcmlnaW5TY3JvbGwgPVxuICAgIC8vIFBhc3Mgb3JpZ2luIHdoZWVsIHdoZW4gb24gdGhlIHRvcFxuICAgIGRlbHRhWSA8IDAgJiYgc2Nyb2xsUGluZ1JlZi5jdXJyZW50LnRvcCB8fFxuICAgIC8vIFBhc3Mgb3JpZ2luIHdoZWVsIHdoZW4gb24gdGhlIGJvdHRvbVxuICAgIGRlbHRhWSA+IDAgJiYgc2Nyb2xsUGluZ1JlZi5jdXJyZW50LmJvdHRvbTtcbiAgICBpZiAoc21vb3RoT2Zmc2V0ICYmIG9yaWdpblNjcm9sbCkge1xuICAgICAgLy8gTm8gbmVlZCBsb2NrIGFueW1vcmUgd2hlbiBpdCdzIHNtb290aCBvZmZzZXQgZnJvbSB0b3VjaE1vdmUgaW50ZXJ2YWxcbiAgICAgIGNsZWFyVGltZW91dChsb2NrVGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgIGxvY2tSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoIW9yaWdpblNjcm9sbCB8fCBsb2NrUmVmLmN1cnJlbnQpIHtcbiAgICAgIGxvY2tTY3JvbGwoKTtcbiAgICB9XG4gICAgcmV0dXJuICFsb2NrUmVmLmN1cnJlbnQgJiYgb3JpZ2luU2Nyb2xsO1xuICB9O1xufSk7IiwiaW1wb3J0IHsgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbmltcG9ydCBpc0ZGIGZyb20gJy4uL3V0aWxzL2lzRmlyZWZveCc7XG5pbXBvcnQgdXNlT3JpZ2luU2Nyb2xsIGZyb20gJy4vdXNlT3JpZ2luU2Nyb2xsJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUZyYW1lV2hlZWwoaW5WaXJ0dWFsLCBpc1Njcm9sbEF0VG9wLCBpc1Njcm9sbEF0Qm90dG9tLCBvbldoZWVsRGVsdGEpIHtcbiAgdmFyIG9mZnNldFJlZiA9IHVzZVJlZigwKTtcbiAgdmFyIG5leHRGcmFtZVJlZiA9IHVzZVJlZihudWxsKTtcbiAgLy8gRmlyZWZveCBwYXRjaFxuICB2YXIgd2hlZWxWYWx1ZVJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGlzTW91c2VTY3JvbGxSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICAvLyBTY3JvbGwgc3RhdHVzIHN5bmNcbiAgdmFyIG9yaWdpblNjcm9sbCA9IHVzZU9yaWdpblNjcm9sbChpc1Njcm9sbEF0VG9wLCBpc1Njcm9sbEF0Qm90dG9tKTtcbiAgZnVuY3Rpb24gb25XaGVlbChldmVudCkge1xuICAgIGlmICghaW5WaXJ0dWFsKSByZXR1cm47XG4gICAgcmFmLmNhbmNlbChuZXh0RnJhbWVSZWYuY3VycmVudCk7XG4gICAgdmFyIGRlbHRhWSA9IGV2ZW50LmRlbHRhWTtcbiAgICBvZmZzZXRSZWYuY3VycmVudCArPSBkZWx0YVk7XG4gICAgd2hlZWxWYWx1ZVJlZi5jdXJyZW50ID0gZGVsdGFZO1xuICAgIC8vIERvIG5vdGhpbmcgd2hlbiBzY3JvbGwgYXQgdGhlIGVkZ2UsIFNraXAgY2hlY2sgd2hlbiBpcyBpbiBzY3JvbGxcbiAgICBpZiAob3JpZ2luU2Nyb2xsKGRlbHRhWSkpIHJldHVybjtcbiAgICAvLyBQcm94eSBvZiBzY3JvbGwgZXZlbnRzXG4gICAgaWYgKCFpc0ZGKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBuZXh0RnJhbWVSZWYuY3VycmVudCA9IHJhZihmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBQYXRjaCBhIG11bHRpcGxlIGZvciBGaXJlZm94IHRvIGZpeCB3aGVlbCBudW1iZXIgdG9vIHNtYWxsXG4gICAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzI2MzcyI2lzc3VlY29tbWVudC02Nzk0NjAyNjZcbiAgICAgIHZhciBwYXRjaE11bHRpcGxlID0gaXNNb3VzZVNjcm9sbFJlZi5jdXJyZW50ID8gMTAgOiAxO1xuICAgICAgb25XaGVlbERlbHRhKG9mZnNldFJlZi5jdXJyZW50ICogcGF0Y2hNdWx0aXBsZSk7XG4gICAgICBvZmZzZXRSZWYuY3VycmVudCA9IDA7XG4gICAgfSk7XG4gIH1cbiAgLy8gQSBwYXRjaCBmb3IgZmlyZWZveFxuICBmdW5jdGlvbiBvbkZpcmVGb3hTY3JvbGwoZXZlbnQpIHtcbiAgICBpZiAoIWluVmlydHVhbCkgcmV0dXJuO1xuICAgIGlzTW91c2VTY3JvbGxSZWYuY3VycmVudCA9IGV2ZW50LmRldGFpbCA9PT0gd2hlZWxWYWx1ZVJlZi5jdXJyZW50O1xuICB9XG4gIHJldHVybiBbb25XaGVlbCwgb25GaXJlRm94U2Nyb2xsXTtcbn0iLCJpbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xudmFyIFNNT09USF9QVEcgPSAxNCAvIDE1O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlTW9iaWxlVG91Y2hNb3ZlKGluVmlydHVhbCwgbGlzdFJlZiwgY2FsbGJhY2spIHtcbiAgdmFyIHRvdWNoZWRSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICB2YXIgdG91Y2hZUmVmID0gdXNlUmVmKDApO1xuICB2YXIgZWxlbWVudFJlZiA9IHVzZVJlZihudWxsKTtcbiAgLy8gU21vb3RoIHNjcm9sbFxuICB2YXIgaW50ZXJ2YWxSZWYgPSB1c2VSZWYobnVsbCk7XG4gIC8qIGVzbGludC1kaXNhYmxlIHByZWZlci1jb25zdCAqL1xuICB2YXIgY2xlYW5VcEV2ZW50cztcbiAgdmFyIG9uVG91Y2hNb3ZlID0gZnVuY3Rpb24gb25Ub3VjaE1vdmUoZSkge1xuICAgIGlmICh0b3VjaGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIHZhciBjdXJyZW50WSA9IE1hdGguY2VpbChlLnRvdWNoZXNbMF0ucGFnZVkpO1xuICAgICAgdmFyIG9mZnNldFkgPSB0b3VjaFlSZWYuY3VycmVudCAtIGN1cnJlbnRZO1xuICAgICAgdG91Y2hZUmVmLmN1cnJlbnQgPSBjdXJyZW50WTtcbiAgICAgIGlmIChjYWxsYmFjayhvZmZzZXRZKSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgICAvLyBTbW9vdGggaW50ZXJ2YWxcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxSZWYuY3VycmVudCk7XG4gICAgICBpbnRlcnZhbFJlZi5jdXJyZW50ID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICBvZmZzZXRZICo9IFNNT09USF9QVEc7XG4gICAgICAgIGlmICghY2FsbGJhY2sob2Zmc2V0WSwgdHJ1ZSkgfHwgTWF0aC5hYnMob2Zmc2V0WSkgPD0gMC4xKSB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbFJlZi5jdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgfSwgMTYpO1xuICAgIH1cbiAgfTtcbiAgdmFyIG9uVG91Y2hFbmQgPSBmdW5jdGlvbiBvblRvdWNoRW5kKCkge1xuICAgIHRvdWNoZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIGNsZWFuVXBFdmVudHMoKTtcbiAgfTtcbiAgdmFyIG9uVG91Y2hTdGFydCA9IGZ1bmN0aW9uIG9uVG91Y2hTdGFydChlKSB7XG4gICAgY2xlYW5VcEV2ZW50cygpO1xuICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoID09PSAxICYmICF0b3VjaGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIHRvdWNoZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICB0b3VjaFlSZWYuY3VycmVudCA9IE1hdGguY2VpbChlLnRvdWNoZXNbMF0ucGFnZVkpO1xuICAgICAgZWxlbWVudFJlZi5jdXJyZW50ID0gZS50YXJnZXQ7XG4gICAgICBlbGVtZW50UmVmLmN1cnJlbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Ub3VjaE1vdmUpO1xuICAgICAgZWxlbWVudFJlZi5jdXJyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCk7XG4gICAgfVxuICB9O1xuICBjbGVhblVwRXZlbnRzID0gZnVuY3Rpb24gY2xlYW5VcEV2ZW50cygpIHtcbiAgICBpZiAoZWxlbWVudFJlZi5jdXJyZW50KSB7XG4gICAgICBlbGVtZW50UmVmLmN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Ub3VjaE1vdmUpO1xuICAgICAgZWxlbWVudFJlZi5jdXJyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCk7XG4gICAgfVxuICB9O1xuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpblZpcnR1YWwpIHtcbiAgICAgIGxpc3RSZWYuY3VycmVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0KTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfbGlzdFJlZiRjdXJyZW50O1xuICAgICAgKF9saXN0UmVmJGN1cnJlbnQgPSBsaXN0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9saXN0UmVmJGN1cnJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9saXN0UmVmJGN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uVG91Y2hTdGFydCk7XG4gICAgICBjbGVhblVwRXZlbnRzKCk7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsUmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtpblZpcnR1YWxdKTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcImhlaWdodFwiLCBcIml0ZW1IZWlnaHRcIiwgXCJmdWxsSGVpZ2h0XCIsIFwic3R5bGVcIiwgXCJkYXRhXCIsIFwiY2hpbGRyZW5cIiwgXCJpdGVtS2V5XCIsIFwidmlydHVhbFwiLCBcImRpcmVjdGlvblwiLCBcImNvbXBvbmVudFwiLCBcIm9uU2Nyb2xsXCIsIFwib25WaXNpYmxlQ2hhbmdlXCIsIFwiaW5uZXJQcm9wc1wiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBGaWxsZXIgZnJvbSAnLi9GaWxsZXInO1xuaW1wb3J0IFNjcm9sbEJhciBmcm9tICcuL1Njcm9sbEJhcic7XG5pbXBvcnQgdXNlQ2hpbGRyZW4gZnJvbSAnLi9ob29rcy91c2VDaGlsZHJlbic7XG5pbXBvcnQgdXNlSGVpZ2h0cyBmcm9tICcuL2hvb2tzL3VzZUhlaWdodHMnO1xuaW1wb3J0IHVzZVNjcm9sbFRvIGZyb20gJy4vaG9va3MvdXNlU2Nyb2xsVG8nO1xuaW1wb3J0IHVzZURpZmZJdGVtIGZyb20gJy4vaG9va3MvdXNlRGlmZkl0ZW0nO1xuaW1wb3J0IHVzZUZyYW1lV2hlZWwgZnJvbSAnLi9ob29rcy91c2VGcmFtZVdoZWVsJztcbmltcG9ydCB1c2VNb2JpbGVUb3VjaE1vdmUgZnJvbSAnLi9ob29rcy91c2VNb2JpbGVUb3VjaE1vdmUnO1xuaW1wb3J0IHVzZU9yaWdpblNjcm9sbCBmcm9tICcuL2hvb2tzL3VzZU9yaWdpblNjcm9sbCc7XG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xudmFyIEVNUFRZX0RBVEEgPSBbXTtcbnZhciBTY3JvbGxTdHlsZSA9IHtcbiAgb3ZlcmZsb3dZOiAnYXV0bycsXG4gIG92ZXJmbG93QW5jaG9yOiAnbm9uZSdcbn07XG5leHBvcnQgZnVuY3Rpb24gUmF3TGlzdChwcm9wcywgcmVmKSB7XG4gIHZhciBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy12aXJ0dWFsLWxpc3QnIDogX3Byb3BzJHByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0LFxuICAgIGl0ZW1IZWlnaHQgPSBwcm9wcy5pdGVtSGVpZ2h0LFxuICAgIF9wcm9wcyRmdWxsSGVpZ2h0ID0gcHJvcHMuZnVsbEhlaWdodCxcbiAgICBmdWxsSGVpZ2h0ID0gX3Byb3BzJGZ1bGxIZWlnaHQgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkZnVsbEhlaWdodCxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIGRhdGEgPSBwcm9wcy5kYXRhLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgaXRlbUtleSA9IHByb3BzLml0ZW1LZXksXG4gICAgdmlydHVhbCA9IHByb3BzLnZpcnR1YWwsXG4gICAgZGlyZWN0aW9uID0gcHJvcHMuZGlyZWN0aW9uLFxuICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgQ29tcG9uZW50ID0gX3Byb3BzJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2RpdicgOiBfcHJvcHMkY29tcG9uZW50LFxuICAgIG9uU2Nyb2xsID0gcHJvcHMub25TY3JvbGwsXG4gICAgb25WaXNpYmxlQ2hhbmdlID0gcHJvcHMub25WaXNpYmxlQ2hhbmdlLFxuICAgIGlubmVyUHJvcHMgPSBwcm9wcy5pbm5lclByb3BzLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1JU0MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciB1c2VWaXJ0dWFsID0gISEodmlydHVhbCAhPT0gZmFsc2UgJiYgaGVpZ2h0ICYmIGl0ZW1IZWlnaHQpO1xuICB2YXIgaW5WaXJ0dWFsID0gdXNlVmlydHVhbCAmJiBkYXRhICYmIGl0ZW1IZWlnaHQgKiBkYXRhLmxlbmd0aCA+IGhlaWdodDtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKDApLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIHNjcm9sbFRvcCA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0U2Nyb2xsVG9wID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZShmYWxzZSksXG4gICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgIHNjcm9sbE1vdmluZyA9IF91c2VTdGF0ZTRbMF0sXG4gICAgc2V0U2Nyb2xsTW92aW5nID0gX3VzZVN0YXRlNFsxXTtcbiAgdmFyIG1lcmdlZENsYXNzTmFtZSA9IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgY2xhc3NOYW1lKTtcbiAgdmFyIG1lcmdlZERhdGEgPSBkYXRhIHx8IEVNUFRZX0RBVEE7XG4gIHZhciBjb21wb25lbnRSZWYgPSB1c2VSZWYoKTtcbiAgdmFyIGZpbGxlcklubmVyUmVmID0gdXNlUmVmKCk7XG4gIHZhciBzY3JvbGxCYXJSZWYgPSB1c2VSZWYoKTsgLy8gSGFjayBvbiBzY3JvbGxiYXIgdG8gZW5hYmxlIGZsYXNoIGNhbGxcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJdGVtIEtleSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBnZXRLZXkgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoaXRlbSkge1xuICAgIGlmICh0eXBlb2YgaXRlbUtleSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZW1LZXkoaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtID09PSBudWxsIHx8IGl0ZW0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGl0ZW1baXRlbUtleV07XG4gIH0sIFtpdGVtS2V5XSk7XG4gIHZhciBzaGFyZWRDb25maWcgPSB7XG4gICAgZ2V0S2V5OiBnZXRLZXlcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2Nyb2xsID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGZ1bmN0aW9uIHN5bmNTY3JvbGxUb3AobmV3VG9wKSB7XG4gICAgc2V0U2Nyb2xsVG9wKGZ1bmN0aW9uIChvcmlnaW4pIHtcbiAgICAgIHZhciB2YWx1ZTtcbiAgICAgIGlmICh0eXBlb2YgbmV3VG9wID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhbHVlID0gbmV3VG9wKG9yaWdpbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IG5ld1RvcDtcbiAgICAgIH1cbiAgICAgIHZhciBhbGlnbmVkVG9wID0ga2VlcEluUmFuZ2UodmFsdWUpO1xuICAgICAgY29tcG9uZW50UmVmLmN1cnJlbnQuc2Nyb2xsVG9wID0gYWxpZ25lZFRvcDtcbiAgICAgIHJldHVybiBhbGlnbmVkVG9wO1xuICAgIH0pO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IExlZ2FjeSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQdXQgcmVmIGhlcmUgc2luY2UgdGhlIHJhbmdlIGlzIGdlbmVyYXRlIGJ5IGZvbGxvd1xuICB2YXIgcmFuZ2VSZWYgPSB1c2VSZWYoe1xuICAgIHN0YXJ0OiAwLFxuICAgIGVuZDogbWVyZ2VkRGF0YS5sZW5ndGhcbiAgfSk7XG4gIHZhciBkaWZmSXRlbVJlZiA9IHVzZVJlZigpO1xuICB2YXIgX3VzZURpZmZJdGVtID0gdXNlRGlmZkl0ZW0obWVyZ2VkRGF0YSwgZ2V0S2V5KSxcbiAgICBfdXNlRGlmZkl0ZW0yID0gX3NsaWNlZFRvQXJyYXkoX3VzZURpZmZJdGVtLCAxKSxcbiAgICBkaWZmSXRlbSA9IF91c2VEaWZmSXRlbTJbMF07XG4gIGRpZmZJdGVtUmVmLmN1cnJlbnQgPSBkaWZmSXRlbTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSGVpZ2h0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlSGVpZ2h0cyA9IHVzZUhlaWdodHMoZ2V0S2V5LCBudWxsLCBudWxsKSxcbiAgICBfdXNlSGVpZ2h0czIgPSBfc2xpY2VkVG9BcnJheShfdXNlSGVpZ2h0cywgNCksXG4gICAgc2V0SW5zdGFuY2VSZWYgPSBfdXNlSGVpZ2h0czJbMF0sXG4gICAgY29sbGVjdEhlaWdodCA9IF91c2VIZWlnaHRzMlsxXSxcbiAgICBoZWlnaHRzID0gX3VzZUhlaWdodHMyWzJdLFxuICAgIGhlaWdodFVwZGF0ZWRNYXJrID0gX3VzZUhlaWdodHMyWzNdO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBWaXNpYmxlIENhbGN1bGF0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXVzZVZpcnR1YWwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzY3JvbGxIZWlnaHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICBlbmQ6IG1lcmdlZERhdGEubGVuZ3RoIC0gMSxcbiAgICAgICAgICBvZmZzZXQ6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8gQWx3YXlzIHVzZSB2aXJ0dWFsIHNjcm9sbCBiYXIgaW4gYXZvaWQgc2hha2luZ1xuICAgICAgaWYgKCFpblZpcnR1YWwpIHtcbiAgICAgICAgdmFyIF9maWxsZXJJbm5lclJlZiRjdXJyZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzY3JvbGxIZWlnaHQ6ICgoX2ZpbGxlcklubmVyUmVmJGN1cnJlID0gZmlsbGVySW5uZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2ZpbGxlcklubmVyUmVmJGN1cnJlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZmlsbGVySW5uZXJSZWYkY3VycmUub2Zmc2V0SGVpZ2h0KSB8fCAwLFxuICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgIGVuZDogbWVyZ2VkRGF0YS5sZW5ndGggLSAxLFxuICAgICAgICAgIG9mZnNldDogdW5kZWZpbmVkXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgaXRlbVRvcCA9IDA7XG4gICAgICB2YXIgc3RhcnRJbmRleDtcbiAgICAgIHZhciBzdGFydE9mZnNldDtcbiAgICAgIHZhciBlbmRJbmRleDtcbiAgICAgIHZhciBkYXRhTGVuID0gbWVyZ2VkRGF0YS5sZW5ndGg7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFMZW47IGkgKz0gMSkge1xuICAgICAgICB2YXIgaXRlbSA9IG1lcmdlZERhdGFbaV07XG4gICAgICAgIHZhciBrZXkgPSBnZXRLZXkoaXRlbSk7XG4gICAgICAgIHZhciBjYWNoZUhlaWdodCA9IGhlaWdodHMuZ2V0KGtleSk7XG4gICAgICAgIHZhciBjdXJyZW50SXRlbUJvdHRvbSA9IGl0ZW1Ub3AgKyAoY2FjaGVIZWlnaHQgPT09IHVuZGVmaW5lZCA/IGl0ZW1IZWlnaHQgOiBjYWNoZUhlaWdodCk7XG4gICAgICAgIC8vIENoZWNrIGl0ZW0gdG9wIGluIHRoZSByYW5nZVxuICAgICAgICBpZiAoY3VycmVudEl0ZW1Cb3R0b20gPj0gc2Nyb2xsVG9wICYmIHN0YXJ0SW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHN0YXJ0SW5kZXggPSBpO1xuICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gaXRlbVRvcDtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBpdGVtIGJvdHRvbSBpbiB0aGUgcmFuZ2UuIFdlIHdpbGwgcmVuZGVyIGFkZGl0aW9uYWwgb25lIGl0ZW0gZm9yIG1vdGlvbiB1c2FnZVxuICAgICAgICBpZiAoY3VycmVudEl0ZW1Cb3R0b20gPiBzY3JvbGxUb3AgKyBoZWlnaHQgJiYgZW5kSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGVuZEluZGV4ID0gaTtcbiAgICAgICAgfVxuICAgICAgICBpdGVtVG9wID0gY3VycmVudEl0ZW1Cb3R0b207XG4gICAgICB9XG4gICAgICAvLyBXaGVuIHNjcm9sbFRvcCBhdCB0aGUgZW5kIGJ1dCBkYXRhIGN1dCB0byBzbWFsbCBjb3VudCB3aWxsIHJlYWNoIHRoaXNcbiAgICAgIGlmIChzdGFydEluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3RhcnRJbmRleCA9IDA7XG4gICAgICAgIHN0YXJ0T2Zmc2V0ID0gMDtcbiAgICAgICAgZW5kSW5kZXggPSBNYXRoLmNlaWwoaGVpZ2h0IC8gaXRlbUhlaWdodCk7XG4gICAgICB9XG4gICAgICBpZiAoZW5kSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmRJbmRleCA9IG1lcmdlZERhdGEubGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICAgIC8vIEdpdmUgY2FjaGUgdG8gaW1wcm92ZSBzY3JvbGwgZXhwZXJpZW5jZVxuICAgICAgZW5kSW5kZXggPSBNYXRoLm1pbihlbmRJbmRleCArIDEsIG1lcmdlZERhdGEubGVuZ3RoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNjcm9sbEhlaWdodDogaXRlbVRvcCxcbiAgICAgICAgc3RhcnQ6IHN0YXJ0SW5kZXgsXG4gICAgICAgIGVuZDogZW5kSW5kZXgsXG4gICAgICAgIG9mZnNldDogc3RhcnRPZmZzZXRcbiAgICAgIH07XG4gICAgfSwgW2luVmlydHVhbCwgdXNlVmlydHVhbCwgc2Nyb2xsVG9wLCBtZXJnZWREYXRhLCBoZWlnaHRVcGRhdGVkTWFyaywgaGVpZ2h0XSksXG4gICAgc2Nyb2xsSGVpZ2h0ID0gX1JlYWN0JHVzZU1lbW8uc2Nyb2xsSGVpZ2h0LFxuICAgIHN0YXJ0ID0gX1JlYWN0JHVzZU1lbW8uc3RhcnQsXG4gICAgZW5kID0gX1JlYWN0JHVzZU1lbW8uZW5kLFxuICAgIG9mZnNldCA9IF9SZWFjdCR1c2VNZW1vLm9mZnNldDtcbiAgcmFuZ2VSZWYuY3VycmVudC5zdGFydCA9IHN0YXJ0O1xuICByYW5nZVJlZi5jdXJyZW50LmVuZCA9IGVuZDtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJbiBSYW5nZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtYXhTY3JvbGxIZWlnaHQgPSBzY3JvbGxIZWlnaHQgLSBoZWlnaHQ7XG4gIHZhciBtYXhTY3JvbGxIZWlnaHRSZWYgPSB1c2VSZWYobWF4U2Nyb2xsSGVpZ2h0KTtcbiAgbWF4U2Nyb2xsSGVpZ2h0UmVmLmN1cnJlbnQgPSBtYXhTY3JvbGxIZWlnaHQ7XG4gIGZ1bmN0aW9uIGtlZXBJblJhbmdlKG5ld1Njcm9sbFRvcCkge1xuICAgIHZhciBuZXdUb3AgPSBuZXdTY3JvbGxUb3A7XG4gICAgaWYgKCFOdW1iZXIuaXNOYU4obWF4U2Nyb2xsSGVpZ2h0UmVmLmN1cnJlbnQpKSB7XG4gICAgICBuZXdUb3AgPSBNYXRoLm1pbihuZXdUb3AsIG1heFNjcm9sbEhlaWdodFJlZi5jdXJyZW50KTtcbiAgICB9XG4gICAgbmV3VG9wID0gTWF0aC5tYXgobmV3VG9wLCAwKTtcbiAgICByZXR1cm4gbmV3VG9wO1xuICB9XG4gIHZhciBpc1Njcm9sbEF0VG9wID0gc2Nyb2xsVG9wIDw9IDA7XG4gIHZhciBpc1Njcm9sbEF0Qm90dG9tID0gc2Nyb2xsVG9wID49IG1heFNjcm9sbEhlaWdodDtcbiAgdmFyIG9yaWdpblNjcm9sbCA9IHVzZU9yaWdpblNjcm9sbChpc1Njcm9sbEF0VG9wLCBpc1Njcm9sbEF0Qm90dG9tKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2Nyb2xsID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGZ1bmN0aW9uIG9uU2Nyb2xsQmFyKG5ld1Njcm9sbFRvcCkge1xuICAgIHZhciBuZXdUb3AgPSBuZXdTY3JvbGxUb3A7XG4gICAgc3luY1Njcm9sbFRvcChuZXdUb3ApO1xuICB9XG4gIC8vIFdoZW4gZGF0YSBzaXplIHJlZHVjZS4gSXQgbWF5IHRyaWdnZXIgbmF0aXZlIHNjcm9sbCBldmVudCBiYWNrIHRvIGZpdCBzY3JvbGwgcG9zaXRpb25cbiAgZnVuY3Rpb24gb25GYWxsYmFja1Njcm9sbChlKSB7XG4gICAgdmFyIG5ld1Njcm9sbFRvcCA9IGUuY3VycmVudFRhcmdldC5zY3JvbGxUb3A7XG4gICAgaWYgKG5ld1Njcm9sbFRvcCAhPT0gc2Nyb2xsVG9wKSB7XG4gICAgICBzeW5jU2Nyb2xsVG9wKG5ld1Njcm9sbFRvcCk7XG4gICAgfVxuICAgIC8vIFRyaWdnZXIgb3JpZ2luIG9uU2Nyb2xsXG4gICAgb25TY3JvbGwgPT09IG51bGwgfHwgb25TY3JvbGwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uU2Nyb2xsKGUpO1xuICB9XG4gIC8vIFNpbmNlIHRoaXMgYWRkZWQgaW4gZ2xvYmFsLHNob3VsZCB1c2UgcmVmIHRvIGtlZXAgdXBkYXRlXG4gIHZhciBfdXNlRnJhbWVXaGVlbCA9IHVzZUZyYW1lV2hlZWwodXNlVmlydHVhbCwgaXNTY3JvbGxBdFRvcCwgaXNTY3JvbGxBdEJvdHRvbSwgZnVuY3Rpb24gKG9mZnNldFkpIHtcbiAgICAgIHN5bmNTY3JvbGxUb3AoZnVuY3Rpb24gKHRvcCkge1xuICAgICAgICB2YXIgbmV3VG9wID0gdG9wICsgb2Zmc2V0WTtcbiAgICAgICAgcmV0dXJuIG5ld1RvcDtcbiAgICAgIH0pO1xuICAgIH0pLFxuICAgIF91c2VGcmFtZVdoZWVsMiA9IF9zbGljZWRUb0FycmF5KF91c2VGcmFtZVdoZWVsLCAyKSxcbiAgICBvblJhd1doZWVsID0gX3VzZUZyYW1lV2hlZWwyWzBdLFxuICAgIG9uRmlyZUZveFNjcm9sbCA9IF91c2VGcmFtZVdoZWVsMlsxXTtcbiAgLy8gTW9iaWxlIHRvdWNoIG1vdmVcbiAgdXNlTW9iaWxlVG91Y2hNb3ZlKHVzZVZpcnR1YWwsIGNvbXBvbmVudFJlZiwgZnVuY3Rpb24gKGRlbHRhWSwgc21vb3RoT2Zmc2V0KSB7XG4gICAgaWYgKG9yaWdpblNjcm9sbChkZWx0YVksIHNtb290aE9mZnNldCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgb25SYXdXaGVlbCh7XG4gICAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gcHJldmVudERlZmF1bHQoKSB7fSxcbiAgICAgIGRlbHRhWTogZGVsdGFZXG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIC8vIEZpcmVmb3ggb25seVxuICAgIGZ1bmN0aW9uIG9uTW96TW91c2VQaXhlbFNjcm9sbChlKSB7XG4gICAgICBpZiAodXNlVmlydHVhbCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbXBvbmVudFJlZi5jdXJyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgb25SYXdXaGVlbCk7XG4gICAgY29tcG9uZW50UmVmLmN1cnJlbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NTW91c2VTY3JvbGwnLCBvbkZpcmVGb3hTY3JvbGwpO1xuICAgIGNvbXBvbmVudFJlZi5jdXJyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ01vek1vdXNlUGl4ZWxTY3JvbGwnLCBvbk1vek1vdXNlUGl4ZWxTY3JvbGwpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoY29tcG9uZW50UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgY29tcG9uZW50UmVmLmN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvblJhd1doZWVsKTtcbiAgICAgICAgY29tcG9uZW50UmVmLmN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignRE9NTW91c2VTY3JvbGwnLCBvbkZpcmVGb3hTY3JvbGwpO1xuICAgICAgICBjb21wb25lbnRSZWYuY3VycmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdNb3pNb3VzZVBpeGVsU2Nyb2xsJywgb25Nb3pNb3VzZVBpeGVsU2Nyb2xsKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbdXNlVmlydHVhbF0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVmID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHNjcm9sbFRvID0gdXNlU2Nyb2xsVG8oY29tcG9uZW50UmVmLCBtZXJnZWREYXRhLCBoZWlnaHRzLCBpdGVtSGVpZ2h0LCBnZXRLZXksIGNvbGxlY3RIZWlnaHQsIHN5bmNTY3JvbGxUb3AsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3Njcm9sbEJhclJlZiRjdXJyZW50O1xuICAgIChfc2Nyb2xsQmFyUmVmJGN1cnJlbnQgPSBzY3JvbGxCYXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3Njcm9sbEJhclJlZiRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfc2Nyb2xsQmFyUmVmJGN1cnJlbnQuZGVsYXlIaWRkZW4oKTtcbiAgfSk7XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjcm9sbFRvOiBzY3JvbGxUb1xuICAgIH07XG4gIH0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqIFdlIG5lZWQgdG9sZCBvdXRzaWRlIHRoYXQgc29tZSBsaXN0IG5vdCByZW5kZXJlZCAqL1xuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChvblZpc2libGVDaGFuZ2UpIHtcbiAgICAgIHZhciByZW5kZXJMaXN0ID0gbWVyZ2VkRGF0YS5zbGljZShzdGFydCwgZW5kICsgMSk7XG4gICAgICBvblZpc2libGVDaGFuZ2UocmVuZGVyTGlzdCwgbWVyZ2VkRGF0YSk7XG4gICAgfVxuICB9LCBbc3RhcnQsIGVuZCwgbWVyZ2VkRGF0YV0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGxpc3RDaGlsZHJlbiA9IHVzZUNoaWxkcmVuKG1lcmdlZERhdGEsIHN0YXJ0LCBlbmQsIHNldEluc3RhbmNlUmVmLCBjaGlsZHJlbiwgc2hhcmVkQ29uZmlnKTtcbiAgdmFyIGNvbXBvbmVudFN0eWxlID0gbnVsbDtcbiAgaWYgKGhlaWdodCkge1xuICAgIGNvbXBvbmVudFN0eWxlID0gX29iamVjdFNwcmVhZChfZGVmaW5lUHJvcGVydHkoe30sIGZ1bGxIZWlnaHQgPyAnaGVpZ2h0JyA6ICdtYXhIZWlnaHQnLCBoZWlnaHQpLCBTY3JvbGxTdHlsZSk7XG4gICAgaWYgKHVzZVZpcnR1YWwpIHtcbiAgICAgIGNvbXBvbmVudFN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xuICAgICAgaWYgKHNjcm9sbE1vdmluZykge1xuICAgICAgICBjb21wb25lbnRTdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwge30sIHtcbiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gICAgfSksXG4gICAgY2xhc3NOYW1lOiBtZXJnZWRDbGFzc05hbWVcbiAgfSwgcmVzdFByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhvbGRlclwiKSxcbiAgICBzdHlsZTogY29tcG9uZW50U3R5bGUsXG4gICAgcmVmOiBjb21wb25lbnRSZWYsXG4gICAgb25TY3JvbGw6IG9uRmFsbGJhY2tTY3JvbGxcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmlsbGVyLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgaGVpZ2h0OiBzY3JvbGxIZWlnaHQsXG4gICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgb25Jbm5lclJlc2l6ZTogY29sbGVjdEhlaWdodCxcbiAgICByZWY6IGZpbGxlcklubmVyUmVmLFxuICAgIGlubmVyUHJvcHM6IGlubmVyUHJvcHNcbiAgfSwgbGlzdENoaWxkcmVuKSksIHVzZVZpcnR1YWwgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsQmFyLCB7XG4gICAgcmVmOiBzY3JvbGxCYXJSZWYsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3AsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgc2Nyb2xsSGVpZ2h0OiBzY3JvbGxIZWlnaHQsXG4gICAgY291bnQ6IG1lcmdlZERhdGEubGVuZ3RoLFxuICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgIG9uU2Nyb2xsOiBvblNjcm9sbEJhcixcbiAgICBvblN0YXJ0TW92ZTogZnVuY3Rpb24gb25TdGFydE1vdmUoKSB7XG4gICAgICBzZXRTY3JvbGxNb3ZpbmcodHJ1ZSk7XG4gICAgfSxcbiAgICBvblN0b3BNb3ZlOiBmdW5jdGlvbiBvblN0b3BNb3ZlKCkge1xuICAgICAgc2V0U2Nyb2xsTW92aW5nKGZhbHNlKTtcbiAgICB9XG4gIH0pKTtcbn1cbnZhciBMaXN0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoUmF3TGlzdCk7XG5MaXN0LmRpc3BsYXlOYW1lID0gJ0xpc3QnO1xuZXhwb3J0IGRlZmF1bHQgTGlzdDsiLCIvKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGxhdGZvcm1NYWMoKSB7XG4gIHJldHVybiAvKG1hY1xcc29zfG1hY2ludG9zaCkvaS50ZXN0KG5hdmlnYXRvci5hcHBWZXJzaW9uKTtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgU2VsZWN0Q29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IGRlZmF1bHQgU2VsZWN0Q29udGV4dDsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xudmFyIF9leGNsdWRlZCA9IFtcImRpc2FibGVkXCIsIFwidGl0bGVcIiwgXCJjaGlsZHJlblwiLCBcInN0eWxlXCIsIFwiY2xhc3NOYW1lXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuaW1wb3J0IG9taXQgZnJvbSBcInJjLXV0aWwvZXMvb21pdFwiO1xuaW1wb3J0IHBpY2tBdHRycyBmcm9tIFwicmMtdXRpbC9lcy9waWNrQXR0cnNcIjtcbmltcG9ydCB1c2VNZW1vIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lbW9cIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IExpc3QgZnJvbSAncmMtdmlydHVhbC1saXN0JztcbmltcG9ydCBUcmFuc0J0biBmcm9tIFwiLi9UcmFuc0J0blwiO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybU1hYyB9IGZyb20gXCIuL3V0aWxzL3BsYXRmb3JtVXRpbFwiO1xuaW1wb3J0IHVzZUJhc2VQcm9wcyBmcm9tIFwiLi9ob29rcy91c2VCYXNlUHJvcHNcIjtcbmltcG9ydCBTZWxlY3RDb250ZXh0IGZyb20gXCIuL1NlbGVjdENvbnRleHRcIjtcbmZ1bmN0aW9uIGlzVGl0bGVUeXBlKGNvbnRlbnQpIHtcbiAgcmV0dXJuIHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgY29udGVudCA9PT0gJ251bWJlcic7XG59XG5cbi8qKlxuICogVXNpbmcgdmlydHVhbCBsaXN0IG9mIG9wdGlvbiBkaXNwbGF5LlxuICogV2lsbCBmYWxsYmFjayB0byBkb20gaWYgdXNlIGN1c3RvbWl6ZSByZW5kZXIuXG4gKi9cbnZhciBPcHRpb25MaXN0ID0gZnVuY3Rpb24gT3B0aW9uTGlzdChfLCByZWYpIHtcbiAgdmFyIF91c2VCYXNlUHJvcHMgPSB1c2VCYXNlUHJvcHMoKSxcbiAgICBwcmVmaXhDbHMgPSBfdXNlQmFzZVByb3BzLnByZWZpeENscyxcbiAgICBpZCA9IF91c2VCYXNlUHJvcHMuaWQsXG4gICAgb3BlbiA9IF91c2VCYXNlUHJvcHMub3BlbixcbiAgICBtdWx0aXBsZSA9IF91c2VCYXNlUHJvcHMubXVsdGlwbGUsXG4gICAgbW9kZSA9IF91c2VCYXNlUHJvcHMubW9kZSxcbiAgICBzZWFyY2hWYWx1ZSA9IF91c2VCYXNlUHJvcHMuc2VhcmNoVmFsdWUsXG4gICAgdG9nZ2xlT3BlbiA9IF91c2VCYXNlUHJvcHMudG9nZ2xlT3BlbixcbiAgICBub3RGb3VuZENvbnRlbnQgPSBfdXNlQmFzZVByb3BzLm5vdEZvdW5kQ29udGVudCxcbiAgICBvblBvcHVwU2Nyb2xsID0gX3VzZUJhc2VQcm9wcy5vblBvcHVwU2Nyb2xsO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFNlbGVjdENvbnRleHQpLFxuICAgIGZsYXR0ZW5PcHRpb25zID0gX1JlYWN0JHVzZUNvbnRleHQuZmxhdHRlbk9wdGlvbnMsXG4gICAgb25BY3RpdmVWYWx1ZSA9IF9SZWFjdCR1c2VDb250ZXh0Lm9uQWN0aXZlVmFsdWUsXG4gICAgZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uLFxuICAgIG9uU2VsZWN0ID0gX1JlYWN0JHVzZUNvbnRleHQub25TZWxlY3QsXG4gICAgbWVudUl0ZW1TZWxlY3RlZEljb24gPSBfUmVhY3QkdXNlQ29udGV4dC5tZW51SXRlbVNlbGVjdGVkSWNvbixcbiAgICByYXdWYWx1ZXMgPSBfUmVhY3QkdXNlQ29udGV4dC5yYXdWYWx1ZXMsXG4gICAgZmllbGROYW1lcyA9IF9SZWFjdCR1c2VDb250ZXh0LmZpZWxkTmFtZXMsXG4gICAgdmlydHVhbCA9IF9SZWFjdCR1c2VDb250ZXh0LnZpcnR1YWwsXG4gICAgbGlzdEhlaWdodCA9IF9SZWFjdCR1c2VDb250ZXh0Lmxpc3RIZWlnaHQsXG4gICAgbGlzdEl0ZW1IZWlnaHQgPSBfUmVhY3QkdXNlQ29udGV4dC5saXN0SXRlbUhlaWdodDtcbiAgdmFyIGl0ZW1QcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW1cIik7XG4gIHZhciBtZW1vRmxhdHRlbk9wdGlvbnMgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmxhdHRlbk9wdGlvbnM7XG4gIH0sIFtvcGVuLCBmbGF0dGVuT3B0aW9uc10sIGZ1bmN0aW9uIChwcmV2LCBuZXh0KSB7XG4gICAgcmV0dXJuIG5leHRbMF0gJiYgcHJldlsxXSAhPT0gbmV4dFsxXTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IExpc3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBsaXN0UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgb25MaXN0TW91c2VEb3duID0gZnVuY3Rpb24gb25MaXN0TW91c2VEb3duKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfTtcbiAgdmFyIHNjcm9sbEludG9WaWV3ID0gZnVuY3Rpb24gc2Nyb2xsSW50b1ZpZXcoYXJncykge1xuICAgIGlmIChsaXN0UmVmLmN1cnJlbnQpIHtcbiAgICAgIGxpc3RSZWYuY3VycmVudC5zY3JvbGxUbyh0eXBlb2YgYXJncyA9PT0gJ251bWJlcicgPyB7XG4gICAgICAgIGluZGV4OiBhcmdzXG4gICAgICB9IDogYXJncyk7XG4gICAgfVxuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IEFjdGl2ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZ2V0RW5hYmxlZEFjdGl2ZUluZGV4ID0gZnVuY3Rpb24gZ2V0RW5hYmxlZEFjdGl2ZUluZGV4KGluZGV4KSB7XG4gICAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMTtcbiAgICB2YXIgbGVuID0gbWVtb0ZsYXR0ZW5PcHRpb25zLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICB2YXIgY3VycmVudCA9IChpbmRleCArIGkgKiBvZmZzZXQgKyBsZW4pICUgbGVuO1xuICAgICAgdmFyIF9tZW1vRmxhdHRlbk9wdGlvbnMkYyA9IG1lbW9GbGF0dGVuT3B0aW9uc1tjdXJyZW50XSxcbiAgICAgICAgZ3JvdXAgPSBfbWVtb0ZsYXR0ZW5PcHRpb25zJGMuZ3JvdXAsXG4gICAgICAgIGRhdGEgPSBfbWVtb0ZsYXR0ZW5PcHRpb25zJGMuZGF0YTtcbiAgICAgIGlmICghZ3JvdXAgJiYgIWRhdGEuZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXRFbmFibGVkQWN0aXZlSW5kZXgoMCk7XG4gICAgfSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgYWN0aXZlSW5kZXggPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEFjdGl2ZUluZGV4ID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIHNldEFjdGl2ZSA9IGZ1bmN0aW9uIHNldEFjdGl2ZShpbmRleCkge1xuICAgIHZhciBmcm9tS2V5Ym9hcmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgIHNldEFjdGl2ZUluZGV4KGluZGV4KTtcbiAgICB2YXIgaW5mbyA9IHtcbiAgICAgIHNvdXJjZTogZnJvbUtleWJvYXJkID8gJ2tleWJvYXJkJyA6ICdtb3VzZSdcbiAgICB9O1xuXG4gICAgLy8gVHJpZ2dlciBhY3RpdmUgZXZlbnRcbiAgICB2YXIgZmxhdHRlbkl0ZW0gPSBtZW1vRmxhdHRlbk9wdGlvbnNbaW5kZXhdO1xuICAgIGlmICghZmxhdHRlbkl0ZW0pIHtcbiAgICAgIG9uQWN0aXZlVmFsdWUobnVsbCwgLTEsIGluZm8pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBvbkFjdGl2ZVZhbHVlKGZsYXR0ZW5JdGVtLnZhbHVlLCBpbmRleCwgaW5mbyk7XG4gIH07XG5cbiAgLy8gQXV0byBhY3RpdmUgZmlyc3QgaXRlbSB3aGVuIGxpc3QgbGVuZ3RoIG9yIHNlYXJjaFZhbHVlIGNoYW5nZWRcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRBY3RpdmUoZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uICE9PSBmYWxzZSA/IGdldEVuYWJsZWRBY3RpdmVJbmRleCgwKSA6IC0xKTtcbiAgfSwgW21lbW9GbGF0dGVuT3B0aW9ucy5sZW5ndGgsIHNlYXJjaFZhbHVlXSk7XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMzQ5NzVcbiAgdmFyIGlzU2VsZWN0ZWQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gcmF3VmFsdWVzLmhhcyh2YWx1ZSkgJiYgbW9kZSAhPT0gJ2NvbWJvYm94JztcbiAgfSwgW21vZGUsIF90b0NvbnN1bWFibGVBcnJheShyYXdWYWx1ZXMpLnRvU3RyaW5nKCksIHJhd1ZhbHVlcy5zaXplXSk7XG5cbiAgLy8gQXV0byBzY3JvbGwgdG8gaXRlbSBwb3NpdGlvbiBpbiBzaW5nbGUgbW9kZVxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIFJlYWN0IHdpbGwgc2tpcCBgb25DaGFuZ2VgIHdoZW4gY29tcG9uZW50IHVwZGF0ZS5cbiAgICAgKiBgc2V0QWN0aXZlYCBmdW5jdGlvbiB3aWxsIGNhbGwgcm9vdCBhY2Nlc3NpYmlsaXR5IHN0YXRlIHVwZGF0ZSB3aGljaCBtYWtlcyByZS1yZW5kZXIuXG4gICAgICogU28gd2UgbmVlZCB0byBkZWxheSB0byBsZXQgSW5wdXQgY29tcG9uZW50IHRyaWdnZXIgb25DaGFuZ2UgZmlyc3QuXG4gICAgICovXG4gICAgdmFyIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFtdWx0aXBsZSAmJiBvcGVuICYmIHJhd1ZhbHVlcy5zaXplID09PSAxKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IEFycmF5LmZyb20ocmF3VmFsdWVzKVswXTtcbiAgICAgICAgdmFyIGluZGV4ID0gbWVtb0ZsYXR0ZW5PcHRpb25zLmZpbmRJbmRleChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgIHZhciBkYXRhID0gX3JlZi5kYXRhO1xuICAgICAgICAgIHJldHVybiBkYXRhLnZhbHVlID09PSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBzZXRBY3RpdmUoaW5kZXgpO1xuICAgICAgICAgIHNjcm9sbEludG9WaWV3KGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRm9yY2UgdHJpZ2dlciBzY3JvbGxiYXIgdmlzaWJsZSB3aGVuIG9wZW5cbiAgICBpZiAob3Blbikge1xuICAgICAgdmFyIF9saXN0UmVmJGN1cnJlbnQ7XG4gICAgICAoX2xpc3RSZWYkY3VycmVudCA9IGxpc3RSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2xpc3RSZWYkY3VycmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2xpc3RSZWYkY3VycmVudC5zY3JvbGxUbyh1bmRlZmluZWQpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgIH07XG4gIH0sIFtvcGVuLCBzZWFyY2hWYWx1ZV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFZhbHVlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25TZWxlY3RWYWx1ZSA9IGZ1bmN0aW9uIG9uU2VsZWN0VmFsdWUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb25TZWxlY3QodmFsdWUsIHtcbiAgICAgICAgc2VsZWN0ZWQ6ICFyYXdWYWx1ZXMuaGFzKHZhbHVlKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU2luZ2xlIG1vZGUgc2hvdWxkIGFsd2F5cyBjbG9zZSBieSBzZWxlY3RcbiAgICBpZiAoIW11bHRpcGxlKSB7XG4gICAgICB0b2dnbGVPcGVuKGZhbHNlKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBLZXlib2FyZCA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICAgIHZhciB3aGljaCA9IGV2ZW50LndoaWNoLFxuICAgICAgICAgIGN0cmxLZXkgPSBldmVudC5jdHJsS2V5O1xuICAgICAgICBzd2l0Y2ggKHdoaWNoKSB7XG4gICAgICAgICAgLy8gPj4+IEFycm93IGtleXMgJiBjdHJsICsgbi9wIG9uIE1hY1xuICAgICAgICAgIGNhc2UgS2V5Q29kZS5OOlxuICAgICAgICAgIGNhc2UgS2V5Q29kZS5QOlxuICAgICAgICAgIGNhc2UgS2V5Q29kZS5VUDpcbiAgICAgICAgICBjYXNlIEtleUNvZGUuRE9XTjpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICAgICAgICAgIGlmICh3aGljaCA9PT0gS2V5Q29kZS5VUCkge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IC0xO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoaWNoID09PSBLZXlDb2RlLkRPV04pIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAxO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzUGxhdGZvcm1NYWMoKSAmJiBjdHJsS2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKHdoaWNoID09PSBLZXlDb2RlLk4pIHtcbiAgICAgICAgICAgICAgICAgIG9mZnNldCA9IDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGljaCA9PT0gS2V5Q29kZS5QKSB7XG4gICAgICAgICAgICAgICAgICBvZmZzZXQgPSAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKG9mZnNldCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHZhciBuZXh0QWN0aXZlSW5kZXggPSBnZXRFbmFibGVkQWN0aXZlSW5kZXgoYWN0aXZlSW5kZXggKyBvZmZzZXQsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgc2Nyb2xsSW50b1ZpZXcobmV4dEFjdGl2ZUluZGV4KTtcbiAgICAgICAgICAgICAgICBzZXRBY3RpdmUobmV4dEFjdGl2ZUluZGV4LCB0cnVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIC8vID4+PiBTZWxlY3RcbiAgICAgICAgICBjYXNlIEtleUNvZGUuRU5URVI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIHZhbHVlXG4gICAgICAgICAgICAgIHZhciBpdGVtID0gbWVtb0ZsYXR0ZW5PcHRpb25zW2FjdGl2ZUluZGV4XTtcbiAgICAgICAgICAgICAgaWYgKGl0ZW0gJiYgIWl0ZW0uZGF0YS5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIG9uU2VsZWN0VmFsdWUoaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb25TZWxlY3RWYWx1ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIC8vID4+PiBDbG9zZVxuICAgICAgICAgIGNhc2UgS2V5Q29kZS5FU0M6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRvZ2dsZU9wZW4oZmFsc2UpO1xuICAgICAgICAgICAgICBpZiAob3Blbikge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvbktleVVwOiBmdW5jdGlvbiBvbktleVVwKCkge30sXG4gICAgICBzY3JvbGxUbzogZnVuY3Rpb24gc2Nyb2xsVG8oaW5kZXgpIHtcbiAgICAgICAgc2Nyb2xsSW50b1ZpZXcoaW5kZXgpO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAobWVtb0ZsYXR0ZW5PcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICByb2xlOiBcImxpc3Rib3hcIixcbiAgICAgIGlkOiBcIlwiLmNvbmNhdChpZCwgXCJfbGlzdFwiKSxcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoaXRlbVByZWZpeENscywgXCItZW1wdHlcIiksXG4gICAgICBvbk1vdXNlRG93bjogb25MaXN0TW91c2VEb3duXG4gICAgfSwgbm90Rm91bmRDb250ZW50KTtcbiAgfVxuICB2YXIgb21pdEZpZWxkTmFtZUxpc3QgPSBPYmplY3Qua2V5cyhmaWVsZE5hbWVzKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBmaWVsZE5hbWVzW2tleV07XG4gIH0pO1xuICB2YXIgZ2V0TGFiZWwgPSBmdW5jdGlvbiBnZXRMYWJlbChpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW0ubGFiZWw7XG4gIH07XG4gIHZhciByZW5kZXJJdGVtID0gZnVuY3Rpb24gcmVuZGVySXRlbShpbmRleCkge1xuICAgIHZhciBpdGVtID0gbWVtb0ZsYXR0ZW5PcHRpb25zW2luZGV4XTtcbiAgICBpZiAoIWl0ZW0pIHJldHVybiBudWxsO1xuICAgIHZhciBpdGVtRGF0YSA9IGl0ZW0uZGF0YSB8fCB7fTtcbiAgICB2YXIgdmFsdWUgPSBpdGVtRGF0YS52YWx1ZTtcbiAgICB2YXIgZ3JvdXAgPSBpdGVtLmdyb3VwO1xuICAgIHZhciBhdHRycyA9IHBpY2tBdHRycyhpdGVtRGF0YSwgdHJ1ZSk7XG4gICAgdmFyIG1lcmdlZExhYmVsID0gZ2V0TGFiZWwoaXRlbSk7XG4gICAgcmV0dXJuIGl0ZW0gPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgICBcImFyaWEtbGFiZWxcIjogdHlwZW9mIG1lcmdlZExhYmVsID09PSAnc3RyaW5nJyAmJiAhZ3JvdXAgPyBtZXJnZWRMYWJlbCA6IG51bGxcbiAgICB9LCBhdHRycywge1xuICAgICAga2V5OiBpbmRleCxcbiAgICAgIHJvbGU6IGdyb3VwID8gJ3ByZXNlbnRhdGlvbicgOiAnb3B0aW9uJyxcbiAgICAgIGlkOiBcIlwiLmNvbmNhdChpZCwgXCJfbGlzdF9cIikuY29uY2F0KGluZGV4KSxcbiAgICAgIFwiYXJpYS1zZWxlY3RlZFwiOiBpc1NlbGVjdGVkKHZhbHVlKVxuICAgIH0pLCB2YWx1ZSkgOiBudWxsO1xuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByb2xlOiBcImxpc3Rib3hcIixcbiAgICBpZDogXCJcIi5jb25jYXQoaWQsIFwiX2xpc3RcIiksXG4gICAgc3R5bGU6IHtcbiAgICAgIGhlaWdodDogMCxcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgfVxuICB9LCByZW5kZXJJdGVtKGFjdGl2ZUluZGV4IC0gMSksIHJlbmRlckl0ZW0oYWN0aXZlSW5kZXgpLCByZW5kZXJJdGVtKGFjdGl2ZUluZGV4ICsgMSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMaXN0LCB7XG4gICAgaXRlbUtleTogXCJrZXlcIixcbiAgICByZWY6IGxpc3RSZWYsXG4gICAgZGF0YTogbWVtb0ZsYXR0ZW5PcHRpb25zLFxuICAgIGhlaWdodDogbGlzdEhlaWdodCxcbiAgICBpdGVtSGVpZ2h0OiBsaXN0SXRlbUhlaWdodCxcbiAgICBmdWxsSGVpZ2h0OiBmYWxzZSxcbiAgICBvbk1vdXNlRG93bjogb25MaXN0TW91c2VEb3duLFxuICAgIG9uU2Nyb2xsOiBvblBvcHVwU2Nyb2xsLFxuICAgIHZpcnR1YWw6IHZpcnR1YWxcbiAgfSwgZnVuY3Rpb24gKGl0ZW0sIGl0ZW1JbmRleCkge1xuICAgIHZhciBfY2xhc3NOYW1lcztcbiAgICB2YXIgZ3JvdXAgPSBpdGVtLmdyb3VwLFxuICAgICAgZ3JvdXBPcHRpb24gPSBpdGVtLmdyb3VwT3B0aW9uLFxuICAgICAgZGF0YSA9IGl0ZW0uZGF0YSxcbiAgICAgIGxhYmVsID0gaXRlbS5sYWJlbCxcbiAgICAgIHZhbHVlID0gaXRlbS52YWx1ZTtcbiAgICB2YXIga2V5ID0gZGF0YS5rZXk7XG5cbiAgICAvLyBHcm91cFxuICAgIGlmIChncm91cCkge1xuICAgICAgdmFyIF9kYXRhJHRpdGxlO1xuICAgICAgdmFyIGdyb3VwVGl0bGUgPSAoX2RhdGEkdGl0bGUgPSBkYXRhLnRpdGxlKSAhPT0gbnVsbCAmJiBfZGF0YSR0aXRsZSAhPT0gdm9pZCAwID8gX2RhdGEkdGl0bGUgOiBpc1RpdGxlVHlwZShsYWJlbCkgPyBsYWJlbC50b1N0cmluZygpIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGl0ZW1QcmVmaXhDbHMsIFwiXCIuY29uY2F0KGl0ZW1QcmVmaXhDbHMsIFwiLWdyb3VwXCIpKSxcbiAgICAgICAgdGl0bGU6IGdyb3VwVGl0bGVcbiAgICAgIH0sIGxhYmVsICE9PSB1bmRlZmluZWQgPyBsYWJlbCA6IGtleSk7XG4gICAgfVxuICAgIHZhciBkaXNhYmxlZCA9IGRhdGEuZGlzYWJsZWQsXG4gICAgICB0aXRsZSA9IGRhdGEudGl0bGUsXG4gICAgICBjaGlsZHJlbiA9IGRhdGEuY2hpbGRyZW4sXG4gICAgICBzdHlsZSA9IGRhdGEuc3R5bGUsXG4gICAgICBjbGFzc05hbWUgPSBkYXRhLmNsYXNzTmFtZSxcbiAgICAgIG90aGVyUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoZGF0YSwgX2V4Y2x1ZGVkKTtcbiAgICB2YXIgcGFzc2VkUHJvcHMgPSBvbWl0KG90aGVyUHJvcHMsIG9taXRGaWVsZE5hbWVMaXN0KTtcblxuICAgIC8vIE9wdGlvblxuICAgIHZhciBzZWxlY3RlZCA9IGlzU2VsZWN0ZWQodmFsdWUpO1xuICAgIHZhciBvcHRpb25QcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChpdGVtUHJlZml4Q2xzLCBcIi1vcHRpb25cIik7XG4gICAgdmFyIG9wdGlvbkNsYXNzTmFtZSA9IGNsYXNzTmFtZXMoaXRlbVByZWZpeENscywgb3B0aW9uUHJlZml4Q2xzLCBjbGFzc05hbWUsIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KG9wdGlvblByZWZpeENscywgXCItZ3JvdXBlZFwiKSwgZ3JvdXBPcHRpb24pLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KG9wdGlvblByZWZpeENscywgXCItYWN0aXZlXCIpLCBhY3RpdmVJbmRleCA9PT0gaXRlbUluZGV4ICYmICFkaXNhYmxlZCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQob3B0aW9uUHJlZml4Q2xzLCBcIi1kaXNhYmxlZFwiKSwgZGlzYWJsZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KG9wdGlvblByZWZpeENscywgXCItc2VsZWN0ZWRcIiksIHNlbGVjdGVkKSwgX2NsYXNzTmFtZXMpKTtcbiAgICB2YXIgbWVyZ2VkTGFiZWwgPSBnZXRMYWJlbChpdGVtKTtcbiAgICB2YXIgaWNvblZpc2libGUgPSAhbWVudUl0ZW1TZWxlY3RlZEljb24gfHwgdHlwZW9mIG1lbnVJdGVtU2VsZWN0ZWRJY29uID09PSAnZnVuY3Rpb24nIHx8IHNlbGVjdGVkO1xuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMzQxNDVcbiAgICB2YXIgY29udGVudCA9IHR5cGVvZiBtZXJnZWRMYWJlbCA9PT0gJ251bWJlcicgPyBtZXJnZWRMYWJlbCA6IG1lcmdlZExhYmVsIHx8IHZhbHVlO1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzI2NzE3XG4gICAgdmFyIG9wdGlvblRpdGxlID0gaXNUaXRsZVR5cGUoY29udGVudCkgPyBjb250ZW50LnRvU3RyaW5nKCkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9wdGlvblRpdGxlID0gdGl0bGU7XG4gICAgfVxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7fSwgcGlja0F0dHJzKHBhc3NlZFByb3BzKSwge1xuICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IHNlbGVjdGVkLFxuICAgICAgY2xhc3NOYW1lOiBvcHRpb25DbGFzc05hbWUsXG4gICAgICB0aXRsZTogb3B0aW9uVGl0bGUsXG4gICAgICBvbk1vdXNlTW92ZTogZnVuY3Rpb24gb25Nb3VzZU1vdmUoKSB7XG4gICAgICAgIGlmIChhY3RpdmVJbmRleCA9PT0gaXRlbUluZGV4IHx8IGRpc2FibGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNldEFjdGl2ZShpdGVtSW5kZXgpO1xuICAgICAgfSxcbiAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgICAgICBvblNlbGVjdFZhbHVlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHN0eWxlOiBzdHlsZVxuICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KG9wdGlvblByZWZpeENscywgXCItY29udGVudFwiKVxuICAgIH0sIGNvbnRlbnQpLCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQobWVudUl0ZW1TZWxlY3RlZEljb24pIHx8IHNlbGVjdGVkLCBpY29uVmlzaWJsZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmFuc0J0biwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChpdGVtUHJlZml4Q2xzLCBcIi1vcHRpb24tc3RhdGVcIiksXG4gICAgICBjdXN0b21pemVJY29uOiBtZW51SXRlbVNlbGVjdGVkSWNvbixcbiAgICAgIGN1c3RvbWl6ZUljb25Qcm9wczoge1xuICAgICAgICBpc1NlbGVjdGVkOiBzZWxlY3RlZFxuICAgICAgfVxuICAgIH0sIHNlbGVjdGVkID8gJ+KckycgOiBudWxsKSk7XG4gIH0pKTtcbn07XG52YXIgUmVmT3B0aW9uTGlzdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKE9wdGlvbkxpc3QpO1xuUmVmT3B0aW9uTGlzdC5kaXNwbGF5TmFtZSA9ICdPcHRpb25MaXN0JztcbmV4cG9ydCBkZWZhdWx0IFJlZk9wdGlvbkxpc3Q7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiaWRcIiwgXCJtb2RlXCIsIFwicHJlZml4Q2xzXCIsIFwiYmFja2ZpbGxcIiwgXCJmaWVsZE5hbWVzXCIsIFwiaW5wdXRWYWx1ZVwiLCBcInNlYXJjaFZhbHVlXCIsIFwib25TZWFyY2hcIiwgXCJhdXRvQ2xlYXJTZWFyY2hWYWx1ZVwiLCBcIm9uU2VsZWN0XCIsIFwib25EZXNlbGVjdFwiLCBcImRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aFwiLCBcImZpbHRlck9wdGlvblwiLCBcImZpbHRlclNvcnRcIiwgXCJvcHRpb25GaWx0ZXJQcm9wXCIsIFwib3B0aW9uTGFiZWxQcm9wXCIsIFwib3B0aW9uc1wiLCBcImNoaWxkcmVuXCIsIFwiZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uXCIsIFwibWVudUl0ZW1TZWxlY3RlZEljb25cIiwgXCJ2aXJ0dWFsXCIsIFwibGlzdEhlaWdodFwiLCBcImxpc3RJdGVtSGVpZ2h0XCIsIFwidmFsdWVcIiwgXCJkZWZhdWx0VmFsdWVcIiwgXCJsYWJlbEluVmFsdWVcIiwgXCJvbkNoYW5nZVwiXTtcbi8qKlxuICogVG8gbWF0Y2ggYWNjZXNzaWJpbGl0eSByZXF1aXJlbWVudCwgd2UgYWx3YXlzIHByb3ZpZGUgYW4gaW5wdXQgaW4gdGhlIGNvbXBvbmVudC5cbiAqIE90aGVyIGVsZW1lbnQgd2lsbCBub3Qgc2V0IGB0YWJJbmRleGAgdG8gYXZvaWQgYG9uQmx1cmAgc2VxdWVuY2UgcHJvYmxlbS5cbiAqIEZvciBmb2N1c2VkIHNlbGVjdCwgd2Ugc2V0IGBhcmlhLWxpdmU9XCJwb2xpdGVcImAgdG8gdXBkYXRlIHRoZSBhY2Nlc3NpYmlsaXR5IGNvbnRlbnQuXG4gKlxuICogcmVmOlxuICogLSBrZXlib2FyZDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQWNjZXNzaWJpbGl0eS9BUklBL1JvbGVzL2xpc3Rib3hfcm9sZSNLZXlib2FyZF9pbnRlcmFjdGlvbnNcbiAqXG4gKiBOZXcgYXBpOlxuICogLSBsaXN0SGVpZ2h0XG4gKiAtIGxpc3RJdGVtSGVpZ2h0XG4gKiAtIGNvbXBvbmVudFxuICpcbiAqIFJlbW92ZSBkZXByZWNhdGVkIGFwaTpcbiAqIC0gbXVsdGlwbGVcbiAqIC0gdGFnc1xuICogLSBjb21ib2JveFxuICogLSBmaXJzdEFjdGl2ZVZhbHVlXG4gKiAtIGRyb3Bkb3duTWVudVN0eWxlXG4gKiAtIG9wZW5DbGFzc05hbWUgKE5vdCBsaXN0IGluIGFwaSlcbiAqXG4gKiBVcGRhdGU6XG4gKiAtIGBiYWNrZmlsbGAgb25seSBzdXBwb3J0IGBjb21ib2JveGAgbW9kZVxuICogLSBgY29tYm9ib3hgIG1vZGUgbm90IHN1cHBvcnQgYGxhYmVsSW5WYWx1ZWAgc2luY2UgaXQncyBtZWFuaW5nbGVzc1xuICogLSBgZ2V0SW5wdXRFbGVtZW50YCBvbmx5IHN1cHBvcnQgYGNvbWJvYm94YCBtb2RlXG4gKiAtIGBvbkNoYW5nZWAgcmV0dXJuIE9wdGlvbkRhdGEgaW5zdGVhZCBvZiBSZWFjdE5vZGVcbiAqIC0gYGZpbHRlck9wdGlvbmAgYG9uQ2hhbmdlYCBgb25TZWxlY3RgIGFjY2VwdCBPcHRpb25EYXRhIGluc3RlYWQgb2YgUmVhY3ROb2RlXG4gKiAtIGBjb21ib2JveGAgbW9kZSB0cmlnZ2VyIGBvbkNoYW5nZWAgd2lsbCBnZXQgYHVuZGVmaW5lZGAgaWYgbm8gYHZhbHVlYCBtYXRjaCBpbiBPcHRpb25cbiAqIC0gYGNvbWJvYm94YCBtb2RlIG5vdCBzdXBwb3J0IGBvcHRpb25MYWJlbFByb3BgXG4gKi9cblxuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQmFzZVNlbGVjdCwgeyBpc011bHRpcGxlIH0gZnJvbSBcIi4vQmFzZVNlbGVjdFwiO1xuaW1wb3J0IHVzZUNhY2hlIGZyb20gXCIuL2hvb2tzL3VzZUNhY2hlXCI7XG5pbXBvcnQgdXNlRmlsdGVyT3B0aW9ucyBmcm9tIFwiLi9ob29rcy91c2VGaWx0ZXJPcHRpb25zXCI7XG5pbXBvcnQgdXNlSWQgZnJvbSBcIi4vaG9va3MvdXNlSWRcIjtcbmltcG9ydCB1c2VPcHRpb25zIGZyb20gXCIuL2hvb2tzL3VzZU9wdGlvbnNcIjtcbmltcG9ydCB1c2VSZWZGdW5jIGZyb20gXCIuL2hvb2tzL3VzZVJlZkZ1bmNcIjtcbmltcG9ydCBPcHRHcm91cCBmcm9tIFwiLi9PcHRHcm91cFwiO1xuaW1wb3J0IE9wdGlvbiBmcm9tIFwiLi9PcHRpb25cIjtcbmltcG9ydCBPcHRpb25MaXN0IGZyb20gXCIuL09wdGlvbkxpc3RcIjtcbmltcG9ydCBTZWxlY3RDb250ZXh0IGZyb20gXCIuL1NlbGVjdENvbnRleHRcIjtcbmltcG9ydCB7IGhhc1ZhbHVlLCB0b0FycmF5IH0gZnJvbSBcIi4vdXRpbHMvY29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgZmlsbEZpZWxkTmFtZXMsIGZsYXR0ZW5PcHRpb25zLCBpbmplY3RQcm9wc1dpdGhPcHRpb24gfSBmcm9tIFwiLi91dGlscy92YWx1ZVV0aWxcIjtcbmltcG9ydCB3YXJuaW5nUHJvcHMsIHsgd2FybmluZ051bGxPcHRpb25zIH0gZnJvbSBcIi4vdXRpbHMvd2FybmluZ1Byb3BzVXRpbFwiO1xudmFyIE9NSVRfRE9NX1BST1BTID0gWydpbnB1dFZhbHVlJ107XG5mdW5jdGlvbiBpc1Jhd1ZhbHVlKHZhbHVlKSB7XG4gIHJldHVybiAhdmFsdWUgfHwgX3R5cGVvZih2YWx1ZSkgIT09ICdvYmplY3QnO1xufVxudmFyIFNlbGVjdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBpZCA9IHByb3BzLmlkLFxuICAgIG1vZGUgPSBwcm9wcy5tb2RlLFxuICAgIF9wcm9wcyRwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX3Byb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLXNlbGVjdCcgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgIGJhY2tmaWxsID0gcHJvcHMuYmFja2ZpbGwsXG4gICAgZmllbGROYW1lcyA9IHByb3BzLmZpZWxkTmFtZXMsXG4gICAgaW5wdXRWYWx1ZSA9IHByb3BzLmlucHV0VmFsdWUsXG4gICAgc2VhcmNoVmFsdWUgPSBwcm9wcy5zZWFyY2hWYWx1ZSxcbiAgICBvblNlYXJjaCA9IHByb3BzLm9uU2VhcmNoLFxuICAgIF9wcm9wcyRhdXRvQ2xlYXJTZWFyYyA9IHByb3BzLmF1dG9DbGVhclNlYXJjaFZhbHVlLFxuICAgIGF1dG9DbGVhclNlYXJjaFZhbHVlID0gX3Byb3BzJGF1dG9DbGVhclNlYXJjID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGF1dG9DbGVhclNlYXJjLFxuICAgIG9uU2VsZWN0ID0gcHJvcHMub25TZWxlY3QsXG4gICAgb25EZXNlbGVjdCA9IHByb3BzLm9uRGVzZWxlY3QsXG4gICAgX3Byb3BzJGRyb3Bkb3duTWF0Y2hTID0gcHJvcHMuZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoLFxuICAgIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCA9IF9wcm9wcyRkcm9wZG93bk1hdGNoUyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRkcm9wZG93bk1hdGNoUyxcbiAgICBmaWx0ZXJPcHRpb24gPSBwcm9wcy5maWx0ZXJPcHRpb24sXG4gICAgZmlsdGVyU29ydCA9IHByb3BzLmZpbHRlclNvcnQsXG4gICAgb3B0aW9uRmlsdGVyUHJvcCA9IHByb3BzLm9wdGlvbkZpbHRlclByb3AsXG4gICAgb3B0aW9uTGFiZWxQcm9wID0gcHJvcHMub3B0aW9uTGFiZWxQcm9wLFxuICAgIG9wdGlvbnMgPSBwcm9wcy5vcHRpb25zLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uID0gcHJvcHMuZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uLFxuICAgIG1lbnVJdGVtU2VsZWN0ZWRJY29uID0gcHJvcHMubWVudUl0ZW1TZWxlY3RlZEljb24sXG4gICAgdmlydHVhbCA9IHByb3BzLnZpcnR1YWwsXG4gICAgX3Byb3BzJGxpc3RIZWlnaHQgPSBwcm9wcy5saXN0SGVpZ2h0LFxuICAgIGxpc3RIZWlnaHQgPSBfcHJvcHMkbGlzdEhlaWdodCA9PT0gdm9pZCAwID8gMjAwIDogX3Byb3BzJGxpc3RIZWlnaHQsXG4gICAgX3Byb3BzJGxpc3RJdGVtSGVpZ2h0ID0gcHJvcHMubGlzdEl0ZW1IZWlnaHQsXG4gICAgbGlzdEl0ZW1IZWlnaHQgPSBfcHJvcHMkbGlzdEl0ZW1IZWlnaHQgPT09IHZvaWQgMCA/IDIwIDogX3Byb3BzJGxpc3RJdGVtSGVpZ2h0LFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgIGxhYmVsSW5WYWx1ZSA9IHByb3BzLmxhYmVsSW5WYWx1ZSxcbiAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIG1lcmdlZElkID0gdXNlSWQoaWQpO1xuICB2YXIgbXVsdGlwbGUgPSBpc011bHRpcGxlKG1vZGUpO1xuICB2YXIgY2hpbGRyZW5Bc0RhdGEgPSAhISghb3B0aW9ucyAmJiBjaGlsZHJlbik7XG4gIHZhciBtZXJnZWRGaWx0ZXJPcHRpb24gPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZmlsdGVyT3B0aW9uID09PSB1bmRlZmluZWQgJiYgbW9kZSA9PT0gJ2NvbWJvYm94Jykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZmlsdGVyT3B0aW9uO1xuICB9LCBbZmlsdGVyT3B0aW9uLCBtb2RlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBGaWVsZE5hbWVzID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG1lcmdlZEZpZWxkTmFtZXMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmlsbEZpZWxkTmFtZXMoZmllbGROYW1lcywgY2hpbGRyZW5Bc0RhdGEpO1xuICB9LCAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHMgKi9cbiAgW1xuICAvLyBXZSBzdHJpbmdpZnkgZmllbGROYW1lcyB0byBhdm9pZCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzLlxuICBKU09OLnN0cmluZ2lmeShmaWVsZE5hbWVzKSwgY2hpbGRyZW5Bc0RhdGFdXG4gIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzICovKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2VhcmNoID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gdXNlTWVyZ2VkU3RhdGUoJycsIHtcbiAgICAgIHZhbHVlOiBzZWFyY2hWYWx1ZSAhPT0gdW5kZWZpbmVkID8gc2VhcmNoVmFsdWUgOiBpbnB1dFZhbHVlLFxuICAgICAgcG9zdFN0YXRlOiBmdW5jdGlvbiBwb3N0U3RhdGUoc2VhcmNoKSB7XG4gICAgICAgIHJldHVybiBzZWFyY2ggfHwgJyc7XG4gICAgICB9XG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgbWVyZ2VkU2VhcmNoVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgIHNldFNlYXJjaFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlsxXTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gT3B0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgcGFyc2VkT3B0aW9ucyA9IHVzZU9wdGlvbnMob3B0aW9ucywgY2hpbGRyZW4sIG1lcmdlZEZpZWxkTmFtZXMsIG9wdGlvbkZpbHRlclByb3AsIG9wdGlvbkxhYmVsUHJvcCk7XG4gIHZhciB2YWx1ZU9wdGlvbnMgPSBwYXJzZWRPcHRpb25zLnZhbHVlT3B0aW9ucyxcbiAgICBsYWJlbE9wdGlvbnMgPSBwYXJzZWRPcHRpb25zLmxhYmVsT3B0aW9ucyxcbiAgICBtZXJnZWRPcHRpb25zID0gcGFyc2VkT3B0aW9ucy5vcHRpb25zO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gV3JhcCBWYWx1ZSA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBjb252ZXJ0MkxhYmVsVmFsdWVzID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGRyYWZ0VmFsdWVzKSB7XG4gICAgLy8gQ29udmVydCB0byBhcnJheVxuICAgIHZhciB2YWx1ZUxpc3QgPSB0b0FycmF5KGRyYWZ0VmFsdWVzKTtcblxuICAgIC8vIENvbnZlcnQgdG8gbGFiZWxJblZhbHVlIHR5cGVcbiAgICByZXR1cm4gdmFsdWVMaXN0Lm1hcChmdW5jdGlvbiAodmFsKSB7XG4gICAgICB2YXIgcmF3VmFsdWU7XG4gICAgICB2YXIgcmF3TGFiZWw7XG4gICAgICB2YXIgcmF3S2V5O1xuICAgICAgdmFyIHJhd0Rpc2FibGVkO1xuICAgICAgdmFyIHJhd1RpdGxlO1xuXG4gICAgICAvLyBGaWxsIGxhYmVsICYgdmFsdWVcbiAgICAgIGlmIChpc1Jhd1ZhbHVlKHZhbCkpIHtcbiAgICAgICAgcmF3VmFsdWUgPSB2YWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgX3ZhbCR2YWx1ZTtcbiAgICAgICAgcmF3S2V5ID0gdmFsLmtleTtcbiAgICAgICAgcmF3TGFiZWwgPSB2YWwubGFiZWw7XG4gICAgICAgIHJhd1ZhbHVlID0gKF92YWwkdmFsdWUgPSB2YWwudmFsdWUpICE9PSBudWxsICYmIF92YWwkdmFsdWUgIT09IHZvaWQgMCA/IF92YWwkdmFsdWUgOiByYXdLZXk7XG4gICAgICB9XG4gICAgICB2YXIgb3B0aW9uID0gdmFsdWVPcHRpb25zLmdldChyYXdWYWx1ZSk7XG4gICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgIHZhciBfb3B0aW9uJGtleTtcbiAgICAgICAgLy8gRmlsbCBtaXNzaW5nIHByb3BzXG4gICAgICAgIGlmIChyYXdMYWJlbCA9PT0gdW5kZWZpbmVkKSByYXdMYWJlbCA9IG9wdGlvbiA9PT0gbnVsbCB8fCBvcHRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbltvcHRpb25MYWJlbFByb3AgfHwgbWVyZ2VkRmllbGROYW1lcy5sYWJlbF07XG4gICAgICAgIGlmIChyYXdLZXkgPT09IHVuZGVmaW5lZCkgcmF3S2V5ID0gKF9vcHRpb24ka2V5ID0gb3B0aW9uID09PSBudWxsIHx8IG9wdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9uLmtleSkgIT09IG51bGwgJiYgX29wdGlvbiRrZXkgIT09IHZvaWQgMCA/IF9vcHRpb24ka2V5IDogcmF3VmFsdWU7XG4gICAgICAgIHJhd0Rpc2FibGVkID0gb3B0aW9uID09PSBudWxsIHx8IG9wdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9uLmRpc2FibGVkO1xuICAgICAgICByYXdUaXRsZSA9IG9wdGlvbiA9PT0gbnVsbCB8fCBvcHRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbi50aXRsZTtcblxuICAgICAgICAvLyBXYXJuaW5nIGlmIGxhYmVsIG5vdCBzYW1lIGFzIHByb3ZpZGVkXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFvcHRpb25MYWJlbFByb3ApIHtcbiAgICAgICAgICB2YXIgb3B0aW9uTGFiZWwgPSBvcHRpb24gPT09IG51bGwgfHwgb3B0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25bbWVyZ2VkRmllbGROYW1lcy5sYWJlbF07XG4gICAgICAgICAgaWYgKG9wdGlvbkxhYmVsICE9PSB1bmRlZmluZWQgJiYgb3B0aW9uTGFiZWwgIT09IHJhd0xhYmVsKSB7XG4gICAgICAgICAgICB3YXJuaW5nKGZhbHNlLCAnYGxhYmVsYCBvZiBgdmFsdWVgIGlzIG5vdCBzYW1lIGFzIGBsYWJlbGAgaW4gU2VsZWN0IG9wdGlvbnMuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogcmF3TGFiZWwsXG4gICAgICAgIHZhbHVlOiByYXdWYWx1ZSxcbiAgICAgICAga2V5OiByYXdLZXksXG4gICAgICAgIGRpc2FibGVkOiByYXdEaXNhYmxlZCxcbiAgICAgICAgdGl0bGU6IHJhd1RpdGxlXG4gICAgICB9O1xuICAgIH0pO1xuICB9LCBbbWVyZ2VkRmllbGROYW1lcywgb3B0aW9uTGFiZWxQcm9wLCB2YWx1ZU9wdGlvbnNdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gVmFsdWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZU1lcmdlZFN0YXRlMyA9IHVzZU1lcmdlZFN0YXRlKGRlZmF1bHRWYWx1ZSwge1xuICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZTMsIDIpLFxuICAgIGludGVybmFsVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGU0WzBdLFxuICAgIHNldEludGVybmFsVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGU0WzFdO1xuXG4gIC8vIE1lcmdlZCB2YWx1ZSB3aXRoIExhYmVsVmFsdWVUeXBlXG4gIHZhciByYXdMYWJlbGVkVmFsdWVzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF92YWx1ZXMkO1xuICAgIHZhciB2YWx1ZXMgPSBjb252ZXJ0MkxhYmVsVmFsdWVzKGludGVybmFsVmFsdWUpO1xuXG4gICAgLy8gY29tYm9ib3ggbm8gbmVlZCBzYXZlIHZhbHVlIHdoZW4gaXQncyBubyB2YWx1ZVxuICAgIGlmIChtb2RlID09PSAnY29tYm9ib3gnICYmICEoKF92YWx1ZXMkID0gdmFsdWVzWzBdKSAhPT0gbnVsbCAmJiBfdmFsdWVzJCAhPT0gdm9pZCAwICYmIF92YWx1ZXMkLnZhbHVlKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9LCBbaW50ZXJuYWxWYWx1ZSwgY29udmVydDJMYWJlbFZhbHVlcywgbW9kZV0pO1xuXG4gIC8vIEZpbGwgbGFiZWwgd2l0aCBjYWNoZSB0byBhdm9pZCBvcHRpb24gcmVtb3ZlXG4gIHZhciBfdXNlQ2FjaGUgPSB1c2VDYWNoZShyYXdMYWJlbGVkVmFsdWVzLCB2YWx1ZU9wdGlvbnMpLFxuICAgIF91c2VDYWNoZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlQ2FjaGUsIDIpLFxuICAgIG1lcmdlZFZhbHVlcyA9IF91c2VDYWNoZTJbMF0sXG4gICAgZ2V0TWl4ZWRPcHRpb24gPSBfdXNlQ2FjaGUyWzFdO1xuICB2YXIgZGlzcGxheVZhbHVlcyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIC8vIGBudWxsYCBuZWVkIHNob3cgYXMgcGxhY2Vob2xkZXIgaW5zdGVhZFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzI1MDU3XG4gICAgaWYgKCFtb2RlICYmIG1lcmdlZFZhbHVlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBmaXJzdFZhbHVlID0gbWVyZ2VkVmFsdWVzWzBdO1xuICAgICAgaWYgKGZpcnN0VmFsdWUudmFsdWUgPT09IG51bGwgJiYgKGZpcnN0VmFsdWUubGFiZWwgPT09IG51bGwgfHwgZmlyc3RWYWx1ZS5sYWJlbCA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtZXJnZWRWYWx1ZXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgX2l0ZW0kbGFiZWw7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpdGVtKSwge30sIHtcbiAgICAgICAgbGFiZWw6IChfaXRlbSRsYWJlbCA9IGl0ZW0ubGFiZWwpICE9PSBudWxsICYmIF9pdGVtJGxhYmVsICE9PSB2b2lkIDAgPyBfaXRlbSRsYWJlbCA6IGl0ZW0udmFsdWVcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LCBbbW9kZSwgbWVyZ2VkVmFsdWVzXSk7XG5cbiAgLyoqIENvbnZlcnQgYGRpc3BsYXlWYWx1ZXNgIHRvIHJhdyB2YWx1ZSB0eXBlIHNldCAqL1xuICB2YXIgcmF3VmFsdWVzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQobWVyZ2VkVmFsdWVzLm1hcChmdW5jdGlvbiAodmFsKSB7XG4gICAgICByZXR1cm4gdmFsLnZhbHVlO1xuICAgIH0pKTtcbiAgfSwgW21lcmdlZFZhbHVlc10pO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChtb2RlID09PSAnY29tYm9ib3gnKSB7XG4gICAgICB2YXIgX21lcmdlZFZhbHVlcyQ7XG4gICAgICB2YXIgc3RyVmFsdWUgPSAoX21lcmdlZFZhbHVlcyQgPSBtZXJnZWRWYWx1ZXNbMF0pID09PSBudWxsIHx8IF9tZXJnZWRWYWx1ZXMkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbWVyZ2VkVmFsdWVzJC52YWx1ZTtcbiAgICAgIHNldFNlYXJjaFZhbHVlKGhhc1ZhbHVlKHN0clZhbHVlKSA/IFN0cmluZyhzdHJWYWx1ZSkgOiAnJyk7XG4gICAgfVxuICB9LCBbbWVyZ2VkVmFsdWVzXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gRGlzcGxheSBPcHRpb24gPT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ3JlYXRlIGEgcGxhY2Vob2xkZXIgaXRlbSBpZiBub3QgZXhpc3QgaW4gYG9wdGlvbnNgXG4gIHZhciBjcmVhdGVUYWdPcHRpb24gPSB1c2VSZWZGdW5jKGZ1bmN0aW9uICh2YWwsIGxhYmVsKSB7XG4gICAgdmFyIF9yZWY7XG4gICAgdmFyIG1lcmdlZExhYmVsID0gbGFiZWwgIT09IG51bGwgJiYgbGFiZWwgIT09IHZvaWQgMCA/IGxhYmVsIDogdmFsO1xuICAgIHJldHVybiBfcmVmID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfcmVmLCBtZXJnZWRGaWVsZE5hbWVzLnZhbHVlLCB2YWwpLCBfZGVmaW5lUHJvcGVydHkoX3JlZiwgbWVyZ2VkRmllbGROYW1lcy5sYWJlbCwgbWVyZ2VkTGFiZWwpLCBfcmVmO1xuICB9KTtcblxuICAvLyBGaWxsIHRhZyBhcyBvcHRpb24gaWYgbW9kZSBpcyBgdGFnc2BcbiAgdmFyIGZpbGxlZFRhZ09wdGlvbnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAobW9kZSAhPT0gJ3RhZ3MnKSB7XG4gICAgICByZXR1cm4gbWVyZ2VkT3B0aW9ucztcbiAgICB9XG5cbiAgICAvLyA+Pj4gVGFnIG1vZGVcbiAgICB2YXIgY2xvbmVPcHRpb25zID0gX3RvQ29uc3VtYWJsZUFycmF5KG1lcmdlZE9wdGlvbnMpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdmFsdWUgZXhpc3QgaW4gb3B0aW9ucyAoaW5jbHVkZSBuZXcgcGF0Y2ggaXRlbSlcbiAgICB2YXIgZXhpc3RPcHRpb25zID0gZnVuY3Rpb24gZXhpc3RPcHRpb25zKHZhbCkge1xuICAgICAgcmV0dXJuIHZhbHVlT3B0aW9ucy5oYXModmFsKTtcbiAgICB9O1xuXG4gICAgLy8gRmlsbCBjdXJyZW50IHZhbHVlIGFzIG9wdGlvblxuICAgIF90b0NvbnN1bWFibGVBcnJheShtZXJnZWRWYWx1ZXMpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhLnZhbHVlIDwgYi52YWx1ZSA/IC0xIDogMTtcbiAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgdmFsID0gaXRlbS52YWx1ZTtcbiAgICAgIGlmICghZXhpc3RPcHRpb25zKHZhbCkpIHtcbiAgICAgICAgY2xvbmVPcHRpb25zLnB1c2goY3JlYXRlVGFnT3B0aW9uKHZhbCwgaXRlbS5sYWJlbCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZU9wdGlvbnM7XG4gIH0sIFtjcmVhdGVUYWdPcHRpb24sIG1lcmdlZE9wdGlvbnMsIHZhbHVlT3B0aW9ucywgbWVyZ2VkVmFsdWVzLCBtb2RlXSk7XG4gIHZhciBmaWx0ZXJlZE9wdGlvbnMgPSB1c2VGaWx0ZXJPcHRpb25zKGZpbGxlZFRhZ09wdGlvbnMsIG1lcmdlZEZpZWxkTmFtZXMsIG1lcmdlZFNlYXJjaFZhbHVlLCBtZXJnZWRGaWx0ZXJPcHRpb24sIG9wdGlvbkZpbHRlclByb3ApO1xuXG4gIC8vIEZpbGwgb3B0aW9ucyB3aXRoIHNlYXJjaCB2YWx1ZSBpZiBuZWVkZWRcbiAgdmFyIGZpbGxlZFNlYXJjaE9wdGlvbnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAobW9kZSAhPT0gJ3RhZ3MnIHx8ICFtZXJnZWRTZWFyY2hWYWx1ZSB8fCBmaWx0ZXJlZE9wdGlvbnMuc29tZShmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW1bb3B0aW9uRmlsdGVyUHJvcCB8fCAndmFsdWUnXSA9PT0gbWVyZ2VkU2VhcmNoVmFsdWU7XG4gICAgfSkpIHtcbiAgICAgIHJldHVybiBmaWx0ZXJlZE9wdGlvbnM7XG4gICAgfVxuXG4gICAgLy8gRmlsbCBzZWFyY2ggdmFsdWUgYXMgb3B0aW9uXG4gICAgcmV0dXJuIFtjcmVhdGVUYWdPcHRpb24obWVyZ2VkU2VhcmNoVmFsdWUpXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGZpbHRlcmVkT3B0aW9ucykpO1xuICB9LCBbY3JlYXRlVGFnT3B0aW9uLCBvcHRpb25GaWx0ZXJQcm9wLCBtb2RlLCBmaWx0ZXJlZE9wdGlvbnMsIG1lcmdlZFNlYXJjaFZhbHVlXSk7XG4gIHZhciBvcmRlcmVkRmlsdGVyZWRPcHRpb25zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFmaWx0ZXJTb3J0KSB7XG4gICAgICByZXR1cm4gZmlsbGVkU2VhcmNoT3B0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIF90b0NvbnN1bWFibGVBcnJheShmaWxsZWRTZWFyY2hPcHRpb25zKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZmlsdGVyU29ydChhLCBiKTtcbiAgICB9KTtcbiAgfSwgW2ZpbGxlZFNlYXJjaE9wdGlvbnMsIGZpbHRlclNvcnRdKTtcbiAgdmFyIGRpc3BsYXlPcHRpb25zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZsYXR0ZW5PcHRpb25zKG9yZGVyZWRGaWx0ZXJlZE9wdGlvbnMsIHtcbiAgICAgIGZpZWxkTmFtZXM6IG1lcmdlZEZpZWxkTmFtZXMsXG4gICAgICBjaGlsZHJlbkFzRGF0YTogY2hpbGRyZW5Bc0RhdGFcbiAgICB9KTtcbiAgfSwgW29yZGVyZWRGaWx0ZXJlZE9wdGlvbnMsIG1lcmdlZEZpZWxkTmFtZXMsIGNoaWxkcmVuQXNEYXRhXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IENoYW5nZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHRyaWdnZXJDaGFuZ2UgPSBmdW5jdGlvbiB0cmlnZ2VyQ2hhbmdlKHZhbHVlcykge1xuICAgIHZhciBsYWJlbGVkVmFsdWVzID0gY29udmVydDJMYWJlbFZhbHVlcyh2YWx1ZXMpO1xuICAgIHNldEludGVybmFsVmFsdWUobGFiZWxlZFZhbHVlcyk7XG4gICAgaWYgKG9uQ2hhbmdlICYmIChcbiAgICAvLyBUcmlnZ2VyIGV2ZW50IG9ubHkgd2hlbiB2YWx1ZSBjaGFuZ2VkXG4gICAgbGFiZWxlZFZhbHVlcy5sZW5ndGggIT09IG1lcmdlZFZhbHVlcy5sZW5ndGggfHwgbGFiZWxlZFZhbHVlcy5zb21lKGZ1bmN0aW9uIChuZXdWYWwsIGluZGV4KSB7XG4gICAgICB2YXIgX21lcmdlZFZhbHVlcyRpbmRleDtcbiAgICAgIHJldHVybiAoKF9tZXJnZWRWYWx1ZXMkaW5kZXggPSBtZXJnZWRWYWx1ZXNbaW5kZXhdKSA9PT0gbnVsbCB8fCBfbWVyZ2VkVmFsdWVzJGluZGV4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbWVyZ2VkVmFsdWVzJGluZGV4LnZhbHVlKSAhPT0gKG5ld1ZhbCA9PT0gbnVsbCB8fCBuZXdWYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5ld1ZhbC52YWx1ZSk7XG4gICAgfSkpKSB7XG4gICAgICB2YXIgcmV0dXJuVmFsdWVzID0gbGFiZWxJblZhbHVlID8gbGFiZWxlZFZhbHVlcyA6IGxhYmVsZWRWYWx1ZXMubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHJldHVybiB2LnZhbHVlO1xuICAgICAgfSk7XG4gICAgICB2YXIgcmV0dXJuT3B0aW9ucyA9IGxhYmVsZWRWYWx1ZXMubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHJldHVybiBpbmplY3RQcm9wc1dpdGhPcHRpb24oZ2V0TWl4ZWRPcHRpb24odi52YWx1ZSkpO1xuICAgICAgfSk7XG4gICAgICBvbkNoYW5nZShcbiAgICAgIC8vIFZhbHVlXG4gICAgICBtdWx0aXBsZSA/IHJldHVyblZhbHVlcyA6IHJldHVyblZhbHVlc1swXSxcbiAgICAgIC8vIE9wdGlvblxuICAgICAgbXVsdGlwbGUgPyByZXR1cm5PcHRpb25zIDogcmV0dXJuT3B0aW9uc1swXSk7XG4gICAgfVxuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IEFjY2Vzc2liaWxpdHkgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBhY3RpdmVWYWx1ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0QWN0aXZlVmFsdWUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKDApLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICBhY2Nlc3NpYmlsaXR5SW5kZXggPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldEFjY2Vzc2liaWxpdHlJbmRleCA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG4gIHZhciBtZXJnZWREZWZhdWx0QWN0aXZlRmlyc3RPcHRpb24gPSBkZWZhdWx0QWN0aXZlRmlyc3RPcHRpb24gIT09IHVuZGVmaW5lZCA/IGRlZmF1bHRBY3RpdmVGaXJzdE9wdGlvbiA6IG1vZGUgIT09ICdjb21ib2JveCc7XG4gIHZhciBvbkFjdGl2ZVZhbHVlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGFjdGl2ZSwgaW5kZXgpIHtcbiAgICB2YXIgX3JlZjIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9LFxuICAgICAgX3JlZjIkc291cmNlID0gX3JlZjIuc291cmNlLFxuICAgICAgc291cmNlID0gX3JlZjIkc291cmNlID09PSB2b2lkIDAgPyAna2V5Ym9hcmQnIDogX3JlZjIkc291cmNlO1xuICAgIHNldEFjY2Vzc2liaWxpdHlJbmRleChpbmRleCk7XG4gICAgaWYgKGJhY2tmaWxsICYmIG1vZGUgPT09ICdjb21ib2JveCcgJiYgYWN0aXZlICE9PSBudWxsICYmIHNvdXJjZSA9PT0gJ2tleWJvYXJkJykge1xuICAgICAgc2V0QWN0aXZlVmFsdWUoU3RyaW5nKGFjdGl2ZSkpO1xuICAgIH1cbiAgfSwgW2JhY2tmaWxsLCBtb2RlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBPcHRpb25MaXN0ID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHRyaWdnZXJTZWxlY3QgPSBmdW5jdGlvbiB0cmlnZ2VyU2VsZWN0KHZhbCwgc2VsZWN0ZWQsIHR5cGUpIHtcbiAgICB2YXIgZ2V0U2VsZWN0RW50ID0gZnVuY3Rpb24gZ2V0U2VsZWN0RW50KCkge1xuICAgICAgdmFyIF9vcHRpb24ka2V5MjtcbiAgICAgIHZhciBvcHRpb24gPSBnZXRNaXhlZE9wdGlvbih2YWwpO1xuICAgICAgcmV0dXJuIFtsYWJlbEluVmFsdWUgPyB7XG4gICAgICAgIGxhYmVsOiBvcHRpb24gPT09IG51bGwgfHwgb3B0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25bbWVyZ2VkRmllbGROYW1lcy5sYWJlbF0sXG4gICAgICAgIHZhbHVlOiB2YWwsXG4gICAgICAgIGtleTogKF9vcHRpb24ka2V5MiA9IG9wdGlvbiA9PT0gbnVsbCB8fCBvcHRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbi5rZXkpICE9PSBudWxsICYmIF9vcHRpb24ka2V5MiAhPT0gdm9pZCAwID8gX29wdGlvbiRrZXkyIDogdmFsXG4gICAgICB9IDogdmFsLCBpbmplY3RQcm9wc1dpdGhPcHRpb24ob3B0aW9uKV07XG4gICAgfTtcbiAgICBpZiAoc2VsZWN0ZWQgJiYgb25TZWxlY3QpIHtcbiAgICAgIHZhciBfZ2V0U2VsZWN0RW50ID0gZ2V0U2VsZWN0RW50KCksXG4gICAgICAgIF9nZXRTZWxlY3RFbnQyID0gX3NsaWNlZFRvQXJyYXkoX2dldFNlbGVjdEVudCwgMiksXG4gICAgICAgIHdyYXBwZWRWYWx1ZSA9IF9nZXRTZWxlY3RFbnQyWzBdLFxuICAgICAgICBfb3B0aW9uID0gX2dldFNlbGVjdEVudDJbMV07XG4gICAgICBvblNlbGVjdCh3cmFwcGVkVmFsdWUsIF9vcHRpb24pO1xuICAgIH0gZWxzZSBpZiAoIXNlbGVjdGVkICYmIG9uRGVzZWxlY3QgJiYgdHlwZSAhPT0gJ2NsZWFyJykge1xuICAgICAgdmFyIF9nZXRTZWxlY3RFbnQzID0gZ2V0U2VsZWN0RW50KCksXG4gICAgICAgIF9nZXRTZWxlY3RFbnQ0ID0gX3NsaWNlZFRvQXJyYXkoX2dldFNlbGVjdEVudDMsIDIpLFxuICAgICAgICBfd3JhcHBlZFZhbHVlID0gX2dldFNlbGVjdEVudDRbMF0sXG4gICAgICAgIF9vcHRpb24yID0gX2dldFNlbGVjdEVudDRbMV07XG4gICAgICBvbkRlc2VsZWN0KF93cmFwcGVkVmFsdWUsIF9vcHRpb24yKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gVXNlZCBmb3IgT3B0aW9uTGlzdCBzZWxlY3Rpb25cbiAgdmFyIG9uSW50ZXJuYWxTZWxlY3QgPSB1c2VSZWZGdW5jKGZ1bmN0aW9uICh2YWwsIGluZm8pIHtcbiAgICB2YXIgY2xvbmVWYWx1ZXM7XG5cbiAgICAvLyBTaW5nbGUgbW9kZSBhbHdheXMgdHJpZ2dlciBzZWxlY3Qgb25seSB3aXRoIG9wdGlvbiBsaXN0XG4gICAgdmFyIG1lcmdlZFNlbGVjdCA9IG11bHRpcGxlID8gaW5mby5zZWxlY3RlZCA6IHRydWU7XG4gICAgaWYgKG1lcmdlZFNlbGVjdCkge1xuICAgICAgY2xvbmVWYWx1ZXMgPSBtdWx0aXBsZSA/IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkobWVyZ2VkVmFsdWVzKSwgW3ZhbF0pIDogW3ZhbF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNsb25lVmFsdWVzID0gbWVyZ2VkVmFsdWVzLmZpbHRlcihmdW5jdGlvbiAodikge1xuICAgICAgICByZXR1cm4gdi52YWx1ZSAhPT0gdmFsO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRyaWdnZXJDaGFuZ2UoY2xvbmVWYWx1ZXMpO1xuICAgIHRyaWdnZXJTZWxlY3QodmFsLCBtZXJnZWRTZWxlY3QpO1xuXG4gICAgLy8gQ2xlYW4gc2VhcmNoIHZhbHVlIGlmIHNpbmdsZSBvciBjb25maWd1cmVkXG4gICAgaWYgKG1vZGUgPT09ICdjb21ib2JveCcpIHtcbiAgICAgIC8vIHNldFNlYXJjaFZhbHVlKFN0cmluZyh2YWwpKTtcbiAgICAgIHNldEFjdGl2ZVZhbHVlKCcnKTtcbiAgICB9IGVsc2UgaWYgKCFpc011bHRpcGxlIHx8IGF1dG9DbGVhclNlYXJjaFZhbHVlKSB7XG4gICAgICBzZXRTZWFyY2hWYWx1ZSgnJyk7XG4gICAgICBzZXRBY3RpdmVWYWx1ZSgnJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBEaXNwbGF5IENoYW5nZSA9PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBCYXNlU2VsZWN0IGRpc3BsYXkgdmFsdWVzIGNoYW5nZVxuICB2YXIgb25EaXNwbGF5VmFsdWVzQ2hhbmdlID0gZnVuY3Rpb24gb25EaXNwbGF5VmFsdWVzQ2hhbmdlKG5leHRWYWx1ZXMsIGluZm8pIHtcbiAgICB0cmlnZ2VyQ2hhbmdlKG5leHRWYWx1ZXMpO1xuICAgIHZhciB0eXBlID0gaW5mby50eXBlLFxuICAgICAgdmFsdWVzID0gaW5mby52YWx1ZXM7XG4gICAgaWYgKHR5cGUgPT09ICdyZW1vdmUnIHx8IHR5cGUgPT09ICdjbGVhcicpIHtcbiAgICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHRyaWdnZXJTZWxlY3QoaXRlbS52YWx1ZSwgZmFsc2UsIHR5cGUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBTZWFyY2ggPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvbkludGVybmFsU2VhcmNoID0gZnVuY3Rpb24gb25JbnRlcm5hbFNlYXJjaChzZWFyY2hUZXh0LCBpbmZvKSB7XG4gICAgc2V0U2VhcmNoVmFsdWUoc2VhcmNoVGV4dCk7XG4gICAgc2V0QWN0aXZlVmFsdWUobnVsbCk7XG5cbiAgICAvLyBbU3VibWl0XSBUYWcgbW9kZSBzaG91bGQgZmx1c2ggaW5wdXRcbiAgICBpZiAoaW5mby5zb3VyY2UgPT09ICdzdWJtaXQnKSB7XG4gICAgICB2YXIgZm9ybWF0dGVkID0gKHNlYXJjaFRleHQgfHwgJycpLnRyaW0oKTtcbiAgICAgIC8vIHByZXZlbnQgZW1wdHkgdGFncyBmcm9tIGFwcGVhcmluZyB3aGVuIHlvdSBjbGljayB0aGUgRW50ZXIgYnV0dG9uXG4gICAgICBpZiAoZm9ybWF0dGVkKSB7XG4gICAgICAgIHZhciBuZXdSYXdWYWx1ZXMgPSBBcnJheS5mcm9tKG5ldyBTZXQoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShyYXdWYWx1ZXMpLCBbZm9ybWF0dGVkXSkpKTtcbiAgICAgICAgdHJpZ2dlckNoYW5nZShuZXdSYXdWYWx1ZXMpO1xuICAgICAgICB0cmlnZ2VyU2VsZWN0KGZvcm1hdHRlZCwgdHJ1ZSk7XG4gICAgICAgIHNldFNlYXJjaFZhbHVlKCcnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGluZm8uc291cmNlICE9PSAnYmx1cicpIHtcbiAgICAgIGlmIChtb2RlID09PSAnY29tYm9ib3gnKSB7XG4gICAgICAgIHRyaWdnZXJDaGFuZ2Uoc2VhcmNoVGV4dCk7XG4gICAgICB9XG4gICAgICBvblNlYXJjaCA9PT0gbnVsbCB8fCBvblNlYXJjaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25TZWFyY2goc2VhcmNoVGV4dCk7XG4gICAgfVxuICB9O1xuICB2YXIgb25JbnRlcm5hbFNlYXJjaFNwbGl0ID0gZnVuY3Rpb24gb25JbnRlcm5hbFNlYXJjaFNwbGl0KHdvcmRzKSB7XG4gICAgdmFyIHBhdGNoVmFsdWVzID0gd29yZHM7XG4gICAgaWYgKG1vZGUgIT09ICd0YWdzJykge1xuICAgICAgcGF0Y2hWYWx1ZXMgPSB3b3Jkcy5tYXAoZnVuY3Rpb24gKHdvcmQpIHtcbiAgICAgICAgdmFyIG9wdCA9IGxhYmVsT3B0aW9ucy5nZXQod29yZCk7XG4gICAgICAgIHJldHVybiBvcHQgPT09IG51bGwgfHwgb3B0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHQudmFsdWU7XG4gICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gdmFsICE9PSB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdmFyIG5ld1Jhd1ZhbHVlcyA9IEFycmF5LmZyb20obmV3IFNldChbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHJhd1ZhbHVlcyksIF90b0NvbnN1bWFibGVBcnJheShwYXRjaFZhbHVlcykpKSk7XG4gICAgdHJpZ2dlckNoYW5nZShuZXdSYXdWYWx1ZXMpO1xuICAgIG5ld1Jhd1ZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uIChuZXdSYXdWYWx1ZSkge1xuICAgICAgdHJpZ2dlclNlbGVjdChuZXdSYXdWYWx1ZSwgdHJ1ZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gQ29udGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHNlbGVjdENvbnRleHQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVhbFZpcnR1YWwgPSB2aXJ0dWFsICE9PSBmYWxzZSAmJiBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGggIT09IGZhbHNlO1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHBhcnNlZE9wdGlvbnMpLCB7fSwge1xuICAgICAgZmxhdHRlbk9wdGlvbnM6IGRpc3BsYXlPcHRpb25zLFxuICAgICAgb25BY3RpdmVWYWx1ZTogb25BY3RpdmVWYWx1ZSxcbiAgICAgIGRlZmF1bHRBY3RpdmVGaXJzdE9wdGlvbjogbWVyZ2VkRGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uLFxuICAgICAgb25TZWxlY3Q6IG9uSW50ZXJuYWxTZWxlY3QsXG4gICAgICBtZW51SXRlbVNlbGVjdGVkSWNvbjogbWVudUl0ZW1TZWxlY3RlZEljb24sXG4gICAgICByYXdWYWx1ZXM6IHJhd1ZhbHVlcyxcbiAgICAgIGZpZWxkTmFtZXM6IG1lcmdlZEZpZWxkTmFtZXMsXG4gICAgICB2aXJ0dWFsOiByZWFsVmlydHVhbCxcbiAgICAgIGxpc3RIZWlnaHQ6IGxpc3RIZWlnaHQsXG4gICAgICBsaXN0SXRlbUhlaWdodDogbGlzdEl0ZW1IZWlnaHQsXG4gICAgICBjaGlsZHJlbkFzRGF0YTogY2hpbGRyZW5Bc0RhdGFcbiAgICB9KTtcbiAgfSwgW3BhcnNlZE9wdGlvbnMsIGRpc3BsYXlPcHRpb25zLCBvbkFjdGl2ZVZhbHVlLCBtZXJnZWREZWZhdWx0QWN0aXZlRmlyc3RPcHRpb24sIG9uSW50ZXJuYWxTZWxlY3QsIG1lbnVJdGVtU2VsZWN0ZWRJY29uLCByYXdWYWx1ZXMsIG1lcmdlZEZpZWxkTmFtZXMsIHZpcnR1YWwsIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCwgbGlzdEhlaWdodCwgbGlzdEl0ZW1IZWlnaHQsIGNoaWxkcmVuQXNEYXRhXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gV2FybmluZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB3YXJuaW5nUHJvcHMocHJvcHMpO1xuICAgIHdhcm5pbmdOdWxsT3B0aW9ucyhtZXJnZWRPcHRpb25zLCBtZXJnZWRGaWVsZE5hbWVzKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09ICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXIgICAgICAgICAgICAgICAgICAgICAgICAgID09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHNlbGVjdENvbnRleHRcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQmFzZVNlbGVjdCwgX2V4dGVuZHMoe30sIHJlc3RQcm9wcywge1xuICAgIC8vID4+PiBNSVNDXG4gICAgaWQ6IG1lcmdlZElkLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIHJlZjogcmVmLFxuICAgIG9taXREb21Qcm9wczogT01JVF9ET01fUFJPUFMsXG4gICAgbW9kZTogbW9kZVxuICAgIC8vID4+PiBWYWx1ZXNcbiAgICAsXG4gICAgZGlzcGxheVZhbHVlczogZGlzcGxheVZhbHVlcyxcbiAgICBvbkRpc3BsYXlWYWx1ZXNDaGFuZ2U6IG9uRGlzcGxheVZhbHVlc0NoYW5nZVxuICAgIC8vID4+PiBTZWFyY2hcbiAgICAsXG4gICAgc2VhcmNoVmFsdWU6IG1lcmdlZFNlYXJjaFZhbHVlLFxuICAgIG9uU2VhcmNoOiBvbkludGVybmFsU2VhcmNoLFxuICAgIGF1dG9DbGVhclNlYXJjaFZhbHVlOiBhdXRvQ2xlYXJTZWFyY2hWYWx1ZSxcbiAgICBvblNlYXJjaFNwbGl0OiBvbkludGVybmFsU2VhcmNoU3BsaXQsXG4gICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoOiBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGhcbiAgICAvLyA+Pj4gT3B0aW9uTGlzdFxuICAgICxcbiAgICBPcHRpb25MaXN0OiBPcHRpb25MaXN0LFxuICAgIGVtcHR5T3B0aW9uczogIWRpc3BsYXlPcHRpb25zLmxlbmd0aFxuICAgIC8vID4+PiBBY2Nlc3NpYmlsaXR5XG4gICAgLFxuICAgIGFjdGl2ZVZhbHVlOiBhY3RpdmVWYWx1ZSxcbiAgICBhY3RpdmVEZXNjZW5kYW50SWQ6IFwiXCIuY29uY2F0KG1lcmdlZElkLCBcIl9saXN0X1wiKS5jb25jYXQoYWNjZXNzaWJpbGl0eUluZGV4KVxuICB9KSkpO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBTZWxlY3QuZGlzcGxheU5hbWUgPSAnU2VsZWN0Jztcbn1cbnZhciBUeXBlZFNlbGVjdCA9IFNlbGVjdDtcblR5cGVkU2VsZWN0Lk9wdGlvbiA9IE9wdGlvbjtcblR5cGVkU2VsZWN0Lk9wdEdyb3VwID0gT3B0R3JvdXA7XG5leHBvcnQgZGVmYXVsdCBUeXBlZFNlbGVjdDsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbnZhciBFbXB0eSA9IGZ1bmN0aW9uIEVtcHR5KCkge1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscztcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnZW1wdHktaW1nLWRlZmF1bHQnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICBjbGFzc05hbWU6IHByZWZpeENscyxcbiAgICB3aWR0aDogXCIxODRcIixcbiAgICBoZWlnaHQ6IFwiMTUyXCIsXG4gICAgdmlld0JveDogXCIwIDAgMTg0IDE1MlwiLFxuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHtcbiAgICBmaWxsOiBcIm5vbmVcIixcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHtcbiAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlKDI0IDMxLjY3KVwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZWxsaXBzZVwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWVsbGlwc2VcIiksXG4gICAgY3g6IFwiNjcuNzk3XCIsXG4gICAgY3k6IFwiMTA2Ljg5XCIsXG4gICAgcng6IFwiNjcuNzk3XCIsXG4gICAgcnk6IFwiMTIuNjY4XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBhdGgtMVwiKSxcbiAgICBkOiBcIk0xMjIuMDM0IDY5LjY3NEw5OC4xMDkgNDAuMjI5Yy0xLjE0OC0xLjM4Ni0yLjgyNi0yLjIyNS00LjU5My0yLjIyNWgtNTEuNDRjLTEuNzY2IDAtMy40NDQuODM5LTQuNTkyIDIuMjI1TDEzLjU2IDY5LjY3NHYxNS4zODNoMTA4LjQ3NVY2OS42NzR6XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBhdGgtMlwiKSxcbiAgICBkOiBcIk0xMDEuNTM3IDg2LjIxNEw4MC42MyA2MS4xMDJjLTEuMDAxLTEuMjA3LTIuNTA3LTEuODY3LTQuMDQ4LTEuODY3SDMxLjcyNGMtMS41NCAwLTMuMDQ3LjY2LTQuMDQ4IDEuODY3TDYuNzY5IDg2LjIxNHYxMy43OTJoOTQuNzY4Vjg2LjIxNHpcIixcbiAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlKDEzLjU2KVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wYXRoLTNcIiksXG4gICAgZDogXCJNMzMuODMgMGg2Ny45MzNhNCA0IDAgMCAxIDQgNHY5My4zNDRhNCA0IDAgMCAxLTQgNEgzMy44M2E0IDQgMCAwIDEtNC00VjRhNCA0IDAgMCAxIDQtNHpcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGF0aC00XCIpLFxuICAgIGQ6IFwiTTQyLjY3OCA5Ljk1M2g1MC4yMzdhMiAyIDAgMCAxIDIgMlYzNi45MWEyIDIgMCAwIDEtMiAySDQyLjY3OGEyIDIgMCAwIDEtMi0yVjExLjk1M2EyIDIgMCAwIDEgMi0yek00Mi45NCA0OS43NjdoNDkuNzEzYTIuMjYyIDIuMjYyIDAgMSAxIDAgNC41MjRINDIuOTRhMi4yNjIgMi4yNjIgMCAwIDEgMC00LjUyNHpNNDIuOTQgNjEuNTNoNDkuNzEzYTIuMjYyIDIuMjYyIDAgMSAxIDAgNC41MjVINDIuOTRhMi4yNjIgMi4yNjIgMCAwIDEgMC00LjUyNXpNMTIxLjgxMyAxMDUuMDMyYy0uNzc1IDMuMDcxLTMuNDk3IDUuMzYtNi43MzUgNS4zNkgyMC41MTVjLTMuMjM4IDAtNS45Ni0yLjI5LTYuNzM0LTUuMzZhNy4zMDkgNy4zMDkgMCAwIDEtLjIyMi0xLjc5VjY5LjY3NWgyNi4zMThjMi45MDcgMCA1LjI1IDIuNDQ4IDUuMjUgNS40MnYuMDRjMCAyLjk3MSAyLjM3IDUuMzcgNS4yNzcgNS4zN2gzNC43ODVjMi45MDcgMCA1LjI3Ny0yLjQyMSA1LjI3Ny01LjM5M1Y3NS4xYzAtMi45NzIgMi4zNDMtNS40MjYgNS4yNS01LjQyNmgyNi4zMTh2MzMuNTY5YzAgLjYxNy0uMDc3IDEuMjE2LS4yMjEgMS43ODl6XCJcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wYXRoLTVcIiksXG4gICAgZDogXCJNMTQ5LjEyMSAzMy4yOTJsLTYuODMgMi42NWExIDEgMCAwIDEtMS4zMTctMS4yM2wxLjkzNy02LjIwN2MtMi41ODktMi45NDQtNC4xMDktNi41MzQtNC4xMDktMTAuNDA4QzEzOC44MDIgOC4xMDIgMTQ4LjkyIDAgMTYxLjQwMiAwIDE3My44ODEgMCAxODQgOC4xMDIgMTg0IDE4LjA5N2MwIDkuOTk1LTEwLjExOCAxOC4wOTctMjIuNTk5IDE4LjA5Ny00LjUyOCAwLTguNzQ0LTEuMDY2LTEyLjI4LTIuOTAyelwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1nXCIpLFxuICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUoMTQ5LjY1IDE1LjM4MylcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImVsbGlwc2VcIiwge1xuICAgIGN4OiBcIjIwLjY1NFwiLFxuICAgIGN5OiBcIjMuMTY3XCIsXG4gICAgcng6IFwiMi44NDlcIixcbiAgICByeTogXCIyLjgxNVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTUuNjk4IDUuNjNIMEwyLjg5OC43MDR6TTkuMjU5LjcwNGg0Ljk4NVY1LjYzSDkuMjU5elwiXG4gIH0pKSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IEVtcHR5OyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xudmFyIFNpbXBsZSA9IGZ1bmN0aW9uIFNpbXBsZSgpIHtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHM7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2VtcHR5LWltZy1zaW1wbGUnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICBjbGFzc05hbWU6IHByZWZpeENscyxcbiAgICB3aWR0aDogXCI2NFwiLFxuICAgIGhlaWdodDogXCI0MVwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDY0IDQxXCIsXG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwge1xuICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUoMCAxKVwiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImVsbGlwc2VcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1lbGxpcHNlXCIpLFxuICAgIGN4OiBcIjMyXCIsXG4gICAgY3k6IFwiMzNcIixcbiAgICByeDogXCIzMlwiLFxuICAgIHJ5OiBcIjdcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZ1wiKSxcbiAgICBmaWxsUnVsZTogXCJub256ZXJvXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk01NSAxMi43Nkw0NC44NTQgMS4yNThDNDQuMzY3LjQ3NCA0My42NTYgMCA0Mi45MDcgMEgyMS4wOTNjLS43NDkgMC0xLjQ2LjQ3NC0xLjk0NyAxLjI1N0w5IDEyLjc2MVYyMmg0NnYtOS4yNHpcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk00MS42MTMgMTUuOTMxYzAtMS42MDUuOTk0LTIuOTMgMi4yMjctMi45MzFINTV2MTguMTM3QzU1IDMzLjI2IDUzLjY4IDM1IDUyLjA1IDM1aC00MC4xQzEwLjMyIDM1IDkgMzMuMjU5IDkgMzEuMTM3VjEzaDExLjE2YzEuMjMzIDAgMi4yMjcgMS4zMjMgMi4yMjcgMi45Mjh2LjAyMmMwIDEuNjA1IDEuMDA1IDIuOTAxIDIuMjM3IDIuOTAxaDE0Ljc1MmMxLjIzMiAwIDIuMjM3LTEuMzA4IDIuMjM3LTIuOTEzdi0uMDA3elwiLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wYXRoXCIpXG4gIH0pKSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFNpbXBsZTsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBMb2NhbGVSZWNlaXZlciBmcm9tICcuLi9sb2NhbGUtcHJvdmlkZXIvTG9jYWxlUmVjZWl2ZXInO1xuaW1wb3J0IERlZmF1bHRFbXB0eUltZyBmcm9tICcuL2VtcHR5JztcbmltcG9ydCBTaW1wbGVFbXB0eUltZyBmcm9tICcuL3NpbXBsZSc7XG52YXIgZGVmYXVsdEVtcHR5SW1nID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRGVmYXVsdEVtcHR5SW1nLCBudWxsKTtcbnZhciBzaW1wbGVFbXB0eUltZyA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNpbXBsZUVtcHR5SW1nLCBudWxsKTtcbnZhciBFbXB0eSA9IGZ1bmN0aW9uIEVtcHR5KF9hKSB7XG4gIHZhciBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsXG4gICAgY3VzdG9taXplUHJlZml4Q2xzID0gX2EucHJlZml4Q2xzLFxuICAgIF9hJGltYWdlID0gX2EuaW1hZ2UsXG4gICAgaW1hZ2UgPSBfYSRpbWFnZSA9PT0gdm9pZCAwID8gZGVmYXVsdEVtcHR5SW1nIDogX2EkaW1hZ2UsXG4gICAgZGVzY3JpcHRpb24gPSBfYS5kZXNjcmlwdGlvbixcbiAgICBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLFxuICAgIGltYWdlU3R5bGUgPSBfYS5pbWFnZVN0eWxlLFxuICAgIHJlc3RQcm9wcyA9IF9fcmVzdChfYSwgW1wiY2xhc3NOYW1lXCIsIFwicHJlZml4Q2xzXCIsIFwiaW1hZ2VcIiwgXCJkZXNjcmlwdGlvblwiLCBcImNoaWxkcmVuXCIsIFwiaW1hZ2VTdHlsZVwiXSk7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCksXG4gICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExvY2FsZVJlY2VpdmVyLCB7XG4gICAgY29tcG9uZW50TmFtZTogXCJFbXB0eVwiXG4gIH0sIGZ1bmN0aW9uIChjb250ZXh0TG9jYWxlKSB7XG4gICAgdmFyIF9jbGFzc05hbWVzO1xuICAgIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2VtcHR5JywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgICB2YXIgZGVzID0gdHlwZW9mIGRlc2NyaXB0aW9uICE9PSAndW5kZWZpbmVkJyA/IGRlc2NyaXB0aW9uIDogY29udGV4dExvY2FsZS5kZXNjcmlwdGlvbjtcbiAgICB2YXIgYWx0ID0gdHlwZW9mIGRlcyA9PT0gJ3N0cmluZycgPyBkZXMgOiAnZW1wdHknO1xuICAgIHZhciBpbWFnZU5vZGUgPSBudWxsO1xuICAgIGlmICh0eXBlb2YgaW1hZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpbWFnZU5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7XG4gICAgICAgIGFsdDogYWx0LFxuICAgICAgICBzcmM6IGltYWdlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW1hZ2VOb2RlID0gaW1hZ2U7XG4gICAgfVxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5vcm1hbFwiKSwgaW1hZ2UgPT09IHNpbXBsZUVtcHR5SW1nKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKVxuICAgIH0sIHJlc3RQcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbWFnZVwiKSxcbiAgICAgIHN0eWxlOiBpbWFnZVN0eWxlXG4gICAgfSwgaW1hZ2VOb2RlKSwgZGVzICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kZXNjcmlwdGlvblwiKVxuICAgIH0sIGRlcyksIGNoaWxkcmVuICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1mb290ZXJcIilcbiAgICB9LCBjaGlsZHJlbikpO1xuICB9KTtcbn07XG5FbXB0eS5QUkVTRU5URURfSU1BR0VfREVGQVVMVCA9IGRlZmF1bHRFbXB0eUltZztcbkVtcHR5LlBSRVNFTlRFRF9JTUFHRV9TSU1QTEUgPSBzaW1wbGVFbXB0eUltZztcbmV4cG9ydCBkZWZhdWx0IEVtcHR5OyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnN1bWVyIH0gZnJvbSAnLic7XG5pbXBvcnQgRW1wdHkgZnJvbSAnLi4vZW1wdHknO1xudmFyIGRlZmF1bHRSZW5kZXJFbXB0eSA9IGZ1bmN0aW9uIGRlZmF1bHRSZW5kZXJFbXB0eShjb21wb25lbnROYW1lKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb25maWdDb25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgZ2V0UHJlZml4Q2xzID0gX3JlZi5nZXRQcmVmaXhDbHM7XG4gICAgdmFyIHByZWZpeCA9IGdldFByZWZpeENscygnZW1wdHknKTtcbiAgICBzd2l0Y2ggKGNvbXBvbmVudE5hbWUpIHtcbiAgICAgIGNhc2UgJ1RhYmxlJzpcbiAgICAgIGNhc2UgJ0xpc3QnOlxuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRW1wdHksIHtcbiAgICAgICAgICBpbWFnZTogRW1wdHkuUFJFU0VOVEVEX0lNQUdFX1NJTVBMRVxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgJ1NlbGVjdCc6XG4gICAgICBjYXNlICdUcmVlU2VsZWN0JzpcbiAgICAgIGNhc2UgJ0Nhc2NhZGVyJzpcbiAgICAgIGNhc2UgJ1RyYW5zZmVyJzpcbiAgICAgIGNhc2UgJ01lbnRpb25zJzpcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVtcHR5LCB7XG4gICAgICAgICAgaW1hZ2U6IEVtcHR5LlBSRVNFTlRFRF9JTUFHRV9TSU1QTEUsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXgsIFwiLXNtYWxsXCIpXG4gICAgICAgIH0pO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIFNob3VsZCBuZXZlciBoaXQgaWYgd2UgdGFrZSBhbGwgdGhlIGNvbXBvbmVudCBpbnRvIGNvbnNpZGVyLlxuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRW1wdHksIG51bGwpO1xuICAgIH1cbiAgfSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgZGVmYXVsdFJlbmRlckVtcHR5OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IHsgRm9ybVByb3ZpZGVyIGFzIFJjRm9ybVByb3ZpZGVyIH0gZnJvbSAncmMtZmllbGQtZm9ybSc7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciBGb3JtQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgbGFiZWxBbGlnbjogJ3JpZ2h0JyxcbiAgdmVydGljYWw6IGZhbHNlLFxuICBpdGVtUmVmOiBmdW5jdGlvbiBpdGVtUmVmKCkge31cbn0pO1xuZXhwb3J0IHZhciBOb1N0eWxlSXRlbUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCB2YXIgRm9ybVByb3ZpZGVyID0gZnVuY3Rpb24gRm9ybVByb3ZpZGVyKHByb3BzKSB7XG4gIHZhciBwcm92aWRlclByb3BzID0gb21pdChwcm9wcywgWydwcmVmaXhDbHMnXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSY0Zvcm1Qcm92aWRlciwgX2V4dGVuZHMoe30sIHByb3ZpZGVyUHJvcHMpKTtcbn07XG5leHBvcnQgdmFyIEZvcm1JdGVtUHJlZml4Q29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgcHJlZml4Q2xzOiAnJ1xufSk7XG5leHBvcnQgdmFyIEZvcm1JdGVtSW5wdXRDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe30pO1xuZXhwb3J0IHZhciBOb0Zvcm1TdHlsZSA9IGZ1bmN0aW9uIE5vRm9ybVN0eWxlKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBzdGF0dXMgPSBfcmVmLnN0YXR1cyxcbiAgICBvdmVycmlkZSA9IF9yZWYub3ZlcnJpZGU7XG4gIHZhciBmb3JtSXRlbUlucHV0Q29udGV4dCA9IHVzZUNvbnRleHQoRm9ybUl0ZW1JbnB1dENvbnRleHQpO1xuICB2YXIgbmV3Rm9ybUl0ZW1JbnB1dENvbnRleHQgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbmV3Q29udGV4dCA9IF9leHRlbmRzKHt9LCBmb3JtSXRlbUlucHV0Q29udGV4dCk7XG4gICAgaWYgKG92ZXJyaWRlKSB7XG4gICAgICBkZWxldGUgbmV3Q29udGV4dC5pc0Zvcm1JdGVtSW5wdXQ7XG4gICAgfVxuICAgIGlmIChzdGF0dXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdDb250ZXh0LnN0YXR1cztcbiAgICAgIGRlbGV0ZSBuZXdDb250ZXh0Lmhhc0ZlZWRiYWNrO1xuICAgICAgZGVsZXRlIG5ld0NvbnRleHQuZmVlZGJhY2tJY29uO1xuICAgIH1cbiAgICByZXR1cm4gbmV3Q29udGV4dDtcbiAgfSwgW3N0YXR1cywgb3ZlcnJpZGUsIGZvcm1JdGVtSW5wdXRDb250ZXh0XSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb3JtSXRlbUlucHV0Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBuZXdGb3JtSXRlbUlucHV0Q29udGV4dFxuICB9LCBjaGlsZHJlbik7XG59OyIsIi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ2MTc2MTY1L3dheXMtdG8tZ2V0LXN0cmluZy1saXRlcmFsLXR5cGUtb2YtYXJyYXktdmFsdWVzLXdpdGhvdXQtZW51bS1vdmVyaGVhZFxuZXhwb3J0IHZhciB0dXBsZSA9IGZ1bmN0aW9uIHR1cGxlKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG4gIHJldHVybiBhcmdzO1xufTtcbmV4cG9ydCB2YXIgdHVwbGVOdW0gPSBmdW5jdGlvbiB0dXBsZU51bSgpIHtcbiAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICB9XG4gIHJldHVybiBhcmdzO1xufTsiLCJpbXBvcnQgeyB0dXBsZSB9IGZyb20gJy4vdHlwZSc7XG4vLyA9PT09PT09PT09PT09PT09PT0gQ29sbGFwc2UgTW90aW9uID09PT09PT09PT09PT09PT09PVxudmFyIGdldENvbGxhcHNlZEhlaWdodCA9IGZ1bmN0aW9uIGdldENvbGxhcHNlZEhlaWdodCgpIHtcbiAgcmV0dXJuIHtcbiAgICBoZWlnaHQ6IDAsXG4gICAgb3BhY2l0eTogMFxuICB9O1xufTtcbnZhciBnZXRSZWFsSGVpZ2h0ID0gZnVuY3Rpb24gZ2V0UmVhbEhlaWdodChub2RlKSB7XG4gIHZhciBzY3JvbGxIZWlnaHQgPSBub2RlLnNjcm9sbEhlaWdodDtcbiAgcmV0dXJuIHtcbiAgICBoZWlnaHQ6IHNjcm9sbEhlaWdodCxcbiAgICBvcGFjaXR5OiAxXG4gIH07XG59O1xudmFyIGdldEN1cnJlbnRIZWlnaHQgPSBmdW5jdGlvbiBnZXRDdXJyZW50SGVpZ2h0KG5vZGUpIHtcbiAgcmV0dXJuIHtcbiAgICBoZWlnaHQ6IG5vZGUgPyBub2RlLm9mZnNldEhlaWdodCA6IDBcbiAgfTtcbn07XG52YXIgc2tpcE9wYWNpdHlUcmFuc2l0aW9uID0gZnVuY3Rpb24gc2tpcE9wYWNpdHlUcmFuc2l0aW9uKF8sIGV2ZW50KSB7XG4gIHJldHVybiAoZXZlbnQgPT09IG51bGwgfHwgZXZlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGV2ZW50LmRlYWRsaW5lKSA9PT0gdHJ1ZSB8fCBldmVudC5wcm9wZXJ0eU5hbWUgPT09ICdoZWlnaHQnO1xufTtcbnZhciBjb2xsYXBzZU1vdGlvbiA9IHtcbiAgbW90aW9uTmFtZTogJ2FudC1tb3Rpb24tY29sbGFwc2UnLFxuICBvbkFwcGVhclN0YXJ0OiBnZXRDb2xsYXBzZWRIZWlnaHQsXG4gIG9uRW50ZXJTdGFydDogZ2V0Q29sbGFwc2VkSGVpZ2h0LFxuICBvbkFwcGVhckFjdGl2ZTogZ2V0UmVhbEhlaWdodCxcbiAgb25FbnRlckFjdGl2ZTogZ2V0UmVhbEhlaWdodCxcbiAgb25MZWF2ZVN0YXJ0OiBnZXRDdXJyZW50SGVpZ2h0LFxuICBvbkxlYXZlQWN0aXZlOiBnZXRDb2xsYXBzZWRIZWlnaHQsXG4gIG9uQXBwZWFyRW5kOiBza2lwT3BhY2l0eVRyYW5zaXRpb24sXG4gIG9uRW50ZXJFbmQ6IHNraXBPcGFjaXR5VHJhbnNpdGlvbixcbiAgb25MZWF2ZUVuZDogc2tpcE9wYWNpdHlUcmFuc2l0aW9uLFxuICBtb3Rpb25EZWFkbGluZTogNTAwXG59O1xudmFyIFNlbGVjdFBsYWNlbWVudHMgPSB0dXBsZSgnYm90dG9tTGVmdCcsICdib3R0b21SaWdodCcsICd0b3BMZWZ0JywgJ3RvcFJpZ2h0Jyk7XG52YXIgZ2V0VHJhbnNpdGlvbkRpcmVjdGlvbiA9IGZ1bmN0aW9uIGdldFRyYW5zaXRpb25EaXJlY3Rpb24ocGxhY2VtZW50KSB7XG4gIGlmIChwbGFjZW1lbnQgIT09IHVuZGVmaW5lZCAmJiAocGxhY2VtZW50ID09PSAndG9wTGVmdCcgfHwgcGxhY2VtZW50ID09PSAndG9wUmlnaHQnKSkge1xuICAgIHJldHVybiBcInNsaWRlLWRvd25cIjtcbiAgfVxuICByZXR1cm4gXCJzbGlkZS11cFwiO1xufTtcbnZhciBnZXRUcmFuc2l0aW9uTmFtZSA9IGZ1bmN0aW9uIGdldFRyYW5zaXRpb25OYW1lKHJvb3RQcmVmaXhDbHMsIG1vdGlvbiwgdHJhbnNpdGlvbk5hbWUpIHtcbiAgaWYgKHRyYW5zaXRpb25OYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdHJhbnNpdGlvbk5hbWU7XG4gIH1cbiAgcmV0dXJuIFwiXCIuY29uY2F0KHJvb3RQcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQobW90aW9uKTtcbn07XG5leHBvcnQgeyBnZXRUcmFuc2l0aW9uTmFtZSwgZ2V0VHJhbnNpdGlvbkRpcmVjdGlvbiB9O1xuZXhwb3J0IGRlZmF1bHQgY29sbGFwc2VNb3Rpb247IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgdHVwbGUgfSBmcm9tICcuL3R5cGUnO1xudmFyIElucHV0U3RhdHVzZXMgPSB0dXBsZSgnd2FybmluZycsICdlcnJvcicsICcnKTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGF0dXNDbGFzc05hbWVzKHByZWZpeENscywgc3RhdHVzLCBoYXNGZWVkYmFjaykge1xuICB2YXIgX2NsYXNzTmFtZXM7XG4gIHJldHVybiBjbGFzc05hbWVzKChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3RhdHVzLXN1Y2Nlc3NcIiksIHN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN0YXR1cy13YXJuaW5nXCIpLCBzdGF0dXMgPT09ICd3YXJuaW5nJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdGF0dXMtZXJyb3JcIiksIHN0YXR1cyA9PT0gJ2Vycm9yJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdGF0dXMtdmFsaWRhdGluZ1wiKSwgc3RhdHVzID09PSAndmFsaWRhdGluZycpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGFzLWZlZWRiYWNrXCIpLCBoYXNGZWVkYmFjayksIF9jbGFzc05hbWVzKSk7XG59XG5leHBvcnQgdmFyIGdldE1lcmdlZFN0YXR1cyA9IGZ1bmN0aW9uIGdldE1lcmdlZFN0YXR1cyhjb250ZXh0U3RhdHVzLCBjdXN0b21TdGF0dXMpIHtcbiAgcmV0dXJuIGN1c3RvbVN0YXR1cyB8fCBjb250ZXh0U3RhdHVzO1xufTsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBDaGVja091dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk05MTIgMTkwaC02OS45Yy05LjggMC0xOS4xIDQuNS0yNS4xIDEyLjJMNDA0LjcgNzI0LjUgMjA3IDQ3NGEzMiAzMiAwIDAwLTI1LjEtMTIuMkgxMTJjLTYuNyAwLTEwLjQgNy43LTYuMyAxMi45bDI3My45IDM0N2MxMi44IDE2LjIgMzcuNCAxNi4yIDUwLjMgMGw0ODguNC02MTguOWM0LjEtNS4xLjQtMTIuOC02LjMtMTIuOHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImNoZWNrXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBDaGVja091dGxpbmVkO1xuIiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ2hlY2tPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9DaGVja091dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSAnLi4vY29tcG9uZW50cy9BbnRkSWNvbic7XG52YXIgQ2hlY2tPdXRsaW5lZCA9IGZ1bmN0aW9uIENoZWNrT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IENoZWNrT3V0bGluZWRTdmdcbiAgfSkpO1xufTtcbkNoZWNrT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnQ2hlY2tPdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihDaGVja091dGxpbmVkKTsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBEb3duT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTg4NCAyNTZoLTc1Yy01LjEgMC05LjkgMi41LTEyLjkgNi42TDUxMiA2NTQuMiAyMjcuOSAyNjIuNmMtMy00LjEtNy44LTYuNi0xMi45LTYuNmgtNzVjLTYuNSAwLTEwLjMgNy40LTYuNSAxMi43bDM1Mi42IDQ4Ni4xYzEyLjggMTcuNiAzOSAxNy42IDUxLjcgMGwzNTIuNi00ODYuMWMzLjktNS4zLjEtMTIuNy02LjQtMTIuN3pcIiB9IH1dIH0sIFwibmFtZVwiOiBcImRvd25cIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IERvd25PdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IERvd25PdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Eb3duT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tICcuLi9jb21wb25lbnRzL0FudGRJY29uJztcbnZhciBEb3duT3V0bGluZWQgPSBmdW5jdGlvbiBEb3duT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IERvd25PdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuRG93bk91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0Rvd25PdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihEb3duT3V0bGluZWQpOyIsIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIFNlYXJjaE91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk05MDkuNiA4NTQuNUw2NDkuOSA1OTQuOEM2OTAuMiA1NDIuNyA3MTIgNDc5IDcxMiA0MTJjMC04MC4yLTMxLjMtMTU1LjQtODcuOS0yMTIuMS01Ni42LTU2LjctMTMyLTg3LjktMjEyLjEtODcuOXMtMTU1LjUgMzEuMy0yMTIuMSA4Ny45QzE0My4yIDI1Ni41IDExMiAzMzEuOCAxMTIgNDEyYzAgODAuMSAzMS4zIDE1NS41IDg3LjkgMjEyLjFDMjU2LjUgNjgwLjggMzMxLjggNzEyIDQxMiA3MTJjNjcgMCAxMzAuNi0yMS44IDE4Mi43LTYybDI1OS43IDI1OS42YTguMiA4LjIgMCAwMDExLjYgMGw0My42LTQzLjVhOC4yIDguMiAwIDAwMC0xMS42ek01NzAuNCA1NzAuNEM1MjggNjEyLjcgNDcxLjggNjM2IDQxMiA2MzZzLTExNi0yMy4zLTE1OC40LTY1LjZDMjExLjMgNTI4IDE4OCA0NzEuOCAxODggNDEyczIzLjMtMTE2LjEgNjUuNi0xNTguNEMyOTYgMjExLjMgMzUyLjIgMTg4IDQxMiAxODhzMTE2LjEgMjMuMiAxNTguNCA2NS42UzYzNiAzNTIuMiA2MzYgNDEycy0yMy4zIDExNi4xLTY1LjYgMTU4LjR6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJzZWFyY2hcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IFNlYXJjaE91dGxpbmVkO1xuIiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgU2VhcmNoT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vU2VhcmNoT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tICcuLi9jb21wb25lbnRzL0FudGRJY29uJztcbnZhciBTZWFyY2hPdXRsaW5lZCA9IGZ1bmN0aW9uIFNlYXJjaE91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBTZWFyY2hPdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuU2VhcmNoT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnU2VhcmNoT3V0bGluZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoU2VhcmNoT3V0bGluZWQpOyIsImltcG9ydCBDaGVja091dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DaGVja091dGxpbmVkXCI7XG5pbXBvcnQgQ2xvc2VDaXJjbGVGaWxsZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Nsb3NlQ2lyY2xlRmlsbGVkXCI7XG5pbXBvcnQgQ2xvc2VPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQ2xvc2VPdXRsaW5lZFwiO1xuaW1wb3J0IERvd25PdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvRG93bk91dGxpbmVkXCI7XG5pbXBvcnQgTG9hZGluZ091dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Mb2FkaW5nT3V0bGluZWRcIjtcbmltcG9ydCBTZWFyY2hPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvU2VhcmNoT3V0bGluZWRcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEljb25zKF9yZWYpIHtcbiAgdmFyIHN1ZmZpeEljb24gPSBfcmVmLnN1ZmZpeEljb24sXG4gICAgY2xlYXJJY29uID0gX3JlZi5jbGVhckljb24sXG4gICAgbWVudUl0ZW1TZWxlY3RlZEljb24gPSBfcmVmLm1lbnVJdGVtU2VsZWN0ZWRJY29uLFxuICAgIHJlbW92ZUljb24gPSBfcmVmLnJlbW92ZUljb24sXG4gICAgbG9hZGluZyA9IF9yZWYubG9hZGluZyxcbiAgICBtdWx0aXBsZSA9IF9yZWYubXVsdGlwbGUsXG4gICAgaGFzRmVlZGJhY2sgPSBfcmVmLmhhc0ZlZWRiYWNrLFxuICAgIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIHNob3dBcnJvdyA9IF9yZWYuc2hvd0Fycm93LFxuICAgIGZlZWRiYWNrSWNvbiA9IF9yZWYuZmVlZGJhY2tJY29uO1xuICAvLyBDbGVhciBJY29uXG4gIHZhciBtZXJnZWRDbGVhckljb24gPSBjbGVhckljb24gIT09IG51bGwgJiYgY2xlYXJJY29uICE9PSB2b2lkIDAgPyBjbGVhckljb24gOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDbG9zZUNpcmNsZUZpbGxlZCwgbnVsbCk7XG4gIC8vIFZhbGlkYXRpb24gRmVlZGJhY2sgSWNvblxuICB2YXIgZ2V0U3VmZml4SWNvbk5vZGUgPSBmdW5jdGlvbiBnZXRTdWZmaXhJY29uTm9kZShhcnJvd0ljb24pIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHNob3dBcnJvdyAhPT0gZmFsc2UgJiYgYXJyb3dJY29uLCBoYXNGZWVkYmFjayAmJiBmZWVkYmFja0ljb24pO1xuICB9O1xuICAvLyBBcnJvdyBpdGVtIGljb25cbiAgdmFyIG1lcmdlZFN1ZmZpeEljb24gPSBudWxsO1xuICBpZiAoc3VmZml4SWNvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbWVyZ2VkU3VmZml4SWNvbiA9IGdldFN1ZmZpeEljb25Ob2RlKHN1ZmZpeEljb24pO1xuICB9IGVsc2UgaWYgKGxvYWRpbmcpIHtcbiAgICBtZXJnZWRTdWZmaXhJY29uID0gZ2V0U3VmZml4SWNvbk5vZGUoIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExvYWRpbmdPdXRsaW5lZCwge1xuICAgICAgc3BpbjogdHJ1ZVxuICAgIH0pKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgaWNvbkNscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3VmZml4XCIpO1xuICAgIG1lcmdlZFN1ZmZpeEljb24gPSBmdW5jdGlvbiBtZXJnZWRTdWZmaXhJY29uKF9yZWYyKSB7XG4gICAgICB2YXIgb3BlbiA9IF9yZWYyLm9wZW4sXG4gICAgICAgIHNob3dTZWFyY2ggPSBfcmVmMi5zaG93U2VhcmNoO1xuICAgICAgaWYgKG9wZW4gJiYgc2hvd1NlYXJjaCkge1xuICAgICAgICByZXR1cm4gZ2V0U3VmZml4SWNvbk5vZGUoIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNlYXJjaE91dGxpbmVkLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBpY29uQ2xzXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBnZXRTdWZmaXhJY29uTm9kZSggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRG93bk91dGxpbmVkLCB7XG4gICAgICAgIGNsYXNzTmFtZTogaWNvbkNsc1xuICAgICAgfSkpO1xuICAgIH07XG4gIH1cbiAgLy8gQ2hlY2tlZCBpdGVtIGljb25cbiAgdmFyIG1lcmdlZEl0ZW1JY29uID0gbnVsbDtcbiAgaWYgKG1lbnVJdGVtU2VsZWN0ZWRJY29uICE9PSB1bmRlZmluZWQpIHtcbiAgICBtZXJnZWRJdGVtSWNvbiA9IG1lbnVJdGVtU2VsZWN0ZWRJY29uO1xuICB9IGVsc2UgaWYgKG11bHRpcGxlKSB7XG4gICAgbWVyZ2VkSXRlbUljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDaGVja091dGxpbmVkLCBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICBtZXJnZWRJdGVtSWNvbiA9IG51bGw7XG4gIH1cbiAgdmFyIG1lcmdlZFJlbW92ZUljb24gPSBudWxsO1xuICBpZiAocmVtb3ZlSWNvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbWVyZ2VkUmVtb3ZlSWNvbiA9IHJlbW92ZUljb247XG4gIH0gZWxzZSB7XG4gICAgbWVyZ2VkUmVtb3ZlSWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENsb3NlT3V0bGluZWQsIG51bGwpO1xuICB9XG4gIHJldHVybiB7XG4gICAgY2xlYXJJY29uOiBtZXJnZWRDbGVhckljb24sXG4gICAgc3VmZml4SWNvbjogbWVyZ2VkU3VmZml4SWNvbixcbiAgICBpdGVtSWNvbjogbWVyZ2VkSXRlbUljb24sXG4gICAgcmVtb3ZlSWNvbjogbWVyZ2VkUmVtb3ZlSWNvblxuICB9O1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB0b0FycmF5IGZyb20gXCJyYy11dGlsL2VzL0NoaWxkcmVuL3RvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuZXhwb3J0IHZhciBTcGFjZUNvbXBhY3RJdGVtQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IHZhciB1c2VDb21wYWN0SXRlbUNvbnRleHQgPSBmdW5jdGlvbiB1c2VDb21wYWN0SXRlbUNvbnRleHQocHJlZml4Q2xzLCBkaXJlY3Rpb24pIHtcbiAgdmFyIGNvbXBhY3RJdGVtQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoU3BhY2VDb21wYWN0SXRlbUNvbnRleHQpO1xuICB2YXIgY29tcGFjdEl0ZW1DbGFzc25hbWVzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9jbGFzc05hbWVzO1xuICAgIGlmICghY29tcGFjdEl0ZW1Db250ZXh0KSByZXR1cm4gJyc7XG4gICAgdmFyIGNvbXBhY3REaXJlY3Rpb24gPSBjb21wYWN0SXRlbUNvbnRleHQuY29tcGFjdERpcmVjdGlvbixcbiAgICAgIGlzRmlyc3RJdGVtID0gY29tcGFjdEl0ZW1Db250ZXh0LmlzRmlyc3RJdGVtLFxuICAgICAgaXNMYXN0SXRlbSA9IGNvbXBhY3RJdGVtQ29udGV4dC5pc0xhc3RJdGVtO1xuICAgIHZhciBzZXBhcmF0b3IgPSBjb21wYWN0RGlyZWN0aW9uID09PSAndmVydGljYWwnID8gJy12ZXJ0aWNhbC0nIDogJy0nO1xuICAgIHJldHVybiBjbGFzc05hbWVzKChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29tcGFjdFwiKS5jb25jYXQoc2VwYXJhdG9yLCBcIml0ZW1cIiksIHRydWUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29tcGFjdFwiKS5jb25jYXQoc2VwYXJhdG9yLCBcImZpcnN0LWl0ZW1cIiksIGlzRmlyc3RJdGVtKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbXBhY3RcIikuY29uY2F0KHNlcGFyYXRvciwgXCJsYXN0LWl0ZW1cIiksIGlzTGFzdEl0ZW0pLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29tcGFjdFwiKS5jb25jYXQoc2VwYXJhdG9yLCBcIml0ZW0tcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2NsYXNzTmFtZXMpKTtcbiAgfSwgW3ByZWZpeENscywgZGlyZWN0aW9uLCBjb21wYWN0SXRlbUNvbnRleHRdKTtcbiAgcmV0dXJuIHtcbiAgICBjb21wYWN0U2l6ZTogY29tcGFjdEl0ZW1Db250ZXh0ID09PSBudWxsIHx8IGNvbXBhY3RJdGVtQ29udGV4dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29tcGFjdEl0ZW1Db250ZXh0LmNvbXBhY3RTaXplLFxuICAgIGNvbXBhY3REaXJlY3Rpb246IGNvbXBhY3RJdGVtQ29udGV4dCA9PT0gbnVsbCB8fCBjb21wYWN0SXRlbUNvbnRleHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbXBhY3RJdGVtQ29udGV4dC5jb21wYWN0RGlyZWN0aW9uLFxuICAgIGNvbXBhY3RJdGVtQ2xhc3NuYW1lczogY29tcGFjdEl0ZW1DbGFzc25hbWVzXG4gIH07XG59O1xuZXhwb3J0IHZhciBOb0NvbXBhY3RTdHlsZSA9IGZ1bmN0aW9uIE5vQ29tcGFjdFN0eWxlKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNwYWNlQ29tcGFjdEl0ZW1Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IG51bGxcbiAgfSwgY2hpbGRyZW4pO1xufTtcbnZhciBDb21wYWN0SXRlbSA9IGZ1bmN0aW9uIENvbXBhY3RJdGVtKF9hKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLFxuICAgIG90aGVyUHJvcHMgPSBfX3Jlc3QoX2EsIFtcImNoaWxkcmVuXCJdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNwYWNlQ29tcGFjdEl0ZW1Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IG90aGVyUHJvcHNcbiAgfSwgY2hpbGRyZW4pO1xufTtcbnZhciBDb21wYWN0ID0gZnVuY3Rpb24gQ29tcGFjdChwcm9wcykge1xuICB2YXIgX2NsYXNzTmFtZXMyO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICBkaXJlY3Rpb25Db25maWcgPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG4gIHZhciBfcHJvcHMkc2l6ZSA9IHByb3BzLnNpemUsXG4gICAgc2l6ZSA9IF9wcm9wcyRzaXplID09PSB2b2lkIDAgPyAnbWlkZGxlJyA6IF9wcm9wcyRzaXplLFxuICAgIGRpcmVjdGlvbiA9IHByb3BzLmRpcmVjdGlvbixcbiAgICBibG9jayA9IHByb3BzLmJsb2NrLFxuICAgIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInNpemVcIiwgXCJkaXJlY3Rpb25cIiwgXCJibG9ja1wiLCBcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcImNoaWxkcmVuXCJdKTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnc3BhY2UtY29tcGFjdCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBjbHggPSBjbGFzc05hbWVzKHByZWZpeENscywgKF9jbGFzc05hbWVzMiA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uQ29uZmlnID09PSAncnRsJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYmxvY2tcIiksIGJsb2NrKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi12ZXJ0aWNhbFwiKSwgZGlyZWN0aW9uID09PSAndmVydGljYWwnKSwgX2NsYXNzTmFtZXMyKSwgY2xhc3NOYW1lKTtcbiAgdmFyIGNvbXBhY3RJdGVtQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoU3BhY2VDb21wYWN0SXRlbUNvbnRleHQpO1xuICB2YXIgY2hpbGROb2RlcyA9IHRvQXJyYXkoY2hpbGRyZW4pO1xuICB2YXIgbm9kZXMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY2hpbGROb2Rlcy5tYXAoZnVuY3Rpb24gKGNoaWxkLCBpKSB7XG4gICAgICB2YXIga2V5ID0gY2hpbGQgJiYgY2hpbGQua2V5IHx8IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1cIikuY29uY2F0KGkpO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBhY3RJdGVtLCB7XG4gICAgICAgIGtleToga2V5LFxuICAgICAgICBjb21wYWN0U2l6ZTogc2l6ZSxcbiAgICAgICAgY29tcGFjdERpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgICAgICBpc0ZpcnN0SXRlbTogaSA9PT0gMCAmJiAoIWNvbXBhY3RJdGVtQ29udGV4dCB8fCAoY29tcGFjdEl0ZW1Db250ZXh0ID09PSBudWxsIHx8IGNvbXBhY3RJdGVtQ29udGV4dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29tcGFjdEl0ZW1Db250ZXh0LmlzRmlyc3RJdGVtKSksXG4gICAgICAgIGlzTGFzdEl0ZW06IGkgPT09IGNoaWxkTm9kZXMubGVuZ3RoIC0gMSAmJiAoIWNvbXBhY3RJdGVtQ29udGV4dCB8fCAoY29tcGFjdEl0ZW1Db250ZXh0ID09PSBudWxsIHx8IGNvbXBhY3RJdGVtQ29udGV4dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29tcGFjdEl0ZW1Db250ZXh0LmlzTGFzdEl0ZW0pKVxuICAgICAgfSwgY2hpbGQpO1xuICAgIH0pO1xuICB9LCBbc2l6ZSwgY2hpbGROb2RlcywgY29tcGFjdEl0ZW1Db250ZXh0XSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGlmIChjaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHhcbiAgfSwgcmVzdFByb3BzKSwgbm9kZXMpO1xufTtcbmV4cG9ydCBkZWZhdWx0IENvbXBhY3Q7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuLy8gVE9ETzogNC4wIC0gY29kZW1vZCBzaG91bGQgaGVscCB0byBjaGFuZ2UgYGZpbHRlck9wdGlvbmAgdG8gc3VwcG9ydCBub2RlIHByb3BzLlxudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjU2VsZWN0LCB7IE9wdEdyb3VwLCBPcHRpb24gfSBmcm9tICdyYy1zZWxlY3QnO1xuaW1wb3J0IG9taXQgZnJvbSBcInJjLXV0aWwvZXMvb21pdFwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IGRlZmF1bHRSZW5kZXJFbXB0eSBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvZGVmYXVsdFJlbmRlckVtcHR5JztcbmltcG9ydCBEaXNhYmxlZENvbnRleHQgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL0Rpc2FibGVkQ29udGV4dCc7XG5pbXBvcnQgU2l6ZUNvbnRleHQgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL1NpemVDb250ZXh0JztcbmltcG9ydCB7IEZvcm1JdGVtSW5wdXRDb250ZXh0IH0gZnJvbSAnLi4vZm9ybS9jb250ZXh0JztcbmltcG9ydCB7IGdldFRyYW5zaXRpb25EaXJlY3Rpb24sIGdldFRyYW5zaXRpb25OYW1lIH0gZnJvbSAnLi4vX3V0aWwvbW90aW9uJztcbmltcG9ydCB7IGdldE1lcmdlZFN0YXR1cywgZ2V0U3RhdHVzQ2xhc3NOYW1lcyB9IGZyb20gJy4uL191dGlsL3N0YXR1c1V0aWxzJztcbmltcG9ydCBnZXRJY29ucyBmcm9tICcuL3V0aWxzL2ljb25VdGlsJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IHsgdXNlQ29tcGFjdEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vc3BhY2UvQ29tcGFjdCc7XG52YXIgU0VDUkVUX0NPTUJPQk9YX01PREVfRE9fTk9UX1VTRSA9ICdTRUNSRVRfQ09NQk9CT1hfTU9ERV9ET19OT1RfVVNFJztcbnZhciBJbnRlcm5hbFNlbGVjdCA9IGZ1bmN0aW9uIEludGVybmFsU2VsZWN0KF9hLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzMjtcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IF9hLnByZWZpeENscyxcbiAgICBfYSRib3JkZXJlZCA9IF9hLmJvcmRlcmVkLFxuICAgIGJvcmRlcmVkID0gX2EkYm9yZGVyZWQgPT09IHZvaWQgMCA/IHRydWUgOiBfYSRib3JkZXJlZCxcbiAgICBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsXG4gICAgZ2V0UG9wdXBDb250YWluZXIgPSBfYS5nZXRQb3B1cENvbnRhaW5lcixcbiAgICBkcm9wZG93bkNsYXNzTmFtZSA9IF9hLmRyb3Bkb3duQ2xhc3NOYW1lLFxuICAgIHBvcHVwQ2xhc3NOYW1lID0gX2EucG9wdXBDbGFzc05hbWUsXG4gICAgX2EkbGlzdEhlaWdodCA9IF9hLmxpc3RIZWlnaHQsXG4gICAgbGlzdEhlaWdodCA9IF9hJGxpc3RIZWlnaHQgPT09IHZvaWQgMCA/IDI1NiA6IF9hJGxpc3RIZWlnaHQsXG4gICAgcGxhY2VtZW50ID0gX2EucGxhY2VtZW50LFxuICAgIF9hJGxpc3RJdGVtSGVpZ2h0ID0gX2EubGlzdEl0ZW1IZWlnaHQsXG4gICAgbGlzdEl0ZW1IZWlnaHQgPSBfYSRsaXN0SXRlbUhlaWdodCA9PT0gdm9pZCAwID8gMjQgOiBfYSRsaXN0SXRlbUhlaWdodCxcbiAgICBjdXN0b21pemVTaXplID0gX2Euc2l6ZSxcbiAgICBjdXN0b21EaXNhYmxlZCA9IF9hLmRpc2FibGVkLFxuICAgIG5vdEZvdW5kQ29udGVudCA9IF9hLm5vdEZvdW5kQ29udGVudCxcbiAgICBjdXN0b21TdGF0dXMgPSBfYS5zdGF0dXMsXG4gICAgc2hvd0Fycm93ID0gX2Euc2hvd0Fycm93LFxuICAgIHByb3BzID0gX19yZXN0KF9hLCBbXCJwcmVmaXhDbHNcIiwgXCJib3JkZXJlZFwiLCBcImNsYXNzTmFtZVwiLCBcImdldFBvcHVwQ29udGFpbmVyXCIsIFwiZHJvcGRvd25DbGFzc05hbWVcIiwgXCJwb3B1cENsYXNzTmFtZVwiLCBcImxpc3RIZWlnaHRcIiwgXCJwbGFjZW1lbnRcIiwgXCJsaXN0SXRlbUhlaWdodFwiLCBcInNpemVcIiwgXCJkaXNhYmxlZFwiLCBcIm5vdEZvdW5kQ29udGVudFwiLCBcInN0YXR1c1wiLCBcInNob3dBcnJvd1wiXSk7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCksXG4gICAgZ2V0Q29udGV4dFBvcHVwQ29udGFpbmVyID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgIHJlbmRlckVtcHR5ID0gX1JlYWN0JHVzZUNvbnRleHQucmVuZGVyRW1wdHksXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uLFxuICAgIHZpcnR1YWwgPSBfUmVhY3QkdXNlQ29udGV4dC52aXJ0dWFsLFxuICAgIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCA9IF9SZWFjdCR1c2VDb250ZXh0LmRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aDtcbiAgdmFyIHNpemUgPSBSZWFjdC51c2VDb250ZXh0KFNpemVDb250ZXh0KTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnc2VsZWN0JywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIHJvb3RQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoKTtcbiAgdmFyIF91c2VDb21wYWN0SXRlbUNvbnRleCA9IHVzZUNvbXBhY3RJdGVtQ29udGV4dChwcmVmaXhDbHMsIGRpcmVjdGlvbiksXG4gICAgY29tcGFjdFNpemUgPSBfdXNlQ29tcGFjdEl0ZW1Db250ZXguY29tcGFjdFNpemUsXG4gICAgY29tcGFjdEl0ZW1DbGFzc25hbWVzID0gX3VzZUNvbXBhY3RJdGVtQ29udGV4LmNvbXBhY3RJdGVtQ2xhc3NuYW1lcztcbiAgdmFyIG1vZGUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbSA9IHByb3BzLm1vZGU7XG4gICAgaWYgKG0gPT09ICdjb21ib2JveCcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChtID09PSBTRUNSRVRfQ09NQk9CT1hfTU9ERV9ET19OT1RfVVNFKSB7XG4gICAgICByZXR1cm4gJ2NvbWJvYm94JztcbiAgICB9XG4gICAgcmV0dXJuIG07XG4gIH0sIFtwcm9wcy5tb2RlXSk7XG4gIHZhciBpc011bHRpcGxlID0gbW9kZSA9PT0gJ211bHRpcGxlJyB8fCBtb2RlID09PSAndGFncyc7XG4gIHZhciBtZXJnZWRTaG93QXJyb3cgPSBzaG93QXJyb3cgIT09IHVuZGVmaW5lZCA/IHNob3dBcnJvdyA6IHByb3BzLmxvYWRpbmcgfHwgIShpc011bHRpcGxlIHx8IG1vZGUgPT09ICdjb21ib2JveCcpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09IFdhcm5pbmcgPT09PT09PT09PT09PT09PT09PT09XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoIWRyb3Bkb3duQ2xhc3NOYW1lLCAnU2VsZWN0JywgJ2Bkcm9wZG93bkNsYXNzTmFtZWAgaXMgZGVwcmVjYXRlZCB3aGljaCB3aWxsIGJlIHJlbW92ZWQgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLiBQbGVhc2UgdXNlIGBwb3B1cENsYXNzTmFtZWAgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IEZvcm0gU3RhdHVzID09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZUNvbnRleHQgPSB1c2VDb250ZXh0KEZvcm1JdGVtSW5wdXRDb250ZXh0KSxcbiAgICBjb250ZXh0U3RhdHVzID0gX3VzZUNvbnRleHQuc3RhdHVzLFxuICAgIGhhc0ZlZWRiYWNrID0gX3VzZUNvbnRleHQuaGFzRmVlZGJhY2ssXG4gICAgaXNGb3JtSXRlbUlucHV0ID0gX3VzZUNvbnRleHQuaXNGb3JtSXRlbUlucHV0LFxuICAgIGZlZWRiYWNrSWNvbiA9IF91c2VDb250ZXh0LmZlZWRiYWNrSWNvbjtcbiAgdmFyIG1lcmdlZFN0YXR1cyA9IGdldE1lcmdlZFN0YXR1cyhjb250ZXh0U3RhdHVzLCBjdXN0b21TdGF0dXMpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gRW1wdHkgPT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZXJnZWROb3RGb3VuZDtcbiAgaWYgKG5vdEZvdW5kQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbWVyZ2VkTm90Rm91bmQgPSBub3RGb3VuZENvbnRlbnQ7XG4gIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2NvbWJvYm94Jykge1xuICAgIG1lcmdlZE5vdEZvdW5kID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBtZXJnZWROb3RGb3VuZCA9IChyZW5kZXJFbXB0eSB8fCBkZWZhdWx0UmVuZGVyRW1wdHkpKCdTZWxlY3QnKTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gSWNvbnMgPT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfZ2V0SWNvbnMgPSBnZXRJY29ucyhfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgcHJvcHMpLCB7XG4gICAgICBtdWx0aXBsZTogaXNNdWx0aXBsZSxcbiAgICAgIGhhc0ZlZWRiYWNrOiBoYXNGZWVkYmFjayxcbiAgICAgIGZlZWRiYWNrSWNvbjogZmVlZGJhY2tJY29uLFxuICAgICAgc2hvd0Fycm93OiBtZXJnZWRTaG93QXJyb3csXG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENsc1xuICAgIH0pKSxcbiAgICBzdWZmaXhJY29uID0gX2dldEljb25zLnN1ZmZpeEljb24sXG4gICAgaXRlbUljb24gPSBfZ2V0SWNvbnMuaXRlbUljb24sXG4gICAgcmVtb3ZlSWNvbiA9IF9nZXRJY29ucy5yZW1vdmVJY29uLFxuICAgIGNsZWFySWNvbiA9IF9nZXRJY29ucy5jbGVhckljb247XG4gIHZhciBzZWxlY3RQcm9wcyA9IG9taXQocHJvcHMsIFsnc3VmZml4SWNvbicsICdpdGVtSWNvbiddKTtcbiAgdmFyIHJjU2VsZWN0UnRsRHJvcGRvd25DbGFzc05hbWUgPSBjbGFzc05hbWVzKHBvcHVwQ2xhc3NOYW1lIHx8IGRyb3Bkb3duQ2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZHJvcGRvd24tXCIpLmNvbmNhdChkaXJlY3Rpb24pLCBkaXJlY3Rpb24gPT09ICdydGwnKSk7XG4gIHZhciBtZXJnZWRTaXplID0gY29tcGFjdFNpemUgfHwgY3VzdG9taXplU2l6ZSB8fCBzaXplO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gRGlzYWJsZWQgPT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBkaXNhYmxlZCA9IFJlYWN0LnVzZUNvbnRleHQoRGlzYWJsZWRDb250ZXh0KTtcbiAgdmFyIG1lcmdlZERpc2FibGVkID0gY3VzdG9tRGlzYWJsZWQgIT09IG51bGwgJiYgY3VzdG9tRGlzYWJsZWQgIT09IHZvaWQgMCA/IGN1c3RvbURpc2FibGVkIDogZGlzYWJsZWQ7XG4gIHZhciBtZXJnZWRDbGFzc05hbWUgPSBjbGFzc05hbWVzKChfY2xhc3NOYW1lczIgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1sZ1wiKSwgbWVyZ2VkU2l6ZSA9PT0gJ2xhcmdlJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc21cIiksIG1lcmdlZFNpemUgPT09ICdzbWFsbCcpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYm9yZGVybGVzc1wiKSwgIWJvcmRlcmVkKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbi1mb3JtLWl0ZW1cIiksIGlzRm9ybUl0ZW1JbnB1dCksIF9jbGFzc05hbWVzMiksIGdldFN0YXR1c0NsYXNzTmFtZXMocHJlZml4Q2xzLCBtZXJnZWRTdGF0dXMsIGhhc0ZlZWRiYWNrKSwgY29tcGFjdEl0ZW1DbGFzc25hbWVzLCBjbGFzc05hbWUpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gUGxhY2VtZW50ID09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZ2V0UGxhY2VtZW50ID0gZnVuY3Rpb24gZ2V0UGxhY2VtZW50KCkge1xuICAgIGlmIChwbGFjZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHBsYWNlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyAnYm90dG9tUmlnaHQnIDogJ2JvdHRvbUxlZnQnO1xuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmNTZWxlY3QsIF9leHRlbmRzKHtcbiAgICByZWY6IHJlZixcbiAgICB2aXJ0dWFsOiB2aXJ0dWFsLFxuICAgIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aDogZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoXG4gIH0sIHNlbGVjdFByb3BzLCB7XG4gICAgdHJhbnNpdGlvbk5hbWU6IGdldFRyYW5zaXRpb25OYW1lKHJvb3RQcmVmaXhDbHMsIGdldFRyYW5zaXRpb25EaXJlY3Rpb24ocGxhY2VtZW50KSwgcHJvcHMudHJhbnNpdGlvbk5hbWUpLFxuICAgIGxpc3RIZWlnaHQ6IGxpc3RIZWlnaHQsXG4gICAgbGlzdEl0ZW1IZWlnaHQ6IGxpc3RJdGVtSGVpZ2h0LFxuICAgIG1vZGU6IG1vZGUsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgcGxhY2VtZW50OiBnZXRQbGFjZW1lbnQoKSxcbiAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICBpbnB1dEljb246IHN1ZmZpeEljb24sXG4gICAgbWVudUl0ZW1TZWxlY3RlZEljb246IGl0ZW1JY29uLFxuICAgIHJlbW92ZUljb246IHJlbW92ZUljb24sXG4gICAgY2xlYXJJY29uOiBjbGVhckljb24sXG4gICAgbm90Rm91bmRDb250ZW50OiBtZXJnZWROb3RGb3VuZCxcbiAgICBjbGFzc05hbWU6IG1lcmdlZENsYXNzTmFtZSxcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIgfHwgZ2V0Q29udGV4dFBvcHVwQ29udGFpbmVyLFxuICAgIGRyb3Bkb3duQ2xhc3NOYW1lOiByY1NlbGVjdFJ0bERyb3Bkb3duQ2xhc3NOYW1lLFxuICAgIHNob3dBcnJvdzogaGFzRmVlZGJhY2sgfHwgc2hvd0Fycm93LFxuICAgIGRpc2FibGVkOiBtZXJnZWREaXNhYmxlZFxuICB9KSk7XG59O1xudmFyIFNlbGVjdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEludGVybmFsU2VsZWN0KTtcblNlbGVjdC5TRUNSRVRfQ09NQk9CT1hfTU9ERV9ET19OT1RfVVNFID0gU0VDUkVUX0NPTUJPQk9YX01PREVfRE9fTk9UX1VTRTtcblNlbGVjdC5PcHRpb24gPSBPcHRpb247XG5TZWxlY3QuT3B0R3JvdXAgPSBPcHRHcm91cDtcbmV4cG9ydCBkZWZhdWx0IFNlbGVjdDsiLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUZvcmNlVXBkYXRlKCkge1xuICB2YXIgX1JlYWN0JHVzZVJlZHVjZXIgPSBSZWFjdC51c2VSZWR1Y2VyKGZ1bmN0aW9uICh4KSB7XG4gICAgICByZXR1cm4geCArIDE7XG4gICAgfSwgMCksXG4gICAgX1JlYWN0JHVzZVJlZHVjZXIyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVJlZHVjZXIsIDIpLFxuICAgIGZvcmNlVXBkYXRlID0gX1JlYWN0JHVzZVJlZHVjZXIyWzFdO1xuICByZXR1cm4gZm9yY2VVcGRhdGU7XG59IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuZXhwb3J0IHZhciByZXNwb25zaXZlQXJyYXkgPSBbJ3h4bCcsICd4bCcsICdsZycsICdtZCcsICdzbScsICd4cyddO1xuZXhwb3J0IHZhciByZXNwb25zaXZlTWFwID0ge1xuICB4czogJyhtYXgtd2lkdGg6IDU3NXB4KScsXG4gIHNtOiAnKG1pbi13aWR0aDogNTc2cHgpJyxcbiAgbWQ6ICcobWluLXdpZHRoOiA3NjhweCknLFxuICBsZzogJyhtaW4td2lkdGg6IDk5MnB4KScsXG4gIHhsOiAnKG1pbi13aWR0aDogMTIwMHB4KScsXG4gIHh4bDogJyhtaW4td2lkdGg6IDE2MDBweCknXG59O1xudmFyIHN1YnNjcmliZXJzID0gbmV3IE1hcCgpO1xudmFyIHN1YlVpZCA9IC0xO1xudmFyIHNjcmVlbnMgPSB7fTtcbnZhciByZXNwb25zaXZlT2JzZXJ2ZSA9IHtcbiAgbWF0Y2hIYW5kbGVyczoge30sXG4gIGRpc3BhdGNoOiBmdW5jdGlvbiBkaXNwYXRjaChwb2ludE1hcCkge1xuICAgIHNjcmVlbnMgPSBwb2ludE1hcDtcbiAgICBzdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICByZXR1cm4gZnVuYyhzY3JlZW5zKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3Vic2NyaWJlcnMuc2l6ZSA+PSAxO1xuICB9LFxuICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShmdW5jKSB7XG4gICAgaWYgKCFzdWJzY3JpYmVycy5zaXplKSB0aGlzLnJlZ2lzdGVyKCk7XG4gICAgc3ViVWlkICs9IDE7XG4gICAgc3Vic2NyaWJlcnMuc2V0KHN1YlVpZCwgZnVuYyk7XG4gICAgZnVuYyhzY3JlZW5zKTtcbiAgICByZXR1cm4gc3ViVWlkO1xuICB9LFxuICB1bnN1YnNjcmliZTogZnVuY3Rpb24gdW5zdWJzY3JpYmUodG9rZW4pIHtcbiAgICBzdWJzY3JpYmVyc1tcImRlbGV0ZVwiXSh0b2tlbik7XG4gICAgaWYgKCFzdWJzY3JpYmVycy5zaXplKSB0aGlzLnVucmVnaXN0ZXIoKTtcbiAgfSxcbiAgdW5yZWdpc3RlcjogZnVuY3Rpb24gdW5yZWdpc3RlcigpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIE9iamVjdC5rZXlzKHJlc3BvbnNpdmVNYXApLmZvckVhY2goZnVuY3Rpb24gKHNjcmVlbikge1xuICAgICAgdmFyIG1hdGNoTWVkaWFRdWVyeSA9IHJlc3BvbnNpdmVNYXBbc2NyZWVuXTtcbiAgICAgIHZhciBoYW5kbGVyID0gX3RoaXMubWF0Y2hIYW5kbGVyc1ttYXRjaE1lZGlhUXVlcnldO1xuICAgICAgaGFuZGxlciA9PT0gbnVsbCB8fCBoYW5kbGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBoYW5kbGVyLm1xbC5yZW1vdmVMaXN0ZW5lcihoYW5kbGVyID09PSBudWxsIHx8IGhhbmRsZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGhhbmRsZXIubGlzdGVuZXIpO1xuICAgIH0pO1xuICAgIHN1YnNjcmliZXJzLmNsZWFyKCk7XG4gIH0sXG4gIHJlZ2lzdGVyOiBmdW5jdGlvbiByZWdpc3RlcigpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICBPYmplY3Qua2V5cyhyZXNwb25zaXZlTWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChzY3JlZW4pIHtcbiAgICAgIHZhciBtYXRjaE1lZGlhUXVlcnkgPSByZXNwb25zaXZlTWFwW3NjcmVlbl07XG4gICAgICB2YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiBsaXN0ZW5lcihfcmVmKSB7XG4gICAgICAgIHZhciBtYXRjaGVzID0gX3JlZi5tYXRjaGVzO1xuICAgICAgICBfdGhpczIuZGlzcGF0Y2goX2V4dGVuZHMoX2V4dGVuZHMoe30sIHNjcmVlbnMpLCBfZGVmaW5lUHJvcGVydHkoe30sIHNjcmVlbiwgbWF0Y2hlcykpKTtcbiAgICAgIH07XG4gICAgICB2YXIgbXFsID0gd2luZG93Lm1hdGNoTWVkaWEobWF0Y2hNZWRpYVF1ZXJ5KTtcbiAgICAgIG1xbC5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICBfdGhpczIubWF0Y2hIYW5kbGVyc1ttYXRjaE1lZGlhUXVlcnldID0ge1xuICAgICAgICBtcWw6IG1xbCxcbiAgICAgICAgbGlzdGVuZXI6IGxpc3RlbmVyXG4gICAgICB9O1xuICAgICAgbGlzdGVuZXIobXFsKTtcbiAgICB9KTtcbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IHJlc3BvbnNpdmVPYnNlcnZlOyIsImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUZvcmNlVXBkYXRlIGZyb20gJy4uLy4uL191dGlsL2hvb2tzL3VzZUZvcmNlVXBkYXRlJztcbmltcG9ydCBSZXNwb25zaXZlT2JzZXJ2ZSBmcm9tICcuLi8uLi9fdXRpbC9yZXNwb25zaXZlT2JzZXJ2ZSc7XG5mdW5jdGlvbiB1c2VCcmVha3BvaW50KCkge1xuICB2YXIgcmVmcmVzaE9uQ2hhbmdlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuICB2YXIgc2NyZWVuc1JlZiA9IHVzZVJlZih7fSk7XG4gIHZhciBmb3JjZVVwZGF0ZSA9IHVzZUZvcmNlVXBkYXRlKCk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRva2VuID0gUmVzcG9uc2l2ZU9ic2VydmUuc3Vic2NyaWJlKGZ1bmN0aW9uIChzdXBwb3J0U2NyZWVucykge1xuICAgICAgc2NyZWVuc1JlZi5jdXJyZW50ID0gc3VwcG9ydFNjcmVlbnM7XG4gICAgICBpZiAocmVmcmVzaE9uQ2hhbmdlKSB7XG4gICAgICAgIGZvcmNlVXBkYXRlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBSZXNwb25zaXZlT2JzZXJ2ZS51bnN1YnNjcmliZSh0b2tlbik7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gc2NyZWVuc1JlZi5jdXJyZW50O1xufVxuZXhwb3J0IGRlZmF1bHQgdXNlQnJlYWtwb2ludDsiLCJ2YXIgYXV0b0FkanVzdE92ZXJmbG93ID0ge1xuICBhZGp1c3RYOiAxLFxuICBhZGp1c3RZOiAxXG59O1xudmFyIHRhcmdldE9mZnNldCA9IFswLCAwXTtcbmV4cG9ydCB2YXIgcGxhY2VtZW50cyA9IHtcbiAgbGVmdDoge1xuICAgIHBvaW50czogWydjcicsICdjbCddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbLTQsIDBdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIHJpZ2h0OiB7XG4gICAgcG9pbnRzOiBbJ2NsJywgJ2NyJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFs0LCAwXSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICB0b3A6IHtcbiAgICBwb2ludHM6IFsnYmMnLCAndGMnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIC00XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBib3R0b206IHtcbiAgICBwb2ludHM6IFsndGMnLCAnYmMnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIDRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIHRvcExlZnQ6IHtcbiAgICBwb2ludHM6IFsnYmwnLCAndGwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIC00XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBsZWZ0VG9wOiB7XG4gICAgcG9pbnRzOiBbJ3RyJywgJ3RsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFstNCwgMF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgdG9wUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsnYnInLCAndHInXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIC00XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICByaWdodFRvcDoge1xuICAgIHBvaW50czogWyd0bCcsICd0ciddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbNCwgMF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgYm90dG9tUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsndHInLCAnYnInXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIDRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIHJpZ2h0Qm90dG9tOiB7XG4gICAgcG9pbnRzOiBbJ2JsJywgJ2JyJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFs0LCAwXSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBib3R0b21MZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ3RsJywgJ2JsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFswLCA0XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBsZWZ0Qm90dG9tOiB7XG4gICAgcG9pbnRzOiBbJ2JyJywgJ2JsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFstNCwgMF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IHBsYWNlbWVudHM7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBQb3B1cChwcm9wcykge1xuICB2YXIgc2hvd0Fycm93ID0gcHJvcHMuc2hvd0Fycm93LFxuICAgICAgYXJyb3dDb250ZW50ID0gcHJvcHMuYXJyb3dDb250ZW50LFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIGlkID0gcHJvcHMuaWQsXG4gICAgICBvdmVybGF5SW5uZXJTdHlsZSA9IHByb3BzLm92ZXJsYXlJbm5lclN0eWxlLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgc3R5bGUgPSBwcm9wcy5zdHlsZTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50XCIpLCBjbGFzc05hbWUpLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBzaG93QXJyb3cgIT09IGZhbHNlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYXJyb3dcIiksXG4gICAga2V5OiBcImFycm93XCJcbiAgfSwgYXJyb3dDb250ZW50KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbm5lclwiKSxcbiAgICBpZDogaWQsXG4gICAgcm9sZTogXCJ0b29sdGlwXCIsXG4gICAgc3R5bGU6IG92ZXJsYXlJbm5lclN0eWxlXG4gIH0sIHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJyA/IGNoaWxkcmVuKCkgOiBjaGlsZHJlbikpO1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZUltcGVyYXRpdmVIYW5kbGUsIGZvcndhcmRSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgVHJpZ2dlciBmcm9tICdyYy10cmlnZ2VyJztcbmltcG9ydCB7IHBsYWNlbWVudHMgfSBmcm9tICcuL3BsYWNlbWVudHMnO1xuaW1wb3J0IFBvcHVwIGZyb20gJy4vUG9wdXAnO1xuXG52YXIgVG9vbHRpcCA9IGZ1bmN0aW9uIFRvb2x0aXAocHJvcHMsIHJlZikge1xuICB2YXIgb3ZlcmxheUNsYXNzTmFtZSA9IHByb3BzLm92ZXJsYXlDbGFzc05hbWUsXG4gICAgICBfcHJvcHMkdHJpZ2dlciA9IHByb3BzLnRyaWdnZXIsXG4gICAgICB0cmlnZ2VyID0gX3Byb3BzJHRyaWdnZXIgPT09IHZvaWQgMCA/IFsnaG92ZXInXSA6IF9wcm9wcyR0cmlnZ2VyLFxuICAgICAgX3Byb3BzJG1vdXNlRW50ZXJEZWxhID0gcHJvcHMubW91c2VFbnRlckRlbGF5LFxuICAgICAgbW91c2VFbnRlckRlbGF5ID0gX3Byb3BzJG1vdXNlRW50ZXJEZWxhID09PSB2b2lkIDAgPyAwIDogX3Byb3BzJG1vdXNlRW50ZXJEZWxhLFxuICAgICAgX3Byb3BzJG1vdXNlTGVhdmVEZWxhID0gcHJvcHMubW91c2VMZWF2ZURlbGF5LFxuICAgICAgbW91c2VMZWF2ZURlbGF5ID0gX3Byb3BzJG1vdXNlTGVhdmVEZWxhID09PSB2b2lkIDAgPyAwLjEgOiBfcHJvcHMkbW91c2VMZWF2ZURlbGEsXG4gICAgICBvdmVybGF5U3R5bGUgPSBwcm9wcy5vdmVybGF5U3R5bGUsXG4gICAgICBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgcHJlZml4Q2xzID0gX3Byb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLXRvb2x0aXAnIDogX3Byb3BzJHByZWZpeENscyxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBvblZpc2libGVDaGFuZ2UgPSBwcm9wcy5vblZpc2libGVDaGFuZ2UsXG4gICAgICBhZnRlclZpc2libGVDaGFuZ2UgPSBwcm9wcy5hZnRlclZpc2libGVDaGFuZ2UsXG4gICAgICB0cmFuc2l0aW9uTmFtZSA9IHByb3BzLnRyYW5zaXRpb25OYW1lLFxuICAgICAgYW5pbWF0aW9uID0gcHJvcHMuYW5pbWF0aW9uLFxuICAgICAgbW90aW9uID0gcHJvcHMubW90aW9uLFxuICAgICAgX3Byb3BzJHBsYWNlbWVudCA9IHByb3BzLnBsYWNlbWVudCxcbiAgICAgIHBsYWNlbWVudCA9IF9wcm9wcyRwbGFjZW1lbnQgPT09IHZvaWQgMCA/ICdyaWdodCcgOiBfcHJvcHMkcGxhY2VtZW50LFxuICAgICAgX3Byb3BzJGFsaWduID0gcHJvcHMuYWxpZ24sXG4gICAgICBhbGlnbiA9IF9wcm9wcyRhbGlnbiA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkYWxpZ24sXG4gICAgICBfcHJvcHMkZGVzdHJveVRvb2x0aXAgPSBwcm9wcy5kZXN0cm95VG9vbHRpcE9uSGlkZSxcbiAgICAgIGRlc3Ryb3lUb29sdGlwT25IaWRlID0gX3Byb3BzJGRlc3Ryb3lUb29sdGlwID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRkZXN0cm95VG9vbHRpcCxcbiAgICAgIGRlZmF1bHRWaXNpYmxlID0gcHJvcHMuZGVmYXVsdFZpc2libGUsXG4gICAgICBnZXRUb29sdGlwQ29udGFpbmVyID0gcHJvcHMuZ2V0VG9vbHRpcENvbnRhaW5lcixcbiAgICAgIG92ZXJsYXlJbm5lclN0eWxlID0gcHJvcHMub3ZlcmxheUlubmVyU3R5bGUsXG4gICAgICBhcnJvd0NvbnRlbnQgPSBwcm9wcy5hcnJvd0NvbnRlbnQsXG4gICAgICBvdmVybGF5ID0gcHJvcHMub3ZlcmxheSxcbiAgICAgIGlkID0gcHJvcHMuaWQsXG4gICAgICBzaG93QXJyb3cgPSBwcm9wcy5zaG93QXJyb3csXG4gICAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcIm92ZXJsYXlDbGFzc05hbWVcIiwgXCJ0cmlnZ2VyXCIsIFwibW91c2VFbnRlckRlbGF5XCIsIFwibW91c2VMZWF2ZURlbGF5XCIsIFwib3ZlcmxheVN0eWxlXCIsIFwicHJlZml4Q2xzXCIsIFwiY2hpbGRyZW5cIiwgXCJvblZpc2libGVDaGFuZ2VcIiwgXCJhZnRlclZpc2libGVDaGFuZ2VcIiwgXCJ0cmFuc2l0aW9uTmFtZVwiLCBcImFuaW1hdGlvblwiLCBcIm1vdGlvblwiLCBcInBsYWNlbWVudFwiLCBcImFsaWduXCIsIFwiZGVzdHJveVRvb2x0aXBPbkhpZGVcIiwgXCJkZWZhdWx0VmlzaWJsZVwiLCBcImdldFRvb2x0aXBDb250YWluZXJcIiwgXCJvdmVybGF5SW5uZXJTdHlsZVwiLCBcImFycm93Q29udGVudFwiLCBcIm92ZXJsYXlcIiwgXCJpZFwiLCBcInNob3dBcnJvd1wiXSk7XG5cbiAgdmFyIGRvbVJlZiA9IHVzZVJlZihudWxsKTtcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZG9tUmVmLmN1cnJlbnQ7XG4gIH0pO1xuXG4gIHZhciBleHRyYVByb3BzID0gX29iamVjdFNwcmVhZCh7fSwgcmVzdFByb3BzKTtcblxuICBpZiAoJ3Zpc2libGUnIGluIHByb3BzKSB7XG4gICAgZXh0cmFQcm9wcy5wb3B1cFZpc2libGUgPSBwcm9wcy52aXNpYmxlO1xuICB9XG5cbiAgdmFyIGdldFBvcHVwRWxlbWVudCA9IGZ1bmN0aW9uIGdldFBvcHVwRWxlbWVudCgpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUG9wdXAsIHtcbiAgICAgIHNob3dBcnJvdzogc2hvd0Fycm93LFxuICAgICAgYXJyb3dDb250ZW50OiBhcnJvd0NvbnRlbnQsXG4gICAgICBrZXk6IFwiY29udGVudFwiLFxuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBpZDogaWQsXG4gICAgICBvdmVybGF5SW5uZXJTdHlsZTogb3ZlcmxheUlubmVyU3R5bGVcbiAgICB9LCBvdmVybGF5KTtcbiAgfTtcblxuICB2YXIgZGVzdHJveVRvb2x0aXAgPSBmYWxzZTtcbiAgdmFyIGF1dG9EZXN0cm95ID0gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBkZXN0cm95VG9vbHRpcE9uSGlkZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgZGVzdHJveVRvb2x0aXAgPSBkZXN0cm95VG9vbHRpcE9uSGlkZTtcbiAgfSBlbHNlIGlmIChkZXN0cm95VG9vbHRpcE9uSGlkZSAmJiBfdHlwZW9mKGRlc3Ryb3lUb29sdGlwT25IaWRlKSA9PT0gJ29iamVjdCcpIHtcbiAgICB2YXIga2VlcFBhcmVudCA9IGRlc3Ryb3lUb29sdGlwT25IaWRlLmtlZXBQYXJlbnQ7XG4gICAgZGVzdHJveVRvb2x0aXAgPSBrZWVwUGFyZW50ID09PSB0cnVlO1xuICAgIGF1dG9EZXN0cm95ID0ga2VlcFBhcmVudCA9PT0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJpZ2dlciwgX2V4dGVuZHMoe1xuICAgIHBvcHVwQ2xhc3NOYW1lOiBvdmVybGF5Q2xhc3NOYW1lLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIHBvcHVwOiBnZXRQb3B1cEVsZW1lbnQsXG4gICAgYWN0aW9uOiB0cmlnZ2VyLFxuICAgIGJ1aWx0aW5QbGFjZW1lbnRzOiBwbGFjZW1lbnRzLFxuICAgIHBvcHVwUGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgcmVmOiBkb21SZWYsXG4gICAgcG9wdXBBbGlnbjogYWxpZ24sXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFRvb2x0aXBDb250YWluZXIsXG4gICAgb25Qb3B1cFZpc2libGVDaGFuZ2U6IG9uVmlzaWJsZUNoYW5nZSxcbiAgICBhZnRlclBvcHVwVmlzaWJsZUNoYW5nZTogYWZ0ZXJWaXNpYmxlQ2hhbmdlLFxuICAgIHBvcHVwVHJhbnNpdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lLFxuICAgIHBvcHVwQW5pbWF0aW9uOiBhbmltYXRpb24sXG4gICAgcG9wdXBNb3Rpb246IG1vdGlvbixcbiAgICBkZWZhdWx0UG9wdXBWaXNpYmxlOiBkZWZhdWx0VmlzaWJsZSxcbiAgICBkZXN0cm95UG9wdXBPbkhpZGU6IGRlc3Ryb3lUb29sdGlwLFxuICAgIGF1dG9EZXN0cm95OiBhdXRvRGVzdHJveSxcbiAgICBtb3VzZUxlYXZlRGVsYXk6IG1vdXNlTGVhdmVEZWxheSxcbiAgICBwb3B1cFN0eWxlOiBvdmVybGF5U3R5bGUsXG4gICAgbW91c2VFbnRlckRlbGF5OiBtb3VzZUVudGVyRGVsYXlcbiAgfSwgZXh0cmFQcm9wcyksIGNoaWxkcmVuKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9mb3J3YXJkUmVmKFRvb2x0aXApOyIsImltcG9ydCB7IHR1cGxlIH0gZnJvbSAnLi90eXBlJztcbmV4cG9ydCB2YXIgUHJlc2V0U3RhdHVzQ29sb3JUeXBlcyA9IHR1cGxlKCdzdWNjZXNzJywgJ3Byb2Nlc3NpbmcnLCAnZXJyb3InLCAnZGVmYXVsdCcsICd3YXJuaW5nJyk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L3ByZWZlci1kZWZhdWx0LWV4cG9ydFxuZXhwb3J0IHZhciBQcmVzZXRDb2xvclR5cGVzID0gdHVwbGUoJ3BpbmsnLCAncmVkJywgJ3llbGxvdycsICdvcmFuZ2UnLCAnY3lhbicsICdncmVlbicsICdibHVlJywgJ3B1cnBsZScsICdnZWVrYmx1ZScsICdtYWdlbnRhJywgJ3ZvbGNhbm8nLCAnZ29sZCcsICdsaW1lJyk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgeyBwbGFjZW1lbnRzIH0gZnJvbSBcInJjLXRvb2x0aXAvZXMvcGxhY2VtZW50c1wiO1xudmFyIGF1dG9BZGp1c3RPdmVyZmxvd0VuYWJsZWQgPSB7XG4gIGFkanVzdFg6IDEsXG4gIGFkanVzdFk6IDFcbn07XG52YXIgYXV0b0FkanVzdE92ZXJmbG93RGlzYWJsZWQgPSB7XG4gIGFkanVzdFg6IDAsXG4gIGFkanVzdFk6IDBcbn07XG52YXIgdGFyZ2V0T2Zmc2V0ID0gWzAsIDBdO1xuZXhwb3J0IGZ1bmN0aW9uIGdldE92ZXJmbG93T3B0aW9ucyhhdXRvQWRqdXN0T3ZlcmZsb3cpIHtcbiAgaWYgKHR5cGVvZiBhdXRvQWRqdXN0T3ZlcmZsb3cgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBhdXRvQWRqdXN0T3ZlcmZsb3cgPyBhdXRvQWRqdXN0T3ZlcmZsb3dFbmFibGVkIDogYXV0b0FkanVzdE92ZXJmbG93RGlzYWJsZWQ7XG4gIH1cbiAgcmV0dXJuIF9leHRlbmRzKF9leHRlbmRzKHt9LCBhdXRvQWRqdXN0T3ZlcmZsb3dEaXNhYmxlZCksIGF1dG9BZGp1c3RPdmVyZmxvdyk7XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRQbGFjZW1lbnRzKGNvbmZpZykge1xuICB2YXIgX2NvbmZpZyRhcnJvd1dpZHRoID0gY29uZmlnLmFycm93V2lkdGgsXG4gICAgYXJyb3dXaWR0aCA9IF9jb25maWckYXJyb3dXaWR0aCA9PT0gdm9pZCAwID8gNCA6IF9jb25maWckYXJyb3dXaWR0aCxcbiAgICBfY29uZmlnJGhvcml6b250YWxBcnIgPSBjb25maWcuaG9yaXpvbnRhbEFycm93U2hpZnQsXG4gICAgaG9yaXpvbnRhbEFycm93U2hpZnQgPSBfY29uZmlnJGhvcml6b250YWxBcnIgPT09IHZvaWQgMCA/IDE2IDogX2NvbmZpZyRob3Jpem9udGFsQXJyLFxuICAgIF9jb25maWckdmVydGljYWxBcnJvdyA9IGNvbmZpZy52ZXJ0aWNhbEFycm93U2hpZnQsXG4gICAgdmVydGljYWxBcnJvd1NoaWZ0ID0gX2NvbmZpZyR2ZXJ0aWNhbEFycm93ID09PSB2b2lkIDAgPyA4IDogX2NvbmZpZyR2ZXJ0aWNhbEFycm93LFxuICAgIGF1dG9BZGp1c3RPdmVyZmxvdyA9IGNvbmZpZy5hdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgYXJyb3dQb2ludEF0Q2VudGVyID0gY29uZmlnLmFycm93UG9pbnRBdENlbnRlcjtcbiAgdmFyIHBsYWNlbWVudE1hcCA9IHtcbiAgICBsZWZ0OiB7XG4gICAgICBwb2ludHM6IFsnY3InLCAnY2wnXSxcbiAgICAgIG9mZnNldDogWy00LCAwXVxuICAgIH0sXG4gICAgcmlnaHQ6IHtcbiAgICAgIHBvaW50czogWydjbCcsICdjciddLFxuICAgICAgb2Zmc2V0OiBbNCwgMF1cbiAgICB9LFxuICAgIHRvcDoge1xuICAgICAgcG9pbnRzOiBbJ2JjJywgJ3RjJ10sXG4gICAgICBvZmZzZXQ6IFswLCAtNF1cbiAgICB9LFxuICAgIGJvdHRvbToge1xuICAgICAgcG9pbnRzOiBbJ3RjJywgJ2JjJ10sXG4gICAgICBvZmZzZXQ6IFswLCA0XVxuICAgIH0sXG4gICAgdG9wTGVmdDoge1xuICAgICAgcG9pbnRzOiBbJ2JsJywgJ3RjJ10sXG4gICAgICBvZmZzZXQ6IFstKGhvcml6b250YWxBcnJvd1NoaWZ0ICsgYXJyb3dXaWR0aCksIC00XVxuICAgIH0sXG4gICAgbGVmdFRvcDoge1xuICAgICAgcG9pbnRzOiBbJ3RyJywgJ2NsJ10sXG4gICAgICBvZmZzZXQ6IFstNCwgLSh2ZXJ0aWNhbEFycm93U2hpZnQgKyBhcnJvd1dpZHRoKV1cbiAgICB9LFxuICAgIHRvcFJpZ2h0OiB7XG4gICAgICBwb2ludHM6IFsnYnInLCAndGMnXSxcbiAgICAgIG9mZnNldDogW2hvcml6b250YWxBcnJvd1NoaWZ0ICsgYXJyb3dXaWR0aCwgLTRdXG4gICAgfSxcbiAgICByaWdodFRvcDoge1xuICAgICAgcG9pbnRzOiBbJ3RsJywgJ2NyJ10sXG4gICAgICBvZmZzZXQ6IFs0LCAtKHZlcnRpY2FsQXJyb3dTaGlmdCArIGFycm93V2lkdGgpXVxuICAgIH0sXG4gICAgYm90dG9tUmlnaHQ6IHtcbiAgICAgIHBvaW50czogWyd0cicsICdiYyddLFxuICAgICAgb2Zmc2V0OiBbaG9yaXpvbnRhbEFycm93U2hpZnQgKyBhcnJvd1dpZHRoLCA0XVxuICAgIH0sXG4gICAgcmlnaHRCb3R0b206IHtcbiAgICAgIHBvaW50czogWydibCcsICdjciddLFxuICAgICAgb2Zmc2V0OiBbNCwgdmVydGljYWxBcnJvd1NoaWZ0ICsgYXJyb3dXaWR0aF1cbiAgICB9LFxuICAgIGJvdHRvbUxlZnQ6IHtcbiAgICAgIHBvaW50czogWyd0bCcsICdiYyddLFxuICAgICAgb2Zmc2V0OiBbLShob3Jpem9udGFsQXJyb3dTaGlmdCArIGFycm93V2lkdGgpLCA0XVxuICAgIH0sXG4gICAgbGVmdEJvdHRvbToge1xuICAgICAgcG9pbnRzOiBbJ2JyJywgJ2NsJ10sXG4gICAgICBvZmZzZXQ6IFstNCwgdmVydGljYWxBcnJvd1NoaWZ0ICsgYXJyb3dXaWR0aF1cbiAgICB9XG4gIH07XG4gIE9iamVjdC5rZXlzKHBsYWNlbWVudE1hcCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcGxhY2VtZW50TWFwW2tleV0gPSBhcnJvd1BvaW50QXRDZW50ZXIgPyBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgcGxhY2VtZW50TWFwW2tleV0pLCB7XG4gICAgICBvdmVyZmxvdzogZ2V0T3ZlcmZsb3dPcHRpb25zKGF1dG9BZGp1c3RPdmVyZmxvdyksXG4gICAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICAgIH0pIDogX2V4dGVuZHMoX2V4dGVuZHMoe30sIHBsYWNlbWVudHNba2V5XSksIHtcbiAgICAgIG92ZXJmbG93OiBnZXRPdmVyZmxvd09wdGlvbnMoYXV0b0FkanVzdE92ZXJmbG93KVxuICAgIH0pO1xuICAgIHBsYWNlbWVudE1hcFtrZXldLmlnbm9yZVNoYWtlID0gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiBwbGFjZW1lbnRNYXA7XG59IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmNUb29sdGlwIGZyb20gJ3JjLXRvb2x0aXAnO1xuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB7IFByZXNldENvbG9yVHlwZXMgfSBmcm9tICcuLi9fdXRpbC9jb2xvcnMnO1xuaW1wb3J0IHsgZ2V0VHJhbnNpdGlvbk5hbWUgfSBmcm9tICcuLi9fdXRpbC9tb3Rpb24nO1xuaW1wb3J0IGdldFBsYWNlbWVudHMgZnJvbSAnLi4vX3V0aWwvcGxhY2VtZW50cyc7XG5pbXBvcnQgeyBjbG9uZUVsZW1lbnQsIGlzVmFsaWRFbGVtZW50LCBpc0ZyYWdtZW50IH0gZnJvbSAnLi4vX3V0aWwvcmVhY3ROb2RlJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xudmFyIHNwbGl0T2JqZWN0ID0gZnVuY3Rpb24gc3BsaXRPYmplY3Qob2JqLCBrZXlzKSB7XG4gIHZhciBwaWNrZWQgPSB7fTtcbiAgdmFyIG9taXR0ZWQgPSBfZXh0ZW5kcyh7fSwgb2JqKTtcbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAob2JqICYmIGtleSBpbiBvYmopIHtcbiAgICAgIHBpY2tlZFtrZXldID0gb2JqW2tleV07XG4gICAgICBkZWxldGUgb21pdHRlZFtrZXldO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB7XG4gICAgcGlja2VkOiBwaWNrZWQsXG4gICAgb21pdHRlZDogb21pdHRlZFxuICB9O1xufTtcbnZhciBQcmVzZXRDb2xvclJlZ2V4ID0gbmV3IFJlZ0V4cChcIl4oXCIuY29uY2F0KFByZXNldENvbG9yVHlwZXMuam9pbignfCcpLCBcIikoLWludmVyc2UpPyRcIikpO1xuLy8gRml4IFRvb2x0aXAgd29uJ3QgaGlkZSBhdCBkaXNhYmxlZCBidXR0b25cbi8vIG1vdXNlIGV2ZW50cyBkb24ndCB0cmlnZ2VyIGF0IGRpc2FibGVkIGJ1dHRvbiBpbiBDaHJvbWVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvdG9vbHRpcC9pc3N1ZXMvMThcbmZ1bmN0aW9uIGdldERpc2FibGVkQ29tcGF0aWJsZUNoaWxkcmVuKGVsZW1lbnQsIHByZWZpeENscykge1xuICB2YXIgZWxlbWVudFR5cGUgPSBlbGVtZW50LnR5cGU7XG4gIGlmICgoZWxlbWVudFR5cGUuX19BTlRfQlVUVE9OID09PSB0cnVlIHx8IGVsZW1lbnQudHlwZSA9PT0gJ2J1dHRvbicpICYmIGVsZW1lbnQucHJvcHMuZGlzYWJsZWQgfHwgZWxlbWVudFR5cGUuX19BTlRfU1dJVENIID09PSB0cnVlICYmIChlbGVtZW50LnByb3BzLmRpc2FibGVkIHx8IGVsZW1lbnQucHJvcHMubG9hZGluZykgfHwgZWxlbWVudFR5cGUuX19BTlRfUkFESU8gPT09IHRydWUgJiYgZWxlbWVudC5wcm9wcy5kaXNhYmxlZCkge1xuICAgIC8vIFBpY2sgc29tZSBsYXlvdXQgcmVsYXRlZCBzdHlsZSBwcm9wZXJ0aWVzIHVwIHRvIHNwYW5cbiAgICAvLyBQcmV2ZW50IGxheW91dCBidWdzIGxpa2UgaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNTI1NFxuICAgIHZhciBfc3BsaXRPYmplY3QgPSBzcGxpdE9iamVjdChlbGVtZW50LnByb3BzLnN0eWxlLCBbJ3Bvc2l0aW9uJywgJ2xlZnQnLCAncmlnaHQnLCAndG9wJywgJ2JvdHRvbScsICdmbG9hdCcsICdkaXNwbGF5JywgJ3pJbmRleCddKSxcbiAgICAgIHBpY2tlZCA9IF9zcGxpdE9iamVjdC5waWNrZWQsXG4gICAgICBvbWl0dGVkID0gX3NwbGl0T2JqZWN0Lm9taXR0ZWQ7XG4gICAgdmFyIHNwYW5TdHlsZSA9IF9leHRlbmRzKF9leHRlbmRzKHtcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snXG4gICAgfSwgcGlja2VkKSwge1xuICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQnLFxuICAgICAgd2lkdGg6IGVsZW1lbnQucHJvcHMuYmxvY2sgPyAnMTAwJScgOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgICB2YXIgYnV0dG9uU3R5bGUgPSBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgb21pdHRlZCksIHtcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgIH0pO1xuICAgIHZhciBjaGlsZCA9IGNsb25lRWxlbWVudChlbGVtZW50LCB7XG4gICAgICBzdHlsZTogYnV0dG9uU3R5bGUsXG4gICAgICBjbGFzc05hbWU6IG51bGxcbiAgICB9KTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIHN0eWxlOiBzcGFuU3R5bGUsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoZWxlbWVudC5wcm9wcy5jbGFzc05hbWUsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWQtY29tcGF0aWJsZS13cmFwcGVyXCIpKVxuICAgIH0sIGNoaWxkKTtcbiAgfVxuICByZXR1cm4gZWxlbWVudDtcbn1cbnZhciBUb29sdGlwID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzMjtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRDb250ZXh0UG9wdXBDb250YWluZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQb3B1cENvbnRhaW5lcixcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICAvLyBXYXJuaW5nIGZvciBkZXByZWNhdGVkIHVzYWdlXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgW1sndmlzaWJsZScsICdvcGVuJ10sIFsnZGVmYXVsdFZpc2libGUnLCAnZGVmYXVsdE9wZW4nXSwgWydvblZpc2libGVDaGFuZ2UnLCAnb25PcGVuQ2hhbmdlJ10sIFsnYWZ0ZXJWaXNpYmxlQ2hhbmdlJywgJ2FmdGVyT3BlbkNoYW5nZSddXS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKSxcbiAgICAgICAgZGVwcmVjYXRlZE5hbWUgPSBfcmVmMlswXSxcbiAgICAgICAgbmV3TmFtZSA9IF9yZWYyWzFdO1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKGRlcHJlY2F0ZWROYW1lIGluIHByb3BzKSwgJ1Rvb2x0aXAnLCBcImBcIi5jb25jYXQoZGVwcmVjYXRlZE5hbWUsIFwiYCBpcyBkZXByZWNhdGVkIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZCBpbiBuZXh0IG1ham9yIHZlcnNpb24sIHBsZWFzZSB1c2UgYFwiKS5jb25jYXQobmV3TmFtZSwgXCJgIGluc3RlYWQuXCIpKSA6IHZvaWQgMDtcbiAgICB9KTtcbiAgfVxuICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gdXNlTWVyZ2VkU3RhdGUoZmFsc2UsIHtcbiAgICAgIHZhbHVlOiBwcm9wcy5vcGVuICE9PSB1bmRlZmluZWQgPyBwcm9wcy5vcGVuIDogcHJvcHMudmlzaWJsZSxcbiAgICAgIGRlZmF1bHRWYWx1ZTogcHJvcHMuZGVmYXVsdE9wZW4gIT09IHVuZGVmaW5lZCA/IHByb3BzLmRlZmF1bHRPcGVuIDogcHJvcHMuZGVmYXVsdFZpc2libGVcbiAgICB9KSxcbiAgICBfdXNlTWVyZ2VkU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZU1lcmdlZFN0YXRlLCAyKSxcbiAgICBvcGVuID0gX3VzZU1lcmdlZFN0YXRlMlswXSxcbiAgICBzZXRPcGVuID0gX3VzZU1lcmdlZFN0YXRlMlsxXTtcbiAgdmFyIGlzTm9UaXRsZSA9IGZ1bmN0aW9uIGlzTm9UaXRsZSgpIHtcbiAgICB2YXIgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICAgIG92ZXJsYXkgPSBwcm9wcy5vdmVybGF5O1xuICAgIHJldHVybiAhdGl0bGUgJiYgIW92ZXJsYXkgJiYgdGl0bGUgIT09IDA7IC8vIG92ZXJsYXkgZm9yIG9sZCB2ZXJzaW9uIGNvbXBhdGliaWxpdHlcbiAgfTtcblxuICB2YXIgb25PcGVuQ2hhbmdlID0gZnVuY3Rpb24gb25PcGVuQ2hhbmdlKHZpcykge1xuICAgIHZhciBfYSwgX2I7XG4gICAgc2V0T3Blbihpc05vVGl0bGUoKSA/IGZhbHNlIDogdmlzKTtcbiAgICBpZiAoIWlzTm9UaXRsZSgpKSB7XG4gICAgICAoX2EgPSBwcm9wcy5vbk9wZW5DaGFuZ2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHByb3BzLCB2aXMpO1xuICAgICAgKF9iID0gcHJvcHMub25WaXNpYmxlQ2hhbmdlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChwcm9wcywgdmlzKTtcbiAgICB9XG4gIH07XG4gIHZhciBnZXRUb29sdGlwUGxhY2VtZW50cyA9IGZ1bmN0aW9uIGdldFRvb2x0aXBQbGFjZW1lbnRzKCkge1xuICAgIHZhciBidWlsdGluUGxhY2VtZW50cyA9IHByb3BzLmJ1aWx0aW5QbGFjZW1lbnRzLFxuICAgICAgX3Byb3BzJGFycm93UG9pbnRBdENlID0gcHJvcHMuYXJyb3dQb2ludEF0Q2VudGVyLFxuICAgICAgYXJyb3dQb2ludEF0Q2VudGVyID0gX3Byb3BzJGFycm93UG9pbnRBdENlID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRhcnJvd1BvaW50QXRDZSxcbiAgICAgIF9wcm9wcyRhdXRvQWRqdXN0T3ZlciA9IHByb3BzLmF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICAgIGF1dG9BZGp1c3RPdmVyZmxvdyA9IF9wcm9wcyRhdXRvQWRqdXN0T3ZlciA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRhdXRvQWRqdXN0T3ZlcjtcbiAgICByZXR1cm4gYnVpbHRpblBsYWNlbWVudHMgfHwgZ2V0UGxhY2VtZW50cyh7XG4gICAgICBhcnJvd1BvaW50QXRDZW50ZXI6IGFycm93UG9pbnRBdENlbnRlcixcbiAgICAgIGF1dG9BZGp1c3RPdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93XG4gICAgfSk7XG4gIH07XG4gIC8vIOWKqOaAgeiuvue9ruWKqOeUu+eCuVxuICB2YXIgb25Qb3B1cEFsaWduID0gZnVuY3Rpb24gb25Qb3B1cEFsaWduKGRvbU5vZGUsIGFsaWduKSB7XG4gICAgdmFyIHBsYWNlbWVudHMgPSBnZXRUb29sdGlwUGxhY2VtZW50cygpO1xuICAgIC8vIOW9k+WJjei/lOWbnueahOS9jee9rlxuICAgIHZhciBwbGFjZW1lbnQgPSBPYmplY3Qua2V5cyhwbGFjZW1lbnRzKS5maW5kKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBfYSwgX2I7XG4gICAgICByZXR1cm4gcGxhY2VtZW50c1trZXldLnBvaW50c1swXSA9PT0gKChfYSA9IGFsaWduLnBvaW50cykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzBdKSAmJiBwbGFjZW1lbnRzW2tleV0ucG9pbnRzWzFdID09PSAoKF9iID0gYWxpZ24ucG9pbnRzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2JbMV0pO1xuICAgIH0pO1xuICAgIGlmICghcGxhY2VtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOagueaNruW9k+WJjeWdkOagh+iuvue9ruWKqOeUu+eCuVxuICAgIHZhciByZWN0ID0gZG9tTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB2YXIgdHJhbnNmb3JtT3JpZ2luID0ge1xuICAgICAgdG9wOiAnNTAlJyxcbiAgICAgIGxlZnQ6ICc1MCUnXG4gICAgfTtcbiAgICBpZiAoL3RvcHxCb3R0b20vLnRlc3QocGxhY2VtZW50KSkge1xuICAgICAgdHJhbnNmb3JtT3JpZ2luLnRvcCA9IFwiXCIuY29uY2F0KHJlY3QuaGVpZ2h0IC0gYWxpZ24ub2Zmc2V0WzFdLCBcInB4XCIpO1xuICAgIH0gZWxzZSBpZiAoL1RvcHxib3R0b20vLnRlc3QocGxhY2VtZW50KSkge1xuICAgICAgdHJhbnNmb3JtT3JpZ2luLnRvcCA9IFwiXCIuY29uY2F0KC1hbGlnbi5vZmZzZXRbMV0sIFwicHhcIik7XG4gICAgfVxuICAgIGlmICgvbGVmdHxSaWdodC8udGVzdChwbGFjZW1lbnQpKSB7XG4gICAgICB0cmFuc2Zvcm1PcmlnaW4ubGVmdCA9IFwiXCIuY29uY2F0KHJlY3Qud2lkdGggLSBhbGlnbi5vZmZzZXRbMF0sIFwicHhcIik7XG4gICAgfSBlbHNlIGlmICgvcmlnaHR8TGVmdC8udGVzdChwbGFjZW1lbnQpKSB7XG4gICAgICB0cmFuc2Zvcm1PcmlnaW4ubGVmdCA9IFwiXCIuY29uY2F0KC1hbGlnbi5vZmZzZXRbMF0sIFwicHhcIik7XG4gICAgfVxuICAgIGRvbU5vZGUuc3R5bGUudHJhbnNmb3JtT3JpZ2luID0gXCJcIi5jb25jYXQodHJhbnNmb3JtT3JpZ2luLmxlZnQsIFwiIFwiKS5jb25jYXQodHJhbnNmb3JtT3JpZ2luLnRvcCk7XG4gIH07XG4gIHZhciBnZXRPdmVybGF5ID0gZnVuY3Rpb24gZ2V0T3ZlcmxheSgpIHtcbiAgICB2YXIgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICAgIG92ZXJsYXkgPSBwcm9wcy5vdmVybGF5O1xuICAgIGlmICh0aXRsZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRpdGxlO1xuICAgIH1cbiAgICByZXR1cm4gb3ZlcmxheSB8fCB0aXRsZSB8fCAnJztcbiAgfTtcbiAgdmFyIGdldFBvcHVwQ29udGFpbmVyID0gcHJvcHMuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgX3Byb3BzJHBsYWNlbWVudCA9IHByb3BzLnBsYWNlbWVudCxcbiAgICBwbGFjZW1lbnQgPSBfcHJvcHMkcGxhY2VtZW50ID09PSB2b2lkIDAgPyAndG9wJyA6IF9wcm9wcyRwbGFjZW1lbnQsXG4gICAgX3Byb3BzJG1vdXNlRW50ZXJEZWxhID0gcHJvcHMubW91c2VFbnRlckRlbGF5LFxuICAgIG1vdXNlRW50ZXJEZWxheSA9IF9wcm9wcyRtb3VzZUVudGVyRGVsYSA9PT0gdm9pZCAwID8gMC4xIDogX3Byb3BzJG1vdXNlRW50ZXJEZWxhLFxuICAgIF9wcm9wcyRtb3VzZUxlYXZlRGVsYSA9IHByb3BzLm1vdXNlTGVhdmVEZWxheSxcbiAgICBtb3VzZUxlYXZlRGVsYXkgPSBfcHJvcHMkbW91c2VMZWF2ZURlbGEgPT09IHZvaWQgMCA/IDAuMSA6IF9wcm9wcyRtb3VzZUxlYXZlRGVsYSxcbiAgICBvdGhlclByb3BzID0gX19yZXN0KHByb3BzLCBbXCJnZXRQb3B1cENvbnRhaW5lclwiLCBcInBsYWNlbWVudFwiLCBcIm1vdXNlRW50ZXJEZWxheVwiLCBcIm1vdXNlTGVhdmVEZWxheVwiXSk7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgb3BlbkNsYXNzTmFtZSA9IHByb3BzLm9wZW5DbGFzc05hbWUsXG4gICAgZ2V0VG9vbHRpcENvbnRhaW5lciA9IHByb3BzLmdldFRvb2x0aXBDb250YWluZXIsXG4gICAgb3ZlcmxheUNsYXNzTmFtZSA9IHByb3BzLm92ZXJsYXlDbGFzc05hbWUsXG4gICAgY29sb3IgPSBwcm9wcy5jb2xvcixcbiAgICBvdmVybGF5SW5uZXJTdHlsZSA9IHByb3BzLm92ZXJsYXlJbm5lclN0eWxlLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW47XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3Rvb2x0aXAnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgcm9vdFByZWZpeENscyA9IGdldFByZWZpeENscygpO1xuICB2YXIgdGVtcE9wZW4gPSBvcGVuO1xuICAvLyBIaWRlIHRvb2x0aXAgd2hlbiB0aGVyZSBpcyBubyB0aXRsZVxuICBpZiAoISgnb3BlbicgaW4gcHJvcHMpICYmICEoJ3Zpc2libGUnIGluIHByb3BzKSAmJiBpc05vVGl0bGUoKSkge1xuICAgIHRlbXBPcGVuID0gZmFsc2U7XG4gIH1cbiAgdmFyIGNoaWxkID0gZ2V0RGlzYWJsZWRDb21wYXRpYmxlQ2hpbGRyZW4oaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pICYmICFpc0ZyYWdtZW50KGNoaWxkcmVuKSA/IGNoaWxkcmVuIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIGNoaWxkcmVuKSwgcHJlZml4Q2xzKTtcbiAgdmFyIGNoaWxkUHJvcHMgPSBjaGlsZC5wcm9wcztcbiAgdmFyIGNoaWxkQ2xzID0gIWNoaWxkUHJvcHMuY2xhc3NOYW1lIHx8IHR5cGVvZiBjaGlsZFByb3BzLmNsYXNzTmFtZSA9PT0gJ3N0cmluZycgPyBjbGFzc05hbWVzKGNoaWxkUHJvcHMuY2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoe30sIG9wZW5DbGFzc05hbWUgfHwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1vcGVuXCIpLCB0cnVlKSkgOiBjaGlsZFByb3BzLmNsYXNzTmFtZTtcbiAgdmFyIGN1c3RvbU92ZXJsYXlDbGFzc05hbWUgPSBjbGFzc05hbWVzKG92ZXJsYXlDbGFzc05hbWUsIChfY2xhc3NOYW1lczIgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoY29sb3IpLCBjb2xvciAmJiBQcmVzZXRDb2xvclJlZ2V4LnRlc3QoY29sb3IpKSwgX2NsYXNzTmFtZXMyKSk7XG4gIHZhciBmb3JtYXR0ZWRPdmVybGF5SW5uZXJTdHlsZSA9IG92ZXJsYXlJbm5lclN0eWxlO1xuICB2YXIgYXJyb3dDb250ZW50U3R5bGUgPSB7fTtcbiAgaWYgKGNvbG9yICYmICFQcmVzZXRDb2xvclJlZ2V4LnRlc3QoY29sb3IpKSB7XG4gICAgZm9ybWF0dGVkT3ZlcmxheUlubmVyU3R5bGUgPSBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgb3ZlcmxheUlubmVyU3R5bGUpLCB7XG4gICAgICBiYWNrZ3JvdW5kOiBjb2xvclxuICAgIH0pO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBhcnJvd0NvbnRlbnRTdHlsZSA9IHtcbiAgICAgICctLWFudGQtYXJyb3ctYmFja2dyb3VuZC1jb2xvcic6IGNvbG9yXG4gICAgfTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmNUb29sdGlwLCBfZXh0ZW5kcyh7fSwgb3RoZXJQcm9wcywge1xuICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgIG1vdXNlRW50ZXJEZWxheTogbW91c2VFbnRlckRlbGF5LFxuICAgIG1vdXNlTGVhdmVEZWxheTogbW91c2VMZWF2ZURlbGF5LFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIG92ZXJsYXlDbGFzc05hbWU6IGN1c3RvbU92ZXJsYXlDbGFzc05hbWUsXG4gICAgZ2V0VG9vbHRpcENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIgfHwgZ2V0VG9vbHRpcENvbnRhaW5lciB8fCBnZXRDb250ZXh0UG9wdXBDb250YWluZXIsXG4gICAgcmVmOiByZWYsXG4gICAgYnVpbHRpblBsYWNlbWVudHM6IGdldFRvb2x0aXBQbGFjZW1lbnRzKCksXG4gICAgb3ZlcmxheTogZ2V0T3ZlcmxheSgpLFxuICAgIHZpc2libGU6IHRlbXBPcGVuLFxuICAgIG9uVmlzaWJsZUNoYW5nZTogb25PcGVuQ2hhbmdlLFxuICAgIG9uUG9wdXBBbGlnbjogb25Qb3B1cEFsaWduLFxuICAgIG92ZXJsYXlJbm5lclN0eWxlOiBmb3JtYXR0ZWRPdmVybGF5SW5uZXJTdHlsZSxcbiAgICBhcnJvd0NvbnRlbnQ6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYXJyb3ctY29udGVudFwiKSxcbiAgICAgIHN0eWxlOiBhcnJvd0NvbnRlbnRTdHlsZVxuICAgIH0pLFxuICAgIG1vdGlvbjoge1xuICAgICAgbW90aW9uTmFtZTogZ2V0VHJhbnNpdGlvbk5hbWUocm9vdFByZWZpeENscywgJ3pvb20tYmlnLWZhc3QnLCBwcm9wcy50cmFuc2l0aW9uTmFtZSksXG4gICAgICBtb3Rpb25EZWFkbGluZTogMTAwMFxuICAgIH1cbiAgfSksIHRlbXBPcGVuID8gY2xvbmVFbGVtZW50KGNoaWxkLCB7XG4gICAgY2xhc3NOYW1lOiBjaGlsZENsc1xuICB9KSA6IGNoaWxkKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgVG9vbHRpcC5kaXNwbGF5TmFtZSA9ICdUb29sdGlwJztcbn1cbmV4cG9ydCBkZWZhdWx0IFRvb2x0aXA7IiwiZXhwb3J0IHZhciBnZXRSZW5kZXJQcm9wVmFsdWUgPSBmdW5jdGlvbiBnZXRSZW5kZXJQcm9wVmFsdWUocHJvcFZhbHVlKSB7XG4gIGlmICghcHJvcFZhbHVlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gcHJvcFZhbHVlKCk7XG4gIH1cbiAgcmV0dXJuIHByb3BWYWx1ZTtcbn07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgVG9vbHRpcCBmcm9tICcuLi90b29sdGlwJztcbmltcG9ydCB7IGdldFJlbmRlclByb3BWYWx1ZSB9IGZyb20gJy4uL191dGlsL2dldFJlbmRlclByb3BWYWx1ZSc7XG5pbXBvcnQgeyBnZXRUcmFuc2l0aW9uTmFtZSB9IGZyb20gJy4uL191dGlsL21vdGlvbic7XG52YXIgT3ZlcmxheSA9IGZ1bmN0aW9uIE92ZXJsYXkoX3JlZikge1xuICB2YXIgdGl0bGUgPSBfcmVmLnRpdGxlLFxuICAgIGNvbnRlbnQgPSBfcmVmLmNvbnRlbnQsXG4gICAgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHM7XG4gIGlmICghdGl0bGUgJiYgIWNvbnRlbnQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHRpdGxlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdGl0bGVcIilcbiAgfSwgZ2V0UmVuZGVyUHJvcFZhbHVlKHRpdGxlKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5uZXItY29udGVudFwiKVxuICB9LCBnZXRSZW5kZXJQcm9wVmFsdWUoY29udGVudCkpKTtcbn07XG52YXIgUG9wb3ZlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICBjb250ZW50ID0gcHJvcHMuY29udGVudCxcbiAgICBfb3ZlcmxheSA9IHByb3BzLl9vdmVybGF5LFxuICAgIF9wcm9wcyRwbGFjZW1lbnQgPSBwcm9wcy5wbGFjZW1lbnQsXG4gICAgcGxhY2VtZW50ID0gX3Byb3BzJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gJ3RvcCcgOiBfcHJvcHMkcGxhY2VtZW50LFxuICAgIF9wcm9wcyR0cmlnZ2VyID0gcHJvcHMudHJpZ2dlcixcbiAgICB0cmlnZ2VyID0gX3Byb3BzJHRyaWdnZXIgPT09IHZvaWQgMCA/ICdob3ZlcicgOiBfcHJvcHMkdHJpZ2dlcixcbiAgICBfcHJvcHMkbW91c2VFbnRlckRlbGEgPSBwcm9wcy5tb3VzZUVudGVyRGVsYXksXG4gICAgbW91c2VFbnRlckRlbGF5ID0gX3Byb3BzJG1vdXNlRW50ZXJEZWxhID09PSB2b2lkIDAgPyAwLjEgOiBfcHJvcHMkbW91c2VFbnRlckRlbGEsXG4gICAgX3Byb3BzJG1vdXNlTGVhdmVEZWxhID0gcHJvcHMubW91c2VMZWF2ZURlbGF5LFxuICAgIG1vdXNlTGVhdmVEZWxheSA9IF9wcm9wcyRtb3VzZUxlYXZlRGVsYSA9PT0gdm9pZCAwID8gMC4xIDogX3Byb3BzJG1vdXNlTGVhdmVEZWxhLFxuICAgIF9wcm9wcyRvdmVybGF5U3R5bGUgPSBwcm9wcy5vdmVybGF5U3R5bGUsXG4gICAgb3ZlcmxheVN0eWxlID0gX3Byb3BzJG92ZXJsYXlTdHlsZSA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkb3ZlcmxheVN0eWxlLFxuICAgIG90aGVyUHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcInRpdGxlXCIsIFwiY29udGVudFwiLCBcIl9vdmVybGF5XCIsIFwicGxhY2VtZW50XCIsIFwidHJpZ2dlclwiLCBcIm1vdXNlRW50ZXJEZWxheVwiLCBcIm1vdXNlTGVhdmVEZWxheVwiLCBcIm92ZXJsYXlTdHlsZVwiXSk7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCksXG4gICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzO1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdwb3BvdmVyJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIHJvb3RQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXAsIF9leHRlbmRzKHtcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICB0cmlnZ2VyOiB0cmlnZ2VyLFxuICAgIG1vdXNlRW50ZXJEZWxheTogbW91c2VFbnRlckRlbGF5LFxuICAgIG1vdXNlTGVhdmVEZWxheTogbW91c2VMZWF2ZURlbGF5LFxuICAgIG92ZXJsYXlTdHlsZTogb3ZlcmxheVN0eWxlXG4gIH0sIG90aGVyUHJvcHMsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICByZWY6IHJlZixcbiAgICBvdmVybGF5OiBfb3ZlcmxheSB8fCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPdmVybGF5LCB7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgIGNvbnRlbnQ6IGNvbnRlbnRcbiAgICB9KSxcbiAgICB0cmFuc2l0aW9uTmFtZTogZ2V0VHJhbnNpdGlvbk5hbWUocm9vdFByZWZpeENscywgJ3pvb20tYmlnJywgb3RoZXJQcm9wcy50cmFuc2l0aW9uTmFtZSlcbiAgfSkpO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBQb3BvdmVyLmRpc3BsYXlOYW1lID0gJ1BvcG92ZXInO1xufVxuZXhwb3J0IGRlZmF1bHQgUG9wb3ZlcjsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBFbGxpcHNpc091dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk0xNzYgNTExYTU2IDU2IDAgMTAxMTIgMCA1NiA1NiAwIDEwLTExMiAwem0yODAgMGE1NiA1NiAwIDEwMTEyIDAgNTYgNTYgMCAxMC0xMTIgMHptMjgwIDBhNTYgNTYgMCAxMDExMiAwIDU2IDU2IDAgMTAtMTEyIDB6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJlbGxpcHNpc1wiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgRWxsaXBzaXNPdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEVsbGlwc2lzT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRWxsaXBzaXNPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIEVsbGlwc2lzT3V0bGluZWQgPSBmdW5jdGlvbiBFbGxpcHNpc091dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBFbGxpcHNpc091dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5FbGxpcHNpc091dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0VsbGlwc2lzT3V0bGluZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoRWxsaXBzaXNPdXRsaW5lZCk7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciBJZENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRNZW51SWQodXVpZCwgZXZlbnRLZXkpIHtcbiAgaWYgKHV1aWQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBcIlwiLmNvbmNhdCh1dWlkLCBcIi1cIikuY29uY2F0KGV2ZW50S2V5KTtcbn1cblxuLyoqXG4gKiBHZXQgYGRhdGEtbWVudS1pZGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1lbnVJZChldmVudEtleSkge1xuICB2YXIgaWQgPSBSZWFjdC51c2VDb250ZXh0KElkQ29udGV4dCk7XG4gIHJldHVybiBnZXRNZW51SWQoaWQsIGV2ZW50S2V5KTtcbn0iLCJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJjaGlsZHJlblwiLCBcImxvY2tlZFwiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VNZW1vIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lbW9cIjtcbmltcG9ydCBpc0VxdWFsIGZyb20gXCJyYy11dGlsL2VzL2lzRXF1YWxcIjtcbmV4cG9ydCB2YXIgTWVudUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmZ1bmN0aW9uIG1lcmdlUHJvcHMob3JpZ2luLCB0YXJnZXQpIHtcbiAgdmFyIGNsb25lID0gX29iamVjdFNwcmVhZCh7fSwgb3JpZ2luKTtcbiAgT2JqZWN0LmtleXModGFyZ2V0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgdmFsdWUgPSB0YXJnZXRba2V5XTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xvbmVba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBjbG9uZTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEluaGVyaXRhYmxlQ29udGV4dFByb3ZpZGVyKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBsb2NrZWQgPSBfcmVmLmxvY2tlZCxcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgdmFyIGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KE1lbnVDb250ZXh0KTtcbiAgdmFyIGluaGVyaXRhYmxlQ29udGV4dCA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBtZXJnZVByb3BzKGNvbnRleHQsIHJlc3RQcm9wcyk7XG4gIH0sIFtjb250ZXh0LCByZXN0UHJvcHNdLCBmdW5jdGlvbiAocHJldiwgbmV4dCkge1xuICAgIHJldHVybiAhbG9ja2VkICYmIChwcmV2WzBdICE9PSBuZXh0WzBdIHx8ICFpc0VxdWFsKHByZXZbMV0sIG5leHRbMV0sIHRydWUpKTtcbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNZW51Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBpbmhlcml0YWJsZUNvbnRleHRcbiAgfSwgY2hpbGRyZW4pO1xufSIsImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgRW1wdHlMaXN0ID0gW107XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT0gUGF0aCBSZWdpc3RlciA9PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB2YXIgUGF0aFJlZ2lzdGVyQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1lYXN1cmUoKSB7XG4gIHJldHVybiBSZWFjdC51c2VDb250ZXh0KFBhdGhSZWdpc3RlckNvbnRleHQpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09IFBhdGggVHJhY2tlciA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IHZhciBQYXRoVHJhY2tlckNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChFbXB0eUxpc3QpO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUZ1bGxQYXRoKGV2ZW50S2V5KSB7XG4gIHZhciBwYXJlbnRLZXlQYXRoID0gUmVhY3QudXNlQ29udGV4dChQYXRoVHJhY2tlckNvbnRleHQpO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGV2ZW50S2V5ICE9PSB1bmRlZmluZWQgPyBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHBhcmVudEtleVBhdGgpLCBbZXZlbnRLZXldKSA6IHBhcmVudEtleVBhdGg7XG4gIH0sIFtwYXJlbnRLZXlQYXRoLCBldmVudEtleV0pO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gUGF0aCBVc2VyID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdmFyIFBhdGhVc2VyQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBQcml2YXRlQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHt9KTtcbmV4cG9ydCBkZWZhdWx0IFByaXZhdGVDb250ZXh0OyIsImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgaXNWaXNpYmxlIGZyb20gXCIuL2lzVmlzaWJsZVwiO1xuZnVuY3Rpb24gZm9jdXNhYmxlKG5vZGUpIHtcbiAgdmFyIGluY2x1ZGVQb3NpdGl2ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gIGlmIChpc1Zpc2libGUobm9kZSkpIHtcbiAgICB2YXIgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGlzRm9jdXNhYmxlRWxlbWVudCA9XG4gICAgLy8gRm9jdXNhYmxlIGVsZW1lbnRcbiAgICBbJ2lucHV0JywgJ3NlbGVjdCcsICd0ZXh0YXJlYScsICdidXR0b24nXS5pbmNsdWRlcyhub2RlTmFtZSkgfHxcbiAgICAvLyBFZGl0YWJsZSBlbGVtZW50XG4gICAgbm9kZS5pc0NvbnRlbnRFZGl0YWJsZSB8fFxuICAgIC8vIEFuY2hvciB3aXRoIGhyZWYgZWxlbWVudFxuICAgIG5vZGVOYW1lID09PSAnYScgJiYgISFub2RlLmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuXG4gICAgLy8gR2V0IHRhYkluZGV4XG4gICAgdmFyIHRhYkluZGV4QXR0ciA9IG5vZGUuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpO1xuICAgIHZhciB0YWJJbmRleE51bSA9IE51bWJlcih0YWJJbmRleEF0dHIpO1xuXG4gICAgLy8gUGFyc2UgYXMgbnVtYmVyIGlmIHZhbGlkYXRlXG4gICAgdmFyIHRhYkluZGV4ID0gbnVsbDtcbiAgICBpZiAodGFiSW5kZXhBdHRyICYmICFOdW1iZXIuaXNOYU4odGFiSW5kZXhOdW0pKSB7XG4gICAgICB0YWJJbmRleCA9IHRhYkluZGV4TnVtO1xuICAgIH0gZWxzZSBpZiAoaXNGb2N1c2FibGVFbGVtZW50ICYmIHRhYkluZGV4ID09PSBudWxsKSB7XG4gICAgICB0YWJJbmRleCA9IDA7XG4gICAgfVxuXG4gICAgLy8gQmxvY2sgZm9jdXNhYmxlIGlmIGRpc2FibGVkXG4gICAgaWYgKGlzRm9jdXNhYmxlRWxlbWVudCAmJiBub2RlLmRpc2FibGVkKSB7XG4gICAgICB0YWJJbmRleCA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0YWJJbmRleCAhPT0gbnVsbCAmJiAodGFiSW5kZXggPj0gMCB8fCBpbmNsdWRlUG9zaXRpdmUgJiYgdGFiSW5kZXggPCAwKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9jdXNOb2RlTGlzdChub2RlKSB7XG4gIHZhciBpbmNsdWRlUG9zaXRpdmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICB2YXIgcmVzID0gX3RvQ29uc3VtYWJsZUFycmF5KG5vZGUucXVlcnlTZWxlY3RvckFsbCgnKicpKS5maWx0ZXIoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0dXJuIGZvY3VzYWJsZShjaGlsZCwgaW5jbHVkZVBvc2l0aXZlKTtcbiAgfSk7XG4gIGlmIChmb2N1c2FibGUobm9kZSwgaW5jbHVkZVBvc2l0aXZlKSkge1xuICAgIHJlcy51bnNoaWZ0KG5vZGUpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG52YXIgbGFzdEZvY3VzRWxlbWVudCA9IG51bGw7XG5cbi8qKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlIHNpbmNlIHRoaXMgbWF5IGZhaWxlZCB3aGVuIHVzZWQgaW4gYXN5bmMgKi9cbmV4cG9ydCBmdW5jdGlvbiBzYXZlTGFzdEZvY3VzTm9kZSgpIHtcbiAgbGFzdEZvY3VzRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlIHNpbmNlIHRoaXMgbWF5IGZhaWxlZCB3aGVuIHVzZWQgaW4gYXN5bmMgKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckxhc3RGb2N1c05vZGUoKSB7XG4gIGxhc3RGb2N1c0VsZW1lbnQgPSBudWxsO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZSBzaW5jZSB0aGlzIG1heSBmYWlsZWQgd2hlbiB1c2VkIGluIGFzeW5jICovXG5leHBvcnQgZnVuY3Rpb24gYmFja0xhc3RGb2N1c05vZGUoKSB7XG4gIGlmIChsYXN0Rm9jdXNFbGVtZW50KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWFg+e0oOWPr+iDveW3sue7j+iiq+enu+WKqOS6hlxuICAgICAgbGFzdEZvY3VzRWxlbWVudC5mb2N1cygpO1xuXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1lbXB0eSAqL1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGVtcHR5XG4gICAgfVxuICAgIC8qIGVzbGludC1lbmFibGUgbm8tZW1wdHkgKi9cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbGltaXRUYWJSYW5nZShub2RlLCBlKSB7XG4gIGlmIChlLmtleUNvZGUgPT09IDkpIHtcbiAgICB2YXIgdGFiTm9kZUxpc3QgPSBnZXRGb2N1c05vZGVMaXN0KG5vZGUpO1xuICAgIHZhciBsYXN0VGFiTm9kZSA9IHRhYk5vZGVMaXN0W2Uuc2hpZnRLZXkgPyAwIDogdGFiTm9kZUxpc3QubGVuZ3RoIC0gMV07XG4gICAgdmFyIGxlYXZpbmdUYWIgPSBsYXN0VGFiTm9kZSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCB8fCBub2RlID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgIGlmIChsZWF2aW5nVGFiKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gdGFiTm9kZUxpc3RbZS5zaGlmdEtleSA/IHRhYk5vZGVMaXN0Lmxlbmd0aCAtIDEgOiAwXTtcbiAgICAgIHRhcmdldC5mb2N1cygpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxufSIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgS2V5Q29kZSBmcm9tIFwicmMtdXRpbC9lcy9LZXlDb2RlXCI7XG5pbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuaW1wb3J0IHsgZ2V0Rm9jdXNOb2RlTGlzdCB9IGZyb20gXCJyYy11dGlsL2VzL0RvbS9mb2N1c1wiO1xuaW1wb3J0IHsgZ2V0TWVudUlkIH0gZnJvbSBcIi4uL2NvbnRleHQvSWRDb250ZXh0XCI7XG5cbi8vIGRlc3RydWN0IHRvIHJlZHVjZSBtaW5pZnkgc2l6ZVxudmFyIExFRlQgPSBLZXlDb2RlLkxFRlQsXG4gIFJJR0hUID0gS2V5Q29kZS5SSUdIVCxcbiAgVVAgPSBLZXlDb2RlLlVQLFxuICBET1dOID0gS2V5Q29kZS5ET1dOLFxuICBFTlRFUiA9IEtleUNvZGUuRU5URVIsXG4gIEVTQyA9IEtleUNvZGUuRVNDLFxuICBIT01FID0gS2V5Q29kZS5IT01FLFxuICBFTkQgPSBLZXlDb2RlLkVORDtcbnZhciBBcnJvd0tleXMgPSBbVVAsIERPV04sIExFRlQsIFJJR0hUXTtcbmZ1bmN0aW9uIGdldE9mZnNldChtb2RlLCBpc1Jvb3RMZXZlbCwgaXNSdGwsIHdoaWNoKSB7XG4gIHZhciBfaW5saW5lLCBfaG9yaXpvbnRhbCwgX3ZlcnRpY2FsLCBfb2Zmc2V0cztcbiAgdmFyIHByZXYgPSAncHJldic7XG4gIHZhciBuZXh0ID0gJ25leHQnO1xuICB2YXIgY2hpbGRyZW4gPSAnY2hpbGRyZW4nO1xuICB2YXIgcGFyZW50ID0gJ3BhcmVudCc7XG5cbiAgLy8gSW5saW5lIGVudGVyIGlzIHNwZWNpYWwgdGhhdCB3ZSB1c2UgdW5pcXVlIG9wZXJhdGlvblxuICBpZiAobW9kZSA9PT0gJ2lubGluZScgJiYgd2hpY2ggPT09IEVOVEVSKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlubGluZVRyaWdnZXI6IHRydWVcbiAgICB9O1xuICB9XG4gIHZhciBpbmxpbmUgPSAoX2lubGluZSA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2lubGluZSwgVVAsIHByZXYpLCBfZGVmaW5lUHJvcGVydHkoX2lubGluZSwgRE9XTiwgbmV4dCksIF9pbmxpbmUpO1xuICB2YXIgaG9yaXpvbnRhbCA9IChfaG9yaXpvbnRhbCA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2hvcml6b250YWwsIExFRlQsIGlzUnRsID8gbmV4dCA6IHByZXYpLCBfZGVmaW5lUHJvcGVydHkoX2hvcml6b250YWwsIFJJR0hULCBpc1J0bCA/IHByZXYgOiBuZXh0KSwgX2RlZmluZVByb3BlcnR5KF9ob3Jpem9udGFsLCBET1dOLCBjaGlsZHJlbiksIF9kZWZpbmVQcm9wZXJ0eShfaG9yaXpvbnRhbCwgRU5URVIsIGNoaWxkcmVuKSwgX2hvcml6b250YWwpO1xuICB2YXIgdmVydGljYWwgPSAoX3ZlcnRpY2FsID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfdmVydGljYWwsIFVQLCBwcmV2KSwgX2RlZmluZVByb3BlcnR5KF92ZXJ0aWNhbCwgRE9XTiwgbmV4dCksIF9kZWZpbmVQcm9wZXJ0eShfdmVydGljYWwsIEVOVEVSLCBjaGlsZHJlbiksIF9kZWZpbmVQcm9wZXJ0eShfdmVydGljYWwsIEVTQywgcGFyZW50KSwgX2RlZmluZVByb3BlcnR5KF92ZXJ0aWNhbCwgTEVGVCwgaXNSdGwgPyBjaGlsZHJlbiA6IHBhcmVudCksIF9kZWZpbmVQcm9wZXJ0eShfdmVydGljYWwsIFJJR0hULCBpc1J0bCA/IHBhcmVudCA6IGNoaWxkcmVuKSwgX3ZlcnRpY2FsKTtcbiAgdmFyIG9mZnNldHMgPSB7XG4gICAgaW5saW5lOiBpbmxpbmUsXG4gICAgaG9yaXpvbnRhbDogaG9yaXpvbnRhbCxcbiAgICB2ZXJ0aWNhbDogdmVydGljYWwsXG4gICAgaW5saW5lU3ViOiBpbmxpbmUsXG4gICAgaG9yaXpvbnRhbFN1YjogdmVydGljYWwsXG4gICAgdmVydGljYWxTdWI6IHZlcnRpY2FsXG4gIH07XG4gIHZhciB0eXBlID0gKF9vZmZzZXRzID0gb2Zmc2V0c1tcIlwiLmNvbmNhdChtb2RlKS5jb25jYXQoaXNSb290TGV2ZWwgPyAnJyA6ICdTdWInKV0pID09PSBudWxsIHx8IF9vZmZzZXRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb2Zmc2V0c1t3aGljaF07XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgcHJldjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9mZnNldDogLTEsXG4gICAgICAgIHNpYmxpbmc6IHRydWVcbiAgICAgIH07XG4gICAgY2FzZSBuZXh0OlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb2Zmc2V0OiAxLFxuICAgICAgICBzaWJsaW5nOiB0cnVlXG4gICAgICB9O1xuICAgIGNhc2UgcGFyZW50OlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb2Zmc2V0OiAtMSxcbiAgICAgICAgc2libGluZzogZmFsc2VcbiAgICAgIH07XG4gICAgY2FzZSBjaGlsZHJlbjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9mZnNldDogMSxcbiAgICAgICAgc2libGluZzogZmFsc2VcbiAgICAgIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5mdW5jdGlvbiBmaW5kQ29udGFpbmVyVUwoZWxlbWVudCkge1xuICB2YXIgY3VycmVudCA9IGVsZW1lbnQ7XG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgaWYgKGN1cnJlbnQuZ2V0QXR0cmlidXRlKCdkYXRhLW1lbnUtbGlzdCcpKSB7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50RWxlbWVudDtcbiAgfVxuXG4gIC8vIE5vcm1hbGx5IHNob3VsZCBub3QgcmVhY2ggdGhpcyBsaW5lXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEZpbmQgZm9jdXNlZCBlbGVtZW50IHdpdGhpbiBlbGVtZW50IHNldCBwcm92aWRlZFxuICovXG5mdW5jdGlvbiBnZXRGb2N1c0VsZW1lbnQoYWN0aXZlRWxlbWVudCwgZWxlbWVudHMpIHtcbiAgdmFyIGN1cnJlbnQgPSBhY3RpdmVFbGVtZW50IHx8IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgaWYgKGVsZW1lbnRzLmhhcyhjdXJyZW50KSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogR2V0IGZvY3VzYWJsZSBlbGVtZW50cyBmcm9tIHRoZSBlbGVtZW50IHNldCB1bmRlciBwcm92aWRlZCBjb250YWluZXJcbiAqL1xuZnVuY3Rpb24gZ2V0Rm9jdXNhYmxlRWxlbWVudHMoY29udGFpbmVyLCBlbGVtZW50cykge1xuICB2YXIgbGlzdCA9IGdldEZvY3VzTm9kZUxpc3QoY29udGFpbmVyLCB0cnVlKTtcbiAgcmV0dXJuIGxpc3QuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICByZXR1cm4gZWxlbWVudHMuaGFzKGVsZSk7XG4gIH0pO1xufVxuZnVuY3Rpb24gZ2V0TmV4dEZvY3VzRWxlbWVudChwYXJlbnRRdWVyeUNvbnRhaW5lciwgZWxlbWVudHMsIGZvY3VzTWVudUVsZW1lbnQpIHtcbiAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogMTtcbiAgLy8gS2V5IG9uIHRoZSBtZW51IGl0ZW0gd2lsbCBub3QgZ2V0IHZhbGlkYXRlIHBhcmVudCBjb250YWluZXJcbiAgaWYgKCFwYXJlbnRRdWVyeUNvbnRhaW5lcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gTGlzdCBjdXJyZW50IGxldmVsIG1lbnUgaXRlbSBlbGVtZW50c1xuICB2YXIgc2FtZUxldmVsRm9jdXNhYmxlTWVudUVsZW1lbnRMaXN0ID0gZ2V0Rm9jdXNhYmxlRWxlbWVudHMocGFyZW50UXVlcnlDb250YWluZXIsIGVsZW1lbnRzKTtcblxuICAvLyBGaW5kIG5leHQgZm9jdXMgaW5kZXhcbiAgdmFyIGNvdW50ID0gc2FtZUxldmVsRm9jdXNhYmxlTWVudUVsZW1lbnRMaXN0Lmxlbmd0aDtcbiAgdmFyIGZvY3VzSW5kZXggPSBzYW1lTGV2ZWxGb2N1c2FibGVNZW51RWxlbWVudExpc3QuZmluZEluZGV4KGZ1bmN0aW9uIChlbGUpIHtcbiAgICByZXR1cm4gZm9jdXNNZW51RWxlbWVudCA9PT0gZWxlO1xuICB9KTtcbiAgaWYgKG9mZnNldCA8IDApIHtcbiAgICBpZiAoZm9jdXNJbmRleCA9PT0gLTEpIHtcbiAgICAgIGZvY3VzSW5kZXggPSBjb3VudCAtIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvY3VzSW5kZXggLT0gMTtcbiAgICB9XG4gIH0gZWxzZSBpZiAob2Zmc2V0ID4gMCkge1xuICAgIGZvY3VzSW5kZXggKz0gMTtcbiAgfVxuICBmb2N1c0luZGV4ID0gKGZvY3VzSW5kZXggKyBjb3VudCkgJSBjb3VudDtcblxuICAvLyBGb2N1cyBtZW51IGl0ZW1cbiAgcmV0dXJuIHNhbWVMZXZlbEZvY3VzYWJsZU1lbnVFbGVtZW50TGlzdFtmb2N1c0luZGV4XTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUFjY2Vzc2liaWxpdHkobW9kZSwgYWN0aXZlS2V5LCBpc1J0bCwgaWQsIGNvbnRhaW5lclJlZiwgZ2V0S2V5cywgZ2V0S2V5UGF0aCwgdHJpZ2dlckFjdGl2ZUtleSwgdHJpZ2dlckFjY2Vzc2liaWxpdHlPcGVuLCBvcmlnaW5PbktleURvd24pIHtcbiAgdmFyIHJhZlJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICB2YXIgYWN0aXZlUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIGFjdGl2ZVJlZi5jdXJyZW50ID0gYWN0aXZlS2V5O1xuICB2YXIgY2xlYW5SYWYgPSBmdW5jdGlvbiBjbGVhblJhZigpIHtcbiAgICByYWYuY2FuY2VsKHJhZlJlZi5jdXJyZW50KTtcbiAgfTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY2xlYW5SYWYoKTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBmdW5jdGlvbiAoZSkge1xuICAgIHZhciB3aGljaCA9IGUud2hpY2g7XG4gICAgaWYgKFtdLmNvbmNhdChBcnJvd0tleXMsIFtFTlRFUiwgRVNDLCBIT01FLCBFTkRdKS5pbmNsdWRlcyh3aGljaCkpIHtcbiAgICAgIC8vIENvbnZlcnQga2V5IHRvIGVsZW1lbnRzXG4gICAgICB2YXIgZWxlbWVudHM7XG4gICAgICB2YXIga2V5MmVsZW1lbnQ7XG4gICAgICB2YXIgZWxlbWVudDJrZXk7XG5cbiAgICAgIC8vID4+PiBXcmFwIGFzIGZ1bmN0aW9uIHNpbmNlIHdlIHVzZSByYWYgZm9yIHNvbWUgY2FzZVxuICAgICAgdmFyIHJlZnJlc2hFbGVtZW50cyA9IGZ1bmN0aW9uIHJlZnJlc2hFbGVtZW50cygpIHtcbiAgICAgICAgZWxlbWVudHMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGtleTJlbGVtZW50ID0gbmV3IE1hcCgpO1xuICAgICAgICBlbGVtZW50MmtleSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIGtleXMgPSBnZXRLZXlzKCk7XG4gICAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiW2RhdGEtbWVudS1pZD0nXCIuY29uY2F0KGdldE1lbnVJZChpZCwga2V5KSwgXCInXVwiKSk7XG4gICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVsZW1lbnRzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgIGVsZW1lbnQya2V5LnNldChlbGVtZW50LCBrZXkpO1xuICAgICAgICAgICAga2V5MmVsZW1lbnQuc2V0KGtleSwgZWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzO1xuICAgICAgfTtcbiAgICAgIHJlZnJlc2hFbGVtZW50cygpO1xuXG4gICAgICAvLyBGaXJzdCB3ZSBzaG91bGQgZmluZCBjdXJyZW50IGZvY3VzZWQgTWVudUl0ZW0vU3ViTWVudSBlbGVtZW50XG4gICAgICB2YXIgYWN0aXZlRWxlbWVudCA9IGtleTJlbGVtZW50LmdldChhY3RpdmVLZXkpO1xuICAgICAgdmFyIGZvY3VzTWVudUVsZW1lbnQgPSBnZXRGb2N1c0VsZW1lbnQoYWN0aXZlRWxlbWVudCwgZWxlbWVudHMpO1xuICAgICAgdmFyIGZvY3VzTWVudUtleSA9IGVsZW1lbnQya2V5LmdldChmb2N1c01lbnVFbGVtZW50KTtcbiAgICAgIHZhciBvZmZzZXRPYmogPSBnZXRPZmZzZXQobW9kZSwgZ2V0S2V5UGF0aChmb2N1c01lbnVLZXksIHRydWUpLmxlbmd0aCA9PT0gMSwgaXNSdGwsIHdoaWNoKTtcblxuICAgICAgLy8gU29tZSBtb2RlIGRvIG5vdCBoYXZlIGZ1bGx5IGFycm93IG9wZXJhdGlvbiBsaWtlIGlubGluZVxuICAgICAgaWYgKCFvZmZzZXRPYmogJiYgd2hpY2ggIT09IEhPTUUgJiYgd2hpY2ggIT09IEVORCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEFycm93IHByZXZlbnQgZGVmYXVsdCB0byBhdm9pZCBwYWdlIHNjcm9sbFxuICAgICAgaWYgKEFycm93S2V5cy5pbmNsdWRlcyh3aGljaCkgfHwgW0hPTUUsIEVORF0uaW5jbHVkZXMod2hpY2gpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIHZhciB0cnlGb2N1cyA9IGZ1bmN0aW9uIHRyeUZvY3VzKG1lbnVFbGVtZW50KSB7XG4gICAgICAgIGlmIChtZW51RWxlbWVudCkge1xuICAgICAgICAgIHZhciBmb2N1c1RhcmdldEVsZW1lbnQgPSBtZW51RWxlbWVudDtcblxuICAgICAgICAgIC8vIEZvY3VzIHRvIGxpbmsgaW5zdGVhZCBvZiBtZW51IGl0ZW0gaWYgcG9zc2libGVcbiAgICAgICAgICB2YXIgbGluayA9IG1lbnVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2EnKTtcbiAgICAgICAgICBpZiAobGluayAhPT0gbnVsbCAmJiBsaW5rICE9PSB2b2lkIDAgJiYgbGluay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSkge1xuICAgICAgICAgICAgZm9jdXNUYXJnZXRFbGVtZW50ID0gbGluaztcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHRhcmdldEtleSA9IGVsZW1lbnQya2V5LmdldChtZW51RWxlbWVudCk7XG4gICAgICAgICAgdHJpZ2dlckFjdGl2ZUtleSh0YXJnZXRLZXkpO1xuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogRG8gbm90IGB1c2VFZmZlY3RgIGhlcmUgc2luY2UgYHRyeUZvY3VzYCBtYXkgdHJpZ2dlciBhc3luY1xuICAgICAgICAgICAqIHdoaWNoIG1ha2VzIFJlYWN0IHN5bmMgdXBkYXRlIHRoZSBgYWN0aXZlS2V5YFxuICAgICAgICAgICAqIHRoYXQgZm9yY2UgcmVuZGVyIGJlZm9yZSBgdXNlUmVmYCBzZXQgdGhlIG5leHQgYWN0aXZlS2V5XG4gICAgICAgICAgICovXG4gICAgICAgICAgY2xlYW5SYWYoKTtcbiAgICAgICAgICByYWZSZWYuY3VycmVudCA9IHJhZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoYWN0aXZlUmVmLmN1cnJlbnQgPT09IHRhcmdldEtleSkge1xuICAgICAgICAgICAgICBmb2N1c1RhcmdldEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChbSE9NRSwgRU5EXS5pbmNsdWRlcyh3aGljaCkgfHwgb2Zmc2V0T2JqLnNpYmxpbmcgfHwgIWZvY3VzTWVudUVsZW1lbnQpIHtcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gU2libGluZyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBGaW5kIHdhbGthYmxlIGZvY3VzIG1lbnUgZWxlbWVudCBjb250YWluZXJcbiAgICAgICAgdmFyIHBhcmVudFF1ZXJ5Q29udGFpbmVyO1xuICAgICAgICBpZiAoIWZvY3VzTWVudUVsZW1lbnQgfHwgbW9kZSA9PT0gJ2lubGluZScpIHtcbiAgICAgICAgICBwYXJlbnRRdWVyeUNvbnRhaW5lciA9IGNvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcmVudFF1ZXJ5Q29udGFpbmVyID0gZmluZENvbnRhaW5lclVMKGZvY3VzTWVudUVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IG5leHQgZm9jdXMgZWxlbWVudFxuICAgICAgICB2YXIgdGFyZ2V0RWxlbWVudDtcbiAgICAgICAgdmFyIGZvY3VzYWJsZUVsZW1lbnRzID0gZ2V0Rm9jdXNhYmxlRWxlbWVudHMocGFyZW50UXVlcnlDb250YWluZXIsIGVsZW1lbnRzKTtcbiAgICAgICAgaWYgKHdoaWNoID09PSBIT01FKSB7XG4gICAgICAgICAgdGFyZ2V0RWxlbWVudCA9IGZvY3VzYWJsZUVsZW1lbnRzWzBdO1xuICAgICAgICB9IGVsc2UgaWYgKHdoaWNoID09PSBFTkQpIHtcbiAgICAgICAgICB0YXJnZXRFbGVtZW50ID0gZm9jdXNhYmxlRWxlbWVudHNbZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoIC0gMV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0RWxlbWVudCA9IGdldE5leHRGb2N1c0VsZW1lbnQocGFyZW50UXVlcnlDb250YWluZXIsIGVsZW1lbnRzLCBmb2N1c01lbnVFbGVtZW50LCBvZmZzZXRPYmoub2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb2N1cyBtZW51IGl0ZW1cbiAgICAgICAgdHJ5Rm9jdXModGFyZ2V0RWxlbWVudCk7XG5cbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gSW5saW5lVHJpZ2dlciA9PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgfSBlbHNlIGlmIChvZmZzZXRPYmouaW5saW5lVHJpZ2dlcikge1xuICAgICAgICAvLyBJbmxpbmUgdHJpZ2dlciBubyBuZWVkIHN3aXRjaCB0byBzdWIgbWVudSBpdGVtXG4gICAgICAgIHRyaWdnZXJBY2Nlc3NpYmlsaXR5T3Blbihmb2N1c01lbnVLZXkpO1xuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gTGV2ZWwgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICB9IGVsc2UgaWYgKG9mZnNldE9iai5vZmZzZXQgPiAwKSB7XG4gICAgICAgIHRyaWdnZXJBY2Nlc3NpYmlsaXR5T3Blbihmb2N1c01lbnVLZXksIHRydWUpO1xuICAgICAgICBjbGVhblJhZigpO1xuICAgICAgICByYWZSZWYuY3VycmVudCA9IHJhZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gQXN5bmMgc2hvdWxkIHJlc3luYyBlbGVtZW50c1xuICAgICAgICAgIHJlZnJlc2hFbGVtZW50cygpO1xuICAgICAgICAgIHZhciBjb250cm9sSWQgPSBmb2N1c01lbnVFbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1jb250cm9scycpO1xuICAgICAgICAgIHZhciBzdWJRdWVyeUNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnRyb2xJZCk7XG5cbiAgICAgICAgICAvLyBHZXQgc3ViIGZvY3VzYWJsZSBtZW51IGl0ZW1cbiAgICAgICAgICB2YXIgdGFyZ2V0RWxlbWVudCA9IGdldE5leHRGb2N1c0VsZW1lbnQoc3ViUXVlcnlDb250YWluZXIsIGVsZW1lbnRzKTtcblxuICAgICAgICAgIC8vIEZvY3VzIG1lbnUgaXRlbVxuICAgICAgICAgIHRyeUZvY3VzKHRhcmdldEVsZW1lbnQpO1xuICAgICAgICB9LCA1KTtcbiAgICAgIH0gZWxzZSBpZiAob2Zmc2V0T2JqLm9mZnNldCA8IDApIHtcbiAgICAgICAgdmFyIGtleVBhdGggPSBnZXRLZXlQYXRoKGZvY3VzTWVudUtleSwgdHJ1ZSk7XG4gICAgICAgIHZhciBwYXJlbnRLZXkgPSBrZXlQYXRoW2tleVBhdGgubGVuZ3RoIC0gMl07XG4gICAgICAgIHZhciBwYXJlbnRNZW51RWxlbWVudCA9IGtleTJlbGVtZW50LmdldChwYXJlbnRLZXkpO1xuXG4gICAgICAgIC8vIEZvY3VzIG1lbnUgaXRlbVxuICAgICAgICB0cmlnZ2VyQWNjZXNzaWJpbGl0eU9wZW4ocGFyZW50S2V5LCBmYWxzZSk7XG4gICAgICAgIHRyeUZvY3VzKHBhcmVudE1lbnVFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQYXNzIG9yaWdpbiBrZXkgZG93biBldmVudFxuICAgIG9yaWdpbk9uS2V5RG93biA9PT0gbnVsbCB8fCBvcmlnaW5PbktleURvd24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbk9uS2V5RG93bihlKTtcbiAgfTtcbn0iLCJleHBvcnQgZnVuY3Rpb24gbmV4dFNsaWNlKGNhbGxiYWNrKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oY2FsbGJhY2spO1xufSIsImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZiwgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgeyBuZXh0U2xpY2UgfSBmcm9tIFwiLi4vdXRpbHMvdGltZVV0aWxcIjtcbnZhciBQQVRIX1NQTElUID0gJ19fUkNfVVRJTF9QQVRIX1NQTElUX18nO1xudmFyIGdldFBhdGhTdHIgPSBmdW5jdGlvbiBnZXRQYXRoU3RyKGtleVBhdGgpIHtcbiAgcmV0dXJuIGtleVBhdGguam9pbihQQVRIX1NQTElUKTtcbn07XG52YXIgZ2V0UGF0aEtleXMgPSBmdW5jdGlvbiBnZXRQYXRoS2V5cyhrZXlQYXRoU3RyKSB7XG4gIHJldHVybiBrZXlQYXRoU3RyLnNwbGl0KFBBVEhfU1BMSVQpO1xufTtcbmV4cG9ydCB2YXIgT1ZFUkZMT1dfS0VZID0gJ3JjLW1lbnUtbW9yZSc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VLZXlSZWNvcmRzKCkge1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoe30pLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIGludGVybmFsRm9yY2VVcGRhdGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIga2V5MnBhdGhSZWYgPSB1c2VSZWYobmV3IE1hcCgpKTtcbiAgdmFyIHBhdGgya2V5UmVmID0gdXNlUmVmKG5ldyBNYXAoKSk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUoW10pLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICBvdmVyZmxvd0tleXMgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldE92ZXJmbG93S2V5cyA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG4gIHZhciB1cGRhdGVSZWYgPSB1c2VSZWYoMCk7XG4gIHZhciBkZXN0cm95UmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgdmFyIGZvcmNlVXBkYXRlID0gZnVuY3Rpb24gZm9yY2VVcGRhdGUoKSB7XG4gICAgaWYgKCFkZXN0cm95UmVmLmN1cnJlbnQpIHtcbiAgICAgIGludGVybmFsRm9yY2VVcGRhdGUoe30pO1xuICAgIH1cbiAgfTtcbiAgdmFyIHJlZ2lzdGVyUGF0aCA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChrZXksIGtleVBhdGgpIHtcbiAgICAvLyBXYXJuaW5nIGZvciBpbnZhbGlkYXRlIG9yIGR1cGxpY2F0ZWQgYGtleWBcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgd2FybmluZygha2V5MnBhdGhSZWYuY3VycmVudC5oYXMoa2V5KSwgXCJEdXBsaWNhdGVkIGtleSAnXCIuY29uY2F0KGtleSwgXCInIHVzZWQgaW4gTWVudSBieSBwYXRoIFtcIikuY29uY2F0KGtleVBhdGguam9pbignID4gJyksIFwiXVwiKSk7XG4gICAgfVxuXG4gICAgLy8gRmlsbCBtYXBcbiAgICB2YXIgY29ubmVjdGVkUGF0aCA9IGdldFBhdGhTdHIoa2V5UGF0aCk7XG4gICAgcGF0aDJrZXlSZWYuY3VycmVudC5zZXQoY29ubmVjdGVkUGF0aCwga2V5KTtcbiAgICBrZXkycGF0aFJlZi5jdXJyZW50LnNldChrZXksIGNvbm5lY3RlZFBhdGgpO1xuICAgIHVwZGF0ZVJlZi5jdXJyZW50ICs9IDE7XG4gICAgdmFyIGlkID0gdXBkYXRlUmVmLmN1cnJlbnQ7XG4gICAgbmV4dFNsaWNlKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChpZCA9PT0gdXBkYXRlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgZm9yY2VVcGRhdGUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSwgW10pO1xuICB2YXIgdW5yZWdpc3RlclBhdGggPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoa2V5LCBrZXlQYXRoKSB7XG4gICAgdmFyIGNvbm5lY3RlZFBhdGggPSBnZXRQYXRoU3RyKGtleVBhdGgpO1xuICAgIHBhdGgya2V5UmVmLmN1cnJlbnQuZGVsZXRlKGNvbm5lY3RlZFBhdGgpO1xuICAgIGtleTJwYXRoUmVmLmN1cnJlbnQuZGVsZXRlKGtleSk7XG4gIH0sIFtdKTtcbiAgdmFyIHJlZnJlc2hPdmVyZmxvd0tleXMgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoa2V5cykge1xuICAgIHNldE92ZXJmbG93S2V5cyhrZXlzKTtcbiAgfSwgW10pO1xuICB2YXIgZ2V0S2V5UGF0aCA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChldmVudEtleSwgaW5jbHVkZU92ZXJmbG93KSB7XG4gICAgdmFyIGZ1bGxQYXRoID0ga2V5MnBhdGhSZWYuY3VycmVudC5nZXQoZXZlbnRLZXkpIHx8ICcnO1xuICAgIHZhciBrZXlzID0gZ2V0UGF0aEtleXMoZnVsbFBhdGgpO1xuICAgIGlmIChpbmNsdWRlT3ZlcmZsb3cgJiYgb3ZlcmZsb3dLZXlzLmluY2x1ZGVzKGtleXNbMF0pKSB7XG4gICAgICBrZXlzLnVuc2hpZnQoT1ZFUkZMT1dfS0VZKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleXM7XG4gIH0sIFtvdmVyZmxvd0tleXNdKTtcbiAgdmFyIGlzU3ViUGF0aEtleSA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChwYXRoS2V5cywgZXZlbnRLZXkpIHtcbiAgICByZXR1cm4gcGF0aEtleXMuc29tZShmdW5jdGlvbiAocGF0aEtleSkge1xuICAgICAgdmFyIHBhdGhLZXlMaXN0ID0gZ2V0S2V5UGF0aChwYXRoS2V5LCB0cnVlKTtcbiAgICAgIHJldHVybiBwYXRoS2V5TGlzdC5pbmNsdWRlcyhldmVudEtleSk7XG4gICAgfSk7XG4gIH0sIFtnZXRLZXlQYXRoXSk7XG4gIHZhciBnZXRLZXlzID0gZnVuY3Rpb24gZ2V0S2V5cygpIHtcbiAgICB2YXIga2V5cyA9IF90b0NvbnN1bWFibGVBcnJheShrZXkycGF0aFJlZi5jdXJyZW50LmtleXMoKSk7XG4gICAgaWYgKG92ZXJmbG93S2V5cy5sZW5ndGgpIHtcbiAgICAgIGtleXMucHVzaChPVkVSRkxPV19LRVkpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5cztcbiAgfTtcblxuICAvKipcbiAgICogRmluZCBjdXJyZW50IGtleSByZWxhdGVkIGNoaWxkIHBhdGgga2V5c1xuICAgKi9cbiAgdmFyIGdldFN1YlBhdGhLZXlzID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBjb25uZWN0ZWRQYXRoID0gXCJcIi5jb25jYXQoa2V5MnBhdGhSZWYuY3VycmVudC5nZXQoa2V5KSkuY29uY2F0KFBBVEhfU1BMSVQpO1xuICAgIHZhciBwYXRoS2V5cyA9IG5ldyBTZXQoKTtcbiAgICBfdG9Db25zdW1hYmxlQXJyYXkocGF0aDJrZXlSZWYuY3VycmVudC5rZXlzKCkpLmZvckVhY2goZnVuY3Rpb24gKHBhdGhLZXkpIHtcbiAgICAgIGlmIChwYXRoS2V5LnN0YXJ0c1dpdGgoY29ubmVjdGVkUGF0aCkpIHtcbiAgICAgICAgcGF0aEtleXMuYWRkKHBhdGgya2V5UmVmLmN1cnJlbnQuZ2V0KHBhdGhLZXkpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcGF0aEtleXM7XG4gIH0sIFtdKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZGVzdHJveVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiB7XG4gICAgLy8gUmVnaXN0ZXJcbiAgICByZWdpc3RlclBhdGg6IHJlZ2lzdGVyUGF0aCxcbiAgICB1bnJlZ2lzdGVyUGF0aDogdW5yZWdpc3RlclBhdGgsXG4gICAgcmVmcmVzaE92ZXJmbG93S2V5czogcmVmcmVzaE92ZXJmbG93S2V5cyxcbiAgICAvLyBVdGlsXG4gICAgaXNTdWJQYXRoS2V5OiBpc1N1YlBhdGhLZXksXG4gICAgZ2V0S2V5UGF0aDogZ2V0S2V5UGF0aCxcbiAgICBnZXRLZXlzOiBnZXRLZXlzLFxuICAgIGdldFN1YlBhdGhLZXlzOiBnZXRTdWJQYXRoS2V5c1xuICB9O1xufSIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcblxuLyoqXG4gKiBDYWNoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGFsd2F5cyByZXR1cm4gc2FtZSByZWYgaW5zdGVhZC5cbiAqIFRoaXMgaXMgdXNlZCBmb3IgY29udGV4dCBvcHRpbWl6YXRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZU1lbW9DYWxsYmFjayhmdW5jKSB7XG4gIHZhciBmdW5SZWYgPSBSZWFjdC51c2VSZWYoZnVuYyk7XG4gIGZ1blJlZi5jdXJyZW50ID0gZnVuYztcbiAgdmFyIGNhbGxiYWNrID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIHZhciBfZnVuUmVmJGN1cnJlbnQ7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICByZXR1cm4gKF9mdW5SZWYkY3VycmVudCA9IGZ1blJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfZnVuUmVmJGN1cnJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9mdW5SZWYkY3VycmVudC5jYWxsLmFwcGx5KF9mdW5SZWYkY3VycmVudCwgW2Z1blJlZl0uY29uY2F0KGFyZ3MpKTtcbiAgfSwgW10pO1xuICByZXR1cm4gZnVuYyA/IGNhbGxiYWNrIDogdW5kZWZpbmVkO1xufSIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG52YXIgdW5pcXVlUHJlZml4ID0gTWF0aC5yYW5kb20oKS50b0ZpeGVkKDUpLnRvU3RyaW5nKCkuc2xpY2UoMik7XG52YXIgaW50ZXJuYWxJZCA9IDA7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VVVUlEKGlkKSB7XG4gIHZhciBfdXNlTWVyZ2VkU3RhdGUgPSB1c2VNZXJnZWRTdGF0ZShpZCwge1xuICAgICAgdmFsdWU6IGlkXG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgdXVpZCA9IF91c2VNZXJnZWRTdGF0ZTJbMF0sXG4gICAgc2V0VVVJRCA9IF91c2VNZXJnZWRTdGF0ZTJbMV07XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaW50ZXJuYWxJZCArPSAxO1xuICAgIHZhciBuZXdJZCA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAndGVzdCcgPyAndGVzdCcgOiBcIlwiLmNvbmNhdCh1bmlxdWVQcmVmaXgsIFwiLVwiKS5jb25jYXQoaW50ZXJuYWxJZCk7XG4gICAgc2V0VVVJRChcInJjLW1lbnUtdXVpZC1cIi5jb25jYXQobmV3SWQpKTtcbiAgfSwgW10pO1xuICByZXR1cm4gdXVpZDtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBNZW51Q29udGV4dCB9IGZyb20gXCIuLi9jb250ZXh0L01lbnVDb250ZXh0XCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VBY3RpdmUoZXZlbnRLZXksIGRpc2FibGVkLCBvbk1vdXNlRW50ZXIsIG9uTW91c2VMZWF2ZSkge1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KE1lbnVDb250ZXh0KSxcbiAgICBhY3RpdmVLZXkgPSBfUmVhY3QkdXNlQ29udGV4dC5hY3RpdmVLZXksXG4gICAgb25BY3RpdmUgPSBfUmVhY3QkdXNlQ29udGV4dC5vbkFjdGl2ZSxcbiAgICBvbkluYWN0aXZlID0gX1JlYWN0JHVzZUNvbnRleHQub25JbmFjdGl2ZTtcbiAgdmFyIHJldCA9IHtcbiAgICBhY3RpdmU6IGFjdGl2ZUtleSA9PT0gZXZlbnRLZXlcbiAgfTtcblxuICAvLyBTa2lwIHdoZW4gZGlzYWJsZWRcbiAgaWYgKCFkaXNhYmxlZCkge1xuICAgIHJldC5vbk1vdXNlRW50ZXIgPSBmdW5jdGlvbiAoZG9tRXZlbnQpIHtcbiAgICAgIG9uTW91c2VFbnRlciA9PT0gbnVsbCB8fCBvbk1vdXNlRW50ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uTW91c2VFbnRlcih7XG4gICAgICAgIGtleTogZXZlbnRLZXksXG4gICAgICAgIGRvbUV2ZW50OiBkb21FdmVudFxuICAgICAgfSk7XG4gICAgICBvbkFjdGl2ZShldmVudEtleSk7XG4gICAgfTtcbiAgICByZXQub25Nb3VzZUxlYXZlID0gZnVuY3Rpb24gKGRvbUV2ZW50KSB7XG4gICAgICBvbk1vdXNlTGVhdmUgPT09IG51bGwgfHwgb25Nb3VzZUxlYXZlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbk1vdXNlTGVhdmUoe1xuICAgICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgICBkb21FdmVudDogZG9tRXZlbnRcbiAgICAgIH0pO1xuICAgICAgb25JbmFjdGl2ZShldmVudEtleSk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gcmV0O1xufSIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IE1lbnVDb250ZXh0IH0gZnJvbSBcIi4uL2NvbnRleHQvTWVudUNvbnRleHRcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZURpcmVjdGlvblN0eWxlKGxldmVsKSB7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoTWVudUNvbnRleHQpLFxuICAgIG1vZGUgPSBfUmVhY3QkdXNlQ29udGV4dC5tb2RlLFxuICAgIHJ0bCA9IF9SZWFjdCR1c2VDb250ZXh0LnJ0bCxcbiAgICBpbmxpbmVJbmRlbnQgPSBfUmVhY3QkdXNlQ29udGV4dC5pbmxpbmVJbmRlbnQ7XG4gIGlmIChtb2RlICE9PSAnaW5saW5lJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBsZW4gPSBsZXZlbDtcbiAgcmV0dXJuIHJ0bCA/IHtcbiAgICBwYWRkaW5nUmlnaHQ6IGxlbiAqIGlubGluZUluZGVudFxuICB9IDoge1xuICAgIHBhZGRpbmdMZWZ0OiBsZW4gKiBpbmxpbmVJbmRlbnRcbiAgfTtcbn0iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gSWNvbihfcmVmKSB7XG4gIHZhciBpY29uID0gX3JlZi5pY29uLFxuICAgIHByb3BzID0gX3JlZi5wcm9wcyxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gIHZhciBpY29uTm9kZTtcbiAgaWYgKHR5cGVvZiBpY29uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWNvbk5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChpY29uLCBfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcykpO1xuICB9IGVsc2Uge1xuICAgIC8vIENvbXBhdGlibGUgZm9yIG9yaWdpbiBkZWZpbml0aW9uXG4gICAgaWNvbk5vZGUgPSBpY29uO1xuICB9XG4gIHJldHVybiBpY29uTm9kZSB8fCBjaGlsZHJlbiB8fCBudWxsO1xufSIsImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiaXRlbVwiXTtcbmltcG9ydCB3YXJuaW5nIGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcblxuLyoqXG4gKiBgb25DbGlja2AgZXZlbnQgcmV0dXJuIGBpbmZvLml0ZW1gIHdoaWNoIHBvaW50IHRvIHJlYWN0IG5vZGUgZGlyZWN0bHkuXG4gKiBXZSBzaG91bGQgd2FybmluZyB0aGlzIHNpbmNlIGl0IHdpbGwgbm90IHdvcmsgb24gRkMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YXJuSXRlbVByb3AoX3JlZikge1xuICB2YXIgaXRlbSA9IF9yZWYuaXRlbSxcbiAgICByZXN0SW5mbyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzdEluZm8sICdpdGVtJywge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgd2FybmluZyhmYWxzZSwgJ2BpbmZvLml0ZW1gIGlzIGRlcHJlY2F0ZWQgc2luY2Ugd2Ugd2lsbCBtb3ZlIHRvIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IG5vdCBwcm92aWRlcyBSZWFjdCBOb2RlIGluc3RhbmNlIGluIGZ1dHVyZS4nKTtcbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN0SW5mbztcbn0iLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xudmFyIF9leGNsdWRlZCA9IFtcInRpdGxlXCIsIFwiYXR0cmlidXRlXCIsIFwiZWxlbWVudFJlZlwiXSxcbiAgX2V4Y2x1ZGVkMiA9IFtcInN0eWxlXCIsIFwiY2xhc3NOYW1lXCIsIFwiZXZlbnRLZXlcIiwgXCJ3YXJuS2V5XCIsIFwiZGlzYWJsZWRcIiwgXCJpdGVtSWNvblwiLCBcImNoaWxkcmVuXCIsIFwicm9sZVwiLCBcIm9uTW91c2VFbnRlclwiLCBcIm9uTW91c2VMZWF2ZVwiLCBcIm9uQ2xpY2tcIiwgXCJvbktleURvd25cIiwgXCJvbkZvY3VzXCJdLFxuICBfZXhjbHVkZWQzID0gW1wiYWN0aXZlXCJdO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgT3ZlcmZsb3cgZnJvbSAncmMtb3ZlcmZsb3cnO1xuaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuaW1wb3J0IG9taXQgZnJvbSBcInJjLXV0aWwvZXMvb21pdFwiO1xuaW1wb3J0IHsgdXNlQ29tcG9zZVJlZiB9IGZyb20gXCJyYy11dGlsL2VzL3JlZlwiO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlTWVudUlkIH0gZnJvbSBcIi4vY29udGV4dC9JZENvbnRleHRcIjtcbmltcG9ydCB7IE1lbnVDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dC9NZW51Q29udGV4dFwiO1xuaW1wb3J0IHsgdXNlRnVsbFBhdGgsIHVzZU1lYXN1cmUgfSBmcm9tIFwiLi9jb250ZXh0L1BhdGhDb250ZXh0XCI7XG5pbXBvcnQgUHJpdmF0ZUNvbnRleHQgZnJvbSBcIi4vY29udGV4dC9Qcml2YXRlQ29udGV4dFwiO1xuaW1wb3J0IHVzZUFjdGl2ZSBmcm9tIFwiLi9ob29rcy91c2VBY3RpdmVcIjtcbmltcG9ydCB1c2VEaXJlY3Rpb25TdHlsZSBmcm9tIFwiLi9ob29rcy91c2VEaXJlY3Rpb25TdHlsZVwiO1xuaW1wb3J0IEljb24gZnJvbSBcIi4vSWNvblwiO1xuaW1wb3J0IHsgd2Fybkl0ZW1Qcm9wIH0gZnJvbSBcIi4vdXRpbHMvd2FyblV0aWxcIjtcbi8vIFNpbmNlIE1lbnUgZXZlbnQgcHJvdmlkZSB0aGUgYGluZm8uaXRlbWAgd2hpY2ggcG9pbnQgdG8gdGhlIE1lbnVJdGVtIG5vZGUgaW5zdGFuY2UuXG4vLyBXZSBoYXZlIHRvIHVzZSBjbGFzcyBjb21wb25lbnQgaGVyZS5cbi8vIFRoaXMgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSBkb2MgJiBhcGkgaW4gZnV0dXJlLlxudmFyIExlZ2FjeU1lbnVJdGVtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhMZWdhY3lNZW51SXRlbSwgX1JlYWN0JENvbXBvbmVudCk7XG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoTGVnYWN5TWVudUl0ZW0pO1xuICBmdW5jdGlvbiBMZWdhY3lNZW51SXRlbSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTGVnYWN5TWVudUl0ZW0pO1xuICAgIHJldHVybiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoTGVnYWN5TWVudUl0ZW0sIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICB0aXRsZSA9IF90aGlzJHByb3BzLnRpdGxlLFxuICAgICAgICBhdHRyaWJ1dGUgPSBfdGhpcyRwcm9wcy5hdHRyaWJ1dGUsXG4gICAgICAgIGVsZW1lbnRSZWYgPSBfdGhpcyRwcm9wcy5lbGVtZW50UmVmLFxuICAgICAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3RoaXMkcHJvcHMsIF9leGNsdWRlZCk7XG5cbiAgICAgIC8vIEhlcmUgdGhlIHByb3BzIGFyZSBldmVudHVhbGx5IHBhc3NlZCB0byB0aGUgRE9NIGVsZW1lbnQuXG4gICAgICAvLyBSZWFjdCBkb2VzIG5vdCByZWNvZ25pemUgbm9uLXN0YW5kYXJkIGF0dHJpYnV0ZXMuXG4gICAgICAvLyBUaGVyZWZvcmUsIHJlbW92ZSB0aGUgcHJvcHMgdGhhdCBpcyBub3QgdXNlZCBoZXJlLlxuICAgICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80MTM5NVxuICAgICAgdmFyIHBhc3NlZFByb3BzID0gb21pdChyZXN0UHJvcHMsIFsnZXZlbnRLZXknLCAncG9wdXBDbGFzc05hbWUnLCAncG9wdXBPZmZzZXQnLCAnb25UaXRsZUNsaWNrJ10pO1xuICAgICAgd2FybmluZyghYXR0cmlidXRlLCAnYGF0dHJpYnV0ZWAgb2YgTWVudS5JdGVtIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBwYXNzIGF0dHJpYnV0ZSBkaXJlY3RseS4nKTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPdmVyZmxvdy5JdGVtLCBfZXh0ZW5kcyh7fSwgYXR0cmlidXRlLCB7XG4gICAgICAgIHRpdGxlOiB0eXBlb2YgdGl0bGUgPT09ICdzdHJpbmcnID8gdGl0bGUgOiB1bmRlZmluZWRcbiAgICAgIH0sIHBhc3NlZFByb3BzLCB7XG4gICAgICAgIHJlZjogZWxlbWVudFJlZlxuICAgICAgfSkpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gTGVnYWN5TWVudUl0ZW07XG59KFJlYWN0LkNvbXBvbmVudCk7XG4vKipcbiAqIFJlYWwgTWVudSBJdGVtIGNvbXBvbmVudFxuICovXG52YXIgSW50ZXJuYWxNZW51SXRlbSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcbiAgdmFyIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIGV2ZW50S2V5ID0gcHJvcHMuZXZlbnRLZXksXG4gICAgd2FybktleSA9IHByb3BzLndhcm5LZXksXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBpdGVtSWNvbiA9IHByb3BzLml0ZW1JY29uLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgcm9sZSA9IHByb3BzLnJvbGUsXG4gICAgb25Nb3VzZUVudGVyID0gcHJvcHMub25Nb3VzZUVudGVyLFxuICAgIG9uTW91c2VMZWF2ZSA9IHByb3BzLm9uTW91c2VMZWF2ZSxcbiAgICBvbkNsaWNrID0gcHJvcHMub25DbGljayxcbiAgICBvbktleURvd24gPSBwcm9wcy5vbktleURvd24sXG4gICAgb25Gb2N1cyA9IHByb3BzLm9uRm9jdXMsXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQyKTtcbiAgdmFyIGRvbURhdGFJZCA9IHVzZU1lbnVJZChldmVudEtleSk7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoTWVudUNvbnRleHQpLFxuICAgIHByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LnByZWZpeENscyxcbiAgICBvbkl0ZW1DbGljayA9IF9SZWFjdCR1c2VDb250ZXh0Lm9uSXRlbUNsaWNrLFxuICAgIGNvbnRleHREaXNhYmxlZCA9IF9SZWFjdCR1c2VDb250ZXh0LmRpc2FibGVkLFxuICAgIG92ZXJmbG93RGlzYWJsZWQgPSBfUmVhY3QkdXNlQ29udGV4dC5vdmVyZmxvd0Rpc2FibGVkLFxuICAgIGNvbnRleHRJdGVtSWNvbiA9IF9SZWFjdCR1c2VDb250ZXh0Lml0ZW1JY29uLFxuICAgIHNlbGVjdGVkS2V5cyA9IF9SZWFjdCR1c2VDb250ZXh0LnNlbGVjdGVkS2V5cyxcbiAgICBvbkFjdGl2ZSA9IF9SZWFjdCR1c2VDb250ZXh0Lm9uQWN0aXZlO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQyID0gUmVhY3QudXNlQ29udGV4dChQcml2YXRlQ29udGV4dCksXG4gICAgX2ludGVybmFsUmVuZGVyTWVudUl0ZW0gPSBfUmVhY3QkdXNlQ29udGV4dDIuX2ludGVybmFsUmVuZGVyTWVudUl0ZW07XG4gIHZhciBpdGVtQ2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtXCIpO1xuICB2YXIgbGVnYWN5TWVudUl0ZW1SZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIGVsZW1lbnRSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIG1lcmdlZERpc2FibGVkID0gY29udGV4dERpc2FibGVkIHx8IGRpc2FibGVkO1xuICB2YXIgbWVyZ2VkRWxlUmVmID0gdXNlQ29tcG9zZVJlZihyZWYsIGVsZW1lbnRSZWYpO1xuICB2YXIgY29ubmVjdGVkS2V5cyA9IHVzZUZ1bGxQYXRoKGV2ZW50S2V5KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBXYXJuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm5LZXkpIHtcbiAgICB3YXJuaW5nKGZhbHNlLCAnTWVudUl0ZW0gc2hvdWxkIG5vdCBsZWF2ZSB1bmRlZmluZWQgYGtleWAuJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJbmZvID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBnZXRFdmVudEluZm8gPSBmdW5jdGlvbiBnZXRFdmVudEluZm8oZSkge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgLy8gTm90ZTogRm9yIGxlZ2FjeSBjb2RlIGlzIHJldmVyc2VkIHdoaWNoIG5vdCBsaWtlIG90aGVyIGFudGQgY29tcG9uZW50XG4gICAgICBrZXlQYXRoOiBfdG9Db25zdW1hYmxlQXJyYXkoY29ubmVjdGVkS2V5cykucmV2ZXJzZSgpLFxuICAgICAgaXRlbTogbGVnYWN5TWVudUl0ZW1SZWYuY3VycmVudCxcbiAgICAgIGRvbUV2ZW50OiBlXG4gICAgfTtcbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJY29uID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZXJnZWRJdGVtSWNvbiA9IGl0ZW1JY29uIHx8IGNvbnRleHRJdGVtSWNvbjtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEFjdGl2ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlQWN0aXZlID0gdXNlQWN0aXZlKGV2ZW50S2V5LCBtZXJnZWREaXNhYmxlZCwgb25Nb3VzZUVudGVyLCBvbk1vdXNlTGVhdmUpLFxuICAgIGFjdGl2ZSA9IF91c2VBY3RpdmUuYWN0aXZlLFxuICAgIGFjdGl2ZVByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF91c2VBY3RpdmUsIF9leGNsdWRlZDMpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2VsZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHNlbGVjdGVkID0gc2VsZWN0ZWRLZXlzLmluY2x1ZGVzKGV2ZW50S2V5KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gRGlyZWN0aW9uU3R5bGUgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBkaXJlY3Rpb25TdHlsZSA9IHVzZURpcmVjdGlvblN0eWxlKGNvbm5lY3RlZEtleXMubGVuZ3RoKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEV2ZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvbkludGVybmFsQ2xpY2sgPSBmdW5jdGlvbiBvbkludGVybmFsQ2xpY2soZSkge1xuICAgIGlmIChtZXJnZWREaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaW5mbyA9IGdldEV2ZW50SW5mbyhlKTtcbiAgICBvbkNsaWNrID09PSBudWxsIHx8IG9uQ2xpY2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2xpY2sod2Fybkl0ZW1Qcm9wKGluZm8pKTtcbiAgICBvbkl0ZW1DbGljayhpbmZvKTtcbiAgfTtcbiAgdmFyIG9uSW50ZXJuYWxLZXlEb3duID0gZnVuY3Rpb24gb25JbnRlcm5hbEtleURvd24oZSkge1xuICAgIG9uS2V5RG93biA9PT0gbnVsbCB8fCBvbktleURvd24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uS2V5RG93bihlKTtcbiAgICBpZiAoZS53aGljaCA9PT0gS2V5Q29kZS5FTlRFUikge1xuICAgICAgdmFyIGluZm8gPSBnZXRFdmVudEluZm8oZSk7XG5cbiAgICAgIC8vIExlZ2FjeS4gS2V5IHdpbGwgYWxzbyB0cmlnZ2VyIGNsaWNrIGV2ZW50XG4gICAgICBvbkNsaWNrID09PSBudWxsIHx8IG9uQ2xpY2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2xpY2sod2Fybkl0ZW1Qcm9wKGluZm8pKTtcbiAgICAgIG9uSXRlbUNsaWNrKGluZm8pO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogVXNlZCBmb3IgYWNjZXNzaWJpbGl0eS4gSGVscGVyIHdpbGwgZm9jdXMgZWxlbWVudCB3aXRob3V0IGtleSBib2FyZC5cbiAgICogV2Ugc2hvdWxkIG1hbnVhbGx5IHRyaWdnZXIgYW4gYWN0aXZlXG4gICAqL1xuICB2YXIgb25JbnRlcm5hbEZvY3VzID0gZnVuY3Rpb24gb25JbnRlcm5hbEZvY3VzKGUpIHtcbiAgICBvbkFjdGl2ZShldmVudEtleSk7XG4gICAgb25Gb2N1cyA9PT0gbnVsbCB8fCBvbkZvY3VzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkZvY3VzKGUpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9wdGlvblJvbGVQcm9wcyA9IHt9O1xuICBpZiAocHJvcHMucm9sZSA9PT0gJ29wdGlvbicpIHtcbiAgICBvcHRpb25Sb2xlUHJvcHNbJ2FyaWEtc2VsZWN0ZWQnXSA9IHNlbGVjdGVkO1xuICB9XG4gIHZhciByZW5kZXJOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGVnYWN5TWVudUl0ZW0sIF9leHRlbmRzKHtcbiAgICByZWY6IGxlZ2FjeU1lbnVJdGVtUmVmLFxuICAgIGVsZW1lbnRSZWY6IG1lcmdlZEVsZVJlZixcbiAgICByb2xlOiByb2xlID09PSBudWxsID8gJ25vbmUnIDogcm9sZSB8fCAnbWVudWl0ZW0nLFxuICAgIHRhYkluZGV4OiBkaXNhYmxlZCA/IG51bGwgOiAtMSxcbiAgICBcImRhdGEtbWVudS1pZFwiOiBvdmVyZmxvd0Rpc2FibGVkICYmIGRvbURhdGFJZCA/IG51bGwgOiBkb21EYXRhSWRcbiAgfSwgcmVzdFByb3BzLCBhY3RpdmVQcm9wcywgb3B0aW9uUm9sZVByb3BzLCB7XG4gICAgY29tcG9uZW50OiBcImxpXCIsXG4gICAgXCJhcmlhLWRpc2FibGVkXCI6IGRpc2FibGVkLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRpcmVjdGlvblN0eWxlKSwgc3R5bGUpLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhpdGVtQ2xzLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChpdGVtQ2xzLCBcIi1hY3RpdmVcIiksIGFjdGl2ZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQoaXRlbUNscywgXCItc2VsZWN0ZWRcIiksIHNlbGVjdGVkKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChpdGVtQ2xzLCBcIi1kaXNhYmxlZFwiKSwgbWVyZ2VkRGlzYWJsZWQpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSksXG4gICAgb25DbGljazogb25JbnRlcm5hbENsaWNrLFxuICAgIG9uS2V5RG93bjogb25JbnRlcm5hbEtleURvd24sXG4gICAgb25Gb2N1czogb25JbnRlcm5hbEZvY3VzXG4gIH0pLCBjaGlsZHJlbiwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSWNvbiwge1xuICAgIHByb3BzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICAgIGlzU2VsZWN0ZWQ6IHNlbGVjdGVkXG4gICAgfSksXG4gICAgaWNvbjogbWVyZ2VkSXRlbUljb25cbiAgfSkpO1xuICBpZiAoX2ludGVybmFsUmVuZGVyTWVudUl0ZW0pIHtcbiAgICByZW5kZXJOb2RlID0gX2ludGVybmFsUmVuZGVyTWVudUl0ZW0ocmVuZGVyTm9kZSwgcHJvcHMsIHtcbiAgICAgIHNlbGVjdGVkOiBzZWxlY3RlZFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZW5kZXJOb2RlO1xufSk7XG5mdW5jdGlvbiBNZW51SXRlbShwcm9wcywgcmVmKSB7XG4gIHZhciBldmVudEtleSA9IHByb3BzLmV2ZW50S2V5O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFJlY29yZCBLZXlQYXRoID09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZWFzdXJlID0gdXNlTWVhc3VyZSgpO1xuICB2YXIgY29ubmVjdGVkS2V5UGF0aCA9IHVzZUZ1bGxQYXRoKGV2ZW50S2V5KTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAobWVhc3VyZSkge1xuICAgICAgbWVhc3VyZS5yZWdpc3RlclBhdGgoZXZlbnRLZXksIGNvbm5lY3RlZEtleVBhdGgpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbWVhc3VyZS51bnJlZ2lzdGVyUGF0aChldmVudEtleSwgY29ubmVjdGVkS2V5UGF0aCk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW2Nvbm5lY3RlZEtleVBhdGhdKTtcbiAgaWYgKG1lYXN1cmUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJbnRlcm5hbE1lbnVJdGVtLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZlxuICB9KSk7XG59XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihNZW51SXRlbSk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImNsYXNzTmFtZVwiLCBcImNoaWxkcmVuXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBNZW51Q29udGV4dCB9IGZyb20gXCIuLi9jb250ZXh0L01lbnVDb250ZXh0XCI7XG52YXIgSW50ZXJuYWxTdWJNZW51TGlzdCA9IGZ1bmN0aW9uIEludGVybmFsU3ViTWVudUxpc3QoX3JlZiwgcmVmKSB7XG4gIHZhciBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIF9leGNsdWRlZCk7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoTWVudUNvbnRleHQpLFxuICAgIHByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LnByZWZpeENscyxcbiAgICBtb2RlID0gX1JlYWN0JHVzZUNvbnRleHQubW9kZSxcbiAgICBydGwgPSBfUmVhY3QkdXNlQ29udGV4dC5ydGw7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBydGwgJiYgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3ViXCIpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQobW9kZSA9PT0gJ2lubGluZScgPyAnaW5saW5lJyA6ICd2ZXJ0aWNhbCcpLCBjbGFzc05hbWUpLFxuICAgIHJvbGU6IFwibWVudVwiXG4gIH0sIHJlc3RQcm9wcywge1xuICAgIFwiZGF0YS1tZW51LWxpc3RcIjogdHJ1ZSxcbiAgICByZWY6IHJlZlxuICB9KSwgY2hpbGRyZW4pO1xufTtcbnZhciBTdWJNZW51TGlzdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEludGVybmFsU3ViTWVudUxpc3QpO1xuU3ViTWVudUxpc3QuZGlzcGxheU5hbWUgPSAnU3ViTWVudUxpc3QnO1xuZXhwb3J0IGRlZmF1bHQgU3ViTWVudUxpc3Q7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJsYWJlbFwiLCBcImNoaWxkcmVuXCIsIFwia2V5XCIsIFwidHlwZVwiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0b0FycmF5IGZyb20gXCJyYy11dGlsL2VzL0NoaWxkcmVuL3RvQXJyYXlcIjtcbmltcG9ydCB7IERpdmlkZXIsIE1lbnVJdGVtLCBNZW51SXRlbUdyb3VwLCBTdWJNZW51IH0gZnJvbSAnLi4nO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ2hpbGRyZW4oY2hpbGRyZW4sIGtleVBhdGgpIHtcbiAgcmV0dXJuIHRvQXJyYXkoY2hpbGRyZW4pLm1hcChmdW5jdGlvbiAoY2hpbGQsIGluZGV4KSB7XG4gICAgaWYgKCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICB2YXIgX2V2ZW50S2V5LCBfY2hpbGQkcHJvcHM7XG4gICAgICB2YXIga2V5ID0gY2hpbGQua2V5O1xuICAgICAgdmFyIGV2ZW50S2V5ID0gKF9ldmVudEtleSA9IChfY2hpbGQkcHJvcHMgPSBjaGlsZC5wcm9wcykgPT09IG51bGwgfHwgX2NoaWxkJHByb3BzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY2hpbGQkcHJvcHMuZXZlbnRLZXkpICE9PSBudWxsICYmIF9ldmVudEtleSAhPT0gdm9pZCAwID8gX2V2ZW50S2V5IDoga2V5O1xuICAgICAgdmFyIGVtcHR5S2V5ID0gZXZlbnRLZXkgPT09IG51bGwgfHwgZXZlbnRLZXkgPT09IHVuZGVmaW5lZDtcbiAgICAgIGlmIChlbXB0eUtleSkge1xuICAgICAgICBldmVudEtleSA9IFwidG1wX2tleS1cIi5jb25jYXQoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShrZXlQYXRoKSwgW2luZGV4XSkuam9pbignLScpKTtcbiAgICAgIH1cbiAgICAgIHZhciBjbG9uZVByb3BzID0ge1xuICAgICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgICBldmVudEtleTogZXZlbnRLZXlcbiAgICAgIH07XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBlbXB0eUtleSkge1xuICAgICAgICBjbG9uZVByb3BzLndhcm5LZXkgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIGNsb25lUHJvcHMpO1xuICAgIH1cbiAgICByZXR1cm4gY2hpbGQ7XG4gIH0pO1xufVxuZnVuY3Rpb24gY29udmVydEl0ZW1zVG9Ob2RlcyhsaXN0KSB7XG4gIHJldHVybiAobGlzdCB8fCBbXSkubWFwKGZ1bmN0aW9uIChvcHQsIGluZGV4KSB7XG4gICAgaWYgKG9wdCAmJiBfdHlwZW9mKG9wdCkgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgX3JlZiA9IG9wdCxcbiAgICAgICAgbGFiZWwgPSBfcmVmLmxhYmVsLFxuICAgICAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgICAgIGtleSA9IF9yZWYua2V5LFxuICAgICAgICB0eXBlID0gX3JlZi50eXBlLFxuICAgICAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgICAgIHZhciBtZXJnZWRLZXkgPSBrZXkgIT09IG51bGwgJiYga2V5ICE9PSB2b2lkIDAgPyBrZXkgOiBcInRtcC1cIi5jb25jYXQoaW5kZXgpO1xuXG4gICAgICAvLyBNZW51SXRlbUdyb3VwICYgU3ViTWVudUl0ZW1cbiAgICAgIGlmIChjaGlsZHJlbiB8fCB0eXBlID09PSAnZ3JvdXAnKSB7XG4gICAgICAgIGlmICh0eXBlID09PSAnZ3JvdXAnKSB7XG4gICAgICAgICAgLy8gR3JvdXBcbiAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTWVudUl0ZW1Hcm91cCwgX2V4dGVuZHMoe1xuICAgICAgICAgICAga2V5OiBtZXJnZWRLZXlcbiAgICAgICAgICB9LCByZXN0UHJvcHMsIHtcbiAgICAgICAgICAgIHRpdGxlOiBsYWJlbFxuICAgICAgICAgIH0pLCBjb252ZXJ0SXRlbXNUb05vZGVzKGNoaWxkcmVuKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdWIgTWVudVxuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3ViTWVudSwgX2V4dGVuZHMoe1xuICAgICAgICAgIGtleTogbWVyZ2VkS2V5XG4gICAgICAgIH0sIHJlc3RQcm9wcywge1xuICAgICAgICAgIHRpdGxlOiBsYWJlbFxuICAgICAgICB9KSwgY29udmVydEl0ZW1zVG9Ob2RlcyhjaGlsZHJlbikpO1xuICAgICAgfVxuXG4gICAgICAvLyBNZW51SXRlbSAmIERpdmlkZXJcbiAgICAgIGlmICh0eXBlID09PSAnZGl2aWRlcicpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERpdmlkZXIsIF9leHRlbmRzKHtcbiAgICAgICAgICBrZXk6IG1lcmdlZEtleVxuICAgICAgICB9LCByZXN0UHJvcHMpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNZW51SXRlbSwgX2V4dGVuZHMoe1xuICAgICAgICBrZXk6IG1lcmdlZEtleVxuICAgICAgfSwgcmVzdFByb3BzKSwgbGFiZWwpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSkuZmlsdGVyKGZ1bmN0aW9uIChvcHQpIHtcbiAgICByZXR1cm4gb3B0O1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUl0ZW1zKGNoaWxkcmVuLCBpdGVtcywga2V5UGF0aCkge1xuICB2YXIgY2hpbGROb2RlcyA9IGNoaWxkcmVuO1xuICBpZiAoaXRlbXMpIHtcbiAgICBjaGlsZE5vZGVzID0gY29udmVydEl0ZW1zVG9Ob2RlcyhpdGVtcyk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlQ2hpbGRyZW4oY2hpbGROb2Rlcywga2V5UGF0aCk7XG59IiwidmFyIGF1dG9BZGp1c3RPdmVyZmxvdyA9IHtcbiAgYWRqdXN0WDogMSxcbiAgYWRqdXN0WTogMVxufTtcbmV4cG9ydCB2YXIgcGxhY2VtZW50cyA9IHtcbiAgdG9wTGVmdDoge1xuICAgIHBvaW50czogWydibCcsICd0bCddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbMCwgLTddXG4gIH0sXG4gIGJvdHRvbUxlZnQ6IHtcbiAgICBwb2ludHM6IFsndGwnLCAnYmwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIDddXG4gIH0sXG4gIGxlZnRUb3A6IHtcbiAgICBwb2ludHM6IFsndHInLCAndGwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWy00LCAwXVxuICB9LFxuICByaWdodFRvcDoge1xuICAgIHBvaW50czogWyd0bCcsICd0ciddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbNCwgMF1cbiAgfVxufTtcbmV4cG9ydCB2YXIgcGxhY2VtZW50c1J0bCA9IHtcbiAgdG9wTGVmdDoge1xuICAgIHBvaW50czogWydibCcsICd0bCddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbMCwgLTddXG4gIH0sXG4gIGJvdHRvbUxlZnQ6IHtcbiAgICBwb2ludHM6IFsndGwnLCAnYmwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIDddXG4gIH0sXG4gIHJpZ2h0VG9wOiB7XG4gICAgcG9pbnRzOiBbJ3RyJywgJ3RsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFstNCwgMF1cbiAgfSxcbiAgbGVmdFRvcDoge1xuICAgIHBvaW50czogWyd0bCcsICd0ciddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbNCwgMF1cbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IHBsYWNlbWVudHM7IiwiZXhwb3J0IGZ1bmN0aW9uIGdldE1vdGlvbihtb2RlLCBtb3Rpb24sIGRlZmF1bHRNb3Rpb25zKSB7XG4gIGlmIChtb3Rpb24pIHtcbiAgICByZXR1cm4gbW90aW9uO1xuICB9XG4gIGlmIChkZWZhdWx0TW90aW9ucykge1xuICAgIHJldHVybiBkZWZhdWx0TW90aW9uc1ttb2RlXSB8fCBkZWZhdWx0TW90aW9ucy5vdGhlcjtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufSIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgVHJpZ2dlciBmcm9tICdyYy10cmlnZ2VyJztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbmltcG9ydCB7IE1lbnVDb250ZXh0IH0gZnJvbSBcIi4uL2NvbnRleHQvTWVudUNvbnRleHRcIjtcbmltcG9ydCB7IHBsYWNlbWVudHMsIHBsYWNlbWVudHNSdGwgfSBmcm9tIFwiLi4vcGxhY2VtZW50c1wiO1xuaW1wb3J0IHsgZ2V0TW90aW9uIH0gZnJvbSBcIi4uL3V0aWxzL21vdGlvblV0aWxcIjtcbnZhciBwb3B1cFBsYWNlbWVudE1hcCA9IHtcbiAgaG9yaXpvbnRhbDogJ2JvdHRvbUxlZnQnLFxuICB2ZXJ0aWNhbDogJ3JpZ2h0VG9wJyxcbiAgJ3ZlcnRpY2FsLWxlZnQnOiAncmlnaHRUb3AnLFxuICAndmVydGljYWwtcmlnaHQnOiAnbGVmdFRvcCdcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBQb3B1cFRyaWdnZXIoX3JlZikge1xuICB2YXIgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgdmlzaWJsZSA9IF9yZWYudmlzaWJsZSxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgcG9wdXAgPSBfcmVmLnBvcHVwLFxuICAgIHBvcHVwQ2xhc3NOYW1lID0gX3JlZi5wb3B1cENsYXNzTmFtZSxcbiAgICBwb3B1cE9mZnNldCA9IF9yZWYucG9wdXBPZmZzZXQsXG4gICAgZGlzYWJsZWQgPSBfcmVmLmRpc2FibGVkLFxuICAgIG1vZGUgPSBfcmVmLm1vZGUsXG4gICAgb25WaXNpYmxlQ2hhbmdlID0gX3JlZi5vblZpc2libGVDaGFuZ2U7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoTWVudUNvbnRleHQpLFxuICAgIGdldFBvcHVwQ29udGFpbmVyID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgcnRsID0gX1JlYWN0JHVzZUNvbnRleHQucnRsLFxuICAgIHN1Yk1lbnVPcGVuRGVsYXkgPSBfUmVhY3QkdXNlQ29udGV4dC5zdWJNZW51T3BlbkRlbGF5LFxuICAgIHN1Yk1lbnVDbG9zZURlbGF5ID0gX1JlYWN0JHVzZUNvbnRleHQuc3ViTWVudUNsb3NlRGVsYXksXG4gICAgYnVpbHRpblBsYWNlbWVudHMgPSBfUmVhY3QkdXNlQ29udGV4dC5idWlsdGluUGxhY2VtZW50cyxcbiAgICB0cmlnZ2VyU3ViTWVudUFjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LnRyaWdnZXJTdWJNZW51QWN0aW9uLFxuICAgIGZvcmNlU3ViTWVudVJlbmRlciA9IF9SZWFjdCR1c2VDb250ZXh0LmZvcmNlU3ViTWVudVJlbmRlcixcbiAgICByb290Q2xhc3NOYW1lID0gX1JlYWN0JHVzZUNvbnRleHQucm9vdENsYXNzTmFtZSxcbiAgICBtb3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5tb3Rpb24sXG4gICAgZGVmYXVsdE1vdGlvbnMgPSBfUmVhY3QkdXNlQ29udGV4dC5kZWZhdWx0TW90aW9ucztcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBpbm5lclZpc2libGUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldElubmVyVmlzaWJsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBwbGFjZW1lbnQgPSBydGwgPyBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHBsYWNlbWVudHNSdGwpLCBidWlsdGluUGxhY2VtZW50cykgOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHBsYWNlbWVudHMpLCBidWlsdGluUGxhY2VtZW50cyk7XG4gIHZhciBwb3B1cFBsYWNlbWVudCA9IHBvcHVwUGxhY2VtZW50TWFwW21vZGVdO1xuICB2YXIgdGFyZ2V0TW90aW9uID0gZ2V0TW90aW9uKG1vZGUsIG1vdGlvbiwgZGVmYXVsdE1vdGlvbnMpO1xuICB2YXIgdGFyZ2V0TW90aW9uUmVmID0gUmVhY3QudXNlUmVmKHRhcmdldE1vdGlvbik7XG4gIGlmIChtb2RlICE9PSAnaW5saW5lJykge1xuICAgIC8qKlxuICAgICAqIFBvcHVwVHJpZ2dlciBpcyBvbmx5IHVzZWQgZm9yIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIHR5cGVzLlxuICAgICAqIFdoZW4gY29sbGFwc2VkIGlzIHVuZm9sZGVkLCB0aGUgaW5saW5lIGFuaW1hdGlvbiB3aWxsIGRlc3Ryb3kgdGhlIHZlcnRpY2FsIGFuaW1hdGlvbi5cbiAgICAgKi9cbiAgICB0YXJnZXRNb3Rpb25SZWYuY3VycmVudCA9IHRhcmdldE1vdGlvbjtcbiAgfVxuICB2YXIgbWVyZ2VkTW90aW9uID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0YXJnZXRNb3Rpb25SZWYuY3VycmVudCksIHt9LCB7XG4gICAgbGVhdmVkQ2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhpZGRlblwiKSxcbiAgICByZW1vdmVPbkxlYXZlOiBmYWxzZSxcbiAgICBtb3Rpb25BcHBlYXI6IHRydWVcbiAgfSk7XG5cbiAgLy8gRGVsYXkgdG8gY2hhbmdlIHZpc2libGVcbiAgdmFyIHZpc2libGVSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2aXNpYmxlUmVmLmN1cnJlbnQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgc2V0SW5uZXJWaXNpYmxlKHZpc2libGUpO1xuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByYWYuY2FuY2VsKHZpc2libGVSZWYuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW3Zpc2libGVdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyaWdnZXIsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBwb3B1cENsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBvcHVwXCIpLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBydGwpLCBwb3B1cENsYXNzTmFtZSwgcm9vdENsYXNzTmFtZSksXG4gICAgc3RyZXRjaDogbW9kZSA9PT0gJ2hvcml6b250YWwnID8gJ21pbldpZHRoJyA6IG51bGwsXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyLFxuICAgIGJ1aWx0aW5QbGFjZW1lbnRzOiBwbGFjZW1lbnQsXG4gICAgcG9wdXBQbGFjZW1lbnQ6IHBvcHVwUGxhY2VtZW50LFxuICAgIHBvcHVwVmlzaWJsZTogaW5uZXJWaXNpYmxlLFxuICAgIHBvcHVwOiBwb3B1cCxcbiAgICBwb3B1cEFsaWduOiBwb3B1cE9mZnNldCAmJiB7XG4gICAgICBvZmZzZXQ6IHBvcHVwT2Zmc2V0XG4gICAgfSxcbiAgICBhY3Rpb246IGRpc2FibGVkID8gW10gOiBbdHJpZ2dlclN1Yk1lbnVBY3Rpb25dLFxuICAgIG1vdXNlRW50ZXJEZWxheTogc3ViTWVudU9wZW5EZWxheSxcbiAgICBtb3VzZUxlYXZlRGVsYXk6IHN1Yk1lbnVDbG9zZURlbGF5LFxuICAgIG9uUG9wdXBWaXNpYmxlQ2hhbmdlOiBvblZpc2libGVDaGFuZ2UsXG4gICAgZm9yY2VSZW5kZXI6IGZvcmNlU3ViTWVudVJlbmRlcixcbiAgICBwb3B1cE1vdGlvbjogbWVyZ2VkTW90aW9uXG4gIH0sIGNoaWxkcmVuKTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDU1NNb3Rpb24gZnJvbSAncmMtbW90aW9uJztcbmltcG9ydCB7IGdldE1vdGlvbiB9IGZyb20gXCIuLi91dGlscy9tb3Rpb25VdGlsXCI7XG5pbXBvcnQgTWVudUNvbnRleHRQcm92aWRlciwgeyBNZW51Q29udGV4dCB9IGZyb20gXCIuLi9jb250ZXh0L01lbnVDb250ZXh0XCI7XG5pbXBvcnQgU3ViTWVudUxpc3QgZnJvbSBcIi4vU3ViTWVudUxpc3RcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIElubGluZVN1Yk1lbnVMaXN0KF9yZWYpIHtcbiAgdmFyIGlkID0gX3JlZi5pZCxcbiAgICBvcGVuID0gX3JlZi5vcGVuLFxuICAgIGtleVBhdGggPSBfcmVmLmtleVBhdGgsXG4gICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuO1xuICB2YXIgZml4ZWRNb2RlID0gJ2lubGluZSc7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoTWVudUNvbnRleHQpLFxuICAgIHByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LnByZWZpeENscyxcbiAgICBmb3JjZVN1Yk1lbnVSZW5kZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5mb3JjZVN1Yk1lbnVSZW5kZXIsXG4gICAgbW90aW9uID0gX1JlYWN0JHVzZUNvbnRleHQubW90aW9uLFxuICAgIGRlZmF1bHRNb3Rpb25zID0gX1JlYWN0JHVzZUNvbnRleHQuZGVmYXVsdE1vdGlvbnMsXG4gICAgbW9kZSA9IF9SZWFjdCR1c2VDb250ZXh0Lm1vZGU7XG5cbiAgLy8gQWx3YXlzIHVzZSBsYXRlc3QgbW9kZSBjaGVja1xuICB2YXIgc2FtZU1vZGVSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBzYW1lTW9kZVJlZi5jdXJyZW50ID0gbW9kZSA9PT0gZml4ZWRNb2RlO1xuXG4gIC8vIFdlIHJlY29yZCBgZGVzdHJveWAgbWFyayBoZXJlIHNpbmNlIHdoZW4gbW9kZSBjaGFuZ2UgZnJvbSBgaW5saW5lYCB0byBvdGhlcnMuXG4gIC8vIFRoZSBpbmxpbmUgbGlzdCBzaG91bGQgcmVtb3ZlIHdoZW4gbW90aW9uIGVuZC5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKCFzYW1lTW9kZVJlZi5jdXJyZW50KSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBkZXN0cm95ID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXREZXN0cm95ID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIG1lcmdlZE9wZW4gPSBzYW1lTW9kZVJlZi5jdXJyZW50ID8gb3BlbiA6IGZhbHNlO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJlc2V0IGRlc3Ryb3kgc3RhdGUgd2hlbiBtb2RlIGNoYW5nZSBiYWNrXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNhbWVNb2RlUmVmLmN1cnJlbnQpIHtcbiAgICAgIHNldERlc3Ryb3koZmFsc2UpO1xuICAgIH1cbiAgfSwgW21vZGVdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWVyZ2VkTW90aW9uID0gX29iamVjdFNwcmVhZCh7fSwgZ2V0TW90aW9uKGZpeGVkTW9kZSwgbW90aW9uLCBkZWZhdWx0TW90aW9ucykpO1xuXG4gIC8vIE5vIG5lZWQgYXBwZWFyIHNpbmNlIG5lc3QgaW5saW5lQ29sbGFwc2UgY2hhbmdlZFxuICBpZiAoa2V5UGF0aC5sZW5ndGggPiAxKSB7XG4gICAgbWVyZ2VkTW90aW9uLm1vdGlvbkFwcGVhciA9IGZhbHNlO1xuICB9XG5cbiAgLy8gSGlkZSBpbmxpbmUgbGlzdCB3aGVuIG1vZGUgY2hhbmdlZCBhbmQgbW90aW9uIGVuZFxuICB2YXIgb3JpZ2luT25WaXNpYmxlQ2hhbmdlZCA9IG1lcmdlZE1vdGlvbi5vblZpc2libGVDaGFuZ2VkO1xuICBtZXJnZWRNb3Rpb24ub25WaXNpYmxlQ2hhbmdlZCA9IGZ1bmN0aW9uIChuZXdWaXNpYmxlKSB7XG4gICAgaWYgKCFzYW1lTW9kZVJlZi5jdXJyZW50ICYmICFuZXdWaXNpYmxlKSB7XG4gICAgICBzZXREZXN0cm95KHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gb3JpZ2luT25WaXNpYmxlQ2hhbmdlZCA9PT0gbnVsbCB8fCBvcmlnaW5PblZpc2libGVDaGFuZ2VkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5PblZpc2libGVDaGFuZ2VkKG5ld1Zpc2libGUpO1xuICB9O1xuICBpZiAoZGVzdHJveSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNZW51Q29udGV4dFByb3ZpZGVyLCB7XG4gICAgbW9kZTogZml4ZWRNb2RlLFxuICAgIGxvY2tlZDogIXNhbWVNb2RlUmVmLmN1cnJlbnRcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ1NTTW90aW9uLCBfZXh0ZW5kcyh7XG4gICAgdmlzaWJsZTogbWVyZ2VkT3BlblxuICB9LCBtZXJnZWRNb3Rpb24sIHtcbiAgICBmb3JjZVJlbmRlcjogZm9yY2VTdWJNZW51UmVuZGVyLFxuICAgIHJlbW92ZU9uTGVhdmU6IGZhbHNlLFxuICAgIGxlYXZlZENsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oaWRkZW5cIilcbiAgfSksIGZ1bmN0aW9uIChfcmVmMikge1xuICAgIHZhciBtb3Rpb25DbGFzc05hbWUgPSBfcmVmMi5jbGFzc05hbWUsXG4gICAgICBtb3Rpb25TdHlsZSA9IF9yZWYyLnN0eWxlO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTdWJNZW51TGlzdCwge1xuICAgICAgaWQ6IGlkLFxuICAgICAgY2xhc3NOYW1lOiBtb3Rpb25DbGFzc05hbWUsXG4gICAgICBzdHlsZTogbW90aW9uU3R5bGVcbiAgICB9LCBjaGlsZHJlbik7XG4gIH0pKTtcbn0iLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInN0eWxlXCIsIFwiY2xhc3NOYW1lXCIsIFwidGl0bGVcIiwgXCJldmVudEtleVwiLCBcIndhcm5LZXlcIiwgXCJkaXNhYmxlZFwiLCBcImludGVybmFsUG9wdXBDbG9zZVwiLCBcImNoaWxkcmVuXCIsIFwiaXRlbUljb25cIiwgXCJleHBhbmRJY29uXCIsIFwicG9wdXBDbGFzc05hbWVcIiwgXCJwb3B1cE9mZnNldFwiLCBcIm9uQ2xpY2tcIiwgXCJvbk1vdXNlRW50ZXJcIiwgXCJvbk1vdXNlTGVhdmVcIiwgXCJvblRpdGxlQ2xpY2tcIiwgXCJvblRpdGxlTW91c2VFbnRlclwiLCBcIm9uVGl0bGVNb3VzZUxlYXZlXCJdLFxuICBfZXhjbHVkZWQyID0gW1wiYWN0aXZlXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgT3ZlcmZsb3cgZnJvbSAncmMtb3ZlcmZsb3cnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IFN1Yk1lbnVMaXN0IGZyb20gXCIuL1N1Yk1lbnVMaXN0XCI7XG5pbXBvcnQgeyBwYXJzZUNoaWxkcmVuIH0gZnJvbSBcIi4uL3V0aWxzL25vZGVVdGlsXCI7XG5pbXBvcnQgTWVudUNvbnRleHRQcm92aWRlciwgeyBNZW51Q29udGV4dCB9IGZyb20gXCIuLi9jb250ZXh0L01lbnVDb250ZXh0XCI7XG5pbXBvcnQgdXNlTWVtb0NhbGxiYWNrIGZyb20gXCIuLi9ob29rcy91c2VNZW1vQ2FsbGJhY2tcIjtcbmltcG9ydCBQb3B1cFRyaWdnZXIgZnJvbSBcIi4vUG9wdXBUcmlnZ2VyXCI7XG5pbXBvcnQgSWNvbiBmcm9tIFwiLi4vSWNvblwiO1xuaW1wb3J0IHVzZUFjdGl2ZSBmcm9tIFwiLi4vaG9va3MvdXNlQWN0aXZlXCI7XG5pbXBvcnQgeyB3YXJuSXRlbVByb3AgfSBmcm9tIFwiLi4vdXRpbHMvd2FyblV0aWxcIjtcbmltcG9ydCB1c2VEaXJlY3Rpb25TdHlsZSBmcm9tIFwiLi4vaG9va3MvdXNlRGlyZWN0aW9uU3R5bGVcIjtcbmltcG9ydCBJbmxpbmVTdWJNZW51TGlzdCBmcm9tIFwiLi9JbmxpbmVTdWJNZW51TGlzdFwiO1xuaW1wb3J0IHsgUGF0aFRyYWNrZXJDb250ZXh0LCBQYXRoVXNlckNvbnRleHQsIHVzZUZ1bGxQYXRoLCB1c2VNZWFzdXJlIH0gZnJvbSBcIi4uL2NvbnRleHQvUGF0aENvbnRleHRcIjtcbmltcG9ydCB7IHVzZU1lbnVJZCB9IGZyb20gXCIuLi9jb250ZXh0L0lkQ29udGV4dFwiO1xuaW1wb3J0IFByaXZhdGVDb250ZXh0IGZyb20gXCIuLi9jb250ZXh0L1ByaXZhdGVDb250ZXh0XCI7XG52YXIgSW50ZXJuYWxTdWJNZW51ID0gZnVuY3Rpb24gSW50ZXJuYWxTdWJNZW51KHByb3BzKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcbiAgdmFyIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHRpdGxlID0gcHJvcHMudGl0bGUsXG4gICAgZXZlbnRLZXkgPSBwcm9wcy5ldmVudEtleSxcbiAgICB3YXJuS2V5ID0gcHJvcHMud2FybktleSxcbiAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgIGludGVybmFsUG9wdXBDbG9zZSA9IHByb3BzLmludGVybmFsUG9wdXBDbG9zZSxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIGl0ZW1JY29uID0gcHJvcHMuaXRlbUljb24sXG4gICAgZXhwYW5kSWNvbiA9IHByb3BzLmV4cGFuZEljb24sXG4gICAgcG9wdXBDbGFzc05hbWUgPSBwcm9wcy5wb3B1cENsYXNzTmFtZSxcbiAgICBwb3B1cE9mZnNldCA9IHByb3BzLnBvcHVwT2Zmc2V0LFxuICAgIG9uQ2xpY2sgPSBwcm9wcy5vbkNsaWNrLFxuICAgIG9uTW91c2VFbnRlciA9IHByb3BzLm9uTW91c2VFbnRlcixcbiAgICBvbk1vdXNlTGVhdmUgPSBwcm9wcy5vbk1vdXNlTGVhdmUsXG4gICAgb25UaXRsZUNsaWNrID0gcHJvcHMub25UaXRsZUNsaWNrLFxuICAgIG9uVGl0bGVNb3VzZUVudGVyID0gcHJvcHMub25UaXRsZU1vdXNlRW50ZXIsXG4gICAgb25UaXRsZU1vdXNlTGVhdmUgPSBwcm9wcy5vblRpdGxlTW91c2VMZWF2ZSxcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG4gIHZhciBkb21EYXRhSWQgPSB1c2VNZW51SWQoZXZlbnRLZXkpO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KE1lbnVDb250ZXh0KSxcbiAgICBwcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5wcmVmaXhDbHMsXG4gICAgbW9kZSA9IF9SZWFjdCR1c2VDb250ZXh0Lm1vZGUsXG4gICAgb3BlbktleXMgPSBfUmVhY3QkdXNlQ29udGV4dC5vcGVuS2V5cyxcbiAgICBjb250ZXh0RGlzYWJsZWQgPSBfUmVhY3QkdXNlQ29udGV4dC5kaXNhYmxlZCxcbiAgICBvdmVyZmxvd0Rpc2FibGVkID0gX1JlYWN0JHVzZUNvbnRleHQub3ZlcmZsb3dEaXNhYmxlZCxcbiAgICBhY3RpdmVLZXkgPSBfUmVhY3QkdXNlQ29udGV4dC5hY3RpdmVLZXksXG4gICAgc2VsZWN0ZWRLZXlzID0gX1JlYWN0JHVzZUNvbnRleHQuc2VsZWN0ZWRLZXlzLFxuICAgIGNvbnRleHRJdGVtSWNvbiA9IF9SZWFjdCR1c2VDb250ZXh0Lml0ZW1JY29uLFxuICAgIGNvbnRleHRFeHBhbmRJY29uID0gX1JlYWN0JHVzZUNvbnRleHQuZXhwYW5kSWNvbixcbiAgICBvbkl0ZW1DbGljayA9IF9SZWFjdCR1c2VDb250ZXh0Lm9uSXRlbUNsaWNrLFxuICAgIG9uT3BlbkNoYW5nZSA9IF9SZWFjdCR1c2VDb250ZXh0Lm9uT3BlbkNoYW5nZSxcbiAgICBvbkFjdGl2ZSA9IF9SZWFjdCR1c2VDb250ZXh0Lm9uQWN0aXZlO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQyID0gUmVhY3QudXNlQ29udGV4dChQcml2YXRlQ29udGV4dCksXG4gICAgX2ludGVybmFsUmVuZGVyU3ViTWVudUl0ZW0gPSBfUmVhY3QkdXNlQ29udGV4dDIuX2ludGVybmFsUmVuZGVyU3ViTWVudUl0ZW07XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dDMgPSBSZWFjdC51c2VDb250ZXh0KFBhdGhVc2VyQ29udGV4dCksXG4gICAgaXNTdWJQYXRoS2V5ID0gX1JlYWN0JHVzZUNvbnRleHQzLmlzU3ViUGF0aEtleTtcbiAgdmFyIGNvbm5lY3RlZFBhdGggPSB1c2VGdWxsUGF0aCgpO1xuICB2YXIgc3ViTWVudVByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3VibWVudVwiKTtcbiAgdmFyIG1lcmdlZERpc2FibGVkID0gY29udGV4dERpc2FibGVkIHx8IGRpc2FibGVkO1xuICB2YXIgZWxlbWVudFJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICB2YXIgcG9wdXBSZWYgPSBSZWFjdC51c2VSZWYoKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBXYXJuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm5LZXkpIHtcbiAgICB3YXJuaW5nKGZhbHNlLCAnU3ViTWVudSBzaG91bGQgbm90IGxlYXZlIHVuZGVmaW5lZCBga2V5YC4nKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEljb24gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG1lcmdlZEl0ZW1JY29uID0gaXRlbUljb24gfHwgY29udGV4dEl0ZW1JY29uO1xuICB2YXIgbWVyZ2VkRXhwYW5kSWNvbiA9IGV4cGFuZEljb24gfHwgY29udGV4dEV4cGFuZEljb247XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gT3BlbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb3JpZ2luT3BlbiA9IG9wZW5LZXlzLmluY2x1ZGVzKGV2ZW50S2V5KTtcbiAgdmFyIG9wZW4gPSAhb3ZlcmZsb3dEaXNhYmxlZCAmJiBvcmlnaW5PcGVuO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2VsZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGNoaWxkcmVuU2VsZWN0ZWQgPSBpc1N1YlBhdGhLZXkoc2VsZWN0ZWRLZXlzLCBldmVudEtleSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBBY3RpdmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZUFjdGl2ZSA9IHVzZUFjdGl2ZShldmVudEtleSwgbWVyZ2VkRGlzYWJsZWQsIG9uVGl0bGVNb3VzZUVudGVyLCBvblRpdGxlTW91c2VMZWF2ZSksXG4gICAgYWN0aXZlID0gX3VzZUFjdGl2ZS5hY3RpdmUsXG4gICAgYWN0aXZlUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3VzZUFjdGl2ZSwgX2V4Y2x1ZGVkMik7XG5cbiAgLy8gRmFsbGJhY2sgb2YgYWN0aXZlIGNoZWNrIHRvIGF2b2lkIGhvdmVyIG9uIG1lbnUgdGl0bGUgb3IgZGlzYWJsZWQgaXRlbVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIGNoaWxkcmVuQWN0aXZlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRDaGlsZHJlbkFjdGl2ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciB0cmlnZ2VyQ2hpbGRyZW5BY3RpdmUgPSBmdW5jdGlvbiB0cmlnZ2VyQ2hpbGRyZW5BY3RpdmUobmV3QWN0aXZlKSB7XG4gICAgaWYgKCFtZXJnZWREaXNhYmxlZCkge1xuICAgICAgc2V0Q2hpbGRyZW5BY3RpdmUobmV3QWN0aXZlKTtcbiAgICB9XG4gIH07XG4gIHZhciBvbkludGVybmFsTW91c2VFbnRlciA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxNb3VzZUVudGVyKGRvbUV2ZW50KSB7XG4gICAgdHJpZ2dlckNoaWxkcmVuQWN0aXZlKHRydWUpO1xuICAgIG9uTW91c2VFbnRlciA9PT0gbnVsbCB8fCBvbk1vdXNlRW50ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uTW91c2VFbnRlcih7XG4gICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgZG9tRXZlbnQ6IGRvbUV2ZW50XG4gICAgfSk7XG4gIH07XG4gIHZhciBvbkludGVybmFsTW91c2VMZWF2ZSA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxNb3VzZUxlYXZlKGRvbUV2ZW50KSB7XG4gICAgdHJpZ2dlckNoaWxkcmVuQWN0aXZlKGZhbHNlKTtcbiAgICBvbk1vdXNlTGVhdmUgPT09IG51bGwgfHwgb25Nb3VzZUxlYXZlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbk1vdXNlTGVhdmUoe1xuICAgICAga2V5OiBldmVudEtleSxcbiAgICAgIGRvbUV2ZW50OiBkb21FdmVudFxuICAgIH0pO1xuICB9O1xuICB2YXIgbWVyZ2VkQWN0aXZlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGFjdGl2ZSkge1xuICAgICAgcmV0dXJuIGFjdGl2ZTtcbiAgICB9XG4gICAgaWYgKG1vZGUgIT09ICdpbmxpbmUnKSB7XG4gICAgICByZXR1cm4gY2hpbGRyZW5BY3RpdmUgfHwgaXNTdWJQYXRoS2V5KFthY3RpdmVLZXldLCBldmVudEtleSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSwgW21vZGUsIGFjdGl2ZSwgYWN0aXZlS2V5LCBjaGlsZHJlbkFjdGl2ZSwgZXZlbnRLZXksIGlzU3ViUGF0aEtleV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IERpcmVjdGlvblN0eWxlID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBkaXJlY3Rpb25TdHlsZSA9IHVzZURpcmVjdGlvblN0eWxlKGNvbm5lY3RlZFBhdGgubGVuZ3RoKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEV2ZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID4+Pj4gVGl0bGUgY2xpY2tcbiAgdmFyIG9uSW50ZXJuYWxUaXRsZUNsaWNrID0gZnVuY3Rpb24gb25JbnRlcm5hbFRpdGxlQ2xpY2soZSkge1xuICAgIC8vIFNraXAgaWYgZGlzYWJsZWRcbiAgICBpZiAobWVyZ2VkRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgb25UaXRsZUNsaWNrID09PSBudWxsIHx8IG9uVGl0bGVDbGljayA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25UaXRsZUNsaWNrKHtcbiAgICAgIGtleTogZXZlbnRLZXksXG4gICAgICBkb21FdmVudDogZVxuICAgIH0pO1xuXG4gICAgLy8gVHJpZ2dlciBvcGVuIGJ5IGNsaWNrIHdoZW4gbW9kZSBpcyBgaW5saW5lYFxuICAgIGlmIChtb2RlID09PSAnaW5saW5lJykge1xuICAgICAgb25PcGVuQ2hhbmdlKGV2ZW50S2V5LCAhb3JpZ2luT3Blbik7XG4gICAgfVxuICB9O1xuXG4gIC8vID4+Pj4gQ29udGV4dCBmb3IgY2hpbGRyZW4gY2xpY2tcbiAgdmFyIG9uTWVyZ2VkSXRlbUNsaWNrID0gdXNlTWVtb0NhbGxiYWNrKGZ1bmN0aW9uIChpbmZvKSB7XG4gICAgb25DbGljayA9PT0gbnVsbCB8fCBvbkNsaWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNsaWNrKHdhcm5JdGVtUHJvcChpbmZvKSk7XG4gICAgb25JdGVtQ2xpY2soaW5mbyk7XG4gIH0pO1xuXG4gIC8vID4+Pj4+IFZpc2libGUgY2hhbmdlXG4gIHZhciBvblBvcHVwVmlzaWJsZUNoYW5nZSA9IGZ1bmN0aW9uIG9uUG9wdXBWaXNpYmxlQ2hhbmdlKG5ld1Zpc2libGUpIHtcbiAgICBpZiAobW9kZSAhPT0gJ2lubGluZScpIHtcbiAgICAgIG9uT3BlbkNoYW5nZShldmVudEtleSwgbmV3VmlzaWJsZSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBVc2VkIGZvciBhY2Nlc3NpYmlsaXR5LiBIZWxwZXIgd2lsbCBmb2N1cyBlbGVtZW50IHdpdGhvdXQga2V5IGJvYXJkLlxuICAgKiBXZSBzaG91bGQgbWFudWFsbHkgdHJpZ2dlciBhbiBhY3RpdmVcbiAgICovXG4gIHZhciBvbkludGVybmFsRm9jdXMgPSBmdW5jdGlvbiBvbkludGVybmFsRm9jdXMoKSB7XG4gICAgb25BY3RpdmUoZXZlbnRLZXkpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHBvcHVwSWQgPSBkb21EYXRhSWQgJiYgXCJcIi5jb25jYXQoZG9tRGF0YUlkLCBcIi1wb3B1cFwiKTtcblxuICAvLyA+Pj4+PiBUaXRsZVxuICB2YXIgdGl0bGVOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIHJvbGU6IFwibWVudWl0ZW1cIixcbiAgICBzdHlsZTogZGlyZWN0aW9uU3R5bGUsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChzdWJNZW51UHJlZml4Q2xzLCBcIi10aXRsZVwiKSxcbiAgICB0YWJJbmRleDogbWVyZ2VkRGlzYWJsZWQgPyBudWxsIDogLTEsXG4gICAgcmVmOiBlbGVtZW50UmVmLFxuICAgIHRpdGxlOiB0eXBlb2YgdGl0bGUgPT09ICdzdHJpbmcnID8gdGl0bGUgOiBudWxsLFxuICAgIFwiZGF0YS1tZW51LWlkXCI6IG92ZXJmbG93RGlzYWJsZWQgJiYgZG9tRGF0YUlkID8gbnVsbCA6IGRvbURhdGFJZCxcbiAgICBcImFyaWEtZXhwYW5kZWRcIjogb3BlbixcbiAgICBcImFyaWEtaGFzcG9wdXBcIjogdHJ1ZSxcbiAgICBcImFyaWEtY29udHJvbHNcIjogcG9wdXBJZCxcbiAgICBcImFyaWEtZGlzYWJsZWRcIjogbWVyZ2VkRGlzYWJsZWQsXG4gICAgb25DbGljazogb25JbnRlcm5hbFRpdGxlQ2xpY2ssXG4gICAgb25Gb2N1czogb25JbnRlcm5hbEZvY3VzXG4gIH0sIGFjdGl2ZVByb3BzKSwgdGl0bGUsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEljb24sIHtcbiAgICBpY29uOiBtb2RlICE9PSAnaG9yaXpvbnRhbCcgPyBtZXJnZWRFeHBhbmRJY29uIDogbnVsbCxcbiAgICBwcm9wczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgICBpc09wZW46IG9wZW4sXG4gICAgICAvLyBbTGVnYWN5XSBOb3Qgc3VyZSB3aHkgbmVlZCB0aGlzIG1hcmtcbiAgICAgIGlzU3ViTWVudTogdHJ1ZVxuICAgIH0pXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaVwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChzdWJNZW51UHJlZml4Q2xzLCBcIi1hcnJvd1wiKVxuICB9KSkpO1xuXG4gIC8vIENhY2hlIG1vZGUgaWYgaXQgY2hhbmdlIHRvIGBpbmxpbmVgIHdoaWNoIGRvIG5vdCBoYXZlIHBvcHVwIG1vdGlvblxuICB2YXIgdHJpZ2dlck1vZGVSZWYgPSBSZWFjdC51c2VSZWYobW9kZSk7XG4gIGlmIChtb2RlICE9PSAnaW5saW5lJyAmJiBjb25uZWN0ZWRQYXRoLmxlbmd0aCA+IDEpIHtcbiAgICB0cmlnZ2VyTW9kZVJlZi5jdXJyZW50ID0gJ3ZlcnRpY2FsJztcbiAgfSBlbHNlIHtcbiAgICB0cmlnZ2VyTW9kZVJlZi5jdXJyZW50ID0gbW9kZTtcbiAgfVxuICBpZiAoIW92ZXJmbG93RGlzYWJsZWQpIHtcbiAgICB2YXIgdHJpZ2dlck1vZGUgPSB0cmlnZ2VyTW9kZVJlZi5jdXJyZW50O1xuXG4gICAgLy8gU3RpbGwgd3JhcCB3aXRoIFRyaWdnZXIgaGVyZSBzaW5jZSB3ZSBuZWVkIGF2b2lkIHJlYWN0IHJlLW1vdW50IGRvbSBub2RlXG4gICAgLy8gV2hpY2ggbWFrZXMgbW90aW9uIGZhaWxlZFxuICAgIHRpdGxlTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBvcHVwVHJpZ2dlciwge1xuICAgICAgbW9kZTogdHJpZ2dlck1vZGUsXG4gICAgICBwcmVmaXhDbHM6IHN1Yk1lbnVQcmVmaXhDbHMsXG4gICAgICB2aXNpYmxlOiAhaW50ZXJuYWxQb3B1cENsb3NlICYmIG9wZW4gJiYgbW9kZSAhPT0gJ2lubGluZScsXG4gICAgICBwb3B1cENsYXNzTmFtZTogcG9wdXBDbGFzc05hbWUsXG4gICAgICBwb3B1cE9mZnNldDogcG9wdXBPZmZzZXQsXG4gICAgICBwb3B1cDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTWVudUNvbnRleHRQcm92aWRlclxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGUgb2YgaG9yaXpvbnRhbCBtb2RlXG4gICAgICAsIHtcbiAgICAgICAgbW9kZTogdHJpZ2dlck1vZGUgPT09ICdob3Jpem9udGFsJyA/ICd2ZXJ0aWNhbCcgOiB0cmlnZ2VyTW9kZVxuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3ViTWVudUxpc3QsIHtcbiAgICAgICAgaWQ6IHBvcHVwSWQsXG4gICAgICAgIHJlZjogcG9wdXBSZWZcbiAgICAgIH0sIGNoaWxkcmVuKSksXG4gICAgICBkaXNhYmxlZDogbWVyZ2VkRGlzYWJsZWQsXG4gICAgICBvblZpc2libGVDaGFuZ2U6IG9uUG9wdXBWaXNpYmxlQ2hhbmdlXG4gICAgfSwgdGl0bGVOb2RlKTtcbiAgfVxuXG4gIC8vID4+Pj4+IExpc3Qgbm9kZVxuICB2YXIgbGlzdE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPdmVyZmxvdy5JdGVtLCBfZXh0ZW5kcyh7XG4gICAgcm9sZTogXCJub25lXCJcbiAgfSwgcmVzdFByb3BzLCB7XG4gICAgY29tcG9uZW50OiBcImxpXCIsXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhzdWJNZW51UHJlZml4Q2xzLCBcIlwiLmNvbmNhdChzdWJNZW51UHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KG1vZGUpLCBjbGFzc05hbWUsIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHN1Yk1lbnVQcmVmaXhDbHMsIFwiLW9wZW5cIiksIG9wZW4pLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHN1Yk1lbnVQcmVmaXhDbHMsIFwiLWFjdGl2ZVwiKSwgbWVyZ2VkQWN0aXZlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChzdWJNZW51UHJlZml4Q2xzLCBcIi1zZWxlY3RlZFwiKSwgY2hpbGRyZW5TZWxlY3RlZCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQoc3ViTWVudVByZWZpeENscywgXCItZGlzYWJsZWRcIiksIG1lcmdlZERpc2FibGVkKSwgX2NsYXNzTmFtZXMpKSxcbiAgICBvbk1vdXNlRW50ZXI6IG9uSW50ZXJuYWxNb3VzZUVudGVyLFxuICAgIG9uTW91c2VMZWF2ZTogb25JbnRlcm5hbE1vdXNlTGVhdmVcbiAgfSksIHRpdGxlTm9kZSwgIW92ZXJmbG93RGlzYWJsZWQgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSW5saW5lU3ViTWVudUxpc3QsIHtcbiAgICBpZDogcG9wdXBJZCxcbiAgICBvcGVuOiBvcGVuLFxuICAgIGtleVBhdGg6IGNvbm5lY3RlZFBhdGhcbiAgfSwgY2hpbGRyZW4pKTtcbiAgaWYgKF9pbnRlcm5hbFJlbmRlclN1Yk1lbnVJdGVtKSB7XG4gICAgbGlzdE5vZGUgPSBfaW50ZXJuYWxSZW5kZXJTdWJNZW51SXRlbShsaXN0Tm9kZSwgcHJvcHMsIHtcbiAgICAgIHNlbGVjdGVkOiBjaGlsZHJlblNlbGVjdGVkLFxuICAgICAgYWN0aXZlOiBtZXJnZWRBY3RpdmUsXG4gICAgICBvcGVuOiBvcGVuLFxuICAgICAgZGlzYWJsZWQ6IG1lcmdlZERpc2FibGVkXG4gICAgfSk7XG4gIH1cblxuICAvLyA+Pj4+PiBSZW5kZXJcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1lbnVDb250ZXh0UHJvdmlkZXIsIHtcbiAgICBvbkl0ZW1DbGljazogb25NZXJnZWRJdGVtQ2xpY2ssXG4gICAgbW9kZTogbW9kZSA9PT0gJ2hvcml6b250YWwnID8gJ3ZlcnRpY2FsJyA6IG1vZGUsXG4gICAgaXRlbUljb246IG1lcmdlZEl0ZW1JY29uLFxuICAgIGV4cGFuZEljb246IG1lcmdlZEV4cGFuZEljb25cbiAgfSwgbGlzdE5vZGUpO1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFN1Yk1lbnUocHJvcHMpIHtcbiAgdmFyIGV2ZW50S2V5ID0gcHJvcHMuZXZlbnRLZXksXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcbiAgdmFyIGNvbm5lY3RlZEtleVBhdGggPSB1c2VGdWxsUGF0aChldmVudEtleSk7XG4gIHZhciBjaGlsZExpc3QgPSBwYXJzZUNoaWxkcmVuKGNoaWxkcmVuLCBjb25uZWN0ZWRLZXlQYXRoKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBSZWNvcmQgS2V5UGF0aCA9PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWVhc3VyZSA9IHVzZU1lYXN1cmUoKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAobWVhc3VyZSkge1xuICAgICAgbWVhc3VyZS5yZWdpc3RlclBhdGgoZXZlbnRLZXksIGNvbm5lY3RlZEtleVBhdGgpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbWVhc3VyZS51bnJlZ2lzdGVyUGF0aChldmVudEtleSwgY29ubmVjdGVkS2V5UGF0aCk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW2Nvbm5lY3RlZEtleVBhdGhdKTtcbiAgdmFyIHJlbmRlck5vZGU7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaWYgKG1lYXN1cmUpIHtcbiAgICByZW5kZXJOb2RlID0gY2hpbGRMaXN0O1xuICB9IGVsc2Uge1xuICAgIHJlbmRlck5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJbnRlcm5hbFN1Yk1lbnUsIHByb3BzLCBjaGlsZExpc3QpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYXRoVHJhY2tlckNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogY29ubmVjdGVkS2V5UGF0aFxuICB9LCByZW5kZXJOb2RlKTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJwcmVmaXhDbHNcIiwgXCJyb290Q2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJjbGFzc05hbWVcIiwgXCJ0YWJJbmRleFwiLCBcIml0ZW1zXCIsIFwiY2hpbGRyZW5cIiwgXCJkaXJlY3Rpb25cIiwgXCJpZFwiLCBcIm1vZGVcIiwgXCJpbmxpbmVDb2xsYXBzZWRcIiwgXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkT3ZlcmZsb3dcIiwgXCJzdWJNZW51T3BlbkRlbGF5XCIsIFwic3ViTWVudUNsb3NlRGVsYXlcIiwgXCJmb3JjZVN1Yk1lbnVSZW5kZXJcIiwgXCJkZWZhdWx0T3BlbktleXNcIiwgXCJvcGVuS2V5c1wiLCBcImFjdGl2ZUtleVwiLCBcImRlZmF1bHRBY3RpdmVGaXJzdFwiLCBcInNlbGVjdGFibGVcIiwgXCJtdWx0aXBsZVwiLCBcImRlZmF1bHRTZWxlY3RlZEtleXNcIiwgXCJzZWxlY3RlZEtleXNcIiwgXCJvblNlbGVjdFwiLCBcIm9uRGVzZWxlY3RcIiwgXCJpbmxpbmVJbmRlbnRcIiwgXCJtb3Rpb25cIiwgXCJkZWZhdWx0TW90aW9uc1wiLCBcInRyaWdnZXJTdWJNZW51QWN0aW9uXCIsIFwiYnVpbHRpblBsYWNlbWVudHNcIiwgXCJpdGVtSWNvblwiLCBcImV4cGFuZEljb25cIiwgXCJvdmVyZmxvd2VkSW5kaWNhdG9yXCIsIFwib3ZlcmZsb3dlZEluZGljYXRvclBvcHVwQ2xhc3NOYW1lXCIsIFwiZ2V0UG9wdXBDb250YWluZXJcIiwgXCJvbkNsaWNrXCIsIFwib25PcGVuQ2hhbmdlXCIsIFwib25LZXlEb3duXCIsIFwib3BlbkFuaW1hdGlvblwiLCBcIm9wZW5UcmFuc2l0aW9uTmFtZVwiLCBcIl9pbnRlcm5hbFJlbmRlck1lbnVJdGVtXCIsIFwiX2ludGVybmFsUmVuZGVyU3ViTWVudUl0ZW1cIl07XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBPdmVyZmxvdyBmcm9tICdyYy1vdmVyZmxvdyc7XG5pbXBvcnQgdXNlTWVyZ2VkU3RhdGUgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTWVyZ2VkU3RhdGVcIjtcbmltcG9ydCB3YXJuaW5nIGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUltcGVyYXRpdmVIYW5kbGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmbHVzaFN5bmMgfSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSBcInJjLXV0aWwvZXMvaXNFcXVhbFwiO1xuaW1wb3J0IHsgZ2V0TWVudUlkLCBJZENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0L0lkQ29udGV4dFwiO1xuaW1wb3J0IE1lbnVDb250ZXh0UHJvdmlkZXIgZnJvbSBcIi4vY29udGV4dC9NZW51Q29udGV4dFwiO1xuaW1wb3J0IHsgUGF0aFJlZ2lzdGVyQ29udGV4dCwgUGF0aFVzZXJDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dC9QYXRoQ29udGV4dFwiO1xuaW1wb3J0IFByaXZhdGVDb250ZXh0IGZyb20gXCIuL2NvbnRleHQvUHJpdmF0ZUNvbnRleHRcIjtcbmltcG9ydCB1c2VBY2Nlc3NpYmlsaXR5IGZyb20gXCIuL2hvb2tzL3VzZUFjY2Vzc2liaWxpdHlcIjtcbmltcG9ydCB1c2VLZXlSZWNvcmRzLCB7IE9WRVJGTE9XX0tFWSB9IGZyb20gXCIuL2hvb2tzL3VzZUtleVJlY29yZHNcIjtcbmltcG9ydCB1c2VNZW1vQ2FsbGJhY2sgZnJvbSBcIi4vaG9va3MvdXNlTWVtb0NhbGxiYWNrXCI7XG5pbXBvcnQgdXNlVVVJRCBmcm9tIFwiLi9ob29rcy91c2VVVUlEXCI7XG5pbXBvcnQgTWVudUl0ZW0gZnJvbSBcIi4vTWVudUl0ZW1cIjtcbmltcG9ydCBTdWJNZW51IGZyb20gXCIuL1N1Yk1lbnVcIjtcbmltcG9ydCB7IHBhcnNlSXRlbXMgfSBmcm9tIFwiLi91dGlscy9ub2RlVXRpbFwiO1xuaW1wb3J0IHsgd2Fybkl0ZW1Qcm9wIH0gZnJvbSBcIi4vdXRpbHMvd2FyblV0aWxcIjtcblxuLyoqXG4gKiBNZW51IG1vZGlmeSBhZnRlciByZWZhY3RvcjpcbiAqICMjIEFkZFxuICogLSBkaXNhYmxlZFxuICpcbiAqICMjIFJlbW92ZVxuICogLSBvcGVuVHJhbnNpdGlvbk5hbWVcbiAqIC0gb3BlbkFuaW1hdGlvblxuICogLSBvbkRlc3Ryb3lcbiAqIC0gc2lkZXJDb2xsYXBzZWQ6IFNlZW1zIGFudGQgZG8gbm90IHVzZSB0aGlzIHByb3AgKE5lZWQgdGVzdCBpbiBhbnRkKVxuICogLSBjb2xsYXBzZWRXaWR0aDogU2VlbXMgdGhpcyBsb2dpYyBzaG91bGQgYmUgaGFuZGxlIGJ5IGFudGQgTGF5b3V0LlNpZGVyXG4gKi9cblxuLy8gb3B0aW1pemUgZm9yIHJlbmRlclxudmFyIEVNUFRZX0xJU1QgPSBbXTtcbnZhciBNZW51ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9jaGlsZExpc3QkLCBfY2xhc3NOYW1lcztcbiAgdmFyIF9yZWYgPSBwcm9wcyxcbiAgICBfcmVmJHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIHByZWZpeENscyA9IF9yZWYkcHJlZml4Q2xzID09PSB2b2lkIDAgPyAncmMtbWVudScgOiBfcmVmJHByZWZpeENscyxcbiAgICByb290Q2xhc3NOYW1lID0gX3JlZi5yb290Q2xhc3NOYW1lLFxuICAgIHN0eWxlID0gX3JlZi5zdHlsZSxcbiAgICBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICBfcmVmJHRhYkluZGV4ID0gX3JlZi50YWJJbmRleCxcbiAgICB0YWJJbmRleCA9IF9yZWYkdGFiSW5kZXggPT09IHZvaWQgMCA/IDAgOiBfcmVmJHRhYkluZGV4LFxuICAgIGl0ZW1zID0gX3JlZi5pdGVtcyxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgZGlyZWN0aW9uID0gX3JlZi5kaXJlY3Rpb24sXG4gICAgaWQgPSBfcmVmLmlkLFxuICAgIF9yZWYkbW9kZSA9IF9yZWYubW9kZSxcbiAgICBtb2RlID0gX3JlZiRtb2RlID09PSB2b2lkIDAgPyAndmVydGljYWwnIDogX3JlZiRtb2RlLFxuICAgIGlubGluZUNvbGxhcHNlZCA9IF9yZWYuaW5saW5lQ29sbGFwc2VkLFxuICAgIGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZCxcbiAgICBkaXNhYmxlZE92ZXJmbG93ID0gX3JlZi5kaXNhYmxlZE92ZXJmbG93LFxuICAgIF9yZWYkc3ViTWVudU9wZW5EZWxheSA9IF9yZWYuc3ViTWVudU9wZW5EZWxheSxcbiAgICBzdWJNZW51T3BlbkRlbGF5ID0gX3JlZiRzdWJNZW51T3BlbkRlbGF5ID09PSB2b2lkIDAgPyAwLjEgOiBfcmVmJHN1Yk1lbnVPcGVuRGVsYXksXG4gICAgX3JlZiRzdWJNZW51Q2xvc2VEZWxhID0gX3JlZi5zdWJNZW51Q2xvc2VEZWxheSxcbiAgICBzdWJNZW51Q2xvc2VEZWxheSA9IF9yZWYkc3ViTWVudUNsb3NlRGVsYSA9PT0gdm9pZCAwID8gMC4xIDogX3JlZiRzdWJNZW51Q2xvc2VEZWxhLFxuICAgIGZvcmNlU3ViTWVudVJlbmRlciA9IF9yZWYuZm9yY2VTdWJNZW51UmVuZGVyLFxuICAgIGRlZmF1bHRPcGVuS2V5cyA9IF9yZWYuZGVmYXVsdE9wZW5LZXlzLFxuICAgIG9wZW5LZXlzID0gX3JlZi5vcGVuS2V5cyxcbiAgICBhY3RpdmVLZXkgPSBfcmVmLmFjdGl2ZUtleSxcbiAgICBkZWZhdWx0QWN0aXZlRmlyc3QgPSBfcmVmLmRlZmF1bHRBY3RpdmVGaXJzdCxcbiAgICBfcmVmJHNlbGVjdGFibGUgPSBfcmVmLnNlbGVjdGFibGUsXG4gICAgc2VsZWN0YWJsZSA9IF9yZWYkc2VsZWN0YWJsZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWYkc2VsZWN0YWJsZSxcbiAgICBfcmVmJG11bHRpcGxlID0gX3JlZi5tdWx0aXBsZSxcbiAgICBtdWx0aXBsZSA9IF9yZWYkbXVsdGlwbGUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRtdWx0aXBsZSxcbiAgICBkZWZhdWx0U2VsZWN0ZWRLZXlzID0gX3JlZi5kZWZhdWx0U2VsZWN0ZWRLZXlzLFxuICAgIHNlbGVjdGVkS2V5cyA9IF9yZWYuc2VsZWN0ZWRLZXlzLFxuICAgIG9uU2VsZWN0ID0gX3JlZi5vblNlbGVjdCxcbiAgICBvbkRlc2VsZWN0ID0gX3JlZi5vbkRlc2VsZWN0LFxuICAgIF9yZWYkaW5saW5lSW5kZW50ID0gX3JlZi5pbmxpbmVJbmRlbnQsXG4gICAgaW5saW5lSW5kZW50ID0gX3JlZiRpbmxpbmVJbmRlbnQgPT09IHZvaWQgMCA/IDI0IDogX3JlZiRpbmxpbmVJbmRlbnQsXG4gICAgbW90aW9uID0gX3JlZi5tb3Rpb24sXG4gICAgZGVmYXVsdE1vdGlvbnMgPSBfcmVmLmRlZmF1bHRNb3Rpb25zLFxuICAgIF9yZWYkdHJpZ2dlclN1Yk1lbnVBYyA9IF9yZWYudHJpZ2dlclN1Yk1lbnVBY3Rpb24sXG4gICAgdHJpZ2dlclN1Yk1lbnVBY3Rpb24gPSBfcmVmJHRyaWdnZXJTdWJNZW51QWMgPT09IHZvaWQgMCA/ICdob3ZlcicgOiBfcmVmJHRyaWdnZXJTdWJNZW51QWMsXG4gICAgYnVpbHRpblBsYWNlbWVudHMgPSBfcmVmLmJ1aWx0aW5QbGFjZW1lbnRzLFxuICAgIGl0ZW1JY29uID0gX3JlZi5pdGVtSWNvbixcbiAgICBleHBhbmRJY29uID0gX3JlZi5leHBhbmRJY29uLFxuICAgIF9yZWYkb3ZlcmZsb3dlZEluZGljYSA9IF9yZWYub3ZlcmZsb3dlZEluZGljYXRvcixcbiAgICBvdmVyZmxvd2VkSW5kaWNhdG9yID0gX3JlZiRvdmVyZmxvd2VkSW5kaWNhID09PSB2b2lkIDAgPyAnLi4uJyA6IF9yZWYkb3ZlcmZsb3dlZEluZGljYSxcbiAgICBvdmVyZmxvd2VkSW5kaWNhdG9yUG9wdXBDbGFzc05hbWUgPSBfcmVmLm92ZXJmbG93ZWRJbmRpY2F0b3JQb3B1cENsYXNzTmFtZSxcbiAgICBnZXRQb3B1cENvbnRhaW5lciA9IF9yZWYuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgb25DbGljayA9IF9yZWYub25DbGljayxcbiAgICBvbk9wZW5DaGFuZ2UgPSBfcmVmLm9uT3BlbkNoYW5nZSxcbiAgICBvbktleURvd24gPSBfcmVmLm9uS2V5RG93bixcbiAgICBvcGVuQW5pbWF0aW9uID0gX3JlZi5vcGVuQW5pbWF0aW9uLFxuICAgIG9wZW5UcmFuc2l0aW9uTmFtZSA9IF9yZWYub3BlblRyYW5zaXRpb25OYW1lLFxuICAgIF9pbnRlcm5hbFJlbmRlck1lbnVJdGVtID0gX3JlZi5faW50ZXJuYWxSZW5kZXJNZW51SXRlbSxcbiAgICBfaW50ZXJuYWxSZW5kZXJTdWJNZW51SXRlbSA9IF9yZWYuX2ludGVybmFsUmVuZGVyU3ViTWVudUl0ZW0sXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIF9leGNsdWRlZCk7XG4gIHZhciBjaGlsZExpc3QgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcGFyc2VJdGVtcyhjaGlsZHJlbiwgaXRlbXMsIEVNUFRZX0xJU1QpO1xuICB9LCBbY2hpbGRyZW4sIGl0ZW1zXSk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgbW91bnRlZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0TW91bnRlZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBjb250YWluZXJSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIHV1aWQgPSB1c2VVVUlEKGlkKTtcbiAgdmFyIGlzUnRsID0gZGlyZWN0aW9uID09PSAncnRsJztcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IFdhcm4gPT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHdhcm5pbmcoIW9wZW5BbmltYXRpb24gJiYgIW9wZW5UcmFuc2l0aW9uTmFtZSwgJ2BvcGVuQW5pbWF0aW9uYCBhbmQgYG9wZW5UcmFuc2l0aW9uTmFtZWAgaXMgcmVtb3ZlZC4gUGxlYXNlIHVzZSBgbW90aW9uYCBvciBgZGVmYXVsdE1vdGlvbmAgaW5zdGVhZC4nKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gT3BlbiA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlTWVyZ2VkU3RhdGUgPSB1c2VNZXJnZWRTdGF0ZShkZWZhdWx0T3BlbktleXMsIHtcbiAgICAgIHZhbHVlOiBvcGVuS2V5cyxcbiAgICAgIHBvc3RTdGF0ZTogZnVuY3Rpb24gcG9zdFN0YXRlKGtleXMpIHtcbiAgICAgICAgcmV0dXJuIGtleXMgfHwgRU1QVFlfTElTVDtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBfdXNlTWVyZ2VkU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZU1lcmdlZFN0YXRlLCAyKSxcbiAgICBtZXJnZWRPcGVuS2V5cyA9IF91c2VNZXJnZWRTdGF0ZTJbMF0sXG4gICAgc2V0TWVyZ2VkT3BlbktleXMgPSBfdXNlTWVyZ2VkU3RhdGUyWzFdO1xuXG4gIC8vIFJlYWN0IDE4IHdpbGwgbWVyZ2UgbW91c2UgZXZlbnQgd2hpY2ggbWVhbnMgd2Ugb3BlbiBrZXkgd2lsbCBub3Qgc3luY1xuICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzM4ODE4XG4gIHZhciB0cmlnZ2VyT3BlbktleXMgPSBmdW5jdGlvbiB0cmlnZ2VyT3BlbktleXMoa2V5cykge1xuICAgIHZhciBmb3JjZUZsdXNoID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgICBmdW5jdGlvbiBkb1VwZGF0ZSgpIHtcbiAgICAgIHNldE1lcmdlZE9wZW5LZXlzKGtleXMpO1xuICAgICAgb25PcGVuQ2hhbmdlID09PSBudWxsIHx8IG9uT3BlbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25PcGVuQ2hhbmdlKGtleXMpO1xuICAgIH1cbiAgICBpZiAoZm9yY2VGbHVzaCkge1xuICAgICAgZmx1c2hTeW5jKGRvVXBkYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9VcGRhdGUoKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gPj4+Pj4gQ2FjaGUgJiBSZXNldCBvcGVuIGtleXMgd2hlbiBpbmxpbmVDb2xsYXBzZWQgY2hhbmdlZFxuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKG1lcmdlZE9wZW5LZXlzKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgaW5saW5lQ2FjaGVPcGVuS2V5cyA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgc2V0SW5saW5lQ2FjaGVPcGVuS2V5cyA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG4gIHZhciBtb3VudFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBNb2RlID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoKG1vZGUgPT09ICdpbmxpbmUnIHx8IG1vZGUgPT09ICd2ZXJ0aWNhbCcpICYmIGlubGluZUNvbGxhcHNlZCkge1xuICAgICAgICByZXR1cm4gWyd2ZXJ0aWNhbCcsIGlubGluZUNvbGxhcHNlZF07XG4gICAgICB9XG4gICAgICByZXR1cm4gW21vZGUsIGZhbHNlXTtcbiAgICB9LCBbbW9kZSwgaW5saW5lQ29sbGFwc2VkXSksXG4gICAgX1JlYWN0JHVzZU1lbW8yID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZU1lbW8sIDIpLFxuICAgIG1lcmdlZE1vZGUgPSBfUmVhY3QkdXNlTWVtbzJbMF0sXG4gICAgbWVyZ2VkSW5saW5lQ29sbGFwc2VkID0gX1JlYWN0JHVzZU1lbW8yWzFdO1xuICB2YXIgaXNJbmxpbmVNb2RlID0gbWVyZ2VkTW9kZSA9PT0gJ2lubGluZSc7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGU1ID0gUmVhY3QudXNlU3RhdGUobWVyZ2VkTW9kZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlNiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTUsIDIpLFxuICAgIGludGVybmFsTW9kZSA9IF9SZWFjdCR1c2VTdGF0ZTZbMF0sXG4gICAgc2V0SW50ZXJuYWxNb2RlID0gX1JlYWN0JHVzZVN0YXRlNlsxXTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTcgPSBSZWFjdC51c2VTdGF0ZShtZXJnZWRJbmxpbmVDb2xsYXBzZWQpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTggPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGU3LCAyKSxcbiAgICBpbnRlcm5hbElubGluZUNvbGxhcHNlZCA9IF9SZWFjdCR1c2VTdGF0ZThbMF0sXG4gICAgc2V0SW50ZXJuYWxJbmxpbmVDb2xsYXBzZWQgPSBfUmVhY3QkdXNlU3RhdGU4WzFdO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHNldEludGVybmFsTW9kZShtZXJnZWRNb2RlKTtcbiAgICBzZXRJbnRlcm5hbElubGluZUNvbGxhcHNlZChtZXJnZWRJbmxpbmVDb2xsYXBzZWQpO1xuICAgIGlmICghbW91bnRSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBTeW5jaHJvbm91c2x5IHVwZGF0ZSBNZXJnZWRPcGVuS2V5c1xuICAgIGlmIChpc0lubGluZU1vZGUpIHtcbiAgICAgIHNldE1lcmdlZE9wZW5LZXlzKGlubGluZUNhY2hlT3BlbktleXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUcmlnZ2VyIG9wZW4gZXZlbnQgaW4gY2FzZSBpdHMgaW4gY29udHJvbFxuICAgICAgdHJpZ2dlck9wZW5LZXlzKEVNUFRZX0xJU1QpO1xuICAgIH1cbiAgfSwgW21lcmdlZE1vZGUsIG1lcmdlZElubGluZUNvbGxhcHNlZF0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gUmVzcG9uc2l2ZSA9PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfUmVhY3QkdXNlU3RhdGU5ID0gUmVhY3QudXNlU3RhdGUoMCksXG4gICAgX1JlYWN0JHVzZVN0YXRlMTAgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGU5LCAyKSxcbiAgICBsYXN0VmlzaWJsZUluZGV4ID0gX1JlYWN0JHVzZVN0YXRlMTBbMF0sXG4gICAgc2V0TGFzdFZpc2libGVJbmRleCA9IF9SZWFjdCR1c2VTdGF0ZTEwWzFdO1xuICB2YXIgYWxsVmlzaWJsZSA9IGxhc3RWaXNpYmxlSW5kZXggPj0gY2hpbGRMaXN0Lmxlbmd0aCAtIDEgfHwgaW50ZXJuYWxNb2RlICE9PSAnaG9yaXpvbnRhbCcgfHwgZGlzYWJsZWRPdmVyZmxvdztcblxuICAvLyBDYWNoZVxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpc0lubGluZU1vZGUpIHtcbiAgICAgIHNldElubGluZUNhY2hlT3BlbktleXMobWVyZ2VkT3BlbktleXMpO1xuICAgIH1cbiAgfSwgW21lcmdlZE9wZW5LZXlzXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgbW91bnRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vdW50UmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBQYXRoID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VLZXlSZWNvcmRzID0gdXNlS2V5UmVjb3JkcygpLFxuICAgIHJlZ2lzdGVyUGF0aCA9IF91c2VLZXlSZWNvcmRzLnJlZ2lzdGVyUGF0aCxcbiAgICB1bnJlZ2lzdGVyUGF0aCA9IF91c2VLZXlSZWNvcmRzLnVucmVnaXN0ZXJQYXRoLFxuICAgIHJlZnJlc2hPdmVyZmxvd0tleXMgPSBfdXNlS2V5UmVjb3Jkcy5yZWZyZXNoT3ZlcmZsb3dLZXlzLFxuICAgIGlzU3ViUGF0aEtleSA9IF91c2VLZXlSZWNvcmRzLmlzU3ViUGF0aEtleSxcbiAgICBnZXRLZXlQYXRoID0gX3VzZUtleVJlY29yZHMuZ2V0S2V5UGF0aCxcbiAgICBnZXRLZXlzID0gX3VzZUtleVJlY29yZHMuZ2V0S2V5cyxcbiAgICBnZXRTdWJQYXRoS2V5cyA9IF91c2VLZXlSZWNvcmRzLmdldFN1YlBhdGhLZXlzO1xuICB2YXIgcmVnaXN0ZXJQYXRoQ29udGV4dCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICByZWdpc3RlclBhdGg6IHJlZ2lzdGVyUGF0aCxcbiAgICAgIHVucmVnaXN0ZXJQYXRoOiB1bnJlZ2lzdGVyUGF0aFxuICAgIH07XG4gIH0sIFtyZWdpc3RlclBhdGgsIHVucmVnaXN0ZXJQYXRoXSk7XG4gIHZhciBwYXRoVXNlckNvbnRleHQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNTdWJQYXRoS2V5OiBpc1N1YlBhdGhLZXlcbiAgICB9O1xuICB9LCBbaXNTdWJQYXRoS2V5XSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmVmcmVzaE92ZXJmbG93S2V5cyhhbGxWaXNpYmxlID8gRU1QVFlfTElTVCA6IGNoaWxkTGlzdC5zbGljZShsYXN0VmlzaWJsZUluZGV4ICsgMSkubWFwKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgcmV0dXJuIGNoaWxkLmtleTtcbiAgICB9KSk7XG4gIH0sIFtsYXN0VmlzaWJsZUluZGV4LCBhbGxWaXNpYmxlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IEFjdGl2ZSA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZTMgPSB1c2VNZXJnZWRTdGF0ZShhY3RpdmVLZXkgfHwgZGVmYXVsdEFjdGl2ZUZpcnN0ICYmICgoX2NoaWxkTGlzdCQgPSBjaGlsZExpc3RbMF0pID09PSBudWxsIHx8IF9jaGlsZExpc3QkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY2hpbGRMaXN0JC5rZXkpLCB7XG4gICAgICB2YWx1ZTogYWN0aXZlS2V5XG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZTMsIDIpLFxuICAgIG1lcmdlZEFjdGl2ZUtleSA9IF91c2VNZXJnZWRTdGF0ZTRbMF0sXG4gICAgc2V0TWVyZ2VkQWN0aXZlS2V5ID0gX3VzZU1lcmdlZFN0YXRlNFsxXTtcbiAgdmFyIG9uQWN0aXZlID0gdXNlTWVtb0NhbGxiYWNrKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBzZXRNZXJnZWRBY3RpdmVLZXkoa2V5KTtcbiAgfSk7XG4gIHZhciBvbkluYWN0aXZlID0gdXNlTWVtb0NhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICBzZXRNZXJnZWRBY3RpdmVLZXkodW5kZWZpbmVkKTtcbiAgfSk7XG4gIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpc3Q6IGNvbnRhaW5lclJlZi5jdXJyZW50LFxuICAgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9jaGlsZExpc3QkZmluZDtcbiAgICAgICAgdmFyIHNob3VsZEZvY3VzS2V5ID0gbWVyZ2VkQWN0aXZlS2V5ICE9PSBudWxsICYmIG1lcmdlZEFjdGl2ZUtleSAhPT0gdm9pZCAwID8gbWVyZ2VkQWN0aXZlS2V5IDogKF9jaGlsZExpc3QkZmluZCA9IGNoaWxkTGlzdC5maW5kKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgcmV0dXJuICFub2RlLnByb3BzLmRpc2FibGVkO1xuICAgICAgICB9KSkgPT09IG51bGwgfHwgX2NoaWxkTGlzdCRmaW5kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY2hpbGRMaXN0JGZpbmQua2V5O1xuICAgICAgICBpZiAoc2hvdWxkRm9jdXNLZXkpIHtcbiAgICAgICAgICB2YXIgX2NvbnRhaW5lclJlZiRjdXJyZW50LCBfY29udGFpbmVyUmVmJGN1cnJlbnQyLCBfY29udGFpbmVyUmVmJGN1cnJlbnQzO1xuICAgICAgICAgIChfY29udGFpbmVyUmVmJGN1cnJlbnQgPSBjb250YWluZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2NvbnRhaW5lclJlZiRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX2NvbnRhaW5lclJlZiRjdXJyZW50MiA9IF9jb250YWluZXJSZWYkY3VycmVudC5xdWVyeVNlbGVjdG9yKFwibGlbZGF0YS1tZW51LWlkPSdcIi5jb25jYXQoZ2V0TWVudUlkKHV1aWQsIHNob3VsZEZvY3VzS2V5KSwgXCInXVwiKSkpID09PSBudWxsIHx8IF9jb250YWluZXJSZWYkY3VycmVudDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfY29udGFpbmVyUmVmJGN1cnJlbnQzID0gX2NvbnRhaW5lclJlZiRjdXJyZW50Mi5mb2N1cykgPT09IG51bGwgfHwgX2NvbnRhaW5lclJlZiRjdXJyZW50MyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2NvbnRhaW5lclJlZiRjdXJyZW50My5jYWxsKF9jb250YWluZXJSZWYkY3VycmVudDIsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFNlbGVjdCA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPj4+Pj4gU2VsZWN0IGtleXNcbiAgdmFyIF91c2VNZXJnZWRTdGF0ZTUgPSB1c2VNZXJnZWRTdGF0ZShkZWZhdWx0U2VsZWN0ZWRLZXlzIHx8IFtdLCB7XG4gICAgICB2YWx1ZTogc2VsZWN0ZWRLZXlzLFxuICAgICAgLy8gTGVnYWN5IGNvbnZlcnQga2V5IHRvIGFycmF5XG4gICAgICBwb3N0U3RhdGU6IGZ1bmN0aW9uIHBvc3RTdGF0ZShrZXlzKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGtleXMpKSB7XG4gICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleXMgPT09IG51bGwgfHwga2V5cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIEVNUFRZX0xJU1Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtrZXlzXTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBfdXNlTWVyZ2VkU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX3VzZU1lcmdlZFN0YXRlNSwgMiksXG4gICAgbWVyZ2VkU2VsZWN0S2V5cyA9IF91c2VNZXJnZWRTdGF0ZTZbMF0sXG4gICAgc2V0TWVyZ2VkU2VsZWN0S2V5cyA9IF91c2VNZXJnZWRTdGF0ZTZbMV07XG5cbiAgLy8gPj4+Pj4gVHJpZ2dlciBzZWxlY3RcbiAgdmFyIHRyaWdnZXJTZWxlY3Rpb24gPSBmdW5jdGlvbiB0cmlnZ2VyU2VsZWN0aW9uKGluZm8pIHtcbiAgICBpZiAoc2VsZWN0YWJsZSkge1xuICAgICAgLy8gSW5zZXJ0IG9yIFJlbW92ZVxuICAgICAgdmFyIHRhcmdldEtleSA9IGluZm8ua2V5O1xuICAgICAgdmFyIGV4aXN0ID0gbWVyZ2VkU2VsZWN0S2V5cy5pbmNsdWRlcyh0YXJnZXRLZXkpO1xuICAgICAgdmFyIG5ld1NlbGVjdEtleXM7XG4gICAgICBpZiAobXVsdGlwbGUpIHtcbiAgICAgICAgaWYgKGV4aXN0KSB7XG4gICAgICAgICAgbmV3U2VsZWN0S2V5cyA9IG1lcmdlZFNlbGVjdEtleXMuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBrZXkgIT09IHRhcmdldEtleTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdTZWxlY3RLZXlzID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShtZXJnZWRTZWxlY3RLZXlzKSwgW3RhcmdldEtleV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdTZWxlY3RLZXlzID0gW3RhcmdldEtleV07XG4gICAgICB9XG4gICAgICBzZXRNZXJnZWRTZWxlY3RLZXlzKG5ld1NlbGVjdEtleXMpO1xuXG4gICAgICAvLyBUcmlnZ2VyIGV2ZW50XG4gICAgICB2YXIgc2VsZWN0SW5mbyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgaW5mbyksIHt9LCB7XG4gICAgICAgIHNlbGVjdGVkS2V5czogbmV3U2VsZWN0S2V5c1xuICAgICAgfSk7XG4gICAgICBpZiAoZXhpc3QpIHtcbiAgICAgICAgb25EZXNlbGVjdCA9PT0gbnVsbCB8fCBvbkRlc2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkRlc2VsZWN0KHNlbGVjdEluZm8pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25TZWxlY3QgPT09IG51bGwgfHwgb25TZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uU2VsZWN0KHNlbGVjdEluZm8pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdoYXRldmVyIHNlbGVjdGFibGUsIGFsd2F5cyBjbG9zZSBpdFxuICAgIGlmICghbXVsdGlwbGUgJiYgbWVyZ2VkT3BlbktleXMubGVuZ3RoICYmIGludGVybmFsTW9kZSAhPT0gJ2lubGluZScpIHtcbiAgICAgIHRyaWdnZXJPcGVuS2V5cyhFTVBUWV9MSVNUKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBPcGVuID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIENsaWNrIGZvciBpdGVtLiBTdWJNZW51IGRvIG5vdCBoYXZlIHNlbGVjdGlvbiBzdGF0dXNcbiAgICovXG4gIHZhciBvbkludGVybmFsQ2xpY2sgPSB1c2VNZW1vQ2FsbGJhY2soZnVuY3Rpb24gKGluZm8pIHtcbiAgICBvbkNsaWNrID09PSBudWxsIHx8IG9uQ2xpY2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2xpY2sod2Fybkl0ZW1Qcm9wKGluZm8pKTtcbiAgICB0cmlnZ2VyU2VsZWN0aW9uKGluZm8pO1xuICB9KTtcbiAgdmFyIG9uSW50ZXJuYWxPcGVuQ2hhbmdlID0gdXNlTWVtb0NhbGxiYWNrKGZ1bmN0aW9uIChrZXksIG9wZW4pIHtcbiAgICB2YXIgbmV3T3BlbktleXMgPSBtZXJnZWRPcGVuS2V5cy5maWx0ZXIoZnVuY3Rpb24gKGspIHtcbiAgICAgIHJldHVybiBrICE9PSBrZXk7XG4gICAgfSk7XG4gICAgaWYgKG9wZW4pIHtcbiAgICAgIG5ld09wZW5LZXlzLnB1c2goa2V5KTtcbiAgICB9IGVsc2UgaWYgKGludGVybmFsTW9kZSAhPT0gJ2lubGluZScpIHtcbiAgICAgIC8vIFdlIG5lZWQgZmluZCBhbGwgcmVsYXRlZCBwb3B1cCB0byBjbG9zZVxuICAgICAgdmFyIHN1YlBhdGhLZXlzID0gZ2V0U3ViUGF0aEtleXMoa2V5KTtcbiAgICAgIG5ld09wZW5LZXlzID0gbmV3T3BlbktleXMuZmlsdGVyKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIHJldHVybiAhc3ViUGF0aEtleXMuaGFzKGspO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghaXNFcXVhbChtZXJnZWRPcGVuS2V5cywgbmV3T3BlbktleXMsIHRydWUpKSB7XG4gICAgICB0cmlnZ2VyT3BlbktleXMobmV3T3BlbktleXMsIHRydWUpO1xuICAgIH1cbiAgfSk7XG4gIHZhciBnZXRJbnRlcm5hbFBvcHVwQ29udGFpbmVyID0gdXNlTWVtb0NhbGxiYWNrKGdldFBvcHVwQ29udGFpbmVyKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBBY2Nlc3NpYmlsaXR5ID09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgdHJpZ2dlckFjY2Vzc2liaWxpdHlPcGVuID0gZnVuY3Rpb24gdHJpZ2dlckFjY2Vzc2liaWxpdHlPcGVuKGtleSwgb3Blbikge1xuICAgIHZhciBuZXh0T3BlbiA9IG9wZW4gIT09IG51bGwgJiYgb3BlbiAhPT0gdm9pZCAwID8gb3BlbiA6ICFtZXJnZWRPcGVuS2V5cy5pbmNsdWRlcyhrZXkpO1xuICAgIG9uSW50ZXJuYWxPcGVuQ2hhbmdlKGtleSwgbmV4dE9wZW4pO1xuICB9O1xuICB2YXIgb25JbnRlcm5hbEtleURvd24gPSB1c2VBY2Nlc3NpYmlsaXR5KGludGVybmFsTW9kZSwgbWVyZ2VkQWN0aXZlS2V5LCBpc1J0bCwgdXVpZCwgY29udGFpbmVyUmVmLCBnZXRLZXlzLCBnZXRLZXlQYXRoLCBzZXRNZXJnZWRBY3RpdmVLZXksIHRyaWdnZXJBY2Nlc3NpYmlsaXR5T3Blbiwgb25LZXlEb3duKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gRWZmZWN0ID09PT09PT09PT09PT09PT09PT09PT09PVxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHNldE1vdW50ZWQodHJ1ZSk7XG4gIH0sIFtdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBDb250ZXh0ID09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgcHJpdmF0ZUNvbnRleHQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX2ludGVybmFsUmVuZGVyTWVudUl0ZW06IF9pbnRlcm5hbFJlbmRlck1lbnVJdGVtLFxuICAgICAgX2ludGVybmFsUmVuZGVyU3ViTWVudUl0ZW06IF9pbnRlcm5hbFJlbmRlclN1Yk1lbnVJdGVtXG4gICAgfTtcbiAgfSwgW19pbnRlcm5hbFJlbmRlck1lbnVJdGVtLCBfaW50ZXJuYWxSZW5kZXJTdWJNZW51SXRlbV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLy8gPj4+Pj4gQ2hpbGRyZW5cbiAgdmFyIHdyYXBwZWRDaGlsZExpc3QgPSBpbnRlcm5hbE1vZGUgIT09ICdob3Jpem9udGFsJyB8fCBkaXNhYmxlZE92ZXJmbG93ID8gY2hpbGRMaXN0IDpcbiAgLy8gTmVlZCB3cmFwIGZvciBvdmVyZmxvdyBkcm9wZG93biB0aGF0IGRvIG5vdCByZXNwb25zZSBmb3Igb3BlblxuICBjaGlsZExpc3QubWFwKGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgLyojX19QVVJFX18qL1xuICAgICAgLy8gQWx3YXlzIHdyYXAgcHJvdmlkZXIgdG8gYXZvaWQgc3ViIG5vZGUgcmUtbW91bnRcbiAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTWVudUNvbnRleHRQcm92aWRlciwge1xuICAgICAgICBrZXk6IGNoaWxkLmtleSxcbiAgICAgICAgb3ZlcmZsb3dEaXNhYmxlZDogaW5kZXggPiBsYXN0VmlzaWJsZUluZGV4XG4gICAgICB9LCBjaGlsZClcbiAgICApO1xuICB9KTtcblxuICAvLyA+Pj4+PiBDb250YWluZXJcbiAgdmFyIGNvbnRhaW5lciA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE92ZXJmbG93LCBfZXh0ZW5kcyh7XG4gICAgaWQ6IGlkLFxuICAgIHJlZjogY29udGFpbmVyUmVmLFxuICAgIHByZWZpeENsczogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1vdmVyZmxvd1wiKSxcbiAgICBjb21wb25lbnQ6IFwidWxcIixcbiAgICBpdGVtQ29tcG9uZW50OiBNZW51SXRlbSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJvb3RcIiksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChpbnRlcm5hbE1vZGUpLCBjbGFzc05hbWUsIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5saW5lLWNvbGxhcHNlZFwiKSwgaW50ZXJuYWxJbmxpbmVDb2xsYXBzZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBpc1J0bCksIF9jbGFzc05hbWVzKSwgcm9vdENsYXNzTmFtZSksXG4gICAgZGlyOiBkaXJlY3Rpb24sXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIHJvbGU6IFwibWVudVwiLFxuICAgIHRhYkluZGV4OiB0YWJJbmRleCxcbiAgICBkYXRhOiB3cmFwcGVkQ2hpbGRMaXN0LFxuICAgIHJlbmRlclJhd0l0ZW06IGZ1bmN0aW9uIHJlbmRlclJhd0l0ZW0obm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSxcbiAgICByZW5kZXJSYXdSZXN0OiBmdW5jdGlvbiByZW5kZXJSYXdSZXN0KG9taXRJdGVtcykge1xuICAgICAgLy8gV2UgdXNlIG9yaWdpbiBsaXN0IHNpbmNlIHdyYXBwZWQgbGlzdCB1c2UgY29udGV4dCB0byBwcmV2ZW50IG9wZW5cbiAgICAgIHZhciBsZW4gPSBvbWl0SXRlbXMubGVuZ3RoO1xuICAgICAgdmFyIG9yaWdpbk9taXRJdGVtcyA9IGxlbiA/IGNoaWxkTGlzdC5zbGljZSgtbGVuKSA6IG51bGw7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3ViTWVudSwge1xuICAgICAgICBldmVudEtleTogT1ZFUkZMT1dfS0VZLFxuICAgICAgICB0aXRsZTogb3ZlcmZsb3dlZEluZGljYXRvcixcbiAgICAgICAgZGlzYWJsZWQ6IGFsbFZpc2libGUsXG4gICAgICAgIGludGVybmFsUG9wdXBDbG9zZTogbGVuID09PSAwLFxuICAgICAgICBwb3B1cENsYXNzTmFtZTogb3ZlcmZsb3dlZEluZGljYXRvclBvcHVwQ2xhc3NOYW1lXG4gICAgICB9LCBvcmlnaW5PbWl0SXRlbXMpO1xuICAgIH0sXG4gICAgbWF4Q291bnQ6IGludGVybmFsTW9kZSAhPT0gJ2hvcml6b250YWwnIHx8IGRpc2FibGVkT3ZlcmZsb3cgPyBPdmVyZmxvdy5JTlZBTElEQVRFIDogT3ZlcmZsb3cuUkVTUE9OU0lWRSxcbiAgICBzc3I6IFwiZnVsbFwiLFxuICAgIFwiZGF0YS1tZW51LWxpc3RcIjogdHJ1ZSxcbiAgICBvblZpc2libGVDaGFuZ2U6IGZ1bmN0aW9uIG9uVmlzaWJsZUNoYW5nZShuZXdMYXN0SW5kZXgpIHtcbiAgICAgIHNldExhc3RWaXNpYmxlSW5kZXgobmV3TGFzdEluZGV4KTtcbiAgICB9LFxuICAgIG9uS2V5RG93bjogb25JbnRlcm5hbEtleURvd25cbiAgfSwgcmVzdFByb3BzKSk7XG5cbiAgLy8gPj4+Pj4gUmVuZGVyXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQcml2YXRlQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBwcml2YXRlQ29udGV4dFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJZENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogdXVpZFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNZW51Q29udGV4dFByb3ZpZGVyLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgcm9vdENsYXNzTmFtZTogcm9vdENsYXNzTmFtZSxcbiAgICBtb2RlOiBpbnRlcm5hbE1vZGUsXG4gICAgb3BlbktleXM6IG1lcmdlZE9wZW5LZXlzLFxuICAgIHJ0bDogaXNSdGxcbiAgICAvLyBEaXNhYmxlZFxuICAgICxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWRcbiAgICAvLyBNb3Rpb25cbiAgICAsXG4gICAgbW90aW9uOiBtb3VudGVkID8gbW90aW9uIDogbnVsbCxcbiAgICBkZWZhdWx0TW90aW9uczogbW91bnRlZCA/IGRlZmF1bHRNb3Rpb25zIDogbnVsbFxuICAgIC8vIEFjdGl2ZVxuICAgICxcbiAgICBhY3RpdmVLZXk6IG1lcmdlZEFjdGl2ZUtleSxcbiAgICBvbkFjdGl2ZTogb25BY3RpdmUsXG4gICAgb25JbmFjdGl2ZTogb25JbmFjdGl2ZVxuICAgIC8vIFNlbGVjdGlvblxuICAgICxcbiAgICBzZWxlY3RlZEtleXM6IG1lcmdlZFNlbGVjdEtleXNcbiAgICAvLyBMZXZlbFxuICAgICxcbiAgICBpbmxpbmVJbmRlbnQ6IGlubGluZUluZGVudFxuICAgIC8vIFBvcHVwXG4gICAgLFxuICAgIHN1Yk1lbnVPcGVuRGVsYXk6IHN1Yk1lbnVPcGVuRGVsYXksXG4gICAgc3ViTWVudUNsb3NlRGVsYXk6IHN1Yk1lbnVDbG9zZURlbGF5LFxuICAgIGZvcmNlU3ViTWVudVJlbmRlcjogZm9yY2VTdWJNZW51UmVuZGVyLFxuICAgIGJ1aWx0aW5QbGFjZW1lbnRzOiBidWlsdGluUGxhY2VtZW50cyxcbiAgICB0cmlnZ2VyU3ViTWVudUFjdGlvbjogdHJpZ2dlclN1Yk1lbnVBY3Rpb24sXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldEludGVybmFsUG9wdXBDb250YWluZXJcbiAgICAvLyBJY29uXG4gICAgLFxuICAgIGl0ZW1JY29uOiBpdGVtSWNvbixcbiAgICBleHBhbmRJY29uOiBleHBhbmRJY29uXG4gICAgLy8gRXZlbnRzXG4gICAgLFxuICAgIG9uSXRlbUNsaWNrOiBvbkludGVybmFsQ2xpY2ssXG4gICAgb25PcGVuQ2hhbmdlOiBvbkludGVybmFsT3BlbkNoYW5nZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYXRoVXNlckNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogcGF0aFVzZXJDb250ZXh0XG4gIH0sIGNvbnRhaW5lciksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBzdHlsZToge1xuICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgfSxcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUGF0aFJlZ2lzdGVyQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiByZWdpc3RlclBhdGhDb250ZXh0XG4gIH0sIGNoaWxkTGlzdCkpKSkpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBNZW51OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJjbGFzc05hbWVcIiwgXCJ0aXRsZVwiLCBcImV2ZW50S2V5XCIsIFwiY2hpbGRyZW5cIl0sXG4gIF9leGNsdWRlZDIgPSBbXCJjaGlsZHJlblwiXTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IG9taXQgZnJvbSBcInJjLXV0aWwvZXMvb21pdFwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTWVudUNvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0L01lbnVDb250ZXh0XCI7XG5pbXBvcnQgeyB1c2VGdWxsUGF0aCwgdXNlTWVhc3VyZSB9IGZyb20gXCIuL2NvbnRleHQvUGF0aENvbnRleHRcIjtcbmltcG9ydCB7IHBhcnNlQ2hpbGRyZW4gfSBmcm9tIFwiLi91dGlscy9ub2RlVXRpbFwiO1xudmFyIEludGVybmFsTWVudUl0ZW1Hcm91cCA9IGZ1bmN0aW9uIEludGVybmFsTWVudUl0ZW1Hcm91cChfcmVmKSB7XG4gIHZhciBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICB0aXRsZSA9IF9yZWYudGl0bGUsXG4gICAgZXZlbnRLZXkgPSBfcmVmLmV2ZW50S2V5LFxuICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChNZW51Q29udGV4dCksXG4gICAgcHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQucHJlZml4Q2xzO1xuICB2YXIgZ3JvdXBQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tZ3JvdXBcIik7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIF9leHRlbmRzKHtcbiAgICByb2xlOiBcInByZXNlbnRhdGlvblwiXG4gIH0sIHJlc3RQcm9wcywge1xuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgcmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoZ3JvdXBQcmVmaXhDbHMsIGNsYXNzTmFtZSlcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByb2xlOiBcInByZXNlbnRhdGlvblwiLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoZ3JvdXBQcmVmaXhDbHMsIFwiLXRpdGxlXCIpLFxuICAgIHRpdGxlOiB0eXBlb2YgdGl0bGUgPT09ICdzdHJpbmcnID8gdGl0bGUgOiB1bmRlZmluZWRcbiAgfSwgdGl0bGUpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICByb2xlOiBcImdyb3VwXCIsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChncm91cFByZWZpeENscywgXCItbGlzdFwiKVxuICB9LCBjaGlsZHJlbikpO1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1lbnVJdGVtR3JvdXAoX3JlZjIpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZjIuY2hpbGRyZW4sXG4gICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjIsIF9leGNsdWRlZDIpO1xuICB2YXIgY29ubmVjdGVkS2V5UGF0aCA9IHVzZUZ1bGxQYXRoKHByb3BzLmV2ZW50S2V5KTtcbiAgdmFyIGNoaWxkTGlzdCA9IHBhcnNlQ2hpbGRyZW4oY2hpbGRyZW4sIGNvbm5lY3RlZEtleVBhdGgpO1xuICB2YXIgbWVhc3VyZSA9IHVzZU1lYXN1cmUoKTtcbiAgaWYgKG1lYXN1cmUpIHtcbiAgICByZXR1cm4gY2hpbGRMaXN0O1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJbnRlcm5hbE1lbnVJdGVtR3JvdXAsIG9taXQocHJvcHMsIFsnd2FybktleSddKSwgY2hpbGRMaXN0KTtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IE1lbnVDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dC9NZW51Q29udGV4dFwiO1xuaW1wb3J0IHsgdXNlTWVhc3VyZSB9IGZyb20gXCIuL2NvbnRleHQvUGF0aENvbnRleHRcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERpdmlkZXIoX3JlZikge1xuICB2YXIgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBfcmVmLnN0eWxlO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KE1lbnVDb250ZXh0KSxcbiAgICBwcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5wcmVmaXhDbHM7XG4gIHZhciBtZWFzdXJlID0gdXNlTWVhc3VyZSgpO1xuICBpZiAobWVhc3VyZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWRpdmlkZXJcIiksIGNsYXNzTmFtZSksXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0pO1xufSIsImltcG9ydCBNZW51IGZyb20gXCIuL01lbnVcIjtcbmltcG9ydCBNZW51SXRlbSBmcm9tIFwiLi9NZW51SXRlbVwiO1xuaW1wb3J0IFN1Yk1lbnUgZnJvbSBcIi4vU3ViTWVudVwiO1xuaW1wb3J0IE1lbnVJdGVtR3JvdXAgZnJvbSBcIi4vTWVudUl0ZW1Hcm91cFwiO1xuaW1wb3J0IHsgdXNlRnVsbFBhdGggfSBmcm9tIFwiLi9jb250ZXh0L1BhdGhDb250ZXh0XCI7XG5pbXBvcnQgRGl2aWRlciBmcm9tIFwiLi9EaXZpZGVyXCI7XG5leHBvcnQgeyBTdWJNZW51LCBNZW51SXRlbSBhcyBJdGVtLCBNZW51SXRlbSwgTWVudUl0ZW1Hcm91cCwgTWVudUl0ZW1Hcm91cCBhcyBJdGVtR3JvdXAsIERpdmlkZXIsIC8qKiBAcHJpdmF0ZSBPbmx5IHVzZWQgZm9yIGFudGQgaW50ZXJuYWwuIERvIG5vdCB1c2UgaW4geW91ciBwcm9kdWN0aW9uLiAqL1xudXNlRnVsbFBhdGggfTtcbnZhciBFeHBvcnRNZW51ID0gTWVudTtcbkV4cG9ydE1lbnUuSXRlbSA9IE1lbnVJdGVtO1xuRXhwb3J0TWVudS5TdWJNZW51ID0gU3ViTWVudTtcbkV4cG9ydE1lbnUuSXRlbUdyb3VwID0gTWVudUl0ZW1Hcm91cDtcbkV4cG9ydE1lbnUuRGl2aWRlciA9IERpdmlkZXI7XG5leHBvcnQgZGVmYXVsdCBFeHBvcnRNZW51OyIsIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIExlZnRPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNzI0IDIxOC4zVjE0MWMwLTYuNy03LjctMTAuNC0xMi45LTYuM0wyNjAuMyA0ODYuOGEzMS44NiAzMS44NiAwIDAwMCA1MC4zbDQ1MC44IDM1Mi4xYzUuMyA0LjEgMTIuOS40IDEyLjktNi4zdi03Ny4zYzAtNC45LTIuMy05LjYtNi4xLTEyLjZsLTM2MC0yODEgMzYwLTI4MS4xYzMuOC0zIDYuMS03LjcgNi4xLTEyLjZ6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJsZWZ0XCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBMZWZ0T3V0bGluZWQ7XG4iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBMZWZ0T3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vTGVmdE91dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSAnLi4vY29tcG9uZW50cy9BbnRkSWNvbic7XG52YXIgTGVmdE91dGxpbmVkID0gZnVuY3Rpb24gTGVmdE91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBMZWZ0T3V0bGluZWRTdmdcbiAgfSkpO1xufTtcbkxlZnRPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdMZWZ0T3V0bGluZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoTGVmdE91dGxpbmVkKTsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBSaWdodE91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk03NjUuNyA0ODYuOEwzMTQuOSAxMzQuN0E3Ljk3IDcuOTcgMCAwMDMwMiAxNDF2NzcuM2MwIDQuOSAyLjMgOS42IDYuMSAxMi42bDM2MCAyODEuMS0zNjAgMjgxLjFjLTMuOSAzLTYuMSA3LjctNi4xIDEyLjZWODgzYzAgNi43IDcuNyAxMC40IDEyLjkgNi4zbDQ1MC44LTM1Mi4xYTMxLjk2IDMxLjk2IDAgMDAwLTUwLjR6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJyaWdodFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgUmlnaHRPdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJpZ2h0T3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vUmlnaHRPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIFJpZ2h0T3V0bGluZWQgPSBmdW5jdGlvbiBSaWdodE91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBSaWdodE91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5SaWdodE91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ1JpZ2h0T3V0bGluZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoUmlnaHRPdXRsaW5lZCk7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IEJhcnNPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQmFyc091dGxpbmVkXCI7XG5pbXBvcnQgTGVmdE91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9MZWZ0T3V0bGluZWRcIjtcbmltcG9ydCBSaWdodE91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9SaWdodE91dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBvbWl0IGZyb20gXCJyYy11dGlsL2VzL29taXRcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IGlzTnVtZXJpYyBmcm9tICcuLi9fdXRpbC9pc051bWVyaWMnO1xuaW1wb3J0IHsgTGF5b3V0Q29udGV4dCB9IGZyb20gJy4vbGF5b3V0JztcbnZhciBkaW1lbnNpb25NYXhNYXAgPSB7XG4gIHhzOiAnNDc5Ljk4cHgnLFxuICBzbTogJzU3NS45OHB4JyxcbiAgbWQ6ICc3NjcuOThweCcsXG4gIGxnOiAnOTkxLjk4cHgnLFxuICB4bDogJzExOTkuOThweCcsXG4gIHh4bDogJzE1OTkuOThweCdcbn07XG5leHBvcnQgdmFyIFNpZGVyQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHt9KTtcbnZhciBnZW5lcmF0ZUlkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaSA9IDA7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByZWZpeCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJyc7XG4gICAgaSArPSAxO1xuICAgIHJldHVybiBcIlwiLmNvbmNhdChwcmVmaXgpLmNvbmNhdChpKTtcbiAgfTtcbn0oKTtcbnZhciBTaWRlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChfYSwgcmVmKSB7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBfYS5wcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLFxuICAgIHRyaWdnZXIgPSBfYS50cmlnZ2VyLFxuICAgIGNoaWxkcmVuID0gX2EuY2hpbGRyZW4sXG4gICAgX2EkZGVmYXVsdENvbGxhcHNlZCA9IF9hLmRlZmF1bHRDb2xsYXBzZWQsXG4gICAgZGVmYXVsdENvbGxhcHNlZCA9IF9hJGRlZmF1bHRDb2xsYXBzZWQgPT09IHZvaWQgMCA/IGZhbHNlIDogX2EkZGVmYXVsdENvbGxhcHNlZCxcbiAgICBfYSR0aGVtZSA9IF9hLnRoZW1lLFxuICAgIHRoZW1lID0gX2EkdGhlbWUgPT09IHZvaWQgMCA/ICdkYXJrJyA6IF9hJHRoZW1lLFxuICAgIF9hJHN0eWxlID0gX2Euc3R5bGUsXG4gICAgc3R5bGUgPSBfYSRzdHlsZSA9PT0gdm9pZCAwID8ge30gOiBfYSRzdHlsZSxcbiAgICBfYSRjb2xsYXBzaWJsZSA9IF9hLmNvbGxhcHNpYmxlLFxuICAgIGNvbGxhcHNpYmxlID0gX2EkY29sbGFwc2libGUgPT09IHZvaWQgMCA/IGZhbHNlIDogX2EkY29sbGFwc2libGUsXG4gICAgX2EkcmV2ZXJzZUFycm93ID0gX2EucmV2ZXJzZUFycm93LFxuICAgIHJldmVyc2VBcnJvdyA9IF9hJHJldmVyc2VBcnJvdyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYSRyZXZlcnNlQXJyb3csXG4gICAgX2Ekd2lkdGggPSBfYS53aWR0aCxcbiAgICB3aWR0aCA9IF9hJHdpZHRoID09PSB2b2lkIDAgPyAyMDAgOiBfYSR3aWR0aCxcbiAgICBfYSRjb2xsYXBzZWRXaWR0aCA9IF9hLmNvbGxhcHNlZFdpZHRoLFxuICAgIGNvbGxhcHNlZFdpZHRoID0gX2EkY29sbGFwc2VkV2lkdGggPT09IHZvaWQgMCA/IDgwIDogX2EkY29sbGFwc2VkV2lkdGgsXG4gICAgemVyb1dpZHRoVHJpZ2dlclN0eWxlID0gX2EuemVyb1dpZHRoVHJpZ2dlclN0eWxlLFxuICAgIGJyZWFrcG9pbnQgPSBfYS5icmVha3BvaW50LFxuICAgIG9uQ29sbGFwc2UgPSBfYS5vbkNvbGxhcHNlLFxuICAgIG9uQnJlYWtwb2ludCA9IF9hLm9uQnJlYWtwb2ludCxcbiAgICBwcm9wcyA9IF9fcmVzdChfYSwgW1wicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwidHJpZ2dlclwiLCBcImNoaWxkcmVuXCIsIFwiZGVmYXVsdENvbGxhcHNlZFwiLCBcInRoZW1lXCIsIFwic3R5bGVcIiwgXCJjb2xsYXBzaWJsZVwiLCBcInJldmVyc2VBcnJvd1wiLCBcIndpZHRoXCIsIFwiY29sbGFwc2VkV2lkdGhcIiwgXCJ6ZXJvV2lkdGhUcmlnZ2VyU3R5bGVcIiwgXCJicmVha3BvaW50XCIsIFwib25Db2xsYXBzZVwiLCBcIm9uQnJlYWtwb2ludFwiXSk7XG4gIHZhciBfdXNlQ29udGV4dCA9IHVzZUNvbnRleHQoTGF5b3V0Q29udGV4dCksXG4gICAgc2lkZXJIb29rID0gX3VzZUNvbnRleHQuc2lkZXJIb29rO1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoJ2NvbGxhcHNlZCcgaW4gcHJvcHMgPyBwcm9wcy5jb2xsYXBzZWQgOiBkZWZhdWx0Q29sbGFwc2VkKSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICBjb2xsYXBzZWQgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldENvbGxhcHNlZCA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciBfdXNlU3RhdGUzID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgIF91c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUzLCAyKSxcbiAgICBiZWxvdyA9IF91c2VTdGF0ZTRbMF0sXG4gICAgc2V0QmVsb3cgPSBfdXNlU3RhdGU0WzFdO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICgnY29sbGFwc2VkJyBpbiBwcm9wcykge1xuICAgICAgc2V0Q29sbGFwc2VkKHByb3BzLmNvbGxhcHNlZCk7XG4gICAgfVxuICB9LCBbcHJvcHMuY29sbGFwc2VkXSk7XG4gIHZhciBoYW5kbGVTZXRDb2xsYXBzZWQgPSBmdW5jdGlvbiBoYW5kbGVTZXRDb2xsYXBzZWQodmFsdWUsIHR5cGUpIHtcbiAgICBpZiAoISgnY29sbGFwc2VkJyBpbiBwcm9wcykpIHtcbiAgICAgIHNldENvbGxhcHNlZCh2YWx1ZSk7XG4gICAgfVxuICAgIG9uQ29sbGFwc2UgPT09IG51bGwgfHwgb25Db2xsYXBzZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25Db2xsYXBzZSh2YWx1ZSwgdHlwZSk7XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gUmVzcG9uc2l2ZSA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciByZXNwb25zaXZlSGFuZGxlclJlZiA9IHVzZVJlZigpO1xuICByZXNwb25zaXZlSGFuZGxlclJlZi5jdXJyZW50ID0gZnVuY3Rpb24gKG1xbCkge1xuICAgIHNldEJlbG93KG1xbC5tYXRjaGVzKTtcbiAgICBvbkJyZWFrcG9pbnQgPT09IG51bGwgfHwgb25CcmVha3BvaW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJyZWFrcG9pbnQobXFsLm1hdGNoZXMpO1xuICAgIGlmIChjb2xsYXBzZWQgIT09IG1xbC5tYXRjaGVzKSB7XG4gICAgICBoYW5kbGVTZXRDb2xsYXBzZWQobXFsLm1hdGNoZXMsICdyZXNwb25zaXZlJyk7XG4gICAgfVxuICB9O1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIHJlc3BvbnNpdmVIYW5kbGVyKG1xbCkge1xuICAgICAgcmV0dXJuIHJlc3BvbnNpdmVIYW5kbGVyUmVmLmN1cnJlbnQobXFsKTtcbiAgICB9XG4gICAgdmFyIG1xbDtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBfd2luZG93ID0gd2luZG93LFxuICAgICAgICBtYXRjaE1lZGlhID0gX3dpbmRvdy5tYXRjaE1lZGlhO1xuICAgICAgaWYgKG1hdGNoTWVkaWEgJiYgYnJlYWtwb2ludCAmJiBicmVha3BvaW50IGluIGRpbWVuc2lvbk1heE1hcCkge1xuICAgICAgICBtcWwgPSBtYXRjaE1lZGlhKFwiKG1heC13aWR0aDogXCIuY29uY2F0KGRpbWVuc2lvbk1heE1hcFticmVha3BvaW50XSwgXCIpXCIpKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBtcWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgcmVzcG9uc2l2ZUhhbmRsZXIpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIG1xbC5hZGRMaXN0ZW5lcihyZXNwb25zaXZlSGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzcG9uc2l2ZUhhbmRsZXIobXFsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG1xbCA9PT0gbnVsbCB8fCBtcWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1xbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCByZXNwb25zaXZlSGFuZGxlcik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBtcWwgPT09IG51bGwgfHwgbXFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtcWwucmVtb3ZlTGlzdGVuZXIocmVzcG9uc2l2ZUhhbmRsZXIpO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFticmVha3BvaW50XSk7IC8vIGluIG9yZGVyIHRvIGFjY2VwdCBkeW5hbWljICdicmVha3BvaW50JyBwcm9wZXJ0eSwgd2UgbmVlZCB0byBhZGQgJ2JyZWFrcG9pbnQnIGludG8gZGVwZW5kZW5jeSBhcnJheS5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdW5pcXVlSWQgPSBnZW5lcmF0ZUlkKCdhbnQtc2lkZXItJyk7XG4gICAgc2lkZXJIb29rLmFkZFNpZGVyKHVuaXF1ZUlkKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHNpZGVySG9vay5yZW1vdmVTaWRlcih1bmlxdWVJZCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICB2YXIgdG9nZ2xlID0gZnVuY3Rpb24gdG9nZ2xlKCkge1xuICAgIGhhbmRsZVNldENvbGxhcHNlZCghY29sbGFwc2VkLCAnY2xpY2tUcmlnZ2VyJyk7XG4gIH07XG4gIHZhciBfdXNlQ29udGV4dDIgPSB1c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF91c2VDb250ZXh0Mi5nZXRQcmVmaXhDbHM7XG4gIHZhciByZW5kZXJTaWRlciA9IGZ1bmN0aW9uIHJlbmRlclNpZGVyKCkge1xuICAgIHZhciBfY2xhc3NOYW1lcztcbiAgICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdsYXlvdXQtc2lkZXInLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgIHZhciBkaXZQcm9wcyA9IG9taXQocHJvcHMsIFsnY29sbGFwc2VkJ10pO1xuICAgIHZhciByYXdXaWR0aCA9IGNvbGxhcHNlZCA/IGNvbGxhcHNlZFdpZHRoIDogd2lkdGg7XG4gICAgLy8gdXNlIFwicHhcIiBhcyBmYWxsYmFjayB1bml0IGZvciB3aWR0aFxuICAgIHZhciBzaWRlcldpZHRoID0gaXNOdW1lcmljKHJhd1dpZHRoKSA/IFwiXCIuY29uY2F0KHJhd1dpZHRoLCBcInB4XCIpIDogU3RyaW5nKHJhd1dpZHRoKTtcbiAgICAvLyBzcGVjaWFsIHRyaWdnZXIgd2hlbiBjb2xsYXBzZWRXaWR0aCA9PSAwXG4gICAgdmFyIHplcm9XaWR0aFRyaWdnZXIgPSBwYXJzZUZsb2F0KFN0cmluZyhjb2xsYXBzZWRXaWR0aCB8fCAwKSkgPT09IDAgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgb25DbGljazogdG9nZ2xlLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItemVyby13aWR0aC10cmlnZ2VyXCIpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXplcm8td2lkdGgtdHJpZ2dlci1cIikuY29uY2F0KHJldmVyc2VBcnJvdyA/ICdyaWdodCcgOiAnbGVmdCcpKSxcbiAgICAgIHN0eWxlOiB6ZXJvV2lkdGhUcmlnZ2VyU3R5bGVcbiAgICB9LCB0cmlnZ2VyIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJhcnNPdXRsaW5lZCwgbnVsbCkpIDogbnVsbDtcbiAgICB2YXIgaWNvbk9iaiA9IHtcbiAgICAgIGV4cGFuZGVkOiByZXZlcnNlQXJyb3cgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSaWdodE91dGxpbmVkLCBudWxsKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExlZnRPdXRsaW5lZCwgbnVsbCksXG4gICAgICBjb2xsYXBzZWQ6IHJldmVyc2VBcnJvdyA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExlZnRPdXRsaW5lZCwgbnVsbCkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSaWdodE91dGxpbmVkLCBudWxsKVxuICAgIH07XG4gICAgdmFyIHN0YXR1cyA9IGNvbGxhcHNlZCA/ICdjb2xsYXBzZWQnIDogJ2V4cGFuZGVkJztcbiAgICB2YXIgZGVmYXVsdFRyaWdnZXIgPSBpY29uT2JqW3N0YXR1c107XG4gICAgdmFyIHRyaWdnZXJEb20gPSB0cmlnZ2VyICE9PSBudWxsID8gemVyb1dpZHRoVHJpZ2dlciB8fCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdHJpZ2dlclwiKSxcbiAgICAgIG9uQ2xpY2s6IHRvZ2dsZSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIHdpZHRoOiBzaWRlcldpZHRoXG4gICAgICB9XG4gICAgfSwgdHJpZ2dlciB8fCBkZWZhdWx0VHJpZ2dlcikgOiBudWxsO1xuICAgIHZhciBkaXZTdHlsZSA9IF9leHRlbmRzKF9leHRlbmRzKHt9LCBzdHlsZSksIHtcbiAgICAgIGZsZXg6IFwiMCAwIFwiLmNvbmNhdChzaWRlcldpZHRoKSxcbiAgICAgIG1heFdpZHRoOiBzaWRlcldpZHRoLFxuICAgICAgbWluV2lkdGg6IHNpZGVyV2lkdGgsXG4gICAgICB3aWR0aDogc2lkZXJXaWR0aFxuICAgIH0pO1xuICAgIHZhciBzaWRlckNscyA9IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQodGhlbWUpLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbGxhcHNlZFwiKSwgISFjb2xsYXBzZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGFzLXRyaWdnZXJcIiksIGNvbGxhcHNpYmxlICYmIHRyaWdnZXIgIT09IG51bGwgJiYgIXplcm9XaWR0aFRyaWdnZXIpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYmVsb3dcIiksICEhYmVsb3cpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItemVyby13aWR0aFwiKSwgcGFyc2VGbG9hdChzaWRlcldpZHRoKSA9PT0gMCksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhc2lkZVwiLCBfZXh0ZW5kcyh7XG4gICAgICBjbGFzc05hbWU6IHNpZGVyQ2xzXG4gICAgfSwgZGl2UHJvcHMsIHtcbiAgICAgIHN0eWxlOiBkaXZTdHlsZSxcbiAgICAgIHJlZjogcmVmXG4gICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jaGlsZHJlblwiKVxuICAgIH0sIGNoaWxkcmVuKSwgY29sbGFwc2libGUgfHwgYmVsb3cgJiYgemVyb1dpZHRoVHJpZ2dlciA/IHRyaWdnZXJEb20gOiBudWxsKTtcbiAgfTtcbiAgdmFyIGNvbnRleHRWYWx1ZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzaWRlckNvbGxhcHNlZDogY29sbGFwc2VkXG4gICAgfTtcbiAgfSwgW2NvbGxhcHNlZF0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2lkZXJDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGNvbnRleHRWYWx1ZVxuICB9LCByZW5kZXJTaWRlcigpKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgU2lkZXIuZGlzcGxheU5hbWUgPSAnU2lkZXInO1xufVxuZXhwb3J0IGRlZmF1bHQgU2lkZXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgRGl2aWRlciB9IGZyb20gJ3JjLW1lbnUnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG52YXIgTWVudURpdmlkZXIgPSBmdW5jdGlvbiBNZW51RGl2aWRlcihfYSkge1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gX2EucHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSxcbiAgICBkYXNoZWQgPSBfYS5kYXNoZWQsXG4gICAgcmVzdFByb3BzID0gX19yZXN0KF9hLCBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJkYXNoZWRcIl0pO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscztcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnbWVudScsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBjbGFzc1N0cmluZyA9IGNsYXNzTmFtZXMoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tZGl2aWRlci1kYXNoZWRcIiksICEhZGFzaGVkKSwgY2xhc3NOYW1lKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERpdmlkZXIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzU3RyaW5nXG4gIH0sIHJlc3RQcm9wcykpO1xufTtcbmV4cG9ydCBkZWZhdWx0IE1lbnVEaXZpZGVyOyIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG52YXIgTWVudUNvbnRleHQgPSAvKiNfX1BVUkVfXyovY3JlYXRlQ29udGV4dCh7XG4gIHByZWZpeENsczogJycsXG4gIGZpcnN0TGV2ZWw6IHRydWUsXG4gIGlubGluZUNvbGxhcHNlZDogZmFsc2Vcbn0pO1xuZXhwb3J0IGRlZmF1bHQgTWVudUNvbnRleHQ7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IEl0ZW0gfSBmcm9tICdyYy1tZW51JztcbmltcG9ydCB0b0FycmF5IGZyb20gXCJyYy11dGlsL2VzL0NoaWxkcmVuL3RvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFNpZGVyQ29udGV4dCB9IGZyb20gJy4uL2xheW91dC9TaWRlcic7XG5pbXBvcnQgVG9vbHRpcCBmcm9tICcuLi90b29sdGlwJztcbmltcG9ydCB7IGNsb25lRWxlbWVudCwgaXNWYWxpZEVsZW1lbnQgfSBmcm9tICcuLi9fdXRpbC9yZWFjdE5vZGUnO1xuaW1wb3J0IE1lbnVDb250ZXh0IGZyb20gJy4vTWVudUNvbnRleHQnO1xudmFyIE1lbnVJdGVtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhNZW51SXRlbSwgX1JlYWN0JENvbXBvbmVudCk7XG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoTWVudUl0ZW0pO1xuICBmdW5jdGlvbiBNZW51SXRlbSgpIHtcbiAgICB2YXIgX3RoaXM7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1lbnVJdGVtKTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLnJlbmRlckl0ZW0gPSBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIF9jbGFzc05hbWVzO1xuICAgICAgdmFyIHNpZGVyQ29sbGFwc2VkID0gX3JlZi5zaWRlckNvbGxhcHNlZDtcbiAgICAgIHZhciBfYTtcbiAgICAgIHZhciBfdGhpcyRjb250ZXh0ID0gX3RoaXMuY29udGV4dCxcbiAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkY29udGV4dC5wcmVmaXhDbHMsXG4gICAgICAgIGZpcnN0TGV2ZWwgPSBfdGhpcyRjb250ZXh0LmZpcnN0TGV2ZWwsXG4gICAgICAgIGlubGluZUNvbGxhcHNlZCA9IF90aGlzJGNvbnRleHQuaW5saW5lQ29sbGFwc2VkLFxuICAgICAgICBkaXJlY3Rpb24gPSBfdGhpcyRjb250ZXh0LmRpcmVjdGlvbixcbiAgICAgICAgZGlzYWJsZU1lbnVJdGVtVGl0bGVUb29sdGlwID0gX3RoaXMkY29udGV4dC5kaXNhYmxlTWVudUl0ZW1UaXRsZVRvb2x0aXA7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIF9iID0gX3RoaXMucHJvcHMsXG4gICAgICAgIHRpdGxlID0gX2IudGl0bGUsXG4gICAgICAgIGljb24gPSBfYi5pY29uLFxuICAgICAgICBkYW5nZXIgPSBfYi5kYW5nZXIsXG4gICAgICAgIHJlc3QgPSBfX3Jlc3QoX2IsIFtcInRpdGxlXCIsIFwiaWNvblwiLCBcImRhbmdlclwiXSk7XG4gICAgICB2YXIgdG9vbHRpcFRpdGxlID0gdGl0bGU7XG4gICAgICBpZiAodHlwZW9mIHRpdGxlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0b29sdGlwVGl0bGUgPSBmaXJzdExldmVsID8gY2hpbGRyZW4gOiAnJztcbiAgICAgIH0gZWxzZSBpZiAodGl0bGUgPT09IGZhbHNlKSB7XG4gICAgICAgIHRvb2x0aXBUaXRsZSA9ICcnO1xuICAgICAgfVxuICAgICAgdmFyIHRvb2x0aXBQcm9wcyA9IHtcbiAgICAgICAgdGl0bGU6IHRvb2x0aXBUaXRsZVxuICAgICAgfTtcbiAgICAgIGlmICghc2lkZXJDb2xsYXBzZWQgJiYgIWlubGluZUNvbGxhcHNlZCkge1xuICAgICAgICB0b29sdGlwUHJvcHMudGl0bGUgPSBudWxsO1xuICAgICAgICAvLyBSZXNldCBgb3BlbmAgdG8gZml4IGNvbnRyb2wgbW9kZSB0b29sdGlwIGRpc3BsYXkgbm90IGNvcnJlY3RcbiAgICAgICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8xNjc0MlxuICAgICAgICB0b29sdGlwUHJvcHMub3BlbiA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gdG9BcnJheShjaGlsZHJlbikubGVuZ3RoO1xuICAgICAgdmFyIHJldHVybk5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJdGVtLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWRhbmdlclwiKSwgZGFuZ2VyKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tb25seS1jaGlsZFwiKSwgKGljb24gPyBjaGlsZHJlbkxlbmd0aCArIDEgOiBjaGlsZHJlbkxlbmd0aCkgPT09IDEpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSksXG4gICAgICAgIHRpdGxlOiB0eXBlb2YgdGl0bGUgPT09ICdzdHJpbmcnID8gdGl0bGUgOiB1bmRlZmluZWRcbiAgICAgIH0pLCBjbG9uZUVsZW1lbnQoaWNvbiwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoaXNWYWxpZEVsZW1lbnQoaWNvbikgPyAoX2EgPSBpY29uLnByb3BzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2xhc3NOYW1lIDogJycsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1pY29uXCIpKVxuICAgICAgfSksIF90aGlzLnJlbmRlckl0ZW1DaGlsZHJlbihpbmxpbmVDb2xsYXBzZWQpKTtcbiAgICAgIGlmICghZGlzYWJsZU1lbnVJdGVtVGl0bGVUb29sdGlwKSB7XG4gICAgICAgIHJldHVybk5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwLCBfZXh0ZW5kcyh7fSwgdG9vbHRpcFByb3BzLCB7XG4gICAgICAgICAgcGxhY2VtZW50OiBkaXJlY3Rpb24gPT09ICdydGwnID8gJ2xlZnQnIDogJ3JpZ2h0JyxcbiAgICAgICAgICBvdmVybGF5Q2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlubGluZS1jb2xsYXBzZWQtdG9vbHRpcFwiKVxuICAgICAgICB9KSwgcmV0dXJuTm9kZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0dXJuTm9kZTtcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBfY3JlYXRlQ2xhc3MoTWVudUl0ZW0sIFt7XG4gICAga2V5OiBcInJlbmRlckl0ZW1DaGlsZHJlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJJdGVtQ2hpbGRyZW4oaW5saW5lQ29sbGFwc2VkKSB7XG4gICAgICB2YXIgX3RoaXMkY29udGV4dDIgPSB0aGlzLmNvbnRleHQsXG4gICAgICAgIHByZWZpeENscyA9IF90aGlzJGNvbnRleHQyLnByZWZpeENscyxcbiAgICAgICAgZmlyc3RMZXZlbCA9IF90aGlzJGNvbnRleHQyLmZpcnN0TGV2ZWw7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgaWNvbiA9IF90aGlzJHByb3BzMi5pY29uLFxuICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzMi5jaGlsZHJlbjtcbiAgICAgIHZhciB3cmFwTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10aXRsZS1jb250ZW50XCIpXG4gICAgICB9LCBjaGlsZHJlbik7XG4gICAgICAvLyBpbmxpbmUtY29sbGFwc2VkLm1kIGRlbW8g5L6d6LWWIHNwYW4g5p2l6ZqQ6JeP5paH5a2XLOaciSBpY29uIOWxnuaAp++8jOWImeWGhemDqOWMheijueS4gOS4qiBzcGFuXG4gICAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vcHVsbC8yMzQ1NlxuICAgICAgaWYgKCFpY29uIHx8IGlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSAmJiBjaGlsZHJlbi50eXBlID09PSAnc3BhbicpIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuICYmIGlubGluZUNvbGxhcHNlZCAmJiBmaXJzdExldmVsICYmIHR5cGVvZiBjaGlsZHJlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlubGluZS1jb2xsYXBzZWQtbm9pY29uXCIpXG4gICAgICAgICAgfSwgY2hpbGRyZW4uY2hhckF0KDApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBOb2RlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNpZGVyQ29udGV4dC5Db25zdW1lciwgbnVsbCwgdGhpcy5yZW5kZXJJdGVtKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIE1lbnVJdGVtO1xufShSZWFjdC5Db21wb25lbnQpO1xuZXhwb3J0IHsgTWVudUl0ZW0gYXMgZGVmYXVsdCB9O1xuTWVudUl0ZW0uY29udGV4dFR5cGUgPSBNZW51Q29udGV4dDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgU3ViTWVudSBhcyBSY1N1Yk1lbnUsIHVzZUZ1bGxQYXRoIH0gZnJvbSAncmMtbWVudSc7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjbG9uZUVsZW1lbnQsIGlzVmFsaWRFbGVtZW50IH0gZnJvbSAnLi4vX3V0aWwvcmVhY3ROb2RlJztcbmltcG9ydCBNZW51Q29udGV4dCBmcm9tICcuL01lbnVDb250ZXh0JztcbmZ1bmN0aW9uIFN1Yk1lbnUocHJvcHMpIHtcbiAgdmFyIF9hO1xuICB2YXIgcG9wdXBDbGFzc05hbWUgPSBwcm9wcy5wb3B1cENsYXNzTmFtZSxcbiAgICBpY29uID0gcHJvcHMuaWNvbixcbiAgICB0aXRsZSA9IHByb3BzLnRpdGxlLFxuICAgIHRoZW1lID0gcHJvcHMudGhlbWU7XG4gIHZhciBjb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChNZW51Q29udGV4dCk7XG4gIHZhciBwcmVmaXhDbHMgPSBjb250ZXh0LnByZWZpeENscyxcbiAgICBpbmxpbmVDb2xsYXBzZWQgPSBjb250ZXh0LmlubGluZUNvbGxhcHNlZCxcbiAgICBhbnRkTWVudVRoZW1lID0gY29udGV4dC5hbnRkTWVudVRoZW1lO1xuICB2YXIgcGFyZW50UGF0aCA9IHVzZUZ1bGxQYXRoKCk7XG4gIHZhciB0aXRsZU5vZGU7XG4gIGlmICghaWNvbikge1xuICAgIHRpdGxlTm9kZSA9IGlubGluZUNvbGxhcHNlZCAmJiAhcGFyZW50UGF0aC5sZW5ndGggJiYgdGl0bGUgJiYgdHlwZW9mIHRpdGxlID09PSAnc3RyaW5nJyA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbmxpbmUtY29sbGFwc2VkLW5vaWNvblwiKVxuICAgIH0sIHRpdGxlLmNoYXJBdCgwKSkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRpdGxlLWNvbnRlbnRcIilcbiAgICB9LCB0aXRsZSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gaW5saW5lLWNvbGxhcHNlZC5tZCBkZW1vIOS+nei1liBzcGFuIOadpemakOiXj+aWh+WtlyzmnIkgaWNvbiDlsZ7mgKfvvIzliJnlhoXpg6jljIXoo7nkuIDkuKogc3BhblxuICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9wdWxsLzIzNDU2XG4gICAgdmFyIHRpdGxlSXNTcGFuID0gaXNWYWxpZEVsZW1lbnQodGl0bGUpICYmIHRpdGxlLnR5cGUgPT09ICdzcGFuJztcbiAgICB0aXRsZU5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgY2xvbmVFbGVtZW50KGljb24sIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhpc1ZhbGlkRWxlbWVudChpY29uKSA/IChfYSA9IGljb24ucHJvcHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jbGFzc05hbWUgOiAnJywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWljb25cIikpXG4gICAgfSksIHRpdGxlSXNTcGFuID8gdGl0bGUgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRpdGxlLWNvbnRlbnRcIilcbiAgICB9LCB0aXRsZSkpO1xuICB9XG4gIHZhciBjb250ZXh0VmFsdWUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX2V4dGVuZHMoX2V4dGVuZHMoe30sIGNvbnRleHQpLCB7XG4gICAgICBmaXJzdExldmVsOiBmYWxzZVxuICAgIH0pO1xuICB9LCBbY29udGV4dF0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTWVudUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogY29udGV4dFZhbHVlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJjU3ViTWVudSwgX2V4dGVuZHMoe30sIG9taXQocHJvcHMsIFsnaWNvbiddKSwge1xuICAgIHRpdGxlOiB0aXRsZU5vZGUsXG4gICAgcG9wdXBDbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQodGhlbWUgfHwgYW50ZE1lbnVUaGVtZSksIHBvcHVwQ2xhc3NOYW1lKVxuICB9KSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgU3ViTWVudTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgeyBJdGVtR3JvdXAgfSBmcm9tICdyYy1tZW51JztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBNZW51RGl2aWRlciBmcm9tICcuLi9NZW51RGl2aWRlcic7XG5pbXBvcnQgTWVudUl0ZW0gZnJvbSAnLi4vTWVudUl0ZW0nO1xuaW1wb3J0IFN1Yk1lbnUgZnJvbSAnLi4vU3ViTWVudSc7XG5mdW5jdGlvbiBjb252ZXJ0SXRlbXNUb05vZGVzKGxpc3QpIHtcbiAgcmV0dXJuIChsaXN0IHx8IFtdKS5tYXAoZnVuY3Rpb24gKG9wdCwgaW5kZXgpIHtcbiAgICBpZiAob3B0ICYmIF90eXBlb2Yob3B0KSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBfYSA9IG9wdCxcbiAgICAgICAgbGFiZWwgPSBfYS5sYWJlbCxcbiAgICAgICAgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbixcbiAgICAgICAga2V5ID0gX2Eua2V5LFxuICAgICAgICB0eXBlID0gX2EudHlwZSxcbiAgICAgICAgcmVzdFByb3BzID0gX19yZXN0KF9hLCBbXCJsYWJlbFwiLCBcImNoaWxkcmVuXCIsIFwia2V5XCIsIFwidHlwZVwiXSk7XG4gICAgICB2YXIgbWVyZ2VkS2V5ID0ga2V5ICE9PSBudWxsICYmIGtleSAhPT0gdm9pZCAwID8ga2V5IDogXCJ0bXAtXCIuY29uY2F0KGluZGV4KTtcbiAgICAgIC8vIE1lbnVJdGVtR3JvdXAgJiBTdWJNZW51SXRlbVxuICAgICAgaWYgKGNoaWxkcmVuIHx8IHR5cGUgPT09ICdncm91cCcpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdncm91cCcpIHtcbiAgICAgICAgICAvLyBHcm91cFxuICAgICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJdGVtR3JvdXAsIF9leHRlbmRzKHtcbiAgICAgICAgICAgIGtleTogbWVyZ2VkS2V5XG4gICAgICAgICAgfSwgcmVzdFByb3BzLCB7XG4gICAgICAgICAgICB0aXRsZTogbGFiZWxcbiAgICAgICAgICB9KSwgY29udmVydEl0ZW1zVG9Ob2RlcyhjaGlsZHJlbikpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFN1YiBNZW51XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTdWJNZW51LCBfZXh0ZW5kcyh7XG4gICAgICAgICAga2V5OiBtZXJnZWRLZXlcbiAgICAgICAgfSwgcmVzdFByb3BzLCB7XG4gICAgICAgICAgdGl0bGU6IGxhYmVsXG4gICAgICAgIH0pLCBjb252ZXJ0SXRlbXNUb05vZGVzKGNoaWxkcmVuKSk7XG4gICAgICB9XG4gICAgICAvLyBNZW51SXRlbSAmIERpdmlkZXJcbiAgICAgIGlmICh0eXBlID09PSAnZGl2aWRlcicpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1lbnVEaXZpZGVyLCBfZXh0ZW5kcyh7XG4gICAgICAgICAga2V5OiBtZXJnZWRLZXlcbiAgICAgICAgfSwgcmVzdFByb3BzKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTWVudUl0ZW0sIF9leHRlbmRzKHtcbiAgICAgICAga2V5OiBtZXJnZWRLZXlcbiAgICAgIH0sIHJlc3RQcm9wcyksIGxhYmVsKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0pLmZpbHRlcihmdW5jdGlvbiAob3B0KSB7XG4gICAgcmV0dXJuIG9wdDtcbiAgfSk7XG59XG4vLyBGSVhNRTogTW92ZSBsb2dpYyBoZXJlIGluIHY1XG4vKipcbiAqIFdlIHNpbXBseSBjb252ZXJ0IGBpdGVtc2AgdG8gUmVhY3ROb2RlIGZvciByZXVzZSBvcmlnaW4gY29tcG9uZW50IGxvZ2ljLiBCdXQgd2UgbmVlZCBtb3ZlIGFsbCB0aGVcbiAqIGxvZ2ljIGZyb20gY29tcG9uZW50IGludG8gdGhpcyBob29rcyB3aGVuIGluIHY1XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUl0ZW1zKGl0ZW1zKSB7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWl0ZW1zKSB7XG4gICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuICAgIHJldHVybiBjb252ZXJ0SXRlbXNUb05vZGVzKGl0ZW1zKTtcbiAgfSwgW2l0ZW1zXSk7XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuLyoqIEBpbnRlcm5hbCBPbmx5IHVzZWQgZm9yIERyb3Bkb3duIGNvbXBvbmVudC4gRG8gbm90IHVzZSB0aGlzIGluIHlvdXIgcHJvZHVjdGlvbi4gKi9cbnZhciBPdmVycmlkZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbi8qKiBAaW50ZXJuYWwgT25seSB1c2VkIGZvciBEcm9wZG93biBjb21wb25lbnQuIERvIG5vdCB1c2UgdGhpcyBpbiB5b3VyIHByb2R1Y3Rpb24uICovXG5leHBvcnQgdmFyIE92ZXJyaWRlUHJvdmlkZXIgPSBmdW5jdGlvbiBPdmVycmlkZVByb3ZpZGVyKF9hKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLFxuICAgIHJlc3RQcm9wcyA9IF9fcmVzdChfYSwgW1wiY2hpbGRyZW5cIl0pO1xuICB2YXIgb3ZlcnJpZGUgPSBSZWFjdC51c2VDb250ZXh0KE92ZXJyaWRlQ29udGV4dCk7XG4gIHZhciBjb250ZXh0ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9leHRlbmRzKF9leHRlbmRzKHt9LCBvdmVycmlkZSksIHJlc3RQcm9wcyk7XG4gIH0sIFtvdmVycmlkZSwgcmVzdFByb3BzLnByZWZpeENscyxcbiAgLy8gcmVzdFByb3BzLmV4cGFuZEljb24sIE5vdCBtYXJrIGFzIGRlcHMgc2luY2UgdGhpcyBpcyBhIFJlYWN0Tm9kZVxuICByZXN0UHJvcHMubW9kZSwgcmVzdFByb3BzLnNlbGVjdGFibGVcbiAgLy8gcmVzdFByb3BzLnZhbGlkYXRvciwgTm90IG1hcmsgYXMgZGVwcyBzaW5jZSB0aGlzIGlzIGEgZnVuY3Rpb25cbiAgXSk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE92ZXJyaWRlQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjb250ZXh0XG4gIH0sIGNoaWxkcmVuKTtcbn07XG5leHBvcnQgZGVmYXVsdCBPdmVycmlkZUNvbnRleHQ7IiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBFbGxpcHNpc091dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FbGxpcHNpc091dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSY01lbnUsIHsgSXRlbUdyb3VwIH0gZnJvbSAncmMtbWVudSc7XG5pbXBvcnQgdXNlRXZlbnQgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlRXZlbnRcIjtcbmltcG9ydCBvbWl0IGZyb20gXCJyYy11dGlsL2VzL29taXRcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGZvcndhcmRSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB7IFNpZGVyQ29udGV4dCB9IGZyb20gJy4uL2xheW91dC9TaWRlcic7XG5pbXBvcnQgY29sbGFwc2VNb3Rpb24gZnJvbSAnLi4vX3V0aWwvbW90aW9uJztcbmltcG9ydCB7IGNsb25lRWxlbWVudCB9IGZyb20gJy4uL191dGlsL3JlYWN0Tm9kZSc7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCB1c2VJdGVtcyBmcm9tICcuL2hvb2tzL3VzZUl0ZW1zJztcbmltcG9ydCBNZW51Q29udGV4dCBmcm9tICcuL01lbnVDb250ZXh0JztcbmltcG9ydCBNZW51RGl2aWRlciBmcm9tICcuL01lbnVEaXZpZGVyJztcbmltcG9ydCBJdGVtIGZyb20gJy4vTWVudUl0ZW0nO1xuaW1wb3J0IE92ZXJyaWRlQ29udGV4dCBmcm9tICcuL092ZXJyaWRlQ29udGV4dCc7XG5pbXBvcnQgU3ViTWVudSBmcm9tICcuL1N1Yk1lbnUnO1xudmFyIEludGVybmFsTWVudSA9IC8qI19fUFVSRV9fKi9mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBfYTtcbiAgdmFyIG92ZXJyaWRlID0gUmVhY3QudXNlQ29udGV4dChPdmVycmlkZUNvbnRleHQpIHx8IHt9O1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICBnZXRQb3B1cENvbnRhaW5lciA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFBvcHVwQ29udGFpbmVyLFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcbiAgdmFyIHJvb3RQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoKTtcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgX3Byb3BzJHRoZW1lID0gcHJvcHMudGhlbWUsXG4gICAgdGhlbWUgPSBfcHJvcHMkdGhlbWUgPT09IHZvaWQgMCA/ICdsaWdodCcgOiBfcHJvcHMkdGhlbWUsXG4gICAgZXhwYW5kSWNvbiA9IHByb3BzLmV4cGFuZEljb24sXG4gICAgX2ludGVybmFsRGlzYWJsZU1lbnVJdGVtVGl0bGVUb29sdGlwID0gcHJvcHMuX2ludGVybmFsRGlzYWJsZU1lbnVJdGVtVGl0bGVUb29sdGlwLFxuICAgIGlubGluZUNvbGxhcHNlZCA9IHByb3BzLmlubGluZUNvbGxhcHNlZCxcbiAgICBzaWRlckNvbGxhcHNlZCA9IHByb3BzLnNpZGVyQ29sbGFwc2VkLFxuICAgIGl0ZW1zID0gcHJvcHMuaXRlbXMsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBtb2RlID0gcHJvcHMubW9kZSxcbiAgICBzZWxlY3RhYmxlID0gcHJvcHMuc2VsZWN0YWJsZSxcbiAgICBvbkNsaWNrID0gcHJvcHMub25DbGljayxcbiAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcInRoZW1lXCIsIFwiZXhwYW5kSWNvblwiLCBcIl9pbnRlcm5hbERpc2FibGVNZW51SXRlbVRpdGxlVG9vbHRpcFwiLCBcImlubGluZUNvbGxhcHNlZFwiLCBcInNpZGVyQ29sbGFwc2VkXCIsIFwiaXRlbXNcIiwgXCJjaGlsZHJlblwiLCBcIm1vZGVcIiwgXCJzZWxlY3RhYmxlXCIsIFwib25DbGlja1wiXSk7XG4gIHZhciBwYXNzZWRQcm9wcyA9IG9taXQocmVzdFByb3BzLCBbJ2NvbGxhcHNlZFdpZHRoJ10pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEl0ZW1zID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWVyZ2VkQ2hpbGRyZW4gPSB1c2VJdGVtcyhpdGVtcykgfHwgY2hpbGRyZW47XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBXYXJuaW5nID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoISgnaW5saW5lQ29sbGFwc2VkJyBpbiBwcm9wcyAmJiBtb2RlICE9PSAnaW5saW5lJyksICdNZW51JywgJ2BpbmxpbmVDb2xsYXBzZWRgIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBgbW9kZWAgaXMgaW5saW5lLicpIDogdm9pZCAwO1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCEocHJvcHMuc2lkZXJDb2xsYXBzZWQgIT09IHVuZGVmaW5lZCAmJiAnaW5saW5lQ29sbGFwc2VkJyBpbiBwcm9wcyksICdNZW51JywgJ2BpbmxpbmVDb2xsYXBzZWRgIG5vdCBjb250cm9sIE1lbnUgdW5kZXIgU2lkZXIuIFNob3VsZCBzZXQgYGNvbGxhcHNlZGAgb24gU2lkZXIgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZygnaXRlbXMnIGluIHByb3BzICYmICFjaGlsZHJlbiwgJ01lbnUnLCAnYGNoaWxkcmVuYCB3aWxsIGJlIHJlbW92ZWQgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLiBQbGVhc2UgdXNlIGBpdGVtc2AgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgKF9hID0gb3ZlcnJpZGUudmFsaWRhdG9yKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChvdmVycmlkZSwge1xuICAgIG1vZGU6IG1vZGVcbiAgfSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IENsaWNrID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRlbGwgZHJvcGRvd24gdGhhdCBpdGVtIGNsaWNrZWRcbiAgdmFyIG9uSXRlbUNsaWNrID0gdXNlRXZlbnQoZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYTtcbiAgICBvbkNsaWNrID09PSBudWxsIHx8IG9uQ2xpY2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2xpY2suYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICAgIChfYSA9IG92ZXJyaWRlID09PSBudWxsIHx8IG92ZXJyaWRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvdmVycmlkZS5vbkNsaWNrKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChvdmVycmlkZSk7XG4gIH0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBNb2RlID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWVyZ2VkTW9kZSA9IG92ZXJyaWRlLm1vZGUgfHwgbW9kZTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gU2VsZWN0YWJsZSA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG1lcmdlZFNlbGVjdGFibGUgPSBzZWxlY3RhYmxlICE9PSBudWxsICYmIHNlbGVjdGFibGUgIT09IHZvaWQgMCA/IHNlbGVjdGFibGUgOiBvdmVycmlkZS5zZWxlY3RhYmxlO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gQ29sbGFwc2VkID09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbmxpbmUgQ29sbGFwc2VkXG4gIHZhciBtZXJnZWRJbmxpbmVDb2xsYXBzZWQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc2lkZXJDb2xsYXBzZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHNpZGVyQ29sbGFwc2VkO1xuICAgIH1cbiAgICByZXR1cm4gaW5saW5lQ29sbGFwc2VkO1xuICB9LCBbaW5saW5lQ29sbGFwc2VkLCBzaWRlckNvbGxhcHNlZF0pO1xuICB2YXIgZGVmYXVsdE1vdGlvbnMgPSB7XG4gICAgaG9yaXpvbnRhbDoge1xuICAgICAgbW90aW9uTmFtZTogXCJcIi5jb25jYXQocm9vdFByZWZpeENscywgXCItc2xpZGUtdXBcIilcbiAgICB9LFxuICAgIGlubGluZTogY29sbGFwc2VNb3Rpb24sXG4gICAgb3RoZXI6IHtcbiAgICAgIG1vdGlvbk5hbWU6IFwiXCIuY29uY2F0KHJvb3RQcmVmaXhDbHMsIFwiLXpvb20tYmlnXCIpXG4gICAgfVxuICB9O1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdtZW51JywgY3VzdG9taXplUHJlZml4Q2xzIHx8IG92ZXJyaWRlLnByZWZpeENscyk7XG4gIHZhciBtZW51Q2xhc3NOYW1lID0gY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQodGhlbWUpLCBjbGFzc05hbWUpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IEV4cGFuZCBJY29uID09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWVyZ2VkRXhwYW5kSWNvbjtcbiAgaWYgKHR5cGVvZiBleHBhbmRJY29uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgbWVyZ2VkRXhwYW5kSWNvbiA9IGV4cGFuZEljb247XG4gIH0gZWxzZSB7XG4gICAgbWVyZ2VkRXhwYW5kSWNvbiA9IGNsb25lRWxlbWVudChleHBhbmRJY29uIHx8IG92ZXJyaWRlLmV4cGFuZEljb24sIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdWJtZW51LWV4cGFuZC1pY29uXCIpXG4gICAgfSk7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IENvbnRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGNvbnRleHRWYWx1ZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGlubGluZUNvbGxhcHNlZDogbWVyZ2VkSW5saW5lQ29sbGFwc2VkIHx8IGZhbHNlLFxuICAgICAgYW50ZE1lbnVUaGVtZTogdGhlbWUsXG4gICAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgIGZpcnN0TGV2ZWw6IHRydWUsXG4gICAgICBkaXNhYmxlTWVudUl0ZW1UaXRsZVRvb2x0aXA6IF9pbnRlcm5hbERpc2FibGVNZW51SXRlbVRpdGxlVG9vbHRpcFxuICAgIH07XG4gIH0sIFtwcmVmaXhDbHMsIG1lcmdlZElubGluZUNvbGxhcHNlZCwgdGhlbWUsIGRpcmVjdGlvbiwgX2ludGVybmFsRGlzYWJsZU1lbnVJdGVtVGl0bGVUb29sdGlwXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPdmVycmlkZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogbnVsbFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNZW51Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjb250ZXh0VmFsdWVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmNNZW51LCBfZXh0ZW5kcyh7XG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyLFxuICAgIG92ZXJmbG93ZWRJbmRpY2F0b3I6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsbGlwc2lzT3V0bGluZWQsIG51bGwpLFxuICAgIG92ZXJmbG93ZWRJbmRpY2F0b3JQb3B1cENsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHRoZW1lKSxcbiAgICBtb2RlOiBtZXJnZWRNb2RlLFxuICAgIHNlbGVjdGFibGU6IG1lcmdlZFNlbGVjdGFibGUsXG4gICAgb25DbGljazogb25JdGVtQ2xpY2tcbiAgfSwgcGFzc2VkUHJvcHMsIHtcbiAgICBpbmxpbmVDb2xsYXBzZWQ6IG1lcmdlZElubGluZUNvbGxhcHNlZCxcbiAgICBjbGFzc05hbWU6IG1lbnVDbGFzc05hbWUsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgZGVmYXVsdE1vdGlvbnM6IGRlZmF1bHRNb3Rpb25zLFxuICAgIGV4cGFuZEljb246IG1lcmdlZEV4cGFuZEljb24sXG4gICAgcmVmOiByZWZcbiAgfSksIG1lcmdlZENoaWxkcmVuKSkpO1xufSk7XG4vLyBXZSBzaG91bGQga2VlcCB0aGlzIGFzIHJlZi1hYmxlXG52YXIgTWVudSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoTWVudSwgX1JlYWN0JENvbXBvbmVudCk7XG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoTWVudSk7XG4gIGZ1bmN0aW9uIE1lbnUoKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNZW51KTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLmZvY3VzID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgIHZhciBfYTtcbiAgICAgIChfYSA9IF90aGlzLm1lbnUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mb2N1cyhvcHRpb25zKTtcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBfY3JlYXRlQ2xhc3MoTWVudSwgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNpZGVyQ29udGV4dC5Db25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEludGVybmFsTWVudSwgX2V4dGVuZHMoe1xuICAgICAgICAgIHJlZjogZnVuY3Rpb24gcmVmKG5vZGUpIHtcbiAgICAgICAgICAgIF90aGlzMi5tZW51ID0gbm9kZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIF90aGlzMi5wcm9wcywgY29udGV4dCkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBNZW51O1xufShSZWFjdC5Db21wb25lbnQpO1xuTWVudS5EaXZpZGVyID0gTWVudURpdmlkZXI7XG5NZW51Lkl0ZW0gPSBJdGVtO1xuTWVudS5TdWJNZW51ID0gU3ViTWVudTtcbk1lbnUuSXRlbUdyb3VwID0gSXRlbUdyb3VwO1xuZXhwb3J0IGRlZmF1bHQgTWVudTsiLCJ2YXIgYXV0b0FkanVzdE92ZXJmbG93ID0ge1xuICBhZGp1c3RYOiAxLFxuICBhZGp1c3RZOiAxXG59O1xudmFyIHRhcmdldE9mZnNldCA9IFswLCAwXTtcbnZhciBwbGFjZW1lbnRzID0ge1xuICB0b3BMZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ2JsJywgJ3RsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFswLCAtNF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgdG9wQ2VudGVyOiB7XG4gICAgcG9pbnRzOiBbJ2JjJywgJ3RjJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFswLCAtNF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgdG9wUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsnYnInLCAndHInXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIC00XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBib3R0b21MZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ3RsJywgJ2JsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFswLCA0XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBib3R0b21DZW50ZXI6IHtcbiAgICBwb2ludHM6IFsndGMnLCAnYmMnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIDRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIGJvdHRvbVJpZ2h0OiB7XG4gICAgcG9pbnRzOiBbJ3RyJywgJ2JyJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFswLCA0XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgcGxhY2VtZW50czsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgS2V5Q29kZSBmcm9tIFwicmMtdXRpbC9lcy9LZXlDb2RlXCI7XG5pbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuaW1wb3J0IHsgZ2V0Rm9jdXNOb2RlTGlzdCB9IGZyb20gXCJyYy11dGlsL2VzL0RvbS9mb2N1c1wiO1xudmFyIEVTQyA9IEtleUNvZGUuRVNDLFxuICAgIFRBQiA9IEtleUNvZGUuVEFCO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQWNjZXNzaWJpbGl0eShfcmVmKSB7XG4gIHZhciB2aXNpYmxlID0gX3JlZi52aXNpYmxlLFxuICAgICAgc2V0VHJpZ2dlclZpc2libGUgPSBfcmVmLnNldFRyaWdnZXJWaXNpYmxlLFxuICAgICAgdHJpZ2dlclJlZiA9IF9yZWYudHJpZ2dlclJlZixcbiAgICAgIG9uVmlzaWJsZUNoYW5nZSA9IF9yZWYub25WaXNpYmxlQ2hhbmdlLFxuICAgICAgYXV0b0ZvY3VzID0gX3JlZi5hdXRvRm9jdXM7XG4gIHZhciBmb2N1c01lbnVSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuXG4gIHZhciBoYW5kbGVDbG9zZU1lbnVBbmRSZXR1cm5Gb2N1cyA9IGZ1bmN0aW9uIGhhbmRsZUNsb3NlTWVudUFuZFJldHVybkZvY3VzKCkge1xuICAgIGlmICh2aXNpYmxlICYmIHRyaWdnZXJSZWYuY3VycmVudCkge1xuICAgICAgdmFyIF90cmlnZ2VyUmVmJGN1cnJlbnQsIF90cmlnZ2VyUmVmJGN1cnJlbnQkdCwgX3RyaWdnZXJSZWYkY3VycmVudCR0MiwgX3RyaWdnZXJSZWYkY3VycmVudCR0MztcblxuICAgICAgKF90cmlnZ2VyUmVmJGN1cnJlbnQgPSB0cmlnZ2VyUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF90cmlnZ2VyUmVmJGN1cnJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfdHJpZ2dlclJlZiRjdXJyZW50JHQgPSBfdHJpZ2dlclJlZiRjdXJyZW50LnRyaWdnZXJSZWYpID09PSBudWxsIHx8IF90cmlnZ2VyUmVmJGN1cnJlbnQkdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF90cmlnZ2VyUmVmJGN1cnJlbnQkdDIgPSBfdHJpZ2dlclJlZiRjdXJyZW50JHQuY3VycmVudCkgPT09IG51bGwgfHwgX3RyaWdnZXJSZWYkY3VycmVudCR0MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF90cmlnZ2VyUmVmJGN1cnJlbnQkdDMgPSBfdHJpZ2dlclJlZiRjdXJyZW50JHQyLmZvY3VzKSA9PT0gbnVsbCB8fCBfdHJpZ2dlclJlZiRjdXJyZW50JHQzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdHJpZ2dlclJlZiRjdXJyZW50JHQzLmNhbGwoX3RyaWdnZXJSZWYkY3VycmVudCR0Mik7XG4gICAgICBzZXRUcmlnZ2VyVmlzaWJsZShmYWxzZSk7XG5cbiAgICAgIGlmICh0eXBlb2Ygb25WaXNpYmxlQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9uVmlzaWJsZUNoYW5nZShmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHZhciBmb2N1c01lbnUgPSBmdW5jdGlvbiBmb2N1c01lbnUoKSB7XG4gICAgdmFyIF90cmlnZ2VyUmVmJGN1cnJlbnQyLCBfdHJpZ2dlclJlZiRjdXJyZW50MiQsIF90cmlnZ2VyUmVmJGN1cnJlbnQyJDIsIF90cmlnZ2VyUmVmJGN1cnJlbnQyJDM7XG5cbiAgICB2YXIgZWxlbWVudHMgPSBnZXRGb2N1c05vZGVMaXN0KChfdHJpZ2dlclJlZiRjdXJyZW50MiA9IHRyaWdnZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3RyaWdnZXJSZWYkY3VycmVudDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfdHJpZ2dlclJlZiRjdXJyZW50MiQgPSBfdHJpZ2dlclJlZiRjdXJyZW50Mi5wb3B1cFJlZikgPT09IG51bGwgfHwgX3RyaWdnZXJSZWYkY3VycmVudDIkID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX3RyaWdnZXJSZWYkY3VycmVudDIkMiA9IF90cmlnZ2VyUmVmJGN1cnJlbnQyJC5jdXJyZW50KSA9PT0gbnVsbCB8fCBfdHJpZ2dlclJlZiRjdXJyZW50MiQyID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX3RyaWdnZXJSZWYkY3VycmVudDIkMyA9IF90cmlnZ2VyUmVmJGN1cnJlbnQyJDIuZ2V0RWxlbWVudCkgPT09IG51bGwgfHwgX3RyaWdnZXJSZWYkY3VycmVudDIkMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RyaWdnZXJSZWYkY3VycmVudDIkMy5jYWxsKF90cmlnZ2VyUmVmJGN1cnJlbnQyJDIpKTtcbiAgICB2YXIgZmlyc3RFbGVtZW50ID0gZWxlbWVudHNbMF07XG5cbiAgICBpZiAoZmlyc3RFbGVtZW50ID09PSBudWxsIHx8IGZpcnN0RWxlbWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmlyc3RFbGVtZW50LmZvY3VzKSB7XG4gICAgICBmaXJzdEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIGZvY3VzTWVudVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICB2YXIgaGFuZGxlS2V5RG93biA9IGZ1bmN0aW9uIGhhbmRsZUtleURvd24oZXZlbnQpIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgIGNhc2UgRVNDOlxuICAgICAgICBoYW5kbGVDbG9zZU1lbnVBbmRSZXR1cm5Gb2N1cygpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUQUI6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgZm9jdXNSZXN1bHQgPSBmYWxzZTtcblxuICAgICAgICAgIGlmICghZm9jdXNNZW51UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIGZvY3VzUmVzdWx0ID0gZm9jdXNNZW51KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZvY3VzUmVzdWx0KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVDbG9zZU1lbnVBbmRSZXR1cm5Gb2N1cygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICB9O1xuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHZpc2libGUpIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlS2V5RG93bik7XG5cbiAgICAgIGlmIChhdXRvRm9jdXMpIHtcbiAgICAgICAgLy8gRklYTUU6IGhhY2sgd2l0aCByYWZcbiAgICAgICAgcmFmKGZvY3VzTWVudSwgMyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlS2V5RG93bik7XG4gICAgICAgIGZvY3VzTWVudVJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBmb2N1c01lbnVSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH07XG4gIH0sIFt2aXNpYmxlXSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG59IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiYXJyb3dcIiwgXCJwcmVmaXhDbHNcIiwgXCJ0cmFuc2l0aW9uTmFtZVwiLCBcImFuaW1hdGlvblwiLCBcImFsaWduXCIsIFwicGxhY2VtZW50XCIsIFwicGxhY2VtZW50c1wiLCBcImdldFBvcHVwQ29udGFpbmVyXCIsIFwic2hvd0FjdGlvblwiLCBcImhpZGVBY3Rpb25cIiwgXCJvdmVybGF5Q2xhc3NOYW1lXCIsIFwib3ZlcmxheVN0eWxlXCIsIFwidmlzaWJsZVwiLCBcInRyaWdnZXJcIiwgXCJhdXRvRm9jdXNcIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgVHJpZ2dlciBmcm9tICdyYy10cmlnZ2VyJztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFBsYWNlbWVudHMgZnJvbSAnLi9wbGFjZW1lbnRzJztcbmltcG9ydCB1c2VBY2Nlc3NpYmlsaXR5IGZyb20gJy4vaG9va3MvdXNlQWNjZXNzaWJpbGl0eSc7XG5cbmZ1bmN0aW9uIERyb3Bkb3duKHByb3BzLCByZWYpIHtcbiAgdmFyIF9wcm9wcyRhcnJvdyA9IHByb3BzLmFycm93LFxuICAgICAgYXJyb3cgPSBfcHJvcHMkYXJyb3cgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGFycm93LFxuICAgICAgX3Byb3BzJHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy1kcm9wZG93bicgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgICAgdHJhbnNpdGlvbk5hbWUgPSBwcm9wcy50cmFuc2l0aW9uTmFtZSxcbiAgICAgIGFuaW1hdGlvbiA9IHByb3BzLmFuaW1hdGlvbixcbiAgICAgIGFsaWduID0gcHJvcHMuYWxpZ24sXG4gICAgICBfcHJvcHMkcGxhY2VtZW50ID0gcHJvcHMucGxhY2VtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX3Byb3BzJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gJ2JvdHRvbUxlZnQnIDogX3Byb3BzJHBsYWNlbWVudCxcbiAgICAgIF9wcm9wcyRwbGFjZW1lbnRzID0gcHJvcHMucGxhY2VtZW50cyxcbiAgICAgIHBsYWNlbWVudHMgPSBfcHJvcHMkcGxhY2VtZW50cyA9PT0gdm9pZCAwID8gUGxhY2VtZW50cyA6IF9wcm9wcyRwbGFjZW1lbnRzLFxuICAgICAgZ2V0UG9wdXBDb250YWluZXIgPSBwcm9wcy5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgIHNob3dBY3Rpb24gPSBwcm9wcy5zaG93QWN0aW9uLFxuICAgICAgaGlkZUFjdGlvbiA9IHByb3BzLmhpZGVBY3Rpb24sXG4gICAgICBvdmVybGF5Q2xhc3NOYW1lID0gcHJvcHMub3ZlcmxheUNsYXNzTmFtZSxcbiAgICAgIG92ZXJsYXlTdHlsZSA9IHByb3BzLm92ZXJsYXlTdHlsZSxcbiAgICAgIHZpc2libGUgPSBwcm9wcy52aXNpYmxlLFxuICAgICAgX3Byb3BzJHRyaWdnZXIgPSBwcm9wcy50cmlnZ2VyLFxuICAgICAgdHJpZ2dlciA9IF9wcm9wcyR0cmlnZ2VyID09PSB2b2lkIDAgPyBbJ2hvdmVyJ10gOiBfcHJvcHMkdHJpZ2dlcixcbiAgICAgIGF1dG9Gb2N1cyA9IHByb3BzLmF1dG9Gb2N1cyxcbiAgICAgIG90aGVyUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKCksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIHRyaWdnZXJWaXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldFRyaWdnZXJWaXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICB2YXIgbWVyZ2VkVmlzaWJsZSA9ICd2aXNpYmxlJyBpbiBwcm9wcyA/IHZpc2libGUgOiB0cmlnZ2VyVmlzaWJsZTtcbiAgdmFyIHRyaWdnZXJSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRyaWdnZXJSZWYuY3VycmVudDtcbiAgfSk7XG4gIHVzZUFjY2Vzc2liaWxpdHkoe1xuICAgIHZpc2libGU6IG1lcmdlZFZpc2libGUsXG4gICAgc2V0VHJpZ2dlclZpc2libGU6IHNldFRyaWdnZXJWaXNpYmxlLFxuICAgIHRyaWdnZXJSZWY6IHRyaWdnZXJSZWYsXG4gICAgb25WaXNpYmxlQ2hhbmdlOiBwcm9wcy5vblZpc2libGVDaGFuZ2UsXG4gICAgYXV0b0ZvY3VzOiBhdXRvRm9jdXNcbiAgfSk7XG5cbiAgdmFyIGdldE92ZXJsYXlFbGVtZW50ID0gZnVuY3Rpb24gZ2V0T3ZlcmxheUVsZW1lbnQoKSB7XG4gICAgdmFyIG92ZXJsYXkgPSBwcm9wcy5vdmVybGF5O1xuICAgIHZhciBvdmVybGF5RWxlbWVudDtcblxuICAgIGlmICh0eXBlb2Ygb3ZlcmxheSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3ZlcmxheUVsZW1lbnQgPSBvdmVybGF5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG92ZXJsYXlFbGVtZW50ID0gb3ZlcmxheTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3ZlcmxheUVsZW1lbnQ7XG4gIH07XG5cbiAgdmFyIG9uQ2xpY2sgPSBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICB2YXIgb25PdmVybGF5Q2xpY2sgPSBwcm9wcy5vbk92ZXJsYXlDbGljaztcbiAgICBzZXRUcmlnZ2VyVmlzaWJsZShmYWxzZSk7XG5cbiAgICBpZiAob25PdmVybGF5Q2xpY2spIHtcbiAgICAgIG9uT3ZlcmxheUNsaWNrKGUpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgb25WaXNpYmxlQ2hhbmdlID0gZnVuY3Rpb24gb25WaXNpYmxlQ2hhbmdlKG5ld1Zpc2libGUpIHtcbiAgICB2YXIgb25WaXNpYmxlQ2hhbmdlUHJvcCA9IHByb3BzLm9uVmlzaWJsZUNoYW5nZTtcbiAgICBzZXRUcmlnZ2VyVmlzaWJsZShuZXdWaXNpYmxlKTtcblxuICAgIGlmICh0eXBlb2Ygb25WaXNpYmxlQ2hhbmdlUHJvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb25WaXNpYmxlQ2hhbmdlUHJvcChuZXdWaXNpYmxlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGdldE1lbnVFbGVtZW50ID0gZnVuY3Rpb24gZ2V0TWVudUVsZW1lbnQoKSB7XG4gICAgdmFyIG92ZXJsYXlFbGVtZW50ID0gZ2V0T3ZlcmxheUVsZW1lbnQoKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGFycm93ICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hcnJvd1wiKVxuICAgIH0pLCBvdmVybGF5RWxlbWVudCk7XG4gIH07XG5cbiAgdmFyIGdldE1lbnVFbGVtZW50T3JMYW1iZGEgPSBmdW5jdGlvbiBnZXRNZW51RWxlbWVudE9yTGFtYmRhKCkge1xuICAgIHZhciBvdmVybGF5ID0gcHJvcHMub3ZlcmxheTtcblxuICAgIGlmICh0eXBlb2Ygb3ZlcmxheSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGdldE1lbnVFbGVtZW50O1xuICAgIH1cblxuICAgIHJldHVybiBnZXRNZW51RWxlbWVudCgpO1xuICB9O1xuXG4gIHZhciBnZXRNaW5PdmVybGF5V2lkdGhNYXRjaFRyaWdnZXIgPSBmdW5jdGlvbiBnZXRNaW5PdmVybGF5V2lkdGhNYXRjaFRyaWdnZXIoKSB7XG4gICAgdmFyIG1pbk92ZXJsYXlXaWR0aE1hdGNoVHJpZ2dlciA9IHByb3BzLm1pbk92ZXJsYXlXaWR0aE1hdGNoVHJpZ2dlcixcbiAgICAgICAgYWxpZ25Qb2ludCA9IHByb3BzLmFsaWduUG9pbnQ7XG5cbiAgICBpZiAoJ21pbk92ZXJsYXlXaWR0aE1hdGNoVHJpZ2dlcicgaW4gcHJvcHMpIHtcbiAgICAgIHJldHVybiBtaW5PdmVybGF5V2lkdGhNYXRjaFRyaWdnZXI7XG4gICAgfVxuXG4gICAgcmV0dXJuICFhbGlnblBvaW50O1xuICB9O1xuXG4gIHZhciBnZXRPcGVuQ2xhc3NOYW1lID0gZnVuY3Rpb24gZ2V0T3BlbkNsYXNzTmFtZSgpIHtcbiAgICB2YXIgb3BlbkNsYXNzTmFtZSA9IHByb3BzLm9wZW5DbGFzc05hbWU7XG5cbiAgICBpZiAob3BlbkNsYXNzTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gb3BlbkNsYXNzTmFtZTtcbiAgICB9XG5cbiAgICByZXR1cm4gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1vcGVuXCIpO1xuICB9O1xuXG4gIHZhciByZW5kZXJDaGlsZHJlbiA9IGZ1bmN0aW9uIHJlbmRlckNoaWxkcmVuKCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICAgIHZhciBjaGlsZHJlblByb3BzID0gY2hpbGRyZW4ucHJvcHMgPyBjaGlsZHJlbi5wcm9wcyA6IHt9O1xuICAgIHZhciBjaGlsZENsYXNzTmFtZSA9IGNsYXNzTmFtZXMoY2hpbGRyZW5Qcm9wcy5jbGFzc05hbWUsIGdldE9wZW5DbGFzc05hbWUoKSk7XG4gICAgcmV0dXJuIG1lcmdlZFZpc2libGUgJiYgY2hpbGRyZW4gPyAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7XG4gICAgICBjbGFzc05hbWU6IGNoaWxkQ2xhc3NOYW1lXG4gICAgfSkgOiBjaGlsZHJlbjtcbiAgfTtcblxuICB2YXIgdHJpZ2dlckhpZGVBY3Rpb24gPSBoaWRlQWN0aW9uO1xuXG4gIGlmICghdHJpZ2dlckhpZGVBY3Rpb24gJiYgdHJpZ2dlci5pbmRleE9mKCdjb250ZXh0TWVudScpICE9PSAtMSkge1xuICAgIHRyaWdnZXJIaWRlQWN0aW9uID0gWydjbGljayddO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyaWdnZXIsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgYnVpbHRpblBsYWNlbWVudHM6IHBsYWNlbWVudHNcbiAgfSwgb3RoZXJQcm9wcyksIHt9LCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgcmVmOiB0cmlnZ2VyUmVmLFxuICAgIHBvcHVwQ2xhc3NOYW1lOiBjbGFzc05hbWVzKG92ZXJsYXlDbGFzc05hbWUsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zaG93LWFycm93XCIpLCBhcnJvdykpLFxuICAgIHBvcHVwU3R5bGU6IG92ZXJsYXlTdHlsZSxcbiAgICBhY3Rpb246IHRyaWdnZXIsXG4gICAgc2hvd0FjdGlvbjogc2hvd0FjdGlvbixcbiAgICBoaWRlQWN0aW9uOiB0cmlnZ2VySGlkZUFjdGlvbiB8fCBbXSxcbiAgICBwb3B1cFBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgIHBvcHVwQWxpZ246IGFsaWduLFxuICAgIHBvcHVwVHJhbnNpdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lLFxuICAgIHBvcHVwQW5pbWF0aW9uOiBhbmltYXRpb24sXG4gICAgcG9wdXBWaXNpYmxlOiBtZXJnZWRWaXNpYmxlLFxuICAgIHN0cmV0Y2g6IGdldE1pbk92ZXJsYXlXaWR0aE1hdGNoVHJpZ2dlcigpID8gJ21pbldpZHRoJyA6ICcnLFxuICAgIHBvcHVwOiBnZXRNZW51RWxlbWVudE9yTGFtYmRhKCksXG4gICAgb25Qb3B1cFZpc2libGVDaGFuZ2U6IG9uVmlzaWJsZUNoYW5nZSxcbiAgICBvblBvcHVwQ2xpY2s6IG9uQ2xpY2ssXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyXG4gIH0pLCByZW5kZXJDaGlsZHJlbigpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoRHJvcGRvd24pOyIsImltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG52YXIgaWQgPSAwO1xudmFyIGlkcyA9IHt9O1xuLy8gU3VwcG9ydCBjYWxsIHJhZiB3aXRoIGRlbGF5IHNwZWNpZmllZCBmcmFtZVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gd3JhcHBlclJhZihjYWxsYmFjaykge1xuICB2YXIgZGVsYXlGcmFtZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDE7XG4gIHZhciBteUlkID0gaWQrKztcbiAgdmFyIHJlc3RGcmFtZXMgPSBkZWxheUZyYW1lcztcbiAgZnVuY3Rpb24gaW50ZXJuYWxDYWxsYmFjaygpIHtcbiAgICByZXN0RnJhbWVzIC09IDE7XG4gICAgaWYgKHJlc3RGcmFtZXMgPD0gMCkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICAgIGRlbGV0ZSBpZHNbbXlJZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlkc1tteUlkXSA9IHJhZihpbnRlcm5hbENhbGxiYWNrKTtcbiAgICB9XG4gIH1cbiAgaWRzW215SWRdID0gcmFmKGludGVybmFsQ2FsbGJhY2spO1xuICByZXR1cm4gbXlJZDtcbn1cbndyYXBwZXJSYWYuY2FuY2VsID0gZnVuY3Rpb24gY2FuY2VsKHBpZCkge1xuICBpZiAocGlkID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgcmFmLmNhbmNlbChpZHNbcGlkXSk7XG4gIGRlbGV0ZSBpZHNbcGlkXTtcbn07XG53cmFwcGVyUmFmLmlkcyA9IGlkczsgLy8gZXhwb3J0IHRoaXMgZm9yIHRlc3QgdXNhZ2UiLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuaW1wb3J0IHsgdXBkYXRlQ1NTIH0gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2R5bmFtaWNDU1NcIjtcbmltcG9ydCB7IGNvbXBvc2VSZWYsIHN1cHBvcnRSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnN1bWVyLCBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCByYWYgZnJvbSAnLi9yYWYnO1xuaW1wb3J0IHsgY2xvbmVFbGVtZW50IH0gZnJvbSAnLi9yZWFjdE5vZGUnO1xudmFyIHN0eWxlRm9yUHNldWRvO1xuLy8gV2hlcmUgZWwgaXMgdGhlIERPTSBlbGVtZW50IHlvdSdkIGxpa2UgdG8gdGVzdCBmb3IgdmlzaWJpbGl0eVxuZnVuY3Rpb24gaXNIaWRkZW4oZWxlbWVudCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gIWVsZW1lbnQgfHwgZWxlbWVudC5vZmZzZXRQYXJlbnQgPT09IG51bGwgfHwgZWxlbWVudC5oaWRkZW47XG59XG5mdW5jdGlvbiBnZXRWYWxpZGF0ZUNvbnRhaW5lcihub2RlUm9vdCkge1xuICBpZiAobm9kZVJvb3QgaW5zdGFuY2VvZiBEb2N1bWVudCkge1xuICAgIHJldHVybiBub2RlUm9vdC5ib2R5O1xuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKG5vZGVSb290LmNoaWxkTm9kZXMpLmZpbmQoZnVuY3Rpb24gKGVsZSkge1xuICAgIHJldHVybiAoZWxlID09PSBudWxsIHx8IGVsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWxlLm5vZGVUeXBlKSA9PT0gTm9kZS5FTEVNRU5UX05PREU7XG4gIH0pO1xufVxuZnVuY3Rpb24gaXNOb3RHcmV5KGNvbG9yKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICB2YXIgbWF0Y2ggPSAoY29sb3IgfHwgJycpLm1hdGNoKC9yZ2JhP1xcKChcXGQqKSwgKFxcZCopLCAoXFxkKikoLCBbXFxkLl0qKT9cXCkvKTtcbiAgaWYgKG1hdGNoICYmIG1hdGNoWzFdICYmIG1hdGNoWzJdICYmIG1hdGNoWzNdKSB7XG4gICAgcmV0dXJuICEobWF0Y2hbMV0gPT09IG1hdGNoWzJdICYmIG1hdGNoWzJdID09PSBtYXRjaFszXSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG52YXIgV2F2ZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoV2F2ZSwgX1JlYWN0JENvbXBvbmVudCk7XG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoV2F2ZSk7XG4gIGZ1bmN0aW9uIFdhdmUoKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBXYXZlKTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLmNvbnRhaW5lclJlZiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVSZWYoKTtcbiAgICBfdGhpcy5hbmltYXRpb25TdGFydCA9IGZhbHNlO1xuICAgIF90aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIF90aGlzLm9uQ2xpY2sgPSBmdW5jdGlvbiAobm9kZSwgd2F2ZUNvbG9yKSB7XG4gICAgICB2YXIgX2EsIF9iO1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgIGluc2VydEV4dHJhTm9kZSA9IF90aGlzJHByb3BzLmluc2VydEV4dHJhTm9kZSxcbiAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wcy5kaXNhYmxlZDtcbiAgICAgIGlmIChkaXNhYmxlZCB8fCAhbm9kZSB8fCBpc0hpZGRlbihub2RlKSB8fCBub2RlLmNsYXNzTmFtZS5pbmNsdWRlcygnLWxlYXZlJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgX3RoaXMuZXh0cmFOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB2YXIgX2Fzc2VydFRoaXNJbml0aWFsaXplID0gX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksXG4gICAgICAgIGV4dHJhTm9kZSA9IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZS5leHRyYU5vZGU7XG4gICAgICB2YXIgZ2V0UHJlZml4Q2xzID0gX3RoaXMuY29udGV4dC5nZXRQcmVmaXhDbHM7XG4gICAgICBleHRyYU5vZGUuY2xhc3NOYW1lID0gXCJcIi5jb25jYXQoZ2V0UHJlZml4Q2xzKCcnKSwgXCItY2xpY2stYW5pbWF0aW5nLW5vZGVcIik7XG4gICAgICB2YXIgYXR0cmlidXRlTmFtZSA9IF90aGlzLmdldEF0dHJpYnV0ZU5hbWUoKTtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsICd0cnVlJyk7XG4gICAgICAvLyBOb3Qgd2hpdGUgb3IgdHJhbnNwYXJlbnQgb3IgZ3JleVxuICAgICAgaWYgKHdhdmVDb2xvciAmJiB3YXZlQ29sb3IgIT09ICcjZmZmJyAmJiB3YXZlQ29sb3IgIT09ICcjZmZmZmZmJyAmJiB3YXZlQ29sb3IgIT09ICdyZ2IoMjU1LCAyNTUsIDI1NSknICYmIHdhdmVDb2xvciAhPT0gJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMSknICYmIGlzTm90R3JleSh3YXZlQ29sb3IpICYmICEvcmdiYVxcKCg/OlxcZCosICl7M30wXFwpLy50ZXN0KHdhdmVDb2xvcikgJiZcbiAgICAgIC8vIGFueSB0cmFuc3BhcmVudCByZ2JhIGNvbG9yXG4gICAgICB3YXZlQ29sb3IgIT09ICd0cmFuc3BhcmVudCcpIHtcbiAgICAgICAgZXh0cmFOb2RlLnN0eWxlLmJvcmRlckNvbG9yID0gd2F2ZUNvbG9yO1xuICAgICAgICB2YXIgbm9kZVJvb3QgPSAoKF9hID0gbm9kZS5nZXRSb290Tm9kZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwobm9kZSkpIHx8IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICAgICAgdmFyIG5vZGVCb2R5ID0gKF9iID0gZ2V0VmFsaWRhdGVDb250YWluZXIobm9kZVJvb3QpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBub2RlUm9vdDtcbiAgICAgICAgc3R5bGVGb3JQc2V1ZG8gPSB1cGRhdGVDU1MoXCJcXG4gICAgICBbXCIuY29uY2F0KGdldFByZWZpeENscygnJyksIFwiLWNsaWNrLWFuaW1hdGluZy13aXRob3V0LWV4dHJhLW5vZGU9J3RydWUnXTo6YWZ0ZXIsIC5cIikuY29uY2F0KGdldFByZWZpeENscygnJyksIFwiLWNsaWNrLWFuaW1hdGluZy1ub2RlIHtcXG4gICAgICAgIC0tYW50ZC13YXZlLXNoYWRvdy1jb2xvcjogXCIpLmNvbmNhdCh3YXZlQ29sb3IsIFwiO1xcbiAgICAgIH1cIiksICdhbnRkLXdhdmUnLCB7XG4gICAgICAgICAgY3NwOiBfdGhpcy5jc3AsXG4gICAgICAgICAgYXR0YWNoVG86IG5vZGVCb2R5XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGluc2VydEV4dHJhTm9kZSkge1xuICAgICAgICBub2RlLmFwcGVuZENoaWxkKGV4dHJhTm9kZSk7XG4gICAgICB9XG4gICAgICBbJ3RyYW5zaXRpb24nLCAnYW5pbWF0aW9uJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJcIi5jb25jYXQobmFtZSwgXCJzdGFydFwiKSwgX3RoaXMub25UcmFuc2l0aW9uU3RhcnQpO1xuICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJcIi5jb25jYXQobmFtZSwgXCJlbmRcIiksIF90aGlzLm9uVHJhbnNpdGlvbkVuZCk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIF90aGlzLm9uVHJhbnNpdGlvblN0YXJ0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChfdGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIG5vZGUgPSBfdGhpcy5jb250YWluZXJSZWYuY3VycmVudDtcbiAgICAgIGlmICghZSB8fCBlLnRhcmdldCAhPT0gbm9kZSB8fCBfdGhpcy5hbmltYXRpb25TdGFydCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBfdGhpcy5yZXNldEVmZmVjdChub2RlKTtcbiAgICB9O1xuICAgIF90aGlzLm9uVHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoIWUgfHwgZS5hbmltYXRpb25OYW1lICE9PSAnZmFkZUVmZmVjdCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgX3RoaXMucmVzZXRFZmZlY3QoZS50YXJnZXQpO1xuICAgIH07XG4gICAgX3RoaXMuYmluZEFuaW1hdGlvbkV2ZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIGlmICghbm9kZSB8fCAhbm9kZS5nZXRBdHRyaWJ1dGUgfHwgbm9kZS5nZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgfHwgbm9kZS5jbGFzc05hbWUuaW5jbHVkZXMoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIG9uQ2xpY2sgPSBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgICAgLy8gRml4IHJhZGlvIGJ1dHRvbiBjbGljayB0d2ljZVxuICAgICAgICBpZiAoZS50YXJnZXQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCBpc0hpZGRlbihlLnRhcmdldCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgX3RoaXMucmVzZXRFZmZlY3Qobm9kZSk7XG4gICAgICAgIC8vIEdldCB3YXZlIGNvbG9yIGZyb20gdGFyZ2V0XG4gICAgICAgIHZhciB3YXZlQ29sb3IgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUpLmdldFByb3BlcnR5VmFsdWUoJ2JvcmRlci10b3AtY29sb3InKSB8fFxuICAgICAgICAvLyBGaXJlZm94IENvbXBhdGlibGVcbiAgICAgICAgZ2V0Q29tcHV0ZWRTdHlsZShub2RlKS5nZXRQcm9wZXJ0eVZhbHVlKCdib3JkZXItY29sb3InKSB8fCBnZXRDb21wdXRlZFN0eWxlKG5vZGUpLmdldFByb3BlcnR5VmFsdWUoJ2JhY2tncm91bmQtY29sb3InKTtcbiAgICAgICAgX3RoaXMuY2xpY2tXYXZlVGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5vbkNsaWNrKG5vZGUsIHdhdmVDb2xvcik7XG4gICAgICAgIH0sIDApO1xuICAgICAgICByYWYuY2FuY2VsKF90aGlzLmFuaW1hdGlvblN0YXJ0SWQpO1xuICAgICAgICBfdGhpcy5hbmltYXRpb25TdGFydCA9IHRydWU7XG4gICAgICAgIC8vIFJlbmRlciB0byB0cmlnZ2VyIHRyYW5zaXRpb24gZXZlbnQgY29zdCAzIGZyYW1lcy4gTGV0J3MgZGVsYXkgMTAgZnJhbWVzIHRvIHJlc2V0IHRoaXMuXG4gICAgICAgIF90aGlzLmFuaW1hdGlvblN0YXJ0SWQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzLmFuaW1hdGlvblN0YXJ0ID0gZmFsc2U7XG4gICAgICAgIH0sIDEwKTtcbiAgICAgIH07XG4gICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGljaywgdHJ1ZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGljaywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgICBfdGhpcy5yZW5kZXJXYXZlID0gZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciBjc3AgPSBfcmVmLmNzcDtcbiAgICAgIHZhciBjaGlsZHJlbiA9IF90aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgICAgX3RoaXMuY3NwID0gY3NwO1xuICAgICAgaWYgKCEgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkgcmV0dXJuIGNoaWxkcmVuO1xuICAgICAgdmFyIHJlZiA9IF90aGlzLmNvbnRhaW5lclJlZjtcbiAgICAgIGlmIChzdXBwb3J0UmVmKGNoaWxkcmVuKSkge1xuICAgICAgICByZWYgPSBjb21wb3NlUmVmKGNoaWxkcmVuLnJlZiwgX3RoaXMuY29udGFpbmVyUmVmKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbG9uZUVsZW1lbnQoY2hpbGRyZW4sIHtcbiAgICAgICAgcmVmOiByZWZcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhXYXZlLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgICB2YXIgbm9kZSA9IHRoaXMuY29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoIW5vZGUgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmluc3RhbmNlID0gdGhpcy5iaW5kQW5pbWF0aW9uRXZlbnQobm9kZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5jYW5jZWwoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNsaWNrV2F2ZVRpbWVvdXRJZCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5jbGlja1dhdmVUaW1lb3V0SWQpO1xuICAgICAgfVxuICAgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRBdHRyaWJ1dGVOYW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEF0dHJpYnV0ZU5hbWUoKSB7XG4gICAgICB2YXIgZ2V0UHJlZml4Q2xzID0gdGhpcy5jb250ZXh0LmdldFByZWZpeENscztcbiAgICAgIHZhciBpbnNlcnRFeHRyYU5vZGUgPSB0aGlzLnByb3BzLmluc2VydEV4dHJhTm9kZTtcbiAgICAgIHJldHVybiBpbnNlcnRFeHRyYU5vZGUgPyBcIlwiLmNvbmNhdChnZXRQcmVmaXhDbHMoJycpLCBcIi1jbGljay1hbmltYXRpbmdcIikgOiBcIlwiLmNvbmNhdChnZXRQcmVmaXhDbHMoJycpLCBcIi1jbGljay1hbmltYXRpbmctd2l0aG91dC1leHRyYS1ub2RlXCIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXNldEVmZmVjdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldEVmZmVjdChub2RlKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgIGlmICghbm9kZSB8fCBub2RlID09PSB0aGlzLmV4dHJhTm9kZSB8fCAhKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgaW5zZXJ0RXh0cmFOb2RlID0gdGhpcy5wcm9wcy5pbnNlcnRFeHRyYU5vZGU7XG4gICAgICB2YXIgYXR0cmlidXRlTmFtZSA9IHRoaXMuZ2V0QXR0cmlidXRlTmFtZSgpO1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgJ2ZhbHNlJyk7IC8vIGVkZ2UgaGFzIGJ1ZyBvbiBgcmVtb3ZlQXR0cmlidXRlYCAjMTQ0NjZcbiAgICAgIGlmIChzdHlsZUZvclBzZXVkbykge1xuICAgICAgICBzdHlsZUZvclBzZXVkby5pbm5lckhUTUwgPSAnJztcbiAgICAgIH1cbiAgICAgIGlmIChpbnNlcnRFeHRyYU5vZGUgJiYgdGhpcy5leHRyYU5vZGUgJiYgbm9kZS5jb250YWlucyh0aGlzLmV4dHJhTm9kZSkpIHtcbiAgICAgICAgbm9kZS5yZW1vdmVDaGlsZCh0aGlzLmV4dHJhTm9kZSk7XG4gICAgICB9XG4gICAgICBbJ3RyYW5zaXRpb24nLCAnYW5pbWF0aW9uJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJcIi5jb25jYXQobmFtZSwgXCJzdGFydFwiKSwgX3RoaXMyLm9uVHJhbnNpdGlvblN0YXJ0KTtcbiAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiXCIuY29uY2F0KG5hbWUsIFwiZW5kXCIpLCBfdGhpczIub25UcmFuc2l0aW9uRW5kKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbmZpZ0NvbnN1bWVyLCBudWxsLCB0aGlzLnJlbmRlcldhdmUpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gV2F2ZTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcbldhdmUuY29udGV4dFR5cGUgPSBDb25maWdDb250ZXh0O1xuZXhwb3J0IGRlZmF1bHQgV2F2ZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuZXhwb3J0IHZhciBHcm91cFNpemVDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcbnZhciBCdXR0b25Hcm91cCA9IGZ1bmN0aW9uIEJ1dHRvbkdyb3VwKHByb3BzKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHNpemUgPSBwcm9wcy5zaXplLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBvdGhlcnMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcInNpemVcIiwgXCJjbGFzc05hbWVcIl0pO1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdidG4tZ3JvdXAnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAvLyBsYXJnZSA9PiBsZ1xuICAvLyBzbWFsbCA9PiBzbVxuICB2YXIgc2l6ZUNscyA9ICcnO1xuICBzd2l0Y2ggKHNpemUpIHtcbiAgICBjYXNlICdsYXJnZSc6XG4gICAgICBzaXplQ2xzID0gJ2xnJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NtYWxsJzpcbiAgICAgIHNpemVDbHMgPSAnc20nO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbWlkZGxlJzpcbiAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCFzaXplLCAnQnV0dG9uLkdyb3VwJywgJ0ludmFsaWQgcHJvcCBgc2l6ZWAuJykgOiB2b2lkIDA7XG4gIH1cbiAgdmFyIGNsYXNzZXMgPSBjbGFzc05hbWVzKHByZWZpeENscywgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHNpemVDbHMpLCBzaXplQ2xzKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEdyb3VwU2l6ZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogc2l6ZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7fSwgb3RoZXJzLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgQnV0dG9uR3JvdXA7IiwiaW1wb3J0IExvYWRpbmdPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvTG9hZGluZ091dGxpbmVkXCI7XG5pbXBvcnQgQ1NTTW90aW9uIGZyb20gJ3JjLW1vdGlvbic7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIGdldENvbGxhcHNlZFdpZHRoID0gZnVuY3Rpb24gZ2V0Q29sbGFwc2VkV2lkdGgoKSB7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IDAsXG4gICAgb3BhY2l0eTogMCxcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgwKSdcbiAgfTtcbn07XG52YXIgZ2V0UmVhbFdpZHRoID0gZnVuY3Rpb24gZ2V0UmVhbFdpZHRoKG5vZGUpIHtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogbm9kZS5zY3JvbGxXaWR0aCxcbiAgICBvcGFjaXR5OiAxLFxuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpJ1xuICB9O1xufTtcbnZhciBMb2FkaW5nSWNvbiA9IGZ1bmN0aW9uIExvYWRpbmdJY29uKF9yZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIGxvYWRpbmcgPSBfcmVmLmxvYWRpbmcsXG4gICAgZXhpc3RJY29uID0gX3JlZi5leGlzdEljb247XG4gIHZhciB2aXNpYmxlID0gISFsb2FkaW5nO1xuICBpZiAoZXhpc3RJY29uKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbG9hZGluZy1pY29uXCIpXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTG9hZGluZ091dGxpbmVkLCBudWxsKSk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbiwge1xuICAgIHZpc2libGU6IHZpc2libGUsXG4gICAgLy8gV2UgZG8gbm90IHJlYWxseSB1c2UgdGhpcyBtb3Rpb25OYW1lXG4gICAgbW90aW9uTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1sb2FkaW5nLWljb24tbW90aW9uXCIpLFxuICAgIHJlbW92ZU9uTGVhdmU6IHRydWUsXG4gICAgb25BcHBlYXJTdGFydDogZ2V0Q29sbGFwc2VkV2lkdGgsXG4gICAgb25BcHBlYXJBY3RpdmU6IGdldFJlYWxXaWR0aCxcbiAgICBvbkVudGVyU3RhcnQ6IGdldENvbGxhcHNlZFdpZHRoLFxuICAgIG9uRW50ZXJBY3RpdmU6IGdldFJlYWxXaWR0aCxcbiAgICBvbkxlYXZlU3RhcnQ6IGdldFJlYWxXaWR0aCxcbiAgICBvbkxlYXZlQWN0aXZlOiBnZXRDb2xsYXBzZWRXaWR0aFxuICB9LCBmdW5jdGlvbiAoX3JlZjIsIHJlZikge1xuICAgIHZhciBjbGFzc05hbWUgPSBfcmVmMi5jbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWYyLnN0eWxlO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxvYWRpbmctaWNvblwiKSxcbiAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgIHJlZjogcmVmXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTG9hZGluZ091dGxpbmVkLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICAgIH0pKTtcbiAgfSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgTG9hZGluZ0ljb247IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3QvYnV0dG9uLWhhcy10eXBlICovXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBvbWl0IGZyb20gXCJyYy11dGlsL2VzL29taXRcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IERpc2FibGVkQ29udGV4dCBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvRGlzYWJsZWRDb250ZXh0JztcbmltcG9ydCBTaXplQ29udGV4dCBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvU2l6ZUNvbnRleHQnO1xuaW1wb3J0IHsgdXNlQ29tcGFjdEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vc3BhY2UvQ29tcGFjdCc7XG5pbXBvcnQgeyBjbG9uZUVsZW1lbnQsIGlzRnJhZ21lbnQgfSBmcm9tICcuLi9fdXRpbC9yZWFjdE5vZGUnO1xuaW1wb3J0IHsgdHVwbGUgfSBmcm9tICcuLi9fdXRpbC90eXBlJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IFdhdmUgZnJvbSAnLi4vX3V0aWwvd2F2ZSc7XG5pbXBvcnQgR3JvdXAsIHsgR3JvdXBTaXplQ29udGV4dCB9IGZyb20gJy4vYnV0dG9uLWdyb3VwJztcbmltcG9ydCBMb2FkaW5nSWNvbiBmcm9tICcuL0xvYWRpbmdJY29uJztcbnZhciByeFR3b0NOQ2hhciA9IC9eW1xcdTRlMDAtXFx1OWZhNV17Mn0kLztcbnZhciBpc1R3b0NOQ2hhciA9IHJ4VHdvQ05DaGFyLnRlc3QuYmluZChyeFR3b0NOQ2hhcik7XG5mdW5jdGlvbiBpc1N0cmluZyhzdHIpIHtcbiAgcmV0dXJuIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnO1xufVxuZnVuY3Rpb24gaXNVbkJvcmRlcmVkQnV0dG9uVHlwZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlID09PSAndGV4dCcgfHwgdHlwZSA9PT0gJ2xpbmsnO1xufVxuLy8gSW5zZXJ0IG9uZSBzcGFjZSBiZXR3ZWVuIHR3byBjaGluZXNlIGNoYXJhY3RlcnMgYXV0b21hdGljYWxseS5cbmZ1bmN0aW9uIGluc2VydFNwYWNlKGNoaWxkLCBuZWVkSW5zZXJ0ZWQpIHtcbiAgLy8gQ2hlY2sgdGhlIGNoaWxkIGlmIGlzIHVuZGVmaW5lZCBvciBudWxsLlxuICBpZiAoY2hpbGQgPT09IG51bGwgfHwgY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgU1BBQ0UgPSBuZWVkSW5zZXJ0ZWQgPyAnICcgOiAnJztcbiAgLy8gc3RyaWN0TnVsbENoZWNrcyBvb3BzLlxuICBpZiAodHlwZW9mIGNoaWxkICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgY2hpbGQgIT09ICdudW1iZXInICYmIGlzU3RyaW5nKGNoaWxkLnR5cGUpICYmIGlzVHdvQ05DaGFyKGNoaWxkLnByb3BzLmNoaWxkcmVuKSkge1xuICAgIHJldHVybiBjbG9uZUVsZW1lbnQoY2hpbGQsIHtcbiAgICAgIGNoaWxkcmVuOiBjaGlsZC5wcm9wcy5jaGlsZHJlbi5zcGxpdCgnJykuam9pbihTUEFDRSlcbiAgICB9KTtcbiAgfVxuICBpZiAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBpc1R3b0NOQ2hhcihjaGlsZCkgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgY2hpbGQuc3BsaXQoJycpLmpvaW4oU1BBQ0UpKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBjaGlsZCk7XG4gIH1cbiAgaWYgKGlzRnJhZ21lbnQoY2hpbGQpKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBjaGlsZCk7XG4gIH1cbiAgcmV0dXJuIGNoaWxkO1xufVxuZnVuY3Rpb24gc3BhY2VDaGlsZHJlbihjaGlsZHJlbiwgbmVlZEluc2VydGVkKSB7XG4gIHZhciBpc1ByZXZDaGlsZFB1cmUgPSBmYWxzZTtcbiAgdmFyIGNoaWxkTGlzdCA9IFtdO1xuICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICB2YXIgdHlwZSA9IF90eXBlb2YoY2hpbGQpO1xuICAgIHZhciBpc0N1cnJlbnRDaGlsZFB1cmUgPSB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnbnVtYmVyJztcbiAgICBpZiAoaXNQcmV2Q2hpbGRQdXJlICYmIGlzQ3VycmVudENoaWxkUHVyZSkge1xuICAgICAgdmFyIGxhc3RJbmRleCA9IGNoaWxkTGlzdC5sZW5ndGggLSAxO1xuICAgICAgdmFyIGxhc3RDaGlsZCA9IGNoaWxkTGlzdFtsYXN0SW5kZXhdO1xuICAgICAgY2hpbGRMaXN0W2xhc3RJbmRleF0gPSBcIlwiLmNvbmNhdChsYXN0Q2hpbGQpLmNvbmNhdChjaGlsZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoaWxkTGlzdC5wdXNoKGNoaWxkKTtcbiAgICB9XG4gICAgaXNQcmV2Q2hpbGRQdXJlID0gaXNDdXJyZW50Q2hpbGRQdXJlO1xuICB9KTtcbiAgLy8gUGFzcyB0byBSZWFjdC5DaGlsZHJlbi5tYXAgdG8gYXV0byBmaWxsIGtleVxuICByZXR1cm4gUmVhY3QuQ2hpbGRyZW4ubWFwKGNoaWxkTGlzdCwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0dXJuIGluc2VydFNwYWNlKGNoaWxkLCBuZWVkSW5zZXJ0ZWQpO1xuICB9KTtcbn1cbnZhciBCdXR0b25UeXBlcyA9IHR1cGxlKCdkZWZhdWx0JywgJ3ByaW1hcnknLCAnZ2hvc3QnLCAnZGFzaGVkJywgJ2xpbmsnLCAndGV4dCcpO1xudmFyIEJ1dHRvblNoYXBlcyA9IHR1cGxlKCdkZWZhdWx0JywgJ2NpcmNsZScsICdyb3VuZCcpO1xudmFyIEJ1dHRvbkhUTUxUeXBlcyA9IHR1cGxlKCdzdWJtaXQnLCAnYnV0dG9uJywgJ3Jlc2V0Jyk7XG5leHBvcnQgZnVuY3Rpb24gY29udmVydExlZ2FjeVByb3BzKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT09ICdkYW5nZXInKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhbmdlcjogdHJ1ZVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiB0eXBlXG4gIH07XG59XG52YXIgSW50ZXJuYWxCdXR0b24gPSBmdW5jdGlvbiBJbnRlcm5hbEJ1dHRvbihwcm9wcywgcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcbiAgdmFyIF9wcm9wcyRsb2FkaW5nID0gcHJvcHMubG9hZGluZyxcbiAgICBsb2FkaW5nID0gX3Byb3BzJGxvYWRpbmcgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGxvYWRpbmcsXG4gICAgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIF9wcm9wcyR0eXBlID0gcHJvcHMudHlwZSxcbiAgICB0eXBlID0gX3Byb3BzJHR5cGUgPT09IHZvaWQgMCA/ICdkZWZhdWx0JyA6IF9wcm9wcyR0eXBlLFxuICAgIGRhbmdlciA9IHByb3BzLmRhbmdlcixcbiAgICBfcHJvcHMkc2hhcGUgPSBwcm9wcy5zaGFwZSxcbiAgICBzaGFwZSA9IF9wcm9wcyRzaGFwZSA9PT0gdm9pZCAwID8gJ2RlZmF1bHQnIDogX3Byb3BzJHNoYXBlLFxuICAgIGN1c3RvbWl6ZVNpemUgPSBwcm9wcy5zaXplLFxuICAgIGN1c3RvbURpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgaWNvbiA9IHByb3BzLmljb24sXG4gICAgX3Byb3BzJGdob3N0ID0gcHJvcHMuZ2hvc3QsXG4gICAgZ2hvc3QgPSBfcHJvcHMkZ2hvc3QgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGdob3N0LFxuICAgIF9wcm9wcyRibG9jayA9IHByb3BzLmJsb2NrLFxuICAgIGJsb2NrID0gX3Byb3BzJGJsb2NrID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRibG9jayxcbiAgICBfcHJvcHMkaHRtbFR5cGUgPSBwcm9wcy5odG1sVHlwZSxcbiAgICBodG1sVHlwZSA9IF9wcm9wcyRodG1sVHlwZSA9PT0gdm9pZCAwID8gJ2J1dHRvbicgOiBfcHJvcHMkaHRtbFR5cGUsXG4gICAgcmVzdCA9IF9fcmVzdChwcm9wcywgW1wibG9hZGluZ1wiLCBcInByZWZpeENsc1wiLCBcInR5cGVcIiwgXCJkYW5nZXJcIiwgXCJzaGFwZVwiLCBcInNpemVcIiwgXCJkaXNhYmxlZFwiLCBcImNsYXNzTmFtZVwiLCBcImNoaWxkcmVuXCIsIFwiaWNvblwiLCBcImdob3N0XCIsIFwiYmxvY2tcIiwgXCJodG1sVHlwZVwiXSk7XG4gIHZhciBzaXplID0gUmVhY3QudXNlQ29udGV4dChTaXplQ29udGV4dCk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBEaXNhYmxlZCA9PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGRpc2FibGVkID0gUmVhY3QudXNlQ29udGV4dChEaXNhYmxlZENvbnRleHQpO1xuICB2YXIgbWVyZ2VkRGlzYWJsZWQgPSBjdXN0b21EaXNhYmxlZCAhPT0gbnVsbCAmJiBjdXN0b21EaXNhYmxlZCAhPT0gdm9pZCAwID8gY3VzdG9tRGlzYWJsZWQgOiBkaXNhYmxlZDtcbiAgdmFyIGdyb3VwU2l6ZSA9IFJlYWN0LnVzZUNvbnRleHQoR3JvdXBTaXplQ29udGV4dCk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSghIWxvYWRpbmcpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIGlubmVyTG9hZGluZyA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0TG9hZGluZyA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICBoYXNUd29DTkNoYXIgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldEhhc1R3b0NOQ2hhciA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCksXG4gICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgIGF1dG9JbnNlcnRTcGFjZUluQnV0dG9uID0gX1JlYWN0JHVzZUNvbnRleHQuYXV0b0luc2VydFNwYWNlSW5CdXR0b24sXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICB2YXIgYnV0dG9uUmVmID0gcmVmIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVSZWYoKTtcbiAgdmFyIGlzTmVlZEluc2VydGVkID0gZnVuY3Rpb24gaXNOZWVkSW5zZXJ0ZWQoKSB7XG4gICAgcmV0dXJuIFJlYWN0LkNoaWxkcmVuLmNvdW50KGNoaWxkcmVuKSA9PT0gMSAmJiAhaWNvbiAmJiAhaXNVbkJvcmRlcmVkQnV0dG9uVHlwZSh0eXBlKTtcbiAgfTtcbiAgdmFyIGZpeFR3b0NOQ2hhciA9IGZ1bmN0aW9uIGZpeFR3b0NOQ2hhcigpIHtcbiAgICAvLyBGaXggZm9yIEhPQyB1c2FnZSBsaWtlIDxGb3JtYXRNZXNzYWdlIC8+XG4gICAgaWYgKCFidXR0b25SZWYgfHwgIWJ1dHRvblJlZi5jdXJyZW50IHx8IGF1dG9JbnNlcnRTcGFjZUluQnV0dG9uID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgYnV0dG9uVGV4dCA9IGJ1dHRvblJlZi5jdXJyZW50LnRleHRDb250ZW50O1xuICAgIGlmIChpc05lZWRJbnNlcnRlZCgpICYmIGlzVHdvQ05DaGFyKGJ1dHRvblRleHQpKSB7XG4gICAgICBpZiAoIWhhc1R3b0NOQ2hhcikge1xuICAgICAgICBzZXRIYXNUd29DTkNoYXIodHJ1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChoYXNUd29DTkNoYXIpIHtcbiAgICAgIHNldEhhc1R3b0NOQ2hhcihmYWxzZSk7XG4gICAgfVxuICB9O1xuICAvLyA9PT09PT09PT09PT09PT0gVXBkYXRlIExvYWRpbmcgPT09PT09PT09PT09PT09XG4gIHZhciBsb2FkaW5nT3JEZWxheSA9IHR5cGVvZiBsb2FkaW5nID09PSAnYm9vbGVhbicgPyBsb2FkaW5nIDogKGxvYWRpbmcgPT09IG51bGwgfHwgbG9hZGluZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogbG9hZGluZy5kZWxheSkgfHwgdHJ1ZTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGVsYXlUaW1lciA9IG51bGw7XG4gICAgaWYgKHR5cGVvZiBsb2FkaW5nT3JEZWxheSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGRlbGF5VGltZXIgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlbGF5VGltZXIgPSBudWxsO1xuICAgICAgICBzZXRMb2FkaW5nKGxvYWRpbmdPckRlbGF5KTtcbiAgICAgIH0sIGxvYWRpbmdPckRlbGF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0TG9hZGluZyhsb2FkaW5nT3JEZWxheSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZGVsYXlUaW1lcikge1xuICAgICAgICAvLyBpbiBvcmRlciB0byBub3QgcGVyZm9ybSBhIFJlYWN0IHN0YXRlIHVwZGF0ZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50XG4gICAgICAgIC8vIGFuZCBjbGVhciB0aW1lciBhZnRlciAnbG9hZGluZ09yRGVsYXknIHVwZGF0ZWQuXG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoZGVsYXlUaW1lcik7XG4gICAgICAgIGRlbGF5VGltZXIgPSBudWxsO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtsb2FkaW5nT3JEZWxheV0pO1xuICBSZWFjdC51c2VFZmZlY3QoZml4VHdvQ05DaGFyLCBbYnV0dG9uUmVmXSk7XG4gIHZhciBoYW5kbGVDbGljayA9IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGUpIHtcbiAgICB2YXIgb25DbGljayA9IHByb3BzLm9uQ2xpY2s7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMzAyMDdcbiAgICBpZiAoaW5uZXJMb2FkaW5nIHx8IG1lcmdlZERpc2FibGVkKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG9uQ2xpY2sgPT09IG51bGwgfHwgb25DbGljayA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DbGljayhlKTtcbiAgfTtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKHR5cGVvZiBpY29uID09PSAnc3RyaW5nJyAmJiBpY29uLmxlbmd0aCA+IDIpLCAnQnV0dG9uJywgXCJgaWNvbmAgaXMgdXNpbmcgUmVhY3ROb2RlIGluc3RlYWQgb2Ygc3RyaW5nIG5hbWluZyBpbiB2NC4gUGxlYXNlIGNoZWNrIGBcIi5jb25jYXQoaWNvbiwgXCJgIGF0IGh0dHBzOi8vYW50LmRlc2lnbi9jb21wb25lbnRzL2ljb25cIikpIDogdm9pZCAwO1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCEoZ2hvc3QgJiYgaXNVbkJvcmRlcmVkQnV0dG9uVHlwZSh0eXBlKSksICdCdXR0b24nLCBcImBsaW5rYCBvciBgdGV4dGAgYnV0dG9uIGNhbid0IGJlIGEgYGdob3N0YCBidXR0b24uXCIpIDogdm9pZCAwO1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdidG4nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgYXV0b0luc2VydFNwYWNlID0gYXV0b0luc2VydFNwYWNlSW5CdXR0b24gIT09IGZhbHNlO1xuICB2YXIgX3VzZUNvbXBhY3RJdGVtQ29udGV4ID0gdXNlQ29tcGFjdEl0ZW1Db250ZXh0KHByZWZpeENscywgZGlyZWN0aW9uKSxcbiAgICBjb21wYWN0U2l6ZSA9IF91c2VDb21wYWN0SXRlbUNvbnRleC5jb21wYWN0U2l6ZSxcbiAgICBjb21wYWN0SXRlbUNsYXNzbmFtZXMgPSBfdXNlQ29tcGFjdEl0ZW1Db250ZXguY29tcGFjdEl0ZW1DbGFzc25hbWVzO1xuICB2YXIgc2l6ZUNsYXNzTmFtZU1hcCA9IHtcbiAgICBsYXJnZTogJ2xnJyxcbiAgICBzbWFsbDogJ3NtJyxcbiAgICBtaWRkbGU6IHVuZGVmaW5lZFxuICB9O1xuICB2YXIgc2l6ZUZ1bGxuYW1lID0gY29tcGFjdFNpemUgfHwgZ3JvdXBTaXplIHx8IGN1c3RvbWl6ZVNpemUgfHwgc2l6ZTtcbiAgdmFyIHNpemVDbHMgPSBzaXplRnVsbG5hbWUgPyBzaXplQ2xhc3NOYW1lTWFwW3NpemVGdWxsbmFtZV0gfHwgJycgOiAnJztcbiAgdmFyIGljb25UeXBlID0gaW5uZXJMb2FkaW5nID8gJ2xvYWRpbmcnIDogaWNvbjtcbiAgdmFyIGxpbmtCdXR0b25SZXN0UHJvcHMgPSBvbWl0KHJlc3QsIFsnbmF2aWdhdGUnXSk7XG4gIHZhciBjbGFzc2VzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChzaGFwZSksIHNoYXBlICE9PSAnZGVmYXVsdCcgJiYgc2hhcGUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdCh0eXBlKSwgdHlwZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHNpemVDbHMpLCBzaXplQ2xzKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWljb24tb25seVwiKSwgIWNoaWxkcmVuICYmIGNoaWxkcmVuICE9PSAwICYmICEhaWNvblR5cGUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYmFja2dyb3VuZC1naG9zdFwiKSwgZ2hvc3QgJiYgIWlzVW5Cb3JkZXJlZEJ1dHRvblR5cGUodHlwZSkpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbG9hZGluZ1wiKSwgaW5uZXJMb2FkaW5nKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXR3by1jaGluZXNlLWNoYXJzXCIpLCBoYXNUd29DTkNoYXIgJiYgYXV0b0luc2VydFNwYWNlICYmICFpbm5lckxvYWRpbmcpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYmxvY2tcIiksIGJsb2NrKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRhbmdlcm91c1wiKSwgISFkYW5nZXIpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBsaW5rQnV0dG9uUmVzdFByb3BzLmhyZWYgIT09IHVuZGVmaW5lZCAmJiBtZXJnZWREaXNhYmxlZCksIF9jbGFzc05hbWVzKSwgY29tcGFjdEl0ZW1DbGFzc25hbWVzLCBjbGFzc05hbWUpO1xuICB2YXIgaWNvbk5vZGUgPSBpY29uICYmICFpbm5lckxvYWRpbmcgPyBpY29uIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTG9hZGluZ0ljb24sIHtcbiAgICBleGlzdEljb246ICEhaWNvbixcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBsb2FkaW5nOiAhIWlubmVyTG9hZGluZ1xuICB9KTtcbiAgdmFyIGtpZHMgPSBjaGlsZHJlbiB8fCBjaGlsZHJlbiA9PT0gMCA/IHNwYWNlQ2hpbGRyZW4oY2hpbGRyZW4sIGlzTmVlZEluc2VydGVkKCkgJiYgYXV0b0luc2VydFNwYWNlKSA6IG51bGw7XG4gIGlmIChsaW5rQnV0dG9uUmVzdFByb3BzLmhyZWYgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwgX2V4dGVuZHMoe30sIGxpbmtCdXR0b25SZXN0UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICAgIG9uQ2xpY2s6IGhhbmRsZUNsaWNrLFxuICAgICAgcmVmOiBidXR0b25SZWZcbiAgICB9KSwgaWNvbk5vZGUsIGtpZHMpO1xuICB9XG4gIHZhciBidXR0b25Ob2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICB0eXBlOiBodG1sVHlwZSxcbiAgICBjbGFzc05hbWU6IGNsYXNzZXMsXG4gICAgb25DbGljazogaGFuZGxlQ2xpY2ssXG4gICAgZGlzYWJsZWQ6IG1lcmdlZERpc2FibGVkLFxuICAgIHJlZjogYnV0dG9uUmVmXG4gIH0pLCBpY29uTm9kZSwga2lkcyk7XG4gIGlmIChpc1VuQm9yZGVyZWRCdXR0b25UeXBlKHR5cGUpKSB7XG4gICAgcmV0dXJuIGJ1dHRvbk5vZGU7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFdhdmUsIHtcbiAgICBkaXNhYmxlZDogISFpbm5lckxvYWRpbmdcbiAgfSwgYnV0dG9uTm9kZSk7XG59O1xudmFyIEJ1dHRvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEludGVybmFsQnV0dG9uKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIEJ1dHRvbi5kaXNwbGF5TmFtZSA9ICdCdXR0b24nO1xufVxuQnV0dG9uLkdyb3VwID0gR3JvdXA7XG5CdXR0b24uX19BTlRfQlVUVE9OID0gdHJ1ZTtcbmV4cG9ydCBkZWZhdWx0IEJ1dHRvbjsiLCJpbXBvcnQgY2FuVXNlRG9tIGZyb20gXCIuL2NhblVzZURvbVwiO1xudmFyIGlzU3R5bGVOYW1lU3VwcG9ydCA9IGZ1bmN0aW9uIGlzU3R5bGVOYW1lU3VwcG9ydChzdHlsZU5hbWUpIHtcbiAgaWYgKGNhblVzZURvbSgpICYmIHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICB2YXIgc3R5bGVOYW1lTGlzdCA9IEFycmF5LmlzQXJyYXkoc3R5bGVOYW1lKSA/IHN0eWxlTmFtZSA6IFtzdHlsZU5hbWVdO1xuICAgIHZhciBkb2N1bWVudEVsZW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIHJldHVybiBzdHlsZU5hbWVMaXN0LnNvbWUoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHJldHVybiBuYW1lIGluIGRvY3VtZW50RWxlbWVudC5zdHlsZTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xudmFyIGlzU3R5bGVWYWx1ZVN1cHBvcnQgPSBmdW5jdGlvbiBpc1N0eWxlVmFsdWVTdXBwb3J0KHN0eWxlTmFtZSwgdmFsdWUpIHtcbiAgaWYgKCFpc1N0eWxlTmFtZVN1cHBvcnQoc3R5bGVOYW1lKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgZWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHZhciBvcmlnaW4gPSBlbGUuc3R5bGVbc3R5bGVOYW1lXTtcbiAgZWxlLnN0eWxlW3N0eWxlTmFtZV0gPSB2YWx1ZTtcbiAgcmV0dXJuIGVsZS5zdHlsZVtzdHlsZU5hbWVdICE9PSBvcmlnaW47XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3R5bGVTdXBwb3J0KHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoc3R5bGVOYW1lKSAmJiBzdHlsZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gaXNTdHlsZVZhbHVlU3VwcG9ydChzdHlsZU5hbWUsIHN0eWxlVmFsdWUpO1xuICB9XG4gIHJldHVybiBpc1N0eWxlTmFtZVN1cHBvcnQoc3R5bGVOYW1lKTtcbn0iLCJpbXBvcnQgY2FuVXNlRG9tIGZyb20gXCJyYy11dGlsL2VzL0RvbS9jYW5Vc2VEb21cIjtcbmltcG9ydCB7IGlzU3R5bGVTdXBwb3J0IH0gZnJvbSBcInJjLXV0aWwvZXMvRG9tL3N0eWxlQ2hlY2tlclwiO1xuZXhwb3J0IHZhciBjYW5Vc2VEb2NFbGVtZW50ID0gZnVuY3Rpb24gY2FuVXNlRG9jRWxlbWVudCgpIHtcbiAgcmV0dXJuIGNhblVzZURvbSgpICYmIHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG59O1xuZXhwb3J0IHsgaXNTdHlsZVN1cHBvcnQgfTtcbnZhciBmbGV4R2FwU3VwcG9ydGVkO1xuZXhwb3J0IHZhciBkZXRlY3RGbGV4R2FwU3VwcG9ydGVkID0gZnVuY3Rpb24gZGV0ZWN0RmxleEdhcFN1cHBvcnRlZCgpIHtcbiAgaWYgKCFjYW5Vc2VEb2NFbGVtZW50KCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGZsZXhHYXBTdXBwb3J0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmbGV4R2FwU3VwcG9ydGVkO1xuICB9XG4gIC8vIGNyZWF0ZSBmbGV4IGNvbnRhaW5lciB3aXRoIHJvdy1nYXAgc2V0XG4gIHZhciBmbGV4ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGZsZXguc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgZmxleC5zdHlsZS5mbGV4RGlyZWN0aW9uID0gJ2NvbHVtbic7XG4gIGZsZXguc3R5bGUucm93R2FwID0gJzFweCc7XG4gIC8vIGNyZWF0ZSB0d28sIGVsZW1lbnRzIGluc2lkZSBpdFxuICBmbGV4LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcbiAgZmxleC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7XG4gIC8vIGFwcGVuZCB0byB0aGUgRE9NIChuZWVkZWQgdG8gb2J0YWluIHNjcm9sbEhlaWdodClcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmbGV4KTtcbiAgZmxleEdhcFN1cHBvcnRlZCA9IGZsZXguc2Nyb2xsSGVpZ2h0ID09PSAxOyAvLyBmbGV4IGNvbnRhaW5lciBzaG91bGQgYmUgMXB4IGhpZ2ggZnJvbSB0aGUgcm93LWdhcFxuICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGZsZXgpO1xuICByZXR1cm4gZmxleEdhcFN1cHBvcnRlZDtcbn07IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBkZXRlY3RGbGV4R2FwU3VwcG9ydGVkIH0gZnJvbSAnLi4vc3R5bGVDaGVja2VyJztcbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoKSB7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgZmxleGlibGUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEZsZXhpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRGbGV4aWJsZShkZXRlY3RGbGV4R2FwU3VwcG9ydGVkKCkpO1xuICB9LCBbXSk7XG4gIHJldHVybiBmbGV4aWJsZTtcbn0pOyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFNwYWNlQ29udGV4dCB9IGZyb20gJy4nO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gSXRlbShfcmVmKSB7XG4gIHZhciBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICBkaXJlY3Rpb24gPSBfcmVmLmRpcmVjdGlvbixcbiAgICBpbmRleCA9IF9yZWYuaW5kZXgsXG4gICAgbWFyZ2luRGlyZWN0aW9uID0gX3JlZi5tYXJnaW5EaXJlY3Rpb24sXG4gICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgIHNwbGl0ID0gX3JlZi5zcGxpdCxcbiAgICB3cmFwID0gX3JlZi53cmFwO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFNwYWNlQ29udGV4dCksXG4gICAgaG9yaXpvbnRhbFNpemUgPSBfUmVhY3QkdXNlQ29udGV4dC5ob3Jpem9udGFsU2l6ZSxcbiAgICB2ZXJ0aWNhbFNpemUgPSBfUmVhY3QkdXNlQ29udGV4dC52ZXJ0aWNhbFNpemUsXG4gICAgbGF0ZXN0SW5kZXggPSBfUmVhY3QkdXNlQ29udGV4dC5sYXRlc3RJbmRleCxcbiAgICBzdXBwb3J0RmxleEdhcCA9IF9SZWFjdCR1c2VDb250ZXh0LnN1cHBvcnRGbGV4R2FwO1xuICB2YXIgc3R5bGUgPSB7fTtcbiAgaWYgKCFzdXBwb3J0RmxleEdhcCkge1xuICAgIGlmIChkaXJlY3Rpb24gPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgIGlmIChpbmRleCA8IGxhdGVzdEluZGV4KSB7XG4gICAgICAgIHN0eWxlID0ge1xuICAgICAgICAgIG1hcmdpbkJvdHRvbTogaG9yaXpvbnRhbFNpemUgLyAoc3BsaXQgPyAyIDogMSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGUgPSBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgaW5kZXggPCBsYXRlc3RJbmRleCAmJiBfZGVmaW5lUHJvcGVydHkoe30sIG1hcmdpbkRpcmVjdGlvbiwgaG9yaXpvbnRhbFNpemUgLyAoc3BsaXQgPyAyIDogMSkpKSwgd3JhcCAmJiB7XG4gICAgICAgIHBhZGRpbmdCb3R0b206IHZlcnRpY2FsU2l6ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChjaGlsZHJlbiA9PT0gbnVsbCB8fCBjaGlsZHJlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIGNoaWxkcmVuKSwgaW5kZXggPCBsYXRlc3RJbmRleCAmJiBzcGxpdCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoY2xhc3NOYW1lLCBcIi1zcGxpdFwiKSxcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgc3BsaXQpKTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB0b0FycmF5IGZyb20gXCJyYy11dGlsL2VzL0NoaWxkcmVuL3RvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHVzZUZsZXhHYXBTdXBwb3J0IGZyb20gJy4uL191dGlsL2hvb2tzL3VzZUZsZXhHYXBTdXBwb3J0JztcbmltcG9ydCBJdGVtIGZyb20gJy4vSXRlbSc7XG5pbXBvcnQgQ29tcGFjdCBmcm9tICcuL0NvbXBhY3QnO1xuZXhwb3J0IHZhciBTcGFjZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIGxhdGVzdEluZGV4OiAwLFxuICBob3Jpem9udGFsU2l6ZTogMCxcbiAgdmVydGljYWxTaXplOiAwLFxuICBzdXBwb3J0RmxleEdhcDogZmFsc2Vcbn0pO1xudmFyIHNwYWNlU2l6ZSA9IHtcbiAgc21hbGw6IDgsXG4gIG1pZGRsZTogMTYsXG4gIGxhcmdlOiAyNFxufTtcbmZ1bmN0aW9uIGdldE51bWJlclNpemUoc2l6ZSkge1xuICByZXR1cm4gdHlwZW9mIHNpemUgPT09ICdzdHJpbmcnID8gc3BhY2VTaXplW3NpemVdIDogc2l6ZSB8fCAwO1xufVxudmFyIFNwYWNlID0gZnVuY3Rpb24gU3BhY2UocHJvcHMpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICBzcGFjZSA9IF9SZWFjdCR1c2VDb250ZXh0LnNwYWNlLFxuICAgIGRpcmVjdGlvbkNvbmZpZyA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcbiAgdmFyIF9wcm9wcyRzaXplID0gcHJvcHMuc2l6ZSxcbiAgICBzaXplID0gX3Byb3BzJHNpemUgPT09IHZvaWQgMCA/IChzcGFjZSA9PT0gbnVsbCB8fCBzcGFjZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3BhY2Uuc2l6ZSkgfHwgJ3NtYWxsJyA6IF9wcm9wcyRzaXplLFxuICAgIGFsaWduID0gcHJvcHMuYWxpZ24sXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgX3Byb3BzJGRpcmVjdGlvbiA9IHByb3BzLmRpcmVjdGlvbixcbiAgICBkaXJlY3Rpb24gPSBfcHJvcHMkZGlyZWN0aW9uID09PSB2b2lkIDAgPyAnaG9yaXpvbnRhbCcgOiBfcHJvcHMkZGlyZWN0aW9uLFxuICAgIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBzcGxpdCA9IHByb3BzLnNwbGl0LFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgX3Byb3BzJHdyYXAgPSBwcm9wcy53cmFwLFxuICAgIHdyYXAgPSBfcHJvcHMkd3JhcCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkd3JhcCxcbiAgICBvdGhlclByb3BzID0gX19yZXN0KHByb3BzLCBbXCJzaXplXCIsIFwiYWxpZ25cIiwgXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiLCBcImRpcmVjdGlvblwiLCBcInByZWZpeENsc1wiLCBcInNwbGl0XCIsIFwic3R5bGVcIiwgXCJ3cmFwXCJdKTtcbiAgdmFyIHN1cHBvcnRGbGV4R2FwID0gdXNlRmxleEdhcFN1cHBvcnQoKTtcbiAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gKEFycmF5LmlzQXJyYXkoc2l6ZSkgPyBzaXplIDogW3NpemUsIHNpemVdKS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGdldE51bWJlclNpemUoaXRlbSk7XG4gICAgICB9KTtcbiAgICB9LCBbc2l6ZV0pLFxuICAgIF9SZWFjdCR1c2VNZW1vMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VNZW1vLCAyKSxcbiAgICBob3Jpem9udGFsU2l6ZSA9IF9SZWFjdCR1c2VNZW1vMlswXSxcbiAgICB2ZXJ0aWNhbFNpemUgPSBfUmVhY3QkdXNlTWVtbzJbMV07XG4gIHZhciBjaGlsZE5vZGVzID0gdG9BcnJheShjaGlsZHJlbiwge1xuICAgIGtlZXBFbXB0eTogdHJ1ZVxuICB9KTtcbiAgdmFyIG1lcmdlZEFsaWduID0gYWxpZ24gPT09IHVuZGVmaW5lZCAmJiBkaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyA/ICdjZW50ZXInIDogYWxpZ247XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3NwYWNlJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIGNuID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChkaXJlY3Rpb24pLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uQ29uZmlnID09PSAncnRsJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hbGlnbi1cIikuY29uY2F0KG1lcmdlZEFsaWduKSwgbWVyZ2VkQWxpZ24pLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSk7XG4gIHZhciBpdGVtQ2xhc3NOYW1lID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtXCIpO1xuICB2YXIgbWFyZ2luRGlyZWN0aW9uID0gZGlyZWN0aW9uQ29uZmlnID09PSAncnRsJyA/ICdtYXJnaW5MZWZ0JyA6ICdtYXJnaW5SaWdodCc7XG4gIC8vIENhbGN1bGF0ZSBsYXRlc3Qgb25lXG4gIHZhciBsYXRlc3RJbmRleCA9IDA7XG4gIHZhciBub2RlcyA9IGNoaWxkTm9kZXMubWFwKGZ1bmN0aW9uIChjaGlsZCwgaSkge1xuICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiBjaGlsZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsYXRlc3RJbmRleCA9IGk7XG4gICAgfVxuICAgIHZhciBrZXkgPSBjaGlsZCAmJiBjaGlsZC5rZXkgfHwgXCJcIi5jb25jYXQoaXRlbUNsYXNzTmFtZSwgXCItXCIpLmNvbmNhdChpKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSXRlbSwge1xuICAgICAgY2xhc3NOYW1lOiBpdGVtQ2xhc3NOYW1lLFxuICAgICAga2V5OiBrZXksXG4gICAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgIGluZGV4OiBpLFxuICAgICAgbWFyZ2luRGlyZWN0aW9uOiBtYXJnaW5EaXJlY3Rpb24sXG4gICAgICBzcGxpdDogc3BsaXQsXG4gICAgICB3cmFwOiB3cmFwXG4gICAgfSwgY2hpbGQpO1xuICB9KTtcbiAgdmFyIHNwYWNlQ29udGV4dCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBob3Jpem9udGFsU2l6ZTogaG9yaXpvbnRhbFNpemUsXG4gICAgICB2ZXJ0aWNhbFNpemU6IHZlcnRpY2FsU2l6ZSxcbiAgICAgIGxhdGVzdEluZGV4OiBsYXRlc3RJbmRleCxcbiAgICAgIHN1cHBvcnRGbGV4R2FwOiBzdXBwb3J0RmxleEdhcFxuICAgIH07XG4gIH0sIFtob3Jpem9udGFsU2l6ZSwgdmVydGljYWxTaXplLCBsYXRlc3RJbmRleCwgc3VwcG9ydEZsZXhHYXBdKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaWYgKGNoaWxkTm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGdhcFN0eWxlID0ge307XG4gIGlmICh3cmFwKSB7XG4gICAgZ2FwU3R5bGUuZmxleFdyYXAgPSAnd3JhcCc7XG4gICAgLy8gUGF0Y2ggZm9yIGdhcCBub3Qgc3VwcG9ydFxuICAgIGlmICghc3VwcG9ydEZsZXhHYXApIHtcbiAgICAgIGdhcFN0eWxlLm1hcmdpbkJvdHRvbSA9IC12ZXJ0aWNhbFNpemU7XG4gICAgfVxuICB9XG4gIGlmIChzdXBwb3J0RmxleEdhcCkge1xuICAgIGdhcFN0eWxlLmNvbHVtbkdhcCA9IGhvcml6b250YWxTaXplO1xuICAgIGdhcFN0eWxlLnJvd0dhcCA9IHZlcnRpY2FsU2l6ZTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY24sXG4gICAgc3R5bGU6IF9leHRlbmRzKF9leHRlbmRzKHt9LCBnYXBTdHlsZSksIHN0eWxlKVxuICB9LCBvdGhlclByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3BhY2VDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHNwYWNlQ29udGV4dFxuICB9LCBub2RlcykpO1xufTtcbnZhciBDb21wb3VuZGVkU3BhY2UgPSBTcGFjZTtcbkNvbXBvdW5kZWRTcGFjZS5Db21wYWN0ID0gQ29tcGFjdDtcbmV4cG9ydCBkZWZhdWx0IENvbXBvdW5kZWRTcGFjZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBFbGxpcHNpc091dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FbGxpcHNpc091dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBCdXR0b24gZnJvbSAnLi4vYnV0dG9uJztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgdXNlQ29tcGFjdEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vc3BhY2UvQ29tcGFjdCc7XG5pbXBvcnQgRHJvcGRvd24gZnJvbSAnLi9kcm9wZG93bic7XG5pbXBvcnQgU3BhY2UgZnJvbSAnLi4vc3BhY2UnO1xudmFyIERyb3Bkb3duQnV0dG9uID0gZnVuY3Rpb24gRHJvcGRvd25CdXR0b24ocHJvcHMpIHtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRDb250ZXh0UG9wdXBDb250YWluZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQb3B1cENvbnRhaW5lcixcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIF9wcm9wcyR0eXBlID0gcHJvcHMudHlwZSxcbiAgICB0eXBlID0gX3Byb3BzJHR5cGUgPT09IHZvaWQgMCA/ICdkZWZhdWx0JyA6IF9wcm9wcyR0eXBlLFxuICAgIGRhbmdlciA9IHByb3BzLmRhbmdlcixcbiAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgIGxvYWRpbmcgPSBwcm9wcy5sb2FkaW5nLFxuICAgIG9uQ2xpY2sgPSBwcm9wcy5vbkNsaWNrLFxuICAgIGh0bWxUeXBlID0gcHJvcHMuaHRtbFR5cGUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgbWVudSA9IHByb3BzLm1lbnUsXG4gICAgYXJyb3cgPSBwcm9wcy5hcnJvdyxcbiAgICBhdXRvRm9jdXMgPSBwcm9wcy5hdXRvRm9jdXMsXG4gICAgb3ZlcmxheSA9IHByb3BzLm92ZXJsYXksXG4gICAgdHJpZ2dlciA9IHByb3BzLnRyaWdnZXIsXG4gICAgYWxpZ24gPSBwcm9wcy5hbGlnbixcbiAgICB2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICBvcGVuID0gcHJvcHMub3BlbixcbiAgICBvblZpc2libGVDaGFuZ2UgPSBwcm9wcy5vblZpc2libGVDaGFuZ2UsXG4gICAgb25PcGVuQ2hhbmdlID0gcHJvcHMub25PcGVuQ2hhbmdlLFxuICAgIHBsYWNlbWVudCA9IHByb3BzLnBsYWNlbWVudCxcbiAgICBnZXRQb3B1cENvbnRhaW5lciA9IHByb3BzLmdldFBvcHVwQ29udGFpbmVyLFxuICAgIGhyZWYgPSBwcm9wcy5ocmVmLFxuICAgIF9wcm9wcyRpY29uID0gcHJvcHMuaWNvbixcbiAgICBpY29uID0gX3Byb3BzJGljb24gPT09IHZvaWQgMCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsbGlwc2lzT3V0bGluZWQsIG51bGwpIDogX3Byb3BzJGljb24sXG4gICAgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICBfcHJvcHMkYnV0dG9uc1JlbmRlciA9IHByb3BzLmJ1dHRvbnNSZW5kZXIsXG4gICAgYnV0dG9uc1JlbmRlciA9IF9wcm9wcyRidXR0b25zUmVuZGVyID09PSB2b2lkIDAgPyBmdW5jdGlvbiAoYnV0dG9ucykge1xuICAgICAgcmV0dXJuIGJ1dHRvbnM7XG4gICAgfSA6IF9wcm9wcyRidXR0b25zUmVuZGVyLFxuICAgIG1vdXNlRW50ZXJEZWxheSA9IHByb3BzLm1vdXNlRW50ZXJEZWxheSxcbiAgICBtb3VzZUxlYXZlRGVsYXkgPSBwcm9wcy5tb3VzZUxlYXZlRGVsYXksXG4gICAgb3ZlcmxheUNsYXNzTmFtZSA9IHByb3BzLm92ZXJsYXlDbGFzc05hbWUsXG4gICAgb3ZlcmxheVN0eWxlID0gcHJvcHMub3ZlcmxheVN0eWxlLFxuICAgIGRlc3Ryb3lQb3B1cE9uSGlkZSA9IHByb3BzLmRlc3Ryb3lQb3B1cE9uSGlkZSxcbiAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcInR5cGVcIiwgXCJkYW5nZXJcIiwgXCJkaXNhYmxlZFwiLCBcImxvYWRpbmdcIiwgXCJvbkNsaWNrXCIsIFwiaHRtbFR5cGVcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcIm1lbnVcIiwgXCJhcnJvd1wiLCBcImF1dG9Gb2N1c1wiLCBcIm92ZXJsYXlcIiwgXCJ0cmlnZ2VyXCIsIFwiYWxpZ25cIiwgXCJ2aXNpYmxlXCIsIFwib3BlblwiLCBcIm9uVmlzaWJsZUNoYW5nZVwiLCBcIm9uT3BlbkNoYW5nZVwiLCBcInBsYWNlbWVudFwiLCBcImdldFBvcHVwQ29udGFpbmVyXCIsIFwiaHJlZlwiLCBcImljb25cIiwgXCJ0aXRsZVwiLCBcImJ1dHRvbnNSZW5kZXJcIiwgXCJtb3VzZUVudGVyRGVsYXlcIiwgXCJtb3VzZUxlYXZlRGVsYXlcIiwgXCJvdmVybGF5Q2xhc3NOYW1lXCIsIFwib3ZlcmxheVN0eWxlXCIsIFwiZGVzdHJveVBvcHVwT25IaWRlXCJdKTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnZHJvcGRvd24tYnV0dG9uJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIGRyb3Bkb3duUHJvcHMgPSB7XG4gICAgbWVudTogbWVudSxcbiAgICBhcnJvdzogYXJyb3csXG4gICAgYXV0b0ZvY3VzOiBhdXRvRm9jdXMsXG4gICAgYWxpZ246IGFsaWduLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICB0cmlnZ2VyOiBkaXNhYmxlZCA/IFtdIDogdHJpZ2dlcixcbiAgICBvbk9wZW5DaGFuZ2U6IG9uT3BlbkNoYW5nZSB8fCBvblZpc2libGVDaGFuZ2UsXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyIHx8IGdldENvbnRleHRQb3B1cENvbnRhaW5lcixcbiAgICBtb3VzZUVudGVyRGVsYXk6IG1vdXNlRW50ZXJEZWxheSxcbiAgICBtb3VzZUxlYXZlRGVsYXk6IG1vdXNlTGVhdmVEZWxheSxcbiAgICBvdmVybGF5Q2xhc3NOYW1lOiBvdmVybGF5Q2xhc3NOYW1lLFxuICAgIG92ZXJsYXlTdHlsZTogb3ZlcmxheVN0eWxlLFxuICAgIGRlc3Ryb3lQb3B1cE9uSGlkZTogZGVzdHJveVBvcHVwT25IaWRlXG4gIH07XG4gIHZhciBfdXNlQ29tcGFjdEl0ZW1Db250ZXggPSB1c2VDb21wYWN0SXRlbUNvbnRleHQocHJlZml4Q2xzLCBkaXJlY3Rpb24pLFxuICAgIGNvbXBhY3RTaXplID0gX3VzZUNvbXBhY3RJdGVtQ29udGV4LmNvbXBhY3RTaXplLFxuICAgIGNvbXBhY3RJdGVtQ2xhc3NuYW1lcyA9IF91c2VDb21wYWN0SXRlbUNvbnRleC5jb21wYWN0SXRlbUNsYXNzbmFtZXM7XG4gIHZhciBjbGFzc2VzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIGNvbXBhY3RJdGVtQ2xhc3NuYW1lcywgY2xhc3NOYW1lKTtcbiAgaWYgKCdvdmVybGF5JyBpbiBwcm9wcykge1xuICAgIGRyb3Bkb3duUHJvcHMub3ZlcmxheSA9IG92ZXJsYXk7XG4gIH1cbiAgaWYgKCdvcGVuJyBpbiBwcm9wcykge1xuICAgIGRyb3Bkb3duUHJvcHMub3BlbiA9IG9wZW47XG4gIH0gZWxzZSBpZiAoJ3Zpc2libGUnIGluIHByb3BzKSB7XG4gICAgZHJvcGRvd25Qcm9wcy5vcGVuID0gdmlzaWJsZTtcbiAgfVxuICBpZiAoJ3BsYWNlbWVudCcgaW4gcHJvcHMpIHtcbiAgICBkcm9wZG93blByb3BzLnBsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgfSBlbHNlIHtcbiAgICBkcm9wZG93blByb3BzLnBsYWNlbWVudCA9IGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyAnYm90dG9tTGVmdCcgOiAnYm90dG9tUmlnaHQnO1xuICB9XG4gIHZhciBsZWZ0QnV0dG9uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQnV0dG9uLCB7XG4gICAgdHlwZTogdHlwZSxcbiAgICBkYW5nZXI6IGRhbmdlcixcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgbG9hZGluZzogbG9hZGluZyxcbiAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgIGh0bWxUeXBlOiBodG1sVHlwZSxcbiAgICBocmVmOiBocmVmLFxuICAgIHRpdGxlOiB0aXRsZVxuICB9LCBjaGlsZHJlbik7XG4gIHZhciByaWdodEJ1dHRvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJ1dHRvbiwge1xuICAgIHR5cGU6IHR5cGUsXG4gICAgZGFuZ2VyOiBkYW5nZXIsXG4gICAgaWNvbjogaWNvblxuICB9KTtcbiAgdmFyIF9idXR0b25zUmVuZGVyID0gYnV0dG9uc1JlbmRlcihbbGVmdEJ1dHRvbiwgcmlnaHRCdXR0b25dKSxcbiAgICBfYnV0dG9uc1JlbmRlcjIgPSBfc2xpY2VkVG9BcnJheShfYnV0dG9uc1JlbmRlciwgMiksXG4gICAgbGVmdEJ1dHRvblRvUmVuZGVyID0gX2J1dHRvbnNSZW5kZXIyWzBdLFxuICAgIHJpZ2h0QnV0dG9uVG9SZW5kZXIgPSBfYnV0dG9uc1JlbmRlcjJbMV07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTcGFjZS5Db21wYWN0LCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzLFxuICAgIHNpemU6IGNvbXBhY3RTaXplLFxuICAgIGJsb2NrOiB0cnVlXG4gIH0sIHJlc3RQcm9wcyksIGxlZnRCdXR0b25Ub1JlbmRlciwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRHJvcGRvd24sIF9leHRlbmRzKHt9LCBkcm9wZG93blByb3BzKSwgcmlnaHRCdXR0b25Ub1JlbmRlcikpO1xufTtcbkRyb3Bkb3duQnV0dG9uLl9fQU5UX0JVVFRPTiA9IHRydWU7XG5leHBvcnQgZGVmYXVsdCBEcm9wZG93bkJ1dHRvbjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBSaWdodE91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9SaWdodE91dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSY0Ryb3Bkb3duIGZyb20gJ3JjLWRyb3Bkb3duJztcbmltcG9ydCB1c2VFdmVudCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VFdmVudFwiO1xuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTWVudSBmcm9tICcuLi9tZW51JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgT3ZlcnJpZGVQcm92aWRlciB9IGZyb20gJy4uL21lbnUvT3ZlcnJpZGVDb250ZXh0JztcbmltcG9ydCBnZXRQbGFjZW1lbnRzIGZyb20gJy4uL191dGlsL3BsYWNlbWVudHMnO1xuaW1wb3J0IHsgY2xvbmVFbGVtZW50IH0gZnJvbSAnLi4vX3V0aWwvcmVhY3ROb2RlJztcbmltcG9ydCB7IHR1cGxlIH0gZnJvbSAnLi4vX3V0aWwvdHlwZSc7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCBEcm9wZG93bkJ1dHRvbiBmcm9tICcuL2Ryb3Bkb3duLWJ1dHRvbic7XG5pbXBvcnQgeyBOb0NvbXBhY3RTdHlsZSB9IGZyb20gJy4uL3NwYWNlL0NvbXBhY3QnO1xudmFyIFBsYWNlbWVudHMgPSB0dXBsZSgndG9wTGVmdCcsICd0b3BDZW50ZXInLCAndG9wUmlnaHQnLCAnYm90dG9tTGVmdCcsICdib3R0b21DZW50ZXInLCAnYm90dG9tUmlnaHQnLCAndG9wJywgJ2JvdHRvbScpO1xudmFyIERyb3Bkb3duID0gZnVuY3Rpb24gRHJvcGRvd24ocHJvcHMpIHtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRDb250ZXh0UG9wdXBDb250YWluZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQb3B1cENvbnRhaW5lcixcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICAvLyBXYXJuaW5nIGZvciBkZXByZWNhdGVkIHVzYWdlXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgW1sndmlzaWJsZScsICdvcGVuJ10sIFsnb25WaXNpYmxlQ2hhbmdlJywgJ29uT3BlbkNoYW5nZSddXS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKSxcbiAgICAgICAgZGVwcmVjYXRlZE5hbWUgPSBfcmVmMlswXSxcbiAgICAgICAgbmV3TmFtZSA9IF9yZWYyWzFdO1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKGRlcHJlY2F0ZWROYW1lIGluIHByb3BzKSwgJ0Ryb3Bkb3duJywgXCJgXCIuY29uY2F0KGRlcHJlY2F0ZWROYW1lLCBcImAgaXMgZGVwcmVjYXRlZCB3aGljaCB3aWxsIGJlIHJlbW92ZWQgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLCBwbGVhc2UgdXNlIGBcIikuY29uY2F0KG5ld05hbWUsIFwiYCBpbnN0ZWFkLlwiKSkgOiB2b2lkIDA7XG4gICAgfSk7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKCdvdmVybGF5JyBpbiBwcm9wcyksICdEcm9wZG93bicsICdgb3ZlcmxheWAgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBgbWVudWAgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgfVxuICB2YXIgZ2V0VHJhbnNpdGlvbk5hbWUgPSBmdW5jdGlvbiBnZXRUcmFuc2l0aW9uTmFtZSgpIHtcbiAgICB2YXIgcm9vdFByZWZpeENscyA9IGdldFByZWZpeENscygpO1xuICAgIHZhciBfcHJvcHMkcGxhY2VtZW50ID0gcHJvcHMucGxhY2VtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX3Byb3BzJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gJycgOiBfcHJvcHMkcGxhY2VtZW50LFxuICAgICAgdHJhbnNpdGlvbk5hbWUgPSBwcm9wcy50cmFuc2l0aW9uTmFtZTtcbiAgICBpZiAodHJhbnNpdGlvbk5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRyYW5zaXRpb25OYW1lO1xuICAgIH1cbiAgICBpZiAocGxhY2VtZW50LmluY2x1ZGVzKCd0b3AnKSkge1xuICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KHJvb3RQcmVmaXhDbHMsIFwiLXNsaWRlLWRvd25cIik7XG4gICAgfVxuICAgIHJldHVybiBcIlwiLmNvbmNhdChyb290UHJlZml4Q2xzLCBcIi1zbGlkZS11cFwiKTtcbiAgfTtcbiAgdmFyIGdldFBsYWNlbWVudCA9IGZ1bmN0aW9uIGdldFBsYWNlbWVudCgpIHtcbiAgICB2YXIgcGxhY2VtZW50ID0gcHJvcHMucGxhY2VtZW50O1xuICAgIGlmICghcGxhY2VtZW50KSB7XG4gICAgICByZXR1cm4gZGlyZWN0aW9uID09PSAncnRsJyA/ICdib3R0b21SaWdodCcgOiAnYm90dG9tTGVmdCc7XG4gICAgfVxuICAgIGlmIChwbGFjZW1lbnQuaW5jbHVkZXMoJ0NlbnRlcicpKSB7XG4gICAgICB2YXIgbmV3UGxhY2VtZW50ID0gcGxhY2VtZW50LnNsaWNlKDAsIHBsYWNlbWVudC5pbmRleE9mKCdDZW50ZXInKSk7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCFwbGFjZW1lbnQuaW5jbHVkZXMoJ0NlbnRlcicpLCAnRHJvcGRvd24nLCBcIllvdSBhcmUgdXNpbmcgJ1wiLmNvbmNhdChwbGFjZW1lbnQsIFwiJyBwbGFjZW1lbnQgaW4gRHJvcGRvd24sIHdoaWNoIGlzIGRlcHJlY2F0ZWQuIFRyeSB0byB1c2UgJ1wiKS5jb25jYXQobmV3UGxhY2VtZW50LCBcIicgaW5zdGVhZC5cIikpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIG5ld1BsYWNlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIHBsYWNlbWVudDtcbiAgfTtcbiAgdmFyIG1lbnUgPSBwcm9wcy5tZW51LFxuICAgIGFycm93ID0gcHJvcHMuYXJyb3csXG4gICAgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgdHJpZ2dlciA9IHByb3BzLnRyaWdnZXIsXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBkcm9wZG93blJlbmRlciA9IHByb3BzLmRyb3Bkb3duUmVuZGVyLFxuICAgIGdldFBvcHVwQ29udGFpbmVyID0gcHJvcHMuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgb3ZlcmxheUNsYXNzTmFtZSA9IHByb3BzLm92ZXJsYXlDbGFzc05hbWUsXG4gICAgdmlzaWJsZSA9IHByb3BzLnZpc2libGUsXG4gICAgb3BlbiA9IHByb3BzLm9wZW4sXG4gICAgb25WaXNpYmxlQ2hhbmdlID0gcHJvcHMub25WaXNpYmxlQ2hhbmdlLFxuICAgIG9uT3BlbkNoYW5nZSA9IHByb3BzLm9uT3BlbkNoYW5nZSxcbiAgICBfcHJvcHMkbW91c2VFbnRlckRlbGEgPSBwcm9wcy5tb3VzZUVudGVyRGVsYXksXG4gICAgbW91c2VFbnRlckRlbGF5ID0gX3Byb3BzJG1vdXNlRW50ZXJEZWxhID09PSB2b2lkIDAgPyAwLjE1IDogX3Byb3BzJG1vdXNlRW50ZXJEZWxhLFxuICAgIF9wcm9wcyRtb3VzZUxlYXZlRGVsYSA9IHByb3BzLm1vdXNlTGVhdmVEZWxheSxcbiAgICBtb3VzZUxlYXZlRGVsYXkgPSBfcHJvcHMkbW91c2VMZWF2ZURlbGEgPT09IHZvaWQgMCA/IDAuMSA6IF9wcm9wcyRtb3VzZUxlYXZlRGVsYSxcbiAgICBfcHJvcHMkYXV0b0FkanVzdE92ZXIgPSBwcm9wcy5hdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgYXV0b0FkanVzdE92ZXJmbG93ID0gX3Byb3BzJGF1dG9BZGp1c3RPdmVyID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGF1dG9BZGp1c3RPdmVyO1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdkcm9wZG93bicsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBjaGlsZCA9IFJlYWN0LkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pO1xuICB2YXIgZHJvcGRvd25UcmlnZ2VyID0gY2xvbmVFbGVtZW50KGNoaWxkLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdHJpZ2dlclwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIGNoaWxkLnByb3BzLmNsYXNzTmFtZSksXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkXG4gIH0pO1xuICB2YXIgdHJpZ2dlckFjdGlvbnMgPSBkaXNhYmxlZCA/IFtdIDogdHJpZ2dlcjtcbiAgdmFyIGFsaWduUG9pbnQ7XG4gIGlmICh0cmlnZ2VyQWN0aW9ucyAmJiB0cmlnZ2VyQWN0aW9ucy5pbmNsdWRlcygnY29udGV4dE1lbnUnKSkge1xuICAgIGFsaWduUG9pbnQgPSB0cnVlO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBWaXNpYmxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKGZhbHNlLCB7XG4gICAgICB2YWx1ZTogb3BlbiAhPT0gdW5kZWZpbmVkID8gb3BlbiA6IHZpc2libGVcbiAgICB9KSxcbiAgICBfdXNlTWVyZ2VkU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZU1lcmdlZFN0YXRlLCAyKSxcbiAgICBtZXJnZWRPcGVuID0gX3VzZU1lcmdlZFN0YXRlMlswXSxcbiAgICBzZXRPcGVuID0gX3VzZU1lcmdlZFN0YXRlMlsxXTtcbiAgdmFyIG9uSW5uZXJPcGVuQ2hhbmdlID0gdXNlRXZlbnQoZnVuY3Rpb24gKG5leHRPcGVuKSB7XG4gICAgb25WaXNpYmxlQ2hhbmdlID09PSBudWxsIHx8IG9uVmlzaWJsZUNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25WaXNpYmxlQ2hhbmdlKG5leHRPcGVuKTtcbiAgICBvbk9wZW5DaGFuZ2UgPT09IG51bGwgfHwgb25PcGVuQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbk9wZW5DaGFuZ2UobmV4dE9wZW4pO1xuICAgIHNldE9wZW4obmV4dE9wZW4pO1xuICB9KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IE92ZXJsYXkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb3ZlcmxheUNsYXNzTmFtZUN1c3RvbWl6ZWQgPSBjbGFzc05hbWVzKG92ZXJsYXlDbGFzc05hbWUsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpKTtcbiAgdmFyIGJ1aWx0aW5QbGFjZW1lbnRzID0gZ2V0UGxhY2VtZW50cyh7XG4gICAgYXJyb3dQb2ludEF0Q2VudGVyOiBfdHlwZW9mKGFycm93KSA9PT0gJ29iamVjdCcgJiYgYXJyb3cucG9pbnRBdENlbnRlcixcbiAgICBhdXRvQWRqdXN0T3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvd1xuICB9KTtcbiAgdmFyIG9uTWVudUNsaWNrID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIHNldE9wZW4oZmFsc2UpO1xuICB9LCBbXSk7XG4gIHZhciByZW5kZXJPdmVybGF5ID0gZnVuY3Rpb24gcmVuZGVyT3ZlcmxheSgpIHtcbiAgICAvLyByYy1kcm9wZG93biBhbHJlYWR5IGNhbiBwcm9jZXNzIHRoZSBmdW5jdGlvbiBvZiBvdmVybGF5LCBidXQgd2UgaGF2ZSBjaGVjayBsb2dpYyBoZXJlLlxuICAgIC8vIFNvIHdlIG5lZWQgcmVuZGVyIHRoZSBlbGVtZW50IHRvIGNoZWNrIGFuZCBwYXNzIGJhY2sgdG8gcmMtZHJvcGRvd24uXG4gICAgdmFyIG92ZXJsYXkgPSBwcm9wcy5vdmVybGF5O1xuICAgIHZhciBvdmVybGF5Tm9kZTtcbiAgICBpZiAobWVudSA9PT0gbnVsbCB8fCBtZW51ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZW51Lml0ZW1zKSB7XG4gICAgICBvdmVybGF5Tm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1lbnUsIF9leHRlbmRzKHt9LCBtZW51KSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygb3ZlcmxheSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3ZlcmxheU5vZGUgPSBvdmVybGF5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG92ZXJsYXlOb2RlID0gb3ZlcmxheTtcbiAgICB9XG4gICAgaWYgKGRyb3Bkb3duUmVuZGVyKSB7XG4gICAgICBvdmVybGF5Tm9kZSA9IGRyb3Bkb3duUmVuZGVyKG92ZXJsYXlOb2RlKTtcbiAgICB9XG4gICAgb3ZlcmxheU5vZGUgPSBSZWFjdC5DaGlsZHJlbi5vbmx5KHR5cGVvZiBvdmVybGF5Tm9kZSA9PT0gJ3N0cmluZycgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgb3ZlcmxheU5vZGUpIDogb3ZlcmxheU5vZGUpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPdmVycmlkZVByb3ZpZGVyLCB7XG4gICAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWVudVwiKSxcbiAgICAgIGV4cGFuZEljb246IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tZW51LXN1Ym1lbnUtYXJyb3dcIilcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJpZ2h0T3V0bGluZWQsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1lbnUtc3VibWVudS1hcnJvdy1pY29uXCIpXG4gICAgICB9KSksXG4gICAgICBtb2RlOiBcInZlcnRpY2FsXCIsXG4gICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICAgIG9uQ2xpY2s6IG9uTWVudUNsaWNrLFxuICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbiB2YWxpZGF0b3IoX3JlZjMpIHtcbiAgICAgICAgdmFyIG1vZGUgPSBfcmVmMy5tb2RlO1xuICAgICAgICAvLyBXYXJuaW5nIGlmIHVzZSBvdGhlciBtb2RlXG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoIW1vZGUgfHwgbW9kZSA9PT0gJ3ZlcnRpY2FsJywgJ0Ryb3Bkb3duJywgXCJtb2RlPVxcXCJcIi5jb25jYXQobW9kZSwgXCJcXFwiIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIERyb3Bkb3duJ3MgTWVudS5cIikpIDogdm9pZCAwO1xuICAgICAgfVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE5vQ29tcGFjdFN0eWxlLCBudWxsLCBvdmVybGF5Tm9kZSkpO1xuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSY0Ryb3Bkb3duLCBfZXh0ZW5kcyh7XG4gICAgYWxpZ25Qb2ludDogYWxpZ25Qb2ludFxuICB9LCBwcm9wcywge1xuICAgIG1vdXNlRW50ZXJEZWxheTogbW91c2VFbnRlckRlbGF5LFxuICAgIG1vdXNlTGVhdmVEZWxheTogbW91c2VMZWF2ZURlbGF5LFxuICAgIHZpc2libGU6IG1lcmdlZE9wZW4sXG4gICAgYnVpbHRpblBsYWNlbWVudHM6IGJ1aWx0aW5QbGFjZW1lbnRzLFxuICAgIGFycm93OiAhIWFycm93LFxuICAgIG92ZXJsYXlDbGFzc05hbWU6IG92ZXJsYXlDbGFzc05hbWVDdXN0b21pemVkLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lciB8fCBnZXRDb250ZXh0UG9wdXBDb250YWluZXIsXG4gICAgdHJhbnNpdGlvbk5hbWU6IGdldFRyYW5zaXRpb25OYW1lKCksXG4gICAgdHJpZ2dlcjogdHJpZ2dlckFjdGlvbnMsXG4gICAgb3ZlcmxheTogcmVuZGVyT3ZlcmxheSxcbiAgICBwbGFjZW1lbnQ6IGdldFBsYWNlbWVudCgpLFxuICAgIG9uVmlzaWJsZUNoYW5nZTogb25Jbm5lck9wZW5DaGFuZ2VcbiAgfSksIGRyb3Bkb3duVHJpZ2dlcik7XG59O1xuRHJvcGRvd24uQnV0dG9uID0gRHJvcGRvd25CdXR0b247XG5leHBvcnQgZGVmYXVsdCBEcm9wZG93bjsiLCIvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZyZWVHbG9iYWw7XG4iLCJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJvb3Q7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheTtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh1bm1hc2tlZCkge1xuICAgIGlmIChpc093bikge1xuICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFJhd1RhZztcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9iamVjdFRvU3RyaW5nO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGdldFJhd1RhZyA9IHJlcXVpcmUoJy4vX2dldFJhd1RhZycpLFxuICAgIG9iamVjdFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fb2JqZWN0VG9TdHJpbmcnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG51bGxUYWcgPSAnW29iamVjdCBOdWxsXScsXG4gICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXSc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRUYWdgIHdpdGhvdXQgZmFsbGJhY2tzIGZvciBidWdneSBlbnZpcm9ubWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgfVxuICByZXR1cm4gKHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkpXG4gICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgOiBvYmplY3RUb1N0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldFRhZztcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0TGlrZTtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1N5bWJvbDtcbiIsIi8qKiBVc2VkIHRvIG1hdGNoIGEgc2luZ2xlIHdoaXRlc3BhY2UgY2hhcmFjdGVyLiAqL1xudmFyIHJlV2hpdGVzcGFjZSA9IC9cXHMvO1xuXG4vKipcbiAqIFVzZWQgYnkgYF8udHJpbWAgYW5kIGBfLnRyaW1FbmRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2VcbiAqIGNoYXJhY3RlciBvZiBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIuXG4gKi9cbmZ1bmN0aW9uIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpIHtcbiAgdmFyIGluZGV4ID0gc3RyaW5nLmxlbmd0aDtcblxuICB3aGlsZSAoaW5kZXgtLSAmJiByZVdoaXRlc3BhY2UudGVzdChzdHJpbmcuY2hhckF0KGluZGV4KSkpIHt9XG4gIHJldHVybiBpbmRleDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0cmltbWVkRW5kSW5kZXg7XG4iLCJ2YXIgdHJpbW1lZEVuZEluZGV4ID0gcmVxdWlyZSgnLi9fdHJpbW1lZEVuZEluZGV4Jyk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW1TdGFydCA9IC9eXFxzKy87XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udHJpbWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byB0cmltLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUcmltKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nXG4gICAgPyBzdHJpbmcuc2xpY2UoMCwgdHJpbW1lZEVuZEluZGV4KHN0cmluZykgKyAxKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJylcbiAgICA6IHN0cmluZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVHJpbTtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0O1xuIiwidmFyIGJhc2VUcmltID0gcmVxdWlyZSgnLi9fYmFzZVRyaW0nKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTkFOID0gMCAvIDA7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTnVtYmVyKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBJbmZpbml0eVxuICpcbiAqIF8udG9OdW1iZXIoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgfVxuICB2YWx1ZSA9IGJhc2VUcmltKHZhbHVlKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9OdW1iZXI7XG4iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgUGFuZWxDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe30pO1xuZXhwb3J0IGRlZmF1bHQgUGFuZWxDb250ZXh0OyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQYW5lbENvbnRleHQgZnJvbSAnLi4vUGFuZWxDb250ZXh0JztcbnZhciBISURERU5fU1RZTEUgPSB7XG4gIHZpc2liaWxpdHk6ICdoaWRkZW4nXG59O1xuZnVuY3Rpb24gSGVhZGVyKF9yZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIF9yZWYkcHJldkljb24gPSBfcmVmLnByZXZJY29uLFxuICAgIHByZXZJY29uID0gX3JlZiRwcmV2SWNvbiA9PT0gdm9pZCAwID8gXCJcXHUyMDM5XCIgOiBfcmVmJHByZXZJY29uLFxuICAgIF9yZWYkbmV4dEljb24gPSBfcmVmLm5leHRJY29uLFxuICAgIG5leHRJY29uID0gX3JlZiRuZXh0SWNvbiA9PT0gdm9pZCAwID8gXCJcXHUyMDNBXCIgOiBfcmVmJG5leHRJY29uLFxuICAgIF9yZWYkc3VwZXJQcmV2SWNvbiA9IF9yZWYuc3VwZXJQcmV2SWNvbixcbiAgICBzdXBlclByZXZJY29uID0gX3JlZiRzdXBlclByZXZJY29uID09PSB2b2lkIDAgPyBcIlxceEFCXCIgOiBfcmVmJHN1cGVyUHJldkljb24sXG4gICAgX3JlZiRzdXBlck5leHRJY29uID0gX3JlZi5zdXBlck5leHRJY29uLFxuICAgIHN1cGVyTmV4dEljb24gPSBfcmVmJHN1cGVyTmV4dEljb24gPT09IHZvaWQgMCA/IFwiXFx4QkJcIiA6IF9yZWYkc3VwZXJOZXh0SWNvbixcbiAgICBvblN1cGVyUHJldiA9IF9yZWYub25TdXBlclByZXYsXG4gICAgb25TdXBlck5leHQgPSBfcmVmLm9uU3VwZXJOZXh0LFxuICAgIG9uUHJldiA9IF9yZWYub25QcmV2LFxuICAgIG9uTmV4dCA9IF9yZWYub25OZXh0LFxuICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChQYW5lbENvbnRleHQpLFxuICAgIGhpZGVOZXh0QnRuID0gX1JlYWN0JHVzZUNvbnRleHQuaGlkZU5leHRCdG4sXG4gICAgaGlkZVByZXZCdG4gPSBfUmVhY3QkdXNlQ29udGV4dC5oaWRlUHJldkJ0bjtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IHByZWZpeENsc1xuICB9LCBvblN1cGVyUHJldiAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgdHlwZTogXCJidXR0b25cIixcbiAgICBvbkNsaWNrOiBvblN1cGVyUHJldixcbiAgICB0YWJJbmRleDogLTEsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN1cGVyLXByZXYtYnRuXCIpLFxuICAgIHN0eWxlOiBoaWRlUHJldkJ0biA/IEhJRERFTl9TVFlMRSA6IHt9XG4gIH0sIHN1cGVyUHJldkljb24pLCBvblByZXYgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgb25DbGljazogb25QcmV2LFxuICAgIHRhYkluZGV4OiAtMSxcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcHJldi1idG5cIiksXG4gICAgc3R5bGU6IGhpZGVQcmV2QnRuID8gSElEREVOX1NUWUxFIDoge31cbiAgfSwgcHJldkljb24pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXZpZXdcIilcbiAgfSwgY2hpbGRyZW4pLCBvbk5leHQgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgb25DbGljazogb25OZXh0LFxuICAgIHRhYkluZGV4OiAtMSxcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbmV4dC1idG5cIiksXG4gICAgc3R5bGU6IGhpZGVOZXh0QnRuID8gSElEREVOX1NUWUxFIDoge31cbiAgfSwgbmV4dEljb24pLCBvblN1cGVyTmV4dCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgdHlwZTogXCJidXR0b25cIixcbiAgICBvbkNsaWNrOiBvblN1cGVyTmV4dCxcbiAgICB0YWJJbmRleDogLTEsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN1cGVyLW5leHQtYnRuXCIpLFxuICAgIHN0eWxlOiBoaWRlTmV4dEJ0biA/IEhJRERFTl9TVFlMRSA6IHt9XG4gIH0sIHN1cGVyTmV4dEljb24pKTtcbn1cbmV4cG9ydCBkZWZhdWx0IEhlYWRlcjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBIZWFkZXIgZnJvbSAnLi4vSGVhZGVyJztcbmltcG9ydCB7IERFQ0FERV9ESVNUQU5DRV9DT1VOVCB9IGZyb20gJy4nO1xuaW1wb3J0IFBhbmVsQ29udGV4dCBmcm9tICcuLi8uLi9QYW5lbENvbnRleHQnO1xuZnVuY3Rpb24gRGVjYWRlSGVhZGVyKHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZyxcbiAgICB2aWV3RGF0ZSA9IHByb3BzLnZpZXdEYXRlLFxuICAgIG9uUHJldkRlY2FkZXMgPSBwcm9wcy5vblByZXZEZWNhZGVzLFxuICAgIG9uTmV4dERlY2FkZXMgPSBwcm9wcy5vbk5leHREZWNhZGVzO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFBhbmVsQ29udGV4dCksXG4gICAgaGlkZUhlYWRlciA9IF9SZWFjdCR1c2VDb250ZXh0LmhpZGVIZWFkZXI7XG4gIGlmIChoaWRlSGVhZGVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGhlYWRlclByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGVhZGVyXCIpO1xuICB2YXIgeWVhck51bWJlciA9IGdlbmVyYXRlQ29uZmlnLmdldFllYXIodmlld0RhdGUpO1xuICB2YXIgc3RhcnRZZWFyID0gTWF0aC5mbG9vcih5ZWFyTnVtYmVyIC8gREVDQURFX0RJU1RBTkNFX0NPVU5UKSAqIERFQ0FERV9ESVNUQU5DRV9DT1VOVDtcbiAgdmFyIGVuZFllYXIgPSBzdGFydFllYXIgKyBERUNBREVfRElTVEFOQ0VfQ09VTlQgLSAxO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSGVhZGVyLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBwcmVmaXhDbHM6IGhlYWRlclByZWZpeENscyxcbiAgICBvblN1cGVyUHJldjogb25QcmV2RGVjYWRlcyxcbiAgICBvblN1cGVyTmV4dDogb25OZXh0RGVjYWRlc1xuICB9KSwgc3RhcnRZZWFyLCBcIi1cIiwgZW5kWWVhcik7XG59XG5leHBvcnQgZGVmYXVsdCBEZWNhZGVIZWFkZXI7IiwiZXhwb3J0IGZ1bmN0aW9uIHNldFRpbWUoZ2VuZXJhdGVDb25maWcsIGRhdGUsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kKSB7XG4gIHZhciBuZXh0VGltZSA9IGdlbmVyYXRlQ29uZmlnLnNldEhvdXIoZGF0ZSwgaG91cik7XG4gIG5leHRUaW1lID0gZ2VuZXJhdGVDb25maWcuc2V0TWludXRlKG5leHRUaW1lLCBtaW51dGUpO1xuICBuZXh0VGltZSA9IGdlbmVyYXRlQ29uZmlnLnNldFNlY29uZChuZXh0VGltZSwgc2Vjb25kKTtcbiAgcmV0dXJuIG5leHRUaW1lO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldERhdGVUaW1lKGdlbmVyYXRlQ29uZmlnLCBkYXRlLCBkZWZhdWx0RGF0ZSkge1xuICBpZiAoIWRlZmF1bHREYXRlKSB7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cbiAgdmFyIG5ld0RhdGUgPSBkYXRlO1xuICBuZXdEYXRlID0gZ2VuZXJhdGVDb25maWcuc2V0SG91cihuZXdEYXRlLCBnZW5lcmF0ZUNvbmZpZy5nZXRIb3VyKGRlZmF1bHREYXRlKSk7XG4gIG5ld0RhdGUgPSBnZW5lcmF0ZUNvbmZpZy5zZXRNaW51dGUobmV3RGF0ZSwgZ2VuZXJhdGVDb25maWcuZ2V0TWludXRlKGRlZmF1bHREYXRlKSk7XG4gIG5ld0RhdGUgPSBnZW5lcmF0ZUNvbmZpZy5zZXRTZWNvbmQobmV3RGF0ZSwgZ2VuZXJhdGVDb25maWcuZ2V0U2Vjb25kKGRlZmF1bHREYXRlKSk7XG4gIHJldHVybiBuZXdEYXRlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldExvd2VyQm91bmRUaW1lKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBob3VyU3RlcCwgbWludXRlU3RlcCwgc2Vjb25kU3RlcCkge1xuICB2YXIgbG93ZXJCb3VuZEhvdXIgPSBNYXRoLmZsb29yKGhvdXIgLyBob3VyU3RlcCkgKiBob3VyU3RlcDtcbiAgaWYgKGxvd2VyQm91bmRIb3VyIDwgaG91cikge1xuICAgIHJldHVybiBbbG93ZXJCb3VuZEhvdXIsIDYwIC0gbWludXRlU3RlcCwgNjAgLSBzZWNvbmRTdGVwXTtcbiAgfVxuICB2YXIgbG93ZXJCb3VuZE1pbnV0ZSA9IE1hdGguZmxvb3IobWludXRlIC8gbWludXRlU3RlcCkgKiBtaW51dGVTdGVwO1xuICBpZiAobG93ZXJCb3VuZE1pbnV0ZSA8IG1pbnV0ZSkge1xuICAgIHJldHVybiBbbG93ZXJCb3VuZEhvdXIsIGxvd2VyQm91bmRNaW51dGUsIDYwIC0gc2Vjb25kU3RlcF07XG4gIH1cbiAgdmFyIGxvd2VyQm91bmRTZWNvbmQgPSBNYXRoLmZsb29yKHNlY29uZCAvIHNlY29uZFN0ZXApICogc2Vjb25kU3RlcDtcbiAgcmV0dXJuIFtsb3dlckJvdW5kSG91ciwgbG93ZXJCb3VuZE1pbnV0ZSwgbG93ZXJCb3VuZFNlY29uZF07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFzdERheShnZW5lcmF0ZUNvbmZpZywgZGF0ZSkge1xuICB2YXIgeWVhciA9IGdlbmVyYXRlQ29uZmlnLmdldFllYXIoZGF0ZSk7XG4gIHZhciBtb250aCA9IGdlbmVyYXRlQ29uZmlnLmdldE1vbnRoKGRhdGUpICsgMTtcbiAgdmFyIGVuZERhdGUgPSBnZW5lcmF0ZUNvbmZpZy5nZXRFbmREYXRlKGdlbmVyYXRlQ29uZmlnLmdldEZpeGVkRGF0ZShcIlwiLmNvbmNhdCh5ZWFyLCBcIi1cIikuY29uY2F0KG1vbnRoLCBcIi0wMVwiKSkpO1xuICB2YXIgbGFzdERheSA9IGdlbmVyYXRlQ29uZmlnLmdldERhdGUoZW5kRGF0ZSk7XG4gIHZhciBtb250aFNob3cgPSBtb250aCA8IDEwID8gXCIwXCIuY29uY2F0KG1vbnRoKSA6IFwiXCIuY29uY2F0KG1vbnRoKTtcbiAgcmV0dXJuIFwiXCIuY29uY2F0KHllYXIsIFwiLVwiKS5jb25jYXQobW9udGhTaG93LCBcIi1cIikuY29uY2F0KGxhc3REYXkpO1xufSIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUGFuZWxDb250ZXh0IGZyb20gJy4uL1BhbmVsQ29udGV4dCc7XG5pbXBvcnQgeyBnZXRMYXN0RGF5IH0gZnJvbSAnLi4vdXRpbHMvdGltZVV0aWwnO1xuaW1wb3J0IHsgZ2V0Q2VsbERhdGVEaXNhYmxlZCB9IGZyb20gJy4uL3V0aWxzL2RhdGVVdGlsJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFBhbmVsQm9keShfcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICBkaXNhYmxlZERhdGUgPSBfcmVmLmRpc2FibGVkRGF0ZSxcbiAgICBvblNlbGVjdCA9IF9yZWYub25TZWxlY3QsXG4gICAgcGlja2VyID0gX3JlZi5waWNrZXIsXG4gICAgcm93TnVtID0gX3JlZi5yb3dOdW0sXG4gICAgY29sTnVtID0gX3JlZi5jb2xOdW0sXG4gICAgcHJlZml4Q29sdW1uID0gX3JlZi5wcmVmaXhDb2x1bW4sXG4gICAgcm93Q2xhc3NOYW1lID0gX3JlZi5yb3dDbGFzc05hbWUsXG4gICAgYmFzZURhdGUgPSBfcmVmLmJhc2VEYXRlLFxuICAgIGdldENlbGxDbGFzc05hbWUgPSBfcmVmLmdldENlbGxDbGFzc05hbWUsXG4gICAgZ2V0Q2VsbFRleHQgPSBfcmVmLmdldENlbGxUZXh0LFxuICAgIGdldENlbGxOb2RlID0gX3JlZi5nZXRDZWxsTm9kZSxcbiAgICBnZXRDZWxsRGF0ZSA9IF9yZWYuZ2V0Q2VsbERhdGUsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBfcmVmLmdlbmVyYXRlQ29uZmlnLFxuICAgIHRpdGxlQ2VsbCA9IF9yZWYudGl0bGVDZWxsLFxuICAgIGhlYWRlckNlbGxzID0gX3JlZi5oZWFkZXJDZWxscztcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChQYW5lbENvbnRleHQpLFxuICAgIG9uRGF0ZU1vdXNlRW50ZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5vbkRhdGVNb3VzZUVudGVyLFxuICAgIG9uRGF0ZU1vdXNlTGVhdmUgPSBfUmVhY3QkdXNlQ29udGV4dC5vbkRhdGVNb3VzZUxlYXZlLFxuICAgIG1vZGUgPSBfUmVhY3QkdXNlQ29udGV4dC5tb2RlO1xuICB2YXIgY2VsbFByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2VsbFwiKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBCb2R5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHJvd3MgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dOdW07IGkgKz0gMSkge1xuICAgIHZhciByb3cgPSBbXTtcbiAgICB2YXIgcm93U3RhcnREYXRlID0gdm9pZCAwO1xuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICAgICAgdmFyIF9vYmplY3RTcHJlYWQyO1xuICAgICAgdmFyIG9mZnNldCA9IGkgKiBjb2xOdW0gKyBqO1xuICAgICAgdmFyIGN1cnJlbnREYXRlID0gZ2V0Q2VsbERhdGUoYmFzZURhdGUsIG9mZnNldCk7XG4gICAgICB2YXIgZGlzYWJsZWQgPSBnZXRDZWxsRGF0ZURpc2FibGVkKHtcbiAgICAgICAgY2VsbERhdGU6IGN1cnJlbnREYXRlLFxuICAgICAgICBtb2RlOiBtb2RlLFxuICAgICAgICBkaXNhYmxlZERhdGU6IGRpc2FibGVkRGF0ZSxcbiAgICAgICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnXG4gICAgICB9KTtcbiAgICAgIGlmIChqID09PSAwKSB7XG4gICAgICAgIHJvd1N0YXJ0RGF0ZSA9IGN1cnJlbnREYXRlO1xuICAgICAgICBpZiAocHJlZml4Q29sdW1uKSB7XG4gICAgICAgICAgcm93LnB1c2gocHJlZml4Q29sdW1uKHJvd1N0YXJ0RGF0ZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgdGl0bGUgPSB0aXRsZUNlbGwgJiYgdGl0bGVDZWxsKGN1cnJlbnREYXRlKTtcbiAgICAgIHJvdy5wdXNoKCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRkXCIsIHtcbiAgICAgICAga2V5OiBqLFxuICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjZWxsUHJlZml4Q2xzLCBfb2JqZWN0U3ByZWFkKChfb2JqZWN0U3ByZWFkMiA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX29iamVjdFNwcmVhZDIsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksIF9kZWZpbmVQcm9wZXJ0eShfb2JqZWN0U3ByZWFkMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItc3RhcnRcIiksIGdldENlbGxUZXh0KGN1cnJlbnREYXRlKSA9PT0gMSB8fCBwaWNrZXIgPT09ICd5ZWFyJyAmJiBOdW1iZXIodGl0bGUpICUgMTAgPT09IDApLCBfZGVmaW5lUHJvcGVydHkoX29iamVjdFNwcmVhZDIsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLWVuZFwiKSwgdGl0bGUgPT09IGdldExhc3REYXkoZ2VuZXJhdGVDb25maWcsIGN1cnJlbnREYXRlKSB8fCBwaWNrZXIgPT09ICd5ZWFyJyAmJiBOdW1iZXIodGl0bGUpICUgMTAgPT09IDkpLCBfb2JqZWN0U3ByZWFkMiksIGdldENlbGxDbGFzc05hbWUoY3VycmVudERhdGUpKSksXG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgICAgICAgb25TZWxlY3QoY3VycmVudERhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25Nb3VzZUVudGVyOiBmdW5jdGlvbiBvbk1vdXNlRW50ZXIoKSB7XG4gICAgICAgICAgaWYgKCFkaXNhYmxlZCAmJiBvbkRhdGVNb3VzZUVudGVyKSB7XG4gICAgICAgICAgICBvbkRhdGVNb3VzZUVudGVyKGN1cnJlbnREYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uTW91c2VMZWF2ZTogZnVuY3Rpb24gb25Nb3VzZUxlYXZlKCkge1xuICAgICAgICAgIGlmICghZGlzYWJsZWQgJiYgb25EYXRlTW91c2VMZWF2ZSkge1xuICAgICAgICAgICAgb25EYXRlTW91c2VMZWF2ZShjdXJyZW50RGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBnZXRDZWxsTm9kZSA/IGdldENlbGxOb2RlKGN1cnJlbnREYXRlKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1pbm5lclwiKVxuICAgICAgfSwgZ2V0Q2VsbFRleHQoY3VycmVudERhdGUpKSkpO1xuICAgIH07XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb2xOdW07IGogKz0gMSkge1xuICAgICAgX2xvb3AoKTtcbiAgICB9XG4gICAgcm93cy5wdXNoKCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRyXCIsIHtcbiAgICAgIGtleTogaSxcbiAgICAgIGNsYXNzTmFtZTogcm93Q2xhc3NOYW1lICYmIHJvd0NsYXNzTmFtZShyb3dTdGFydERhdGUpXG4gICAgfSwgcm93KSk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYm9keVwiKVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRhYmxlXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudFwiKVxuICB9LCBoZWFkZXJDZWxscyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRoZWFkXCIsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidHJcIiwgbnVsbCwgaGVhZGVyQ2VsbHMpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0Ym9keVwiLCBudWxsLCByb3dzKSkpO1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IERFQ0FERV9ESVNUQU5DRV9DT1VOVCwgREVDQURFX1VOSVRfRElGRiB9IGZyb20gJy4nO1xuaW1wb3J0IFBhbmVsQm9keSBmcm9tICcuLi9QYW5lbEJvZHknO1xuZXhwb3J0IHZhciBERUNBREVfQ09MX0NPVU5UID0gMztcbnZhciBERUNBREVfUk9XX0NPVU5UID0gNDtcbmZ1bmN0aW9uIERlY2FkZUJvZHkocHJvcHMpIHtcbiAgdmFyIERFQ0FERV9VTklUX0RJRkZfREVTID0gREVDQURFX1VOSVRfRElGRiAtIDE7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgdmlld0RhdGUgPSBwcm9wcy52aWV3RGF0ZSxcbiAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnO1xuICB2YXIgY2VsbFByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2VsbFwiKTtcbiAgdmFyIHllYXJOdW1iZXIgPSBnZW5lcmF0ZUNvbmZpZy5nZXRZZWFyKHZpZXdEYXRlKTtcbiAgdmFyIGRlY2FkZVllYXJOdW1iZXIgPSBNYXRoLmZsb29yKHllYXJOdW1iZXIgLyBERUNBREVfVU5JVF9ESUZGKSAqIERFQ0FERV9VTklUX0RJRkY7XG4gIHZhciBzdGFydERlY2FkZVllYXIgPSBNYXRoLmZsb29yKHllYXJOdW1iZXIgLyBERUNBREVfRElTVEFOQ0VfQ09VTlQpICogREVDQURFX0RJU1RBTkNFX0NPVU5UO1xuICB2YXIgZW5kRGVjYWRlWWVhciA9IHN0YXJ0RGVjYWRlWWVhciArIERFQ0FERV9ESVNUQU5DRV9DT1VOVCAtIDE7XG4gIHZhciBiYXNlRGVjYWRlWWVhciA9IGdlbmVyYXRlQ29uZmlnLnNldFllYXIodmlld0RhdGUsIHN0YXJ0RGVjYWRlWWVhciAtIE1hdGguY2VpbCgoREVDQURFX0NPTF9DT1VOVCAqIERFQ0FERV9ST1dfQ09VTlQgKiBERUNBREVfVU5JVF9ESUZGIC0gREVDQURFX0RJU1RBTkNFX0NPVU5UKSAvIDIpKTtcbiAgdmFyIGdldENlbGxDbGFzc05hbWUgPSBmdW5jdGlvbiBnZXRDZWxsQ2xhc3NOYW1lKGRhdGUpIHtcbiAgICB2YXIgX3JlZjtcbiAgICB2YXIgc3RhcnREZWNhZGVOdW1iZXIgPSBnZW5lcmF0ZUNvbmZpZy5nZXRZZWFyKGRhdGUpO1xuICAgIHZhciBlbmREZWNhZGVOdW1iZXIgPSBzdGFydERlY2FkZU51bWJlciArIERFQ0FERV9VTklUX0RJRkZfREVTO1xuICAgIHJldHVybiBfcmVmID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfcmVmLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1pbi12aWV3XCIpLCBzdGFydERlY2FkZVllYXIgPD0gc3RhcnREZWNhZGVOdW1iZXIgJiYgZW5kRGVjYWRlTnVtYmVyIDw9IGVuZERlY2FkZVllYXIpLCBfZGVmaW5lUHJvcGVydHkoX3JlZiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItc2VsZWN0ZWRcIiksIHN0YXJ0RGVjYWRlTnVtYmVyID09PSBkZWNhZGVZZWFyTnVtYmVyKSwgX3JlZjtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBhbmVsQm9keSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcm93TnVtOiBERUNBREVfUk9XX0NPVU5ULFxuICAgIGNvbE51bTogREVDQURFX0NPTF9DT1VOVCxcbiAgICBiYXNlRGF0ZTogYmFzZURlY2FkZVllYXIsXG4gICAgZ2V0Q2VsbFRleHQ6IGZ1bmN0aW9uIGdldENlbGxUZXh0KGRhdGUpIHtcbiAgICAgIHZhciBzdGFydERlY2FkZU51bWJlciA9IGdlbmVyYXRlQ29uZmlnLmdldFllYXIoZGF0ZSk7XG4gICAgICByZXR1cm4gXCJcIi5jb25jYXQoc3RhcnREZWNhZGVOdW1iZXIsIFwiLVwiKS5jb25jYXQoc3RhcnREZWNhZGVOdW1iZXIgKyBERUNBREVfVU5JVF9ESUZGX0RFUyk7XG4gICAgfSxcbiAgICBnZXRDZWxsQ2xhc3NOYW1lOiBnZXRDZWxsQ2xhc3NOYW1lLFxuICAgIGdldENlbGxEYXRlOiBmdW5jdGlvbiBnZXRDZWxsRGF0ZShkYXRlLCBvZmZzZXQpIHtcbiAgICAgIHJldHVybiBnZW5lcmF0ZUNvbmZpZy5hZGRZZWFyKGRhdGUsIG9mZnNldCAqIERFQ0FERV9VTklUX0RJRkYpO1xuICAgIH1cbiAgfSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgRGVjYWRlQm9keTsiLCJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbmltcG9ydCBpc1Zpc2libGUgZnJvbSBcInJjLXV0aWwvZXMvRG9tL2lzVmlzaWJsZVwiO1xudmFyIHNjcm9sbElkcyA9IG5ldyBNYXAoKTtcbi8qKiBUcmlnZ2VyIHdoZW4gZWxlbWVudCBpcyB2aXNpYmxlIGluIHZpZXcgKi9cbmV4cG9ydCBmdW5jdGlvbiB3YWl0RWxlbWVudFJlYWR5KGVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gIHZhciBpZDtcbiAgZnVuY3Rpb24gdHJ5T3JOZXh0RnJhbWUoKSB7XG4gICAgaWYgKGlzVmlzaWJsZShlbGVtZW50KSkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnlPck5leHRGcmFtZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHRyeU9yTmV4dEZyYW1lKCk7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmFmLmNhbmNlbChpZCk7XG4gIH07XG59XG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjcm9sbFRvKGVsZW1lbnQsIHRvLCBkdXJhdGlvbikge1xuICBpZiAoc2Nyb2xsSWRzLmdldChlbGVtZW50KSkge1xuICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHNjcm9sbElkcy5nZXQoZWxlbWVudCkpO1xuICB9XG4gIC8vIGp1bXAgdG8gdGFyZ2V0IGlmIGR1cmF0aW9uIHplcm9cbiAgaWYgKGR1cmF0aW9uIDw9IDApIHtcbiAgICBzY3JvbGxJZHMuc2V0KGVsZW1lbnQsIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IHRvO1xuICAgIH0pKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGRpZmZlcmVuY2UgPSB0byAtIGVsZW1lbnQuc2Nyb2xsVG9wO1xuICB2YXIgcGVyVGljayA9IGRpZmZlcmVuY2UgLyBkdXJhdGlvbiAqIDEwO1xuICBzY3JvbGxJZHMuc2V0KGVsZW1lbnQsIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgZWxlbWVudC5zY3JvbGxUb3AgKz0gcGVyVGljaztcbiAgICBpZiAoZWxlbWVudC5zY3JvbGxUb3AgIT09IHRvKSB7XG4gICAgICBzY3JvbGxUbyhlbGVtZW50LCB0bywgZHVyYXRpb24gLSAxMCk7XG4gICAgfVxuICB9KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlS2V5RG93bkhhbmRsZXIoZXZlbnQsIF9yZWYpIHtcbiAgdmFyIG9uTGVmdFJpZ2h0ID0gX3JlZi5vbkxlZnRSaWdodCxcbiAgICBvbkN0cmxMZWZ0UmlnaHQgPSBfcmVmLm9uQ3RybExlZnRSaWdodCxcbiAgICBvblVwRG93biA9IF9yZWYub25VcERvd24sXG4gICAgb25QYWdlVXBEb3duID0gX3JlZi5vblBhZ2VVcERvd24sXG4gICAgb25FbnRlciA9IF9yZWYub25FbnRlcjtcbiAgdmFyIHdoaWNoID0gZXZlbnQud2hpY2gsXG4gICAgY3RybEtleSA9IGV2ZW50LmN0cmxLZXksXG4gICAgbWV0YUtleSA9IGV2ZW50Lm1ldGFLZXk7XG4gIHN3aXRjaCAod2hpY2gpIHtcbiAgICBjYXNlIEtleUNvZGUuTEVGVDpcbiAgICAgIGlmIChjdHJsS2V5IHx8IG1ldGFLZXkpIHtcbiAgICAgICAgaWYgKG9uQ3RybExlZnRSaWdodCkge1xuICAgICAgICAgIG9uQ3RybExlZnRSaWdodCgtMSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAob25MZWZ0UmlnaHQpIHtcbiAgICAgICAgb25MZWZ0UmlnaHQoLTEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBicmVhaztcbiAgICBjYXNlIEtleUNvZGUuUklHSFQ6XG4gICAgICBpZiAoY3RybEtleSB8fCBtZXRhS2V5KSB7XG4gICAgICAgIGlmIChvbkN0cmxMZWZ0UmlnaHQpIHtcbiAgICAgICAgICBvbkN0cmxMZWZ0UmlnaHQoMSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAob25MZWZ0UmlnaHQpIHtcbiAgICAgICAgb25MZWZ0UmlnaHQoMSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgS2V5Q29kZS5VUDpcbiAgICAgIGlmIChvblVwRG93bikge1xuICAgICAgICBvblVwRG93bigtMSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgS2V5Q29kZS5ET1dOOlxuICAgICAgaWYgKG9uVXBEb3duKSB7XG4gICAgICAgIG9uVXBEb3duKDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBicmVhaztcbiAgICBjYXNlIEtleUNvZGUuUEFHRV9VUDpcbiAgICAgIGlmIChvblBhZ2VVcERvd24pIHtcbiAgICAgICAgb25QYWdlVXBEb3duKC0xKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBLZXlDb2RlLlBBR0VfRE9XTjpcbiAgICAgIGlmIChvblBhZ2VVcERvd24pIHtcbiAgICAgICAgb25QYWdlVXBEb3duKDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBicmVhaztcbiAgICBjYXNlIEtleUNvZGUuRU5URVI6XG4gICAgICBpZiAob25FbnRlcikge1xuICAgICAgICBvbkVudGVyKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbi8vID09PT09PT09PT09PT09PT09PT09PSBGb3JtYXQgPT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdEZvcm1hdChmb3JtYXQsIHBpY2tlciwgc2hvd1RpbWUsIHVzZTEySG91cnMpIHtcbiAgdmFyIG1lcmdlZEZvcm1hdCA9IGZvcm1hdDtcbiAgaWYgKCFtZXJnZWRGb3JtYXQpIHtcbiAgICBzd2l0Y2ggKHBpY2tlcikge1xuICAgICAgY2FzZSAndGltZSc6XG4gICAgICAgIG1lcmdlZEZvcm1hdCA9IHVzZTEySG91cnMgPyAnaGg6bW06c3MgYScgOiAnSEg6bW06c3MnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBtZXJnZWRGb3JtYXQgPSAnZ2dnZy13byc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICBtZXJnZWRGb3JtYXQgPSAnWVlZWS1NTSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncXVhcnRlcic6XG4gICAgICAgIG1lcmdlZEZvcm1hdCA9ICdZWVlZLVtRXVEnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBtZXJnZWRGb3JtYXQgPSAnWVlZWSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbWVyZ2VkRm9ybWF0ID0gc2hvd1RpbWUgPyAnWVlZWS1NTS1ERCBISDptbTpzcycgOiAnWVlZWS1NTS1ERCc7XG4gICAgfVxuICB9XG4gIHJldHVybiBtZXJnZWRGb3JtYXQ7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5wdXRTaXplKHBpY2tlciwgZm9ybWF0LCBnZW5lcmF0ZUNvbmZpZykge1xuICB2YXIgZGVmYXVsdFNpemUgPSBwaWNrZXIgPT09ICd0aW1lJyA/IDggOiAxMDtcbiAgdmFyIGxlbmd0aCA9IHR5cGVvZiBmb3JtYXQgPT09ICdmdW5jdGlvbicgPyBmb3JtYXQoZ2VuZXJhdGVDb25maWcuZ2V0Tm93KCkpLmxlbmd0aCA6IGZvcm1hdC5sZW5ndGg7XG4gIHJldHVybiBNYXRoLm1heChkZWZhdWx0U2l6ZSwgbGVuZ3RoKSArIDI7XG59XG52YXIgZ2xvYmFsQ2xpY2tGdW5jID0gbnVsbDtcbnZhciBjbGlja0NhbGxiYWNrcyA9IG5ldyBTZXQoKTtcbmV4cG9ydCBmdW5jdGlvbiBhZGRHbG9iYWxNb3VzZURvd25FdmVudChjYWxsYmFjaykge1xuICBpZiAoIWdsb2JhbENsaWNrRnVuYyAmJiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgIGdsb2JhbENsaWNrRnVuYyA9IGZ1bmN0aW9uIGdsb2JhbENsaWNrRnVuYyhlKSB7XG4gICAgICAvLyBDbG9uZSBhIG5ldyBsaXN0IHRvIGF2b2lkIHJlcGVhdCB0cmlnZ2VyIGV2ZW50c1xuICAgICAgX3RvQ29uc3VtYWJsZUFycmF5KGNsaWNrQ2FsbGJhY2tzKS5mb3JFYWNoKGZ1bmN0aW9uIChxdWV1ZUZ1bmMpIHtcbiAgICAgICAgcXVldWVGdW5jKGUpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZ2xvYmFsQ2xpY2tGdW5jKTtcbiAgfVxuICBjbGlja0NhbGxiYWNrcy5hZGQoY2FsbGJhY2spO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGNsaWNrQ2FsbGJhY2tzLmRlbGV0ZShjYWxsYmFjayk7XG4gICAgaWYgKGNsaWNrQ2FsbGJhY2tzLnNpemUgPT09IDApIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBnbG9iYWxDbGlja0Z1bmMpO1xuICAgICAgZ2xvYmFsQ2xpY2tGdW5jID0gbnVsbDtcbiAgICB9XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFyZ2V0RnJvbUV2ZW50KGUpIHtcbiAgdmFyIHRhcmdldCA9IGUudGFyZ2V0O1xuICAvLyBnZXQgdGFyZ2V0IGlmIGluIHNoYWRvdyBkb21cbiAgaWYgKGUuY29tcG9zZWQgJiYgdGFyZ2V0LnNoYWRvd1Jvb3QpIHtcbiAgICB2YXIgX2UkY29tcG9zZWRQYXRoO1xuICAgIHJldHVybiAoKF9lJGNvbXBvc2VkUGF0aCA9IGUuY29tcG9zZWRQYXRoKSA9PT0gbnVsbCB8fCBfZSRjb21wb3NlZFBhdGggPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lJGNvbXBvc2VkUGF0aC5jYWxsKGUpWzBdKSB8fCB0YXJnZXQ7XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn1cbi8vID09PT09PT09PT09PT09PT09PT09PT0gTW9kZSA9PT09PT09PT09PT09PT09PT09PT09XG52YXIgZ2V0WWVhck5leHRNb2RlID0gZnVuY3Rpb24gZ2V0WWVhck5leHRNb2RlKG5leHQpIHtcbiAgaWYgKG5leHQgPT09ICdtb250aCcgfHwgbmV4dCA9PT0gJ2RhdGUnKSB7XG4gICAgcmV0dXJuICd5ZWFyJztcbiAgfVxuICByZXR1cm4gbmV4dDtcbn07XG52YXIgZ2V0TW9udGhOZXh0TW9kZSA9IGZ1bmN0aW9uIGdldE1vbnRoTmV4dE1vZGUobmV4dCkge1xuICBpZiAobmV4dCA9PT0gJ2RhdGUnKSB7XG4gICAgcmV0dXJuICdtb250aCc7XG4gIH1cbiAgcmV0dXJuIG5leHQ7XG59O1xudmFyIGdldFF1YXJ0ZXJOZXh0TW9kZSA9IGZ1bmN0aW9uIGdldFF1YXJ0ZXJOZXh0TW9kZShuZXh0KSB7XG4gIGlmIChuZXh0ID09PSAnbW9udGgnIHx8IG5leHQgPT09ICdkYXRlJykge1xuICAgIHJldHVybiAncXVhcnRlcic7XG4gIH1cbiAgcmV0dXJuIG5leHQ7XG59O1xudmFyIGdldFdlZWtOZXh0TW9kZSA9IGZ1bmN0aW9uIGdldFdlZWtOZXh0TW9kZShuZXh0KSB7XG4gIGlmIChuZXh0ID09PSAnZGF0ZScpIHtcbiAgICByZXR1cm4gJ3dlZWsnO1xuICB9XG4gIHJldHVybiBuZXh0O1xufTtcbmV4cG9ydCB2YXIgUGlja2VyTW9kZU1hcCA9IHtcbiAgeWVhcjogZ2V0WWVhck5leHRNb2RlLFxuICBtb250aDogZ2V0TW9udGhOZXh0TW9kZSxcbiAgcXVhcnRlcjogZ2V0UXVhcnRlck5leHRNb2RlLFxuICB3ZWVrOiBnZXRXZWVrTmV4dE1vZGUsXG4gIHRpbWU6IG51bGwsXG4gIGRhdGU6IG51bGxcbn07XG5leHBvcnQgZnVuY3Rpb24gZWxlbWVudHNDb250YWlucyhlbGVtZW50cywgdGFyZ2V0KSB7XG4gIHJldHVybiBlbGVtZW50cy5zb21lKGZ1bmN0aW9uIChlbGUpIHtcbiAgICByZXR1cm4gZWxlICYmIGVsZS5jb250YWlucyh0YXJnZXQpO1xuICB9KTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBEZWNhZGVIZWFkZXIgZnJvbSAnLi9EZWNhZGVIZWFkZXInO1xuaW1wb3J0IERlY2FkZUJvZHksIHsgREVDQURFX0NPTF9DT1VOVCB9IGZyb20gJy4vRGVjYWRlQm9keSc7XG5pbXBvcnQgeyBjcmVhdGVLZXlEb3duSGFuZGxlciB9IGZyb20gJy4uLy4uL3V0aWxzL3VpVXRpbCc7XG5leHBvcnQgdmFyIERFQ0FERV9VTklUX0RJRkYgPSAxMDtcbmV4cG9ydCB2YXIgREVDQURFX0RJU1RBTkNFX0NPVU5UID0gREVDQURFX1VOSVRfRElGRiAqIDEwO1xuZnVuY3Rpb24gRGVjYWRlUGFuZWwocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBvblZpZXdEYXRlQ2hhbmdlID0gcHJvcHMub25WaWV3RGF0ZUNoYW5nZSxcbiAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnLFxuICAgIHZpZXdEYXRlID0gcHJvcHMudmlld0RhdGUsXG4gICAgb3BlcmF0aW9uUmVmID0gcHJvcHMub3BlcmF0aW9uUmVmLFxuICAgIG9uU2VsZWN0ID0gcHJvcHMub25TZWxlY3QsXG4gICAgb25QYW5lbENoYW5nZSA9IHByb3BzLm9uUGFuZWxDaGFuZ2U7XG4gIHZhciBwYW5lbFByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGVjYWRlLXBhbmVsXCIpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBLZXlib2FyZCA9PT09PT09PT09PT09PT09PT09PT09PVxuICBvcGVyYXRpb25SZWYuY3VycmVudCA9IHtcbiAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihldmVudCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUtleURvd25IYW5kbGVyKGV2ZW50LCB7XG4gICAgICAgIG9uTGVmdFJpZ2h0OiBmdW5jdGlvbiBvbkxlZnRSaWdodChkaWZmKSB7XG4gICAgICAgICAgb25TZWxlY3QoZ2VuZXJhdGVDb25maWcuYWRkWWVhcih2aWV3RGF0ZSwgZGlmZiAqIERFQ0FERV9VTklUX0RJRkYpLCAna2V5Jyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ3RybExlZnRSaWdodDogZnVuY3Rpb24gb25DdHJsTGVmdFJpZ2h0KGRpZmYpIHtcbiAgICAgICAgICBvblNlbGVjdChnZW5lcmF0ZUNvbmZpZy5hZGRZZWFyKHZpZXdEYXRlLCBkaWZmICogREVDQURFX0RJU1RBTkNFX0NPVU5UKSwgJ2tleScpO1xuICAgICAgICB9LFxuICAgICAgICBvblVwRG93bjogZnVuY3Rpb24gb25VcERvd24oZGlmZikge1xuICAgICAgICAgIG9uU2VsZWN0KGdlbmVyYXRlQ29uZmlnLmFkZFllYXIodmlld0RhdGUsIGRpZmYgKiBERUNBREVfVU5JVF9ESUZGICogREVDQURFX0NPTF9DT1VOVCksICdrZXknKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FbnRlcjogZnVuY3Rpb24gb25FbnRlcigpIHtcbiAgICAgICAgICBvblBhbmVsQ2hhbmdlKCd5ZWFyJywgdmlld0RhdGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09PT09IFZpZXcgT3BlcmF0aW9uID09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvbkRlY2FkZXNDaGFuZ2UgPSBmdW5jdGlvbiBvbkRlY2FkZXNDaGFuZ2UoZGlmZikge1xuICAgIHZhciBuZXdEYXRlID0gZ2VuZXJhdGVDb25maWcuYWRkWWVhcih2aWV3RGF0ZSwgZGlmZiAqIERFQ0FERV9ESVNUQU5DRV9DT1VOVCk7XG4gICAgb25WaWV3RGF0ZUNoYW5nZShuZXdEYXRlKTtcbiAgICBvblBhbmVsQ2hhbmdlKG51bGwsIG5ld0RhdGUpO1xuICB9O1xuICB2YXIgb25JbnRlcm5hbFNlbGVjdCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxTZWxlY3QoZGF0ZSkge1xuICAgIG9uU2VsZWN0KGRhdGUsICdtb3VzZScpO1xuICAgIG9uUGFuZWxDaGFuZ2UoJ3llYXInLCBkYXRlKTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IHBhbmVsUHJlZml4Q2xzXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERlY2FkZUhlYWRlciwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgb25QcmV2RGVjYWRlczogZnVuY3Rpb24gb25QcmV2RGVjYWRlcygpIHtcbiAgICAgIG9uRGVjYWRlc0NoYW5nZSgtMSk7XG4gICAgfSxcbiAgICBvbk5leHREZWNhZGVzOiBmdW5jdGlvbiBvbk5leHREZWNhZGVzKCkge1xuICAgICAgb25EZWNhZGVzQ2hhbmdlKDEpO1xuICAgIH1cbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEZWNhZGVCb2R5LCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBvblNlbGVjdDogb25JbnRlcm5hbFNlbGVjdFxuICB9KSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgRGVjYWRlUGFuZWw7IiwiaW1wb3J0IHsgREVDQURFX1VOSVRfRElGRiB9IGZyb20gJy4uL3BhbmVscy9EZWNhZGVQYW5lbC9pbmRleCc7XG5leHBvcnQgdmFyIFdFRUtfREFZX0NPVU5UID0gNztcbmV4cG9ydCBmdW5jdGlvbiBpc051bGxFcXVhbCh2YWx1ZTEsIHZhbHVlMikge1xuICBpZiAoIXZhbHVlMSAmJiAhdmFsdWUyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCF2YWx1ZTEgfHwgIXZhbHVlMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU2FtZURlY2FkZShnZW5lcmF0ZUNvbmZpZywgZGVjYWRlMSwgZGVjYWRlMikge1xuICB2YXIgZXF1YWwgPSBpc051bGxFcXVhbChkZWNhZGUxLCBkZWNhZGUyKTtcbiAgaWYgKHR5cGVvZiBlcXVhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGVxdWFsO1xuICB9XG4gIHZhciBudW0xID0gTWF0aC5mbG9vcihnZW5lcmF0ZUNvbmZpZy5nZXRZZWFyKGRlY2FkZTEpIC8gMTApO1xuICB2YXIgbnVtMiA9IE1hdGguZmxvb3IoZ2VuZXJhdGVDb25maWcuZ2V0WWVhcihkZWNhZGUyKSAvIDEwKTtcbiAgcmV0dXJuIG51bTEgPT09IG51bTI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTYW1lWWVhcihnZW5lcmF0ZUNvbmZpZywgeWVhcjEsIHllYXIyKSB7XG4gIHZhciBlcXVhbCA9IGlzTnVsbEVxdWFsKHllYXIxLCB5ZWFyMik7XG4gIGlmICh0eXBlb2YgZXF1YWwgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBlcXVhbDtcbiAgfVxuICByZXR1cm4gZ2VuZXJhdGVDb25maWcuZ2V0WWVhcih5ZWFyMSkgPT09IGdlbmVyYXRlQ29uZmlnLmdldFllYXIoeWVhcjIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFF1YXJ0ZXIoZ2VuZXJhdGVDb25maWcsIGRhdGUpIHtcbiAgdmFyIHF1b3RhID0gTWF0aC5mbG9vcihnZW5lcmF0ZUNvbmZpZy5nZXRNb250aChkYXRlKSAvIDMpO1xuICByZXR1cm4gcXVvdGEgKyAxO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU2FtZVF1YXJ0ZXIoZ2VuZXJhdGVDb25maWcsIHF1YXJ0ZXIxLCBxdWFydGVyMikge1xuICB2YXIgZXF1YWwgPSBpc051bGxFcXVhbChxdWFydGVyMSwgcXVhcnRlcjIpO1xuICBpZiAodHlwZW9mIGVxdWFsID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gZXF1YWw7XG4gIH1cbiAgcmV0dXJuIGlzU2FtZVllYXIoZ2VuZXJhdGVDb25maWcsIHF1YXJ0ZXIxLCBxdWFydGVyMikgJiYgZ2V0UXVhcnRlcihnZW5lcmF0ZUNvbmZpZywgcXVhcnRlcjEpID09PSBnZXRRdWFydGVyKGdlbmVyYXRlQ29uZmlnLCBxdWFydGVyMik7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTYW1lTW9udGgoZ2VuZXJhdGVDb25maWcsIG1vbnRoMSwgbW9udGgyKSB7XG4gIHZhciBlcXVhbCA9IGlzTnVsbEVxdWFsKG1vbnRoMSwgbW9udGgyKTtcbiAgaWYgKHR5cGVvZiBlcXVhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGVxdWFsO1xuICB9XG4gIHJldHVybiBpc1NhbWVZZWFyKGdlbmVyYXRlQ29uZmlnLCBtb250aDEsIG1vbnRoMikgJiYgZ2VuZXJhdGVDb25maWcuZ2V0TW9udGgobW9udGgxKSA9PT0gZ2VuZXJhdGVDb25maWcuZ2V0TW9udGgobW9udGgyKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1NhbWVEYXRlKGdlbmVyYXRlQ29uZmlnLCBkYXRlMSwgZGF0ZTIpIHtcbiAgdmFyIGVxdWFsID0gaXNOdWxsRXF1YWwoZGF0ZTEsIGRhdGUyKTtcbiAgaWYgKHR5cGVvZiBlcXVhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGVxdWFsO1xuICB9XG4gIHJldHVybiBnZW5lcmF0ZUNvbmZpZy5nZXRZZWFyKGRhdGUxKSA9PT0gZ2VuZXJhdGVDb25maWcuZ2V0WWVhcihkYXRlMikgJiYgZ2VuZXJhdGVDb25maWcuZ2V0TW9udGgoZGF0ZTEpID09PSBnZW5lcmF0ZUNvbmZpZy5nZXRNb250aChkYXRlMikgJiYgZ2VuZXJhdGVDb25maWcuZ2V0RGF0ZShkYXRlMSkgPT09IGdlbmVyYXRlQ29uZmlnLmdldERhdGUoZGF0ZTIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU2FtZVRpbWUoZ2VuZXJhdGVDb25maWcsIHRpbWUxLCB0aW1lMikge1xuICB2YXIgZXF1YWwgPSBpc051bGxFcXVhbCh0aW1lMSwgdGltZTIpO1xuICBpZiAodHlwZW9mIGVxdWFsID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gZXF1YWw7XG4gIH1cbiAgcmV0dXJuIGdlbmVyYXRlQ29uZmlnLmdldEhvdXIodGltZTEpID09PSBnZW5lcmF0ZUNvbmZpZy5nZXRIb3VyKHRpbWUyKSAmJiBnZW5lcmF0ZUNvbmZpZy5nZXRNaW51dGUodGltZTEpID09PSBnZW5lcmF0ZUNvbmZpZy5nZXRNaW51dGUodGltZTIpICYmIGdlbmVyYXRlQ29uZmlnLmdldFNlY29uZCh0aW1lMSkgPT09IGdlbmVyYXRlQ29uZmlnLmdldFNlY29uZCh0aW1lMik7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTYW1lV2VlayhnZW5lcmF0ZUNvbmZpZywgbG9jYWxlLCBkYXRlMSwgZGF0ZTIpIHtcbiAgdmFyIGVxdWFsID0gaXNOdWxsRXF1YWwoZGF0ZTEsIGRhdGUyKTtcbiAgaWYgKHR5cGVvZiBlcXVhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGVxdWFsO1xuICB9XG4gIHJldHVybiBnZW5lcmF0ZUNvbmZpZy5sb2NhbGUuZ2V0V2Vlayhsb2NhbGUsIGRhdGUxKSA9PT0gZ2VuZXJhdGVDb25maWcubG9jYWxlLmdldFdlZWsobG9jYWxlLCBkYXRlMik7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFcXVhbChnZW5lcmF0ZUNvbmZpZywgdmFsdWUxLCB2YWx1ZTIpIHtcbiAgcmV0dXJuIGlzU2FtZURhdGUoZ2VuZXJhdGVDb25maWcsIHZhbHVlMSwgdmFsdWUyKSAmJiBpc1NhbWVUaW1lKGdlbmVyYXRlQ29uZmlnLCB2YWx1ZTEsIHZhbHVlMik7XG59XG4vKiogQmV0d2VlbiBpbiBkYXRlIGJ1dCBub3QgZXF1YWwgb2YgZGF0ZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5SYW5nZShnZW5lcmF0ZUNvbmZpZywgc3RhcnREYXRlLCBlbmREYXRlLCBjdXJyZW50KSB7XG4gIGlmICghc3RhcnREYXRlIHx8ICFlbmREYXRlIHx8ICFjdXJyZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAhaXNTYW1lRGF0ZShnZW5lcmF0ZUNvbmZpZywgc3RhcnREYXRlLCBjdXJyZW50KSAmJiAhaXNTYW1lRGF0ZShnZW5lcmF0ZUNvbmZpZywgZW5kRGF0ZSwgY3VycmVudCkgJiYgZ2VuZXJhdGVDb25maWcuaXNBZnRlcihjdXJyZW50LCBzdGFydERhdGUpICYmIGdlbmVyYXRlQ29uZmlnLmlzQWZ0ZXIoZW5kRGF0ZSwgY3VycmVudCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0V2Vla1N0YXJ0RGF0ZShsb2NhbGUsIGdlbmVyYXRlQ29uZmlnLCB2YWx1ZSkge1xuICB2YXIgd2Vla0ZpcnN0RGF5ID0gZ2VuZXJhdGVDb25maWcubG9jYWxlLmdldFdlZWtGaXJzdERheShsb2NhbGUpO1xuICB2YXIgbW9udGhTdGFydERhdGUgPSBnZW5lcmF0ZUNvbmZpZy5zZXREYXRlKHZhbHVlLCAxKTtcbiAgdmFyIHN0YXJ0RGF0ZVdlZWtEYXkgPSBnZW5lcmF0ZUNvbmZpZy5nZXRXZWVrRGF5KG1vbnRoU3RhcnREYXRlKTtcbiAgdmFyIGFsaWduU3RhcnREYXRlID0gZ2VuZXJhdGVDb25maWcuYWRkRGF0ZShtb250aFN0YXJ0RGF0ZSwgd2Vla0ZpcnN0RGF5IC0gc3RhcnREYXRlV2Vla0RheSk7XG4gIGlmIChnZW5lcmF0ZUNvbmZpZy5nZXRNb250aChhbGlnblN0YXJ0RGF0ZSkgPT09IGdlbmVyYXRlQ29uZmlnLmdldE1vbnRoKHZhbHVlKSAmJiBnZW5lcmF0ZUNvbmZpZy5nZXREYXRlKGFsaWduU3RhcnREYXRlKSA+IDEpIHtcbiAgICBhbGlnblN0YXJ0RGF0ZSA9IGdlbmVyYXRlQ29uZmlnLmFkZERhdGUoYWxpZ25TdGFydERhdGUsIC03KTtcbiAgfVxuICByZXR1cm4gYWxpZ25TdGFydERhdGU7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2xvc2luZ1ZpZXdEYXRlKHZpZXdEYXRlLCBwaWNrZXIsIGdlbmVyYXRlQ29uZmlnKSB7XG4gIHZhciBvZmZzZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IDE7XG4gIHN3aXRjaCAocGlja2VyKSB7XG4gICAgY2FzZSAneWVhcic6XG4gICAgICByZXR1cm4gZ2VuZXJhdGVDb25maWcuYWRkWWVhcih2aWV3RGF0ZSwgb2Zmc2V0ICogMTApO1xuICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgIHJldHVybiBnZW5lcmF0ZUNvbmZpZy5hZGRZZWFyKHZpZXdEYXRlLCBvZmZzZXQpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZ2VuZXJhdGVDb25maWcuYWRkTW9udGgodmlld0RhdGUsIG9mZnNldCk7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRWYWx1ZSh2YWx1ZSwgX3JlZikge1xuICB2YXIgZ2VuZXJhdGVDb25maWcgPSBfcmVmLmdlbmVyYXRlQ29uZmlnLFxuICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlLFxuICAgIGZvcm1hdCA9IF9yZWYuZm9ybWF0O1xuICByZXR1cm4gdHlwZW9mIGZvcm1hdCA9PT0gJ2Z1bmN0aW9uJyA/IGZvcm1hdCh2YWx1ZSkgOiBnZW5lcmF0ZUNvbmZpZy5sb2NhbGUuZm9ybWF0KGxvY2FsZS5sb2NhbGUsIHZhbHVlLCBmb3JtYXQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmFsdWUodmFsdWUsIF9yZWYyKSB7XG4gIHZhciBnZW5lcmF0ZUNvbmZpZyA9IF9yZWYyLmdlbmVyYXRlQ29uZmlnLFxuICAgIGxvY2FsZSA9IF9yZWYyLmxvY2FsZSxcbiAgICBmb3JtYXRMaXN0ID0gX3JlZjIuZm9ybWF0TGlzdDtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgZm9ybWF0TGlzdFswXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBnZW5lcmF0ZUNvbmZpZy5sb2NhbGUucGFyc2UobG9jYWxlLmxvY2FsZSwgdmFsdWUsIGZvcm1hdExpc3QpO1xufVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2VsbERhdGVEaXNhYmxlZChfcmVmMykge1xuICB2YXIgY2VsbERhdGUgPSBfcmVmMy5jZWxsRGF0ZSxcbiAgICBtb2RlID0gX3JlZjMubW9kZSxcbiAgICBkaXNhYmxlZERhdGUgPSBfcmVmMy5kaXNhYmxlZERhdGUsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBfcmVmMy5nZW5lcmF0ZUNvbmZpZztcbiAgaWYgKCFkaXNhYmxlZERhdGUpIHJldHVybiBmYWxzZTtcbiAgLy8gV2hldGhlciBjZWxsRGF0ZSBpcyBkaXNhYmxlZCBpbiByYW5nZVxuICB2YXIgZ2V0RGlzYWJsZWRGcm9tUmFuZ2UgPSBmdW5jdGlvbiBnZXREaXNhYmxlZEZyb21SYW5nZShjdXJyZW50TW9kZSwgc3RhcnQsIGVuZCkge1xuICAgIHZhciBjdXJyZW50ID0gc3RhcnQ7XG4gICAgd2hpbGUgKGN1cnJlbnQgPD0gZW5kKSB7XG4gICAgICB2YXIgZGF0ZSA9IHZvaWQgMDtcbiAgICAgIHN3aXRjaCAoY3VycmVudE1vZGUpIHtcbiAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgZGF0ZSA9IGdlbmVyYXRlQ29uZmlnLnNldERhdGUoY2VsbERhdGUsIGN1cnJlbnQpO1xuICAgICAgICAgICAgaWYgKCFkaXNhYmxlZERhdGUoZGF0ZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgZGF0ZSA9IGdlbmVyYXRlQ29uZmlnLnNldE1vbnRoKGNlbGxEYXRlLCBjdXJyZW50KTtcbiAgICAgICAgICAgIGlmICghZ2V0Q2VsbERhdGVEaXNhYmxlZCh7XG4gICAgICAgICAgICAgIGNlbGxEYXRlOiBkYXRlLFxuICAgICAgICAgICAgICBtb2RlOiAnbW9udGgnLFxuICAgICAgICAgICAgICBnZW5lcmF0ZUNvbmZpZzogZ2VuZXJhdGVDb25maWcsXG4gICAgICAgICAgICAgIGRpc2FibGVkRGF0ZTogZGlzYWJsZWREYXRlXG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRhdGUgPSBnZW5lcmF0ZUNvbmZpZy5zZXRZZWFyKGNlbGxEYXRlLCBjdXJyZW50KTtcbiAgICAgICAgICAgIGlmICghZ2V0Q2VsbERhdGVEaXNhYmxlZCh7XG4gICAgICAgICAgICAgIGNlbGxEYXRlOiBkYXRlLFxuICAgICAgICAgICAgICBtb2RlOiAneWVhcicsXG4gICAgICAgICAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZyxcbiAgICAgICAgICAgICAgZGlzYWJsZWREYXRlOiBkaXNhYmxlZERhdGVcbiAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIHN3aXRjaCAobW9kZSkge1xuICAgIGNhc2UgJ2RhdGUnOlxuICAgIGNhc2UgJ3dlZWsnOlxuICAgICAge1xuICAgICAgICByZXR1cm4gZGlzYWJsZWREYXRlKGNlbGxEYXRlKTtcbiAgICAgIH1cbiAgICBjYXNlICdtb250aCc6XG4gICAgICB7XG4gICAgICAgIHZhciBzdGFydERhdGUgPSAxO1xuICAgICAgICB2YXIgZW5kRGF0ZSA9IGdlbmVyYXRlQ29uZmlnLmdldERhdGUoZ2VuZXJhdGVDb25maWcuZ2V0RW5kRGF0ZShjZWxsRGF0ZSkpO1xuICAgICAgICByZXR1cm4gZ2V0RGlzYWJsZWRGcm9tUmFuZ2UoJ2RhdGUnLCBzdGFydERhdGUsIGVuZERhdGUpO1xuICAgICAgfVxuICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAge1xuICAgICAgICB2YXIgc3RhcnRNb250aCA9IE1hdGguZmxvb3IoZ2VuZXJhdGVDb25maWcuZ2V0TW9udGgoY2VsbERhdGUpIC8gMykgKiAzO1xuICAgICAgICB2YXIgZW5kTW9udGggPSBzdGFydE1vbnRoICsgMjtcbiAgICAgICAgcmV0dXJuIGdldERpc2FibGVkRnJvbVJhbmdlKCdtb250aCcsIHN0YXJ0TW9udGgsIGVuZE1vbnRoKTtcbiAgICAgIH1cbiAgICBjYXNlICd5ZWFyJzpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIGdldERpc2FibGVkRnJvbVJhbmdlKCdtb250aCcsIDAsIDExKTtcbiAgICAgIH1cbiAgICBjYXNlICdkZWNhZGUnOlxuICAgICAge1xuICAgICAgICB2YXIgeWVhciA9IGdlbmVyYXRlQ29uZmlnLmdldFllYXIoY2VsbERhdGUpO1xuICAgICAgICB2YXIgc3RhcnRZZWFyID0gTWF0aC5mbG9vcih5ZWFyIC8gREVDQURFX1VOSVRfRElGRikgKiBERUNBREVfVU5JVF9ESUZGO1xuICAgICAgICB2YXIgZW5kWWVhciA9IHN0YXJ0WWVhciArIERFQ0FERV9VTklUX0RJRkYgLSAxO1xuICAgICAgICByZXR1cm4gZ2V0RGlzYWJsZWRGcm9tUmFuZ2UoJ3llYXInLCBzdGFydFllYXIsIGVuZFllYXIpO1xuICAgICAgfVxuICB9XG59IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEhlYWRlciBmcm9tICcuLi9IZWFkZXInO1xuaW1wb3J0IFBhbmVsQ29udGV4dCBmcm9tICcuLi8uLi9QYW5lbENvbnRleHQnO1xuaW1wb3J0IHsgZm9ybWF0VmFsdWUgfSBmcm9tICcuLi8uLi91dGlscy9kYXRlVXRpbCc7XG5mdW5jdGlvbiBUaW1lSGVhZGVyKHByb3BzKSB7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoUGFuZWxDb250ZXh0KSxcbiAgICBoaWRlSGVhZGVyID0gX1JlYWN0JHVzZUNvbnRleHQuaGlkZUhlYWRlcjtcbiAgaWYgKGhpZGVIZWFkZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGdlbmVyYXRlQ29uZmlnID0gcHJvcHMuZ2VuZXJhdGVDb25maWcsXG4gICAgbG9jYWxlID0gcHJvcHMubG9jYWxlLFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgZm9ybWF0ID0gcHJvcHMuZm9ybWF0O1xuICB2YXIgaGVhZGVyUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkZXJcIik7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChIZWFkZXIsIHtcbiAgICBwcmVmaXhDbHM6IGhlYWRlclByZWZpeENsc1xuICB9LCB2YWx1ZSA/IGZvcm1hdFZhbHVlKHZhbHVlLCB7XG4gICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgZm9ybWF0OiBmb3JtYXQsXG4gICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnXG4gIH0pIDogXCJcXHhBMFwiKTtcbn1cbmV4cG9ydCBkZWZhdWx0IFRpbWVIZWFkZXI7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZiwgdXNlTGF5b3V0RWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBzY3JvbGxUbywgd2FpdEVsZW1lbnRSZWFkeSB9IGZyb20gJy4uLy4uL3V0aWxzL3VpVXRpbCc7XG5pbXBvcnQgUGFuZWxDb250ZXh0IGZyb20gJy4uLy4uL1BhbmVsQ29udGV4dCc7XG5mdW5jdGlvbiBUaW1lVW5pdENvbHVtbihwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHVuaXRzID0gcHJvcHMudW5pdHMsXG4gICAgb25TZWxlY3QgPSBwcm9wcy5vblNlbGVjdCxcbiAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgIGFjdGl2ZSA9IHByb3BzLmFjdGl2ZSxcbiAgICBoaWRlRGlzYWJsZWRPcHRpb25zID0gcHJvcHMuaGlkZURpc2FibGVkT3B0aW9ucztcbiAgdmFyIGNlbGxQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNlbGxcIik7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoUGFuZWxDb250ZXh0KSxcbiAgICBvcGVuID0gX1JlYWN0JHVzZUNvbnRleHQub3BlbjtcbiAgdmFyIHVsUmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgbGlSZWZzID0gdXNlUmVmKG5ldyBNYXAoKSk7XG4gIHZhciBzY3JvbGxSZWYgPSB1c2VSZWYoKTtcbiAgLy8gYHVzZUxheW91dEVmZmVjdGAgaGVyZSB0byBhdm9pZCBibGluayBieSBkdXJhdGlvbiBpcyAwXG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxpID0gbGlSZWZzLmN1cnJlbnQuZ2V0KHZhbHVlKTtcbiAgICBpZiAobGkgJiYgb3BlbiAhPT0gZmFsc2UpIHtcbiAgICAgIHNjcm9sbFRvKHVsUmVmLmN1cnJlbnQsIGxpLm9mZnNldFRvcCwgMTIwKTtcbiAgICB9XG4gIH0sIFt2YWx1ZV0pO1xuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChvcGVuKSB7XG4gICAgICB2YXIgbGkgPSBsaVJlZnMuY3VycmVudC5nZXQodmFsdWUpO1xuICAgICAgaWYgKGxpKSB7XG4gICAgICAgIHNjcm9sbFJlZi5jdXJyZW50ID0gd2FpdEVsZW1lbnRSZWFkeShsaSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNjcm9sbFRvKHVsUmVmLmN1cnJlbnQsIGxpLm9mZnNldFRvcCwgMCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9zY3JvbGxSZWYkY3VycmVudDtcbiAgICAgIChfc2Nyb2xsUmVmJGN1cnJlbnQgPSBzY3JvbGxSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3Njcm9sbFJlZiRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfc2Nyb2xsUmVmJGN1cnJlbnQuY2FsbChzY3JvbGxSZWYpO1xuICAgIH07XG4gIH0sIFtvcGVuXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb2x1bW5cIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb2x1bW4tYWN0aXZlXCIpLCBhY3RpdmUpKSxcbiAgICByZWY6IHVsUmVmLFxuICAgIHN0eWxlOiB7XG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuICAgIH1cbiAgfSwgdW5pdHMubWFwKGZ1bmN0aW9uICh1bml0KSB7XG4gICAgdmFyIF9jbGFzc05hbWVzMjtcbiAgICBpZiAoaGlkZURpc2FibGVkT3B0aW9ucyAmJiB1bml0LmRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAga2V5OiB1bml0LnZhbHVlLFxuICAgICAgcmVmOiBmdW5jdGlvbiByZWYoZWxlbWVudCkge1xuICAgICAgICBsaVJlZnMuY3VycmVudC5zZXQodW5pdC52YWx1ZSwgZWxlbWVudCk7XG4gICAgICB9LFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNlbGxQcmVmaXhDbHMsIChfY2xhc3NOYW1lczIgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItZGlzYWJsZWRcIiksIHVuaXQuZGlzYWJsZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1zZWxlY3RlZFwiKSwgdmFsdWUgPT09IHVuaXQudmFsdWUpLCBfY2xhc3NOYW1lczIpKSxcbiAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgIGlmICh1bml0LmRpc2FibGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG9uU2VsZWN0KHVuaXQudmFsdWUpO1xuICAgICAgfVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItaW5uZXJcIilcbiAgICB9LCB1bml0LmxhYmVsKSk7XG4gIH0pKTtcbn1cbmV4cG9ydCBkZWZhdWx0IFRpbWVVbml0Q29sdW1uOyIsImV4cG9ydCBmdW5jdGlvbiBsZWZ0UGFkKHN0ciwgbGVuZ3RoKSB7XG4gIHZhciBmaWxsID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAnMCc7XG4gIHZhciBjdXJyZW50ID0gU3RyaW5nKHN0cik7XG4gIHdoaWxlIChjdXJyZW50Lmxlbmd0aCA8IGxlbmd0aCkge1xuICAgIGN1cnJlbnQgPSBcIlwiLmNvbmNhdChmaWxsKS5jb25jYXQoc3RyKTtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn1cbmV4cG9ydCB2YXIgdHVwbGUgPSBmdW5jdGlvbiB0dXBsZSgpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuICByZXR1cm4gYXJncztcbn07XG5leHBvcnQgZnVuY3Rpb24gdG9BcnJheSh2YWwpIHtcbiAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF07XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXREYXRhT3JBcmlhUHJvcHMocHJvcHMpIHtcbiAgdmFyIHJldFByb3BzID0ge307XG4gIE9iamVjdC5rZXlzKHByb3BzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoKGtleS5zdWJzdHIoMCwgNSkgPT09ICdkYXRhLScgfHwga2V5LnN1YnN0cigwLCA1KSA9PT0gJ2FyaWEtJyB8fCBrZXkgPT09ICdyb2xlJyB8fCBrZXkgPT09ICduYW1lJykgJiYga2V5LnN1YnN0cigwLCA3KSAhPT0gJ2RhdGEtX18nKSB7XG4gICAgICByZXRQcm9wc1trZXldID0gcHJvcHNba2V5XTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmV0UHJvcHM7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWUodmFsdWVzLCBpbmRleCkge1xuICByZXR1cm4gdmFsdWVzID8gdmFsdWVzW2luZGV4XSA6IG51bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlVmFsdWVzKHZhbHVlcywgdmFsdWUsIGluZGV4KSB7XG4gIHZhciBuZXdWYWx1ZXMgPSBbZ2V0VmFsdWUodmFsdWVzLCAwKSwgZ2V0VmFsdWUodmFsdWVzLCAxKV07XG4gIG5ld1ZhbHVlc1tpbmRleF0gPSB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgPyB2YWx1ZShuZXdWYWx1ZXNbaW5kZXhdKSA6IHZhbHVlO1xuICBpZiAoIW5ld1ZhbHVlc1swXSAmJiAhbmV3VmFsdWVzWzFdKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIG5ld1ZhbHVlcztcbn0iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlTWVtbyBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZW1vXCI7XG5pbXBvcnQgVGltZVVuaXRDb2x1bW4gZnJvbSAnLi9UaW1lVW5pdENvbHVtbic7XG5pbXBvcnQgeyBsZWZ0UGFkIH0gZnJvbSAnLi4vLi4vdXRpbHMvbWlzY1V0aWwnO1xuaW1wb3J0IHsgc2V0VGltZSBhcyB1dGlsU2V0VGltZSB9IGZyb20gJy4uLy4uL3V0aWxzL3RpbWVVdGlsJztcbmZ1bmN0aW9uIHNob3VsZFVuaXRzVXBkYXRlKHByZXZVbml0cywgbmV4dFVuaXRzKSB7XG4gIGlmIChwcmV2VW5pdHMubGVuZ3RoICE9PSBuZXh0VW5pdHMubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcbiAgLy8gaWYgYW55IHVuaXQncyBkaXNhYmxlZCBzdGF0dXMgaXMgZGlmZmVyZW50LCB0aGUgdW5pdHMgc2hvdWxkIGJlIHJlLWV2YWx1dGVkXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJldlVuaXRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKHByZXZVbml0c1tpXS5kaXNhYmxlZCAhPT0gbmV4dFVuaXRzW2ldLmRpc2FibGVkKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBnZW5lcmF0ZVVuaXRzKHN0YXJ0LCBlbmQsIHN0ZXAsIGRpc2FibGVkVW5pdHMpIHtcbiAgdmFyIHVuaXRzID0gW107XG4gIHZhciBpbnRlZ2VyU3RlcCA9IHN0ZXAgPj0gMSA/IHN0ZXAgfCAwIDogMTtcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSArPSBpbnRlZ2VyU3RlcCkge1xuICAgIHVuaXRzLnB1c2goe1xuICAgICAgbGFiZWw6IGxlZnRQYWQoaSwgMiksXG4gICAgICB2YWx1ZTogaSxcbiAgICAgIGRpc2FibGVkOiAoZGlzYWJsZWRVbml0cyB8fCBbXSkuaW5jbHVkZXMoaSlcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdW5pdHM7XG59XG5mdW5jdGlvbiBUaW1lQm9keShwcm9wcykge1xuICB2YXIgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZyxcbiAgICBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgb3BlcmF0aW9uUmVmID0gcHJvcHMub3BlcmF0aW9uUmVmLFxuICAgIGFjdGl2ZUNvbHVtbkluZGV4ID0gcHJvcHMuYWN0aXZlQ29sdW1uSW5kZXgsXG4gICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICBzaG93SG91ciA9IHByb3BzLnNob3dIb3VyLFxuICAgIHNob3dNaW51dGUgPSBwcm9wcy5zaG93TWludXRlLFxuICAgIHNob3dTZWNvbmQgPSBwcm9wcy5zaG93U2Vjb25kLFxuICAgIHVzZTEySG91cnMgPSBwcm9wcy51c2UxMkhvdXJzLFxuICAgIF9wcm9wcyRob3VyU3RlcCA9IHByb3BzLmhvdXJTdGVwLFxuICAgIGhvdXJTdGVwID0gX3Byb3BzJGhvdXJTdGVwID09PSB2b2lkIDAgPyAxIDogX3Byb3BzJGhvdXJTdGVwLFxuICAgIF9wcm9wcyRtaW51dGVTdGVwID0gcHJvcHMubWludXRlU3RlcCxcbiAgICBtaW51dGVTdGVwID0gX3Byb3BzJG1pbnV0ZVN0ZXAgPT09IHZvaWQgMCA/IDEgOiBfcHJvcHMkbWludXRlU3RlcCxcbiAgICBfcHJvcHMkc2Vjb25kU3RlcCA9IHByb3BzLnNlY29uZFN0ZXAsXG4gICAgc2Vjb25kU3RlcCA9IF9wcm9wcyRzZWNvbmRTdGVwID09PSB2b2lkIDAgPyAxIDogX3Byb3BzJHNlY29uZFN0ZXAsXG4gICAgZGlzYWJsZWRIb3VycyA9IHByb3BzLmRpc2FibGVkSG91cnMsXG4gICAgZGlzYWJsZWRNaW51dGVzID0gcHJvcHMuZGlzYWJsZWRNaW51dGVzLFxuICAgIGRpc2FibGVkU2Vjb25kcyA9IHByb3BzLmRpc2FibGVkU2Vjb25kcyxcbiAgICBkaXNhYmxlZFRpbWUgPSBwcm9wcy5kaXNhYmxlZFRpbWUsXG4gICAgaGlkZURpc2FibGVkT3B0aW9ucyA9IHByb3BzLmhpZGVEaXNhYmxlZE9wdGlvbnMsXG4gICAgb25TZWxlY3QgPSBwcm9wcy5vblNlbGVjdDtcbiAgLy8gTWlzY1xuICB2YXIgY29sdW1ucyA9IFtdO1xuICB2YXIgY29udGVudFByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudFwiKTtcbiAgdmFyIGNvbHVtblByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdGltZS1wYW5lbFwiKTtcbiAgdmFyIGlzUE07XG4gIHZhciBvcmlnaW5Ib3VyID0gdmFsdWUgPyBnZW5lcmF0ZUNvbmZpZy5nZXRIb3VyKHZhbHVlKSA6IC0xO1xuICB2YXIgaG91ciA9IG9yaWdpbkhvdXI7XG4gIHZhciBtaW51dGUgPSB2YWx1ZSA/IGdlbmVyYXRlQ29uZmlnLmdldE1pbnV0ZSh2YWx1ZSkgOiAtMTtcbiAgdmFyIHNlY29uZCA9IHZhbHVlID8gZ2VuZXJhdGVDb25maWcuZ2V0U2Vjb25kKHZhbHVlKSA6IC0xO1xuICAvLyBEaXNhYmxlZCBUaW1lXG4gIHZhciBub3cgPSBnZW5lcmF0ZUNvbmZpZy5nZXROb3coKTtcbiAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZGlzYWJsZWRUaW1lKSB7XG4gICAgICAgIHZhciBkaXNhYmxlZENvbmZpZyA9IGRpc2FibGVkVGltZShub3cpO1xuICAgICAgICByZXR1cm4gW2Rpc2FibGVkQ29uZmlnLmRpc2FibGVkSG91cnMsIGRpc2FibGVkQ29uZmlnLmRpc2FibGVkTWludXRlcywgZGlzYWJsZWRDb25maWcuZGlzYWJsZWRTZWNvbmRzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbZGlzYWJsZWRIb3VycywgZGlzYWJsZWRNaW51dGVzLCBkaXNhYmxlZFNlY29uZHNdO1xuICAgIH0sIFtkaXNhYmxlZEhvdXJzLCBkaXNhYmxlZE1pbnV0ZXMsIGRpc2FibGVkU2Vjb25kcywgZGlzYWJsZWRUaW1lLCBub3ddKSxcbiAgICBfUmVhY3QkdXNlTWVtbzIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlTWVtbywgMyksXG4gICAgbWVyZ2VkRGlzYWJsZWRIb3VycyA9IF9SZWFjdCR1c2VNZW1vMlswXSxcbiAgICBtZXJnZWREaXNhYmxlZE1pbnV0ZXMgPSBfUmVhY3QkdXNlTWVtbzJbMV0sXG4gICAgbWVyZ2VkRGlzYWJsZWRTZWNvbmRzID0gX1JlYWN0JHVzZU1lbW8yWzJdO1xuICAvLyBTZXQgVGltZVxuICB2YXIgc2V0VGltZSA9IGZ1bmN0aW9uIHNldFRpbWUoaXNOZXdQTSwgbmV3SG91ciwgbmV3TWludXRlLCBuZXdTZWNvbmQpIHtcbiAgICB2YXIgbmV3RGF0ZSA9IHZhbHVlIHx8IGdlbmVyYXRlQ29uZmlnLmdldE5vdygpO1xuICAgIHZhciBtZXJnZWRIb3VyID0gTWF0aC5tYXgoMCwgbmV3SG91cik7XG4gICAgdmFyIG1lcmdlZE1pbnV0ZSA9IE1hdGgubWF4KDAsIG5ld01pbnV0ZSk7XG4gICAgdmFyIG1lcmdlZFNlY29uZCA9IE1hdGgubWF4KDAsIG5ld1NlY29uZCk7XG4gICAgbmV3RGF0ZSA9IHV0aWxTZXRUaW1lKGdlbmVyYXRlQ29uZmlnLCBuZXdEYXRlLCAhdXNlMTJIb3VycyB8fCAhaXNOZXdQTSA/IG1lcmdlZEhvdXIgOiBtZXJnZWRIb3VyICsgMTIsIG1lcmdlZE1pbnV0ZSwgbWVyZ2VkU2Vjb25kKTtcbiAgICByZXR1cm4gbmV3RGF0ZTtcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBVbml0ID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHJhd0hvdXJzID0gZ2VuZXJhdGVVbml0cygwLCAyMywgaG91clN0ZXAsIG1lcmdlZERpc2FibGVkSG91cnMgJiYgbWVyZ2VkRGlzYWJsZWRIb3VycygpKTtcbiAgdmFyIG1lbW9yaXplZFJhd0hvdXJzID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJhd0hvdXJzO1xuICB9LCByYXdIb3Vycywgc2hvdWxkVW5pdHNVcGRhdGUpO1xuICAvLyBTaG91bGQgYWRkaXRpb25hbCBsb2dpYyB0byBoYW5kbGUgMTIgaG91cnNcbiAgaWYgKHVzZTEySG91cnMpIHtcbiAgICBpc1BNID0gaG91ciA+PSAxMjsgLy8gLTEgbWVhbnMgc2hvdWxkIGRpc3BsYXkgQU1cbiAgICBob3VyICU9IDEyO1xuICB9XG4gIHZhciBfUmVhY3QkdXNlTWVtbzMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghdXNlMTJIb3Vycykge1xuICAgICAgICByZXR1cm4gW2ZhbHNlLCBmYWxzZV07XG4gICAgICB9XG4gICAgICB2YXIgQU1QTURpc2FibGVkID0gW3RydWUsIHRydWVdO1xuICAgICAgbWVtb3JpemVkUmF3SG91cnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgZGlzYWJsZWQgPSBfcmVmLmRpc2FibGVkLFxuICAgICAgICAgIGhvdXJWYWx1ZSA9IF9yZWYudmFsdWU7XG4gICAgICAgIGlmIChkaXNhYmxlZCkgcmV0dXJuO1xuICAgICAgICBpZiAoaG91clZhbHVlID49IDEyKSB7XG4gICAgICAgICAgQU1QTURpc2FibGVkWzFdID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgQU1QTURpc2FibGVkWzBdID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIEFNUE1EaXNhYmxlZDtcbiAgICB9LCBbdXNlMTJIb3VycywgbWVtb3JpemVkUmF3SG91cnNdKSxcbiAgICBfUmVhY3QkdXNlTWVtbzQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlTWVtbzMsIDIpLFxuICAgIEFNRGlzYWJsZWQgPSBfUmVhY3QkdXNlTWVtbzRbMF0sXG4gICAgUE1EaXNhYmxlZCA9IF9SZWFjdCR1c2VNZW1vNFsxXTtcbiAgdmFyIGhvdXJzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF1c2UxMkhvdXJzKSByZXR1cm4gbWVtb3JpemVkUmF3SG91cnM7XG4gICAgcmV0dXJuIG1lbW9yaXplZFJhd0hvdXJzLmZpbHRlcihpc1BNID8gZnVuY3Rpb24gKGhvdXJNZXRhKSB7XG4gICAgICByZXR1cm4gaG91ck1ldGEudmFsdWUgPj0gMTI7XG4gICAgfSA6IGZ1bmN0aW9uIChob3VyTWV0YSkge1xuICAgICAgcmV0dXJuIGhvdXJNZXRhLnZhbHVlIDwgMTI7XG4gICAgfSkubWFwKGZ1bmN0aW9uIChob3VyTWV0YSkge1xuICAgICAgdmFyIGhvdXJWYWx1ZSA9IGhvdXJNZXRhLnZhbHVlICUgMTI7XG4gICAgICB2YXIgaG91ckxhYmVsID0gaG91clZhbHVlID09PSAwID8gJzEyJyA6IGxlZnRQYWQoaG91clZhbHVlLCAyKTtcbiAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGhvdXJNZXRhKSwge30sIHtcbiAgICAgICAgbGFiZWw6IGhvdXJMYWJlbCxcbiAgICAgICAgdmFsdWU6IGhvdXJWYWx1ZVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sIFt1c2UxMkhvdXJzLCBpc1BNLCBtZW1vcml6ZWRSYXdIb3Vyc10pO1xuICB2YXIgbWludXRlcyA9IGdlbmVyYXRlVW5pdHMoMCwgNTksIG1pbnV0ZVN0ZXAsIG1lcmdlZERpc2FibGVkTWludXRlcyAmJiBtZXJnZWREaXNhYmxlZE1pbnV0ZXMob3JpZ2luSG91cikpO1xuICB2YXIgc2Vjb25kcyA9IGdlbmVyYXRlVW5pdHMoMCwgNTksIHNlY29uZFN0ZXAsIG1lcmdlZERpc2FibGVkU2Vjb25kcyAmJiBtZXJnZWREaXNhYmxlZFNlY29uZHMob3JpZ2luSG91ciwgbWludXRlKSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gT3BlcmF0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09XG4gIG9wZXJhdGlvblJlZi5jdXJyZW50ID0ge1xuICAgIG9uVXBEb3duOiBmdW5jdGlvbiBvblVwRG93bihkaWZmKSB7XG4gICAgICB2YXIgY29sdW1uID0gY29sdW1uc1thY3RpdmVDb2x1bW5JbmRleF07XG4gICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgIHZhciB2YWx1ZUluZGV4ID0gY29sdW1uLnVuaXRzLmZpbmRJbmRleChmdW5jdGlvbiAodW5pdCkge1xuICAgICAgICAgIHJldHVybiB1bml0LnZhbHVlID09PSBjb2x1bW4udmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgdW5pdExlbiA9IGNvbHVtbi51bml0cy5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgdW5pdExlbjsgaSArPSAxKSB7XG4gICAgICAgICAgdmFyIG5leHRVbml0ID0gY29sdW1uLnVuaXRzWyh2YWx1ZUluZGV4ICsgZGlmZiAqIGkgKyB1bml0TGVuKSAlIHVuaXRMZW5dO1xuICAgICAgICAgIGlmIChuZXh0VW5pdC5kaXNhYmxlZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29sdW1uLm9uU2VsZWN0KG5leHRVbml0LnZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gYWRkQ29sdW1uTm9kZShjb25kaXRpb24sIG5vZGUsIGNvbHVtblZhbHVlLCB1bml0cywgb25Db2x1bW5TZWxlY3QpIHtcbiAgICBpZiAoY29uZGl0aW9uICE9PSBmYWxzZSkge1xuICAgICAgY29sdW1ucy5wdXNoKHtcbiAgICAgICAgbm9kZTogLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChub2RlLCB7XG4gICAgICAgICAgcHJlZml4Q2xzOiBjb2x1bW5QcmVmaXhDbHMsXG4gICAgICAgICAgdmFsdWU6IGNvbHVtblZhbHVlLFxuICAgICAgICAgIGFjdGl2ZTogYWN0aXZlQ29sdW1uSW5kZXggPT09IGNvbHVtbnMubGVuZ3RoLFxuICAgICAgICAgIG9uU2VsZWN0OiBvbkNvbHVtblNlbGVjdCxcbiAgICAgICAgICB1bml0czogdW5pdHMsXG4gICAgICAgICAgaGlkZURpc2FibGVkT3B0aW9uczogaGlkZURpc2FibGVkT3B0aW9uc1xuICAgICAgICB9KSxcbiAgICAgICAgb25TZWxlY3Q6IG9uQ29sdW1uU2VsZWN0LFxuICAgICAgICB2YWx1ZTogY29sdW1uVmFsdWUsXG4gICAgICAgIHVuaXRzOiB1bml0c1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8vIEhvdXJcbiAgYWRkQ29sdW1uTm9kZShzaG93SG91ciwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGltZVVuaXRDb2x1bW4sIHtcbiAgICBrZXk6IFwiaG91clwiXG4gIH0pLCBob3VyLCBob3VycywgZnVuY3Rpb24gKG51bSkge1xuICAgIG9uU2VsZWN0KHNldFRpbWUoaXNQTSwgbnVtLCBtaW51dGUsIHNlY29uZCksICdtb3VzZScpO1xuICB9KTtcbiAgLy8gTWludXRlXG4gIGFkZENvbHVtbk5vZGUoc2hvd01pbnV0ZSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGltZVVuaXRDb2x1bW4sIHtcbiAgICBrZXk6IFwibWludXRlXCJcbiAgfSksIG1pbnV0ZSwgbWludXRlcywgZnVuY3Rpb24gKG51bSkge1xuICAgIG9uU2VsZWN0KHNldFRpbWUoaXNQTSwgaG91ciwgbnVtLCBzZWNvbmQpLCAnbW91c2UnKTtcbiAgfSk7XG4gIC8vIFNlY29uZFxuICBhZGRDb2x1bW5Ob2RlKHNob3dTZWNvbmQsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRpbWVVbml0Q29sdW1uLCB7XG4gICAga2V5OiBcInNlY29uZFwiXG4gIH0pLCBzZWNvbmQsIHNlY29uZHMsIGZ1bmN0aW9uIChudW0pIHtcbiAgICBvblNlbGVjdChzZXRUaW1lKGlzUE0sIGhvdXIsIG1pbnV0ZSwgbnVtKSwgJ21vdXNlJyk7XG4gIH0pO1xuICAvLyAxMiBIb3Vyc1xuICB2YXIgUE1JbmRleCA9IC0xO1xuICBpZiAodHlwZW9mIGlzUE0gPT09ICdib29sZWFuJykge1xuICAgIFBNSW5kZXggPSBpc1BNID8gMSA6IDA7XG4gIH1cbiAgYWRkQ29sdW1uTm9kZSh1c2UxMkhvdXJzID09PSB0cnVlLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUaW1lVW5pdENvbHVtbiwge1xuICAgIGtleTogXCIxMmhvdXJzXCJcbiAgfSksIFBNSW5kZXgsIFt7XG4gICAgbGFiZWw6ICdBTScsXG4gICAgdmFsdWU6IDAsXG4gICAgZGlzYWJsZWQ6IEFNRGlzYWJsZWRcbiAgfSwge1xuICAgIGxhYmVsOiAnUE0nLFxuICAgIHZhbHVlOiAxLFxuICAgIGRpc2FibGVkOiBQTURpc2FibGVkXG4gIH1dLCBmdW5jdGlvbiAobnVtKSB7XG4gICAgb25TZWxlY3Qoc2V0VGltZSghIW51bSwgaG91ciwgbWludXRlLCBzZWNvbmQpLCAnbW91c2UnKTtcbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjb250ZW50UHJlZml4Q2xzXG4gIH0sIGNvbHVtbnMubWFwKGZ1bmN0aW9uIChfcmVmMikge1xuICAgIHZhciBub2RlID0gX3JlZjIubm9kZTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgVGltZUJvZHk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBUaW1lSGVhZGVyIGZyb20gJy4vVGltZUhlYWRlcic7XG5pbXBvcnQgVGltZUJvZHkgZnJvbSAnLi9UaW1lQm9keSc7XG5pbXBvcnQgeyBjcmVhdGVLZXlEb3duSGFuZGxlciB9IGZyb20gJy4uLy4uL3V0aWxzL3VpVXRpbCc7XG52YXIgY291bnRCb29sZWFuID0gZnVuY3Rpb24gY291bnRCb29sZWFuKGJvb2xMaXN0KSB7XG4gIHJldHVybiBib29sTGlzdC5maWx0ZXIoZnVuY3Rpb24gKGJvb2wpIHtcbiAgICByZXR1cm4gYm9vbCAhPT0gZmFsc2U7XG4gIH0pLmxlbmd0aDtcbn07XG5mdW5jdGlvbiBUaW1lUGFuZWwocHJvcHMpIHtcbiAgdmFyIGdlbmVyYXRlQ29uZmlnID0gcHJvcHMuZ2VuZXJhdGVDb25maWcsXG4gICAgX3Byb3BzJGZvcm1hdCA9IHByb3BzLmZvcm1hdCxcbiAgICBmb3JtYXQgPSBfcHJvcHMkZm9ybWF0ID09PSB2b2lkIDAgPyAnSEg6bW06c3MnIDogX3Byb3BzJGZvcm1hdCxcbiAgICBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgYWN0aXZlID0gcHJvcHMuYWN0aXZlLFxuICAgIG9wZXJhdGlvblJlZiA9IHByb3BzLm9wZXJhdGlvblJlZixcbiAgICBzaG93SG91ciA9IHByb3BzLnNob3dIb3VyLFxuICAgIHNob3dNaW51dGUgPSBwcm9wcy5zaG93TWludXRlLFxuICAgIHNob3dTZWNvbmQgPSBwcm9wcy5zaG93U2Vjb25kLFxuICAgIF9wcm9wcyR1c2UxMkhvdXJzID0gcHJvcHMudXNlMTJIb3VycyxcbiAgICB1c2UxMkhvdXJzID0gX3Byb3BzJHVzZTEySG91cnMgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJHVzZTEySG91cnMsXG4gICAgb25TZWxlY3QgPSBwcm9wcy5vblNlbGVjdCxcbiAgICB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuICB2YXIgcGFuZWxQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRpbWUtcGFuZWxcIik7XG4gIHZhciBib2R5T3BlcmF0aW9uUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IEtleWJvYXJkID09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSgtMSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgYWN0aXZlQ29sdW1uSW5kZXggPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEFjdGl2ZUNvbHVtbkluZGV4ID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIGNvbHVtbnNDb3VudCA9IGNvdW50Qm9vbGVhbihbc2hvd0hvdXIsIHNob3dNaW51dGUsIHNob3dTZWNvbmQsIHVzZTEySG91cnNdKTtcbiAgb3BlcmF0aW9uUmVmLmN1cnJlbnQgPSB7XG4gICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIHJldHVybiBjcmVhdGVLZXlEb3duSGFuZGxlcihldmVudCwge1xuICAgICAgICBvbkxlZnRSaWdodDogZnVuY3Rpb24gb25MZWZ0UmlnaHQoZGlmZikge1xuICAgICAgICAgIHNldEFjdGl2ZUNvbHVtbkluZGV4KChhY3RpdmVDb2x1bW5JbmRleCArIGRpZmYgKyBjb2x1bW5zQ291bnQpICUgY29sdW1uc0NvdW50KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VcERvd246IGZ1bmN0aW9uIG9uVXBEb3duKGRpZmYpIHtcbiAgICAgICAgICBpZiAoYWN0aXZlQ29sdW1uSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICBzZXRBY3RpdmVDb2x1bW5JbmRleCgwKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGJvZHlPcGVyYXRpb25SZWYuY3VycmVudCkge1xuICAgICAgICAgICAgYm9keU9wZXJhdGlvblJlZi5jdXJyZW50Lm9uVXBEb3duKGRpZmYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25FbnRlcjogZnVuY3Rpb24gb25FbnRlcigpIHtcbiAgICAgICAgICBvblNlbGVjdCh2YWx1ZSB8fCBnZW5lcmF0ZUNvbmZpZy5nZXROb3coKSwgJ2tleScpO1xuICAgICAgICAgIHNldEFjdGl2ZUNvbHVtbkluZGV4KC0xKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBvbkJsdXI6IGZ1bmN0aW9uIG9uQmx1cigpIHtcbiAgICAgIHNldEFjdGl2ZUNvbHVtbkluZGV4KC0xKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHBhbmVsUHJlZml4Q2xzLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHBhbmVsUHJlZml4Q2xzLCBcIi1hY3RpdmVcIiksIGFjdGl2ZSkpXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRpbWVIZWFkZXIsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIGZvcm1hdDogZm9ybWF0LFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzXG4gIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGltZUJvZHksIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGFjdGl2ZUNvbHVtbkluZGV4OiBhY3RpdmVDb2x1bW5JbmRleCxcbiAgICBvcGVyYXRpb25SZWY6IGJvZHlPcGVyYXRpb25SZWZcbiAgfSkpKTtcbn1cbmV4cG9ydCBkZWZhdWx0IFRpbWVQYW5lbDsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgUmFuZ2VDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe30pO1xuZXhwb3J0IGRlZmF1bHQgUmFuZ2VDb250ZXh0OyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgeyBpc0luUmFuZ2UgfSBmcm9tICcuLi91dGlscy9kYXRlVXRpbCc7XG5pbXBvcnQgeyBnZXRWYWx1ZSB9IGZyb20gJy4uL3V0aWxzL21pc2NVdGlsJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUNlbGxDbGFzc05hbWUoX3JlZikge1xuICB2YXIgY2VsbFByZWZpeENscyA9IF9yZWYuY2VsbFByZWZpeENscyxcbiAgICBnZW5lcmF0ZUNvbmZpZyA9IF9yZWYuZ2VuZXJhdGVDb25maWcsXG4gICAgcmFuZ2VkVmFsdWUgPSBfcmVmLnJhbmdlZFZhbHVlLFxuICAgIGhvdmVyUmFuZ2VkVmFsdWUgPSBfcmVmLmhvdmVyUmFuZ2VkVmFsdWUsXG4gICAgaXNJblZpZXcgPSBfcmVmLmlzSW5WaWV3LFxuICAgIGlzU2FtZUNlbGwgPSBfcmVmLmlzU2FtZUNlbGwsXG4gICAgb2Zmc2V0Q2VsbCA9IF9yZWYub2Zmc2V0Q2VsbCxcbiAgICB0b2RheSA9IF9yZWYudG9kYXksXG4gICAgdmFsdWUgPSBfcmVmLnZhbHVlO1xuICBmdW5jdGlvbiBnZXRDbGFzc05hbWUoY3VycmVudERhdGUpIHtcbiAgICB2YXIgX3JlZjI7XG4gICAgdmFyIHByZXZEYXRlID0gb2Zmc2V0Q2VsbChjdXJyZW50RGF0ZSwgLTEpO1xuICAgIHZhciBuZXh0RGF0ZSA9IG9mZnNldENlbGwoY3VycmVudERhdGUsIDEpO1xuICAgIHZhciByYW5nZVN0YXJ0ID0gZ2V0VmFsdWUocmFuZ2VkVmFsdWUsIDApO1xuICAgIHZhciByYW5nZUVuZCA9IGdldFZhbHVlKHJhbmdlZFZhbHVlLCAxKTtcbiAgICB2YXIgaG92ZXJTdGFydCA9IGdldFZhbHVlKGhvdmVyUmFuZ2VkVmFsdWUsIDApO1xuICAgIHZhciBob3ZlckVuZCA9IGdldFZhbHVlKGhvdmVyUmFuZ2VkVmFsdWUsIDEpO1xuICAgIHZhciBpc1JhbmdlSG92ZXJlZCA9IGlzSW5SYW5nZShnZW5lcmF0ZUNvbmZpZywgaG92ZXJTdGFydCwgaG92ZXJFbmQsIGN1cnJlbnREYXRlKTtcbiAgICBmdW5jdGlvbiBpc1JhbmdlU3RhcnQoZGF0ZSkge1xuICAgICAgcmV0dXJuIGlzU2FtZUNlbGwocmFuZ2VTdGFydCwgZGF0ZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzUmFuZ2VFbmQoZGF0ZSkge1xuICAgICAgcmV0dXJuIGlzU2FtZUNlbGwocmFuZ2VFbmQsIGRhdGUpO1xuICAgIH1cbiAgICB2YXIgaXNIb3ZlclN0YXJ0ID0gaXNTYW1lQ2VsbChob3ZlclN0YXJ0LCBjdXJyZW50RGF0ZSk7XG4gICAgdmFyIGlzSG92ZXJFbmQgPSBpc1NhbWVDZWxsKGhvdmVyRW5kLCBjdXJyZW50RGF0ZSk7XG4gICAgdmFyIGlzSG92ZXJFZGdlU3RhcnQgPSAoaXNSYW5nZUhvdmVyZWQgfHwgaXNIb3ZlckVuZCkgJiYgKCFpc0luVmlldyhwcmV2RGF0ZSkgfHwgaXNSYW5nZUVuZChwcmV2RGF0ZSkpO1xuICAgIHZhciBpc0hvdmVyRWRnZUVuZCA9IChpc1JhbmdlSG92ZXJlZCB8fCBpc0hvdmVyU3RhcnQpICYmICghaXNJblZpZXcobmV4dERhdGUpIHx8IGlzUmFuZ2VTdGFydChuZXh0RGF0ZSkpO1xuICAgIHJldHVybiBfcmVmMiA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX3JlZjIsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLWluLXZpZXdcIiksIGlzSW5WaWV3KGN1cnJlbnREYXRlKSksIF9kZWZpbmVQcm9wZXJ0eShfcmVmMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItaW4tcmFuZ2VcIiksIGlzSW5SYW5nZShnZW5lcmF0ZUNvbmZpZywgcmFuZ2VTdGFydCwgcmFuZ2VFbmQsIGN1cnJlbnREYXRlKSksIF9kZWZpbmVQcm9wZXJ0eShfcmVmMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItcmFuZ2Utc3RhcnRcIiksIGlzUmFuZ2VTdGFydChjdXJyZW50RGF0ZSkpLCBfZGVmaW5lUHJvcGVydHkoX3JlZjIsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLXJhbmdlLWVuZFwiKSwgaXNSYW5nZUVuZChjdXJyZW50RGF0ZSkpLCBfZGVmaW5lUHJvcGVydHkoX3JlZjIsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLXJhbmdlLXN0YXJ0LXNpbmdsZVwiKSwgaXNSYW5nZVN0YXJ0KGN1cnJlbnREYXRlKSAmJiAhcmFuZ2VFbmQpLCBfZGVmaW5lUHJvcGVydHkoX3JlZjIsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLXJhbmdlLWVuZC1zaW5nbGVcIiksIGlzUmFuZ2VFbmQoY3VycmVudERhdGUpICYmICFyYW5nZVN0YXJ0KSwgX2RlZmluZVByb3BlcnR5KF9yZWYyLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1yYW5nZS1zdGFydC1uZWFyLWhvdmVyXCIpLCBpc1JhbmdlU3RhcnQoY3VycmVudERhdGUpICYmIChpc1NhbWVDZWxsKHByZXZEYXRlLCBob3ZlclN0YXJ0KSB8fCBpc0luUmFuZ2UoZ2VuZXJhdGVDb25maWcsIGhvdmVyU3RhcnQsIGhvdmVyRW5kLCBwcmV2RGF0ZSkpKSwgX2RlZmluZVByb3BlcnR5KF9yZWYyLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1yYW5nZS1lbmQtbmVhci1ob3ZlclwiKSwgaXNSYW5nZUVuZChjdXJyZW50RGF0ZSkgJiYgKGlzU2FtZUNlbGwobmV4dERhdGUsIGhvdmVyRW5kKSB8fCBpc0luUmFuZ2UoZ2VuZXJhdGVDb25maWcsIGhvdmVyU3RhcnQsIGhvdmVyRW5kLCBuZXh0RGF0ZSkpKSwgX2RlZmluZVByb3BlcnR5KF9yZWYyLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1yYW5nZS1ob3ZlclwiKSwgaXNSYW5nZUhvdmVyZWQpLCBfZGVmaW5lUHJvcGVydHkoX3JlZjIsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLXJhbmdlLWhvdmVyLXN0YXJ0XCIpLCBpc0hvdmVyU3RhcnQpLCBfZGVmaW5lUHJvcGVydHkoX3JlZjIsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLXJhbmdlLWhvdmVyLWVuZFwiKSwgaXNIb3ZlckVuZCksIF9kZWZpbmVQcm9wZXJ0eShfcmVmMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItcmFuZ2UtaG92ZXItZWRnZS1zdGFydFwiKSwgaXNIb3ZlckVkZ2VTdGFydCksIF9kZWZpbmVQcm9wZXJ0eShfcmVmMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItcmFuZ2UtaG92ZXItZWRnZS1lbmRcIiksIGlzSG92ZXJFZGdlRW5kKSwgX2RlZmluZVByb3BlcnR5KF9yZWYyLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1yYW5nZS1ob3Zlci1lZGdlLXN0YXJ0LW5lYXItcmFuZ2VcIiksIGlzSG92ZXJFZGdlU3RhcnQgJiYgaXNTYW1lQ2VsbChwcmV2RGF0ZSwgcmFuZ2VFbmQpKSwgX2RlZmluZVByb3BlcnR5KF9yZWYyLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1yYW5nZS1ob3Zlci1lZGdlLWVuZC1uZWFyLXJhbmdlXCIpLCBpc0hvdmVyRWRnZUVuZCAmJiBpc1NhbWVDZWxsKG5leHREYXRlLCByYW5nZVN0YXJ0KSksIF9kZWZpbmVQcm9wZXJ0eShfcmVmMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItdG9kYXlcIiksIGlzU2FtZUNlbGwodG9kYXksIGN1cnJlbnREYXRlKSksIF9kZWZpbmVQcm9wZXJ0eShfcmVmMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItc2VsZWN0ZWRcIiksIGlzU2FtZUNlbGwodmFsdWUsIGN1cnJlbnREYXRlKSksIF9yZWYyO1xuICB9XG4gIHJldHVybiBnZXRDbGFzc05hbWU7XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBXRUVLX0RBWV9DT1VOVCwgZ2V0V2Vla1N0YXJ0RGF0ZSwgaXNTYW1lRGF0ZSwgaXNTYW1lTW9udGgsIGZvcm1hdFZhbHVlIH0gZnJvbSAnLi4vLi4vdXRpbHMvZGF0ZVV0aWwnO1xuaW1wb3J0IFJhbmdlQ29udGV4dCBmcm9tICcuLi8uLi9SYW5nZUNvbnRleHQnO1xuaW1wb3J0IHVzZUNlbGxDbGFzc05hbWUgZnJvbSAnLi4vLi4vaG9va3MvdXNlQ2VsbENsYXNzTmFtZSc7XG5pbXBvcnQgUGFuZWxCb2R5IGZyb20gJy4uL1BhbmVsQm9keSc7XG5mdW5jdGlvbiBEYXRlQm9keShwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGdlbmVyYXRlQ29uZmlnID0gcHJvcHMuZ2VuZXJhdGVDb25maWcsXG4gICAgcHJlZml4Q29sdW1uID0gcHJvcHMucHJlZml4Q29sdW1uLFxuICAgIGxvY2FsZSA9IHByb3BzLmxvY2FsZSxcbiAgICByb3dDb3VudCA9IHByb3BzLnJvd0NvdW50LFxuICAgIHZpZXdEYXRlID0gcHJvcHMudmlld0RhdGUsXG4gICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICBkYXRlUmVuZGVyID0gcHJvcHMuZGF0ZVJlbmRlcjtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChSYW5nZUNvbnRleHQpLFxuICAgIHJhbmdlZFZhbHVlID0gX1JlYWN0JHVzZUNvbnRleHQucmFuZ2VkVmFsdWUsXG4gICAgaG92ZXJSYW5nZWRWYWx1ZSA9IF9SZWFjdCR1c2VDb250ZXh0LmhvdmVyUmFuZ2VkVmFsdWU7XG4gIHZhciBiYXNlRGF0ZSA9IGdldFdlZWtTdGFydERhdGUobG9jYWxlLmxvY2FsZSwgZ2VuZXJhdGVDb25maWcsIHZpZXdEYXRlKTtcbiAgdmFyIGNlbGxQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNlbGxcIik7XG4gIHZhciB3ZWVrRmlyc3REYXkgPSBnZW5lcmF0ZUNvbmZpZy5sb2NhbGUuZ2V0V2Vla0ZpcnN0RGF5KGxvY2FsZS5sb2NhbGUpO1xuICB2YXIgdG9kYXkgPSBnZW5lcmF0ZUNvbmZpZy5nZXROb3coKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEhlYWRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGhlYWRlckNlbGxzID0gW107XG4gIHZhciB3ZWVrRGF5c0xvY2FsZSA9IGxvY2FsZS5zaG9ydFdlZWtEYXlzIHx8IChnZW5lcmF0ZUNvbmZpZy5sb2NhbGUuZ2V0U2hvcnRXZWVrRGF5cyA/IGdlbmVyYXRlQ29uZmlnLmxvY2FsZS5nZXRTaG9ydFdlZWtEYXlzKGxvY2FsZS5sb2NhbGUpIDogW10pO1xuICBpZiAocHJlZml4Q29sdW1uKSB7XG4gICAgaGVhZGVyQ2VsbHMucHVzaCggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0aFwiLCB7XG4gICAgICBrZXk6IFwiZW1wdHlcIixcbiAgICAgIFwiYXJpYS1sYWJlbFwiOiBcImVtcHR5IGNlbGxcIlxuICAgIH0pKTtcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IFdFRUtfREFZX0NPVU5UOyBpICs9IDEpIHtcbiAgICBoZWFkZXJDZWxscy5wdXNoKCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRoXCIsIHtcbiAgICAgIGtleTogaVxuICAgIH0sIHdlZWtEYXlzTG9jYWxlWyhpICsgd2Vla0ZpcnN0RGF5KSAlIFdFRUtfREFZX0NPVU5UXSkpO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQm9keSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBnZXRDZWxsQ2xhc3NOYW1lID0gdXNlQ2VsbENsYXNzTmFtZSh7XG4gICAgY2VsbFByZWZpeENsczogY2VsbFByZWZpeENscyxcbiAgICB0b2RheTogdG9kYXksXG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZyxcbiAgICByYW5nZWRWYWx1ZTogcHJlZml4Q29sdW1uID8gbnVsbCA6IHJhbmdlZFZhbHVlLFxuICAgIGhvdmVyUmFuZ2VkVmFsdWU6IHByZWZpeENvbHVtbiA/IG51bGwgOiBob3ZlclJhbmdlZFZhbHVlLFxuICAgIGlzU2FtZUNlbGw6IGZ1bmN0aW9uIGlzU2FtZUNlbGwoY3VycmVudCwgdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gaXNTYW1lRGF0ZShnZW5lcmF0ZUNvbmZpZywgY3VycmVudCwgdGFyZ2V0KTtcbiAgICB9LFxuICAgIGlzSW5WaWV3OiBmdW5jdGlvbiBpc0luVmlldyhkYXRlKSB7XG4gICAgICByZXR1cm4gaXNTYW1lTW9udGgoZ2VuZXJhdGVDb25maWcsIGRhdGUsIHZpZXdEYXRlKTtcbiAgICB9LFxuICAgIG9mZnNldENlbGw6IGZ1bmN0aW9uIG9mZnNldENlbGwoZGF0ZSwgb2Zmc2V0KSB7XG4gICAgICByZXR1cm4gZ2VuZXJhdGVDb25maWcuYWRkRGF0ZShkYXRlLCBvZmZzZXQpO1xuICAgIH1cbiAgfSk7XG4gIHZhciBnZXRDZWxsTm9kZSA9IGRhdGVSZW5kZXIgPyBmdW5jdGlvbiAoZGF0ZSkge1xuICAgIHJldHVybiBkYXRlUmVuZGVyKGRhdGUsIHRvZGF5KTtcbiAgfSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBhbmVsQm9keSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcm93TnVtOiByb3dDb3VudCxcbiAgICBjb2xOdW06IFdFRUtfREFZX0NPVU5ULFxuICAgIGJhc2VEYXRlOiBiYXNlRGF0ZSxcbiAgICBnZXRDZWxsTm9kZTogZ2V0Q2VsbE5vZGUsXG4gICAgZ2V0Q2VsbFRleHQ6IGdlbmVyYXRlQ29uZmlnLmdldERhdGUsXG4gICAgZ2V0Q2VsbENsYXNzTmFtZTogZ2V0Q2VsbENsYXNzTmFtZSxcbiAgICBnZXRDZWxsRGF0ZTogZ2VuZXJhdGVDb25maWcuYWRkRGF0ZSxcbiAgICB0aXRsZUNlbGw6IGZ1bmN0aW9uIHRpdGxlQ2VsbChkYXRlKSB7XG4gICAgICByZXR1cm4gZm9ybWF0VmFsdWUoZGF0ZSwge1xuICAgICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgICAgZm9ybWF0OiAnWVlZWS1NTS1ERCcsXG4gICAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZ1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBoZWFkZXJDZWxsczogaGVhZGVyQ2VsbHNcbiAgfSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgRGF0ZUJvZHk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgSGVhZGVyIGZyb20gJy4uL0hlYWRlcic7XG5pbXBvcnQgUGFuZWxDb250ZXh0IGZyb20gJy4uLy4uL1BhbmVsQ29udGV4dCc7XG5pbXBvcnQgeyBmb3JtYXRWYWx1ZSB9IGZyb20gJy4uLy4uL3V0aWxzL2RhdGVVdGlsJztcbmZ1bmN0aW9uIERhdGVIZWFkZXIocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnLFxuICAgIGxvY2FsZSA9IHByb3BzLmxvY2FsZSxcbiAgICB2aWV3RGF0ZSA9IHByb3BzLnZpZXdEYXRlLFxuICAgIG9uTmV4dE1vbnRoID0gcHJvcHMub25OZXh0TW9udGgsXG4gICAgb25QcmV2TW9udGggPSBwcm9wcy5vblByZXZNb250aCxcbiAgICBvbk5leHRZZWFyID0gcHJvcHMub25OZXh0WWVhcixcbiAgICBvblByZXZZZWFyID0gcHJvcHMub25QcmV2WWVhcixcbiAgICBvblllYXJDbGljayA9IHByb3BzLm9uWWVhckNsaWNrLFxuICAgIG9uTW9udGhDbGljayA9IHByb3BzLm9uTW9udGhDbGljaztcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChQYW5lbENvbnRleHQpLFxuICAgIGhpZGVIZWFkZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5oaWRlSGVhZGVyO1xuICBpZiAoaGlkZUhlYWRlcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBoZWFkZXJQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhlYWRlclwiKTtcbiAgdmFyIG1vbnRoc0xvY2FsZSA9IGxvY2FsZS5zaG9ydE1vbnRocyB8fCAoZ2VuZXJhdGVDb25maWcubG9jYWxlLmdldFNob3J0TW9udGhzID8gZ2VuZXJhdGVDb25maWcubG9jYWxlLmdldFNob3J0TW9udGhzKGxvY2FsZS5sb2NhbGUpIDogW10pO1xuICB2YXIgbW9udGggPSBnZW5lcmF0ZUNvbmZpZy5nZXRNb250aCh2aWV3RGF0ZSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT0gTW9udGggJiBZZWFyID09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHllYXJOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAga2V5OiBcInllYXJcIixcbiAgICBvbkNsaWNrOiBvblllYXJDbGljayxcbiAgICB0YWJJbmRleDogLTEsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXllYXItYnRuXCIpXG4gIH0sIGZvcm1hdFZhbHVlKHZpZXdEYXRlLCB7XG4gICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgZm9ybWF0OiBsb2NhbGUueWVhckZvcm1hdCxcbiAgICBnZW5lcmF0ZUNvbmZpZzogZ2VuZXJhdGVDb25maWdcbiAgfSkpO1xuICB2YXIgbW9udGhOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAga2V5OiBcIm1vbnRoXCIsXG4gICAgb25DbGljazogb25Nb250aENsaWNrLFxuICAgIHRhYkluZGV4OiAtMSxcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbW9udGgtYnRuXCIpXG4gIH0sIGxvY2FsZS5tb250aEZvcm1hdCA/IGZvcm1hdFZhbHVlKHZpZXdEYXRlLCB7XG4gICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgZm9ybWF0OiBsb2NhbGUubW9udGhGb3JtYXQsXG4gICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnXG4gIH0pIDogbW9udGhzTG9jYWxlW21vbnRoXSk7XG4gIHZhciBtb250aFllYXJOb2RlcyA9IGxvY2FsZS5tb250aEJlZm9yZVllYXIgPyBbbW9udGhOb2RlLCB5ZWFyTm9kZV0gOiBbeWVhck5vZGUsIG1vbnRoTm9kZV07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChIZWFkZXIsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogaGVhZGVyUHJlZml4Q2xzLFxuICAgIG9uU3VwZXJQcmV2OiBvblByZXZZZWFyLFxuICAgIG9uUHJldjogb25QcmV2TW9udGgsXG4gICAgb25OZXh0OiBvbk5leHRNb250aCxcbiAgICBvblN1cGVyTmV4dDogb25OZXh0WWVhclxuICB9KSwgbW9udGhZZWFyTm9kZXMpO1xufVxuZXhwb3J0IGRlZmF1bHQgRGF0ZUhlYWRlcjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgRGF0ZUJvZHkgZnJvbSAnLi9EYXRlQm9keSc7XG5pbXBvcnQgRGF0ZUhlYWRlciBmcm9tICcuL0RhdGVIZWFkZXInO1xuaW1wb3J0IHsgV0VFS19EQVlfQ09VTlQgfSBmcm9tICcuLi8uLi91dGlscy9kYXRlVXRpbCc7XG5pbXBvcnQgeyBjcmVhdGVLZXlEb3duSGFuZGxlciB9IGZyb20gJy4uLy4uL3V0aWxzL3VpVXRpbCc7XG52YXIgREFURV9ST1dfQ09VTlQgPSA2O1xuZnVuY3Rpb24gRGF0ZVBhbmVsKHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgX3Byb3BzJHBhbmVsTmFtZSA9IHByb3BzLnBhbmVsTmFtZSxcbiAgICBwYW5lbE5hbWUgPSBfcHJvcHMkcGFuZWxOYW1lID09PSB2b2lkIDAgPyAnZGF0ZScgOiBfcHJvcHMkcGFuZWxOYW1lLFxuICAgIGtleWJvYXJkQ29uZmlnID0gcHJvcHMua2V5Ym9hcmRDb25maWcsXG4gICAgYWN0aXZlID0gcHJvcHMuYWN0aXZlLFxuICAgIG9wZXJhdGlvblJlZiA9IHByb3BzLm9wZXJhdGlvblJlZixcbiAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnLFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgdmlld0RhdGUgPSBwcm9wcy52aWV3RGF0ZSxcbiAgICBvblZpZXdEYXRlQ2hhbmdlID0gcHJvcHMub25WaWV3RGF0ZUNoYW5nZSxcbiAgICBvblBhbmVsQ2hhbmdlID0gcHJvcHMub25QYW5lbENoYW5nZSxcbiAgICBfb25TZWxlY3QgPSBwcm9wcy5vblNlbGVjdDtcbiAgdmFyIHBhbmVsUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHBhbmVsTmFtZSwgXCItcGFuZWxcIik7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IEtleWJvYXJkID09PT09PT09PT09PT09PT09PT09PT09XG4gIG9wZXJhdGlvblJlZi5jdXJyZW50ID0ge1xuICAgIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICByZXR1cm4gY3JlYXRlS2V5RG93bkhhbmRsZXIoZXZlbnQsIF9vYmplY3RTcHJlYWQoe1xuICAgICAgICBvbkxlZnRSaWdodDogZnVuY3Rpb24gb25MZWZ0UmlnaHQoZGlmZikge1xuICAgICAgICAgIF9vblNlbGVjdChnZW5lcmF0ZUNvbmZpZy5hZGREYXRlKHZhbHVlIHx8IHZpZXdEYXRlLCBkaWZmKSwgJ2tleScpO1xuICAgICAgICB9LFxuICAgICAgICBvbkN0cmxMZWZ0UmlnaHQ6IGZ1bmN0aW9uIG9uQ3RybExlZnRSaWdodChkaWZmKSB7XG4gICAgICAgICAgX29uU2VsZWN0KGdlbmVyYXRlQ29uZmlnLmFkZFllYXIodmFsdWUgfHwgdmlld0RhdGUsIGRpZmYpLCAna2V5Jyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVXBEb3duOiBmdW5jdGlvbiBvblVwRG93bihkaWZmKSB7XG4gICAgICAgICAgX29uU2VsZWN0KGdlbmVyYXRlQ29uZmlnLmFkZERhdGUodmFsdWUgfHwgdmlld0RhdGUsIGRpZmYgKiBXRUVLX0RBWV9DT1VOVCksICdrZXknKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25QYWdlVXBEb3duOiBmdW5jdGlvbiBvblBhZ2VVcERvd24oZGlmZikge1xuICAgICAgICAgIF9vblNlbGVjdChnZW5lcmF0ZUNvbmZpZy5hZGRNb250aCh2YWx1ZSB8fCB2aWV3RGF0ZSwgZGlmZiksICdrZXknKTtcbiAgICAgICAgfVxuICAgICAgfSwga2V5Ym9hcmRDb25maWcpKTtcbiAgICB9XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09PT09IFZpZXcgT3BlcmF0aW9uID09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvblllYXJDaGFuZ2UgPSBmdW5jdGlvbiBvblllYXJDaGFuZ2UoZGlmZikge1xuICAgIHZhciBuZXdEYXRlID0gZ2VuZXJhdGVDb25maWcuYWRkWWVhcih2aWV3RGF0ZSwgZGlmZik7XG4gICAgb25WaWV3RGF0ZUNoYW5nZShuZXdEYXRlKTtcbiAgICBvblBhbmVsQ2hhbmdlKG51bGwsIG5ld0RhdGUpO1xuICB9O1xuICB2YXIgb25Nb250aENoYW5nZSA9IGZ1bmN0aW9uIG9uTW9udGhDaGFuZ2UoZGlmZikge1xuICAgIHZhciBuZXdEYXRlID0gZ2VuZXJhdGVDb25maWcuYWRkTW9udGgodmlld0RhdGUsIGRpZmYpO1xuICAgIG9uVmlld0RhdGVDaGFuZ2UobmV3RGF0ZSk7XG4gICAgb25QYW5lbENoYW5nZShudWxsLCBuZXdEYXRlKTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocGFuZWxQcmVmaXhDbHMsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocGFuZWxQcmVmaXhDbHMsIFwiLWFjdGl2ZVwiKSwgYWN0aXZlKSlcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRGF0ZUhlYWRlciwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIHZpZXdEYXRlOiB2aWV3RGF0ZVxuICAgIC8vIFZpZXcgT3BlcmF0aW9uXG4gICAgLFxuICAgIG9uUHJldlllYXI6IGZ1bmN0aW9uIG9uUHJldlllYXIoKSB7XG4gICAgICBvblllYXJDaGFuZ2UoLTEpO1xuICAgIH0sXG4gICAgb25OZXh0WWVhcjogZnVuY3Rpb24gb25OZXh0WWVhcigpIHtcbiAgICAgIG9uWWVhckNoYW5nZSgxKTtcbiAgICB9LFxuICAgIG9uUHJldk1vbnRoOiBmdW5jdGlvbiBvblByZXZNb250aCgpIHtcbiAgICAgIG9uTW9udGhDaGFuZ2UoLTEpO1xuICAgIH0sXG4gICAgb25OZXh0TW9udGg6IGZ1bmN0aW9uIG9uTmV4dE1vbnRoKCkge1xuICAgICAgb25Nb250aENoYW5nZSgxKTtcbiAgICB9LFxuICAgIG9uTW9udGhDbGljazogZnVuY3Rpb24gb25Nb250aENsaWNrKCkge1xuICAgICAgb25QYW5lbENoYW5nZSgnbW9udGgnLCB2aWV3RGF0ZSk7XG4gICAgfSxcbiAgICBvblllYXJDbGljazogZnVuY3Rpb24gb25ZZWFyQ2xpY2soKSB7XG4gICAgICBvblBhbmVsQ2hhbmdlKCd5ZWFyJywgdmlld0RhdGUpO1xuICAgIH1cbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEYXRlQm9keSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgb25TZWxlY3Q6IGZ1bmN0aW9uIG9uU2VsZWN0KGRhdGUpIHtcbiAgICAgIHJldHVybiBfb25TZWxlY3QoZGF0ZSwgJ21vdXNlJyk7XG4gICAgfSxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgdmlld0RhdGU6IHZpZXdEYXRlLFxuICAgIHJvd0NvdW50OiBEQVRFX1JPV19DT1VOVFxuICB9KSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgRGF0ZVBhbmVsOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuaW1wb3J0IERhdGVQYW5lbCBmcm9tICcuLi9EYXRlUGFuZWwnO1xuaW1wb3J0IFRpbWVQYW5lbCBmcm9tICcuLi9UaW1lUGFuZWwnO1xuaW1wb3J0IHsgdHVwbGUgfSBmcm9tICcuLi8uLi91dGlscy9taXNjVXRpbCc7XG5pbXBvcnQgeyBzZXREYXRlVGltZSBhcyBzZXRUaW1lIH0gZnJvbSAnLi4vLi4vdXRpbHMvdGltZVV0aWwnO1xudmFyIEFDVElWRV9QQU5FTCA9IHR1cGxlKCdkYXRlJywgJ3RpbWUnKTtcbmZ1bmN0aW9uIERhdGV0aW1lUGFuZWwocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBvcGVyYXRpb25SZWYgPSBwcm9wcy5vcGVyYXRpb25SZWYsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZyxcbiAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZSxcbiAgICBkaXNhYmxlZFRpbWUgPSBwcm9wcy5kaXNhYmxlZFRpbWUsXG4gICAgc2hvd1RpbWUgPSBwcm9wcy5zaG93VGltZSxcbiAgICBvblNlbGVjdCA9IHByb3BzLm9uU2VsZWN0O1xuICB2YXIgcGFuZWxQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRhdGV0aW1lLXBhbmVsXCIpO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUobnVsbCksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgYWN0aXZlUGFuZWwgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEFjdGl2ZVBhbmVsID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIGRhdGVPcGVyYXRpb25SZWYgPSBSZWFjdC51c2VSZWYoe30pO1xuICB2YXIgdGltZU9wZXJhdGlvblJlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG4gIHZhciB0aW1lUHJvcHMgPSBfdHlwZW9mKHNob3dUaW1lKSA9PT0gJ29iamVjdCcgPyBfb2JqZWN0U3ByZWFkKHt9LCBzaG93VGltZSkgOiB7fTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gS2V5Ym9hcmQgPT09PT09PT09PT09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gZ2V0TmV4dEFjdGl2ZShvZmZzZXQpIHtcbiAgICB2YXIgYWN0aXZlSW5kZXggPSBBQ1RJVkVfUEFORUwuaW5kZXhPZihhY3RpdmVQYW5lbCkgKyBvZmZzZXQ7XG4gICAgdmFyIG5leHRBY3RpdmVQYW5lbCA9IEFDVElWRV9QQU5FTFthY3RpdmVJbmRleF0gfHwgbnVsbDtcbiAgICByZXR1cm4gbmV4dEFjdGl2ZVBhbmVsO1xuICB9XG4gIHZhciBvbkJsdXIgPSBmdW5jdGlvbiBvbkJsdXIoZSkge1xuICAgIGlmICh0aW1lT3BlcmF0aW9uUmVmLmN1cnJlbnQub25CbHVyKSB7XG4gICAgICB0aW1lT3BlcmF0aW9uUmVmLmN1cnJlbnQub25CbHVyKGUpO1xuICAgIH1cbiAgICBzZXRBY3RpdmVQYW5lbChudWxsKTtcbiAgfTtcbiAgb3BlcmF0aW9uUmVmLmN1cnJlbnQgPSB7XG4gICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIC8vIFN3aXRjaCBhY3RpdmUgcGFuZWxcbiAgICAgIGlmIChldmVudC53aGljaCA9PT0gS2V5Q29kZS5UQUIpIHtcbiAgICAgICAgdmFyIG5leHRBY3RpdmVQYW5lbCA9IGdldE5leHRBY3RpdmUoZXZlbnQuc2hpZnRLZXkgPyAtMSA6IDEpO1xuICAgICAgICBzZXRBY3RpdmVQYW5lbChuZXh0QWN0aXZlUGFuZWwpO1xuICAgICAgICBpZiAobmV4dEFjdGl2ZVBhbmVsKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8vIE9wZXJhdGUgb24gY3VycmVudCBhY3RpdmUgcGFuZWxcbiAgICAgIGlmIChhY3RpdmVQYW5lbCkge1xuICAgICAgICB2YXIgcmVmID0gYWN0aXZlUGFuZWwgPT09ICdkYXRlJyA/IGRhdGVPcGVyYXRpb25SZWYgOiB0aW1lT3BlcmF0aW9uUmVmO1xuICAgICAgICBpZiAocmVmLmN1cnJlbnQgJiYgcmVmLmN1cnJlbnQub25LZXlEb3duKSB7XG4gICAgICAgICAgcmVmLmN1cnJlbnQub25LZXlEb3duKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8vIFN3aXRjaCBmaXJzdCBhY3RpdmUgcGFuZWwgaWYgb3BlcmF0ZSB3aXRob3V0IHBhbmVsXG4gICAgICBpZiAoW0tleUNvZGUuTEVGVCwgS2V5Q29kZS5SSUdIVCwgS2V5Q29kZS5VUCwgS2V5Q29kZS5ET1dOXS5pbmNsdWRlcyhldmVudC53aGljaCkpIHtcbiAgICAgICAgc2V0QWN0aXZlUGFuZWwoJ2RhdGUnKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBvbkJsdXI6IG9uQmx1cixcbiAgICBvbkNsb3NlOiBvbkJsdXJcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IEV2ZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9uSW50ZXJuYWxTZWxlY3QgPSBmdW5jdGlvbiBvbkludGVybmFsU2VsZWN0KGRhdGUsIHNvdXJjZSkge1xuICAgIHZhciBzZWxlY3RlZERhdGUgPSBkYXRlO1xuICAgIGlmIChzb3VyY2UgPT09ICdkYXRlJyAmJiAhdmFsdWUgJiYgdGltZVByb3BzLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgLy8gRGF0ZSB3aXRoIHRpbWUgZGVmYXVsdFZhbHVlXG4gICAgICBzZWxlY3RlZERhdGUgPSBnZW5lcmF0ZUNvbmZpZy5zZXRIb3VyKHNlbGVjdGVkRGF0ZSwgZ2VuZXJhdGVDb25maWcuZ2V0SG91cih0aW1lUHJvcHMuZGVmYXVsdFZhbHVlKSk7XG4gICAgICBzZWxlY3RlZERhdGUgPSBnZW5lcmF0ZUNvbmZpZy5zZXRNaW51dGUoc2VsZWN0ZWREYXRlLCBnZW5lcmF0ZUNvbmZpZy5nZXRNaW51dGUodGltZVByb3BzLmRlZmF1bHRWYWx1ZSkpO1xuICAgICAgc2VsZWN0ZWREYXRlID0gZ2VuZXJhdGVDb25maWcuc2V0U2Vjb25kKHNlbGVjdGVkRGF0ZSwgZ2VuZXJhdGVDb25maWcuZ2V0U2Vjb25kKHRpbWVQcm9wcy5kZWZhdWx0VmFsdWUpKTtcbiAgICB9IGVsc2UgaWYgKHNvdXJjZSA9PT0gJ3RpbWUnICYmICF2YWx1ZSAmJiBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHNlbGVjdGVkRGF0ZSA9IGdlbmVyYXRlQ29uZmlnLnNldFllYXIoc2VsZWN0ZWREYXRlLCBnZW5lcmF0ZUNvbmZpZy5nZXRZZWFyKGRlZmF1bHRWYWx1ZSkpO1xuICAgICAgc2VsZWN0ZWREYXRlID0gZ2VuZXJhdGVDb25maWcuc2V0TW9udGgoc2VsZWN0ZWREYXRlLCBnZW5lcmF0ZUNvbmZpZy5nZXRNb250aChkZWZhdWx0VmFsdWUpKTtcbiAgICAgIHNlbGVjdGVkRGF0ZSA9IGdlbmVyYXRlQ29uZmlnLnNldERhdGUoc2VsZWN0ZWREYXRlLCBnZW5lcmF0ZUNvbmZpZy5nZXREYXRlKGRlZmF1bHRWYWx1ZSkpO1xuICAgIH1cbiAgICBpZiAob25TZWxlY3QpIHtcbiAgICAgIG9uU2VsZWN0KHNlbGVjdGVkRGF0ZSwgJ21vdXNlJyk7XG4gICAgfVxuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZGlzYWJsZWRUaW1lcyA9IGRpc2FibGVkVGltZSA/IGRpc2FibGVkVGltZSh2YWx1ZSB8fCBudWxsKSA6IHt9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhwYW5lbFByZWZpeENscywgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwYW5lbFByZWZpeENscywgXCItYWN0aXZlXCIpLCBhY3RpdmVQYW5lbCkpXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERhdGVQYW5lbCwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgb3BlcmF0aW9uUmVmOiBkYXRlT3BlcmF0aW9uUmVmLFxuICAgIGFjdGl2ZTogYWN0aXZlUGFuZWwgPT09ICdkYXRlJyxcbiAgICBvblNlbGVjdDogZnVuY3Rpb24gb25TZWxlY3QoZGF0ZSkge1xuICAgICAgb25JbnRlcm5hbFNlbGVjdChzZXRUaW1lKGdlbmVyYXRlQ29uZmlnLCBkYXRlLCAhdmFsdWUgJiYgX3R5cGVvZihzaG93VGltZSkgPT09ICdvYmplY3QnID8gc2hvd1RpbWUuZGVmYXVsdFZhbHVlIDogbnVsbCksICdkYXRlJyk7XG4gICAgfVxuICB9KSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRpbWVQYW5lbCwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgZm9ybWF0OiB1bmRlZmluZWRcbiAgfSwgdGltZVByb3BzLCBkaXNhYmxlZFRpbWVzLCB7XG4gICAgZGlzYWJsZWRUaW1lOiBudWxsLFxuICAgIGRlZmF1bHRWYWx1ZTogdW5kZWZpbmVkLFxuICAgIG9wZXJhdGlvblJlZjogdGltZU9wZXJhdGlvblJlZixcbiAgICBhY3RpdmU6IGFjdGl2ZVBhbmVsID09PSAndGltZScsXG4gICAgb25TZWxlY3Q6IGZ1bmN0aW9uIG9uU2VsZWN0KGRhdGUpIHtcbiAgICAgIG9uSW50ZXJuYWxTZWxlY3QoZGF0ZSwgJ3RpbWUnKTtcbiAgICB9XG4gIH0pKSk7XG59XG5leHBvcnQgZGVmYXVsdCBEYXRldGltZVBhbmVsOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IERhdGVQYW5lbCBmcm9tICcuLi9EYXRlUGFuZWwnO1xuaW1wb3J0IHsgaXNTYW1lV2VlayB9IGZyb20gJy4uLy4uL3V0aWxzL2RhdGVVdGlsJztcbmZ1bmN0aW9uIFdlZWtQYW5lbChwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGdlbmVyYXRlQ29uZmlnID0gcHJvcHMuZ2VuZXJhdGVDb25maWcsXG4gICAgbG9jYWxlID0gcHJvcHMubG9jYWxlLFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWU7XG4gIC8vIFJlbmRlciBhZGRpdGlvbmFsIGNvbHVtblxuICB2YXIgY2VsbFByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2VsbFwiKTtcbiAgdmFyIHByZWZpeENvbHVtbiA9IGZ1bmN0aW9uIHByZWZpeENvbHVtbihkYXRlKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidGRcIiwge1xuICAgICAga2V5OiBcIndlZWtcIixcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjZWxsUHJlZml4Q2xzLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi13ZWVrXCIpKVxuICAgIH0sIGdlbmVyYXRlQ29uZmlnLmxvY2FsZS5nZXRXZWVrKGxvY2FsZS5sb2NhbGUsIGRhdGUpKTtcbiAgfTtcbiAgLy8gQWRkIHJvdyBjbGFzc05hbWVcbiAgdmFyIHJvd1ByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd2Vlay1wYW5lbC1yb3dcIik7XG4gIHZhciByb3dDbGFzc05hbWUgPSBmdW5jdGlvbiByb3dDbGFzc05hbWUoZGF0ZSkge1xuICAgIHJldHVybiBjbGFzc05hbWVzKHJvd1ByZWZpeENscywgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChyb3dQcmVmaXhDbHMsIFwiLXNlbGVjdGVkXCIpLCBpc1NhbWVXZWVrKGdlbmVyYXRlQ29uZmlnLCBsb2NhbGUubG9jYWxlLCB2YWx1ZSwgZGF0ZSkpKTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERhdGVQYW5lbCwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcGFuZWxOYW1lOiBcIndlZWtcIixcbiAgICBwcmVmaXhDb2x1bW46IHByZWZpeENvbHVtbixcbiAgICByb3dDbGFzc05hbWU6IHJvd0NsYXNzTmFtZSxcbiAgICBrZXlib2FyZENvbmZpZzoge1xuICAgICAgb25MZWZ0UmlnaHQ6IG51bGxcbiAgICB9XG4gIH0pKTtcbn1cbmV4cG9ydCBkZWZhdWx0IFdlZWtQYW5lbDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBIZWFkZXIgZnJvbSAnLi4vSGVhZGVyJztcbmltcG9ydCBQYW5lbENvbnRleHQgZnJvbSAnLi4vLi4vUGFuZWxDb250ZXh0JztcbmltcG9ydCB7IGZvcm1hdFZhbHVlIH0gZnJvbSAnLi4vLi4vdXRpbHMvZGF0ZVV0aWwnO1xuZnVuY3Rpb24gTW9udGhIZWFkZXIocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnLFxuICAgIGxvY2FsZSA9IHByb3BzLmxvY2FsZSxcbiAgICB2aWV3RGF0ZSA9IHByb3BzLnZpZXdEYXRlLFxuICAgIG9uTmV4dFllYXIgPSBwcm9wcy5vbk5leHRZZWFyLFxuICAgIG9uUHJldlllYXIgPSBwcm9wcy5vblByZXZZZWFyLFxuICAgIG9uWWVhckNsaWNrID0gcHJvcHMub25ZZWFyQ2xpY2s7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoUGFuZWxDb250ZXh0KSxcbiAgICBoaWRlSGVhZGVyID0gX1JlYWN0JHVzZUNvbnRleHQuaGlkZUhlYWRlcjtcbiAgaWYgKGhpZGVIZWFkZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgaGVhZGVyUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkZXJcIik7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChIZWFkZXIsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogaGVhZGVyUHJlZml4Q2xzLFxuICAgIG9uU3VwZXJQcmV2OiBvblByZXZZZWFyLFxuICAgIG9uU3VwZXJOZXh0OiBvbk5leHRZZWFyXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgdHlwZTogXCJidXR0b25cIixcbiAgICBvbkNsaWNrOiBvblllYXJDbGljayxcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCIteWVhci1idG5cIilcbiAgfSwgZm9ybWF0VmFsdWUodmlld0RhdGUsIHtcbiAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICBmb3JtYXQ6IGxvY2FsZS55ZWFyRm9ybWF0LFxuICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZ1xuICB9KSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgTW9udGhIZWFkZXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmb3JtYXRWYWx1ZSwgaXNTYW1lTW9udGggfSBmcm9tICcuLi8uLi91dGlscy9kYXRlVXRpbCc7XG5pbXBvcnQgUmFuZ2VDb250ZXh0IGZyb20gJy4uLy4uL1JhbmdlQ29udGV4dCc7XG5pbXBvcnQgdXNlQ2VsbENsYXNzTmFtZSBmcm9tICcuLi8uLi9ob29rcy91c2VDZWxsQ2xhc3NOYW1lJztcbmltcG9ydCBQYW5lbEJvZHkgZnJvbSAnLi4vUGFuZWxCb2R5JztcbmV4cG9ydCB2YXIgTU9OVEhfQ09MX0NPVU5UID0gMztcbnZhciBNT05USF9ST1dfQ09VTlQgPSA0O1xuZnVuY3Rpb24gTW9udGhCb2R5KHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgbG9jYWxlID0gcHJvcHMubG9jYWxlLFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgdmlld0RhdGUgPSBwcm9wcy52aWV3RGF0ZSxcbiAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnLFxuICAgIG1vbnRoQ2VsbFJlbmRlciA9IHByb3BzLm1vbnRoQ2VsbFJlbmRlcjtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChSYW5nZUNvbnRleHQpLFxuICAgIHJhbmdlZFZhbHVlID0gX1JlYWN0JHVzZUNvbnRleHQucmFuZ2VkVmFsdWUsXG4gICAgaG92ZXJSYW5nZWRWYWx1ZSA9IF9SZWFjdCR1c2VDb250ZXh0LmhvdmVyUmFuZ2VkVmFsdWU7XG4gIHZhciBjZWxsUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jZWxsXCIpO1xuICB2YXIgZ2V0Q2VsbENsYXNzTmFtZSA9IHVzZUNlbGxDbGFzc05hbWUoe1xuICAgIGNlbGxQcmVmaXhDbHM6IGNlbGxQcmVmaXhDbHMsXG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZyxcbiAgICByYW5nZWRWYWx1ZTogcmFuZ2VkVmFsdWUsXG4gICAgaG92ZXJSYW5nZWRWYWx1ZTogaG92ZXJSYW5nZWRWYWx1ZSxcbiAgICBpc1NhbWVDZWxsOiBmdW5jdGlvbiBpc1NhbWVDZWxsKGN1cnJlbnQsIHRhcmdldCkge1xuICAgICAgcmV0dXJuIGlzU2FtZU1vbnRoKGdlbmVyYXRlQ29uZmlnLCBjdXJyZW50LCB0YXJnZXQpO1xuICAgIH0sXG4gICAgaXNJblZpZXc6IGZ1bmN0aW9uIGlzSW5WaWV3KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBvZmZzZXRDZWxsOiBmdW5jdGlvbiBvZmZzZXRDZWxsKGRhdGUsIG9mZnNldCkge1xuICAgICAgcmV0dXJuIGdlbmVyYXRlQ29uZmlnLmFkZE1vbnRoKGRhdGUsIG9mZnNldCk7XG4gICAgfVxuICB9KTtcbiAgdmFyIG1vbnRoc0xvY2FsZSA9IGxvY2FsZS5zaG9ydE1vbnRocyB8fCAoZ2VuZXJhdGVDb25maWcubG9jYWxlLmdldFNob3J0TW9udGhzID8gZ2VuZXJhdGVDb25maWcubG9jYWxlLmdldFNob3J0TW9udGhzKGxvY2FsZS5sb2NhbGUpIDogW10pO1xuICB2YXIgYmFzZU1vbnRoID0gZ2VuZXJhdGVDb25maWcuc2V0TW9udGgodmlld0RhdGUsIDApO1xuICB2YXIgZ2V0Q2VsbE5vZGUgPSBtb250aENlbGxSZW5kZXIgPyBmdW5jdGlvbiAoZGF0ZSkge1xuICAgIHJldHVybiBtb250aENlbGxSZW5kZXIoZGF0ZSwgbG9jYWxlKTtcbiAgfSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBhbmVsQm9keSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcm93TnVtOiBNT05USF9ST1dfQ09VTlQsXG4gICAgY29sTnVtOiBNT05USF9DT0xfQ09VTlQsXG4gICAgYmFzZURhdGU6IGJhc2VNb250aCxcbiAgICBnZXRDZWxsTm9kZTogZ2V0Q2VsbE5vZGUsXG4gICAgZ2V0Q2VsbFRleHQ6IGZ1bmN0aW9uIGdldENlbGxUZXh0KGRhdGUpIHtcbiAgICAgIHJldHVybiBsb2NhbGUubW9udGhGb3JtYXQgPyBmb3JtYXRWYWx1ZShkYXRlLCB7XG4gICAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgICBmb3JtYXQ6IGxvY2FsZS5tb250aEZvcm1hdCxcbiAgICAgICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnXG4gICAgICB9KSA6IG1vbnRoc0xvY2FsZVtnZW5lcmF0ZUNvbmZpZy5nZXRNb250aChkYXRlKV07XG4gICAgfSxcbiAgICBnZXRDZWxsQ2xhc3NOYW1lOiBnZXRDZWxsQ2xhc3NOYW1lLFxuICAgIGdldENlbGxEYXRlOiBnZW5lcmF0ZUNvbmZpZy5hZGRNb250aCxcbiAgICB0aXRsZUNlbGw6IGZ1bmN0aW9uIHRpdGxlQ2VsbChkYXRlKSB7XG4gICAgICByZXR1cm4gZm9ybWF0VmFsdWUoZGF0ZSwge1xuICAgICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgICAgZm9ybWF0OiAnWVlZWS1NTScsXG4gICAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZ1xuICAgICAgfSk7XG4gICAgfVxuICB9KSk7XG59XG5leHBvcnQgZGVmYXVsdCBNb250aEJvZHk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTW9udGhIZWFkZXIgZnJvbSAnLi9Nb250aEhlYWRlcic7XG5pbXBvcnQgTW9udGhCb2R5LCB7IE1PTlRIX0NPTF9DT1VOVCB9IGZyb20gJy4vTW9udGhCb2R5JztcbmltcG9ydCB7IGNyZWF0ZUtleURvd25IYW5kbGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvdWlVdGlsJztcbmZ1bmN0aW9uIE1vbnRoUGFuZWwocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBvcGVyYXRpb25SZWYgPSBwcm9wcy5vcGVyYXRpb25SZWYsXG4gICAgb25WaWV3RGF0ZUNoYW5nZSA9IHByb3BzLm9uVmlld0RhdGVDaGFuZ2UsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZyxcbiAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgIHZpZXdEYXRlID0gcHJvcHMudmlld0RhdGUsXG4gICAgb25QYW5lbENoYW5nZSA9IHByb3BzLm9uUGFuZWxDaGFuZ2UsXG4gICAgX29uU2VsZWN0ID0gcHJvcHMub25TZWxlY3Q7XG4gIHZhciBwYW5lbFByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbW9udGgtcGFuZWxcIik7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IEtleWJvYXJkID09PT09PT09PT09PT09PT09PT09PT09XG4gIG9wZXJhdGlvblJlZi5jdXJyZW50ID0ge1xuICAgIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICByZXR1cm4gY3JlYXRlS2V5RG93bkhhbmRsZXIoZXZlbnQsIHtcbiAgICAgICAgb25MZWZ0UmlnaHQ6IGZ1bmN0aW9uIG9uTGVmdFJpZ2h0KGRpZmYpIHtcbiAgICAgICAgICBfb25TZWxlY3QoZ2VuZXJhdGVDb25maWcuYWRkTW9udGgodmFsdWUgfHwgdmlld0RhdGUsIGRpZmYpLCAna2V5Jyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ3RybExlZnRSaWdodDogZnVuY3Rpb24gb25DdHJsTGVmdFJpZ2h0KGRpZmYpIHtcbiAgICAgICAgICBfb25TZWxlY3QoZ2VuZXJhdGVDb25maWcuYWRkWWVhcih2YWx1ZSB8fCB2aWV3RGF0ZSwgZGlmZiksICdrZXknKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VcERvd246IGZ1bmN0aW9uIG9uVXBEb3duKGRpZmYpIHtcbiAgICAgICAgICBfb25TZWxlY3QoZ2VuZXJhdGVDb25maWcuYWRkTW9udGgodmFsdWUgfHwgdmlld0RhdGUsIGRpZmYgKiBNT05USF9DT0xfQ09VTlQpLCAna2V5Jyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRW50ZXI6IGZ1bmN0aW9uIG9uRW50ZXIoKSB7XG4gICAgICAgICAgb25QYW5lbENoYW5nZSgnZGF0ZScsIHZhbHVlIHx8IHZpZXdEYXRlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PSBWaWV3IE9wZXJhdGlvbiA9PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25ZZWFyQ2hhbmdlID0gZnVuY3Rpb24gb25ZZWFyQ2hhbmdlKGRpZmYpIHtcbiAgICB2YXIgbmV3RGF0ZSA9IGdlbmVyYXRlQ29uZmlnLmFkZFllYXIodmlld0RhdGUsIGRpZmYpO1xuICAgIG9uVmlld0RhdGVDaGFuZ2UobmV3RGF0ZSk7XG4gICAgb25QYW5lbENoYW5nZShudWxsLCBuZXdEYXRlKTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IHBhbmVsUHJlZml4Q2xzXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1vbnRoSGVhZGVyLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBvblByZXZZZWFyOiBmdW5jdGlvbiBvblByZXZZZWFyKCkge1xuICAgICAgb25ZZWFyQ2hhbmdlKC0xKTtcbiAgICB9LFxuICAgIG9uTmV4dFllYXI6IGZ1bmN0aW9uIG9uTmV4dFllYXIoKSB7XG4gICAgICBvblllYXJDaGFuZ2UoMSk7XG4gICAgfSxcbiAgICBvblllYXJDbGljazogZnVuY3Rpb24gb25ZZWFyQ2xpY2soKSB7XG4gICAgICBvblBhbmVsQ2hhbmdlKCd5ZWFyJywgdmlld0RhdGUpO1xuICAgIH1cbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNb250aEJvZHksIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIG9uU2VsZWN0OiBmdW5jdGlvbiBvblNlbGVjdChkYXRlKSB7XG4gICAgICBfb25TZWxlY3QoZGF0ZSwgJ21vdXNlJyk7XG4gICAgICBvblBhbmVsQ2hhbmdlKCdkYXRlJywgZGF0ZSk7XG4gICAgfVxuICB9KSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgTW9udGhQYW5lbDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBIZWFkZXIgZnJvbSAnLi4vSGVhZGVyJztcbmltcG9ydCBQYW5lbENvbnRleHQgZnJvbSAnLi4vLi4vUGFuZWxDb250ZXh0JztcbmltcG9ydCB7IGZvcm1hdFZhbHVlIH0gZnJvbSAnLi4vLi4vdXRpbHMvZGF0ZVV0aWwnO1xuZnVuY3Rpb24gUXVhcnRlckhlYWRlcihwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGdlbmVyYXRlQ29uZmlnID0gcHJvcHMuZ2VuZXJhdGVDb25maWcsXG4gICAgbG9jYWxlID0gcHJvcHMubG9jYWxlLFxuICAgIHZpZXdEYXRlID0gcHJvcHMudmlld0RhdGUsXG4gICAgb25OZXh0WWVhciA9IHByb3BzLm9uTmV4dFllYXIsXG4gICAgb25QcmV2WWVhciA9IHByb3BzLm9uUHJldlllYXIsXG4gICAgb25ZZWFyQ2xpY2sgPSBwcm9wcy5vblllYXJDbGljaztcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChQYW5lbENvbnRleHQpLFxuICAgIGhpZGVIZWFkZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5oaWRlSGVhZGVyO1xuICBpZiAoaGlkZUhlYWRlcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBoZWFkZXJQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhlYWRlclwiKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEhlYWRlciwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcHJlZml4Q2xzOiBoZWFkZXJQcmVmaXhDbHMsXG4gICAgb25TdXBlclByZXY6IG9uUHJldlllYXIsXG4gICAgb25TdXBlck5leHQ6IG9uTmV4dFllYXJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgIG9uQ2xpY2s6IG9uWWVhckNsaWNrLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi15ZWFyLWJ0blwiKVxuICB9LCBmb3JtYXRWYWx1ZSh2aWV3RGF0ZSwge1xuICAgIGxvY2FsZTogbG9jYWxlLFxuICAgIGZvcm1hdDogbG9jYWxlLnllYXJGb3JtYXQsXG4gICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnXG4gIH0pKSk7XG59XG5leHBvcnQgZGVmYXVsdCBRdWFydGVySGVhZGVyOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZm9ybWF0VmFsdWUsIGlzU2FtZVF1YXJ0ZXIgfSBmcm9tICcuLi8uLi91dGlscy9kYXRlVXRpbCc7XG5pbXBvcnQgUmFuZ2VDb250ZXh0IGZyb20gJy4uLy4uL1JhbmdlQ29udGV4dCc7XG5pbXBvcnQgdXNlQ2VsbENsYXNzTmFtZSBmcm9tICcuLi8uLi9ob29rcy91c2VDZWxsQ2xhc3NOYW1lJztcbmltcG9ydCBQYW5lbEJvZHkgZnJvbSAnLi4vUGFuZWxCb2R5JztcbmV4cG9ydCB2YXIgUVVBUlRFUl9DT0xfQ09VTlQgPSA0O1xudmFyIFFVQVJURVJfUk9XX0NPVU5UID0gMTtcbmZ1bmN0aW9uIFF1YXJ0ZXJCb2R5KHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgbG9jYWxlID0gcHJvcHMubG9jYWxlLFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgdmlld0RhdGUgPSBwcm9wcy52aWV3RGF0ZSxcbiAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFJhbmdlQ29udGV4dCksXG4gICAgcmFuZ2VkVmFsdWUgPSBfUmVhY3QkdXNlQ29udGV4dC5yYW5nZWRWYWx1ZSxcbiAgICBob3ZlclJhbmdlZFZhbHVlID0gX1JlYWN0JHVzZUNvbnRleHQuaG92ZXJSYW5nZWRWYWx1ZTtcbiAgdmFyIGNlbGxQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNlbGxcIik7XG4gIHZhciBnZXRDZWxsQ2xhc3NOYW1lID0gdXNlQ2VsbENsYXNzTmFtZSh7XG4gICAgY2VsbFByZWZpeENsczogY2VsbFByZWZpeENscyxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnLFxuICAgIHJhbmdlZFZhbHVlOiByYW5nZWRWYWx1ZSxcbiAgICBob3ZlclJhbmdlZFZhbHVlOiBob3ZlclJhbmdlZFZhbHVlLFxuICAgIGlzU2FtZUNlbGw6IGZ1bmN0aW9uIGlzU2FtZUNlbGwoY3VycmVudCwgdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gaXNTYW1lUXVhcnRlcihnZW5lcmF0ZUNvbmZpZywgY3VycmVudCwgdGFyZ2V0KTtcbiAgICB9LFxuICAgIGlzSW5WaWV3OiBmdW5jdGlvbiBpc0luVmlldygpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgb2Zmc2V0Q2VsbDogZnVuY3Rpb24gb2Zmc2V0Q2VsbChkYXRlLCBvZmZzZXQpIHtcbiAgICAgIHJldHVybiBnZW5lcmF0ZUNvbmZpZy5hZGRNb250aChkYXRlLCBvZmZzZXQgKiAzKTtcbiAgICB9XG4gIH0pO1xuICB2YXIgYmFzZVF1YXJ0ZXIgPSBnZW5lcmF0ZUNvbmZpZy5zZXREYXRlKGdlbmVyYXRlQ29uZmlnLnNldE1vbnRoKHZpZXdEYXRlLCAwKSwgMSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYW5lbEJvZHksIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJvd051bTogUVVBUlRFUl9ST1dfQ09VTlQsXG4gICAgY29sTnVtOiBRVUFSVEVSX0NPTF9DT1VOVCxcbiAgICBiYXNlRGF0ZTogYmFzZVF1YXJ0ZXIsXG4gICAgZ2V0Q2VsbFRleHQ6IGZ1bmN0aW9uIGdldENlbGxUZXh0KGRhdGUpIHtcbiAgICAgIHJldHVybiBmb3JtYXRWYWx1ZShkYXRlLCB7XG4gICAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgICBmb3JtYXQ6IGxvY2FsZS5xdWFydGVyRm9ybWF0IHx8ICdbUV1RJyxcbiAgICAgICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnXG4gICAgICB9KTtcbiAgICB9LFxuICAgIGdldENlbGxDbGFzc05hbWU6IGdldENlbGxDbGFzc05hbWUsXG4gICAgZ2V0Q2VsbERhdGU6IGZ1bmN0aW9uIGdldENlbGxEYXRlKGRhdGUsIG9mZnNldCkge1xuICAgICAgcmV0dXJuIGdlbmVyYXRlQ29uZmlnLmFkZE1vbnRoKGRhdGUsIG9mZnNldCAqIDMpO1xuICAgIH0sXG4gICAgdGl0bGVDZWxsOiBmdW5jdGlvbiB0aXRsZUNlbGwoZGF0ZSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFZhbHVlKGRhdGUsIHtcbiAgICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICAgIGZvcm1hdDogJ1lZWVktW1FdUScsXG4gICAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZ1xuICAgICAgfSk7XG4gICAgfVxuICB9KSk7XG59XG5leHBvcnQgZGVmYXVsdCBRdWFydGVyQm9keTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBRdWFydGVySGVhZGVyIGZyb20gJy4vUXVhcnRlckhlYWRlcic7XG5pbXBvcnQgUXVhcnRlckJvZHkgZnJvbSAnLi9RdWFydGVyQm9keSc7XG5pbXBvcnQgeyBjcmVhdGVLZXlEb3duSGFuZGxlciB9IGZyb20gJy4uLy4uL3V0aWxzL3VpVXRpbCc7XG5mdW5jdGlvbiBRdWFydGVyUGFuZWwocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBvcGVyYXRpb25SZWYgPSBwcm9wcy5vcGVyYXRpb25SZWYsXG4gICAgb25WaWV3RGF0ZUNoYW5nZSA9IHByb3BzLm9uVmlld0RhdGVDaGFuZ2UsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZyxcbiAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgIHZpZXdEYXRlID0gcHJvcHMudmlld0RhdGUsXG4gICAgb25QYW5lbENoYW5nZSA9IHByb3BzLm9uUGFuZWxDaGFuZ2UsXG4gICAgX29uU2VsZWN0ID0gcHJvcHMub25TZWxlY3Q7XG4gIHZhciBwYW5lbFByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcXVhcnRlci1wYW5lbFwiKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gS2V5Ym9hcmQgPT09PT09PT09PT09PT09PT09PT09PT1cbiAgb3BlcmF0aW9uUmVmLmN1cnJlbnQgPSB7XG4gICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIHJldHVybiBjcmVhdGVLZXlEb3duSGFuZGxlcihldmVudCwge1xuICAgICAgICBvbkxlZnRSaWdodDogZnVuY3Rpb24gb25MZWZ0UmlnaHQoZGlmZikge1xuICAgICAgICAgIF9vblNlbGVjdChnZW5lcmF0ZUNvbmZpZy5hZGRNb250aCh2YWx1ZSB8fCB2aWV3RGF0ZSwgZGlmZiAqIDMpLCAna2V5Jyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ3RybExlZnRSaWdodDogZnVuY3Rpb24gb25DdHJsTGVmdFJpZ2h0KGRpZmYpIHtcbiAgICAgICAgICBfb25TZWxlY3QoZ2VuZXJhdGVDb25maWcuYWRkWWVhcih2YWx1ZSB8fCB2aWV3RGF0ZSwgZGlmZiksICdrZXknKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VcERvd246IGZ1bmN0aW9uIG9uVXBEb3duKGRpZmYpIHtcbiAgICAgICAgICBfb25TZWxlY3QoZ2VuZXJhdGVDb25maWcuYWRkWWVhcih2YWx1ZSB8fCB2aWV3RGF0ZSwgZGlmZiksICdrZXknKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PSBWaWV3IE9wZXJhdGlvbiA9PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25ZZWFyQ2hhbmdlID0gZnVuY3Rpb24gb25ZZWFyQ2hhbmdlKGRpZmYpIHtcbiAgICB2YXIgbmV3RGF0ZSA9IGdlbmVyYXRlQ29uZmlnLmFkZFllYXIodmlld0RhdGUsIGRpZmYpO1xuICAgIG9uVmlld0RhdGVDaGFuZ2UobmV3RGF0ZSk7XG4gICAgb25QYW5lbENoYW5nZShudWxsLCBuZXdEYXRlKTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IHBhbmVsUHJlZml4Q2xzXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFF1YXJ0ZXJIZWFkZXIsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIG9uUHJldlllYXI6IGZ1bmN0aW9uIG9uUHJldlllYXIoKSB7XG4gICAgICBvblllYXJDaGFuZ2UoLTEpO1xuICAgIH0sXG4gICAgb25OZXh0WWVhcjogZnVuY3Rpb24gb25OZXh0WWVhcigpIHtcbiAgICAgIG9uWWVhckNoYW5nZSgxKTtcbiAgICB9LFxuICAgIG9uWWVhckNsaWNrOiBmdW5jdGlvbiBvblllYXJDbGljaygpIHtcbiAgICAgIG9uUGFuZWxDaGFuZ2UoJ3llYXInLCB2aWV3RGF0ZSk7XG4gICAgfVxuICB9KSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFF1YXJ0ZXJCb2R5LCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBvblNlbGVjdDogZnVuY3Rpb24gb25TZWxlY3QoZGF0ZSkge1xuICAgICAgX29uU2VsZWN0KGRhdGUsICdtb3VzZScpO1xuICAgIH1cbiAgfSkpKTtcbn1cbmV4cG9ydCBkZWZhdWx0IFF1YXJ0ZXJQYW5lbDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBIZWFkZXIgZnJvbSAnLi4vSGVhZGVyJztcbmltcG9ydCB7IFlFQVJfREVDQURFX0NPVU5UIH0gZnJvbSAnLic7XG5pbXBvcnQgUGFuZWxDb250ZXh0IGZyb20gJy4uLy4uL1BhbmVsQ29udGV4dCc7XG5mdW5jdGlvbiBZZWFySGVhZGVyKHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZyxcbiAgICB2aWV3RGF0ZSA9IHByb3BzLnZpZXdEYXRlLFxuICAgIG9uUHJldkRlY2FkZSA9IHByb3BzLm9uUHJldkRlY2FkZSxcbiAgICBvbk5leHREZWNhZGUgPSBwcm9wcy5vbk5leHREZWNhZGUsXG4gICAgb25EZWNhZGVDbGljayA9IHByb3BzLm9uRGVjYWRlQ2xpY2s7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoUGFuZWxDb250ZXh0KSxcbiAgICBoaWRlSGVhZGVyID0gX1JlYWN0JHVzZUNvbnRleHQuaGlkZUhlYWRlcjtcbiAgaWYgKGhpZGVIZWFkZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgaGVhZGVyUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkZXJcIik7XG4gIHZhciB5ZWFyTnVtYmVyID0gZ2VuZXJhdGVDb25maWcuZ2V0WWVhcih2aWV3RGF0ZSk7XG4gIHZhciBzdGFydFllYXIgPSBNYXRoLmZsb29yKHllYXJOdW1iZXIgLyBZRUFSX0RFQ0FERV9DT1VOVCkgKiBZRUFSX0RFQ0FERV9DT1VOVDtcbiAgdmFyIGVuZFllYXIgPSBzdGFydFllYXIgKyBZRUFSX0RFQ0FERV9DT1VOVCAtIDE7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChIZWFkZXIsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogaGVhZGVyUHJlZml4Q2xzLFxuICAgIG9uU3VwZXJQcmV2OiBvblByZXZEZWNhZGUsXG4gICAgb25TdXBlck5leHQ6IG9uTmV4dERlY2FkZVxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgb25DbGljazogb25EZWNhZGVDbGljayxcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGVjYWRlLWJ0blwiKVxuICB9LCBzdGFydFllYXIsIFwiLVwiLCBlbmRZZWFyKSk7XG59XG5leHBvcnQgZGVmYXVsdCBZZWFySGVhZGVyOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgWUVBUl9ERUNBREVfQ09VTlQgfSBmcm9tICcuJztcbmltcG9ydCB1c2VDZWxsQ2xhc3NOYW1lIGZyb20gJy4uLy4uL2hvb2tzL3VzZUNlbGxDbGFzc05hbWUnO1xuaW1wb3J0IHsgZm9ybWF0VmFsdWUsIGlzU2FtZVllYXIgfSBmcm9tICcuLi8uLi91dGlscy9kYXRlVXRpbCc7XG5pbXBvcnQgUmFuZ2VDb250ZXh0IGZyb20gJy4uLy4uL1JhbmdlQ29udGV4dCc7XG5pbXBvcnQgUGFuZWxCb2R5IGZyb20gJy4uL1BhbmVsQm9keSc7XG5leHBvcnQgdmFyIFlFQVJfQ09MX0NPVU5UID0gMztcbnZhciBZRUFSX1JPV19DT1VOVCA9IDQ7XG5mdW5jdGlvbiBZZWFyQm9keShwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgdmlld0RhdGUgPSBwcm9wcy52aWV3RGF0ZSxcbiAgICBsb2NhbGUgPSBwcm9wcy5sb2NhbGUsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZztcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChSYW5nZUNvbnRleHQpLFxuICAgIHJhbmdlZFZhbHVlID0gX1JlYWN0JHVzZUNvbnRleHQucmFuZ2VkVmFsdWUsXG4gICAgaG92ZXJSYW5nZWRWYWx1ZSA9IF9SZWFjdCR1c2VDb250ZXh0LmhvdmVyUmFuZ2VkVmFsdWU7XG4gIHZhciB5ZWFyUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jZWxsXCIpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFllYXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgeWVhck51bWJlciA9IGdlbmVyYXRlQ29uZmlnLmdldFllYXIodmlld0RhdGUpO1xuICB2YXIgc3RhcnRZZWFyID0gTWF0aC5mbG9vcih5ZWFyTnVtYmVyIC8gWUVBUl9ERUNBREVfQ09VTlQpICogWUVBUl9ERUNBREVfQ09VTlQ7XG4gIHZhciBlbmRZZWFyID0gc3RhcnRZZWFyICsgWUVBUl9ERUNBREVfQ09VTlQgLSAxO1xuICB2YXIgYmFzZVllYXIgPSBnZW5lcmF0ZUNvbmZpZy5zZXRZZWFyKHZpZXdEYXRlLCBzdGFydFllYXIgLSBNYXRoLmNlaWwoKFlFQVJfQ09MX0NPVU5UICogWUVBUl9ST1dfQ09VTlQgLSBZRUFSX0RFQ0FERV9DT1VOVCkgLyAyKSk7XG4gIHZhciBpc0luVmlldyA9IGZ1bmN0aW9uIGlzSW5WaWV3KGRhdGUpIHtcbiAgICB2YXIgY3VycmVudFllYXJOdW1iZXIgPSBnZW5lcmF0ZUNvbmZpZy5nZXRZZWFyKGRhdGUpO1xuICAgIHJldHVybiBzdGFydFllYXIgPD0gY3VycmVudFllYXJOdW1iZXIgJiYgY3VycmVudFllYXJOdW1iZXIgPD0gZW5kWWVhcjtcbiAgfTtcbiAgdmFyIGdldENlbGxDbGFzc05hbWUgPSB1c2VDZWxsQ2xhc3NOYW1lKHtcbiAgICBjZWxsUHJlZml4Q2xzOiB5ZWFyUHJlZml4Q2xzLFxuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBnZW5lcmF0ZUNvbmZpZzogZ2VuZXJhdGVDb25maWcsXG4gICAgcmFuZ2VkVmFsdWU6IHJhbmdlZFZhbHVlLFxuICAgIGhvdmVyUmFuZ2VkVmFsdWU6IGhvdmVyUmFuZ2VkVmFsdWUsXG4gICAgaXNTYW1lQ2VsbDogZnVuY3Rpb24gaXNTYW1lQ2VsbChjdXJyZW50LCB0YXJnZXQpIHtcbiAgICAgIHJldHVybiBpc1NhbWVZZWFyKGdlbmVyYXRlQ29uZmlnLCBjdXJyZW50LCB0YXJnZXQpO1xuICAgIH0sXG4gICAgaXNJblZpZXc6IGlzSW5WaWV3LFxuICAgIG9mZnNldENlbGw6IGZ1bmN0aW9uIG9mZnNldENlbGwoZGF0ZSwgb2Zmc2V0KSB7XG4gICAgICByZXR1cm4gZ2VuZXJhdGVDb25maWcuYWRkWWVhcihkYXRlLCBvZmZzZXQpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYW5lbEJvZHksIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJvd051bTogWUVBUl9ST1dfQ09VTlQsXG4gICAgY29sTnVtOiBZRUFSX0NPTF9DT1VOVCxcbiAgICBiYXNlRGF0ZTogYmFzZVllYXIsXG4gICAgZ2V0Q2VsbFRleHQ6IGdlbmVyYXRlQ29uZmlnLmdldFllYXIsXG4gICAgZ2V0Q2VsbENsYXNzTmFtZTogZ2V0Q2VsbENsYXNzTmFtZSxcbiAgICBnZXRDZWxsRGF0ZTogZ2VuZXJhdGVDb25maWcuYWRkWWVhcixcbiAgICB0aXRsZUNlbGw6IGZ1bmN0aW9uIHRpdGxlQ2VsbChkYXRlKSB7XG4gICAgICByZXR1cm4gZm9ybWF0VmFsdWUoZGF0ZSwge1xuICAgICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgICAgZm9ybWF0OiAnWVlZWScsXG4gICAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZ1xuICAgICAgfSk7XG4gICAgfVxuICB9KSk7XG59XG5leHBvcnQgZGVmYXVsdCBZZWFyQm9keTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBZZWFySGVhZGVyIGZyb20gJy4vWWVhckhlYWRlcic7XG5pbXBvcnQgWWVhckJvZHksIHsgWUVBUl9DT0xfQ09VTlQgfSBmcm9tICcuL1llYXJCb2R5JztcbmltcG9ydCB7IGNyZWF0ZUtleURvd25IYW5kbGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvdWlVdGlsJztcbmV4cG9ydCB2YXIgWUVBUl9ERUNBREVfQ09VTlQgPSAxMDtcbmZ1bmN0aW9uIFllYXJQYW5lbChwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIG9wZXJhdGlvblJlZiA9IHByb3BzLm9wZXJhdGlvblJlZixcbiAgICBvblZpZXdEYXRlQ2hhbmdlID0gcHJvcHMub25WaWV3RGF0ZUNoYW5nZSxcbiAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnLFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgdmlld0RhdGUgPSBwcm9wcy52aWV3RGF0ZSxcbiAgICBzb3VyY2VNb2RlID0gcHJvcHMuc291cmNlTW9kZSxcbiAgICBfb25TZWxlY3QgPSBwcm9wcy5vblNlbGVjdCxcbiAgICBvblBhbmVsQ2hhbmdlID0gcHJvcHMub25QYW5lbENoYW5nZTtcbiAgdmFyIHBhbmVsUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi15ZWFyLXBhbmVsXCIpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBLZXlib2FyZCA9PT09PT09PT09PT09PT09PT09PT09PVxuICBvcGVyYXRpb25SZWYuY3VycmVudCA9IHtcbiAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihldmVudCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUtleURvd25IYW5kbGVyKGV2ZW50LCB7XG4gICAgICAgIG9uTGVmdFJpZ2h0OiBmdW5jdGlvbiBvbkxlZnRSaWdodChkaWZmKSB7XG4gICAgICAgICAgX29uU2VsZWN0KGdlbmVyYXRlQ29uZmlnLmFkZFllYXIodmFsdWUgfHwgdmlld0RhdGUsIGRpZmYpLCAna2V5Jyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ3RybExlZnRSaWdodDogZnVuY3Rpb24gb25DdHJsTGVmdFJpZ2h0KGRpZmYpIHtcbiAgICAgICAgICBfb25TZWxlY3QoZ2VuZXJhdGVDb25maWcuYWRkWWVhcih2YWx1ZSB8fCB2aWV3RGF0ZSwgZGlmZiAqIFlFQVJfREVDQURFX0NPVU5UKSwgJ2tleScpO1xuICAgICAgICB9LFxuICAgICAgICBvblVwRG93bjogZnVuY3Rpb24gb25VcERvd24oZGlmZikge1xuICAgICAgICAgIF9vblNlbGVjdChnZW5lcmF0ZUNvbmZpZy5hZGRZZWFyKHZhbHVlIHx8IHZpZXdEYXRlLCBkaWZmICogWUVBUl9DT0xfQ09VTlQpLCAna2V5Jyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRW50ZXI6IGZ1bmN0aW9uIG9uRW50ZXIoKSB7XG4gICAgICAgICAgb25QYW5lbENoYW5nZShzb3VyY2VNb2RlID09PSAnZGF0ZScgPyAnZGF0ZScgOiAnbW9udGgnLCB2YWx1ZSB8fCB2aWV3RGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gVmlldyBPcGVyYXRpb24gPT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9uRGVjYWRlQ2hhbmdlID0gZnVuY3Rpb24gb25EZWNhZGVDaGFuZ2UoZGlmZikge1xuICAgIHZhciBuZXdEYXRlID0gZ2VuZXJhdGVDb25maWcuYWRkWWVhcih2aWV3RGF0ZSwgZGlmZiAqIDEwKTtcbiAgICBvblZpZXdEYXRlQ2hhbmdlKG5ld0RhdGUpO1xuICAgIG9uUGFuZWxDaGFuZ2UobnVsbCwgbmV3RGF0ZSk7XG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBwYW5lbFByZWZpeENsc1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChZZWFySGVhZGVyLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBvblByZXZEZWNhZGU6IGZ1bmN0aW9uIG9uUHJldkRlY2FkZSgpIHtcbiAgICAgIG9uRGVjYWRlQ2hhbmdlKC0xKTtcbiAgICB9LFxuICAgIG9uTmV4dERlY2FkZTogZnVuY3Rpb24gb25OZXh0RGVjYWRlKCkge1xuICAgICAgb25EZWNhZGVDaGFuZ2UoMSk7XG4gICAgfSxcbiAgICBvbkRlY2FkZUNsaWNrOiBmdW5jdGlvbiBvbkRlY2FkZUNsaWNrKCkge1xuICAgICAgb25QYW5lbENoYW5nZSgnZGVjYWRlJywgdmlld0RhdGUpO1xuICAgIH1cbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChZZWFyQm9keSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgb25TZWxlY3Q6IGZ1bmN0aW9uIG9uU2VsZWN0KGRhdGUpIHtcbiAgICAgIG9uUGFuZWxDaGFuZ2Uoc291cmNlTW9kZSA9PT0gJ2RhdGUnID8gJ2RhdGUnIDogJ21vbnRoJywgZGF0ZSk7XG4gICAgICBfb25TZWxlY3QoZGF0ZSwgJ21vdXNlJyk7XG4gICAgfVxuICB9KSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgWWVhclBhbmVsOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEV4dHJhRm9vdGVyKHByZWZpeENscywgbW9kZSwgcmVuZGVyRXh0cmFGb290ZXIpIHtcbiAgaWYgKCFyZW5kZXJFeHRyYUZvb3Rlcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWZvb3Rlci1leHRyYVwiKVxuICB9LCByZW5kZXJFeHRyYUZvb3Rlcihtb2RlKSk7XG59IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0UmFuZ2VzKF9yZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIF9yZWYkcmFuZ2VMaXN0ID0gX3JlZi5yYW5nZUxpc3QsXG4gICAgcmFuZ2VMaXN0ID0gX3JlZiRyYW5nZUxpc3QgPT09IHZvaWQgMCA/IFtdIDogX3JlZiRyYW5nZUxpc3QsXG4gICAgX3JlZiRjb21wb25lbnRzID0gX3JlZi5jb21wb25lbnRzLFxuICAgIGNvbXBvbmVudHMgPSBfcmVmJGNvbXBvbmVudHMgPT09IHZvaWQgMCA/IHt9IDogX3JlZiRjb21wb25lbnRzLFxuICAgIG5lZWRDb25maXJtQnV0dG9uID0gX3JlZi5uZWVkQ29uZmlybUJ1dHRvbixcbiAgICBvbk5vdyA9IF9yZWYub25Ob3csXG4gICAgb25PayA9IF9yZWYub25PayxcbiAgICBva0Rpc2FibGVkID0gX3JlZi5va0Rpc2FibGVkLFxuICAgIHNob3dOb3cgPSBfcmVmLnNob3dOb3csXG4gICAgbG9jYWxlID0gX3JlZi5sb2NhbGU7XG4gIHZhciBwcmVzZXROb2RlO1xuICB2YXIgb2tOb2RlO1xuICBpZiAocmFuZ2VMaXN0Lmxlbmd0aCkge1xuICAgIHZhciBJdGVtID0gY29tcG9uZW50cy5yYW5nZUl0ZW0gfHwgJ3NwYW4nO1xuICAgIHByZXNldE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgcmFuZ2VMaXN0Lm1hcChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgIHZhciBsYWJlbCA9IF9yZWYyLmxhYmVsLFxuICAgICAgICBvbkNsaWNrID0gX3JlZjIub25DbGljayxcbiAgICAgICAgb25Nb3VzZUVudGVyID0gX3JlZjIub25Nb3VzZUVudGVyLFxuICAgICAgICBvbk1vdXNlTGVhdmUgPSBfcmVmMi5vbk1vdXNlTGVhdmU7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgIGtleTogbGFiZWwsXG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wcmVzZXRcIilcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEl0ZW0sIHtcbiAgICAgICAgb25DbGljazogb25DbGljayxcbiAgICAgICAgb25Nb3VzZUVudGVyOiBvbk1vdXNlRW50ZXIsXG4gICAgICAgIG9uTW91c2VMZWF2ZTogb25Nb3VzZUxlYXZlXG4gICAgICB9LCBsYWJlbCkpO1xuICAgIH0pKTtcbiAgfVxuICBpZiAobmVlZENvbmZpcm1CdXR0b24pIHtcbiAgICB2YXIgQnV0dG9uID0gY29tcG9uZW50cy5idXR0b24gfHwgJ2J1dHRvbic7XG4gICAgaWYgKG9uTm93ICYmICFwcmVzZXROb2RlICYmIHNob3dOb3cgIT09IGZhbHNlKSB7XG4gICAgICBwcmVzZXROb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ub3dcIilcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ub3ctYnRuXCIpLFxuICAgICAgICBvbkNsaWNrOiBvbk5vd1xuICAgICAgfSwgbG9jYWxlLm5vdykpO1xuICAgIH1cbiAgICBva05vZGUgPSBuZWVkQ29uZmlybUJ1dHRvbiAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1va1wiKVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJ1dHRvbiwge1xuICAgICAgZGlzYWJsZWQ6IG9rRGlzYWJsZWQsXG4gICAgICBvbkNsaWNrOiBvbk9rXG4gICAgfSwgbG9jYWxlLm9rKSk7XG4gIH1cbiAgaWYgKCFwcmVzZXROb2RlICYmICFva05vZGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJhbmdlc1wiKVxuICB9LCBwcmVzZXROb2RlLCBva05vZGUpO1xufSIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbi8qKlxuICogTG9naWM6XG4gKiAgV2hlbiBgbW9kZWAgPT09IGBwaWNrZXJgLFxuICogIGNsaWNrIHdpbGwgdHJpZ2dlciBgb25TZWxlY3RgIChpZiB2YWx1ZSBjaGFuZ2VkIHRyaWdnZXIgYG9uQ2hhbmdlYCBhbHNvKS5cbiAqICBQYW5lbCBjaGFuZ2Ugd2lsbCBub3QgdHJpZ2dlciBgb25TZWxlY3RgIGJ1dCB0cmlnZ2VyIGBvblBhbmVsQ2hhbmdlYFxuICovXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBLZXlDb2RlIGZyb20gXCJyYy11dGlsL2VzL0tleUNvZGVcIjtcbmltcG9ydCB3YXJuaW5nIGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IFRpbWVQYW5lbCBmcm9tICcuL3BhbmVscy9UaW1lUGFuZWwnO1xuaW1wb3J0IERhdGV0aW1lUGFuZWwgZnJvbSAnLi9wYW5lbHMvRGF0ZXRpbWVQYW5lbCc7XG5pbXBvcnQgRGF0ZVBhbmVsIGZyb20gJy4vcGFuZWxzL0RhdGVQYW5lbCc7XG5pbXBvcnQgV2Vla1BhbmVsIGZyb20gJy4vcGFuZWxzL1dlZWtQYW5lbCc7XG5pbXBvcnQgTW9udGhQYW5lbCBmcm9tICcuL3BhbmVscy9Nb250aFBhbmVsJztcbmltcG9ydCBRdWFydGVyUGFuZWwgZnJvbSAnLi9wYW5lbHMvUXVhcnRlclBhbmVsJztcbmltcG9ydCBZZWFyUGFuZWwgZnJvbSAnLi9wYW5lbHMvWWVhclBhbmVsJztcbmltcG9ydCBEZWNhZGVQYW5lbCBmcm9tICcuL3BhbmVscy9EZWNhZGVQYW5lbCc7XG5pbXBvcnQgeyBXRUVLX0RBWV9DT1VOVCwgaXNFcXVhbCB9IGZyb20gJy4vdXRpbHMvZGF0ZVV0aWwnO1xuaW1wb3J0IFBhbmVsQ29udGV4dCBmcm9tICcuL1BhbmVsQ29udGV4dCc7XG5pbXBvcnQgeyBQaWNrZXJNb2RlTWFwIH0gZnJvbSAnLi91dGlscy91aVV0aWwnO1xuaW1wb3J0IHsgTU9OVEhfQ09MX0NPVU5UIH0gZnJvbSAnLi9wYW5lbHMvTW9udGhQYW5lbC9Nb250aEJvZHknO1xuaW1wb3J0IFJhbmdlQ29udGV4dCBmcm9tICcuL1JhbmdlQ29udGV4dCc7XG5pbXBvcnQgZ2V0RXh0cmFGb290ZXIgZnJvbSAnLi91dGlscy9nZXRFeHRyYUZvb3Rlcic7XG5pbXBvcnQgZ2V0UmFuZ2VzIGZyb20gJy4vdXRpbHMvZ2V0UmFuZ2VzJztcbmltcG9ydCB7IGdldExvd2VyQm91bmRUaW1lLCBzZXREYXRlVGltZSwgc2V0VGltZSB9IGZyb20gJy4vdXRpbHMvdGltZVV0aWwnO1xuLy8gQ2FsZW5kYXIgcGlja2VyIHR5cGVcbnZhciBDQUxFTkRBUl9QQU5FTF9NT0RFID0gWydkYXRlJywgJ21vbnRoJ107XG5mdW5jdGlvbiBQaWNrZXJQYW5lbChwcm9wcykge1xuICB2YXIgX2NsYXNzTmFtZXM7XG4gIHZhciBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy1waWNrZXInIDogX3Byb3BzJHByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBsb2NhbGUgPSBwcm9wcy5sb2NhbGUsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZyxcbiAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZSxcbiAgICBwaWNrZXJWYWx1ZSA9IHByb3BzLnBpY2tlclZhbHVlLFxuICAgIGRlZmF1bHRQaWNrZXJWYWx1ZSA9IHByb3BzLmRlZmF1bHRQaWNrZXJWYWx1ZSxcbiAgICBkaXNhYmxlZERhdGUgPSBwcm9wcy5kaXNhYmxlZERhdGUsXG4gICAgbW9kZSA9IHByb3BzLm1vZGUsXG4gICAgX3Byb3BzJHBpY2tlciA9IHByb3BzLnBpY2tlcixcbiAgICBwaWNrZXIgPSBfcHJvcHMkcGlja2VyID09PSB2b2lkIDAgPyAnZGF0ZScgOiBfcHJvcHMkcGlja2VyLFxuICAgIF9wcm9wcyR0YWJJbmRleCA9IHByb3BzLnRhYkluZGV4LFxuICAgIHRhYkluZGV4ID0gX3Byb3BzJHRhYkluZGV4ID09PSB2b2lkIDAgPyAwIDogX3Byb3BzJHRhYkluZGV4LFxuICAgIHNob3dOb3cgPSBwcm9wcy5zaG93Tm93LFxuICAgIHNob3dUaW1lID0gcHJvcHMuc2hvd1RpbWUsXG4gICAgc2hvd1RvZGF5ID0gcHJvcHMuc2hvd1RvZGF5LFxuICAgIHJlbmRlckV4dHJhRm9vdGVyID0gcHJvcHMucmVuZGVyRXh0cmFGb290ZXIsXG4gICAgaGlkZUhlYWRlciA9IHByb3BzLmhpZGVIZWFkZXIsXG4gICAgb25TZWxlY3QgPSBwcm9wcy5vblNlbGVjdCxcbiAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgIG9uUGFuZWxDaGFuZ2UgPSBwcm9wcy5vblBhbmVsQ2hhbmdlLFxuICAgIG9uTW91c2VEb3duID0gcHJvcHMub25Nb3VzZURvd24sXG4gICAgb25QaWNrZXJWYWx1ZUNoYW5nZSA9IHByb3BzLm9uUGlja2VyVmFsdWVDaGFuZ2UsXG4gICAgX29uT2sgPSBwcm9wcy5vbk9rLFxuICAgIGNvbXBvbmVudHMgPSBwcm9wcy5jb21wb25lbnRzLFxuICAgIGRpcmVjdGlvbiA9IHByb3BzLmRpcmVjdGlvbixcbiAgICBfcHJvcHMkaG91clN0ZXAgPSBwcm9wcy5ob3VyU3RlcCxcbiAgICBob3VyU3RlcCA9IF9wcm9wcyRob3VyU3RlcCA9PT0gdm9pZCAwID8gMSA6IF9wcm9wcyRob3VyU3RlcCxcbiAgICBfcHJvcHMkbWludXRlU3RlcCA9IHByb3BzLm1pbnV0ZVN0ZXAsXG4gICAgbWludXRlU3RlcCA9IF9wcm9wcyRtaW51dGVTdGVwID09PSB2b2lkIDAgPyAxIDogX3Byb3BzJG1pbnV0ZVN0ZXAsXG4gICAgX3Byb3BzJHNlY29uZFN0ZXAgPSBwcm9wcy5zZWNvbmRTdGVwLFxuICAgIHNlY29uZFN0ZXAgPSBfcHJvcHMkc2Vjb25kU3RlcCA9PT0gdm9pZCAwID8gMSA6IF9wcm9wcyRzZWNvbmRTdGVwO1xuICB2YXIgbmVlZENvbmZpcm1CdXR0b24gPSBwaWNrZXIgPT09ICdkYXRlJyAmJiAhIXNob3dUaW1lIHx8IHBpY2tlciA9PT0gJ3RpbWUnO1xuICB2YXIgaXNIb3VyU3RlcFZhbGlkID0gMjQgJSBob3VyU3RlcCA9PT0gMDtcbiAgdmFyIGlzTWludXRlU3RlcFZhbGlkID0gNjAgJSBtaW51dGVTdGVwID09PSAwO1xuICB2YXIgaXNTZWNvbmRTdGVwVmFsaWQgPSA2MCAlIHNlY29uZFN0ZXAgPT09IDA7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgd2FybmluZyghdmFsdWUgfHwgZ2VuZXJhdGVDb25maWcuaXNWYWxpZGF0ZSh2YWx1ZSksICdJbnZhbGlkYXRlIGRhdGUgcGFzcyB0byBgdmFsdWVgLicpO1xuICAgIHdhcm5pbmcoIXZhbHVlIHx8IGdlbmVyYXRlQ29uZmlnLmlzVmFsaWRhdGUodmFsdWUpLCAnSW52YWxpZGF0ZSBkYXRlIHBhc3MgdG8gYGRlZmF1bHRWYWx1ZWAuJyk7XG4gICAgd2FybmluZyhpc0hvdXJTdGVwVmFsaWQsIFwiYGhvdXJTdGVwYCBcIi5jb25jYXQoaG91clN0ZXAsIFwiIGlzIGludmFsaWQuIEl0IHNob3VsZCBiZSBhIGZhY3RvciBvZiAyNC5cIikpO1xuICAgIHdhcm5pbmcoaXNNaW51dGVTdGVwVmFsaWQsIFwiYG1pbnV0ZVN0ZXBgIFwiLmNvbmNhdChtaW51dGVTdGVwLCBcIiBpcyBpbnZhbGlkLiBJdCBzaG91bGQgYmUgYSBmYWN0b3Igb2YgNjAuXCIpKTtcbiAgICB3YXJuaW5nKGlzU2Vjb25kU3RlcFZhbGlkLCBcImBzZWNvbmRTdGVwYCBcIi5jb25jYXQoc2Vjb25kU3RlcCwgXCIgaXMgaW52YWxpZC4gSXQgc2hvdWxkIGJlIGEgZmFjdG9yIG9mIDYwLlwiKSk7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTdGF0ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgcGFuZWxDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChQYW5lbENvbnRleHQpO1xuICB2YXIgb3BlcmF0aW9uUmVmID0gcGFuZWxDb250ZXh0Lm9wZXJhdGlvblJlZixcbiAgICBwYW5lbERpdlJlZiA9IHBhbmVsQ29udGV4dC5wYW5lbFJlZixcbiAgICBvbkNvbnRleHRTZWxlY3QgPSBwYW5lbENvbnRleHQub25TZWxlY3QsXG4gICAgaGlkZVJhbmdlcyA9IHBhbmVsQ29udGV4dC5oaWRlUmFuZ2VzLFxuICAgIGRlZmF1bHRPcGVuVmFsdWUgPSBwYW5lbENvbnRleHQuZGVmYXVsdE9wZW5WYWx1ZTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChSYW5nZUNvbnRleHQpLFxuICAgIGluUmFuZ2UgPSBfUmVhY3QkdXNlQ29udGV4dC5pblJhbmdlLFxuICAgIHBhbmVsUG9zaXRpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5wYW5lbFBvc2l0aW9uLFxuICAgIHJhbmdlZFZhbHVlID0gX1JlYWN0JHVzZUNvbnRleHQucmFuZ2VkVmFsdWUsXG4gICAgaG92ZXJSYW5nZWRWYWx1ZSA9IF9SZWFjdCR1c2VDb250ZXh0LmhvdmVyUmFuZ2VkVmFsdWU7XG4gIHZhciBwYW5lbFJlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG4gIC8vIEhhbmRsZSBpbml0IGxvZ2ljXG4gIHZhciBpbml0UmVmID0gUmVhY3QudXNlUmVmKHRydWUpO1xuICAvLyBWYWx1ZVxuICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gdXNlTWVyZ2VkU3RhdGUobnVsbCwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWUsXG4gICAgICBwb3N0U3RhdGU6IGZ1bmN0aW9uIHBvc3RTdGF0ZSh2YWwpIHtcbiAgICAgICAgaWYgKCF2YWwgJiYgZGVmYXVsdE9wZW5WYWx1ZSAmJiBwaWNrZXIgPT09ICd0aW1lJykge1xuICAgICAgICAgIHJldHVybiBkZWZhdWx0T3BlblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgICB9XG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgbWVyZ2VkVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgIHNldElubmVyVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzFdO1xuICAvLyBWaWV3IGRhdGUgY29udHJvbFxuICB2YXIgX3VzZU1lcmdlZFN0YXRlMyA9IHVzZU1lcmdlZFN0YXRlKG51bGwsIHtcbiAgICAgIHZhbHVlOiBwaWNrZXJWYWx1ZSxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZGVmYXVsdFBpY2tlclZhbHVlIHx8IG1lcmdlZFZhbHVlLFxuICAgICAgcG9zdFN0YXRlOiBmdW5jdGlvbiBwb3N0U3RhdGUoZGF0ZSkge1xuICAgICAgICB2YXIgbm93ID0gZ2VuZXJhdGVDb25maWcuZ2V0Tm93KCk7XG4gICAgICAgIGlmICghZGF0ZSkge1xuICAgICAgICAgIHJldHVybiBub3c7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2hlbiB2YWx1ZSBpcyBudWxsIGFuZCBzZXQgc2hvd1RpbWVcbiAgICAgICAgaWYgKCFtZXJnZWRWYWx1ZSAmJiBzaG93VGltZSkge1xuICAgICAgICAgIHZhciBkZWZhdWx0RGF0ZU9iamVjdCA9IF90eXBlb2Yoc2hvd1RpbWUpID09PSAnb2JqZWN0JyA/IHNob3dUaW1lLmRlZmF1bHRWYWx1ZSA6IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICByZXR1cm4gc2V0RGF0ZVRpbWUoZ2VuZXJhdGVDb25maWcsIEFycmF5LmlzQXJyYXkoZGF0ZSkgPyBkYXRlWzBdIDogZGF0ZSwgZGVmYXVsdERhdGVPYmplY3QgfHwgbm93KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShkYXRlKSA/IGRhdGVbMF0gOiBkYXRlO1xuICAgICAgfVxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUzLCAyKSxcbiAgICB2aWV3RGF0ZSA9IF91c2VNZXJnZWRTdGF0ZTRbMF0sXG4gICAgc2V0SW5uZXJWaWV3RGF0ZSA9IF91c2VNZXJnZWRTdGF0ZTRbMV07XG4gIHZhciBzZXRWaWV3RGF0ZSA9IGZ1bmN0aW9uIHNldFZpZXdEYXRlKGRhdGUpIHtcbiAgICBzZXRJbm5lclZpZXdEYXRlKGRhdGUpO1xuICAgIGlmIChvblBpY2tlclZhbHVlQ2hhbmdlKSB7XG4gICAgICBvblBpY2tlclZhbHVlQ2hhbmdlKGRhdGUpO1xuICAgIH1cbiAgfTtcbiAgLy8gUGFuZWwgY29udHJvbFxuICB2YXIgZ2V0SW50ZXJuYWxOZXh0TW9kZSA9IGZ1bmN0aW9uIGdldEludGVybmFsTmV4dE1vZGUobmV4dE1vZGUpIHtcbiAgICB2YXIgZ2V0TmV4dE1vZGUgPSBQaWNrZXJNb2RlTWFwW3BpY2tlcl07XG4gICAgaWYgKGdldE5leHRNb2RlKSB7XG4gICAgICByZXR1cm4gZ2V0TmV4dE1vZGUobmV4dE1vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dE1vZGU7XG4gIH07XG4gIC8vIFNhdmUgcGFuZWwgaXMgY2hhbmdlZCBmcm9tIHdoaWNoIHBhbmVsXG4gIHZhciBfdXNlTWVyZ2VkU3RhdGU1ID0gdXNlTWVyZ2VkU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHBpY2tlciA9PT0gJ3RpbWUnKSB7XG4gICAgICAgIHJldHVybiAndGltZSc7XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2V0SW50ZXJuYWxOZXh0TW9kZSgnZGF0ZScpO1xuICAgIH0sIHtcbiAgICAgIHZhbHVlOiBtb2RlXG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlNiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZTUsIDIpLFxuICAgIG1lcmdlZE1vZGUgPSBfdXNlTWVyZ2VkU3RhdGU2WzBdLFxuICAgIHNldElubmVyTW9kZSA9IF91c2VNZXJnZWRTdGF0ZTZbMV07XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0SW5uZXJNb2RlKHBpY2tlcik7XG4gIH0sIFtwaWNrZXJdKTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBtZXJnZWRNb2RlO1xuICAgIH0pLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHNvdXJjZU1vZGUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFNvdXJjZU1vZGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgb25JbnRlcm5hbFBhbmVsQ2hhbmdlID0gZnVuY3Rpb24gb25JbnRlcm5hbFBhbmVsQ2hhbmdlKG5ld01vZGUsIHZpZXdWYWx1ZSkge1xuICAgIHZhciBuZXh0TW9kZSA9IGdldEludGVybmFsTmV4dE1vZGUobmV3TW9kZSB8fCBtZXJnZWRNb2RlKTtcbiAgICBzZXRTb3VyY2VNb2RlKG1lcmdlZE1vZGUpO1xuICAgIHNldElubmVyTW9kZShuZXh0TW9kZSk7XG4gICAgaWYgKG9uUGFuZWxDaGFuZ2UgJiYgKG1lcmdlZE1vZGUgIT09IG5leHRNb2RlIHx8IGlzRXF1YWwoZ2VuZXJhdGVDb25maWcsIHZpZXdEYXRlLCB2aWV3RGF0ZSkpKSB7XG4gICAgICBvblBhbmVsQ2hhbmdlKHZpZXdWYWx1ZSwgbmV4dE1vZGUpO1xuICAgIH1cbiAgfTtcbiAgdmFyIHRyaWdnZXJTZWxlY3QgPSBmdW5jdGlvbiB0cmlnZ2VyU2VsZWN0KGRhdGUsIHR5cGUpIHtcbiAgICB2YXIgZm9yY2VUcmlnZ2VyU2VsZWN0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBpZiAobWVyZ2VkTW9kZSA9PT0gcGlja2VyIHx8IGZvcmNlVHJpZ2dlclNlbGVjdCkge1xuICAgICAgc2V0SW5uZXJWYWx1ZShkYXRlKTtcbiAgICAgIGlmIChvblNlbGVjdCkge1xuICAgICAgICBvblNlbGVjdChkYXRlKTtcbiAgICAgIH1cbiAgICAgIGlmIChvbkNvbnRleHRTZWxlY3QpIHtcbiAgICAgICAgb25Db250ZXh0U2VsZWN0KGRhdGUsIHR5cGUpO1xuICAgICAgfVxuICAgICAgaWYgKG9uQ2hhbmdlICYmICFpc0VxdWFsKGdlbmVyYXRlQ29uZmlnLCBkYXRlLCBtZXJnZWRWYWx1ZSkgJiYgIShkaXNhYmxlZERhdGUgPT09IG51bGwgfHwgZGlzYWJsZWREYXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkaXNhYmxlZERhdGUoZGF0ZSkpKSB7XG4gICAgICAgIG9uQ2hhbmdlKGRhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdmFyIGlzU2VsZWN0YWJsZSA9IGZ1bmN0aW9uIGlzU2VsZWN0YWJsZShrZXkpIHtcbiAgICBpZiAoQ0FMRU5EQVJfUEFORUxfTU9ERS5pbmNsdWRlcyhtZXJnZWRNb2RlKSkge1xuICAgICAgdmFyIGRhdGU7XG4gICAgICB2YXIgb3BlcmF0aW9uRm5jO1xuICAgICAgdmFyIGlzRGF0ZU1vZGUgPSBtZXJnZWRNb2RlID09PSAnZGF0ZSc7XG4gICAgICBpZiAoa2V5ID09PSBLZXlDb2RlLlBBR0VfVVAgfHwga2V5ID09PSBLZXlDb2RlLlBBR0VfRE9XTikge1xuICAgICAgICBvcGVyYXRpb25GbmMgPSBpc0RhdGVNb2RlID8gZ2VuZXJhdGVDb25maWcuYWRkTW9udGggOiBnZW5lcmF0ZUNvbmZpZy5hZGRZZWFyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3BlcmF0aW9uRm5jID0gaXNEYXRlTW9kZSA/IGdlbmVyYXRlQ29uZmlnLmFkZERhdGUgOiBnZW5lcmF0ZUNvbmZpZy5hZGRNb250aDtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgS2V5Q29kZS5MRUZUOlxuICAgICAgICBjYXNlIEtleUNvZGUuUEFHRV9VUDpcbiAgICAgICAgICBkYXRlID0gb3BlcmF0aW9uRm5jKHZpZXdEYXRlLCAtMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgS2V5Q29kZS5SSUdIVDpcbiAgICAgICAgY2FzZSBLZXlDb2RlLlBBR0VfRE9XTjpcbiAgICAgICAgICBkYXRlID0gb3BlcmF0aW9uRm5jKHZpZXdEYXRlLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlDb2RlLlVQOlxuICAgICAgICBjYXNlIEtleUNvZGUuRE9XTjpcbiAgICAgICAgICBkYXRlID0gb3BlcmF0aW9uRm5jKHZpZXdEYXRlLCBOdW1iZXIoXCJcIi5jb25jYXQoa2V5ID09PSBLZXlDb2RlLlVQID8gJy0nIDogJycpLmNvbmNhdChpc0RhdGVNb2RlID8gV0VFS19EQVlfQ09VTlQgOiBNT05USF9DT0xfQ09VTlQpKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoZGF0ZSkge1xuICAgICAgICByZXR1cm4gIShkaXNhYmxlZERhdGUgPT09IG51bGwgfHwgZGlzYWJsZWREYXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkaXNhYmxlZERhdGUoZGF0ZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBJbnRlcmFjdGl2ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25JbnRlcm5hbEtleURvd24gPSBmdW5jdGlvbiBvbkludGVybmFsS2V5RG93bihlKSB7XG4gICAgaWYgKHBhbmVsUmVmLmN1cnJlbnQgJiYgcGFuZWxSZWYuY3VycmVudC5vbktleURvd24pIHtcbiAgICAgIHZhciBzZWxlY3RhYmxlID0gdHJ1ZTtcbiAgICAgIHZhciB3aGljaCA9IGUud2hpY2g7XG4gICAgICBpZiAoW0tleUNvZGUuTEVGVCwgS2V5Q29kZS5SSUdIVCwgS2V5Q29kZS5VUCwgS2V5Q29kZS5ET1dOLCBLZXlDb2RlLlBBR0VfVVAsIEtleUNvZGUuUEFHRV9ET1dOLCBLZXlDb2RlLkVOVEVSXS5pbmNsdWRlcyh3aGljaCkpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAod2hpY2ggIT09IEtleUNvZGUuRU5URVIgJiYgdGFiSW5kZXggPT09IDApIHtcbiAgICAgICAgICBzZWxlY3RhYmxlID0gaXNTZWxlY3RhYmxlKHdoaWNoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQ2Fubm90IHVzZSBrZXlib2FyZCB0byBzZWxlY3QgZGlzYWJsZWQgZGF0ZVxuICAgICAgaWYgKHNlbGVjdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIHBhbmVsUmVmLmN1cnJlbnQub25LZXlEb3duKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWxvbmUtYmxvY2tzICovXG4gICAge1xuICAgICAgd2FybmluZyhmYWxzZSwgJ1BhbmVsIG5vdCBjb3JyZWN0IGhhbmRsZSBrZXlEb3duIGV2ZW50LiBQbGVhc2UgaGVscCB0byBmaXJlIGlzc3VlIGFib3V0IHRoaXMuJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qIGVzbGludC1lbmFibGUgbm8tbG9uZS1ibG9ja3MgKi9cbiAgfTtcblxuICB2YXIgb25JbnRlcm5hbEJsdXIgPSBmdW5jdGlvbiBvbkludGVybmFsQmx1cihlKSB7XG4gICAgaWYgKHBhbmVsUmVmLmN1cnJlbnQgJiYgcGFuZWxSZWYuY3VycmVudC5vbkJsdXIpIHtcbiAgICAgIHBhbmVsUmVmLmN1cnJlbnQub25CbHVyKGUpO1xuICAgIH1cbiAgfTtcbiAgaWYgKG9wZXJhdGlvblJlZiAmJiBwYW5lbFBvc2l0aW9uICE9PSAncmlnaHQnKSB7XG4gICAgb3BlcmF0aW9uUmVmLmN1cnJlbnQgPSB7XG4gICAgICBvbktleURvd246IG9uSW50ZXJuYWxLZXlEb3duLFxuICAgICAgb25DbG9zZTogZnVuY3Rpb24gb25DbG9zZSgpIHtcbiAgICAgICAgaWYgKHBhbmVsUmVmLmN1cnJlbnQgJiYgcGFuZWxSZWYuY3VycmVudC5vbkNsb3NlKSB7XG4gICAgICAgICAgcGFuZWxSZWYuY3VycmVudC5vbkNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRWZmZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodmFsdWUgJiYgIWluaXRSZWYuY3VycmVudCkge1xuICAgICAgc2V0SW5uZXJWaWV3RGF0ZSh2YWx1ZSk7XG4gICAgfVxuICB9LCBbdmFsdWVdKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpbml0UmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgfSwgW10pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFBhbmVscyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBwYW5lbE5vZGU7XG4gIHZhciBwaWNrZXJQcm9wcyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIG9wZXJhdGlvblJlZjogcGFuZWxSZWYsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgdmlld0RhdGU6IHZpZXdEYXRlLFxuICAgIHZhbHVlOiBtZXJnZWRWYWx1ZSxcbiAgICBvblZpZXdEYXRlQ2hhbmdlOiBzZXRWaWV3RGF0ZSxcbiAgICBzb3VyY2VNb2RlOiBzb3VyY2VNb2RlLFxuICAgIG9uUGFuZWxDaGFuZ2U6IG9uSW50ZXJuYWxQYW5lbENoYW5nZSxcbiAgICBkaXNhYmxlZERhdGU6IGRpc2FibGVkRGF0ZVxuICB9KTtcbiAgZGVsZXRlIHBpY2tlclByb3BzLm9uQ2hhbmdlO1xuICBkZWxldGUgcGlja2VyUHJvcHMub25TZWxlY3Q7XG4gIHN3aXRjaCAobWVyZ2VkTW9kZSkge1xuICAgIGNhc2UgJ2RlY2FkZSc6XG4gICAgICBwYW5lbE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEZWNhZGVQYW5lbCwgX2V4dGVuZHMoe30sIHBpY2tlclByb3BzLCB7XG4gICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiBvblNlbGVjdChkYXRlLCB0eXBlKSB7XG4gICAgICAgICAgc2V0Vmlld0RhdGUoZGF0ZSk7XG4gICAgICAgICAgdHJpZ2dlclNlbGVjdChkYXRlLCB0eXBlKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAneWVhcic6XG4gICAgICBwYW5lbE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChZZWFyUGFuZWwsIF9leHRlbmRzKHt9LCBwaWNrZXJQcm9wcywge1xuICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24gb25TZWxlY3QoZGF0ZSwgdHlwZSkge1xuICAgICAgICAgIHNldFZpZXdEYXRlKGRhdGUpO1xuICAgICAgICAgIHRyaWdnZXJTZWxlY3QoZGF0ZSwgdHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgIHBhbmVsTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1vbnRoUGFuZWwsIF9leHRlbmRzKHt9LCBwaWNrZXJQcm9wcywge1xuICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24gb25TZWxlY3QoZGF0ZSwgdHlwZSkge1xuICAgICAgICAgIHNldFZpZXdEYXRlKGRhdGUpO1xuICAgICAgICAgIHRyaWdnZXJTZWxlY3QoZGF0ZSwgdHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgcGFuZWxOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUXVhcnRlclBhbmVsLCBfZXh0ZW5kcyh7fSwgcGlja2VyUHJvcHMsIHtcbiAgICAgICAgb25TZWxlY3Q6IGZ1bmN0aW9uIG9uU2VsZWN0KGRhdGUsIHR5cGUpIHtcbiAgICAgICAgICBzZXRWaWV3RGF0ZShkYXRlKTtcbiAgICAgICAgICB0cmlnZ2VyU2VsZWN0KGRhdGUsIHR5cGUpO1xuICAgICAgICB9XG4gICAgICB9KSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd3ZWVrJzpcbiAgICAgIHBhbmVsTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFdlZWtQYW5lbCwgX2V4dGVuZHMoe30sIHBpY2tlclByb3BzLCB7XG4gICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiBvblNlbGVjdChkYXRlLCB0eXBlKSB7XG4gICAgICAgICAgc2V0Vmlld0RhdGUoZGF0ZSk7XG4gICAgICAgICAgdHJpZ2dlclNlbGVjdChkYXRlLCB0eXBlKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndGltZSc6XG4gICAgICBkZWxldGUgcGlja2VyUHJvcHMuc2hvd1RpbWU7XG4gICAgICBwYW5lbE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUaW1lUGFuZWwsIF9leHRlbmRzKHt9LCBwaWNrZXJQcm9wcywgX3R5cGVvZihzaG93VGltZSkgPT09ICdvYmplY3QnID8gc2hvd1RpbWUgOiBudWxsLCB7XG4gICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiBvblNlbGVjdChkYXRlLCB0eXBlKSB7XG4gICAgICAgICAgc2V0Vmlld0RhdGUoZGF0ZSk7XG4gICAgICAgICAgdHJpZ2dlclNlbGVjdChkYXRlLCB0eXBlKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmIChzaG93VGltZSkge1xuICAgICAgICBwYW5lbE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEYXRldGltZVBhbmVsLCBfZXh0ZW5kcyh7fSwgcGlja2VyUHJvcHMsIHtcbiAgICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24gb25TZWxlY3QoZGF0ZSwgdHlwZSkge1xuICAgICAgICAgICAgc2V0Vmlld0RhdGUoZGF0ZSk7XG4gICAgICAgICAgICB0cmlnZ2VyU2VsZWN0KGRhdGUsIHR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFuZWxOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRGF0ZVBhbmVsLCBfZXh0ZW5kcyh7fSwgcGlja2VyUHJvcHMsIHtcbiAgICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24gb25TZWxlY3QoZGF0ZSwgdHlwZSkge1xuICAgICAgICAgICAgc2V0Vmlld0RhdGUoZGF0ZSk7XG4gICAgICAgICAgICB0cmlnZ2VyU2VsZWN0KGRhdGUsIHR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRm9vdGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGV4dHJhRm9vdGVyO1xuICB2YXIgcmFuZ2VzTm9kZTtcbiAgdmFyIG9uTm93ID0gZnVuY3Rpb24gb25Ob3coKSB7XG4gICAgdmFyIG5vdyA9IGdlbmVyYXRlQ29uZmlnLmdldE5vdygpO1xuICAgIHZhciBsb3dlckJvdW5kVGltZSA9IGdldExvd2VyQm91bmRUaW1lKGdlbmVyYXRlQ29uZmlnLmdldEhvdXIobm93KSwgZ2VuZXJhdGVDb25maWcuZ2V0TWludXRlKG5vdyksIGdlbmVyYXRlQ29uZmlnLmdldFNlY29uZChub3cpLCBpc0hvdXJTdGVwVmFsaWQgPyBob3VyU3RlcCA6IDEsIGlzTWludXRlU3RlcFZhbGlkID8gbWludXRlU3RlcCA6IDEsIGlzU2Vjb25kU3RlcFZhbGlkID8gc2Vjb25kU3RlcCA6IDEpO1xuICAgIHZhciBhZGp1c3RlZE5vdyA9IHNldFRpbWUoZ2VuZXJhdGVDb25maWcsIG5vdywgbG93ZXJCb3VuZFRpbWVbMF0sXG4gICAgLy8gaG91clxuICAgIGxvd2VyQm91bmRUaW1lWzFdLFxuICAgIC8vIG1pbnV0ZVxuICAgIGxvd2VyQm91bmRUaW1lWzJdKTtcbiAgICB0cmlnZ2VyU2VsZWN0KGFkanVzdGVkTm93LCAnc3VibWl0Jyk7XG4gIH07XG4gIGlmICghaGlkZVJhbmdlcykge1xuICAgIGV4dHJhRm9vdGVyID0gZ2V0RXh0cmFGb290ZXIocHJlZml4Q2xzLCBtZXJnZWRNb2RlLCByZW5kZXJFeHRyYUZvb3Rlcik7XG4gICAgcmFuZ2VzTm9kZSA9IGdldFJhbmdlcyh7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGNvbXBvbmVudHM6IGNvbXBvbmVudHMsXG4gICAgICBuZWVkQ29uZmlybUJ1dHRvbjogbmVlZENvbmZpcm1CdXR0b24sXG4gICAgICBva0Rpc2FibGVkOiAhbWVyZ2VkVmFsdWUgfHwgZGlzYWJsZWREYXRlICYmIGRpc2FibGVkRGF0ZShtZXJnZWRWYWx1ZSksXG4gICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgIHNob3dOb3c6IHNob3dOb3csXG4gICAgICBvbk5vdzogbmVlZENvbmZpcm1CdXR0b24gJiYgb25Ob3csXG4gICAgICBvbk9rOiBmdW5jdGlvbiBvbk9rKCkge1xuICAgICAgICBpZiAobWVyZ2VkVmFsdWUpIHtcbiAgICAgICAgICB0cmlnZ2VyU2VsZWN0KG1lcmdlZFZhbHVlLCAnc3VibWl0JywgdHJ1ZSk7XG4gICAgICAgICAgaWYgKF9vbk9rKSB7XG4gICAgICAgICAgICBfb25PayhtZXJnZWRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgdmFyIHRvZGF5Tm9kZTtcbiAgaWYgKHNob3dUb2RheSAmJiBtZXJnZWRNb2RlID09PSAnZGF0ZScgJiYgcGlja2VyID09PSAnZGF0ZScgJiYgIXNob3dUaW1lKSB7XG4gICAgdmFyIG5vdyA9IGdlbmVyYXRlQ29uZmlnLmdldE5vdygpO1xuICAgIHZhciB0b2RheUNscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdG9kYXktYnRuXCIpO1xuICAgIHZhciBkaXNhYmxlZCA9IGRpc2FibGVkRGF0ZSAmJiBkaXNhYmxlZERhdGUobm93KTtcbiAgICB0b2RheU5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHRvZGF5Q2xzLCBkaXNhYmxlZCAmJiBcIlwiLmNvbmNhdCh0b2RheUNscywgXCItZGlzYWJsZWRcIikpLFxuICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IGRpc2FibGVkLFxuICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgICAgIHRyaWdnZXJTZWxlY3Qobm93LCAnbW91c2UnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIGxvY2FsZS50b2RheSk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBhbmVsQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHBhbmVsQ29udGV4dCksIHt9LCB7XG4gICAgICBtb2RlOiBtZXJnZWRNb2RlLFxuICAgICAgaGlkZUhlYWRlcjogJ2hpZGVIZWFkZXInIGluIHByb3BzID8gaGlkZUhlYWRlciA6IHBhbmVsQ29udGV4dC5oaWRlSGVhZGVyLFxuICAgICAgaGlkZVByZXZCdG46IGluUmFuZ2UgJiYgcGFuZWxQb3NpdGlvbiA9PT0gJ3JpZ2h0JyxcbiAgICAgIGhpZGVOZXh0QnRuOiBpblJhbmdlICYmIHBhbmVsUG9zaXRpb24gPT09ICdsZWZ0J1xuICAgIH0pXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICB0YWJJbmRleDogdGFiSW5kZXgsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGFuZWxcIiksIGNsYXNzTmFtZSwgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wYW5lbC1oYXMtcmFuZ2VcIiksIHJhbmdlZFZhbHVlICYmIHJhbmdlZFZhbHVlWzBdICYmIHJhbmdlZFZhbHVlWzFdKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBhbmVsLWhhcy1yYW5nZS1ob3ZlclwiKSwgaG92ZXJSYW5nZWRWYWx1ZSAmJiBob3ZlclJhbmdlZFZhbHVlWzBdICYmIGhvdmVyUmFuZ2VkVmFsdWVbMV0pLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGFuZWwtcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2NsYXNzTmFtZXMpKSxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgb25LZXlEb3duOiBvbkludGVybmFsS2V5RG93bixcbiAgICBvbkJsdXI6IG9uSW50ZXJuYWxCbHVyLFxuICAgIG9uTW91c2VEb3duOiBvbk1vdXNlRG93bixcbiAgICByZWY6IHBhbmVsRGl2UmVmXG4gIH0sIHBhbmVsTm9kZSwgZXh0cmFGb290ZXIgfHwgcmFuZ2VzTm9kZSB8fCB0b2RheU5vZGUgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWZvb3RlclwiKVxuICB9LCBleHRyYUZvb3RlciwgcmFuZ2VzTm9kZSwgdG9kYXlOb2RlKSA6IG51bGwpKTtcbn1cbmV4cG9ydCBkZWZhdWx0IFBpY2tlclBhbmVsO1xuLyogZXNsaW50LWVuYWJsZSAqLyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBUcmlnZ2VyIGZyb20gJ3JjLXRyaWdnZXInO1xudmFyIEJVSUxUX0lOX1BMQUNFTUVOVFMgPSB7XG4gIGJvdHRvbUxlZnQ6IHtcbiAgICBwb2ludHM6IFsndGwnLCAnYmwnXSxcbiAgICBvZmZzZXQ6IFswLCA0XSxcbiAgICBvdmVyZmxvdzoge1xuICAgICAgYWRqdXN0WDogMSxcbiAgICAgIGFkanVzdFk6IDFcbiAgICB9XG4gIH0sXG4gIGJvdHRvbVJpZ2h0OiB7XG4gICAgcG9pbnRzOiBbJ3RyJywgJ2JyJ10sXG4gICAgb2Zmc2V0OiBbMCwgNF0sXG4gICAgb3ZlcmZsb3c6IHtcbiAgICAgIGFkanVzdFg6IDEsXG4gICAgICBhZGp1c3RZOiAxXG4gICAgfVxuICB9LFxuICB0b3BMZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ2JsJywgJ3RsJ10sXG4gICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgIG92ZXJmbG93OiB7XG4gICAgICBhZGp1c3RYOiAwLFxuICAgICAgYWRqdXN0WTogMVxuICAgIH1cbiAgfSxcbiAgdG9wUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsnYnInLCAndHInXSxcbiAgICBvZmZzZXQ6IFswLCAtNF0sXG4gICAgb3ZlcmZsb3c6IHtcbiAgICAgIGFkanVzdFg6IDAsXG4gICAgICBhZGp1c3RZOiAxXG4gICAgfVxuICB9XG59O1xuZnVuY3Rpb24gUGlja2VyVHJpZ2dlcihfcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIHBvcHVwRWxlbWVudCA9IF9yZWYucG9wdXBFbGVtZW50LFxuICAgIHBvcHVwU3R5bGUgPSBfcmVmLnBvcHVwU3R5bGUsXG4gICAgdmlzaWJsZSA9IF9yZWYudmlzaWJsZSxcbiAgICBkcm9wZG93bkNsYXNzTmFtZSA9IF9yZWYuZHJvcGRvd25DbGFzc05hbWUsXG4gICAgZHJvcGRvd25BbGlnbiA9IF9yZWYuZHJvcGRvd25BbGlnbixcbiAgICB0cmFuc2l0aW9uTmFtZSA9IF9yZWYudHJhbnNpdGlvbk5hbWUsXG4gICAgZ2V0UG9wdXBDb250YWluZXIgPSBfcmVmLmdldFBvcHVwQ29udGFpbmVyLFxuICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICByYW5nZSA9IF9yZWYucmFuZ2UsXG4gICAgcG9wdXBQbGFjZW1lbnQgPSBfcmVmLnBvcHVwUGxhY2VtZW50LFxuICAgIGRpcmVjdGlvbiA9IF9yZWYuZGlyZWN0aW9uO1xuICB2YXIgZHJvcGRvd25QcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRyb3Bkb3duXCIpO1xuICB2YXIgZ2V0UG9wdXBQbGFjZW1lbnQgPSBmdW5jdGlvbiBnZXRQb3B1cFBsYWNlbWVudCgpIHtcbiAgICBpZiAocG9wdXBQbGFjZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHBvcHVwUGxhY2VtZW50O1xuICAgIH1cbiAgICByZXR1cm4gZGlyZWN0aW9uID09PSAncnRsJyA/ICdib3R0b21SaWdodCcgOiAnYm90dG9tTGVmdCc7XG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmlnZ2VyLCB7XG4gICAgc2hvd0FjdGlvbjogW10sXG4gICAgaGlkZUFjdGlvbjogW10sXG4gICAgcG9wdXBQbGFjZW1lbnQ6IGdldFBvcHVwUGxhY2VtZW50KCksXG4gICAgYnVpbHRpblBsYWNlbWVudHM6IEJVSUxUX0lOX1BMQUNFTUVOVFMsXG4gICAgcHJlZml4Q2xzOiBkcm9wZG93blByZWZpeENscyxcbiAgICBwb3B1cFRyYW5zaXRpb25OYW1lOiB0cmFuc2l0aW9uTmFtZSxcbiAgICBwb3B1cDogcG9wdXBFbGVtZW50LFxuICAgIHBvcHVwQWxpZ246IGRyb3Bkb3duQWxpZ24sXG4gICAgcG9wdXBWaXNpYmxlOiB2aXNpYmxlLFxuICAgIHBvcHVwQ2xhc3NOYW1lOiBjbGFzc05hbWVzKGRyb3Bkb3duQ2xhc3NOYW1lLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChkcm9wZG93blByZWZpeENscywgXCItcmFuZ2VcIiksIHJhbmdlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChkcm9wZG93blByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2NsYXNzTmFtZXMpKSxcbiAgICBwb3B1cFN0eWxlOiBwb3B1cFN0eWxlLFxuICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lclxuICB9LCBjaGlsZHJlbik7XG59XG5leHBvcnQgZGVmYXVsdCBQaWNrZXJUcmlnZ2VyOyIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuaW1wb3J0IHsgYWRkR2xvYmFsTW91c2VEb3duRXZlbnQsIGdldFRhcmdldEZyb21FdmVudCB9IGZyb20gJy4uL3V0aWxzL3VpVXRpbCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VQaWNrZXJJbnB1dChfcmVmKSB7XG4gIHZhciBvcGVuID0gX3JlZi5vcGVuLFxuICAgIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICBpc0NsaWNrT3V0c2lkZSA9IF9yZWYuaXNDbGlja091dHNpZGUsXG4gICAgdHJpZ2dlck9wZW4gPSBfcmVmLnRyaWdnZXJPcGVuLFxuICAgIGZvcndhcmRLZXlEb3duID0gX3JlZi5mb3J3YXJkS2V5RG93bixcbiAgICBfb25LZXlEb3duID0gX3JlZi5vbktleURvd24sXG4gICAgYmx1clRvQ2FuY2VsID0gX3JlZi5ibHVyVG9DYW5jZWwsXG4gICAgb25TdWJtaXQgPSBfcmVmLm9uU3VibWl0LFxuICAgIG9uQ2FuY2VsID0gX3JlZi5vbkNhbmNlbCxcbiAgICBfb25Gb2N1cyA9IF9yZWYub25Gb2N1cyxcbiAgICBfb25CbHVyID0gX3JlZi5vbkJsdXIsXG4gICAgY3VycmVudEZvY3VzZWRLZXkgPSBfcmVmLmN1cnJlbnRGb2N1c2VkS2V5LFxuICAgIF9yZWYka2V5ID0gX3JlZi5rZXksXG4gICAga2V5ID0gX3JlZiRrZXkgPT09IHZvaWQgMCA/ICdzdGFydCcgOiBfcmVmJGtleTtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKGZhbHNlKSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICB0eXBpbmcgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldFR5cGluZyA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciBfdXNlU3RhdGUzID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgIF91c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUzLCAyKSxcbiAgICBmb2N1c2VkID0gX3VzZVN0YXRlNFswXSxcbiAgICBzZXRGb2N1c2VkID0gX3VzZVN0YXRlNFsxXTtcbiAgdmFyIGRlbGF5Qmx1clRpbWVyID0gdXNlUmVmKCk7XG4gIC8qKlxuICAgKiBXZSB3aWxsIHByZXZlbnQgYmx1ciB0byBoYW5kbGUgb3BlbiBldmVudCB3aGVuIHVzZXIgY2xpY2sgb3V0c2lkZSxcbiAgICogc2luY2UgdGhpcyB3aWxsIHJlcGVhdCB0cmlnZ2VyIGBvbk9wZW5DaGFuZ2VgIGV2ZW50LlxuICAgKi9cbiAgdmFyIHByZXZlbnRCbHVyUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgdmFyIHZhbHVlQ2hhbmdlZFJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIHZhciBwcmV2ZW50RGVmYXVsdFJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIHZhciBpbnB1dFByb3BzID0ge1xuICAgIG9uTW91c2VEb3duOiBmdW5jdGlvbiBvbk1vdXNlRG93bigpIHtcbiAgICAgIHNldFR5cGluZyh0cnVlKTtcbiAgICAgIHRyaWdnZXJPcGVuKHRydWUpO1xuICAgIH0sXG4gICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZSkge1xuICAgICAgdmFyIHByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24gcHJldmVudERlZmF1bHQoKSB7XG4gICAgICAgIHByZXZlbnREZWZhdWx0UmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgfTtcbiAgICAgIF9vbktleURvd24oZSwgcHJldmVudERlZmF1bHQpO1xuICAgICAgaWYgKHByZXZlbnREZWZhdWx0UmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICAgIHN3aXRjaCAoZS53aGljaCkge1xuICAgICAgICBjYXNlIEtleUNvZGUuRU5URVI6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKCFvcGVuKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJPcGVuKHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvblN1Ym1pdCgpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICBzZXRUeXBpbmcodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlIEtleUNvZGUuVEFCOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICh0eXBpbmcgJiYgb3BlbiAmJiAhZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgICBzZXRUeXBpbmcoZmFsc2UpO1xuICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0eXBpbmcgJiYgb3Blbikge1xuICAgICAgICAgICAgICBpZiAoIWZvcndhcmRLZXlEb3duKGUpICYmIGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICBzZXRUeXBpbmcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlIEtleUNvZGUuRVNDOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNldFR5cGluZyh0cnVlKTtcbiAgICAgICAgICAgIG9uQ2FuY2VsKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFvcGVuICYmICFbS2V5Q29kZS5TSElGVF0uaW5jbHVkZXMoZS53aGljaCkpIHtcbiAgICAgICAgdHJpZ2dlck9wZW4odHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKCF0eXBpbmcpIHtcbiAgICAgICAgLy8gTGV0IHBvcHVwIHBhbmVsIGhhbmRsZSBrZXlib2FyZFxuICAgICAgICBmb3J3YXJkS2V5RG93bihlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uRm9jdXM6IGZ1bmN0aW9uIG9uRm9jdXMoZSkge1xuICAgICAgc2V0VHlwaW5nKHRydWUpO1xuICAgICAgc2V0Rm9jdXNlZCh0cnVlKTtcbiAgICAgIGlmIChjdXJyZW50Rm9jdXNlZEtleSkge1xuICAgICAgICBjdXJyZW50Rm9jdXNlZEtleS5jdXJyZW50ID0ga2V5O1xuICAgICAgfVxuICAgICAgY2xlYXJUaW1lb3V0KGRlbGF5Qmx1clRpbWVyLmN1cnJlbnQpO1xuICAgICAgaWYgKF9vbkZvY3VzKSB7XG4gICAgICAgIF9vbkZvY3VzKGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoZSkge1xuICAgICAgaWYgKHByZXZlbnRCbHVyUmVmLmN1cnJlbnQgfHwgIWlzQ2xpY2tPdXRzaWRlKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgIHByZXZlbnRCbHVyUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGJsdXJUb0NhbmNlbCkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgX2RvY3VtZW50ID0gZG9jdW1lbnQsXG4gICAgICAgICAgICBhY3RpdmVFbGVtZW50ID0gX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgd2hpbGUgKGFjdGl2ZUVsZW1lbnQgJiYgYWN0aXZlRWxlbWVudC5zaGFkb3dSb290KSB7XG4gICAgICAgICAgICBhY3RpdmVFbGVtZW50ID0gYWN0aXZlRWxlbWVudC5zaGFkb3dSb290LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc0NsaWNrT3V0c2lkZShhY3RpdmVFbGVtZW50KSkge1xuICAgICAgICAgICAgb25DYW5jZWwoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDApO1xuICAgICAgfSBlbHNlIGlmIChvcGVuKSB7XG4gICAgICAgIHRyaWdnZXJPcGVuKGZhbHNlKTtcbiAgICAgICAgaWYgKHZhbHVlQ2hhbmdlZFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25TdWJtaXQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2V0Rm9jdXNlZChmYWxzZSk7XG4gICAgICBpZiAoY3VycmVudEZvY3VzZWRLZXkpIHtcbiAgICAgICAgY3VycmVudEZvY3VzZWRLZXkuY3VycmVudCA9ICcnO1xuICAgICAgICAvLyBEZWxheSB0byBwcmV2ZW50ICdyYW5nZScgZm9jdXMgdHJhbnNpdGlvbnMgZnJvbSBmaXJpbmcgcmVzdWx0aW5nIGluIGluY29ycmVjdCBvdXQtb2YtZm9jdXMgZXZlbnRzXG4gICAgICAgIGRlbGF5Qmx1clRpbWVyLmN1cnJlbnQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBQcmV2ZW50IHRoZSAnYmx1cicgZXZlbnQgZnJvbSBmaXJpbmcgd2hlbiB0aGVyZSBpcyBjdXJyZW50bHkgYSBmb2N1c2VkIGlucHV0XG4gICAgICAgICAgaWYgKGN1cnJlbnRGb2N1c2VkS2V5LmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgX29uQmx1ciA9PT0gbnVsbCB8fCBfb25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb25CbHVyKGUpO1xuICAgICAgICB9LCAxMDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX29uQmx1ciA9PT0gbnVsbCB8fCBfb25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb25CbHVyKGUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgLy8gY2hlY2sgaWYgdmFsdWUgY2hhbmdlZFxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhbHVlQ2hhbmdlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gIH0sIFtvcGVuXSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFsdWVDaGFuZ2VkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICB9LCBbdmFsdWVdKTtcbiAgLy8gR2xvYmFsIGNsaWNrIGhhbmRsZXJcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYWRkR2xvYmFsTW91c2VEb3duRXZlbnQoZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBnZXRUYXJnZXRGcm9tRXZlbnQoZSk7XG4gICAgICB2YXIgY2xpY2tlZE91dHNpZGUgPSBpc0NsaWNrT3V0c2lkZSh0YXJnZXQpO1xuICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgaWYgKCFjbGlja2VkT3V0c2lkZSkge1xuICAgICAgICAgIHByZXZlbnRCbHVyUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgIC8vIEFsd2F5cyBzZXQgYmFjayBpbiBjYXNlIGBvbkJsdXJgIHByZXZlbnRlZCBieSB1c2VyXG4gICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHByZXZlbnRCbHVyUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICghZm9jdXNlZCB8fCBjbGlja2VkT3V0c2lkZSkge1xuICAgICAgICAgIHRyaWdnZXJPcGVuKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChmb2N1c2VkICYmICFjbGlja2VkT3V0c2lkZSkge1xuICAgICAgICBwcmV2ZW50Qmx1clJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjbGVhclRpbWVvdXQoZGVsYXlCbHVyVGltZXIuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gW2lucHV0UHJvcHMsIHtcbiAgICBmb2N1c2VkOiBmb2N1c2VkLFxuICAgIHR5cGluZzogdHlwaW5nXG4gIH1dO1xufSIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlVGV4dFZhbHVlTWFwcGluZyhfcmVmKSB7XG4gIHZhciB2YWx1ZVRleHRzID0gX3JlZi52YWx1ZVRleHRzLFxuICAgIG9uVGV4dENoYW5nZSA9IF9yZWYub25UZXh0Q2hhbmdlO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoJycpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHRleHQgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldElubmVyVGV4dCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciB2YWx1ZVRleHRzUmVmID0gUmVhY3QudXNlUmVmKFtdKTtcbiAgdmFsdWVUZXh0c1JlZi5jdXJyZW50ID0gdmFsdWVUZXh0cztcbiAgZnVuY3Rpb24gdHJpZ2dlclRleHRDaGFuZ2UodmFsdWUpIHtcbiAgICBzZXRJbm5lclRleHQodmFsdWUpO1xuICAgIG9uVGV4dENoYW5nZSh2YWx1ZSk7XG4gIH1cbiAgZnVuY3Rpb24gcmVzZXRUZXh0KCkge1xuICAgIHNldElubmVyVGV4dCh2YWx1ZVRleHRzUmVmLmN1cnJlbnRbMF0pO1xuICB9XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHZhbHVlVGV4dHMuZXZlcnkoZnVuY3Rpb24gKHZhbFRleHQpIHtcbiAgICAgIHJldHVybiB2YWxUZXh0ICE9PSB0ZXh0O1xuICAgIH0pKSB7XG4gICAgICByZXNldFRleHQoKTtcbiAgICB9XG4gIH0sIFt2YWx1ZVRleHRzLmpvaW4oJ3x8JyldKTtcbiAgcmV0dXJuIFt0ZXh0LCB0cmlnZ2VyVGV4dENoYW5nZSwgcmVzZXRUZXh0XTtcbn0iLCIvL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCLCBjb21wYXJlLCBjb21wYXJlQ29udGV4dCkge1xuICB2YXIgcmV0ID0gY29tcGFyZSA/IGNvbXBhcmUuY2FsbChjb21wYXJlQ29udGV4dCwgb2JqQSwgb2JqQikgOiB2b2lkIDA7XG5cbiAgaWYgKHJldCAhPT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuICEhcmV0O1xuICB9XG5cbiAgaWYgKG9iakEgPT09IG9iakIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqQSAhPT0gXCJvYmplY3RcIiB8fCAhb2JqQSB8fCB0eXBlb2Ygb2JqQiAhPT0gXCJvYmplY3RcIiB8fCAhb2JqQikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICB2YXIga2V5c0IgPSBPYmplY3Qua2V5cyhvYmpCKTtcblxuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgYkhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5iaW5kKG9iakIpO1xuXG4gIC8vIFRlc3QgZm9yIEEncyBrZXlzIGRpZmZlcmVudCBmcm9tIEIuXG4gIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGtleXNBLmxlbmd0aDsgaWR4KyspIHtcbiAgICB2YXIga2V5ID0ga2V5c0FbaWR4XTtcblxuICAgIGlmICghYkhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWVBID0gb2JqQVtrZXldO1xuICAgIHZhciB2YWx1ZUIgPSBvYmpCW2tleV07XG5cbiAgICByZXQgPSBjb21wYXJlID8gY29tcGFyZS5jYWxsKGNvbXBhcmVDb250ZXh0LCB2YWx1ZUEsIHZhbHVlQiwga2V5KSA6IHZvaWQgMDtcblxuICAgIGlmIChyZXQgPT09IGZhbHNlIHx8IChyZXQgPT09IHZvaWQgMCAmJiB2YWx1ZUEgIT09IHZhbHVlQikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCJpbXBvcnQgc2hhbGxvd0VxdWFsIGZyb20gJ3NoYWxsb3dlcXVhbCc7XG5pbXBvcnQgdXNlTWVtbyBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZW1vXCI7XG5pbXBvcnQgeyBmb3JtYXRWYWx1ZSB9IGZyb20gJy4uL3V0aWxzL2RhdGVVdGlsJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVZhbHVlVGV4dHModmFsdWUsIF9yZWYpIHtcbiAgdmFyIGZvcm1hdExpc3QgPSBfcmVmLmZvcm1hdExpc3QsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBfcmVmLmdlbmVyYXRlQ29uZmlnLFxuICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlO1xuICByZXR1cm4gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIFtbJyddLCAnJ107XG4gICAgfVxuICAgIC8vIFdlIHdpbGwgY29udmVydCBkYXRhIGZvcm1hdCBiYWNrIHRvIGZpcnN0IGZvcm1hdFxuICAgIHZhciBmaXJzdFZhbHVlVGV4dCA9ICcnO1xuICAgIHZhciBmdWxsVmFsdWVUZXh0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9ybWF0TGlzdC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdmFyIGZvcm1hdCA9IGZvcm1hdExpc3RbaV07XG4gICAgICB2YXIgZm9ybWF0U3RyID0gZm9ybWF0VmFsdWUodmFsdWUsIHtcbiAgICAgICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnLFxuICAgICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgICAgZm9ybWF0OiBmb3JtYXRcbiAgICAgIH0pO1xuICAgICAgZnVsbFZhbHVlVGV4dHMucHVzaChmb3JtYXRTdHIpO1xuICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgZmlyc3RWYWx1ZVRleHQgPSBmb3JtYXRTdHI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbZnVsbFZhbHVlVGV4dHMsIGZpcnN0VmFsdWVUZXh0XTtcbiAgfSwgW3ZhbHVlLCBmb3JtYXRMaXN0XSwgZnVuY3Rpb24gKHByZXYsIG5leHQpIHtcbiAgICByZXR1cm4gcHJldlswXSAhPT0gbmV4dFswXSB8fCAhc2hhbGxvd0VxdWFsKHByZXZbMV0sIG5leHRbMV0pO1xuICB9KTtcbn0iLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VWYWx1ZVRleHRzIGZyb20gJy4vdXNlVmFsdWVUZXh0cyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VIb3ZlclZhbHVlKHZhbHVlVGV4dCwgX3JlZikge1xuICB2YXIgZm9ybWF0TGlzdCA9IF9yZWYuZm9ybWF0TGlzdCxcbiAgICBnZW5lcmF0ZUNvbmZpZyA9IF9yZWYuZ2VuZXJhdGVDb25maWcsXG4gICAgbG9jYWxlID0gX3JlZi5sb2NhbGU7XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShudWxsKSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICB2YWx1ZSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgaW50ZXJuYWxTZXRWYWx1ZSA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciByYWYgPSB1c2VSZWYobnVsbCk7XG4gIGZ1bmN0aW9uIHNldFZhbHVlKHZhbCkge1xuICAgIHZhciBpbW1lZGlhdGVseSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmLmN1cnJlbnQpO1xuICAgIGlmIChpbW1lZGlhdGVseSkge1xuICAgICAgaW50ZXJuYWxTZXRWYWx1ZSh2YWwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByYWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICBpbnRlcm5hbFNldFZhbHVlKHZhbCk7XG4gICAgfSk7XG4gIH1cbiAgdmFyIF91c2VWYWx1ZVRleHRzID0gdXNlVmFsdWVUZXh0cyh2YWx1ZSwge1xuICAgICAgZm9ybWF0TGlzdDogZm9ybWF0TGlzdCxcbiAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZyxcbiAgICAgIGxvY2FsZTogbG9jYWxlXG4gICAgfSksXG4gICAgX3VzZVZhbHVlVGV4dHMyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVZhbHVlVGV4dHMsIDIpLFxuICAgIGZpcnN0VGV4dCA9IF91c2VWYWx1ZVRleHRzMlsxXTtcbiAgZnVuY3Rpb24gb25FbnRlcihkYXRlKSB7XG4gICAgc2V0VmFsdWUoZGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gb25MZWF2ZSgpIHtcbiAgICB2YXIgaW1tZWRpYXRlbHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICAgIHNldFZhbHVlKG51bGwsIGltbWVkaWF0ZWx5KTtcbiAgfVxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIG9uTGVhdmUodHJ1ZSk7XG4gIH0sIFt2YWx1ZVRleHRdKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBbZmlyc3RUZXh0LCBvbkVudGVyLCBvbkxlYXZlXTtcbn0iLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuLyoqXG4gKiBSZW1vdmVkOlxuICogIC0gZ2V0Q2FsZW5kYXJDb250YWluZXI6IHVzZSBgZ2V0UG9wdXBDb250YWluZXJgIGluc3RlYWRcbiAqICAtIG9uT2tcbiAqXG4gKiBOZXcgRmVhdHVyZTpcbiAqICAtIHBpY2tlclxuICogIC0gYWxsb3dFbXB0eVxuICogIC0gc2VsZWN0YWJsZVxuICpcbiAqIFRpcHM6IFNob3VsZCBhZGQgZmFxIGFib3V0IGBkYXRldGltZWAgbW9kZSB3aXRoIGBkZWZhdWx0VmFsdWVgXG4gKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG5pbXBvcnQgUGlja2VyUGFuZWwgZnJvbSAnLi9QaWNrZXJQYW5lbCc7XG5pbXBvcnQgUGlja2VyVHJpZ2dlciBmcm9tICcuL1BpY2tlclRyaWdnZXInO1xuaW1wb3J0IHsgZm9ybWF0VmFsdWUsIGlzRXF1YWwsIHBhcnNlVmFsdWUgfSBmcm9tICcuL3V0aWxzL2RhdGVVdGlsJztcbmltcG9ydCBnZXREYXRhT3JBcmlhUHJvcHMsIHsgdG9BcnJheSB9IGZyb20gJy4vdXRpbHMvbWlzY1V0aWwnO1xuaW1wb3J0IFBhbmVsQ29udGV4dCBmcm9tICcuL1BhbmVsQ29udGV4dCc7XG5pbXBvcnQgeyBnZXREZWZhdWx0Rm9ybWF0LCBnZXRJbnB1dFNpemUsIGVsZW1lbnRzQ29udGFpbnMgfSBmcm9tICcuL3V0aWxzL3VpVXRpbCc7XG5pbXBvcnQgdXNlUGlja2VySW5wdXQgZnJvbSAnLi9ob29rcy91c2VQaWNrZXJJbnB1dCc7XG5pbXBvcnQgdXNlVGV4dFZhbHVlTWFwcGluZyBmcm9tICcuL2hvb2tzL3VzZVRleHRWYWx1ZU1hcHBpbmcnO1xuaW1wb3J0IHVzZVZhbHVlVGV4dHMgZnJvbSAnLi9ob29rcy91c2VWYWx1ZVRleHRzJztcbmltcG9ydCB1c2VIb3ZlclZhbHVlIGZyb20gJy4vaG9va3MvdXNlSG92ZXJWYWx1ZSc7XG5pbXBvcnQgeyBsZWdhY3lQcm9wc1dhcm5pbmcgfSBmcm9tICcuL3V0aWxzL3dhcm5VdGlsJztcbmZ1bmN0aW9uIElubmVyUGlja2VyKHByb3BzKSB7XG4gIHZhciBfY2xhc3NOYW1lczI7XG4gIHZhciBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy1waWNrZXInIDogX3Byb3BzJHByZWZpeENscyxcbiAgICBpZCA9IHByb3BzLmlkLFxuICAgIHRhYkluZGV4ID0gcHJvcHMudGFiSW5kZXgsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgZHJvcGRvd25DbGFzc05hbWUgPSBwcm9wcy5kcm9wZG93bkNsYXNzTmFtZSxcbiAgICBkcm9wZG93bkFsaWduID0gcHJvcHMuZHJvcGRvd25BbGlnbixcbiAgICBwb3B1cFN0eWxlID0gcHJvcHMucG9wdXBTdHlsZSxcbiAgICB0cmFuc2l0aW9uTmFtZSA9IHByb3BzLnRyYW5zaXRpb25OYW1lLFxuICAgIGdlbmVyYXRlQ29uZmlnID0gcHJvcHMuZ2VuZXJhdGVDb25maWcsXG4gICAgbG9jYWxlID0gcHJvcHMubG9jYWxlLFxuICAgIGlucHV0UmVhZE9ubHkgPSBwcm9wcy5pbnB1dFJlYWRPbmx5LFxuICAgIGFsbG93Q2xlYXIgPSBwcm9wcy5hbGxvd0NsZWFyLFxuICAgIGF1dG9Gb2N1cyA9IHByb3BzLmF1dG9Gb2N1cyxcbiAgICBzaG93VGltZSA9IHByb3BzLnNob3dUaW1lLFxuICAgIF9wcm9wcyRwaWNrZXIgPSBwcm9wcy5waWNrZXIsXG4gICAgcGlja2VyID0gX3Byb3BzJHBpY2tlciA9PT0gdm9pZCAwID8gJ2RhdGUnIDogX3Byb3BzJHBpY2tlcixcbiAgICBmb3JtYXQgPSBwcm9wcy5mb3JtYXQsXG4gICAgdXNlMTJIb3VycyA9IHByb3BzLnVzZTEySG91cnMsXG4gICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWUsXG4gICAgb3BlbiA9IHByb3BzLm9wZW4sXG4gICAgZGVmYXVsdE9wZW4gPSBwcm9wcy5kZWZhdWx0T3BlbixcbiAgICBkZWZhdWx0T3BlblZhbHVlID0gcHJvcHMuZGVmYXVsdE9wZW5WYWx1ZSxcbiAgICBzdWZmaXhJY29uID0gcHJvcHMuc3VmZml4SWNvbixcbiAgICBjbGVhckljb24gPSBwcm9wcy5jbGVhckljb24sXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBkaXNhYmxlZERhdGUgPSBwcm9wcy5kaXNhYmxlZERhdGUsXG4gICAgcGxhY2Vob2xkZXIgPSBwcm9wcy5wbGFjZWhvbGRlcixcbiAgICBnZXRQb3B1cENvbnRhaW5lciA9IHByb3BzLmdldFBvcHVwQ29udGFpbmVyLFxuICAgIHBpY2tlclJlZiA9IHByb3BzLnBpY2tlclJlZixcbiAgICBwYW5lbFJlbmRlciA9IHByb3BzLnBhbmVsUmVuZGVyLFxuICAgIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgb25PcGVuQ2hhbmdlID0gcHJvcHMub25PcGVuQ2hhbmdlLFxuICAgIG9uRm9jdXMgPSBwcm9wcy5vbkZvY3VzLFxuICAgIG9uQmx1ciA9IHByb3BzLm9uQmx1cixcbiAgICBvbk1vdXNlRG93biA9IHByb3BzLm9uTW91c2VEb3duLFxuICAgIG9uTW91c2VVcCA9IHByb3BzLm9uTW91c2VVcCxcbiAgICBvbk1vdXNlRW50ZXIgPSBwcm9wcy5vbk1vdXNlRW50ZXIsXG4gICAgb25Nb3VzZUxlYXZlID0gcHJvcHMub25Nb3VzZUxlYXZlLFxuICAgIG9uQ29udGV4dE1lbnUgPSBwcm9wcy5vbkNvbnRleHRNZW51LFxuICAgIG9uQ2xpY2sgPSBwcm9wcy5vbkNsaWNrLFxuICAgIF9vbktleURvd24gPSBwcm9wcy5vbktleURvd24sXG4gICAgX29uU2VsZWN0ID0gcHJvcHMub25TZWxlY3QsXG4gICAgZGlyZWN0aW9uID0gcHJvcHMuZGlyZWN0aW9uLFxuICAgIF9wcm9wcyRhdXRvQ29tcGxldGUgPSBwcm9wcy5hdXRvQ29tcGxldGUsXG4gICAgYXV0b0NvbXBsZXRlID0gX3Byb3BzJGF1dG9Db21wbGV0ZSA9PT0gdm9pZCAwID8gJ29mZicgOiBfcHJvcHMkYXV0b0NvbXBsZXRlLFxuICAgIGlucHV0UmVuZGVyID0gcHJvcHMuaW5wdXRSZW5kZXI7XG4gIHZhciBpbnB1dFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIG5lZWRDb25maXJtQnV0dG9uID0gcGlja2VyID09PSAnZGF0ZScgJiYgISFzaG93VGltZSB8fCBwaWNrZXIgPT09ICd0aW1lJztcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBXYXJuaW5nID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBsZWdhY3lQcm9wc1dhcm5pbmcocHJvcHMpO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN0YXRlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBmb3JtYXRMaXN0ID0gdG9BcnJheShnZXREZWZhdWx0Rm9ybWF0KGZvcm1hdCwgcGlja2VyLCBzaG93VGltZSwgdXNlMTJIb3VycykpO1xuICAvLyBQYW5lbCByZWZcbiAgdmFyIHBhbmVsRGl2UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgaW5wdXREaXZSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBjb250YWluZXJSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIC8vIFJlYWwgdmFsdWVcbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKG51bGwsIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZGVmYXVsdFZhbHVlXG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgbWVyZ2VkVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgIHNldElubmVyVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzFdO1xuICAvLyBTZWxlY3RlZCB2YWx1ZVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUobWVyZ2VkVmFsdWUpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHNlbGVjdGVkVmFsdWUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFNlbGVjdGVkVmFsdWUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICAvLyBPcGVyYXRpb24gcmVmXG4gIHZhciBvcGVyYXRpb25SZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIC8vIE9wZW5cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZTMgPSB1c2VNZXJnZWRTdGF0ZShmYWxzZSwge1xuICAgICAgdmFsdWU6IG9wZW4sXG4gICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRPcGVuLFxuICAgICAgcG9zdFN0YXRlOiBmdW5jdGlvbiBwb3N0U3RhdGUocG9zdE9wZW4pIHtcbiAgICAgICAgcmV0dXJuIGRpc2FibGVkID8gZmFsc2UgOiBwb3N0T3BlbjtcbiAgICAgIH0sXG4gICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UobmV3T3Blbikge1xuICAgICAgICBpZiAob25PcGVuQ2hhbmdlKSB7XG4gICAgICAgICAgb25PcGVuQ2hhbmdlKG5ld09wZW4pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbmV3T3BlbiAmJiBvcGVyYXRpb25SZWYuY3VycmVudCAmJiBvcGVyYXRpb25SZWYuY3VycmVudC5vbkNsb3NlKSB7XG4gICAgICAgICAgb3BlcmF0aW9uUmVmLmN1cnJlbnQub25DbG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZTMsIDIpLFxuICAgIG1lcmdlZE9wZW4gPSBfdXNlTWVyZ2VkU3RhdGU0WzBdLFxuICAgIHRyaWdnZXJJbm5lck9wZW4gPSBfdXNlTWVyZ2VkU3RhdGU0WzFdO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZVZhbHVlVGV4dHMgPSB1c2VWYWx1ZVRleHRzKHNlbGVjdGVkVmFsdWUsIHtcbiAgICAgIGZvcm1hdExpc3Q6IGZvcm1hdExpc3QsXG4gICAgICBnZW5lcmF0ZUNvbmZpZzogZ2VuZXJhdGVDb25maWcsXG4gICAgICBsb2NhbGU6IGxvY2FsZVxuICAgIH0pLFxuICAgIF91c2VWYWx1ZVRleHRzMiA9IF9zbGljZWRUb0FycmF5KF91c2VWYWx1ZVRleHRzLCAyKSxcbiAgICB2YWx1ZVRleHRzID0gX3VzZVZhbHVlVGV4dHMyWzBdLFxuICAgIGZpcnN0VmFsdWVUZXh0ID0gX3VzZVZhbHVlVGV4dHMyWzFdO1xuICB2YXIgX3VzZVRleHRWYWx1ZU1hcHBpbmcgPSB1c2VUZXh0VmFsdWVNYXBwaW5nKHtcbiAgICAgIHZhbHVlVGV4dHM6IHZhbHVlVGV4dHMsXG4gICAgICBvblRleHRDaGFuZ2U6IGZ1bmN0aW9uIG9uVGV4dENoYW5nZShuZXdUZXh0KSB7XG4gICAgICAgIHZhciBpbnB1dERhdGUgPSBwYXJzZVZhbHVlKG5ld1RleHQsIHtcbiAgICAgICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgICAgICBmb3JtYXRMaXN0OiBmb3JtYXRMaXN0LFxuICAgICAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZ1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGlucHV0RGF0ZSAmJiAoIWRpc2FibGVkRGF0ZSB8fCAhZGlzYWJsZWREYXRlKGlucHV0RGF0ZSkpKSB7XG4gICAgICAgICAgc2V0U2VsZWN0ZWRWYWx1ZShpbnB1dERhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSksXG4gICAgX3VzZVRleHRWYWx1ZU1hcHBpbmcyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVRleHRWYWx1ZU1hcHBpbmcsIDMpLFxuICAgIHRleHQgPSBfdXNlVGV4dFZhbHVlTWFwcGluZzJbMF0sXG4gICAgdHJpZ2dlclRleHRDaGFuZ2UgPSBfdXNlVGV4dFZhbHVlTWFwcGluZzJbMV0sXG4gICAgcmVzZXRUZXh0ID0gX3VzZVRleHRWYWx1ZU1hcHBpbmcyWzJdO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFRyaWdnZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgdHJpZ2dlckNoYW5nZSA9IGZ1bmN0aW9uIHRyaWdnZXJDaGFuZ2UobmV3VmFsdWUpIHtcbiAgICBzZXRTZWxlY3RlZFZhbHVlKG5ld1ZhbHVlKTtcbiAgICBzZXRJbm5lclZhbHVlKG5ld1ZhbHVlKTtcbiAgICBpZiAob25DaGFuZ2UgJiYgIWlzRXF1YWwoZ2VuZXJhdGVDb25maWcsIG1lcmdlZFZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAgIG9uQ2hhbmdlKG5ld1ZhbHVlLCBuZXdWYWx1ZSA/IGZvcm1hdFZhbHVlKG5ld1ZhbHVlLCB7XG4gICAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZyxcbiAgICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICAgIGZvcm1hdDogZm9ybWF0TGlzdFswXVxuICAgICAgfSkgOiAnJyk7XG4gICAgfVxuICB9O1xuICB2YXIgdHJpZ2dlck9wZW4gPSBmdW5jdGlvbiB0cmlnZ2VyT3BlbihuZXdPcGVuKSB7XG4gICAgaWYgKGRpc2FibGVkICYmIG5ld09wZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJpZ2dlcklubmVyT3BlbihuZXdPcGVuKTtcbiAgfTtcbiAgdmFyIGZvcndhcmRLZXlEb3duID0gZnVuY3Rpb24gZm9yd2FyZEtleURvd24oZSkge1xuICAgIGlmIChtZXJnZWRPcGVuICYmIG9wZXJhdGlvblJlZi5jdXJyZW50ICYmIG9wZXJhdGlvblJlZi5jdXJyZW50Lm9uS2V5RG93bikge1xuICAgICAgLy8gTGV0IHBvcHVwIHBhbmVsIGhhbmRsZSBrZXlib2FyZFxuICAgICAgcmV0dXJuIG9wZXJhdGlvblJlZi5jdXJyZW50Lm9uS2V5RG93bihlKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1sb25lLWJsb2NrcyAqL1xuICAgIHtcbiAgICAgIHdhcm5pbmcoZmFsc2UsICdQaWNrZXIgbm90IGNvcnJlY3QgZm9yd2FyZCBLZXlEb3duIG9wZXJhdGlvbi4gUGxlYXNlIGhlbHAgdG8gZmlyZSBpc3N1ZSBhYm91dCB0aGlzLicpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgdmFyIG9uSW50ZXJuYWxDbGljayA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxDbGljaygpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIG9uQ2xpY2sgPT09IG51bGwgfHwgb25DbGljayA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DbGljay5hcHBseSh2b2lkIDAsIGFyZ3MpO1xuICAgIGlmIChpbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICBpbnB1dFJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgICB0cmlnZ2VyT3Blbih0cnVlKTtcbiAgICB9XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElucHV0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlUGlja2VySW5wdXQgPSB1c2VQaWNrZXJJbnB1dCh7XG4gICAgICBibHVyVG9DYW5jZWw6IG5lZWRDb25maXJtQnV0dG9uLFxuICAgICAgb3BlbjogbWVyZ2VkT3BlbixcbiAgICAgIHZhbHVlOiB0ZXh0LFxuICAgICAgdHJpZ2dlck9wZW46IHRyaWdnZXJPcGVuLFxuICAgICAgZm9yd2FyZEtleURvd246IGZvcndhcmRLZXlEb3duLFxuICAgICAgaXNDbGlja091dHNpZGU6IGZ1bmN0aW9uIGlzQ2xpY2tPdXRzaWRlKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gIWVsZW1lbnRzQ29udGFpbnMoW3BhbmVsRGl2UmVmLmN1cnJlbnQsIGlucHV0RGl2UmVmLmN1cnJlbnQsIGNvbnRhaW5lclJlZi5jdXJyZW50XSwgdGFyZ2V0KTtcbiAgICAgIH0sXG4gICAgICBvblN1Ym1pdDogZnVuY3Rpb24gb25TdWJtaXQoKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgLy8gV2hlbiB1c2VyIHR5cGluZyBkaXNhYmxlZERhdGUgd2l0aCBrZXlib2FyZCBhbmQgZW50ZXIsIHRoaXMgdmFsdWUgd2lsbCBiZSBlbXB0eVxuICAgICAgICAhc2VsZWN0ZWRWYWx1ZSB8fFxuICAgICAgICAvLyBOb3JtYWwgZGlzYWJsZWQgY2hlY2tcbiAgICAgICAgZGlzYWJsZWREYXRlICYmIGRpc2FibGVkRGF0ZShzZWxlY3RlZFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyQ2hhbmdlKHNlbGVjdGVkVmFsdWUpO1xuICAgICAgICB0cmlnZ2VyT3BlbihmYWxzZSk7XG4gICAgICAgIHJlc2V0VGV4dCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBvbkNhbmNlbDogZnVuY3Rpb24gb25DYW5jZWwoKSB7XG4gICAgICAgIHRyaWdnZXJPcGVuKGZhbHNlKTtcbiAgICAgICAgc2V0U2VsZWN0ZWRWYWx1ZShtZXJnZWRWYWx1ZSk7XG4gICAgICAgIHJlc2V0VGV4dCgpO1xuICAgICAgfSxcbiAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKGUsIHByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgIF9vbktleURvd24gPT09IG51bGwgfHwgX29uS2V5RG93biA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29uS2V5RG93bihlLCBwcmV2ZW50RGVmYXVsdCk7XG4gICAgICB9LFxuICAgICAgb25Gb2N1czogb25Gb2N1cyxcbiAgICAgIG9uQmx1cjogb25CbHVyXG4gICAgfSksXG4gICAgX3VzZVBpY2tlcklucHV0MiA9IF9zbGljZWRUb0FycmF5KF91c2VQaWNrZXJJbnB1dCwgMiksXG4gICAgaW5wdXRQcm9wcyA9IF91c2VQaWNrZXJJbnB1dDJbMF0sXG4gICAgX3VzZVBpY2tlcklucHV0MiQgPSBfdXNlUGlja2VySW5wdXQyWzFdLFxuICAgIGZvY3VzZWQgPSBfdXNlUGlja2VySW5wdXQyJC5mb2N1c2VkLFxuICAgIHR5cGluZyA9IF91c2VQaWNrZXJJbnB1dDIkLnR5cGluZztcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU3luYyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ2xvc2Ugc2hvdWxkIHN5bmMgYmFjayB3aXRoIHRleHQgdmFsdWVcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIW1lcmdlZE9wZW4pIHtcbiAgICAgIHNldFNlbGVjdGVkVmFsdWUobWVyZ2VkVmFsdWUpO1xuICAgICAgaWYgKCF2YWx1ZVRleHRzLmxlbmd0aCB8fCB2YWx1ZVRleHRzWzBdID09PSAnJykge1xuICAgICAgICB0cmlnZ2VyVGV4dENoYW5nZSgnJyk7XG4gICAgICB9IGVsc2UgaWYgKGZpcnN0VmFsdWVUZXh0ICE9PSB0ZXh0KSB7XG4gICAgICAgIHJlc2V0VGV4dCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW21lcmdlZE9wZW4sIHZhbHVlVGV4dHNdKTtcbiAgLy8gQ2hhbmdlIHBpY2tlciBzaG91bGQgc3luYyBiYWNrIHdpdGggdGV4dCB2YWx1ZVxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghbWVyZ2VkT3Blbikge1xuICAgICAgcmVzZXRUZXh0KCk7XG4gICAgfVxuICB9LCBbcGlja2VyXSk7XG4gIC8vIFN5bmMgaW5uZXJWYWx1ZSB3aXRoIGNvbnRyb2wgbW9kZVxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIC8vIFN5bmMgc2VsZWN0IHZhbHVlXG4gICAgc2V0U2VsZWN0ZWRWYWx1ZShtZXJnZWRWYWx1ZSk7XG4gIH0sIFttZXJnZWRWYWx1ZV0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFByaXZhdGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAocGlja2VyUmVmKSB7XG4gICAgcGlja2VyUmVmLmN1cnJlbnQgPSB7XG4gICAgICBmb2N1czogZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgICAgIGlmIChpbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgaW5wdXRSZWYuY3VycmVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYmx1cjogZnVuY3Rpb24gYmx1cigpIHtcbiAgICAgICAgaWYgKGlucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBpbnB1dFJlZi5jdXJyZW50LmJsdXIoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbiAgdmFyIF91c2VIb3ZlclZhbHVlID0gdXNlSG92ZXJWYWx1ZSh0ZXh0LCB7XG4gICAgICBmb3JtYXRMaXN0OiBmb3JtYXRMaXN0LFxuICAgICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnLFxuICAgICAgbG9jYWxlOiBsb2NhbGVcbiAgICB9KSxcbiAgICBfdXNlSG92ZXJWYWx1ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlSG92ZXJWYWx1ZSwgMyksXG4gICAgaG92ZXJWYWx1ZSA9IF91c2VIb3ZlclZhbHVlMlswXSxcbiAgICBvbkVudGVyID0gX3VzZUhvdmVyVmFsdWUyWzFdLFxuICAgIG9uTGVhdmUgPSBfdXNlSG92ZXJWYWx1ZTJbMl07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFBhbmVsID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBwYW5lbFByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgY2xhc3NOYW1lOiB1bmRlZmluZWQsXG4gICAgc3R5bGU6IHVuZGVmaW5lZCxcbiAgICBwaWNrZXJWYWx1ZTogdW5kZWZpbmVkLFxuICAgIG9uUGlja2VyVmFsdWVDaGFuZ2U6IHVuZGVmaW5lZCxcbiAgICBvbkNoYW5nZTogbnVsbFxuICB9KTtcbiAgdmFyIHBhbmVsTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBpY2tlclBhbmVsLCBfZXh0ZW5kcyh7fSwgcGFuZWxQcm9wcywge1xuICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZyxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBhbmVsLWZvY3VzZWRcIiksICF0eXBpbmcpKSxcbiAgICB2YWx1ZTogc2VsZWN0ZWRWYWx1ZSxcbiAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICB0YWJJbmRleDogLTEsXG4gICAgb25TZWxlY3Q6IGZ1bmN0aW9uIG9uU2VsZWN0KGRhdGUpIHtcbiAgICAgIF9vblNlbGVjdCA9PT0gbnVsbCB8fCBfb25TZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vblNlbGVjdChkYXRlKTtcbiAgICAgIHNldFNlbGVjdGVkVmFsdWUoZGF0ZSk7XG4gICAgfSxcbiAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICBvblBhbmVsQ2hhbmdlOiBmdW5jdGlvbiBvblBhbmVsQ2hhbmdlKHZpZXdEYXRlLCBtb2RlKSB7XG4gICAgICB2YXIgb25QYW5lbENoYW5nZSA9IHByb3BzLm9uUGFuZWxDaGFuZ2U7XG4gICAgICBvbkxlYXZlKHRydWUpO1xuICAgICAgb25QYW5lbENoYW5nZSA9PT0gbnVsbCB8fCBvblBhbmVsQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblBhbmVsQ2hhbmdlKHZpZXdEYXRlLCBtb2RlKTtcbiAgICB9XG4gIH0pKTtcbiAgaWYgKHBhbmVsUmVuZGVyKSB7XG4gICAgcGFuZWxOb2RlID0gcGFuZWxSZW5kZXIocGFuZWxOb2RlKTtcbiAgfVxuICB2YXIgcGFuZWwgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBhbmVsLWNvbnRhaW5lclwiKSxcbiAgICBvbk1vdXNlRG93bjogZnVuY3Rpb24gb25Nb3VzZURvd24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSwgcGFuZWxOb2RlKTtcbiAgdmFyIHN1ZmZpeE5vZGU7XG4gIGlmIChzdWZmaXhJY29uKSB7XG4gICAgc3VmZml4Tm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3VmZml4XCIpXG4gICAgfSwgc3VmZml4SWNvbik7XG4gIH1cbiAgdmFyIGNsZWFyTm9kZTtcbiAgaWYgKGFsbG93Q2xlYXIgJiYgbWVyZ2VkVmFsdWUgJiYgIWRpc2FibGVkKSB7XG4gICAgY2xlYXJOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIG9uTW91c2VEb3duOiBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH0sXG4gICAgICBvbk1vdXNlVXA6IGZ1bmN0aW9uIG9uTW91c2VVcChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdHJpZ2dlckNoYW5nZShudWxsKTtcbiAgICAgICAgdHJpZ2dlck9wZW4oZmFsc2UpO1xuICAgICAgfSxcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jbGVhclwiKSxcbiAgICAgIHJvbGU6IFwiYnV0dG9uXCJcbiAgICB9LCBjbGVhckljb24gfHwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jbGVhci1idG5cIilcbiAgICB9KSk7XG4gIH1cbiAgdmFyIG1lcmdlZElucHV0UHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgaWQ6IGlkLFxuICAgIHRhYkluZGV4OiB0YWJJbmRleCxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgcmVhZE9ubHk6IGlucHV0UmVhZE9ubHkgfHwgdHlwZW9mIGZvcm1hdExpc3RbMF0gPT09ICdmdW5jdGlvbicgfHwgIXR5cGluZyxcbiAgICB2YWx1ZTogaG92ZXJWYWx1ZSB8fCB0ZXh0LFxuICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgICB0cmlnZ2VyVGV4dENoYW5nZShlLnRhcmdldC52YWx1ZSk7XG4gICAgfSxcbiAgICBhdXRvRm9jdXM6IGF1dG9Gb2N1cyxcbiAgICBwbGFjZWhvbGRlcjogcGxhY2Vob2xkZXIsXG4gICAgcmVmOiBpbnB1dFJlZixcbiAgICB0aXRsZTogdGV4dFxuICB9LCBpbnB1dFByb3BzKSwge30sIHtcbiAgICBzaXplOiBnZXRJbnB1dFNpemUocGlja2VyLCBmb3JtYXRMaXN0WzBdLCBnZW5lcmF0ZUNvbmZpZylcbiAgfSwgZ2V0RGF0YU9yQXJpYVByb3BzKHByb3BzKSksIHt9LCB7XG4gICAgYXV0b0NvbXBsZXRlOiBhdXRvQ29tcGxldGVcbiAgfSk7XG4gIHZhciBpbnB1dE5vZGUgPSBpbnB1dFJlbmRlciA/IGlucHV0UmVuZGVyKG1lcmdlZElucHV0UHJvcHMpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCBtZXJnZWRJbnB1dFByb3BzKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBXYXJuaW5nID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB3YXJuaW5nKCFkZWZhdWx0T3BlblZhbHVlLCAnYGRlZmF1bHRPcGVuVmFsdWVgIG1heSBjb25mdXNlIHVzZXIgZm9yIHRoZSBjdXJyZW50IHZhbHVlIHN0YXR1cy4gUGxlYXNlIHVzZSBgZGVmYXVsdFZhbHVlYCBpbnN0ZWFkLicpO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmV0dXJuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvbkNvbnRleHRTZWxlY3QgPSBmdW5jdGlvbiBvbkNvbnRleHRTZWxlY3QoZGF0ZSwgdHlwZSkge1xuICAgIGlmICh0eXBlID09PSAnc3VibWl0JyB8fCB0eXBlICE9PSAna2V5JyAmJiAhbmVlZENvbmZpcm1CdXR0b24pIHtcbiAgICAgIC8vIHRyaWdnZXJDaGFuZ2Ugd2lsbCBhbHNvIHVwZGF0ZSBzZWxlY3RlZCB2YWx1ZXNcbiAgICAgIHRyaWdnZXJDaGFuZ2UoZGF0ZSk7XG4gICAgICB0cmlnZ2VyT3BlbihmYWxzZSk7XG4gICAgfVxuICB9O1xuICB2YXIgcG9wdXBQbGFjZW1lbnQgPSBkaXJlY3Rpb24gPT09ICdydGwnID8gJ2JvdHRvbVJpZ2h0JyA6ICdib3R0b21MZWZ0JztcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBhbmVsQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiB7XG4gICAgICBvcGVyYXRpb25SZWY6IG9wZXJhdGlvblJlZixcbiAgICAgIGhpZGVIZWFkZXI6IHBpY2tlciA9PT0gJ3RpbWUnLFxuICAgICAgcGFuZWxSZWY6IHBhbmVsRGl2UmVmLFxuICAgICAgb25TZWxlY3Q6IG9uQ29udGV4dFNlbGVjdCxcbiAgICAgIG9wZW46IG1lcmdlZE9wZW4sXG4gICAgICBkZWZhdWx0T3BlblZhbHVlOiBkZWZhdWx0T3BlblZhbHVlLFxuICAgICAgb25EYXRlTW91c2VFbnRlcjogb25FbnRlcixcbiAgICAgIG9uRGF0ZU1vdXNlTGVhdmU6IG9uTGVhdmVcbiAgICB9XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBpY2tlclRyaWdnZXIsIHtcbiAgICB2aXNpYmxlOiBtZXJnZWRPcGVuLFxuICAgIHBvcHVwRWxlbWVudDogcGFuZWwsXG4gICAgcG9wdXBTdHlsZTogcG9wdXBTdHlsZSxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBkcm9wZG93bkNsYXNzTmFtZTogZHJvcGRvd25DbGFzc05hbWUsXG4gICAgZHJvcGRvd25BbGlnbjogZHJvcGRvd25BbGlnbixcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIsXG4gICAgdHJhbnNpdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lLFxuICAgIHBvcHVwUGxhY2VtZW50OiBwb3B1cFBsYWNlbWVudCxcbiAgICBkaXJlY3Rpb246IGRpcmVjdGlvblxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiBjb250YWluZXJSZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHByZWZpeENscywgY2xhc3NOYW1lLCAoX2NsYXNzTmFtZXMyID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1mb2N1c2VkXCIpLCBmb2N1c2VkKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfY2xhc3NOYW1lczIpKSxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgb25Nb3VzZURvd246IG9uTW91c2VEb3duLFxuICAgIG9uTW91c2VVcDogb25Nb3VzZVVwLFxuICAgIG9uTW91c2VFbnRlcjogb25Nb3VzZUVudGVyLFxuICAgIG9uTW91c2VMZWF2ZTogb25Nb3VzZUxlYXZlLFxuICAgIG9uQ29udGV4dE1lbnU6IG9uQ29udGV4dE1lbnUsXG4gICAgb25DbGljazogb25JbnRlcm5hbENsaWNrXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbnB1dFwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlucHV0LXBsYWNlaG9sZGVyXCIpLCAhIWhvdmVyVmFsdWUpKSxcbiAgICByZWY6IGlucHV0RGl2UmVmXG4gIH0sIGlucHV0Tm9kZSwgc3VmZml4Tm9kZSwgY2xlYXJOb2RlKSkpKTtcbn1cbi8vIFdyYXAgd2l0aCBjbGFzcyBjb21wb25lbnQgdG8gZW5hYmxlIHBhc3MgZ2VuZXJpYyB3aXRoIGluc3RhbmNlIG1ldGhvZFxudmFyIFBpY2tlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoUGlja2VyLCBfUmVhY3QkQ29tcG9uZW50KTtcbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihQaWNrZXIpO1xuICBmdW5jdGlvbiBQaWNrZXIoKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQaWNrZXIpO1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsLmFwcGx5KF9zdXBlciwgW3RoaXNdLmNvbmNhdChhcmdzKSk7XG4gICAgX3RoaXMucGlja2VyUmVmID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZVJlZigpO1xuICAgIF90aGlzLmZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnBpY2tlclJlZi5jdXJyZW50KSB7XG4gICAgICAgIF90aGlzLnBpY2tlclJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBfdGhpcy5ibHVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnBpY2tlclJlZi5jdXJyZW50KSB7XG4gICAgICAgIF90aGlzLnBpY2tlclJlZi5jdXJyZW50LmJsdXIoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBfY3JlYXRlQ2xhc3MoUGlja2VyLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KElubmVyUGlja2VyLCBfZXh0ZW5kcyh7fSwgdGhpcy5wcm9wcywge1xuICAgICAgICBwaWNrZXJSZWY6IHRoaXMucGlja2VyUmVmXG4gICAgICB9KSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBQaWNrZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5leHBvcnQgZGVmYXVsdCBQaWNrZXI7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0VmFsdWUgfSBmcm9tICcuLi91dGlscy9taXNjVXRpbCc7XG5pbXBvcnQgeyBpc1NhbWVEYXRlLCBnZXRRdWFydGVyIH0gZnJvbSAnLi4vdXRpbHMvZGF0ZVV0aWwnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlUmFuZ2VEaXNhYmxlZChfcmVmLCBkaXNhYmxlZFN0YXJ0LCBkaXNhYmxlZEVuZCkge1xuICB2YXIgcGlja2VyID0gX3JlZi5waWNrZXIsXG4gICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsXG4gICAgc2VsZWN0ZWRWYWx1ZSA9IF9yZWYuc2VsZWN0ZWRWYWx1ZSxcbiAgICBkaXNhYmxlZERhdGUgPSBfcmVmLmRpc2FibGVkRGF0ZSxcbiAgICBkaXNhYmxlZCA9IF9yZWYuZGlzYWJsZWQsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBfcmVmLmdlbmVyYXRlQ29uZmlnO1xuICB2YXIgc3RhcnREYXRlID0gZ2V0VmFsdWUoc2VsZWN0ZWRWYWx1ZSwgMCk7XG4gIHZhciBlbmREYXRlID0gZ2V0VmFsdWUoc2VsZWN0ZWRWYWx1ZSwgMSk7XG4gIGZ1bmN0aW9uIHdlZWtGaXJzdERhdGUoZGF0ZSkge1xuICAgIHJldHVybiBnZW5lcmF0ZUNvbmZpZy5sb2NhbGUuZ2V0V2Vla0ZpcnN0RGF0ZShsb2NhbGUubG9jYWxlLCBkYXRlKTtcbiAgfVxuICBmdW5jdGlvbiBtb250aE51bWJlcihkYXRlKSB7XG4gICAgdmFyIHllYXIgPSBnZW5lcmF0ZUNvbmZpZy5nZXRZZWFyKGRhdGUpO1xuICAgIHZhciBtb250aCA9IGdlbmVyYXRlQ29uZmlnLmdldE1vbnRoKGRhdGUpO1xuICAgIHJldHVybiB5ZWFyICogMTAwICsgbW9udGg7XG4gIH1cbiAgZnVuY3Rpb24gcXVhcnRlck51bWJlcihkYXRlKSB7XG4gICAgdmFyIHllYXIgPSBnZW5lcmF0ZUNvbmZpZy5nZXRZZWFyKGRhdGUpO1xuICAgIHZhciBxdWFydGVyID0gZ2V0UXVhcnRlcihnZW5lcmF0ZUNvbmZpZywgZGF0ZSk7XG4gICAgcmV0dXJuIHllYXIgKiAxMCArIHF1YXJ0ZXI7XG4gIH1cbiAgdmFyIGRpc2FibGVkU3RhcnREYXRlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGRhdGUpIHtcbiAgICBpZiAoZGlzYWJsZWREYXRlICYmIGRpc2FibGVkRGF0ZShkYXRlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIERpc2FibGVkIHJhbmdlXG4gICAgaWYgKGRpc2FibGVkWzFdICYmIGVuZERhdGUpIHtcbiAgICAgIHJldHVybiAhaXNTYW1lRGF0ZShnZW5lcmF0ZUNvbmZpZywgZGF0ZSwgZW5kRGF0ZSkgJiYgZ2VuZXJhdGVDb25maWcuaXNBZnRlcihkYXRlLCBlbmREYXRlKTtcbiAgICB9XG4gICAgLy8gRGlzYWJsZWQgcGFydFxuICAgIGlmIChkaXNhYmxlZFN0YXJ0ICYmIGVuZERhdGUpIHtcbiAgICAgIHN3aXRjaCAocGlja2VyKSB7XG4gICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgIHJldHVybiBxdWFydGVyTnVtYmVyKGRhdGUpID4gcXVhcnRlck51bWJlcihlbmREYXRlKTtcbiAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgIHJldHVybiBtb250aE51bWJlcihkYXRlKSA+IG1vbnRoTnVtYmVyKGVuZERhdGUpO1xuICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICByZXR1cm4gd2Vla0ZpcnN0RGF0ZShkYXRlKSA+IHdlZWtGaXJzdERhdGUoZW5kRGF0ZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuICFpc1NhbWVEYXRlKGdlbmVyYXRlQ29uZmlnLCBkYXRlLCBlbmREYXRlKSAmJiBnZW5lcmF0ZUNvbmZpZy5pc0FmdGVyKGRhdGUsIGVuZERhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sIFtkaXNhYmxlZERhdGUsIGRpc2FibGVkWzFdLCBlbmREYXRlLCBkaXNhYmxlZFN0YXJ0XSk7XG4gIHZhciBkaXNhYmxlZEVuZERhdGUgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZGF0ZSkge1xuICAgIGlmIChkaXNhYmxlZERhdGUgJiYgZGlzYWJsZWREYXRlKGRhdGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gRGlzYWJsZWQgcmFuZ2VcbiAgICBpZiAoZGlzYWJsZWRbMF0gJiYgc3RhcnREYXRlKSB7XG4gICAgICByZXR1cm4gIWlzU2FtZURhdGUoZ2VuZXJhdGVDb25maWcsIGRhdGUsIGVuZERhdGUpICYmIGdlbmVyYXRlQ29uZmlnLmlzQWZ0ZXIoc3RhcnREYXRlLCBkYXRlKTtcbiAgICB9XG4gICAgLy8gRGlzYWJsZWQgcGFydFxuICAgIGlmIChkaXNhYmxlZEVuZCAmJiBzdGFydERhdGUpIHtcbiAgICAgIHN3aXRjaCAocGlja2VyKSB7XG4gICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgIHJldHVybiBxdWFydGVyTnVtYmVyKGRhdGUpIDwgcXVhcnRlck51bWJlcihzdGFydERhdGUpO1xuICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgcmV0dXJuIG1vbnRoTnVtYmVyKGRhdGUpIDwgbW9udGhOdW1iZXIoc3RhcnREYXRlKTtcbiAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgICAgcmV0dXJuIHdlZWtGaXJzdERhdGUoZGF0ZSkgPCB3ZWVrRmlyc3REYXRlKHN0YXJ0RGF0ZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuICFpc1NhbWVEYXRlKGdlbmVyYXRlQ29uZmlnLCBkYXRlLCBzdGFydERhdGUpICYmIGdlbmVyYXRlQ29uZmlnLmlzQWZ0ZXIoc3RhcnREYXRlLCBkYXRlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LCBbZGlzYWJsZWREYXRlLCBkaXNhYmxlZFswXSwgc3RhcnREYXRlLCBkaXNhYmxlZEVuZF0pO1xuICByZXR1cm4gW2Rpc2FibGVkU3RhcnREYXRlLCBkaXNhYmxlZEVuZERhdGVdO1xufSIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0VmFsdWUsIHVwZGF0ZVZhbHVlcyB9IGZyb20gJy4uL3V0aWxzL21pc2NVdGlsJztcbmltcG9ydCB7IGdldENsb3NpbmdWaWV3RGF0ZSwgaXNTYW1lWWVhciwgaXNTYW1lTW9udGgsIGlzU2FtZURlY2FkZSB9IGZyb20gJy4uL3V0aWxzL2RhdGVVdGlsJztcbmZ1bmN0aW9uIGdldFN0YXJ0RW5kRGlzdGFuY2Uoc3RhcnREYXRlLCBlbmREYXRlLCBwaWNrZXIsIGdlbmVyYXRlQ29uZmlnKSB7XG4gIHZhciBzdGFydE5leHQgPSBnZXRDbG9zaW5nVmlld0RhdGUoc3RhcnREYXRlLCBwaWNrZXIsIGdlbmVyYXRlQ29uZmlnLCAxKTtcbiAgZnVuY3Rpb24gZ2V0RGlzdGFuY2UoY29tcGFyZUZ1bmMpIHtcbiAgICBpZiAoY29tcGFyZUZ1bmMoc3RhcnREYXRlLCBlbmREYXRlKSkge1xuICAgICAgcmV0dXJuICdzYW1lJztcbiAgICB9XG4gICAgaWYgKGNvbXBhcmVGdW5jKHN0YXJ0TmV4dCwgZW5kRGF0ZSkpIHtcbiAgICAgIHJldHVybiAnY2xvc2luZyc7XG4gICAgfVxuICAgIHJldHVybiAnZmFyJztcbiAgfVxuICBzd2l0Y2ggKHBpY2tlcikge1xuICAgIGNhc2UgJ3llYXInOlxuICAgICAgcmV0dXJuIGdldERpc3RhbmNlKGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG4gICAgICAgIHJldHVybiBpc1NhbWVEZWNhZGUoZ2VuZXJhdGVDb25maWcsIHN0YXJ0LCBlbmQpO1xuICAgICAgfSk7XG4gICAgY2FzZSAncXVhcnRlcic6XG4gICAgY2FzZSAnbW9udGgnOlxuICAgICAgcmV0dXJuIGdldERpc3RhbmNlKGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG4gICAgICAgIHJldHVybiBpc1NhbWVZZWFyKGdlbmVyYXRlQ29uZmlnLCBzdGFydCwgZW5kKTtcbiAgICAgIH0pO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZ2V0RGlzdGFuY2UoZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgcmV0dXJuIGlzU2FtZU1vbnRoKGdlbmVyYXRlQ29uZmlnLCBzdGFydCwgZW5kKTtcbiAgICAgIH0pO1xuICB9XG59XG5mdW5jdGlvbiBnZXRSYW5nZVZpZXdEYXRlKHZhbHVlcywgaW5kZXgsIHBpY2tlciwgZ2VuZXJhdGVDb25maWcpIHtcbiAgdmFyIHN0YXJ0RGF0ZSA9IGdldFZhbHVlKHZhbHVlcywgMCk7XG4gIHZhciBlbmREYXRlID0gZ2V0VmFsdWUodmFsdWVzLCAxKTtcbiAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgcmV0dXJuIHN0YXJ0RGF0ZTtcbiAgfVxuICBpZiAoc3RhcnREYXRlICYmIGVuZERhdGUpIHtcbiAgICB2YXIgZGlzdGFuY2UgPSBnZXRTdGFydEVuZERpc3RhbmNlKHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgcGlja2VyLCBnZW5lcmF0ZUNvbmZpZyk7XG4gICAgc3dpdGNoIChkaXN0YW5jZSkge1xuICAgICAgY2FzZSAnc2FtZSc6XG4gICAgICAgIHJldHVybiBzdGFydERhdGU7XG4gICAgICBjYXNlICdjbG9zaW5nJzpcbiAgICAgICAgcmV0dXJuIHN0YXJ0RGF0ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBnZXRDbG9zaW5nVmlld0RhdGUoZW5kRGF0ZSwgcGlja2VyLCBnZW5lcmF0ZUNvbmZpZywgLTEpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RhcnREYXRlO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlUmFuZ2VWaWV3RGF0ZXMoX3JlZikge1xuICB2YXIgdmFsdWVzID0gX3JlZi52YWx1ZXMsXG4gICAgcGlja2VyID0gX3JlZi5waWNrZXIsXG4gICAgZGVmYXVsdERhdGVzID0gX3JlZi5kZWZhdWx0RGF0ZXMsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBfcmVmLmdlbmVyYXRlQ29uZmlnO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFtnZXRWYWx1ZShkZWZhdWx0RGF0ZXMsIDApLCBnZXRWYWx1ZShkZWZhdWx0RGF0ZXMsIDEpXTtcbiAgICB9KSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBkZWZhdWx0Vmlld0RhdGVzID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXREZWZhdWx0Vmlld0RhdGVzID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgdmlld0RhdGVzID0gX1JlYWN0JHVzZVN0YXRlNFswXSxcbiAgICBzZXRJbnRlcm5hbFZpZXdEYXRlcyA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG4gIHZhciBzdGFydERhdGUgPSBnZXRWYWx1ZSh2YWx1ZXMsIDApO1xuICB2YXIgZW5kRGF0ZSA9IGdldFZhbHVlKHZhbHVlcywgMSk7XG4gIGZ1bmN0aW9uIGdldFZpZXdEYXRlKGluZGV4KSB7XG4gICAgLy8gSWYgc2V0IGRlZmF1bHQgdmlldyBkYXRlLCB1c2UgaXRcbiAgICBpZiAoZGVmYXVsdFZpZXdEYXRlc1tpbmRleF0pIHtcbiAgICAgIHJldHVybiBkZWZhdWx0Vmlld0RhdGVzW2luZGV4XTtcbiAgICB9XG4gICAgcmV0dXJuIGdldFZhbHVlKHZpZXdEYXRlcywgaW5kZXgpIHx8IGdldFJhbmdlVmlld0RhdGUodmFsdWVzLCBpbmRleCwgcGlja2VyLCBnZW5lcmF0ZUNvbmZpZykgfHwgc3RhcnREYXRlIHx8IGVuZERhdGUgfHwgZ2VuZXJhdGVDb25maWcuZ2V0Tm93KCk7XG4gIH1cbiAgZnVuY3Rpb24gc2V0Vmlld0RhdGUodmlld0RhdGUsIGluZGV4KSB7XG4gICAgaWYgKHZpZXdEYXRlKSB7XG4gICAgICB2YXIgbmV3Vmlld0RhdGVzID0gdXBkYXRlVmFsdWVzKHZpZXdEYXRlcywgdmlld0RhdGUsIGluZGV4KTtcbiAgICAgIC8vIFNldCB2aWV3IGRhdGUgd2lsbCBjbGVhbiB1cCBkZWZhdWx0IG9uZVxuICAgICAgc2V0RGVmYXVsdFZpZXdEYXRlcyhcbiAgICAgIC8vIFNob3VsZCBhbHdheXMgYmUgYW4gYXJyYXlcbiAgICAgIHVwZGF0ZVZhbHVlcyhkZWZhdWx0Vmlld0RhdGVzLCBudWxsLCBpbmRleCkgfHwgW251bGwsIG51bGxdKTtcbiAgICAgIC8vIFJlc2V0IGFub3RoZXIgb25lIHdoZW4gbm90IGhhdmUgdmFsdWVcbiAgICAgIHZhciBhbm90aGVySW5kZXggPSAoaW5kZXggKyAxKSAlIDI7XG4gICAgICBpZiAoIWdldFZhbHVlKHZhbHVlcywgYW5vdGhlckluZGV4KSkge1xuICAgICAgICBuZXdWaWV3RGF0ZXMgPSB1cGRhdGVWYWx1ZXMobmV3Vmlld0RhdGVzLCB2aWV3RGF0ZSwgYW5vdGhlckluZGV4KTtcbiAgICAgIH1cbiAgICAgIHNldEludGVybmFsVmlld0RhdGVzKG5ld1ZpZXdEYXRlcyk7XG4gICAgfSBlbHNlIGlmIChzdGFydERhdGUgfHwgZW5kRGF0ZSkge1xuICAgICAgLy8gUmVzZXQgYWxsIHdoZW4gaGFzIHZhbHVlcyB3aGVuIGB2aWV3RGF0ZWAgaXMgYG51bGxgIHdoaWNoIG1lYW5zIGZyb20gb3BlbiB0cmlnZ2VyXG4gICAgICBzZXRJbnRlcm5hbFZpZXdEYXRlcyhudWxsKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtnZXRWaWV3RGF0ZSwgc2V0Vmlld0RhdGVdO1xufSIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNcIjtcbmltcG9ydCBfY3JlYXRlU3VwZXIgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZVN1cGVyXCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB3YXJuaW5nIGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IFBpY2tlclRyaWdnZXIgZnJvbSAnLi9QaWNrZXJUcmlnZ2VyJztcbmltcG9ydCBQaWNrZXJQYW5lbCBmcm9tICcuL1BpY2tlclBhbmVsJztcbmltcG9ydCB1c2VQaWNrZXJJbnB1dCBmcm9tICcuL2hvb2tzL3VzZVBpY2tlcklucHV0JztcbmltcG9ydCBnZXREYXRhT3JBcmlhUHJvcHMsIHsgdG9BcnJheSwgZ2V0VmFsdWUsIHVwZGF0ZVZhbHVlcyB9IGZyb20gJy4vdXRpbHMvbWlzY1V0aWwnO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEZvcm1hdCwgZ2V0SW5wdXRTaXplLCBlbGVtZW50c0NvbnRhaW5zIH0gZnJvbSAnLi91dGlscy91aVV0aWwnO1xuaW1wb3J0IFBhbmVsQ29udGV4dCBmcm9tICcuL1BhbmVsQ29udGV4dCc7XG5pbXBvcnQgeyBpc0VxdWFsLCBnZXRDbG9zaW5nVmlld0RhdGUsIGlzU2FtZURhdGUsIGlzU2FtZVdlZWssIGlzU2FtZVF1YXJ0ZXIsIGZvcm1hdFZhbHVlLCBwYXJzZVZhbHVlIH0gZnJvbSAnLi91dGlscy9kYXRlVXRpbCc7XG5pbXBvcnQgdXNlVmFsdWVUZXh0cyBmcm9tICcuL2hvb2tzL3VzZVZhbHVlVGV4dHMnO1xuaW1wb3J0IHVzZVRleHRWYWx1ZU1hcHBpbmcgZnJvbSAnLi9ob29rcy91c2VUZXh0VmFsdWVNYXBwaW5nJztcbmltcG9ydCBSYW5nZUNvbnRleHQgZnJvbSAnLi9SYW5nZUNvbnRleHQnO1xuaW1wb3J0IHVzZVJhbmdlRGlzYWJsZWQgZnJvbSAnLi9ob29rcy91c2VSYW5nZURpc2FibGVkJztcbmltcG9ydCBnZXRFeHRyYUZvb3RlciBmcm9tICcuL3V0aWxzL2dldEV4dHJhRm9vdGVyJztcbmltcG9ydCBnZXRSYW5nZXMgZnJvbSAnLi91dGlscy9nZXRSYW5nZXMnO1xuaW1wb3J0IHVzZVJhbmdlVmlld0RhdGVzIGZyb20gJy4vaG9va3MvdXNlUmFuZ2VWaWV3RGF0ZXMnO1xuaW1wb3J0IHVzZUhvdmVyVmFsdWUgZnJvbSAnLi9ob29rcy91c2VIb3ZlclZhbHVlJztcbmltcG9ydCB7IGxlZ2FjeVByb3BzV2FybmluZyB9IGZyb20gJy4vdXRpbHMvd2FyblV0aWwnO1xuZnVuY3Rpb24gcmVvcmRlclZhbHVlcyh2YWx1ZXMsIGdlbmVyYXRlQ29uZmlnKSB7XG4gIGlmICh2YWx1ZXMgJiYgdmFsdWVzWzBdICYmIHZhbHVlc1sxXSAmJiBnZW5lcmF0ZUNvbmZpZy5pc0FmdGVyKHZhbHVlc1swXSwgdmFsdWVzWzFdKSkge1xuICAgIHJldHVybiBbdmFsdWVzWzFdLCB2YWx1ZXNbMF1dO1xuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59XG5mdW5jdGlvbiBjYW5WYWx1ZVRyaWdnZXIodmFsdWUsIGluZGV4LCBkaXNhYmxlZCwgYWxsb3dFbXB0eSkge1xuICBpZiAodmFsdWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoYWxsb3dFbXB0eSAmJiBhbGxvd0VtcHR5W2luZGV4XSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChkaXNhYmxlZFsoaW5kZXggKyAxKSAlIDJdKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gSW5uZXJSYW5nZVBpY2tlcihwcm9wcykge1xuICB2YXIgX2NsYXNzTmFtZXMyLCBfY2xhc3NOYW1lczMsIF9jbGFzc05hbWVzNDtcbiAgdmFyIF9wcm9wcyRwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX3Byb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLXBpY2tlcicgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgIGlkID0gcHJvcHMuaWQsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgcG9wdXBTdHlsZSA9IHByb3BzLnBvcHVwU3R5bGUsXG4gICAgZHJvcGRvd25DbGFzc05hbWUgPSBwcm9wcy5kcm9wZG93bkNsYXNzTmFtZSxcbiAgICB0cmFuc2l0aW9uTmFtZSA9IHByb3BzLnRyYW5zaXRpb25OYW1lLFxuICAgIGRyb3Bkb3duQWxpZ24gPSBwcm9wcy5kcm9wZG93bkFsaWduLFxuICAgIGdldFBvcHVwQ29udGFpbmVyID0gcHJvcHMuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZyxcbiAgICBsb2NhbGUgPSBwcm9wcy5sb2NhbGUsXG4gICAgcGxhY2Vob2xkZXIgPSBwcm9wcy5wbGFjZWhvbGRlcixcbiAgICBhdXRvRm9jdXMgPSBwcm9wcy5hdXRvRm9jdXMsXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBmb3JtYXQgPSBwcm9wcy5mb3JtYXQsXG4gICAgX3Byb3BzJHBpY2tlciA9IHByb3BzLnBpY2tlcixcbiAgICBwaWNrZXIgPSBfcHJvcHMkcGlja2VyID09PSB2b2lkIDAgPyAnZGF0ZScgOiBfcHJvcHMkcGlja2VyLFxuICAgIHNob3dUaW1lID0gcHJvcHMuc2hvd1RpbWUsXG4gICAgdXNlMTJIb3VycyA9IHByb3BzLnVzZTEySG91cnMsXG4gICAgX3Byb3BzJHNlcGFyYXRvciA9IHByb3BzLnNlcGFyYXRvcixcbiAgICBzZXBhcmF0b3IgPSBfcHJvcHMkc2VwYXJhdG9yID09PSB2b2lkIDAgPyAnficgOiBfcHJvcHMkc2VwYXJhdG9yLFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgIGRlZmF1bHRQaWNrZXJWYWx1ZSA9IHByb3BzLmRlZmF1bHRQaWNrZXJWYWx1ZSxcbiAgICBvcGVuID0gcHJvcHMub3BlbixcbiAgICBkZWZhdWx0T3BlbiA9IHByb3BzLmRlZmF1bHRPcGVuLFxuICAgIGRpc2FibGVkRGF0ZSA9IHByb3BzLmRpc2FibGVkRGF0ZSxcbiAgICBfZGlzYWJsZWRUaW1lID0gcHJvcHMuZGlzYWJsZWRUaW1lLFxuICAgIGRhdGVSZW5kZXIgPSBwcm9wcy5kYXRlUmVuZGVyLFxuICAgIHBhbmVsUmVuZGVyID0gcHJvcHMucGFuZWxSZW5kZXIsXG4gICAgcmFuZ2VzID0gcHJvcHMucmFuZ2VzLFxuICAgIGFsbG93RW1wdHkgPSBwcm9wcy5hbGxvd0VtcHR5LFxuICAgIGFsbG93Q2xlYXIgPSBwcm9wcy5hbGxvd0NsZWFyLFxuICAgIHN1ZmZpeEljb24gPSBwcm9wcy5zdWZmaXhJY29uLFxuICAgIGNsZWFySWNvbiA9IHByb3BzLmNsZWFySWNvbixcbiAgICBwaWNrZXJSZWYgPSBwcm9wcy5waWNrZXJSZWYsXG4gICAgaW5wdXRSZWFkT25seSA9IHByb3BzLmlucHV0UmVhZE9ubHksXG4gICAgbW9kZSA9IHByb3BzLm1vZGUsXG4gICAgcmVuZGVyRXh0cmFGb290ZXIgPSBwcm9wcy5yZW5kZXJFeHRyYUZvb3RlcixcbiAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgIG9uT3BlbkNoYW5nZSA9IHByb3BzLm9uT3BlbkNoYW5nZSxcbiAgICBvblBhbmVsQ2hhbmdlID0gcHJvcHMub25QYW5lbENoYW5nZSxcbiAgICBvbkNhbGVuZGFyQ2hhbmdlID0gcHJvcHMub25DYWxlbmRhckNoYW5nZSxcbiAgICBfb25Gb2N1cyA9IHByb3BzLm9uRm9jdXMsXG4gICAgb25CbHVyID0gcHJvcHMub25CbHVyLFxuICAgIG9uTW91c2VEb3duID0gcHJvcHMub25Nb3VzZURvd24sXG4gICAgb25Nb3VzZVVwID0gcHJvcHMub25Nb3VzZVVwLFxuICAgIG9uTW91c2VFbnRlciA9IHByb3BzLm9uTW91c2VFbnRlcixcbiAgICBvbk1vdXNlTGVhdmUgPSBwcm9wcy5vbk1vdXNlTGVhdmUsXG4gICAgb25DbGljayA9IHByb3BzLm9uQ2xpY2ssXG4gICAgX29uT2sgPSBwcm9wcy5vbk9rLFxuICAgIF9vbktleURvd24gPSBwcm9wcy5vbktleURvd24sXG4gICAgY29tcG9uZW50cyA9IHByb3BzLmNvbXBvbmVudHMsXG4gICAgb3JkZXIgPSBwcm9wcy5vcmRlcixcbiAgICBkaXJlY3Rpb24gPSBwcm9wcy5kaXJlY3Rpb24sXG4gICAgYWN0aXZlUGlja2VySW5kZXggPSBwcm9wcy5hY3RpdmVQaWNrZXJJbmRleCxcbiAgICBfcHJvcHMkYXV0b0NvbXBsZXRlID0gcHJvcHMuYXV0b0NvbXBsZXRlLFxuICAgIGF1dG9Db21wbGV0ZSA9IF9wcm9wcyRhdXRvQ29tcGxldGUgPT09IHZvaWQgMCA/ICdvZmYnIDogX3Byb3BzJGF1dG9Db21wbGV0ZTtcbiAgdmFyIG5lZWRDb25maXJtQnV0dG9uID0gcGlja2VyID09PSAnZGF0ZScgJiYgISFzaG93VGltZSB8fCBwaWNrZXIgPT09ICd0aW1lJztcbiAgLy8gV2UgcmVjb3JkIG9wZW5lZCBzdGF0dXMgaGVyZSBpbiBjYXNlIHJlcGVhdCBvcGVuIHdpdGggcGlja2VyXG4gIHZhciBvcGVuUmVjb3Jkc1JlZiA9IHVzZVJlZih7fSk7XG4gIHZhciBjb250YWluZXJSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBwYW5lbERpdlJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIHN0YXJ0SW5wdXREaXZSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBlbmRJbnB1dERpdlJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIHNlcGFyYXRvclJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIHN0YXJ0SW5wdXRSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBlbmRJbnB1dFJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGFycm93UmVmID0gdXNlUmVmKG51bGwpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFdhcm5pbmcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGxlZ2FjeVByb3BzV2FybmluZyhwcm9wcyk7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gTWlzYyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGZvcm1hdExpc3QgPSB0b0FycmF5KGdldERlZmF1bHRGb3JtYXQoZm9ybWF0LCBwaWNrZXIsIHNob3dUaW1lLCB1c2UxMkhvdXJzKSk7XG4gIC8vIEFjdGl2ZSBwaWNrZXJcbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKDAsIHtcbiAgICAgIHZhbHVlOiBhY3RpdmVQaWNrZXJJbmRleFxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUsIDIpLFxuICAgIG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4ID0gX3VzZU1lcmdlZFN0YXRlMlswXSxcbiAgICBzZXRNZXJnZWRBY3RpdmVQaWNrZXJJbmRleCA9IF91c2VNZXJnZWRTdGF0ZTJbMV07XG4gIC8vIE9wZXJhdGlvbiByZWZcbiAgdmFyIG9wZXJhdGlvblJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIG1lcmdlZERpc2FibGVkID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGlzYWJsZWQpKSB7XG4gICAgICByZXR1cm4gZGlzYWJsZWQ7XG4gICAgfVxuICAgIHJldHVybiBbZGlzYWJsZWQgfHwgZmFsc2UsIGRpc2FibGVkIHx8IGZhbHNlXTtcbiAgfSwgW2Rpc2FibGVkXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFZhbHVlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlTWVyZ2VkU3RhdGUzID0gdXNlTWVyZ2VkU3RhdGUobnVsbCwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWUsXG4gICAgICBwb3N0U3RhdGU6IGZ1bmN0aW9uIHBvc3RTdGF0ZSh2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIHBpY2tlciA9PT0gJ3RpbWUnICYmICFvcmRlciA/IHZhbHVlcyA6IHJlb3JkZXJWYWx1ZXModmFsdWVzLCBnZW5lcmF0ZUNvbmZpZyk7XG4gICAgICB9XG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZTMsIDIpLFxuICAgIG1lcmdlZFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlNFswXSxcbiAgICBzZXRJbm5lclZhbHVlID0gX3VzZU1lcmdlZFN0YXRlNFsxXTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFZpZXcgRGF0ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29uZmlnIHZpZXcgcGFuZWxcbiAgdmFyIF91c2VSYW5nZVZpZXdEYXRlcyA9IHVzZVJhbmdlVmlld0RhdGVzKHtcbiAgICAgIHZhbHVlczogbWVyZ2VkVmFsdWUsXG4gICAgICBwaWNrZXI6IHBpY2tlcixcbiAgICAgIGRlZmF1bHREYXRlczogZGVmYXVsdFBpY2tlclZhbHVlLFxuICAgICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnXG4gICAgfSksXG4gICAgX3VzZVJhbmdlVmlld0RhdGVzMiA9IF9zbGljZWRUb0FycmF5KF91c2VSYW5nZVZpZXdEYXRlcywgMiksXG4gICAgZ2V0Vmlld0RhdGUgPSBfdXNlUmFuZ2VWaWV3RGF0ZXMyWzBdLFxuICAgIHNldFZpZXdEYXRlID0gX3VzZVJhbmdlVmlld0RhdGVzMlsxXTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBTZWxlY3QgVmFsdWVzID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZTUgPSB1c2VNZXJnZWRTdGF0ZShtZXJnZWRWYWx1ZSwge1xuICAgICAgcG9zdFN0YXRlOiBmdW5jdGlvbiBwb3N0U3RhdGUodmFsdWVzKSB7XG4gICAgICAgIHZhciBwb3N0VmFsdWVzID0gdmFsdWVzO1xuICAgICAgICBpZiAobWVyZ2VkRGlzYWJsZWRbMF0gJiYgbWVyZ2VkRGlzYWJsZWRbMV0pIHtcbiAgICAgICAgICByZXR1cm4gcG9zdFZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWxsIGRpc2FibGVkIHVuaXRcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyOyBpICs9IDEpIHtcbiAgICAgICAgICBpZiAobWVyZ2VkRGlzYWJsZWRbaV0gJiYgIXBvc3RWYWx1ZXMgJiYgIWdldFZhbHVlKHBvc3RWYWx1ZXMsIGkpICYmICFnZXRWYWx1ZShhbGxvd0VtcHR5LCBpKSkge1xuICAgICAgICAgICAgcG9zdFZhbHVlcyA9IHVwZGF0ZVZhbHVlcyhwb3N0VmFsdWVzLCBnZW5lcmF0ZUNvbmZpZy5nZXROb3coKSwgaSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3N0VmFsdWVzO1xuICAgICAgfVxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTYgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGU1LCAyKSxcbiAgICBzZWxlY3RlZFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlNlswXSxcbiAgICBzZXRTZWxlY3RlZFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlNlsxXTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gTW9kZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZTcgPSB1c2VNZXJnZWRTdGF0ZShbcGlja2VyLCBwaWNrZXJdLCB7XG4gICAgICB2YWx1ZTogbW9kZVxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTggPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGU3LCAyKSxcbiAgICBtZXJnZWRNb2RlcyA9IF91c2VNZXJnZWRTdGF0ZThbMF0sXG4gICAgc2V0SW5uZXJNb2RlcyA9IF91c2VNZXJnZWRTdGF0ZThbMV07XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0SW5uZXJNb2RlcyhbcGlja2VyLCBwaWNrZXJdKTtcbiAgfSwgW3BpY2tlcl0pO1xuICB2YXIgdHJpZ2dlck1vZGVzQ2hhbmdlID0gZnVuY3Rpb24gdHJpZ2dlck1vZGVzQ2hhbmdlKG1vZGVzLCB2YWx1ZXMpIHtcbiAgICBzZXRJbm5lck1vZGVzKG1vZGVzKTtcbiAgICBpZiAob25QYW5lbENoYW5nZSkge1xuICAgICAgb25QYW5lbENoYW5nZSh2YWx1ZXMsIG1vZGVzKTtcbiAgICB9XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gRGlzYWJsZSBEYXRlID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlUmFuZ2VEaXNhYmxlZCA9IHVzZVJhbmdlRGlzYWJsZWQoe1xuICAgICAgcGlja2VyOiBwaWNrZXIsXG4gICAgICBzZWxlY3RlZFZhbHVlOiBzZWxlY3RlZFZhbHVlLFxuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICBkaXNhYmxlZDogbWVyZ2VkRGlzYWJsZWQsXG4gICAgICBkaXNhYmxlZERhdGU6IGRpc2FibGVkRGF0ZSxcbiAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZ1xuICAgIH0sIG9wZW5SZWNvcmRzUmVmLmN1cnJlbnRbMV0sIG9wZW5SZWNvcmRzUmVmLmN1cnJlbnRbMF0pLFxuICAgIF91c2VSYW5nZURpc2FibGVkMiA9IF9zbGljZWRUb0FycmF5KF91c2VSYW5nZURpc2FibGVkLCAyKSxcbiAgICBkaXNhYmxlZFN0YXJ0RGF0ZSA9IF91c2VSYW5nZURpc2FibGVkMlswXSxcbiAgICBkaXNhYmxlZEVuZERhdGUgPSBfdXNlUmFuZ2VEaXNhYmxlZDJbMV07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE9wZW4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlTWVyZ2VkU3RhdGU5ID0gdXNlTWVyZ2VkU3RhdGUoZmFsc2UsIHtcbiAgICAgIHZhbHVlOiBvcGVuLFxuICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0T3BlbixcbiAgICAgIHBvc3RTdGF0ZTogZnVuY3Rpb24gcG9zdFN0YXRlKHBvc3RPcGVuKSB7XG4gICAgICAgIHJldHVybiBtZXJnZWREaXNhYmxlZFttZXJnZWRBY3RpdmVQaWNrZXJJbmRleF0gPyBmYWxzZSA6IHBvc3RPcGVuO1xuICAgICAgfSxcbiAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShuZXdPcGVuKSB7XG4gICAgICAgIGlmIChvbk9wZW5DaGFuZ2UpIHtcbiAgICAgICAgICBvbk9wZW5DaGFuZ2UobmV3T3Blbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFuZXdPcGVuICYmIG9wZXJhdGlvblJlZi5jdXJyZW50ICYmIG9wZXJhdGlvblJlZi5jdXJyZW50Lm9uQ2xvc2UpIHtcbiAgICAgICAgICBvcGVyYXRpb25SZWYuY3VycmVudC5vbkNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSxcbiAgICBfdXNlTWVyZ2VkU3RhdGUxMCA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZTksIDIpLFxuICAgIG1lcmdlZE9wZW4gPSBfdXNlTWVyZ2VkU3RhdGUxMFswXSxcbiAgICB0cmlnZ2VySW5uZXJPcGVuID0gX3VzZU1lcmdlZFN0YXRlMTBbMV07XG4gIHZhciBzdGFydE9wZW4gPSBtZXJnZWRPcGVuICYmIG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4ID09PSAwO1xuICB2YXIgZW5kT3BlbiA9IG1lcmdlZE9wZW4gJiYgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXggPT09IDE7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFBvcHVwID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBvcHVwIG1pbiB3aWR0aFxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoMCksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgcG9wdXBNaW5XaWR0aCA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0UG9wdXBNaW5XaWR0aCA9IF91c2VTdGF0ZTJbMV07XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFtZXJnZWRPcGVuICYmIGNvbnRhaW5lclJlZi5jdXJyZW50KSB7XG4gICAgICBzZXRQb3B1cE1pbldpZHRoKGNvbnRhaW5lclJlZi5jdXJyZW50Lm9mZnNldFdpZHRoKTtcbiAgICB9XG4gIH0sIFttZXJnZWRPcGVuXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVHJpZ2dlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciB0cmlnZ2VyUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIGZ1bmN0aW9uIF90cmlnZ2VyT3BlbihuZXdPcGVuLCBpbmRleCkge1xuICAgIGlmIChuZXdPcGVuKSB7XG4gICAgICBjbGVhclRpbWVvdXQodHJpZ2dlclJlZi5jdXJyZW50KTtcbiAgICAgIG9wZW5SZWNvcmRzUmVmLmN1cnJlbnRbaW5kZXhdID0gdHJ1ZTtcbiAgICAgIHNldE1lcmdlZEFjdGl2ZVBpY2tlckluZGV4KGluZGV4KTtcbiAgICAgIHRyaWdnZXJJbm5lck9wZW4obmV3T3Blbik7XG4gICAgICAvLyBPcGVuIHRvIHJlc2V0IHZpZXcgZGF0ZVxuICAgICAgaWYgKCFtZXJnZWRPcGVuKSB7XG4gICAgICAgIHNldFZpZXdEYXRlKG51bGwsIGluZGV4KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4ID09PSBpbmRleCkge1xuICAgICAgdHJpZ2dlcklubmVyT3BlbihuZXdPcGVuKTtcbiAgICAgIC8vIENsZWFuIHVwIGFzeW5jXG4gICAgICAvLyBUaGlzIG1ha2VzIHJlZiBub3QgcXVpY2sgcmVmcmVzaCBpbiBjYXNlIHVzZXIgb3BlbiBhbm90aGVyIGlucHV0IHdpdGggYmx1ciB0cmlnZ2VyXG4gICAgICB2YXIgb3BlblJlY29yZHMgPSBvcGVuUmVjb3Jkc1JlZi5jdXJyZW50O1xuICAgICAgdHJpZ2dlclJlZi5jdXJyZW50ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChvcGVuUmVjb3JkcyA9PT0gb3BlblJlY29yZHNSZWYuY3VycmVudCkge1xuICAgICAgICAgIG9wZW5SZWNvcmRzUmVmLmN1cnJlbnQgPSB7fTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHRyaWdnZXJPcGVuQW5kRm9jdXMoaW5kZXgpIHtcbiAgICBfdHJpZ2dlck9wZW4odHJ1ZSwgaW5kZXgpO1xuICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIG1ha2Ugc3VyZSBwYW5lbCBET00gZXhpc3RzXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaW5wdXRSZWYgPSBbc3RhcnRJbnB1dFJlZiwgZW5kSW5wdXRSZWZdW2luZGV4XTtcbiAgICAgIGlmIChpbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICAgIGlucHV0UmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuICBmdW5jdGlvbiB0cmlnZ2VyQ2hhbmdlKG5ld1ZhbHVlLCBzb3VyY2VJbmRleCkge1xuICAgIHZhciB2YWx1ZXMgPSBuZXdWYWx1ZTtcbiAgICB2YXIgc3RhcnRWYWx1ZSA9IGdldFZhbHVlKHZhbHVlcywgMCk7XG4gICAgdmFyIGVuZFZhbHVlID0gZ2V0VmFsdWUodmFsdWVzLCAxKTtcbiAgICAvLyA+Pj4+PiBGb3JtYXQgc3RhcnQgJiBlbmQgdmFsdWVzXG4gICAgaWYgKHN0YXJ0VmFsdWUgJiYgZW5kVmFsdWUgJiYgZ2VuZXJhdGVDb25maWcuaXNBZnRlcihzdGFydFZhbHVlLCBlbmRWYWx1ZSkpIHtcbiAgICAgIGlmIChcbiAgICAgIC8vIFdlZWtQaWNrZXIgb25seSBjb21wYXJlIHdlZWtcbiAgICAgIHBpY2tlciA9PT0gJ3dlZWsnICYmICFpc1NhbWVXZWVrKGdlbmVyYXRlQ29uZmlnLCBsb2NhbGUubG9jYWxlLCBzdGFydFZhbHVlLCBlbmRWYWx1ZSkgfHxcbiAgICAgIC8vIFF1b3RhUGlja2VyIG9ubHkgY29tcGFyZSB3ZWVrXG4gICAgICBwaWNrZXIgPT09ICdxdWFydGVyJyAmJiAhaXNTYW1lUXVhcnRlcihnZW5lcmF0ZUNvbmZpZywgc3RhcnRWYWx1ZSwgZW5kVmFsdWUpIHx8XG4gICAgICAvLyBPdGhlciBub24tVGltZVBpY2tlciBjb21wYXJlIGRhdGVcbiAgICAgIHBpY2tlciAhPT0gJ3dlZWsnICYmIHBpY2tlciAhPT0gJ3F1YXJ0ZXInICYmIHBpY2tlciAhPT0gJ3RpbWUnICYmICFpc1NhbWVEYXRlKGdlbmVyYXRlQ29uZmlnLCBzdGFydFZhbHVlLCBlbmRWYWx1ZSkpIHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgZW5kIGRhdGUgd2hlbiBzdGFydCBkYXRlIGlzIGFmdGVyIGVuZCBkYXRlXG4gICAgICAgIGlmIChzb3VyY2VJbmRleCA9PT0gMCkge1xuICAgICAgICAgIHZhbHVlcyA9IFtzdGFydFZhbHVlLCBudWxsXTtcbiAgICAgICAgICBlbmRWYWx1ZSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhcnRWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgdmFsdWVzID0gW251bGwsIGVuZFZhbHVlXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDbGVhbiB1cCBjYWNoZSBzaW5jZSBpbnZhbGlkYXRlXG4gICAgICAgIG9wZW5SZWNvcmRzUmVmLmN1cnJlbnQgPSBfZGVmaW5lUHJvcGVydHkoe30sIHNvdXJjZUluZGV4LCB0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAocGlja2VyICE9PSAndGltZScgfHwgb3JkZXIgIT09IGZhbHNlKSB7XG4gICAgICAgIC8vIFJlb3JkZXIgd2hlbiBpbiBzYW1lIGRhdGVcbiAgICAgICAgdmFsdWVzID0gcmVvcmRlclZhbHVlcyh2YWx1ZXMsIGdlbmVyYXRlQ29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc2V0U2VsZWN0ZWRWYWx1ZSh2YWx1ZXMpO1xuICAgIHZhciBzdGFydFN0ciA9IHZhbHVlcyAmJiB2YWx1ZXNbMF0gPyBmb3JtYXRWYWx1ZSh2YWx1ZXNbMF0sIHtcbiAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZyxcbiAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgZm9ybWF0OiBmb3JtYXRMaXN0WzBdXG4gICAgfSkgOiAnJztcbiAgICB2YXIgZW5kU3RyID0gdmFsdWVzICYmIHZhbHVlc1sxXSA/IGZvcm1hdFZhbHVlKHZhbHVlc1sxXSwge1xuICAgICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnLFxuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICBmb3JtYXQ6IGZvcm1hdExpc3RbMF1cbiAgICB9KSA6ICcnO1xuICAgIGlmIChvbkNhbGVuZGFyQ2hhbmdlKSB7XG4gICAgICB2YXIgaW5mbyA9IHtcbiAgICAgICAgcmFuZ2U6IHNvdXJjZUluZGV4ID09PSAwID8gJ3N0YXJ0JyA6ICdlbmQnXG4gICAgICB9O1xuICAgICAgb25DYWxlbmRhckNoYW5nZSh2YWx1ZXMsIFtzdGFydFN0ciwgZW5kU3RyXSwgaW5mbyk7XG4gICAgfVxuICAgIC8vID4+Pj4+IFRyaWdnZXIgYG9uQ2hhbmdlYCBldmVudFxuICAgIHZhciBjYW5TdGFydFZhbHVlVHJpZ2dlciA9IGNhblZhbHVlVHJpZ2dlcihzdGFydFZhbHVlLCAwLCBtZXJnZWREaXNhYmxlZCwgYWxsb3dFbXB0eSk7XG4gICAgdmFyIGNhbkVuZFZhbHVlVHJpZ2dlciA9IGNhblZhbHVlVHJpZ2dlcihlbmRWYWx1ZSwgMSwgbWVyZ2VkRGlzYWJsZWQsIGFsbG93RW1wdHkpO1xuICAgIHZhciBjYW5UcmlnZ2VyID0gdmFsdWVzID09PSBudWxsIHx8IGNhblN0YXJ0VmFsdWVUcmlnZ2VyICYmIGNhbkVuZFZhbHVlVHJpZ2dlcjtcbiAgICBpZiAoY2FuVHJpZ2dlcikge1xuICAgICAgLy8gVHJpZ2dlciBvbkNoYW5nZSBvbmx5IHdoZW4gdmFsdWUgaXMgdmFsaWRhdGVcbiAgICAgIHNldElubmVyVmFsdWUodmFsdWVzKTtcbiAgICAgIGlmIChvbkNoYW5nZSAmJiAoIWlzRXF1YWwoZ2VuZXJhdGVDb25maWcsIGdldFZhbHVlKG1lcmdlZFZhbHVlLCAwKSwgc3RhcnRWYWx1ZSkgfHwgIWlzRXF1YWwoZ2VuZXJhdGVDb25maWcsIGdldFZhbHVlKG1lcmdlZFZhbHVlLCAxKSwgZW5kVmFsdWUpKSkge1xuICAgICAgICBvbkNoYW5nZSh2YWx1ZXMsIFtzdGFydFN0ciwgZW5kU3RyXSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vID4+Pj4+IE9wZW4gcGlja2VyIHdoZW5cbiAgICAvLyBBbHdheXMgb3BlbiBhbm90aGVyIHBpY2tlciBpZiBwb3NzaWJsZVxuICAgIHZhciBuZXh0T3BlbkluZGV4ID0gbnVsbDtcbiAgICBpZiAoc291cmNlSW5kZXggPT09IDAgJiYgIW1lcmdlZERpc2FibGVkWzFdKSB7XG4gICAgICBuZXh0T3BlbkluZGV4ID0gMTtcbiAgICB9IGVsc2UgaWYgKHNvdXJjZUluZGV4ID09PSAxICYmICFtZXJnZWREaXNhYmxlZFswXSkge1xuICAgICAgbmV4dE9wZW5JbmRleCA9IDA7XG4gICAgfVxuICAgIGlmIChuZXh0T3BlbkluZGV4ICE9PSBudWxsICYmIG5leHRPcGVuSW5kZXggIT09IG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4ICYmICghb3BlblJlY29yZHNSZWYuY3VycmVudFtuZXh0T3BlbkluZGV4XSB8fCAhZ2V0VmFsdWUodmFsdWVzLCBuZXh0T3BlbkluZGV4KSkgJiYgZ2V0VmFsdWUodmFsdWVzLCBzb3VyY2VJbmRleCkpIHtcbiAgICAgIC8vIERlbGF5IHRvIGZvY3VzIHRvIGF2b2lkIGlucHV0IGJsdXIgdHJpZ2dlciBleHBpcmVkIHNlbGVjdGVkVmFsdWVzXG4gICAgICB0cmlnZ2VyT3BlbkFuZEZvY3VzKG5leHRPcGVuSW5kZXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdHJpZ2dlck9wZW4oZmFsc2UsIHNvdXJjZUluZGV4KTtcbiAgICB9XG4gIH1cbiAgdmFyIGZvcndhcmRLZXlEb3duID0gZnVuY3Rpb24gZm9yd2FyZEtleURvd24oZSkge1xuICAgIGlmIChtZXJnZWRPcGVuICYmIG9wZXJhdGlvblJlZi5jdXJyZW50ICYmIG9wZXJhdGlvblJlZi5jdXJyZW50Lm9uS2V5RG93bikge1xuICAgICAgLy8gTGV0IHBvcHVwIHBhbmVsIGhhbmRsZSBrZXlib2FyZFxuICAgICAgcmV0dXJuIG9wZXJhdGlvblJlZi5jdXJyZW50Lm9uS2V5RG93bihlKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1sb25lLWJsb2NrcyAqL1xuICAgIHtcbiAgICAgIHdhcm5pbmcoZmFsc2UsICdQaWNrZXIgbm90IGNvcnJlY3QgZm9yd2FyZCBLZXlEb3duIG9wZXJhdGlvbi4gUGxlYXNlIGhlbHAgdG8gZmlyZSBpc3N1ZSBhYm91dCB0aGlzLicpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHNoYXJlZFRleHRIb29rc1Byb3BzID0ge1xuICAgIGZvcm1hdExpc3Q6IGZvcm1hdExpc3QsXG4gICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnLFxuICAgIGxvY2FsZTogbG9jYWxlXG4gIH07XG4gIHZhciBfdXNlVmFsdWVUZXh0cyA9IHVzZVZhbHVlVGV4dHMoZ2V0VmFsdWUoc2VsZWN0ZWRWYWx1ZSwgMCksIHNoYXJlZFRleHRIb29rc1Byb3BzKSxcbiAgICBfdXNlVmFsdWVUZXh0czIgPSBfc2xpY2VkVG9BcnJheShfdXNlVmFsdWVUZXh0cywgMiksXG4gICAgc3RhcnRWYWx1ZVRleHRzID0gX3VzZVZhbHVlVGV4dHMyWzBdLFxuICAgIGZpcnN0U3RhcnRWYWx1ZVRleHQgPSBfdXNlVmFsdWVUZXh0czJbMV07XG4gIHZhciBfdXNlVmFsdWVUZXh0czMgPSB1c2VWYWx1ZVRleHRzKGdldFZhbHVlKHNlbGVjdGVkVmFsdWUsIDEpLCBzaGFyZWRUZXh0SG9va3NQcm9wcyksXG4gICAgX3VzZVZhbHVlVGV4dHM0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVZhbHVlVGV4dHMzLCAyKSxcbiAgICBlbmRWYWx1ZVRleHRzID0gX3VzZVZhbHVlVGV4dHM0WzBdLFxuICAgIGZpcnN0RW5kVmFsdWVUZXh0ID0gX3VzZVZhbHVlVGV4dHM0WzFdO1xuICB2YXIgX29uVGV4dENoYW5nZSA9IGZ1bmN0aW9uIG9uVGV4dENoYW5nZShuZXdUZXh0LCBpbmRleCkge1xuICAgIHZhciBpbnB1dERhdGUgPSBwYXJzZVZhbHVlKG5ld1RleHQsIHtcbiAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgZm9ybWF0TGlzdDogZm9ybWF0TGlzdCxcbiAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZ1xuICAgIH0pO1xuICAgIHZhciBkaXNhYmxlZEZ1bmMgPSBpbmRleCA9PT0gMCA/IGRpc2FibGVkU3RhcnREYXRlIDogZGlzYWJsZWRFbmREYXRlO1xuICAgIGlmIChpbnB1dERhdGUgJiYgIWRpc2FibGVkRnVuYyhpbnB1dERhdGUpKSB7XG4gICAgICBzZXRTZWxlY3RlZFZhbHVlKHVwZGF0ZVZhbHVlcyhzZWxlY3RlZFZhbHVlLCBpbnB1dERhdGUsIGluZGV4KSk7XG4gICAgICBzZXRWaWV3RGF0ZShpbnB1dERhdGUsIGluZGV4KTtcbiAgICB9XG4gIH07XG4gIHZhciBfdXNlVGV4dFZhbHVlTWFwcGluZyA9IHVzZVRleHRWYWx1ZU1hcHBpbmcoe1xuICAgICAgdmFsdWVUZXh0czogc3RhcnRWYWx1ZVRleHRzLFxuICAgICAgb25UZXh0Q2hhbmdlOiBmdW5jdGlvbiBvblRleHRDaGFuZ2UobmV3VGV4dCkge1xuICAgICAgICByZXR1cm4gX29uVGV4dENoYW5nZShuZXdUZXh0LCAwKTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBfdXNlVGV4dFZhbHVlTWFwcGluZzIgPSBfc2xpY2VkVG9BcnJheShfdXNlVGV4dFZhbHVlTWFwcGluZywgMyksXG4gICAgc3RhcnRUZXh0ID0gX3VzZVRleHRWYWx1ZU1hcHBpbmcyWzBdLFxuICAgIHRyaWdnZXJTdGFydFRleHRDaGFuZ2UgPSBfdXNlVGV4dFZhbHVlTWFwcGluZzJbMV0sXG4gICAgcmVzZXRTdGFydFRleHQgPSBfdXNlVGV4dFZhbHVlTWFwcGluZzJbMl07XG4gIHZhciBfdXNlVGV4dFZhbHVlTWFwcGluZzMgPSB1c2VUZXh0VmFsdWVNYXBwaW5nKHtcbiAgICAgIHZhbHVlVGV4dHM6IGVuZFZhbHVlVGV4dHMsXG4gICAgICBvblRleHRDaGFuZ2U6IGZ1bmN0aW9uIG9uVGV4dENoYW5nZShuZXdUZXh0KSB7XG4gICAgICAgIHJldHVybiBfb25UZXh0Q2hhbmdlKG5ld1RleHQsIDEpO1xuICAgICAgfVxuICAgIH0pLFxuICAgIF91c2VUZXh0VmFsdWVNYXBwaW5nNCA9IF9zbGljZWRUb0FycmF5KF91c2VUZXh0VmFsdWVNYXBwaW5nMywgMyksXG4gICAgZW5kVGV4dCA9IF91c2VUZXh0VmFsdWVNYXBwaW5nNFswXSxcbiAgICB0cmlnZ2VyRW5kVGV4dENoYW5nZSA9IF91c2VUZXh0VmFsdWVNYXBwaW5nNFsxXSxcbiAgICByZXNldEVuZFRleHQgPSBfdXNlVGV4dFZhbHVlTWFwcGluZzRbMl07XG4gIHZhciBfdXNlU3RhdGUzID0gdXNlU3RhdGUobnVsbCksXG4gICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgIHJhbmdlSG92ZXJWYWx1ZSA9IF91c2VTdGF0ZTRbMF0sXG4gICAgc2V0UmFuZ2VIb3ZlclZhbHVlID0gX3VzZVN0YXRlNFsxXTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gSG92ZXIgUmFuZ2UgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VTdGF0ZTUgPSB1c2VTdGF0ZShudWxsKSxcbiAgICBfdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlNSwgMiksXG4gICAgaG92ZXJSYW5nZWRWYWx1ZSA9IF91c2VTdGF0ZTZbMF0sXG4gICAgc2V0SG92ZXJSYW5nZWRWYWx1ZSA9IF91c2VTdGF0ZTZbMV07XG4gIHZhciBfdXNlSG92ZXJWYWx1ZSA9IHVzZUhvdmVyVmFsdWUoc3RhcnRUZXh0LCB7XG4gICAgICBmb3JtYXRMaXN0OiBmb3JtYXRMaXN0LFxuICAgICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnLFxuICAgICAgbG9jYWxlOiBsb2NhbGVcbiAgICB9KSxcbiAgICBfdXNlSG92ZXJWYWx1ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlSG92ZXJWYWx1ZSwgMyksXG4gICAgc3RhcnRIb3ZlclZhbHVlID0gX3VzZUhvdmVyVmFsdWUyWzBdLFxuICAgIG9uU3RhcnRFbnRlciA9IF91c2VIb3ZlclZhbHVlMlsxXSxcbiAgICBvblN0YXJ0TGVhdmUgPSBfdXNlSG92ZXJWYWx1ZTJbMl07XG4gIHZhciBfdXNlSG92ZXJWYWx1ZTMgPSB1c2VIb3ZlclZhbHVlKGVuZFRleHQsIHtcbiAgICAgIGZvcm1hdExpc3Q6IGZvcm1hdExpc3QsXG4gICAgICBnZW5lcmF0ZUNvbmZpZzogZ2VuZXJhdGVDb25maWcsXG4gICAgICBsb2NhbGU6IGxvY2FsZVxuICAgIH0pLFxuICAgIF91c2VIb3ZlclZhbHVlNCA9IF9zbGljZWRUb0FycmF5KF91c2VIb3ZlclZhbHVlMywgMyksXG4gICAgZW5kSG92ZXJWYWx1ZSA9IF91c2VIb3ZlclZhbHVlNFswXSxcbiAgICBvbkVuZEVudGVyID0gX3VzZUhvdmVyVmFsdWU0WzFdLFxuICAgIG9uRW5kTGVhdmUgPSBfdXNlSG92ZXJWYWx1ZTRbMl07XG4gIHZhciBvbkRhdGVNb3VzZUVudGVyID0gZnVuY3Rpb24gb25EYXRlTW91c2VFbnRlcihkYXRlKSB7XG4gICAgc2V0SG92ZXJSYW5nZWRWYWx1ZSh1cGRhdGVWYWx1ZXMoc2VsZWN0ZWRWYWx1ZSwgZGF0ZSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpKTtcbiAgICBpZiAobWVyZ2VkQWN0aXZlUGlja2VySW5kZXggPT09IDApIHtcbiAgICAgIG9uU3RhcnRFbnRlcihkYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb25FbmRFbnRlcihkYXRlKTtcbiAgICB9XG4gIH07XG4gIHZhciBvbkRhdGVNb3VzZUxlYXZlID0gZnVuY3Rpb24gb25EYXRlTW91c2VMZWF2ZSgpIHtcbiAgICBzZXRIb3ZlclJhbmdlZFZhbHVlKHVwZGF0ZVZhbHVlcyhzZWxlY3RlZFZhbHVlLCBudWxsLCBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCkpO1xuICAgIGlmIChtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCA9PT0gMCkge1xuICAgICAgb25TdGFydExlYXZlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9uRW5kTGVhdmUoKTtcbiAgICB9XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElucHV0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBnZXRTaGFyZWRJbnB1dEhvb2tQcm9wcyA9IGZ1bmN0aW9uIGdldFNoYXJlZElucHV0SG9va1Byb3BzKGluZGV4LCByZXNldFRleHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmx1clRvQ2FuY2VsOiBuZWVkQ29uZmlybUJ1dHRvbixcbiAgICAgIGZvcndhcmRLZXlEb3duOiBmb3J3YXJkS2V5RG93bixcbiAgICAgIG9uQmx1cjogb25CbHVyLFxuICAgICAgaXNDbGlja091dHNpZGU6IGZ1bmN0aW9uIGlzQ2xpY2tPdXRzaWRlKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gIWVsZW1lbnRzQ29udGFpbnMoW3BhbmVsRGl2UmVmLmN1cnJlbnQsIHN0YXJ0SW5wdXREaXZSZWYuY3VycmVudCwgZW5kSW5wdXREaXZSZWYuY3VycmVudCwgY29udGFpbmVyUmVmLmN1cnJlbnRdLCB0YXJnZXQpO1xuICAgICAgfSxcbiAgICAgIG9uRm9jdXM6IGZ1bmN0aW9uIG9uRm9jdXMoZSkge1xuICAgICAgICBzZXRNZXJnZWRBY3RpdmVQaWNrZXJJbmRleChpbmRleCk7XG4gICAgICAgIGlmIChfb25Gb2N1cykge1xuICAgICAgICAgIF9vbkZvY3VzKGUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdHJpZ2dlck9wZW46IGZ1bmN0aW9uIHRyaWdnZXJPcGVuKG5ld09wZW4pIHtcbiAgICAgICAgX3RyaWdnZXJPcGVuKG5ld09wZW4sIGluZGV4KTtcbiAgICAgIH0sXG4gICAgICBvblN1Ym1pdDogZnVuY3Rpb24gb25TdWJtaXQoKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgLy8gV2hlbiB1c2VyIHR5cGluZyBkaXNhYmxlZERhdGUgd2l0aCBrZXlib2FyZCBhbmQgZW50ZXIsIHRoaXMgdmFsdWUgd2lsbCBiZSBlbXB0eVxuICAgICAgICAhc2VsZWN0ZWRWYWx1ZSB8fFxuICAgICAgICAvLyBOb3JtYWwgZGlzYWJsZWQgY2hlY2tcbiAgICAgICAgZGlzYWJsZWREYXRlICYmIGRpc2FibGVkRGF0ZShzZWxlY3RlZFZhbHVlW2luZGV4XSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckNoYW5nZShzZWxlY3RlZFZhbHVlLCBpbmRleCk7XG4gICAgICAgIHJlc2V0VGV4dCgpO1xuICAgICAgfSxcbiAgICAgIG9uQ2FuY2VsOiBmdW5jdGlvbiBvbkNhbmNlbCgpIHtcbiAgICAgICAgX3RyaWdnZXJPcGVuKGZhbHNlLCBpbmRleCk7XG4gICAgICAgIHNldFNlbGVjdGVkVmFsdWUobWVyZ2VkVmFsdWUpO1xuICAgICAgICByZXNldFRleHQoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuICB2YXIgY3VycmVudEZvY3VzZWRLZXkgPSB1c2VSZWYoJycpO1xuICB2YXIgX3VzZVBpY2tlcklucHV0ID0gdXNlUGlja2VySW5wdXQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBnZXRTaGFyZWRJbnB1dEhvb2tQcm9wcygwLCByZXNldFN0YXJ0VGV4dCkpLCB7fSwge1xuICAgICAgb3Blbjogc3RhcnRPcGVuLFxuICAgICAgdmFsdWU6IHN0YXJ0VGV4dCxcbiAgICAgIGN1cnJlbnRGb2N1c2VkS2V5OiBjdXJyZW50Rm9jdXNlZEtleSxcbiAgICAgIGtleTogJ3N0YXJ0JyxcbiAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKGUsIHByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgIF9vbktleURvd24gPT09IG51bGwgfHwgX29uS2V5RG93biA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29uS2V5RG93bihlLCBwcmV2ZW50RGVmYXVsdCk7XG4gICAgICB9XG4gICAgfSkpLFxuICAgIF91c2VQaWNrZXJJbnB1dDIgPSBfc2xpY2VkVG9BcnJheShfdXNlUGlja2VySW5wdXQsIDIpLFxuICAgIHN0YXJ0SW5wdXRQcm9wcyA9IF91c2VQaWNrZXJJbnB1dDJbMF0sXG4gICAgX3VzZVBpY2tlcklucHV0MiQgPSBfdXNlUGlja2VySW5wdXQyWzFdLFxuICAgIHN0YXJ0Rm9jdXNlZCA9IF91c2VQaWNrZXJJbnB1dDIkLmZvY3VzZWQsXG4gICAgc3RhcnRUeXBpbmcgPSBfdXNlUGlja2VySW5wdXQyJC50eXBpbmc7XG4gIHZhciBfdXNlUGlja2VySW5wdXQzID0gdXNlUGlja2VySW5wdXQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBnZXRTaGFyZWRJbnB1dEhvb2tQcm9wcygxLCByZXNldEVuZFRleHQpKSwge30sIHtcbiAgICAgIG9wZW46IGVuZE9wZW4sXG4gICAgICB2YWx1ZTogZW5kVGV4dCxcbiAgICAgIGN1cnJlbnRGb2N1c2VkS2V5OiBjdXJyZW50Rm9jdXNlZEtleSxcbiAgICAgIGtleTogJ2VuZCcsXG4gICAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihlLCBwcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICBfb25LZXlEb3duID09PSBudWxsIHx8IF9vbktleURvd24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vbktleURvd24oZSwgcHJldmVudERlZmF1bHQpO1xuICAgICAgfVxuICAgIH0pKSxcbiAgICBfdXNlUGlja2VySW5wdXQ0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVBpY2tlcklucHV0MywgMiksXG4gICAgZW5kSW5wdXRQcm9wcyA9IF91c2VQaWNrZXJJbnB1dDRbMF0sXG4gICAgX3VzZVBpY2tlcklucHV0NCQgPSBfdXNlUGlja2VySW5wdXQ0WzFdLFxuICAgIGVuZEZvY3VzZWQgPSBfdXNlUGlja2VySW5wdXQ0JC5mb2N1c2VkLFxuICAgIGVuZFR5cGluZyA9IF91c2VQaWNrZXJJbnB1dDQkLnR5cGluZztcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gQ2xpY2sgUGlja2VyID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvblBpY2tlckNsaWNrID0gZnVuY3Rpb24gb25QaWNrZXJDbGljayhlKSB7XG4gICAgLy8gV2hlbiBjbGljayBpbnNpZGUgdGhlIHBpY2tlciAmIG91dHNpZGUgdGhlIHBpY2tlcidzIGlucHV0IGVsZW1lbnRzXG4gICAgLy8gdGhlIHBhbmVsIHNob3VsZCBzdGlsbCBiZSBvcGVuZWRcbiAgICBpZiAob25DbGljaykge1xuICAgICAgb25DbGljayhlKTtcbiAgICB9XG4gICAgaWYgKCFtZXJnZWRPcGVuICYmICFzdGFydElucHV0UmVmLmN1cnJlbnQuY29udGFpbnMoZS50YXJnZXQpICYmICFlbmRJbnB1dFJlZi5jdXJyZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkge1xuICAgICAgaWYgKCFtZXJnZWREaXNhYmxlZFswXSkge1xuICAgICAgICB0cmlnZ2VyT3BlbkFuZEZvY3VzKDApO1xuICAgICAgfSBlbHNlIGlmICghbWVyZ2VkRGlzYWJsZWRbMV0pIHtcbiAgICAgICAgdHJpZ2dlck9wZW5BbmRGb2N1cygxKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHZhciBvblBpY2tlck1vdXNlRG93biA9IGZ1bmN0aW9uIG9uUGlja2VyTW91c2VEb3duKGUpIHtcbiAgICAvLyBzaG91bGRuJ3QgYWZmZWN0IGlucHV0IGVsZW1lbnRzIGlmIHBpY2tlciBpcyBhY3RpdmVcbiAgICBpZiAob25Nb3VzZURvd24pIHtcbiAgICAgIG9uTW91c2VEb3duKGUpO1xuICAgIH1cbiAgICBpZiAobWVyZ2VkT3BlbiAmJiAoc3RhcnRGb2N1c2VkIHx8IGVuZEZvY3VzZWQpICYmICFzdGFydElucHV0UmVmLmN1cnJlbnQuY29udGFpbnMoZS50YXJnZXQpICYmICFlbmRJbnB1dFJlZi5jdXJyZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU3luYyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ2xvc2Ugc2hvdWxkIHN5bmMgYmFjayB3aXRoIHRleHQgdmFsdWVcbiAgdmFyIHN0YXJ0U3RyID0gbWVyZ2VkVmFsdWUgJiYgbWVyZ2VkVmFsdWVbMF0gPyBmb3JtYXRWYWx1ZShtZXJnZWRWYWx1ZVswXSwge1xuICAgIGxvY2FsZTogbG9jYWxlLFxuICAgIGZvcm1hdDogJ1lZWVlNTURESEhtbXNzJyxcbiAgICBnZW5lcmF0ZUNvbmZpZzogZ2VuZXJhdGVDb25maWdcbiAgfSkgOiAnJztcbiAgdmFyIGVuZFN0ciA9IG1lcmdlZFZhbHVlICYmIG1lcmdlZFZhbHVlWzFdID8gZm9ybWF0VmFsdWUobWVyZ2VkVmFsdWVbMV0sIHtcbiAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICBmb3JtYXQ6ICdZWVlZTU1EREhIbW1zcycsXG4gICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnXG4gIH0pIDogJyc7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFtZXJnZWRPcGVuKSB7XG4gICAgICBzZXRTZWxlY3RlZFZhbHVlKG1lcmdlZFZhbHVlKTtcbiAgICAgIGlmICghc3RhcnRWYWx1ZVRleHRzLmxlbmd0aCB8fCBzdGFydFZhbHVlVGV4dHNbMF0gPT09ICcnKSB7XG4gICAgICAgIHRyaWdnZXJTdGFydFRleHRDaGFuZ2UoJycpO1xuICAgICAgfSBlbHNlIGlmIChmaXJzdFN0YXJ0VmFsdWVUZXh0ICE9PSBzdGFydFRleHQpIHtcbiAgICAgICAgcmVzZXRTdGFydFRleHQoKTtcbiAgICAgIH1cbiAgICAgIGlmICghZW5kVmFsdWVUZXh0cy5sZW5ndGggfHwgZW5kVmFsdWVUZXh0c1swXSA9PT0gJycpIHtcbiAgICAgICAgdHJpZ2dlckVuZFRleHRDaGFuZ2UoJycpO1xuICAgICAgfSBlbHNlIGlmIChmaXJzdEVuZFZhbHVlVGV4dCAhPT0gZW5kVGV4dCkge1xuICAgICAgICByZXNldEVuZFRleHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFttZXJnZWRPcGVuLCBzdGFydFZhbHVlVGV4dHMsIGVuZFZhbHVlVGV4dHNdKTtcbiAgLy8gU3luYyBpbm5lclZhbHVlIHdpdGggY29udHJvbCBtb2RlXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0U2VsZWN0ZWRWYWx1ZShtZXJnZWRWYWx1ZSk7XG4gIH0sIFtzdGFydFN0ciwgZW5kU3RyXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gV2FybmluZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKHZhbHVlICYmIEFycmF5LmlzQXJyYXkoZGlzYWJsZWQpICYmIChnZXRWYWx1ZShkaXNhYmxlZCwgMCkgJiYgIWdldFZhbHVlKHZhbHVlLCAwKSB8fCBnZXRWYWx1ZShkaXNhYmxlZCwgMSkgJiYgIWdldFZhbHVlKHZhbHVlLCAxKSkpIHtcbiAgICAgIHdhcm5pbmcoZmFsc2UsICdgZGlzYWJsZWRgIHNob3VsZCBub3Qgc2V0IHdpdGggZW1wdHkgYHZhbHVlYC4gWW91IHNob3VsZCBzZXQgYGFsbG93RW1wdHlgIG9yIGB2YWx1ZWAgaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBQcml2YXRlID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaWYgKHBpY2tlclJlZikge1xuICAgIHBpY2tlclJlZi5jdXJyZW50ID0ge1xuICAgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuICAgICAgICBpZiAoc3RhcnRJbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgc3RhcnRJbnB1dFJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBibHVyOiBmdW5jdGlvbiBibHVyKCkge1xuICAgICAgICBpZiAoc3RhcnRJbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgc3RhcnRJbnB1dFJlZi5jdXJyZW50LmJsdXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kSW5wdXRSZWYuY3VycmVudCkge1xuICAgICAgICAgIGVuZElucHV0UmVmLmN1cnJlbnQuYmx1cigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJhbmdlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgcmFuZ2VMYWJlbHMgPSBPYmplY3Qua2V5cyhyYW5nZXMgfHwge30pO1xuICB2YXIgcmFuZ2VMaXN0ID0gcmFuZ2VMYWJlbHMubWFwKGZ1bmN0aW9uIChsYWJlbCkge1xuICAgIHZhciByYW5nZSA9IHJhbmdlc1tsYWJlbF07XG4gICAgdmFyIG5ld1ZhbHVlcyA9IHR5cGVvZiByYW5nZSA9PT0gJ2Z1bmN0aW9uJyA/IHJhbmdlKCkgOiByYW5nZTtcbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgdHJpZ2dlckNoYW5nZShuZXdWYWx1ZXMsIG51bGwpO1xuICAgICAgICBfdHJpZ2dlck9wZW4oZmFsc2UsIG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4KTtcbiAgICAgIH0sXG4gICAgICBvbk1vdXNlRW50ZXI6IGZ1bmN0aW9uIG9uTW91c2VFbnRlcigpIHtcbiAgICAgICAgc2V0UmFuZ2VIb3ZlclZhbHVlKG5ld1ZhbHVlcyk7XG4gICAgICB9LFxuICAgICAgb25Nb3VzZUxlYXZlOiBmdW5jdGlvbiBvbk1vdXNlTGVhdmUoKSB7XG4gICAgICAgIHNldFJhbmdlSG92ZXJWYWx1ZShudWxsKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUGFuZWwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gcmVuZGVyUGFuZWwoKSB7XG4gICAgdmFyIHBhbmVsUG9zaXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICAgIHZhciBwYW5lbFByb3BzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICB2YXIgcGFuZWxIb3ZlclJhbmdlZFZhbHVlID0gbnVsbDtcbiAgICBpZiAobWVyZ2VkT3BlbiAmJiBob3ZlclJhbmdlZFZhbHVlICYmIGhvdmVyUmFuZ2VkVmFsdWVbMF0gJiYgaG92ZXJSYW5nZWRWYWx1ZVsxXSAmJiBnZW5lcmF0ZUNvbmZpZy5pc0FmdGVyKGhvdmVyUmFuZ2VkVmFsdWVbMV0sIGhvdmVyUmFuZ2VkVmFsdWVbMF0pKSB7XG4gICAgICBwYW5lbEhvdmVyUmFuZ2VkVmFsdWUgPSBob3ZlclJhbmdlZFZhbHVlO1xuICAgIH1cbiAgICB2YXIgcGFuZWxTaG93VGltZSA9IHNob3dUaW1lO1xuICAgIGlmIChzaG93VGltZSAmJiBfdHlwZW9mKHNob3dUaW1lKSA9PT0gJ29iamVjdCcgJiYgc2hvd1RpbWUuZGVmYXVsdFZhbHVlKSB7XG4gICAgICB2YXIgdGltZURlZmF1bHRWYWx1ZXMgPSBzaG93VGltZS5kZWZhdWx0VmFsdWU7XG4gICAgICBwYW5lbFNob3dUaW1lID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzaG93VGltZSksIHt9LCB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFsdWUodGltZURlZmF1bHRWYWx1ZXMsIG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4KSB8fCB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgIH1cbiAgICB2YXIgcGFuZWxEYXRlUmVuZGVyID0gbnVsbDtcbiAgICBpZiAoZGF0ZVJlbmRlcikge1xuICAgICAgcGFuZWxEYXRlUmVuZGVyID0gZnVuY3Rpb24gcGFuZWxEYXRlUmVuZGVyKGRhdGUsIHRvZGF5KSB7XG4gICAgICAgIHJldHVybiBkYXRlUmVuZGVyKGRhdGUsIHRvZGF5LCB7XG4gICAgICAgICAgcmFuZ2U6IG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4ID8gJ2VuZCcgOiAnc3RhcnQnXG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJhbmdlQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IHtcbiAgICAgICAgaW5SYW5nZTogdHJ1ZSxcbiAgICAgICAgcGFuZWxQb3NpdGlvbjogcGFuZWxQb3NpdGlvbixcbiAgICAgICAgcmFuZ2VkVmFsdWU6IHJhbmdlSG92ZXJWYWx1ZSB8fCBzZWxlY3RlZFZhbHVlLFxuICAgICAgICBob3ZlclJhbmdlZFZhbHVlOiBwYW5lbEhvdmVyUmFuZ2VkVmFsdWVcbiAgICAgIH1cbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQaWNrZXJQYW5lbCwgX2V4dGVuZHMoe30sIHByb3BzLCBwYW5lbFByb3BzLCB7XG4gICAgICBkYXRlUmVuZGVyOiBwYW5lbERhdGVSZW5kZXIsXG4gICAgICBzaG93VGltZTogcGFuZWxTaG93VGltZSxcbiAgICAgIG1vZGU6IG1lcmdlZE1vZGVzW21lcmdlZEFjdGl2ZVBpY2tlckluZGV4XSxcbiAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZyxcbiAgICAgIHN0eWxlOiB1bmRlZmluZWQsXG4gICAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgIGRpc2FibGVkRGF0ZTogbWVyZ2VkQWN0aXZlUGlja2VySW5kZXggPT09IDAgPyBkaXNhYmxlZFN0YXJ0RGF0ZSA6IGRpc2FibGVkRW5kRGF0ZSxcbiAgICAgIGRpc2FibGVkVGltZTogZnVuY3Rpb24gZGlzYWJsZWRUaW1lKGRhdGUpIHtcbiAgICAgICAgaWYgKF9kaXNhYmxlZFRpbWUpIHtcbiAgICAgICAgICByZXR1cm4gX2Rpc2FibGVkVGltZShkYXRlLCBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCA9PT0gMCA/ICdzdGFydCcgOiAnZW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGFuZWwtZm9jdXNlZFwiKSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXggPT09IDAgPyAhc3RhcnRUeXBpbmcgOiAhZW5kVHlwaW5nKSksXG4gICAgICB2YWx1ZTogZ2V0VmFsdWUoc2VsZWN0ZWRWYWx1ZSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpLFxuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICB0YWJJbmRleDogLTEsXG4gICAgICBvblBhbmVsQ2hhbmdlOiBmdW5jdGlvbiBvblBhbmVsQ2hhbmdlKGRhdGUsIG5ld01vZGUpIHtcbiAgICAgICAgLy8gY2xlYXIgaG92ZXIgdmFsdWUgd2hlbiBwYW5lbCBjaGFuZ2VcbiAgICAgICAgaWYgKG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4ID09PSAwKSB7XG4gICAgICAgICAgb25TdGFydExlYXZlKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCA9PT0gMSkge1xuICAgICAgICAgIG9uRW5kTGVhdmUodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlck1vZGVzQ2hhbmdlKHVwZGF0ZVZhbHVlcyhtZXJnZWRNb2RlcywgbmV3TW9kZSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpLCB1cGRhdGVWYWx1ZXMoc2VsZWN0ZWRWYWx1ZSwgZGF0ZSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpKTtcbiAgICAgICAgdmFyIHZpZXdEYXRlID0gZGF0ZTtcbiAgICAgICAgaWYgKHBhbmVsUG9zaXRpb24gPT09ICdyaWdodCcgJiYgbWVyZ2VkTW9kZXNbbWVyZ2VkQWN0aXZlUGlja2VySW5kZXhdID09PSBuZXdNb2RlKSB7XG4gICAgICAgICAgdmlld0RhdGUgPSBnZXRDbG9zaW5nVmlld0RhdGUodmlld0RhdGUsIG5ld01vZGUsIGdlbmVyYXRlQ29uZmlnLCAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0Vmlld0RhdGUodmlld0RhdGUsIG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4KTtcbiAgICAgIH0sXG4gICAgICBvbk9rOiBudWxsLFxuICAgICAgb25TZWxlY3Q6IHVuZGVmaW5lZCxcbiAgICAgIG9uQ2hhbmdlOiB1bmRlZmluZWQsXG4gICAgICBkZWZhdWx0VmFsdWU6IG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4ID09PSAwID8gZ2V0VmFsdWUoc2VsZWN0ZWRWYWx1ZSwgMSkgOiBnZXRWYWx1ZShzZWxlY3RlZFZhbHVlLCAwKVxuICAgIH0pKSk7XG4gIH1cbiAgdmFyIGFycm93TGVmdCA9IDA7XG4gIHZhciBwYW5lbExlZnQgPSAwO1xuICBpZiAobWVyZ2VkQWN0aXZlUGlja2VySW5kZXggJiYgc3RhcnRJbnB1dERpdlJlZi5jdXJyZW50ICYmIHNlcGFyYXRvclJlZi5jdXJyZW50ICYmIHBhbmVsRGl2UmVmLmN1cnJlbnQpIHtcbiAgICAvLyBBcnJvdyBvZmZzZXRcbiAgICBhcnJvd0xlZnQgPSBzdGFydElucHV0RGl2UmVmLmN1cnJlbnQub2Zmc2V0V2lkdGggKyBzZXBhcmF0b3JSZWYuY3VycmVudC5vZmZzZXRXaWR0aDtcbiAgICAvLyBJZiBwYW5lbFdpZHRoIC0gYXJyb3dXaWR0aCAtIGFycm93TWFyZ2luTGVmdCA8IGFycm93TGVmdCwgcGFuZWwgc2hvdWxkIG1vdmUgdG8gcmlnaHQgc2lkZS5cbiAgICAvLyBJZiBhcnJvd09mZnNldExlZnQgPiBhcnJvd0xlZnQsIGFycm93TWFyZ2luTGVmdCA9IGFycm93T2Zmc2V0TGVmdCAtIGFycm93TGVmdFxuICAgIHZhciBhcnJvd01hcmdpbkxlZnQgPSBhcnJvd1JlZi5jdXJyZW50Lm9mZnNldExlZnQgPiBhcnJvd0xlZnQgPyBhcnJvd1JlZi5jdXJyZW50Lm9mZnNldExlZnQgLSBhcnJvd0xlZnQgOiBhcnJvd1JlZi5jdXJyZW50Lm9mZnNldExlZnQ7XG4gICAgaWYgKHBhbmVsRGl2UmVmLmN1cnJlbnQub2Zmc2V0V2lkdGggJiYgYXJyb3dSZWYuY3VycmVudC5vZmZzZXRXaWR0aCAmJiBhcnJvd0xlZnQgPiBwYW5lbERpdlJlZi5jdXJyZW50Lm9mZnNldFdpZHRoIC0gYXJyb3dSZWYuY3VycmVudC5vZmZzZXRXaWR0aCAtIChkaXJlY3Rpb24gPT09ICdydGwnID8gMCA6IGFycm93TWFyZ2luTGVmdCkpIHtcbiAgICAgIHBhbmVsTGVmdCA9IGFycm93TGVmdDtcbiAgICB9XG4gIH1cbiAgdmFyIGFycm93UG9zaXRpb25TdHlsZSA9IGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyB7XG4gICAgcmlnaHQ6IGFycm93TGVmdFxuICB9IDoge1xuICAgIGxlZnQ6IGFycm93TGVmdFxuICB9O1xuICBmdW5jdGlvbiByZW5kZXJQYW5lbHMoKSB7XG4gICAgdmFyIHBhbmVscztcbiAgICB2YXIgZXh0cmFOb2RlID0gZ2V0RXh0cmFGb290ZXIocHJlZml4Q2xzLCBtZXJnZWRNb2Rlc1ttZXJnZWRBY3RpdmVQaWNrZXJJbmRleF0sIHJlbmRlckV4dHJhRm9vdGVyKTtcbiAgICB2YXIgcmFuZ2VzTm9kZSA9IGdldFJhbmdlcyh7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGNvbXBvbmVudHM6IGNvbXBvbmVudHMsXG4gICAgICBuZWVkQ29uZmlybUJ1dHRvbjogbmVlZENvbmZpcm1CdXR0b24sXG4gICAgICBva0Rpc2FibGVkOiAhZ2V0VmFsdWUoc2VsZWN0ZWRWYWx1ZSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpIHx8IGRpc2FibGVkRGF0ZSAmJiBkaXNhYmxlZERhdGUoc2VsZWN0ZWRWYWx1ZVttZXJnZWRBY3RpdmVQaWNrZXJJbmRleF0pLFxuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICByYW5nZUxpc3Q6IHJhbmdlTGlzdCxcbiAgICAgIG9uT2s6IGZ1bmN0aW9uIG9uT2soKSB7XG4gICAgICAgIGlmIChnZXRWYWx1ZShzZWxlY3RlZFZhbHVlLCBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCkpIHtcbiAgICAgICAgICAvLyB0cmlnZ2VyQ2hhbmdlT2xkKHNlbGVjdGVkVmFsdWUpO1xuICAgICAgICAgIHRyaWdnZXJDaGFuZ2Uoc2VsZWN0ZWRWYWx1ZSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpO1xuICAgICAgICAgIGlmIChfb25Paykge1xuICAgICAgICAgICAgX29uT2soc2VsZWN0ZWRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHBpY2tlciAhPT0gJ3RpbWUnICYmICFzaG93VGltZSkge1xuICAgICAgdmFyIHZpZXdEYXRlID0gZ2V0Vmlld0RhdGUobWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpO1xuICAgICAgdmFyIG5leHRWaWV3RGF0ZSA9IGdldENsb3NpbmdWaWV3RGF0ZSh2aWV3RGF0ZSwgcGlja2VyLCBnZW5lcmF0ZUNvbmZpZyk7XG4gICAgICB2YXIgY3VycmVudE1vZGUgPSBtZXJnZWRNb2Rlc1ttZXJnZWRBY3RpdmVQaWNrZXJJbmRleF07XG4gICAgICB2YXIgc2hvd0RvdWJsZVBhbmVsID0gY3VycmVudE1vZGUgPT09IHBpY2tlcjtcbiAgICAgIHZhciBsZWZ0UGFuZWwgPSByZW5kZXJQYW5lbChzaG93RG91YmxlUGFuZWwgPyAnbGVmdCcgOiBmYWxzZSwge1xuICAgICAgICBwaWNrZXJWYWx1ZTogdmlld0RhdGUsXG4gICAgICAgIG9uUGlja2VyVmFsdWVDaGFuZ2U6IGZ1bmN0aW9uIG9uUGlja2VyVmFsdWVDaGFuZ2UobmV3Vmlld0RhdGUpIHtcbiAgICAgICAgICBzZXRWaWV3RGF0ZShuZXdWaWV3RGF0ZSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHZhciByaWdodFBhbmVsID0gcmVuZGVyUGFuZWwoJ3JpZ2h0Jywge1xuICAgICAgICBwaWNrZXJWYWx1ZTogbmV4dFZpZXdEYXRlLFxuICAgICAgICBvblBpY2tlclZhbHVlQ2hhbmdlOiBmdW5jdGlvbiBvblBpY2tlclZhbHVlQ2hhbmdlKG5ld1ZpZXdEYXRlKSB7XG4gICAgICAgICAgc2V0Vmlld0RhdGUoZ2V0Q2xvc2luZ1ZpZXdEYXRlKG5ld1ZpZXdEYXRlLCBwaWNrZXIsIGdlbmVyYXRlQ29uZmlnLCAtMSksIG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoZGlyZWN0aW9uID09PSAncnRsJykge1xuICAgICAgICBwYW5lbHMgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgcmlnaHRQYW5lbCwgc2hvd0RvdWJsZVBhbmVsICYmIGxlZnRQYW5lbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYW5lbHMgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgbGVmdFBhbmVsLCBzaG93RG91YmxlUGFuZWwgJiYgcmlnaHRQYW5lbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhbmVscyA9IHJlbmRlclBhbmVsKCk7XG4gICAgfVxuICAgIHZhciBtZXJnZWROb2RlcyA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGFuZWxzXCIpXG4gICAgfSwgcGFuZWxzKSwgKGV4dHJhTm9kZSB8fCByYW5nZXNOb2RlKSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZm9vdGVyXCIpXG4gICAgfSwgZXh0cmFOb2RlLCByYW5nZXNOb2RlKSk7XG4gICAgaWYgKHBhbmVsUmVuZGVyKSB7XG4gICAgICBtZXJnZWROb2RlcyA9IHBhbmVsUmVuZGVyKG1lcmdlZE5vZGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wYW5lbC1jb250YWluZXJcIiksXG4gICAgICBzdHlsZToge1xuICAgICAgICBtYXJnaW5MZWZ0OiBwYW5lbExlZnRcbiAgICAgIH0sXG4gICAgICByZWY6IHBhbmVsRGl2UmVmLFxuICAgICAgb25Nb3VzZURvd246IGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH0sIG1lcmdlZE5vZGVzKTtcbiAgfVxuICB2YXIgcmFuZ2VQYW5lbCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yYW5nZS13cmFwcGVyXCIpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQocGlja2VyLCBcIi1yYW5nZS13cmFwcGVyXCIpKSxcbiAgICBzdHlsZToge1xuICAgICAgbWluV2lkdGg6IHBvcHVwTWluV2lkdGhcbiAgICB9XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByZWY6IGFycm93UmVmLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yYW5nZS1hcnJvd1wiKSxcbiAgICBzdHlsZTogYXJyb3dQb3NpdGlvblN0eWxlXG4gIH0pLCByZW5kZXJQYW5lbHMoKSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEljb25zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBzdWZmaXhOb2RlO1xuICBpZiAoc3VmZml4SWNvbikge1xuICAgIHN1ZmZpeE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN1ZmZpeFwiKVxuICAgIH0sIHN1ZmZpeEljb24pO1xuICB9XG4gIHZhciBjbGVhck5vZGU7XG4gIGlmIChhbGxvd0NsZWFyICYmIChnZXRWYWx1ZShtZXJnZWRWYWx1ZSwgMCkgJiYgIW1lcmdlZERpc2FibGVkWzBdIHx8IGdldFZhbHVlKG1lcmdlZFZhbHVlLCAxKSAmJiAhbWVyZ2VkRGlzYWJsZWRbMV0pKSB7XG4gICAgY2xlYXJOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIG9uTW91c2VEb3duOiBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH0sXG4gICAgICBvbk1vdXNlVXA6IGZ1bmN0aW9uIG9uTW91c2VVcChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdmFyIHZhbHVlcyA9IG1lcmdlZFZhbHVlO1xuICAgICAgICBpZiAoIW1lcmdlZERpc2FibGVkWzBdKSB7XG4gICAgICAgICAgdmFsdWVzID0gdXBkYXRlVmFsdWVzKHZhbHVlcywgbnVsbCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXJnZWREaXNhYmxlZFsxXSkge1xuICAgICAgICAgIHZhbHVlcyA9IHVwZGF0ZVZhbHVlcyh2YWx1ZXMsIG51bGwsIDEpO1xuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJDaGFuZ2UodmFsdWVzLCBudWxsKTtcbiAgICAgICAgX3RyaWdnZXJPcGVuKGZhbHNlLCBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCk7XG4gICAgICB9LFxuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNsZWFyXCIpXG4gICAgfSwgY2xlYXJJY29uIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2xlYXItYnRuXCIpXG4gICAgfSkpO1xuICB9XG4gIHZhciBpbnB1dFNoYXJlZFByb3BzID0ge1xuICAgIHNpemU6IGdldElucHV0U2l6ZShwaWNrZXIsIGZvcm1hdExpc3RbMF0sIGdlbmVyYXRlQ29uZmlnKVxuICB9O1xuICB2YXIgYWN0aXZlQmFyTGVmdCA9IDA7XG4gIHZhciBhY3RpdmVCYXJXaWR0aCA9IDA7XG4gIGlmIChzdGFydElucHV0RGl2UmVmLmN1cnJlbnQgJiYgZW5kSW5wdXREaXZSZWYuY3VycmVudCAmJiBzZXBhcmF0b3JSZWYuY3VycmVudCkge1xuICAgIGlmIChtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCA9PT0gMCkge1xuICAgICAgYWN0aXZlQmFyV2lkdGggPSBzdGFydElucHV0RGl2UmVmLmN1cnJlbnQub2Zmc2V0V2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdGl2ZUJhckxlZnQgPSBhcnJvd0xlZnQ7XG4gICAgICBhY3RpdmVCYXJXaWR0aCA9IGVuZElucHV0RGl2UmVmLmN1cnJlbnQub2Zmc2V0V2lkdGg7XG4gICAgfVxuICB9XG4gIHZhciBhY3RpdmVCYXJQb3NpdGlvblN0eWxlID0gZGlyZWN0aW9uID09PSAncnRsJyA/IHtcbiAgICByaWdodDogYWN0aXZlQmFyTGVmdFxuICB9IDoge1xuICAgIGxlZnQ6IGFjdGl2ZUJhckxlZnRcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZXR1cm4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9uQ29udGV4dFNlbGVjdCA9IGZ1bmN0aW9uIG9uQ29udGV4dFNlbGVjdChkYXRlLCB0eXBlKSB7XG4gICAgdmFyIHZhbHVlcyA9IHVwZGF0ZVZhbHVlcyhzZWxlY3RlZFZhbHVlLCBkYXRlLCBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCk7XG4gICAgaWYgKHR5cGUgPT09ICdzdWJtaXQnIHx8IHR5cGUgIT09ICdrZXknICYmICFuZWVkQ29uZmlybUJ1dHRvbikge1xuICAgICAgLy8gdHJpZ2dlckNoYW5nZSB3aWxsIGFsc28gdXBkYXRlIHNlbGVjdGVkIHZhbHVlc1xuICAgICAgdHJpZ2dlckNoYW5nZSh2YWx1ZXMsIG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4KTtcbiAgICAgIC8vIGNsZWFyIGhvdmVyIHZhbHVlIHN0eWxlXG4gICAgICBpZiAobWVyZ2VkQWN0aXZlUGlja2VySW5kZXggPT09IDApIHtcbiAgICAgICAgb25TdGFydExlYXZlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbkVuZExlYXZlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFNlbGVjdGVkVmFsdWUodmFsdWVzKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYW5lbENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZToge1xuICAgICAgb3BlcmF0aW9uUmVmOiBvcGVyYXRpb25SZWYsXG4gICAgICBoaWRlSGVhZGVyOiBwaWNrZXIgPT09ICd0aW1lJyxcbiAgICAgIG9uRGF0ZU1vdXNlRW50ZXI6IG9uRGF0ZU1vdXNlRW50ZXIsXG4gICAgICBvbkRhdGVNb3VzZUxlYXZlOiBvbkRhdGVNb3VzZUxlYXZlLFxuICAgICAgaGlkZVJhbmdlczogdHJ1ZSxcbiAgICAgIG9uU2VsZWN0OiBvbkNvbnRleHRTZWxlY3QsXG4gICAgICBvcGVuOiBtZXJnZWRPcGVuXG4gICAgfVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQaWNrZXJUcmlnZ2VyLCB7XG4gICAgdmlzaWJsZTogbWVyZ2VkT3BlbixcbiAgICBwb3B1cEVsZW1lbnQ6IHJhbmdlUGFuZWwsXG4gICAgcG9wdXBTdHlsZTogcG9wdXBTdHlsZSxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBkcm9wZG93bkNsYXNzTmFtZTogZHJvcGRvd25DbGFzc05hbWUsXG4gICAgZHJvcGRvd25BbGlnbjogZHJvcGRvd25BbGlnbixcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIsXG4gICAgdHJhbnNpdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lLFxuICAgIHJhbmdlOiB0cnVlLFxuICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICByZWY6IGNvbnRhaW5lclJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJhbmdlXCIpLCBjbGFzc05hbWUsIChfY2xhc3NOYW1lczIgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kaXNhYmxlZFwiKSwgbWVyZ2VkRGlzYWJsZWRbMF0gJiYgbWVyZ2VkRGlzYWJsZWRbMV0pLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWZvY3VzZWRcIiksIG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4ID09PSAwID8gc3RhcnRGb2N1c2VkIDogZW5kRm9jdXNlZCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2NsYXNzTmFtZXMyKSksXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIG9uQ2xpY2s6IG9uUGlja2VyQ2xpY2ssXG4gICAgb25Nb3VzZUVudGVyOiBvbk1vdXNlRW50ZXIsXG4gICAgb25Nb3VzZUxlYXZlOiBvbk1vdXNlTGVhdmUsXG4gICAgb25Nb3VzZURvd246IG9uUGlja2VyTW91c2VEb3duLFxuICAgIG9uTW91c2VVcDogb25Nb3VzZVVwXG4gIH0sIGdldERhdGFPckFyaWFQcm9wcyhwcm9wcykpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5wdXRcIiksIChfY2xhc3NOYW1lczMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbnB1dC1hY3RpdmVcIiksIG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4ID09PSAwKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbnB1dC1wbGFjZWhvbGRlclwiKSwgISFzdGFydEhvdmVyVmFsdWUpLCBfY2xhc3NOYW1lczMpKSxcbiAgICByZWY6IHN0YXJ0SW5wdXREaXZSZWZcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCBfZXh0ZW5kcyh7XG4gICAgaWQ6IGlkLFxuICAgIGRpc2FibGVkOiBtZXJnZWREaXNhYmxlZFswXSxcbiAgICByZWFkT25seTogaW5wdXRSZWFkT25seSB8fCB0eXBlb2YgZm9ybWF0TGlzdFswXSA9PT0gJ2Z1bmN0aW9uJyB8fCAhc3RhcnRUeXBpbmcsXG4gICAgdmFsdWU6IHN0YXJ0SG92ZXJWYWx1ZSB8fCBzdGFydFRleHQsXG4gICAgb25DaGFuZ2U6IGZ1bmN0aW9uIG9uQ2hhbmdlKGUpIHtcbiAgICAgIHRyaWdnZXJTdGFydFRleHRDaGFuZ2UoZS50YXJnZXQudmFsdWUpO1xuICAgIH0sXG4gICAgYXV0b0ZvY3VzOiBhdXRvRm9jdXMsXG4gICAgcGxhY2Vob2xkZXI6IGdldFZhbHVlKHBsYWNlaG9sZGVyLCAwKSB8fCAnJyxcbiAgICByZWY6IHN0YXJ0SW5wdXRSZWZcbiAgfSwgc3RhcnRJbnB1dFByb3BzLCBpbnB1dFNoYXJlZFByb3BzLCB7XG4gICAgYXV0b0NvbXBsZXRlOiBhdXRvQ29tcGxldGVcbiAgfSkpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yYW5nZS1zZXBhcmF0b3JcIiksXG4gICAgcmVmOiBzZXBhcmF0b3JSZWZcbiAgfSwgc2VwYXJhdG9yKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlucHV0XCIpLCAoX2NsYXNzTmFtZXM0ID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczQsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5wdXQtYWN0aXZlXCIpLCBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCA9PT0gMSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczQsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5wdXQtcGxhY2Vob2xkZXJcIiksICEhZW5kSG92ZXJWYWx1ZSksIF9jbGFzc05hbWVzNCkpLFxuICAgIHJlZjogZW5kSW5wdXREaXZSZWZcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCBfZXh0ZW5kcyh7XG4gICAgZGlzYWJsZWQ6IG1lcmdlZERpc2FibGVkWzFdLFxuICAgIHJlYWRPbmx5OiBpbnB1dFJlYWRPbmx5IHx8IHR5cGVvZiBmb3JtYXRMaXN0WzBdID09PSAnZnVuY3Rpb24nIHx8ICFlbmRUeXBpbmcsXG4gICAgdmFsdWU6IGVuZEhvdmVyVmFsdWUgfHwgZW5kVGV4dCxcbiAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgICAgdHJpZ2dlckVuZFRleHRDaGFuZ2UoZS50YXJnZXQudmFsdWUpO1xuICAgIH0sXG4gICAgcGxhY2Vob2xkZXI6IGdldFZhbHVlKHBsYWNlaG9sZGVyLCAxKSB8fCAnJyxcbiAgICByZWY6IGVuZElucHV0UmVmXG4gIH0sIGVuZElucHV0UHJvcHMsIGlucHV0U2hhcmVkUHJvcHMsIHtcbiAgICBhdXRvQ29tcGxldGU6IGF1dG9Db21wbGV0ZVxuICB9KSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFjdGl2ZS1iYXJcIiksXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYWN0aXZlQmFyUG9zaXRpb25TdHlsZSksIHt9LCB7XG4gICAgICB3aWR0aDogYWN0aXZlQmFyV2lkdGgsXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgIH0pXG4gIH0pLCBzdWZmaXhOb2RlLCBjbGVhck5vZGUpKSk7XG59XG4vLyBXcmFwIHdpdGggY2xhc3MgY29tcG9uZW50IHRvIGVuYWJsZSBwYXNzIGdlbmVyaWMgd2l0aCBpbnN0YW5jZSBtZXRob2RcbnZhciBSYW5nZVBpY2tlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoUmFuZ2VQaWNrZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFJhbmdlUGlja2VyKTtcbiAgZnVuY3Rpb24gUmFuZ2VQaWNrZXIoKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSYW5nZVBpY2tlcik7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsLmFwcGx5KF9zdXBlciwgW3RoaXNdLmNvbmNhdChhcmdzKSk7XG4gICAgX3RoaXMucGlja2VyUmVmID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZVJlZigpO1xuICAgIF90aGlzLmZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnBpY2tlclJlZi5jdXJyZW50KSB7XG4gICAgICAgIF90aGlzLnBpY2tlclJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBfdGhpcy5ibHVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnBpY2tlclJlZi5jdXJyZW50KSB7XG4gICAgICAgIF90aGlzLnBpY2tlclJlZi5jdXJyZW50LmJsdXIoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBfY3JlYXRlQ2xhc3MoUmFuZ2VQaWNrZXIsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSW5uZXJSYW5nZVBpY2tlciwgX2V4dGVuZHMoe30sIHRoaXMucHJvcHMsIHtcbiAgICAgICAgcGlja2VyUmVmOiB0aGlzLnBpY2tlclJlZlxuICAgICAgfSkpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gUmFuZ2VQaWNrZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5leHBvcnQgZGVmYXVsdCBSYW5nZVBpY2tlcjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgUmFkaW9Hcm91cENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCB2YXIgUmFkaW9Hcm91cENvbnRleHRQcm92aWRlciA9IFJhZGlvR3JvdXBDb250ZXh0LlByb3ZpZGVyO1xuZXhwb3J0IGRlZmF1bHQgUmFkaW9Hcm91cENvbnRleHQ7XG5leHBvcnQgdmFyIFJhZGlvT3B0aW9uVHlwZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCB2YXIgUmFkaW9PcHRpb25UeXBlQ29udGV4dFByb3ZpZGVyID0gUmFkaW9PcHRpb25UeXBlQ29udGV4dC5Qcm92aWRlcjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNcIjtcbmltcG9ydCBfY3JlYXRlU3VwZXIgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZVN1cGVyXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5cbnZhciBDaGVja2JveCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoQ2hlY2tib3gsIF9Db21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQ2hlY2tib3gpO1xuXG4gIGZ1bmN0aW9uIENoZWNrYm94KHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENoZWNrYm94KTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpO1xuXG4gICAgX3RoaXMuaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGRpc2FibGVkID0gX3RoaXMkcHJvcHMuZGlzYWJsZWQsXG4gICAgICAgICAgb25DaGFuZ2UgPSBfdGhpcyRwcm9wcy5vbkNoYW5nZTtcblxuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCEoJ2NoZWNrZWQnIGluIF90aGlzLnByb3BzKSkge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgY2hlY2tlZDogZS50YXJnZXQuY2hlY2tlZFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICAgIG9uQ2hhbmdlKHtcbiAgICAgICAgICB0YXJnZXQ6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMucHJvcHMpLCB7fSwge1xuICAgICAgICAgICAgY2hlY2tlZDogZS50YXJnZXQuY2hlY2tlZFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKCkge1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hdGl2ZUV2ZW50OiBlLm5hdGl2ZUV2ZW50XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5zYXZlSW5wdXQgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgX3RoaXMuaW5wdXQgPSBub2RlO1xuICAgIH07XG5cbiAgICB2YXIgY2hlY2tlZCA9ICdjaGVja2VkJyBpbiBwcm9wcyA/IHByb3BzLmNoZWNrZWQgOiBwcm9wcy5kZWZhdWx0Q2hlY2tlZDtcbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGNoZWNrZWQ6IGNoZWNrZWRcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhDaGVja2JveCwgW3tcbiAgICBrZXk6IFwiZm9jdXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgICB0aGlzLmlucHV0LmZvY3VzKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJsdXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYmx1cigpIHtcbiAgICAgIHRoaXMuaW5wdXQuYmx1cigpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczIucHJlZml4Q2xzLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzMi5jbGFzc05hbWUsXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wczIuc3R5bGUsXG4gICAgICAgICAgbmFtZSA9IF90aGlzJHByb3BzMi5uYW1lLFxuICAgICAgICAgIGlkID0gX3RoaXMkcHJvcHMyLmlkLFxuICAgICAgICAgIHR5cGUgPSBfdGhpcyRwcm9wczIudHlwZSxcbiAgICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzMi5kaXNhYmxlZCxcbiAgICAgICAgICByZWFkT25seSA9IF90aGlzJHByb3BzMi5yZWFkT25seSxcbiAgICAgICAgICB0YWJJbmRleCA9IF90aGlzJHByb3BzMi50YWJJbmRleCxcbiAgICAgICAgICBvbkNsaWNrID0gX3RoaXMkcHJvcHMyLm9uQ2xpY2ssXG4gICAgICAgICAgb25Gb2N1cyA9IF90aGlzJHByb3BzMi5vbkZvY3VzLFxuICAgICAgICAgIG9uQmx1ciA9IF90aGlzJHByb3BzMi5vbkJsdXIsXG4gICAgICAgICAgb25LZXlEb3duID0gX3RoaXMkcHJvcHMyLm9uS2V5RG93bixcbiAgICAgICAgICBvbktleVByZXNzID0gX3RoaXMkcHJvcHMyLm9uS2V5UHJlc3MsXG4gICAgICAgICAgb25LZXlVcCA9IF90aGlzJHByb3BzMi5vbktleVVwLFxuICAgICAgICAgIGF1dG9Gb2N1cyA9IF90aGlzJHByb3BzMi5hdXRvRm9jdXMsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRwcm9wczIudmFsdWUsXG4gICAgICAgICAgcmVxdWlyZWQgPSBfdGhpcyRwcm9wczIucmVxdWlyZWQsXG4gICAgICAgICAgb3RoZXJzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF90aGlzJHByb3BzMiwgW1wicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJuYW1lXCIsIFwiaWRcIiwgXCJ0eXBlXCIsIFwiZGlzYWJsZWRcIiwgXCJyZWFkT25seVwiLCBcInRhYkluZGV4XCIsIFwib25DbGlja1wiLCBcIm9uRm9jdXNcIiwgXCJvbkJsdXJcIiwgXCJvbktleURvd25cIiwgXCJvbktleVByZXNzXCIsIFwib25LZXlVcFwiLCBcImF1dG9Gb2N1c1wiLCBcInZhbHVlXCIsIFwicmVxdWlyZWRcIl0pO1xuXG4gICAgICB2YXIgZ2xvYmFsUHJvcHMgPSBPYmplY3Qua2V5cyhvdGhlcnMpLnJlZHVjZShmdW5jdGlvbiAocHJldiwga2V5KSB7XG4gICAgICAgIGlmIChrZXkuc3Vic3RyKDAsIDUpID09PSAnYXJpYS0nIHx8IGtleS5zdWJzdHIoMCwgNSkgPT09ICdkYXRhLScgfHwga2V5ID09PSAncm9sZScpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICBwcmV2W2tleV0gPSBvdGhlcnNba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgfSwge30pO1xuICAgICAgdmFyIGNoZWNrZWQgPSB0aGlzLnN0YXRlLmNoZWNrZWQ7XG4gICAgICB2YXIgY2xhc3NTdHJpbmcgPSBjbGFzc05hbWVzKHByZWZpeENscywgY2xhc3NOYW1lLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNoZWNrZWRcIiksIGNoZWNrZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgX2NsYXNzTmFtZXMpKTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzU3RyaW5nLFxuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX2V4dGVuZHMoe1xuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICBpZDogaWQsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIHJlcXVpcmVkOiByZXF1aXJlZCxcbiAgICAgICAgcmVhZE9ubHk6IHJlYWRPbmx5LFxuICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgIHRhYkluZGV4OiB0YWJJbmRleCxcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlucHV0XCIpLFxuICAgICAgICBjaGVja2VkOiAhIWNoZWNrZWQsXG4gICAgICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgICAgIG9uRm9jdXM6IG9uRm9jdXMsXG4gICAgICAgIG9uQmx1cjogb25CbHVyLFxuICAgICAgICBvbktleVVwOiBvbktleVVwLFxuICAgICAgICBvbktleURvd246IG9uS2V5RG93bixcbiAgICAgICAgb25LZXlQcmVzczogb25LZXlQcmVzcyxcbiAgICAgICAgb25DaGFuZ2U6IHRoaXMuaGFuZGxlQ2hhbmdlLFxuICAgICAgICBhdXRvRm9jdXM6IGF1dG9Gb2N1cyxcbiAgICAgICAgcmVmOiB0aGlzLnNhdmVJbnB1dCxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9LCBnbG9iYWxQcm9wcykpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5uZXJcIilcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKHByb3BzLCBzdGF0ZSkge1xuICAgICAgaWYgKCdjaGVja2VkJyBpbiBwcm9wcykge1xuICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdGF0ZSksIHt9LCB7XG4gICAgICAgICAgY2hlY2tlZDogcHJvcHMuY2hlY2tlZFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENoZWNrYm94O1xufShDb21wb25lbnQpO1xuXG5DaGVja2JveC5kZWZhdWx0UHJvcHMgPSB7XG4gIHByZWZpeENsczogJ3JjLWNoZWNrYm94JyxcbiAgY2xhc3NOYW1lOiAnJyxcbiAgc3R5bGU6IHt9LFxuICB0eXBlOiAnY2hlY2tib3gnLFxuICBkZWZhdWx0Q2hlY2tlZDogZmFsc2UsXG4gIG9uRm9jdXM6IGZ1bmN0aW9uIG9uRm9jdXMoKSB7fSxcbiAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoKSB7fSxcbiAgb25DaGFuZ2U6IGZ1bmN0aW9uIG9uQ2hhbmdlKCkge30sXG4gIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKCkge30sXG4gIG9uS2V5UHJlc3M6IGZ1bmN0aW9uIG9uS2V5UHJlc3MoKSB7fSxcbiAgb25LZXlVcDogZnVuY3Rpb24gb25LZXlVcCgpIHt9XG59O1xuZXhwb3J0IGRlZmF1bHQgQ2hlY2tib3g7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjQ2hlY2tib3ggZnJvbSAncmMtY2hlY2tib3gnO1xuaW1wb3J0IHsgY29tcG9zZVJlZiB9IGZyb20gXCJyYy11dGlsL2VzL3JlZlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IERpc2FibGVkQ29udGV4dCBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvRGlzYWJsZWRDb250ZXh0JztcbmltcG9ydCB7IEZvcm1JdGVtSW5wdXRDb250ZXh0IH0gZnJvbSAnLi4vZm9ybS9jb250ZXh0JztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IFJhZGlvR3JvdXBDb250ZXh0LCB7IFJhZGlvT3B0aW9uVHlwZUNvbnRleHQgfSBmcm9tICcuL2NvbnRleHQnO1xudmFyIEludGVybmFsUmFkaW8gPSBmdW5jdGlvbiBJbnRlcm5hbFJhZGlvKHByb3BzLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuICB2YXIgZ3JvdXBDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChSYWRpb0dyb3VwQ29udGV4dCk7XG4gIHZhciByYWRpb09wdGlvblR5cGVDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChSYWRpb09wdGlvblR5cGVDb250ZXh0KTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICB2YXIgaW5uZXJSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIG1lcmdlZFJlZiA9IGNvbXBvc2VSZWYocmVmLCBpbm5lclJlZik7XG4gIHZhciBfdXNlQ29udGV4dCA9IHVzZUNvbnRleHQoRm9ybUl0ZW1JbnB1dENvbnRleHQpLFxuICAgIGlzRm9ybUl0ZW1JbnB1dCA9IF91c2VDb250ZXh0LmlzRm9ybUl0ZW1JbnB1dDtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKCdvcHRpb25UeXBlJyBpbiBwcm9wcyksICdSYWRpbycsICdgb3B0aW9uVHlwZWAgaXMgb25seSBzdXBwb3J0IGluIFJhZGlvLkdyb3VwLicpIDogdm9pZCAwO1xuICB2YXIgb25DaGFuZ2UgPSBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICAoX2EgPSBwcm9wcy5vbkNoYW5nZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwocHJvcHMsIGUpO1xuICAgIChfYiA9IGdyb3VwQ29udGV4dCA9PT0gbnVsbCB8fCBncm91cENvbnRleHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGdyb3VwQ29udGV4dC5vbkNoYW5nZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoZ3JvdXBDb250ZXh0LCBlKTtcbiAgfTtcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIGN1c3RvbURpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgcmVzdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiLCBcInN0eWxlXCIsIFwiZGlzYWJsZWRcIl0pO1xuICB2YXIgcmFkaW9QcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3JhZGlvJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIHByZWZpeENscyA9ICgoZ3JvdXBDb250ZXh0ID09PSBudWxsIHx8IGdyb3VwQ29udGV4dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZ3JvdXBDb250ZXh0Lm9wdGlvblR5cGUpIHx8IHJhZGlvT3B0aW9uVHlwZUNvbnRleHQpID09PSAnYnV0dG9uJyA/IFwiXCIuY29uY2F0KHJhZGlvUHJlZml4Q2xzLCBcIi1idXR0b25cIikgOiByYWRpb1ByZWZpeENscztcbiAgdmFyIHJhZGlvUHJvcHMgPSBfZXh0ZW5kcyh7fSwgcmVzdFByb3BzKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IERpc2FibGVkID09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZGlzYWJsZWQgPSBSZWFjdC51c2VDb250ZXh0KERpc2FibGVkQ29udGV4dCk7XG4gIHJhZGlvUHJvcHMuZGlzYWJsZWQgPSBjdXN0b21EaXNhYmxlZCB8fCBkaXNhYmxlZDtcbiAgaWYgKGdyb3VwQ29udGV4dCkge1xuICAgIHJhZGlvUHJvcHMubmFtZSA9IGdyb3VwQ29udGV4dC5uYW1lO1xuICAgIHJhZGlvUHJvcHMub25DaGFuZ2UgPSBvbkNoYW5nZTtcbiAgICByYWRpb1Byb3BzLmNoZWNrZWQgPSBwcm9wcy52YWx1ZSA9PT0gZ3JvdXBDb250ZXh0LnZhbHVlO1xuICAgIHJhZGlvUHJvcHMuZGlzYWJsZWQgPSByYWRpb1Byb3BzLmRpc2FibGVkIHx8IGdyb3VwQ29udGV4dC5kaXNhYmxlZDtcbiAgfVxuICB2YXIgd3JhcHBlckNsYXNzU3RyaW5nID0gY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXdyYXBwZXJcIiksIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlci1jaGVja2VkXCIpLCByYWRpb1Byb3BzLmNoZWNrZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlci1kaXNhYmxlZFwiKSwgcmFkaW9Qcm9wcy5kaXNhYmxlZCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi13cmFwcGVyLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi13cmFwcGVyLWluLWZvcm0taXRlbVwiKSwgaXNGb3JtSXRlbUlucHV0KSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICByZXR1cm4gKFxuICAgIC8qI19fUFVSRV9fKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganN4LWExMXkvbGFiZWwtaGFzLWFzc29jaWF0ZWQtY29udHJvbFxuICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCB7XG4gICAgICBjbGFzc05hbWU6IHdyYXBwZXJDbGFzc1N0cmluZyxcbiAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgIG9uTW91c2VFbnRlcjogcHJvcHMub25Nb3VzZUVudGVyLFxuICAgICAgb25Nb3VzZUxlYXZlOiBwcm9wcy5vbk1vdXNlTGVhdmVcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSY0NoZWNrYm94LCBfZXh0ZW5kcyh7fSwgcmFkaW9Qcm9wcywge1xuICAgICAgdHlwZTogXCJyYWRpb1wiLFxuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICByZWY6IG1lcmdlZFJlZlxuICAgIH0pKSwgY2hpbGRyZW4gIT09IHVuZGVmaW5lZCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBjaGlsZHJlbikgOiBudWxsKVxuICApO1xufTtcbnZhciBSYWRpbyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEludGVybmFsUmFkaW8pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmFkaW8uZGlzcGxheU5hbWUgPSAnUmFkaW8nO1xufVxuZXhwb3J0IGRlZmF1bHQgUmFkaW87IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgU2l6ZUNvbnRleHQgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL1NpemVDb250ZXh0JztcbmltcG9ydCBnZXREYXRhT3JBcmlhUHJvcHMgZnJvbSAnLi4vX3V0aWwvZ2V0RGF0YU9yQXJpYVByb3BzJztcbmltcG9ydCB7IFJhZGlvR3JvdXBDb250ZXh0UHJvdmlkZXIgfSBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0IFJhZGlvIGZyb20gJy4vcmFkaW8nO1xudmFyIFJhZGlvR3JvdXAgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgX2NsYXNzTmFtZXM7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCksXG4gICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcbiAgdmFyIHNpemUgPSBSZWFjdC51c2VDb250ZXh0KFNpemVDb250ZXh0KTtcbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKHByb3BzLmRlZmF1bHRWYWx1ZSwge1xuICAgICAgdmFsdWU6IHByb3BzLnZhbHVlXG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgdmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgIHNldFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlsxXTtcbiAgdmFyIG9uUmFkaW9DaGFuZ2UgPSBmdW5jdGlvbiBvblJhZGlvQ2hhbmdlKGV2KSB7XG4gICAgdmFyIGxhc3RWYWx1ZSA9IHZhbHVlO1xuICAgIHZhciB2YWwgPSBldi50YXJnZXQudmFsdWU7XG4gICAgaWYgKCEoJ3ZhbHVlJyBpbiBwcm9wcykpIHtcbiAgICAgIHNldFZhbHVlKHZhbCk7XG4gICAgfVxuICAgIHZhciBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlO1xuICAgIGlmIChvbkNoYW5nZSAmJiB2YWwgIT09IGxhc3RWYWx1ZSkge1xuICAgICAgb25DaGFuZ2UoZXYpO1xuICAgIH1cbiAgfTtcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBfcHJvcHMkY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIGNsYXNzTmFtZSA9IF9wcm9wcyRjbGFzc05hbWUgPT09IHZvaWQgMCA/ICcnIDogX3Byb3BzJGNsYXNzTmFtZSxcbiAgICBvcHRpb25zID0gcHJvcHMub3B0aW9ucyxcbiAgICBfcHJvcHMkYnV0dG9uU3R5bGUgPSBwcm9wcy5idXR0b25TdHlsZSxcbiAgICBidXR0b25TdHlsZSA9IF9wcm9wcyRidXR0b25TdHlsZSA9PT0gdm9pZCAwID8gJ291dGxpbmUnIDogX3Byb3BzJGJ1dHRvblN0eWxlLFxuICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBjdXN0b21pemVTaXplID0gcHJvcHMuc2l6ZSxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIGlkID0gcHJvcHMuaWQsXG4gICAgb25Nb3VzZUVudGVyID0gcHJvcHMub25Nb3VzZUVudGVyLFxuICAgIG9uTW91c2VMZWF2ZSA9IHByb3BzLm9uTW91c2VMZWF2ZSxcbiAgICBvbkZvY3VzID0gcHJvcHMub25Gb2N1cyxcbiAgICBvbkJsdXIgPSBwcm9wcy5vbkJsdXI7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3JhZGlvJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIGdyb3VwUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ncm91cFwiKTtcbiAgdmFyIGNoaWxkcmVuVG9SZW5kZXIgPSBjaGlsZHJlbjtcbiAgLy8g5aaC5p6c5a2Y5ZyoIG9wdGlvbnMsIOS8mOWFiOS9v+eUqFxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICBjaGlsZHJlblRvUmVuZGVyID0gb3B0aW9ucy5tYXAoZnVuY3Rpb24gKG9wdGlvbikge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBvcHRpb24gPT09ICdudW1iZXInKSB7XG4gICAgICAgIC8vIOatpOWkhOexu+Wei+iHquWKqOaOqOWvvOS4uiBzdHJpbmdcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJhZGlvLCB7XG4gICAgICAgICAga2V5OiBvcHRpb24udG9TdHJpbmcoKSxcbiAgICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAgdmFsdWU6IG9wdGlvbixcbiAgICAgICAgICBjaGVja2VkOiB2YWx1ZSA9PT0gb3B0aW9uXG4gICAgICAgIH0sIG9wdGlvbik7XG4gICAgICB9XG4gICAgICAvLyDmraTlpITnsbvlnovoh6rliqjmjqjlr7zkuLogeyBsYWJlbDogc3RyaW5nIHZhbHVlOiBzdHJpbmcgfVxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJhZGlvLCB7XG4gICAgICAgIGtleTogXCJyYWRpby1ncm91cC12YWx1ZS1vcHRpb25zLVwiLmNvbmNhdChvcHRpb24udmFsdWUpLFxuICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgZGlzYWJsZWQ6IG9wdGlvbi5kaXNhYmxlZCB8fCBkaXNhYmxlZCxcbiAgICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZSxcbiAgICAgICAgY2hlY2tlZDogdmFsdWUgPT09IG9wdGlvbi52YWx1ZSxcbiAgICAgICAgc3R5bGU6IG9wdGlvbi5zdHlsZVxuICAgICAgfSwgb3B0aW9uLmxhYmVsKTtcbiAgICB9KTtcbiAgfVxuICB2YXIgbWVyZ2VkU2l6ZSA9IGN1c3RvbWl6ZVNpemUgfHwgc2l6ZTtcbiAgdmFyIGNsYXNzU3RyaW5nID0gY2xhc3NOYW1lcyhncm91cFByZWZpeENscywgXCJcIi5jb25jYXQoZ3JvdXBQcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoYnV0dG9uU3R5bGUpLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChncm91cFByZWZpeENscywgXCItXCIpLmNvbmNhdChtZXJnZWRTaXplKSwgbWVyZ2VkU2l6ZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQoZ3JvdXBQcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCBnZXREYXRhT3JBcmlhUHJvcHMocHJvcHMpLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc1N0cmluZyxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgb25Nb3VzZUVudGVyOiBvbk1vdXNlRW50ZXIsXG4gICAgb25Nb3VzZUxlYXZlOiBvbk1vdXNlTGVhdmUsXG4gICAgb25Gb2N1czogb25Gb2N1cyxcbiAgICBvbkJsdXI6IG9uQmx1cixcbiAgICBpZDogaWQsXG4gICAgcmVmOiByZWZcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJhZGlvR3JvdXBDb250ZXh0UHJvdmlkZXIsIHtcbiAgICB2YWx1ZToge1xuICAgICAgb25DaGFuZ2U6IG9uUmFkaW9DaGFuZ2UsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBkaXNhYmxlZDogcHJvcHMuZGlzYWJsZWQsXG4gICAgICBuYW1lOiBwcm9wcy5uYW1lLFxuICAgICAgb3B0aW9uVHlwZTogcHJvcHMub3B0aW9uVHlwZVxuICAgIH1cbiAgfSwgY2hpbGRyZW5Ub1JlbmRlcikpO1xufSk7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QubWVtbyhSYWRpb0dyb3VwKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB7IFJhZGlvT3B0aW9uVHlwZUNvbnRleHRQcm92aWRlciB9IGZyb20gJy4vY29udGV4dCc7XG5pbXBvcnQgUmFkaW8gZnJvbSAnLi9yYWRpbyc7XG52YXIgUmFkaW9CdXR0b24gPSBmdW5jdGlvbiBSYWRpb0J1dHRvbihwcm9wcywgcmVmKSB7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCksXG4gICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzO1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHJhZGlvUHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiXSk7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3JhZGlvJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJhZGlvT3B0aW9uVHlwZUNvbnRleHRQcm92aWRlciwge1xuICAgIHZhbHVlOiBcImJ1dHRvblwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJhZGlvLCBfZXh0ZW5kcyh7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHNcbiAgfSwgcmFkaW9Qcm9wcywge1xuICAgIHR5cGU6IFwicmFkaW9cIixcbiAgICByZWY6IHJlZlxuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFJhZGlvQnV0dG9uKTsiLCJpbXBvcnQgR3JvdXAgZnJvbSAnLi9ncm91cCc7XG5pbXBvcnQgSW50ZXJuYWxSYWRpbyBmcm9tICcuL3JhZGlvJztcbmltcG9ydCBCdXR0b24gZnJvbSAnLi9yYWRpb0J1dHRvbic7XG5leHBvcnQgeyBCdXR0b24sIEdyb3VwIH07XG52YXIgUmFkaW8gPSBJbnRlcm5hbFJhZGlvO1xuUmFkaW8uQnV0dG9uID0gQnV0dG9uO1xuUmFkaW8uR3JvdXAgPSBHcm91cDtcblJhZGlvLl9fQU5UX1JBRElPID0gdHJ1ZTtcbmV4cG9ydCBkZWZhdWx0IFJhZGlvOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIEVsZW1lbnQgPSBmdW5jdGlvbiBFbGVtZW50KHByb3BzKSB7XG4gIHZhciBfY2xhc3NOYW1lcywgX2NsYXNzTmFtZXMyO1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIHNpemUgPSBwcm9wcy5zaXplLFxuICAgIHNoYXBlID0gcHJvcHMuc2hhcGU7XG4gIHZhciBzaXplQ2xzID0gY2xhc3NOYW1lcygoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxnXCIpLCBzaXplID09PSAnbGFyZ2UnKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNtXCIpLCBzaXplID09PSAnc21hbGwnKSwgX2NsYXNzTmFtZXMpKTtcbiAgdmFyIHNoYXBlQ2xzID0gY2xhc3NOYW1lcygoX2NsYXNzTmFtZXMyID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2lyY2xlXCIpLCBzaGFwZSA9PT0gJ2NpcmNsZScpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNxdWFyZVwiKSwgc2hhcGUgPT09ICdzcXVhcmUnKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yb3VuZFwiKSwgc2hhcGUgPT09ICdyb3VuZCcpLCBfY2xhc3NOYW1lczIpKTtcbiAgdmFyIHNpemVTdHlsZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0eXBlb2Ygc2l6ZSA9PT0gJ251bWJlcicgPyB7XG4gICAgICB3aWR0aDogc2l6ZSxcbiAgICAgIGhlaWdodDogc2l6ZSxcbiAgICAgIGxpbmVIZWlnaHQ6IFwiXCIuY29uY2F0KHNpemUsIFwicHhcIilcbiAgICB9IDoge307XG4gIH0sIFtzaXplXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhwcmVmaXhDbHMsIHNpemVDbHMsIHNoYXBlQ2xzLCBjbGFzc05hbWUpLFxuICAgIHN0eWxlOiBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgc2l6ZVN0eWxlKSwgc3R5bGUpXG4gIH0pO1xufTtcbmV4cG9ydCBkZWZhdWx0IEVsZW1lbnQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBFbGVtZW50IGZyb20gJy4vRWxlbWVudCc7XG52YXIgU2tlbGV0b25BdmF0YXIgPSBmdW5jdGlvbiBTa2VsZXRvbkF2YXRhcihwcm9wcykge1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBhY3RpdmUgPSBwcm9wcy5hY3RpdmUsXG4gICAgX3Byb3BzJHNoYXBlID0gcHJvcHMuc2hhcGUsXG4gICAgc2hhcGUgPSBfcHJvcHMkc2hhcGUgPT09IHZvaWQgMCA/ICdjaXJjbGUnIDogX3Byb3BzJHNoYXBlLFxuICAgIF9wcm9wcyRzaXplID0gcHJvcHMuc2l6ZSxcbiAgICBzaXplID0gX3Byb3BzJHNpemUgPT09IHZvaWQgMCA/ICdkZWZhdWx0JyA6IF9wcm9wcyRzaXplO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscztcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnc2tlbGV0b24nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgb3RoZXJQcm9wcyA9IG9taXQocHJvcHMsIFsncHJlZml4Q2xzJywgJ2NsYXNzTmFtZSddKTtcbiAgdmFyIGNscyA9IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWVsZW1lbnRcIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hY3RpdmVcIiksIGFjdGl2ZSksIGNsYXNzTmFtZSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbHNcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudCwgX2V4dGVuZHMoe1xuICAgIHByZWZpeENsczogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hdmF0YXJcIiksXG4gICAgc2hhcGU6IHNoYXBlLFxuICAgIHNpemU6IHNpemVcbiAgfSwgb3RoZXJQcm9wcykpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTa2VsZXRvbkF2YXRhcjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBvbWl0IGZyb20gXCJyYy11dGlsL2VzL29taXRcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IEVsZW1lbnQgZnJvbSAnLi9FbGVtZW50JztcbnZhciBTa2VsZXRvbkJ1dHRvbiA9IGZ1bmN0aW9uIFNrZWxldG9uQnV0dG9uKHByb3BzKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgYWN0aXZlID0gcHJvcHMuYWN0aXZlLFxuICAgIF9wcm9wcyRibG9jayA9IHByb3BzLmJsb2NrLFxuICAgIGJsb2NrID0gX3Byb3BzJGJsb2NrID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRibG9jayxcbiAgICBfcHJvcHMkc2l6ZSA9IHByb3BzLnNpemUsXG4gICAgc2l6ZSA9IF9wcm9wcyRzaXplID09PSB2b2lkIDAgPyAnZGVmYXVsdCcgOiBfcHJvcHMkc2l6ZTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHM7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3NrZWxldG9uJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIG90aGVyUHJvcHMgPSBvbWl0KHByb3BzLCBbJ3ByZWZpeENscyddKTtcbiAgdmFyIGNscyA9IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWVsZW1lbnRcIiksIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYWN0aXZlXCIpLCBhY3RpdmUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYmxvY2tcIiksIGJsb2NrKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xzXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnQsIF9leHRlbmRzKHtcbiAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYnV0dG9uXCIpLFxuICAgIHNpemU6IHNpemVcbiAgfSwgb3RoZXJQcm9wcykpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTa2VsZXRvbkJ1dHRvbjsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBEb3RDaGFydE91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk04ODggNzkySDIwMFYxNjhjMC00LjQtMy42LTgtOC04aC01NmMtNC40IDAtOCAzLjYtOCA4djY4OGMwIDQuNCAzLjYgOCA4IDhoNzUyYzQuNCAwIDgtMy42IDgtOHYtNTZjMC00LjQtMy42LTgtOC04ek0yODggNjA0YTY0IDY0IDAgMTAxMjggMCA2NCA2NCAwIDEwLTEyOCAwem0xMTgtMjI0YTQ4IDQ4IDAgMTA5NiAwIDQ4IDQ4IDAgMTAtOTYgMHptMTU4IDIyOGE5NiA5NiAwIDEwMTkyIDAgOTYgOTYgMCAxMC0xOTIgMHptMTQ4LTMxNGE1NiA1NiAwIDEwMTEyIDAgNTYgNTYgMCAxMC0xMTIgMHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImRvdC1jaGFydFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgRG90Q2hhcnRPdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IERvdENoYXJ0T3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRG90Q2hhcnRPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIERvdENoYXJ0T3V0bGluZWQgPSBmdW5jdGlvbiBEb3RDaGFydE91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBEb3RDaGFydE91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5Eb3RDaGFydE91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0RvdENoYXJ0T3V0bGluZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoRG90Q2hhcnRPdXRsaW5lZCk7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBEb3RDaGFydE91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Eb3RDaGFydE91dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xudmFyIFNrZWxldG9uTm9kZSA9IGZ1bmN0aW9uIFNrZWxldG9uTm9kZShwcm9wcykge1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIGFjdGl2ZSA9IHByb3BzLmFjdGl2ZSxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscztcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnc2tlbGV0b24nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgY2xzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZWxlbWVudFwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFjdGl2ZVwiKSwgYWN0aXZlKSwgY2xhc3NOYW1lKTtcbiAgdmFyIGNvbnRlbnQgPSBjaGlsZHJlbiAhPT0gbnVsbCAmJiBjaGlsZHJlbiAhPT0gdm9pZCAwID8gY2hpbGRyZW4gOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEb3RDaGFydE91dGxpbmVkLCBudWxsKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsc1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW1hZ2VcIiksIGNsYXNzTmFtZSksXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIGNvbnRlbnQpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTa2VsZXRvbk5vZGU7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG52YXIgcGF0aCA9ICdNMzY1LjcxNDI4NiAzMjkuMTQyODU3cTAgNDUuNzE0Mjg2LTMyLjAzNjU3MSA3Ny42Nzc3MTR0LTc3LjY3NzcxNCAzMi4wMzY1NzEtNzcuNjc3NzE0LTMyLjAzNjU3MS0zMi4wMzY1NzEtNzcuNjc3NzE0IDMyLjAzNjU3MS03Ny42Nzc3MTQgNzcuNjc3NzE0LTMyLjAzNjU3MSA3Ny42Nzc3MTQgMzIuMDM2NTcxIDMyLjAzNjU3MSA3Ny42Nzc3MTR6TTk1MC44NTcxNDMgNTQ4LjU3MTQyOWwwIDI1Ni04MDQuNTcxNDI5IDAgMC0xMDkuNzE0Mjg2IDE4Mi44NTcxNDMtMTgyLjg1NzE0MyA5MS40Mjg1NzEgOTEuNDI4NTcxIDI5Mi41NzE0MjktMjkyLjU3MTQyOXpNMTAwNS43MTQyODYgMTQ2LjI4NTcxNGwtOTE0LjI4NTcxNCAwcS03LjQ2MDU3MSAwLTEyLjg3MzE0MyA1LjQxMjU3MXQtNS40MTI1NzEgMTIuODczMTQzbDAgNjk0Ljg1NzE0M3EwIDcuNDYwNTcxIDUuNDEyNTcxIDEyLjg3MzE0M3QxMi44NzMxNDMgNS40MTI1NzFsOTE0LjI4NTcxNCAwcTcuNDYwNTcxIDAgMTIuODczMTQzLTUuNDEyNTcxdDUuNDEyNTcxLTEyLjg3MzE0M2wwLTY5NC44NTcxNDNxMC03LjQ2MDU3MS01LjQxMjU3MS0xMi44NzMxNDN0LTEyLjg3MzE0My01LjQxMjU3MXpNMTA5Ny4xNDI4NTcgMTY0LjU3MTQyOWwwIDY5NC44NTcxNDNxMCAzNy43NDE3MTQtMjYuODQzNDI5IDY0LjU4NTE0M3QtNjQuNTg1MTQzIDI2Ljg0MzQyOWwtOTE0LjI4NTcxNCAwcS0zNy43NDE3MTQgMC02NC41ODUxNDMtMjYuODQzNDI5dC0yNi44NDM0MjktNjQuNTg1MTQzbDAtNjk0Ljg1NzE0M3EwLTM3Ljc0MTcxNCAyNi44NDM0MjktNjQuNTg1MTQzdDY0LjU4NTE0My0yNi44NDM0MjlsOTE0LjI4NTcxNCAwcTM3Ljc0MTcxNCAwIDY0LjU4NTE0MyAyNi44NDM0Mjl0MjYuODQzNDI5IDY0LjU4NTE0M3onO1xudmFyIFNrZWxldG9uSW1hZ2UgPSBmdW5jdGlvbiBTa2VsZXRvbkltYWdlKHByb3BzKSB7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgYWN0aXZlID0gcHJvcHMuYWN0aXZlO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscztcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnc2tlbGV0b24nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgY2xzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZWxlbWVudFwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFjdGl2ZVwiKSwgYWN0aXZlKSwgY2xhc3NOYW1lKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsc1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW1hZ2VcIiksIGNsYXNzTmFtZSksXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICB2aWV3Qm94OiBcIjAgMCAxMDk4IDEwMjRcIixcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbWFnZS1zdmdcIilcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBwYXRoLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbWFnZS1wYXRoXCIpXG4gIH0pKSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFNrZWxldG9uSW1hZ2U7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBFbGVtZW50IGZyb20gJy4vRWxlbWVudCc7XG52YXIgU2tlbGV0b25JbnB1dCA9IGZ1bmN0aW9uIFNrZWxldG9uSW5wdXQocHJvcHMpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBhY3RpdmUgPSBwcm9wcy5hY3RpdmUsXG4gICAgYmxvY2sgPSBwcm9wcy5ibG9jayxcbiAgICBfcHJvcHMkc2l6ZSA9IHByb3BzLnNpemUsXG4gICAgc2l6ZSA9IF9wcm9wcyRzaXplID09PSB2b2lkIDAgPyAnZGVmYXVsdCcgOiBfcHJvcHMkc2l6ZTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHM7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3NrZWxldG9uJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIG90aGVyUHJvcHMgPSBvbWl0KHByb3BzLCBbJ3ByZWZpeENscyddKTtcbiAgdmFyIGNscyA9IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWVsZW1lbnRcIiksIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYWN0aXZlXCIpLCBhY3RpdmUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYmxvY2tcIiksIGJsb2NrKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xzXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnQsIF9leHRlbmRzKHtcbiAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5wdXRcIiksXG4gICAgc2l6ZTogc2l6ZVxuICB9LCBvdGhlclByb3BzKSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFNrZWxldG9uSW5wdXQ7IiwiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIFBhcmFncmFwaCA9IGZ1bmN0aW9uIFBhcmFncmFwaChwcm9wcykge1xuICB2YXIgZ2V0V2lkdGggPSBmdW5jdGlvbiBnZXRXaWR0aChpbmRleCkge1xuICAgIHZhciB3aWR0aCA9IHByb3BzLndpZHRoLFxuICAgICAgX3Byb3BzJHJvd3MgPSBwcm9wcy5yb3dzLFxuICAgICAgcm93cyA9IF9wcm9wcyRyb3dzID09PSB2b2lkIDAgPyAyIDogX3Byb3BzJHJvd3M7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkod2lkdGgpKSB7XG4gICAgICByZXR1cm4gd2lkdGhbaW5kZXhdO1xuICAgIH1cbiAgICAvLyBsYXN0IHBhcmFncmFwaFxuICAgIGlmIChyb3dzIC0gMSA9PT0gaW5kZXgpIHtcbiAgICAgIHJldHVybiB3aWR0aDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICByb3dzID0gcHJvcHMucm93cztcbiAgdmFyIHJvd0xpc3QgPSBfdG9Db25zdW1hYmxlQXJyYXkoQXJyYXkocm93cykpLm1hcChmdW5jdGlvbiAoXywgaW5kZXgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgLyojX19QVVJFX18qL1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWFycmF5LWluZGV4LWtleVxuICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAga2V5OiBpbmRleCxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICB3aWR0aDogZ2V0V2lkdGgoaW5kZXgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBjbGFzc05hbWUpLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCByb3dMaXN0KTtcbn07XG5leHBvcnQgZGVmYXVsdCBQYXJhZ3JhcGg7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vKiBlc2xpbnQtZGlzYWJsZSBqc3gtYTExeS9oZWFkaW5nLWhhcy1jb250ZW50ICovXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBUaXRsZSA9IGZ1bmN0aW9uIFRpdGxlKF9yZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgIHdpZHRoID0gX3JlZi53aWR0aCxcbiAgICBzdHlsZSA9IF9yZWYuc3R5bGU7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImgzXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBjbGFzc05hbWUpLFxuICAgIHN0eWxlOiBfZXh0ZW5kcyh7XG4gICAgICB3aWR0aDogd2lkdGhcbiAgICB9LCBzdHlsZSlcbiAgfSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgVGl0bGU7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBTa2VsZXRvbkF2YXRhciBmcm9tICcuL0F2YXRhcic7XG5pbXBvcnQgU2tlbGV0b25CdXR0b24gZnJvbSAnLi9CdXR0b24nO1xuaW1wb3J0IFNrZWxldG9uTm9kZSBmcm9tICcuL05vZGUnO1xuaW1wb3J0IEVsZW1lbnQgZnJvbSAnLi9FbGVtZW50JztcbmltcG9ydCBTa2VsZXRvbkltYWdlIGZyb20gJy4vSW1hZ2UnO1xuaW1wb3J0IFNrZWxldG9uSW5wdXQgZnJvbSAnLi9JbnB1dCc7XG5pbXBvcnQgUGFyYWdyYXBoIGZyb20gJy4vUGFyYWdyYXBoJztcbmltcG9ydCBUaXRsZSBmcm9tICcuL1RpdGxlJztcbmZ1bmN0aW9uIGdldENvbXBvbmVudFByb3BzKHByb3ApIHtcbiAgaWYgKHByb3AgJiYgX3R5cGVvZihwcm9wKSA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gcHJvcDtcbiAgfVxuICByZXR1cm4ge307XG59XG5mdW5jdGlvbiBnZXRBdmF0YXJCYXNpY1Byb3BzKGhhc1RpdGxlLCBoYXNQYXJhZ3JhcGgpIHtcbiAgaWYgKGhhc1RpdGxlICYmICFoYXNQYXJhZ3JhcGgpIHtcbiAgICAvLyBTcXVhcmUgYXZhdGFyXG4gICAgcmV0dXJuIHtcbiAgICAgIHNpemU6ICdsYXJnZScsXG4gICAgICBzaGFwZTogJ3NxdWFyZSdcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgc2l6ZTogJ2xhcmdlJyxcbiAgICBzaGFwZTogJ2NpcmNsZSdcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldFRpdGxlQmFzaWNQcm9wcyhoYXNBdmF0YXIsIGhhc1BhcmFncmFwaCkge1xuICBpZiAoIWhhc0F2YXRhciAmJiBoYXNQYXJhZ3JhcGgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6ICczOCUnXG4gICAgfTtcbiAgfVxuICBpZiAoaGFzQXZhdGFyICYmIGhhc1BhcmFncmFwaCkge1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogJzUwJSdcbiAgICB9O1xuICB9XG4gIHJldHVybiB7fTtcbn1cbmZ1bmN0aW9uIGdldFBhcmFncmFwaEJhc2ljUHJvcHMoaGFzQXZhdGFyLCBoYXNUaXRsZSkge1xuICB2YXIgYmFzaWNQcm9wcyA9IHt9O1xuICAvLyBXaWR0aFxuICBpZiAoIWhhc0F2YXRhciB8fCAhaGFzVGl0bGUpIHtcbiAgICBiYXNpY1Byb3BzLndpZHRoID0gJzYxJSc7XG4gIH1cbiAgLy8gUm93c1xuICBpZiAoIWhhc0F2YXRhciAmJiBoYXNUaXRsZSkge1xuICAgIGJhc2ljUHJvcHMucm93cyA9IDM7XG4gIH0gZWxzZSB7XG4gICAgYmFzaWNQcm9wcy5yb3dzID0gMjtcbiAgfVxuICByZXR1cm4gYmFzaWNQcm9wcztcbn1cbnZhciBTa2VsZXRvbiA9IGZ1bmN0aW9uIFNrZWxldG9uKHByb3BzKSB7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgbG9hZGluZyA9IHByb3BzLmxvYWRpbmcsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBfcHJvcHMkYXZhdGFyID0gcHJvcHMuYXZhdGFyLFxuICAgIGF2YXRhciA9IF9wcm9wcyRhdmF0YXIgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGF2YXRhcixcbiAgICBfcHJvcHMkdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICB0aXRsZSA9IF9wcm9wcyR0aXRsZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyR0aXRsZSxcbiAgICBfcHJvcHMkcGFyYWdyYXBoID0gcHJvcHMucGFyYWdyYXBoLFxuICAgIHBhcmFncmFwaCA9IF9wcm9wcyRwYXJhZ3JhcGggPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkcGFyYWdyYXBoLFxuICAgIGFjdGl2ZSA9IHByb3BzLmFjdGl2ZSxcbiAgICByb3VuZCA9IHByb3BzLnJvdW5kO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3NrZWxldG9uJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgaWYgKGxvYWRpbmcgfHwgISgnbG9hZGluZycgaW4gcHJvcHMpKSB7XG4gICAgdmFyIF9jbGFzc05hbWVzO1xuICAgIHZhciBoYXNBdmF0YXIgPSAhIWF2YXRhcjtcbiAgICB2YXIgaGFzVGl0bGUgPSAhIXRpdGxlO1xuICAgIHZhciBoYXNQYXJhZ3JhcGggPSAhIXBhcmFncmFwaDtcbiAgICAvLyBBdmF0YXJcbiAgICB2YXIgYXZhdGFyTm9kZTtcbiAgICBpZiAoaGFzQXZhdGFyKSB7XG4gICAgICB2YXIgYXZhdGFyUHJvcHMgPSBfZXh0ZW5kcyhfZXh0ZW5kcyh7XG4gICAgICAgIHByZWZpeENsczogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hdmF0YXJcIilcbiAgICAgIH0sIGdldEF2YXRhckJhc2ljUHJvcHMoaGFzVGl0bGUsIGhhc1BhcmFncmFwaCkpLCBnZXRDb21wb25lbnRQcm9wcyhhdmF0YXIpKTtcbiAgICAgIC8vIFdlIGRpcmVjdCB1c2UgU2tlbGV0b25FbGVtZW50IGFzIGF2YXRhciBpbiBza2VsZXRvbiBpbnRlcm5hbC5cbiAgICAgIGF2YXRhck5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkZXJcIilcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnQsIF9leHRlbmRzKHt9LCBhdmF0YXJQcm9wcykpKTtcbiAgICB9XG4gICAgdmFyIGNvbnRlbnROb2RlO1xuICAgIGlmIChoYXNUaXRsZSB8fCBoYXNQYXJhZ3JhcGgpIHtcbiAgICAgIC8vIFRpdGxlXG4gICAgICB2YXIgJHRpdGxlO1xuICAgICAgaWYgKGhhc1RpdGxlKSB7XG4gICAgICAgIHZhciB0aXRsZVByb3BzID0gX2V4dGVuZHMoX2V4dGVuZHMoe1xuICAgICAgICAgIHByZWZpeENsczogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10aXRsZVwiKVxuICAgICAgICB9LCBnZXRUaXRsZUJhc2ljUHJvcHMoaGFzQXZhdGFyLCBoYXNQYXJhZ3JhcGgpKSwgZ2V0Q29tcG9uZW50UHJvcHModGl0bGUpKTtcbiAgICAgICAgJHRpdGxlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGl0bGUsIF9leHRlbmRzKHt9LCB0aXRsZVByb3BzKSk7XG4gICAgICB9XG4gICAgICAvLyBQYXJhZ3JhcGhcbiAgICAgIHZhciBwYXJhZ3JhcGhOb2RlO1xuICAgICAgaWYgKGhhc1BhcmFncmFwaCkge1xuICAgICAgICB2YXIgcGFyYWdyYXBoUHJvcHMgPSBfZXh0ZW5kcyhfZXh0ZW5kcyh7XG4gICAgICAgICAgcHJlZml4Q2xzOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBhcmFncmFwaFwiKVxuICAgICAgICB9LCBnZXRQYXJhZ3JhcGhCYXNpY1Byb3BzKGhhc0F2YXRhciwgaGFzVGl0bGUpKSwgZ2V0Q29tcG9uZW50UHJvcHMocGFyYWdyYXBoKSk7XG4gICAgICAgIHBhcmFncmFwaE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYXJhZ3JhcGgsIF9leHRlbmRzKHt9LCBwYXJhZ3JhcGhQcm9wcykpO1xuICAgICAgfVxuICAgICAgY29udGVudE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50XCIpXG4gICAgICB9LCAkdGl0bGUsIHBhcmFncmFwaE5vZGUpO1xuICAgIH1cbiAgICB2YXIgY2xzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd2l0aC1hdmF0YXJcIiksIGhhc0F2YXRhciksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hY3RpdmVcIiksIGFjdGl2ZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcm91bmRcIiksIHJvdW5kKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNscyxcbiAgICAgIHN0eWxlOiBzdHlsZVxuICAgIH0sIGF2YXRhck5vZGUsIGNvbnRlbnROb2RlKTtcbiAgfVxuICByZXR1cm4gdHlwZW9mIGNoaWxkcmVuICE9PSAndW5kZWZpbmVkJyA/IGNoaWxkcmVuIDogbnVsbDtcbn07XG5Ta2VsZXRvbi5CdXR0b24gPSBTa2VsZXRvbkJ1dHRvbjtcblNrZWxldG9uLkF2YXRhciA9IFNrZWxldG9uQXZhdGFyO1xuU2tlbGV0b24uSW5wdXQgPSBTa2VsZXRvbklucHV0O1xuU2tlbGV0b24uSW1hZ2UgPSBTa2VsZXRvbkltYWdlO1xuU2tlbGV0b24uTm9kZSA9IFNrZWxldG9uTm9kZTtcbmV4cG9ydCBkZWZhdWx0IFNrZWxldG9uOyIsIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIFBsdXNPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJkZWZzXCIsIFwiYXR0cnNcIjoge30sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJzdHlsZVwiLCBcImF0dHJzXCI6IHt9IH1dIH0sIHsgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNDgyIDE1Mmg2MHE4IDAgOCA4djcwNHEwIDgtOCA4aC02MHEtOCAwLTgtOFYxNjBxMC04IDgtOHpcIiB9IH0sIHsgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNMTc2IDQ3NGg2NzJxOCAwIDggOHY2MHEwIDgtOCA4SDE3NnEtOCAwLTgtOHYtNjBxMC04IDgtOHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcInBsdXNcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IFBsdXNPdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFBsdXNPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9QbHVzT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tICcuLi9jb21wb25lbnRzL0FudGRJY29uJztcbnZhciBQbHVzT3V0bGluZWQgPSBmdW5jdGlvbiBQbHVzT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IFBsdXNPdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuUGx1c091dGxpbmVkLmRpc3BsYXlOYW1lID0gJ1BsdXNPdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihQbHVzT3V0bGluZWQpOyIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovY3JlYXRlQ29udGV4dChudWxsKTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbnZhciBUYWJQYW5lID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKF9yZWYsIHJlZikge1xuICB2YXIgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBfcmVmLnN0eWxlLFxuICAgIGlkID0gX3JlZi5pZCxcbiAgICBhY3RpdmUgPSBfcmVmLmFjdGl2ZSxcbiAgICB0YWJLZXkgPSBfcmVmLnRhYktleSxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgaWQ6IGlkICYmIFwiXCIuY29uY2F0KGlkLCBcIi1wYW5lbC1cIikuY29uY2F0KHRhYktleSksXG4gICAgcm9sZTogXCJ0YWJwYW5lbFwiLFxuICAgIHRhYkluZGV4OiBhY3RpdmUgPyAwIDogLTEsXG4gICAgXCJhcmlhLWxhYmVsbGVkYnlcIjogaWQgJiYgXCJcIi5jb25jYXQoaWQsIFwiLXRhYi1cIikuY29uY2F0KHRhYktleSksXG4gICAgXCJhcmlhLWhpZGRlblwiOiAhYWN0aXZlLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBhY3RpdmUgJiYgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hY3RpdmVcIiksIGNsYXNzTmFtZSksXG4gICAgcmVmOiByZWZcbiAgfSwgY2hpbGRyZW4pO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBUYWJQYW5lLmRpc3BsYXlOYW1lID0gJ1RhYlBhbmUnO1xufVxuZXhwb3J0IGRlZmF1bHQgVGFiUGFuZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJrZXlcIiwgXCJmb3JjZVJlbmRlclwiLCBcInN0eWxlXCIsIFwiY2xhc3NOYW1lXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgQ1NTTW90aW9uIGZyb20gJ3JjLW1vdGlvbic7XG5pbXBvcnQgVGFiQ29udGV4dCBmcm9tIFwiLi4vVGFiQ29udGV4dFwiO1xuaW1wb3J0IFRhYlBhbmUgZnJvbSBcIi4vVGFiUGFuZVwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gVGFiUGFuZWxMaXN0KF9yZWYpIHtcbiAgdmFyIGlkID0gX3JlZi5pZCxcbiAgICBhY3RpdmVLZXkgPSBfcmVmLmFjdGl2ZUtleSxcbiAgICBhbmltYXRlZCA9IF9yZWYuYW5pbWF0ZWQsXG4gICAgdGFiUG9zaXRpb24gPSBfcmVmLnRhYlBvc2l0aW9uLFxuICAgIGRlc3Ryb3lJbmFjdGl2ZVRhYlBhbmUgPSBfcmVmLmRlc3Ryb3lJbmFjdGl2ZVRhYlBhbmU7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoVGFiQ29udGV4dCksXG4gICAgcHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQucHJlZml4Q2xzLFxuICAgIHRhYnMgPSBfUmVhY3QkdXNlQ29udGV4dC50YWJzO1xuICB2YXIgdGFiUGFuZUFuaW1hdGVkID0gYW5pbWF0ZWQudGFiUGFuZTtcbiAgdmFyIHRhYlBhbmVQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRhYnBhbmVcIik7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudC1ob2xkZXJcIikpXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50XCIpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbnRlbnQtXCIpLmNvbmNhdCh0YWJQb3NpdGlvbiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50LWFuaW1hdGVkXCIpLCB0YWJQYW5lQW5pbWF0ZWQpKVxuICB9LCB0YWJzLm1hcChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICB2YXIga2V5ID0gX3JlZjIua2V5LFxuICAgICAgZm9yY2VSZW5kZXIgPSBfcmVmMi5mb3JjZVJlbmRlcixcbiAgICAgIHBhbmVTdHlsZSA9IF9yZWYyLnN0eWxlLFxuICAgICAgcGFuZUNsYXNzTmFtZSA9IF9yZWYyLmNsYXNzTmFtZSxcbiAgICAgIHJlc3RUYWJQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmMiwgX2V4Y2x1ZGVkKTtcbiAgICB2YXIgYWN0aXZlID0ga2V5ID09PSBhY3RpdmVLZXk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbiwgX2V4dGVuZHMoe1xuICAgICAga2V5OiBrZXksXG4gICAgICB2aXNpYmxlOiBhY3RpdmUsXG4gICAgICBmb3JjZVJlbmRlcjogZm9yY2VSZW5kZXIsXG4gICAgICByZW1vdmVPbkxlYXZlOiAhIWRlc3Ryb3lJbmFjdGl2ZVRhYlBhbmUsXG4gICAgICBsZWF2ZWRDbGFzc05hbWU6IFwiXCIuY29uY2F0KHRhYlBhbmVQcmVmaXhDbHMsIFwiLWhpZGRlblwiKVxuICAgIH0sIGFuaW1hdGVkLnRhYlBhbmVNb3Rpb24pLCBmdW5jdGlvbiAoX3JlZjMsIHJlZikge1xuICAgICAgdmFyIG1vdGlvblN0eWxlID0gX3JlZjMuc3R5bGUsXG4gICAgICAgIG1vdGlvbkNsYXNzTmFtZSA9IF9yZWYzLmNsYXNzTmFtZTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUYWJQYW5lLCBfZXh0ZW5kcyh7fSwgcmVzdFRhYlByb3BzLCB7XG4gICAgICAgIHByZWZpeENsczogdGFiUGFuZVByZWZpeENscyxcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICB0YWJLZXk6IGtleSxcbiAgICAgICAgYW5pbWF0ZWQ6IHRhYlBhbmVBbmltYXRlZCxcbiAgICAgICAgYWN0aXZlOiBhY3RpdmUsXG4gICAgICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHBhbmVTdHlsZSksIG1vdGlvblN0eWxlKSxcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHBhbmVDbGFzc05hbWUsIG1vdGlvbkNsYXNzTmFtZSksXG4gICAgICAgIHJlZjogcmVmXG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH0pKSk7XG59IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG52YXIgREVGQVVMVF9TSVpFID0ge1xuICB3aWR0aDogMCxcbiAgaGVpZ2h0OiAwLFxuICBsZWZ0OiAwLFxuICB0b3A6IDBcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VPZmZzZXRzKHRhYnMsIHRhYlNpemVzLCBob2xkZXJTY3JvbGxXaWR0aCkge1xuICByZXR1cm4gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF90YWJzJDtcbiAgICB2YXIgbWFwID0gbmV3IE1hcCgpO1xuICAgIHZhciBsYXN0T2Zmc2V0ID0gdGFiU2l6ZXMuZ2V0KChfdGFicyQgPSB0YWJzWzBdKSA9PT0gbnVsbCB8fCBfdGFicyQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90YWJzJC5rZXkpIHx8IERFRkFVTFRfU0laRTtcbiAgICB2YXIgcmlnaHRPZmZzZXQgPSBsYXN0T2Zmc2V0LmxlZnQgKyBsYXN0T2Zmc2V0LndpZHRoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdmFyIGtleSA9IHRhYnNbaV0ua2V5O1xuICAgICAgdmFyIGRhdGEgPSB0YWJTaXplcy5nZXQoa2V5KTtcblxuICAgICAgLy8gUmV1c2UgbGFzdCBvbmUgd2hlbiBub3QgZXhpc3QgeWV0XG4gICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgdmFyIF90YWJzO1xuICAgICAgICBkYXRhID0gdGFiU2l6ZXMuZ2V0KChfdGFicyA9IHRhYnNbaSAtIDFdKSA9PT0gbnVsbCB8fCBfdGFicyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RhYnMua2V5KSB8fCBERUZBVUxUX1NJWkU7XG4gICAgICB9XG4gICAgICB2YXIgZW50aXR5ID0gbWFwLmdldChrZXkpIHx8IF9vYmplY3RTcHJlYWQoe30sIGRhdGEpO1xuXG4gICAgICAvLyBSaWdodFxuICAgICAgZW50aXR5LnJpZ2h0ID0gcmlnaHRPZmZzZXQgLSBlbnRpdHkubGVmdCAtIGVudGl0eS53aWR0aDtcblxuICAgICAgLy8gVXBkYXRlIGVudGl0eVxuICAgICAgbWFwLnNldChrZXksIGVudGl0eSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH0sIFt0YWJzLm1hcChmdW5jdGlvbiAodGFiKSB7XG4gICAgcmV0dXJuIHRhYi5rZXk7XG4gIH0pLmpvaW4oJ18nKSwgdGFiU2l6ZXMsIGhvbGRlclNjcm9sbFdpZHRoXSk7XG59IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTeW5jU3RhdGUoZGVmYXVsdFN0YXRlLCBvbkNoYW5nZSkge1xuICB2YXIgc3RhdGVSZWYgPSBSZWFjdC51c2VSZWYoZGVmYXVsdFN0YXRlKTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKHt9KSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBmb3JjZVVwZGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIGZ1bmN0aW9uIHNldFN0YXRlKHVwZGF0ZXIpIHtcbiAgICB2YXIgbmV3VmFsdWUgPSB0eXBlb2YgdXBkYXRlciA9PT0gJ2Z1bmN0aW9uJyA/IHVwZGF0ZXIoc3RhdGVSZWYuY3VycmVudCkgOiB1cGRhdGVyO1xuICAgIGlmIChuZXdWYWx1ZSAhPT0gc3RhdGVSZWYuY3VycmVudCkge1xuICAgICAgb25DaGFuZ2UobmV3VmFsdWUsIHN0YXRlUmVmLmN1cnJlbnQpO1xuICAgIH1cbiAgICBzdGF0ZVJlZi5jdXJyZW50ID0gbmV3VmFsdWU7XG4gICAgZm9yY2VVcGRhdGUoe30pO1xuICB9XG4gIHJldHVybiBbc3RhdGVSZWYuY3VycmVudCwgc2V0U3RhdGVdO1xufSIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlU3RhdGUsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbnZhciBNSU5fU1dJUEVfRElTVEFOQ0UgPSAwLjE7XG52YXIgU1RPUF9TV0lQRV9ESVNUQU5DRSA9IDAuMDE7XG52YXIgUkVGUkVTSF9JTlRFUlZBTCA9IDIwO1xudmFyIFNQRUVEX09GRl9NVUxUSVBMRSA9IE1hdGgucG93KDAuOTk1LCBSRUZSRVNIX0lOVEVSVkFMKTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEhvb2sgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VUb3VjaE1vdmUocmVmLCBvbk9mZnNldCkge1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoKSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICB0b3VjaFBvc2l0aW9uID0gX3VzZVN0YXRlMlswXSxcbiAgICBzZXRUb3VjaFBvc2l0aW9uID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZSgwKSxcbiAgICBfdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlMywgMiksXG4gICAgbGFzdFRpbWVzdGFtcCA9IF91c2VTdGF0ZTRbMF0sXG4gICAgc2V0TGFzdFRpbWVzdGFtcCA9IF91c2VTdGF0ZTRbMV07XG4gIHZhciBfdXNlU3RhdGU1ID0gdXNlU3RhdGUoMCksXG4gICAgX3VzZVN0YXRlNiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTUsIDIpLFxuICAgIGxhc3RUaW1lRGlmZiA9IF91c2VTdGF0ZTZbMF0sXG4gICAgc2V0TGFzdFRpbWVEaWZmID0gX3VzZVN0YXRlNlsxXTtcbiAgdmFyIF91c2VTdGF0ZTcgPSB1c2VTdGF0ZSgpLFxuICAgIF91c2VTdGF0ZTggPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGU3LCAyKSxcbiAgICBsYXN0T2Zmc2V0ID0gX3VzZVN0YXRlOFswXSxcbiAgICBzZXRMYXN0T2Zmc2V0ID0gX3VzZVN0YXRlOFsxXTtcbiAgdmFyIG1vdGlvblJlZiA9IHVzZVJlZigpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gRXZlbnRzID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPj4+IFRvdWNoIGV2ZW50c1xuICBmdW5jdGlvbiBvblRvdWNoU3RhcnQoZSkge1xuICAgIHZhciBfZSR0b3VjaGVzJCA9IGUudG91Y2hlc1swXSxcbiAgICAgIHNjcmVlblggPSBfZSR0b3VjaGVzJC5zY3JlZW5YLFxuICAgICAgc2NyZWVuWSA9IF9lJHRvdWNoZXMkLnNjcmVlblk7XG4gICAgc2V0VG91Y2hQb3NpdGlvbih7XG4gICAgICB4OiBzY3JlZW5YLFxuICAgICAgeTogc2NyZWVuWVxuICAgIH0pO1xuICAgIHdpbmRvdy5jbGVhckludGVydmFsKG1vdGlvblJlZi5jdXJyZW50KTtcbiAgfVxuICBmdW5jdGlvbiBvblRvdWNoTW92ZShlKSB7XG4gICAgaWYgKCF0b3VjaFBvc2l0aW9uKSByZXR1cm47XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHZhciBfZSR0b3VjaGVzJDIgPSBlLnRvdWNoZXNbMF0sXG4gICAgICBzY3JlZW5YID0gX2UkdG91Y2hlcyQyLnNjcmVlblgsXG4gICAgICBzY3JlZW5ZID0gX2UkdG91Y2hlcyQyLnNjcmVlblk7XG4gICAgc2V0VG91Y2hQb3NpdGlvbih7XG4gICAgICB4OiBzY3JlZW5YLFxuICAgICAgeTogc2NyZWVuWVxuICAgIH0pO1xuICAgIHZhciBvZmZzZXRYID0gc2NyZWVuWCAtIHRvdWNoUG9zaXRpb24ueDtcbiAgICB2YXIgb2Zmc2V0WSA9IHNjcmVlblkgLSB0b3VjaFBvc2l0aW9uLnk7XG4gICAgb25PZmZzZXQob2Zmc2V0WCwgb2Zmc2V0WSk7XG4gICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgc2V0TGFzdFRpbWVzdGFtcChub3cpO1xuICAgIHNldExhc3RUaW1lRGlmZihub3cgLSBsYXN0VGltZXN0YW1wKTtcbiAgICBzZXRMYXN0T2Zmc2V0KHtcbiAgICAgIHg6IG9mZnNldFgsXG4gICAgICB5OiBvZmZzZXRZXG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gb25Ub3VjaEVuZCgpIHtcbiAgICBpZiAoIXRvdWNoUG9zaXRpb24pIHJldHVybjtcbiAgICBzZXRUb3VjaFBvc2l0aW9uKG51bGwpO1xuICAgIHNldExhc3RPZmZzZXQobnVsbCk7XG5cbiAgICAvLyBTd2lwZSBpZiBuZWVkZWRcbiAgICBpZiAobGFzdE9mZnNldCkge1xuICAgICAgdmFyIGRpc3RhbmNlWCA9IGxhc3RPZmZzZXQueCAvIGxhc3RUaW1lRGlmZjtcbiAgICAgIHZhciBkaXN0YW5jZVkgPSBsYXN0T2Zmc2V0LnkgLyBsYXN0VGltZURpZmY7XG4gICAgICB2YXIgYWJzWCA9IE1hdGguYWJzKGRpc3RhbmNlWCk7XG4gICAgICB2YXIgYWJzWSA9IE1hdGguYWJzKGRpc3RhbmNlWSk7XG5cbiAgICAgIC8vIFNraXAgc3dpcGUgaWYgbG93IGRpc3RhbmNlXG4gICAgICBpZiAoTWF0aC5tYXgoYWJzWCwgYWJzWSkgPCBNSU5fU1dJUEVfRElTVEFOQ0UpIHJldHVybjtcbiAgICAgIHZhciBjdXJyZW50WCA9IGRpc3RhbmNlWDtcbiAgICAgIHZhciBjdXJyZW50WSA9IGRpc3RhbmNlWTtcbiAgICAgIG1vdGlvblJlZi5jdXJyZW50ID0gd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKE1hdGguYWJzKGN1cnJlbnRYKSA8IFNUT1BfU1dJUEVfRElTVEFOQ0UgJiYgTWF0aC5hYnMoY3VycmVudFkpIDwgU1RPUF9TV0lQRV9ESVNUQU5DRSkge1xuICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKG1vdGlvblJlZi5jdXJyZW50KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudFggKj0gU1BFRURfT0ZGX01VTFRJUExFO1xuICAgICAgICBjdXJyZW50WSAqPSBTUEVFRF9PRkZfTVVMVElQTEU7XG4gICAgICAgIG9uT2Zmc2V0KGN1cnJlbnRYICogUkVGUkVTSF9JTlRFUlZBTCwgY3VycmVudFkgKiBSRUZSRVNIX0lOVEVSVkFMKTtcbiAgICAgIH0sIFJFRlJFU0hfSU5URVJWQUwpO1xuICAgIH1cbiAgfVxuXG4gIC8vID4+PiBXaGVlbCBldmVudFxuICB2YXIgbGFzdFdoZWVsRGlyZWN0aW9uUmVmID0gdXNlUmVmKCk7XG4gIGZ1bmN0aW9uIG9uV2hlZWwoZSkge1xuICAgIHZhciBkZWx0YVggPSBlLmRlbHRhWCxcbiAgICAgIGRlbHRhWSA9IGUuZGVsdGFZO1xuXG4gICAgLy8gQ29udmVydCBib3RoIHRvIHggJiB5IHNpbmNlIHdoZWVsIG9ubHkgaGFwcGVuZWQgb24gUENcbiAgICB2YXIgbWl4ZWQgPSAwO1xuICAgIHZhciBhYnNYID0gTWF0aC5hYnMoZGVsdGFYKTtcbiAgICB2YXIgYWJzWSA9IE1hdGguYWJzKGRlbHRhWSk7XG4gICAgaWYgKGFic1ggPT09IGFic1kpIHtcbiAgICAgIG1peGVkID0gbGFzdFdoZWVsRGlyZWN0aW9uUmVmLmN1cnJlbnQgPT09ICd4JyA/IGRlbHRhWCA6IGRlbHRhWTtcbiAgICB9IGVsc2UgaWYgKGFic1ggPiBhYnNZKSB7XG4gICAgICBtaXhlZCA9IGRlbHRhWDtcbiAgICAgIGxhc3RXaGVlbERpcmVjdGlvblJlZi5jdXJyZW50ID0gJ3gnO1xuICAgIH0gZWxzZSB7XG4gICAgICBtaXhlZCA9IGRlbHRhWTtcbiAgICAgIGxhc3RXaGVlbERpcmVjdGlvblJlZi5jdXJyZW50ID0gJ3knO1xuICAgIH1cbiAgICBpZiAob25PZmZzZXQoLW1peGVkLCAtbWl4ZWQpKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgdG91Y2hFdmVudHNSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHRvdWNoRXZlbnRzUmVmLmN1cnJlbnQgPSB7XG4gICAgb25Ub3VjaFN0YXJ0OiBvblRvdWNoU3RhcnQsXG4gICAgb25Ub3VjaE1vdmU6IG9uVG91Y2hNb3ZlLFxuICAgIG9uVG91Y2hFbmQ6IG9uVG91Y2hFbmQsXG4gICAgb25XaGVlbDogb25XaGVlbFxuICB9O1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIG9uUHJveHlUb3VjaFN0YXJ0KGUpIHtcbiAgICAgIHRvdWNoRXZlbnRzUmVmLmN1cnJlbnQub25Ub3VjaFN0YXJ0KGUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBvblByb3h5VG91Y2hNb3ZlKGUpIHtcbiAgICAgIHRvdWNoRXZlbnRzUmVmLmN1cnJlbnQub25Ub3VjaE1vdmUoZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uUHJveHlUb3VjaEVuZChlKSB7XG4gICAgICB0b3VjaEV2ZW50c1JlZi5jdXJyZW50Lm9uVG91Y2hFbmQoZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uUHJveHlXaGVlbChlKSB7XG4gICAgICB0b3VjaEV2ZW50c1JlZi5jdXJyZW50Lm9uV2hlZWwoZSk7XG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uUHJveHlUb3VjaE1vdmUsIHtcbiAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvblByb3h5VG91Y2hFbmQsIHtcbiAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgfSk7XG5cbiAgICAvLyBObyBuZWVkIHRvIGNsZWFuIHVwIHNpbmNlIGVsZW1lbnQgcmVtb3ZlZFxuICAgIHJlZi5jdXJyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblByb3h5VG91Y2hTdGFydCwge1xuICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICB9KTtcbiAgICByZWYuY3VycmVudC5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIG9uUHJveHlXaGVlbCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uUHJveHlUb3VjaE1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvblByb3h5VG91Y2hFbmQpO1xuICAgIH07XG4gIH0sIFtdKTtcbn0iLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCB7IHVzZUxheW91dFVwZGF0ZUVmZmVjdCB9IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xuaW1wb3J0IHsgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcblxuLyoqXG4gKiBIZWxwIHRvIG1lcmdlIGNhbGxiYWNrIHdpdGggYHVzZUxheW91dEVmZmVjdGAuXG4gKiBPbmUgdGltZSB3aWxsIG9ubHkgdHJpZ2dlciBvbmNlLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VVcGRhdGUoY2FsbGJhY2spIHtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKDApLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGNvdW50ID0gX3VzZVN0YXRlMlswXSxcbiAgICBzZXRDb3VudCA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciBlZmZlY3RSZWYgPSB1c2VSZWYoMCk7XG4gIHZhciBjYWxsYmFja1JlZiA9IHVzZVJlZigpO1xuICBjYWxsYmFja1JlZi5jdXJyZW50ID0gY2FsbGJhY2s7XG5cbiAgLy8gVHJpZ2dlciBvbiBgdXNlTGF5b3V0RWZmZWN0YFxuICB1c2VMYXlvdXRVcGRhdGVFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBfY2FsbGJhY2tSZWYkY3VycmVudDtcbiAgICAoX2NhbGxiYWNrUmVmJGN1cnJlbnQgPSBjYWxsYmFja1JlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfY2FsbGJhY2tSZWYkY3VycmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2NhbGxiYWNrUmVmJGN1cnJlbnQuY2FsbChjYWxsYmFja1JlZik7XG4gIH0sIFtjb3VudF0pO1xuXG4gIC8vIFRyaWdnZXIgdG8gdXBkYXRlIGNvdW50XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGVmZmVjdFJlZi5jdXJyZW50ICE9PSBjb3VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZmZlY3RSZWYuY3VycmVudCArPSAxO1xuICAgIHNldENvdW50KGVmZmVjdFJlZi5jdXJyZW50KTtcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1c2VVcGRhdGVTdGF0ZShkZWZhdWx0U3RhdGUpIHtcbiAgdmFyIGJhdGNoUmVmID0gdXNlUmVmKFtdKTtcbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZSh7fSksXG4gICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgIGZvcmNlVXBkYXRlID0gX3VzZVN0YXRlNFsxXTtcbiAgdmFyIHN0YXRlID0gdXNlUmVmKHR5cGVvZiBkZWZhdWx0U3RhdGUgPT09ICdmdW5jdGlvbicgPyBkZWZhdWx0U3RhdGUoKSA6IGRlZmF1bHRTdGF0ZSk7XG4gIHZhciBmbHVzaFVwZGF0ZSA9IHVzZVVwZGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBzdGF0ZS5jdXJyZW50O1xuICAgIGJhdGNoUmVmLmN1cnJlbnQuZm9yRWFjaChmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIGN1cnJlbnQgPSBjYWxsYmFjayhjdXJyZW50KTtcbiAgICB9KTtcbiAgICBiYXRjaFJlZi5jdXJyZW50ID0gW107XG4gICAgc3RhdGUuY3VycmVudCA9IGN1cnJlbnQ7XG4gICAgZm9yY2VVcGRhdGUoe30pO1xuICB9KTtcbiAgZnVuY3Rpb24gdXBkYXRlcihjYWxsYmFjaykge1xuICAgIGJhdGNoUmVmLmN1cnJlbnQucHVzaChjYWxsYmFjayk7XG4gICAgZmx1c2hVcGRhdGUoKTtcbiAgfVxuICByZXR1cm4gW3N0YXRlLmN1cnJlbnQsIHVwZGF0ZXJdO1xufSIsImltcG9ydCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG52YXIgREVGQVVMVF9TSVpFID0ge1xuICB3aWR0aDogMCxcbiAgaGVpZ2h0OiAwLFxuICBsZWZ0OiAwLFxuICB0b3A6IDAsXG4gIHJpZ2h0OiAwXG59O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlVmlzaWJsZVJhbmdlKHRhYk9mZnNldHMsIHZpc2libGVUYWJDb250ZW50VmFsdWUsIHRyYW5zZm9ybSwgdGFiQ29udGVudFNpemVWYWx1ZSwgYWRkTm9kZVNpemVWYWx1ZSwgb3BlcmF0aW9uTm9kZVNpemVWYWx1ZSwgX3JlZikge1xuICB2YXIgdGFicyA9IF9yZWYudGFicyxcbiAgICB0YWJQb3NpdGlvbiA9IF9yZWYudGFiUG9zaXRpb24sXG4gICAgcnRsID0gX3JlZi5ydGw7XG4gIHZhciBjaGFyVW5pdDtcbiAgdmFyIHBvc2l0aW9uO1xuICB2YXIgdHJhbnNmb3JtU2l6ZTtcbiAgaWYgKFsndG9wJywgJ2JvdHRvbSddLmluY2x1ZGVzKHRhYlBvc2l0aW9uKSkge1xuICAgIGNoYXJVbml0ID0gJ3dpZHRoJztcbiAgICBwb3NpdGlvbiA9IHJ0bCA/ICdyaWdodCcgOiAnbGVmdCc7XG4gICAgdHJhbnNmb3JtU2l6ZSA9IE1hdGguYWJzKHRyYW5zZm9ybSk7XG4gIH0gZWxzZSB7XG4gICAgY2hhclVuaXQgPSAnaGVpZ2h0JztcbiAgICBwb3NpdGlvbiA9ICd0b3AnO1xuICAgIHRyYW5zZm9ybVNpemUgPSAtdHJhbnNmb3JtO1xuICB9XG4gIHJldHVybiB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRhYnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gWzAsIDBdO1xuICAgIH1cbiAgICB2YXIgbGVuID0gdGFicy5sZW5ndGg7XG4gICAgdmFyIGVuZEluZGV4ID0gbGVuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgIHZhciBvZmZzZXQgPSB0YWJPZmZzZXRzLmdldCh0YWJzW2ldLmtleSkgfHwgREVGQVVMVF9TSVpFO1xuICAgICAgaWYgKG9mZnNldFtwb3NpdGlvbl0gKyBvZmZzZXRbY2hhclVuaXRdID4gdHJhbnNmb3JtU2l6ZSArIHZpc2libGVUYWJDb250ZW50VmFsdWUpIHtcbiAgICAgICAgZW5kSW5kZXggPSBpIC0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBzdGFydEluZGV4ID0gMDtcbiAgICBmb3IgKHZhciBfaSA9IGxlbiAtIDE7IF9pID49IDA7IF9pIC09IDEpIHtcbiAgICAgIHZhciBfb2Zmc2V0ID0gdGFiT2Zmc2V0cy5nZXQodGFic1tfaV0ua2V5KSB8fCBERUZBVUxUX1NJWkU7XG4gICAgICBpZiAoX29mZnNldFtwb3NpdGlvbl0gPCB0cmFuc2Zvcm1TaXplKSB7XG4gICAgICAgIHN0YXJ0SW5kZXggPSBfaSArIDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3N0YXJ0SW5kZXgsIGVuZEluZGV4XTtcbiAgfSwgW3RhYk9mZnNldHMsIHZpc2libGVUYWJDb250ZW50VmFsdWUsIHRhYkNvbnRlbnRTaXplVmFsdWUsIGFkZE5vZGVTaXplVmFsdWUsIG9wZXJhdGlvbk5vZGVTaXplVmFsdWUsIHRyYW5zZm9ybVNpemUsIHRhYlBvc2l0aW9uLCB0YWJzLm1hcChmdW5jdGlvbiAodGFiKSB7XG4gICAgcmV0dXJuIHRhYi5rZXk7XG4gIH0pLmpvaW4oJ18nKSwgcnRsXSk7XG59IiwiLyoqXG4gKiBXZSB0cmFkZSBNYXAgYXMgZGVwcyB3aGljaCBtYXkgY2hhbmdlIHdpdGggc2FtZSB2YWx1ZSBidXQgZGlmZmVyZW50IHJlZiBvYmplY3QuXG4gKiBXZSBzaG91bGQgbWFrZSBpdCBhcyBoYXNoIGZvciBkZXBzXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeShvYmopIHtcbiAgdmFyIHRndDtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIE1hcCkge1xuICAgIHRndCA9IHt9O1xuICAgIG9iai5mb3JFYWNoKGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICB0Z3Rba10gPSB2O1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRndCA9IG9iajtcbiAgfVxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGd0KTtcbn1cbnZhciBSQ19UQUJTX0RPVUJMRV9RVU9URSA9ICdUQUJTX0RRJztcbmV4cG9ydCBmdW5jdGlvbiBnZW5EYXRhTm9kZUtleShrZXkpIHtcbiAgcmV0dXJuIFN0cmluZyhrZXkpLnJlcGxhY2UoL1wiL2csIFJDX1RBQlNfRE9VQkxFX1FVT1RFKTtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5mdW5jdGlvbiBBZGRCdXR0b24oX3JlZiwgcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICBlZGl0YWJsZSA9IF9yZWYuZWRpdGFibGUsXG4gICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsXG4gICAgc3R5bGUgPSBfcmVmLnN0eWxlO1xuICBpZiAoIWVkaXRhYmxlIHx8IGVkaXRhYmxlLnNob3dBZGQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICByZWY6IHJlZixcbiAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1uYXYtYWRkXCIpLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBcImFyaWEtbGFiZWxcIjogKGxvY2FsZSA9PT0gbnVsbCB8fCBsb2NhbGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxvY2FsZS5hZGRBcmlhTGFiZWwpIHx8ICdBZGQgdGFiJyxcbiAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGV2ZW50KSB7XG4gICAgICBlZGl0YWJsZS5vbkVkaXQoJ2FkZCcsIHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIGVkaXRhYmxlLmFkZEljb24gfHwgJysnKTtcbn1cbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEFkZEJ1dHRvbik7IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIEV4dHJhQ29udGVudCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChfcmVmLCByZWYpIHtcbiAgdmFyIHBvc2l0aW9uID0gX3JlZi5wb3NpdGlvbixcbiAgICBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICBleHRyYSA9IF9yZWYuZXh0cmE7XG4gIGlmICghZXh0cmEpIHJldHVybiBudWxsO1xuICB2YXIgY29udGVudDtcblxuICAvLyBQYXJzZSBleHRyYVxuICB2YXIgYXNzZXJ0RXh0cmEgPSB7fTtcbiAgaWYgKF90eXBlb2YoZXh0cmEpID09PSAnb2JqZWN0JyAmJiAhIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChleHRyYSkpIHtcbiAgICBhc3NlcnRFeHRyYSA9IGV4dHJhO1xuICB9IGVsc2Uge1xuICAgIGFzc2VydEV4dHJhLnJpZ2h0ID0gZXh0cmE7XG4gIH1cbiAgaWYgKHBvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgY29udGVudCA9IGFzc2VydEV4dHJhLnJpZ2h0O1xuICB9XG4gIGlmIChwb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgY29udGVudCA9IGFzc2VydEV4dHJhLmxlZnQ7XG4gIH1cbiAgcmV0dXJuIGNvbnRlbnQgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWV4dHJhLWNvbnRlbnRcIiksXG4gICAgcmVmOiByZWZcbiAgfSwgY29udGVudCkgOiBudWxsO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBFeHRyYUNvbnRlbnQuZGlzcGxheU5hbWUgPSAnRXh0cmFDb250ZW50Jztcbn1cbmV4cG9ydCBkZWZhdWx0IEV4dHJhQ29udGVudDsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBEcm9wZG93biBmcm9tICdyYy1kcm9wZG93bic7XG5pbXBvcnQgTWVudSwgeyBNZW51SXRlbSB9IGZyb20gJ3JjLW1lbnUnO1xuaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBZGRCdXR0b24gZnJvbSBcIi4vQWRkQnV0dG9uXCI7XG5mdW5jdGlvbiBPcGVyYXRpb25Ob2RlKF9yZWYsIHJlZikge1xuICB2YXIgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgaWQgPSBfcmVmLmlkLFxuICAgIHRhYnMgPSBfcmVmLnRhYnMsXG4gICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsXG4gICAgbW9iaWxlID0gX3JlZi5tb2JpbGUsXG4gICAgX3JlZiRtb3JlSWNvbiA9IF9yZWYubW9yZUljb24sXG4gICAgbW9yZUljb24gPSBfcmVmJG1vcmVJY29uID09PSB2b2lkIDAgPyAnTW9yZScgOiBfcmVmJG1vcmVJY29uLFxuICAgIG1vcmVUcmFuc2l0aW9uTmFtZSA9IF9yZWYubW9yZVRyYW5zaXRpb25OYW1lLFxuICAgIHN0eWxlID0gX3JlZi5zdHlsZSxcbiAgICBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICBlZGl0YWJsZSA9IF9yZWYuZWRpdGFibGUsXG4gICAgdGFiQmFyR3V0dGVyID0gX3JlZi50YWJCYXJHdXR0ZXIsXG4gICAgcnRsID0gX3JlZi5ydGwsXG4gICAgcmVtb3ZlQXJpYUxhYmVsID0gX3JlZi5yZW1vdmVBcmlhTGFiZWwsXG4gICAgb25UYWJDbGljayA9IF9yZWYub25UYWJDbGljayxcbiAgICBnZXRQb3B1cENvbnRhaW5lciA9IF9yZWYuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgcG9wdXBDbGFzc05hbWUgPSBfcmVmLnBvcHVwQ2xhc3NOYW1lO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gRHJvcGRvd24gPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShmYWxzZSksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgb3BlbiA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0T3BlbiA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciBfdXNlU3RhdGUzID0gdXNlU3RhdGUobnVsbCksXG4gICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgIHNlbGVjdGVkS2V5ID0gX3VzZVN0YXRlNFswXSxcbiAgICBzZXRTZWxlY3RlZEtleSA9IF91c2VTdGF0ZTRbMV07XG4gIHZhciBwb3B1cElkID0gXCJcIi5jb25jYXQoaWQsIFwiLW1vcmUtcG9wdXBcIik7XG4gIHZhciBkcm9wZG93blByZWZpeCA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZHJvcGRvd25cIik7XG4gIHZhciBzZWxlY3RlZEl0ZW1JZCA9IHNlbGVjdGVkS2V5ICE9PSBudWxsID8gXCJcIi5jb25jYXQocG9wdXBJZCwgXCItXCIpLmNvbmNhdChzZWxlY3RlZEtleSkgOiBudWxsO1xuICB2YXIgZHJvcGRvd25BcmlhTGFiZWwgPSBsb2NhbGUgPT09IG51bGwgfHwgbG9jYWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsb2NhbGUuZHJvcGRvd25BcmlhTGFiZWw7XG4gIGZ1bmN0aW9uIG9uUmVtb3ZlVGFiKGV2ZW50LCBrZXkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGVkaXRhYmxlLm9uRWRpdCgncmVtb3ZlJywge1xuICAgICAga2V5OiBrZXksXG4gICAgICBldmVudDogZXZlbnRcbiAgICB9KTtcbiAgfVxuICB2YXIgbWVudSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1lbnUsIHtcbiAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKF9yZWYyKSB7XG4gICAgICB2YXIga2V5ID0gX3JlZjIua2V5LFxuICAgICAgICBkb21FdmVudCA9IF9yZWYyLmRvbUV2ZW50O1xuICAgICAgb25UYWJDbGljayhrZXksIGRvbUV2ZW50KTtcbiAgICAgIHNldE9wZW4oZmFsc2UpO1xuICAgIH0sXG4gICAgcHJlZml4Q2xzOiBcIlwiLmNvbmNhdChkcm9wZG93blByZWZpeCwgXCItbWVudVwiKSxcbiAgICBpZDogcG9wdXBJZCxcbiAgICB0YWJJbmRleDogLTEsXG4gICAgcm9sZTogXCJsaXN0Ym94XCIsXG4gICAgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIjogc2VsZWN0ZWRJdGVtSWQsXG4gICAgc2VsZWN0ZWRLZXlzOiBbc2VsZWN0ZWRLZXldLFxuICAgIFwiYXJpYS1sYWJlbFwiOiBkcm9wZG93bkFyaWFMYWJlbCAhPT0gdW5kZWZpbmVkID8gZHJvcGRvd25BcmlhTGFiZWwgOiAnZXhwYW5kZWQgZHJvcGRvd24nXG4gIH0sIHRhYnMubWFwKGZ1bmN0aW9uICh0YWIpIHtcbiAgICB2YXIgcmVtb3ZhYmxlID0gZWRpdGFibGUgJiYgdGFiLmNsb3NhYmxlICE9PSBmYWxzZSAmJiAhdGFiLmRpc2FibGVkO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNZW51SXRlbSwge1xuICAgICAga2V5OiB0YWIua2V5LFxuICAgICAgaWQ6IFwiXCIuY29uY2F0KHBvcHVwSWQsIFwiLVwiKS5jb25jYXQodGFiLmtleSksXG4gICAgICByb2xlOiBcIm9wdGlvblwiLFxuICAgICAgXCJhcmlhLWNvbnRyb2xzXCI6IGlkICYmIFwiXCIuY29uY2F0KGlkLCBcIi1wYW5lbC1cIikuY29uY2F0KHRhYi5rZXkpLFxuICAgICAgZGlzYWJsZWQ6IHRhYi5kaXNhYmxlZFxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCB0YWIubGFiZWwpLCByZW1vdmFibGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgIFwiYXJpYS1sYWJlbFwiOiByZW1vdmVBcmlhTGFiZWwgfHwgJ3JlbW92ZScsXG4gICAgICB0YWJJbmRleDogMCxcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoZHJvcGRvd25QcmVmaXgsIFwiLW1lbnUtaXRlbS1yZW1vdmVcIiksXG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgb25SZW1vdmVUYWIoZSwgdGFiLmtleSk7XG4gICAgICB9XG4gICAgfSwgdGFiLmNsb3NlSWNvbiB8fCBlZGl0YWJsZS5yZW1vdmVJY29uIHx8ICfDlycpKTtcbiAgfSkpO1xuICBmdW5jdGlvbiBzZWxlY3RPZmZzZXQob2Zmc2V0KSB7XG4gICAgdmFyIGVuYWJsZWRUYWJzID0gdGFicy5maWx0ZXIoZnVuY3Rpb24gKHRhYikge1xuICAgICAgcmV0dXJuICF0YWIuZGlzYWJsZWQ7XG4gICAgfSk7XG4gICAgdmFyIHNlbGVjdGVkSW5kZXggPSBlbmFibGVkVGFicy5maW5kSW5kZXgoZnVuY3Rpb24gKHRhYikge1xuICAgICAgcmV0dXJuIHRhYi5rZXkgPT09IHNlbGVjdGVkS2V5O1xuICAgIH0pIHx8IDA7XG4gICAgdmFyIGxlbiA9IGVuYWJsZWRUYWJzLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICBzZWxlY3RlZEluZGV4ID0gKHNlbGVjdGVkSW5kZXggKyBvZmZzZXQgKyBsZW4pICUgbGVuO1xuICAgICAgdmFyIHRhYiA9IGVuYWJsZWRUYWJzW3NlbGVjdGVkSW5kZXhdO1xuICAgICAgaWYgKCF0YWIuZGlzYWJsZWQpIHtcbiAgICAgICAgc2V0U2VsZWN0ZWRLZXkodGFiLmtleSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gb25LZXlEb3duKGUpIHtcbiAgICB2YXIgd2hpY2ggPSBlLndoaWNoO1xuICAgIGlmICghb3Blbikge1xuICAgICAgaWYgKFtLZXlDb2RlLkRPV04sIEtleUNvZGUuU1BBQ0UsIEtleUNvZGUuRU5URVJdLmluY2x1ZGVzKHdoaWNoKSkge1xuICAgICAgICBzZXRPcGVuKHRydWUpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXRjaCAod2hpY2gpIHtcbiAgICAgIGNhc2UgS2V5Q29kZS5VUDpcbiAgICAgICAgc2VsZWN0T2Zmc2V0KC0xKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgS2V5Q29kZS5ET1dOOlxuICAgICAgICBzZWxlY3RPZmZzZXQoMSk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEtleUNvZGUuRVNDOlxuICAgICAgICBzZXRPcGVuKGZhbHNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEtleUNvZGUuU1BBQ0U6XG4gICAgICBjYXNlIEtleUNvZGUuRU5URVI6XG4gICAgICAgIGlmIChzZWxlY3RlZEtleSAhPT0gbnVsbCkgb25UYWJDbGljayhzZWxlY3RlZEtleSwgZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gRWZmZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBXZSB1c2UgcXVlcnkgZWxlbWVudCBoZXJlIHRvIGF2b2lkIFJlYWN0IHN0cmljdCB3YXJuaW5nXG4gICAgdmFyIGVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGVjdGVkSXRlbUlkKTtcbiAgICBpZiAoZWxlICYmIGVsZS5zY3JvbGxJbnRvVmlldykge1xuICAgICAgZWxlLnNjcm9sbEludG9WaWV3KGZhbHNlKTtcbiAgICB9XG4gIH0sIFtzZWxlY3RlZEtleV0pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghb3Blbikge1xuICAgICAgc2V0U2VsZWN0ZWRLZXkobnVsbCk7XG4gICAgfVxuICB9LCBbb3Blbl0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG1vcmVTdHlsZSA9IF9kZWZpbmVQcm9wZXJ0eSh7fSwgcnRsID8gJ21hcmdpblJpZ2h0JyA6ICdtYXJnaW5MZWZ0JywgdGFiQmFyR3V0dGVyKTtcbiAgaWYgKCF0YWJzLmxlbmd0aCkge1xuICAgIG1vcmVTdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgbW9yZVN0eWxlLm9yZGVyID0gMTtcbiAgfVxuICB2YXIgb3ZlcmxheUNsYXNzTmFtZSA9IGNsYXNzTmFtZXMoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChkcm9wZG93blByZWZpeCwgXCItcnRsXCIpLCBydGwpKTtcbiAgdmFyIG1vcmVOb2RlID0gbW9iaWxlID8gbnVsbCA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERyb3Bkb3duLCB7XG4gICAgcHJlZml4Q2xzOiBkcm9wZG93blByZWZpeCxcbiAgICBvdmVybGF5OiBtZW51LFxuICAgIHRyaWdnZXI6IFsnaG92ZXInXSxcbiAgICB2aXNpYmxlOiB0YWJzLmxlbmd0aCA/IG9wZW4gOiBmYWxzZSxcbiAgICB0cmFuc2l0aW9uTmFtZTogbW9yZVRyYW5zaXRpb25OYW1lLFxuICAgIG9uVmlzaWJsZUNoYW5nZTogc2V0T3BlbixcbiAgICBvdmVybGF5Q2xhc3NOYW1lOiBjbGFzc05hbWVzKG92ZXJsYXlDbGFzc05hbWUsIHBvcHVwQ2xhc3NOYW1lKSxcbiAgICBtb3VzZUVudGVyRGVsYXk6IDAuMSxcbiAgICBtb3VzZUxlYXZlRGVsYXk6IDAuMSxcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5hdi1tb3JlXCIpLFxuICAgIHN0eWxlOiBtb3JlU3R5bGUsXG4gICAgdGFiSW5kZXg6IC0xLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCIsXG4gICAgXCJhcmlhLWhhc3BvcHVwXCI6IFwibGlzdGJveFwiLFxuICAgIFwiYXJpYS1jb250cm9sc1wiOiBwb3B1cElkLFxuICAgIGlkOiBcIlwiLmNvbmNhdChpZCwgXCItbW9yZVwiKSxcbiAgICBcImFyaWEtZXhwYW5kZWRcIjogb3BlbixcbiAgICBvbktleURvd246IG9uS2V5RG93blxuICB9LCBtb3JlSWNvbikpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5hdi1vcGVyYXRpb25zXCIpLCBjbGFzc05hbWUpLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICByZWY6IHJlZlxuICB9LCBtb3JlTm9kZSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQWRkQnV0dG9uLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgZWRpdGFibGU6IGVkaXRhYmxlXG4gIH0pKTtcbn1cbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5tZW1vKCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihPcGVyYXRpb25Ob2RlKSwgZnVuY3Rpb24gKF8sIG5leHQpIHtcbiAgcmV0dXJuIChcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8zMjU0NFxuICAgIC8vIFdlJ2QgYmV0dGVyIHJlbW92ZSBzeW50YWN0aWMgc3VnYXIgaW4gYHJjLW1lbnVgIHNpbmNlIHRoaXMgaGFzIHBlcmYgaXNzdWVcbiAgICBuZXh0LnRhYk1vdmluZ1xuICApO1xufSk7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2VuRGF0YU5vZGVLZXkgfSBmcm9tIFwiLi4vdXRpbFwiO1xuZnVuY3Rpb24gVGFiTm9kZShfcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIGlkID0gX3JlZi5pZCxcbiAgICBhY3RpdmUgPSBfcmVmLmFjdGl2ZSxcbiAgICBfcmVmJHRhYiA9IF9yZWYudGFiLFxuICAgIGtleSA9IF9yZWYkdGFiLmtleSxcbiAgICBsYWJlbCA9IF9yZWYkdGFiLmxhYmVsLFxuICAgIGRpc2FibGVkID0gX3JlZiR0YWIuZGlzYWJsZWQsXG4gICAgY2xvc2VJY29uID0gX3JlZiR0YWIuY2xvc2VJY29uLFxuICAgIGNsb3NhYmxlID0gX3JlZi5jbG9zYWJsZSxcbiAgICByZW5kZXJXcmFwcGVyID0gX3JlZi5yZW5kZXJXcmFwcGVyLFxuICAgIHJlbW92ZUFyaWFMYWJlbCA9IF9yZWYucmVtb3ZlQXJpYUxhYmVsLFxuICAgIGVkaXRhYmxlID0gX3JlZi5lZGl0YWJsZSxcbiAgICBvbkNsaWNrID0gX3JlZi5vbkNsaWNrLFxuICAgIG9uRm9jdXMgPSBfcmVmLm9uRm9jdXMsXG4gICAgc3R5bGUgPSBfcmVmLnN0eWxlO1xuICB2YXIgdGFiUHJlZml4ID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10YWJcIik7XG4gIHZhciByZW1vdmFibGUgPSBlZGl0YWJsZSAmJiBjbG9zYWJsZSAhPT0gZmFsc2UgJiYgIWRpc2FibGVkO1xuICBmdW5jdGlvbiBvbkludGVybmFsQ2xpY2soZSkge1xuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBvbkNsaWNrKGUpO1xuICB9XG4gIGZ1bmN0aW9uIG9uUmVtb3ZlVGFiKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlZGl0YWJsZS5vbkVkaXQoJ3JlbW92ZScsIHtcbiAgICAgIGtleToga2V5LFxuICAgICAgZXZlbnQ6IGV2ZW50XG4gICAgfSk7XG4gIH1cbiAgdmFyIG5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAga2V5OiBrZXlcbiAgICAvLyByZWY9e3JlZn1cbiAgICAsXG4gICAgXCJkYXRhLW5vZGUta2V5XCI6IGdlbkRhdGFOb2RlS2V5KGtleSksXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHRhYlByZWZpeCwgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQodGFiUHJlZml4LCBcIi13aXRoLXJlbW92ZVwiKSwgcmVtb3ZhYmxlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdCh0YWJQcmVmaXgsIFwiLWFjdGl2ZVwiKSwgYWN0aXZlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdCh0YWJQcmVmaXgsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksIF9jbGFzc05hbWVzKSksXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIG9uQ2xpY2s6IG9uSW50ZXJuYWxDbGlja1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcm9sZTogXCJ0YWJcIixcbiAgICBcImFyaWEtc2VsZWN0ZWRcIjogYWN0aXZlLFxuICAgIGlkOiBpZCAmJiBcIlwiLmNvbmNhdChpZCwgXCItdGFiLVwiKS5jb25jYXQoa2V5KSxcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHRhYlByZWZpeCwgXCItYnRuXCIpLFxuICAgIFwiYXJpYS1jb250cm9sc1wiOiBpZCAmJiBcIlwiLmNvbmNhdChpZCwgXCItcGFuZWwtXCIpLmNvbmNhdChrZXkpLFxuICAgIFwiYXJpYS1kaXNhYmxlZFwiOiBkaXNhYmxlZCxcbiAgICB0YWJJbmRleDogZGlzYWJsZWQgPyBudWxsIDogMCxcbiAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBvbkludGVybmFsQ2xpY2soZSk7XG4gICAgfSxcbiAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgICBpZiAoW0tleUNvZGUuU1BBQ0UsIEtleUNvZGUuRU5URVJdLmluY2x1ZGVzKGUud2hpY2gpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgb25JbnRlcm5hbENsaWNrKGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25Gb2N1czogb25Gb2N1c1xuICB9LCBsYWJlbCksIHJlbW92YWJsZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgdHlwZTogXCJidXR0b25cIixcbiAgICBcImFyaWEtbGFiZWxcIjogcmVtb3ZlQXJpYUxhYmVsIHx8ICdyZW1vdmUnLFxuICAgIHRhYkluZGV4OiAwLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQodGFiUHJlZml4LCBcIi1yZW1vdmVcIiksXG4gICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgb25SZW1vdmVUYWIoZSk7XG4gICAgfVxuICB9LCBjbG9zZUljb24gfHwgZWRpdGFibGUucmVtb3ZlSWNvbiB8fCAnw5cnKSk7XG4gIHJldHVybiByZW5kZXJXcmFwcGVyID8gcmVuZGVyV3JhcHBlcihub2RlKSA6IG5vZGU7XG59XG5leHBvcnQgZGVmYXVsdCBUYWJOb2RlOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSZXNpemVPYnNlcnZlciBmcm9tICdyYy1yZXNpemUtb2JzZXJ2ZXInO1xuaW1wb3J0IHVzZUV2ZW50IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUV2ZW50XCI7XG5pbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuaW1wb3J0IHsgdXNlQ29tcG9zZVJlZiB9IGZyb20gXCJyYy11dGlsL2VzL3JlZlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZU9mZnNldHMgZnJvbSBcIi4uL2hvb2tzL3VzZU9mZnNldHNcIjtcbmltcG9ydCB1c2VTeW5jU3RhdGUgZnJvbSBcIi4uL2hvb2tzL3VzZVN5bmNTdGF0ZVwiO1xuaW1wb3J0IHVzZVRvdWNoTW92ZSBmcm9tIFwiLi4vaG9va3MvdXNlVG91Y2hNb3ZlXCI7XG5pbXBvcnQgdXNlVXBkYXRlLCB7IHVzZVVwZGF0ZVN0YXRlIH0gZnJvbSBcIi4uL2hvb2tzL3VzZVVwZGF0ZVwiO1xuaW1wb3J0IHVzZVZpc2libGVSYW5nZSBmcm9tIFwiLi4vaG9va3MvdXNlVmlzaWJsZVJhbmdlXCI7XG5pbXBvcnQgVGFiQ29udGV4dCBmcm9tIFwiLi4vVGFiQ29udGV4dFwiO1xuaW1wb3J0IHsgZ2VuRGF0YU5vZGVLZXksIHN0cmluZ2lmeSB9IGZyb20gXCIuLi91dGlsXCI7XG5pbXBvcnQgQWRkQnV0dG9uIGZyb20gXCIuL0FkZEJ1dHRvblwiO1xuaW1wb3J0IEV4dHJhQ29udGVudCBmcm9tIFwiLi9FeHRyYUNvbnRlbnRcIjtcbmltcG9ydCBPcGVyYXRpb25Ob2RlIGZyb20gXCIuL09wZXJhdGlvbk5vZGVcIjtcbmltcG9ydCBUYWJOb2RlIGZyb20gXCIuL1RhYk5vZGVcIjtcbnZhciBnZXRTaXplID0gZnVuY3Rpb24gZ2V0U2l6ZShyZWZPYmopIHtcbiAgdmFyIF9yZWYgPSByZWZPYmouY3VycmVudCB8fCB7fSxcbiAgICBfcmVmJG9mZnNldFdpZHRoID0gX3JlZi5vZmZzZXRXaWR0aCxcbiAgICBvZmZzZXRXaWR0aCA9IF9yZWYkb2Zmc2V0V2lkdGggPT09IHZvaWQgMCA/IDAgOiBfcmVmJG9mZnNldFdpZHRoLFxuICAgIF9yZWYkb2Zmc2V0SGVpZ2h0ID0gX3JlZi5vZmZzZXRIZWlnaHQsXG4gICAgb2Zmc2V0SGVpZ2h0ID0gX3JlZiRvZmZzZXRIZWlnaHQgPT09IHZvaWQgMCA/IDAgOiBfcmVmJG9mZnNldEhlaWdodDtcbiAgcmV0dXJuIFtvZmZzZXRXaWR0aCwgb2Zmc2V0SGVpZ2h0XTtcbn07XG5cbi8qKlxuICogQ29udmVydCBgU2l6ZUluZm9gIHRvIHVuaXQgdmFsdWUuIFN1Y2ggYXMgWzEyMywgNDU2XSB3aXRoIGB0b3BgIHBvc2l0aW9uIGdldCBgMTIzYFxuICovXG52YXIgZ2V0VW5pdFZhbHVlID0gZnVuY3Rpb24gZ2V0VW5pdFZhbHVlKHNpemUsIHRhYlBvc2l0aW9uVG9wT3JCb3R0b20pIHtcbiAgcmV0dXJuIHNpemVbdGFiUG9zaXRpb25Ub3BPckJvdHRvbSA/IDAgOiAxXTtcbn07XG5mdW5jdGlvbiBUYWJOYXZMaXN0KHByb3BzLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFRhYkNvbnRleHQpLFxuICAgIHByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LnByZWZpeENscyxcbiAgICB0YWJzID0gX1JlYWN0JHVzZUNvbnRleHQudGFicztcbiAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIGlkID0gcHJvcHMuaWQsXG4gICAgYW5pbWF0ZWQgPSBwcm9wcy5hbmltYXRlZCxcbiAgICBhY3RpdmVLZXkgPSBwcm9wcy5hY3RpdmVLZXksXG4gICAgcnRsID0gcHJvcHMucnRsLFxuICAgIGV4dHJhID0gcHJvcHMuZXh0cmEsXG4gICAgZWRpdGFibGUgPSBwcm9wcy5lZGl0YWJsZSxcbiAgICBsb2NhbGUgPSBwcm9wcy5sb2NhbGUsXG4gICAgdGFiUG9zaXRpb24gPSBwcm9wcy50YWJQb3NpdGlvbixcbiAgICB0YWJCYXJHdXR0ZXIgPSBwcm9wcy50YWJCYXJHdXR0ZXIsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBvblRhYkNsaWNrID0gcHJvcHMub25UYWJDbGljayxcbiAgICBvblRhYlNjcm9sbCA9IHByb3BzLm9uVGFiU2Nyb2xsO1xuICB2YXIgY29udGFpbmVyUmVmID0gdXNlUmVmKCk7XG4gIHZhciBleHRyYUxlZnRSZWYgPSB1c2VSZWYoKTtcbiAgdmFyIGV4dHJhUmlnaHRSZWYgPSB1c2VSZWYoKTtcbiAgdmFyIHRhYnNXcmFwcGVyUmVmID0gdXNlUmVmKCk7XG4gIHZhciB0YWJMaXN0UmVmID0gdXNlUmVmKCk7XG4gIHZhciBvcGVyYXRpb25zUmVmID0gdXNlUmVmKCk7XG4gIHZhciBpbm5lckFkZEJ1dHRvblJlZiA9IHVzZVJlZigpO1xuICAvLyBjb25zdCBbZ2V0QnRuUmVmLCByZW1vdmVCdG5SZWZdID0gdXNlUmVmczxIVE1MRGl2RWxlbWVudD4oKTtcblxuICB2YXIgdGFiUG9zaXRpb25Ub3BPckJvdHRvbSA9IHRhYlBvc2l0aW9uID09PSAndG9wJyB8fCB0YWJQb3NpdGlvbiA9PT0gJ2JvdHRvbSc7XG4gIHZhciBfdXNlU3luY1N0YXRlID0gdXNlU3luY1N0YXRlKDAsIGZ1bmN0aW9uIChuZXh0LCBwcmV2KSB7XG4gICAgICBpZiAodGFiUG9zaXRpb25Ub3BPckJvdHRvbSAmJiBvblRhYlNjcm9sbCkge1xuICAgICAgICBvblRhYlNjcm9sbCh7XG4gICAgICAgICAgZGlyZWN0aW9uOiBuZXh0ID4gcHJldiA/ICdsZWZ0JyA6ICdyaWdodCdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSksXG4gICAgX3VzZVN5bmNTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3luY1N0YXRlLCAyKSxcbiAgICB0cmFuc2Zvcm1MZWZ0ID0gX3VzZVN5bmNTdGF0ZTJbMF0sXG4gICAgc2V0VHJhbnNmb3JtTGVmdCA9IF91c2VTeW5jU3RhdGUyWzFdO1xuICB2YXIgX3VzZVN5bmNTdGF0ZTMgPSB1c2VTeW5jU3RhdGUoMCwgZnVuY3Rpb24gKG5leHQsIHByZXYpIHtcbiAgICAgIGlmICghdGFiUG9zaXRpb25Ub3BPckJvdHRvbSAmJiBvblRhYlNjcm9sbCkge1xuICAgICAgICBvblRhYlNjcm9sbCh7XG4gICAgICAgICAgZGlyZWN0aW9uOiBuZXh0ID4gcHJldiA/ICd0b3AnIDogJ2JvdHRvbSdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSksXG4gICAgX3VzZVN5bmNTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlU3luY1N0YXRlMywgMiksXG4gICAgdHJhbnNmb3JtVG9wID0gX3VzZVN5bmNTdGF0ZTRbMF0sXG4gICAgc2V0VHJhbnNmb3JtVG9wID0gX3VzZVN5bmNTdGF0ZTRbMV07XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShbMCwgMF0pLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGNvbnRhaW5lckV4Y2x1ZGVFeHRyYVNpemUgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldENvbnRhaW5lckV4Y2x1ZGVFeHRyYVNpemUgPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgX3VzZVN0YXRlMyA9IHVzZVN0YXRlKFswLCAwXSksXG4gICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgIHRhYkNvbnRlbnRTaXplID0gX3VzZVN0YXRlNFswXSxcbiAgICBzZXRUYWJDb250ZW50U2l6ZSA9IF91c2VTdGF0ZTRbMV07XG4gIHZhciBfdXNlU3RhdGU1ID0gdXNlU3RhdGUoWzAsIDBdKSxcbiAgICBfdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlNSwgMiksXG4gICAgYWRkU2l6ZSA9IF91c2VTdGF0ZTZbMF0sXG4gICAgc2V0QWRkU2l6ZSA9IF91c2VTdGF0ZTZbMV07XG4gIHZhciBfdXNlU3RhdGU3ID0gdXNlU3RhdGUoWzAsIDBdKSxcbiAgICBfdXNlU3RhdGU4ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlNywgMiksXG4gICAgb3BlcmF0aW9uU2l6ZSA9IF91c2VTdGF0ZThbMF0sXG4gICAgc2V0T3BlcmF0aW9uU2l6ZSA9IF91c2VTdGF0ZThbMV07XG4gIHZhciBfdXNlVXBkYXRlU3RhdGUgPSB1c2VVcGRhdGVTdGF0ZShuZXcgTWFwKCkpLFxuICAgIF91c2VVcGRhdGVTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlVXBkYXRlU3RhdGUsIDIpLFxuICAgIHRhYlNpemVzID0gX3VzZVVwZGF0ZVN0YXRlMlswXSxcbiAgICBzZXRUYWJTaXplcyA9IF91c2VVcGRhdGVTdGF0ZTJbMV07XG4gIHZhciB0YWJPZmZzZXRzID0gdXNlT2Zmc2V0cyh0YWJzLCB0YWJTaXplcywgdGFiQ29udGVudFNpemVbMF0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFVuaXQgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgY29udGFpbmVyRXhjbHVkZUV4dHJhU2l6ZVZhbHVlID0gZ2V0VW5pdFZhbHVlKGNvbnRhaW5lckV4Y2x1ZGVFeHRyYVNpemUsIHRhYlBvc2l0aW9uVG9wT3JCb3R0b20pO1xuICB2YXIgdGFiQ29udGVudFNpemVWYWx1ZSA9IGdldFVuaXRWYWx1ZSh0YWJDb250ZW50U2l6ZSwgdGFiUG9zaXRpb25Ub3BPckJvdHRvbSk7XG4gIHZhciBhZGRTaXplVmFsdWUgPSBnZXRVbml0VmFsdWUoYWRkU2l6ZSwgdGFiUG9zaXRpb25Ub3BPckJvdHRvbSk7XG4gIHZhciBvcGVyYXRpb25TaXplVmFsdWUgPSBnZXRVbml0VmFsdWUob3BlcmF0aW9uU2l6ZSwgdGFiUG9zaXRpb25Ub3BPckJvdHRvbSk7XG4gIHZhciBuZWVkU2Nyb2xsID0gY29udGFpbmVyRXhjbHVkZUV4dHJhU2l6ZVZhbHVlIDwgdGFiQ29udGVudFNpemVWYWx1ZSArIGFkZFNpemVWYWx1ZTtcbiAgdmFyIHZpc2libGVUYWJDb250ZW50VmFsdWUgPSBuZWVkU2Nyb2xsID8gY29udGFpbmVyRXhjbHVkZUV4dHJhU2l6ZVZhbHVlIC0gb3BlcmF0aW9uU2l6ZVZhbHVlIDogY29udGFpbmVyRXhjbHVkZUV4dHJhU2l6ZVZhbHVlIC0gYWRkU2l6ZVZhbHVlO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFV0aWwgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb3BlcmF0aW9uc0hpZGRlbkNsYXNzTmFtZSA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbmF2LW9wZXJhdGlvbnMtaGlkZGVuXCIpO1xuICB2YXIgdHJhbnNmb3JtTWluID0gMDtcbiAgdmFyIHRyYW5zZm9ybU1heCA9IDA7XG4gIGlmICghdGFiUG9zaXRpb25Ub3BPckJvdHRvbSkge1xuICAgIHRyYW5zZm9ybU1pbiA9IE1hdGgubWluKDAsIHZpc2libGVUYWJDb250ZW50VmFsdWUgLSB0YWJDb250ZW50U2l6ZVZhbHVlKTtcbiAgICB0cmFuc2Zvcm1NYXggPSAwO1xuICB9IGVsc2UgaWYgKHJ0bCkge1xuICAgIHRyYW5zZm9ybU1pbiA9IDA7XG4gICAgdHJhbnNmb3JtTWF4ID0gTWF0aC5tYXgoMCwgdGFiQ29udGVudFNpemVWYWx1ZSAtIHZpc2libGVUYWJDb250ZW50VmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHRyYW5zZm9ybU1pbiA9IE1hdGgubWluKDAsIHZpc2libGVUYWJDb250ZW50VmFsdWUgLSB0YWJDb250ZW50U2l6ZVZhbHVlKTtcbiAgICB0cmFuc2Zvcm1NYXggPSAwO1xuICB9XG4gIGZ1bmN0aW9uIGFsaWduSW5SYW5nZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA8IHRyYW5zZm9ybU1pbikge1xuICAgICAgcmV0dXJuIHRyYW5zZm9ybU1pbjtcbiAgICB9XG4gICAgaWYgKHZhbHVlID4gdHJhbnNmb3JtTWF4KSB7XG4gICAgICByZXR1cm4gdHJhbnNmb3JtTWF4O1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IE1vYmlsZSA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHRvdWNoTW92aW5nUmVmID0gdXNlUmVmKCk7XG4gIHZhciBfdXNlU3RhdGU5ID0gdXNlU3RhdGUoKSxcbiAgICBfdXNlU3RhdGUxMCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTksIDIpLFxuICAgIGxvY2tBbmltYXRpb24gPSBfdXNlU3RhdGUxMFswXSxcbiAgICBzZXRMb2NrQW5pbWF0aW9uID0gX3VzZVN0YXRlMTBbMV07XG4gIGZ1bmN0aW9uIGRvTG9ja0FuaW1hdGlvbigpIHtcbiAgICBzZXRMb2NrQW5pbWF0aW9uKERhdGUubm93KCkpO1xuICB9XG4gIGZ1bmN0aW9uIGNsZWFyVG91Y2hNb3ZpbmcoKSB7XG4gICAgd2luZG93LmNsZWFyVGltZW91dCh0b3VjaE1vdmluZ1JlZi5jdXJyZW50KTtcbiAgfVxuICB1c2VUb3VjaE1vdmUodGFic1dyYXBwZXJSZWYsIGZ1bmN0aW9uIChvZmZzZXRYLCBvZmZzZXRZKSB7XG4gICAgZnVuY3Rpb24gZG9Nb3ZlKHNldFN0YXRlLCBvZmZzZXQpIHtcbiAgICAgIHNldFN0YXRlKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSBhbGlnbkluUmFuZ2UodmFsdWUgKyBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gbmV3VmFsdWU7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTa2lwIHNjcm9sbCBpZiBwbGFjZSBpcyBlbm91Z2hcbiAgICBpZiAoIW5lZWRTY3JvbGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRhYlBvc2l0aW9uVG9wT3JCb3R0b20pIHtcbiAgICAgIGRvTW92ZShzZXRUcmFuc2Zvcm1MZWZ0LCBvZmZzZXRYKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9Nb3ZlKHNldFRyYW5zZm9ybVRvcCwgb2Zmc2V0WSk7XG4gICAgfVxuICAgIGNsZWFyVG91Y2hNb3ZpbmcoKTtcbiAgICBkb0xvY2tBbmltYXRpb24oKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgY2xlYXJUb3VjaE1vdmluZygpO1xuICAgIGlmIChsb2NrQW5pbWF0aW9uKSB7XG4gICAgICB0b3VjaE1vdmluZ1JlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXRMb2NrQW5pbWF0aW9uKDApO1xuICAgICAgfSwgMTAwKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsZWFyVG91Y2hNb3Zpbmc7XG4gIH0sIFtsb2NrQW5pbWF0aW9uXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IFZpc2libGUgUmFuZ2UgPT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJlbmRlciB0YWIgbm9kZSAmIGNvbGxlY3QgdGFiIG9mZnNldFxuICB2YXIgX3VzZVZpc2libGVSYW5nZSA9IHVzZVZpc2libGVSYW5nZSh0YWJPZmZzZXRzLFxuICAgIC8vIENvbnRhaW5lclxuICAgIHZpc2libGVUYWJDb250ZW50VmFsdWUsXG4gICAgLy8gVHJhbnNmb3JtXG4gICAgdGFiUG9zaXRpb25Ub3BPckJvdHRvbSA/IHRyYW5zZm9ybUxlZnQgOiB0cmFuc2Zvcm1Ub3AsXG4gICAgLy8gVGFic1xuICAgIHRhYkNvbnRlbnRTaXplVmFsdWUsXG4gICAgLy8gQWRkXG4gICAgYWRkU2l6ZVZhbHVlLFxuICAgIC8vIE9wZXJhdGlvblxuICAgIG9wZXJhdGlvblNpemVWYWx1ZSwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgICB0YWJzOiB0YWJzXG4gICAgfSkpLFxuICAgIF91c2VWaXNpYmxlUmFuZ2UyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVZpc2libGVSYW5nZSwgMiksXG4gICAgdmlzaWJsZVN0YXJ0ID0gX3VzZVZpc2libGVSYW5nZTJbMF0sXG4gICAgdmlzaWJsZUVuZCA9IF91c2VWaXNpYmxlUmFuZ2UyWzFdO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gU2Nyb2xsID09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgc2Nyb2xsVG9UYWIgPSB1c2VFdmVudChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogYWN0aXZlS2V5O1xuICAgIHZhciB0YWJPZmZzZXQgPSB0YWJPZmZzZXRzLmdldChrZXkpIHx8IHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHJpZ2h0OiAwLFxuICAgICAgdG9wOiAwXG4gICAgfTtcbiAgICBpZiAodGFiUG9zaXRpb25Ub3BPckJvdHRvbSkge1xuICAgICAgLy8gPT09PT09PT09PT09IEFsaWduIHdpdGggdG9wICYgYm90dG9tID09PT09PT09PT09PVxuICAgICAgdmFyIG5ld1RyYW5zZm9ybSA9IHRyYW5zZm9ybUxlZnQ7XG5cbiAgICAgIC8vIFJUTFxuICAgICAgaWYgKHJ0bCkge1xuICAgICAgICBpZiAodGFiT2Zmc2V0LnJpZ2h0IDwgdHJhbnNmb3JtTGVmdCkge1xuICAgICAgICAgIG5ld1RyYW5zZm9ybSA9IHRhYk9mZnNldC5yaWdodDtcbiAgICAgICAgfSBlbHNlIGlmICh0YWJPZmZzZXQucmlnaHQgKyB0YWJPZmZzZXQud2lkdGggPiB0cmFuc2Zvcm1MZWZ0ICsgdmlzaWJsZVRhYkNvbnRlbnRWYWx1ZSkge1xuICAgICAgICAgIG5ld1RyYW5zZm9ybSA9IHRhYk9mZnNldC5yaWdodCArIHRhYk9mZnNldC53aWR0aCAtIHZpc2libGVUYWJDb250ZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIExUUlxuICAgICAgZWxzZSBpZiAodGFiT2Zmc2V0LmxlZnQgPCAtdHJhbnNmb3JtTGVmdCkge1xuICAgICAgICBuZXdUcmFuc2Zvcm0gPSAtdGFiT2Zmc2V0LmxlZnQ7XG4gICAgICB9IGVsc2UgaWYgKHRhYk9mZnNldC5sZWZ0ICsgdGFiT2Zmc2V0LndpZHRoID4gLXRyYW5zZm9ybUxlZnQgKyB2aXNpYmxlVGFiQ29udGVudFZhbHVlKSB7XG4gICAgICAgIG5ld1RyYW5zZm9ybSA9IC0odGFiT2Zmc2V0LmxlZnQgKyB0YWJPZmZzZXQud2lkdGggLSB2aXNpYmxlVGFiQ29udGVudFZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHNldFRyYW5zZm9ybVRvcCgwKTtcbiAgICAgIHNldFRyYW5zZm9ybUxlZnQoYWxpZ25JblJhbmdlKG5ld1RyYW5zZm9ybSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyA9PT09PT09PT09PT0gQWxpZ24gd2l0aCBsZWZ0ICYgcmlnaHQgPT09PT09PT09PT09XG4gICAgICB2YXIgX25ld1RyYW5zZm9ybSA9IHRyYW5zZm9ybVRvcDtcbiAgICAgIGlmICh0YWJPZmZzZXQudG9wIDwgLXRyYW5zZm9ybVRvcCkge1xuICAgICAgICBfbmV3VHJhbnNmb3JtID0gLXRhYk9mZnNldC50b3A7XG4gICAgICB9IGVsc2UgaWYgKHRhYk9mZnNldC50b3AgKyB0YWJPZmZzZXQuaGVpZ2h0ID4gLXRyYW5zZm9ybVRvcCArIHZpc2libGVUYWJDb250ZW50VmFsdWUpIHtcbiAgICAgICAgX25ld1RyYW5zZm9ybSA9IC0odGFiT2Zmc2V0LnRvcCArIHRhYk9mZnNldC5oZWlnaHQgLSB2aXNpYmxlVGFiQ29udGVudFZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHNldFRyYW5zZm9ybUxlZnQoMCk7XG4gICAgICBzZXRUcmFuc2Zvcm1Ub3AoYWxpZ25JblJhbmdlKF9uZXdUcmFuc2Zvcm0pKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFRhYiA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgdGFiTm9kZVN0eWxlID0ge307XG4gIGlmICh0YWJQb3NpdGlvbiA9PT0gJ3RvcCcgfHwgdGFiUG9zaXRpb24gPT09ICdib3R0b20nKSB7XG4gICAgdGFiTm9kZVN0eWxlW3J0bCA/ICdtYXJnaW5SaWdodCcgOiAnbWFyZ2luTGVmdCddID0gdGFiQmFyR3V0dGVyO1xuICB9IGVsc2Uge1xuICAgIHRhYk5vZGVTdHlsZS5tYXJnaW5Ub3AgPSB0YWJCYXJHdXR0ZXI7XG4gIH1cbiAgdmFyIHRhYk5vZGVzID0gdGFicy5tYXAoZnVuY3Rpb24gKHRhYiwgaSkge1xuICAgIHZhciBrZXkgPSB0YWIua2V5O1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUYWJOb2RlLCB7XG4gICAgICBpZDogaWQsXG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGtleToga2V5LFxuICAgICAgdGFiOiB0YWJcbiAgICAgIC8qIGZpcnN0IG5vZGUgc2hvdWxkIG5vdCBoYXZlIG1hcmdpbiBsZWZ0ICovLFxuICAgICAgc3R5bGU6IGkgPT09IDAgPyB1bmRlZmluZWQgOiB0YWJOb2RlU3R5bGUsXG4gICAgICBjbG9zYWJsZTogdGFiLmNsb3NhYmxlLFxuICAgICAgZWRpdGFibGU6IGVkaXRhYmxlLFxuICAgICAgYWN0aXZlOiBrZXkgPT09IGFjdGl2ZUtleSxcbiAgICAgIHJlbmRlcldyYXBwZXI6IGNoaWxkcmVuLFxuICAgICAgcmVtb3ZlQXJpYUxhYmVsOiBsb2NhbGUgPT09IG51bGwgfHwgbG9jYWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsb2NhbGUucmVtb3ZlQXJpYUxhYmVsLFxuICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgICAgIG9uVGFiQ2xpY2soa2V5LCBlKTtcbiAgICAgIH0sXG4gICAgICBvbkZvY3VzOiBmdW5jdGlvbiBvbkZvY3VzKCkge1xuICAgICAgICBzY3JvbGxUb1RhYihrZXkpO1xuICAgICAgICBkb0xvY2tBbmltYXRpb24oKTtcbiAgICAgICAgaWYgKCF0YWJzV3JhcHBlclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvY3VzIGVsZW1lbnQgd2lsbCBtYWtlIHNjcm9sbExlZnQgY2hhbmdlIHdoaWNoIHdlIHNob3VsZCByZXNldCBiYWNrXG4gICAgICAgIGlmICghcnRsKSB7XG4gICAgICAgICAgdGFic1dyYXBwZXJSZWYuY3VycmVudC5zY3JvbGxMZWZ0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0YWJzV3JhcHBlclJlZi5jdXJyZW50LnNjcm9sbFRvcCA9IDA7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFVwZGF0ZSBidXR0b25zIHJlY29yZHNcbiAgdmFyIHVwZGF0ZVRhYlNpemVzID0gZnVuY3Rpb24gdXBkYXRlVGFiU2l6ZXMoKSB7XG4gICAgcmV0dXJuIHNldFRhYlNpemVzKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBuZXdTaXplcyA9IG5ldyBNYXAoKTtcbiAgICAgIHRhYnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgdmFyIF90YWJMaXN0UmVmJGN1cnJlbnQ7XG4gICAgICAgIHZhciBrZXkgPSBfcmVmMi5rZXk7XG4gICAgICAgIHZhciBidG5Ob2RlID0gKF90YWJMaXN0UmVmJGN1cnJlbnQgPSB0YWJMaXN0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF90YWJMaXN0UmVmJGN1cnJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90YWJMaXN0UmVmJGN1cnJlbnQucXVlcnlTZWxlY3RvcihcIltkYXRhLW5vZGUta2V5PVxcXCJcIi5jb25jYXQoZ2VuRGF0YU5vZGVLZXkoa2V5KSwgXCJcXFwiXVwiKSk7XG4gICAgICAgIGlmIChidG5Ob2RlKSB7XG4gICAgICAgICAgbmV3U2l6ZXMuc2V0KGtleSwge1xuICAgICAgICAgICAgd2lkdGg6IGJ0bk5vZGUub2Zmc2V0V2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGJ0bk5vZGUub2Zmc2V0SGVpZ2h0LFxuICAgICAgICAgICAgbGVmdDogYnRuTm9kZS5vZmZzZXRMZWZ0LFxuICAgICAgICAgICAgdG9wOiBidG5Ob2RlLm9mZnNldFRvcFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXdTaXplcztcbiAgICB9KTtcbiAgfTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB1cGRhdGVUYWJTaXplcygpO1xuICB9LCBbdGFicy5tYXAoZnVuY3Rpb24gKHRhYikge1xuICAgIHJldHVybiB0YWIua2V5O1xuICB9KS5qb2luKCdfJyldKTtcbiAgdmFyIG9uTGlzdEhvbGRlclJlc2l6ZSA9IHVzZVVwZGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgLy8gVXBkYXRlIHdyYXBwZXIgcmVjb3Jkc1xuICAgIHZhciBjb250YWluZXJTaXplID0gZ2V0U2l6ZShjb250YWluZXJSZWYpO1xuICAgIHZhciBleHRyYUxlZnRTaXplID0gZ2V0U2l6ZShleHRyYUxlZnRSZWYpO1xuICAgIHZhciBleHRyYVJpZ2h0U2l6ZSA9IGdldFNpemUoZXh0cmFSaWdodFJlZik7XG4gICAgc2V0Q29udGFpbmVyRXhjbHVkZUV4dHJhU2l6ZShbY29udGFpbmVyU2l6ZVswXSAtIGV4dHJhTGVmdFNpemVbMF0gLSBleHRyYVJpZ2h0U2l6ZVswXSwgY29udGFpbmVyU2l6ZVsxXSAtIGV4dHJhTGVmdFNpemVbMV0gLSBleHRyYVJpZ2h0U2l6ZVsxXV0pO1xuICAgIHZhciBuZXdBZGRTaXplID0gZ2V0U2l6ZShpbm5lckFkZEJ1dHRvblJlZik7XG4gICAgc2V0QWRkU2l6ZShuZXdBZGRTaXplKTtcbiAgICB2YXIgbmV3T3BlcmF0aW9uU2l6ZSA9IGdldFNpemUob3BlcmF0aW9uc1JlZik7XG4gICAgc2V0T3BlcmF0aW9uU2l6ZShuZXdPcGVyYXRpb25TaXplKTtcblxuICAgIC8vIFdoaWNoIGluY2x1ZGVzIGFkZCBidXR0b24gc2l6ZVxuICAgIHZhciB0YWJDb250ZW50RnVsbFNpemUgPSBnZXRTaXplKHRhYkxpc3RSZWYpO1xuICAgIHNldFRhYkNvbnRlbnRTaXplKFt0YWJDb250ZW50RnVsbFNpemVbMF0gLSBuZXdBZGRTaXplWzBdLCB0YWJDb250ZW50RnVsbFNpemVbMV0gLSBuZXdBZGRTaXplWzFdXSk7XG5cbiAgICAvLyBVcGRhdGUgYnV0dG9ucyByZWNvcmRzXG4gICAgdXBkYXRlVGFiU2l6ZXMoKTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IERyb3Bkb3duID09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBzdGFydEhpZGRlblRhYnMgPSB0YWJzLnNsaWNlKDAsIHZpc2libGVTdGFydCk7XG4gIHZhciBlbmRIaWRkZW5UYWJzID0gdGFicy5zbGljZSh2aXNpYmxlRW5kICsgMSk7XG4gIHZhciBoaWRkZW5UYWJzID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShzdGFydEhpZGRlblRhYnMpLCBfdG9Db25zdW1hYmxlQXJyYXkoZW5kSGlkZGVuVGFicykpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT0gTGluayAmIE9wZXJhdGlvbnMgPT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZVN0YXRlMTEgPSB1c2VTdGF0ZSgpLFxuICAgIF91c2VTdGF0ZTEyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlMTEsIDIpLFxuICAgIGlua1N0eWxlID0gX3VzZVN0YXRlMTJbMF0sXG4gICAgc2V0SW5rU3R5bGUgPSBfdXNlU3RhdGUxMlsxXTtcbiAgdmFyIGFjdGl2ZVRhYk9mZnNldCA9IHRhYk9mZnNldHMuZ2V0KGFjdGl2ZUtleSk7XG5cbiAgLy8gRGVsYXkgc2V0IGluayBzdHlsZSB0byBhdm9pZCByZW1vdmUgdGFiIGJsaW5rXG4gIHZhciBpbmtCYXJSYWZSZWYgPSB1c2VSZWYoKTtcbiAgZnVuY3Rpb24gY2xlYW5JbmtCYXJSYWYoKSB7XG4gICAgcmFmLmNhbmNlbChpbmtCYXJSYWZSZWYuY3VycmVudCk7XG4gIH1cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbmV3SW5rU3R5bGUgPSB7fTtcbiAgICBpZiAoYWN0aXZlVGFiT2Zmc2V0KSB7XG4gICAgICBpZiAodGFiUG9zaXRpb25Ub3BPckJvdHRvbSkge1xuICAgICAgICBpZiAocnRsKSB7XG4gICAgICAgICAgbmV3SW5rU3R5bGUucmlnaHQgPSBhY3RpdmVUYWJPZmZzZXQucmlnaHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3SW5rU3R5bGUubGVmdCA9IGFjdGl2ZVRhYk9mZnNldC5sZWZ0O1xuICAgICAgICB9XG4gICAgICAgIG5ld0lua1N0eWxlLndpZHRoID0gYWN0aXZlVGFiT2Zmc2V0LndpZHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3SW5rU3R5bGUudG9wID0gYWN0aXZlVGFiT2Zmc2V0LnRvcDtcbiAgICAgICAgbmV3SW5rU3R5bGUuaGVpZ2h0ID0gYWN0aXZlVGFiT2Zmc2V0LmhlaWdodDtcbiAgICAgIH1cbiAgICB9XG4gICAgY2xlYW5JbmtCYXJSYWYoKTtcbiAgICBpbmtCYXJSYWZSZWYuY3VycmVudCA9IHJhZihmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRJbmtTdHlsZShuZXdJbmtTdHlsZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNsZWFuSW5rQmFyUmFmO1xuICB9LCBbYWN0aXZlVGFiT2Zmc2V0LCB0YWJQb3NpdGlvblRvcE9yQm90dG9tLCBydGxdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzY3JvbGxUb1RhYigpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICB9LCBbYWN0aXZlS2V5LCB0cmFuc2Zvcm1NaW4sIHRyYW5zZm9ybU1heCwgc3RyaW5naWZ5KGFjdGl2ZVRhYk9mZnNldCksIHN0cmluZ2lmeSh0YWJPZmZzZXRzKSwgdGFiUG9zaXRpb25Ub3BPckJvdHRvbV0pO1xuXG4gIC8vIFNob3VsZCByZWNhbGN1bGF0ZSB3aGVuIHJ0bCBjaGFuZ2VkXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgb25MaXN0SG9sZGVyUmVzaXplKCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIH0sIFtydGxdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGhhc0Ryb3Bkb3duID0gISFoaWRkZW5UYWJzLmxlbmd0aDtcbiAgdmFyIHdyYXBQcmVmaXggPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5hdi13cmFwXCIpO1xuICB2YXIgcGluZ0xlZnQ7XG4gIHZhciBwaW5nUmlnaHQ7XG4gIHZhciBwaW5nVG9wO1xuICB2YXIgcGluZ0JvdHRvbTtcbiAgaWYgKHRhYlBvc2l0aW9uVG9wT3JCb3R0b20pIHtcbiAgICBpZiAocnRsKSB7XG4gICAgICBwaW5nUmlnaHQgPSB0cmFuc2Zvcm1MZWZ0ID4gMDtcbiAgICAgIHBpbmdMZWZ0ID0gdHJhbnNmb3JtTGVmdCAhPT0gdHJhbnNmb3JtTWF4O1xuICAgIH0gZWxzZSB7XG4gICAgICBwaW5nTGVmdCA9IHRyYW5zZm9ybUxlZnQgPCAwO1xuICAgICAgcGluZ1JpZ2h0ID0gdHJhbnNmb3JtTGVmdCAhPT0gdHJhbnNmb3JtTWluO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBwaW5nVG9wID0gdHJhbnNmb3JtVG9wIDwgMDtcbiAgICBwaW5nQm90dG9tID0gdHJhbnNmb3JtVG9wICE9PSB0cmFuc2Zvcm1NaW47XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlc2l6ZU9ic2VydmVyLCB7XG4gICAgb25SZXNpemU6IG9uTGlzdEhvbGRlclJlc2l6ZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiB1c2VDb21wb3NlUmVmKHJlZiwgY29udGFpbmVyUmVmKSxcbiAgICByb2xlOiBcInRhYmxpc3RcIixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1uYXZcIiksIGNsYXNzTmFtZSksXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKCkge1xuICAgICAgLy8gTm8gbmVlZCBhbmltYXRpb24gd2hlbiB1c2Uga2V5Ym9hcmRcbiAgICAgIGRvTG9ja0FuaW1hdGlvbigpO1xuICAgIH1cbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRXh0cmFDb250ZW50LCB7XG4gICAgcmVmOiBleHRyYUxlZnRSZWYsXG4gICAgcG9zaXRpb246IFwibGVmdFwiLFxuICAgIGV4dHJhOiBleHRyYSxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENsc1xuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyh3cmFwUHJlZml4LCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdCh3cmFwUHJlZml4LCBcIi1waW5nLWxlZnRcIiksIHBpbmdMZWZ0KSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdCh3cmFwUHJlZml4LCBcIi1waW5nLXJpZ2h0XCIpLCBwaW5nUmlnaHQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHdyYXBQcmVmaXgsIFwiLXBpbmctdG9wXCIpLCBwaW5nVG9wKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdCh3cmFwUHJlZml4LCBcIi1waW5nLWJvdHRvbVwiKSwgcGluZ0JvdHRvbSksIF9jbGFzc05hbWVzKSksXG4gICAgcmVmOiB0YWJzV3JhcHBlclJlZlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZXNpemVPYnNlcnZlciwge1xuICAgIG9uUmVzaXplOiBvbkxpc3RIb2xkZXJSZXNpemVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogdGFiTGlzdFJlZixcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbmF2LWxpc3RcIiksXG4gICAgc3R5bGU6IHtcbiAgICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUoXCIuY29uY2F0KHRyYW5zZm9ybUxlZnQsIFwicHgsIFwiKS5jb25jYXQodHJhbnNmb3JtVG9wLCBcInB4KVwiKSxcbiAgICAgIHRyYW5zaXRpb246IGxvY2tBbmltYXRpb24gPyAnbm9uZScgOiB1bmRlZmluZWRcbiAgICB9XG4gIH0sIHRhYk5vZGVzLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBZGRCdXR0b24sIHtcbiAgICByZWY6IGlubmVyQWRkQnV0dG9uUmVmLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGxvY2FsZTogbG9jYWxlLFxuICAgIGVkaXRhYmxlOiBlZGl0YWJsZSxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0YWJOb2Rlcy5sZW5ndGggPT09IDAgPyB1bmRlZmluZWQgOiB0YWJOb2RlU3R5bGUpLCB7fSwge1xuICAgICAgdmlzaWJpbGl0eTogaGFzRHJvcGRvd24gPyAnaGlkZGVuJyA6IG51bGxcbiAgICB9KVxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWluay1iYXJcIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbmstYmFyLWFuaW1hdGVkXCIpLCBhbmltYXRlZC5pbmtCYXIpKSxcbiAgICBzdHlsZTogaW5rU3R5bGVcbiAgfSkpKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE9wZXJhdGlvbk5vZGUsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJlbW92ZUFyaWFMYWJlbDogbG9jYWxlID09PSBudWxsIHx8IGxvY2FsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbG9jYWxlLnJlbW92ZUFyaWFMYWJlbCxcbiAgICByZWY6IG9wZXJhdGlvbnNSZWYsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgdGFiczogaGlkZGVuVGFicyxcbiAgICBjbGFzc05hbWU6ICFoYXNEcm9wZG93biAmJiBvcGVyYXRpb25zSGlkZGVuQ2xhc3NOYW1lLFxuICAgIHRhYk1vdmluZzogISFsb2NrQW5pbWF0aW9uXG4gIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRXh0cmFDb250ZW50LCB7XG4gICAgcmVmOiBleHRyYVJpZ2h0UmVmLFxuICAgIHBvc2l0aW9uOiBcInJpZ2h0XCIsXG4gICAgZXh0cmE6IGV4dHJhLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzXG4gIH0pKSk7XG4gIC8qIGVzbGludC1lbmFibGUgKi9cbn1cblxuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoVGFiTmF2TGlzdCk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJyZW5kZXJUYWJCYXJcIl0sXG4gIF9leGNsdWRlZDIgPSBbXCJsYWJlbFwiLCBcImtleVwiXTtcbi8vIHpvbWJpZUo6IFRvIGNvbXBhdGlibGUgd2l0aCBgcmVuZGVyVGFiQmFyYCB1c2FnZS5cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFRhYk5hdkxpc3QgZnJvbSAnLic7XG5pbXBvcnQgVGFiQ29udGV4dCBmcm9tIFwiLi4vVGFiQ29udGV4dFwiO1xuaW1wb3J0IFRhYlBhbmUgZnJvbSBcIi4uL1RhYlBhbmVsTGlzdC9UYWJQYW5lXCI7XG4vLyBXZSBoYXZlIHRvIGNyZWF0ZSBhIFRhYk5hdkxpc3QgY29tcG9uZW50cy5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFRhYk5hdkxpc3RXcmFwcGVyKF9yZWYpIHtcbiAgdmFyIHJlbmRlclRhYkJhciA9IF9yZWYucmVuZGVyVGFiQmFyLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFRhYkNvbnRleHQpLFxuICAgIHRhYnMgPSBfUmVhY3QkdXNlQ29udGV4dC50YWJzO1xuICBpZiAocmVuZGVyVGFiQmFyKSB7XG4gICAgdmFyIHRhYk5hdkJhclByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCByZXN0UHJvcHMpLCB7fSwge1xuICAgICAgLy8gTGVnYWN5IHN1cHBvcnQuIFdlIGRvIG5vdCB1c2UgdGhpcyBhY3R1YWxseVxuICAgICAgcGFuZXM6IHRhYnMubWFwKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICB2YXIgbGFiZWwgPSBfcmVmMi5sYWJlbCxcbiAgICAgICAgICBrZXkgPSBfcmVmMi5rZXksXG4gICAgICAgICAgcmVzdFRhYlByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYyLCBfZXhjbHVkZWQyKTtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRhYlBhbmUsIF9leHRlbmRzKHtcbiAgICAgICAgICB0YWI6IGxhYmVsLFxuICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgIHRhYktleToga2V5XG4gICAgICAgIH0sIHJlc3RUYWJQcm9wcykpO1xuICAgICAgfSlcbiAgICB9KTtcbiAgICByZXR1cm4gcmVuZGVyVGFiQmFyKHRhYk5hdkJhclByb3BzLCBUYWJOYXZMaXN0KTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiTmF2TGlzdCwgcmVzdFByb3BzKTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQW5pbWF0ZUNvbmZpZygpIHtcbiAgdmFyIGFuaW1hdGVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7XG4gICAgaW5rQmFyOiB0cnVlLFxuICAgIHRhYlBhbmU6IGZhbHNlXG4gIH07XG4gIHZhciBtZXJnZWRBbmltYXRlZDtcbiAgaWYgKGFuaW1hdGVkID09PSBmYWxzZSkge1xuICAgIG1lcmdlZEFuaW1hdGVkID0ge1xuICAgICAgaW5rQmFyOiBmYWxzZSxcbiAgICAgIHRhYlBhbmU6IGZhbHNlXG4gICAgfTtcbiAgfSBlbHNlIGlmIChhbmltYXRlZCA9PT0gdHJ1ZSkge1xuICAgIG1lcmdlZEFuaW1hdGVkID0ge1xuICAgICAgaW5rQmFyOiB0cnVlLFxuICAgICAgdGFiUGFuZTogZmFsc2VcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIG1lcmdlZEFuaW1hdGVkID0gX29iamVjdFNwcmVhZCh7XG4gICAgICBpbmtCYXI6IHRydWVcbiAgICB9LCBfdHlwZW9mKGFuaW1hdGVkKSA9PT0gJ29iamVjdCcgPyBhbmltYXRlZCA6IHt9KTtcbiAgfVxuXG4gIC8vIEVuYWJsZSB0YWJQYW5lIGFuaW1hdGlvbiBpZiBwcm92aWRlIG1vdGlvblxuICBpZiAobWVyZ2VkQW5pbWF0ZWQudGFiUGFuZU1vdGlvbiAmJiBtZXJnZWRBbmltYXRlZC50YWJQYW5lID09PSB1bmRlZmluZWQpIHtcbiAgICBtZXJnZWRBbmltYXRlZC50YWJQYW5lID0gdHJ1ZTtcbiAgfVxuICBpZiAoIW1lcmdlZEFuaW1hdGVkLnRhYlBhbmVNb3Rpb24gJiYgbWVyZ2VkQW5pbWF0ZWQudGFiUGFuZSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB3YXJuaW5nKGZhbHNlLCAnYGFuaW1hdGVkLnRhYlBhbmVgIGlzIHRydWUgYnV0IGBhbmltYXRlZC50YWJQYW5lTW90aW9uYCBpcyBub3QgcHJvdmlkZWQuIE1vdGlvbiB3aWxsIG5vdCB3b3JrLicpO1xuICAgIH1cbiAgICBtZXJnZWRBbmltYXRlZC50YWJQYW5lID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIG1lcmdlZEFuaW1hdGVkO1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiaWRcIiwgXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJpdGVtc1wiLCBcImRpcmVjdGlvblwiLCBcImFjdGl2ZUtleVwiLCBcImRlZmF1bHRBY3RpdmVLZXlcIiwgXCJlZGl0YWJsZVwiLCBcImFuaW1hdGVkXCIsIFwidGFiUG9zaXRpb25cIiwgXCJ0YWJCYXJHdXR0ZXJcIiwgXCJ0YWJCYXJTdHlsZVwiLCBcInRhYkJhckV4dHJhQ29udGVudFwiLCBcImxvY2FsZVwiLCBcIm1vcmVJY29uXCIsIFwibW9yZVRyYW5zaXRpb25OYW1lXCIsIFwiZGVzdHJveUluYWN0aXZlVGFiUGFuZVwiLCBcInJlbmRlclRhYkJhclwiLCBcIm9uQ2hhbmdlXCIsIFwib25UYWJDbGlja1wiLCBcIm9uVGFiU2Nyb2xsXCIsIFwiZ2V0UG9wdXBDb250YWluZXJcIiwgXCJwb3B1cENsYXNzTmFtZVwiXTtcbi8vIEFjY2Vzc2liaWxpdHkgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQWNjZXNzaWJpbGl0eS9BUklBL1JvbGVzL1RhYl9Sb2xlXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgaXNNb2JpbGUgZnJvbSBcInJjLXV0aWwvZXMvaXNNb2JpbGVcIjtcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IFRhYlBhbmVsTGlzdCBmcm9tIFwiLi9UYWJQYW5lbExpc3RcIjtcbmltcG9ydCBUYWJDb250ZXh0IGZyb20gXCIuL1RhYkNvbnRleHRcIjtcbmltcG9ydCBUYWJOYXZMaXN0V3JhcHBlciBmcm9tIFwiLi9UYWJOYXZMaXN0L1dyYXBwZXJcIjtcbmltcG9ydCB1c2VBbmltYXRlQ29uZmlnIGZyb20gXCIuL2hvb2tzL3VzZUFuaW1hdGVDb25maWdcIjtcblxuLyoqXG4gKiBTaG91bGQgYWRkZWQgYW50ZDpcbiAqIC0gdHlwZVxuICpcbiAqIFJlbW92ZWQ6XG4gKiAtIG9uTmV4dENsaWNrXG4gKiAtIG9uUHJldkNsaWNrXG4gKiAtIGtleWJvYXJkXG4gKi9cblxuLy8gVXNlZCBmb3IgYWNjZXNzaWJpbGl0eVxudmFyIHV1aWQgPSAwO1xuZnVuY3Rpb24gVGFicyhfcmVmLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuICB2YXIgaWQgPSBfcmVmLmlkLFxuICAgIF9yZWYkcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX3JlZiRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy10YWJzJyA6IF9yZWYkcHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgIGl0ZW1zID0gX3JlZi5pdGVtcyxcbiAgICBkaXJlY3Rpb24gPSBfcmVmLmRpcmVjdGlvbixcbiAgICBhY3RpdmVLZXkgPSBfcmVmLmFjdGl2ZUtleSxcbiAgICBkZWZhdWx0QWN0aXZlS2V5ID0gX3JlZi5kZWZhdWx0QWN0aXZlS2V5LFxuICAgIGVkaXRhYmxlID0gX3JlZi5lZGl0YWJsZSxcbiAgICBhbmltYXRlZCA9IF9yZWYuYW5pbWF0ZWQsXG4gICAgX3JlZiR0YWJQb3NpdGlvbiA9IF9yZWYudGFiUG9zaXRpb24sXG4gICAgdGFiUG9zaXRpb24gPSBfcmVmJHRhYlBvc2l0aW9uID09PSB2b2lkIDAgPyAndG9wJyA6IF9yZWYkdGFiUG9zaXRpb24sXG4gICAgdGFiQmFyR3V0dGVyID0gX3JlZi50YWJCYXJHdXR0ZXIsXG4gICAgdGFiQmFyU3R5bGUgPSBfcmVmLnRhYkJhclN0eWxlLFxuICAgIHRhYkJhckV4dHJhQ29udGVudCA9IF9yZWYudGFiQmFyRXh0cmFDb250ZW50LFxuICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlLFxuICAgIG1vcmVJY29uID0gX3JlZi5tb3JlSWNvbixcbiAgICBtb3JlVHJhbnNpdGlvbk5hbWUgPSBfcmVmLm1vcmVUcmFuc2l0aW9uTmFtZSxcbiAgICBkZXN0cm95SW5hY3RpdmVUYWJQYW5lID0gX3JlZi5kZXN0cm95SW5hY3RpdmVUYWJQYW5lLFxuICAgIHJlbmRlclRhYkJhciA9IF9yZWYucmVuZGVyVGFiQmFyLFxuICAgIG9uQ2hhbmdlID0gX3JlZi5vbkNoYW5nZSxcbiAgICBvblRhYkNsaWNrID0gX3JlZi5vblRhYkNsaWNrLFxuICAgIG9uVGFiU2Nyb2xsID0gX3JlZi5vblRhYlNjcm9sbCxcbiAgICBnZXRQb3B1cENvbnRhaW5lciA9IF9yZWYuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgcG9wdXBDbGFzc05hbWUgPSBfcmVmLnBvcHVwQ2xhc3NOYW1lLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuICB2YXIgdGFicyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAoaXRlbXMgfHwgW10pLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW0gJiYgX3R5cGVvZihpdGVtKSA9PT0gJ29iamVjdCcgJiYgJ2tleScgaW4gaXRlbTtcbiAgICB9KTtcbiAgfSwgW2l0ZW1zXSk7XG4gIHZhciBydGwgPSBkaXJlY3Rpb24gPT09ICdydGwnO1xuICB2YXIgbWVyZ2VkQW5pbWF0ZWQgPSB1c2VBbmltYXRlQ29uZmlnKGFuaW1hdGVkKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gTW9iaWxlID09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIG1vYmlsZSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0TW9iaWxlID0gX3VzZVN0YXRlMlsxXTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBPbmx5IHVwZGF0ZSBvbiB0aGUgY2xpZW50IHNpZGVcbiAgICBzZXRNb2JpbGUoaXNNb2JpbGUoKSk7XG4gIH0sIFtdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IEFjdGl2ZSBLZXkgPT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gdXNlTWVyZ2VkU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90YWJzJDtcbiAgICAgIHJldHVybiAoX3RhYnMkID0gdGFic1swXSkgPT09IG51bGwgfHwgX3RhYnMkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGFicyQua2V5O1xuICAgIH0sIHtcbiAgICAgIHZhbHVlOiBhY3RpdmVLZXksXG4gICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRBY3RpdmVLZXlcbiAgICB9KSxcbiAgICBfdXNlTWVyZ2VkU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZU1lcmdlZFN0YXRlLCAyKSxcbiAgICBtZXJnZWRBY3RpdmVLZXkgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgIHNldE1lcmdlZEFjdGl2ZUtleSA9IF91c2VNZXJnZWRTdGF0ZTJbMV07XG4gIHZhciBfdXNlU3RhdGUzID0gdXNlU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRhYnMuZmluZEluZGV4KGZ1bmN0aW9uICh0YWIpIHtcbiAgICAgICAgcmV0dXJuIHRhYi5rZXkgPT09IG1lcmdlZEFjdGl2ZUtleTtcbiAgICAgIH0pO1xuICAgIH0pLFxuICAgIF91c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUzLCAyKSxcbiAgICBhY3RpdmVJbmRleCA9IF91c2VTdGF0ZTRbMF0sXG4gICAgc2V0QWN0aXZlSW5kZXggPSBfdXNlU3RhdGU0WzFdO1xuXG4gIC8vIFJlc2V0IGFjdGl2ZSBrZXkgaWYgbm90IGV4aXN0IGFueW1vcmVcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbmV3QWN0aXZlSW5kZXggPSB0YWJzLmZpbmRJbmRleChmdW5jdGlvbiAodGFiKSB7XG4gICAgICByZXR1cm4gdGFiLmtleSA9PT0gbWVyZ2VkQWN0aXZlS2V5O1xuICAgIH0pO1xuICAgIGlmIChuZXdBY3RpdmVJbmRleCA9PT0gLTEpIHtcbiAgICAgIHZhciBfdGFicyRuZXdBY3RpdmVJbmRleDtcbiAgICAgIG5ld0FjdGl2ZUluZGV4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oYWN0aXZlSW5kZXgsIHRhYnMubGVuZ3RoIC0gMSkpO1xuICAgICAgc2V0TWVyZ2VkQWN0aXZlS2V5KChfdGFicyRuZXdBY3RpdmVJbmRleCA9IHRhYnNbbmV3QWN0aXZlSW5kZXhdKSA9PT0gbnVsbCB8fCBfdGFicyRuZXdBY3RpdmVJbmRleCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RhYnMkbmV3QWN0aXZlSW5kZXgua2V5KTtcbiAgICB9XG4gICAgc2V0QWN0aXZlSW5kZXgobmV3QWN0aXZlSW5kZXgpO1xuICB9LCBbdGFicy5tYXAoZnVuY3Rpb24gKHRhYikge1xuICAgIHJldHVybiB0YWIua2V5O1xuICB9KS5qb2luKCdfJyksIG1lcmdlZEFjdGl2ZUtleSwgYWN0aXZlSW5kZXhdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gQWNjZXNzaWJpbGl0eSA9PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZU1lcmdlZFN0YXRlMyA9IHVzZU1lcmdlZFN0YXRlKG51bGwsIHtcbiAgICAgIHZhbHVlOiBpZFxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUzLCAyKSxcbiAgICBtZXJnZWRJZCA9IF91c2VNZXJnZWRTdGF0ZTRbMF0sXG4gICAgc2V0TWVyZ2VkSWQgPSBfdXNlTWVyZ2VkU3RhdGU0WzFdO1xuXG4gIC8vIEFzeW5jIGdlbmVyYXRlIGlkIHRvIGF2b2lkIHNzciBtYXBwaW5nIGZhaWxlZFxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghaWQpIHtcbiAgICAgIHNldE1lcmdlZElkKFwicmMtdGFicy1cIi5jb25jYXQocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0JyA/ICd0ZXN0JyA6IHV1aWQpKTtcbiAgICAgIHV1aWQgKz0gMTtcbiAgICB9XG4gIH0sIFtdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gRXZlbnRzID09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBvbkludGVybmFsVGFiQ2xpY2soa2V5LCBlKSB7XG4gICAgb25UYWJDbGljayA9PT0gbnVsbCB8fCBvblRhYkNsaWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblRhYkNsaWNrKGtleSwgZSk7XG4gICAgdmFyIGlzQWN0aXZlQ2hhbmdlZCA9IGtleSAhPT0gbWVyZ2VkQWN0aXZlS2V5O1xuICAgIHNldE1lcmdlZEFjdGl2ZUtleShrZXkpO1xuICAgIGlmIChpc0FjdGl2ZUNoYW5nZWQpIHtcbiAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShrZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBzaGFyZWRQcm9wcyA9IHtcbiAgICBpZDogbWVyZ2VkSWQsXG4gICAgYWN0aXZlS2V5OiBtZXJnZWRBY3RpdmVLZXksXG4gICAgYW5pbWF0ZWQ6IG1lcmdlZEFuaW1hdGVkLFxuICAgIHRhYlBvc2l0aW9uOiB0YWJQb3NpdGlvbixcbiAgICBydGw6IHJ0bCxcbiAgICBtb2JpbGU6IG1vYmlsZVxuICB9O1xuICB2YXIgdGFiTmF2QmFyO1xuICB2YXIgdGFiTmF2QmFyUHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNoYXJlZFByb3BzKSwge30sIHtcbiAgICBlZGl0YWJsZTogZWRpdGFibGUsXG4gICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgbW9yZUljb246IG1vcmVJY29uLFxuICAgIG1vcmVUcmFuc2l0aW9uTmFtZTogbW9yZVRyYW5zaXRpb25OYW1lLFxuICAgIHRhYkJhckd1dHRlcjogdGFiQmFyR3V0dGVyLFxuICAgIG9uVGFiQ2xpY2s6IG9uSW50ZXJuYWxUYWJDbGljayxcbiAgICBvblRhYlNjcm9sbDogb25UYWJTY3JvbGwsXG4gICAgZXh0cmE6IHRhYkJhckV4dHJhQ29udGVudCxcbiAgICBzdHlsZTogdGFiQmFyU3R5bGUsXG4gICAgcGFuZXM6IG51bGwsXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyLFxuICAgIHBvcHVwQ2xhc3NOYW1lOiBwb3B1cENsYXNzTmFtZVxuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRhYkNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZToge1xuICAgICAgdGFiczogdGFicyxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzXG4gICAgfVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgcmVmOiByZWYsXG4gICAgaWQ6IGlkLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhwcmVmaXhDbHMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdCh0YWJQb3NpdGlvbiksIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbW9iaWxlXCIpLCBtb2JpbGUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZWRpdGFibGVcIiksIGVkaXRhYmxlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgcnRsKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpXG4gIH0sIHJlc3RQcm9wcyksIHRhYk5hdkJhciwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiTmF2TGlzdFdyYXBwZXIsIF9leHRlbmRzKHt9LCB0YWJOYXZCYXJQcm9wcywge1xuICAgIHJlbmRlclRhYkJhcjogcmVuZGVyVGFiQmFyXG4gIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiUGFuZWxMaXN0LCBfZXh0ZW5kcyh7XG4gICAgZGVzdHJveUluYWN0aXZlVGFiUGFuZTogZGVzdHJveUluYWN0aXZlVGFiUGFuZVxuICB9LCBzaGFyZWRQcm9wcywge1xuICAgIGFuaW1hdGVkOiBtZXJnZWRBbmltYXRlZFxuICB9KSkpKTtcbn1cbnZhciBGb3J3YXJkVGFicyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFRhYnMpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgRm9yd2FyZFRhYnMuZGlzcGxheU5hbWUgPSAnVGFicyc7XG59XG5leHBvcnQgZGVmYXVsdCBGb3J3YXJkVGFiczsiLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCB7IGdldFRyYW5zaXRpb25OYW1lIH0gZnJvbSAnLi4vLi4vX3V0aWwvbW90aW9uJztcbnZhciBtb3Rpb24gPSB7XG4gIG1vdGlvbkFwcGVhcjogZmFsc2UsXG4gIG1vdGlvbkVudGVyOiB0cnVlLFxuICBtb3Rpb25MZWF2ZTogdHJ1ZVxufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUFuaW1hdGVDb25maWcocHJlZml4Q2xzKSB7XG4gIHZhciBhbmltYXRlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge1xuICAgIGlua0JhcjogdHJ1ZSxcbiAgICB0YWJQYW5lOiBmYWxzZVxuICB9O1xuICB2YXIgbWVyZ2VkQW5pbWF0ZWQ7XG4gIGlmIChhbmltYXRlZCA9PT0gZmFsc2UpIHtcbiAgICBtZXJnZWRBbmltYXRlZCA9IHtcbiAgICAgIGlua0JhcjogZmFsc2UsXG4gICAgICB0YWJQYW5lOiBmYWxzZVxuICAgIH07XG4gIH0gZWxzZSBpZiAoYW5pbWF0ZWQgPT09IHRydWUpIHtcbiAgICBtZXJnZWRBbmltYXRlZCA9IHtcbiAgICAgIGlua0JhcjogdHJ1ZSxcbiAgICAgIHRhYlBhbmU6IHRydWVcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIG1lcmdlZEFuaW1hdGVkID0gX2V4dGVuZHMoe1xuICAgICAgaW5rQmFyOiB0cnVlXG4gICAgfSwgX3R5cGVvZihhbmltYXRlZCkgPT09ICdvYmplY3QnID8gYW5pbWF0ZWQgOiB7fSk7XG4gIH1cbiAgaWYgKG1lcmdlZEFuaW1hdGVkLnRhYlBhbmUpIHtcbiAgICBtZXJnZWRBbmltYXRlZC50YWJQYW5lTW90aW9uID0gX2V4dGVuZHMoX2V4dGVuZHMoe30sIG1vdGlvbiksIHtcbiAgICAgIG1vdGlvbk5hbWU6IGdldFRyYW5zaXRpb25OYW1lKHByZWZpeENscywgJ3N3aXRjaCcpXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG1lcmdlZEFuaW1hdGVkO1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0b0FycmF5IGZyb20gXCJyYy11dGlsL2VzL0NoaWxkcmVuL3RvQXJyYXlcIjtcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uLy4uL191dGlsL3dhcm5pbmcnO1xuZnVuY3Rpb24gZmlsdGVyKGl0ZW1zKSB7XG4gIHJldHVybiBpdGVtcy5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICByZXR1cm4gaXRlbTtcbiAgfSk7XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VMZWdhY3lJdGVtcyhpdGVtcywgY2hpbGRyZW4pIHtcbiAgaWYgKGl0ZW1zKSB7XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoIWNoaWxkcmVuLCAnVGFicycsICdUYWJzLlRhYlBhbmUgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBgaXRlbXNgIGRpcmVjdGx5LicpIDogdm9pZCAwO1xuICB2YXIgY2hpbGRyZW5JdGVtcyA9IHRvQXJyYXkoY2hpbGRyZW4pLm1hcChmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmICggLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XG4gICAgICB2YXIga2V5ID0gbm9kZS5rZXksXG4gICAgICAgIHByb3BzID0gbm9kZS5wcm9wcztcbiAgICAgIHZhciBfYSA9IHByb3BzIHx8IHt9LFxuICAgICAgICB0YWIgPSBfYS50YWIsXG4gICAgICAgIHJlc3RQcm9wcyA9IF9fcmVzdChfYSwgW1widGFiXCJdKTtcbiAgICAgIHZhciBpdGVtID0gX2V4dGVuZHMoX2V4dGVuZHMoe1xuICAgICAgICBrZXk6IFN0cmluZyhrZXkpXG4gICAgICB9LCByZXN0UHJvcHMpLCB7XG4gICAgICAgIGxhYmVsOiB0YWJcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9KTtcbiAgcmV0dXJuIGZpbHRlcihjaGlsZHJlbkl0ZW1zKTtcbn0iLCJ2YXIgVGFiUGFuZSA9IGZ1bmN0aW9uIFRhYlBhbmUoKSB7XG4gIHJldHVybiBudWxsO1xufTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFRhYlBhbmUuZGlzcGxheU5hbWUgPSAnRGVwcmVjYXRlZFRhYlBhbmUnO1xufVxuZXhwb3J0IGRlZmF1bHQgVGFiUGFuZTsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IENsb3NlT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Nsb3NlT3V0bGluZWRcIjtcbmltcG9ydCBFbGxpcHNpc091dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FbGxpcHNpc091dGxpbmVkXCI7XG5pbXBvcnQgUGx1c091dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9QbHVzT3V0bGluZWRcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjVGFicyBmcm9tICdyYy10YWJzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IFNpemVDb250ZXh0IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9TaXplQ29udGV4dCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCB1c2VBbmltYXRlQ29uZmlnIGZyb20gJy4vaG9va3MvdXNlQW5pbWF0ZUNvbmZpZyc7XG5pbXBvcnQgdXNlTGVnYWN5SXRlbXMgZnJvbSAnLi9ob29rcy91c2VMZWdhY3lJdGVtcyc7XG5pbXBvcnQgVGFiUGFuZSBmcm9tICcuL1RhYlBhbmUnO1xuZnVuY3Rpb24gVGFicyhfYSkge1xuICB2YXIgdHlwZSA9IF9hLnR5cGUsXG4gICAgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLFxuICAgIHByb3BTaXplID0gX2Euc2l6ZSxcbiAgICBfb25FZGl0ID0gX2Eub25FZGl0LFxuICAgIGhpZGVBZGQgPSBfYS5oaWRlQWRkLFxuICAgIGNlbnRlcmVkID0gX2EuY2VudGVyZWQsXG4gICAgYWRkSWNvbiA9IF9hLmFkZEljb24sXG4gICAgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbixcbiAgICBpdGVtcyA9IF9hLml0ZW1zLFxuICAgIGFuaW1hdGVkID0gX2EuYW5pbWF0ZWQsXG4gICAgcHJvcHMgPSBfX3Jlc3QoX2EsIFtcInR5cGVcIiwgXCJjbGFzc05hbWVcIiwgXCJzaXplXCIsIFwib25FZGl0XCIsIFwiaGlkZUFkZFwiLCBcImNlbnRlcmVkXCIsIFwiYWRkSWNvblwiLCBcImNoaWxkcmVuXCIsIFwiaXRlbXNcIiwgXCJhbmltYXRlZFwiXSk7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgX3Byb3BzJG1vcmVJY29uID0gcHJvcHMubW9yZUljb24sXG4gICAgbW9yZUljb24gPSBfcHJvcHMkbW9yZUljb24gPT09IHZvaWQgMCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsbGlwc2lzT3V0bGluZWQsIG51bGwpIDogX3Byb3BzJG1vcmVJY29uO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb24sXG4gICAgZ2V0UG9wdXBDb250YWluZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQb3B1cENvbnRhaW5lcjtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygndGFicycsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBlZGl0YWJsZTtcbiAgaWYgKHR5cGUgPT09ICdlZGl0YWJsZS1jYXJkJykge1xuICAgIGVkaXRhYmxlID0ge1xuICAgICAgb25FZGl0OiBmdW5jdGlvbiBvbkVkaXQoZWRpdFR5cGUsIF9yZWYpIHtcbiAgICAgICAgdmFyIGtleSA9IF9yZWYua2V5LFxuICAgICAgICAgIGV2ZW50ID0gX3JlZi5ldmVudDtcbiAgICAgICAgX29uRWRpdCA9PT0gbnVsbCB8fCBfb25FZGl0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb25FZGl0KGVkaXRUeXBlID09PSAnYWRkJyA/IGV2ZW50IDoga2V5LCBlZGl0VHlwZSk7XG4gICAgICB9LFxuICAgICAgcmVtb3ZlSWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2xvc2VPdXRsaW5lZCwgbnVsbCksXG4gICAgICBhZGRJY29uOiBhZGRJY29uIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBsdXNPdXRsaW5lZCwgbnVsbCksXG4gICAgICBzaG93QWRkOiBoaWRlQWRkICE9PSB0cnVlXG4gICAgfTtcbiAgfVxuICB2YXIgcm9vdFByZWZpeENscyA9IGdldFByZWZpeENscygpO1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCEoJ29uUHJldkNsaWNrJyBpbiBwcm9wcykgJiYgISgnb25OZXh0Q2xpY2snIGluIHByb3BzKSwgJ1RhYnMnLCAnYG9uUHJldkNsaWNrYCBhbmQgYG9uTmV4dENsaWNrYCBoYXMgYmVlbiByZW1vdmVkLiBQbGVhc2UgdXNlIGBvblRhYlNjcm9sbGAgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgdmFyIG1lcmdlZEl0ZW1zID0gdXNlTGVnYWN5SXRlbXMoaXRlbXMsIGNoaWxkcmVuKTtcbiAgdmFyIG1lcmdlZEFuaW1hdGVkID0gdXNlQW5pbWF0ZUNvbmZpZyhwcmVmaXhDbHMsIGFuaW1hdGVkKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNpemVDb250ZXh0LkNvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoY29udGV4dFNpemUpIHtcbiAgICB2YXIgX2NsYXNzTmFtZXM7XG4gICAgdmFyIHNpemUgPSBwcm9wU2l6ZSAhPT0gdW5kZWZpbmVkID8gcHJvcFNpemUgOiBjb250ZXh0U2l6ZTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmNUYWJzLCBfZXh0ZW5kcyh7XG4gICAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lcixcbiAgICAgIG1vcmVUcmFuc2l0aW9uTmFtZTogXCJcIi5jb25jYXQocm9vdFByZWZpeENscywgXCItc2xpZGUtdXBcIilcbiAgICB9LCBwcm9wcywge1xuICAgICAgaXRlbXM6IG1lcmdlZEl0ZW1zLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChzaXplKSwgc2l6ZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jYXJkXCIpLCBbJ2NhcmQnLCAnZWRpdGFibGUtY2FyZCddLmluY2x1ZGVzKHR5cGUpKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWVkaXRhYmxlLWNhcmRcIiksIHR5cGUgPT09ICdlZGl0YWJsZS1jYXJkJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jZW50ZXJlZFwiKSwgY2VudGVyZWQpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSksXG4gICAgICBlZGl0YWJsZTogZWRpdGFibGUsXG4gICAgICBtb3JlSWNvbjogbW9yZUljb24sXG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGFuaW1hdGVkOiBtZXJnZWRBbmltYXRlZFxuICAgIH0pKTtcbiAgfSk7XG59XG5UYWJzLlRhYlBhbmUgPSBUYWJQYW5lO1xuZXhwb3J0IGRlZmF1bHQgVGFiczsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb25zdW1lciB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG52YXIgR3JpZCA9IGZ1bmN0aW9uIEdyaWQoX2EpIHtcbiAgdmFyIHByZWZpeENscyA9IF9hLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsXG4gICAgX2EkaG92ZXJhYmxlID0gX2EuaG92ZXJhYmxlLFxuICAgIGhvdmVyYWJsZSA9IF9hJGhvdmVyYWJsZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9hJGhvdmVyYWJsZSxcbiAgICBwcm9wcyA9IF9fcmVzdChfYSwgW1wicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwiaG92ZXJhYmxlXCJdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbmZpZ0NvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBnZXRQcmVmaXhDbHMgPSBfcmVmLmdldFByZWZpeENscztcbiAgICB2YXIgcHJlZml4ID0gZ2V0UHJlZml4Q2xzKCdjYXJkJywgcHJlZml4Q2xzKTtcbiAgICB2YXIgY2xhc3NTdHJpbmcgPSBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeCwgXCItZ3JpZFwiKSwgY2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeCwgXCItZ3JpZC1ob3ZlcmFibGVcIiksIGhvdmVyYWJsZSkpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NTdHJpbmdcbiAgICB9KSk7XG4gIH0pO1xufTtcbmV4cG9ydCBkZWZhdWx0IEdyaWQ7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IG9taXQgZnJvbSBcInJjLXV0aWwvZXMvb21pdFwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgU2l6ZUNvbnRleHQgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL1NpemVDb250ZXh0JztcbmltcG9ydCBTa2VsZXRvbiBmcm9tICcuLi9za2VsZXRvbic7XG5pbXBvcnQgVGFicyBmcm9tICcuLi90YWJzJztcbmltcG9ydCBHcmlkIGZyb20gJy4vR3JpZCc7XG5mdW5jdGlvbiBnZXRBY3Rpb24oYWN0aW9ucykge1xuICB2YXIgYWN0aW9uTGlzdCA9IGFjdGlvbnMubWFwKGZ1bmN0aW9uIChhY3Rpb24sIGluZGV4KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIC8qI19fUFVSRV9fKi9cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9uby1hcnJheS1pbmRleC1rZXlcbiAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgd2lkdGg6IFwiXCIuY29uY2F0KDEwMCAvIGFjdGlvbnMubGVuZ3RoLCBcIiVcIilcbiAgICAgICAgfSxcbiAgICAgICAga2V5OiBcImFjdGlvbi1cIi5jb25jYXQoaW5kZXgpXG4gICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgYWN0aW9uKSlcbiAgICApO1xuICB9KTtcbiAgcmV0dXJuIGFjdGlvbkxpc3Q7XG59XG52YXIgQ2FyZCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBfZXh0ZW5kczIsIF9jbGFzc05hbWVzO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG4gIHZhciBzaXplID0gUmVhY3QudXNlQ29udGV4dChTaXplQ29udGV4dCk7XG4gIHZhciBvblRhYkNoYW5nZSA9IGZ1bmN0aW9uIG9uVGFiQ2hhbmdlKGtleSkge1xuICAgIHZhciBfYTtcbiAgICAoX2EgPSBwcm9wcy5vblRhYkNoYW5nZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwocHJvcHMsIGtleSk7XG4gIH07XG4gIHZhciBpc0NvbnRhaW5HcmlkID0gZnVuY3Rpb24gaXNDb250YWluR3JpZCgpIHtcbiAgICB2YXIgY29udGFpbkdyaWQ7XG4gICAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChwcm9wcy5jaGlsZHJlbiwgZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQudHlwZSAmJiBlbGVtZW50LnR5cGUgPT09IEdyaWQpIHtcbiAgICAgICAgY29udGFpbkdyaWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjb250YWluR3JpZDtcbiAgfTtcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgZXh0cmEgPSBwcm9wcy5leHRyYSxcbiAgICBfcHJvcHMkaGVhZFN0eWxlID0gcHJvcHMuaGVhZFN0eWxlLFxuICAgIGhlYWRTdHlsZSA9IF9wcm9wcyRoZWFkU3R5bGUgPT09IHZvaWQgMCA/IHt9IDogX3Byb3BzJGhlYWRTdHlsZSxcbiAgICBfcHJvcHMkYm9keVN0eWxlID0gcHJvcHMuYm9keVN0eWxlLFxuICAgIGJvZHlTdHlsZSA9IF9wcm9wcyRib2R5U3R5bGUgPT09IHZvaWQgMCA/IHt9IDogX3Byb3BzJGJvZHlTdHlsZSxcbiAgICB0aXRsZSA9IHByb3BzLnRpdGxlLFxuICAgIGxvYWRpbmcgPSBwcm9wcy5sb2FkaW5nLFxuICAgIF9wcm9wcyRib3JkZXJlZCA9IHByb3BzLmJvcmRlcmVkLFxuICAgIGJvcmRlcmVkID0gX3Byb3BzJGJvcmRlcmVkID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGJvcmRlcmVkLFxuICAgIGN1c3RvbWl6ZVNpemUgPSBwcm9wcy5zaXplLFxuICAgIHR5cGUgPSBwcm9wcy50eXBlLFxuICAgIGNvdmVyID0gcHJvcHMuY292ZXIsXG4gICAgYWN0aW9ucyA9IHByb3BzLmFjdGlvbnMsXG4gICAgdGFiTGlzdCA9IHByb3BzLnRhYkxpc3QsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBhY3RpdmVUYWJLZXkgPSBwcm9wcy5hY3RpdmVUYWJLZXksXG4gICAgZGVmYXVsdEFjdGl2ZVRhYktleSA9IHByb3BzLmRlZmF1bHRBY3RpdmVUYWJLZXksXG4gICAgdGFiQmFyRXh0cmFDb250ZW50ID0gcHJvcHMudGFiQmFyRXh0cmFDb250ZW50LFxuICAgIGhvdmVyYWJsZSA9IHByb3BzLmhvdmVyYWJsZSxcbiAgICBfcHJvcHMkdGFiUHJvcHMgPSBwcm9wcy50YWJQcm9wcyxcbiAgICB0YWJQcm9wcyA9IF9wcm9wcyR0YWJQcm9wcyA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkdGFiUHJvcHMsXG4gICAgb3RoZXJzID0gX19yZXN0KHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJleHRyYVwiLCBcImhlYWRTdHlsZVwiLCBcImJvZHlTdHlsZVwiLCBcInRpdGxlXCIsIFwibG9hZGluZ1wiLCBcImJvcmRlcmVkXCIsIFwic2l6ZVwiLCBcInR5cGVcIiwgXCJjb3ZlclwiLCBcImFjdGlvbnNcIiwgXCJ0YWJMaXN0XCIsIFwiY2hpbGRyZW5cIiwgXCJhY3RpdmVUYWJLZXlcIiwgXCJkZWZhdWx0QWN0aXZlVGFiS2V5XCIsIFwidGFiQmFyRXh0cmFDb250ZW50XCIsIFwiaG92ZXJhYmxlXCIsIFwidGFiUHJvcHNcIl0pO1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdjYXJkJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIGxvYWRpbmdCbG9jayA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNrZWxldG9uLCB7XG4gICAgbG9hZGluZzogdHJ1ZSxcbiAgICBhY3RpdmU6IHRydWUsXG4gICAgcGFyYWdyYXBoOiB7XG4gICAgICByb3dzOiA0XG4gICAgfSxcbiAgICB0aXRsZTogZmFsc2VcbiAgfSwgY2hpbGRyZW4pO1xuICB2YXIgaGFzQWN0aXZlVGFiS2V5ID0gYWN0aXZlVGFiS2V5ICE9PSB1bmRlZmluZWQ7XG4gIHZhciBleHRyYVByb3BzID0gX2V4dGVuZHMoX2V4dGVuZHMoe30sIHRhYlByb3BzKSwgKF9leHRlbmRzMiA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2V4dGVuZHMyLCBoYXNBY3RpdmVUYWJLZXkgPyAnYWN0aXZlS2V5JyA6ICdkZWZhdWx0QWN0aXZlS2V5JywgaGFzQWN0aXZlVGFiS2V5ID8gYWN0aXZlVGFiS2V5IDogZGVmYXVsdEFjdGl2ZVRhYktleSksIF9kZWZpbmVQcm9wZXJ0eShfZXh0ZW5kczIsIFwidGFiQmFyRXh0cmFDb250ZW50XCIsIHRhYkJhckV4dHJhQ29udGVudCksIF9leHRlbmRzMikpO1xuICB2YXIgaGVhZDtcbiAgdmFyIHRhYnMgPSB0YWJMaXN0ICYmIHRhYkxpc3QubGVuZ3RoID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGFicywgX2V4dGVuZHMoe1xuICAgIHNpemU6IFwibGFyZ2VcIlxuICB9LCBleHRyYVByb3BzLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhlYWQtdGFic1wiKSxcbiAgICBvbkNoYW5nZTogb25UYWJDaGFuZ2UsXG4gICAgaXRlbXM6IHRhYkxpc3QubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgX2E7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogaXRlbS50YWIsXG4gICAgICAgIGtleTogaXRlbS5rZXksXG4gICAgICAgIGRpc2FibGVkOiAoX2EgPSBpdGVtLmRpc2FibGVkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZVxuICAgICAgfTtcbiAgICB9KVxuICB9KSkgOiBudWxsO1xuICBpZiAodGl0bGUgfHwgZXh0cmEgfHwgdGFicykge1xuICAgIGhlYWQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGVhZFwiKSxcbiAgICAgIHN0eWxlOiBoZWFkU3R5bGVcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGVhZC13cmFwcGVyXCIpXG4gICAgfSwgdGl0bGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhlYWQtdGl0bGVcIilcbiAgICB9LCB0aXRsZSksIGV4dHJhICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1leHRyYVwiKVxuICAgIH0sIGV4dHJhKSksIHRhYnMpO1xuICB9XG4gIHZhciBjb3ZlckRvbSA9IGNvdmVyID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb3ZlclwiKVxuICB9LCBjb3ZlcikgOiBudWxsO1xuICB2YXIgYm9keSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYm9keVwiKSxcbiAgICBzdHlsZTogYm9keVN0eWxlXG4gIH0sIGxvYWRpbmcgPyBsb2FkaW5nQmxvY2sgOiBjaGlsZHJlbik7XG4gIHZhciBhY3Rpb25Eb20gPSBhY3Rpb25zICYmIGFjdGlvbnMubGVuZ3RoID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFjdGlvbnNcIilcbiAgfSwgZ2V0QWN0aW9uKGFjdGlvbnMpKSA6IG51bGw7XG4gIHZhciBkaXZQcm9wcyA9IG9taXQob3RoZXJzLCBbJ29uVGFiQ2hhbmdlJ10pO1xuICB2YXIgbWVyZ2VkU2l6ZSA9IGN1c3RvbWl6ZVNpemUgfHwgc2l6ZTtcbiAgdmFyIGNsYXNzU3RyaW5nID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbG9hZGluZ1wiKSwgbG9hZGluZyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ib3JkZXJlZFwiKSwgYm9yZGVyZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaG92ZXJhYmxlXCIpLCBob3ZlcmFibGUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGFpbi1ncmlkXCIpLCBpc0NvbnRhaW5HcmlkKCkpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGFpbi10YWJzXCIpLCB0YWJMaXN0ICYmIHRhYkxpc3QubGVuZ3RoKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQobWVyZ2VkU2l6ZSksIG1lcmdlZFNpemUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdHlwZS1cIikuY29uY2F0KHR5cGUpLCAhIXR5cGUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIHJlZjogcmVmXG4gIH0sIGRpdlByb3BzLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc1N0cmluZ1xuICB9KSwgaGVhZCwgY292ZXJEb20sIGJvZHksIGFjdGlvbkRvbSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IENhcmQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb25zdW1lciB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG52YXIgTWV0YSA9IGZ1bmN0aW9uIE1ldGEocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbmZpZ0NvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBnZXRQcmVmaXhDbHMgPSBfcmVmLmdldFByZWZpeENscztcbiAgICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgYXZhdGFyID0gcHJvcHMuYXZhdGFyLFxuICAgICAgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uID0gcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBvdGhlcnMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcImF2YXRhclwiLCBcInRpdGxlXCIsIFwiZGVzY3JpcHRpb25cIl0pO1xuICAgIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2NhcmQnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgIHZhciBjbGFzc1N0cmluZyA9IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tZXRhXCIpLCBjbGFzc05hbWUpO1xuICAgIHZhciBhdmF0YXJEb20gPSBhdmF0YXIgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWV0YS1hdmF0YXJcIilcbiAgICB9LCBhdmF0YXIpIDogbnVsbDtcbiAgICB2YXIgdGl0bGVEb20gPSB0aXRsZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tZXRhLXRpdGxlXCIpXG4gICAgfSwgdGl0bGUpIDogbnVsbDtcbiAgICB2YXIgZGVzY3JpcHRpb25Eb20gPSBkZXNjcmlwdGlvbiA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tZXRhLWRlc2NyaXB0aW9uXCIpXG4gICAgfSwgZGVzY3JpcHRpb24pIDogbnVsbDtcbiAgICB2YXIgTWV0YURldGFpbCA9IHRpdGxlRG9tIHx8IGRlc2NyaXB0aW9uRG9tID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1ldGEtZGV0YWlsXCIpXG4gICAgfSwgdGl0bGVEb20sIGRlc2NyaXB0aW9uRG9tKSA6IG51bGw7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCBvdGhlcnMsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NTdHJpbmdcbiAgICB9KSwgYXZhdGFyRG9tLCBNZXRhRGV0YWlsKTtcbiAgfSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgTWV0YTsiLCJpbXBvcnQgSW50ZXJuYWxDYXJkIGZyb20gJy4vQ2FyZCc7XG5pbXBvcnQgR3JpZCBmcm9tICcuL0dyaWQnO1xuaW1wb3J0IE1ldGEgZnJvbSAnLi9NZXRhJztcbnZhciBDYXJkID0gSW50ZXJuYWxDYXJkO1xuQ2FyZC5HcmlkID0gR3JpZDtcbkNhcmQuTWV0YSA9IE1ldGE7XG5leHBvcnQgZGVmYXVsdCBDYXJkOyIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKipcbiAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IERhdGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICogfSwgXy5ub3coKSk7XG4gKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuICovXG52YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiByb290LkRhdGUubm93KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5vdztcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBub3cgPSByZXF1aXJlKCcuL25vdycpLFxuICAgIHRvTnVtYmVyID0gcmVxdWlyZSgnLi90b051bWJlcicpO1xuXG4vKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAqIGludm9rZWQuIFRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgIG1ldGhvZCB0byBjYW5jZWxcbiAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gKiBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGAgdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkXG4gKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICogaW52b2NhdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIGRlYm91bmNlZCBmdW5jdGlvblxuICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICpcbiAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICpcbiAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdhaXRdXG4gKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gKlxuICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gKiAgICdsZWFkaW5nJzogdHJ1ZSxcbiAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAqIH0pKTtcbiAqXG4gKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7XG4gKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gKlxuICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyBkZWJvdW5jZWQgaW52b2NhdGlvbi5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICovXG5mdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciBsYXN0QXJncyxcbiAgICAgIGxhc3RUaGlzLFxuICAgICAgbWF4V2FpdCxcbiAgICAgIHJlc3VsdCxcbiAgICAgIHRpbWVySWQsXG4gICAgICBsYXN0Q2FsbFRpbWUsXG4gICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICBsZWFkaW5nID0gZmFsc2UsXG4gICAgICBtYXhpbmcgPSBmYWxzZSxcbiAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDtcbiAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zO1xuICAgIG1heFdhaXQgPSBtYXhpbmcgPyBuYXRpdmVNYXgodG9OdW1iZXIob3B0aW9ucy5tYXhXYWl0KSB8fCAwLCB3YWl0KSA6IG1heFdhaXQ7XG4gICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZUZ1bmModGltZSkge1xuICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsXG4gICAgICAgIHRoaXNBcmcgPSBsYXN0VGhpcztcblxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpIHtcbiAgICAvLyBSZXNldCBhbnkgYG1heFdhaXRgIHRpbWVyLlxuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAvLyBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSB0cmFpbGluZyBlZGdlLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuXG4gICAgcmV0dXJuIGxlYWRpbmcgPyBpbnZva2VGdW5jKHRpbWUpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZSxcbiAgICAgICAgdGltZVdhaXRpbmcgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICByZXR1cm4gbWF4aW5nXG4gICAgICA/IG5hdGl2ZU1pbih0aW1lV2FpdGluZywgbWF4V2FpdCAtIHRpbWVTaW5jZUxhc3RJbnZva2UpXG4gICAgICA6IHRpbWVXYWl0aW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lO1xuXG4gICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwsIGFjdGl2aXR5IGhhcyBzdG9wcGVkIGFuZCB3ZSdyZSBhdCB0aGVcbiAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgIC8vIGl0IGFzIHRoZSB0cmFpbGluZyBlZGdlLCBvciB3ZSd2ZSBoaXQgdGhlIGBtYXhXYWl0YCBsaW1pdC5cbiAgICByZXR1cm4gKGxhc3RDYWxsVGltZSA9PT0gdW5kZWZpbmVkIHx8ICh0aW1lU2luY2VMYXN0Q2FsbCA+PSB3YWl0KSB8fFxuICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHtcbiAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7XG4gICAgfVxuICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkge1xuICAgIHRpbWVySWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgLy8gZGVib3VuY2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7XG4gICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICB9XG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICB9XG4gICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3coKSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKSxcbiAgICAgICAgaXNJbnZva2luZyA9IHNob3VsZEludm9rZSh0aW1lKTtcblxuICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lO1xuXG4gICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgICBpZiAobWF4aW5nKSB7XG4gICAgICAgIC8vIEhhbmRsZSBpbnZvY2F0aW9ucyBpbiBhIHRpZ2h0IGxvb3AuXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgcmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICBkZWJvdW5jZWQuZmx1c2ggPSBmbHVzaDtcbiAgcmV0dXJuIGRlYm91bmNlZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJvdW5jZTtcbiIsImltcG9ydCB3YXJuaW5nIGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmZ1bmN0aW9uIHJlbW92ZUZyb21DaGVja2VkS2V5cyhoYWxmQ2hlY2tlZEtleXMsIGNoZWNrZWRLZXlzKSB7XG4gIHZhciBmaWx0ZXJlZEtleXMgPSBuZXcgU2V0KCk7XG4gIGhhbGZDaGVja2VkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoIWNoZWNrZWRLZXlzLmhhcyhrZXkpKSB7XG4gICAgICBmaWx0ZXJlZEtleXMuYWRkKGtleSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGZpbHRlcmVkS2V5cztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0NoZWNrRGlzYWJsZWQobm9kZSkge1xuICB2YXIgX3JlZiA9IG5vZGUgfHwge30sXG4gICAgZGlzYWJsZWQgPSBfcmVmLmRpc2FibGVkLFxuICAgIGRpc2FibGVDaGVja2JveCA9IF9yZWYuZGlzYWJsZUNoZWNrYm94LFxuICAgIGNoZWNrYWJsZSA9IF9yZWYuY2hlY2thYmxlO1xuICByZXR1cm4gISEoZGlzYWJsZWQgfHwgZGlzYWJsZUNoZWNrYm94KSB8fCBjaGVja2FibGUgPT09IGZhbHNlO1xufVxuLy8gRmlsbCBtaXNzIGtleXNcbmZ1bmN0aW9uIGZpbGxDb25kdWN0Q2hlY2soa2V5cywgbGV2ZWxFbnRpdGllcywgbWF4TGV2ZWwsIHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQpIHtcbiAgdmFyIGNoZWNrZWRLZXlzID0gbmV3IFNldChrZXlzKTtcbiAgdmFyIGhhbGZDaGVja2VkS2V5cyA9IG5ldyBTZXQoKTtcbiAgLy8gQWRkIGNoZWNrZWQga2V5cyB0b3AgdG8gYm90dG9tXG4gIGZvciAodmFyIGxldmVsID0gMDsgbGV2ZWwgPD0gbWF4TGV2ZWw7IGxldmVsICs9IDEpIHtcbiAgICB2YXIgZW50aXRpZXMgPSBsZXZlbEVudGl0aWVzLmdldChsZXZlbCkgfHwgbmV3IFNldCgpO1xuICAgIGVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgdmFyIGtleSA9IGVudGl0eS5rZXksXG4gICAgICAgIG5vZGUgPSBlbnRpdHkubm9kZSxcbiAgICAgICAgX2VudGl0eSRjaGlsZHJlbiA9IGVudGl0eS5jaGlsZHJlbixcbiAgICAgICAgY2hpbGRyZW4gPSBfZW50aXR5JGNoaWxkcmVuID09PSB2b2lkIDAgPyBbXSA6IF9lbnRpdHkkY2hpbGRyZW47XG4gICAgICBpZiAoY2hlY2tlZEtleXMuaGFzKGtleSkgJiYgIXN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQobm9kZSkpIHtcbiAgICAgICAgY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjaGlsZEVudGl0eSkge1xuICAgICAgICAgIHJldHVybiAhc3ludGhldGljR2V0Q2hlY2tEaXNhYmxlZChjaGlsZEVudGl0eS5ub2RlKTtcbiAgICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGRFbnRpdHkpIHtcbiAgICAgICAgICBjaGVja2VkS2V5cy5hZGQoY2hpbGRFbnRpdHkua2V5KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLy8gQWRkIGNoZWNrZWQga2V5cyBmcm9tIGJvdHRvbSB0byB0b3BcbiAgdmFyIHZpc2l0ZWRLZXlzID0gbmV3IFNldCgpO1xuICBmb3IgKHZhciBfbGV2ZWwgPSBtYXhMZXZlbDsgX2xldmVsID49IDA7IF9sZXZlbCAtPSAxKSB7XG4gICAgdmFyIF9lbnRpdGllcyA9IGxldmVsRW50aXRpZXMuZ2V0KF9sZXZlbCkgfHwgbmV3IFNldCgpO1xuICAgIF9lbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgIHZhciBwYXJlbnQgPSBlbnRpdHkucGFyZW50LFxuICAgICAgICBub2RlID0gZW50aXR5Lm5vZGU7XG4gICAgICAvLyBTa2lwIGlmIG5vIG5lZWQgdG8gY2hlY2tcbiAgICAgIGlmIChzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKG5vZGUpIHx8ICFlbnRpdHkucGFyZW50IHx8IHZpc2l0ZWRLZXlzLmhhcyhlbnRpdHkucGFyZW50LmtleSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gU2tpcCBpZiBwYXJlbnQgaXMgZGlzYWJsZWRcbiAgICAgIGlmIChzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKGVudGl0eS5wYXJlbnQubm9kZSkpIHtcbiAgICAgICAgdmlzaXRlZEtleXMuYWRkKHBhcmVudC5rZXkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgYWxsQ2hlY2tlZCA9IHRydWU7XG4gICAgICB2YXIgcGFydGlhbENoZWNrZWQgPSBmYWxzZTtcbiAgICAgIChwYXJlbnQuY2hpbGRyZW4gfHwgW10pLmZpbHRlcihmdW5jdGlvbiAoY2hpbGRFbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuICFzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKGNoaWxkRW50aXR5Lm5vZGUpO1xuICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgdmFyIGtleSA9IF9yZWYyLmtleTtcbiAgICAgICAgdmFyIGNoZWNrZWQgPSBjaGVja2VkS2V5cy5oYXMoa2V5KTtcbiAgICAgICAgaWYgKGFsbENoZWNrZWQgJiYgIWNoZWNrZWQpIHtcbiAgICAgICAgICBhbGxDaGVja2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXJ0aWFsQ2hlY2tlZCAmJiAoY2hlY2tlZCB8fCBoYWxmQ2hlY2tlZEtleXMuaGFzKGtleSkpKSB7XG4gICAgICAgICAgcGFydGlhbENoZWNrZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChhbGxDaGVja2VkKSB7XG4gICAgICAgIGNoZWNrZWRLZXlzLmFkZChwYXJlbnQua2V5KTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJ0aWFsQ2hlY2tlZCkge1xuICAgICAgICBoYWxmQ2hlY2tlZEtleXMuYWRkKHBhcmVudC5rZXkpO1xuICAgICAgfVxuICAgICAgdmlzaXRlZEtleXMuYWRkKHBhcmVudC5rZXkpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiB7XG4gICAgY2hlY2tlZEtleXM6IEFycmF5LmZyb20oY2hlY2tlZEtleXMpLFxuICAgIGhhbGZDaGVja2VkS2V5czogQXJyYXkuZnJvbShyZW1vdmVGcm9tQ2hlY2tlZEtleXMoaGFsZkNoZWNrZWRLZXlzLCBjaGVja2VkS2V5cykpXG4gIH07XG59XG4vLyBSZW1vdmUgdXNlbGVzcyBrZXlcbmZ1bmN0aW9uIGNsZWFuQ29uZHVjdENoZWNrKGtleXMsIGhhbGZLZXlzLCBsZXZlbEVudGl0aWVzLCBtYXhMZXZlbCwgc3ludGhldGljR2V0Q2hlY2tEaXNhYmxlZCkge1xuICB2YXIgY2hlY2tlZEtleXMgPSBuZXcgU2V0KGtleXMpO1xuICB2YXIgaGFsZkNoZWNrZWRLZXlzID0gbmV3IFNldChoYWxmS2V5cyk7XG4gIC8vIFJlbW92ZSBjaGVja2VkIGtleXMgZnJvbSB0b3AgdG8gYm90dG9tXG4gIGZvciAodmFyIGxldmVsID0gMDsgbGV2ZWwgPD0gbWF4TGV2ZWw7IGxldmVsICs9IDEpIHtcbiAgICB2YXIgZW50aXRpZXMgPSBsZXZlbEVudGl0aWVzLmdldChsZXZlbCkgfHwgbmV3IFNldCgpO1xuICAgIGVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgdmFyIGtleSA9IGVudGl0eS5rZXksXG4gICAgICAgIG5vZGUgPSBlbnRpdHkubm9kZSxcbiAgICAgICAgX2VudGl0eSRjaGlsZHJlbjIgPSBlbnRpdHkuY2hpbGRyZW4sXG4gICAgICAgIGNoaWxkcmVuID0gX2VudGl0eSRjaGlsZHJlbjIgPT09IHZvaWQgMCA/IFtdIDogX2VudGl0eSRjaGlsZHJlbjI7XG4gICAgICBpZiAoIWNoZWNrZWRLZXlzLmhhcyhrZXkpICYmICFoYWxmQ2hlY2tlZEtleXMuaGFzKGtleSkgJiYgIXN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQobm9kZSkpIHtcbiAgICAgICAgY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjaGlsZEVudGl0eSkge1xuICAgICAgICAgIHJldHVybiAhc3ludGhldGljR2V0Q2hlY2tEaXNhYmxlZChjaGlsZEVudGl0eS5ub2RlKTtcbiAgICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGRFbnRpdHkpIHtcbiAgICAgICAgICBjaGVja2VkS2V5cy5kZWxldGUoY2hpbGRFbnRpdHkua2V5KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLy8gUmVtb3ZlIGNoZWNrZWQga2V5cyBmb3JtIGJvdHRvbSB0byB0b3BcbiAgaGFsZkNoZWNrZWRLZXlzID0gbmV3IFNldCgpO1xuICB2YXIgdmlzaXRlZEtleXMgPSBuZXcgU2V0KCk7XG4gIGZvciAodmFyIF9sZXZlbDIgPSBtYXhMZXZlbDsgX2xldmVsMiA+PSAwOyBfbGV2ZWwyIC09IDEpIHtcbiAgICB2YXIgX2VudGl0aWVzMiA9IGxldmVsRW50aXRpZXMuZ2V0KF9sZXZlbDIpIHx8IG5ldyBTZXQoKTtcbiAgICBfZW50aXRpZXMyLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgdmFyIHBhcmVudCA9IGVudGl0eS5wYXJlbnQsXG4gICAgICAgIG5vZGUgPSBlbnRpdHkubm9kZTtcbiAgICAgIC8vIFNraXAgaWYgbm8gbmVlZCB0byBjaGVja1xuICAgICAgaWYgKHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQobm9kZSkgfHwgIWVudGl0eS5wYXJlbnQgfHwgdmlzaXRlZEtleXMuaGFzKGVudGl0eS5wYXJlbnQua2V5KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBTa2lwIGlmIHBhcmVudCBpcyBkaXNhYmxlZFxuICAgICAgaWYgKHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQoZW50aXR5LnBhcmVudC5ub2RlKSkge1xuICAgICAgICB2aXNpdGVkS2V5cy5hZGQocGFyZW50LmtleSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBhbGxDaGVja2VkID0gdHJ1ZTtcbiAgICAgIHZhciBwYXJ0aWFsQ2hlY2tlZCA9IGZhbHNlO1xuICAgICAgKHBhcmVudC5jaGlsZHJlbiB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChjaGlsZEVudGl0eSkge1xuICAgICAgICByZXR1cm4gIXN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQoY2hpbGRFbnRpdHkubm9kZSk7XG4gICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICB2YXIga2V5ID0gX3JlZjMua2V5O1xuICAgICAgICB2YXIgY2hlY2tlZCA9IGNoZWNrZWRLZXlzLmhhcyhrZXkpO1xuICAgICAgICBpZiAoYWxsQ2hlY2tlZCAmJiAhY2hlY2tlZCkge1xuICAgICAgICAgIGFsbENoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBhcnRpYWxDaGVja2VkICYmIChjaGVja2VkIHx8IGhhbGZDaGVja2VkS2V5cy5oYXMoa2V5KSkpIHtcbiAgICAgICAgICBwYXJ0aWFsQ2hlY2tlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKCFhbGxDaGVja2VkKSB7XG4gICAgICAgIGNoZWNrZWRLZXlzLmRlbGV0ZShwYXJlbnQua2V5KTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJ0aWFsQ2hlY2tlZCkge1xuICAgICAgICBoYWxmQ2hlY2tlZEtleXMuYWRkKHBhcmVudC5rZXkpO1xuICAgICAgfVxuICAgICAgdmlzaXRlZEtleXMuYWRkKHBhcmVudC5rZXkpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiB7XG4gICAgY2hlY2tlZEtleXM6IEFycmF5LmZyb20oY2hlY2tlZEtleXMpLFxuICAgIGhhbGZDaGVja2VkS2V5czogQXJyYXkuZnJvbShyZW1vdmVGcm9tQ2hlY2tlZEtleXMoaGFsZkNoZWNrZWRLZXlzLCBjaGVja2VkS2V5cykpXG4gIH07XG59XG4vKipcbiAqIENvbmR1Y3Qgd2l0aCBrZXlzLlxuICogQHBhcmFtIGtleUxpc3QgY3VycmVudCBrZXkgbGlzdFxuICogQHBhcmFtIGtleUVudGl0aWVzIGtleSAtIGRhdGFFbnRpdHkgbWFwXG4gKiBAcGFyYW0gbW9kZSBgZmlsbGAgdG8gZmlsbCBtaXNzaW5nIGtleSwgYGNsZWFuYCB0byByZW1vdmUgdXNlbGVzcyBrZXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmR1Y3RDaGVjayhrZXlMaXN0LCBjaGVja2VkLCBrZXlFbnRpdGllcywgZ2V0Q2hlY2tEaXNhYmxlZCkge1xuICB2YXIgd2FybmluZ01pc3NLZXlzID0gW107XG4gIHZhciBzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkO1xuICBpZiAoZ2V0Q2hlY2tEaXNhYmxlZCkge1xuICAgIHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQgPSBnZXRDaGVja0Rpc2FibGVkO1xuICB9IGVsc2Uge1xuICAgIHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQgPSBpc0NoZWNrRGlzYWJsZWQ7XG4gIH1cbiAgLy8gV2Ugb25seSBoYW5kbGUgZXhpc3Qga2V5c1xuICB2YXIga2V5cyA9IG5ldyBTZXQoa2V5TGlzdC5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBoYXNFbnRpdHkgPSAhIWtleUVudGl0aWVzW2tleV07XG4gICAgaWYgKCFoYXNFbnRpdHkpIHtcbiAgICAgIHdhcm5pbmdNaXNzS2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiBoYXNFbnRpdHk7XG4gIH0pKTtcbiAgdmFyIGxldmVsRW50aXRpZXMgPSBuZXcgTWFwKCk7XG4gIHZhciBtYXhMZXZlbCA9IDA7XG4gIC8vIENvbnZlcnQgZW50aXRpZXMgYnkgbGV2ZWwgZm9yIGNhbGN1bGF0aW9uXG4gIE9iamVjdC5rZXlzKGtleUVudGl0aWVzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgZW50aXR5ID0ga2V5RW50aXRpZXNba2V5XTtcbiAgICB2YXIgbGV2ZWwgPSBlbnRpdHkubGV2ZWw7XG4gICAgdmFyIGxldmVsU2V0ID0gbGV2ZWxFbnRpdGllcy5nZXQobGV2ZWwpO1xuICAgIGlmICghbGV2ZWxTZXQpIHtcbiAgICAgIGxldmVsU2V0ID0gbmV3IFNldCgpO1xuICAgICAgbGV2ZWxFbnRpdGllcy5zZXQobGV2ZWwsIGxldmVsU2V0KTtcbiAgICB9XG4gICAgbGV2ZWxTZXQuYWRkKGVudGl0eSk7XG4gICAgbWF4TGV2ZWwgPSBNYXRoLm1heChtYXhMZXZlbCwgbGV2ZWwpO1xuICB9KTtcbiAgd2FybmluZyghd2FybmluZ01pc3NLZXlzLmxlbmd0aCwgXCJUcmVlIG1pc3NpbmcgZm9sbG93IGtleXM6IFwiLmNvbmNhdCh3YXJuaW5nTWlzc0tleXMuc2xpY2UoMCwgMTAwKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBcIidcIi5jb25jYXQoa2V5LCBcIidcIik7XG4gIH0pLmpvaW4oJywgJykpKTtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKGNoZWNrZWQgPT09IHRydWUpIHtcbiAgICByZXN1bHQgPSBmaWxsQ29uZHVjdENoZWNrKGtleXMsIGxldmVsRW50aXRpZXMsIG1heExldmVsLCBzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSBjbGVhbkNvbmR1Y3RDaGVjayhrZXlzLCBjaGVja2VkLmhhbGZDaGVja2VkS2V5cywgbGV2ZWxFbnRpdGllcywgbWF4TGV2ZWwsIHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImNoaWxkcmVuXCJdO1xuaW1wb3J0IHRvQXJyYXkgZnJvbSBcInJjLXV0aWwvZXMvQ2hpbGRyZW4vdG9BcnJheVwiO1xuaW1wb3J0IG9taXQgZnJvbSBcInJjLXV0aWwvZXMvb21pdFwiO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBvc2l0aW9uKGxldmVsLCBpbmRleCkge1xuICByZXR1cm4gXCJcIi5jb25jYXQobGV2ZWwsIFwiLVwiKS5jb25jYXQoaW5kZXgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVHJlZU5vZGUobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLnR5cGUgJiYgbm9kZS50eXBlLmlzVHJlZU5vZGU7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0S2V5KGtleSwgcG9zKSB7XG4gIGlmIChrZXkgIT09IG51bGwgJiYga2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ga2V5O1xuICB9XG4gIHJldHVybiBwb3M7XG59XG5leHBvcnQgZnVuY3Rpb24gZmlsbEZpZWxkTmFtZXMoZmllbGROYW1lcykge1xuICB2YXIgX3JlZiA9IGZpZWxkTmFtZXMgfHwge30sXG4gICAgdGl0bGUgPSBfcmVmLnRpdGxlLFxuICAgIF90aXRsZSA9IF9yZWYuX3RpdGxlLFxuICAgIGtleSA9IF9yZWYua2V5LFxuICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgdmFyIG1lcmdlZFRpdGxlID0gdGl0bGUgfHwgJ3RpdGxlJztcbiAgcmV0dXJuIHtcbiAgICB0aXRsZTogbWVyZ2VkVGl0bGUsXG4gICAgX3RpdGxlOiBfdGl0bGUgfHwgW21lcmdlZFRpdGxlXSxcbiAgICBrZXk6IGtleSB8fCAna2V5JyxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4gfHwgJ2NoaWxkcmVuJ1xuICB9O1xufVxuLyoqXG4gKiBXYXJuaW5nIGlmIFRyZWVOb2RlIGRvIG5vdCBwcm92aWRlcyBrZXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhcm5pbmdXaXRob3V0S2V5KHRyZWVEYXRhLCBmaWVsZE5hbWVzKSB7XG4gIHZhciBrZXlzID0gbmV3IE1hcCgpO1xuICBmdW5jdGlvbiBkaWcobGlzdCkge1xuICAgIHZhciBwYXRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAnJztcbiAgICAobGlzdCB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAodHJlZU5vZGUpIHtcbiAgICAgIHZhciBrZXkgPSB0cmVlTm9kZVtmaWVsZE5hbWVzLmtleV07XG4gICAgICB2YXIgY2hpbGRyZW4gPSB0cmVlTm9kZVtmaWVsZE5hbWVzLmNoaWxkcmVuXTtcbiAgICAgIHdhcm5pbmcoa2V5ICE9PSBudWxsICYmIGtleSAhPT0gdW5kZWZpbmVkLCBcIlRyZWUgbm9kZSBtdXN0IGhhdmUgYSBjZXJ0YWluIGtleTogW1wiLmNvbmNhdChwYXRoKS5jb25jYXQoa2V5LCBcIl1cIikpO1xuICAgICAgdmFyIHJlY29yZEtleSA9IFN0cmluZyhrZXkpO1xuICAgICAgd2FybmluZygha2V5cy5oYXMocmVjb3JkS2V5KSB8fCBrZXkgPT09IG51bGwgfHwga2V5ID09PSB1bmRlZmluZWQsIFwiU2FtZSAna2V5JyBleGlzdCBpbiB0aGUgVHJlZTogXCIuY29uY2F0KHJlY29yZEtleSkpO1xuICAgICAga2V5cy5zZXQocmVjb3JkS2V5LCB0cnVlKTtcbiAgICAgIGRpZyhjaGlsZHJlbiwgXCJcIi5jb25jYXQocGF0aCkuY29uY2F0KHJlY29yZEtleSwgXCIgPiBcIikpO1xuICAgIH0pO1xuICB9XG4gIGRpZyh0cmVlRGF0YSk7XG59XG4vKipcbiAqIENvbnZlcnQgYGNoaWxkcmVuYCBvZiBUcmVlIGludG8gYHRyZWVEYXRhYCBzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VHJlZVRvRGF0YShyb290Tm9kZXMpIHtcbiAgZnVuY3Rpb24gZGlnKG5vZGUpIHtcbiAgICB2YXIgdHJlZU5vZGVzID0gdG9BcnJheShub2RlKTtcbiAgICByZXR1cm4gdHJlZU5vZGVzLm1hcChmdW5jdGlvbiAodHJlZU5vZGUpIHtcbiAgICAgIC8vIEZpbHRlciBpbnZhbGlkYXRlIG5vZGVcbiAgICAgIGlmICghaXNUcmVlTm9kZSh0cmVlTm9kZSkpIHtcbiAgICAgICAgd2FybmluZyghdHJlZU5vZGUsICdUcmVlL1RyZWVOb2RlIGNhbiBvbmx5IGFjY2VwdCBUcmVlTm9kZSBhcyBjaGlsZHJlbi4nKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICB2YXIga2V5ID0gdHJlZU5vZGUua2V5O1xuICAgICAgdmFyIF90cmVlTm9kZSRwcm9wcyA9IHRyZWVOb2RlLnByb3BzLFxuICAgICAgICBjaGlsZHJlbiA9IF90cmVlTm9kZSRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfdHJlZU5vZGUkcHJvcHMsIF9leGNsdWRlZCk7XG4gICAgICB2YXIgZGF0YU5vZGUgPSBfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAga2V5OiBrZXlcbiAgICAgIH0sIHJlc3QpO1xuICAgICAgdmFyIHBhcnNlZENoaWxkcmVuID0gZGlnKGNoaWxkcmVuKTtcbiAgICAgIGlmIChwYXJzZWRDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgZGF0YU5vZGUuY2hpbGRyZW4gPSBwYXJzZWRDaGlsZHJlbjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhTm9kZTtcbiAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGRhdGFOb2RlKSB7XG4gICAgICByZXR1cm4gZGF0YU5vZGU7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGRpZyhyb290Tm9kZXMpO1xufVxuLyoqXG4gKiBGbGF0IG5lc3QgdHJlZSBkYXRhIGludG8gZmxhdHRlbiBsaXN0LiBUaGlzIGlzIHVzZWQgZm9yIHZpcnR1YWwgbGlzdCByZW5kZXIuXG4gKiBAcGFyYW0gdHJlZU5vZGVMaXN0IE9yaWdpbiBkYXRhIG5vZGUgbGlzdFxuICogQHBhcmFtIGV4cGFuZGVkS2V5c1xuICogbmVlZCBleHBhbmRlZCBrZXlzLCBwcm92aWRlcyBgdHJ1ZWAgbWVhbnMgYWxsIGV4cGFuZGVkICh1c2VkIGluIGByYy10cmVlLXNlbGVjdGApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlblRyZWVEYXRhKHRyZWVOb2RlTGlzdCwgZXhwYW5kZWRLZXlzLCBmaWVsZE5hbWVzKSB7XG4gIHZhciBfZmlsbEZpZWxkTmFtZXMgPSBmaWxsRmllbGROYW1lcyhmaWVsZE5hbWVzKSxcbiAgICBmaWVsZFRpdGxlcyA9IF9maWxsRmllbGROYW1lcy5fdGl0bGUsXG4gICAgZmllbGRLZXkgPSBfZmlsbEZpZWxkTmFtZXMua2V5LFxuICAgIGZpZWxkQ2hpbGRyZW4gPSBfZmlsbEZpZWxkTmFtZXMuY2hpbGRyZW47XG4gIHZhciBleHBhbmRlZEtleVNldCA9IG5ldyBTZXQoZXhwYW5kZWRLZXlzID09PSB0cnVlID8gW10gOiBleHBhbmRlZEtleXMpO1xuICB2YXIgZmxhdHRlbkxpc3QgPSBbXTtcbiAgZnVuY3Rpb24gZGlnKGxpc3QpIHtcbiAgICB2YXIgcGFyZW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuICAgIHJldHVybiBsaXN0Lm1hcChmdW5jdGlvbiAodHJlZU5vZGUsIGluZGV4KSB7XG4gICAgICB2YXIgcG9zID0gZ2V0UG9zaXRpb24ocGFyZW50ID8gcGFyZW50LnBvcyA6ICcwJywgaW5kZXgpO1xuICAgICAgdmFyIG1lcmdlZEtleSA9IGdldEtleSh0cmVlTm9kZVtmaWVsZEtleV0sIHBvcyk7XG4gICAgICAvLyBQaWNrIG1hdGNoZWQgdGl0bGUgaW4gZmllbGQgdGl0bGUgbGlzdFxuICAgICAgdmFyIG1lcmdlZFRpdGxlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZFRpdGxlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgZmllbGRUaXRsZSA9IGZpZWxkVGl0bGVzW2ldO1xuICAgICAgICBpZiAodHJlZU5vZGVbZmllbGRUaXRsZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG1lcmdlZFRpdGxlID0gdHJlZU5vZGVbZmllbGRUaXRsZV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEFkZCBGbGF0dGVuRGF0YU5vZGUgaW50byBsaXN0XG4gICAgICB2YXIgZmxhdHRlbk5vZGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9taXQodHJlZU5vZGUsIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoZmllbGRUaXRsZXMpLCBbZmllbGRLZXksIGZpZWxkQ2hpbGRyZW5dKSkpLCB7fSwge1xuICAgICAgICB0aXRsZTogbWVyZ2VkVGl0bGUsXG4gICAgICAgIGtleTogbWVyZ2VkS2V5LFxuICAgICAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICAgICAgcG9zOiBwb3MsXG4gICAgICAgIGNoaWxkcmVuOiBudWxsLFxuICAgICAgICBkYXRhOiB0cmVlTm9kZSxcbiAgICAgICAgaXNTdGFydDogW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShwYXJlbnQgPyBwYXJlbnQuaXNTdGFydCA6IFtdKSwgW2luZGV4ID09PSAwXSksXG4gICAgICAgIGlzRW5kOiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHBhcmVudCA/IHBhcmVudC5pc0VuZCA6IFtdKSwgW2luZGV4ID09PSBsaXN0Lmxlbmd0aCAtIDFdKVxuICAgICAgfSk7XG4gICAgICBmbGF0dGVuTGlzdC5wdXNoKGZsYXR0ZW5Ob2RlKTtcbiAgICAgIC8vIExvb3AgdHJlZU5vZGUgY2hpbGRyZW5cbiAgICAgIGlmIChleHBhbmRlZEtleXMgPT09IHRydWUgfHwgZXhwYW5kZWRLZXlTZXQuaGFzKG1lcmdlZEtleSkpIHtcbiAgICAgICAgZmxhdHRlbk5vZGUuY2hpbGRyZW4gPSBkaWcodHJlZU5vZGVbZmllbGRDaGlsZHJlbl0gfHwgW10sIGZsYXR0ZW5Ob2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZsYXR0ZW5Ob2RlLmNoaWxkcmVuID0gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gZmxhdHRlbk5vZGU7XG4gICAgfSk7XG4gIH1cbiAgZGlnKHRyZWVOb2RlTGlzdCk7XG4gIHJldHVybiBmbGF0dGVuTGlzdDtcbn1cbi8qKlxuICogVHJhdmVyc2UgYWxsIHRoZSBkYXRhIGJ5IGB0cmVlRGF0YWAuXG4gKiBQbGVhc2Ugbm90IHVzZSBpdCBvdXQgb2YgdGhlIGByYy10cmVlYCBzaW5jZSB3ZSBtYXkgcmVmYWN0b3IgdGhpcyBjb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhdmVyc2VEYXRhTm9kZXMoZGF0YU5vZGVzLCBjYWxsYmFjayxcbi8vIFRvIGF2b2lkIHRvbyBtYW55IHBhcmFtcywgbGV0IHVzZSBjb25maWcgaW5zdGVhZCBvZiBvcmlnaW4gcGFyYW1cbmNvbmZpZykge1xuICB2YXIgbWVyZ2VkQ29uZmlnID0ge307XG4gIGlmIChfdHlwZW9mKGNvbmZpZykgPT09ICdvYmplY3QnKSB7XG4gICAgbWVyZ2VkQ29uZmlnID0gY29uZmlnO1xuICB9IGVsc2Uge1xuICAgIG1lcmdlZENvbmZpZyA9IHtcbiAgICAgIGV4dGVybmFsR2V0S2V5OiBjb25maWdcbiAgICB9O1xuICB9XG4gIG1lcmdlZENvbmZpZyA9IG1lcmdlZENvbmZpZyB8fCB7fTtcbiAgLy8gSW5pdCBjb25maWdcbiAgdmFyIF9tZXJnZWRDb25maWcgPSBtZXJnZWRDb25maWcsXG4gICAgY2hpbGRyZW5Qcm9wTmFtZSA9IF9tZXJnZWRDb25maWcuY2hpbGRyZW5Qcm9wTmFtZSxcbiAgICBleHRlcm5hbEdldEtleSA9IF9tZXJnZWRDb25maWcuZXh0ZXJuYWxHZXRLZXksXG4gICAgZmllbGROYW1lcyA9IF9tZXJnZWRDb25maWcuZmllbGROYW1lcztcbiAgdmFyIF9maWxsRmllbGROYW1lczIgPSBmaWxsRmllbGROYW1lcyhmaWVsZE5hbWVzKSxcbiAgICBmaWVsZEtleSA9IF9maWxsRmllbGROYW1lczIua2V5LFxuICAgIGZpZWxkQ2hpbGRyZW4gPSBfZmlsbEZpZWxkTmFtZXMyLmNoaWxkcmVuO1xuICB2YXIgbWVyZ2VDaGlsZHJlblByb3BOYW1lID0gY2hpbGRyZW5Qcm9wTmFtZSB8fCBmaWVsZENoaWxkcmVuO1xuICAvLyBHZXQga2V5c1xuICB2YXIgc3ludGhldGljR2V0S2V5O1xuICBpZiAoZXh0ZXJuYWxHZXRLZXkpIHtcbiAgICBpZiAodHlwZW9mIGV4dGVybmFsR2V0S2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgc3ludGhldGljR2V0S2V5ID0gZnVuY3Rpb24gc3ludGhldGljR2V0S2V5KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVbZXh0ZXJuYWxHZXRLZXldO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHRlcm5hbEdldEtleSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgc3ludGhldGljR2V0S2V5ID0gZnVuY3Rpb24gc3ludGhldGljR2V0S2V5KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGV4dGVybmFsR2V0S2V5KG5vZGUpO1xuICAgICAgfTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3ludGhldGljR2V0S2V5ID0gZnVuY3Rpb24gc3ludGhldGljR2V0S2V5KG5vZGUsIHBvcykge1xuICAgICAgcmV0dXJuIGdldEtleShub2RlW2ZpZWxkS2V5XSwgcG9zKTtcbiAgICB9O1xuICB9XG4gIC8vIFByb2Nlc3NcbiAgZnVuY3Rpb24gcHJvY2Vzc05vZGUobm9kZSwgaW5kZXgsIHBhcmVudCwgcGF0aE5vZGVzKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gbm9kZSA/IG5vZGVbbWVyZ2VDaGlsZHJlblByb3BOYW1lXSA6IGRhdGFOb2RlcztcbiAgICB2YXIgcG9zID0gbm9kZSA/IGdldFBvc2l0aW9uKHBhcmVudC5wb3MsIGluZGV4KSA6ICcwJztcbiAgICB2YXIgY29ubmVjdE5vZGVzID0gbm9kZSA/IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocGF0aE5vZGVzKSwgW25vZGVdKSA6IFtdO1xuICAgIC8vIFByb2Nlc3Mgbm9kZSBpZiBpcyBub3Qgcm9vdFxuICAgIGlmIChub2RlKSB7XG4gICAgICB2YXIga2V5ID0gc3ludGhldGljR2V0S2V5KG5vZGUsIHBvcyk7XG4gICAgICB2YXIgZGF0YSA9IHtcbiAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICBwb3M6IHBvcyxcbiAgICAgICAga2V5OiBrZXksXG4gICAgICAgIHBhcmVudFBvczogcGFyZW50Lm5vZGUgPyBwYXJlbnQucG9zIDogbnVsbCxcbiAgICAgICAgbGV2ZWw6IHBhcmVudC5sZXZlbCArIDEsXG4gICAgICAgIG5vZGVzOiBjb25uZWN0Tm9kZXNcbiAgICAgIH07XG4gICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICB9XG4gICAgLy8gUHJvY2VzcyBjaGlsZHJlbiBub2RlXG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChzdWJOb2RlLCBzdWJJbmRleCkge1xuICAgICAgICBwcm9jZXNzTm9kZShzdWJOb2RlLCBzdWJJbmRleCwge1xuICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgcG9zOiBwb3MsXG4gICAgICAgICAgbGV2ZWw6IHBhcmVudCA/IHBhcmVudC5sZXZlbCArIDEgOiAtMVxuICAgICAgICB9LCBjb25uZWN0Tm9kZXMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHByb2Nlc3NOb2RlKG51bGwpO1xufVxuLyoqXG4gKiBDb252ZXJ0IGB0cmVlRGF0YWAgaW50byBlbnRpdHkgcmVjb3Jkcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnREYXRhVG9FbnRpdGllcyhkYXRhTm9kZXMpIHtcbiAgdmFyIF9yZWYyID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICBpbml0V3JhcHBlciA9IF9yZWYyLmluaXRXcmFwcGVyLFxuICAgIHByb2Nlc3NFbnRpdHkgPSBfcmVmMi5wcm9jZXNzRW50aXR5LFxuICAgIG9uUHJvY2Vzc0ZpbmlzaGVkID0gX3JlZjIub25Qcm9jZXNzRmluaXNoZWQsXG4gICAgZXh0ZXJuYWxHZXRLZXkgPSBfcmVmMi5leHRlcm5hbEdldEtleSxcbiAgICBjaGlsZHJlblByb3BOYW1lID0gX3JlZjIuY2hpbGRyZW5Qcm9wTmFtZSxcbiAgICBmaWVsZE5hbWVzID0gX3JlZjIuZmllbGROYW1lcztcbiAgdmFyIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGNvbmZpZy5leHRlcm5hbEdldEtleWAgaW5zdGVhZCAqL1xuICBsZWdhY3lFeHRlcm5hbEdldEtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkO1xuICAvLyBJbml0IGNvbmZpZ1xuICB2YXIgbWVyZ2VkRXh0ZXJuYWxHZXRLZXkgPSBleHRlcm5hbEdldEtleSB8fCBsZWdhY3lFeHRlcm5hbEdldEtleTtcbiAgdmFyIHBvc0VudGl0aWVzID0ge307XG4gIHZhciBrZXlFbnRpdGllcyA9IHt9O1xuICB2YXIgd3JhcHBlciA9IHtcbiAgICBwb3NFbnRpdGllczogcG9zRW50aXRpZXMsXG4gICAga2V5RW50aXRpZXM6IGtleUVudGl0aWVzXG4gIH07XG4gIGlmIChpbml0V3JhcHBlcikge1xuICAgIHdyYXBwZXIgPSBpbml0V3JhcHBlcih3cmFwcGVyKSB8fCB3cmFwcGVyO1xuICB9XG4gIHRyYXZlcnNlRGF0YU5vZGVzKGRhdGFOb2RlcywgZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICB2YXIgbm9kZSA9IGl0ZW0ubm9kZSxcbiAgICAgIGluZGV4ID0gaXRlbS5pbmRleCxcbiAgICAgIHBvcyA9IGl0ZW0ucG9zLFxuICAgICAga2V5ID0gaXRlbS5rZXksXG4gICAgICBwYXJlbnRQb3MgPSBpdGVtLnBhcmVudFBvcyxcbiAgICAgIGxldmVsID0gaXRlbS5sZXZlbCxcbiAgICAgIG5vZGVzID0gaXRlbS5ub2RlcztcbiAgICB2YXIgZW50aXR5ID0ge1xuICAgICAgbm9kZTogbm9kZSxcbiAgICAgIG5vZGVzOiBub2RlcyxcbiAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgIGtleToga2V5LFxuICAgICAgcG9zOiBwb3MsXG4gICAgICBsZXZlbDogbGV2ZWxcbiAgICB9O1xuICAgIHZhciBtZXJnZWRLZXkgPSBnZXRLZXkoa2V5LCBwb3MpO1xuICAgIHBvc0VudGl0aWVzW3Bvc10gPSBlbnRpdHk7XG4gICAga2V5RW50aXRpZXNbbWVyZ2VkS2V5XSA9IGVudGl0eTtcbiAgICAvLyBGaWxsIGNoaWxkcmVuXG4gICAgZW50aXR5LnBhcmVudCA9IHBvc0VudGl0aWVzW3BhcmVudFBvc107XG4gICAgaWYgKGVudGl0eS5wYXJlbnQpIHtcbiAgICAgIGVudGl0eS5wYXJlbnQuY2hpbGRyZW4gPSBlbnRpdHkucGFyZW50LmNoaWxkcmVuIHx8IFtdO1xuICAgICAgZW50aXR5LnBhcmVudC5jaGlsZHJlbi5wdXNoKGVudGl0eSk7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzRW50aXR5KSB7XG4gICAgICBwcm9jZXNzRW50aXR5KGVudGl0eSwgd3JhcHBlcik7XG4gICAgfVxuICB9LCB7XG4gICAgZXh0ZXJuYWxHZXRLZXk6IG1lcmdlZEV4dGVybmFsR2V0S2V5LFxuICAgIGNoaWxkcmVuUHJvcE5hbWU6IGNoaWxkcmVuUHJvcE5hbWUsXG4gICAgZmllbGROYW1lczogZmllbGROYW1lc1xuICB9KTtcbiAgaWYgKG9uUHJvY2Vzc0ZpbmlzaGVkKSB7XG4gICAgb25Qcm9jZXNzRmluaXNoZWQod3JhcHBlcik7XG4gIH1cbiAgcmV0dXJuIHdyYXBwZXI7XG59XG4vKipcbiAqIEdldCBUcmVlTm9kZSBwcm9wcyB3aXRoIFRyZWUgcHJvcHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmVlTm9kZVByb3BzKGtleSwgX3JlZjMpIHtcbiAgdmFyIGV4cGFuZGVkS2V5cyA9IF9yZWYzLmV4cGFuZGVkS2V5cyxcbiAgICBzZWxlY3RlZEtleXMgPSBfcmVmMy5zZWxlY3RlZEtleXMsXG4gICAgbG9hZGVkS2V5cyA9IF9yZWYzLmxvYWRlZEtleXMsXG4gICAgbG9hZGluZ0tleXMgPSBfcmVmMy5sb2FkaW5nS2V5cyxcbiAgICBjaGVja2VkS2V5cyA9IF9yZWYzLmNoZWNrZWRLZXlzLFxuICAgIGhhbGZDaGVja2VkS2V5cyA9IF9yZWYzLmhhbGZDaGVja2VkS2V5cyxcbiAgICBkcmFnT3Zlck5vZGVLZXkgPSBfcmVmMy5kcmFnT3Zlck5vZGVLZXksXG4gICAgZHJvcFBvc2l0aW9uID0gX3JlZjMuZHJvcFBvc2l0aW9uLFxuICAgIGtleUVudGl0aWVzID0gX3JlZjMua2V5RW50aXRpZXM7XG4gIHZhciBlbnRpdHkgPSBrZXlFbnRpdGllc1trZXldO1xuICB2YXIgdHJlZU5vZGVQcm9wcyA9IHtcbiAgICBldmVudEtleToga2V5LFxuICAgIGV4cGFuZGVkOiBleHBhbmRlZEtleXMuaW5kZXhPZihrZXkpICE9PSAtMSxcbiAgICBzZWxlY3RlZDogc2VsZWN0ZWRLZXlzLmluZGV4T2Yoa2V5KSAhPT0gLTEsXG4gICAgbG9hZGVkOiBsb2FkZWRLZXlzLmluZGV4T2Yoa2V5KSAhPT0gLTEsXG4gICAgbG9hZGluZzogbG9hZGluZ0tleXMuaW5kZXhPZihrZXkpICE9PSAtMSxcbiAgICBjaGVja2VkOiBjaGVja2VkS2V5cy5pbmRleE9mKGtleSkgIT09IC0xLFxuICAgIGhhbGZDaGVja2VkOiBoYWxmQ2hlY2tlZEtleXMuaW5kZXhPZihrZXkpICE9PSAtMSxcbiAgICBwb3M6IFN0cmluZyhlbnRpdHkgPyBlbnRpdHkucG9zIDogJycpLFxuICAgIC8vIFtMZWdhY3ldIERyYWcgcHJvcHNcbiAgICAvLyBTaW5jZSB0aGUgaW50ZXJhY3Rpb24gb2YgZHJhZyBpcyBjaGFuZ2VkLCB0aGUgc2VtYW50aWMgb2YgdGhlIHByb3BzIGFyZVxuICAgIC8vIG5vdCBhY2N1cmFjeSwgSSB0aGluayBpdCBzaG91bGQgYmUgZmluYWxseSByZW1vdmVkXG4gICAgZHJhZ092ZXI6IGRyYWdPdmVyTm9kZUtleSA9PT0ga2V5ICYmIGRyb3BQb3NpdGlvbiA9PT0gMCxcbiAgICBkcmFnT3ZlckdhcFRvcDogZHJhZ092ZXJOb2RlS2V5ID09PSBrZXkgJiYgZHJvcFBvc2l0aW9uID09PSAtMSxcbiAgICBkcmFnT3ZlckdhcEJvdHRvbTogZHJhZ092ZXJOb2RlS2V5ID09PSBrZXkgJiYgZHJvcFBvc2l0aW9uID09PSAxXG4gIH07XG4gIHJldHVybiB0cmVlTm9kZVByb3BzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShwcm9wcykge1xuICB2YXIgZGF0YSA9IHByb3BzLmRhdGEsXG4gICAgZXhwYW5kZWQgPSBwcm9wcy5leHBhbmRlZCxcbiAgICBzZWxlY3RlZCA9IHByb3BzLnNlbGVjdGVkLFxuICAgIGNoZWNrZWQgPSBwcm9wcy5jaGVja2VkLFxuICAgIGxvYWRlZCA9IHByb3BzLmxvYWRlZCxcbiAgICBsb2FkaW5nID0gcHJvcHMubG9hZGluZyxcbiAgICBoYWxmQ2hlY2tlZCA9IHByb3BzLmhhbGZDaGVja2VkLFxuICAgIGRyYWdPdmVyID0gcHJvcHMuZHJhZ092ZXIsXG4gICAgZHJhZ092ZXJHYXBUb3AgPSBwcm9wcy5kcmFnT3ZlckdhcFRvcCxcbiAgICBkcmFnT3ZlckdhcEJvdHRvbSA9IHByb3BzLmRyYWdPdmVyR2FwQm90dG9tLFxuICAgIHBvcyA9IHByb3BzLnBvcyxcbiAgICBhY3RpdmUgPSBwcm9wcy5hY3RpdmUsXG4gICAgZXZlbnRLZXkgPSBwcm9wcy5ldmVudEtleTtcbiAgdmFyIGV2ZW50RGF0YSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZGF0YSksIHt9LCB7XG4gICAgZXhwYW5kZWQ6IGV4cGFuZGVkLFxuICAgIHNlbGVjdGVkOiBzZWxlY3RlZCxcbiAgICBjaGVja2VkOiBjaGVja2VkLFxuICAgIGxvYWRlZDogbG9hZGVkLFxuICAgIGxvYWRpbmc6IGxvYWRpbmcsXG4gICAgaGFsZkNoZWNrZWQ6IGhhbGZDaGVja2VkLFxuICAgIGRyYWdPdmVyOiBkcmFnT3ZlcixcbiAgICBkcmFnT3ZlckdhcFRvcDogZHJhZ092ZXJHYXBUb3AsXG4gICAgZHJhZ092ZXJHYXBCb3R0b206IGRyYWdPdmVyR2FwQm90dG9tLFxuICAgIHBvczogcG9zLFxuICAgIGFjdGl2ZTogYWN0aXZlLFxuICAgIGtleTogZXZlbnRLZXlcbiAgfSk7XG4gIGlmICghKCdwcm9wcycgaW4gZXZlbnREYXRhKSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShldmVudERhdGEsICdwcm9wcycsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICB3YXJuaW5nKGZhbHNlLCAnU2Vjb25kIHBhcmFtIHJldHVybiBmcm9tIGV2ZW50IGlzIG5vZGUgZGF0YSBpbnN0ZWFkIG9mIFRyZWVOb2RlIGluc3RhbmNlLiBQbGVhc2UgcmVhZCB2YWx1ZSBkaXJlY3RseSBpbnN0ZWFkIG9mIHJlYWRpbmcgZnJvbSBgcHJvcHNgLicpO1xuICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGV2ZW50RGF0YTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBDaGVja2JveCBmcm9tICcuL0NoZWNrYm94JztcbmV4cG9ydCB2YXIgR3JvdXBDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG52YXIgSW50ZXJuYWxDaGVja2JveEdyb3VwID0gZnVuY3Rpb24gSW50ZXJuYWxDaGVja2JveEdyb3VwKF9hLCByZWYpIHtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IF9hLmRlZmF1bHRWYWx1ZSxcbiAgICBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLFxuICAgIF9hJG9wdGlvbnMgPSBfYS5vcHRpb25zLFxuICAgIG9wdGlvbnMgPSBfYSRvcHRpb25zID09PSB2b2lkIDAgPyBbXSA6IF9hJG9wdGlvbnMsXG4gICAgY3VzdG9taXplUHJlZml4Q2xzID0gX2EucHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IF9hLnN0eWxlLFxuICAgIG9uQ2hhbmdlID0gX2Eub25DaGFuZ2UsXG4gICAgcmVzdFByb3BzID0gX19yZXN0KF9hLCBbXCJkZWZhdWx0VmFsdWVcIiwgXCJjaGlsZHJlblwiLCBcIm9wdGlvbnNcIiwgXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcIm9uQ2hhbmdlXCJdKTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUocmVzdFByb3BzLnZhbHVlIHx8IGRlZmF1bHRWYWx1ZSB8fCBbXSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgdmFsdWUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFZhbHVlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZShbXSksXG4gICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgIHJlZ2lzdGVyZWRWYWx1ZXMgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldFJlZ2lzdGVyZWRWYWx1ZXMgPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICgndmFsdWUnIGluIHJlc3RQcm9wcykge1xuICAgICAgc2V0VmFsdWUocmVzdFByb3BzLnZhbHVlIHx8IFtdKTtcbiAgICB9XG4gIH0sIFtyZXN0UHJvcHMudmFsdWVdKTtcbiAgdmFyIGdldE9wdGlvbnMgPSBmdW5jdGlvbiBnZXRPcHRpb25zKCkge1xuICAgIHJldHVybiBvcHRpb25zLm1hcChmdW5jdGlvbiAob3B0aW9uKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG9wdGlvbiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsYWJlbDogb3B0aW9uLFxuICAgICAgICAgIHZhbHVlOiBvcHRpb25cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHRpb247XG4gICAgfSk7XG4gIH07XG4gIHZhciBjYW5jZWxWYWx1ZSA9IGZ1bmN0aW9uIGNhbmNlbFZhbHVlKHZhbCkge1xuICAgIHNldFJlZ2lzdGVyZWRWYWx1ZXMoZnVuY3Rpb24gKHByZXZWYWx1ZXMpIHtcbiAgICAgIHJldHVybiBwcmV2VmFsdWVzLmZpbHRlcihmdW5jdGlvbiAodikge1xuICAgICAgICByZXR1cm4gdiAhPT0gdmFsO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG4gIHZhciByZWdpc3RlclZhbHVlID0gZnVuY3Rpb24gcmVnaXN0ZXJWYWx1ZSh2YWwpIHtcbiAgICBzZXRSZWdpc3RlcmVkVmFsdWVzKGZ1bmN0aW9uIChwcmV2VmFsdWVzKSB7XG4gICAgICByZXR1cm4gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShwcmV2VmFsdWVzKSwgW3ZhbF0pO1xuICAgIH0pO1xuICB9O1xuICB2YXIgdG9nZ2xlT3B0aW9uID0gZnVuY3Rpb24gdG9nZ2xlT3B0aW9uKG9wdGlvbikge1xuICAgIHZhciBvcHRpb25JbmRleCA9IHZhbHVlLmluZGV4T2Yob3B0aW9uLnZhbHVlKTtcbiAgICB2YXIgbmV3VmFsdWUgPSBfdG9Db25zdW1hYmxlQXJyYXkodmFsdWUpO1xuICAgIGlmIChvcHRpb25JbmRleCA9PT0gLTEpIHtcbiAgICAgIG5ld1ZhbHVlLnB1c2gob3B0aW9uLnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3VmFsdWUuc3BsaWNlKG9wdGlvbkluZGV4LCAxKTtcbiAgICB9XG4gICAgaWYgKCEoJ3ZhbHVlJyBpbiByZXN0UHJvcHMpKSB7XG4gICAgICBzZXRWYWx1ZShuZXdWYWx1ZSk7XG4gICAgfVxuICAgIHZhciBvcHRzID0gZ2V0T3B0aW9ucygpO1xuICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXdWYWx1ZS5maWx0ZXIoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgcmV0dXJuIHJlZ2lzdGVyZWRWYWx1ZXMuaW5jbHVkZXModmFsKTtcbiAgICB9KS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICB2YXIgaW5kZXhBID0gb3B0cy5maW5kSW5kZXgoZnVuY3Rpb24gKG9wdCkge1xuICAgICAgICByZXR1cm4gb3B0LnZhbHVlID09PSBhO1xuICAgICAgfSk7XG4gICAgICB2YXIgaW5kZXhCID0gb3B0cy5maW5kSW5kZXgoZnVuY3Rpb24gKG9wdCkge1xuICAgICAgICByZXR1cm4gb3B0LnZhbHVlID09PSBiO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gaW5kZXhBIC0gaW5kZXhCO1xuICAgIH0pKTtcbiAgfTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnY2hlY2tib3gnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgZ3JvdXBQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWdyb3VwXCIpO1xuICB2YXIgZG9tUHJvcHMgPSBvbWl0KHJlc3RQcm9wcywgWyd2YWx1ZScsICdkaXNhYmxlZCddKTtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgY2hpbGRyZW4gPSBnZXRPcHRpb25zKCkubWFwKGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDaGVja2JveCwge1xuICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAga2V5OiBvcHRpb24udmFsdWUudG9TdHJpbmcoKSxcbiAgICAgICAgZGlzYWJsZWQ6ICdkaXNhYmxlZCcgaW4gb3B0aW9uID8gb3B0aW9uLmRpc2FibGVkIDogcmVzdFByb3BzLmRpc2FibGVkLFxuICAgICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlLFxuICAgICAgICBjaGVja2VkOiB2YWx1ZS5pbmNsdWRlcyhvcHRpb24udmFsdWUpLFxuICAgICAgICBvbkNoYW5nZTogb3B0aW9uLm9uQ2hhbmdlLFxuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KGdyb3VwUHJlZml4Q2xzLCBcIi1pdGVtXCIpLFxuICAgICAgICBzdHlsZTogb3B0aW9uLnN0eWxlXG4gICAgICB9LCBvcHRpb24ubGFiZWwpO1xuICAgIH0pO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9qc3gtbm8tY29uc3RydWN0ZWQtY29udGV4dC12YWx1ZXNcbiAgdmFyIGNvbnRleHQgPSB7XG4gICAgdG9nZ2xlT3B0aW9uOiB0b2dnbGVPcHRpb24sXG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIGRpc2FibGVkOiByZXN0UHJvcHMuZGlzYWJsZWQsXG4gICAgbmFtZTogcmVzdFByb3BzLm5hbWUsXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTYzNzZcbiAgICByZWdpc3RlclZhbHVlOiByZWdpc3RlclZhbHVlLFxuICAgIGNhbmNlbFZhbHVlOiBjYW5jZWxWYWx1ZVxuICB9O1xuICB2YXIgY2xhc3NTdHJpbmcgPSBjbGFzc05hbWVzKGdyb3VwUHJlZml4Q2xzLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KGdyb3VwUHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBjbGFzc05hbWUpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xhc3NTdHJpbmcsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIGRvbVByb3BzLCB7XG4gICAgcmVmOiByZWZcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEdyb3VwQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjb250ZXh0XG4gIH0sIGNoaWxkcmVuKSk7XG59O1xudmFyIENoZWNrYm94R3JvdXAgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihJbnRlcm5hbENoZWNrYm94R3JvdXApO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0Lm1lbW8oQ2hlY2tib3hHcm91cCk7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjQ2hlY2tib3ggZnJvbSAncmMtY2hlY2tib3gnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgRm9ybUl0ZW1JbnB1dENvbnRleHQgfSBmcm9tICcuLi9mb3JtL2NvbnRleHQnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi4vX3V0aWwvd2FybmluZyc7XG5pbXBvcnQgeyBHcm91cENvbnRleHQgfSBmcm9tICcuL0dyb3VwJztcbmltcG9ydCBEaXNhYmxlZENvbnRleHQgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL0Rpc2FibGVkQ29udGV4dCc7XG52YXIgSW50ZXJuYWxDaGVja2JveCA9IGZ1bmN0aW9uIEludGVybmFsQ2hlY2tib3goX2EsIHJlZikge1xuICB2YXIgX2NsYXNzTmFtZXM7XG4gIHZhciBfYjtcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IF9hLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsXG4gICAgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbixcbiAgICBfYSRpbmRldGVybWluYXRlID0gX2EuaW5kZXRlcm1pbmF0ZSxcbiAgICBpbmRldGVybWluYXRlID0gX2EkaW5kZXRlcm1pbmF0ZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYSRpbmRldGVybWluYXRlLFxuICAgIHN0eWxlID0gX2Euc3R5bGUsXG4gICAgb25Nb3VzZUVudGVyID0gX2Eub25Nb3VzZUVudGVyLFxuICAgIG9uTW91c2VMZWF2ZSA9IF9hLm9uTW91c2VMZWF2ZSxcbiAgICBfYSRza2lwR3JvdXAgPSBfYS5za2lwR3JvdXAsXG4gICAgc2tpcEdyb3VwID0gX2Ekc2tpcEdyb3VwID09PSB2b2lkIDAgPyBmYWxzZSA6IF9hJHNraXBHcm91cCxcbiAgICBkaXNhYmxlZCA9IF9hLmRpc2FibGVkLFxuICAgIHJlc3RQcm9wcyA9IF9fcmVzdChfYSwgW1wicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIiwgXCJpbmRldGVybWluYXRlXCIsIFwic3R5bGVcIiwgXCJvbk1vdXNlRW50ZXJcIiwgXCJvbk1vdXNlTGVhdmVcIiwgXCJza2lwR3JvdXBcIiwgXCJkaXNhYmxlZFwiXSk7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCksXG4gICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcbiAgdmFyIGNoZWNrYm94R3JvdXAgPSBSZWFjdC51c2VDb250ZXh0KEdyb3VwQ29udGV4dCk7XG4gIHZhciBfdXNlQ29udGV4dCA9IHVzZUNvbnRleHQoRm9ybUl0ZW1JbnB1dENvbnRleHQpLFxuICAgIGlzRm9ybUl0ZW1JbnB1dCA9IF91c2VDb250ZXh0LmlzRm9ybUl0ZW1JbnB1dDtcbiAgdmFyIGNvbnRleHREaXNhYmxlZCA9IHVzZUNvbnRleHQoRGlzYWJsZWRDb250ZXh0KTtcbiAgdmFyIG1lcmdlZERpc2FibGVkID0gKF9iID0gKGNoZWNrYm94R3JvdXAgPT09IG51bGwgfHwgY2hlY2tib3hHcm91cCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hlY2tib3hHcm91cC5kaXNhYmxlZCkgfHwgZGlzYWJsZWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGNvbnRleHREaXNhYmxlZDtcbiAgdmFyIHByZXZWYWx1ZSA9IFJlYWN0LnVzZVJlZihyZXN0UHJvcHMudmFsdWUpO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGNoZWNrYm94R3JvdXAgPT09IG51bGwgfHwgY2hlY2tib3hHcm91cCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hlY2tib3hHcm91cC5yZWdpc3RlclZhbHVlKHJlc3RQcm9wcy52YWx1ZSk7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZygnY2hlY2tlZCcgaW4gcmVzdFByb3BzIHx8ICEhY2hlY2tib3hHcm91cCB8fCAhKCd2YWx1ZScgaW4gcmVzdFByb3BzKSwgJ0NoZWNrYm94JywgJ2B2YWx1ZWAgaXMgbm90IGEgdmFsaWQgcHJvcCwgZG8geW91IG1lYW4gYGNoZWNrZWRgPycpIDogdm9pZCAwO1xuICB9LCBbXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNraXBHcm91cCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocmVzdFByb3BzLnZhbHVlICE9PSBwcmV2VmFsdWUuY3VycmVudCkge1xuICAgICAgY2hlY2tib3hHcm91cCA9PT0gbnVsbCB8fCBjaGVja2JveEdyb3VwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGVja2JveEdyb3VwLmNhbmNlbFZhbHVlKHByZXZWYWx1ZS5jdXJyZW50KTtcbiAgICAgIGNoZWNrYm94R3JvdXAgPT09IG51bGwgfHwgY2hlY2tib3hHcm91cCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hlY2tib3hHcm91cC5yZWdpc3RlclZhbHVlKHJlc3RQcm9wcy52YWx1ZSk7XG4gICAgICBwcmV2VmFsdWUuY3VycmVudCA9IHJlc3RQcm9wcy52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjaGVja2JveEdyb3VwID09PSBudWxsIHx8IGNoZWNrYm94R3JvdXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoZWNrYm94R3JvdXAuY2FuY2VsVmFsdWUocmVzdFByb3BzLnZhbHVlKTtcbiAgICB9O1xuICB9LCBbcmVzdFByb3BzLnZhbHVlXSk7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2NoZWNrYm94JywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIGNoZWNrYm94UHJvcHMgPSBfZXh0ZW5kcyh7fSwgcmVzdFByb3BzKTtcbiAgaWYgKGNoZWNrYm94R3JvdXAgJiYgIXNraXBHcm91cCkge1xuICAgIGNoZWNrYm94UHJvcHMub25DaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAocmVzdFByb3BzLm9uQ2hhbmdlKSB7XG4gICAgICAgIHJlc3RQcm9wcy5vbkNoYW5nZS5hcHBseShyZXN0UHJvcHMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgICBpZiAoY2hlY2tib3hHcm91cC50b2dnbGVPcHRpb24pIHtcbiAgICAgICAgY2hlY2tib3hHcm91cC50b2dnbGVPcHRpb24oe1xuICAgICAgICAgIGxhYmVsOiBjaGlsZHJlbixcbiAgICAgICAgICB2YWx1ZTogcmVzdFByb3BzLnZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgY2hlY2tib3hQcm9wcy5uYW1lID0gY2hlY2tib3hHcm91cC5uYW1lO1xuICAgIGNoZWNrYm94UHJvcHMuY2hlY2tlZCA9IGNoZWNrYm94R3JvdXAudmFsdWUuaW5jbHVkZXMocmVzdFByb3BzLnZhbHVlKTtcbiAgfVxuICB2YXIgY2xhc3NTdHJpbmcgPSBjbGFzc05hbWVzKChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlclwiKSwgdHJ1ZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlci1jaGVja2VkXCIpLCBjaGVja2JveFByb3BzLmNoZWNrZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlci1kaXNhYmxlZFwiKSwgbWVyZ2VkRGlzYWJsZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlci1pbi1mb3JtLWl0ZW1cIiksIGlzRm9ybUl0ZW1JbnB1dCksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcbiAgdmFyIGNoZWNrYm94Q2xhc3MgPSBjbGFzc05hbWVzKF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbmRldGVybWluYXRlXCIpLCBpbmRldGVybWluYXRlKSk7XG4gIHZhciBhcmlhQ2hlY2tlZCA9IGluZGV0ZXJtaW5hdGUgPyAnbWl4ZWQnIDogdW5kZWZpbmVkO1xuICByZXR1cm4gKFxuICAgIC8qI19fUFVSRV9fKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganN4LWExMXkvbGFiZWwtaGFzLWFzc29jaWF0ZWQtY29udHJvbFxuICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzU3RyaW5nLFxuICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgb25Nb3VzZUVudGVyOiBvbk1vdXNlRW50ZXIsXG4gICAgICBvbk1vdXNlTGVhdmU6IG9uTW91c2VMZWF2ZVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJjQ2hlY2tib3gsIF9leHRlbmRzKHtcbiAgICAgIFwiYXJpYS1jaGVja2VkXCI6IGFyaWFDaGVja2VkXG4gICAgfSwgY2hlY2tib3hQcm9wcywge1xuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWU6IGNoZWNrYm94Q2xhc3MsXG4gICAgICBkaXNhYmxlZDogbWVyZ2VkRGlzYWJsZWQsXG4gICAgICByZWY6IHJlZlxuICAgIH0pKSwgY2hpbGRyZW4gIT09IHVuZGVmaW5lZCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgY2hpbGRyZW4pKVxuICApO1xufTtcbnZhciBDaGVja2JveCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEludGVybmFsQ2hlY2tib3gpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgQ2hlY2tib3guZGlzcGxheU5hbWUgPSAnQ2hlY2tib3gnO1xufVxuZXhwb3J0IGRlZmF1bHQgQ2hlY2tib3g7IiwiaW1wb3J0IEludGVybmFsQ2hlY2tib3ggZnJvbSAnLi9DaGVja2JveCc7XG5pbXBvcnQgR3JvdXAgZnJvbSAnLi9Hcm91cCc7XG52YXIgQ2hlY2tib3ggPSBJbnRlcm5hbENoZWNrYm94O1xuQ2hlY2tib3guR3JvdXAgPSBHcm91cDtcbkNoZWNrYm94Ll9fQU5UX0NIRUNLQk9YID0gdHJ1ZTtcbmV4cG9ydCBkZWZhdWx0IENoZWNrYm94OyIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG52YXIgUm93Q29udGV4dCA9IC8qI19fUFVSRV9fKi9jcmVhdGVDb250ZXh0KHt9KTtcbmV4cG9ydCBkZWZhdWx0IFJvd0NvbnRleHQ7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgUm93Q29udGV4dCBmcm9tICcuL1Jvd0NvbnRleHQnO1xuZnVuY3Rpb24gcGFyc2VGbGV4KGZsZXgpIHtcbiAgaWYgKHR5cGVvZiBmbGV4ID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBcIlwiLmNvbmNhdChmbGV4LCBcIiBcIikuY29uY2F0KGZsZXgsIFwiIGF1dG9cIik7XG4gIH1cbiAgaWYgKC9eXFxkKyhcXC5cXGQrKT8ocHh8ZW18cmVtfCUpJC8udGVzdChmbGV4KSkge1xuICAgIHJldHVybiBcIjAgMCBcIi5jb25jYXQoZmxleCk7XG4gIH1cbiAgcmV0dXJuIGZsZXg7XG59XG52YXIgc2l6ZXMgPSBbJ3hzJywgJ3NtJywgJ21kJywgJ2xnJywgJ3hsJywgJ3h4bCddO1xudmFyIENvbCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQyID0gUmVhY3QudXNlQ29udGV4dChSb3dDb250ZXh0KSxcbiAgICBndXR0ZXIgPSBfUmVhY3QkdXNlQ29udGV4dDIuZ3V0dGVyLFxuICAgIHdyYXAgPSBfUmVhY3QkdXNlQ29udGV4dDIud3JhcCxcbiAgICBzdXBwb3J0RmxleEdhcCA9IF9SZWFjdCR1c2VDb250ZXh0Mi5zdXBwb3J0RmxleEdhcDtcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBzcGFuID0gcHJvcHMuc3BhbixcbiAgICBvcmRlciA9IHByb3BzLm9yZGVyLFxuICAgIG9mZnNldCA9IHByb3BzLm9mZnNldCxcbiAgICBwdXNoID0gcHJvcHMucHVzaCxcbiAgICBwdWxsID0gcHJvcHMucHVsbCxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBmbGV4ID0gcHJvcHMuZmxleCxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIG90aGVycyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwic3BhblwiLCBcIm9yZGVyXCIsIFwib2Zmc2V0XCIsIFwicHVzaFwiLCBcInB1bGxcIiwgXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiLCBcImZsZXhcIiwgXCJzdHlsZVwiXSk7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2NvbCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBzaXplQ2xhc3NPYmogPSB7fTtcbiAgc2l6ZXMuZm9yRWFjaChmdW5jdGlvbiAoc2l6ZSkge1xuICAgIHZhciBfZXh0ZW5kczI7XG4gICAgdmFyIHNpemVQcm9wcyA9IHt9O1xuICAgIHZhciBwcm9wU2l6ZSA9IHByb3BzW3NpemVdO1xuICAgIGlmICh0eXBlb2YgcHJvcFNpemUgPT09ICdudW1iZXInKSB7XG4gICAgICBzaXplUHJvcHMuc3BhbiA9IHByb3BTaXplO1xuICAgIH0gZWxzZSBpZiAoX3R5cGVvZihwcm9wU2l6ZSkgPT09ICdvYmplY3QnKSB7XG4gICAgICBzaXplUHJvcHMgPSBwcm9wU2l6ZSB8fCB7fTtcbiAgICB9XG4gICAgZGVsZXRlIG90aGVyc1tzaXplXTtcbiAgICBzaXplQ2xhc3NPYmogPSBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgc2l6ZUNsYXNzT2JqKSwgKF9leHRlbmRzMiA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2V4dGVuZHMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoc2l6ZSwgXCItXCIpLmNvbmNhdChzaXplUHJvcHMuc3BhbiksIHNpemVQcm9wcy5zcGFuICE9PSB1bmRlZmluZWQpLCBfZGVmaW5lUHJvcGVydHkoX2V4dGVuZHMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoc2l6ZSwgXCItb3JkZXItXCIpLmNvbmNhdChzaXplUHJvcHMub3JkZXIpLCBzaXplUHJvcHMub3JkZXIgfHwgc2l6ZVByb3BzLm9yZGVyID09PSAwKSwgX2RlZmluZVByb3BlcnR5KF9leHRlbmRzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHNpemUsIFwiLW9mZnNldC1cIikuY29uY2F0KHNpemVQcm9wcy5vZmZzZXQpLCBzaXplUHJvcHMub2Zmc2V0IHx8IHNpemVQcm9wcy5vZmZzZXQgPT09IDApLCBfZGVmaW5lUHJvcGVydHkoX2V4dGVuZHMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoc2l6ZSwgXCItcHVzaC1cIikuY29uY2F0KHNpemVQcm9wcy5wdXNoKSwgc2l6ZVByb3BzLnB1c2ggfHwgc2l6ZVByb3BzLnB1c2ggPT09IDApLCBfZGVmaW5lUHJvcGVydHkoX2V4dGVuZHMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoc2l6ZSwgXCItcHVsbC1cIikuY29uY2F0KHNpemVQcm9wcy5wdWxsKSwgc2l6ZVByb3BzLnB1bGwgfHwgc2l6ZVByb3BzLnB1bGwgPT09IDApLCBfZGVmaW5lUHJvcGVydHkoX2V4dGVuZHMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9leHRlbmRzMikpO1xuICB9KTtcbiAgdmFyIGNsYXNzZXMgPSBjbGFzc05hbWVzKHByZWZpeENscywgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHNwYW4pLCBzcGFuICE9PSB1bmRlZmluZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItb3JkZXItXCIpLmNvbmNhdChvcmRlciksIG9yZGVyKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW9mZnNldC1cIikuY29uY2F0KG9mZnNldCksIG9mZnNldCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wdXNoLVwiKS5jb25jYXQocHVzaCksIHB1c2gpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcHVsbC1cIikuY29uY2F0KHB1bGwpLCBwdWxsKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUsIHNpemVDbGFzc09iaik7XG4gIHZhciBtZXJnZWRTdHlsZSA9IHt9O1xuICAvLyBIb3Jpem9udGFsIGd1dHRlciB1c2UgcGFkZGluZ1xuICBpZiAoZ3V0dGVyICYmIGd1dHRlclswXSA+IDApIHtcbiAgICB2YXIgaG9yaXpvbnRhbEd1dHRlciA9IGd1dHRlclswXSAvIDI7XG4gICAgbWVyZ2VkU3R5bGUucGFkZGluZ0xlZnQgPSBob3Jpem9udGFsR3V0dGVyO1xuICAgIG1lcmdlZFN0eWxlLnBhZGRpbmdSaWdodCA9IGhvcml6b250YWxHdXR0ZXI7XG4gIH1cbiAgLy8gVmVydGljYWwgZ3V0dGVyIHVzZSBwYWRkaW5nIHdoZW4gZ2FwIG5vdCBzdXBwb3J0XG4gIGlmIChndXR0ZXIgJiYgZ3V0dGVyWzFdID4gMCAmJiAhc3VwcG9ydEZsZXhHYXApIHtcbiAgICB2YXIgdmVydGljYWxHdXR0ZXIgPSBndXR0ZXJbMV0gLyAyO1xuICAgIG1lcmdlZFN0eWxlLnBhZGRpbmdUb3AgPSB2ZXJ0aWNhbEd1dHRlcjtcbiAgICBtZXJnZWRTdHlsZS5wYWRkaW5nQm90dG9tID0gdmVydGljYWxHdXR0ZXI7XG4gIH1cbiAgaWYgKGZsZXgpIHtcbiAgICBtZXJnZWRTdHlsZS5mbGV4ID0gcGFyc2VGbGV4KGZsZXgpO1xuICAgIC8vIEhhY2sgZm9yIEZpcmVmb3ggdG8gYXZvaWQgc2l6ZSBpc3N1ZVxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vcHVsbC8yMDAyMyNpc3N1ZWNvbW1lbnQtNTY0Mzg5NTUzXG4gICAgaWYgKHdyYXAgPT09IGZhbHNlICYmICFtZXJnZWRTdHlsZS5taW5XaWR0aCkge1xuICAgICAgbWVyZ2VkU3R5bGUubWluV2lkdGggPSAwO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe30sIG90aGVycywge1xuICAgIHN0eWxlOiBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgbWVyZ2VkU3R5bGUpLCBzdHlsZSksXG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzLFxuICAgIHJlZjogcmVmXG4gIH0pLCBjaGlsZHJlbik7XG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIENvbC5kaXNwbGF5TmFtZSA9ICdDb2wnO1xufVxuZXhwb3J0IGRlZmF1bHQgQ29sOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgdXNlRmxleEdhcFN1cHBvcnQgZnJvbSAnLi4vX3V0aWwvaG9va3MvdXNlRmxleEdhcFN1cHBvcnQnO1xuaW1wb3J0IFJlc3BvbnNpdmVPYnNlcnZlLCB7IHJlc3BvbnNpdmVBcnJheSB9IGZyb20gJy4uL191dGlsL3Jlc3BvbnNpdmVPYnNlcnZlJztcbmltcG9ydCB7IHR1cGxlIH0gZnJvbSAnLi4vX3V0aWwvdHlwZSc7XG5pbXBvcnQgUm93Q29udGV4dCBmcm9tICcuL1Jvd0NvbnRleHQnO1xudmFyIFJvd0FsaWducyA9IHR1cGxlKCd0b3AnLCAnbWlkZGxlJywgJ2JvdHRvbScsICdzdHJldGNoJyk7XG52YXIgUm93SnVzdGlmeSA9IHR1cGxlKCdzdGFydCcsICdlbmQnLCAnY2VudGVyJywgJ3NwYWNlLWFyb3VuZCcsICdzcGFjZS1iZXR3ZWVuJywgJ3NwYWNlLWV2ZW5seScpO1xuZnVuY3Rpb24gdXNlTWVyZ2VQcm9wQnlTY3JlZW4ob3JpUHJvcCwgc2NyZWVuKSB7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSh0eXBlb2Ygb3JpUHJvcCA9PT0gJ3N0cmluZycgPyBvcmlQcm9wIDogJycpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHByb3AgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFByb3AgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgY2xhY01lcmdlQWxpZ25Pckp1c3RpZnkgPSBmdW5jdGlvbiBjbGFjTWVyZ2VBbGlnbk9ySnVzdGlmeSgpIHtcbiAgICBpZiAodHlwZW9mIG9yaVByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICBzZXRQcm9wKG9yaVByb3ApO1xuICAgIH1cbiAgICBpZiAoX3R5cGVvZihvcmlQcm9wKSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXNwb25zaXZlQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBicmVha3BvaW50ID0gcmVzcG9uc2l2ZUFycmF5W2ldO1xuICAgICAgLy8gaWYgZG8gbm90IG1hdGNoLCBkbyBub3RoaW5nXG4gICAgICBpZiAoIXNjcmVlblticmVha3BvaW50XSkgY29udGludWU7XG4gICAgICB2YXIgY3VyVmFsID0gb3JpUHJvcFticmVha3BvaW50XTtcbiAgICAgIGlmIChjdXJWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzZXRQcm9wKGN1clZhbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgY2xhY01lcmdlQWxpZ25Pckp1c3RpZnkoKTtcbiAgfSwgW0pTT04uc3RyaW5naWZ5KG9yaVByb3ApLCBzY3JlZW5dKTtcbiAgcmV0dXJuIHByb3A7XG59XG52YXIgUm93ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGp1c3RpZnkgPSBwcm9wcy5qdXN0aWZ5LFxuICAgIGFsaWduID0gcHJvcHMuYWxpZ24sXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBfcHJvcHMkZ3V0dGVyID0gcHJvcHMuZ3V0dGVyLFxuICAgIGd1dHRlciA9IF9wcm9wcyRndXR0ZXIgPT09IHZvaWQgMCA/IDAgOiBfcHJvcHMkZ3V0dGVyLFxuICAgIHdyYXAgPSBwcm9wcy53cmFwLFxuICAgIG90aGVycyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwianVzdGlmeVwiLCBcImFsaWduXCIsIFwiY2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJjaGlsZHJlblwiLCBcImd1dHRlclwiLCBcIndyYXBcIl0pO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUoe1xuICAgICAgeHM6IHRydWUsXG4gICAgICBzbTogdHJ1ZSxcbiAgICAgIG1kOiB0cnVlLFxuICAgICAgbGc6IHRydWUsXG4gICAgICB4bDogdHJ1ZSxcbiAgICAgIHh4bDogdHJ1ZVxuICAgIH0pLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICBzY3JlZW5zID0gX1JlYWN0JHVzZVN0YXRlNFswXSxcbiAgICBzZXRTY3JlZW5zID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcbiAgLy8gdG8gc2F2ZSBzY3JlZW5zIGluZm8gd2hlbiByZXNwb25zaXZlT2JzZXJ2ZSBjYWxsYmFjayBoYWQgYmVlbiBjYWxsXG4gIHZhciBfUmVhY3QkdXNlU3RhdGU1ID0gUmVhY3QudXNlU3RhdGUoe1xuICAgICAgeHM6IGZhbHNlLFxuICAgICAgc206IGZhbHNlLFxuICAgICAgbWQ6IGZhbHNlLFxuICAgICAgbGc6IGZhbHNlLFxuICAgICAgeGw6IGZhbHNlLFxuICAgICAgeHhsOiBmYWxzZVxuICAgIH0pLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTYgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGU1LCAyKSxcbiAgICBjdXJTY3JlZW5zID0gX1JlYWN0JHVzZVN0YXRlNlswXSxcbiAgICBzZXRDdXJTY3JlZW5zID0gX1JlYWN0JHVzZVN0YXRlNlsxXTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBjYWxjIHJlcG9uc2l2ZSBkYXRhID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG1lcmdlQWxpZ24gPSB1c2VNZXJnZVByb3BCeVNjcmVlbihhbGlnbiwgY3VyU2NyZWVucyk7XG4gIHZhciBtZXJnZUp1c3RpZnkgPSB1c2VNZXJnZVByb3BCeVNjcmVlbihqdXN0aWZ5LCBjdXJTY3JlZW5zKTtcbiAgdmFyIHN1cHBvcnRGbGV4R2FwID0gdXNlRmxleEdhcFN1cHBvcnQoKTtcbiAgdmFyIGd1dHRlclJlZiA9IFJlYWN0LnVzZVJlZihndXR0ZXIpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRva2VuID0gUmVzcG9uc2l2ZU9ic2VydmUuc3Vic2NyaWJlKGZ1bmN0aW9uIChzY3JlZW4pIHtcbiAgICAgIHNldEN1clNjcmVlbnMoc2NyZWVuKTtcbiAgICAgIHZhciBjdXJyZW50R3V0dGVyID0gZ3V0dGVyUmVmLmN1cnJlbnQgfHwgMDtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjdXJyZW50R3V0dGVyKSAmJiBfdHlwZW9mKGN1cnJlbnRHdXR0ZXIpID09PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGN1cnJlbnRHdXR0ZXIpICYmIChfdHlwZW9mKGN1cnJlbnRHdXR0ZXJbMF0pID09PSAnb2JqZWN0JyB8fCBfdHlwZW9mKGN1cnJlbnRHdXR0ZXJbMV0pID09PSAnb2JqZWN0JykpIHtcbiAgICAgICAgc2V0U2NyZWVucyhzY3JlZW4pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gUmVzcG9uc2l2ZU9ic2VydmUudW5zdWJzY3JpYmUodG9rZW4pO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZ2V0R3V0dGVyID0gZnVuY3Rpb24gZ2V0R3V0dGVyKCkge1xuICAgIHZhciByZXN1bHRzID0gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXTtcbiAgICB2YXIgbm9ybWFsaXplZEd1dHRlciA9IEFycmF5LmlzQXJyYXkoZ3V0dGVyKSA/IGd1dHRlciA6IFtndXR0ZXIsIHVuZGVmaW5lZF07XG4gICAgbm9ybWFsaXplZEd1dHRlci5mb3JFYWNoKGZ1bmN0aW9uIChnLCBpbmRleCkge1xuICAgICAgaWYgKF90eXBlb2YoZykgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzcG9uc2l2ZUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGJyZWFrcG9pbnQgPSByZXNwb25zaXZlQXJyYXlbaV07XG4gICAgICAgICAgaWYgKHNjcmVlbnNbYnJlYWtwb2ludF0gJiYgZ1ticmVha3BvaW50XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHRzW2luZGV4XSA9IGdbYnJlYWtwb2ludF07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdHNbaW5kZXhdID0gZztcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygncm93JywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIGd1dHRlcnMgPSBnZXRHdXR0ZXIoKTtcbiAgdmFyIGNsYXNzZXMgPSBjbGFzc05hbWVzKHByZWZpeENscywgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1uby13cmFwXCIpLCB3cmFwID09PSBmYWxzZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KG1lcmdlSnVzdGlmeSksIG1lcmdlSnVzdGlmeSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KG1lcmdlQWxpZ24pLCBtZXJnZUFsaWduKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcbiAgLy8gQWRkIGd1dHRlciByZWxhdGVkIHN0eWxlXG4gIHZhciByb3dTdHlsZSA9IHt9O1xuICB2YXIgaG9yaXpvbnRhbEd1dHRlciA9IGd1dHRlcnNbMF0gIT0gbnVsbCAmJiBndXR0ZXJzWzBdID4gMCA/IGd1dHRlcnNbMF0gLyAtMiA6IHVuZGVmaW5lZDtcbiAgdmFyIHZlcnRpY2FsR3V0dGVyID0gZ3V0dGVyc1sxXSAhPSBudWxsICYmIGd1dHRlcnNbMV0gPiAwID8gZ3V0dGVyc1sxXSAvIC0yIDogdW5kZWZpbmVkO1xuICBpZiAoaG9yaXpvbnRhbEd1dHRlcikge1xuICAgIHJvd1N0eWxlLm1hcmdpbkxlZnQgPSBob3Jpem9udGFsR3V0dGVyO1xuICAgIHJvd1N0eWxlLm1hcmdpblJpZ2h0ID0gaG9yaXpvbnRhbEd1dHRlcjtcbiAgfVxuICBpZiAoc3VwcG9ydEZsZXhHYXApIHtcbiAgICAvLyBTZXQgZ2FwIGRpcmVjdCBpZiBmbGV4IGdhcCBzdXBwb3J0XG4gICAgdmFyIF9ndXR0ZXJzID0gX3NsaWNlZFRvQXJyYXkoZ3V0dGVycywgMik7XG4gICAgcm93U3R5bGUucm93R2FwID0gX2d1dHRlcnNbMV07XG4gIH0gZWxzZSBpZiAodmVydGljYWxHdXR0ZXIpIHtcbiAgICByb3dTdHlsZS5tYXJnaW5Ub3AgPSB2ZXJ0aWNhbEd1dHRlcjtcbiAgICByb3dTdHlsZS5tYXJnaW5Cb3R0b20gPSB2ZXJ0aWNhbEd1dHRlcjtcbiAgfVxuICAvLyBcImd1dHRlcnNcIiBpcyBhIG5ldyBhcnJheSBpbiBlYWNoIHJlbmRlcmluZyBwaGFzZSwgaXQnbGwgbWFrZSAnUmVhY3QudXNlTWVtbycgZWZmZWN0bGVzcy5cbiAgLy8gU28gd2UgZGVjb25zdHJ1Y3QgXCJndXR0ZXJzXCIgdmFyaWFibGUgaGVyZS5cbiAgdmFyIF9ndXR0ZXJzMiA9IF9zbGljZWRUb0FycmF5KGd1dHRlcnMsIDIpLFxuICAgIGd1dHRlckggPSBfZ3V0dGVyczJbMF0sXG4gICAgZ3V0dGVyViA9IF9ndXR0ZXJzMlsxXTtcbiAgdmFyIHJvd0NvbnRleHQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZ3V0dGVyOiBbZ3V0dGVySCwgZ3V0dGVyVl0sXG4gICAgICB3cmFwOiB3cmFwLFxuICAgICAgc3VwcG9ydEZsZXhHYXA6IHN1cHBvcnRGbGV4R2FwXG4gICAgfTtcbiAgfSwgW2d1dHRlckgsIGd1dHRlclYsIHdyYXAsIHN1cHBvcnRGbGV4R2FwXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSb3dDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHJvd0NvbnRleHRcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe30sIG90aGVycywge1xuICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICBzdHlsZTogX2V4dGVuZHMoX2V4dGVuZHMoe30sIHJvd1N0eWxlKSwgc3R5bGUpLFxuICAgIHJlZjogcmVmXG4gIH0pLCBjaGlsZHJlbikpO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSb3cuZGlzcGxheU5hbWUgPSAnUm93Jztcbn1cbmV4cG9ydCBkZWZhdWx0IFJvdzsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVyc2NvcmUtZGFuZ2xlICovXG5cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L3Byb3AtdHlwZXMgKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xudmFyIFBhbmVsQ29udGVudCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBfY2xhc3NuYW1lcztcblxuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgZm9yY2VSZW5kZXIgPSBwcm9wcy5mb3JjZVJlbmRlcixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgaXNBY3RpdmUgPSBwcm9wcy5pc0FjdGl2ZSxcbiAgICAgIHJvbGUgPSBwcm9wcy5yb2xlO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShpc0FjdGl2ZSB8fCBmb3JjZVJlbmRlciksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIHJlbmRlcmVkID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldFJlbmRlcmVkID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChmb3JjZVJlbmRlciB8fCBpc0FjdGl2ZSkge1xuICAgICAgc2V0UmVuZGVyZWQodHJ1ZSk7XG4gICAgfVxuICB9LCBbZm9yY2VSZW5kZXIsIGlzQWN0aXZlXSk7XG5cbiAgaWYgKCFyZW5kZXJlZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50XCIpLCAoX2NsYXNzbmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc25hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbnRlbnQtYWN0aXZlXCIpLCBpc0FjdGl2ZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NuYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50LWluYWN0aXZlXCIpLCAhaXNBY3RpdmUpLCBfY2xhc3NuYW1lcyksIGNsYXNzTmFtZSksXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIHJvbGU6IHJvbGVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50LWJveFwiKVxuICB9LCBjaGlsZHJlbikpO1xufSk7XG5QYW5lbENvbnRlbnQuZGlzcGxheU5hbWUgPSAnUGFuZWxDb250ZW50JztcbmV4cG9ydCBkZWZhdWx0IFBhbmVsQ29udGVudDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJjbGFzc05hbWVcIiwgXCJpZFwiLCBcInN0eWxlXCIsIFwicHJlZml4Q2xzXCIsIFwiaGVhZGVyQ2xhc3NcIiwgXCJjaGlsZHJlblwiLCBcImlzQWN0aXZlXCIsIFwiZGVzdHJveUluYWN0aXZlUGFuZWxcIiwgXCJhY2NvcmRpb25cIiwgXCJmb3JjZVJlbmRlclwiLCBcIm9wZW5Nb3Rpb25cIiwgXCJleHRyYVwiLCBcImNvbGxhcHNpYmxlXCJdO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9wcm9wLXR5cGVzICovXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBDU1NNb3Rpb24gZnJvbSAncmMtbW90aW9uJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzaGFsbG93RXF1YWwgZnJvbSAnc2hhbGxvd2VxdWFsJztcbmltcG9ydCBQYW5lbENvbnRlbnQgZnJvbSAnLi9QYW5lbENvbnRlbnQnO1xuXG52YXIgQ29sbGFwc2VQYW5lbCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoQ29sbGFwc2VQYW5lbCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihDb2xsYXBzZVBhbmVsKTtcblxuICBmdW5jdGlvbiBDb2xsYXBzZVBhbmVsKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb2xsYXBzZVBhbmVsKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsLmFwcGx5KF9zdXBlciwgW3RoaXNdLmNvbmNhdChhcmdzKSk7XG5cbiAgICBfdGhpcy5vbkl0ZW1DbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIG9uSXRlbUNsaWNrID0gX3RoaXMkcHJvcHMub25JdGVtQ2xpY2ssXG4gICAgICAgICAgcGFuZWxLZXkgPSBfdGhpcyRwcm9wcy5wYW5lbEtleTtcblxuICAgICAgaWYgKHR5cGVvZiBvbkl0ZW1DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkl0ZW1DbGljayhwYW5lbEtleSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUtleVByZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyB8fCBlLmtleUNvZGUgPT09IDEzIHx8IGUud2hpY2ggPT09IDEzKSB7XG4gICAgICAgIF90aGlzLm9uSXRlbUNsaWNrKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLnJlbmRlckljb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgc2hvd0Fycm93ID0gX3RoaXMkcHJvcHMyLnNob3dBcnJvdyxcbiAgICAgICAgICBleHBhbmRJY29uID0gX3RoaXMkcHJvcHMyLmV4cGFuZEljb24sXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHMyLnByZWZpeENscyxcbiAgICAgICAgICBjb2xsYXBzaWJsZSA9IF90aGlzJHByb3BzMi5jb2xsYXBzaWJsZTtcblxuICAgICAgaWYgKCFzaG93QXJyb3cpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciBpY29uTm9kZSA9IHR5cGVvZiBleHBhbmRJY29uID09PSAnZnVuY3Rpb24nID8gZXhwYW5kSWNvbihfdGhpcy5wcm9wcykgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImlcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiYXJyb3dcIlxuICAgICAgfSk7XG4gICAgICByZXR1cm4gaWNvbk5vZGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZXhwYW5kLWljb25cIiksXG4gICAgICAgIG9uQ2xpY2s6IGNvbGxhcHNpYmxlID09PSAnaGVhZGVyJyB8fCBjb2xsYXBzaWJsZSA9PT0gJ2ljb24nID8gX3RoaXMub25JdGVtQ2xpY2sgOiBudWxsXG4gICAgICB9LCBpY29uTm9kZSk7XG4gICAgfTtcblxuICAgIF90aGlzLnJlbmRlclRpdGxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGhlYWRlciA9IF90aGlzJHByb3BzMy5oZWFkZXIsXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHMzLnByZWZpeENscyxcbiAgICAgICAgICBjb2xsYXBzaWJsZSA9IF90aGlzJHByb3BzMy5jb2xsYXBzaWJsZTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGVhZGVyLXRleHRcIiksXG4gICAgICAgIG9uQ2xpY2s6IGNvbGxhcHNpYmxlID09PSAnaGVhZGVyJyA/IF90aGlzLm9uSXRlbUNsaWNrIDogbnVsbFxuICAgICAgfSwgaGVhZGVyKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKENvbGxhcHNlUGFuZWwsIFt7XG4gICAga2V5OiBcInNob3VsZENvbXBvbmVudFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzKSB7XG4gICAgICByZXR1cm4gIXNoYWxsb3dFcXVhbCh0aGlzLnByb3BzLCBuZXh0UHJvcHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF9jbGFzc05hbWVzLCBfY2xhc3NOYW1lczI7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wczQgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzNC5jbGFzc05hbWUsXG4gICAgICAgICAgaWQgPSBfdGhpcyRwcm9wczQuaWQsXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wczQuc3R5bGUsXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHM0LnByZWZpeENscyxcbiAgICAgICAgICBoZWFkZXJDbGFzcyA9IF90aGlzJHByb3BzNC5oZWFkZXJDbGFzcyxcbiAgICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzNC5jaGlsZHJlbixcbiAgICAgICAgICBpc0FjdGl2ZSA9IF90aGlzJHByb3BzNC5pc0FjdGl2ZSxcbiAgICAgICAgICBkZXN0cm95SW5hY3RpdmVQYW5lbCA9IF90aGlzJHByb3BzNC5kZXN0cm95SW5hY3RpdmVQYW5lbCxcbiAgICAgICAgICBhY2NvcmRpb24gPSBfdGhpcyRwcm9wczQuYWNjb3JkaW9uLFxuICAgICAgICAgIGZvcmNlUmVuZGVyID0gX3RoaXMkcHJvcHM0LmZvcmNlUmVuZGVyLFxuICAgICAgICAgIG9wZW5Nb3Rpb24gPSBfdGhpcyRwcm9wczQub3Blbk1vdGlvbixcbiAgICAgICAgICBleHRyYSA9IF90aGlzJHByb3BzNC5leHRyYSxcbiAgICAgICAgICBjb2xsYXBzaWJsZSA9IF90aGlzJHByb3BzNC5jb2xsYXBzaWJsZSxcbiAgICAgICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF90aGlzJHByb3BzNCwgX2V4Y2x1ZGVkKTtcblxuICAgICAgdmFyIGRpc2FibGVkID0gY29sbGFwc2libGUgPT09ICdkaXNhYmxlZCc7XG4gICAgICB2YXIgY29sbGFwc2libGVIZWFkZXIgPSBjb2xsYXBzaWJsZSA9PT0gJ2hlYWRlcic7XG4gICAgICB2YXIgY29sbGFwc2libGVJY29uID0gY29sbGFwc2libGUgPT09ICdpY29uJztcbiAgICAgIHZhciBpdGVtQ2xzID0gY2xhc3NOYW1lcygoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW1cIiksIHRydWUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1hY3RpdmVcIiksIGlzQWN0aXZlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICAgICAgdmFyIGhlYWRlckNscyA9IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkZXJcIiksIChfY2xhc3NOYW1lczIgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgaGVhZGVyQ2xhc3MsIGhlYWRlckNsYXNzKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkZXItY29sbGFwc2libGUtb25seVwiKSwgY29sbGFwc2libGVIZWFkZXIpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWljb24tY29sbGFwc2libGUtb25seVwiKSwgY29sbGFwc2libGVJY29uKSwgX2NsYXNzTmFtZXMyKSk7XG4gICAgICAvKiogaGVhZGVyIOiKgueCueWxnuaApyAqL1xuXG4gICAgICB2YXIgaGVhZGVyUHJvcHMgPSB7XG4gICAgICAgIGNsYXNzTmFtZTogaGVhZGVyQ2xzLFxuICAgICAgICAnYXJpYS1leHBhbmRlZCc6IGlzQWN0aXZlLFxuICAgICAgICAnYXJpYS1kaXNhYmxlZCc6IGRpc2FibGVkLFxuICAgICAgICBvbktleVByZXNzOiB0aGlzLmhhbmRsZUtleVByZXNzXG4gICAgICB9O1xuXG4gICAgICBpZiAoIWNvbGxhcHNpYmxlSGVhZGVyICYmICFjb2xsYXBzaWJsZUljb24pIHtcbiAgICAgICAgaGVhZGVyUHJvcHMub25DbGljayA9IHRoaXMub25JdGVtQ2xpY2s7XG4gICAgICAgIGhlYWRlclByb3BzLnJvbGUgPSBhY2NvcmRpb24gPyAndGFiJyA6ICdidXR0b24nO1xuICAgICAgICBoZWFkZXJQcm9wcy50YWJJbmRleCA9IGRpc2FibGVkID8gLTEgOiAwO1xuICAgICAgfVxuXG4gICAgICB2YXIgaWZFeHRyYUV4aXN0ID0gZXh0cmEgIT09IG51bGwgJiYgZXh0cmEgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZXh0cmEgIT09ICdib29sZWFuJzsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9wdWxsLzM3NDE5I2lzc3VlY29tbWVudC0xMjM4ODEyNzk3XG5cbiAgICAgIGRlbGV0ZSByZXN0LmhlYWRlcjtcbiAgICAgIGRlbGV0ZSByZXN0LnBhbmVsS2V5O1xuICAgICAgZGVsZXRlIHJlc3Qub25JdGVtQ2xpY2s7XG4gICAgICBkZWxldGUgcmVzdC5zaG93QXJyb3c7XG4gICAgICBkZWxldGUgcmVzdC5leHBhbmRJY29uO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICAgIGNsYXNzTmFtZTogaXRlbUNscyxcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICBpZDogaWRcbiAgICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBoZWFkZXJQcm9wcywgdGhpcy5yZW5kZXJJY29uKCksIHRoaXMucmVuZGVyVGl0bGUoKSwgaWZFeHRyYUV4aXN0ICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWV4dHJhXCIpXG4gICAgICB9LCBleHRyYSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDU1NNb3Rpb24sIF9leHRlbmRzKHtcbiAgICAgICAgdmlzaWJsZTogaXNBY3RpdmUsXG4gICAgICAgIGxlYXZlZENsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50LWhpZGRlblwiKVxuICAgICAgfSwgb3Blbk1vdGlvbiwge1xuICAgICAgICBmb3JjZVJlbmRlcjogZm9yY2VSZW5kZXIsXG4gICAgICAgIHJlbW92ZU9uTGVhdmU6IGRlc3Ryb3lJbmFjdGl2ZVBhbmVsXG4gICAgICB9KSwgZnVuY3Rpb24gKF9yZWYsIHJlZikge1xuICAgICAgICB2YXIgbW90aW9uQ2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgICAgICAgICBtb3Rpb25TdHlsZSA9IF9yZWYuc3R5bGU7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYW5lbENvbnRlbnQsIHtcbiAgICAgICAgICByZWY6IHJlZixcbiAgICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICBjbGFzc05hbWU6IG1vdGlvbkNsYXNzTmFtZSxcbiAgICAgICAgICBzdHlsZTogbW90aW9uU3R5bGUsXG4gICAgICAgICAgaXNBY3RpdmU6IGlzQWN0aXZlLFxuICAgICAgICAgIGZvcmNlUmVuZGVyOiBmb3JjZVJlbmRlcixcbiAgICAgICAgICByb2xlOiBhY2NvcmRpb24gPyAndGFicGFuZWwnIDogbnVsbFxuICAgICAgICB9LCBjaGlsZHJlbik7XG4gICAgICB9KSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENvbGxhcHNlUGFuZWw7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbkNvbGxhcHNlUGFuZWwuZGVmYXVsdFByb3BzID0ge1xuICBzaG93QXJyb3c6IHRydWUsXG4gIGlzQWN0aXZlOiBmYWxzZSxcbiAgb25JdGVtQ2xpY2s6IGZ1bmN0aW9uIG9uSXRlbUNsaWNrKCkge30sXG4gIGhlYWRlckNsYXNzOiAnJyxcbiAgZm9yY2VSZW5kZXI6IGZhbHNlXG59O1xuZXhwb3J0IGRlZmF1bHQgQ29sbGFwc2VQYW5lbDsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNcIjtcbmltcG9ydCBfY3JlYXRlU3VwZXIgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZVN1cGVyXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L3Byb3AtdHlwZXMgKi9cbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHRvQXJyYXkgZnJvbSBcInJjLXV0aWwvZXMvQ2hpbGRyZW4vdG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHNoYWxsb3dFcXVhbCBmcm9tICdzaGFsbG93ZXF1YWwnO1xuaW1wb3J0IENvbGxhcHNlUGFuZWwgZnJvbSAnLi9QYW5lbCc7XG5cbmZ1bmN0aW9uIGdldEFjdGl2ZUtleXNBcnJheShhY3RpdmVLZXkpIHtcbiAgdmFyIGN1cnJlbnRBY3RpdmVLZXkgPSBhY3RpdmVLZXk7XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGN1cnJlbnRBY3RpdmVLZXkpKSB7XG4gICAgdmFyIGFjdGl2ZUtleVR5cGUgPSBfdHlwZW9mKGN1cnJlbnRBY3RpdmVLZXkpO1xuXG4gICAgY3VycmVudEFjdGl2ZUtleSA9IGFjdGl2ZUtleVR5cGUgPT09ICdudW1iZXInIHx8IGFjdGl2ZUtleVR5cGUgPT09ICdzdHJpbmcnID8gW2N1cnJlbnRBY3RpdmVLZXldIDogW107XG4gIH1cblxuICByZXR1cm4gY3VycmVudEFjdGl2ZUtleS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBTdHJpbmcoa2V5KTtcbiAgfSk7XG59XG5cbnZhciBDb2xsYXBzZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoQ29sbGFwc2UsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQ29sbGFwc2UpO1xuXG4gIGZ1bmN0aW9uIENvbGxhcHNlKF9wcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb2xsYXBzZSk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIF9wcm9wcyk7XG5cbiAgICBfdGhpcy5vbkNsaWNrSXRlbSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBhY3RpdmVLZXkgPSBfdGhpcy5zdGF0ZS5hY3RpdmVLZXk7XG5cbiAgICAgIGlmIChfdGhpcy5wcm9wcy5hY2NvcmRpb24pIHtcbiAgICAgICAgYWN0aXZlS2V5ID0gYWN0aXZlS2V5WzBdID09PSBrZXkgPyBbXSA6IFtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aXZlS2V5ID0gX3RvQ29uc3VtYWJsZUFycmF5KGFjdGl2ZUtleSk7XG4gICAgICAgIHZhciBpbmRleCA9IGFjdGl2ZUtleS5pbmRleE9mKGtleSk7XG4gICAgICAgIHZhciBpc0FjdGl2ZSA9IGluZGV4ID4gLTE7XG5cbiAgICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgICAgLy8gcmVtb3ZlIGFjdGl2ZSBzdGF0ZVxuICAgICAgICAgIGFjdGl2ZUtleS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFjdGl2ZUtleS5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgX3RoaXMuc2V0QWN0aXZlS2V5KGFjdGl2ZUtleSk7XG4gICAgfTtcblxuICAgIF90aGlzLmdldE5ld0NoaWxkID0gZnVuY3Rpb24gKGNoaWxkLCBpbmRleCkge1xuICAgICAgaWYgKCFjaGlsZCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgYWN0aXZlS2V5ID0gX3RoaXMuc3RhdGUuYWN0aXZlS2V5O1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHMucHJlZml4Q2xzLFxuICAgICAgICAgIG9wZW5Nb3Rpb24gPSBfdGhpcyRwcm9wcy5vcGVuTW90aW9uLFxuICAgICAgICAgIGFjY29yZGlvbiA9IF90aGlzJHByb3BzLmFjY29yZGlvbixcbiAgICAgICAgICByb290RGVzdHJveUluYWN0aXZlUGFuZWwgPSBfdGhpcyRwcm9wcy5kZXN0cm95SW5hY3RpdmVQYW5lbCxcbiAgICAgICAgICBleHBhbmRJY29uID0gX3RoaXMkcHJvcHMuZXhwYW5kSWNvbixcbiAgICAgICAgICBjb2xsYXBzaWJsZSA9IF90aGlzJHByb3BzLmNvbGxhcHNpYmxlOyAvLyBJZiB0aGVyZSBpcyBubyBrZXkgcHJvdmlkZSwgdXNlIHRoZSBwYW5lbCBvcmRlciBhcyBkZWZhdWx0IGtleVxuXG4gICAgICB2YXIga2V5ID0gY2hpbGQua2V5IHx8IFN0cmluZyhpbmRleCk7XG4gICAgICB2YXIgX2NoaWxkJHByb3BzID0gY2hpbGQucHJvcHMsXG4gICAgICAgICAgaGVhZGVyID0gX2NoaWxkJHByb3BzLmhlYWRlcixcbiAgICAgICAgICBoZWFkZXJDbGFzcyA9IF9jaGlsZCRwcm9wcy5oZWFkZXJDbGFzcyxcbiAgICAgICAgICBkZXN0cm95SW5hY3RpdmVQYW5lbCA9IF9jaGlsZCRwcm9wcy5kZXN0cm95SW5hY3RpdmVQYW5lbCxcbiAgICAgICAgICBjaGlsZENvbGxhcHNpYmxlID0gX2NoaWxkJHByb3BzLmNvbGxhcHNpYmxlO1xuICAgICAgdmFyIGlzQWN0aXZlID0gZmFsc2U7XG5cbiAgICAgIGlmIChhY2NvcmRpb24pIHtcbiAgICAgICAgaXNBY3RpdmUgPSBhY3RpdmVLZXlbMF0gPT09IGtleTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzQWN0aXZlID0gYWN0aXZlS2V5LmluZGV4T2Yoa2V5KSA+IC0xO1xuICAgICAgfVxuXG4gICAgICB2YXIgbWVyZ2VDb2xsYXBzaWJsZSA9IGNoaWxkQ29sbGFwc2libGUgIT09IG51bGwgJiYgY2hpbGRDb2xsYXBzaWJsZSAhPT0gdm9pZCAwID8gY2hpbGRDb2xsYXBzaWJsZSA6IGNvbGxhcHNpYmxlO1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgcGFuZWxLZXk6IGtleSxcbiAgICAgICAgaGVhZGVyOiBoZWFkZXIsXG4gICAgICAgIGhlYWRlckNsYXNzOiBoZWFkZXJDbGFzcyxcbiAgICAgICAgaXNBY3RpdmU6IGlzQWN0aXZlLFxuICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgZGVzdHJveUluYWN0aXZlUGFuZWw6IGRlc3Ryb3lJbmFjdGl2ZVBhbmVsICE9PSBudWxsICYmIGRlc3Ryb3lJbmFjdGl2ZVBhbmVsICE9PSB2b2lkIDAgPyBkZXN0cm95SW5hY3RpdmVQYW5lbCA6IHJvb3REZXN0cm95SW5hY3RpdmVQYW5lbCxcbiAgICAgICAgb3Blbk1vdGlvbjogb3Blbk1vdGlvbixcbiAgICAgICAgYWNjb3JkaW9uOiBhY2NvcmRpb24sXG4gICAgICAgIGNoaWxkcmVuOiBjaGlsZC5wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgb25JdGVtQ2xpY2s6IG1lcmdlQ29sbGFwc2libGUgPT09ICdkaXNhYmxlZCcgPyBudWxsIDogX3RoaXMub25DbGlja0l0ZW0sXG4gICAgICAgIGV4cGFuZEljb246IGV4cGFuZEljb24sXG4gICAgICAgIGNvbGxhcHNpYmxlOiBtZXJnZUNvbGxhcHNpYmxlXG4gICAgICB9OyAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yMDQ3OVxuXG4gICAgICBpZiAodHlwZW9mIGNoaWxkLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgICAgT2JqZWN0LmtleXMocHJvcHMpLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcHNbcHJvcE5hbWVdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGRlbGV0ZSBwcm9wc1twcm9wTmFtZV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIHByb3BzKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0SXRlbXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBfdGhpcy5wcm9wcy5jaGlsZHJlbjtcbiAgICAgIHJldHVybiB0b0FycmF5KGNoaWxkcmVuKS5tYXAoX3RoaXMuZ2V0TmV3Q2hpbGQpO1xuICAgIH07XG5cbiAgICBfdGhpcy5zZXRBY3RpdmVLZXkgPSBmdW5jdGlvbiAoYWN0aXZlS2V5KSB7XG4gICAgICBpZiAoISgnYWN0aXZlS2V5JyBpbiBfdGhpcy5wcm9wcykpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGFjdGl2ZUtleTogYWN0aXZlS2V5XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5wcm9wcy5vbkNoYW5nZShfdGhpcy5wcm9wcy5hY2NvcmRpb24gPyBhY3RpdmVLZXlbMF0gOiBhY3RpdmVLZXkpO1xuICAgIH07XG5cbiAgICB2YXIgX2FjdGl2ZUtleSA9IF9wcm9wcy5hY3RpdmVLZXksXG4gICAgICAgIGRlZmF1bHRBY3RpdmVLZXkgPSBfcHJvcHMuZGVmYXVsdEFjdGl2ZUtleTtcbiAgICB2YXIgY3VycmVudEFjdGl2ZUtleSA9IGRlZmF1bHRBY3RpdmVLZXk7XG5cbiAgICBpZiAoJ2FjdGl2ZUtleScgaW4gX3Byb3BzKSB7XG4gICAgICBjdXJyZW50QWN0aXZlS2V5ID0gX2FjdGl2ZUtleTtcbiAgICB9XG5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGFjdGl2ZUtleTogZ2V0QWN0aXZlS2V5c0FycmF5KGN1cnJlbnRBY3RpdmVLZXkpXG4gICAgfTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQ29sbGFwc2UsIFt7XG4gICAga2V5OiBcInNob3VsZENvbXBvbmVudFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzLCBuZXh0U3RhdGUpIHtcbiAgICAgIHJldHVybiAhc2hhbGxvd0VxdWFsKHRoaXMucHJvcHMsIG5leHRQcm9wcykgfHwgIXNoYWxsb3dFcXVhbCh0aGlzLnN0YXRlLCBuZXh0U3RhdGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczIucHJlZml4Q2xzLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzMi5jbGFzc05hbWUsXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wczIuc3R5bGUsXG4gICAgICAgICAgYWNjb3JkaW9uID0gX3RoaXMkcHJvcHMyLmFjY29yZGlvbjtcbiAgICAgIHZhciBjb2xsYXBzZUNsYXNzTmFtZSA9IGNsYXNzTmFtZXMoKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgcHJlZml4Q2xzLCB0cnVlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBjbGFzc05hbWUsICEhY2xhc3NOYW1lKSwgX2NsYXNzTmFtZXMpKTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY29sbGFwc2VDbGFzc05hbWUsXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgcm9sZTogYWNjb3JkaW9uID8gJ3RhYmxpc3QnIDogbnVsbFxuICAgICAgfSwgdGhpcy5nZXRJdGVtcygpKTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcykge1xuICAgICAgdmFyIG5ld1N0YXRlID0ge307XG5cbiAgICAgIGlmICgnYWN0aXZlS2V5JyBpbiBuZXh0UHJvcHMpIHtcbiAgICAgICAgbmV3U3RhdGUuYWN0aXZlS2V5ID0gZ2V0QWN0aXZlS2V5c0FycmF5KG5leHRQcm9wcy5hY3RpdmVLZXkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3U3RhdGU7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENvbGxhcHNlO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5Db2xsYXBzZS5kZWZhdWx0UHJvcHMgPSB7XG4gIHByZWZpeENsczogJ3JjLWNvbGxhcHNlJyxcbiAgb25DaGFuZ2U6IGZ1bmN0aW9uIG9uQ2hhbmdlKCkge30sXG4gIGFjY29yZGlvbjogZmFsc2UsXG4gIGRlc3Ryb3lJbmFjdGl2ZVBhbmVsOiBmYWxzZVxufTtcbkNvbGxhcHNlLlBhbmVsID0gQ29sbGFwc2VQYW5lbDtcbmV4cG9ydCBkZWZhdWx0IENvbGxhcHNlOyIsImltcG9ydCBDb2xsYXBzZSBmcm9tICcuL0NvbGxhcHNlJztcbmV4cG9ydCBkZWZhdWx0IENvbGxhcHNlO1xudmFyIFBhbmVsID0gQ29sbGFwc2UuUGFuZWw7XG5leHBvcnQgeyBQYW5lbCB9OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjQ29sbGFwc2UgZnJvbSAncmMtY29sbGFwc2UnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbnZhciBDb2xsYXBzZVBhbmVsID0gZnVuY3Rpb24gQ29sbGFwc2VQYW5lbChwcm9wcykge1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCEoJ2Rpc2FibGVkJyBpbiBwcm9wcyksICdDb2xsYXBzZS5QYW5lbCcsICdgZGlzYWJsZWRgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYGNvbGxhcHNpYmxlPVwiZGlzYWJsZWRcImAgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHM7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgX3Byb3BzJGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBjbGFzc05hbWUgPSBfcHJvcHMkY2xhc3NOYW1lID09PSB2b2lkIDAgPyAnJyA6IF9wcm9wcyRjbGFzc05hbWUsXG4gICAgX3Byb3BzJHNob3dBcnJvdyA9IHByb3BzLnNob3dBcnJvdyxcbiAgICBzaG93QXJyb3cgPSBfcHJvcHMkc2hvd0Fycm93ID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJHNob3dBcnJvdztcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnY29sbGFwc2UnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgY29sbGFwc2VQYW5lbENsYXNzTmFtZSA9IGNsYXNzTmFtZXMoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5vLWFycm93XCIpLCAhc2hvd0Fycm93KSwgY2xhc3NOYW1lKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJjQ29sbGFwc2UuUGFuZWwsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZTogY29sbGFwc2VQYW5lbENsYXNzTmFtZVxuICB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgQ29sbGFwc2VQYW5lbDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgUmlnaHRPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvUmlnaHRPdXRsaW5lZFwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmNDb2xsYXBzZSBmcm9tICdyYy1jb2xsYXBzZSc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdG9BcnJheSBmcm9tIFwicmMtdXRpbC9lcy9DaGlsZHJlbi90b0FycmF5XCI7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBjb2xsYXBzZU1vdGlvbiBmcm9tICcuLi9fdXRpbC9tb3Rpb24nO1xuaW1wb3J0IHsgY2xvbmVFbGVtZW50IH0gZnJvbSAnLi4vX3V0aWwvcmVhY3ROb2RlJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IENvbGxhcHNlUGFuZWwgZnJvbSAnLi9Db2xsYXBzZVBhbmVsJztcbnZhciBDb2xsYXBzZSA9IGZ1bmN0aW9uIENvbGxhcHNlKHByb3BzKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIF9wcm9wcyRjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgY2xhc3NOYW1lID0gX3Byb3BzJGNsYXNzTmFtZSA9PT0gdm9pZCAwID8gJycgOiBfcHJvcHMkY2xhc3NOYW1lLFxuICAgIF9wcm9wcyRib3JkZXJlZCA9IHByb3BzLmJvcmRlcmVkLFxuICAgIGJvcmRlcmVkID0gX3Byb3BzJGJvcmRlcmVkID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGJvcmRlcmVkLFxuICAgIGdob3N0ID0gcHJvcHMuZ2hvc3QsXG4gICAgX3Byb3BzJGV4cGFuZEljb25Qb3NpID0gcHJvcHMuZXhwYW5kSWNvblBvc2l0aW9uLFxuICAgIGV4cGFuZEljb25Qb3NpdGlvbiA9IF9wcm9wcyRleHBhbmRJY29uUG9zaSA9PT0gdm9pZCAwID8gJ3N0YXJ0JyA6IF9wcm9wcyRleHBhbmRJY29uUG9zaTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnY29sbGFwc2UnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAvLyBXYXJuaW5nIGlmIHVzZSBsZWdhY3kgdHlwZSBgZXhwYW5kSWNvblBvc2l0aW9uYFxuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGV4cGFuZEljb25Qb3NpdGlvbiAhPT0gJ2xlZnQnICYmIGV4cGFuZEljb25Qb3NpdGlvbiAhPT0gJ3JpZ2h0JywgJ0NvbGxhcHNlJywgJ2BleHBhbmRJY29uUG9zaXRpb25gIHdpdGggYGxlZnRgIG9yIGByaWdodGAgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBgc3RhcnRgIG9yIGBlbmRgIGluc3RlYWQuJykgOiB2b2lkIDA7XG4gIC8vIEFsaWduIHdpdGggbG9naWMgcG9zaXRpb25cbiAgdmFyIG1lcmdlZEV4cGFuZEljb25Qb3NpdGlvbiA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmIChleHBhbmRJY29uUG9zaXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgcmV0dXJuICdzdGFydCc7XG4gICAgfVxuICAgIHJldHVybiBleHBhbmRJY29uUG9zaXRpb24gPT09ICdyaWdodCcgPyAnZW5kJyA6IGV4cGFuZEljb25Qb3NpdGlvbjtcbiAgfSwgW2V4cGFuZEljb25Qb3NpdGlvbl0pO1xuICB2YXIgcmVuZGVyRXhwYW5kSWNvbiA9IGZ1bmN0aW9uIHJlbmRlckV4cGFuZEljb24oKSB7XG4gICAgdmFyIHBhbmVsUHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIHZhciBleHBhbmRJY29uID0gcHJvcHMuZXhwYW5kSWNvbjtcbiAgICB2YXIgaWNvbiA9IGV4cGFuZEljb24gPyBleHBhbmRJY29uKHBhbmVsUHJvcHMpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmlnaHRPdXRsaW5lZCwge1xuICAgICAgcm90YXRlOiBwYW5lbFByb3BzLmlzQWN0aXZlID8gOTAgOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgICByZXR1cm4gY2xvbmVFbGVtZW50KGljb24sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhpY29uLnByb3BzLmNsYXNzTmFtZSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hcnJvd1wiKSlcbiAgICAgIH07XG4gICAgfSk7XG4gIH07XG4gIHZhciBjb2xsYXBzZUNsYXNzTmFtZSA9IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pY29uLXBvc2l0aW9uLVwiKS5jb25jYXQobWVyZ2VkRXhwYW5kSWNvblBvc2l0aW9uKSwgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ib3JkZXJsZXNzXCIpLCAhYm9yZGVyZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWdob3N0XCIpLCAhIWdob3N0KSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICB2YXIgb3Blbk1vdGlvbiA9IF9leHRlbmRzKF9leHRlbmRzKHt9LCBjb2xsYXBzZU1vdGlvbiksIHtcbiAgICBtb3Rpb25BcHBlYXI6IGZhbHNlLFxuICAgIGxlYXZlZENsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50LWhpZGRlblwiKVxuICB9KTtcbiAgdmFyIGdldEl0ZW1zID0gZnVuY3Rpb24gZ2V0SXRlbXMoKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW47XG4gICAgcmV0dXJuIHRvQXJyYXkoY2hpbGRyZW4pLm1hcChmdW5jdGlvbiAoY2hpbGQsIGluZGV4KSB7XG4gICAgICB2YXIgX2E7XG4gICAgICBpZiAoKF9hID0gY2hpbGQucHJvcHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kaXNhYmxlZCkge1xuICAgICAgICB2YXIga2V5ID0gY2hpbGQua2V5IHx8IFN0cmluZyhpbmRleCk7XG4gICAgICAgIHZhciBfY2hpbGQkcHJvcHMgPSBjaGlsZC5wcm9wcyxcbiAgICAgICAgICBkaXNhYmxlZCA9IF9jaGlsZCRwcm9wcy5kaXNhYmxlZCxcbiAgICAgICAgICBjb2xsYXBzaWJsZSA9IF9jaGlsZCRwcm9wcy5jb2xsYXBzaWJsZTtcbiAgICAgICAgdmFyIGNoaWxkUHJvcHMgPSBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgb21pdChjaGlsZC5wcm9wcywgWydkaXNhYmxlZCddKSksIHtcbiAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICBjb2xsYXBzaWJsZTogY29sbGFwc2libGUgIT09IG51bGwgJiYgY29sbGFwc2libGUgIT09IHZvaWQgMCA/IGNvbGxhcHNpYmxlIDogZGlzYWJsZWQgPyAnZGlzYWJsZWQnIDogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2xvbmVFbGVtZW50KGNoaWxkLCBjaGlsZFByb3BzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9KTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJjQ29sbGFwc2UsIF9leHRlbmRzKHtcbiAgICBvcGVuTW90aW9uOiBvcGVuTW90aW9uXG4gIH0sIHByb3BzLCB7XG4gICAgZXhwYW5kSWNvbjogcmVuZGVyRXhwYW5kSWNvbixcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBjbGFzc05hbWU6IGNvbGxhcHNlQ2xhc3NOYW1lXG4gIH0pLCBnZXRJdGVtcygpKTtcbn07XG5Db2xsYXBzZS5QYW5lbCA9IENvbGxhcHNlUGFuZWw7XG5leHBvcnQgZGVmYXVsdCBDb2xsYXBzZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBCdXR0b24gZnJvbSAnLi4vYnV0dG9uJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFBpY2tlckJ1dHRvbihwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQnV0dG9uLCBfZXh0ZW5kcyh7XG4gICAgc2l6ZTogXCJzbWFsbFwiLFxuICAgIHR5cGU6IFwicHJpbWFyeVwiXG4gIH0sIHByb3BzKSk7XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG52YXIgQ2hlY2thYmxlVGFnID0gZnVuY3Rpb24gQ2hlY2thYmxlVGFnKF9hKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IF9hLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsXG4gICAgY2hlY2tlZCA9IF9hLmNoZWNrZWQsXG4gICAgb25DaGFuZ2UgPSBfYS5vbkNoYW5nZSxcbiAgICBvbkNsaWNrID0gX2Eub25DbGljayxcbiAgICByZXN0UHJvcHMgPSBfX3Jlc3QoX2EsIFtcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcImNoZWNrZWRcIiwgXCJvbkNoYW5nZVwiLCBcIm9uQ2xpY2tcIl0pO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscztcbiAgdmFyIGhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZSkge1xuICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZSghY2hlY2tlZCk7XG4gICAgb25DbGljayA9PT0gbnVsbCB8fCBvbkNsaWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNsaWNrKGUpO1xuICB9O1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCd0YWcnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgY2xzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2hlY2thYmxlXCIpLCB0cnVlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNoZWNrYWJsZS1jaGVja2VkXCIpLCBjaGVja2VkKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIF9leHRlbmRzKHt9LCByZXN0UHJvcHMsIHtcbiAgICBjbGFzc05hbWU6IGNscyxcbiAgICBvbkNsaWNrOiBoYW5kbGVDbGlja1xuICB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgQ2hlY2thYmxlVGFnOyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBDbG9zZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DbG9zZU91dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBvbWl0IGZyb20gXCJyYy11dGlsL2VzL29taXRcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgUHJlc2V0Q29sb3JUeXBlcywgUHJlc2V0U3RhdHVzQ29sb3JUeXBlcyB9IGZyb20gJy4uL191dGlsL2NvbG9ycyc7XG5pbXBvcnQgV2F2ZSBmcm9tICcuLi9fdXRpbC93YXZlJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IENoZWNrYWJsZVRhZyBmcm9tICcuL0NoZWNrYWJsZVRhZyc7XG52YXIgUHJlc2V0Q29sb3JSZWdleCA9IG5ldyBSZWdFeHAoXCJeKFwiLmNvbmNhdChQcmVzZXRDb2xvclR5cGVzLmpvaW4oJ3wnKSwgXCIpKC1pbnZlcnNlKT8kXCIpKTtcbnZhciBQcmVzZXRTdGF0dXNDb2xvclJlZ2V4ID0gbmV3IFJlZ0V4cChcIl4oXCIuY29uY2F0KFByZXNldFN0YXR1c0NvbG9yVHlwZXMuam9pbignfCcpLCBcIikkXCIpKTtcbnZhciBJbnRlcm5hbFRhZyA9IGZ1bmN0aW9uIEludGVybmFsVGFnKF9hLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gX2EucHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IF9hLnN0eWxlLFxuICAgIGNoaWxkcmVuID0gX2EuY2hpbGRyZW4sXG4gICAgaWNvbiA9IF9hLmljb24sXG4gICAgY29sb3IgPSBfYS5jb2xvcixcbiAgICBvbkNsb3NlID0gX2Eub25DbG9zZSxcbiAgICBjbG9zZUljb24gPSBfYS5jbG9zZUljb24sXG4gICAgX2EkY2xvc2FibGUgPSBfYS5jbG9zYWJsZSxcbiAgICBjbG9zYWJsZSA9IF9hJGNsb3NhYmxlID09PSB2b2lkIDAgPyBmYWxzZSA6IF9hJGNsb3NhYmxlLFxuICAgIHByb3BzID0gX19yZXN0KF9hLCBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcImNoaWxkcmVuXCIsIFwiaWNvblwiLCBcImNvbG9yXCIsIFwib25DbG9zZVwiLCBcImNsb3NlSWNvblwiLCBcImNsb3NhYmxlXCJdKTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUodHJ1ZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgdmlzaWJsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0VmlzaWJsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIC8vIFdhcm5pbmcgZm9yIGRlcHJlY2F0ZWQgdXNhZ2VcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCEoJ3Zpc2libGUnIGluIHByb3BzKSwgJ1RhZycsICdgdmlzaWJsZWAgd2lsbCBiZSByZW1vdmVkIGluIG5leHQgbWFqb3IgdmVyc2lvbiwgcGxlYXNlIHVzZSBgdmlzaWJsZSAmJiA8VGFnIC8+YCBpbnN0ZWFkLicpIDogdm9pZCAwO1xuICB9XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCd2aXNpYmxlJyBpbiBwcm9wcykge1xuICAgICAgc2V0VmlzaWJsZShwcm9wcy52aXNpYmxlKTtcbiAgICB9XG4gIH0sIFtwcm9wcy52aXNpYmxlXSk7XG4gIHZhciBpc1ByZXNldENvbG9yID0gZnVuY3Rpb24gaXNQcmVzZXRDb2xvcigpIHtcbiAgICBpZiAoIWNvbG9yKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBQcmVzZXRDb2xvclJlZ2V4LnRlc3QoY29sb3IpIHx8IFByZXNldFN0YXR1c0NvbG9yUmVnZXgudGVzdChjb2xvcik7XG4gIH07XG4gIHZhciB0YWdTdHlsZSA9IF9leHRlbmRzKHtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yICYmICFpc1ByZXNldENvbG9yKCkgPyBjb2xvciA6IHVuZGVmaW5lZFxuICB9LCBzdHlsZSk7XG4gIHZhciBwcmVzZXRDb2xvciA9IGlzUHJlc2V0Q29sb3IoKTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygndGFnJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIHRhZ0NsYXNzTmFtZSA9IGNsYXNzTmFtZXMocHJlZml4Q2xzLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoY29sb3IpLCBwcmVzZXRDb2xvciksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oYXMtY29sb3JcIiksIGNvbG9yICYmICFwcmVzZXRDb2xvciksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oaWRkZW5cIiksICF2aXNpYmxlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcbiAgdmFyIGhhbmRsZUNsb3NlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbG9zZUNsaWNrKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIG9uQ2xvc2UgPT09IG51bGwgfHwgb25DbG9zZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DbG9zZShlKTtcbiAgICBpZiAoZS5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghKCd2aXNpYmxlJyBpbiBwcm9wcykpIHtcbiAgICAgIHNldFZpc2libGUoZmFsc2UpO1xuICAgIH1cbiAgfTtcbiAgdmFyIHJlbmRlckNsb3NlSWNvbiA9IGZ1bmN0aW9uIHJlbmRlckNsb3NlSWNvbigpIHtcbiAgICBpZiAoY2xvc2FibGUpIHtcbiAgICAgIHJldHVybiBjbG9zZUljb24gPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2xvc2UtaWNvblwiKSxcbiAgICAgICAgb25DbGljazogaGFuZGxlQ2xvc2VDbGlja1xuICAgICAgfSwgY2xvc2VJY29uKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENsb3NlT3V0bGluZWQsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNsb3NlLWljb25cIiksXG4gICAgICAgIG9uQ2xpY2s6IGhhbmRsZUNsb3NlQ2xpY2tcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbiAgdmFyIGlzTmVlZFdhdmUgPSAnb25DbGljaycgaW4gcHJvcHMgfHwgY2hpbGRyZW4gJiYgY2hpbGRyZW4udHlwZSA9PT0gJ2EnO1xuICB2YXIgdGFnUHJvcHMgPSBvbWl0KHByb3BzLCBbJ3Zpc2libGUnXSk7XG4gIHZhciBpY29uTm9kZSA9IGljb24gfHwgbnVsbDtcbiAgdmFyIGtpZHMgPSBpY29uTm9kZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBpY29uTm9kZSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIGNoaWxkcmVuKSkgOiBjaGlsZHJlbjtcbiAgdmFyIHRhZ05vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgX2V4dGVuZHMoe30sIHRhZ1Byb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiB0YWdDbGFzc05hbWUsXG4gICAgc3R5bGU6IHRhZ1N0eWxlXG4gIH0pLCBraWRzLCByZW5kZXJDbG9zZUljb24oKSk7XG4gIHJldHVybiBpc05lZWRXYXZlID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoV2F2ZSwgbnVsbCwgdGFnTm9kZSkgOiB0YWdOb2RlO1xufTtcbnZhciBUYWcgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihJbnRlcm5hbFRhZyk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBUYWcuZGlzcGxheU5hbWUgPSAnVGFnJztcbn1cblRhZy5DaGVja2FibGVUYWcgPSBDaGVja2FibGVUYWc7XG5leHBvcnQgZGVmYXVsdCBUYWc7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgVGFnIGZyb20gJy4uL3RhZyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBQaWNrZXJUYWcocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRhZywgX2V4dGVuZHMoe1xuICAgIGNvbG9yOiBcImJsdWVcIlxuICB9LCBwcm9wcykpO1xufSIsIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIENhbGVuZGFyT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTg4MCAxODRINzEydi02NGMwLTQuNC0zLjYtOC04LThoLTU2Yy00LjQgMC04IDMuNi04IDh2NjRIMzg0di02NGMwLTQuNC0zLjYtOC04LThoLTU2Yy00LjQgMC04IDMuNi04IDh2NjRIMTQ0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnY2NjRjMCAxNy43IDE0LjMgMzIgMzIgMzJoNzM2YzE3LjcgMCAzMi0xNC4zIDMyLTMyVjIxNmMwLTE3LjctMTQuMy0zMi0zMi0zMnptLTQwIDY1NkgxODRWNDYwaDY1NnYzODB6TTE4NCAzOTJWMjU2aDEyOHY0OGMwIDQuNCAzLjYgOCA4IDhoNTZjNC40IDAgOC0zLjYgOC04di00OGgyNTZ2NDhjMCA0LjQgMy42IDggOCA4aDU2YzQuNCAwIDgtMy42IDgtOHYtNDhoMTI4djEzNkgxODR6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJjYWxlbmRhclwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgQ2FsZW5kYXJPdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IENhbGVuZGFyT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2FsZW5kYXJPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIENhbGVuZGFyT3V0bGluZWQgPSBmdW5jdGlvbiBDYWxlbmRhck91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBDYWxlbmRhck91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5DYWxlbmRhck91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0NhbGVuZGFyT3V0bGluZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoQ2FsZW5kYXJPdXRsaW5lZCk7IiwiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgQ2xvY2tDaXJjbGVPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTEyIDY0QzI2NC42IDY0IDY0IDI2NC42IDY0IDUxMnMyMDAuNiA0NDggNDQ4IDQ0OCA0NDgtMjAwLjYgNDQ4LTQ0OFM3NTkuNCA2NCA1MTIgNjR6bTAgODIwYy0yMDUuNCAwLTM3Mi0xNjYuNi0zNzItMzcyczE2Ni42LTM3MiAzNzItMzcyIDM3MiAxNjYuNiAzNzIgMzcyLTE2Ni42IDM3Mi0zNzIgMzcyelwiIH0gfSwgeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk02ODYuNyA2MzguNkw1NDQuMSA1MzUuNVYyODhjMC00LjQtMy42LTgtOC04SDQ4OGMtNC40IDAtOCAzLjYtOCA4djI3NS40YzAgMi42IDEuMiA1IDMuMyA2LjVsMTY1LjQgMTIwLjZjMy42IDIuNiA4LjYgMS44IDExLjItMS43bDI4LjYtMzljMi42LTMuNyAxLjgtOC43LTEuOC0xMS4yelwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiY2xvY2stY2lyY2xlXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBDbG9ja0NpcmNsZU91dGxpbmVkO1xuIiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ2xvY2tDaXJjbGVPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9DbG9ja0NpcmNsZU91dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSAnLi4vY29tcG9uZW50cy9BbnRkSWNvbic7XG52YXIgQ2xvY2tDaXJjbGVPdXRsaW5lZCA9IGZ1bmN0aW9uIENsb2NrQ2lyY2xlT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IENsb2NrQ2lyY2xlT3V0bGluZWRTdmdcbiAgfSkpO1xufTtcbkNsb2NrQ2lyY2xlT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnQ2xvY2tDaXJjbGVPdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihDbG9ja0NpcmNsZU91dGxpbmVkKTsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBTd2FwUmlnaHRPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjAgMCAxMDI0IDEwMjRcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNODczLjEgNTk2LjJsLTE2NC0yMDhBMzIgMzIgMCAwMDY4NCAzNzZoLTY0LjhjLTYuNyAwLTEwLjQgNy43LTYuMyAxM2wxNDQuMyAxODNIMTUyYy00LjQgMC04IDMuNi04IDh2NjBjMCA0LjQgMy42IDggOCA4aDY5NS45YzI2LjggMCA0MS43LTMwLjggMjUuMi01MS44elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwic3dhcC1yaWdodFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgU3dhcFJpZ2h0T3V0bGluZWQ7XG4iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTd2FwUmlnaHRPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Td2FwUmlnaHRPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIFN3YXBSaWdodE91dGxpbmVkID0gZnVuY3Rpb24gU3dhcFJpZ2h0T3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IFN3YXBSaWdodE91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5Td2FwUmlnaHRPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdTd2FwUmlnaHRPdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihTd2FwUmlnaHRPdXRsaW5lZCk7IiwiZXhwb3J0IGZ1bmN0aW9uIGdldFBsYWNlaG9sZGVyKHBpY2tlciwgbG9jYWxlLCBjdXN0b21pemVQbGFjZWhvbGRlcikge1xuICBpZiAoY3VzdG9taXplUGxhY2Vob2xkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjdXN0b21pemVQbGFjZWhvbGRlcjtcbiAgfVxuICBpZiAocGlja2VyID09PSAneWVhcicgJiYgbG9jYWxlLmxhbmcueWVhclBsYWNlaG9sZGVyKSB7XG4gICAgcmV0dXJuIGxvY2FsZS5sYW5nLnllYXJQbGFjZWhvbGRlcjtcbiAgfVxuICBpZiAocGlja2VyID09PSAncXVhcnRlcicgJiYgbG9jYWxlLmxhbmcucXVhcnRlclBsYWNlaG9sZGVyKSB7XG4gICAgcmV0dXJuIGxvY2FsZS5sYW5nLnF1YXJ0ZXJQbGFjZWhvbGRlcjtcbiAgfVxuICBpZiAocGlja2VyID09PSAnbW9udGgnICYmIGxvY2FsZS5sYW5nLm1vbnRoUGxhY2Vob2xkZXIpIHtcbiAgICByZXR1cm4gbG9jYWxlLmxhbmcubW9udGhQbGFjZWhvbGRlcjtcbiAgfVxuICBpZiAocGlja2VyID09PSAnd2VlaycgJiYgbG9jYWxlLmxhbmcud2Vla1BsYWNlaG9sZGVyKSB7XG4gICAgcmV0dXJuIGxvY2FsZS5sYW5nLndlZWtQbGFjZWhvbGRlcjtcbiAgfVxuICBpZiAocGlja2VyID09PSAndGltZScgJiYgbG9jYWxlLnRpbWVQaWNrZXJMb2NhbGUucGxhY2Vob2xkZXIpIHtcbiAgICByZXR1cm4gbG9jYWxlLnRpbWVQaWNrZXJMb2NhbGUucGxhY2Vob2xkZXI7XG4gIH1cbiAgcmV0dXJuIGxvY2FsZS5sYW5nLnBsYWNlaG9sZGVyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFJhbmdlUGxhY2Vob2xkZXIocGlja2VyLCBsb2NhbGUsIGN1c3RvbWl6ZVBsYWNlaG9sZGVyKSB7XG4gIGlmIChjdXN0b21pemVQbGFjZWhvbGRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGN1c3RvbWl6ZVBsYWNlaG9sZGVyO1xuICB9XG4gIGlmIChwaWNrZXIgPT09ICd5ZWFyJyAmJiBsb2NhbGUubGFuZy55ZWFyUGxhY2Vob2xkZXIpIHtcbiAgICByZXR1cm4gbG9jYWxlLmxhbmcucmFuZ2VZZWFyUGxhY2Vob2xkZXI7XG4gIH1cbiAgaWYgKHBpY2tlciA9PT0gJ3F1YXJ0ZXInICYmIGxvY2FsZS5sYW5nLnF1YXJ0ZXJQbGFjZWhvbGRlcikge1xuICAgIHJldHVybiBsb2NhbGUubGFuZy5yYW5nZVF1YXJ0ZXJQbGFjZWhvbGRlcjtcbiAgfVxuICBpZiAocGlja2VyID09PSAnbW9udGgnICYmIGxvY2FsZS5sYW5nLm1vbnRoUGxhY2Vob2xkZXIpIHtcbiAgICByZXR1cm4gbG9jYWxlLmxhbmcucmFuZ2VNb250aFBsYWNlaG9sZGVyO1xuICB9XG4gIGlmIChwaWNrZXIgPT09ICd3ZWVrJyAmJiBsb2NhbGUubGFuZy53ZWVrUGxhY2Vob2xkZXIpIHtcbiAgICByZXR1cm4gbG9jYWxlLmxhbmcucmFuZ2VXZWVrUGxhY2Vob2xkZXI7XG4gIH1cbiAgaWYgKHBpY2tlciA9PT0gJ3RpbWUnICYmIGxvY2FsZS50aW1lUGlja2VyTG9jYWxlLnBsYWNlaG9sZGVyKSB7XG4gICAgcmV0dXJuIGxvY2FsZS50aW1lUGlja2VyTG9jYWxlLnJhbmdlUGxhY2Vob2xkZXI7XG4gIH1cbiAgcmV0dXJuIGxvY2FsZS5sYW5nLnJhbmdlUGxhY2Vob2xkZXI7XG59XG5leHBvcnQgZnVuY3Rpb24gdHJhbnNQbGFjZW1lbnQyRHJvcGRvd25BbGlnbihkaXJlY3Rpb24sIHBsYWNlbWVudCkge1xuICB2YXIgb3ZlcmZsb3cgPSB7XG4gICAgYWRqdXN0WDogMSxcbiAgICBhZGp1c3RZOiAxXG4gIH07XG4gIHN3aXRjaCAocGxhY2VtZW50KSB7XG4gICAgY2FzZSAnYm90dG9tTGVmdCc6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcG9pbnRzOiBbJ3RsJywgJ2JsJ10sXG4gICAgICAgICAgb2Zmc2V0OiBbMCwgNF0sXG4gICAgICAgICAgb3ZlcmZsb3c6IG92ZXJmbG93XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgY2FzZSAnYm90dG9tUmlnaHQnOlxuICAgICAge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBvaW50czogWyd0cicsICdiciddLFxuICAgICAgICAgIG9mZnNldDogWzAsIDRdLFxuICAgICAgICAgIG92ZXJmbG93OiBvdmVyZmxvd1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIGNhc2UgJ3RvcExlZnQnOlxuICAgICAge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBvaW50czogWydibCcsICd0bCddLFxuICAgICAgICAgIG9mZnNldDogWzAsIC00XSxcbiAgICAgICAgICBvdmVyZmxvdzogb3ZlcmZsb3dcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICBjYXNlICd0b3BSaWdodCc6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcG9pbnRzOiBbJ2JyJywgJ3RyJ10sXG4gICAgICAgICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgICAgICAgIG92ZXJmbG93OiBvdmVyZmxvd1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcG9pbnRzOiBkaXJlY3Rpb24gPT09ICdydGwnID8gWyd0cicsICdiciddIDogWyd0bCcsICdibCddLFxuICAgICAgICAgIG9mZnNldDogWzAsIDRdLFxuICAgICAgICAgIG92ZXJmbG93OiBvdmVyZmxvd1xuICAgICAgICB9O1xuICAgICAgfVxuICB9XG59IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBDYWxlbmRhck91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DYWxlbmRhck91dGxpbmVkXCI7XG5pbXBvcnQgQ2xvY2tDaXJjbGVPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQ2xvY2tDaXJjbGVPdXRsaW5lZFwiO1xuaW1wb3J0IENsb3NlQ2lyY2xlRmlsbGVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DbG9zZUNpcmNsZUZpbGxlZFwiO1xuaW1wb3J0IFN3YXBSaWdodE91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Td2FwUmlnaHRPdXRsaW5lZFwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBSYW5nZVBpY2tlciBhcyBSQ1JhbmdlUGlja2VyIH0gZnJvbSAncmMtcGlja2VyJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGZvcndhcmRSZWYsIHVzZUNvbnRleHQsIHVzZUltcGVyYXRpdmVIYW5kbGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb21wb25lbnRzLCBnZXRUaW1lUHJvcHMgfSBmcm9tICcuJztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi8uLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IERpc2FibGVkQ29udGV4dCBmcm9tICcuLi8uLi9jb25maWctcHJvdmlkZXIvRGlzYWJsZWRDb250ZXh0JztcbmltcG9ydCBTaXplQ29udGV4dCBmcm9tICcuLi8uLi9jb25maWctcHJvdmlkZXIvU2l6ZUNvbnRleHQnO1xuaW1wb3J0IHsgRm9ybUl0ZW1JbnB1dENvbnRleHQgfSBmcm9tICcuLi8uLi9mb3JtL2NvbnRleHQnO1xuaW1wb3J0IHsgdXNlQ29tcGFjdEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vc3BhY2UvQ29tcGFjdCc7XG5pbXBvcnQgTG9jYWxlUmVjZWl2ZXIgZnJvbSAnLi4vLi4vbG9jYWxlLXByb3ZpZGVyL0xvY2FsZVJlY2VpdmVyJztcbmltcG9ydCB7IGdldE1lcmdlZFN0YXR1cywgZ2V0U3RhdHVzQ2xhc3NOYW1lcyB9IGZyb20gJy4uLy4uL191dGlsL3N0YXR1c1V0aWxzJztcbmltcG9ydCBlblVTIGZyb20gJy4uL2xvY2FsZS9lbl9VUyc7XG5pbXBvcnQgeyBnZXRSYW5nZVBsYWNlaG9sZGVyLCB0cmFuc1BsYWNlbWVudDJEcm9wZG93bkFsaWduIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi8uLi9fdXRpbC93YXJuaW5nJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdlbmVyYXRlUmFuZ2VQaWNrZXIoZ2VuZXJhdGVDb25maWcpIHtcbiAgdmFyIFJhbmdlUGlja2VyID0gLyojX19QVVJFX18qL2ZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgY3VzdG9tR2V0UG9wdXBDb250YWluZXIgPSBwcm9wcy5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIHBsYWNlbWVudCA9IHByb3BzLnBsYWNlbWVudCxcbiAgICAgIGN1c3RvbWl6ZVNpemUgPSBwcm9wcy5zaXplLFxuICAgICAgY3VzdG9tRGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICAgIF9wcm9wcyRib3JkZXJlZCA9IHByb3BzLmJvcmRlcmVkLFxuICAgICAgYm9yZGVyZWQgPSBfcHJvcHMkYm9yZGVyZWQgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkYm9yZGVyZWQsXG4gICAgICBwbGFjZWhvbGRlciA9IHByb3BzLnBsYWNlaG9sZGVyLFxuICAgICAgcG9wdXBDbGFzc05hbWUgPSBwcm9wcy5wb3B1cENsYXNzTmFtZSxcbiAgICAgIGRyb3Bkb3duQ2xhc3NOYW1lID0gcHJvcHMuZHJvcGRvd25DbGFzc05hbWUsXG4gICAgICBjdXN0b21TdGF0dXMgPSBwcm9wcy5zdGF0dXMsXG4gICAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcImdldFBvcHVwQ29udGFpbmVyXCIsIFwiY2xhc3NOYW1lXCIsIFwicGxhY2VtZW50XCIsIFwic2l6ZVwiLCBcImRpc2FibGVkXCIsIFwiYm9yZGVyZWRcIiwgXCJwbGFjZWhvbGRlclwiLCBcInBvcHVwQ2xhc3NOYW1lXCIsIFwiZHJvcGRvd25DbGFzc05hbWVcIiwgXCJzdGF0dXNcIl0pO1xuICAgIHZhciBpbm5lclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICB2YXIgX3VzZUNvbnRleHQgPSB1c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgICAgZ2V0UHJlZml4Q2xzID0gX3VzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgICAgZGlyZWN0aW9uID0gX3VzZUNvbnRleHQuZGlyZWN0aW9uLFxuICAgICAgZ2V0UG9wdXBDb250YWluZXIgPSBfdXNlQ29udGV4dC5nZXRQb3B1cENvbnRhaW5lcjtcbiAgICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdwaWNrZXInLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgIHZhciBfdXNlQ29tcGFjdEl0ZW1Db250ZXggPSB1c2VDb21wYWN0SXRlbUNvbnRleHQocHJlZml4Q2xzLCBkaXJlY3Rpb24pLFxuICAgICAgY29tcGFjdFNpemUgPSBfdXNlQ29tcGFjdEl0ZW1Db250ZXguY29tcGFjdFNpemUsXG4gICAgICBjb21wYWN0SXRlbUNsYXNzbmFtZXMgPSBfdXNlQ29tcGFjdEl0ZW1Db250ZXguY29tcGFjdEl0ZW1DbGFzc25hbWVzO1xuICAgIHZhciBmb3JtYXQgPSBwcm9wcy5mb3JtYXQsXG4gICAgICBzaG93VGltZSA9IHByb3BzLnNob3dUaW1lLFxuICAgICAgcGlja2VyID0gcHJvcHMucGlja2VyO1xuICAgIHZhciByb290UHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCk7XG4gICAgdmFyIGFkZGl0aW9uYWxPdmVycmlkZVByb3BzID0ge307XG4gICAgYWRkaXRpb25hbE92ZXJyaWRlUHJvcHMgPSBfZXh0ZW5kcyhfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgYWRkaXRpb25hbE92ZXJyaWRlUHJvcHMpLCBzaG93VGltZSA/IGdldFRpbWVQcm9wcyhfZXh0ZW5kcyh7XG4gICAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICAgIHBpY2tlcjogcGlja2VyXG4gICAgfSwgc2hvd1RpbWUpKSA6IHt9KSwgcGlja2VyID09PSAndGltZScgPyBnZXRUaW1lUHJvcHMoX2V4dGVuZHMoX2V4dGVuZHMoe1xuICAgICAgZm9ybWF0OiBmb3JtYXRcbiAgICB9LCBwcm9wcyksIHtcbiAgICAgIHBpY2tlcjogcGlja2VyXG4gICAgfSkpIDoge30pO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoIWRyb3Bkb3duQ2xhc3NOYW1lLCAnUmFuZ2VQaWNrZXInLCAnYGRyb3Bkb3duQ2xhc3NOYW1lYCBpcyBkZXByZWNhdGVkIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZCBpbiBuZXh0IG1ham9yIHZlcnNpb24uIFBsZWFzZSB1c2UgYHBvcHVwQ2xhc3NOYW1lYCBpbnN0ZWFkLicpIDogdm9pZCAwO1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PSBTaXplID09PT09PT09PT09PT09PT09PT09PVxuICAgIHZhciBzaXplID0gUmVhY3QudXNlQ29udGV4dChTaXplQ29udGV4dCk7XG4gICAgdmFyIG1lcmdlZFNpemUgPSBjb21wYWN0U2l6ZSB8fCBjdXN0b21pemVTaXplIHx8IHNpemU7XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09IERpc2FibGVkID09PT09PT09PT09PT09PT09PT09PVxuICAgIHZhciBkaXNhYmxlZCA9IFJlYWN0LnVzZUNvbnRleHQoRGlzYWJsZWRDb250ZXh0KTtcbiAgICB2YXIgbWVyZ2VkRGlzYWJsZWQgPSBjdXN0b21EaXNhYmxlZCAhPT0gbnVsbCAmJiBjdXN0b21EaXNhYmxlZCAhPT0gdm9pZCAwID8gY3VzdG9tRGlzYWJsZWQgOiBkaXNhYmxlZDtcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gRm9ybUl0ZW1JbnB1dCA9PT09PT09PT09PT09PT09PT09PT1cbiAgICB2YXIgZm9ybUl0ZW1Db250ZXh0ID0gdXNlQ29udGV4dChGb3JtSXRlbUlucHV0Q29udGV4dCk7XG4gICAgdmFyIGhhc0ZlZWRiYWNrID0gZm9ybUl0ZW1Db250ZXh0Lmhhc0ZlZWRiYWNrLFxuICAgICAgY29udGV4dFN0YXR1cyA9IGZvcm1JdGVtQ29udGV4dC5zdGF0dXMsXG4gICAgICBmZWVkYmFja0ljb24gPSBmb3JtSXRlbUNvbnRleHQuZmVlZGJhY2tJY29uO1xuICAgIHZhciBzdWZmaXhOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHBpY2tlciA9PT0gJ3RpbWUnID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2xvY2tDaXJjbGVPdXRsaW5lZCwgbnVsbCkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDYWxlbmRhck91dGxpbmVkLCBudWxsKSwgaGFzRmVlZGJhY2sgJiYgZmVlZGJhY2tJY29uKTtcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICByZXR1cm4gKF9hID0gaW5uZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZvY3VzKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG4gICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgIHJldHVybiAoX2EgPSBpbm5lclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYmx1cigpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMb2NhbGVSZWNlaXZlciwge1xuICAgICAgY29tcG9uZW50TmFtZTogXCJEYXRlUGlja2VyXCIsXG4gICAgICBkZWZhdWx0TG9jYWxlOiBlblVTXG4gICAgfSwgZnVuY3Rpb24gKGNvbnRleHRMb2NhbGUpIHtcbiAgICAgIHZhciBfY2xhc3NOYW1lcztcbiAgICAgIHZhciBsb2NhbGUgPSBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgY29udGV4dExvY2FsZSksIHByb3BzLmxvY2FsZSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUkNSYW5nZVBpY2tlciwgX2V4dGVuZHMoe1xuICAgICAgICBzZXBhcmF0b3I6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgXCJhcmlhLWxhYmVsXCI6IFwidG9cIixcbiAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2VwYXJhdG9yXCIpXG4gICAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFN3YXBSaWdodE91dGxpbmVkLCBudWxsKSksXG4gICAgICAgIGRpc2FibGVkOiBtZXJnZWREaXNhYmxlZCxcbiAgICAgICAgcmVmOiBpbm5lclJlZixcbiAgICAgICAgZHJvcGRvd25BbGlnbjogdHJhbnNQbGFjZW1lbnQyRHJvcGRvd25BbGlnbihkaXJlY3Rpb24sIHBsYWNlbWVudCksXG4gICAgICAgIHBsYWNlaG9sZGVyOiBnZXRSYW5nZVBsYWNlaG9sZGVyKHBpY2tlciwgbG9jYWxlLCBwbGFjZWhvbGRlciksXG4gICAgICAgIHN1ZmZpeEljb246IHN1ZmZpeE5vZGUsXG4gICAgICAgIGNsZWFySWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2xvc2VDaXJjbGVGaWxsZWQsIG51bGwpLFxuICAgICAgICBwcmV2SWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcHJldi1pY29uXCIpXG4gICAgICAgIH0pLFxuICAgICAgICBuZXh0SWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbmV4dC1pY29uXCIpXG4gICAgICAgIH0pLFxuICAgICAgICBzdXBlclByZXZJY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdXBlci1wcmV2LWljb25cIilcbiAgICAgICAgfSksXG4gICAgICAgIHN1cGVyTmV4dEljb246IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN1cGVyLW5leHQtaWNvblwiKVxuICAgICAgICB9KSxcbiAgICAgICAgYWxsb3dDbGVhcjogdHJ1ZSxcbiAgICAgICAgdHJhbnNpdGlvbk5hbWU6IFwiXCIuY29uY2F0KHJvb3RQcmVmaXhDbHMsIFwiLXNsaWRlLXVwXCIpXG4gICAgICB9LCByZXN0UHJvcHMsIGFkZGl0aW9uYWxPdmVycmlkZVByb3BzLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcygoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQobWVyZ2VkU2l6ZSksIG1lcmdlZFNpemUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYm9yZGVybGVzc1wiKSwgIWJvcmRlcmVkKSwgX2NsYXNzTmFtZXMpLCBnZXRTdGF0dXNDbGFzc05hbWVzKHByZWZpeENscywgZ2V0TWVyZ2VkU3RhdHVzKGNvbnRleHRTdGF0dXMsIGN1c3RvbVN0YXR1cyksIGhhc0ZlZWRiYWNrKSwgY29tcGFjdEl0ZW1DbGFzc25hbWVzLCBjbGFzc05hbWUpLFxuICAgICAgICBsb2NhbGU6IGxvY2FsZS5sYW5nLFxuICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgZ2V0UG9wdXBDb250YWluZXI6IGN1c3RvbUdldFBvcHVwQ29udGFpbmVyIHx8IGdldFBvcHVwQ29udGFpbmVyLFxuICAgICAgICBnZW5lcmF0ZUNvbmZpZzogZ2VuZXJhdGVDb25maWcsXG4gICAgICAgIGNvbXBvbmVudHM6IENvbXBvbmVudHMsXG4gICAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgICAgICBkcm9wZG93bkNsYXNzTmFtZTogcG9wdXBDbGFzc05hbWUgfHwgZHJvcGRvd25DbGFzc05hbWVcbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBSYW5nZVBpY2tlcjtcbn0iLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IENhbGVuZGFyT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0NhbGVuZGFyT3V0bGluZWRcIjtcbmltcG9ydCBDbG9ja0NpcmNsZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DbG9ja0NpcmNsZU91dGxpbmVkXCI7XG5pbXBvcnQgQ2xvc2VDaXJjbGVG