属性:

属性描述类型默认值
show是否显示验证码弹框Booleanfalse
canvasWidth主图区域的宽度Number310
canvasHeight主图区域的高度Number160
imgs自定义图片Arraynull
successText验证成功时的提示文字String验证通过!
failText验证失败时的提示文字String验证失败,请重试
sliderText下方滑动条里的文字String拖动滑块完成拼图

事件:

事件名描述返回值
success验证通过时会触发偏差值px,移动的距离px(需修改源码)
fail主图区域的宽度偏差值px
close用户点击遮罩层的回调null

reset(需修改源码)

用户点击刷新按钮和失败后重新刷新的回调偏差值px
1、安装vue-puzzle-vcode
npm i -S vue-puzzle-vcode
2、实现代码 
<template>
  <div>
    <Vcode :show="isShow" @success="success" @close="close" />
    <el-button @click="submit">登录</el-button>
  </div>
</template>
 
<script>
import Vcode from "vue-puzzle-vcode";
export default {
  data() {
    return {
      isShow: true // 验证码模态框是否出现
    };
  },
  components: {
    Vcode
  },
  methods: {
    submit() {
      this.isShow = true;
    },
    // 用户通过了验证
    success(msg) {
      this.isShow = false; // 通过验证后,需要手动隐藏模态框
    },
    // 用户点击遮罩层,应该关闭模态框
    close() {
      this.isShow = false;
    }
  }
};
</script>

效果:

前端和后端一起结合调取接口的时候,框架原本的success和fail和close已经不满足我们使用,所以我们要修改框架的源码我们加一个reset事件和成功之后多返回一个移动的距离px~

修改后的源码main.js:

!function(t, e) {
    true ? module.exports = e() : undefined
}(this, (function() {
    return function() {
        "use strict";
        var t = {
            358: function(t, e, n) {
                var i = n(81)
                  , s = n.n(i)
                  , a = n(645)
                  , o = n.n(a)()(s());
                o.push([t.id, ".vue-puzzle-vcode {\n  position: fixed;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  background-color: rgba(0, 0, 0, 0.3);\n  z-index: 999;\n  opacity: 0;\n  pointer-events: none;\n  -webkit-transition: opacity 200ms;\n  transition: opacity 200ms;\n}\n.vue-puzzle-vcode.show_ {\n  opacity: 1;\n  pointer-events: auto;\n}\n.vue-auth-box_ {\n  position: absolute;\n  top: 40%;\n  left: 50%;\n  -webkit-transform: translate(-50%, -50%);\n          transform: translate(-50%, -50%);\n  padding: 20px;\n  background: #fff;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  border-radius: 3px;\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);\n}\n.vue-auth-box_ .auth-body_ {\n  position: relative;\n  overflow: hidden;\n  border-radius: 3px;\n}\n.vue-auth-box_ .auth-body_ .loading-box_ {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  background-color: rgba(0, 0, 0, 0.8);\n  z-index: 20;\n  opacity: 1;\n  -webkit-transition: opacity 200ms;\n  transition: opacity 200ms;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n          align-items: center;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n          justify-content: center;\n}\n.vue-auth-box_ .auth-body_ .loading-box_.hide_ {\n  opacity: 0;\n  pointer-events: none;\n}\n.vue-auth-box_ .auth-body_ .loading-box_.hide_ .loading-gif_ span {\n  -webkit-animation-play-state: paused;\n          animation-play-state: paused;\n}\n.vue-auth-box_ .auth-body_ .loading-box_ .loading-gif_ {\n  -webkit-box-flex: 0;\n  -webkit-flex: none;\n          flex: none;\n  height: 5px;\n  line-height: 0;\n}\n@-webkit-keyframes load {\n0% {\n    opacity: 1;\n    -webkit-transform: scale(1.3);\n            transform: scale(1.3);\n}\n100% {\n    opacity: 0.2;\n    -webkit-transform: scale(0.3);\n            transform: scale(0.3);\n}\n}\n@keyframes load {\n0% {\n    opacity: 1;\n    -webkit-transform: scale(1.3);\n            transform: scale(1.3);\n}\n100% {\n    opacity: 0.2;\n    -webkit-transform: scale(0.3);\n            transform: scale(0.3);\n}\n}\n.vue-auth-box_ .auth-body_ .loading-box_ .loading-gif_ span {\n  display: inline-block;\n  width: 5px;\n  height: 100%;\n  margin-left: 2px;\n  border-radius: 50%;\n  background-color: #888;\n  -webkit-animation: load 1.04s ease infinite;\n          animation: load 1.04s ease infinite;\n}\n.vue-auth-box_ .auth-body_ .loading-box_ .loading-gif_ span:nth-child(1) {\n  margin-left: 0;\n}\n.vue-auth-box_ .auth-body_ .loading-box_ .loading-gif_ span:nth-child(2) {\n  -webkit-animation-delay: 0.13s;\n          animation-delay: 0.13s;\n}\n.vue-auth-box_ .auth-body_ .loading-box_ .loading-gif_ span:nth-child(3) {\n  -webkit-animation-delay: 0.26s;\n          animation-delay: 0.26s;\n}\n.vue-auth-box_ .auth-body_ .loading-box_ .loading-gif_ span:nth-child(4) {\n  -webkit-animation-delay: 0.39s;\n          animation-delay: 0.39s;\n}\n.vue-auth-box_ .auth-body_ .loading-box_ .loading-gif_ span:nth-child(5) {\n  -webkit-animation-delay: 0.52s;\n          animation-delay: 0.52s;\n}\n.vue-auth-box_ .auth-body_ .info-box_ {\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 24px;\n  line-height: 24px;\n  text-align: center;\n  overflow: hidden;\n  font-size: 13px;\n  background-color: #83ce3f;\n  opacity: 0;\n  -webkit-transform: translateY(24px);\n          transform: translateY(24px);\n  -webkit-transition: all 200ms;\n  transition: all 200ms;\n  color: #fff;\n  z-index: 10;\n}\n.vue-auth-box_ .auth-body_ .info-box_.show {\n  opacity: 0.95;\n  -webkit-transform: translateY(0);\n          transform: translateY(0);\n}\n.vue-auth-box_ .auth-body_ .info-box_.fail {\n  background-color: #ce594b;\n}\n.vue-auth-box_ .auth-body_ .auth-canvas2_ {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 60px;\n  height: 100%;\n  z-index: 2;\n}\n.vue-auth-box_ .auth-body_ .auth-canvas3_ {\n  position: absolute;\n  top: 0;\n  left: 0;\n  opacity: 0;\n  -webkit-transition: opacity 600ms;\n  transition: opacity 600ms;\n  z-index: 3;\n}\n.vue-auth-box_ .auth-body_ .auth-canvas3_.show {\n  opacity: 1;\n}\n.vue-auth-box_ .auth-body_ .flash_ {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 30px;\n  height: 100%;\n  background-color: rgba(255, 255, 255, 0.1);\n  z-index: 3;\n}\n.vue-auth-box_ .auth-body_ .flash_.show {\n  -webkit-transition: -webkit-transform 600ms;\n  transition: -webkit-transform 600ms;\n  transition: transform 600ms;\n  transition: transform 600ms, -webkit-transform 600ms;\n}\n.vue-auth-box_ .auth-body_ .reset_ {\n  position: absolute;\n  top: 2px;\n  right: 2px;\n  width: 35px;\n  height: auto;\n  z-index: 12;\n  cursor: pointer;\n  -webkit-transition: -webkit-transform 200ms;\n  transition: -webkit-transform 200ms;\n  transition: transform 200ms;\n  transition: transform 200ms, -webkit-transform 200ms;\n  -webkit-transform: rotate(0deg);\n          transform: rotate(0deg);\n}\n.vue-auth-box_ .auth-body_ .reset_:hover {\n  -webkit-transform: rotate(-90deg);\n          transform: rotate(-90deg);\n}\n.vue-auth-box_ .auth-control_ .range-box {\n  position: relative;\n  width: 100%;\n  background-color: #eef1f8;\n  margin-top: 20px;\n  border-radius: 3px;\n  box-shadow: 0 0 8px rgba(240, 240, 240, 0.6) inset;\n}\n.vue-auth-box_ .auth-control_ .range-box .range-text {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  -webkit-transform: translate(-50%, -50%);\n          transform: translate(-50%, -50%);\n  font-size: 14px;\n  color: #b7bcd1;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  text-align: center;\n  width: 100%;\n}\n.vue-auth-box_ .auth-control_ .range-box .range-slider {\n  position: absolute;\n  height: 100%;\n  width: 50px;\n  background-color: rgba(106, 160, 255, 0.8);\n  border-radius: 3px;\n}\n.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn {\n  position: absolute;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n          align-items: center;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n          justify-content: center;\n  right: 0;\n  width: 50px;\n  height: 100%;\n  background-color: #fff;\n  border-radius: 3px;\n  box-shadow: 0 0 4px #ccc;\n  cursor: pointer;\n}\n.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn > div {\n  width: 0;\n  height: 40%;\n  -webkit-transition: all 200ms;\n  transition: all 200ms;\n  border: solid 1px #6aa0ff;\n}\n.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn > div:nth-child(2) {\n  margin: 0 4px;\n}\n.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn:hover > div:first-child,\n.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn.isDown > div:first-child {\n  border: solid 4px transparent;\n  height: 0;\n  border-right-color: #6aa0ff;\n}\n.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn:hover > div:nth-child(2),\n.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn.isDown > div:nth-child(2) {\n  border-width: 3px;\n  height: 0;\n  border-radius: 3px;\n  margin: 0 6px;\n  border-right-color: #6aa0ff;\n}\n.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn:hover > div:nth-child(3),\n.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn.isDown > div:nth-child(3) {\n  border: solid 4px transparent;\n  height: 0;\n  border-left-color: #6aa0ff;\n}\n.vue-puzzle-overflow {\n  overflow: hidden !important;\n}\n", ""]),
                e.Z = o
            },
            645: function(t) {
                t.exports = function(t) {
                    var e = [];
                    return e.toString = function() {
                        return this.map((function(e) {
                            var n = ""
                              , i = void 0 !== e[5];
                            return e[4] && (n += "@supports (".concat(e[4], ") {")),
                            e[2] && (n += "@media ".concat(e[2], " {")),
                            i && (n += "@layer".concat(e[5].length > 0 ? " ".concat(e[5]) : "", " {")),
                            n += t(e),
                            i && (n += "}"),
                            e[2] && (n += "}"),
                            e[4] && (n += "}"),
                            n
                        }
                        )).join("")
                    }
                    ,
                    e.i = function(t, n, i, s, a) {
                        "string" == typeof t && (t = [[null, t, void 0]]);
                        var o = {};
                        if (i)
                            for (var r = 0; r < this.length; r++) {
                                var h = this[r][0];
                                null != h && (o[h] = !0)
                            }
                        for (var l = 0; l < t.length; l++) {
                            var c = [].concat(t[l]);
                            i && o[c[0]] || (void 0 !== a && (void 0 === c[5] || (c[1] = "@layer".concat(c[5].length > 0 ? " ".concat(c[5]) : "", " {").concat(c[1], "}")),
                            c[5] = a),
                            n && (c[2] ? (c[1] = "@media ".concat(c[2], " {").concat(c[1], "}"),
                            c[2] = n) : c[2] = n),
                            s && (c[4] ? (c[1] = "@supports (".concat(c[4], ") {").concat(c[1], "}"),
                            c[4] = s) : c[4] = "".concat(s)),
                            e.push(c))
                        }
                    }
                    ,
                    e
                }
            },
            81: function(t) {
                t.exports = function(t) {
                    return t[1]
                }
            },
            379: function(t) {
                var e = [];
                function n(t) {
                    for (var n = -1, i = 0; i < e.length; i++)
                        if (e[i].identifier === t) {
                            n = i;
                            break
                        }
                    return n
                }
                function i(t, i) {
                    for (var a = {}, o = [], r = 0; r < t.length; r++) {
                        var h = t[r]
                          , l = i.base ? h[0] + i.base : h[0]
                          , c = a[l] || 0
                          , d = "".concat(l, " ").concat(c);
                        a[l] = c + 1;
                        var u = n(d)
                          , p = {
                            css: h[1],
                            media: h[2],
                            sourceMap: h[3],
                            supports: h[4],
                            layer: h[5]
                        };
                        if (-1 !== u)
                            e[u].references++,
                            e[u].updater(p);
                        else {
                            var f = s(p, i);
                            i.byIndex = r,
                            e.splice(r, 0, {
                                identifier: d,
                                updater: f,
                                references: 1
                            })
                        }
                        o.push(d)
                    }
                    return o
                }
                function s(t, e) {
                    var n = e.domAPI(e);
                    return n.update(t),
                    function(e) {
                        if (e) {
                            if (e.css === t.css && e.media === t.media && e.sourceMap === t.sourceMap && e.supports === t.supports && e.layer === t.layer)
                                return;
                            n.update(t = e)
                        } else
                            n.remove()
                    }
                }
                t.exports = function(t, s) {
                    var a = i(t = t || [], s = s || {});
                    return function(t) {
                        t = t || [];
                        for (var o = 0; o < a.length; o++) {
                            var r = n(a[o]);
                            e[r].references--
                        }
                        for (var h = i(t, s), l = 0; l < a.length; l++) {
                            var c = n(a[l]);
                            0 === e[c].references && (e[c].updater(),
                            e.splice(c, 1))
                        }
                        a = h
                    }
                }
            },
            569: function(t) {
                var e = {};
                t.exports = function(t, n) {
                    var i = function(t) {
                        if (void 0 === e[t]) {
                            var n = document.querySelector(t);
                            if (window.HTMLIFrameElement && n instanceof window.HTMLIFrameElement)
                                try {
                                    n = n.contentDocument.head
                                } catch (t) {
                                    n = null
                                }
                            e[t] = n
                        }
                        return e[t]
                    }(t);
                    if (!i)
                        throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");
                    i.appendChild(n)
                }
            },
            216: function(t) {
                t.exports = function(t) {
                    var e = document.createElement("style");
                    return t.setAttributes(e, t.attributes),
                    t.insert(e, t.options),
                    e
                }
            },
            565: function(t, e, n) {
                t.exports = function(t) {
                    var e = n.nc;
                    e && t.setAttribute("nonce", e)
                }
            },
            795: function(t) {
                t.exports = function(t) {
                    var e = t.insertStyleElement(t);
                    return {
                        update: function(n) {
                            !function(t, e, n) {
                                var i = "";
                                n.supports && (i += "@supports (".concat(n.supports, ") {")),
                                n.media && (i += "@media ".concat(n.media, " {"));
                                var s = void 0 !== n.layer;
                                s && (i += "@layer".concat(n.layer.length > 0 ? " ".concat(n.layer) : "", " {")),
                                i += n.css,
                                s && (i += "}"),
                                n.media && (i += "}"),
                                n.supports && (i += "}");
                                var a = n.sourceMap;
                                a && "undefined" != typeof btoa && (i += "\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(a)))), " */")),
                                e.styleTagTransform(i, t, e.options)
                            }(e, t, n)
                        },
                        remove: function() {
                            !function(t) {
                                if (null === t.parentNode)
                                    return !1;
                                t.parentNode.removeChild(t)
                            }(e)
                        }
                    }
                }
            },
            589: function(t) {
                t.exports = function(t, e) {
                    if (e.styleSheet)
                        e.styleSheet.cssText = t;
                    else {
                        for (; e.firstChild; )
                            e.removeChild(e.firstChild);
                        e.appendChild(document.createTextNode(t))
                    }
                }
            }
        }
          , e = {};
        function n(i) {
            var s = e[i];
            if (void 0 !== s)
                return s.exports;
            var a = e[i] = {
                id: i,
                exports: {}
            };
            return t[i](a, a.exports, n),
            a.exports
        }
        n.n = function(t) {
            var e = t && t.__esModule ? function() {
                return t.default
            }
            : function() {
                return t
            }
            ;
            return n.d(e, {
                a: e
            }),
            e
        }
        ,
        n.d = function(t, e) {
            for (var i in e)
                n.o(e, i) && !n.o(t, i) && Object.defineProperty(t, i, {
                    enumerable: !0,
                    get: e[i]
                })
        }
        ,
        n.o = function(t, e) {
            return Object.prototype.hasOwnProperty.call(t, e)
        }
        ,
        n.r = function(t) {
            "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(t, Symbol.toStringTag, {
                value: "Module"
            }),
            Object.defineProperty(t, "__esModule", {
                value: !0
            })
        }
        ;
        var i = {};
        return function() {
            n.r(i),
            n.d(i, {
                default: function() {
                    return x
                }
            });
            var t = function() {
                var t = this
                  , e = t.$createElement
                  , n = t._self._c || e;
                return n("div", {
                    class: ["vue-puzzle-vcode", {
                        show_: t.show
                    }],
                    on: {
                        mousedown: t.onCloseMouseDown,
                        mouseup: t.onCloseMouseUp,
                        touchstart: t.onCloseMouseDown,
                        touchend: t.onCloseMouseUp
                    }
                }, [n("div", {
                    staticClass: "vue-auth-box_",
                    on: {
                        mousedown: function(t) {
                            t.stopPropagation()
                        },
                        touchstart: function(t) {
                            t.stopPropagation()
                        }
                    }
                }, [n("div", {
                    staticClass: "auth-body_",
                    style: "height: " + t.canvasHeight + "px"
                }, [n("canvas", {
                    ref: "canvas1",
                    style: "width:" + t.canvasWidth + "px;height:" + t.canvasHeight + "px",
                    attrs: {
                        width: t.canvasWidth,
                        height: t.canvasHeight
                    }
                }), t._v(" "), n("canvas", {
                    ref: "canvas3",
                    class: ["auth-canvas3_", {
                        show: t.isSuccess
                    }],
                    style: "width:" + t.canvasWidth + "px;height:" + t.canvasHeight + "px",
                    attrs: {
                        width: t.canvasWidth,
                        height: t.canvasHeight
                    }
                }), t._v(" "), n("canvas", {
                    ref: "canvas2",
                    staticClass: "auth-canvas2_",
                    style: "width:" + t.puzzleBaseSize + "px;height:" + t.canvasHeight + "px;transform:translateX(" + (t.styleWidth - t.sliderBaseSize - (t.puzzleBaseSize - t.sliderBaseSize) * ((t.styleWidth - t.sliderBaseSize) / (t.canvasWidth - t.sliderBaseSize))) + "px)",
                    attrs: {
                        width: t.puzzleBaseSize,
                        height: t.canvasHeight
                    }
                }), t._v(" "), n("div", {
                    class: ["loading-box_", {
                        hide_: !t.loading
                    }]
                }, [t._m(0)]), t._v(" "), n("div", {
                    class: ["info-box_", {
                        show: t.infoBoxShow
                    }, {
                        fail: t.infoBoxFail
                    }]
                }, [t._v("\n        " + t._s(t.infoText) + "\n      ")]), t._v(" "), n("div", {
                    class: ["flash_", {
                        show: t.isSuccess
                    }],
                    style: "transform: translateX(" + (t.isSuccess ? t.canvasWidth + .578 * t.canvasHeight + "px" : "-" + .578 * t.canvasHeight + "px") + ") skew(-30deg, 0);"
                }), t._v(" "), n("img", {
                    staticClass: "reset_",
                    attrs: {
                        src: t.resetSvg
                    },
                    on: {
                        click: t.reset
                    }
                })]), t._v(" "), n("div", {
                    staticClass: "auth-control_"
                }, [n("div", {
                    staticClass: "range-box",
                    style: "height:" + t.sliderBaseSize + "px"
                }, [n("div", {
                    staticClass: "range-text"
                }, [t._v(t._s(t.sliderText))]), t._v(" "), n("div", {
                    ref: "range-slider",
                    staticClass: "range-slider",
                    style: "width:" + t.styleWidth + "px"
                }, [n("div", {
                    class: ["range-btn", {
                        isDown: t.mouseDown
                    }],
                    style: "width:" + t.sliderBaseSize + "px",
                    on: {
                        mousedown: function(e) {
                            return t.onRangeMouseDown(e)
                        },
                        touchstart: function(e) {
                            return t.onRangeMouseDown(e)
                        }
                    }
                }, [n("div"), t._v(" "), n("div"), t._v(" "), n("div")])])])])])])
            };
            t._withStripped = !0;
            var e = {
                props: {
                    canvasWidth: {
                        type: Number,
                        default: 310
                    },
                    canvasHeight: {
                        type: Number,
                        default: 160
                    },
                    show: {
                        type: Boolean,
                        default: !1
                    },
                    puzzleScale: {
                        type: Number,
                        default: 1
                    },
                    sliderSize: {
                        type: Number,
                        default: 50
                    },
                    range: {
                        type: Number,
                        default: 10
                    },
                    imgs: {
                        type: Array
                    },
                    successText: {
                        type: String,
                        default: "验证通过!"
                    },
                    failText: {
                        type: String,
                        default: "验证失败,请重试"
                    },
                    sliderText: {
                        type: String,
                        default: "拖动滑块完成拼图"
                    }
                },
                data: ()=>({
                    mouseDown: !1,
                    startWidth: 50,
                    startX: 0,
                    newX: 0,
                    pinX: 0,
                    pinY: 0,
                    loading: !1,
                    isCanSlide: !1,
                    error: !1,
                    infoBoxShow: !1,
                    infoText: "",
                    infoBoxFail: !1,
                    timer1: null,
                    closeDown: !1,
                    isSuccess: !1,
                    imgIndex: -1,
                    isSubmting: !1,
                    resetSvg: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAELklEQVRYR+2YW2wUZRTH//9vtlCoF9IoIklT3PqgPGi326hoetuaGEhIr9SgCYkkgt2WGOQVCca+GavWdr0GjD4YhG3RB3hply1LQA1tEQIxEXapGI2pEkys9LIzx2ylYWfY6e5sF0oi+7hzzvl+3/9855xvhrjNf7zN+XAHcL4Z+n8o6JWTeYt++W25S596AIZy6TB+n3yo+Nchlk8vmIIVowdXU9c3Q1gDSilBlQwjgBAYFGDvdF58/4milqvZwDpOcXWsb5Uh8hmBqkwXFMhlCN8aX5LXNbRy/T+Z+iXsHAFWRXs3QGQPyLucLDJrK5DgUXdTsxPfjAEro8E3Ce50EtxsKxPTwCPH3U2jTmJkBJgWTnAMxDeGMEoa0xQ+LJQnCD4HYFkCyAC3RdwN3U7gMkpxRTTYrMD91sCJIgCxV5R6O1Jcfy7VwonqLoj9/CqB2kF341qncGkBvRe+ureAWpRgoalCBecMFzcdK24YymZRJz5zprgq1tsJwXYL3CVZGvdGHmwZc7JQtra2gE+f712ep2QUYP714DJhaJrXLqXZQszlZwtYdSHoB9ljVk/ePVrSZFL0ZkAlxzQBVseCT8WhZhRThtFB8plk9Zi/qCi8cv0fNxvKFrDy4oF11NXXIFy2EII4iBcG3Y03VLZT8OqRd5aFPduvOEpxRayvXolxAKB2g6NgEhobBlc1HHYKY7WvHf5wtVAPgegIlbbZ9seUZ7AyFnwewi9pGoUyDmhrB931kfnC1ZwOeKlLP8GZJi6QLSFP2yep4toXSbT3ZQAfX3O6omt8Nhd9r/aHQAUMOQywYBZo5uZD2ThQ2rbPCjlnH6yI9rUryE5DU75ctJaake46Be4DuDjF8dFBNA94/AdtiySVxIlpMlTS8td801o70vMigM9huTda2lhcKHVHPO2HZv/P6LIwX7hk/+qzPSvUJGMkrg8AQYTkroRdXMlE+HH/twsG6BsOdJHYZlaO/lBZ6weOiiSXqs3Gqj0TeAxx+T75DIpgwjC0onD51pQD4JaluPrkR/cpFT9DcoVp84LOgTL/DjtBbglgou+puHwB8lEznPxJw1XSX77VtgizBvQNBw4RMqB7xt4Lc3c8lQKJaQHoO4R8ydz0/7MWoCXk8c85MrMC9J3qaafw/WtQlwXST+F3BnAeYB4obgJ1BJIuG+YtiKAjVOZ/Pd1ZdwzoG+4uBtSPpjaRbhXLcwF3hzytb2TilgVgT5BkYybBrTYC+Rvg5nRpdTRJrIs8+VPXPQXj2i4ItxC4O2NQQUQnN4U9rRcz9nH64p4ceM2lziX5Y4s3KHCdUHwE77ecMkMEp6BwhIa2Z6DslZRvfulgHafYLuCas58WLp2aLCFUga70qxOFU6dPFL2W1feYeaU43Y5z/TxnCuYabMEuC043ckdBp4pZ7f8FE5psOI1g6fwAAAAASUVORK5CYII="
                }),
                mounted() {
                    document.body.appendChild(this.$el),
                    document.addEventListener("mousemove", this.onRangeMouseMove, !1),
                    document.addEventListener("mouseup", this.onRangeMouseUp, !1),
                    document.addEventListener("touchmove", this.onRangeMouseMove, {
                        passive: !1
                    }),
                    document.addEventListener("touchend", this.onRangeMouseUp, !1),
                    this.show && (document.body.classList.add("vue-puzzle-overflow"),
                    this.reset())
                },
                beforeDestroy() {
                    clearTimeout(this.timer1),
                    document.body.removeChild(this.$el),
                    document.removeEventListener("mousemove", this.onRangeMouseMove, !1),
                    document.removeEventListener("mouseup", this.onRangeMouseUp, !1),
                    document.removeEventListener("touchmove", this.onRangeMouseMove, {
                        passive: !1
                    }),
                    document.removeEventListener("touchend", this.onRangeMouseUp, !1)
                },
                watch: {
                    show(t) {
                        t ? (document.body.classList.add("vue-puzzle-overflow"),
                        this.reset()) : (this.isSubmting = !1,
                        this.isSuccess = !1,
                        this.infoBoxShow = !1,
                        document.body.classList.remove("vue-puzzle-overflow"))
                    }
                },
                computed: {
                    styleWidth() {
                        const t = this.startWidth + this.newX - this.startX;
                        return t < this.sliderBaseSize ? this.sliderBaseSize : t > this.canvasWidth ? this.canvasWidth : t
                    },
                    puzzleBaseSize() {
                        return Math.round(52.5 * Math.max(Math.min(this.puzzleScale, 2), .2) + 6)
                    },
                    sliderBaseSize() {
                        return Math.max(Math.min(Math.round(this.sliderSize), Math.round(.5 * this.canvasWidth)), 10)
                    }
                },
                methods: {
                    onClose() {
                        this.mouseDown || this.isSubmting || (clearTimeout(this.timer1),
                        this.$emit("close"))
                    },
                    onCloseMouseDown() {
                        this.closeDown = !0
                    },
                    onCloseMouseUp() {
                        this.closeDown && this.onClose(),
                        this.closeDown = !1
                    },
                    onRangeMouseDown(t) {
                        this.isCanSlide && (this.mouseDown = !0,
                        this.startWidth = this.$refs["range-slider"].clientWidth,
                        this.newX = t.clientX || t.changedTouches[0].clientX,
                        this.startX = t.clientX || t.changedTouches[0].clientX)
                    },
                    onRangeMouseMove(t) {
                        this.mouseDown && (t.preventDefault(),
                        this.newX = t.clientX || t.changedTouches[0].clientX)
                    },
                    onRangeMouseUp() {
                        this.mouseDown && (this.mouseDown = !1,
                        this.submit())
                    },
                    init(t) {
                        if (this.loading && !t)
                            return;
                        this.loading = !0,
                        this.isCanSlide = !1;
                        const e = this.$refs.canvas1
                          , n = this.$refs.canvas2
                          , i = this.$refs.canvas3
                          , s = e.getContext("2d")
                          , a = n.getContext("2d")
                          , o = i.getContext("2d")
                          , r = navigator.userAgent.indexOf("Firefox") >= 0 && navigator.userAgent.indexOf("Windows") >= 0
                          , h = document.createElement("img");
                        if (s.fillStyle = "rgba(255,255,255,1)",
                        o.fillStyle = "rgba(255,255,255,1)",
                        s.clearRect(0, 0, this.canvasWidth, this.canvasHeight),
                        a.clearRect(0, 0, this.canvasWidth, this.canvasHeight),
                        this.pinX = this.getRandom(this.puzzleBaseSize, this.canvasWidth - this.puzzleBaseSize - 20),
                        this.pinY = this.getRandom(20, this.canvasHeight - this.puzzleBaseSize - 20),
                        h.crossOrigin = "anonymous",
                        h.onload = ()=>{
                            const [t,e,n,i] = this.makeImgSize(h);
                            s.save(),
                            this.paintBrick(s),
                            s.closePath(),
                            r ? (s.clip(),
                            s.save(),
                            s.shadowOffsetX = 0,
                            s.shadowOffsetY = 0,
                            s.shadowColor = "#000",
                            s.shadowBlur = 3,
                            s.fill(),
                            s.restore()) : (s.shadowOffsetX = 0,
                            s.shadowOffsetY = 0,
                            s.shadowColor = "#000",
                            s.shadowBlur = 3,
                            s.fill(),
                            s.clip()),
                            s.drawImage(h, t, e, n, i),
                            o.fillRect(0, 0, this.canvasWidth, this.canvasHeight),
                            o.drawImage(h, t, e, n, i),
                            s.globalCompositeOperation = "source-atop",
                            this.paintBrick(s),
                            s.arc(this.pinX + Math.ceil(this.puzzleBaseSize / 2), this.pinY + Math.ceil(this.puzzleBaseSize / 2), 1.2 * this.puzzleBaseSize, 0, 2 * Math.PI, !0),
                            s.closePath(),
                            s.shadowColor = "rgba(255, 255, 255, .8)",
                            s.shadowOffsetX = -1,
                            s.shadowOffsetY = -1,
                            s.shadowBlur = Math.min(Math.ceil(8 * this.puzzleScale), 12),
                            s.fillStyle = "#ffffaa",
                            s.fill();
                            const l = s.getImageData(this.pinX - 3, this.pinY - 20, this.pinX + this.puzzleBaseSize + 5, this.pinY + this.puzzleBaseSize + 5);
                            a.putImageData(l, 0, this.pinY - 20),
                            s.restore(),
                            s.clearRect(0, 0, this.canvasWidth, this.canvasHeight),
                            s.save(),
                            this.paintBrick(s),
                            s.globalAlpha = .8,
                            s.fillStyle = "#ffffff",
                            s.fill(),
                            s.restore(),
                            s.save(),
                            s.globalCompositeOperation = "source-atop",
                            this.paintBrick(s),
                            s.arc(this.pinX + Math.ceil(this.puzzleBaseSize / 2), this.pinY + Math.ceil(this.puzzleBaseSize / 2), 1.2 * this.puzzleBaseSize, 0, 2 * Math.PI, !0),
                            s.shadowColor = "#000",
                            s.shadowOffsetX = 2,
                            s.shadowOffsetY = 2,
                            s.shadowBlur = 16,
                            s.fill(),
                            s.restore(),
                            s.save(),
                            s.globalCompositeOperation = "destination-over",
                            s.drawImage(h, t, e, n, i),
                            s.restore(),
                            this.loading = !1,
                            this.isCanSlide = !0
                        }
                        ,
                        h.onerror = ()=>{
                            this.init(!0)
                        }
                        ,
                        !t && this.imgs && this.imgs.length) {
                            let t = this.getRandom(0, this.imgs.length - 1);
                            t === this.imgIndex && (t === this.imgs.length - 1 ? t = 0 : t++),
                            this.imgIndex = t,
                            h.src = this.imgs[t]
                        } else
                            h.src = this.makeImgWithCanvas()
                    },
                    getRandom: (t,e)=>Math.ceil(Math.random() * (e - t) + t),
                    makeImgSize(t) {
                        const e = t.width / t.height;
                        let n = 0
                          , i = 0
                          , s = 0
                          , a = 0;
                        return e > this.canvasWidth / this.canvasHeight ? (a = this.canvasHeight,
                        s = e * a,
                        i = 0,
                        n = (this.canvasWidth - s) / 2) : (s = this.canvasWidth,
                        a = s / e,
                        n = 0,
                        i = (this.canvasHeight - a) / 2),
                        [n, i, s, a]
                    },
                    paintBrick(t) {
                        const e = Math.ceil(15 * this.puzzleScale);
                        t.beginPath(),
                        t.moveTo(this.pinX, this.pinY),
                        t.lineTo(this.pinX + e, this.pinY),
                        t.arcTo(this.pinX + e, this.pinY - e / 2, this.pinX + e + e / 2, this.pinY - e / 2, e / 2),
                        t.arcTo(this.pinX + e + e, this.pinY - e / 2, this.pinX + e + e, this.pinY, e / 2),
                        t.lineTo(this.pinX + e + e + e, this.pinY),
                        t.lineTo(this.pinX + e + e + e, this.pinY + e),
                        t.arcTo(this.pinX + e + e + e + e / 2, this.pinY + e, this.pinX + e + e + e + e / 2, this.pinY + e + e / 2, e / 2),
                        t.arcTo(this.pinX + e + e + e + e / 2, this.pinY + e + e, this.pinX + e + e + e, this.pinY + e + e, e / 2),
                        t.lineTo(this.pinX + e + e + e, this.pinY + e + e + e),
                        t.lineTo(this.pinX, this.pinY + e + e + e),
                        t.lineTo(this.pinX, this.pinY + e + e),
                        t.arcTo(this.pinX + e / 2, this.pinY + e + e, this.pinX + e / 2, this.pinY + e + e / 2, e / 2),
                        t.arcTo(this.pinX + e / 2, this.pinY + e, this.pinX, this.pinY + e, e / 2),
                        t.lineTo(this.pinX, this.pinY)
                    },
                    makeImgWithCanvas() {
                        const t = document.createElement("canvas")
                          , e = t.getContext("2d");
                        t.width = this.canvasWidth,
                        t.height = this.canvasHeight,
                        e.fillStyle = `rgb(${this.getRandom(100, 255)},${this.getRandom(100, 255)},${this.getRandom(100, 255)})`,
                        e.fillRect(0, 0, this.canvasWidth, this.canvasHeight);
                        for (let n = 0; n < 12; n++)
                            if (e.fillStyle = `rgb(${this.getRandom(100, 255)},${this.getRandom(100, 255)},${this.getRandom(100, 255)})`,
                            e.strokeStyle = `rgb(${this.getRandom(100, 255)},${this.getRandom(100, 255)},${this.getRandom(100, 255)})`,
                            this.getRandom(0, 2) > 1)
                                e.save(),
                                e.rotate(this.getRandom(-90, 90) * Math.PI / 180),
                                e.fillRect(this.getRandom(-20, t.width - 20), this.getRandom(-20, t.height - 20), this.getRandom(10, t.width / 2 + 10), this.getRandom(10, t.height / 2 + 10)),
                                e.restore();
                            else {
                                e.beginPath();
                                const n = this.getRandom(-Math.PI, Math.PI);
                                e.arc(this.getRandom(0, t.width), this.getRandom(0, t.height), this.getRandom(10, t.height / 2 + 10), n, n + 1.5 * Math.PI),
                                e.closePath(),
                                e.fill()
                            }
                        return t.toDataURL("image/png")
                    },
                    submit() {
                        this.isSubmting = !0;
                        const t = Math.abs(this.pinX - (this.styleWidth - this.sliderBaseSize) + (this.puzzleBaseSize - this.sliderBaseSize) * ((this.styleWidth - this.sliderBaseSize) / (this.canvasWidth - this.sliderBaseSize)) - 3);
                        t < this.range ? (this.infoText = this.successText,
                        this.infoBoxFail = !1,
                        this.infoBoxShow = !0,
                        this.isCanSlide = !1,
                        this.isSuccess = !0,
                        clearTimeout(this.timer1),
                        this.timer1 = setTimeout((()=>{
                            this.isSubmting = !1,
                            this.$emit("success", t, this.pinX)
                        }
                        ), 800)) : (this.infoText = this.failText,
                        this.infoBoxFail = !0,
                        this.infoBoxShow = !0,
                        this.isCanSlide = !1,
                        this.$emit("fail", t),
                        clearTimeout(this.timer1),
                        this.timer1 = setTimeout((()=>{
                            this.isSubmting = !1,
                            this.reset()
                        }
                        ), 800))
                    },
                    resetState() {
                        this.infoBoxFail = !1,
                        this.infoBoxShow = !1,
                        this.isCanSlide = !1,
                        this.isSuccess = !1,
                        this.startWidth = this.sliderBaseSize,
                        this.startX = 0,
                        this.newX = 0
                    },
                    reset() {
                        this.$emit("reset", t),
                        this.isSubmting || (this.resetState(),
                        this.init())
                    }
                }
            }
              , s = n(379)
              , a = n.n(s)
              , o = n(795)
              , r = n.n(o)
              , h = n(569)
              , l = n.n(h)
              , c = n(565)
              , d = n.n(c)
              , u = n(216)
              , p = n.n(u)
              , f = n(589)
              , g = n.n(f)
              , v = n(358)
              , b = {};
            b.styleTagTransform = g(),
            b.setAttributes = d(),
            b.insert = l().bind(null, "head"),
            b.domAPI = r(),
            b.insertStyleElement = p(),
            a()(v.Z, b),
            v.Z && v.Z.locals && v.Z.locals;
            var m = function(t, e, n, i, s, a, o, r) {
                var h, l = "function" == typeof t ? t.options : t;
                if (e && (l.render = e,
                l.staticRenderFns = [function() {
                    var t = this
                      , e = t.$createElement
                      , n = t._self._c || e;
                    return n("div", {
                        staticClass: "loading-gif_"
                    }, [n("span"), t._v(" "), n("span"), t._v(" "), n("span"), t._v(" "), n("span"), t._v(" "), n("span")])
                }
                ],
                l._compiled = !0),
                h)
                    if (l.functional) {
                        l._injectStyles = h;
                        var c = l.render;
                        l.render = function(t, e) {
                            return h.call(e),
                            c(t, e)
                        }
                    } else {
                        var d = l.beforeCreate;
                        l.beforeCreate = d ? [].concat(d, h) : [h]
                    }
                return {
                    exports: t,
                    options: l
                }
            }(e, t);
            m.options.__file = "src/app.vue";
            var x = m.exports
        }(),
        i
    }()
}
));
//# sourceURL=[module]
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvdnVlLXB1enpsZS12Y29kZS9kaXN0L21haW4uanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdnVlLXB1enpsZS12Y29kZS9kaXN0L21haW4uanM/MTA2OSJdLCJzb3VyY2VzQ29udGVudCI6WyIhZnVuY3Rpb24odCxlKXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSxlKTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzW1widnVlLXB1enpsZS12Y29kZVwiXT1lKCk6dFtcInZ1ZS1wdXp6bGUtdmNvZGVcIl09ZSgpfSh0aGlzLChmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciB0PXszNTg6ZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oODEpLHM9bi5uKGkpLGE9big2NDUpLG89bi5uKGEpKCkocygpKTtvLnB1c2goW3QuaWQsXCIudnVlLXB1enpsZS12Y29kZSB7XFxuICBwb3NpdGlvbjogZml4ZWQ7XFxuICB0b3A6IDA7XFxuICBsZWZ0OiAwO1xcbiAgYm90dG9tOiAwO1xcbiAgcmlnaHQ6IDA7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMyk7XFxuICB6LWluZGV4OiA5OTk7XFxuICBvcGFjaXR5OiAwO1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXM7XFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zO1xcbn1cXG4udnVlLXB1enpsZS12Y29kZS5zaG93XyB7XFxuICBvcGFjaXR5OiAxO1xcbiAgcG9pbnRlci1ldmVudHM6IGF1dG87XFxufVxcbi52dWUtYXV0aC1ib3hfIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogNDAlO1xcbiAgbGVmdDogNTAlO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcXG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XFxuICBwYWRkaW5nOiAyMHB4O1xcbiAgYmFja2dyb3VuZDogI2ZmZjtcXG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xcbiAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XFxuICBib3JkZXItcmFkaXVzOiAzcHg7XFxuICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjMpO1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyAubG9hZGluZy1ib3hfIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogMDtcXG4gIGxlZnQ6IDA7XFxuICBib3R0b206IDA7XFxuICByaWdodDogMDtcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44KTtcXG4gIHotaW5kZXg6IDIwO1xcbiAgb3BhY2l0eTogMTtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcztcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXM7XFxuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcXG4gIGRpc3BsYXk6IC13ZWJraXQtZmxleDtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICAtd2Via2l0LWJveC1hbGlnbjogY2VudGVyO1xcbiAgLXdlYmtpdC1hbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgLXdlYmtpdC1ib3gtcGFjazogY2VudGVyO1xcbiAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxufVxcbi52dWUtYXV0aC1ib3hfIC5hdXRoLWJvZHlfIC5sb2FkaW5nLWJveF8uaGlkZV8ge1xcbiAgb3BhY2l0eTogMDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyAubG9hZGluZy1ib3hfLmhpZGVfIC5sb2FkaW5nLWdpZl8gc3BhbiB7XFxuICAtd2Via2l0LWFuaW1hdGlvbi1wbGF5LXN0YXRlOiBwYXVzZWQ7XFxuICAgICAgICAgIGFuaW1hdGlvbi1wbGF5LXN0YXRlOiBwYXVzZWQ7XFxufVxcbi52dWUtYXV0aC1ib3hfIC5hdXRoLWJvZHlfIC5sb2FkaW5nLWJveF8gLmxvYWRpbmctZ2lmXyB7XFxuICAtd2Via2l0LWJveC1mbGV4OiAwO1xcbiAgLXdlYmtpdC1mbGV4OiBub25lO1xcbiAgICAgICAgICBmbGV4OiBub25lO1xcbiAgaGVpZ2h0OiA1cHg7XFxuICBsaW5lLWhlaWdodDogMDtcXG59XFxuQC13ZWJraXQta2V5ZnJhbWVzIGxvYWQge1xcbjAlIHtcXG4gICAgb3BhY2l0eTogMTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMyk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjMpO1xcbn1cXG4xMDAlIHtcXG4gICAgb3BhY2l0eTogMC4yO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC4zKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuMyk7XFxufVxcbn1cXG5Aa2V5ZnJhbWVzIGxvYWQge1xcbjAlIHtcXG4gICAgb3BhY2l0eTogMTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMyk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjMpO1xcbn1cXG4xMDAlIHtcXG4gICAgb3BhY2l0eTogMC4yO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC4zKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuMyk7XFxufVxcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyAubG9hZGluZy1ib3hfIC5sb2FkaW5nLWdpZl8gc3BhbiB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICB3aWR0aDogNXB4O1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgbWFyZ2luLWxlZnQ6IDJweDtcXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICM4ODg7XFxuICAtd2Via2l0LWFuaW1hdGlvbjogbG9hZCAxLjA0cyBlYXNlIGluZmluaXRlO1xcbiAgICAgICAgICBhbmltYXRpb246IGxvYWQgMS4wNHMgZWFzZSBpbmZpbml0ZTtcXG59XFxuLnZ1ZS1hdXRoLWJveF8gLmF1dGgtYm9keV8gLmxvYWRpbmctYm94XyAubG9hZGluZy1naWZfIHNwYW46bnRoLWNoaWxkKDEpIHtcXG4gIG1hcmdpbi1sZWZ0OiAwO1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyAubG9hZGluZy1ib3hfIC5sb2FkaW5nLWdpZl8gc3BhbjpudGgtY2hpbGQoMikge1xcbiAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDAuMTNzO1xcbiAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IDAuMTNzO1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyAubG9hZGluZy1ib3hfIC5sb2FkaW5nLWdpZl8gc3BhbjpudGgtY2hpbGQoMykge1xcbiAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDAuMjZzO1xcbiAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IDAuMjZzO1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyAubG9hZGluZy1ib3hfIC5sb2FkaW5nLWdpZl8gc3BhbjpudGgtY2hpbGQoNCkge1xcbiAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDAuMzlzO1xcbiAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IDAuMzlzO1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyAubG9hZGluZy1ib3hfIC5sb2FkaW5nLWdpZl8gc3BhbjpudGgtY2hpbGQoNSkge1xcbiAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDAuNTJzO1xcbiAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IDAuNTJzO1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyAuaW5mby1ib3hfIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGJvdHRvbTogMDtcXG4gIGxlZnQ6IDA7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMjRweDtcXG4gIGxpbmUtaGVpZ2h0OiAyNHB4O1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gIGZvbnQtc2l6ZTogMTNweDtcXG4gIGJhY2tncm91bmQtY29sb3I6ICM4M2NlM2Y7XFxuICBvcGFjaXR5OiAwO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMjRweCk7XFxuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgyNHB4KTtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDIwMG1zO1xcbiAgdHJhbnNpdGlvbjogYWxsIDIwMG1zO1xcbiAgY29sb3I6ICNmZmY7XFxuICB6LWluZGV4OiAxMDtcXG59XFxuLnZ1ZS1hdXRoLWJveF8gLmF1dGgtYm9keV8gLmluZm8tYm94Xy5zaG93IHtcXG4gIG9wYWNpdHk6IDAuOTU7XFxuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcXG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyAuaW5mby1ib3hfLmZhaWwge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2NlNTk0YjtcXG59XFxuLnZ1ZS1hdXRoLWJveF8gLmF1dGgtYm9keV8gLmF1dGgtY2FudmFzMl8ge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAwO1xcbiAgbGVmdDogMDtcXG4gIHdpZHRoOiA2MHB4O1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgei1pbmRleDogMjtcXG59XFxuLnZ1ZS1hdXRoLWJveF8gLmF1dGgtYm9keV8gLmF1dGgtY2FudmFzM18ge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAwO1xcbiAgbGVmdDogMDtcXG4gIG9wYWNpdHk6IDA7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgNjAwbXM7XFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDYwMG1zO1xcbiAgei1pbmRleDogMztcXG59XFxuLnZ1ZS1hdXRoLWJveF8gLmF1dGgtYm9keV8gLmF1dGgtY2FudmFzM18uc2hvdyB7XFxuICBvcGFjaXR5OiAxO1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyAuZmxhc2hfIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogMDtcXG4gIGxlZnQ6IDA7XFxuICB3aWR0aDogMzBweDtcXG4gIGhlaWdodDogMTAwJTtcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTtcXG4gIHotaW5kZXg6IDM7XFxufVxcbi52dWUtYXV0aC1ib3hfIC5hdXRoLWJvZHlfIC5mbGFzaF8uc2hvdyB7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDYwMG1zO1xcbiAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gNjAwbXM7XFxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gNjAwbXM7XFxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gNjAwbXMsIC13ZWJraXQtdHJhbnNmb3JtIDYwMG1zO1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1ib2R5XyAucmVzZXRfIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogMnB4O1xcbiAgcmlnaHQ6IDJweDtcXG4gIHdpZHRoOiAzNXB4O1xcbiAgaGVpZ2h0OiBhdXRvO1xcbiAgei1pbmRleDogMTI7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDIwMG1zO1xcbiAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMjAwbXM7XFxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMjAwbXM7XFxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMjAwbXMsIC13ZWJraXQtdHJhbnNmb3JtIDIwMG1zO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxufVxcbi52dWUtYXV0aC1ib3hfIC5hdXRoLWJvZHlfIC5yZXNldF86aG92ZXIge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtOTBkZWcpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtOTBkZWcpO1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1jb250cm9sXyAucmFuZ2UtYm94IHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZjFmODtcXG4gIG1hcmdpbi10b3A6IDIwcHg7XFxuICBib3JkZXItcmFkaXVzOiAzcHg7XFxuICBib3gtc2hhZG93OiAwIDAgOHB4IHJnYmEoMjQwLCAyNDAsIDI0MCwgMC42KSBpbnNldDtcXG59XFxuLnZ1ZS1hdXRoLWJveF8gLmF1dGgtY29udHJvbF8gLnJhbmdlLWJveCAucmFuZ2UtdGV4dCB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDUwJTtcXG4gIGxlZnQ6IDUwJTtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XFxuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcbiAgZm9udC1zaXplOiAxNHB4O1xcbiAgY29sb3I6ICNiN2JjZDE7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgd2lkdGg6IDEwMCU7XFxufVxcbi52dWUtYXV0aC1ib3hfIC5hdXRoLWNvbnRyb2xfIC5yYW5nZS1ib3ggLnJhbmdlLXNsaWRlciB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICB3aWR0aDogNTBweDtcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMTA2LCAxNjAsIDI1NSwgMC44KTtcXG4gIGJvcmRlci1yYWRpdXM6IDNweDtcXG59XFxuLnZ1ZS1hdXRoLWJveF8gLmF1dGgtY29udHJvbF8gLnJhbmdlLWJveCAucmFuZ2Utc2xpZGVyIC5yYW5nZS1idG4ge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgZGlzcGxheTogLXdlYmtpdC1ib3g7XFxuICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgLXdlYmtpdC1ib3gtYWxpZ246IGNlbnRlcjtcXG4gIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIC13ZWJraXQtYm94LXBhY2s6IGNlbnRlcjtcXG4gIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgcmlnaHQ6IDA7XFxuICB3aWR0aDogNTBweDtcXG4gIGhlaWdodDogMTAwJTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XFxuICBib3JkZXItcmFkaXVzOiAzcHg7XFxuICBib3gtc2hhZG93OiAwIDAgNHB4ICNjY2M7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi52dWUtYXV0aC1ib3hfIC5hdXRoLWNvbnRyb2xfIC5yYW5nZS1ib3ggLnJhbmdlLXNsaWRlciAucmFuZ2UtYnRuID4gZGl2IHtcXG4gIHdpZHRoOiAwO1xcbiAgaGVpZ2h0OiA0MCU7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAyMDBtcztcXG4gIHRyYW5zaXRpb246IGFsbCAyMDBtcztcXG4gIGJvcmRlcjogc29saWQgMXB4ICM2YWEwZmY7XFxufVxcbi52dWUtYXV0aC1ib3hfIC5hdXRoLWNvbnRyb2xfIC5yYW5nZS1ib3ggLnJhbmdlLXNsaWRlciAucmFuZ2UtYnRuID4gZGl2Om50aC1jaGlsZCgyKSB7XFxuICBtYXJnaW46IDAgNHB4O1xcbn1cXG4udnVlLWF1dGgtYm94XyAuYXV0aC1jb250cm9sXyAucmFuZ2UtYm94IC5yYW5nZS1zbGlkZXIgLnJhbmdlLWJ0bjpob3ZlciA+IGRpdjpmaXJzdC1jaGlsZCxcXG4udnVlLWF1dGgtYm94XyAuYXV0aC1jb250cm9sXyAucmFuZ2UtYm94IC5yYW5nZS1zbGlkZXIgLnJhbmdlLWJ0bi5pc0Rvd24gPiBkaXY6Zmlyc3QtY2hpbGQge1xcbiAgYm9yZGVyOiBzb2xpZCA0cHggdHJhbnNwYXJlbnQ7XFxuICBoZWlnaHQ6IDA7XFxuICBib3JkZXItcmlnaHQtY29sb3I6ICM2YWEwZmY7XFxufVxcbi52dWUtYXV0aC1ib3hfIC5hdXRoLWNvbnRyb2xfIC5yYW5nZS1ib3ggLnJhbmdlLXNsaWRlciAucmFuZ2UtYnRuOmhvdmVyID4gZGl2Om50aC1jaGlsZCgyKSxcXG4udnVlLWF1dGgtYm94XyAuYXV0aC1jb250cm9sXyAucmFuZ2UtYm94IC5yYW5nZS1zbGlkZXIgLnJhbmdlLWJ0bi5pc0Rvd24gPiBkaXY6bnRoLWNoaWxkKDIpIHtcXG4gIGJvcmRlci13aWR0aDogM3B4O1xcbiAgaGVpZ2h0OiAwO1xcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xcbiAgbWFyZ2luOiAwIDZweDtcXG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzZhYTBmZjtcXG59XFxuLnZ1ZS1hdXRoLWJveF8gLmF1dGgtY29udHJvbF8gLnJhbmdlLWJveCAucmFuZ2Utc2xpZGVyIC5yYW5nZS1idG46aG92ZXIgPiBkaXY6bnRoLWNoaWxkKDMpLFxcbi52dWUtYXV0aC1ib3hfIC5hdXRoLWNvbnRyb2xfIC5yYW5nZS1ib3ggLnJhbmdlLXNsaWRlciAucmFuZ2UtYnRuLmlzRG93biA+IGRpdjpudGgtY2hpbGQoMykge1xcbiAgYm9yZGVyOiBzb2xpZCA0cHggdHJhbnNwYXJlbnQ7XFxuICBoZWlnaHQ6IDA7XFxuICBib3JkZXItbGVmdC1jb2xvcjogIzZhYTBmZjtcXG59XFxuLnZ1ZS1wdXp6bGUtb3ZlcmZsb3cge1xcbiAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xcbn1cXG5cIixcIlwiXSksZS5aPW99LDY0NTpmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoKGZ1bmN0aW9uKGUpe3ZhciBuPVwiXCIsaT12b2lkIDAhPT1lWzVdO3JldHVybiBlWzRdJiYobis9XCJAc3VwcG9ydHMgKFwiLmNvbmNhdChlWzRdLFwiKSB7XCIpKSxlWzJdJiYobis9XCJAbWVkaWEgXCIuY29uY2F0KGVbMl0sXCIge1wiKSksaSYmKG4rPVwiQGxheWVyXCIuY29uY2F0KGVbNV0ubGVuZ3RoPjA/XCIgXCIuY29uY2F0KGVbNV0pOlwiXCIsXCIge1wiKSksbis9dChlKSxpJiYobis9XCJ9XCIpLGVbMl0mJihuKz1cIn1cIiksZVs0XSYmKG4rPVwifVwiKSxufSkpLmpvaW4oXCJcIil9LGUuaT1mdW5jdGlvbih0LG4saSxzLGEpe1wic3RyaW5nXCI9PXR5cGVvZiB0JiYodD1bW251bGwsdCx2b2lkIDBdXSk7dmFyIG89e307aWYoaSlmb3IodmFyIHI9MDtyPHRoaXMubGVuZ3RoO3IrKyl7dmFyIGg9dGhpc1tyXVswXTtudWxsIT1oJiYob1toXT0hMCl9Zm9yKHZhciBsPTA7bDx0Lmxlbmd0aDtsKyspe3ZhciBjPVtdLmNvbmNhdCh0W2xdKTtpJiZvW2NbMF1dfHwodm9pZCAwIT09YSYmKHZvaWQgMD09PWNbNV18fChjWzFdPVwiQGxheWVyXCIuY29uY2F0KGNbNV0ubGVuZ3RoPjA/XCIgXCIuY29uY2F0KGNbNV0pOlwiXCIsXCIge1wiKS5jb25jYXQoY1sxXSxcIn1cIikpLGNbNV09YSksbiYmKGNbMl0/KGNbMV09XCJAbWVkaWEgXCIuY29uY2F0KGNbMl0sXCIge1wiKS5jb25jYXQoY1sxXSxcIn1cIiksY1syXT1uKTpjWzJdPW4pLHMmJihjWzRdPyhjWzFdPVwiQHN1cHBvcnRzIChcIi5jb25jYXQoY1s0XSxcIikge1wiKS5jb25jYXQoY1sxXSxcIn1cIiksY1s0XT1zKTpjWzRdPVwiXCIuY29uY2F0KHMpKSxlLnB1c2goYykpfX0sZX19LDgxOmZ1bmN0aW9uKHQpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdFsxXX19LDM3OTpmdW5jdGlvbih0KXt2YXIgZT1bXTtmdW5jdGlvbiBuKHQpe2Zvcih2YXIgbj0tMSxpPTA7aTxlLmxlbmd0aDtpKyspaWYoZVtpXS5pZGVudGlmaWVyPT09dCl7bj1pO2JyZWFrfXJldHVybiBufWZ1bmN0aW9uIGkodCxpKXtmb3IodmFyIGE9e30sbz1bXSxyPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBoPXRbcl0sbD1pLmJhc2U/aFswXStpLmJhc2U6aFswXSxjPWFbbF18fDAsZD1cIlwiLmNvbmNhdChsLFwiIFwiKS5jb25jYXQoYyk7YVtsXT1jKzE7dmFyIHU9bihkKSxwPXtjc3M6aFsxXSxtZWRpYTpoWzJdLHNvdXJjZU1hcDpoWzNdLHN1cHBvcnRzOmhbNF0sbGF5ZXI6aFs1XX07aWYoLTEhPT11KWVbdV0ucmVmZXJlbmNlcysrLGVbdV0udXBkYXRlcihwKTtlbHNle3ZhciBmPXMocCxpKTtpLmJ5SW5kZXg9cixlLnNwbGljZShyLDAse2lkZW50aWZpZXI6ZCx1cGRhdGVyOmYscmVmZXJlbmNlczoxfSl9by5wdXNoKGQpfXJldHVybiBvfWZ1bmN0aW9uIHModCxlKXt2YXIgbj1lLmRvbUFQSShlKTtyZXR1cm4gbi51cGRhdGUodCksZnVuY3Rpb24oZSl7aWYoZSl7aWYoZS5jc3M9PT10LmNzcyYmZS5tZWRpYT09PXQubWVkaWEmJmUuc291cmNlTWFwPT09dC5zb3VyY2VNYXAmJmUuc3VwcG9ydHM9PT10LnN1cHBvcnRzJiZlLmxheWVyPT09dC5sYXllcilyZXR1cm47bi51cGRhdGUodD1lKX1lbHNlIG4ucmVtb3ZlKCl9fXQuZXhwb3J0cz1mdW5jdGlvbih0LHMpe3ZhciBhPWkodD10fHxbXSxzPXN8fHt9KTtyZXR1cm4gZnVuY3Rpb24odCl7dD10fHxbXTtmb3IodmFyIG89MDtvPGEubGVuZ3RoO28rKyl7dmFyIHI9bihhW29dKTtlW3JdLnJlZmVyZW5jZXMtLX1mb3IodmFyIGg9aSh0LHMpLGw9MDtsPGEubGVuZ3RoO2wrKyl7dmFyIGM9bihhW2xdKTswPT09ZVtjXS5yZWZlcmVuY2VzJiYoZVtjXS51cGRhdGVyKCksZS5zcGxpY2UoYywxKSl9YT1ofX19LDU2OTpmdW5jdGlvbih0KXt2YXIgZT17fTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxuKXt2YXIgaT1mdW5jdGlvbih0KXtpZih2b2lkIDA9PT1lW3RdKXt2YXIgbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQpO2lmKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCYmbiBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCl0cnl7bj1uLmNvbnRlbnREb2N1bWVudC5oZWFkfWNhdGNoKHQpe249bnVsbH1lW3RdPW59cmV0dXJuIGVbdF19KHQpO2lmKCFpKXRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgYSBzdHlsZSB0YXJnZXQuIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSAnaW5zZXJ0JyBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cIik7aS5hcHBlbmRDaGlsZChuKX19LDIxNjpmdW5jdGlvbih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO3JldHVybiB0LnNldEF0dHJpYnV0ZXMoZSx0LmF0dHJpYnV0ZXMpLHQuaW5zZXJ0KGUsdC5vcHRpb25zKSxlfX0sNTY1OmZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9bi5uYztlJiZ0LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsZSl9fSw3OTU6ZnVuY3Rpb24odCl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5zZXJ0U3R5bGVFbGVtZW50KHQpO3JldHVybnt1cGRhdGU6ZnVuY3Rpb24obil7IWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1cIlwiO24uc3VwcG9ydHMmJihpKz1cIkBzdXBwb3J0cyAoXCIuY29uY2F0KG4uc3VwcG9ydHMsXCIpIHtcIikpLG4ubWVkaWEmJihpKz1cIkBtZWRpYSBcIi5jb25jYXQobi5tZWRpYSxcIiB7XCIpKTt2YXIgcz12b2lkIDAhPT1uLmxheWVyO3MmJihpKz1cIkBsYXllclwiLmNvbmNhdChuLmxheWVyLmxlbmd0aD4wP1wiIFwiLmNvbmNhdChuLmxheWVyKTpcIlwiLFwiIHtcIikpLGkrPW4uY3NzLHMmJihpKz1cIn1cIiksbi5tZWRpYSYmKGkrPVwifVwiKSxuLnN1cHBvcnRzJiYoaSs9XCJ9XCIpO3ZhciBhPW4uc291cmNlTWFwO2EmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBidG9hJiYoaSs9XCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShhKSkpKSxcIiAqL1wiKSksZS5zdHlsZVRhZ1RyYW5zZm9ybShpLHQsZS5vcHRpb25zKX0oZSx0LG4pfSxyZW1vdmU6ZnVuY3Rpb24oKXshZnVuY3Rpb24odCl7aWYobnVsbD09PXQucGFyZW50Tm9kZSlyZXR1cm4hMTt0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCl9KGUpfX19fSw1ODk6ZnVuY3Rpb24odCl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYoZS5zdHlsZVNoZWV0KWUuc3R5bGVTaGVldC5jc3NUZXh0PXQ7ZWxzZXtmb3IoO2UuZmlyc3RDaGlsZDspZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodCkpfX19fSxlPXt9O2Z1bmN0aW9uIG4oaSl7dmFyIHM9ZVtpXTtpZih2b2lkIDAhPT1zKXJldHVybiBzLmV4cG9ydHM7dmFyIGE9ZVtpXT17aWQ6aSxleHBvcnRzOnt9fTtyZXR1cm4gdFtpXShhLGEuZXhwb3J0cyxuKSxhLmV4cG9ydHN9bi5uPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiB0LmRlZmF1bHR9OmZ1bmN0aW9uKCl7cmV0dXJuIHR9O3JldHVybiBuLmQoZSx7YTplfSksZX0sbi5kPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpIGluIGUpbi5vKGUsaSkmJiFuLm8odCxpKSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaSx7ZW51bWVyYWJsZTohMCxnZXQ6ZVtpXX0pfSxuLm89ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9LG4ucj1mdW5jdGlvbih0KXtcInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6XCJNb2R1bGVcIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfTt2YXIgaT17fTtyZXR1cm4gZnVuY3Rpb24oKXtuLnIoaSksbi5kKGkse2RlZmF1bHQ6ZnVuY3Rpb24oKXtyZXR1cm4geH19KTt2YXIgdD1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10LiRjcmVhdGVFbGVtZW50LG49dC5fc2VsZi5fY3x8ZTtyZXR1cm4gbihcImRpdlwiLHtjbGFzczpbXCJ2dWUtcHV6emxlLXZjb2RlXCIse3Nob3dfOnQuc2hvd31dLG9uOnttb3VzZWRvd246dC5vbkNsb3NlTW91c2VEb3duLG1vdXNldXA6dC5vbkNsb3NlTW91c2VVcCx0b3VjaHN0YXJ0OnQub25DbG9zZU1vdXNlRG93bix0b3VjaGVuZDp0Lm9uQ2xvc2VNb3VzZVVwfX0sW24oXCJkaXZcIix7c3RhdGljQ2xhc3M6XCJ2dWUtYXV0aC1ib3hfXCIsb246e21vdXNlZG93bjpmdW5jdGlvbih0KXt0LnN0b3BQcm9wYWdhdGlvbigpfSx0b3VjaHN0YXJ0OmZ1bmN0aW9uKHQpe3Quc3RvcFByb3BhZ2F0aW9uKCl9fX0sW24oXCJkaXZcIix7c3RhdGljQ2xhc3M6XCJhdXRoLWJvZHlfXCIsc3R5bGU6XCJoZWlnaHQ6IFwiK3QuY2FudmFzSGVpZ2h0K1wicHhcIn0sW24oXCJjYW52YXNcIix7cmVmOlwiY2FudmFzMVwiLHN0eWxlOlwid2lkdGg6XCIrdC5jYW52YXNXaWR0aCtcInB4O2hlaWdodDpcIit0LmNhbnZhc0hlaWdodCtcInB4XCIsYXR0cnM6e3dpZHRoOnQuY2FudmFzV2lkdGgsaGVpZ2h0OnQuY2FudmFzSGVpZ2h0fX0pLHQuX3YoXCIgXCIpLG4oXCJjYW52YXNcIix7cmVmOlwiY2FudmFzM1wiLGNsYXNzOltcImF1dGgtY2FudmFzM19cIix7c2hvdzp0LmlzU3VjY2Vzc31dLHN0eWxlOlwid2lkdGg6XCIrdC5jYW52YXNXaWR0aCtcInB4O2hlaWdodDpcIit0LmNhbnZhc0hlaWdodCtcInB4XCIsYXR0cnM6e3dpZHRoOnQuY2FudmFzV2lkdGgsaGVpZ2h0OnQuY2FudmFzSGVpZ2h0fX0pLHQuX3YoXCIgXCIpLG4oXCJjYW52YXNcIix7cmVmOlwiY2FudmFzMlwiLHN0YXRpY0NsYXNzOlwiYXV0aC1jYW52YXMyX1wiLHN0eWxlOlwid2lkdGg6XCIrdC5wdXp6bGVCYXNlU2l6ZStcInB4O2hlaWdodDpcIit0LmNhbnZhc0hlaWdodCtcInB4O3RyYW5zZm9ybTp0cmFuc2xhdGVYKFwiKyh0LnN0eWxlV2lkdGgtdC5zbGlkZXJCYXNlU2l6ZS0odC5wdXp6bGVCYXNlU2l6ZS10LnNsaWRlckJhc2VTaXplKSooKHQuc3R5bGVXaWR0aC10LnNsaWRlckJhc2VTaXplKS8odC5jYW52YXNXaWR0aC10LnNsaWRlckJhc2VTaXplKSkpK1wicHgpXCIsYXR0cnM6e3dpZHRoOnQucHV6emxlQmFzZVNpemUsaGVpZ2h0OnQuY2FudmFzSGVpZ2h0fX0pLHQuX3YoXCIgXCIpLG4oXCJkaXZcIix7Y2xhc3M6W1wibG9hZGluZy1ib3hfXCIse2hpZGVfOiF0LmxvYWRpbmd9XX0sW3QuX20oMCldKSx0Ll92KFwiIFwiKSxuKFwiZGl2XCIse2NsYXNzOltcImluZm8tYm94X1wiLHtzaG93OnQuaW5mb0JveFNob3d9LHtmYWlsOnQuaW5mb0JveEZhaWx9XX0sW3QuX3YoXCJcXG4gICAgICAgIFwiK3QuX3ModC5pbmZvVGV4dCkrXCJcXG4gICAgICBcIildKSx0Ll92KFwiIFwiKSxuKFwiZGl2XCIse2NsYXNzOltcImZsYXNoX1wiLHtzaG93OnQuaXNTdWNjZXNzfV0sc3R5bGU6XCJ0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoXCIrKHQuaXNTdWNjZXNzP3QuY2FudmFzV2lkdGgrLjU3OCp0LmNhbnZhc0hlaWdodCtcInB4XCI6XCItXCIrLjU3OCp0LmNhbnZhc0hlaWdodCtcInB4XCIpK1wiKSBza2V3KC0zMGRlZywgMCk7XCJ9KSx0Ll92KFwiIFwiKSxuKFwiaW1nXCIse3N0YXRpY0NsYXNzOlwicmVzZXRfXCIsYXR0cnM6e3NyYzp0LnJlc2V0U3ZnfSxvbjp7Y2xpY2s6dC5yZXNldH19KV0pLHQuX3YoXCIgXCIpLG4oXCJkaXZcIix7c3RhdGljQ2xhc3M6XCJhdXRoLWNvbnRyb2xfXCJ9LFtuKFwiZGl2XCIse3N0YXRpY0NsYXNzOlwicmFuZ2UtYm94XCIsc3R5bGU6XCJoZWlnaHQ6XCIrdC5zbGlkZXJCYXNlU2l6ZStcInB4XCJ9LFtuKFwiZGl2XCIse3N0YXRpY0NsYXNzOlwicmFuZ2UtdGV4dFwifSxbdC5fdih0Ll9zKHQuc2xpZGVyVGV4dCkpXSksdC5fdihcIiBcIiksbihcImRpdlwiLHtyZWY6XCJyYW5nZS1zbGlkZXJcIixzdGF0aWNDbGFzczpcInJhbmdlLXNsaWRlclwiLHN0eWxlOlwid2lkdGg6XCIrdC5zdHlsZVdpZHRoK1wicHhcIn0sW24oXCJkaXZcIix7Y2xhc3M6W1wicmFuZ2UtYnRuXCIse2lzRG93bjp0Lm1vdXNlRG93bn1dLHN0eWxlOlwid2lkdGg6XCIrdC5zbGlkZXJCYXNlU2l6ZStcInB4XCIsb246e21vdXNlZG93bjpmdW5jdGlvbihlKXtyZXR1cm4gdC5vblJhbmdlTW91c2VEb3duKGUpfSx0b3VjaHN0YXJ0OmZ1bmN0aW9uKGUpe3JldHVybiB0Lm9uUmFuZ2VNb3VzZURvd24oZSl9fX0sW24oXCJkaXZcIiksdC5fdihcIiBcIiksbihcImRpdlwiKSx0Ll92KFwiIFwiKSxuKFwiZGl2XCIpXSldKV0pXSldKV0pfTt0Ll93aXRoU3RyaXBwZWQ9ITA7dmFyIGU9e3Byb3BzOntjYW52YXNXaWR0aDp7dHlwZTpOdW1iZXIsZGVmYXVsdDozMTB9LGNhbnZhc0hlaWdodDp7dHlwZTpOdW1iZXIsZGVmYXVsdDoxNjB9LHNob3c6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxwdXp6bGVTY2FsZTp7dHlwZTpOdW1iZXIsZGVmYXVsdDoxfSxzbGlkZXJTaXplOnt0eXBlOk51bWJlcixkZWZhdWx0OjUwfSxyYW5nZTp7dHlwZTpOdW1iZXIsZGVmYXVsdDoxMH0saW1nczp7dHlwZTpBcnJheX0sc3VjY2Vzc1RleHQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6XCLpqozor4HpgJrov4fvvIFcIn0sZmFpbFRleHQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6XCLpqozor4HlpLHotKXvvIzor7fph43or5VcIn0sc2xpZGVyVGV4dDp7dHlwZTpTdHJpbmcsZGVmYXVsdDpcIuaLluWKqOa7keWdl+WujOaIkOaLvOWbvlwifX0sZGF0YTooKT0+KHttb3VzZURvd246ITEsc3RhcnRXaWR0aDo1MCxzdGFydFg6MCxuZXdYOjAscGluWDowLHBpblk6MCxsb2FkaW5nOiExLGlzQ2FuU2xpZGU6ITEsZXJyb3I6ITEsaW5mb0JveFNob3c6ITEsaW5mb1RleHQ6XCJcIixpbmZvQm94RmFpbDohMSx0aW1lcjE6bnVsbCxjbG9zZURvd246ITEsaXNTdWNjZXNzOiExLGltZ0luZGV4Oi0xLGlzU3VibXRpbmc6ITEscmVzZXRTdmc6XCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNnQUFBQW9DQVlBQUFDTS9yaHRBQUFFTGtsRVFWUllSKzJZVzJ3VVpSVEgvLzl2dGxDb0Y5SW9Ja2xUM1BxZ1BHaTMyNmhvZXR1YUdFaElyOVNnQ1lra2d0MldHT1FWQ2NhK0dhdldkcjBHakQ0WWhHM1JCM2hwbHkxTFFBMXRFUUl4RVhhcEdJMnBFa3lzOUxJengyeWxZV2ZZNmU1c0Ywb2krN2h6enZsKzMvOTg1NXh2aHJqTmY3ek4rWEFIY0w0WituOG82SldUZVl0KytXMjVTNTk2QUlaeTZUQituM3lvK05jaGxrOHZtSUlWb3dkWFU5YzNRMWdEU2lsQmxRd2pnQkFZRkdEdmRGNTgvNG1pbHF2WndEcE9jWFdzYjVVaDhobUJxa3dYRk1obENOOGFYNUxYTmJSeS9UK1oraVhzSEFGV1JYczNRR1FQeUx1Y0xESnJLNURnVVhkVHN4UGZqQUVybzhFM0NlNTBFdHhzS3hQVHdDUEgzVTJqVG1Ka0JKZ1dUbkFNeERlR01Fb2EweFErTEpRbkNENEhZRmtDeUFDM1Jkd04zVTdnTWtweFJUVFlyTUQ5MXNDSklnQ3hWNVI2TzFKY2Z5N1Z3b25xTG9qOS9DcUIya0YzNDFxbmNHa0J2UmUrdXJlQVdwUmdvYWxDQmVjTUZ6Y2RLMjRZeW1aUkp6NXpwcmdxMXRzSndYWUwzQ1ZaR3ZkR0htd1pjN0pRdHJhMmdFK2Y3MTJlcDJRVVlQNzE0REpoYUpyWExxWFpRc3psWnd0WWRTSG9COWxqVmsvZVBWclNaRkwwWmtBbHh6UUJWc2VDVDhXaFpoUlRodEZCOHBsazlaaS9xQ2k4Y3YwZk54dktGckR5NG9GMTFOWFhJRnkyRUlJNGlCY0czWTAzVkxaVDhPcVJkNWFGUGR1dk9FcHhSYXl2WG9seEFLQjJnNk5nRWhvYkJsYzFISFlLWTdXdkhmNXd0VkFQZ2VnSWxiYlo5c2VVWjdBeUZud2V3aTlwR29VeURtaHJCOTMxa2ZuQzFad09lS2xMUDhHWkppNlFMU0ZQMnllcDR0b1hTYlQzWlFBZlgzTzZvbXQ4TmhkOXIvYUhRQVVNT1F5d1lCWm81dVpEMlRoUTJyYlBDamxuSDZ5STlyVXJ5RTVEVTc1Y3RKYWFrZTQ2QmU0RHVEakY4ZEZCTkE5NC9BZHRpeVNWeElscE1sVFM4dGQ4MDFvNzB2TWlnTTlodVRkYTJsaGNLSFZIUE8ySFp2L1A2TEl3WDdoay8rcXpQU3ZVSkdNa3JnOEFRWVRrcm9SZFhNbEUrSEgvdHdzRzZCc09kSkhZWmxhTy9sQlo2d2VPaWlTWHFzM0dxajBUZUF4eCtUNzVESXBnd2pDMG9uRDUxcFFENEphbHVQcmtSL2NwRlQ5RGNvVnA4NExPZ1RML0RqdEJiZ2xnb3UrcHVId0I4bEV6blB4SncxWFNYNzdWdGdpekJ2UU5CdzRSTXFCN3h0NExjM2M4bFFLSmFRSG9PNFI4eWR6MC83TVdvQ1hrOGM4NU1yTUM5SjNxYWFmdy9XdFFsd1hTVCtGM0JuQWVZQjRvYmdKMUJKSXVHK1l0aUtBalZPWi9QZDFaZHd6b0crNHVCdFNQcGphUmJoWExjd0YzaHp5dGIyVGlsZ1ZnVDVCa1l5YkJyVFlDK1J2ZzVuUnBkVFJKcklzOCtWUFhQUVhqMmk0SXR4QzRPMk5RUVVRbk40VTlyUmN6OW5INjRwNGNlTTJsemlYNVk0czNLSENkVUh3RTc3ZWNNa01FcDZCd2hJYTJaNkRzbFpSdmZ1bGdIYWZZTHVDYXM1OFdMcDJhTENGVWdhNzBxeE9GVTZkUEZMMlcxZmVZZWFVNDNZNXovVHhuQ3VZYWJNRXVDMDQzY2tkQnA0cFo3ZjhGRTVwc09JMWc2ZndBQUFBQVNVVk9SSzVDWUlJPVwifSksbW91bnRlZCgpe2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy4kZWwpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLm9uUmFuZ2VNb3VzZU1vdmUsITEpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsdGhpcy5vblJhbmdlTW91c2VVcCwhMSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLHRoaXMub25SYW5nZU1vdXNlTW92ZSx7cGFzc2l2ZTohMX0pLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLHRoaXMub25SYW5nZU1vdXNlVXAsITEpLHRoaXMuc2hvdyYmKGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChcInZ1ZS1wdXp6bGUtb3ZlcmZsb3dcIiksdGhpcy5yZXNldCgpKX0sYmVmb3JlRGVzdHJveSgpe2NsZWFyVGltZW91dCh0aGlzLnRpbWVyMSksZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLiRlbCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHRoaXMub25SYW5nZU1vdXNlTW92ZSwhMSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIix0aGlzLm9uUmFuZ2VNb3VzZVVwLCExKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsdGhpcy5vblJhbmdlTW91c2VNb3ZlLHtwYXNzaXZlOiExfSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsdGhpcy5vblJhbmdlTW91c2VVcCwhMSl9LHdhdGNoOntzaG93KHQpe3Q/KGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChcInZ1ZS1wdXp6bGUtb3ZlcmZsb3dcIiksdGhpcy5yZXNldCgpKToodGhpcy5pc1N1Ym10aW5nPSExLHRoaXMuaXNTdWNjZXNzPSExLHRoaXMuaW5mb0JveFNob3c9ITEsZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKFwidnVlLXB1enpsZS1vdmVyZmxvd1wiKSl9fSxjb21wdXRlZDp7c3R5bGVXaWR0aCgpe2NvbnN0IHQ9dGhpcy5zdGFydFdpZHRoK3RoaXMubmV3WC10aGlzLnN0YXJ0WDtyZXR1cm4gdDx0aGlzLnNsaWRlckJhc2VTaXplP3RoaXMuc2xpZGVyQmFzZVNpemU6dD50aGlzLmNhbnZhc1dpZHRoP3RoaXMuY2FudmFzV2lkdGg6dH0scHV6emxlQmFzZVNpemUoKXtyZXR1cm4gTWF0aC5yb3VuZCg1Mi41Kk1hdGgubWF4KE1hdGgubWluKHRoaXMucHV6emxlU2NhbGUsMiksLjIpKzYpfSxzbGlkZXJCYXNlU2l6ZSgpe3JldHVybiBNYXRoLm1heChNYXRoLm1pbihNYXRoLnJvdW5kKHRoaXMuc2xpZGVyU2l6ZSksTWF0aC5yb3VuZCguNSp0aGlzLmNhbnZhc1dpZHRoKSksMTApfX0sbWV0aG9kczp7b25DbG9zZSgpe3RoaXMubW91c2VEb3dufHx0aGlzLmlzU3VibXRpbmd8fChjbGVhclRpbWVvdXQodGhpcy50aW1lcjEpLHRoaXMuJGVtaXQoXCJjbG9zZVwiKSl9LG9uQ2xvc2VNb3VzZURvd24oKXt0aGlzLmNsb3NlRG93bj0hMH0sb25DbG9zZU1vdXNlVXAoKXt0aGlzLmNsb3NlRG93biYmdGhpcy5vbkNsb3NlKCksdGhpcy5jbG9zZURvd249ITF9LG9uUmFuZ2VNb3VzZURvd24odCl7dGhpcy5pc0NhblNsaWRlJiYodGhpcy5tb3VzZURvd249ITAsdGhpcy5zdGFydFdpZHRoPXRoaXMuJHJlZnNbXCJyYW5nZS1zbGlkZXJcIl0uY2xpZW50V2lkdGgsdGhpcy5uZXdYPXQuY2xpZW50WHx8dC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYLHRoaXMuc3RhcnRYPXQuY2xpZW50WHx8dC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYKX0sb25SYW5nZU1vdXNlTW92ZSh0KXt0aGlzLm1vdXNlRG93biYmKHQucHJldmVudERlZmF1bHQoKSx0aGlzLm5ld1g9dC5jbGllbnRYfHx0LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFgpfSxvblJhbmdlTW91c2VVcCgpe3RoaXMubW91c2VEb3duJiYodGhpcy5tb3VzZURvd249ITEsdGhpcy5zdWJtaXQoKSl9LGluaXQodCl7aWYodGhpcy5sb2FkaW5nJiYhdClyZXR1cm47dGhpcy5sb2FkaW5nPSEwLHRoaXMuaXNDYW5TbGlkZT0hMTtjb25zdCBlPXRoaXMuJHJlZnMuY2FudmFzMSxuPXRoaXMuJHJlZnMuY2FudmFzMixpPXRoaXMuJHJlZnMuY2FudmFzMyxzPWUuZ2V0Q29udGV4dChcIjJkXCIpLGE9bi5nZXRDb250ZXh0KFwiMmRcIiksbz1pLmdldENvbnRleHQoXCIyZFwiKSxyPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihcIkZpcmVmb3hcIik+PTAmJm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihcIldpbmRvd3NcIik+PTAsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO2lmKHMuZmlsbFN0eWxlPVwicmdiYSgyNTUsMjU1LDI1NSwxKVwiLG8uZmlsbFN0eWxlPVwicmdiYSgyNTUsMjU1LDI1NSwxKVwiLHMuY2xlYXJSZWN0KDAsMCx0aGlzLmNhbnZhc1dpZHRoLHRoaXMuY2FudmFzSGVpZ2h0KSxhLmNsZWFyUmVjdCgwLDAsdGhpcy5jYW52YXNXaWR0aCx0aGlzLmNhbnZhc0hlaWdodCksdGhpcy5waW5YPXRoaXMuZ2V0UmFuZG9tKHRoaXMucHV6emxlQmFzZVNpemUsdGhpcy5jYW52YXNXaWR0aC10aGlzLnB1enpsZUJhc2VTaXplLTIwKSx0aGlzLnBpblk9dGhpcy5nZXRSYW5kb20oMjAsdGhpcy5jYW52YXNIZWlnaHQtdGhpcy5wdXp6bGVCYXNlU2l6ZS0yMCksaC5jcm9zc09yaWdpbj1cImFub255bW91c1wiLGgub25sb2FkPSgpPT57Y29uc3RbdCxlLG4saV09dGhpcy5tYWtlSW1nU2l6ZShoKTtzLnNhdmUoKSx0aGlzLnBhaW50QnJpY2socykscy5jbG9zZVBhdGgoKSxyPyhzLmNsaXAoKSxzLnNhdmUoKSxzLnNoYWRvd09mZnNldFg9MCxzLnNoYWRvd09mZnNldFk9MCxzLnNoYWRvd0NvbG9yPVwiIzAwMFwiLHMuc2hhZG93Qmx1cj0zLHMuZmlsbCgpLHMucmVzdG9yZSgpKToocy5zaGFkb3dPZmZzZXRYPTAscy5zaGFkb3dPZmZzZXRZPTAscy5zaGFkb3dDb2xvcj1cIiMwMDBcIixzLnNoYWRvd0JsdXI9MyxzLmZpbGwoKSxzLmNsaXAoKSkscy5kcmF3SW1hZ2UoaCx0LGUsbixpKSxvLmZpbGxSZWN0KDAsMCx0aGlzLmNhbnZhc1dpZHRoLHRoaXMuY2FudmFzSGVpZ2h0KSxvLmRyYXdJbWFnZShoLHQsZSxuLGkpLHMuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPVwic291cmNlLWF0b3BcIix0aGlzLnBhaW50QnJpY2socykscy5hcmModGhpcy5waW5YK01hdGguY2VpbCh0aGlzLnB1enpsZUJhc2VTaXplLzIpLHRoaXMucGluWStNYXRoLmNlaWwodGhpcy5wdXp6bGVCYXNlU2l6ZS8yKSwxLjIqdGhpcy5wdXp6bGVCYXNlU2l6ZSwwLDIqTWF0aC5QSSwhMCkscy5jbG9zZVBhdGgoKSxzLnNoYWRvd0NvbG9yPVwicmdiYSgyNTUsIDI1NSwgMjU1LCAuOClcIixzLnNoYWRvd09mZnNldFg9LTEscy5zaGFkb3dPZmZzZXRZPS0xLHMuc2hhZG93Qmx1cj1NYXRoLm1pbihNYXRoLmNlaWwoOCp0aGlzLnB1enpsZVNjYWxlKSwxMikscy5maWxsU3R5bGU9XCIjZmZmZmFhXCIscy5maWxsKCk7Y29uc3QgbD1zLmdldEltYWdlRGF0YSh0aGlzLnBpblgtMyx0aGlzLnBpblktMjAsdGhpcy5waW5YK3RoaXMucHV6emxlQmFzZVNpemUrNSx0aGlzLnBpblkrdGhpcy5wdXp6bGVCYXNlU2l6ZSs1KTthLnB1dEltYWdlRGF0YShsLDAsdGhpcy5waW5ZLTIwKSxzLnJlc3RvcmUoKSxzLmNsZWFyUmVjdCgwLDAsdGhpcy5jYW52YXNXaWR0aCx0aGlzLmNhbnZhc0hlaWdodCkscy5zYXZlKCksdGhpcy5wYWludEJyaWNrKHMpLHMuZ2xvYmFsQWxwaGE9Ljgscy5maWxsU3R5bGU9XCIjZmZmZmZmXCIscy5maWxsKCkscy5yZXN0b3JlKCkscy5zYXZlKCkscy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249XCJzb3VyY2UtYXRvcFwiLHRoaXMucGFpbnRCcmljayhzKSxzLmFyYyh0aGlzLnBpblgrTWF0aC5jZWlsKHRoaXMucHV6emxlQmFzZVNpemUvMiksdGhpcy5waW5ZK01hdGguY2VpbCh0aGlzLnB1enpsZUJhc2VTaXplLzIpLDEuMip0aGlzLnB1enpsZUJhc2VTaXplLDAsMipNYXRoLlBJLCEwKSxzLnNoYWRvd0NvbG9yPVwiIzAwMFwiLHMuc2hhZG93T2Zmc2V0WD0yLHMuc2hhZG93T2Zmc2V0WT0yLHMuc2hhZG93Qmx1cj0xNixzLmZpbGwoKSxzLnJlc3RvcmUoKSxzLnNhdmUoKSxzLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1cImRlc3RpbmF0aW9uLW92ZXJcIixzLmRyYXdJbWFnZShoLHQsZSxuLGkpLHMucmVzdG9yZSgpLHRoaXMubG9hZGluZz0hMSx0aGlzLmlzQ2FuU2xpZGU9ITB9LGgub25lcnJvcj0oKT0+e3RoaXMuaW5pdCghMCl9LCF0JiZ0aGlzLmltZ3MmJnRoaXMuaW1ncy5sZW5ndGgpe2xldCB0PXRoaXMuZ2V0UmFuZG9tKDAsdGhpcy5pbWdzLmxlbmd0aC0xKTt0PT09dGhpcy5pbWdJbmRleCYmKHQ9PT10aGlzLmltZ3MubGVuZ3RoLTE/dD0wOnQrKyksdGhpcy5pbWdJbmRleD10LGguc3JjPXRoaXMuaW1nc1t0XX1lbHNlIGguc3JjPXRoaXMubWFrZUltZ1dpdGhDYW52YXMoKX0sZ2V0UmFuZG9tOih0LGUpPT5NYXRoLmNlaWwoTWF0aC5yYW5kb20oKSooZS10KSt0KSxtYWtlSW1nU2l6ZSh0KXtjb25zdCBlPXQud2lkdGgvdC5oZWlnaHQ7bGV0IG49MCxpPTAscz0wLGE9MDtyZXR1cm4gZT50aGlzLmNhbnZhc1dpZHRoL3RoaXMuY2FudmFzSGVpZ2h0PyhhPXRoaXMuY2FudmFzSGVpZ2h0LHM9ZSphLGk9MCxuPSh0aGlzLmNhbnZhc1dpZHRoLXMpLzIpOihzPXRoaXMuY2FudmFzV2lkdGgsYT1zL2Usbj0wLGk9KHRoaXMuY2FudmFzSGVpZ2h0LWEpLzIpLFtuLGkscyxhXX0scGFpbnRCcmljayh0KXtjb25zdCBlPU1hdGguY2VpbCgxNSp0aGlzLnB1enpsZVNjYWxlKTt0LmJlZ2luUGF0aCgpLHQubW92ZVRvKHRoaXMucGluWCx0aGlzLnBpblkpLHQubGluZVRvKHRoaXMucGluWCtlLHRoaXMucGluWSksdC5hcmNUbyh0aGlzLnBpblgrZSx0aGlzLnBpblktZS8yLHRoaXMucGluWCtlK2UvMix0aGlzLnBpblktZS8yLGUvMiksdC5hcmNUbyh0aGlzLnBpblgrZStlLHRoaXMucGluWS1lLzIsdGhpcy5waW5YK2UrZSx0aGlzLnBpblksZS8yKSx0LmxpbmVUbyh0aGlzLnBpblgrZStlK2UsdGhpcy5waW5ZKSx0LmxpbmVUbyh0aGlzLnBpblgrZStlK2UsdGhpcy5waW5ZK2UpLHQuYXJjVG8odGhpcy5waW5YK2UrZStlK2UvMix0aGlzLnBpblkrZSx0aGlzLnBpblgrZStlK2UrZS8yLHRoaXMucGluWStlK2UvMixlLzIpLHQuYXJjVG8odGhpcy5waW5YK2UrZStlK2UvMix0aGlzLnBpblkrZStlLHRoaXMucGluWCtlK2UrZSx0aGlzLnBpblkrZStlLGUvMiksdC5saW5lVG8odGhpcy5waW5YK2UrZStlLHRoaXMucGluWStlK2UrZSksdC5saW5lVG8odGhpcy5waW5YLHRoaXMucGluWStlK2UrZSksdC5saW5lVG8odGhpcy5waW5YLHRoaXMucGluWStlK2UpLHQuYXJjVG8odGhpcy5waW5YK2UvMix0aGlzLnBpblkrZStlLHRoaXMucGluWCtlLzIsdGhpcy5waW5ZK2UrZS8yLGUvMiksdC5hcmNUbyh0aGlzLnBpblgrZS8yLHRoaXMucGluWStlLHRoaXMucGluWCx0aGlzLnBpblkrZSxlLzIpLHQubGluZVRvKHRoaXMucGluWCx0aGlzLnBpblkpfSxtYWtlSW1nV2l0aENhbnZhcygpe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKSxlPXQuZ2V0Q29udGV4dChcIjJkXCIpO3Qud2lkdGg9dGhpcy5jYW52YXNXaWR0aCx0LmhlaWdodD10aGlzLmNhbnZhc0hlaWdodCxlLmZpbGxTdHlsZT1gcmdiKCR7dGhpcy5nZXRSYW5kb20oMTAwLDI1NSl9LCR7dGhpcy5nZXRSYW5kb20oMTAwLDI1NSl9LCR7dGhpcy5nZXRSYW5kb20oMTAwLDI1NSl9KWAsZS5maWxsUmVjdCgwLDAsdGhpcy5jYW52YXNXaWR0aCx0aGlzLmNhbnZhc0hlaWdodCk7Zm9yKGxldCBuPTA7bjwxMjtuKyspaWYoZS5maWxsU3R5bGU9YHJnYigke3RoaXMuZ2V0UmFuZG9tKDEwMCwyNTUpfSwke3RoaXMuZ2V0UmFuZG9tKDEwMCwyNTUpfSwke3RoaXMuZ2V0UmFuZG9tKDEwMCwyNTUpfSlgLGUuc3Ryb2tlU3R5bGU9YHJnYigke3RoaXMuZ2V0UmFuZG9tKDEwMCwyNTUpfSwke3RoaXMuZ2V0UmFuZG9tKDEwMCwyNTUpfSwke3RoaXMuZ2V0UmFuZG9tKDEwMCwyNTUpfSlgLHRoaXMuZ2V0UmFuZG9tKDAsMik+MSllLnNhdmUoKSxlLnJvdGF0ZSh0aGlzLmdldFJhbmRvbSgtOTAsOTApKk1hdGguUEkvMTgwKSxlLmZpbGxSZWN0KHRoaXMuZ2V0UmFuZG9tKC0yMCx0LndpZHRoLTIwKSx0aGlzLmdldFJhbmRvbSgtMjAsdC5oZWlnaHQtMjApLHRoaXMuZ2V0UmFuZG9tKDEwLHQud2lkdGgvMisxMCksdGhpcy5nZXRSYW5kb20oMTAsdC5oZWlnaHQvMisxMCkpLGUucmVzdG9yZSgpO2Vsc2V7ZS5iZWdpblBhdGgoKTtjb25zdCBuPXRoaXMuZ2V0UmFuZG9tKC1NYXRoLlBJLE1hdGguUEkpO2UuYXJjKHRoaXMuZ2V0UmFuZG9tKDAsdC53aWR0aCksdGhpcy5nZXRSYW5kb20oMCx0LmhlaWdodCksdGhpcy5nZXRSYW5kb20oMTAsdC5oZWlnaHQvMisxMCksbixuKzEuNSpNYXRoLlBJKSxlLmNsb3NlUGF0aCgpLGUuZmlsbCgpfXJldHVybiB0LnRvRGF0YVVSTChcImltYWdlL3BuZ1wiKX0sc3VibWl0KCl7dGhpcy5pc1N1Ym10aW5nPSEwO2NvbnN0IHQ9TWF0aC5hYnModGhpcy5waW5YLSh0aGlzLnN0eWxlV2lkdGgtdGhpcy5zbGlkZXJCYXNlU2l6ZSkrKHRoaXMucHV6emxlQmFzZVNpemUtdGhpcy5zbGlkZXJCYXNlU2l6ZSkqKCh0aGlzLnN0eWxlV2lkdGgtdGhpcy5zbGlkZXJCYXNlU2l6ZSkvKHRoaXMuY2FudmFzV2lkdGgtdGhpcy5zbGlkZXJCYXNlU2l6ZSkpLTMpO3Q8dGhpcy5yYW5nZT8odGhpcy5pbmZvVGV4dD10aGlzLnN1Y2Nlc3NUZXh0LHRoaXMuaW5mb0JveEZhaWw9ITEsdGhpcy5pbmZvQm94U2hvdz0hMCx0aGlzLmlzQ2FuU2xpZGU9ITEsdGhpcy5pc1N1Y2Nlc3M9ITAsY2xlYXJUaW1lb3V0KHRoaXMudGltZXIxKSx0aGlzLnRpbWVyMT1zZXRUaW1lb3V0KCgoKT0+e3RoaXMuaXNTdWJtdGluZz0hMSx0aGlzLiRlbWl0KFwic3VjY2Vzc1wiLHQpfSksODAwKSk6KHRoaXMuaW5mb1RleHQ9dGhpcy5mYWlsVGV4dCx0aGlzLmluZm9Cb3hGYWlsPSEwLHRoaXMuaW5mb0JveFNob3c9ITAsdGhpcy5pc0NhblNsaWRlPSExLHRoaXMuJGVtaXQoXCJmYWlsXCIsdCksY2xlYXJUaW1lb3V0KHRoaXMudGltZXIxKSx0aGlzLnRpbWVyMT1zZXRUaW1lb3V0KCgoKT0+e3RoaXMuaXNTdWJtdGluZz0hMSx0aGlzLnJlc2V0KCl9KSw4MDApKX0scmVzZXRTdGF0ZSgpe3RoaXMuaW5mb0JveEZhaWw9ITEsdGhpcy5pbmZvQm94U2hvdz0hMSx0aGlzLmlzQ2FuU2xpZGU9ITEsdGhpcy5pc1N1Y2Nlc3M9ITEsdGhpcy5zdGFydFdpZHRoPXRoaXMuc2xpZGVyQmFzZVNpemUsdGhpcy5zdGFydFg9MCx0aGlzLm5ld1g9MH0scmVzZXQoKXt0aGlzLmlzU3VibXRpbmd8fCh0aGlzLnJlc2V0U3RhdGUoKSx0aGlzLmluaXQoKSl9fX0scz1uKDM3OSksYT1uLm4ocyksbz1uKDc5NSkscj1uLm4obyksaD1uKDU2OSksbD1uLm4oaCksYz1uKDU2NSksZD1uLm4oYyksdT1uKDIxNikscD1uLm4odSksZj1uKDU4OSksZz1uLm4oZiksdj1uKDM1OCksYj17fTtiLnN0eWxlVGFnVHJhbnNmb3JtPWcoKSxiLnNldEF0dHJpYnV0ZXM9ZCgpLGIuaW5zZXJ0PWwoKS5iaW5kKG51bGwsXCJoZWFkXCIpLGIuZG9tQVBJPXIoKSxiLmluc2VydFN0eWxlRWxlbWVudD1wKCksYSgpKHYuWixiKSx2LlomJnYuWi5sb2NhbHMmJnYuWi5sb2NhbHM7dmFyIG09ZnVuY3Rpb24odCxlLG4saSxzLGEsbyxyKXt2YXIgaCxsPVwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/dC5vcHRpb25zOnQ7aWYoZSYmKGwucmVuZGVyPWUsbC5zdGF0aWNSZW5kZXJGbnM9W2Z1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXQuJGNyZWF0ZUVsZW1lbnQsbj10Ll9zZWxmLl9jfHxlO3JldHVybiBuKFwiZGl2XCIse3N0YXRpY0NsYXNzOlwibG9hZGluZy1naWZfXCJ9LFtuKFwic3BhblwiKSx0Ll92KFwiIFwiKSxuKFwic3BhblwiKSx0Ll92KFwiIFwiKSxuKFwic3BhblwiKSx0Ll92KFwiIFwiKSxuKFwic3BhblwiKSx0Ll92KFwiIFwiKSxuKFwic3BhblwiKV0pfV0sbC5fY29tcGlsZWQ9ITApLGgpaWYobC5mdW5jdGlvbmFsKXtsLl9pbmplY3RTdHlsZXM9aDt2YXIgYz1sLnJlbmRlcjtsLnJlbmRlcj1mdW5jdGlvbih0LGUpe3JldHVybiBoLmNhbGwoZSksYyh0LGUpfX1lbHNle3ZhciBkPWwuYmVmb3JlQ3JlYXRlO2wuYmVmb3JlQ3JlYXRlPWQ/W10uY29uY2F0KGQsaCk6W2hdfXJldHVybntleHBvcnRzOnQsb3B0aW9uczpsfX0oZSx0KTttLm9wdGlvbnMuX19maWxlPVwic3JjL2FwcC52dWVcIjt2YXIgeD1tLmV4cG9ydHN9KCksaX0oKX0pKTsiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9
//# sourceURL=webpack-internal:///./node_modules/vue-puzzle-vcode/dist/main.js

在响应式网站下,使用rem的font-size会随之改变,验证码的图片会乱跑,在使用验证码组件的地方加一下css,使用原本初始值的font-size; 

.vue-puzzle-vcode {
    font-size: initial;
}
GitHub 加速计划 / vu / vue
207.55 K
33.66 K
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:3 个月前 )
73486cb5 * chore: fix link broken Signed-off-by: snoppy <michaleli@foxmail.com> * Update packages/template-compiler/README.md [skip ci] --------- Signed-off-by: snoppy <michaleli@foxmail.com> Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 5 个月前
e428d891 Updated Browser Compatibility reference. The previous currently returns HTTP 404. 6 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐