diff --git a/css/base.css b/css/base.css index 40992581..b1b2d9aa 100644 --- a/css/base.css +++ b/css/base.css @@ -2575,7 +2575,7 @@ ul.tabbar li.active > a { .material-icons.big { font-size: 2.2rem; } -.material-icons.bigger { +.material-icons.x-big { font-size: 3rem; } .material-icons.huge { @@ -2585,13 +2585,26 @@ ul.tabbar li.active > a { display: inline-block; position: relative; } -.composed-material i:nth-child(2) { +.composed-material .second { position: absolute; font-size: 85%; top: 7%; left: 39%; font-weight: bold; } +.composed-material .second-small { + position: absolute; + font-size: 62%; + top: 14%; + left: 30%; + font-weight: bold; +} + +/* White outline */ +.material-icons.outline { + position: relative; + text-shadow: -1px 1px #FFF, 1px 1px #FFF, 1px -1px #FFF, -1px -1px #FFF; +} #self-avatar .material-icons { font-size: 2.4rem; diff --git a/css/base.min.css b/css/base.min.css index ebb5f232..5120a5dc 100644 --- a/css/base.min.css +++ b/css/base.min.css @@ -1 +1 @@ -*{box-sizing:border-box;font-family:Roboto,Arial,sans-serif;margin:0;padding:0;scrollbar-color:#0000004d #ffffff1a;scrollbar-width:thin;text-rendering:optimizeLegibility}body,html{background-color:silver;box-shadow:inset 0 10rem #3949ab;color:#666;font-size:10pt;height:100%;overflow:hidden;width:100%}tt{font-family:Roboto Mono,Courier,monospace}a{color:#2196f3;text-decoration:none}a:focus,a:hover{color:#0a6ebd;text-decoration:underline}a.danger{color:#d32f2f}a.danger:focus,a.danger:hover{color:#f44336}a.gray:focus,a.gray:hover{color:#999}form{line-height:1.5;padding:.5rem .75rem}form,label{font-size:1.1rem}label{margin-right:auto}label.small{color:#1e88e5;font-size:.95rem}label.large{color:#1e88e5;font-size:1.1rem}img.avatar{border-radius:50%;height:100%;width:100%}button{border:1px solid #0000;border-radius:4px;box-shadow:0 1px 3px 0 #00000040;cursor:pointer;display:inline-block;font-family:inherit;font-size:1.05rem;font-weight:400;height:2.2rem;line-height:2.2rem;margin:0 .35rem;min-width:5rem;padding-left:1.2rem;padding-right:1.2rem;text-align:center;text-transform:uppercase;touch-action:manipulation;vertical-align:middle;white-space:nowrap}button[disabled],html input[disabled]{box-shadow:none;cursor:default;filter:grayscale(50%);opacity:.65}button.round{border-radius:50%;box-shadow:0 2px .5rem 0 #00000040;height:3rem;line-height:3.5rem;margin:0;outline:none;padding:0;width:3rem;z-index:2}button.round.small{box-shadow:0 2px .35rem 0 #00000040;height:2rem;line-height:2rem;width:2rem}button:active:not([disabled]),button:hover:not([disabled]){color:#fff}button:active{box-shadow:inset 0 3px .5rem rgba(0,0,0,.125)}button:active.round.small{box-shadow:inset 0 2px .35rem rgba(0,0,0,.125)}button.primary{background-color:#1e88e5;color:#fff}button.primary:active:not([disabled]),button.primary:hover:not([disabled]){background-color:#2962ff}button.secondary{background-color:#fff;color:#2196f3}button.secondary:active:not([disabled]),button.secondary:hover:not([disabled]){background-color:#e3f2fd}button.outline{background-color:initial;border:1px solid silver;box-shadow:none;color:#2196f3}button.outline:active:not([disabled]),button.outline:hover:not([disabled]){background-color:#e8eaf6}button.danger{background-color:#ec6560;color:#fff}button.danger:active:not([disabled]),button.danger:hover:not([disabled]){background-color:#f77}button.positive{background-color:#71c46f;color:#fff}button.positive:active:not([disabled]),button.positive:hover:not([disabled]){background-color:#7fed7f}input,textarea{background:#0000;border:none;color:#666;font-family:inherit;font-size:1.1rem;margin:.25rem 0;outline:none;padding:0 .125rem}input[type=email],input[type=password],input[type=search],input[type=tel],input[type=text],textarea{border-bottom:1px solid #ccc;box-shadow:0 1px 0 #0000001a;height:2.5rem;transition:all .1s ease-in-out,height 0s}input[type=email],input[type=password],input[type=tel],input[type=text],textarea{width:100%}input[type=email]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,textarea:focus{border-bottom:1px solid #2196f3;box-shadow:0 1px 0 #2196f340}input[type=email].invalid,input[type=password].invalid,input[type=search].invalid,input[type=tel].invalid,input[type=text].invalid,textarea.invalid{border-bottom:1px solid #e57373;box-shadow:0 1px 0 #e5737340}input[type=email]::placeholder,input[type=password]::placeholder,input[type=search]::placeholder,input[type=tel]::placeholder,input[type=text]::placeholder,textarea::placeholder{color:#bbb;font-weight:lighter}input[type=password].with-visibility,input[type=text].with-visibility{margin-right:-2rem;padding-right:2rem}textarea{padding-top:.45rem;resize:none}textarea.inplace-edit{font-size:unset;height:unset}::-webkit-scrollbar{width:.6rem}::-webkit-scrollbar-track{background-color:#ffffff1a;-webkit-box-shadow:inset 0 0 6px #0003;box-shadow:inset 0 0 6px #0003}::-webkit-scrollbar-thumb{background-color:#0000004d}ul.menu{background-color:#fff;border-radius:.2rem;box-shadow:0 1px 6px #00000073;list-style:none;padding-bottom:.35rem;padding-top:.35rem;position:absolute;width:12rem;z-index:4}ul.menu>li{cursor:pointer;padding:.75rem .75rem .75rem 1.25rem}ul.menu>li:hover{background-color:#f5f5f5}ul.menu>li.separator{height:1px;margin:2px;padding:0}ul.menu>li.separator,ul.menu>li.separator:hover{background-color:#ccc}ul.menu>li.disabled{opacity:.6;pointer-events:none}.menuTrigger{background-color:inherit;border-radius:.7rem;height:1.4rem;line-height:1.4rem;opacity:0;position:absolute;right:.25rem;text-align:center;width:1.4rem}.menuTrigger a{color:#757575}li .menuTrigger{top:.25rem}li:hover .menuTrigger{opacity:.9}li:hover .menuTrigger a{color:#757575}div.alert-container{align-items:center;background:#f0f0f0d9;display:flex;height:100%;justify-content:center;overflow:hidden;padding:1rem;position:absolute;width:100%;z-index:3}div.alert{background-color:#fff;border-radius:.3rem;box-shadow:.15rem .15rem 1.5rem #00000073;height:min-content;margin:auto 2rem;max-height:40rem;max-width:24rem;min-width:16rem;overflow:hidden;padding:1rem;position:relative;width:fit-content}div.alert-container .title{color:#2196f3;font-size:1.2rem;font-weight:500;padding:0 0 .35rem;position:relative;width:100%}div.alert-container .title.with-control{align-items:center;display:flex;flex:none;justify-content:space-between;padding:.5rem .5rem 0;position:relative}div.alert-container .content{padding:.5rem 0;position:relative}div.trusted-badge{margin:.25rem 0}.blue{color:#2196f3!important}.lt-blue{color:#64b5f6!important}.verified-color{color:#03a9f4!important}.staff-color{color:#689f38!important}.danger-color{color:#ffc107!important}.green{color:#388e3c}.white{color:#fff!important}.red{color:#d32f2f!important}.badge-inv{color:#fffd!important}.gray{color:#757575!important}.light-gray{color:#bbb!important}.large{font-size:120%}.small{font-size:90%}.float-right{position:absolute;right:.5rem}.hr{background-color:#f0f0f0;box-shadow:inset 0 .25rem .25rem -.25rem #00000026,inset 0 -.25rem .25rem -.25rem #00000026;display:block;height:.45rem;min-height:.3rem;width:100%}.hr.thin{height:.015rem}.ellipsized{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.flat-button{align-items:center;background-color:#fff;display:flex;font-weight:400;height:2em;line-height:2em;margin:.15rem .35rem;text-align:center;text-transform:uppercase;touch-action:manipulation;vertical-align:middle;white-space:nowrap;z-index:1}.flat-button:focus,.flat-button:hover{text-decoration:none}.flat-button.faux{background-color:#eee;border:1px solid #999;border-radius:3px;display:inline-block;height:1.4em;line-height:1.4em;margin:.15rem;padding:0 .35rem;text-transform:none}.action-button{background-color:#fafafa;border-radius:50%;bottom:1rem;box-shadow:0 2px .5rem 0 #00000040;color:#999;display:block;font-size:1.8rem;height:3.25rem;margin:0;min-height:unset;min-width:unset;outline:none;padding:0;position:absolute;right:1rem;transition:all .15s;width:3.25rem;z-index:2}.action-button:focus,.action-button:hover{background-color:#f0f0f0;color:#888}.action-button:active{background-color:#eee;color:#777}.action-button.hidden{bottom:2.625rem;font-size:1px;height:1px;line-height:1px;opacity:0;right:2.625rem;width:1px}.group-focus{outline:none}#mountPoint{height:100%;padding-bottom:1rem;padding-top:1rem}#noscript-message{background-color:#fff;border-radius:.25rem;box-shadow:1px 2px .3rem gray;display:flex;flex-direction:column;margin-left:auto;margin-right:auto;margin-top:5rem;max-width:30rem;overflow:hidden;position:relative}#noscript-title{background-color:#2196f3;color:#bbdefb;font-size:120%;font-weight:bolder;padding:1rem}#noscript-content{padding:1rem}#app-container{background-color:#fff;border-radius:.25rem;box-shadow:1px 2px .3rem gray;display:flex;height:100%;margin-left:auto;margin-right:auto;max-width:84rem;overflow:hidden;position:relative}#sidepanel{flex-grow:0;flex-shrink:0.3;min-width:18rem;width:24rem}#sidepanel,#topic-view{display:flex;flex-direction:column;height:100%;position:relative}#topic-view{overflow-x:hidden;width:100%}#info-view{display:flex;flex-direction:column;flex-grow:0;flex-shrink:0.3;height:100%;min-width:18rem;width:24rem}.center-medium-text{align-items:center;display:flex;font-size:1.4rem;height:100%;justify-content:center;text-align:center;width:100%}.nodisplay{display:none!important}.quoted{margin-left:1rem}.space-right{margin-right:.25rem}.rounded-container{background-color:#fafafa;border-radius:.1rem;margin:.25rem;padding:.25rem;position:relative}.in-place-edit{border-bottom:1px dashed #ddd;cursor:pointer;display:inline-block;font-family:inherit;font-size:1rem;margin:.25rem .125rem 0;vertical-align:initial;width:100%}.in-place-edit.short{font-size:1.1rem;height:2.5rem;line-height:2.25}.in-place-edit.disabled{border-bottom:none;color:#888;cursor:default}.in-place-edit.placeholder{color:#bbb}.in-place-edit span{display:inline-block}.in-place-edit.short span{display:block;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}table.permission-editor{width:100%}table.permission-editor td{font-size:1.1rem;margin:.35rem 0;vertical-align:middle}table.permission-editor td.checkbox{color:#999;text-align:center}.permission-editor .material-icons{font-size:1.3rem;line-height:1.3rem}.material-icons.clickable{border-bottom:none;cursor:pointer}.clickable{border-bottom:1px dashed #ddd}.clean-clickable,.clickable,.image-clickable{cursor:pointer}.panel-title{font-size:1.4rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.panel-title.deleted{text-decoration:line-through}.caption-panel{box-shadow:0 1px 2px gray;flex:none;height:4rem;overflow-x:hidden;white-space:nowrap;z-index:1}.caption-panel,.dialog-buttons{align-items:center;display:flex;padding:.5rem}.dialog-buttons{justify-content:flex-end}.dialog-buttons button{margin:0 .5rem}.avatar-box{flex-grow:0;flex-shrink:0;position:relative}.bot-form{display:flex;flex-direction:column;line-height:2rem;min-width:8rem;overflow:hidden}.bot-form div{min-height:2rem;vertical-align:middle}.bot-form button{background-color:#eef;color:#2196f3;display:inline-block;font-size:inherit;height:2rem;line-height:2rem;margin:.15rem;text-transform:none}.bot-form>div>button{width:auto}.bot-form button:active,.bot-form button:focus,.bot-form button:hover{background-color:#e3f2fd;outline:0}#side-caption-panel{background-color:#2196f3;color:#bbdefb}#side-caption-panel a{color:#bbdefb;line-height:1;padding-left:.5rem}#side-caption-panel :hover{color:#fff}#sidepanel-title{margin-left:.5rem;margin-right:auto}#self-avatar{border-radius:50%;flex:none;height:3rem;min-width:3rem;width:3rem}#self-avatar.avatar-box{font-size:1.8rem}#settings-form ul{list-style:none}#settings-form li{vertical-align:middle}#settings-form label{display:inline-block;padding-left:.5rem}input#host-name{width:100%}input.search{text-indent:1.4rem}i.search{left:.6rem;position:absolute}.info-box{display:none;overflow:hidden;padding:1rem 1.5rem .75rem .5rem;position:relative}.info-box>span{line-height:1.35rem}.info-box .cancel{position:absolute;right:.25rem;top:.5rem}.info-box.error{background-color:#ffcdd2;border-bottom:1px solid #ffbfc8;color:#b71c1c;display:flex}.info-box.warning{background-color:#fff9c4;border-bottom:1px solid #fff59d;color:#6d4c41;display:flex}.info-box.info{background-color:#e1f5fe;border-bottom:1px solid #b3e5fc;color:#0288d1;display:flex}.info-box .cancel .material-icons{color:#757575;font-size:1rem}.info-box.error .cancel .material-icons{color:#b71c1c}.info-box .icon{display:block;margin-right:.5rem}.info-box .icon .material-icons{font-size:1.5rem}.info-box.warning .icon .material-icons{color:#fbc02d}.info-box.error .icon .material-icons{color:#ef5350}.info-box.info .icon .material-icons{color:#0288d1}.flex-column{display:flex;flex-direction:column;height:100%;overflow-x:hidden}.flex-column.narrow{height:auto}.scrollable-panel{height:100%;margin-bottom:auto;margin-top:.25rem;overflow-x:hidden;overflow-y:auto;scroll-behavior:smooth}.contact-box{list-style:none;overflow-x:hidden}.contact-box>li{background:linear-gradient(90deg,#0000 3.5rem,#eee 1px,#eee) 0 100% /100% 1px no-repeat,#fff;cursor:pointer;display:flex;flex-grow:0;flex-shrink:0;min-height:3.75rem;overflow-x:hidden;padding:.35rem .25rem .5rem .35rem;position:relative}.contact-box.small>li{min-height:2.5rem;padding:.25rem .25rem .35rem .35rem}.contact-box>li:last-child{background:#fff}.contact-box>li:hover{background-color:#eceff1}.contact-box>li.selected{background-color:#cfd8dc}.contact-box>li.action{border-bottom:none;min-height:2.5rem}.contact-box .text-box{overflow-x:hidden}.contact-box .contact-title{font-size:1.05rem;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.contact-box .contact-title.deleted{opacity:.66;text-decoration:line-through;text-decoration-thickness:.5px}.contact-box .contact-comment{font-weight:lighter}.contact-box .contact-comment,.contact-box .contact-comment>span{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.contact-box .contact-comment b{font-weight:bolder}.contact-box .contact-comment .material-icons{color:#777;margin-bottom:.2rem}.contact-box .avatar-box{font-size:1.8rem;height:3rem;margin-right:.35rem;min-height:3rem;min-width:3rem;overflow:hidden;padding:0;position:relative;width:3rem}.contact-box .avatar{border-radius:50%;height:3rem;width:3rem}.contact-box.small .avatar-box{font-size:1.2rem;height:2rem;min-height:2rem;min-width:2rem;width:2rem}.contact-box.small .avatar{height:2rem;width:2rem}.avatar.deleted{filter:grayscale(1);opacity:.75}.contact-box .avatar-box>.material-icons{display:flex;flex-direction:column;font-size:2.4rem;justify-content:space-around;line-height:3rem}.contact-box.small .avatar-box>.material-icons{font-size:1.6rem;line-height:2rem}.contact-box .text-box{display:flex;flex-direction:column;justify-content:space-around}.contact-box .text-box>div{align-items:center;display:flex;flex-direction:row}.contact-box .action-text{cursor:pointer;font-size:.95rem;line-height:2.5rem;margin:0 auto;text-align:center}img.channel{height:1.25rem;margin-left:.3rem;vertical-align:middle;width:1.25rem}.large img.channel{height:1.45rem;margin-bottom:.15rem;margin-left:.5rem;width:1.45rem}.avatar-box .online,.offline{border-radius:50%;bottom:.1rem;flex-shrink:0;height:.75rem;min-height:.75rem;min-width:.75rem;position:absolute;right:0;width:.75rem}.avatar-box .online{background-color:#4caf50}.avatar-box .offline{background-color:silver}.online.typing{animation:typing .5s infinite}@keyframes typing{0%,to{transform:translateX(0)}50%{transform:translateX(-.3rem)}}.contact-box .checkmark.material-icons{border:0 solid #0000;color:#0097a7;overflow:visible;padding-left:.5px}.contact-box .checkmark.material-icons,.contact-box .deleted.material-icons{background-color:#fff;bottom:0;font-size:1.5rem;height:1.5rem;position:absolute;right:0;width:1.5rem}.contact-box .deleted.material-icons{color:#999}#add-topic{bottom:1rem;position:absolute;right:1rem}.panel-form{display:flex;flex-direction:column;padding:0;position:relative}.panel-form-row{align-items:center;flex-shrink:0}.panel-form-column,.panel-form-row{display:flex;flex-grow:0;line-height:1.5;padding:.5rem .75rem;position:relative}.panel-form-column{flex-direction:column;overflow-x:hidden}.panel-form-column>.panel-form-column,.panel-form-row>.panel-form-column{flex-grow:1;padding:0!important}.panel-form-column>.panel-form-row,.panel-form-row>.panel-form-row{padding:0!important}.panel-form-column>.group{margin-bottom:.25rem;margin-top:.25rem}.avatar-upload{display:flex;flex-direction:column;flex-shrink:0;font-size:4.5rem;height:10.5rem;padding:0;position:relative;width:10rem}.avatar-upload.read-only{height:auto}.avatar-upload .clear-avatar{background-image:radial-gradient(#fff 40%,#0000 75%);font-size:1rem;opacity:0;position:absolute;right:0;top:0}.avatar-upload:hover .clear-avatar{opacity:1}.avatar-upload .avatar-box{height:10rem;position:relative;width:10rem}.avatar-upload .avatar-box>.material-icons{font-size:4rem;line-height:10rem;position:relative;vertical-align:middle}.avatar-upload:after{clear:both;content:".";display:block;height:0;visibility:hidden}.avatar-upload .blank{border:1px dashed #999;color:#999;flex-shrink:0;font-size:1rem;line-height:10rem;text-align:center;vertical-align:middle}.avatar-upload .blank,.avatar-upload img.preview{border-radius:50%;height:10rem;overflow:hidden;width:10rem}.avatar-upload img.preview:before{background:50% no-repeat url(../img/broken_image.png);border-radius:50%;color:#666;content:" ";display:flex;font-size:.9rem;font-weight:lighter;height:10rem;justify-content:center;left:0;position:absolute;top:0;width:10rem}.avatar-upload .inputfile.hidden{height:.1px;opacity:0;overflow:hidden;position:absolute;width:.1px}.avatar-upload .inputfile+label.round{align-items:center;background-color:#fafafa;border-radius:50%;bottom:0;box-shadow:0 1px 4px #0006;cursor:pointer;display:flex;height:3rem;justify-content:center;line-height:3rem;position:absolute;right:0;width:3rem;z-index:1}.avatar-upload .inputfile:focus+label.round{outline:none}.avatar-upload .inputfile+label:hover,.avatar-upload .inputfile:focus+label{background-color:#e3f2fd;color:#42a5f5}#topic-caption-panel{background-color:#b0bec5}#topic-caption-panel a{color:#757575;text-decoration:none}#topic-caption-panel :hover{color:#000}#topic-caption-panel .avatar-box{font-size:1.8rem;height:3rem;margin-right:.35rem;min-width:3rem;position:relative;width:3rem}#topic-caption-panel .avatar-box>.material-icons{font-size:2.4rem;line-height:3rem}#topic-title-group{overflow-x:hidden}#hide-message-view{display:block;margin-right:.35rem}#topic-users{margin-left:auto;margin-right:1rem;width:min-content}#topic-users .avatar-box{display:inline-block;font-size:1rem;height:1.8rem;margin-right:.2rem;min-height:1.8rem;min-width:1.8rem;width:1.8rem}#topic-users .avatar-box>.material-icons{font-size:1.4rem;line-height:1.8rem}#topic-users>span{line-height:2rem;vertical-align:top}#messages-panel{background-color:#eceff1;background-image:url(../img/bg_messages.png);height:100%;overflow-y:scroll;padding:.75rem;position:relative}#messages-container{height:100%;overflow-y:hidden;position:relative}#write-only-background{background-image:repeating-linear-gradient(45deg,#ffffff80,#ffffff80 .5rem,#fffc 0,#fffc 1rem);height:100%;left:0;position:absolute;top:0;width:100%}#write-only-note{height:auto;top:50%;transform:translate(-50%,-50%);width:auto}#peer-messaging-disabled-note,#write-only-note{background-color:#fff;border-radius:.5rem;box-shadow:0 1px .5px #0000001f;color:#666;left:50%;line-height:2rem;padding:.75rem 1.25rem;position:absolute;text-align:center}#peer-messaging-disabled-note{bottom:4.3rem;transform:translate(-50%);width:fit-content}#send-message-panel{align-items:center;background-color:#eceff1;display:flex;flex:none;min-height:4rem;padding:.4rem .4rem .4rem .6rem;z-index:2}#send-message-panel #writing-disabled{font-size:1.2rem;text-align:center;width:100%}#send-message-wrapper{background-color:#eceff1;box-shadow:0 -2px 3px -1px #0000001a;z-index:2}#sendMessage{overflow:hidden;overflow-wrap:break-word}#send-message-panel .material-icons{font-size:1.6rem;min-width:2rem}#send-message-panel .material-icons.secondary,.material-icons.disabled{color:#999!important}#send-message-panel .material-icons.secondary:hover{color:#2196f3!important}#send-message-input{max-height:6rem;min-height:2.5rem;overflow:hidden auto}.accept-invite-panel{background-color:#eceff1;box-shadow:0 -2px 3px -1px #0000001a;width:100%;z-index:1}.accept-invite-panel .title{font-size:1.2rem;padding:.75rem}.accept-invite-panel .footer{background-color:#fafafa;padding-bottom:.35rem;text-align:center;white-space:nowrap}.accept-invite-panel button{border:1px solid #0000;box-shadow:0 1px 2px 0 #00000040;font-size:1rem;height:2em;line-height:2em;margin:.25rem}#dummy-view{align-items:center;background-color:#e0f7fa;display:flex;height:100%;justify-content:center;width:100%}#dummy-view a{display:block;text-align:center;text-decoration:none}#image-preview{background-color:#ffffffe6;display:flex;flex-direction:column;height:100%;left:0;position:absolute;top:0;width:100%;z-index:2}#image-preview-caption-panel{background-color:#eceff1;box-shadow:0 1px 2px silver;display:flex;height:4.6rem;justify-content:space-between;line-height:2.5rem;padding:1rem .75rem 0;z-index:3}#image-preview-caption-panel a{color:#757575;text-decoration:none}#image-preview-caption-panel a:hover{color:#000}#image-preview-container{align-items:center;display:flex;height:100%;justify-content:space-around;overflow:hidden;width:100%}#image-preview-footer{background-color:#eceff1;box-shadow:0 -2px 3px -1px #0000001a;display:flex;height:3.2rem;justify-content:space-around;line-height:1.5rem;z-index:1}#image-preview-container .material-icons{font-size:6rem}#video-container{background-color:#ffffffe6;flex-direction:column;height:100%;justify-content:space-between;left:0;top:0}#video-container,.controls{display:flex;position:absolute;width:100%}.controls{align-items:center;bottom:2.5rem;column-gap:1rem;justify-content:center;z-index:1}.incoming-call .controls{bottom:1rem}.controls button{border-radius:50%;box-shadow:0 3px 6px 0 #00000040;height:4rem;min-width:auto;width:4rem}#video-container-panel{height:100%;position:relative;width:100%}.call-party{background-color:#eee;border:2px solid #ccc;border-radius:.5rem;overflow:hidden}.call-party:hover{border:2px solid #2196f3}.call-party.peer{bottom:1rem;left:1rem;position:absolute;right:1rem;top:1rem;z-index:1}.call-party.self{bottom:.5rem;height:10rem;position:absolute;right:.5rem;width:10rem;z-index:2}.call-party.self[disabled]{display:none}video{height:100%;object-fit:contain;width:100%}.call-party.self video{transform:scaleX(-1)}.call-party[disabled] video{display:none}.caller-card{align-items:center;display:flex;flex-direction:column;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.caller-card .avatar-box{font-size:6rem;height:10rem;width:10rem}.caller-card.pulse .lettertile,.caller-card.pulse img.avatar{animation:active-call 1.5s linear infinite}.caller-card .avatar-box .material-icons{font-size:6rem;line-height:1.6}.call-party .caller-name{background-color:#ffffffb3;border-radius:.35rem;padding:.15rem .5rem;text-shadow:0 0 1px #fff;z-index:1}.call-party.self .caller-name.inactive{bottom:.25rem;position:absolute;right:.25rem}.caller-card .caller-name{font-size:larger;margin-top:.5rem}.caller-card .trusted-badge{display:inline-block}.call-party.peer .caller-name.inactive{bottom:.5rem;font-size:larger;left:1rem;margin:0 auto;position:absolute}.incoming-call{background-color:#fff;border-radius:.3rem;box-shadow:.15rem .15rem 1.5rem #00000073;margin:auto 2rem;max-width:24rem;min-width:16rem;position:relative;width:fit-content}.incoming-call .caller-card{align-items:center;display:flex;flex-direction:column;height:100%;justify-content:center;left:auto;padding:4rem 3.5rem 5.5rem;position:relative;top:auto;width:100%}.incoming-call .caller-name{background-color:#ffffffb3;border-radius:.35rem;padding:.15rem .5rem;text-shadow:0 0 1px #fff;z-index:1}.call-message{display:flex;flex-direction:row}.call-message .duration{font-weight:lighter}@keyframes active-call{0%{box-shadow:0 0 0 .1rem #2196f34d,0 0 0 .3rem #2196f34d,0 0 0 .5rem #2196f34d}to{box-shadow:0 0 0 .4rem #2196f34d,0 0 0 2rem #2196f300,0 0 0 3rem #2196f300}}.chat-box{list-style:none;margin:0 .5rem;padding:0 0 3.5rem;scroll-behavior:smooth}.chat-box.group{margin-left:-.4rem}.chat-box li{align-items:flex-end;display:flex;margin:0;padding:0}.chat-box .right{justify-content:flex-end}.bubble{border-radius:.5rem;color:#212121;display:flex;filter:drop-shadow(.5px .5px .7px rgb(0,0,0,.3));height:auto;margin:0;max-width:36rem;min-width:9rem;padding:.75rem .5rem;position:relative;text-align:left;transition:background-color .5s ease-out;transition-delay:.3s}.chat-box li.single{margin-bottom:.75rem;margin-top:.25rem}.chat-box li.first{margin-bottom:.15rem;margin-top:.25rem}.chat-box li.middle{margin-bottom:.15rem;margin-top:.15rem}.chat-box li.last{margin-bottom:.75rem;margin-top:.15rem}.left .bubble{background-color:#c5e1a5;margin-right:.5rem}.left.flash .bubble{background-color:#94a97c}.left .bubble.tip{border-bottom-left-radius:0}.right .bubble{background-color:#fafafa;margin-left:1.75rem}.right.flash .bubble{background-color:#ccc}.right .bubble.tip{border-bottom-right-radius:0}.chat-box .meta{justify-content:center;margin-bottom:.5rem;margin-top:.5rem}.chat-box .meta .bubble{color:#666;min-width:unset}.meta .bubble.deleted{background-color:#e3f2fd;padding:.75rem .75rem .5rem}.meta .bubble.date{background-color:#fffc;font-size:smaller;padding:.5rem;text-transform:uppercase}.left .bubble.tip:before{background-color:#c5e1a5;border-bottom-left-radius:.3rem;bottom:0;clip-path:polygon(100% 0,0 110%,100% 110%);-webkit-clip-path:polygon(100% 0,0 110%,100% 110%);content:"";height:.85rem;left:-.8rem;position:absolute;transition:background-color .5s ease-out;transition-delay:.3s;width:.85rem}.left.flash .bubble.tip:before{background-color:#94a97c}.right .bubble.tip:before{background-color:#fafafa;border-bottom-right-radius:.3rem;bottom:0;clip-path:polygon(0 0,100% 110%,0 110%);-webkit-clip-path:polygon(0 0,100% 110%,0 110%);content:"";height:.85rem;left:99.8%;position:absolute;transition:background-color .5s ease-out;transition-delay:.3s;width:.85rem}.right.flash .bubble.tip:before{background-color:#ccc}.chat-box .avatar-box{font-size:.8rem;height:1.4rem;margin-bottom:.8rem;margin-right:.8rem;min-height:1.4rem;min-width:1.4rem;position:relative;width:1.4rem}.bubble div.content-meta{width:100%}.bubble div.message-content{margin:0;max-width:36rem;overflow-wrap:anywhere;padding:0 .75rem;position:relative;width:100%}.bubble div.message-content:after{clear:both;content:".";display:block;height:0;visibility:hidden}.chat-box .timestamp-padding{display:inline-block;height:0;width:4rem}.chat-box .timestamp{float:right;position:relative;top:.35rem;user-select:none;white-space:nowrap}.chat-box .author,.chat-box .timestamp{color:#777;font-size:80%}.image-preview,.inline-image{border-radius:.1rem;overflow:hidden;position:relative}.inline-image{max-height:24rem;max-width:36rem}.inline-image>.rounded-container{border-left:.25rem solid #0000;border-right:.25rem solid #0000;bottom:2rem;margin:.25rem auto;position:relative}img.image-preview:before,img.inline-image:before{background:50% no-repeat #ccc url(../img/broken_image.png);color:#666;display:flex;font-size:.9rem;font-weight:lighter;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}img.inline-image:before{background-size:3rem 3rem;content:attr(alt)}img.image-preview:before{background-size:10rem 10rem;content:" "}.inline-image.video>img.inline-image:before,img.image-preview.video:before{background:50% no-repeat #ccc url(../img/broken_video.png)}.inline-image.video>img.inline-image:before{background-size:3rem 3rem}.inline-video{align-items:center;display:flex;justify-content:center;position:relative}.inline-video>img.inline-image:before{background:#ccc}.inline-video .duration{background-color:#ffffff80;border-radius:.3rem;bottom:.25rem;color:#333;font-size:80%;left:.25rem;padding:.25rem .5rem;position:absolute}.inline-video .play-control{align-items:center;background-color:#0006;border-radius:50%;cursor:pointer;display:flex;height:4rem;justify-content:center;pointer-events:none;position:absolute;width:4rem}.attachment{display:flex}.attachment:last-of-type{margin-bottom:-.45rem}#info-caption-panel{background-color:#b0bec5}#info-caption-panel a{color:#757575;line-height:1;text-decoration:none}#info-caption-panel :hover{color:#000}#info-title{margin-right:auto}#group-manager{display:flex;flex-direction:column;height:100%;overflow-y:hidden;position:relative}#group-manager-buttons{background-color:#eceff1;border-left:1px solid #ccc;box-shadow:0 -1px #0000001a;display:flex;height:4rem;justify-content:space-around;padding:.4rem;z-index:2}ul.tabbar{background:#eee;display:flex;flex-grow:0;flex-shrink:0;list-style:none;margin:0;overflow:hidden;padding:0 0 0 1rem;width:100%}ul.tabbar>li{box-shadow:inset 0 -2px 2.5px -1px #00000040;height:2.4rem;position:relative}ul.tabbar li.active{background:#fff}ul.tabbar li:after{background:#ccc;bottom:0;content:"";height:.1rem;left:0;position:absolute;width:100%}ul.tabbar li.active:after{animation:tabbar-border-expand .2s cubic-bezier(.4,0,.4,1) 0s alternate forwards;background:#2196f3;bottom:0;content:"";height:.15rem;left:0;position:absolute}@keyframes tabbar-border-expand{0%{opacity:0;width:0}to{opacity:1;width:100%}}ul.tabbar>li>a{color:#2196f399;font-size:1.3rem;font-variant:small-caps;font-weight:400;line-height:2.4rem;overflow:hidden;padding-left:1rem;padding-right:1rem;position:relative;text-align:center;text-decoration:none}ul.tabbar li.active>a{color:#2196f3}.unread{background-color:#0097a7;border-radius:50%;color:#fff;display:inline-block;font-size:.75rem;font-weight:bolder;height:1.35rem;line-height:1.45rem;margin-left:.5rem;text-align:center;vertical-align:middle;width:1.35rem}.material-icons.as-badge{color:#aaa;font-size:1.15rem;padding-left:.2rem}.badge{align-self:flex-start;background-color:#e8e8e8;border:1px solid silver;border-radius:.2rem;color:#666;display:inline-block;font-family:Roboto Mono,Courier,monospace,sans-serif;font-size:.8rem;margin:.05rem .1rem;padding:.05rem .25rem}.badge.green{background-color:#efe;border-color:#aca;color:#383}.badge.yellow{background-color:#ffe;border-color:#cc9;color:#660}.badge.blue{background-color:#eef;border-color:#aad;color:#339}.badge.red{background-color:#fee;border-color:#c99;color:#933}.badge.magenta{background-color:#fef;border-color:#c9c;color:#939}.lettertile{border-radius:50%;padding-bottom:100%;user-select:none;width:100%}.lettertile>div{align-items:center;border-radius:50%;bottom:0;color:#fafafacc;display:flex;flex-grow:0;flex-shrink:0;justify-content:center;left:0;line-height:1;padding-top:.1em;position:absolute;right:0;text-align:center;text-transform:uppercase;top:0}.lettertile:hover{color:#fff}.lettertile.disabled{opacity:.5}.lt-bg-0{background-color:#ef9a9a}.lt-bg-1{background-color:#90caf9}.lt-bg-2{background-color:#b0bec5}.lt-bg-3{background-color:#b39ddb}.lt-bg-4{background-color:#ffab91}.lt-bg-5{background-color:#a5d6a7}.lt-bg-6{background-color:#eee}.lt-bg-7{background-color:#e6ee9c}.lt-bg-8{background-color:#c5e1a5}.lt-bg-9{background-color:#f0e57d}.lt-bg-10{background-color:#f48fb1}.lt-bg-11{background-color:#9fa8da}.lt-bg-12{background-color:#ffe082}.lt-bg-13{background-color:#bcaaa4}.lt-bg-14{background-color:#80deea}.lt-bg-15{background-color:#ce93d8}.dk-bg-0{background-color:#c62828}.dk-bg-1{background-color:#ad1457}.dk-bg-2{background-color:#6a1b9a}.dk-bg-3{background-color:#4527a0}.dk-bg-4{background-color:#283593}.dk-bg-5{background-color:#1565c0}.dk-bg-6{background-color:#0277bd}.dk-bg-7{background-color:#00838f}.dk-bg-8{background-color:#00695c}.dk-bg-9{background-color:#2e7d32}.dk-bg-10{background-color:#558b2f}.dk-bg-11{background-color:#9e9d24}.dk-bg-12{background-color:#f9a825}.dk-bg-13{background-color:#ff8f00}.dk-bg-14{background-color:#ef6c00}.dk-bg-15{background-color:#d84315}.lt-fg-0{color:#ef9a9a!important}.lt-fg-1{color:#90caf9!important}.lt-fg-2{color:#b0bec5!important}.lt-fg-3{color:#b39ddb!important}.lt-fg-4{color:#ffab91!important}.lt-fg-5{color:#a5d6a7!important}.lt-fg-6{color:#eee!important}.lt-fg-7{color:#e6ee9c!important}.lt-fg-8{color:#c5e1a5!important}.lt-fg-9{color:#f0e57d!important}.lt-fg-10{color:#f48fb1!important}.lt-fg-11{color:#9fa8da!important}.lt-fg-12{color:#ffe082!important}.lt-fg-13{color:#bcaaa4!important}.lt-fg-14{color:#80deea!important}.lt-fg-15{color:#ce93d8!important}.dk-fg-0{color:#c62828!important}.dk-fg-1{color:#ad1457!important}.dk-fg-2{color:#6a1b9a!important}.dk-fg-3{color:#4527a0!important}.dk-fg-4{color:#283593!important}.dk-fg-5{color:#1565c0!important}.dk-fg-6{color:#0277bd!important}.dk-fg-7{color:#00838f!important}.dk-fg-8{color:#00695c!important}.dk-fg-9{color:#2e7d32!important}.dk-fg-10{color:#558b2f!important}.dk-fg-11{color:#9e9d24!important}.dk-fg-12{color:#f9a825!important}.dk-fg-13{color:#ff8f00!important}.dk-fg-14{color:#ef6c00!important}.dk-fg-15{color:#d84315!important}.material-icons{font-size:1.4rem;line-height:1;text-align:center;vertical-align:middle}.material-icons.small{font-size:1rem}.material-icons.medium{font-size:1.2rem}.material-icons.big{font-size:2.2rem}.material-icons.bigger{font-size:3rem}.material-icons.huge{font-size:4rem}.composed-material{display:inline-block;position:relative}.composed-material i:nth-child(2){font-size:85%;font-weight:700;left:39%;position:absolute;top:7%}#self-avatar .material-icons{font-size:2.4rem;line-height:3rem}.avatar-box .material-icons{border-radius:50%;color:#fafafacc;height:inherit;width:inherit}.chip-input{align-items:center;background:#0000;border-bottom:1px solid #ccc;box-shadow:0 1px 0 #0000001a;color:#666;cursor:text;display:flex;flex-grow:1;flex-wrap:wrap;font-size:1.1rem;font-weight:400;justify-content:flex-start;margin:.25rem 0;max-height:10rem;min-height:4rem;outline:none;overflow-y:scroll;text-align:center;transition:all .1s ease-in-out}.chip-input.focused{border-bottom:1px solid #2196f3;box-shadow:0 1px 0 #2196f340}.chip-input>input[type=text]{border:none;box-shadow:none;display:inline-block;flex:1 0 auto;min-width:4rem;width:auto}.chip,.chip-input>input[type=text]{height:1.8rem;line-height:1.8;margin:.125rem}.chip{align-items:center;background-color:#eee;border-radius:.9rem;display:flex;flex:0 0 auto;font-size:90%;max-width:12rem;overflow:hidden}.chip,.chip>span{text-overflow:ellipsis;white-space:nowrap}.chip>span{overflow-x:hidden}.chip.invalid{background-color:#fee;color:#c66}.chip>a{background-color:#aaa;border-radius:50%;color:#eee;display:inline-block;height:1.175rem;line-height:1.15;margin:.3rem;min-width:1.175rem;text-decoration:none;width:1.175rem}.chip>a:focus,.chip>a:hover{background-color:#bbb;color:#fff;text-decoration:none}.chip .avatar-box{font-size:1rem;height:1.8rem;margin-right:.2rem;min-height:1.8rem;min-width:1.8rem;position:relative;width:1.8rem}.chip .avatar-box .material-icons{font-size:1.4rem;line-height:1.8rem}.chip .spacer{display:inline-block;height:1.175rem;margin:.3rem;width:.25rem}.load-spinner-box{--size-small:2.5rem;--size-large:4rem;background-color:#fff;border-radius:50%;box-shadow:.1rem .1rem .15rem 1px #00000040;height:var(--size-small);left:0;margin-left:auto;margin-right:auto;padding:.25rem;position:absolute;right:0;top:5rem;width:var(--size-small);z-index:2}.load-spinner-box.large{height:var(--size-large);width:var(--size-large)}.load-spinner-box.clear{background-color:#fff8;-x-box-shadow:none;box-shadow:.1rem .1rem .15rem 1px #0000001f}.load-spinner-box.centered{top:calc(var(--size-small)/2 - .25rem)}.load-spinner-box.large.centered{top:calc(var(--size-large)/2 - .25rem)}.loader-spinner{animation:spin 1.5s linear infinite;border:.35rem solid #f3f3f3;border-radius:50%;border-top-color:#1e88e5;height:2rem;width:2rem}.load-spinner-box.large .loader-spinner{height:3.5rem;width:3.5rem}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.uploader{display:flex}.uploader>div{background-color:#cfd8dc;border-radius:.1rem;height:.6rem;line-height:0;margin:.35rem;padding:.15rem;position:relative;width:6rem}.uploader>div>span{background-color:#1e88e5;border-radius:.08rem;display:inline-block;height:.3rem}.highlight{color:teal;font-weight:bolder}.highlight .preview{color:#5f9ea0;font-weight:inherit}.cropper{align-self:center;height:21rem;margin:1rem auto auto;transform:translateZ(0)}.cropper,.cropper .bounding-box{border-radius:.25rem;position:relative;width:18rem}.cropper .bounding-box{background-color:#999;border:2px solid #1e88e5;box-shadow:1px 1px 3px grey;height:18rem;overflow:hidden;z-index:1}.cropper .preview{max-height:none;max-width:none;position:absolute;z-index:-1}.cropper .cutout{border:1px dashed #999;bottom:0;box-shadow:0 0 150rem 150rem #e6f6ffa8;height:17rem;left:0;margin:auto;position:absolute;right:0;top:0;width:17rem;z-index:0}.cropper .cutout.circle{border-radius:50%}.cropper .overlay{cursor:move;position:absolute;touch-action:none;z-index:1}.cropper .zoom-wrapper{height:2rem;margin:1rem auto;text-align:center;width:80%}.cropper .zoom{box-shadow:none;pointer-events:none;z-index:2}.cropper .zoom:focus{outline:none}.reply-quote{border-left:.25rem solid #039be5;border-radius:.25rem;color:#666;cursor:pointer;font-weight:lighter;line-height:1.5em;padding:.15rem .5rem .25rem;position:relative}.chat-box .bubble .reply-quote{margin:.15rem -.75rem .3rem}.chat-box .bubble .reply-quote:first-child{margin-top:-.25rem}.chat-box .left .reply-quote{background-color:#fff6}.chat-box .right .reply-quote{background-color:#8080801f}.reply-quote .inline-image{margin-bottom:.1rem;vertical-align:middle}.reply-quote img.inline-image:before{content:""}#reply-quote-preview{align-items:center;display:flex}#reply-quote-preview .reply-quote{background-color:#fafafa;cursor:auto;margin:.35rem .5rem 0 0;width:100%}#reply-quote-preview .cancel{min-width:2.4rem;text-align:center}#reply-quote-preview .inline-image{background-color:#ccc}#reply-quote-preview img.inline-image:before{content:""}#send-message-panel #reply-quote-preview{width:100%}#send-message-panel #reply-quote-preview .reply-quote{margin-bottom:.35rem}.forwarding-quote{font-size:200%;line-height:200%}.mention{font-weight:500}.forward-dialog{background-color:#fff;border-radius:.3rem;box-shadow:.15rem .15rem 1.5rem #00000073;height:80%;margin:auto 1rem;overflow:hidden;padding:.5rem;position:relative;width:24rem}.forward-dialog .scrollable-panel{height:80%}.audio{align-items:center;background-color:#eee;border-radius:1.5rem;display:flex;flex:none;height:3rem;margin-left:auto}.audio canvas{height:2.6rem;margin-right:2rem;width:14rem}.audio canvas.playback{margin-right:0}.audio .duration{font-size:large}.audio-player{align-items:center;display:flex}.audio-player .material-icons.large{color:#667575cc;font-size:2.4rem}.audio-player .material-icons.disabled{color:#999c;cursor:default}.audio-player .playback{height:2.6rem;width:14rem}.audio-player canvas.playback{display:block}.audio-player div.playback{align-items:center;color:#757575cc;display:flex;font-size:small;justify-content:center}.audio-player .timer{color:#666c;font-size:smaller}#pinned-wrapper{margin-right:1rem}#pinned-wrapper,.pinned{align-items:center;display:flex;height:100%;position:relative}.pinned{background-color:#fafafa;background-position:50%;border-radius:0 .25rem .25rem 0;color:#666;cursor:pointer;font-weight:lighter;min-width:0;padding:.15rem .5rem .25rem;transition:background .4s;width:24rem}.pinned>p{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned:hover{background-color:#fafdff}.pinned:active{background-color:#d8e8ff;transition:background 0s}.pinned-scroll{align-items:center;background-color:#eeee;border-radius:.25rem 0 0 .25rem;display:flex;flex-direction:column;height:100%;justify-content:space-evenly;margin-left:.35rem;padding:.1rem;position:relative}.pinned-scroll .dot{background-color:#999;border-radius:50%;height:.3rem;width:.3rem}.pinned-scroll .adot{background-color:#039be5;border-radius:50%;height:.45rem;width:.45rem}#pinned-wrapper .menuTrigger.upper{top:.25rem}#pinned-wrapper .menuTrigger.lower{bottom:.25rem}#pinned-wrapper:hover .menuTrigger{opacity:.9}#pinned-wrapper:hover .menuTrigger a{color:#757575}.drag-n-drop{align-items:center;background-color:#fffffff2;border:.15rem dashed grey;border-radius:1rem;bottom:1.5rem;color:grey;display:flex;font-size:2rem;justify-content:center;left:1.5rem;outline:.5rem solid #fffffff2;position:absolute;right:1.5rem;top:1.5rem;z-index:3}.country-flag{display:inline-block;font-size:larger}.dial-code{cursor:pointer;display:inline-block;margin-bottom:.15rem;vertical-align:middle;white-space:nowrap}ul.phone-country-selector{list-style:none;overflow-x:hidden}ul.phone-country-selector>li{cursor:pointer;font-weight:lighter;padding:.25rem .5rem .15rem;position:relative;width:100%}ul.phone-country-selector>li:hover{background-color:#eceff1}ul.phone-country-selector>li.selected{background-color:#cfd8dc}ul.phone-country-selector .dial-code{color:#1e88e5;font-weight:400;position:absolute;right:.5rem}ul.phone-country-selector span{display:inline-block}ul.phone-country-selector span.country{overflow-x:hidden;text-overflow:ellipsis}@media (min-width:1440px){#app-container{max-width:114rem}}@media (max-width:960px){#mountPoint{padding:0}.pinned{width:16rem}}@media (max-width:640px){#app-container{border-radius:0;box-shadow:none;width:100%}#info-view,#sidepanel{width:100%}.forward-dialog{border-radius:.3rem .3rem 0 0;margin:auto 0 0;width:100%}.menuTrigger{opacity:.3}#send-message-input{transition-property:-tinode-mobile}#pinned-wrapper{height:3.5rem;margin:.25rem}.pinned{width:unset}}.call-party-speaking{border:2px solid red}.call-party.carousel-item .caller-name.inactive{bottom:.25rem;position:absolute;right:.25rem}.call-party.carousel-item .muted{position:absolute;right:.25rem;top:.25rem}.avatar-box.carousel-item{height:45px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:45px}#carousel-wrapper{align-self:center;max-width:800px;padding-top:1rem;position:relative;width:100%}#carousel{overflow:auto;scroll-behavior:smooth;scrollbar-width:none}#carousel-next,#carousel-prev{align-content:center;background:#fff;border:none;border-radius:50%;cursor:pointer;display:flex;height:unset;justify-content:center;min-width:unset;outline:0;padding:8px;position:absolute}#carousel-prev{display:none;left:0;top:50%;transform:translate(50%,-50%)}#carousel-next{right:0;top:50%;transform:translate(-50%,-50%)}#carousel-content{grid-gap:16px;box-sizing:border-box;display:grid;grid-auto-flow:column;justify-content:center;margin:auto}.carousel-item{height:100px;position:relative;width:180px} \ No newline at end of file +*{box-sizing:border-box;font-family:Roboto,Arial,sans-serif;margin:0;padding:0;scrollbar-color:#0000004d #ffffff1a;scrollbar-width:thin;text-rendering:optimizeLegibility}body,html{background-color:silver;box-shadow:inset 0 10rem #3949ab;color:#666;font-size:10pt;height:100%;overflow:hidden;width:100%}tt{font-family:Roboto Mono,Courier,monospace}a{color:#2196f3;text-decoration:none}a:focus,a:hover{color:#0a6ebd;text-decoration:underline}a.danger{color:#d32f2f}a.danger:focus,a.danger:hover{color:#f44336}a.gray:focus,a.gray:hover{color:#999}form{line-height:1.5;padding:.5rem .75rem}form,label{font-size:1.1rem}label{margin-right:auto}label.small{color:#1e88e5;font-size:.95rem}label.large{color:#1e88e5;font-size:1.1rem}img.avatar{border-radius:50%;height:100%;width:100%}button{border:1px solid #0000;border-radius:4px;box-shadow:0 1px 3px 0 #00000040;cursor:pointer;display:inline-block;font-family:inherit;font-size:1.05rem;font-weight:400;height:2.2rem;line-height:2.2rem;margin:0 .35rem;min-width:5rem;padding-left:1.2rem;padding-right:1.2rem;text-align:center;text-transform:uppercase;touch-action:manipulation;vertical-align:middle;white-space:nowrap}button[disabled],html input[disabled]{box-shadow:none;cursor:default;filter:grayscale(50%);opacity:.65}button.round{border-radius:50%;box-shadow:0 2px .5rem 0 #00000040;height:3rem;line-height:3.5rem;margin:0;outline:none;padding:0;width:3rem;z-index:2}button.round.small{box-shadow:0 2px .35rem 0 #00000040;height:2rem;line-height:2rem;width:2rem}button:active:not([disabled]),button:hover:not([disabled]){color:#fff}button:active{box-shadow:inset 0 3px .5rem rgba(0,0,0,.125)}button:active.round.small{box-shadow:inset 0 2px .35rem rgba(0,0,0,.125)}button.primary{background-color:#1e88e5;color:#fff}button.primary:active:not([disabled]),button.primary:hover:not([disabled]){background-color:#2962ff}button.secondary{background-color:#fff;color:#2196f3}button.secondary:active:not([disabled]),button.secondary:hover:not([disabled]){background-color:#e3f2fd}button.outline{background-color:initial;border:1px solid silver;box-shadow:none;color:#2196f3}button.outline:active:not([disabled]),button.outline:hover:not([disabled]){background-color:#e8eaf6}button.danger{background-color:#ec6560;color:#fff}button.danger:active:not([disabled]),button.danger:hover:not([disabled]){background-color:#f77}button.positive{background-color:#71c46f;color:#fff}button.positive:active:not([disabled]),button.positive:hover:not([disabled]){background-color:#7fed7f}input,textarea{background:#0000;border:none;color:#666;font-family:inherit;font-size:1.1rem;margin:.25rem 0;outline:none;padding:0 .125rem}input[type=email],input[type=password],input[type=search],input[type=tel],input[type=text],textarea{border-bottom:1px solid #ccc;box-shadow:0 1px 0 #0000001a;height:2.5rem;transition:all .1s ease-in-out,height 0s}input[type=email],input[type=password],input[type=tel],input[type=text],textarea{width:100%}input[type=email]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,textarea:focus{border-bottom:1px solid #2196f3;box-shadow:0 1px 0 #2196f340}input[type=email].invalid,input[type=password].invalid,input[type=search].invalid,input[type=tel].invalid,input[type=text].invalid,textarea.invalid{border-bottom:1px solid #e57373;box-shadow:0 1px 0 #e5737340}input[type=email]::placeholder,input[type=password]::placeholder,input[type=search]::placeholder,input[type=tel]::placeholder,input[type=text]::placeholder,textarea::placeholder{color:#bbb;font-weight:lighter}input[type=password].with-visibility,input[type=text].with-visibility{margin-right:-2rem;padding-right:2rem}textarea{padding-top:.45rem;resize:none}textarea.inplace-edit{font-size:unset;height:unset}::-webkit-scrollbar{width:.6rem}::-webkit-scrollbar-track{background-color:#ffffff1a;-webkit-box-shadow:inset 0 0 6px #0003;box-shadow:inset 0 0 6px #0003}::-webkit-scrollbar-thumb{background-color:#0000004d}ul.menu{background-color:#fff;border-radius:.2rem;box-shadow:0 1px 6px #00000073;list-style:none;padding-bottom:.35rem;padding-top:.35rem;position:absolute;width:12rem;z-index:4}ul.menu>li{cursor:pointer;padding:.75rem .75rem .75rem 1.25rem}ul.menu>li:hover{background-color:#f5f5f5}ul.menu>li.separator{height:1px;margin:2px;padding:0}ul.menu>li.separator,ul.menu>li.separator:hover{background-color:#ccc}ul.menu>li.disabled{opacity:.6;pointer-events:none}.menuTrigger{background-color:inherit;border-radius:.7rem;height:1.4rem;line-height:1.4rem;opacity:0;position:absolute;right:.25rem;text-align:center;width:1.4rem}.menuTrigger a{color:#757575}li .menuTrigger{top:.25rem}li:hover .menuTrigger{opacity:.9}li:hover .menuTrigger a{color:#757575}div.alert-container{align-items:center;background:#f0f0f0d9;display:flex;height:100%;justify-content:center;overflow:hidden;padding:1rem;position:absolute;width:100%;z-index:3}div.alert{background-color:#fff;border-radius:.3rem;box-shadow:.15rem .15rem 1.5rem #00000073;height:min-content;margin:auto 2rem;max-height:40rem;max-width:24rem;min-width:16rem;overflow:hidden;padding:1rem;position:relative;width:fit-content}div.alert-container .title{color:#2196f3;font-size:1.2rem;font-weight:500;padding:0 0 .35rem;position:relative;width:100%}div.alert-container .title.with-control{align-items:center;display:flex;flex:none;justify-content:space-between;padding:.5rem .5rem 0;position:relative}div.alert-container .content{padding:.5rem 0;position:relative}div.trusted-badge{margin:.25rem 0}.blue{color:#2196f3!important}.lt-blue{color:#64b5f6!important}.verified-color{color:#03a9f4!important}.staff-color{color:#689f38!important}.danger-color{color:#ffc107!important}.green{color:#388e3c}.white{color:#fff!important}.red{color:#d32f2f!important}.badge-inv{color:#fffd!important}.gray{color:#757575!important}.light-gray{color:#bbb!important}.large{font-size:120%}.small{font-size:90%}.float-right{position:absolute;right:.5rem}.hr{background-color:#f0f0f0;box-shadow:inset 0 .25rem .25rem -.25rem #00000026,inset 0 -.25rem .25rem -.25rem #00000026;display:block;height:.45rem;min-height:.3rem;width:100%}.hr.thin{height:.015rem}.ellipsized{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.flat-button{align-items:center;background-color:#fff;display:flex;font-weight:400;height:2em;line-height:2em;margin:.15rem .35rem;text-align:center;text-transform:uppercase;touch-action:manipulation;vertical-align:middle;white-space:nowrap;z-index:1}.flat-button:focus,.flat-button:hover{text-decoration:none}.flat-button.faux{background-color:#eee;border:1px solid #999;border-radius:3px;display:inline-block;height:1.4em;line-height:1.4em;margin:.15rem;padding:0 .35rem;text-transform:none}.action-button{background-color:#fafafa;border-radius:50%;bottom:1rem;box-shadow:0 2px .5rem 0 #00000040;color:#999;display:block;font-size:1.8rem;height:3.25rem;margin:0;min-height:unset;min-width:unset;outline:none;padding:0;position:absolute;right:1rem;transition:all .15s;width:3.25rem;z-index:2}.action-button:focus,.action-button:hover{background-color:#f0f0f0;color:#888}.action-button:active{background-color:#eee;color:#777}.action-button.hidden{bottom:2.625rem;font-size:1px;height:1px;line-height:1px;opacity:0;right:2.625rem;width:1px}.group-focus{outline:none}#mountPoint{height:100%;padding-bottom:1rem;padding-top:1rem}#noscript-message{background-color:#fff;border-radius:.25rem;box-shadow:1px 2px .3rem gray;display:flex;flex-direction:column;margin-left:auto;margin-right:auto;margin-top:5rem;max-width:30rem;overflow:hidden;position:relative}#noscript-title{background-color:#2196f3;color:#bbdefb;font-size:120%;font-weight:bolder;padding:1rem}#noscript-content{padding:1rem}#app-container{background-color:#fff;border-radius:.25rem;box-shadow:1px 2px .3rem gray;display:flex;height:100%;margin-left:auto;margin-right:auto;max-width:84rem;overflow:hidden;position:relative}#sidepanel{flex-grow:0;flex-shrink:0.3;min-width:18rem;width:24rem}#sidepanel,#topic-view{display:flex;flex-direction:column;height:100%;position:relative}#topic-view{overflow-x:hidden;width:100%}#info-view{display:flex;flex-direction:column;flex-grow:0;flex-shrink:0.3;height:100%;min-width:18rem;width:24rem}.center-medium-text{align-items:center;display:flex;font-size:1.4rem;height:100%;justify-content:center;text-align:center;width:100%}.nodisplay{display:none!important}.quoted{margin-left:1rem}.space-right{margin-right:.25rem}.rounded-container{background-color:#fafafa;border-radius:.1rem;margin:.25rem;padding:.25rem;position:relative}.in-place-edit{border-bottom:1px dashed #ddd;cursor:pointer;display:inline-block;font-family:inherit;font-size:1rem;margin:.25rem .125rem 0;vertical-align:initial;width:100%}.in-place-edit.short{font-size:1.1rem;height:2.5rem;line-height:2.25}.in-place-edit.disabled{border-bottom:none;color:#888;cursor:default}.in-place-edit.placeholder{color:#bbb}.in-place-edit span{display:inline-block}.in-place-edit.short span{display:block;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}table.permission-editor{width:100%}table.permission-editor td{font-size:1.1rem;margin:.35rem 0;vertical-align:middle}table.permission-editor td.checkbox{color:#999;text-align:center}.permission-editor .material-icons{font-size:1.3rem;line-height:1.3rem}.material-icons.clickable{border-bottom:none;cursor:pointer}.clickable{border-bottom:1px dashed #ddd}.clean-clickable,.clickable,.image-clickable{cursor:pointer}.panel-title{font-size:1.4rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.panel-title.deleted{text-decoration:line-through}.caption-panel{box-shadow:0 1px 2px gray;flex:none;height:4rem;overflow-x:hidden;white-space:nowrap;z-index:1}.caption-panel,.dialog-buttons{align-items:center;display:flex;padding:.5rem}.dialog-buttons{justify-content:flex-end}.dialog-buttons button{margin:0 .5rem}.avatar-box{flex-grow:0;flex-shrink:0;position:relative}.bot-form{display:flex;flex-direction:column;line-height:2rem;min-width:8rem;overflow:hidden}.bot-form div{min-height:2rem;vertical-align:middle}.bot-form button{background-color:#eef;color:#2196f3;display:inline-block;font-size:inherit;height:2rem;line-height:2rem;margin:.15rem;text-transform:none}.bot-form>div>button{width:auto}.bot-form button:active,.bot-form button:focus,.bot-form button:hover{background-color:#e3f2fd;outline:0}#side-caption-panel{background-color:#2196f3;color:#bbdefb}#side-caption-panel a{color:#bbdefb;line-height:1;padding-left:.5rem}#side-caption-panel :hover{color:#fff}#sidepanel-title{margin-left:.5rem;margin-right:auto}#self-avatar{border-radius:50%;flex:none;height:3rem;min-width:3rem;width:3rem}#self-avatar.avatar-box{font-size:1.8rem}#settings-form ul{list-style:none}#settings-form li{vertical-align:middle}#settings-form label{display:inline-block;padding-left:.5rem}input#host-name{width:100%}input.search{text-indent:1.4rem}i.search{left:.6rem;position:absolute}.info-box{display:none;overflow:hidden;padding:1rem 1.5rem .75rem .5rem;position:relative}.info-box>span{line-height:1.35rem}.info-box .cancel{position:absolute;right:.25rem;top:.5rem}.info-box.error{background-color:#ffcdd2;border-bottom:1px solid #ffbfc8;color:#b71c1c;display:flex}.info-box.warning{background-color:#fff9c4;border-bottom:1px solid #fff59d;color:#6d4c41;display:flex}.info-box.info{background-color:#e1f5fe;border-bottom:1px solid #b3e5fc;color:#0288d1;display:flex}.info-box .cancel .material-icons{color:#757575;font-size:1rem}.info-box.error .cancel .material-icons{color:#b71c1c}.info-box .icon{display:block;margin-right:.5rem}.info-box .icon .material-icons{font-size:1.5rem}.info-box.warning .icon .material-icons{color:#fbc02d}.info-box.error .icon .material-icons{color:#ef5350}.info-box.info .icon .material-icons{color:#0288d1}.flex-column{display:flex;flex-direction:column;height:100%;overflow-x:hidden}.flex-column.narrow{height:auto}.scrollable-panel{height:100%;margin-bottom:auto;margin-top:.25rem;overflow-x:hidden;overflow-y:auto;scroll-behavior:smooth}.contact-box{list-style:none;overflow-x:hidden}.contact-box>li{background:linear-gradient(90deg,#0000 3.5rem,#eee 1px,#eee) 0 100% /100% 1px no-repeat,#fff;cursor:pointer;display:flex;flex-grow:0;flex-shrink:0;min-height:3.75rem;overflow-x:hidden;padding:.35rem .25rem .5rem .35rem;position:relative}.contact-box.small>li{min-height:2.5rem;padding:.25rem .25rem .35rem .35rem}.contact-box>li:last-child{background:#fff}.contact-box>li:hover{background-color:#eceff1}.contact-box>li.selected{background-color:#cfd8dc}.contact-box>li.action{border-bottom:none;min-height:2.5rem}.contact-box .text-box{overflow-x:hidden}.contact-box .contact-title{font-size:1.05rem;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.contact-box .contact-title.deleted{opacity:.66;text-decoration:line-through;text-decoration-thickness:.5px}.contact-box .contact-comment{font-weight:lighter}.contact-box .contact-comment,.contact-box .contact-comment>span{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.contact-box .contact-comment b{font-weight:bolder}.contact-box .contact-comment .material-icons{color:#777;margin-bottom:.2rem}.contact-box .avatar-box{font-size:1.8rem;height:3rem;margin-right:.35rem;min-height:3rem;min-width:3rem;overflow:hidden;padding:0;position:relative;width:3rem}.contact-box .avatar{border-radius:50%;height:3rem;width:3rem}.contact-box.small .avatar-box{font-size:1.2rem;height:2rem;min-height:2rem;min-width:2rem;width:2rem}.contact-box.small .avatar{height:2rem;width:2rem}.avatar.deleted{filter:grayscale(1);opacity:.75}.contact-box .avatar-box>.material-icons{display:flex;flex-direction:column;font-size:2.4rem;justify-content:space-around;line-height:3rem}.contact-box.small .avatar-box>.material-icons{font-size:1.6rem;line-height:2rem}.contact-box .text-box{display:flex;flex-direction:column;justify-content:space-around}.contact-box .text-box>div{align-items:center;display:flex;flex-direction:row}.contact-box .action-text{cursor:pointer;font-size:.95rem;line-height:2.5rem;margin:0 auto;text-align:center}img.channel{height:1.25rem;margin-left:.3rem;vertical-align:middle;width:1.25rem}.large img.channel{height:1.45rem;margin-bottom:.15rem;margin-left:.5rem;width:1.45rem}.avatar-box .online,.offline{border-radius:50%;bottom:.1rem;flex-shrink:0;height:.75rem;min-height:.75rem;min-width:.75rem;position:absolute;right:0;width:.75rem}.avatar-box .online{background-color:#4caf50}.avatar-box .offline{background-color:silver}.online.typing{animation:typing .5s infinite}@keyframes typing{0%,to{transform:translateX(0)}50%{transform:translateX(-.3rem)}}.contact-box .checkmark.material-icons{border:0 solid #0000;color:#0097a7;overflow:visible;padding-left:.5px}.contact-box .checkmark.material-icons,.contact-box .deleted.material-icons{background-color:#fff;bottom:0;font-size:1.5rem;height:1.5rem;position:absolute;right:0;width:1.5rem}.contact-box .deleted.material-icons{color:#999}#add-topic{bottom:1rem;position:absolute;right:1rem}.panel-form{display:flex;flex-direction:column;padding:0;position:relative}.panel-form-row{align-items:center;flex-shrink:0}.panel-form-column,.panel-form-row{display:flex;flex-grow:0;line-height:1.5;padding:.5rem .75rem;position:relative}.panel-form-column{flex-direction:column;overflow-x:hidden}.panel-form-column>.panel-form-column,.panel-form-row>.panel-form-column{flex-grow:1;padding:0!important}.panel-form-column>.panel-form-row,.panel-form-row>.panel-form-row{padding:0!important}.panel-form-column>.group{margin-bottom:.25rem;margin-top:.25rem}.avatar-upload{display:flex;flex-direction:column;flex-shrink:0;font-size:4.5rem;height:10.5rem;padding:0;position:relative;width:10rem}.avatar-upload.read-only{height:auto}.avatar-upload .clear-avatar{background-image:radial-gradient(#fff 40%,#0000 75%);font-size:1rem;opacity:0;position:absolute;right:0;top:0}.avatar-upload:hover .clear-avatar{opacity:1}.avatar-upload .avatar-box{height:10rem;position:relative;width:10rem}.avatar-upload .avatar-box>.material-icons{font-size:4rem;line-height:10rem;position:relative;vertical-align:middle}.avatar-upload:after{clear:both;content:".";display:block;height:0;visibility:hidden}.avatar-upload .blank{border:1px dashed #999;color:#999;flex-shrink:0;font-size:1rem;line-height:10rem;text-align:center;vertical-align:middle}.avatar-upload .blank,.avatar-upload img.preview{border-radius:50%;height:10rem;overflow:hidden;width:10rem}.avatar-upload img.preview:before{background:50% no-repeat url(../img/broken_image.png);border-radius:50%;color:#666;content:" ";display:flex;font-size:.9rem;font-weight:lighter;height:10rem;justify-content:center;left:0;position:absolute;top:0;width:10rem}.avatar-upload .inputfile.hidden{height:.1px;opacity:0;overflow:hidden;position:absolute;width:.1px}.avatar-upload .inputfile+label.round{align-items:center;background-color:#fafafa;border-radius:50%;bottom:0;box-shadow:0 1px 4px #0006;cursor:pointer;display:flex;height:3rem;justify-content:center;line-height:3rem;position:absolute;right:0;width:3rem;z-index:1}.avatar-upload .inputfile:focus+label.round{outline:none}.avatar-upload .inputfile+label:hover,.avatar-upload .inputfile:focus+label{background-color:#e3f2fd;color:#42a5f5}#topic-caption-panel{background-color:#b0bec5}#topic-caption-panel a{color:#757575;text-decoration:none}#topic-caption-panel :hover{color:#000}#topic-caption-panel .avatar-box{font-size:1.8rem;height:3rem;margin-right:.35rem;min-width:3rem;position:relative;width:3rem}#topic-caption-panel .avatar-box>.material-icons{font-size:2.4rem;line-height:3rem}#topic-title-group{overflow-x:hidden}#hide-message-view{display:block;margin-right:.35rem}#topic-users{margin-left:auto;margin-right:1rem;width:min-content}#topic-users .avatar-box{display:inline-block;font-size:1rem;height:1.8rem;margin-right:.2rem;min-height:1.8rem;min-width:1.8rem;width:1.8rem}#topic-users .avatar-box>.material-icons{font-size:1.4rem;line-height:1.8rem}#topic-users>span{line-height:2rem;vertical-align:top}#messages-panel{background-color:#eceff1;background-image:url(../img/bg_messages.png);height:100%;overflow-y:scroll;padding:.75rem;position:relative}#messages-container{height:100%;overflow-y:hidden;position:relative}#write-only-background{background-image:repeating-linear-gradient(45deg,#ffffff80,#ffffff80 .5rem,#fffc 0,#fffc 1rem);height:100%;left:0;position:absolute;top:0;width:100%}#write-only-note{height:auto;top:50%;transform:translate(-50%,-50%);width:auto}#peer-messaging-disabled-note,#write-only-note{background-color:#fff;border-radius:.5rem;box-shadow:0 1px .5px #0000001f;color:#666;left:50%;line-height:2rem;padding:.75rem 1.25rem;position:absolute;text-align:center}#peer-messaging-disabled-note{bottom:4.3rem;transform:translate(-50%);width:fit-content}#send-message-panel{align-items:center;background-color:#eceff1;display:flex;flex:none;min-height:4rem;padding:.4rem .4rem .4rem .6rem;z-index:2}#send-message-panel #writing-disabled{font-size:1.2rem;text-align:center;width:100%}#send-message-wrapper{background-color:#eceff1;box-shadow:0 -2px 3px -1px #0000001a;z-index:2}#sendMessage{overflow:hidden;overflow-wrap:break-word}#send-message-panel .material-icons{font-size:1.6rem;min-width:2rem}#send-message-panel .material-icons.secondary,.material-icons.disabled{color:#999!important}#send-message-panel .material-icons.secondary:hover{color:#2196f3!important}#send-message-input{max-height:6rem;min-height:2.5rem;overflow:hidden auto}.accept-invite-panel{background-color:#eceff1;box-shadow:0 -2px 3px -1px #0000001a;width:100%;z-index:1}.accept-invite-panel .title{font-size:1.2rem;padding:.75rem}.accept-invite-panel .footer{background-color:#fafafa;padding-bottom:.35rem;text-align:center;white-space:nowrap}.accept-invite-panel button{border:1px solid #0000;box-shadow:0 1px 2px 0 #00000040;font-size:1rem;height:2em;line-height:2em;margin:.25rem}#dummy-view{align-items:center;background-color:#e0f7fa;display:flex;height:100%;justify-content:center;width:100%}#dummy-view a{display:block;text-align:center;text-decoration:none}#image-preview{background-color:#ffffffe6;display:flex;flex-direction:column;height:100%;left:0;position:absolute;top:0;width:100%;z-index:2}#image-preview-caption-panel{background-color:#eceff1;box-shadow:0 1px 2px silver;display:flex;height:4.6rem;justify-content:space-between;line-height:2.5rem;padding:1rem .75rem 0;z-index:3}#image-preview-caption-panel a{color:#757575;text-decoration:none}#image-preview-caption-panel a:hover{color:#000}#image-preview-container{align-items:center;display:flex;height:100%;justify-content:space-around;overflow:hidden;width:100%}#image-preview-footer{background-color:#eceff1;box-shadow:0 -2px 3px -1px #0000001a;display:flex;height:3.2rem;justify-content:space-around;line-height:1.5rem;z-index:1}#image-preview-container .material-icons{font-size:6rem}#video-container{background-color:#ffffffe6;flex-direction:column;height:100%;justify-content:space-between;left:0;top:0}#video-container,.controls{display:flex;position:absolute;width:100%}.controls{align-items:center;bottom:2.5rem;column-gap:1rem;justify-content:center;z-index:1}.incoming-call .controls{bottom:1rem}.controls button{border-radius:50%;box-shadow:0 3px 6px 0 #00000040;height:4rem;min-width:auto;width:4rem}#video-container-panel{height:100%;position:relative;width:100%}.call-party{background-color:#eee;border:2px solid #ccc;border-radius:.5rem;overflow:hidden}.call-party:hover{border:2px solid #2196f3}.call-party.peer{bottom:1rem;left:1rem;position:absolute;right:1rem;top:1rem;z-index:1}.call-party.self{bottom:.5rem;height:10rem;position:absolute;right:.5rem;width:10rem;z-index:2}.call-party.self[disabled]{display:none}video{height:100%;object-fit:contain;width:100%}.call-party.self video{transform:scaleX(-1)}.call-party[disabled] video{display:none}.caller-card{align-items:center;display:flex;flex-direction:column;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.caller-card .avatar-box{font-size:6rem;height:10rem;width:10rem}.caller-card.pulse .lettertile,.caller-card.pulse img.avatar{animation:active-call 1.5s linear infinite}.caller-card .avatar-box .material-icons{font-size:6rem;line-height:1.6}.call-party .caller-name{background-color:#ffffffb3;border-radius:.35rem;padding:.15rem .5rem;text-shadow:0 0 1px #fff;z-index:1}.call-party.self .caller-name.inactive{bottom:.25rem;position:absolute;right:.25rem}.caller-card .caller-name{font-size:larger;margin-top:.5rem}.caller-card .trusted-badge{display:inline-block}.call-party.peer .caller-name.inactive{bottom:.5rem;font-size:larger;left:1rem;margin:0 auto;position:absolute}.incoming-call{background-color:#fff;border-radius:.3rem;box-shadow:.15rem .15rem 1.5rem #00000073;margin:auto 2rem;max-width:24rem;min-width:16rem;position:relative;width:fit-content}.incoming-call .caller-card{align-items:center;display:flex;flex-direction:column;height:100%;justify-content:center;left:auto;padding:4rem 3.5rem 5.5rem;position:relative;top:auto;width:100%}.incoming-call .caller-name{background-color:#ffffffb3;border-radius:.35rem;padding:.15rem .5rem;text-shadow:0 0 1px #fff;z-index:1}.call-message{display:flex;flex-direction:row}.call-message .duration{font-weight:lighter}@keyframes active-call{0%{box-shadow:0 0 0 .1rem #2196f34d,0 0 0 .3rem #2196f34d,0 0 0 .5rem #2196f34d}to{box-shadow:0 0 0 .4rem #2196f34d,0 0 0 2rem #2196f300,0 0 0 3rem #2196f300}}.chat-box{list-style:none;margin:0 .5rem;padding:0 0 3.5rem;scroll-behavior:smooth}.chat-box.group{margin-left:-.4rem}.chat-box li{align-items:flex-end;display:flex;margin:0;padding:0}.chat-box .right{justify-content:flex-end}.bubble{border-radius:.5rem;color:#212121;display:flex;filter:drop-shadow(.5px .5px .7px rgb(0,0,0,.3));height:auto;margin:0;max-width:36rem;min-width:9rem;padding:.75rem .5rem;position:relative;text-align:left;transition:background-color .5s ease-out;transition-delay:.3s}.chat-box li.single{margin-bottom:.75rem;margin-top:.25rem}.chat-box li.first{margin-bottom:.15rem;margin-top:.25rem}.chat-box li.middle{margin-bottom:.15rem;margin-top:.15rem}.chat-box li.last{margin-bottom:.75rem;margin-top:.15rem}.left .bubble{background-color:#c5e1a5;margin-right:.5rem}.left.flash .bubble{background-color:#94a97c}.left .bubble.tip{border-bottom-left-radius:0}.right .bubble{background-color:#fafafa;margin-left:1.75rem}.right.flash .bubble{background-color:#ccc}.right .bubble.tip{border-bottom-right-radius:0}.chat-box .meta{justify-content:center;margin-bottom:.5rem;margin-top:.5rem}.chat-box .meta .bubble{color:#666;min-width:unset}.meta .bubble.deleted{background-color:#e3f2fd;padding:.75rem .75rem .5rem}.meta .bubble.date{background-color:#fffc;font-size:smaller;padding:.5rem;text-transform:uppercase}.left .bubble.tip:before{background-color:#c5e1a5;border-bottom-left-radius:.3rem;bottom:0;clip-path:polygon(100% 0,0 110%,100% 110%);-webkit-clip-path:polygon(100% 0,0 110%,100% 110%);content:"";height:.85rem;left:-.8rem;position:absolute;transition:background-color .5s ease-out;transition-delay:.3s;width:.85rem}.left.flash .bubble.tip:before{background-color:#94a97c}.right .bubble.tip:before{background-color:#fafafa;border-bottom-right-radius:.3rem;bottom:0;clip-path:polygon(0 0,100% 110%,0 110%);-webkit-clip-path:polygon(0 0,100% 110%,0 110%);content:"";height:.85rem;left:99.8%;position:absolute;transition:background-color .5s ease-out;transition-delay:.3s;width:.85rem}.right.flash .bubble.tip:before{background-color:#ccc}.chat-box .avatar-box{font-size:.8rem;height:1.4rem;margin-bottom:.8rem;margin-right:.8rem;min-height:1.4rem;min-width:1.4rem;position:relative;width:1.4rem}.bubble div.content-meta{width:100%}.bubble div.message-content{margin:0;max-width:36rem;overflow-wrap:anywhere;padding:0 .75rem;position:relative;width:100%}.bubble div.message-content:after{clear:both;content:".";display:block;height:0;visibility:hidden}.chat-box .timestamp-padding{display:inline-block;height:0;width:4rem}.chat-box .timestamp{float:right;position:relative;top:.35rem;user-select:none;white-space:nowrap}.chat-box .author,.chat-box .timestamp{color:#777;font-size:80%}.image-preview,.inline-image{border-radius:.1rem;overflow:hidden;position:relative}.inline-image{max-height:24rem;max-width:36rem}.inline-image>.rounded-container{border-left:.25rem solid #0000;border-right:.25rem solid #0000;bottom:2rem;margin:.25rem auto;position:relative}img.image-preview:before,img.inline-image:before{background:50% no-repeat #ccc url(../img/broken_image.png);color:#666;display:flex;font-size:.9rem;font-weight:lighter;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}img.inline-image:before{background-size:3rem 3rem;content:attr(alt)}img.image-preview:before{background-size:10rem 10rem;content:" "}.inline-image.video>img.inline-image:before,img.image-preview.video:before{background:50% no-repeat #ccc url(../img/broken_video.png)}.inline-image.video>img.inline-image:before{background-size:3rem 3rem}.inline-video{align-items:center;display:flex;justify-content:center;position:relative}.inline-video>img.inline-image:before{background:#ccc}.inline-video .duration{background-color:#ffffff80;border-radius:.3rem;bottom:.25rem;color:#333;font-size:80%;left:.25rem;padding:.25rem .5rem;position:absolute}.inline-video .play-control{align-items:center;background-color:#0006;border-radius:50%;cursor:pointer;display:flex;height:4rem;justify-content:center;pointer-events:none;position:absolute;width:4rem}.attachment{display:flex}.attachment:last-of-type{margin-bottom:-.45rem}#info-caption-panel{background-color:#b0bec5}#info-caption-panel a{color:#757575;line-height:1;text-decoration:none}#info-caption-panel :hover{color:#000}#info-title{margin-right:auto}#group-manager{display:flex;flex-direction:column;height:100%;overflow-y:hidden;position:relative}#group-manager-buttons{background-color:#eceff1;border-left:1px solid #ccc;box-shadow:0 -1px #0000001a;display:flex;height:4rem;justify-content:space-around;padding:.4rem;z-index:2}ul.tabbar{background:#eee;display:flex;flex-grow:0;flex-shrink:0;list-style:none;margin:0;overflow:hidden;padding:0 0 0 1rem;width:100%}ul.tabbar>li{box-shadow:inset 0 -2px 2.5px -1px #00000040;height:2.4rem;position:relative}ul.tabbar li.active{background:#fff}ul.tabbar li:after{background:#ccc;bottom:0;content:"";height:.1rem;left:0;position:absolute;width:100%}ul.tabbar li.active:after{animation:tabbar-border-expand .2s cubic-bezier(.4,0,.4,1) 0s alternate forwards;background:#2196f3;bottom:0;content:"";height:.15rem;left:0;position:absolute}@keyframes tabbar-border-expand{0%{opacity:0;width:0}to{opacity:1;width:100%}}ul.tabbar>li>a{color:#2196f399;font-size:1.3rem;font-variant:small-caps;font-weight:400;line-height:2.4rem;overflow:hidden;padding-left:1rem;padding-right:1rem;position:relative;text-align:center;text-decoration:none}ul.tabbar li.active>a{color:#2196f3}.unread{background-color:#0097a7;border-radius:50%;color:#fff;display:inline-block;font-size:.75rem;font-weight:bolder;height:1.35rem;line-height:1.45rem;margin-left:.5rem;text-align:center;vertical-align:middle;width:1.35rem}.material-icons.as-badge{color:#aaa;font-size:1.15rem;padding-left:.2rem}.badge{align-self:flex-start;background-color:#e8e8e8;border:1px solid silver;border-radius:.2rem;color:#666;display:inline-block;font-family:Roboto Mono,Courier,monospace,sans-serif;font-size:.8rem;margin:.05rem .1rem;padding:.05rem .25rem}.badge.green{background-color:#efe;border-color:#aca;color:#383}.badge.yellow{background-color:#ffe;border-color:#cc9;color:#660}.badge.blue{background-color:#eef;border-color:#aad;color:#339}.badge.red{background-color:#fee;border-color:#c99;color:#933}.badge.magenta{background-color:#fef;border-color:#c9c;color:#939}.lettertile{border-radius:50%;padding-bottom:100%;user-select:none;width:100%}.lettertile>div{align-items:center;border-radius:50%;bottom:0;color:#fafafacc;display:flex;flex-grow:0;flex-shrink:0;justify-content:center;left:0;line-height:1;padding-top:.1em;position:absolute;right:0;text-align:center;text-transform:uppercase;top:0}.lettertile:hover{color:#fff}.lettertile.disabled{opacity:.5}.lt-bg-0{background-color:#ef9a9a}.lt-bg-1{background-color:#90caf9}.lt-bg-2{background-color:#b0bec5}.lt-bg-3{background-color:#b39ddb}.lt-bg-4{background-color:#ffab91}.lt-bg-5{background-color:#a5d6a7}.lt-bg-6{background-color:#eee}.lt-bg-7{background-color:#e6ee9c}.lt-bg-8{background-color:#c5e1a5}.lt-bg-9{background-color:#f0e57d}.lt-bg-10{background-color:#f48fb1}.lt-bg-11{background-color:#9fa8da}.lt-bg-12{background-color:#ffe082}.lt-bg-13{background-color:#bcaaa4}.lt-bg-14{background-color:#80deea}.lt-bg-15{background-color:#ce93d8}.dk-bg-0{background-color:#c62828}.dk-bg-1{background-color:#ad1457}.dk-bg-2{background-color:#6a1b9a}.dk-bg-3{background-color:#4527a0}.dk-bg-4{background-color:#283593}.dk-bg-5{background-color:#1565c0}.dk-bg-6{background-color:#0277bd}.dk-bg-7{background-color:#00838f}.dk-bg-8{background-color:#00695c}.dk-bg-9{background-color:#2e7d32}.dk-bg-10{background-color:#558b2f}.dk-bg-11{background-color:#9e9d24}.dk-bg-12{background-color:#f9a825}.dk-bg-13{background-color:#ff8f00}.dk-bg-14{background-color:#ef6c00}.dk-bg-15{background-color:#d84315}.lt-fg-0{color:#ef9a9a!important}.lt-fg-1{color:#90caf9!important}.lt-fg-2{color:#b0bec5!important}.lt-fg-3{color:#b39ddb!important}.lt-fg-4{color:#ffab91!important}.lt-fg-5{color:#a5d6a7!important}.lt-fg-6{color:#eee!important}.lt-fg-7{color:#e6ee9c!important}.lt-fg-8{color:#c5e1a5!important}.lt-fg-9{color:#f0e57d!important}.lt-fg-10{color:#f48fb1!important}.lt-fg-11{color:#9fa8da!important}.lt-fg-12{color:#ffe082!important}.lt-fg-13{color:#bcaaa4!important}.lt-fg-14{color:#80deea!important}.lt-fg-15{color:#ce93d8!important}.dk-fg-0{color:#c62828!important}.dk-fg-1{color:#ad1457!important}.dk-fg-2{color:#6a1b9a!important}.dk-fg-3{color:#4527a0!important}.dk-fg-4{color:#283593!important}.dk-fg-5{color:#1565c0!important}.dk-fg-6{color:#0277bd!important}.dk-fg-7{color:#00838f!important}.dk-fg-8{color:#00695c!important}.dk-fg-9{color:#2e7d32!important}.dk-fg-10{color:#558b2f!important}.dk-fg-11{color:#9e9d24!important}.dk-fg-12{color:#f9a825!important}.dk-fg-13{color:#ff8f00!important}.dk-fg-14{color:#ef6c00!important}.dk-fg-15{color:#d84315!important}.material-icons{font-size:1.4rem;line-height:1;text-align:center;vertical-align:middle}.material-icons.small{font-size:1rem}.material-icons.medium{font-size:1.2rem}.material-icons.big{font-size:2.2rem}.material-icons.x-big{font-size:3rem}.material-icons.huge{font-size:4rem}.composed-material{display:inline-block;position:relative}.composed-material .second{font-size:85%;font-weight:700;left:39%;position:absolute;top:7%}.composed-material .second-small{font-size:62%;font-weight:700;left:30%;position:absolute;top:14%}.material-icons.outline{position:relative;text-shadow:-1px 1px #fff,1px 1px #fff,1px -1px #fff,-1px -1px #fff}#self-avatar .material-icons{font-size:2.4rem;line-height:3rem}.avatar-box .material-icons{border-radius:50%;color:#fafafacc;height:inherit;width:inherit}.chip-input{align-items:center;background:#0000;border-bottom:1px solid #ccc;box-shadow:0 1px 0 #0000001a;color:#666;cursor:text;display:flex;flex-grow:1;flex-wrap:wrap;font-size:1.1rem;font-weight:400;justify-content:flex-start;margin:.25rem 0;max-height:10rem;min-height:4rem;outline:none;overflow-y:scroll;text-align:center;transition:all .1s ease-in-out}.chip-input.focused{border-bottom:1px solid #2196f3;box-shadow:0 1px 0 #2196f340}.chip-input>input[type=text]{border:none;box-shadow:none;display:inline-block;flex:1 0 auto;min-width:4rem;width:auto}.chip,.chip-input>input[type=text]{height:1.8rem;line-height:1.8;margin:.125rem}.chip{align-items:center;background-color:#eee;border-radius:.9rem;display:flex;flex:0 0 auto;font-size:90%;max-width:12rem;overflow:hidden}.chip,.chip>span{text-overflow:ellipsis;white-space:nowrap}.chip>span{overflow-x:hidden}.chip.invalid{background-color:#fee;color:#c66}.chip>a{background-color:#aaa;border-radius:50%;color:#eee;display:inline-block;height:1.175rem;line-height:1.15;margin:.3rem;min-width:1.175rem;text-decoration:none;width:1.175rem}.chip>a:focus,.chip>a:hover{background-color:#bbb;color:#fff;text-decoration:none}.chip .avatar-box{font-size:1rem;height:1.8rem;margin-right:.2rem;min-height:1.8rem;min-width:1.8rem;position:relative;width:1.8rem}.chip .avatar-box .material-icons{font-size:1.4rem;line-height:1.8rem}.chip .spacer{display:inline-block;height:1.175rem;margin:.3rem;width:.25rem}.load-spinner-box{--size-small:2.5rem;--size-large:4rem;background-color:#fff;border-radius:50%;box-shadow:.1rem .1rem .15rem 1px #00000040;height:var(--size-small);left:0;margin-left:auto;margin-right:auto;padding:.25rem;position:absolute;right:0;top:5rem;width:var(--size-small);z-index:2}.load-spinner-box.large{height:var(--size-large);width:var(--size-large)}.load-spinner-box.clear{background-color:#fff8;-x-box-shadow:none;box-shadow:.1rem .1rem .15rem 1px #0000001f}.load-spinner-box.centered{top:calc(var(--size-small)/2 - .25rem)}.load-spinner-box.large.centered{top:calc(var(--size-large)/2 - .25rem)}.loader-spinner{animation:spin 1.5s linear infinite;border:.35rem solid #f3f3f3;border-radius:50%;border-top-color:#1e88e5;height:2rem;width:2rem}.load-spinner-box.large .loader-spinner{height:3.5rem;width:3.5rem}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.uploader{display:flex}.uploader>div{background-color:#cfd8dc;border-radius:.1rem;height:.6rem;line-height:0;margin:.35rem;padding:.15rem;position:relative;width:6rem}.uploader>div>span{background-color:#1e88e5;border-radius:.08rem;display:inline-block;height:.3rem}.highlight{color:teal;font-weight:bolder}.highlight .preview{color:#5f9ea0;font-weight:inherit}.cropper{align-self:center;height:21rem;margin:1rem auto auto;transform:translateZ(0)}.cropper,.cropper .bounding-box{border-radius:.25rem;position:relative;width:18rem}.cropper .bounding-box{background-color:#999;border:2px solid #1e88e5;box-shadow:1px 1px 3px grey;height:18rem;overflow:hidden;z-index:1}.cropper .preview{max-height:none;max-width:none;position:absolute;z-index:-1}.cropper .cutout{border:1px dashed #999;bottom:0;box-shadow:0 0 150rem 150rem #e6f6ffa8;height:17rem;left:0;margin:auto;position:absolute;right:0;top:0;width:17rem;z-index:0}.cropper .cutout.circle{border-radius:50%}.cropper .overlay{cursor:move;position:absolute;touch-action:none;z-index:1}.cropper .zoom-wrapper{height:2rem;margin:1rem auto;text-align:center;width:80%}.cropper .zoom{box-shadow:none;pointer-events:none;z-index:2}.cropper .zoom:focus{outline:none}.reply-quote{border-left:.25rem solid #039be5;border-radius:.25rem;color:#666;cursor:pointer;font-weight:lighter;line-height:1.5em;padding:.15rem .5rem .25rem;position:relative}.chat-box .bubble .reply-quote{margin:.15rem -.75rem .3rem}.chat-box .bubble .reply-quote:first-child{margin-top:-.25rem}.chat-box .left .reply-quote{background-color:#fff6}.chat-box .right .reply-quote{background-color:#8080801f}.reply-quote .inline-image{margin-bottom:.1rem;vertical-align:middle}.reply-quote img.inline-image:before{content:""}#reply-quote-preview{align-items:center;display:flex}#reply-quote-preview .reply-quote{background-color:#fafafa;cursor:auto;margin:.35rem .5rem 0 0;width:100%}#reply-quote-preview .cancel{min-width:2.4rem;text-align:center}#reply-quote-preview .inline-image{background-color:#ccc}#reply-quote-preview img.inline-image:before{content:""}#send-message-panel #reply-quote-preview{width:100%}#send-message-panel #reply-quote-preview .reply-quote{margin-bottom:.35rem}.forwarding-quote{font-size:200%;line-height:200%}.mention{font-weight:500}.forward-dialog{background-color:#fff;border-radius:.3rem;box-shadow:.15rem .15rem 1.5rem #00000073;height:80%;margin:auto 1rem;overflow:hidden;padding:.5rem;position:relative;width:24rem}.forward-dialog .scrollable-panel{height:80%}.audio{align-items:center;background-color:#eee;border-radius:1.5rem;display:flex;flex:none;height:3rem;margin-left:auto}.audio canvas{height:2.6rem;margin-right:2rem;width:14rem}.audio canvas.playback{margin-right:0}.audio .duration{font-size:large}.audio-player{align-items:center;display:flex}.audio-player .material-icons.large{color:#667575cc;font-size:2.4rem}.audio-player .material-icons.disabled{color:#999c;cursor:default}.audio-player .playback{height:2.6rem;width:14rem}.audio-player canvas.playback{display:block}.audio-player div.playback{align-items:center;color:#757575cc;display:flex;font-size:small;justify-content:center}.audio-player .timer{color:#666c;font-size:smaller}#pinned-wrapper{margin-right:1rem}#pinned-wrapper,.pinned{align-items:center;display:flex;height:100%;position:relative}.pinned{background-color:#fafafa;background-position:50%;border-radius:0 .25rem .25rem 0;color:#666;cursor:pointer;font-weight:lighter;min-width:0;padding:.15rem .5rem .25rem;transition:background .4s;width:24rem}.pinned>p{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned:hover{background-color:#fafdff}.pinned:active{background-color:#d8e8ff;transition:background 0s}.pinned-scroll{align-items:center;background-color:#eeee;border-radius:.25rem 0 0 .25rem;display:flex;flex-direction:column;height:100%;justify-content:space-evenly;margin-left:.35rem;padding:.1rem;position:relative}.pinned-scroll .dot{background-color:#999;border-radius:50%;height:.3rem;width:.3rem}.pinned-scroll .adot{background-color:#039be5;border-radius:50%;height:.45rem;width:.45rem}#pinned-wrapper .menuTrigger.upper{top:.25rem}#pinned-wrapper .menuTrigger.lower{bottom:.25rem}#pinned-wrapper:hover .menuTrigger{opacity:.9}#pinned-wrapper:hover .menuTrigger a{color:#757575}.drag-n-drop{align-items:center;background-color:#fffffff2;border:.15rem dashed grey;border-radius:1rem;bottom:1.5rem;color:grey;display:flex;font-size:2rem;justify-content:center;left:1.5rem;outline:.5rem solid #fffffff2;position:absolute;right:1.5rem;top:1.5rem;z-index:3}.country-flag{display:inline-block;font-size:larger}.dial-code{cursor:pointer;display:inline-block;margin-bottom:.15rem;vertical-align:middle;white-space:nowrap}ul.phone-country-selector{list-style:none;overflow-x:hidden}ul.phone-country-selector>li{cursor:pointer;font-weight:lighter;padding:.25rem .5rem .15rem;position:relative;width:100%}ul.phone-country-selector>li:hover{background-color:#eceff1}ul.phone-country-selector>li.selected{background-color:#cfd8dc}ul.phone-country-selector .dial-code{color:#1e88e5;font-weight:400;position:absolute;right:.5rem}ul.phone-country-selector span{display:inline-block}ul.phone-country-selector span.country{overflow-x:hidden;text-overflow:ellipsis}@media (min-width:1440px){#app-container{max-width:114rem}}@media (max-width:960px){#mountPoint{padding:0}.pinned{width:16rem}}@media (max-width:640px){#app-container{border-radius:0;box-shadow:none;width:100%}#info-view,#sidepanel{width:100%}.forward-dialog{border-radius:.3rem .3rem 0 0;margin:auto 0 0;width:100%}.menuTrigger{opacity:.3}#send-message-input{transition-property:-tinode-mobile}#pinned-wrapper{height:3.5rem;margin:.25rem}.pinned{width:unset}}.call-party-speaking{border:2px solid red}.call-party.carousel-item .caller-name.inactive{bottom:.25rem;position:absolute;right:.25rem}.call-party.carousel-item .muted{position:absolute;right:.25rem;top:.25rem}.avatar-box.carousel-item{height:45px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:45px}#carousel-wrapper{align-self:center;max-width:800px;padding-top:1rem;position:relative;width:100%}#carousel{overflow:auto;scroll-behavior:smooth;scrollbar-width:none}#carousel-next,#carousel-prev{align-content:center;background:#fff;border:none;border-radius:50%;cursor:pointer;display:flex;height:unset;justify-content:center;min-width:unset;outline:0;padding:8px;position:absolute}#carousel-prev{display:none;left:0;top:50%;transform:translate(50%,-50%)}#carousel-next{right:0;top:50%;transform:translate(-50%,-50%)}#carousel-content{grid-gap:16px;box-sizing:border-box;display:grid;grid-auto-flow:column;justify-content:center;margin:auto}.carousel-item{height:100px;position:relative;width:180px} \ No newline at end of file diff --git a/src/i18n.min/de.json b/src/i18n.min/de.json index 8b65ba41..e53e8eda 100644 --- a/src/i18n.min/de.json +++ b/src/i18n.min/de.json @@ -1 +1 @@ -{"action_block_contact":"Kontakt blockieren","action_cancel":"Abbrechen","action_clear_messages":"Nachrichten leeren","action_delete_messages":"Nachrichten für alle löschen","action_leave_chat":"Unterhaltung verlassen","action_report_chat":"Unterhaltung melden","archived_contacts":"Archivierte Kontakte ({count})","badge_danger":"Verdächtig","badge_owner":"Besitzer","badge_staff":"Verwaltung","badge_verified":"Verifiziert","badge_you":"Sie","block_contact_warning":"Möchten Sie diesen Kontakt wirklich blockieren?","blocked_contacts_link":"Blockierte Kontakte ({count})","button_add_members":"Mitglieder hinzufügen","button_cancel":"Abbrechen","button_confirm":"Bestätigen","button_create":"Erstellen","button_delete_account":"Konto löschen","button_edit":"Bearbeiten","button_logout":"Abmelden","button_ok":"OK","button_reset":"Zurücksetzen","button_send_request":"Anfrage senden","button_sign_in":"Anmelden","button_sign_up":"Anmelden","button_subscribe":"Abbonieren","button_update":"Aktualisieren","cannot_initiate_file_upload":"Datei kann nicht hochgeladen werden.","channel":"Sender","channel_prompt":"Dies ist ein Sender","chat_invitation":"Sie sind eingeladen, an einem neuen Chat teilzunehmen. Was möchten Sie tun?","chat_invitation_accept":"Akzeptieren","chat_invitation_block":"Blockieren","chat_invitation_ignore":"Ignorieren","clear_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle leeren wollen? Das kann nicht rückgängig gemacht werden.","code_doesnot_match":"Code stimmt nicht überein","contacts_not_found":"Sie haben keine Unterhaltungen
¯∖_(ツ)_/¯","contacts_not_found_short":"Keine Kontakte für ''{query}''","credential_email_prompt":"E-Mail Adresse für Registrierung","delete_account":"Konto löschen","delete_account_warning":"Möchten Sie das Konto wirklich löschen? Das kann nicht rückgängig gemacht werden","delete_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle löschen wollen? Das kann nicht rückgängig gemacht werden.","download_action":"herunterladen","drafty_attachment":"Dateianhang","drafty_form":"Formular:","drafty_image":"Bild","email_dative":"E-Mail","email_prompt":"E-Mail, z.B. lisam@beispiel.de","enable_peers_messaging":"Aktivieren","enter_confirmation_code_prompt":"Geben Sie den Bestätigungscode ein, der per {method} geschickt wurde:","error_invalid_id":"ungültige ID","file_attachment_too_large":"Die Dateigröße {size} überschreitet das Limit von {limit}.","forgot_password_link":"Passwort vergessen?","full_name_prompt":"Vollständiger Name, z.B. Lisa Musterfrau","granted_permissions":"Erteilt","group_has_no_members":"Keine Mitglieder","group_user_id_prompt":"Gruppe oder Benutzer ID","image_caption_prompt":"Bildunterschrift","invalid_content":"ungültiger Inhalt","invalid_security_token":"Ungültiger Sicherheitsschlüssel","label_client":"Client:","label_content_type":"Inhaltsart:","label_default_access_mode":"Standard Zugriffsmodus:","label_file_name":"Dateiname:","label_group_members":"Gruppenmitglieder:","label_incognito_mode":"inkognito-Modus:","label_message_sound":"Benachrichtigungston:","label_muting_topic":"Stumm geschaltet:","label_other_user":"Andere","label_password":"Passwort","label_permissions":"Berechtigungen:","label_private":"Privater Kommentar","label_push_notifications":"Benachrichtigungsmeldungen:","label_push_notifications_disabled":"Benachrichtigungsmeldungen (erfordert HTTPS):","label_reset_password":"Passwort per E-Mail wiederherstellen:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server Adresse:","label_server_to_use":"Server verwenden:","label_size":"Größe:","label_topic_name":"Name","label_user_contacts":"Kontakte","label_user_id":"ID:","label_wire_transport":"Übertragung per Kabel:","label_you":"Sie:","label_your_name":"Ihr Name","label_your_permissions":"Ihre Berechtigungen:","last_seen_timestamp":"Zuletzt gesehen","leave_chat_warning":"Möchten Sie diese Unterhaltung wirklich verlassen?","link_contact_us":"Kontakt","link_privacy_policy":"Datenschutzerklärung","link_terms_of_service":"Nutzungsbedingungen","login_prompt":"Anmelden","menu_item_archive_topic":"Archivieren","menu_item_block":"Blockieren","menu_item_clear_messages":"Nachrichten leeren","menu_item_clear_messages_for_all":"Für alle leeren","menu_item_delete":"Löschen","menu_item_delete_for_all":"Für alle löschen","menu_item_delete_topic":"Entfernen","menu_item_edit_permissions":"Berechtigungen ändern","menu_item_info":"Info","menu_item_member_delete":"Entfernen","menu_item_mute":"Unterhaltung stumm schalten","menu_item_restore_topic":"Wiederherstellen","menu_item_send_retry":"Wiederholen","menu_item_unblock":"Blockierung aufheben","menu_item_unmute":"Stumm schalten beenden","message_sending":"wird gesendet...","message_sending_failed":"fehlgeschlagen","messages_not_readable":"Neue Nachrichten können nicht gelesen werden","messaging_disabled_prompt":"Nachrichtenübermittlung deaktiviert","more_online_members":"+{overflow} mehr","new_message_prompt":"Neue Nachricht","new_password_placeholder":"Geben Sie ein neues Passwort ein","no_connection":"Keine Verbindung","no_contacts":"Sie haben keine Kontakte :-(","numeric_confirmation_code_prompt":"Nur zahlen","online_now":"jetzt online","password_prompt":"Passwort","password_unchanged_prompt":"unverändert","peers_messaging_disabled":"Gruppennachrichten sind deaktiviert","permission_admin":"Bestätigen ({val})","permission_delete":"Entfernen ({val})","permission_join":"Beitreten ({val})","permission_owner":"Besitzer ({val})","permission_pres":"Benachrichtigt werden ({val})","permission_read":"Lesen ({val})","permission_share":"Teilen ({val})","permission_write":"Schreiben ({val})","phone_dative":"Telefon","private_editing_placeholder":"Nur für Sie sichtbar","push_init_failed":"Initialisierung von Push-Benachrichtigungen fehlgeschlagen","reconnect_countdown":"Getrennt. Wiederverbinden in {seconds}…","reconnect_now":"Jetzt probieren","reload_update":"Neu laden","report_chat_warning":"Möchten Sie diese Unterhaltung wirklich blockieren und melden?","requested_permissions":"Angefordert","save_attachment":"Speichern","search_for_contacts":"Nutzen Sie die Suche um Kontakte zu finden","search_no_results":"Die Suche hatte keine Ergebnisse","search_placeholder":"Liste: email:lisa@beispiel.de, tel:17025550003...","sidepanel_title_acc_notifications":"Benachrichtigungen","sidepanel_title_acc_support":"Unterstützung","sidepanel_title_account_settings":"Konto-Einstellungen","sidepanel_title_archive":"Archivierte Unterhaltungen","sidepanel_title_blocked":"Blockierte Unterhaltungen","sidepanel_title_cred":"Anmeldeinformationen bestätigen","sidepanel_title_login":"Anmelden","sidepanel_title_newtpk":"Neue Unterhaltung starten","sidepanel_title_register":"Konto erstellen","sidepanel_title_reset":"Passwort zurücksetzen","sidepanel_title_settings":"Einstellungen","stay_logged_in":"Angemeldet bleiben","tabtitle_find_user":"Suchen","tabtitle_group_by_id":"nach ID","tabtitle_new_group":"Neue Gruppe","tags_editor_no_tags":"Schlagworte hinzufügen","tags_not_found":"Keine Schlagworte definiert. Erstellen Sie welche.","title_all_contacts":"Alle Kontakte","title_group_members":"Gruppenmitglieder","panel_title_info":"Info","title_manage_tags":"Verwalten","title_not_found":"Nicht gefunden","title_permissions":"Berechtigungen","title_tag_manager":"Schlagworte (Nutzer entdecken)","topic_block_warning":"Möchten Sie diese Unterhaltung wirklich blockieren?","topic_delete_warning":"Möchten Sie diese Unterhaltung wirklich löschen?","topic_name_editing_placeholder":"Freiform Name der Gruppe","unnamed_topic":"Unbenannt","update_available":"Aktualisierung verfügbar.","upload_finishing":"wird abgeschlossen...","user_not_found":"Nicht gefunden","description_editing_placeholder":"Beschreibung (optional)","label_description":"Beschreibung","button_security":"Sicherheit","panel_title_general":"Allgemein","panel_title_security":"Sicherheit","panel_title_crop":"Zum Anpassen ziehen","panel_title_members":"Mitglieder","permissions_anonymous":"Anonym","permissions_authenticated":"Authentifiziert","topic_delete":"Chat löschen","permissions_user":"Benutzerberechtigungen","password_reset_email_sent":"Eine E-Mail mit Sicherheitscode wurde gesendet.","label_unarchive_topic":"Archiviert:","menu_item_reply":"Antwort","menu_item_forward":"Nach vorne","forward_to":"Weiterleiten","forward_to_search_placeholder":"Kontakte durchsuchen","label_new_password":"Neues Kennwort","drafty_unknown":"Nicht unterstützt","calls_incoming":"Eingehender Anruf","calls_outgoing":"Ausgehender Anruf","calls_you_label":"Du","menu_item_video_call":"Videoanruf","already_in_call":"Du redest schon!","call_cancelled":"abgebrochen","call_missed":"verpasster","call_declined":"abgelehnt","call_disconnected":"getrennt","label_use_secure_connection":"Verwenden Sie eine sichere Verbindung","cred_confirmed_successfully":"Erfolgreich bestätigt","menu_item_edit":"Bearbeiten","editing_message":"Bearbeitung","message_edited_marker":", bearbeitet","icon_title_add_image":"Bild hinzufügen","icon_title_attach_file":"Datei anhängen","icon_title_delete":"Aufnahme löschen","icon_title_pause":"Wiedergabe pausieren","icon_title_play":"Aufnahme abspielen","icon_title_record_voice":"Sprachnachricht aufnehmen","icon_title_resume":"Wiedergabe fortsetzen","icon_title_send":"Nachricht senden","drag_file":"Datei hierher ziehen","drafty_video":"Videoaufnahme","call_in_progress":"in Arbeit","menu_item_audio_call":"Anruf","unrecognized_video_format":"Das Format dieses Videos wird nicht erkannt","loading_note":"Laden...","password_i_have_code":"Ich habe Code","label_reset_password_tel":"SMS zum Zurücksetzen des Passworts senden","mobile_phone_number":"Mobiltelefonnummer","password_reset_sms_sent":"Eine SMS mit einem Sicherheitscode wurde gesendet.","mobile_number_required":"Handynummer erforderlich","current_email":"Aktuelle E-Mail","current_phone":"Aktuelle Telefonnummer","new_email":"Neue E-Mail","new_phone_number":"Neue Telefonnummer","change_email":"E-Mail ändern","change_phone":"Telefonnummer ändern","call_busy":"besetzt","failed_to_init_audio":"Audioaufnahme konnte nicht initialisiert werden","password_reset_success":"Passwort erfolgreich zurückgesetzt"} \ No newline at end of file +{"action_block_contact":"Kontakt blockieren","action_cancel":"Abbrechen","action_clear_messages":"Nachrichten leeren","action_delete_messages":"Nachrichten für alle löschen","action_leave_chat":"Unterhaltung verlassen","action_report_chat":"Unterhaltung melden","archived_contacts":"Archivierte Kontakte ({count})","badge_danger":"Verdächtig","badge_owner":"Besitzer","badge_staff":"Verwaltung","badge_verified":"Verifiziert","badge_you":"Sie","block_contact_warning":"Möchten Sie diesen Kontakt wirklich blockieren?","blocked_contacts_link":"Blockierte Kontakte ({count})","button_add_members":"Mitglieder hinzufügen","button_cancel":"Abbrechen","button_confirm":"Bestätigen","button_create":"Erstellen","button_delete_account":"Konto löschen","button_edit":"Bearbeiten","button_logout":"Abmelden","button_ok":"OK","button_reset":"Zurücksetzen","button_send_request":"Anfrage senden","button_sign_in":"Anmelden","button_sign_up":"Anmelden","button_subscribe":"Abbonieren","button_update":"Aktualisieren","cannot_initiate_file_upload":"Datei kann nicht hochgeladen werden.","channel":"Sender","channel_prompt":"Dies ist ein Sender","chat_invitation":"Sie sind eingeladen, an einem neuen Chat teilzunehmen. Was möchten Sie tun?","chat_invitation_accept":"Akzeptieren","chat_invitation_block":"Blockieren","chat_invitation_ignore":"Ignorieren","clear_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle leeren wollen? Das kann nicht rückgängig gemacht werden.","code_doesnot_match":"Code stimmt nicht überein","contacts_not_found":"Sie haben keine Unterhaltungen
¯∖_(ツ)_/¯","contacts_not_found_short":"Keine Kontakte für ''{query}''","credential_email_prompt":"E-Mail Adresse für Registrierung","delete_account":"Konto löschen","delete_account_warning":"Möchten Sie das Konto wirklich löschen? Das kann nicht rückgängig gemacht werden","delete_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle löschen wollen? Das kann nicht rückgängig gemacht werden.","download_action":"herunterladen","drafty_attachment":"Dateianhang","drafty_form":"Formular:","drafty_image":"Bild","email_dative":"E-Mail","email_prompt":"E-Mail, z.B. lisam@beispiel.de","enable_peers_messaging":"Aktivieren","enter_confirmation_code_prompt":"Geben Sie den Bestätigungscode ein, der per {method} geschickt wurde:","error_invalid_id":"ungültige ID","file_attachment_too_large":"Die Dateigröße {size} überschreitet das Limit von {limit}.","forgot_password_link":"Passwort vergessen?","full_name_prompt":"Vollständiger Name, z.B. Lisa Musterfrau","granted_permissions":"Erteilt","group_has_no_members":"Keine Mitglieder","group_user_id_prompt":"Gruppe oder Benutzer ID","image_caption_prompt":"Bildunterschrift","invalid_content":"ungültiger Inhalt","invalid_security_token":"Ungültiger Sicherheitsschlüssel","label_client":"Client:","label_content_type":"Inhaltsart:","label_default_access_mode":"Standard Zugriffsmodus:","label_file_name":"Dateiname:","label_group_members":"Gruppenmitglieder:","label_incognito_mode":"inkognito-Modus:","label_message_sound":"Benachrichtigungston:","label_muting_topic":"Stumm geschaltet:","label_other_user":"Andere","label_password":"Passwort","label_permissions":"Berechtigungen:","label_private":"Privater Kommentar","label_push_notifications":"Benachrichtigungsmeldungen:","label_push_notifications_disabled":"Benachrichtigungsmeldungen (erfordert HTTPS):","label_reset_password":"Passwort per E-Mail wiederherstellen:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server Adresse:","label_server_to_use":"Server verwenden:","label_size":"Größe:","label_topic_name":"Name","label_user_contacts":"Kontakte","label_user_id":"ID:","label_wire_transport":"Übertragung per Kabel:","label_you":"Sie:","label_your_name":"Ihr Name","label_your_permissions":"Ihre Berechtigungen:","last_seen_timestamp":"Zuletzt gesehen","leave_chat_warning":"Möchten Sie diese Unterhaltung wirklich verlassen?","link_contact_us":"Kontakt","link_privacy_policy":"Datenschutzerklärung","link_terms_of_service":"Nutzungsbedingungen","login_prompt":"Anmelden","menu_item_archive_topic":"Archivieren","menu_item_block":"Blockieren","menu_item_clear_messages":"Nachrichten leeren","menu_item_clear_messages_for_all":"Für alle leeren","menu_item_delete":"Löschen","menu_item_delete_for_all":"Für alle löschen","menu_item_delete_topic":"Entfernen","menu_item_edit_permissions":"Berechtigungen ändern","menu_item_info":"Info","menu_item_member_delete":"Entfernen","menu_item_mute":"Unterhaltung stumm schalten","menu_item_restore_topic":"Wiederherstellen","menu_item_send_retry":"Wiederholen","menu_item_unblock":"Blockierung aufheben","menu_item_unmute":"Stumm schalten beenden","message_sending":"wird gesendet...","message_sending_failed":"fehlgeschlagen","messages_not_readable":"Neue Nachrichten können nicht gelesen werden","messaging_disabled_prompt":"Nachrichtenübermittlung deaktiviert","more_online_members":"+{overflow} mehr","new_message_prompt":"Neue Nachricht","new_password_placeholder":"Geben Sie ein neues Passwort ein","no_connection":"Keine Verbindung","no_contacts":"Sie haben keine Kontakte :-(","numeric_confirmation_code_prompt":"Nur zahlen","online_now":"jetzt online","password_prompt":"Passwort","password_unchanged_prompt":"unverändert","peers_messaging_disabled":"Gruppennachrichten sind deaktiviert","permission_admin":"Bestätigen ({val})","permission_delete":"Entfernen ({val})","permission_join":"Beitreten ({val})","permission_owner":"Besitzer ({val})","permission_pres":"Benachrichtigt werden ({val})","permission_read":"Lesen ({val})","permission_share":"Teilen ({val})","permission_write":"Schreiben ({val})","phone_dative":"Telefon","private_editing_placeholder":"Nur für Sie sichtbar","push_init_failed":"Initialisierung von Push-Benachrichtigungen fehlgeschlagen","reconnect_countdown":"Getrennt. Wiederverbinden in {seconds}…","reconnect_now":"Jetzt probieren","reload_update":"Neu laden","report_chat_warning":"Möchten Sie diese Unterhaltung wirklich blockieren und melden?","requested_permissions":"Angefordert","save_attachment":"Speichern","search_for_contacts":"Nutzen Sie die Suche um Kontakte zu finden","search_no_results":"Die Suche hatte keine Ergebnisse","search_placeholder":"Liste: email:lisa@beispiel.de, tel:17025550003...","sidepanel_title_acc_notifications":"Benachrichtigungen","sidepanel_title_acc_support":"Unterstützung","sidepanel_title_account_settings":"Konto-Einstellungen","sidepanel_title_archive":"Archivierte Unterhaltungen","sidepanel_title_blocked":"Blockierte Unterhaltungen","sidepanel_title_cred":"Anmeldeinformationen bestätigen","sidepanel_title_login":"Anmelden","sidepanel_title_newtpk":"Neue Unterhaltung starten","sidepanel_title_register":"Konto erstellen","sidepanel_title_reset":"Passwort zurücksetzen","sidepanel_title_settings":"Einstellungen","stay_logged_in":"Angemeldet bleiben","tabtitle_find_user":"Suchen","tabtitle_group_by_id":"nach ID","tabtitle_new_group":"Neue Gruppe","tags_editor_no_tags":"Schlagworte hinzufügen","tags_not_found":"Keine Schlagworte definiert. Erstellen Sie welche.","title_all_contacts":"Alle Kontakte","title_group_members":"Gruppenmitglieder","panel_title_info":"Info","title_manage_tags":"Verwalten","title_not_found":"Nicht gefunden","title_permissions":"Berechtigungen","title_tag_manager":"Schlagworte (Nutzer entdecken)","topic_block_warning":"Möchten Sie diese Unterhaltung wirklich blockieren?","topic_delete_warning":"Möchten Sie diese Unterhaltung wirklich löschen?","topic_name_editing_placeholder":"Freiform Name der Gruppe","unnamed_topic":"Unbenannt","update_available":"Aktualisierung verfügbar.","upload_finishing":"wird abgeschlossen...","user_not_found":"Nicht gefunden","description_editing_placeholder":"Beschreibung (optional)","label_description":"Beschreibung","button_security":"Sicherheit","panel_title_general":"Allgemein","panel_title_security":"Sicherheit","panel_title_crop":"Zum Anpassen ziehen","panel_title_members":"Mitglieder","permissions_anonymous":"Anonym","permissions_authenticated":"Authentifiziert","topic_delete":"Chat löschen","permissions_user":"Benutzerberechtigungen","password_reset_email_sent":"Eine E-Mail mit Sicherheitscode wurde gesendet.","label_unarchive_topic":"Archiviert:","menu_item_reply":"Antwort","menu_item_forward":"Nach vorne","forward_to":"Weiterleiten","forward_to_search_placeholder":"Kontakte durchsuchen","label_new_password":"Neues Kennwort","drafty_unknown":"Nicht unterstützt","calls_incoming":"Eingehender Anruf","calls_outgoing":"Ausgehender Anruf","calls_you_label":"Du","menu_item_video_call":"Videoanruf","already_in_call":"Du redest schon!","call_cancelled":"abgebrochen","call_missed":"verpasster","call_declined":"abgelehnt","call_disconnected":"getrennt","label_use_secure_connection":"Verwenden Sie eine sichere Verbindung","cred_confirmed_successfully":"Erfolgreich bestätigt","menu_item_edit":"Bearbeiten","editing_message":"Bearbeitung","message_edited_marker":", bearbeitet","icon_title_add_image":"Bild hinzufügen","icon_title_attach_file":"Datei anhängen","icon_title_delete":"Aufnahme löschen","icon_title_pause":"Wiedergabe pausieren","icon_title_play":"Aufnahme abspielen","icon_title_record_voice":"Sprachnachricht aufnehmen","icon_title_resume":"Wiedergabe fortsetzen","icon_title_send":"Nachricht senden","drag_file":"Datei hierher ziehen","drafty_video":"Videoaufnahme","call_in_progress":"in Arbeit","menu_item_audio_call":"Anruf","unrecognized_video_format":"Das Format dieses Videos wird nicht erkannt","loading_note":"Laden...","password_i_have_code":"Ich habe Code","label_reset_password_tel":"SMS zum Zurücksetzen des Passworts senden","mobile_phone_number":"Mobiltelefonnummer","password_reset_sms_sent":"Eine SMS mit einem Sicherheitscode wurde gesendet.","mobile_number_required":"Handynummer erforderlich","current_email":"Aktuelle E-Mail","current_phone":"Aktuelle Telefonnummer","new_email":"Neue E-Mail","new_phone_number":"Neue Telefonnummer","change_email":"E-Mail ändern","change_phone":"Telefonnummer ändern","call_busy":"besetzt","failed_to_init_audio":"Audioaufnahme konnte nicht initialisiert werden","calls_conference":"Telefonkonferenz","password_reset_success":"Passwort erfolgreich zurückgesetzt"} \ No newline at end of file diff --git a/src/i18n.min/en.json b/src/i18n.min/en.json index 0e669ab5..1bf3d1f1 100644 --- a/src/i18n.min/en.json +++ b/src/i18n.min/en.json @@ -1 +1 @@ -{"action_block_contact":"Block Contact","action_cancel":"cancel","action_clear_messages":"Clear Messages","action_delete_messages":"Clear Messages for All","action_leave_chat":"Leave Conversation","action_report_chat":"Report Conversation","archived_contacts":"Archived contacts ({count})","badge_danger":"Untrustworthy","badge_owner":"owner","badge_staff":"Staff-managed","badge_verified":"Verified/official","badge_you":"you","block_contact_warning":"Are you sure you want to block this contact?","blocked_contacts_link":"Blocked contacts ({count})","button_add_members":"Add members","button_cancel":"Cancel","button_confirm":"Confirm","button_create":"Create","button_delete_account":"Delete account","button_edit":"Edit","button_logout":"Logout","button_ok":"OK","button_reset":"Reset","button_send_request":"Send request","button_sign_in":"Sign in","button_sign_up":"Sign up","button_subscribe":"Subscribe","button_update":"Update","cannot_initiate_file_upload":"Cannot initiate file upload.","channel":"channel","channel_prompt":"This is a channel","chat_invitation":"You are invited to start a new chat. What would you like to do?","chat_invitation_accept":"Accept","chat_invitation_block":"Block","chat_invitation_ignore":"Ignore","clear_messages_warning":"Are you sure you want to clear all messages? It cannot be undone.","code_doesnot_match":"Code does not match","contacts_not_found":"You have no chats
¯∖_(ツ)_/¯","contacts_not_found_short":"No contacts match ''{query}''","credential_email_prompt":"Your registration email","delete_account":"Delete account","delete_account_warning":"Are you sure you want to delete your account? It cannot be undone.","delete_messages_warning":"Are you sure you want to delete all messages for everyone? It cannot be undone.","download_action":"download","drafty_attachment":"Attachment","drafty_form":"Form:","drafty_image":"Picture","email_dative":"email","email_prompt":"Email, e.g. jdoe@example.com","enable_peers_messaging":"Enable","enter_confirmation_code_prompt":"Confirmation code","error_invalid_id":"Invalid ID","file_attachment_too_large":"The file size {size} exceeds the {limit} limit.","forgot_password_link":"Forgot password?","full_name_prompt":"Full name, e.g. John Doe","granted_permissions":"Granted","group_has_no_members":"No members","group_user_id_prompt":"Group or User ID","image_caption_prompt":"Image caption","invalid_content":"invalid content","invalid_security_token":"Invalid security token","label_client":"Client:","label_content_type":"Content type:","label_default_access_mode":"Default access mode:","label_file_name":"File name:","label_group_members":"Group members:","label_incognito_mode":"Incognito mode:","label_message_sound":"Message sound:","label_muting_topic":"Muted:","label_other_user":"Other","label_password":"Password","label_permissions":"Permissions:","label_private":"Private comment","label_push_notifications":"Notification alerts:","label_push_notifications_disabled":"Notification alerts (requires HTTPS):","label_reset_password":"Send a password reset email:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server address:","label_server_to_use":"Server to use:","label_size":"Size:","label_topic_name":"Name","label_user_contacts":"Contacts","label_user_id":"ID:","label_wire_transport":"Wire transport:","label_you":"You:","label_your_name":"Your name","label_your_permissions":"Your permissions:","last_seen_timestamp":"Last seen","leave_chat_warning":"Are you sure you want to leave this conversation?","link_contact_us":"Contact Us","link_privacy_policy":"Privacy Policy","link_terms_of_service":"Terms of Service","login_prompt":"Login","menu_item_archive_topic":"Archive","menu_item_block":"Block","menu_item_clear_messages":"Clear messages","menu_item_clear_messages_for_all":"Clear for All","menu_item_delete":"Delete","menu_item_delete_for_all":"Delete for All","menu_item_delete_topic":"Delete","menu_item_edit_permissions":"Edit permissions","menu_item_info":"Info","menu_item_member_delete":"Remove","menu_item_mute":"Mute","menu_item_reply":"Reply","menu_item_restore_topic":"Restore","menu_item_send_retry":"Retry","menu_item_unblock":"Unblock","menu_item_unmute":"Unmute","message_sending":"sending...","message_sending_failed":"failed","messages_not_readable":"no access to messages","messaging_disabled_prompt":"Messaging disabled","more_online_members":"+{overflow} more","new_message_prompt":"New message","new_password_placeholder":"Enter new password","no_connection":"No connection","no_contacts":"You have no contacts :-(","numeric_confirmation_code_prompt":"Numbers only","online_now":"online now","password_prompt":"Password","password_unchanged_prompt":"Unchanged","peers_messaging_disabled":"Peer's messaging is disabled.","permission_admin":"Approve ({val})","permission_delete":"Delete ({val})","permission_join":"Join ({val})","permission_owner":"Owner ({val})","permission_pres":"Get notified ({val})","permission_read":"Read ({val})","permission_share":"Share ({val})","permission_write":"Write ({val})","phone_dative":"phone","private_editing_placeholder":"Visible to you only","push_init_failed":"Failed to initialize push notifications","reconnect_countdown":"Disconnected. Reconnecting in {seconds}…","reconnect_now":"Try now","reload_update":"Reload","report_chat_warning":"Are you sure you want to block and report this conversation?","requested_permissions":"Requested","save_attachment":"save","search_for_contacts":"Use search to find contacts","search_no_results":"Search returned no results","search_placeholder":"List like email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_account_settings":"Account Settings","sidepanel_title_archive":"Archived Chats","sidepanel_title_blocked":"Blocked Chats","sidepanel_title_cred":"Confirm Credentials","sidepanel_title_login":"Sign In","sidepanel_title_newtpk":"Start New Chat","sidepanel_title_register":"Create Account","sidepanel_title_reset":"Reset Password","sidepanel_title_settings":"Settings","stay_logged_in":"Stay logged in","tabtitle_find_user":"find","tabtitle_group_by_id":"by id","tabtitle_new_group":"new group","tags_editor_no_tags":"Add some tags","tags_not_found":"No tags defined. Add some.","title_all_contacts":"All Contacts","title_group_members":"Group Members","title_manage_tags":"Manage","title_not_found":"Not found","title_permissions":"Permissions","title_tag_manager":"Tags (search & discovery)","topic_block_warning":"Are you sure you want to block this conversation?","topic_delete_warning":"Are you sure you want to delete this conversation?","topic_name_editing_placeholder":"Freeform name of the group","unnamed_topic":"Unnamed","update_available":"Update available.","upload_finishing":"finishing...","user_not_found":"Not found","description_editing_placeholder":"Optional description","label_description":"Description","button_security":"Security","panel_title_crop":"Drag to Adjust","panel_title_general":"General","panel_title_members":"Members","panel_title_security":"Security","panel_title_info":"Info","permissions_anonymous":"Anonymous","permissions_authenticated":"Authenticated","topic_delete":"Delete Conversation","permissions_user":"User's Permissions","password_reset_email_sent":"An email with security code has been sent.","label_unarchive_topic":"Archived:","menu_item_forward":"Forward","forward_to":"Forward to","forward_to_search_placeholder":"Search contacts","label_new_password":"New password","drafty_unknown":"Unsupported","calls_incoming":"Incoming call","calls_outgoing":"Outgoing call","calls_you_label":"You","menu_item_video_call":"Video call","already_in_call":"You already in an ongoing call!","call_cancelled":"cancelled","call_missed":"missed","call_declined":"declined","call_disconnected":"disconnected","label_use_secure_connection":"Use secure connection","cred_confirmed_successfully":"Confirmed successfully","menu_item_edit":"Edit","editing_message":"Editing","message_edited_marker":", edited","icon_title_add_image":"Add image","icon_title_attach_file":"Attach file","icon_title_delete":"Delete","icon_title_pause":"Pause","icon_title_play":"Play","icon_title_record_voice":"Record voice message","icon_title_resume":"Resume","icon_title_send":"Send message","drag_file":"Drag file here","drafty_video":"Video recording","call_in_progress":"in progress","menu_item_audio_call":"Call","unrecognized_video_format":"Format of this video is not recognized","loading_note":"Loading...","password_i_have_code":"I have code","label_reset_password_tel":"Send a password reset SMS:","mobile_phone_number":"Mobile phone number","password_reset_sms_sent":"A text message with security code has been sent.","mobile_number_required":"Mobile phone number required","current_email":"Current email","current_phone":"Current phone number","new_email":"New email","new_phone_number":"New phone number","change_email":"Change email","change_phone":"Change phone number","call_busy":"busy","failed_to_init_audio":"Failed to initialize audio recording","pin_message":"Pin","unpin_message":"Unpin","calls_conference":"Conference call","password_reset_success":"Password reset successfully"} \ No newline at end of file +{"action_block_contact":"Block Contact","action_cancel":"cancel","action_clear_messages":"Clear Messages","action_delete_messages":"Clear Messages for All","action_leave_chat":"Leave Conversation","action_report_chat":"Report Conversation","archived_contacts":"Archived contacts ({count})","badge_danger":"Untrustworthy","badge_owner":"owner","badge_staff":"Staff-managed","badge_verified":"Verified/official","badge_you":"you","block_contact_warning":"Are you sure you want to block this contact?","blocked_contacts_link":"Blocked contacts ({count})","button_add_members":"Add members","button_cancel":"Cancel","button_confirm":"Confirm","button_create":"Create","button_delete_account":"Delete account","button_edit":"Edit","button_logout":"Logout","button_ok":"OK","button_reset":"Reset","button_send_request":"Send request","button_sign_in":"Sign in","button_sign_up":"Sign up","button_subscribe":"Subscribe","button_update":"Update","cannot_initiate_file_upload":"Cannot initiate file upload.","channel":"channel","channel_prompt":"This is a channel","chat_invitation":"You are invited to start a new chat. What would you like to do?","chat_invitation_accept":"Accept","chat_invitation_block":"Block","chat_invitation_ignore":"Ignore","clear_messages_warning":"Are you sure you want to clear all messages? It cannot be undone.","code_doesnot_match":"Code does not match","contacts_not_found":"You have no chats
¯∖_(ツ)_/¯","contacts_not_found_short":"No contacts match ''{query}''","credential_email_prompt":"Your registration email","delete_account":"Delete account","delete_account_warning":"Are you sure you want to delete your account? It cannot be undone.","delete_messages_warning":"Are you sure you want to delete all messages for everyone? It cannot be undone.","download_action":"download","drafty_attachment":"Attachment","drafty_form":"Form:","drafty_image":"Picture","email_dative":"email","email_prompt":"Email, e.g. jdoe@example.com","enable_peers_messaging":"Enable","enter_confirmation_code_prompt":"Confirmation code","error_invalid_id":"Invalid ID","file_attachment_too_large":"The file size {size} exceeds the {limit} limit.","forgot_password_link":"Forgot password?","full_name_prompt":"Full name, e.g. John Doe","granted_permissions":"Granted","group_has_no_members":"No members","group_user_id_prompt":"Group or User ID","image_caption_prompt":"Image caption","invalid_content":"invalid content","invalid_security_token":"Invalid security token","label_client":"Client:","label_content_type":"Content type:","label_default_access_mode":"Default access mode:","label_file_name":"File name:","label_group_members":"Group members:","label_incognito_mode":"Incognito mode:","label_message_sound":"Message sound:","label_muting_topic":"Muted:","label_other_user":"Other","label_password":"Password","label_permissions":"Permissions:","label_private":"Private comment","label_push_notifications":"Notification alerts:","label_push_notifications_disabled":"Notification alerts (requires HTTPS):","label_reset_password":"Send a password reset email:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server address:","label_server_to_use":"Server to use:","label_size":"Size:","label_topic_name":"Name","label_user_contacts":"Contacts","label_user_id":"ID:","label_wire_transport":"Wire transport:","label_you":"You:","label_your_name":"Your name","label_your_permissions":"Your permissions:","last_seen_timestamp":"Last seen","leave_chat_warning":"Are you sure you want to leave this conversation?","link_contact_us":"Contact Us","link_privacy_policy":"Privacy Policy","link_terms_of_service":"Terms of Service","login_prompt":"Login","menu_item_archive_topic":"Archive","menu_item_block":"Block","menu_item_clear_messages":"Clear messages","menu_item_clear_messages_for_all":"Clear for All","menu_item_delete":"Delete","menu_item_delete_for_all":"Delete for All","menu_item_delete_topic":"Delete","menu_item_edit_permissions":"Edit permissions","menu_item_info":"Info","menu_item_member_delete":"Remove","menu_item_mute":"Mute","menu_item_reply":"Reply","menu_item_restore_topic":"Restore","menu_item_send_retry":"Retry","menu_item_unblock":"Unblock","menu_item_unmute":"Unmute","message_sending":"sending...","message_sending_failed":"failed","messages_not_readable":"no access to messages","messaging_disabled_prompt":"Messaging disabled","more_online_members":"+{overflow} more","new_message_prompt":"New message","new_password_placeholder":"Enter new password","no_connection":"No connection","no_contacts":"You have no contacts :-(","numeric_confirmation_code_prompt":"Numbers only","online_now":"online now","password_prompt":"Password","password_unchanged_prompt":"Unchanged","peers_messaging_disabled":"Peer's messaging is disabled.","permission_admin":"Approve ({val})","permission_delete":"Delete ({val})","permission_join":"Join ({val})","permission_owner":"Owner ({val})","permission_pres":"Get notified ({val})","permission_read":"Read ({val})","permission_share":"Share ({val})","permission_write":"Write ({val})","phone_dative":"phone","private_editing_placeholder":"Visible to you only","push_init_failed":"Failed to initialize push notifications","reconnect_countdown":"Disconnected. Reconnecting in {seconds}…","reconnect_now":"Try now","reload_update":"Reload","report_chat_warning":"Are you sure you want to block and report this conversation?","requested_permissions":"Requested","save_attachment":"save","search_for_contacts":"Use search to find contacts","search_no_results":"Search returned no results","search_placeholder":"List like email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_account_settings":"Account Settings","sidepanel_title_archive":"Archived Chats","sidepanel_title_blocked":"Blocked Chats","sidepanel_title_cred":"Confirm Credentials","sidepanel_title_login":"Sign In","sidepanel_title_newtpk":"Start New Chat","sidepanel_title_register":"Create Account","sidepanel_title_reset":"Reset Password","sidepanel_title_settings":"Settings","stay_logged_in":"Stay logged in","tabtitle_find_user":"find","tabtitle_group_by_id":"by id","tabtitle_new_group":"new group","tags_editor_no_tags":"Add some tags","tags_not_found":"No tags defined. Add some.","title_all_contacts":"All Contacts","title_group_members":"Group Members","title_manage_tags":"Manage","title_not_found":"Not found","title_permissions":"Permissions","title_tag_manager":"Tags (search & discovery)","topic_block_warning":"Are you sure you want to block this conversation?","topic_delete_warning":"Are you sure you want to delete this conversation?","topic_name_editing_placeholder":"Freeform name of the group","unnamed_topic":"Unnamed","update_available":"Update available.","upload_finishing":"finishing...","user_not_found":"Not found","description_editing_placeholder":"Optional description","label_description":"Description","button_security":"Security","panel_title_crop":"Drag to Adjust","panel_title_general":"General","panel_title_members":"Members","panel_title_security":"Security","panel_title_info":"Info","permissions_anonymous":"Anonymous","permissions_authenticated":"Authenticated","topic_delete":"Delete Conversation","permissions_user":"User's Permissions","password_reset_email_sent":"An email with security code has been sent.","label_unarchive_topic":"Archived:","menu_item_forward":"Forward","forward_to":"Forward to","forward_to_search_placeholder":"Search contacts","label_new_password":"New password","drafty_unknown":"Unsupported","calls_incoming":"Incoming call","calls_outgoing":"Outgoing call","calls_you_label":"You","menu_item_video_call":"Video call","already_in_call":"You already in an ongoing call!","call_cancelled":"cancelled","call_missed":"missed","call_declined":"declined","call_disconnected":"disconnected","label_use_secure_connection":"Use secure connection","cred_confirmed_successfully":"Confirmed successfully","menu_item_edit":"Edit","editing_message":"Editing","message_edited_marker":", edited","icon_title_add_image":"Add image","icon_title_attach_file":"Attach file","icon_title_delete":"Delete","icon_title_pause":"Pause","icon_title_play":"Play","icon_title_record_voice":"Record voice message","icon_title_resume":"Resume","icon_title_send":"Send message","drag_file":"Drag file here","drafty_video":"Video recording","call_in_progress":"in progress","menu_item_audio_call":"Call","unrecognized_video_format":"Format of this video is not recognized","loading_note":"Loading...","password_i_have_code":"I have code","label_reset_password_tel":"Send a password reset SMS:","mobile_phone_number":"Mobile phone number","password_reset_sms_sent":"A text message with security code has been sent.","mobile_number_required":"Mobile phone number required","current_email":"Current email","current_phone":"Current phone number","new_email":"New email","new_phone_number":"New phone number","change_email":"Change email","change_phone":"Change phone number","call_busy":"busy","failed_to_init_audio":"Failed to initialize audio recording","pin_message":"Pin","unpin_message":"Unpin","calls_conference":"Conference call","password_reset_success":"Password reset successfully","join_conference":"+ Join"} \ No newline at end of file diff --git a/src/i18n.min/es.json b/src/i18n.min/es.json index 67e38590..b74eca63 100644 --- a/src/i18n.min/es.json +++ b/src/i18n.min/es.json @@ -1 +1 @@ -{"action_block_contact":"Bloquear contacto","action_cancel":"cancelar","action_clear_messages":"Borrar mensajes","action_delete_messages":"Borrar mensajes para todos","action_leave_chat":"Dejar conversación","action_report_chat":"Reportar conversación","archived_contacts":"Contactos archivados ({count})","badge_danger":"Suspicaz","badge_owner":"propietario","badge_staff":"Administración","badge_verified":"Verificado","badge_you":"tú","block_contact_warning":"¿Estás seguro de que quieres bloquear a este contacto?","blocked_contacts_link":"Contactos bloqueados ({count})","button_add_members":"Añadir miembros","button_cancel":"Cancelar","button_confirm":"Confirmar","button_create":"Crear","button_delete_account":"Eliminar cuenta","button_edit":"Editar","button_logout":"Cerrar sesión","button_ok":"OK","button_reset":"Restablecer","button_send_request":"Enviar petición","button_sign_in":"Entrar","button_sign_up":"Regístrate","button_subscribe":"Suscribirse","button_update":"Actualizar","cannot_initiate_file_upload":"No se pudo iniciar la carga del archivo.","channel":"canal","channel_prompt":"Este es un canal","chat_invitation":"Estás invitado a participar en un nuevo chat. ¿Qué te gustaría hacer?","chat_invitation_accept":"Aceptar","chat_invitation_block":"Bloquear","chat_invitation_ignore":"Ignorar","clear_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes? Esta acción es irreversible.","code_doesnot_match":"El código no coincide","contacts_not_found":"No tienes chats
¯∖_(ツ)_/¯","contacts_not_found_short":"Ningún contacto coincide con ''{query}''","credential_email_prompt":"Tu correo electrónico de registro","delete_account":"Eliminar cuenta","delete_account_warning":"¿Estás seguro de que deseas eliminar permanentemente tu cuenta? Esta acción es irreversible.","delete_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes para todos? Esta acción es irreversible.","download_action":"descargar","drafty_attachment":"Archivo","drafty_form":"Formulario:","drafty_image":"Imagen","email_dative":"correo electrónico","email_prompt":"Correo electrónico, p.ej. juan@example.com","enable_peers_messaging":"Habilitar","enter_confirmation_code_prompt":"Introduzca el código de confirmación enviado a tu {method}:","error_invalid_id":"ID inválido","file_attachment_too_large":"El tamaño del archivo {size} excede el límite de {limit}.","forgot_password_link":"¿Olvidaste tu contraseña?","full_name_prompt":"Nombre completo, p.ej. Juan González Hernández","granted_permissions":"Otorgados","group_has_no_members":"No hay miembros","group_user_id_prompt":"ID del grupo o usuario","image_caption_prompt":"Añade un comentario","invalid_content":"contenido inválido","invalid_security_token":"Token de seguridad inválido","label_client":"Cliente:","label_content_type":"Tipo de contenido:","label_default_access_mode":"Modo de acceso predeterminado:","label_file_name":"Nombre del archivo:","label_group_members":"Miembros del grupo:","label_incognito_mode":"Modo incógnito:","label_message_sound":"Sonido de mensaje:","label_muting_topic":"Silenciado:","label_other_user":"Otros","label_password":"Contraseña","label_permissions":"Permisos:","label_private":"Comentario privado","label_push_notifications":"Alertas de notificaciones:","label_push_notifications_disabled":"Alertas de notificaciones (requiere HTTPS):","label_reset_password":"Enviar un correo electrónico de restablecimiento de contraseña:","label_sdk":"SDK:","label_server":"Servidor:","label_server_address":"Dirección del servidor:","label_server_to_use":"Servidor para usar:","label_size":"Tamaño:","label_topic_name":"Nombre del tema","label_user_contacts":"Contactos","label_user_id":"ID:","label_wire_transport":"Transporte de alambre:","label_you":"Tú:","label_your_name":"Tu nombre","label_your_permissions":"Tus permisos:","last_seen_timestamp":"Últ. vez","leave_chat_warning":"¿Estás seguro de que quieres dejar esta conversación?","link_contact_us":"Contáctanos","link_privacy_policy":"Política de privacidad","link_terms_of_service":"Términos de uso","login_prompt":"Nombre de usuario","menu_item_archive_topic":"Archivar","menu_item_block":"Bloquear","menu_item_clear_messages":"Borrar mensajes","menu_item_clear_messages_for_all":"Borrar para todos","menu_item_delete":"Eliminar","menu_item_delete_for_all":"Eliminar para todos","menu_item_delete_topic":"Eliminar","menu_item_edit_permissions":"Editar permisos","menu_item_info":"Información","menu_item_member_delete":"Eliminar","menu_item_mute":"Silenciar","menu_item_restore_topic":"Restaurar","menu_item_send_retry":"Inténtalo de nuevo","menu_item_unblock":"Desbloquear","menu_item_unmute":"Anular el silencio","message_sending":"enviando...","message_sending_failed":"no se pudo enviar el mensaje","messages_not_readable":"sin acceso a mensajes","messaging_disabled_prompt":"El envío de mensajes está deshabilitado","more_online_members":"+{overflow} más","new_message_prompt":"Nuevo mensaje","new_password_placeholder":"Introduzca una nueva contraseña","no_connection":"Sin conexión","no_contacts":"No tienes contactos :-(","numeric_confirmation_code_prompt":"Sólo números","online_now":"en línea","password_prompt":"Contraseña","password_unchanged_prompt":"Sin cambios","peers_messaging_disabled":"La mensajería Peer está deshabilitada.","permission_admin":"Approbar ({val})","permission_delete":"Eliminar ({val})","permission_join":"Unirse ({val})","permission_owner":"Propietario ({val})","permission_pres":"Ser notificado ({val})","permission_read":"Leer ({val})","permission_share":"Compartir ({val})","permission_write":"Escribir ({val})","phone_dative":"teléfono","private_editing_placeholder":"Sólo visible para tí","push_init_failed":"Error al inicializar las notificaciones push","reconnect_countdown":"Desconectado. Reconectando en {seconds}…","reconnect_now":"Reintentar","reload_update":"Recargar","report_chat_warning":"¿Estás seguro de que quieres bloquear y reportar a esta conversación?","requested_permissions":"Solicitados","save_attachment":"guardar","search_for_contacts":"Usa la búsqueda para encontrar contactos","search_no_results":"La búsqueda no arrojó resultados","search_placeholder":"Ej. email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notificaciones","sidepanel_title_acc_support":"Soporte","sidepanel_title_account_settings":"Ajustes de la cuenta","sidepanel_title_archive":"Chats archivados","sidepanel_title_blocked":"Chats bloqueados","sidepanel_title_cred":"Confirmar credenciales","sidepanel_title_login":"Iniciar sesión","sidepanel_title_newtpk":"Iniciar un nuevo chat","sidepanel_title_register":"Crear cuenta","sidepanel_title_reset":"Restablecer contraseña","sidepanel_title_settings":"Ajustes","stay_logged_in":"Permanecer conectado","tabtitle_find_user":"encontrar","tabtitle_group_by_id":"por ID","tabtitle_new_group":"nuevo grupo","tags_editor_no_tags":"Añadir etiquetas","tags_not_found":"No hay etiquetas definidas. Añade unas.","title_all_contacts":"Todos los contactos","title_group_members":"Miembros del grupo","title_manage_tags":"Gestionar","title_not_found":"No encontrado","title_permissions":"Permisos","title_tag_manager":"Etiquetas (descubrimiento de usuarios)","topic_block_warning":"¿Estás seguro de que quieres bloquear esta conversación","topic_delete_warning":"¿Estás seguro de que quieres eliminar esta conversación?","topic_name_editing_placeholder":"Nombre del grupo","unnamed_topic":"Sin nombre","update_available":"Actualización disponible.","upload_finishing":"terminando...","user_not_found":"Usuario no encontrado","description_editing_placeholder":"Descripción (opcional)","label_description":"Descripción","button_security":"Seguridad","panel_title_crop":"Arrastra para ajustar","panel_title_general":"General","panel_title_members":"Miembros","panel_title_security":"Seguridad","panel_title_info":"Información","permissions_anonymous":"Anónimo","permissions_authenticated":"Autenticado","topic_delete":"Eliminar chat","permissions_user":"Permisos del usuario","password_reset_email_sent":"Se ha enviado un correo electrónico con el código de seguridad.","label_unarchive_topic":"Archivado:","menu_item_reply":"Respuesta","menu_item_forward":"Reenviar","forward_to":"Reenviar a","forward_to_search_placeholder":"Buscar contactos","label_new_password":"Nueva contraseña","drafty_unknown":"No soportado","calls_incoming":"Llamada entrante","calls_outgoing":"Llamada saliente","calls_you_label":"Tú","menu_item_video_call":"Videollamada","already_in_call":"¡Ya estás hablando!","call_cancelled":"cancelada","call_missed":"perdida","call_declined":"rechazada","call_disconnected":"desconectada","label_use_secure_connection":"Usar conexión segura","cred_confirmed_successfully":"Confirmado con éxito","menu_item_edit":"Editar","editing_message":"Edición","message_edited_marker":", editado","icon_title_add_image":"Añadir imagen","icon_title_attach_file":"Adjuntar archivo","icon_title_delete":"Eliminar grabación","icon_title_pause":"Pausar reproducción","icon_title_play":"Reproducir grabación","icon_title_record_voice":"Grabar mensaje de voz","icon_title_resume":"Reanudar la reproducción","icon_title_send":"Enviar mensaje","drag_file":"Arrastra el archivo aquí","drafty_video":"Grabación de vídeo","call_in_progress":"en progreso","menu_item_audio_call":"Llamada","unrecognized_video_format":"No se reconoce el formato de este video","loading_note":"Cargando...","password_i_have_code":"Tengo código","label_reset_password_tel":"Enviar SMS para restablecer la contraseña","mobile_phone_number":"Número de teléfono móvil","password_reset_sms_sent":"Se ha enviado un mensaje de texto con un código de seguridad.","mobile_number_required":"Número de teléfono móvil requerido","current_email":"Correo electrónico actual","current_phone":"Número de teléfono actual","new_email":"Nuevo correo electrónico","new_phone_number":"Nuevo número de teléfono","change_email":"Cambiar correo electrónico","change_phone":"Cambiar número de teléfono","call_busy":"ocupado","failed_to_init_audio":"Error al inicializar la grabación de audio","password_reset_success":"Restablecimiento de contraseña con éxito"} \ No newline at end of file +{"action_block_contact":"Bloquear contacto","action_cancel":"cancelar","action_clear_messages":"Borrar mensajes","action_delete_messages":"Borrar mensajes para todos","action_leave_chat":"Dejar conversación","action_report_chat":"Reportar conversación","archived_contacts":"Contactos archivados ({count})","badge_danger":"Suspicaz","badge_owner":"propietario","badge_staff":"Administración","badge_verified":"Verificado","badge_you":"tú","block_contact_warning":"¿Estás seguro de que quieres bloquear a este contacto?","blocked_contacts_link":"Contactos bloqueados ({count})","button_add_members":"Añadir miembros","button_cancel":"Cancelar","button_confirm":"Confirmar","button_create":"Crear","button_delete_account":"Eliminar cuenta","button_edit":"Editar","button_logout":"Cerrar sesión","button_ok":"OK","button_reset":"Restablecer","button_send_request":"Enviar petición","button_sign_in":"Entrar","button_sign_up":"Regístrate","button_subscribe":"Suscribirse","button_update":"Actualizar","cannot_initiate_file_upload":"No se pudo iniciar la carga del archivo.","channel":"canal","channel_prompt":"Este es un canal","chat_invitation":"Estás invitado a participar en un nuevo chat. ¿Qué te gustaría hacer?","chat_invitation_accept":"Aceptar","chat_invitation_block":"Bloquear","chat_invitation_ignore":"Ignorar","clear_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes? Esta acción es irreversible.","code_doesnot_match":"El código no coincide","contacts_not_found":"No tienes chats
¯∖_(ツ)_/¯","contacts_not_found_short":"Ningún contacto coincide con ''{query}''","credential_email_prompt":"Tu correo electrónico de registro","delete_account":"Eliminar cuenta","delete_account_warning":"¿Estás seguro de que deseas eliminar permanentemente tu cuenta? Esta acción es irreversible.","delete_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes para todos? Esta acción es irreversible.","download_action":"descargar","drafty_attachment":"Archivo","drafty_form":"Formulario:","drafty_image":"Imagen","email_dative":"correo electrónico","email_prompt":"Correo electrónico, p.ej. juan@example.com","enable_peers_messaging":"Habilitar","enter_confirmation_code_prompt":"Introduzca el código de confirmación enviado a tu {method}:","error_invalid_id":"ID inválido","file_attachment_too_large":"El tamaño del archivo {size} excede el límite de {limit}.","forgot_password_link":"¿Olvidaste tu contraseña?","full_name_prompt":"Nombre completo, p.ej. Juan González Hernández","granted_permissions":"Otorgados","group_has_no_members":"No hay miembros","group_user_id_prompt":"ID del grupo o usuario","image_caption_prompt":"Añade un comentario","invalid_content":"contenido inválido","invalid_security_token":"Token de seguridad inválido","label_client":"Cliente:","label_content_type":"Tipo de contenido:","label_default_access_mode":"Modo de acceso predeterminado:","label_file_name":"Nombre del archivo:","label_group_members":"Miembros del grupo:","label_incognito_mode":"Modo incógnito:","label_message_sound":"Sonido de mensaje:","label_muting_topic":"Silenciado:","label_other_user":"Otros","label_password":"Contraseña","label_permissions":"Permisos:","label_private":"Comentario privado","label_push_notifications":"Alertas de notificaciones:","label_push_notifications_disabled":"Alertas de notificaciones (requiere HTTPS):","label_reset_password":"Enviar un correo electrónico de restablecimiento de contraseña:","label_sdk":"SDK:","label_server":"Servidor:","label_server_address":"Dirección del servidor:","label_server_to_use":"Servidor para usar:","label_size":"Tamaño:","label_topic_name":"Nombre del tema","label_user_contacts":"Contactos","label_user_id":"ID:","label_wire_transport":"Transporte de alambre:","label_you":"Tú:","label_your_name":"Tu nombre","label_your_permissions":"Tus permisos:","last_seen_timestamp":"Últ. vez","leave_chat_warning":"¿Estás seguro de que quieres dejar esta conversación?","link_contact_us":"Contáctanos","link_privacy_policy":"Política de privacidad","link_terms_of_service":"Términos de uso","login_prompt":"Nombre de usuario","menu_item_archive_topic":"Archivar","menu_item_block":"Bloquear","menu_item_clear_messages":"Borrar mensajes","menu_item_clear_messages_for_all":"Borrar para todos","menu_item_delete":"Eliminar","menu_item_delete_for_all":"Eliminar para todos","menu_item_delete_topic":"Eliminar","menu_item_edit_permissions":"Editar permisos","menu_item_info":"Información","menu_item_member_delete":"Eliminar","menu_item_mute":"Silenciar","menu_item_restore_topic":"Restaurar","menu_item_send_retry":"Inténtalo de nuevo","menu_item_unblock":"Desbloquear","menu_item_unmute":"Anular el silencio","message_sending":"enviando...","message_sending_failed":"no se pudo enviar el mensaje","messages_not_readable":"sin acceso a mensajes","messaging_disabled_prompt":"El envío de mensajes está deshabilitado","more_online_members":"+{overflow} más","new_message_prompt":"Nuevo mensaje","new_password_placeholder":"Introduzca una nueva contraseña","no_connection":"Sin conexión","no_contacts":"No tienes contactos :-(","numeric_confirmation_code_prompt":"Sólo números","online_now":"en línea","password_prompt":"Contraseña","password_unchanged_prompt":"Sin cambios","peers_messaging_disabled":"La mensajería Peer está deshabilitada.","permission_admin":"Approbar ({val})","permission_delete":"Eliminar ({val})","permission_join":"Unirse ({val})","permission_owner":"Propietario ({val})","permission_pres":"Ser notificado ({val})","permission_read":"Leer ({val})","permission_share":"Compartir ({val})","permission_write":"Escribir ({val})","phone_dative":"teléfono","private_editing_placeholder":"Sólo visible para tí","push_init_failed":"Error al inicializar las notificaciones push","reconnect_countdown":"Desconectado. Reconectando en {seconds}…","reconnect_now":"Reintentar","reload_update":"Recargar","report_chat_warning":"¿Estás seguro de que quieres bloquear y reportar a esta conversación?","requested_permissions":"Solicitados","save_attachment":"guardar","search_for_contacts":"Usa la búsqueda para encontrar contactos","search_no_results":"La búsqueda no arrojó resultados","search_placeholder":"Ej. email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notificaciones","sidepanel_title_acc_support":"Soporte","sidepanel_title_account_settings":"Ajustes de la cuenta","sidepanel_title_archive":"Chats archivados","sidepanel_title_blocked":"Chats bloqueados","sidepanel_title_cred":"Confirmar credenciales","sidepanel_title_login":"Iniciar sesión","sidepanel_title_newtpk":"Iniciar un nuevo chat","sidepanel_title_register":"Crear cuenta","sidepanel_title_reset":"Restablecer contraseña","sidepanel_title_settings":"Ajustes","stay_logged_in":"Permanecer conectado","tabtitle_find_user":"encontrar","tabtitle_group_by_id":"por ID","tabtitle_new_group":"nuevo grupo","tags_editor_no_tags":"Añadir etiquetas","tags_not_found":"No hay etiquetas definidas. Añade unas.","title_all_contacts":"Todos los contactos","title_group_members":"Miembros del grupo","title_manage_tags":"Gestionar","title_not_found":"No encontrado","title_permissions":"Permisos","title_tag_manager":"Etiquetas (descubrimiento de usuarios)","topic_block_warning":"¿Estás seguro de que quieres bloquear esta conversación","topic_delete_warning":"¿Estás seguro de que quieres eliminar esta conversación?","topic_name_editing_placeholder":"Nombre del grupo","unnamed_topic":"Sin nombre","update_available":"Actualización disponible.","upload_finishing":"terminando...","user_not_found":"Usuario no encontrado","description_editing_placeholder":"Descripción (opcional)","label_description":"Descripción","button_security":"Seguridad","panel_title_crop":"Arrastra para ajustar","panel_title_general":"General","panel_title_members":"Miembros","panel_title_security":"Seguridad","panel_title_info":"Información","permissions_anonymous":"Anónimo","permissions_authenticated":"Autenticado","topic_delete":"Eliminar chat","permissions_user":"Permisos del usuario","password_reset_email_sent":"Se ha enviado un correo electrónico con el código de seguridad.","label_unarchive_topic":"Archivado:","menu_item_reply":"Respuesta","menu_item_forward":"Reenviar","forward_to":"Reenviar a","forward_to_search_placeholder":"Buscar contactos","label_new_password":"Nueva contraseña","drafty_unknown":"No soportado","calls_incoming":"Llamada entrante","calls_outgoing":"Llamada saliente","calls_you_label":"Tú","menu_item_video_call":"Videollamada","already_in_call":"¡Ya estás hablando!","call_cancelled":"cancelada","call_missed":"perdida","call_declined":"rechazada","call_disconnected":"desconectada","label_use_secure_connection":"Usar conexión segura","cred_confirmed_successfully":"Confirmado con éxito","menu_item_edit":"Editar","editing_message":"Edición","message_edited_marker":", editado","icon_title_add_image":"Añadir imagen","icon_title_attach_file":"Adjuntar archivo","icon_title_delete":"Eliminar grabación","icon_title_pause":"Pausar reproducción","icon_title_play":"Reproducir grabación","icon_title_record_voice":"Grabar mensaje de voz","icon_title_resume":"Reanudar la reproducción","icon_title_send":"Enviar mensaje","drag_file":"Arrastra el archivo aquí","drafty_video":"Grabación de vídeo","call_in_progress":"en progreso","menu_item_audio_call":"Llamada","unrecognized_video_format":"No se reconoce el formato de este video","loading_note":"Cargando...","password_i_have_code":"Tengo código","label_reset_password_tel":"Enviar SMS para restablecer la contraseña","mobile_phone_number":"Número de teléfono móvil","password_reset_sms_sent":"Se ha enviado un mensaje de texto con un código de seguridad.","mobile_number_required":"Número de teléfono móvil requerido","current_email":"Correo electrónico actual","current_phone":"Número de teléfono actual","new_email":"Nuevo correo electrónico","new_phone_number":"Nuevo número de teléfono","change_email":"Cambiar correo electrónico","change_phone":"Cambiar número de teléfono","call_busy":"ocupado","failed_to_init_audio":"Error al inicializar la grabación de audio","calls_conference":"Conferencia","password_reset_success":"Restablecimiento de contraseña con éxito"} \ No newline at end of file diff --git a/src/i18n.min/fr.json b/src/i18n.min/fr.json index 8c2c351e..c591052c 100644 --- a/src/i18n.min/fr.json +++ b/src/i18n.min/fr.json @@ -1 +1 @@ -{"action_block_contact":"Bloquer le Contact","action_cancel":"annuler","action_clear_messages":"Effacer les Messages","action_delete_messages":"Effacer les Messages pour Tous","action_leave_chat":"Quitter la Conversation","action_report_chat":"Signaler la Conversation","archived_contacts":"Contacts archivés ({count})","badge_danger":"Non fiable","badge_owner":"propriétaire","badge_staff":"Géré par le Staff","badge_verified":"Vérifié / Officiel","badge_you":"vous","block_contact_warning":"Êtes-vous sûr de bloquer le contact ?","blocked_contacts_link":"Contacts bloqués ({count})","button_add_members":"Ajouter des membres","button_cancel":"Annuler","button_confirm":"Confirmer","button_create":"Créer","button_delete_account":"Supprimer le compte","button_edit":"Modifier","button_logout":"Déconnexion","button_ok":"OK","button_reset":"Remettre à Zéro","button_send_request":"Envoyer une demande","button_sign_in":"Connexion","button_sign_up":"Créer un compte","button_subscribe":"S'abonner","button_update":"Mettre à jour","cannot_initiate_file_upload":"Impossible de démarrer l'envoi.","channel":"canal","channel_prompt":"C'est un canal","chat_invitation":"Vous êtes invité à démarrer une conversation. Que voulez vous faire ?","chat_invitation_accept":"Accepter","chat_invitation_block":"Bloquer","chat_invitation_ignore":"Ignorer","clear_messages_warning":"Êtes-vous sûr de vouloir effacer tous les messages ? Aucun retour possible.","code_doesnot_match":"Le code ne correspond pas","contacts_not_found":"Vous n'avez aucune conversation
¯∖_(ツ)_/¯","contacts_not_found_short":"Aucun contact ne correspond à ''{query}''","credential_email_prompt":"Votre email d'enregistrement","delete_account":"Supprimer le compte","delete_account_warning":"Êtes-vous sûr de vouloir supprimer votre compte ? Aucun retour possible.","delete_messages_warning":"Êtes-vous sûr de vouloir supprimer tous les messages pour tous ? Aucun retour possible.","download_action":"télécharger","drafty_attachment":"Pièce(s) jointe(s)","drafty_form":"Formulaire:","drafty_image":"Image","email_dative":"email","email_prompt":"Email, par exemple jdoe@exemple.com","enable_peers_messaging":"Activer","enter_confirmation_code_prompt":"Entrez le code de confirmation envoyé par {method}:","error_invalid_id":"Identifiant invalide","file_attachment_too_large":"Le fichier de taille {size} dépasse la limite de {limit}.","forgot_password_link":"Mot de passe oublié ?","full_name_prompt":"Nom complet, par exemple John Doe","granted_permissions":"Accordé","group_has_no_members":"Aucun membre","group_user_id_prompt":"Identifiant d'utilisateur ou de groupe","image_caption_prompt":"Description de l'image","invalid_content":"contenu invalide","invalid_security_token":"Token de sécurité invalide","label_client":"Client :","label_content_type":"Type de contenu :","label_default_access_mode":"Mode d'accès par défaut :","label_file_name":"Nom du fichier :","label_group_members":"Membres du groupe :","label_incognito_mode":"Mode incognito :","label_message_sound":"Son du message :","label_muting_topic":"Mué :","label_other_user":"Autre","label_password":"Mot de passe","label_permissions":"Permissions :","label_private":"Commentaire privé","label_push_notifications":"Notifications :","label_push_notifications_disabled":"Notifications (requière HTTPS):","label_reset_password":"Envoyer un mail de remise à zéro de mot de passe :","label_sdk":"SDK :","label_server":"Serveur :","label_server_address":"Adresse du serveur :","label_server_to_use":"Serveur à utiliser :","label_size":"Taille :","label_topic_name":"Nom","label_user_contacts":"Contacts","label_user_id":"ID :","label_wire_transport":"Transport par cable :","label_you":"Vous :","label_your_name":"Votre nom","label_your_permissions":"Vos permissions :","last_seen_timestamp":"Vu pour la dernière fois","leave_chat_warning":"Êtes-vous sûr de vouloir quitter cette conversation ?","link_contact_us":"Contactez Nous","link_privacy_policy":"Politique de confidentialité","link_terms_of_service":"Conditions d'utilisation","login_prompt":"Connexion","menu_item_archive_topic":"Archiver","menu_item_block":"Bloquer","menu_item_clear_messages":"Effacer les messages","menu_item_clear_messages_for_all":"Effacer pour Tous","menu_item_delete":"Supprimer","menu_item_delete_for_all":"Supprimer pour Tous","menu_item_delete_topic":"Supprimer","menu_item_edit_permissions":"Modifier les permissions","menu_item_info":"Informations","menu_item_member_delete":"Supprimer","menu_item_mute":"Rendre muer","menu_item_reply":"Répondre","menu_item_restore_topic":"Restorer","menu_item_send_retry":"Réessayer","menu_item_unblock":"Débloquer","menu_item_unmute":"Recevoir à nouveau","message_sending":"envoi en cours...","message_sending_failed":"échoué","messages_not_readable":"aucun accès aux messages","messaging_disabled_prompt":"Discussion désactivée","more_online_members":"+{overflow} de plus","new_message_prompt":"Nouveau message","new_password_placeholder":"Entrez un nouveau mot de passe","no_connection":"Aucune connexion","no_contacts":"Vous n'avez pas de contacts :-(","numeric_confirmation_code_prompt":"Nombres seulement","online_now":"en ligne","password_prompt":"Mot de passe","password_unchanged_prompt":"Non changé","peers_messaging_disabled":"La messagerie point à point est désactivée.","permission_admin":"Approver ({val})","permission_delete":"Supprimer ({val})","permission_join":"Rejoindre ({val})","permission_owner":"Propriétaire ({val})","permission_pres":"Recevoir une notification ({val})","permission_read":"Lire ({val})","permission_share":"Partager ({val})","permission_write":"Ecrire ({val})","phone_dative":"téléphone","private_editing_placeholder":"Visible par vous seulement","push_init_failed":"Impossible d'initialiser les notifications push","reconnect_countdown":"Déconnecté. Reconnexion dans {seconds}…","reconnect_now":"Essayer maintenant","reload_update":"Recharger","report_chat_warning":"Êtes-vous sûr de vouloir bloquer et signaler cette conversation ?","requested_permissions":"Demandé","save_attachment":"sauvegarder","search_for_contacts":"Utilisez la recherche pour trouver des contacts","search_no_results":"La recherche n'a donné aucun résultat","search_placeholder":"Liste comme email:alice@exemple.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_account_settings":"Paramètres du compte","sidepanel_title_archive":"Conversations Archivées","sidepanel_title_blocked":"Conversations Bloquées","sidepanel_title_cred":"Confirmer les identifiants","sidepanel_title_login":"Se Connecter","sidepanel_title_newtpk":"Démarrer une nouvelle Conversation","sidepanel_title_register":"Créer un compte","sidepanel_title_reset":"Remettre à Zéro le Mot de Passe","sidepanel_title_settings":"Paramètres","stay_logged_in":"Rester connecté","tabtitle_find_user":"trouver","tabtitle_group_by_id":"par identifiant","tabtitle_new_group":"nouveau groupe","tags_editor_no_tags":"Ajouter des étiquettes","tags_not_found":"Aucune étiquette définie. Ajoutez en.","title_all_contacts":"Tous les Contacts","title_group_members":"Membres du Groupe","title_manage_tags":"Gérer","title_not_found":"Pas trouvé","title_permissions":"Permissions","title_tag_manager":"Etiquettes (recherche & découverte)","topic_block_warning":"Êtes-vous sûr de vouloir bloquer cette conversation ?","topic_delete_warning":"Êtes-vous sûr de vouloir supprimer cette conversation ?","topic_name_editing_placeholder":"Nom libre du groupe","unnamed_topic":"Non nommé","update_available":"Mise à jour disponible.","upload_finishing":"fin...","user_not_found":"Pas trouvé","description_editing_placeholder":"Description facultative","label_description":"Description","button_security":"Sécurité","panel_title_crop":"Déplacez pour ajuster","panel_title_general":"Général","panel_title_members":"Membres","panel_title_security":"Sécurité","panel_title_info":"Informations","permissions_anonymous":"Anonyme","permissions_authenticated":"Authentifié","topic_delete":"Supprimer la Conversation","permissions_user":"Permissions d'Utilisateur","password_reset_email_sent":"Un e-mail avec code de sécurité a été envoyé.","label_unarchive_topic":"Archivé:","menu_item_forward":"Transférer","forward_to":"Transférer à","forward_to_search_placeholder":"Rechercher des contacts","label_new_password":"Nouveau mot de passe","drafty_unknown":"Non supporté","already_in_call":"Vous êtes déjà dans un appel en cours!","call_cancelled":"annulé","call_declined":"refusé","call_missed":"manqué","calls_incoming":"Appel entrant","calls_outgoing":"Appel sortant","calls_you_label":"Tu","menu_item_video_call":"Appel vidéo","call_disconnected":"débranché","label_use_secure_connection":"Utiliser une connexion sécurisée","cred_confirmed_successfully":"Confirmé avec succès","menu_item_edit":"Modifier","editing_message":"Édition","message_edited_marker":", édité","icon_title_add_image":"Ajouter une image","icon_title_attach_file":"Pièce jointe","icon_title_delete":"Supprimer l'enregistrement","icon_title_pause":"Interrompre la lecture","icon_title_play":"Lire l'enregistrement","icon_title_record_voice":"Enregistrer un message vocal","icon_title_resume":"Reprendre la lecture","icon_title_send":"Envoyer le message","drag_file":"Faites glisser le fichier ici","drafty_video":"Enregistrement video","call_in_progress":"en cours","menu_item_audio_call":"Appel","unrecognized_video_format":"Le format de cette vidéo n'est pas reconnu","loading_note":"Chargement...","password_i_have_code":"J'ai du code","label_reset_password_tel":"Envoyer un SMS pour réinitialiser le mot de passe","mobile_phone_number":"Numéro de téléphone mobile","password_reset_sms_sent":"Un message texte avec un code de sécurité a été envoyé.","mobile_number_required":"Numéro de téléphone portable requis","current_email":"Courriel actuel","current_phone":"Numéro de téléphone actuel","new_email":"Nouvel e-mail","new_phone_number":"Nouveau numéro de téléphone","change_email":"Modifier l'e-mail","change_phone":"Modifier le numéro de téléphone","call_busy":"occupé","failed_to_init_audio":"Échec de l'initialisation de l'enregistrement audio","password_reset_success":"Mot de passe réinitialisé avec succès"} \ No newline at end of file +{"action_block_contact":"Bloquer le Contact","action_cancel":"annuler","action_clear_messages":"Effacer les Messages","action_delete_messages":"Effacer les Messages pour Tous","action_leave_chat":"Quitter la Conversation","action_report_chat":"Signaler la Conversation","archived_contacts":"Contacts archivés ({count})","badge_danger":"Non fiable","badge_owner":"propriétaire","badge_staff":"Géré par le Staff","badge_verified":"Vérifié / Officiel","badge_you":"vous","block_contact_warning":"Êtes-vous sûr de bloquer le contact ?","blocked_contacts_link":"Contacts bloqués ({count})","button_add_members":"Ajouter des membres","button_cancel":"Annuler","button_confirm":"Confirmer","button_create":"Créer","button_delete_account":"Supprimer le compte","button_edit":"Modifier","button_logout":"Déconnexion","button_ok":"OK","button_reset":"Remettre à Zéro","button_send_request":"Envoyer une demande","button_sign_in":"Connexion","button_sign_up":"Créer un compte","button_subscribe":"S'abonner","button_update":"Mettre à jour","cannot_initiate_file_upload":"Impossible de démarrer l'envoi.","channel":"canal","channel_prompt":"C'est un canal","chat_invitation":"Vous êtes invité à démarrer une conversation. Que voulez vous faire ?","chat_invitation_accept":"Accepter","chat_invitation_block":"Bloquer","chat_invitation_ignore":"Ignorer","clear_messages_warning":"Êtes-vous sûr de vouloir effacer tous les messages ? Aucun retour possible.","code_doesnot_match":"Le code ne correspond pas","contacts_not_found":"Vous n'avez aucune conversation
¯∖_(ツ)_/¯","contacts_not_found_short":"Aucun contact ne correspond à ''{query}''","credential_email_prompt":"Votre email d'enregistrement","delete_account":"Supprimer le compte","delete_account_warning":"Êtes-vous sûr de vouloir supprimer votre compte ? Aucun retour possible.","delete_messages_warning":"Êtes-vous sûr de vouloir supprimer tous les messages pour tous ? Aucun retour possible.","download_action":"télécharger","drafty_attachment":"Pièce(s) jointe(s)","drafty_form":"Formulaire:","drafty_image":"Image","email_dative":"email","email_prompt":"Email, par exemple jdoe@exemple.com","enable_peers_messaging":"Activer","enter_confirmation_code_prompt":"Entrez le code de confirmation envoyé par {method}:","error_invalid_id":"Identifiant invalide","file_attachment_too_large":"Le fichier de taille {size} dépasse la limite de {limit}.","forgot_password_link":"Mot de passe oublié ?","full_name_prompt":"Nom complet, par exemple John Doe","granted_permissions":"Accordé","group_has_no_members":"Aucun membre","group_user_id_prompt":"Identifiant d'utilisateur ou de groupe","image_caption_prompt":"Description de l'image","invalid_content":"contenu invalide","invalid_security_token":"Token de sécurité invalide","label_client":"Client :","label_content_type":"Type de contenu :","label_default_access_mode":"Mode d'accès par défaut :","label_file_name":"Nom du fichier :","label_group_members":"Membres du groupe :","label_incognito_mode":"Mode incognito :","label_message_sound":"Son du message :","label_muting_topic":"Mué :","label_other_user":"Autre","label_password":"Mot de passe","label_permissions":"Permissions :","label_private":"Commentaire privé","label_push_notifications":"Notifications :","label_push_notifications_disabled":"Notifications (requière HTTPS):","label_reset_password":"Envoyer un mail de remise à zéro de mot de passe :","label_sdk":"SDK :","label_server":"Serveur :","label_server_address":"Adresse du serveur :","label_server_to_use":"Serveur à utiliser :","label_size":"Taille :","label_topic_name":"Nom","label_user_contacts":"Contacts","label_user_id":"ID :","label_wire_transport":"Transport par cable :","label_you":"Vous :","label_your_name":"Votre nom","label_your_permissions":"Vos permissions :","last_seen_timestamp":"Vu pour la dernière fois","leave_chat_warning":"Êtes-vous sûr de vouloir quitter cette conversation ?","link_contact_us":"Contactez Nous","link_privacy_policy":"Politique de confidentialité","link_terms_of_service":"Conditions d'utilisation","login_prompt":"Connexion","menu_item_archive_topic":"Archiver","menu_item_block":"Bloquer","menu_item_clear_messages":"Effacer les messages","menu_item_clear_messages_for_all":"Effacer pour Tous","menu_item_delete":"Supprimer","menu_item_delete_for_all":"Supprimer pour Tous","menu_item_delete_topic":"Supprimer","menu_item_edit_permissions":"Modifier les permissions","menu_item_info":"Informations","menu_item_member_delete":"Supprimer","menu_item_mute":"Rendre muer","menu_item_reply":"Répondre","menu_item_restore_topic":"Restorer","menu_item_send_retry":"Réessayer","menu_item_unblock":"Débloquer","menu_item_unmute":"Recevoir à nouveau","message_sending":"envoi en cours...","message_sending_failed":"échoué","messages_not_readable":"aucun accès aux messages","messaging_disabled_prompt":"Discussion désactivée","more_online_members":"+{overflow} de plus","new_message_prompt":"Nouveau message","new_password_placeholder":"Entrez un nouveau mot de passe","no_connection":"Aucune connexion","no_contacts":"Vous n'avez pas de contacts :-(","numeric_confirmation_code_prompt":"Nombres seulement","online_now":"en ligne","password_prompt":"Mot de passe","password_unchanged_prompt":"Non changé","peers_messaging_disabled":"La messagerie point à point est désactivée.","permission_admin":"Approver ({val})","permission_delete":"Supprimer ({val})","permission_join":"Rejoindre ({val})","permission_owner":"Propriétaire ({val})","permission_pres":"Recevoir une notification ({val})","permission_read":"Lire ({val})","permission_share":"Partager ({val})","permission_write":"Ecrire ({val})","phone_dative":"téléphone","private_editing_placeholder":"Visible par vous seulement","push_init_failed":"Impossible d'initialiser les notifications push","reconnect_countdown":"Déconnecté. Reconnexion dans {seconds}…","reconnect_now":"Essayer maintenant","reload_update":"Recharger","report_chat_warning":"Êtes-vous sûr de vouloir bloquer et signaler cette conversation ?","requested_permissions":"Demandé","save_attachment":"sauvegarder","search_for_contacts":"Utilisez la recherche pour trouver des contacts","search_no_results":"La recherche n'a donné aucun résultat","search_placeholder":"Liste comme email:alice@exemple.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_account_settings":"Paramètres du compte","sidepanel_title_archive":"Conversations Archivées","sidepanel_title_blocked":"Conversations Bloquées","sidepanel_title_cred":"Confirmer les identifiants","sidepanel_title_login":"Se Connecter","sidepanel_title_newtpk":"Démarrer une nouvelle Conversation","sidepanel_title_register":"Créer un compte","sidepanel_title_reset":"Remettre à Zéro le Mot de Passe","sidepanel_title_settings":"Paramètres","stay_logged_in":"Rester connecté","tabtitle_find_user":"trouver","tabtitle_group_by_id":"par identifiant","tabtitle_new_group":"nouveau groupe","tags_editor_no_tags":"Ajouter des étiquettes","tags_not_found":"Aucune étiquette définie. Ajoutez en.","title_all_contacts":"Tous les Contacts","title_group_members":"Membres du Groupe","title_manage_tags":"Gérer","title_not_found":"Pas trouvé","title_permissions":"Permissions","title_tag_manager":"Etiquettes (recherche & découverte)","topic_block_warning":"Êtes-vous sûr de vouloir bloquer cette conversation ?","topic_delete_warning":"Êtes-vous sûr de vouloir supprimer cette conversation ?","topic_name_editing_placeholder":"Nom libre du groupe","unnamed_topic":"Non nommé","update_available":"Mise à jour disponible.","upload_finishing":"fin...","user_not_found":"Pas trouvé","description_editing_placeholder":"Description facultative","label_description":"Description","button_security":"Sécurité","panel_title_crop":"Déplacez pour ajuster","panel_title_general":"Général","panel_title_members":"Membres","panel_title_security":"Sécurité","panel_title_info":"Informations","permissions_anonymous":"Anonyme","permissions_authenticated":"Authentifié","topic_delete":"Supprimer la Conversation","permissions_user":"Permissions d'Utilisateur","password_reset_email_sent":"Un e-mail avec code de sécurité a été envoyé.","label_unarchive_topic":"Archivé:","menu_item_forward":"Transférer","forward_to":"Transférer à","forward_to_search_placeholder":"Rechercher des contacts","label_new_password":"Nouveau mot de passe","drafty_unknown":"Non supporté","already_in_call":"Vous êtes déjà dans un appel en cours!","call_cancelled":"annulé","call_declined":"refusé","call_missed":"manqué","calls_incoming":"Appel entrant","calls_outgoing":"Appel sortant","calls_you_label":"Tu","menu_item_video_call":"Appel vidéo","call_disconnected":"débranché","label_use_secure_connection":"Utiliser une connexion sécurisée","cred_confirmed_successfully":"Confirmé avec succès","menu_item_edit":"Modifier","editing_message":"Édition","message_edited_marker":", édité","icon_title_add_image":"Ajouter une image","icon_title_attach_file":"Pièce jointe","icon_title_delete":"Supprimer l'enregistrement","icon_title_pause":"Interrompre la lecture","icon_title_play":"Lire l'enregistrement","icon_title_record_voice":"Enregistrer un message vocal","icon_title_resume":"Reprendre la lecture","icon_title_send":"Envoyer le message","drag_file":"Faites glisser le fichier ici","drafty_video":"Enregistrement video","call_in_progress":"en cours","menu_item_audio_call":"Appel","unrecognized_video_format":"Le format de cette vidéo n'est pas reconnu","loading_note":"Chargement...","password_i_have_code":"J'ai du code","label_reset_password_tel":"Envoyer un SMS pour réinitialiser le mot de passe","mobile_phone_number":"Numéro de téléphone mobile","password_reset_sms_sent":"Un message texte avec un code de sécurité a été envoyé.","mobile_number_required":"Numéro de téléphone portable requis","current_email":"Courriel actuel","current_phone":"Numéro de téléphone actuel","new_email":"Nouvel e-mail","new_phone_number":"Nouveau numéro de téléphone","change_email":"Modifier l'e-mail","change_phone":"Modifier le numéro de téléphone","call_busy":"occupé","failed_to_init_audio":"Échec de l'initialisation de l'enregistrement audio","calls_conference":"Conférence téléphonique","password_reset_success":"Mot de passe réinitialisé avec succès"} \ No newline at end of file diff --git a/src/i18n.min/ko.json b/src/i18n.min/ko.json index 8dedd69f..226f13f5 100644 --- a/src/i18n.min/ko.json +++ b/src/i18n.min/ko.json @@ -1 +1 @@ -{"action_block_contact":"연락차단","action_cancel":"취소","action_clear_messages":"메시지지우기","action_delete_messages":"모든메시지지우기","action_leave_chat":"대화나누기","action_report_chat":"대화기록","archived_contacts":"보관된연락처({수})","badge_danger":"의심 많은","badge_owner":"소유자","badge_staff":"직원 관리하에","badge_verified":"확인 됨","badge_you":"당신","block_contact_warning":"이연락처를차단하시겠습니까?","blocked_contacts_link":"차단된연락처({수})","button_add_members":"회원추가","button_cancel":"취소","button_confirm":"확인","button_create":"작성","button_delete_account":"계정삭제","button_edit":"편집","button_logout":"로그아웃","button_ok":"OK","button_reset":"재설정","button_send_request":"요청보내기","button_sign_in":"로그인","button_sign_up":"가입","button_subscribe":"구독","button_update":"업데이트","cannot_initiate_file_upload":"파일업로드를시작할수없습니다.","channel":"채널","channel_prompt":"이 채널입니다","chat_invitation":"새로운대화를시작하도록초대되었습니다.무엇을하시겠습니까?","chat_invitation_accept":"수락","chat_invitation_block":"차단","chat_invitation_ignore":"무시","clear_messages_warning":"모든메시지를지우시겠습니까?실행취소할수없습니다.","code_doesnot_match":"코드가일치하지않습니다","contacts_not_found":"채팅이없습니다
¯∖_(ツ)_/¯","contacts_not_found_short":"'{문의}'와일치하는연락처가없습니다.","credential_email_prompt":"등록이메일","delete_account":"계정삭제","delete_account_warning":"계정을삭제하시겠습니까?실행취소할수없습니다.","delete_messages_warning":"모든사람의모든메시지를삭제하시겠습니까?실행취소할수없습니다.","download_action":"다운로드","drafty_attachment":"부착","drafty_form":"형태:","drafty_image":"이미지","email_dative":"이메일","email_prompt":"이메일(예:hong@example.com)","enable_peers_messaging":"활성화","enter_confirmation_code_prompt":"{방법}으로보낸확인코드를입력하십시오:","error_invalid_id":"잘못된ID","file_attachment_too_large":"파일크기{크기}이(가){제한}제한을초과합니다.","forgot_password_link":"비밀번호를잊으셨습니까?","full_name_prompt":"전체이름(예:홍길동)","granted_permissions":"승낙하다","group_has_no_members":"회원없음","group_user_id_prompt":"그룹또는사용자ID","image_caption_prompt":"이미지설명","invalid_content":"잘못된내용","invalid_security_token":"유효하지않은보안토큰","label_client":"클라이언트: ","label_content_type":"컨텐츠유형: ","label_default_access_mode":"기본액세스모드: ","label_file_name":"파일이름: ","label_group_members":"그룹회원: ","label_incognito_mode":"시크릿모드: ","label_message_sound":"메시지소리: ","label_muting_topic":"음소거: ","label_other_user":"기타","label_password":"비밀번호","label_permissions":"권한: ","label_private":"개인코멘트","label_push_notifications":"통지경보: ","label_push_notifications_disabled":"통지경보(HTTPS필요): ","label_reset_password":"비밀번호재설정이메일보내기: ","label_sdk":"SDK:","label_server":"서버: ","label_server_address":"서버주소: ","label_server_to_use":"사용할서버:","label_size":"크기: ","label_topic_name":"이름","label_user_contacts":"연락처","label_user_id":"ID:","label_wire_transport":"와이어수송:","label_you":"당신: ","label_your_name":"이름","label_your_permissions":"권한: ","last_seen_timestamp":"마지막으로본","leave_chat_warning":"이대화를나가시겠습니까?","link_contact_us":"문의처","link_privacy_policy":"개인정보보호정책","link_terms_of_service":"서비스약관","login_prompt":"로그인","menu_item_archive_topic":"보관","menu_item_block":"차단","menu_item_clear_messages":"메시지지우기","menu_item_clear_messages_for_all":"모두지우기","menu_item_delete":"삭제","menu_item_delete_for_all":"모두삭제","menu_item_delete_topic":"삭제","menu_item_edit_permissions":"편집권한","menu_item_info":"정보","menu_item_member_delete":"제거","menu_item_mute":"음소거","menu_item_restore_topic":"복원","menu_item_send_retry":"다시시도","menu_item_unblock":"차단해제","menu_item_unmute":"음소거해제","message_sending":"보내기...","message_sending_failed":"실패","messages_not_readable":"메시지에 액세스 할 수 없습니다","messaging_disabled_prompt":"메시지비활성화","more_online_members":"+{넘침}더보기","new_message_prompt":"새메시지","new_password_placeholder":"새비밀번호입력","no_connection":"연결없음","no_contacts":"연락처가없습니다 (._.)","numeric_confirmation_code_prompt":"숫자만","online_now":"현재접속중","password_prompt":"비밀번호","password_unchanged_prompt":"변경되지않음","peers_messaging_disabled":"동료의메시지가비활성화되었습니다.","permission_admin":"승인({val})","permission_delete":"삭제({val})","permission_join":"참여({val})","permission_owner":"소유자({val})","permission_pres":"알림받기({val})","permission_read":"읽기({val})","permission_share":"공유({val})","permission_write":"쓰기({val})","phone_dative":"전화","private_editing_placeholder":"나만볼수있습니다","push_init_failed":"푸시알림을초기화하지못했습니다","reconnect_countdown":"연결이끊어졌습니다.다시연결하는중{초}…","reconnect_now":"지금시도","reload_update":"재로드","report_chat_warning":"이대화를차단하고기록하시겠습니까?","requested_permissions":"요청","save_attachment":"저장","search_for_contacts":"검색을사용하여연락처찾기","search_no_results":"검색결과가없습니다","search_placeholder":"email:alice@example.com,tel:17025550003...와같은목록","sidepanel_title_acc_notifications":"알림","sidepanel_title_acc_support":"지원","sidepanel_title_account_settings":"계정설정","sidepanel_title_archive":"보관된채팅","sidepanel_title_blocked":"차단된채팅","sidepanel_title_cred":"자격증명확인","sidepanel_title_login":"로그인","sidepanel_title_newtpk":"새채팅시작","sidepanel_title_register":"계정만들기","sidepanel_title_reset":"비밀번호재설정","sidepanel_title_settings":"설정","stay_logged_in":"로그인상태유지","tabtitle_find_user":"찾기","tabtitle_group_by_id":"id로","tabtitle_new_group":"새그룹","tags_editor_no_tags":"일부태그추가","tags_not_found":"태그가정의되지않았습니다.일부를추가하십시오.","title_all_contacts":"모든연락처","title_group_members":"그룹구성원","title_manage_tags":"관리","title_not_found":"찾을수없음","title_permissions":"권한","title_tag_manager":"태그(사용자검색)","topic_block_warning":"이대화를차단하시겠습니까?","topic_delete_warning":"이대화를삭제하시겠습니까?","topic_name_editing_placeholder":"그룹의자유형이름","unnamed_topic":"이름없는","update_available":"업데이트가능.","upload_finishing":"마무리...","user_not_found":"찾을수없음","description_editing_placeholder":"설명(선택 사항)","label_description":"설명","button_security":"보안","panel_title_crop":"드래그하여 조정","panel_title_general":"일반","panel_title_members":"구성원","panel_title_security":"보안","panel_title_info":"정보","permissions_anonymous":"익명","permissions_authenticated":"인증됨","topic_delete":"채팅 삭제","permissions_user":"사용자 권한","password_reset_email_sent":"보안 코드가 포함된 이메일이 전송되었습니다.","label_unarchive_topic":"보관됨:","menu_item_reply":"회신하다","menu_item_forward":"리디렉션","forward_to":"메시지를 리디렉션","forward_to_search_placeholder":"연락처 검색","label_new_password":"새 비밀번호","drafty_unknown":"지원되지 않음","calls_incoming":"수신 전화","calls_outgoing":"발신 전화","calls_you_label":"너","menu_item_video_call":"영상 통화","already_in_call":"당신은 이미 말하고 있습니다!","call_cancelled":"취소 된","call_missed":"부재중","call_declined":"통화 거부","call_disconnected":"연결 끊김","label_use_secure_connection":"보안 연결 사용","cred_confirmed_successfully":"성공적으로 확인됨","menu_item_edit":"편집","editing_message":"교정하다","message_edited_marker":" 수정됨","icon_title_add_image":"이미지 추가","icon_title_attach_file":"파일을 첨부","icon_title_delete":"녹음 삭제","icon_title_pause":"재생 일시 중지","icon_title_play":"녹음 재생","icon_title_record_voice":"음성 메시지 녹음","icon_title_resume":"재생 재개","icon_title_send":"문자 보내","drag_file":"여기로 파일 드래그","drafty_video":"녹화","call_in_progress":"통화 중","menu_item_audio_call":"전화","unrecognized_video_format":"이 동영상의 형식을 인식할 수 없습니다.","loading_note":"로드 중...","password_i_have_code":"코드가 있습니다","label_reset_password_tel":"비밀번호 재설정을 위해 SMS 보내기","mobile_phone_number":"휴대전화 번호","password_reset_sms_sent":"보안 코드가 포함된 문자 메시지가 전송되었습니다.","mobile_number_required":"휴대전화 번호 필요","current_email":"현재 이메일","current_phone":"현재 전화번호","new_email":"새 이메일 주소","new_phone_number":"새 전화번호","change_email":"이메일 변경","change_phone":"전화번호 변경","call_busy":"바쁘다","failed_to_init_audio":"오디오 녹음 초기화 실패","password_reset_success":"비밀번호 재설정 성공"} \ No newline at end of file +{"action_block_contact":"연락차단","action_cancel":"취소","action_clear_messages":"메시지지우기","action_delete_messages":"모든메시지지우기","action_leave_chat":"대화나누기","action_report_chat":"대화기록","archived_contacts":"보관된연락처({수})","badge_danger":"의심 많은","badge_owner":"소유자","badge_staff":"직원 관리하에","badge_verified":"확인 됨","badge_you":"당신","block_contact_warning":"이연락처를차단하시겠습니까?","blocked_contacts_link":"차단된연락처({수})","button_add_members":"회원추가","button_cancel":"취소","button_confirm":"확인","button_create":"작성","button_delete_account":"계정삭제","button_edit":"편집","button_logout":"로그아웃","button_ok":"OK","button_reset":"재설정","button_send_request":"요청보내기","button_sign_in":"로그인","button_sign_up":"가입","button_subscribe":"구독","button_update":"업데이트","cannot_initiate_file_upload":"파일업로드를시작할수없습니다.","channel":"채널","channel_prompt":"이 채널입니다","chat_invitation":"새로운대화를시작하도록초대되었습니다.무엇을하시겠습니까?","chat_invitation_accept":"수락","chat_invitation_block":"차단","chat_invitation_ignore":"무시","clear_messages_warning":"모든메시지를지우시겠습니까?실행취소할수없습니다.","code_doesnot_match":"코드가일치하지않습니다","contacts_not_found":"채팅이없습니다
¯∖_(ツ)_/¯","contacts_not_found_short":"'{문의}'와일치하는연락처가없습니다.","credential_email_prompt":"등록이메일","delete_account":"계정삭제","delete_account_warning":"계정을삭제하시겠습니까?실행취소할수없습니다.","delete_messages_warning":"모든사람의모든메시지를삭제하시겠습니까?실행취소할수없습니다.","download_action":"다운로드","drafty_attachment":"부착","drafty_form":"형태:","drafty_image":"이미지","email_dative":"이메일","email_prompt":"이메일(예:hong@example.com)","enable_peers_messaging":"활성화","enter_confirmation_code_prompt":"{방법}으로보낸확인코드를입력하십시오:","error_invalid_id":"잘못된ID","file_attachment_too_large":"파일크기{크기}이(가){제한}제한을초과합니다.","forgot_password_link":"비밀번호를잊으셨습니까?","full_name_prompt":"전체이름(예:홍길동)","granted_permissions":"승낙하다","group_has_no_members":"회원없음","group_user_id_prompt":"그룹또는사용자ID","image_caption_prompt":"이미지설명","invalid_content":"잘못된내용","invalid_security_token":"유효하지않은보안토큰","label_client":"클라이언트: ","label_content_type":"컨텐츠유형: ","label_default_access_mode":"기본액세스모드: ","label_file_name":"파일이름: ","label_group_members":"그룹회원: ","label_incognito_mode":"시크릿모드: ","label_message_sound":"메시지소리: ","label_muting_topic":"음소거: ","label_other_user":"기타","label_password":"비밀번호","label_permissions":"권한: ","label_private":"개인코멘트","label_push_notifications":"통지경보: ","label_push_notifications_disabled":"통지경보(HTTPS필요): ","label_reset_password":"비밀번호재설정이메일보내기: ","label_sdk":"SDK:","label_server":"서버: ","label_server_address":"서버주소: ","label_server_to_use":"사용할서버:","label_size":"크기: ","label_topic_name":"이름","label_user_contacts":"연락처","label_user_id":"ID:","label_wire_transport":"와이어수송:","label_you":"당신: ","label_your_name":"이름","label_your_permissions":"권한: ","last_seen_timestamp":"마지막으로본","leave_chat_warning":"이대화를나가시겠습니까?","link_contact_us":"문의처","link_privacy_policy":"개인정보보호정책","link_terms_of_service":"서비스약관","login_prompt":"로그인","menu_item_archive_topic":"보관","menu_item_block":"차단","menu_item_clear_messages":"메시지지우기","menu_item_clear_messages_for_all":"모두지우기","menu_item_delete":"삭제","menu_item_delete_for_all":"모두삭제","menu_item_delete_topic":"삭제","menu_item_edit_permissions":"편집권한","menu_item_info":"정보","menu_item_member_delete":"제거","menu_item_mute":"음소거","menu_item_restore_topic":"복원","menu_item_send_retry":"다시시도","menu_item_unblock":"차단해제","menu_item_unmute":"음소거해제","message_sending":"보내기...","message_sending_failed":"실패","messages_not_readable":"메시지에 액세스 할 수 없습니다","messaging_disabled_prompt":"메시지비활성화","more_online_members":"+{넘침}더보기","new_message_prompt":"새메시지","new_password_placeholder":"새비밀번호입력","no_connection":"연결없음","no_contacts":"연락처가없습니다 (._.)","numeric_confirmation_code_prompt":"숫자만","online_now":"현재접속중","password_prompt":"비밀번호","password_unchanged_prompt":"변경되지않음","peers_messaging_disabled":"동료의메시지가비활성화되었습니다.","permission_admin":"승인({val})","permission_delete":"삭제({val})","permission_join":"참여({val})","permission_owner":"소유자({val})","permission_pres":"알림받기({val})","permission_read":"읽기({val})","permission_share":"공유({val})","permission_write":"쓰기({val})","phone_dative":"전화","private_editing_placeholder":"나만볼수있습니다","push_init_failed":"푸시알림을초기화하지못했습니다","reconnect_countdown":"연결이끊어졌습니다.다시연결하는중{초}…","reconnect_now":"지금시도","reload_update":"재로드","report_chat_warning":"이대화를차단하고기록하시겠습니까?","requested_permissions":"요청","save_attachment":"저장","search_for_contacts":"검색을사용하여연락처찾기","search_no_results":"검색결과가없습니다","search_placeholder":"email:alice@example.com,tel:17025550003...와같은목록","sidepanel_title_acc_notifications":"알림","sidepanel_title_acc_support":"지원","sidepanel_title_account_settings":"계정설정","sidepanel_title_archive":"보관된채팅","sidepanel_title_blocked":"차단된채팅","sidepanel_title_cred":"자격증명확인","sidepanel_title_login":"로그인","sidepanel_title_newtpk":"새채팅시작","sidepanel_title_register":"계정만들기","sidepanel_title_reset":"비밀번호재설정","sidepanel_title_settings":"설정","stay_logged_in":"로그인상태유지","tabtitle_find_user":"찾기","tabtitle_group_by_id":"id로","tabtitle_new_group":"새그룹","tags_editor_no_tags":"일부태그추가","tags_not_found":"태그가정의되지않았습니다.일부를추가하십시오.","title_all_contacts":"모든연락처","title_group_members":"그룹구성원","title_manage_tags":"관리","title_not_found":"찾을수없음","title_permissions":"권한","title_tag_manager":"태그(사용자검색)","topic_block_warning":"이대화를차단하시겠습니까?","topic_delete_warning":"이대화를삭제하시겠습니까?","topic_name_editing_placeholder":"그룹의자유형이름","unnamed_topic":"이름없는","update_available":"업데이트가능.","upload_finishing":"마무리...","user_not_found":"찾을수없음","description_editing_placeholder":"설명(선택 사항)","label_description":"설명","button_security":"보안","panel_title_crop":"드래그하여 조정","panel_title_general":"일반","panel_title_members":"구성원","panel_title_security":"보안","panel_title_info":"정보","permissions_anonymous":"익명","permissions_authenticated":"인증됨","topic_delete":"채팅 삭제","permissions_user":"사용자 권한","password_reset_email_sent":"보안 코드가 포함된 이메일이 전송되었습니다.","label_unarchive_topic":"보관됨:","menu_item_reply":"회신하다","menu_item_forward":"리디렉션","forward_to":"메시지를 리디렉션","forward_to_search_placeholder":"연락처 검색","label_new_password":"새 비밀번호","drafty_unknown":"지원되지 않음","calls_incoming":"수신 전화","calls_outgoing":"발신 전화","calls_you_label":"너","menu_item_video_call":"영상 통화","already_in_call":"당신은 이미 말하고 있습니다!","call_cancelled":"취소 된","call_missed":"부재중","call_declined":"통화 거부","call_disconnected":"연결 끊김","label_use_secure_connection":"보안 연결 사용","cred_confirmed_successfully":"성공적으로 확인됨","menu_item_edit":"편집","editing_message":"교정하다","message_edited_marker":" 수정됨","icon_title_add_image":"이미지 추가","icon_title_attach_file":"파일을 첨부","icon_title_delete":"녹음 삭제","icon_title_pause":"재생 일시 중지","icon_title_play":"녹음 재생","icon_title_record_voice":"음성 메시지 녹음","icon_title_resume":"재생 재개","icon_title_send":"문자 보내","drag_file":"여기로 파일 드래그","drafty_video":"녹화","call_in_progress":"통화 중","menu_item_audio_call":"전화","unrecognized_video_format":"이 동영상의 형식을 인식할 수 없습니다.","loading_note":"로드 중...","password_i_have_code":"코드가 있습니다","label_reset_password_tel":"비밀번호 재설정을 위해 SMS 보내기","mobile_phone_number":"휴대전화 번호","password_reset_sms_sent":"보안 코드가 포함된 문자 메시지가 전송되었습니다.","mobile_number_required":"휴대전화 번호 필요","current_email":"현재 이메일","current_phone":"현재 전화번호","new_email":"새 이메일 주소","new_phone_number":"새 전화번호","change_email":"이메일 변경","change_phone":"전화번호 변경","call_busy":"바쁘다","failed_to_init_audio":"오디오 녹음 초기화 실패","calls_conference":"전화 회의","password_reset_success":"비밀번호 재설정 성공"} \ No newline at end of file diff --git a/src/i18n.min/ro.json b/src/i18n.min/ro.json index 8d41043f..d985064c 100644 --- a/src/i18n.min/ro.json +++ b/src/i18n.min/ro.json @@ -1 +1 @@ -{"action_block_contact":"Blochează contact","action_cancel":"anulează","action_clear_messages":"Șterge mesajele","action_delete_messages":"Șterge toate mesajele","action_leave_chat":"Ieși din conversație","action_report_chat":"Raportează conversația","archived_contacts":"Contacte arhivate ({count})","badge_danger":"Suspicios","badge_owner":"owner","badge_staff":"Administrare","badge_verified":"Verificat","badge_you":"tu","block_contact_warning":"Ești sigur că dorești să blochezi acest contact?","blocked_contacts_link":"Contact blocate ({count})","button_add_members":"Adaugă persoane","button_cancel":"Anulează","button_confirm":"Confirmă","button_create":"Creează","button_delete_account":"Șterge cont","button_edit":"Editează","button_logout":"Deconectare","button_ok":"OK","button_reset":"Resetează","button_send_request":"Trimite cerere","button_sign_in":"Conectează-te","button_sign_up":"Creează cont","button_subscribe":"Subscribe","button_update":"Actualizează","cannot_initiate_file_upload":"Nu se poate face încărcarea.","channel":"canal","channel_prompt":"Acesta este un canal","chat_invitation":"Ai primit invitație într-o conversație. Accepți?","chat_invitation_accept":"Da, accept","chat_invitation_block":"Blochează","chat_invitation_ignore":"Ignoră","clear_messages_warning":"Ești sigur că dorești să ștergi mesajele? Acestea nu pot fi recuperate.","code_doesnot_match":"Codul furnizat nu este valid","contacts_not_found":"Nu ai contacte salvate
¯∖_(ツ)_/¯","contacts_not_found_short":"Niciun contact găsit după criteriile ''{query}''","credential_email_prompt":"Adresa de e-mail","delete_account":"Șterge contul","delete_account_warning":"Ești sigur că dorești să ștergi contul? Acesta nu va putea fi recuperat.","delete_messages_warning":"Ești sigur că dorești să șterge mesajele din toate conversațiile? Acestea nu pot fi recuperate.","download_action":"download","drafty_attachment":"Atasament","drafty_form":"Formă:","drafty_image":"Imagine","email_dative":"email","email_prompt":"Adresa de e-mail","enable_peers_messaging":"Activează","enter_confirmation_code_prompt":"Introu codul de confirmare trimis pe {method}:","error_invalid_id":"ID Invalid","file_attachment_too_large":"Dimensiunea fișiterului {size} depășește limita de {limit}.","forgot_password_link":"Ți-ai uitat parola?","full_name_prompt":"Numele tău","granted_permissions":"Oferite","group_has_no_members":"În acest grup nu se află persoane","group_user_id_prompt":"Grup sau user ID","image_caption_prompt":"Titlul imaginii","invalid_content":"conținut invalid","invalid_security_token":"Codul de securitate este invalid","label_client":"Client:","label_content_type":"Tip conținut:","label_default_access_mode":"Default access mode:","label_file_name":"Nume fișier:","label_group_members":"Membrii grupului:","label_incognito_mode":"Mod incognito:","label_message_sound":"Sunet de mesaj:","label_muting_topic":"Mod silențios (muted):","label_other_user":"Altele","label_password":"Parola","label_permissions":"Permisiuni:","label_private":"Comentariu privat","label_push_notifications":"Alerte de notificare:","label_push_notifications_disabled":"Alerte de notificare (necesită HTTPS):","label_reset_password":"Resetează parola:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Adresa serverului:","label_server_to_use":"Server de utilizat:","label_size":"Size:","label_topic_name":"Nume","label_user_contacts":"Contacte","label_user_id":"ID:","label_wire_transport":"Transportul legat:","label_you":"Tu:","label_your_name":"Numele tău","label_your_permissions":"Permisiuniile tale:","last_seen_timestamp":"Văzut ultima dată","leave_chat_warning":"Ești sigur că dorești să ieși din conersație?","link_contact_us":"Contactează-ne","link_privacy_policy":"Politica de Confidențialitate","link_terms_of_service":"Termenii Serviciului","login_prompt":"Conectează-te","menu_item_archive_topic":"Arhivează","menu_item_block":"Blochează","menu_item_clear_messages":"Șterge mesajele","menu_item_clear_messages_for_all":"Ștergele pe toate","menu_item_delete":"Șterge","menu_item_delete_for_all":"Ștergele pe toate","menu_item_delete_topic":"Șterge","menu_item_edit_permissions":"Editează permisiuni","menu_item_info":"Info","menu_item_member_delete":"Șterge persoană","menu_item_mute":"Mute","menu_item_restore_topic":"Restabili","menu_item_send_retry":"Reîncearcă","menu_item_unblock":"Deblochează","menu_item_unmute":"Unmute","message_sending":"se trimite...","message_sending_failed":"eroare","messages_not_readable":"Mesajele nu pot fi citite","messaging_disabled_prompt":"Mesageria este dezactivată","more_online_members":"+{overflow} mai mult","new_message_prompt":"Mesaj nou","new_password_placeholder":"Introdu parolă","no_connection":"Nu există conexiune","no_contacts":"Nu ai contacte adăugate :-(","numeric_confirmation_code_prompt":"Doar cifre","online_now":"online acum","password_prompt":"Parola","password_unchanged_prompt":"Neschimbată","peers_messaging_disabled":"Mesageria de tip Peer este dezactivată.","permission_admin":"Aprobare ({val})","permission_delete":"Ștergere ({val})","permission_join":"Participare ({val})","permission_owner":"Deținător ({val})","permission_pres":"Notificare ({val})","permission_read":"Citire ({val})","permission_share":"Distribuire ({val})","permission_write":"Scriere ({val})","phone_dative":"telefon","private_editing_placeholder":"Vizibil doar ție","push_init_failed":"Nu s-a reușit inițializarea tip push notifications","reconnect_countdown":"Deconectat. Se încearcă conectarea în {seconds}…","reconnect_now":"Încearcă din nou","reload_update":"Reîncarcă","report_chat_warning":"Ești sigur că dorești să blochezi și să raportezi această conversație?","requested_permissions":"Necesare","save_attachment":"salvează","search_for_contacts":"Caută în contacte","search_no_results":"Nu s-au găsit rezultate","search_placeholder":"Caută după e-mail sau număr telefon...","sidepanel_title_acc_notifications":"Notificări","sidepanel_title_acc_support":"Ajutor","sidepanel_title_account_settings":"Setările Contului","sidepanel_title_archive":"Conversații Arhivate","sidepanel_title_blocked":"Conversații Blocate","sidepanel_title_cred":"Confirmă credențiale","sidepanel_title_login":"Conectează-te","sidepanel_title_newtpk":"Creeză un nou Chat","sidepanel_title_register":"Creează Cont","sidepanel_title_reset":"Resetează Parola","sidepanel_title_settings":"Setări","stay_logged_in":"Rămâi conectat","tabtitle_find_user":"caută","tabtitle_group_by_id":"după id","tabtitle_new_group":"grup nou","tags_editor_no_tags":"Adaugă tag-uri","tags_not_found":"Niciun tag definit. Adaugă.","title_all_contacts":"Toate Contactele","title_group_members":"Persoanele din grup","title_manage_tags":"Administrează","title_not_found":"Nu a fost găsit","title_permissions":"Permisiuni","title_tag_manager":"Tag-uri (user discovery)","topic_block_warning":"Ești sigur că dorești să blochezi această conversație?","topic_delete_warning":"Ești sigur că dorești să șterge această conversație?","topic_name_editing_placeholder":"Numele grupului","unnamed_topic":"Nedenumit","update_available":"Actualizare disponibilă.","upload_finishing":"se încarcă...","user_not_found":"Utilizatorul nu a fost găsit","description_editing_placeholder":"Descriere (opțional)","label_description":"Descriere","button_security":"Securitate","panel_title_crop":"Trageți pentru a ajusta","panel_title_general":"Generale","panel_title_members":"Membri","panel_title_security":"Securitate","panel_title_info":"Info","permissions_anonymous":"Anonim","permissions_authenticated":"Autentificat","topic_delete":"Ștergeți Chat","permissions_user":"Permisiunile utilizatorului","password_reset_email_sent":"A fost trimis un e-mail cu cod de securitate.","label_unarchive_topic":"Arhivat:","menu_item_reply":"A raspunde","menu_item_forward":"Redirecţiona","forward_to":"Redirecționați către","forward_to_search_placeholder":"Căutați contacte","label_new_password":"Parolă Nouă","drafty_unknown":"Neacceptat","calls_incoming":"Apel primit","calls_outgoing":"Apel efectuat","calls_you_label":"Tu","menu_item_video_call":"Apel video","already_in_call":"Deja vorbesti!","call_cancelled":"anulat","call_missed":"pierdut","call_declined":"refuzat","call_disconnected":"deconectat","label_use_secure_connection":"Utilizați conexiune securizată","cred_confirmed_successfully":"Confirmat cu succes","menu_item_edit":"Editează","editing_message":"Editare","message_edited_marker":", editat","icon_title_add_image":"Adauga imagine","icon_title_attach_file":"Ataseaza fisier","icon_title_delete":"Ștergeți înregistrarea","icon_title_pause":"Întrerupeți redarea","icon_title_play":"Redați înregistrarea","icon_title_record_voice":"Înregistrați mesajul vocal","icon_title_resume":"Reluați redarea","icon_title_send":"Trimite mesaj","drag_file":"Trageți fișierul aici","drafty_video":"Înregistrare video","call_in_progress":"în curs","menu_item_audio_call":"Apel","unrecognized_video_format":"Formatul acestui videoclip nu este recunoscut","loading_note":"Se încarcă...","password_i_have_code":"Am cod","label_reset_password_tel":"Trimite SMS pentru a reseta parola","mobile_phone_number":"Număr de telefon mobil","password_reset_sms_sent":"A fost trimis un mesaj text cu cod de securitate.","mobile_number_required":"Este necesar un număr de telefon mobil","current_email":"E-mail curent","current_phone":"Număr de telefon actual","new_email":"E-mail nou","new_phone_number":"Număr de telefon nou","change_email":"Schimbați adresa de e-mail","change_phone":"Schimbați numărul de telefon","call_busy":"ocupat","failed_to_init_audio":"Inițializarea înregistrării audio a eșuat","password_reset_success":"Resetarea parolei cu succes"} \ No newline at end of file +{"action_block_contact":"Blochează contact","action_cancel":"anulează","action_clear_messages":"Șterge mesajele","action_delete_messages":"Șterge toate mesajele","action_leave_chat":"Ieși din conversație","action_report_chat":"Raportează conversația","archived_contacts":"Contacte arhivate ({count})","badge_danger":"Suspicios","badge_owner":"owner","badge_staff":"Administrare","badge_verified":"Verificat","badge_you":"tu","block_contact_warning":"Ești sigur că dorești să blochezi acest contact?","blocked_contacts_link":"Contact blocate ({count})","button_add_members":"Adaugă persoane","button_cancel":"Anulează","button_confirm":"Confirmă","button_create":"Creează","button_delete_account":"Șterge cont","button_edit":"Editează","button_logout":"Deconectare","button_ok":"OK","button_reset":"Resetează","button_send_request":"Trimite cerere","button_sign_in":"Conectează-te","button_sign_up":"Creează cont","button_subscribe":"Subscribe","button_update":"Actualizează","cannot_initiate_file_upload":"Nu se poate face încărcarea.","channel":"canal","channel_prompt":"Acesta este un canal","chat_invitation":"Ai primit invitație într-o conversație. Accepți?","chat_invitation_accept":"Da, accept","chat_invitation_block":"Blochează","chat_invitation_ignore":"Ignoră","clear_messages_warning":"Ești sigur că dorești să ștergi mesajele? Acestea nu pot fi recuperate.","code_doesnot_match":"Codul furnizat nu este valid","contacts_not_found":"Nu ai contacte salvate
¯∖_(ツ)_/¯","contacts_not_found_short":"Niciun contact găsit după criteriile ''{query}''","credential_email_prompt":"Adresa de e-mail","delete_account":"Șterge contul","delete_account_warning":"Ești sigur că dorești să ștergi contul? Acesta nu va putea fi recuperat.","delete_messages_warning":"Ești sigur că dorești să șterge mesajele din toate conversațiile? Acestea nu pot fi recuperate.","download_action":"download","drafty_attachment":"Atasament","drafty_form":"Formă:","drafty_image":"Imagine","email_dative":"email","email_prompt":"Adresa de e-mail","enable_peers_messaging":"Activează","enter_confirmation_code_prompt":"Introu codul de confirmare trimis pe {method}:","error_invalid_id":"ID Invalid","file_attachment_too_large":"Dimensiunea fișiterului {size} depășește limita de {limit}.","forgot_password_link":"Ți-ai uitat parola?","full_name_prompt":"Numele tău","granted_permissions":"Oferite","group_has_no_members":"În acest grup nu se află persoane","group_user_id_prompt":"Grup sau user ID","image_caption_prompt":"Titlul imaginii","invalid_content":"conținut invalid","invalid_security_token":"Codul de securitate este invalid","label_client":"Client:","label_content_type":"Tip conținut:","label_default_access_mode":"Default access mode:","label_file_name":"Nume fișier:","label_group_members":"Membrii grupului:","label_incognito_mode":"Mod incognito:","label_message_sound":"Sunet de mesaj:","label_muting_topic":"Mod silențios (muted):","label_other_user":"Altele","label_password":"Parola","label_permissions":"Permisiuni:","label_private":"Comentariu privat","label_push_notifications":"Alerte de notificare:","label_push_notifications_disabled":"Alerte de notificare (necesită HTTPS):","label_reset_password":"Resetează parola:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Adresa serverului:","label_server_to_use":"Server de utilizat:","label_size":"Size:","label_topic_name":"Nume","label_user_contacts":"Contacte","label_user_id":"ID:","label_wire_transport":"Transportul legat:","label_you":"Tu:","label_your_name":"Numele tău","label_your_permissions":"Permisiuniile tale:","last_seen_timestamp":"Văzut ultima dată","leave_chat_warning":"Ești sigur că dorești să ieși din conersație?","link_contact_us":"Contactează-ne","link_privacy_policy":"Politica de Confidențialitate","link_terms_of_service":"Termenii Serviciului","login_prompt":"Conectează-te","menu_item_archive_topic":"Arhivează","menu_item_block":"Blochează","menu_item_clear_messages":"Șterge mesajele","menu_item_clear_messages_for_all":"Ștergele pe toate","menu_item_delete":"Șterge","menu_item_delete_for_all":"Ștergele pe toate","menu_item_delete_topic":"Șterge","menu_item_edit_permissions":"Editează permisiuni","menu_item_info":"Info","menu_item_member_delete":"Șterge persoană","menu_item_mute":"Mute","menu_item_restore_topic":"Restabili","menu_item_send_retry":"Reîncearcă","menu_item_unblock":"Deblochează","menu_item_unmute":"Unmute","message_sending":"se trimite...","message_sending_failed":"eroare","messages_not_readable":"Mesajele nu pot fi citite","messaging_disabled_prompt":"Mesageria este dezactivată","more_online_members":"+{overflow} mai mult","new_message_prompt":"Mesaj nou","new_password_placeholder":"Introdu parolă","no_connection":"Nu există conexiune","no_contacts":"Nu ai contacte adăugate :-(","numeric_confirmation_code_prompt":"Doar cifre","online_now":"online acum","password_prompt":"Parola","password_unchanged_prompt":"Neschimbată","peers_messaging_disabled":"Mesageria de tip Peer este dezactivată.","permission_admin":"Aprobare ({val})","permission_delete":"Ștergere ({val})","permission_join":"Participare ({val})","permission_owner":"Deținător ({val})","permission_pres":"Notificare ({val})","permission_read":"Citire ({val})","permission_share":"Distribuire ({val})","permission_write":"Scriere ({val})","phone_dative":"telefon","private_editing_placeholder":"Vizibil doar ție","push_init_failed":"Nu s-a reușit inițializarea tip push notifications","reconnect_countdown":"Deconectat. Se încearcă conectarea în {seconds}…","reconnect_now":"Încearcă din nou","reload_update":"Reîncarcă","report_chat_warning":"Ești sigur că dorești să blochezi și să raportezi această conversație?","requested_permissions":"Necesare","save_attachment":"salvează","search_for_contacts":"Caută în contacte","search_no_results":"Nu s-au găsit rezultate","search_placeholder":"Caută după e-mail sau număr telefon...","sidepanel_title_acc_notifications":"Notificări","sidepanel_title_acc_support":"Ajutor","sidepanel_title_account_settings":"Setările Contului","sidepanel_title_archive":"Conversații Arhivate","sidepanel_title_blocked":"Conversații Blocate","sidepanel_title_cred":"Confirmă credențiale","sidepanel_title_login":"Conectează-te","sidepanel_title_newtpk":"Creeză un nou Chat","sidepanel_title_register":"Creează Cont","sidepanel_title_reset":"Resetează Parola","sidepanel_title_settings":"Setări","stay_logged_in":"Rămâi conectat","tabtitle_find_user":"caută","tabtitle_group_by_id":"după id","tabtitle_new_group":"grup nou","tags_editor_no_tags":"Adaugă tag-uri","tags_not_found":"Niciun tag definit. Adaugă.","title_all_contacts":"Toate Contactele","title_group_members":"Persoanele din grup","title_manage_tags":"Administrează","title_not_found":"Nu a fost găsit","title_permissions":"Permisiuni","title_tag_manager":"Tag-uri (user discovery)","topic_block_warning":"Ești sigur că dorești să blochezi această conversație?","topic_delete_warning":"Ești sigur că dorești să șterge această conversație?","topic_name_editing_placeholder":"Numele grupului","unnamed_topic":"Nedenumit","update_available":"Actualizare disponibilă.","upload_finishing":"se încarcă...","user_not_found":"Utilizatorul nu a fost găsit","description_editing_placeholder":"Descriere (opțional)","label_description":"Descriere","button_security":"Securitate","panel_title_crop":"Trageți pentru a ajusta","panel_title_general":"Generale","panel_title_members":"Membri","panel_title_security":"Securitate","panel_title_info":"Info","permissions_anonymous":"Anonim","permissions_authenticated":"Autentificat","topic_delete":"Ștergeți Chat","permissions_user":"Permisiunile utilizatorului","password_reset_email_sent":"A fost trimis un e-mail cu cod de securitate.","label_unarchive_topic":"Arhivat:","menu_item_reply":"A raspunde","menu_item_forward":"Redirecţiona","forward_to":"Redirecționați către","forward_to_search_placeholder":"Căutați contacte","label_new_password":"Parolă Nouă","drafty_unknown":"Neacceptat","calls_incoming":"Apel primit","calls_outgoing":"Apel efectuat","calls_you_label":"Tu","menu_item_video_call":"Apel video","already_in_call":"Deja vorbesti!","call_cancelled":"anulat","call_missed":"pierdut","call_declined":"refuzat","call_disconnected":"deconectat","label_use_secure_connection":"Utilizați conexiune securizată","cred_confirmed_successfully":"Confirmat cu succes","menu_item_edit":"Editează","editing_message":"Editare","message_edited_marker":", editat","icon_title_add_image":"Adauga imagine","icon_title_attach_file":"Ataseaza fisier","icon_title_delete":"Ștergeți înregistrarea","icon_title_pause":"Întrerupeți redarea","icon_title_play":"Redați înregistrarea","icon_title_record_voice":"Înregistrați mesajul vocal","icon_title_resume":"Reluați redarea","icon_title_send":"Trimite mesaj","drag_file":"Trageți fișierul aici","drafty_video":"Înregistrare video","call_in_progress":"în curs","menu_item_audio_call":"Apel","unrecognized_video_format":"Formatul acestui videoclip nu este recunoscut","loading_note":"Se încarcă...","password_i_have_code":"Am cod","label_reset_password_tel":"Trimite SMS pentru a reseta parola","mobile_phone_number":"Număr de telefon mobil","password_reset_sms_sent":"A fost trimis un mesaj text cu cod de securitate.","mobile_number_required":"Este necesar un număr de telefon mobil","current_email":"E-mail curent","current_phone":"Număr de telefon actual","new_email":"E-mail nou","new_phone_number":"Număr de telefon nou","change_email":"Schimbați adresa de e-mail","change_phone":"Schimbați numărul de telefon","call_busy":"ocupat","failed_to_init_audio":"Inițializarea înregistrării audio a eșuat","calls_conference":"Apel de conferinta","password_reset_success":"Resetarea parolei cu succes"} \ No newline at end of file diff --git a/src/i18n.min/ru.json b/src/i18n.min/ru.json index 9da1b8a5..a68faf55 100644 --- a/src/i18n.min/ru.json +++ b/src/i18n.min/ru.json @@ -1 +1 @@ -{"action_block_contact":"Заблокировать контакт","action_cancel":"отменить","action_clear_messages":"Удалить сообщения","action_delete_messages":"Удалить сообщения","action_leave_chat":"Уйти из чата","action_report_chat":"Сообщить о нарушении","archived_contacts":"Чаты в архиве ({count})","badge_danger":"Подозрительный","badge_owner":"влад.","badge_staff":"Администрация","badge_verified":"Верифицированный","badge_you":"вы","block_contact_warning":"Вы действительно заблокировать этот контакт?","blocked_contacts_link":"Заблокированные ({count})","button_add_members":"Добавить","button_cancel":"Отменить","button_confirm":"Подтвердить","button_create":"Создать","button_delete_account":"Удалить аккаунт","button_edit":"Изменить","button_logout":"Выйти","button_ok":"OK","button_reset":"Изменить","button_send_request":"Отправить","button_sign_in":"Войти","button_sign_up":"Создать аккаунт","button_subscribe":"Подписаться","button_update":"Применить","cannot_initiate_file_upload":"Ошибка загрузки файла.","channel":"канал","channel_prompt":"Создать канал","chat_invitation":"Вас пригласили начать новый чат. Как вы хотите поступить?","chat_invitation_accept":"Принять","chat_invitation_block":"Заблокировать","chat_invitation_ignore":"Игнорировать","clear_messages_warning":"Вы действительно хотите удалить все сообщения в чате? Их будет невозможно восстановить.","code_doesnot_match":"Код не совпадает","contacts_not_found":"Чатов нет
¯∖_(ツ)_/¯","contacts_not_found_short":"Нет контактов для запроса ''{query}''","credential_email_prompt":"Регистрационный емейл","delete_account":"Удалить аккаунт","delete_account_warning":"Вы уверены, что ходите удалить свой аккаунт? Его невозможно будет восстановить.","delete_messages_warning":"Вы действительно хотите удалить все сообщения?","download_action":"скачать","drafty_attachment":"Аттачмент","drafty_form":"Форма:","drafty_image":"Картинка","email_dative":"емейлу","email_prompt":"Email, напр. ivan@example.com","enable_peers_messaging":"Разблокировать.","enter_confirmation_code_prompt":"Код подтверждения, полученный по {method}:","error_invalid_id":"Неверный ID","file_attachment_too_large":"Размер файла {size} превышает {limit} лимит.","forgot_password_link":"Напомнить пароль","full_name_prompt":"Полное имя, напр. Иван Петров","granted_permissions":"Получены","group_has_no_members":"Нет участников","group_user_id_prompt":"ID чата или пользователя","image_caption_prompt":"Подпись к фото","invalid_content":"сообщение не читается","invalid_security_token":"Токен некорректен","label_client":"Клиент:","label_content_type":"Тип:","label_default_access_mode":"Доступ по умолчанию:","label_file_name":"Имя файла:","label_group_members":"Участники чата:","label_incognito_mode":"Режим инкогнито:","label_message_sound":"Звук нового сообщения:","label_muting_topic":"Без уведомлений","label_other_user":"Второй","label_password":"Пароль","label_permissions":"Права доступа:","label_private":"Комментарий","label_push_notifications":"Уведомления:","label_push_notifications_disabled":"Уведомления (требуют HTTPS):","label_reset_password":"Отправить емейл для смены пароля:","label_sdk":"SDK:","label_server":"Сервер:","label_server_address":"Адрес сервера:","label_server_to_use":"Использовать сервер:","label_size":"Размер:","label_topic_name":"Название","label_user_contacts":"Конакты","label_user_id":"ID:","label_wire_transport":"Соединение:","label_you":"Вы:","label_your_name":"Ваше имя","label_your_permissions":"Ваши права доступа:","last_seen_timestamp":"Был активен","leave_chat_warning":"Вы действительно хотите покинуть этот чат?","link_contact_us":"Связаться с нами","link_privacy_policy":"Политика конфиденциальности","link_terms_of_service":"Условия сервиса","login_prompt":"Логин","menu_item_archive_topic":"В архив","menu_item_block":"Заблокировать","menu_item_clear_messages":"Удалить сообщения","menu_item_clear_messages_for_all":"Удалить для всех","menu_item_delete":"Удалить","menu_item_delete_for_all":"Удалить для всех","menu_item_delete_topic":"Удалить чат","menu_item_edit_permissions":"Права доступа","menu_item_info":"Информация","menu_item_member_delete":"Отписать","menu_item_mute":"Не уведомлять","menu_item_restore_topic":"Разархивировать","menu_item_send_retry":"Отправить заново","menu_item_unblock":"Разблокировать","menu_item_unmute":"Уведомлять","message_sending":"в пути...","message_sending_failed":"ошибка","messages_not_readable":"нет доступа к сообщениям","messaging_disabled_prompt":"Отправка недоступна","more_online_members":"+еще {overflow}","new_message_prompt":"Новое сообщение","new_password_placeholder":"Введите новый пароль","no_connection":"Нет связи","no_contacts":"Ничего нет :-(","numeric_confirmation_code_prompt":"Только цифры","online_now":"онлайн","password_prompt":"Пароль","password_unchanged_prompt":"Не изменен","peers_messaging_disabled":"Чат заблокирован у корреспондента.","permission_admin":"Подтверждать ({val})","permission_delete":"Удалять ({val})","permission_join":"Подписываться ({val})","permission_owner":"Владелец ({val})","permission_pres":"Уведомлять ({val})","permission_read":"Читать ({val})","permission_share":"Приглашать ({val})","permission_write":"Писать ({val})","phone_dative":"телефону","private_editing_placeholder":"Виден только вам","push_init_failed":"Ошибка инициализации пуш уведомлений","reconnect_countdown":"Нет связи. Подключение через {seconds}…","reconnect_now":"Подключить сейчас.","reload_update":"Обновить","report_chat_warning":"Вы действительно хотите сообщить о нарушении и заблокировать этот чат?","requested_permissions":"Требуются","save_attachment":"сохранить","search_for_contacts":"Поиск контактов","search_no_results":"Ничего не найдено","search_placeholder":"Список, напр. email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"Уведомления","sidepanel_title_acc_support":"Поддержка","sidepanel_title_account_settings":"Настройки аккаунта","sidepanel_title_archive":"Архив чатов","sidepanel_title_blocked":"Заблокированные чаты","sidepanel_title_cred":"Подтвердить","sidepanel_title_login":"Авторизация","sidepanel_title_newtpk":"Новый чат","sidepanel_title_register":"Зарегистрироваться","sidepanel_title_reset":"Сменить пароль","sidepanel_title_settings":"Настройки","stay_logged_in":"Запомнить","tabtitle_find_user":"найти","tabtitle_group_by_id":"по id","tabtitle_new_group":"создать","tags_editor_no_tags":"Добавьте теги","tags_not_found":"Тегов нет. Добавьте.","title_all_contacts":"Все контакты","title_group_members":"Участники","title_manage_tags":"Редактировать","title_not_found":"Не найден","title_permissions":"Права доступа","title_tag_manager":"Теги для поиска","topic_block_warning":"Вы действительно хотите заблокировать этот чат?","topic_delete_warning":"Вы действительно хотите удалить этот чат?","topic_name_editing_placeholder":"Название чата","unnamed_topic":"Без названия","update_available":"Есть новая версия приложения.","upload_finishing":"завершение...","user_not_found":"Не найден","description_editing_placeholder":"Описание (не обязательно)","label_description":"Описание","button_security":"Безопасность","panel_title_crop":"Обрезать картинку","panel_title_general":"Общие настройки","panel_title_members":"Участники","panel_title_security":"Безопасность","panel_title_info":"Подробности","permissions_anonymous":"Анонимный","permissions_authenticated":"Авторизованный","topic_delete":"Удалить чат","permissions_user":"Права доступа","password_reset_email_sent":"Сообщение было отправлено на указанный email.","label_unarchive_topic":"Архивирован:","menu_item_reply":"Ответить","menu_item_forward":"Переслать","forward_to":"Переслать","forward_to_search_placeholder":"Поиск контактов","label_new_password":"Новый пароль","drafty_unknown":"Не поддерживается","calls_incoming":"Входящий звонок","calls_outgoing":"Исходящий звонок","calls_you_label":"Вы","menu_item_video_call":"Видеозвонок","already_in_call":"Вы уже звоните кому-то!","call_cancelled":"отменен","call_missed":"пропущен","call_declined":"отклонен","call_disconnected":"разъединен","label_use_secure_connection":"Безопасное соединение","cred_confirmed_successfully":"Подтверждено успешно","menu_item_edit":"Изменить","editing_message":"Редактирование","message_edited_marker":", изменено","icon_title_add_image":"Добавить изображение","icon_title_attach_file":"Прикрепить файл","icon_title_delete":"Удалить запись","icon_title_pause":"Пауза воспроизведения","icon_title_play":"Воспроизвести запись","icon_title_record_voice":"Записать голосовое сообщение","icon_title_resume":"Продолжить","icon_title_send":"Отправить сообщение","drag_file":"Перетащите файл сюда","drafty_video":"Видеозапись","call_in_progress":"в процессе","menu_item_audio_call":"Позвонить","unrecognized_video_format":"Неизвестный формат видео файла","loading_note":"Загружается...","password_i_have_code":"У меня есть код","label_reset_password_tel":"Отправить SMS для сброса пароля","mobile_phone_number":"Номер мобильного телефона","password_reset_sms_sent":"SMS с защитным кодом отправлен.","mobile_number_required":"Номер мобильного телефона","current_email":"Текущий e-mail","current_phone":"Текущий номер телефона","new_email":"Новый e-mail","new_phone_number":"Новый номер телефона","change_email":"Изменить e-mail","change_phone":"Изменить номер телефона","call_busy":"занято","failed_to_init_audio":"Не удалось инициализировать аудиозапись","password_reset_success":"Пароль успешно изменен"} \ No newline at end of file +{"action_block_contact":"Заблокировать контакт","action_cancel":"отменить","action_clear_messages":"Удалить сообщения","action_delete_messages":"Удалить сообщения","action_leave_chat":"Уйти из чата","action_report_chat":"Сообщить о нарушении","archived_contacts":"Чаты в архиве ({count})","badge_danger":"Подозрительный","badge_owner":"влад.","badge_staff":"Администрация","badge_verified":"Верифицированный","badge_you":"вы","block_contact_warning":"Вы действительно заблокировать этот контакт?","blocked_contacts_link":"Заблокированные ({count})","button_add_members":"Добавить","button_cancel":"Отменить","button_confirm":"Подтвердить","button_create":"Создать","button_delete_account":"Удалить аккаунт","button_edit":"Изменить","button_logout":"Выйти","button_ok":"OK","button_reset":"Изменить","button_send_request":"Отправить","button_sign_in":"Войти","button_sign_up":"Создать аккаунт","button_subscribe":"Подписаться","button_update":"Применить","cannot_initiate_file_upload":"Ошибка загрузки файла.","channel":"канал","channel_prompt":"Создать канал","chat_invitation":"Вас пригласили начать новый чат. Как вы хотите поступить?","chat_invitation_accept":"Принять","chat_invitation_block":"Заблокировать","chat_invitation_ignore":"Игнорировать","clear_messages_warning":"Вы действительно хотите удалить все сообщения в чате? Их будет невозможно восстановить.","code_doesnot_match":"Код не совпадает","contacts_not_found":"Чатов нет
¯∖_(ツ)_/¯","contacts_not_found_short":"Нет контактов для запроса ''{query}''","credential_email_prompt":"Регистрационный емейл","delete_account":"Удалить аккаунт","delete_account_warning":"Вы уверены, что ходите удалить свой аккаунт? Его невозможно будет восстановить.","delete_messages_warning":"Вы действительно хотите удалить все сообщения?","download_action":"скачать","drafty_attachment":"Аттачмент","drafty_form":"Форма:","drafty_image":"Картинка","email_dative":"емейлу","email_prompt":"Email, напр. ivan@example.com","enable_peers_messaging":"Разблокировать.","enter_confirmation_code_prompt":"Код подтверждения, полученный по {method}:","error_invalid_id":"Неверный ID","file_attachment_too_large":"Размер файла {size} превышает {limit} лимит.","forgot_password_link":"Напомнить пароль","full_name_prompt":"Полное имя, напр. Иван Петров","granted_permissions":"Получены","group_has_no_members":"Нет участников","group_user_id_prompt":"ID чата или пользователя","image_caption_prompt":"Подпись к фото","invalid_content":"сообщение не читается","invalid_security_token":"Токен некорректен","label_client":"Клиент:","label_content_type":"Тип:","label_default_access_mode":"Доступ по умолчанию:","label_file_name":"Имя файла:","label_group_members":"Участники чата:","label_incognito_mode":"Режим инкогнито:","label_message_sound":"Звук нового сообщения:","label_muting_topic":"Без уведомлений","label_other_user":"Второй","label_password":"Пароль","label_permissions":"Права доступа:","label_private":"Комментарий","label_push_notifications":"Уведомления:","label_push_notifications_disabled":"Уведомления (требуют HTTPS):","label_reset_password":"Отправить емейл для смены пароля:","label_sdk":"SDK:","label_server":"Сервер:","label_server_address":"Адрес сервера:","label_server_to_use":"Использовать сервер:","label_size":"Размер:","label_topic_name":"Название","label_user_contacts":"Конакты","label_user_id":"ID:","label_wire_transport":"Соединение:","label_you":"Вы:","label_your_name":"Ваше имя","label_your_permissions":"Ваши права доступа:","last_seen_timestamp":"Был активен","leave_chat_warning":"Вы действительно хотите покинуть этот чат?","link_contact_us":"Связаться с нами","link_privacy_policy":"Политика конфиденциальности","link_terms_of_service":"Условия сервиса","login_prompt":"Логин","menu_item_archive_topic":"В архив","menu_item_block":"Заблокировать","menu_item_clear_messages":"Удалить сообщения","menu_item_clear_messages_for_all":"Удалить для всех","menu_item_delete":"Удалить","menu_item_delete_for_all":"Удалить для всех","menu_item_delete_topic":"Удалить чат","menu_item_edit_permissions":"Права доступа","menu_item_info":"Информация","menu_item_member_delete":"Отписать","menu_item_mute":"Не уведомлять","menu_item_restore_topic":"Разархивировать","menu_item_send_retry":"Отправить заново","menu_item_unblock":"Разблокировать","menu_item_unmute":"Уведомлять","message_sending":"в пути...","message_sending_failed":"ошибка","messages_not_readable":"нет доступа к сообщениям","messaging_disabled_prompt":"Отправка недоступна","more_online_members":"+еще {overflow}","new_message_prompt":"Новое сообщение","new_password_placeholder":"Введите новый пароль","no_connection":"Нет связи","no_contacts":"Ничего нет :-(","numeric_confirmation_code_prompt":"Только цифры","online_now":"онлайн","password_prompt":"Пароль","password_unchanged_prompt":"Не изменен","peers_messaging_disabled":"Чат заблокирован у корреспондента.","permission_admin":"Подтверждать ({val})","permission_delete":"Удалять ({val})","permission_join":"Подписываться ({val})","permission_owner":"Владелец ({val})","permission_pres":"Уведомлять ({val})","permission_read":"Читать ({val})","permission_share":"Приглашать ({val})","permission_write":"Писать ({val})","phone_dative":"телефону","private_editing_placeholder":"Виден только вам","push_init_failed":"Ошибка инициализации пуш уведомлений","reconnect_countdown":"Нет связи. Подключение через {seconds}…","reconnect_now":"Подключить сейчас.","reload_update":"Обновить","report_chat_warning":"Вы действительно хотите сообщить о нарушении и заблокировать этот чат?","requested_permissions":"Требуются","save_attachment":"сохранить","search_for_contacts":"Поиск контактов","search_no_results":"Ничего не найдено","search_placeholder":"Список, напр. email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"Уведомления","sidepanel_title_acc_support":"Поддержка","sidepanel_title_account_settings":"Настройки аккаунта","sidepanel_title_archive":"Архив чатов","sidepanel_title_blocked":"Заблокированные чаты","sidepanel_title_cred":"Подтвердить","sidepanel_title_login":"Авторизация","sidepanel_title_newtpk":"Новый чат","sidepanel_title_register":"Зарегистрироваться","sidepanel_title_reset":"Сменить пароль","sidepanel_title_settings":"Настройки","stay_logged_in":"Запомнить","tabtitle_find_user":"найти","tabtitle_group_by_id":"по id","tabtitle_new_group":"создать","tags_editor_no_tags":"Добавьте теги","tags_not_found":"Тегов нет. Добавьте.","title_all_contacts":"Все контакты","title_group_members":"Участники","title_manage_tags":"Редактировать","title_not_found":"Не найден","title_permissions":"Права доступа","title_tag_manager":"Теги для поиска","topic_block_warning":"Вы действительно хотите заблокировать этот чат?","topic_delete_warning":"Вы действительно хотите удалить этот чат?","topic_name_editing_placeholder":"Название чата","unnamed_topic":"Без названия","update_available":"Есть новая версия приложения.","upload_finishing":"завершение...","user_not_found":"Не найден","description_editing_placeholder":"Описание (не обязательно)","label_description":"Описание","button_security":"Безопасность","panel_title_crop":"Обрезать картинку","panel_title_general":"Общие настройки","panel_title_members":"Участники","panel_title_security":"Безопасность","panel_title_info":"Подробности","permissions_anonymous":"Анонимный","permissions_authenticated":"Авторизованный","topic_delete":"Удалить чат","permissions_user":"Права доступа","password_reset_email_sent":"Сообщение было отправлено на указанный email.","label_unarchive_topic":"Архивирован:","menu_item_reply":"Ответить","menu_item_forward":"Переслать","forward_to":"Переслать","forward_to_search_placeholder":"Поиск контактов","label_new_password":"Новый пароль","drafty_unknown":"Не поддерживается","calls_incoming":"Входящий звонок","calls_outgoing":"Исходящий звонок","calls_you_label":"Вы","menu_item_video_call":"Видеозвонок","already_in_call":"Вы уже звоните кому-то!","call_cancelled":"отменен","call_missed":"пропущен","call_declined":"отклонен","call_disconnected":"разъединен","label_use_secure_connection":"Безопасное соединение","cred_confirmed_successfully":"Подтверждено успешно","menu_item_edit":"Изменить","editing_message":"Редактирование","message_edited_marker":", изменено","icon_title_add_image":"Добавить изображение","icon_title_attach_file":"Прикрепить файл","icon_title_delete":"Удалить запись","icon_title_pause":"Пауза воспроизведения","icon_title_play":"Воспроизвести запись","icon_title_record_voice":"Записать голосовое сообщение","icon_title_resume":"Продолжить","icon_title_send":"Отправить сообщение","drag_file":"Перетащите файл сюда","drafty_video":"Видеозапись","call_in_progress":"в процессе","menu_item_audio_call":"Позвонить","unrecognized_video_format":"Неизвестный формат видео файла","loading_note":"Загружается...","password_i_have_code":"У меня есть код","label_reset_password_tel":"Отправить SMS для сброса пароля","mobile_phone_number":"Номер мобильного телефона","password_reset_sms_sent":"SMS с защитным кодом отправлен.","mobile_number_required":"Номер мобильного телефона","current_email":"Текущий e-mail","current_phone":"Текущий номер телефона","new_email":"Новый e-mail","new_phone_number":"Новый номер телефона","change_email":"Изменить e-mail","change_phone":"Изменить номер телефона","call_busy":"занято","failed_to_init_audio":"Не удалось инициализировать аудиозапись","calls_conference":"Групповой звонок","password_reset_success":"Пароль успешно изменен"} \ No newline at end of file diff --git a/src/i18n.min/zh-TW.json b/src/i18n.min/zh-TW.json index bb27eead..620b5c11 100644 --- a/src/i18n.min/zh-TW.json +++ b/src/i18n.min/zh-TW.json @@ -1 +1 @@ -{"action_block_contact":"封鎖聯絡人","action_cancel":"取消","action_clear_messages":"清除訊息","action_delete_messages":"為所有人清除訊息","action_leave_chat":"離開對話","action_report_chat":"檢舉對話","archived_contacts":"已封存的聯絡人 ({count})","badge_danger":"不可信","badge_owner":"擁有者","badge_staff":"員工管理","badge_verified":"已驗證/官方","badge_you":"您","block_contact_warning":"您確定要封鎖此聯絡人嗎?","blocked_contacts_link":"已封鎖的聯絡人 ({count})","button_add_members":"新增成員","button_cancel":"取消","button_confirm":"確認","button_create":"建立","button_delete_account":"刪除帳號","button_edit":"編輯","button_logout":"登出","button_ok":"OK","button_reset":"重設","button_send_request":"傳送要求","button_sign_in":"登入","button_sign_up":"註冊","button_subscribe":"訂閱","button_update":"更新","cannot_initiate_file_upload":"無法為檔案上傳初始化。","channel":"頻道","channel_prompt":"這是頻道","chat_invitation":"您已被邀請開始新對話。您接下來要做什麼呢?","chat_invitation_accept":"接受","chat_invitation_block":"封鎖","chat_invitation_ignore":"忽略","clear_messages_warning":"您確定要清除所有訊息嗎?此操作無法復原。","code_doesnot_match":"代碼不相符","contacts_not_found":"您沒有任何對話
¯∖_(ツ)_/¯","contacts_not_found_short":"沒有符合 ''{query}'' 的聯絡人","credential_email_prompt":"您的註冊電子郵件地址","delete_account":"刪除帳號","delete_account_warning":"您確定要刪除您的帳戶嗎?此操作無法撤消。","delete_messages_warning":"您確定要為所有人刪除所有訊息嗎?此操作無法復原。","download_action":"下載","drafty_attachment":"附加檔案","drafty_form":"表單:","drafty_image":"圖片","email_dative":"電子郵件地址","email_prompt":"電子郵件地址,例如:jdoe@example.com","enable_peers_messaging":"啟用","enter_confirmation_code_prompt":"輸入透過 {method} 傳送給您的確認碼:","error_invalid_id":"ID 無效","file_attachment_too_large":"檔案大小 {size} 超出 {limit} 限制。","forgot_password_link":"忘記密碼?","full_name_prompt":"全名,例如:王小明","granted_permissions":"已授權","group_has_no_members":"無成員","group_user_id_prompt":"群組或使用者 ID","image_caption_prompt":"圖片說明","invalid_content":"內容無效","invalid_security_token":"安全權杖無效","label_client":"客戶端:","label_content_type":"類型:","label_default_access_mode":"預設存取模式:","label_file_name":"檔名:","label_group_members":"群組成員:","label_incognito_mode":"無痕模式:","label_message_sound":"訊息提示聲:","label_muting_topic":"靜音:","label_other_user":"其他","label_password":"密碼","label_permissions":"權限:","label_private":"私人留言","label_push_notifications":"通知:","label_push_notifications_disabled":"通知 (需要 HTTPS):","label_reset_password":"傳送重設密碼郵件:","label_sdk":"SDK:","label_server":"伺服器:","label_server_address":"伺服器位址:","label_server_to_use":"使用的伺服器:","label_size":"大小:","label_topic_name":"名稱","label_user_contacts":"聯絡人","label_user_id":"ID:","label_wire_transport":"線路傳輸:","label_you":"您:","label_your_name":"您的名字","label_your_permissions":"您的權限:","last_seen_timestamp":"最後上線","leave_chat_warning":"您確定要離開此對話嗎?","link_contact_us":"聯絡我們","link_privacy_policy":"隱私權政策","link_terms_of_service":"服務條款","login_prompt":"登入","menu_item_archive_topic":"封存","menu_item_block":"封鎖","menu_item_clear_messages":"清除訊息","menu_item_clear_messages_for_all":"為所有人清除訊息","menu_item_delete":"刪除","menu_item_delete_for_all":"為所有人刪除","menu_item_delete_topic":"刪除","menu_item_edit_permissions":"編輯權限","menu_item_info":"Info","menu_item_member_delete":"移除","menu_item_mute":"靜音","menu_item_restore_topic":"恢復","menu_item_send_retry":"重試","menu_item_unblock":"解除封鎖","menu_item_unmute":"解除靜音","message_sending":"正在傳送...","message_sending_failed":"失敗","messages_not_readable":"沒有存取訊息的權限","messaging_disabled_prompt":"停用訊息","more_online_members":"+{overflow}","new_message_prompt":"新訊息","new_password_placeholder":"輸入新的密碼","no_connection":"無連線","no_contacts":"您沒有任何聯絡人 :-(","numeric_confirmation_code_prompt":"僅數字","online_now":"上線中","password_prompt":"密碼","password_unchanged_prompt":"未修改","peers_messaging_disabled":"Peer 已停用訊息。","permission_admin":"核可 ({val})","permission_delete":"刪除 ({val})","permission_join":"加入 ({val})","permission_owner":"擁有者 ({val})","permission_pres":"收到通知 ({val})","permission_read":"讀取 ({val})","permission_share":"分享 ({val})","permission_write":"撰寫 ({val})","phone_dative":"phone","private_editing_placeholder":"僅您可見","push_init_failed":"初始化通知失敗。","reconnect_countdown":"已斷線。將在 {seconds} 秒後重新連線…","reconnect_now":"現在重試","reload_update":"重新載入","report_chat_warning":"您確定要封鎖並檢舉此對話嗎?","requested_permissions":"重新請求","save_attachment":"儲存","search_for_contacts":"使用搜尋來尋找聯絡人","search_no_results":"搜尋無結果","search_placeholder":"例如 email:alice@example.com, tel:17025550003... 的清單","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支援","sidepanel_title_account_settings":"帳號設定","sidepanel_title_archive":"已封存的對話","sidepanel_title_blocked":"已封鎖的對話","sidepanel_title_cred":"確認認證","sidepanel_title_login":"登入","sidepanel_title_newtpk":"開始新對話","sidepanel_title_register":"建立帳號","sidepanel_title_reset":"重設密碼","sidepanel_title_settings":"設定","stay_logged_in":"保持登入","tabtitle_find_user":"尋找","tabtitle_group_by_id":"以 id","tabtitle_new_group":"新群組","tags_editor_no_tags":"新增一些標籤","tags_not_found":"未定義任何標籤。請新增一些標籤。","title_all_contacts":"所有聯絡人","title_group_members":"群組成員","title_manage_tags":"管理","title_not_found":"找不到","title_permissions":"權限","title_tag_manager":"標籤 (使用者探索)","topic_block_warning":"您確定要封鎖此對話嗎?","topic_delete_warning":"您確定要刪除此對話嗎?","topic_name_editing_placeholder":"群組的任意名稱","unnamed_topic":"未命名","update_available":"有可用的更新。","upload_finishing":"正在完成...","user_not_found":"找不到","description_editing_placeholder":"說明(可選)","label_description":"說明","button_security":"安全性","panel_title_crop":"拖動調整","panel_title_general":"一般","panel_title_members":"成員","panel_title_security":"安全性","panel_title_info":"資訊","permissions_anonymous":"匿名","permissions_authenticated":"已認證","topic_delete":"刪除聊天","permissions_user":"用戶權限","password_reset_email_sent":"已發送一封帶有安全代碼的電子郵件。","label_unarchive_topic":"存檔聊天:","menu_item_reply":"回答","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索聯繫人","label_new_password":"新密碼","drafty_unknown":"不支持","calls_incoming":"來電","calls_outgoing":"撥出電話","calls_you_label":"你","menu_item_video_call":"視頻電話","already_in_call":"你已經在說話了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒","call_disconnected":"斷開連接","label_use_secure_connection":"使用安全連接","cred_confirmed_successfully":"確認成功","menu_item_edit":"編輯","editing_message":"編輯","message_edited_marker":",編輯","icon_title_add_image":"添加圖片","icon_title_attach_file":"附加文件","icon_title_delete":"刪除錄音","icon_title_pause":"暫停播放","icon_title_play":"播放錄音","icon_title_record_voice":"錄製語音消息","icon_title_resume":"恢復播放","icon_title_send":"發信息","drag_file":"將文件拖到這裡","drafty_video":"視頻錄製","call_in_progress":"通話中","menu_item_audio_call":"稱呼","unrecognized_video_format":"無法識別此視頻的格式","loading_note":"加載中...","password_i_have_code":"我有代碼","label_reset_password_tel":"發送短信重置密碼","mobile_phone_number":"手機號碼","password_reset_sms_sent":"已發送帶有安全代碼的短信。","mobile_number_required":"需要手機號","current_email":"當前郵箱","current_phone":"當前電話號碼","new_email":"新電子郵件地址","new_phone_number":"新電話號碼","change_email":"更改郵箱","change_phone":"更改電話號碼","call_busy":"忙碌的","failed_to_init_audio":"初始化錄音失敗","password_reset_success":"密碼重置成功"} \ No newline at end of file +{"action_block_contact":"封鎖聯絡人","action_cancel":"取消","action_clear_messages":"清除訊息","action_delete_messages":"為所有人清除訊息","action_leave_chat":"離開對話","action_report_chat":"檢舉對話","archived_contacts":"已封存的聯絡人 ({count})","badge_danger":"不可信","badge_owner":"擁有者","badge_staff":"員工管理","badge_verified":"已驗證/官方","badge_you":"您","block_contact_warning":"您確定要封鎖此聯絡人嗎?","blocked_contacts_link":"已封鎖的聯絡人 ({count})","button_add_members":"新增成員","button_cancel":"取消","button_confirm":"確認","button_create":"建立","button_delete_account":"刪除帳號","button_edit":"編輯","button_logout":"登出","button_ok":"OK","button_reset":"重設","button_send_request":"傳送要求","button_sign_in":"登入","button_sign_up":"註冊","button_subscribe":"訂閱","button_update":"更新","cannot_initiate_file_upload":"無法為檔案上傳初始化。","channel":"頻道","channel_prompt":"這是頻道","chat_invitation":"您已被邀請開始新對話。您接下來要做什麼呢?","chat_invitation_accept":"接受","chat_invitation_block":"封鎖","chat_invitation_ignore":"忽略","clear_messages_warning":"您確定要清除所有訊息嗎?此操作無法復原。","code_doesnot_match":"代碼不相符","contacts_not_found":"您沒有任何對話
¯∖_(ツ)_/¯","contacts_not_found_short":"沒有符合 ''{query}'' 的聯絡人","credential_email_prompt":"您的註冊電子郵件地址","delete_account":"刪除帳號","delete_account_warning":"您確定要刪除您的帳戶嗎?此操作無法撤消。","delete_messages_warning":"您確定要為所有人刪除所有訊息嗎?此操作無法復原。","download_action":"下載","drafty_attachment":"附加檔案","drafty_form":"表單:","drafty_image":"圖片","email_dative":"電子郵件地址","email_prompt":"電子郵件地址,例如:jdoe@example.com","enable_peers_messaging":"啟用","enter_confirmation_code_prompt":"輸入透過 {method} 傳送給您的確認碼:","error_invalid_id":"ID 無效","file_attachment_too_large":"檔案大小 {size} 超出 {limit} 限制。","forgot_password_link":"忘記密碼?","full_name_prompt":"全名,例如:王小明","granted_permissions":"已授權","group_has_no_members":"無成員","group_user_id_prompt":"群組或使用者 ID","image_caption_prompt":"圖片說明","invalid_content":"內容無效","invalid_security_token":"安全權杖無效","label_client":"客戶端:","label_content_type":"類型:","label_default_access_mode":"預設存取模式:","label_file_name":"檔名:","label_group_members":"群組成員:","label_incognito_mode":"無痕模式:","label_message_sound":"訊息提示聲:","label_muting_topic":"靜音:","label_other_user":"其他","label_password":"密碼","label_permissions":"權限:","label_private":"私人留言","label_push_notifications":"通知:","label_push_notifications_disabled":"通知 (需要 HTTPS):","label_reset_password":"傳送重設密碼郵件:","label_sdk":"SDK:","label_server":"伺服器:","label_server_address":"伺服器位址:","label_server_to_use":"使用的伺服器:","label_size":"大小:","label_topic_name":"名稱","label_user_contacts":"聯絡人","label_user_id":"ID:","label_wire_transport":"線路傳輸:","label_you":"您:","label_your_name":"您的名字","label_your_permissions":"您的權限:","last_seen_timestamp":"最後上線","leave_chat_warning":"您確定要離開此對話嗎?","link_contact_us":"聯絡我們","link_privacy_policy":"隱私權政策","link_terms_of_service":"服務條款","login_prompt":"登入","menu_item_archive_topic":"封存","menu_item_block":"封鎖","menu_item_clear_messages":"清除訊息","menu_item_clear_messages_for_all":"為所有人清除訊息","menu_item_delete":"刪除","menu_item_delete_for_all":"為所有人刪除","menu_item_delete_topic":"刪除","menu_item_edit_permissions":"編輯權限","menu_item_info":"Info","menu_item_member_delete":"移除","menu_item_mute":"靜音","menu_item_restore_topic":"恢復","menu_item_send_retry":"重試","menu_item_unblock":"解除封鎖","menu_item_unmute":"解除靜音","message_sending":"正在傳送...","message_sending_failed":"失敗","messages_not_readable":"沒有存取訊息的權限","messaging_disabled_prompt":"停用訊息","more_online_members":"+{overflow}","new_message_prompt":"新訊息","new_password_placeholder":"輸入新的密碼","no_connection":"無連線","no_contacts":"您沒有任何聯絡人 :-(","numeric_confirmation_code_prompt":"僅數字","online_now":"上線中","password_prompt":"密碼","password_unchanged_prompt":"未修改","peers_messaging_disabled":"Peer 已停用訊息。","permission_admin":"核可 ({val})","permission_delete":"刪除 ({val})","permission_join":"加入 ({val})","permission_owner":"擁有者 ({val})","permission_pres":"收到通知 ({val})","permission_read":"讀取 ({val})","permission_share":"分享 ({val})","permission_write":"撰寫 ({val})","phone_dative":"phone","private_editing_placeholder":"僅您可見","push_init_failed":"初始化通知失敗。","reconnect_countdown":"已斷線。將在 {seconds} 秒後重新連線…","reconnect_now":"現在重試","reload_update":"重新載入","report_chat_warning":"您確定要封鎖並檢舉此對話嗎?","requested_permissions":"重新請求","save_attachment":"儲存","search_for_contacts":"使用搜尋來尋找聯絡人","search_no_results":"搜尋無結果","search_placeholder":"例如 email:alice@example.com, tel:17025550003... 的清單","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支援","sidepanel_title_account_settings":"帳號設定","sidepanel_title_archive":"已封存的對話","sidepanel_title_blocked":"已封鎖的對話","sidepanel_title_cred":"確認認證","sidepanel_title_login":"登入","sidepanel_title_newtpk":"開始新對話","sidepanel_title_register":"建立帳號","sidepanel_title_reset":"重設密碼","sidepanel_title_settings":"設定","stay_logged_in":"保持登入","tabtitle_find_user":"尋找","tabtitle_group_by_id":"以 id","tabtitle_new_group":"新群組","tags_editor_no_tags":"新增一些標籤","tags_not_found":"未定義任何標籤。請新增一些標籤。","title_all_contacts":"所有聯絡人","title_group_members":"群組成員","title_manage_tags":"管理","title_not_found":"找不到","title_permissions":"權限","title_tag_manager":"標籤 (使用者探索)","topic_block_warning":"您確定要封鎖此對話嗎?","topic_delete_warning":"您確定要刪除此對話嗎?","topic_name_editing_placeholder":"群組的任意名稱","unnamed_topic":"未命名","update_available":"有可用的更新。","upload_finishing":"正在完成...","user_not_found":"找不到","description_editing_placeholder":"說明(可選)","label_description":"說明","button_security":"安全性","panel_title_crop":"拖動調整","panel_title_general":"一般","panel_title_members":"成員","panel_title_security":"安全性","panel_title_info":"資訊","permissions_anonymous":"匿名","permissions_authenticated":"已認證","topic_delete":"刪除聊天","permissions_user":"用戶權限","password_reset_email_sent":"已發送一封帶有安全代碼的電子郵件。","label_unarchive_topic":"存檔聊天:","menu_item_reply":"回答","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索聯繫人","label_new_password":"新密碼","drafty_unknown":"不支持","calls_incoming":"來電","calls_outgoing":"撥出電話","calls_you_label":"你","menu_item_video_call":"視頻電話","already_in_call":"你已經在說話了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒","call_disconnected":"斷開連接","label_use_secure_connection":"使用安全連接","cred_confirmed_successfully":"確認成功","menu_item_edit":"編輯","editing_message":"編輯","message_edited_marker":",編輯","icon_title_add_image":"添加圖片","icon_title_attach_file":"附加文件","icon_title_delete":"刪除錄音","icon_title_pause":"暫停播放","icon_title_play":"播放錄音","icon_title_record_voice":"錄製語音消息","icon_title_resume":"恢復播放","icon_title_send":"發信息","drag_file":"將文件拖到這裡","drafty_video":"視頻錄製","call_in_progress":"通話中","menu_item_audio_call":"稱呼","unrecognized_video_format":"無法識別此視頻的格式","loading_note":"加載中...","password_i_have_code":"我有代碼","label_reset_password_tel":"發送短信重置密碼","mobile_phone_number":"手機號碼","password_reset_sms_sent":"已發送帶有安全代碼的短信。","mobile_number_required":"需要手機號","current_email":"當前郵箱","current_phone":"當前電話號碼","new_email":"新電子郵件地址","new_phone_number":"新電話號碼","change_email":"更改郵箱","change_phone":"更改電話號碼","call_busy":"忙碌的","failed_to_init_audio":"初始化錄音失敗","calls_conference":"電話會議","password_reset_success":"密碼重置成功"} \ No newline at end of file diff --git a/src/i18n.min/zh.json b/src/i18n.min/zh.json index 5a03bfc4..106c19b3 100644 --- a/src/i18n.min/zh.json +++ b/src/i18n.min/zh.json @@ -1 +1 @@ -{"action_block_contact":"屏蔽联系人","action_cancel":"取消","action_clear_messages":"删除讯息","action_delete_messages":"删除所有帖子","action_leave_chat":"离开","action_report_chat":"检举垃圾邮件","archived_contacts":"已归档联系人 ({count})","badge_danger":"可疑的","badge_owner":"所有者","badge_staff":"在员工管理下","badge_verified":"值得信赖","badge_you":"你","block_contact_warning":"您确定要阻止此联系人吗?","blocked_contacts_link":"封锁的联络人 ({count})","button_add_members":"添加成员","button_cancel":"取消","button_confirm":"确认","button_create":"创建","button_delete_account":"删除帐户","button_edit":"编辑","button_logout":"登出","button_ok":"好","button_reset":"重置","button_send_request":"发送请求","button_sign_in":"登录","button_sign_up":"注册","button_subscribe":"订阅","button_update":"更新","cannot_initiate_file_upload":"无法初始化文件上传。","channel":"频道","channel_prompt":"这是一个频道","chat_invitation":"你受邀开始新会话。你想怎么做?","chat_invitation_accept":"接受","chat_invitation_block":"屏蔽","chat_invitation_ignore":"忽略","clear_messages_warning":"您确定要清除所有消息吗?无法撤消。","code_doesnot_match":"代码不匹配","contacts_not_found":"你尚无会话
¯∖_(ツ)_/¯","contacts_not_found_short":"无联系人匹配''{query}''","credential_email_prompt":"你的注册邮箱","delete_account":"删除帐户","delete_account_warning":"您确定要删除您的帐户吗?无法撤消。","delete_messages_warning":"您确定要删除所有消息吗?无法撤消。","download_action":"下载","drafty_attachment":"附件","drafty_form":"形式:","drafty_image":"图像","email_dative":"电子邮件","email_prompt":"电子邮件,例如 zhang@example.com","enable_peers_messaging":"启用","enter_confirmation_code_prompt":"输入通过{method}发送的验证码:","error_invalid_id":"无效 ID","file_attachment_too_large":"文件大小 {size} 超过 {limit} 限制。","forgot_password_link":"忘记密码?","full_name_prompt":"全名,例如张伟","granted_permissions":"已授予","group_has_no_members":"无成员","group_user_id_prompt":"群组或用户 ID","image_caption_prompt":"图片标题","invalid_content":"无效内容","invalid_security_token":"无效的安全令牌","label_client":"客户端:","label_content_type":"内容类型:","label_default_access_mode":"默认访问模式:","label_file_name":"文件名:","label_group_members":"群组成员:","label_incognito_mode":"无痕模式:","label_message_sound":"消息提示音:","label_muting_topic":"已静音:","label_other_user":"其他","label_password":"密码","label_permissions":"权限:","label_private":"私人评论","label_push_notifications":"通知提醒:","label_push_notifications_disabled":"通知提醒(需要 HTTPS):","label_reset_password":"发送密码重置邮件:","label_sdk":"开发包:","label_server":"服务器:","label_server_address":"服务器地址:","label_server_to_use":"使用的服务器:","label_size":"大小:","label_topic_name":"名称","label_user_contacts":"往来","label_user_id":"地址:","label_wire_transport":"线路传输:","label_you":"你:","label_your_name":"你的姓名","label_your_permissions":"你的权限:","last_seen_timestamp":"最后可见","leave_chat_warning":"您确定要退出此对话吗?","link_contact_us":"联系我们","link_privacy_policy":"隐私政策","link_terms_of_service":"条款和条件","login_prompt":"登录","menu_item_archive_topic":"归档","menu_item_block":"屏蔽","menu_item_clear_messages":"清空消息","menu_item_clear_messages_for_all":"全部清除","menu_item_delete":"删除","menu_item_delete_for_all":"全部删除","menu_item_delete_topic":"删除","menu_item_edit_permissions":"编辑权限","menu_item_info":"信息","menu_item_member_delete":"移除","menu_item_mute":"静音","menu_item_restore_topic":"从存档中恢复","menu_item_send_retry":"重试","menu_item_unblock":"取消屏蔽","menu_item_unmute":"取消静音","message_sending":"正在发送...","message_sending_failed":"发送失败","messages_not_readable":"无消息访问权限","messaging_disabled_prompt":"消息已禁用","more_online_members":"还有{overflow}个","new_message_prompt":"新消息","new_password_placeholder":"输入新密码","no_connection":"无连接","no_contacts":"你尚无联系人 (._.)","numeric_confirmation_code_prompt":"仅数字","online_now":"在线","password_prompt":"密码","password_unchanged_prompt":"未改变","peers_messaging_disabled":"成员间消息已禁用。","permission_admin":"批准 ({val})","permission_delete":"删除 ({val})","permission_join":"加入 ({val})","permission_owner":"所有者 ({val})","permission_pres":"获取通知 ({val})","permission_read":"读取 ({val})","permission_share":"分享 ({val})","permission_write":"写入 ({val})","phone_dative":"电话","private_editing_placeholder":"仅自己可见","push_init_failed":"初始化推送通知失败","reconnect_countdown":"连接已断开。{seconds} 秒后重新连接…","reconnect_now":"立即尝试","reload_update":"重新载入","report_chat_warning":"您确定要停止并报告此对话吗?","requested_permissions":"已请求","save_attachment":"保存","search_for_contacts":"使用搜索寻找联系人","search_no_results":"搜索返回任何结果","search_placeholder":"列表如 email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支持","sidepanel_title_account_settings":"帐号设定","sidepanel_title_archive":"已存档会话","sidepanel_title_blocked":"被阻止的聊天","sidepanel_title_cred":"确认凭据","sidepanel_title_login":"登录","sidepanel_title_newtpk":"开始新会话","sidepanel_title_register":"创建账户","sidepanel_title_reset":"重置密码","sidepanel_title_settings":"设置","stay_logged_in":"保持登录","tabtitle_find_user":"搜索","tabtitle_group_by_id":"通过 id","tabtitle_new_group":"新群组","tags_editor_no_tags":"添加一些标签","tags_not_found":"尚未定义标签。添加一些。","title_all_contacts":"全部联系人","title_group_members":"群组成员","title_manage_tags":"管理标签","title_not_found":"无法找到","title_permissions":"权限","title_tag_manager":"标签(用户发现)","topic_block_warning":"您确定要阻止此对话吗?","topic_delete_warning":"您确定要删除此对话吗?","topic_name_editing_placeholder":"群组自由格式名称","unnamed_topic":"未命名","update_available":"更新可用。","upload_finishing":"正在结束...","user_not_found":"未找到","description_editing_placeholder":"说明(可选)","label_description":"说明","button_security":"安全","panel_title_crop":"拖动调整","panel_title_general":"常用设定","panel_title_members":"成员","panel_title_security":"安全","panel_title_info":"信息","permissions_anonymous":"匿名","permissions_authenticated":"已认证","topic_delete":"删除聊天","permissions_user":"用户权限","password_reset_email_sent":"已发送一封带有安全代码的电子邮件。","label_unarchive_topic":"存档:","menu_item_reply":"回复","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索联系人","label_new_password":"新密码","drafty_unknown":"不支持","calls_incoming":"来电","calls_outgoing":"拨出电话","calls_you_label":"你","menu_item_video_call":"视频电话","already_in_call":"你已经在说话了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒","call_disconnected":"断开连接","label_use_secure_connection":"使用安全连接","cred_confirmed_successfully":"确认成功","menu_item_edit":"编辑","editing_message":"编辑","message_edited_marker":",编辑","icon_title_add_image":"添加图片","icon_title_attach_file":"附加文件","icon_title_delete":"删除录音","icon_title_pause":"暂停播放","icon_title_play":"播放录音","icon_title_record_voice":"录制语音信息","icon_title_resume":"恢复播放","icon_title_send":"发信息","drag_file":"将文件拖到这里","drafty_video":"视频录制","call_in_progress":"通话中","menu_item_audio_call":"称呼","unrecognized_video_format":"无法识别此视频的格式","loading_note":"加载中...","password_i_have_code":"我有代码","label_reset_password_tel":"发送短信重置密码","mobile_phone_number":"手机号","password_reset_sms_sent":"已发送带有安全代码的短信。","mobile_number_required":"需要手机号","current_email":"当前邮箱","current_phone":"当前电话号码","new_email":"新电子邮件地址","new_phone_number":"新电话号码","change_email":"更改邮箱","change_phone":"更改电话号码","call_busy":"忙碌的","failed_to_init_audio":"初始化录音失败","password_reset_success":"密码重置成功"} \ No newline at end of file +{"action_block_contact":"屏蔽联系人","action_cancel":"取消","action_clear_messages":"删除讯息","action_delete_messages":"删除所有帖子","action_leave_chat":"离开","action_report_chat":"检举垃圾邮件","archived_contacts":"已归档联系人 ({count})","badge_danger":"可疑的","badge_owner":"所有者","badge_staff":"在员工管理下","badge_verified":"值得信赖","badge_you":"你","block_contact_warning":"您确定要阻止此联系人吗?","blocked_contacts_link":"封锁的联络人 ({count})","button_add_members":"添加成员","button_cancel":"取消","button_confirm":"确认","button_create":"创建","button_delete_account":"删除帐户","button_edit":"编辑","button_logout":"登出","button_ok":"好","button_reset":"重置","button_send_request":"发送请求","button_sign_in":"登录","button_sign_up":"注册","button_subscribe":"订阅","button_update":"更新","cannot_initiate_file_upload":"无法初始化文件上传。","channel":"频道","channel_prompt":"这是一个频道","chat_invitation":"你受邀开始新会话。你想怎么做?","chat_invitation_accept":"接受","chat_invitation_block":"屏蔽","chat_invitation_ignore":"忽略","clear_messages_warning":"您确定要清除所有消息吗?无法撤消。","code_doesnot_match":"代码不匹配","contacts_not_found":"你尚无会话
¯∖_(ツ)_/¯","contacts_not_found_short":"无联系人匹配''{query}''","credential_email_prompt":"你的注册邮箱","delete_account":"删除帐户","delete_account_warning":"您确定要删除您的帐户吗?无法撤消。","delete_messages_warning":"您确定要删除所有消息吗?无法撤消。","download_action":"下载","drafty_attachment":"附件","drafty_form":"形式:","drafty_image":"图像","email_dative":"电子邮件","email_prompt":"电子邮件,例如 zhang@example.com","enable_peers_messaging":"启用","enter_confirmation_code_prompt":"输入通过{method}发送的验证码:","error_invalid_id":"无效 ID","file_attachment_too_large":"文件大小 {size} 超过 {limit} 限制。","forgot_password_link":"忘记密码?","full_name_prompt":"全名,例如张伟","granted_permissions":"已授予","group_has_no_members":"无成员","group_user_id_prompt":"群组或用户 ID","image_caption_prompt":"图片标题","invalid_content":"无效内容","invalid_security_token":"无效的安全令牌","label_client":"客户端:","label_content_type":"内容类型:","label_default_access_mode":"默认访问模式:","label_file_name":"文件名:","label_group_members":"群组成员:","label_incognito_mode":"无痕模式:","label_message_sound":"消息提示音:","label_muting_topic":"已静音:","label_other_user":"其他","label_password":"密码","label_permissions":"权限:","label_private":"私人评论","label_push_notifications":"通知提醒:","label_push_notifications_disabled":"通知提醒(需要 HTTPS):","label_reset_password":"发送密码重置邮件:","label_sdk":"开发包:","label_server":"服务器:","label_server_address":"服务器地址:","label_server_to_use":"使用的服务器:","label_size":"大小:","label_topic_name":"名称","label_user_contacts":"往来","label_user_id":"地址:","label_wire_transport":"线路传输:","label_you":"你:","label_your_name":"你的姓名","label_your_permissions":"你的权限:","last_seen_timestamp":"最后可见","leave_chat_warning":"您确定要退出此对话吗?","link_contact_us":"联系我们","link_privacy_policy":"隐私政策","link_terms_of_service":"条款和条件","login_prompt":"登录","menu_item_archive_topic":"归档","menu_item_block":"屏蔽","menu_item_clear_messages":"清空消息","menu_item_clear_messages_for_all":"全部清除","menu_item_delete":"删除","menu_item_delete_for_all":"全部删除","menu_item_delete_topic":"删除","menu_item_edit_permissions":"编辑权限","menu_item_info":"信息","menu_item_member_delete":"移除","menu_item_mute":"静音","menu_item_restore_topic":"从存档中恢复","menu_item_send_retry":"重试","menu_item_unblock":"取消屏蔽","menu_item_unmute":"取消静音","message_sending":"正在发送...","message_sending_failed":"发送失败","messages_not_readable":"无消息访问权限","messaging_disabled_prompt":"消息已禁用","more_online_members":"还有{overflow}个","new_message_prompt":"新消息","new_password_placeholder":"输入新密码","no_connection":"无连接","no_contacts":"你尚无联系人 (._.)","numeric_confirmation_code_prompt":"仅数字","online_now":"在线","password_prompt":"密码","password_unchanged_prompt":"未改变","peers_messaging_disabled":"成员间消息已禁用。","permission_admin":"批准 ({val})","permission_delete":"删除 ({val})","permission_join":"加入 ({val})","permission_owner":"所有者 ({val})","permission_pres":"获取通知 ({val})","permission_read":"读取 ({val})","permission_share":"分享 ({val})","permission_write":"写入 ({val})","phone_dative":"电话","private_editing_placeholder":"仅自己可见","push_init_failed":"初始化推送通知失败","reconnect_countdown":"连接已断开。{seconds} 秒后重新连接…","reconnect_now":"立即尝试","reload_update":"重新载入","report_chat_warning":"您确定要停止并报告此对话吗?","requested_permissions":"已请求","save_attachment":"保存","search_for_contacts":"使用搜索寻找联系人","search_no_results":"搜索返回任何结果","search_placeholder":"列表如 email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支持","sidepanel_title_account_settings":"帐号设定","sidepanel_title_archive":"已存档会话","sidepanel_title_blocked":"被阻止的聊天","sidepanel_title_cred":"确认凭据","sidepanel_title_login":"登录","sidepanel_title_newtpk":"开始新会话","sidepanel_title_register":"创建账户","sidepanel_title_reset":"重置密码","sidepanel_title_settings":"设置","stay_logged_in":"保持登录","tabtitle_find_user":"搜索","tabtitle_group_by_id":"通过 id","tabtitle_new_group":"新群组","tags_editor_no_tags":"添加一些标签","tags_not_found":"尚未定义标签。添加一些。","title_all_contacts":"全部联系人","title_group_members":"群组成员","title_manage_tags":"管理标签","title_not_found":"无法找到","title_permissions":"权限","title_tag_manager":"标签(用户发现)","topic_block_warning":"您确定要阻止此对话吗?","topic_delete_warning":"您确定要删除此对话吗?","topic_name_editing_placeholder":"群组自由格式名称","unnamed_topic":"未命名","update_available":"更新可用。","upload_finishing":"正在结束...","user_not_found":"未找到","description_editing_placeholder":"说明(可选)","label_description":"说明","button_security":"安全","panel_title_crop":"拖动调整","panel_title_general":"常用设定","panel_title_members":"成员","panel_title_security":"安全","panel_title_info":"信息","permissions_anonymous":"匿名","permissions_authenticated":"已认证","topic_delete":"删除聊天","permissions_user":"用户权限","password_reset_email_sent":"已发送一封带有安全代码的电子邮件。","label_unarchive_topic":"存档:","menu_item_reply":"回复","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索联系人","label_new_password":"新密码","drafty_unknown":"不支持","calls_incoming":"来电","calls_outgoing":"拨出电话","calls_you_label":"你","menu_item_video_call":"视频电话","already_in_call":"你已经在说话了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒","call_disconnected":"断开连接","label_use_secure_connection":"使用安全连接","cred_confirmed_successfully":"确认成功","menu_item_edit":"编辑","editing_message":"编辑","message_edited_marker":",编辑","icon_title_add_image":"添加图片","icon_title_attach_file":"附加文件","icon_title_delete":"删除录音","icon_title_pause":"暂停播放","icon_title_play":"播放录音","icon_title_record_voice":"录制语音信息","icon_title_resume":"恢复播放","icon_title_send":"发信息","drag_file":"将文件拖到这里","drafty_video":"视频录制","call_in_progress":"通话中","menu_item_audio_call":"称呼","unrecognized_video_format":"无法识别此视频的格式","loading_note":"加载中...","password_i_have_code":"我有代码","label_reset_password_tel":"发送短信重置密码","mobile_phone_number":"手机号","password_reset_sms_sent":"已发送带有安全代码的短信。","mobile_number_required":"需要手机号","current_email":"当前邮箱","current_phone":"当前电话号码","new_email":"新电子邮件地址","new_phone_number":"新电话号码","change_email":"更改邮箱","change_phone":"更改电话号码","call_busy":"忙碌的","failed_to_init_audio":"初始化录音失败","calls_conference":"电话会议","password_reset_success":"密码重置成功"} \ No newline at end of file diff --git a/src/i18n/de.json b/src/i18n/de.json index 6d3e490d..5f700e0b 100644 --- a/src/i18n/de.json +++ b/src/i18n/de.json @@ -1649,10 +1649,10 @@ "obsolete": false }, "calls_conference": { - "translation": "", + "translation": "Telefonkonferenz", "defaultMessage": "Conference call", "description": "Conference call label", - "missing": true, + "missing": false, "obsolete": false }, "password_reset_success": { @@ -1661,5 +1661,12 @@ "description": "Notification message that the password was successfully reset.", "missing": false, "obsolete": false + }, + "join_conference": { + "translation": "", + "defaultMessage": "+ Join", + "description": "Call to action to join a conference call", + "missing": true, + "obsolete": false } } diff --git a/src/i18n/en.json b/src/i18n/en.json index f0859754..68d5cbcb 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -1661,5 +1661,12 @@ "description": "Notification message that the password was successfully reset.", "missing": false, "obsolete": false + }, + "join_conference": { + "translation": "+ Join", + "defaultMessage": "+ Join", + "description": "Call to action to join a conference call", + "missing": false, + "obsolete": false } } diff --git a/src/i18n/es.json b/src/i18n/es.json index 2c1a385b..f0ace9ba 100644 --- a/src/i18n/es.json +++ b/src/i18n/es.json @@ -1649,10 +1649,10 @@ "obsolete": false }, "calls_conference": { - "translation": "", + "translation": "Conferencia", "defaultMessage": "Conference call", "description": "Conference call label", - "missing": true, + "missing": false, "obsolete": false }, "password_reset_success": { @@ -1661,5 +1661,12 @@ "description": "Notification message that the password was successfully reset.", "missing": false, "obsolete": false + }, + "join_conference": { + "translation": "", + "defaultMessage": "+ Join", + "description": "Call to action to join a conference call", + "missing": true, + "obsolete": false } } diff --git a/src/i18n/ex/base-en.json b/src/i18n/ex/base-en.json index 315736c5..ad335d7c 100644 --- a/src/i18n/ex/base-en.json +++ b/src/i18n/ex/base-en.json @@ -374,6 +374,10 @@ "defaultMessage": "Invalid security token", "description": "Error message when resetting password." }, + "join_conference": { + "defaultMessage": "+ Join", + "description": "Call to action to join a conference call" + }, "label_client": { "defaultMessage": "Client:", "description": "Label for a client version" diff --git a/src/i18n/fr.json b/src/i18n/fr.json index 15f7b849..d57160b1 100644 --- a/src/i18n/fr.json +++ b/src/i18n/fr.json @@ -1649,10 +1649,10 @@ "obsolete": false }, "calls_conference": { - "translation": "", + "translation": "Conférence téléphonique", "defaultMessage": "Conference call", "description": "Conference call label", - "missing": true, + "missing": false, "obsolete": false }, "password_reset_success": { @@ -1661,5 +1661,12 @@ "description": "Notification message that the password was successfully reset.", "missing": false, "obsolete": false + }, + "join_conference": { + "translation": "", + "defaultMessage": "+ Join", + "description": "Call to action to join a conference call", + "missing": true, + "obsolete": false } } diff --git a/src/i18n/ko.json b/src/i18n/ko.json index 6e5d4215..dc336b2f 100644 --- a/src/i18n/ko.json +++ b/src/i18n/ko.json @@ -1649,10 +1649,10 @@ "obsolete": false }, "calls_conference": { - "translation": "", + "translation": "전화 회의", "defaultMessage": "Conference call", "description": "Conference call label", - "missing": true, + "missing": false, "obsolete": false }, "password_reset_success": { @@ -1661,5 +1661,12 @@ "description": "Notification message that the password was successfully reset.", "missing": false, "obsolete": false + }, + "join_conference": { + "translation": "", + "defaultMessage": "+ Join", + "description": "Call to action to join a conference call", + "missing": true, + "obsolete": false } } diff --git a/src/i18n/ro.json b/src/i18n/ro.json index 3b6089ff..f1b6165a 100644 --- a/src/i18n/ro.json +++ b/src/i18n/ro.json @@ -1649,10 +1649,10 @@ "obsolete": false }, "calls_conference": { - "translation": "", + "translation": "Apel de conferinta", "defaultMessage": "Conference call", "description": "Conference call label", - "missing": true, + "missing": false, "obsolete": false }, "password_reset_success": { @@ -1661,5 +1661,12 @@ "description": "Notification message that the password was successfully reset.", "missing": false, "obsolete": false + }, + "join_conference": { + "translation": "", + "defaultMessage": "+ Join", + "description": "Call to action to join a conference call", + "missing": true, + "obsolete": false } } diff --git a/src/i18n/ru.json b/src/i18n/ru.json index de95df76..5669893c 100644 --- a/src/i18n/ru.json +++ b/src/i18n/ru.json @@ -1649,10 +1649,10 @@ "obsolete": false }, "calls_conference": { - "translation": "", + "translation": "Групповой звонок", "defaultMessage": "Conference call", "description": "Conference call label", - "missing": true, + "missing": false, "obsolete": false }, "password_reset_success": { @@ -1661,5 +1661,12 @@ "description": "Notification message that the password was successfully reset.", "missing": false, "obsolete": false + }, + "join_conference": { + "translation": "", + "defaultMessage": "+ Join", + "description": "Call to action to join a conference call", + "missing": true, + "obsolete": false } } diff --git a/src/i18n/zh-TW.json b/src/i18n/zh-TW.json index 65319397..171f1de2 100644 --- a/src/i18n/zh-TW.json +++ b/src/i18n/zh-TW.json @@ -1649,10 +1649,10 @@ "obsolete": false }, "calls_conference": { - "translation": "", + "translation": "電話會議", "defaultMessage": "Conference call", "description": "Conference call label", - "missing": true, + "missing": false, "obsolete": false }, "password_reset_success": { @@ -1661,5 +1661,12 @@ "description": "Notification message that the password was successfully reset.", "missing": false, "obsolete": false + }, + "join_conference": { + "translation": "", + "defaultMessage": "+ Join", + "description": "Call to action to join a conference call", + "missing": true, + "obsolete": false } } diff --git a/src/i18n/zh.json b/src/i18n/zh.json index 9ea29d30..00350132 100644 --- a/src/i18n/zh.json +++ b/src/i18n/zh.json @@ -1649,10 +1649,10 @@ "obsolete": false }, "calls_conference": { - "translation": "", + "translation": "电话会议", "defaultMessage": "Conference call", "description": "Conference call label", - "missing": true, + "missing": false, "obsolete": false }, "password_reset_success": { @@ -1661,5 +1661,12 @@ "description": "Notification message that the password was successfully reset.", "missing": false, "obsolete": false + }, + "join_conference": { + "translation": "", + "defaultMessage": "+ Join", + "description": "Call to action to join a conference call", + "missing": true, + "obsolete": false } } diff --git a/src/widgets/call-message.jsx b/src/widgets/call-message.jsx index 68dc5610..f5da2c4b 100644 --- a/src/widgets/call-message.jsx +++ b/src/widgets/call-message.jsx @@ -7,7 +7,13 @@ import { secondsToTime } from '../lib/strformat.js'; export default class CallMessage extends React.PureComponent { render() { - const bigIcon = this.props.vc ? 'video_call' : 'call'; + const bigIcon = this.props.vc ? +
+ group + call +
+ : +
call
; const isCallDropped = ['busy', 'declined', 'disconnected', 'missed'].includes(this.props.callState); const successClass = 'material-icons medium ' + (isCallDropped ? 'red' : 'green'); const callIcon = this.props.incoming ? @@ -46,7 +52,9 @@ export default class CallMessage extends React.PureComponent {
{title}
{callIcon} {duration}
{allowJoin ? - Join + + + : null} ; diff --git a/src/widgets/call-status.jsx b/src/widgets/call-status.jsx index 757f1d5c..8f70c0e2 100644 --- a/src/widgets/call-status.jsx +++ b/src/widgets/call-status.jsx @@ -6,7 +6,8 @@ import { secondsToTime } from '../lib/strformat.js'; // Props: // incoming: true | false. -// success: true | false. +// callState: 'busy' | 'declined' | 'disconnected' | 'missed'. +// duration: (call duration in milliseconds). export default class CallStatus extends React.PureComponent { render() { const isCallDropped = ['busy', 'declined', 'disconnected', 'missed'].includes(this.props.callState); diff --git a/src/widgets/inline-video.jsx b/src/widgets/inline-video.jsx index d7fb41d5..addc8d18 100644 --- a/src/widgets/inline-video.jsx +++ b/src/widgets/inline-video.jsx @@ -29,7 +29,7 @@ export default class InlineVideo extends React.PureComponent { {React.createElement('img', this.props)}
{this.props.onClick ? - play_arrow + play_arrow : }
diff --git a/src/widgets/vc-carousel-item.jsx b/src/widgets/vc-carousel-item.jsx index 4ecedd5d..3085db3d 100644 --- a/src/widgets/vc-carousel-item.jsx +++ b/src/widgets/vc-carousel-item.jsx @@ -1,6 +1,5 @@ // Video conference carousel item. import React from 'react'; -import Track from 'livekit-client'; import LetterTile from './letter-tile.jsx'; @@ -25,7 +24,7 @@ export default class VCCarouselItem extends React.PureComponent { this.props.micPub.audioTrack.attach(this.state.audioRef); } } - + handleVideoRefChange(node) { if (!node) { return; } this.setState({videoRef: node}); diff --git a/src/widgets/vc-carousel.jsx b/src/widgets/vc-carousel.jsx index ca0e3801..82ed1262 100644 --- a/src/widgets/vc-carousel.jsx +++ b/src/widgets/vc-carousel.jsx @@ -2,7 +2,6 @@ import React from 'react'; import { Track } from 'livekit-client'; -import LetterTile from './letter-tile.jsx'; import VCCarouselItem from './vc-carousel-item.jsx'; import { VC_CAROUSEL_ITEM_GAP } from '../constants.js'; @@ -12,7 +11,7 @@ export default class VCCarousel extends React.Component { super(props); this.handlePrevClick = this.handlePrevClick.bind(this); this.handleNextClick = this.handleNextClick.bind(this); - + this.carouselRef = React.createRef(); this.contentRef = React.createRef(); this.prevRef = React.createRef(); diff --git a/src/widgets/vc-panel.jsx b/src/widgets/vc-panel.jsx index efde75b8..b8c99978 100644 --- a/src/widgets/vc-panel.jsx +++ b/src/widgets/vc-panel.jsx @@ -1,16 +1,11 @@ // Video conference or broadcast: local and/or peer viewports and controls. import React from 'react'; -import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; +import { FormattedMessage, injectIntl } from 'react-intl'; import { - connect, - LocalParticipant, MediaDeviceFailure, - Participant, ParticipantEvent, RemoteParticipant, - RemoteTrack, - RemoteTrackPublication, Room, RoomEvent, Track, diff --git a/umd/107.prod.js b/umd/107.prod.js index 9ae1026b..ba30121c 100644 --- a/umd/107.prod.js +++ b/umd/107.prod.js @@ -1 +1 @@ -"use strict";(globalThis.webpackChunktinode_webapp=globalThis.webpackChunktinode_webapp||[]).push([[107],{107:e=>{e.exports=JSON.parse('{"action_block_contact":"Bloquer le Contact","action_cancel":"annuler","action_clear_messages":"Effacer les Messages","action_delete_messages":"Effacer les Messages pour Tous","action_leave_chat":"Quitter la Conversation","action_report_chat":"Signaler la Conversation","archived_contacts":"Contacts archivés ({count})","badge_danger":"Non fiable","badge_owner":"propriétaire","badge_staff":"Géré par le Staff","badge_verified":"Vérifié / Officiel","badge_you":"vous","block_contact_warning":"Êtes-vous sûr de bloquer le contact ?","blocked_contacts_link":"Contacts bloqués ({count})","button_add_members":"Ajouter des membres","button_cancel":"Annuler","button_confirm":"Confirmer","button_create":"Créer","button_delete_account":"Supprimer le compte","button_edit":"Modifier","button_logout":"Déconnexion","button_ok":"OK","button_reset":"Remettre à Zéro","button_send_request":"Envoyer une demande","button_sign_in":"Connexion","button_sign_up":"Créer un compte","button_subscribe":"S\'abonner","button_update":"Mettre à jour","cannot_initiate_file_upload":"Impossible de démarrer l\'envoi.","channel":"canal","channel_prompt":"C\'est un canal","chat_invitation":"Vous êtes invité à démarrer une conversation. Que voulez vous faire ?","chat_invitation_accept":"Accepter","chat_invitation_block":"Bloquer","chat_invitation_ignore":"Ignorer","clear_messages_warning":"Êtes-vous sûr de vouloir effacer tous les messages ? Aucun retour possible.","code_doesnot_match":"Le code ne correspond pas","contacts_not_found":"Vous n\'avez aucune conversation
¯∖_(ツ)_/¯","contacts_not_found_short":"Aucun contact ne correspond à \'\'{query}\'\'","credential_email_prompt":"Votre email d\'enregistrement","delete_account":"Supprimer le compte","delete_account_warning":"Êtes-vous sûr de vouloir supprimer votre compte ? Aucun retour possible.","delete_messages_warning":"Êtes-vous sûr de vouloir supprimer tous les messages pour tous ? Aucun retour possible.","download_action":"télécharger","drafty_attachment":"Pièce(s) jointe(s)","drafty_form":"Formulaire:","drafty_image":"Image","email_dative":"email","email_prompt":"Email, par exemple jdoe@exemple.com","enable_peers_messaging":"Activer","enter_confirmation_code_prompt":"Entrez le code de confirmation envoyé par {method}:","error_invalid_id":"Identifiant invalide","file_attachment_too_large":"Le fichier de taille {size} dépasse la limite de {limit}.","forgot_password_link":"Mot de passe oublié ?","full_name_prompt":"Nom complet, par exemple John Doe","granted_permissions":"Accordé","group_has_no_members":"Aucun membre","group_user_id_prompt":"Identifiant d\'utilisateur ou de groupe","image_caption_prompt":"Description de l\'image","invalid_content":"contenu invalide","invalid_security_token":"Token de sécurité invalide","label_client":"Client :","label_content_type":"Type de contenu :","label_default_access_mode":"Mode d\'accès par défaut :","label_file_name":"Nom du fichier :","label_group_members":"Membres du groupe :","label_incognito_mode":"Mode incognito :","label_message_sound":"Son du message :","label_muting_topic":"Mué :","label_other_user":"Autre","label_password":"Mot de passe","label_permissions":"Permissions :","label_private":"Commentaire privé","label_push_notifications":"Notifications :","label_push_notifications_disabled":"Notifications (requière HTTPS):","label_reset_password":"Envoyer un mail de remise à zéro de mot de passe :","label_sdk":"SDK :","label_server":"Serveur :","label_server_address":"Adresse du serveur :","label_server_to_use":"Serveur à utiliser :","label_size":"Taille :","label_topic_name":"Nom","label_user_contacts":"Contacts","label_user_id":"ID :","label_wire_transport":"Transport par cable :","label_you":"Vous :","label_your_name":"Votre nom","label_your_permissions":"Vos permissions :","last_seen_timestamp":"Vu pour la dernière fois","leave_chat_warning":"Êtes-vous sûr de vouloir quitter cette conversation ?","link_contact_us":"Contactez Nous","link_privacy_policy":"Politique de confidentialité","link_terms_of_service":"Conditions d\'utilisation","login_prompt":"Connexion","menu_item_archive_topic":"Archiver","menu_item_block":"Bloquer","menu_item_clear_messages":"Effacer les messages","menu_item_clear_messages_for_all":"Effacer pour Tous","menu_item_delete":"Supprimer","menu_item_delete_for_all":"Supprimer pour Tous","menu_item_delete_topic":"Supprimer","menu_item_edit_permissions":"Modifier les permissions","menu_item_info":"Informations","menu_item_member_delete":"Supprimer","menu_item_mute":"Rendre muer","menu_item_reply":"Répondre","menu_item_restore_topic":"Restorer","menu_item_send_retry":"Réessayer","menu_item_unblock":"Débloquer","menu_item_unmute":"Recevoir à nouveau","message_sending":"envoi en cours...","message_sending_failed":"échoué","messages_not_readable":"aucun accès aux messages","messaging_disabled_prompt":"Discussion désactivée","more_online_members":"+{overflow} de plus","new_message_prompt":"Nouveau message","new_password_placeholder":"Entrez un nouveau mot de passe","no_connection":"Aucune connexion","no_contacts":"Vous n\'avez pas de contacts :-(","numeric_confirmation_code_prompt":"Nombres seulement","online_now":"en ligne","password_prompt":"Mot de passe","password_unchanged_prompt":"Non changé","peers_messaging_disabled":"La messagerie point à point est désactivée.","permission_admin":"Approver ({val})","permission_delete":"Supprimer ({val})","permission_join":"Rejoindre ({val})","permission_owner":"Propriétaire ({val})","permission_pres":"Recevoir une notification ({val})","permission_read":"Lire ({val})","permission_share":"Partager ({val})","permission_write":"Ecrire ({val})","phone_dative":"téléphone","private_editing_placeholder":"Visible par vous seulement","push_init_failed":"Impossible d\'initialiser les notifications push","reconnect_countdown":"Déconnecté. Reconnexion dans {seconds}…","reconnect_now":"Essayer maintenant","reload_update":"Recharger","report_chat_warning":"Êtes-vous sûr de vouloir bloquer et signaler cette conversation ?","requested_permissions":"Demandé","save_attachment":"sauvegarder","search_for_contacts":"Utilisez la recherche pour trouver des contacts","search_no_results":"La recherche n\'a donné aucun résultat","search_placeholder":"Liste comme email:alice@exemple.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_account_settings":"Paramètres du compte","sidepanel_title_archive":"Conversations Archivées","sidepanel_title_blocked":"Conversations Bloquées","sidepanel_title_cred":"Confirmer les identifiants","sidepanel_title_login":"Se Connecter","sidepanel_title_newtpk":"Démarrer une nouvelle Conversation","sidepanel_title_register":"Créer un compte","sidepanel_title_reset":"Remettre à Zéro le Mot de Passe","sidepanel_title_settings":"Paramètres","stay_logged_in":"Rester connecté","tabtitle_find_user":"trouver","tabtitle_group_by_id":"par identifiant","tabtitle_new_group":"nouveau groupe","tags_editor_no_tags":"Ajouter des étiquettes","tags_not_found":"Aucune étiquette définie. Ajoutez en.","title_all_contacts":"Tous les Contacts","title_group_members":"Membres du Groupe","title_manage_tags":"Gérer","title_not_found":"Pas trouvé","title_permissions":"Permissions","title_tag_manager":"Etiquettes (recherche & découverte)","topic_block_warning":"Êtes-vous sûr de vouloir bloquer cette conversation ?","topic_delete_warning":"Êtes-vous sûr de vouloir supprimer cette conversation ?","topic_name_editing_placeholder":"Nom libre du groupe","unnamed_topic":"Non nommé","update_available":"Mise à jour disponible.","upload_finishing":"fin...","user_not_found":"Pas trouvé","description_editing_placeholder":"Description facultative","label_description":"Description","button_security":"Sécurité","panel_title_crop":"Déplacez pour ajuster","panel_title_general":"Général","panel_title_members":"Membres","panel_title_security":"Sécurité","panel_title_info":"Informations","permissions_anonymous":"Anonyme","permissions_authenticated":"Authentifié","topic_delete":"Supprimer la Conversation","permissions_user":"Permissions d\'Utilisateur","password_reset_email_sent":"Un e-mail avec code de sécurité a été envoyé.","label_unarchive_topic":"Archivé:","menu_item_forward":"Transférer","forward_to":"Transférer à","forward_to_search_placeholder":"Rechercher des contacts","label_new_password":"Nouveau mot de passe","drafty_unknown":"Non supporté","already_in_call":"Vous êtes déjà dans un appel en cours!","call_cancelled":"annulé","call_declined":"refusé","call_missed":"manqué","calls_incoming":"Appel entrant","calls_outgoing":"Appel sortant","calls_you_label":"Tu","menu_item_video_call":"Appel vidéo","call_disconnected":"débranché","label_use_secure_connection":"Utiliser une connexion sécurisée","cred_confirmed_successfully":"Confirmé avec succès","menu_item_edit":"Modifier","editing_message":"Édition","message_edited_marker":", édité","icon_title_add_image":"Ajouter une image","icon_title_attach_file":"Pièce jointe","icon_title_delete":"Supprimer l\'enregistrement","icon_title_pause":"Interrompre la lecture","icon_title_play":"Lire l\'enregistrement","icon_title_record_voice":"Enregistrer un message vocal","icon_title_resume":"Reprendre la lecture","icon_title_send":"Envoyer le message","drag_file":"Faites glisser le fichier ici","drafty_video":"Enregistrement video","call_in_progress":"en cours","menu_item_audio_call":"Appel","unrecognized_video_format":"Le format de cette vidéo n\'est pas reconnu","loading_note":"Chargement...","password_i_have_code":"J\'ai du code","label_reset_password_tel":"Envoyer un SMS pour réinitialiser le mot de passe","mobile_phone_number":"Numéro de téléphone mobile","password_reset_sms_sent":"Un message texte avec un code de sécurité a été envoyé.","mobile_number_required":"Numéro de téléphone portable requis","current_email":"Courriel actuel","current_phone":"Numéro de téléphone actuel","new_email":"Nouvel e-mail","new_phone_number":"Nouveau numéro de téléphone","change_email":"Modifier l\'e-mail","change_phone":"Modifier le numéro de téléphone","call_busy":"occupé","failed_to_init_audio":"Échec de l\'initialisation de l\'enregistrement audio","password_reset_success":"Mot de passe réinitialisé avec succès"}')}}]); \ No newline at end of file +"use strict";(globalThis.webpackChunktinode_webapp=globalThis.webpackChunktinode_webapp||[]).push([[107],{107:e=>{e.exports=JSON.parse('{"action_block_contact":"Bloquer le Contact","action_cancel":"annuler","action_clear_messages":"Effacer les Messages","action_delete_messages":"Effacer les Messages pour Tous","action_leave_chat":"Quitter la Conversation","action_report_chat":"Signaler la Conversation","archived_contacts":"Contacts archivés ({count})","badge_danger":"Non fiable","badge_owner":"propriétaire","badge_staff":"Géré par le Staff","badge_verified":"Vérifié / Officiel","badge_you":"vous","block_contact_warning":"Êtes-vous sûr de bloquer le contact ?","blocked_contacts_link":"Contacts bloqués ({count})","button_add_members":"Ajouter des membres","button_cancel":"Annuler","button_confirm":"Confirmer","button_create":"Créer","button_delete_account":"Supprimer le compte","button_edit":"Modifier","button_logout":"Déconnexion","button_ok":"OK","button_reset":"Remettre à Zéro","button_send_request":"Envoyer une demande","button_sign_in":"Connexion","button_sign_up":"Créer un compte","button_subscribe":"S\'abonner","button_update":"Mettre à jour","cannot_initiate_file_upload":"Impossible de démarrer l\'envoi.","channel":"canal","channel_prompt":"C\'est un canal","chat_invitation":"Vous êtes invité à démarrer une conversation. Que voulez vous faire ?","chat_invitation_accept":"Accepter","chat_invitation_block":"Bloquer","chat_invitation_ignore":"Ignorer","clear_messages_warning":"Êtes-vous sûr de vouloir effacer tous les messages ? Aucun retour possible.","code_doesnot_match":"Le code ne correspond pas","contacts_not_found":"Vous n\'avez aucune conversation
¯∖_(ツ)_/¯","contacts_not_found_short":"Aucun contact ne correspond à \'\'{query}\'\'","credential_email_prompt":"Votre email d\'enregistrement","delete_account":"Supprimer le compte","delete_account_warning":"Êtes-vous sûr de vouloir supprimer votre compte ? Aucun retour possible.","delete_messages_warning":"Êtes-vous sûr de vouloir supprimer tous les messages pour tous ? Aucun retour possible.","download_action":"télécharger","drafty_attachment":"Pièce(s) jointe(s)","drafty_form":"Formulaire:","drafty_image":"Image","email_dative":"email","email_prompt":"Email, par exemple jdoe@exemple.com","enable_peers_messaging":"Activer","enter_confirmation_code_prompt":"Entrez le code de confirmation envoyé par {method}:","error_invalid_id":"Identifiant invalide","file_attachment_too_large":"Le fichier de taille {size} dépasse la limite de {limit}.","forgot_password_link":"Mot de passe oublié ?","full_name_prompt":"Nom complet, par exemple John Doe","granted_permissions":"Accordé","group_has_no_members":"Aucun membre","group_user_id_prompt":"Identifiant d\'utilisateur ou de groupe","image_caption_prompt":"Description de l\'image","invalid_content":"contenu invalide","invalid_security_token":"Token de sécurité invalide","label_client":"Client :","label_content_type":"Type de contenu :","label_default_access_mode":"Mode d\'accès par défaut :","label_file_name":"Nom du fichier :","label_group_members":"Membres du groupe :","label_incognito_mode":"Mode incognito :","label_message_sound":"Son du message :","label_muting_topic":"Mué :","label_other_user":"Autre","label_password":"Mot de passe","label_permissions":"Permissions :","label_private":"Commentaire privé","label_push_notifications":"Notifications :","label_push_notifications_disabled":"Notifications (requière HTTPS):","label_reset_password":"Envoyer un mail de remise à zéro de mot de passe :","label_sdk":"SDK :","label_server":"Serveur :","label_server_address":"Adresse du serveur :","label_server_to_use":"Serveur à utiliser :","label_size":"Taille :","label_topic_name":"Nom","label_user_contacts":"Contacts","label_user_id":"ID :","label_wire_transport":"Transport par cable :","label_you":"Vous :","label_your_name":"Votre nom","label_your_permissions":"Vos permissions :","last_seen_timestamp":"Vu pour la dernière fois","leave_chat_warning":"Êtes-vous sûr de vouloir quitter cette conversation ?","link_contact_us":"Contactez Nous","link_privacy_policy":"Politique de confidentialité","link_terms_of_service":"Conditions d\'utilisation","login_prompt":"Connexion","menu_item_archive_topic":"Archiver","menu_item_block":"Bloquer","menu_item_clear_messages":"Effacer les messages","menu_item_clear_messages_for_all":"Effacer pour Tous","menu_item_delete":"Supprimer","menu_item_delete_for_all":"Supprimer pour Tous","menu_item_delete_topic":"Supprimer","menu_item_edit_permissions":"Modifier les permissions","menu_item_info":"Informations","menu_item_member_delete":"Supprimer","menu_item_mute":"Rendre muer","menu_item_reply":"Répondre","menu_item_restore_topic":"Restorer","menu_item_send_retry":"Réessayer","menu_item_unblock":"Débloquer","menu_item_unmute":"Recevoir à nouveau","message_sending":"envoi en cours...","message_sending_failed":"échoué","messages_not_readable":"aucun accès aux messages","messaging_disabled_prompt":"Discussion désactivée","more_online_members":"+{overflow} de plus","new_message_prompt":"Nouveau message","new_password_placeholder":"Entrez un nouveau mot de passe","no_connection":"Aucune connexion","no_contacts":"Vous n\'avez pas de contacts :-(","numeric_confirmation_code_prompt":"Nombres seulement","online_now":"en ligne","password_prompt":"Mot de passe","password_unchanged_prompt":"Non changé","peers_messaging_disabled":"La messagerie point à point est désactivée.","permission_admin":"Approver ({val})","permission_delete":"Supprimer ({val})","permission_join":"Rejoindre ({val})","permission_owner":"Propriétaire ({val})","permission_pres":"Recevoir une notification ({val})","permission_read":"Lire ({val})","permission_share":"Partager ({val})","permission_write":"Ecrire ({val})","phone_dative":"téléphone","private_editing_placeholder":"Visible par vous seulement","push_init_failed":"Impossible d\'initialiser les notifications push","reconnect_countdown":"Déconnecté. Reconnexion dans {seconds}…","reconnect_now":"Essayer maintenant","reload_update":"Recharger","report_chat_warning":"Êtes-vous sûr de vouloir bloquer et signaler cette conversation ?","requested_permissions":"Demandé","save_attachment":"sauvegarder","search_for_contacts":"Utilisez la recherche pour trouver des contacts","search_no_results":"La recherche n\'a donné aucun résultat","search_placeholder":"Liste comme email:alice@exemple.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_account_settings":"Paramètres du compte","sidepanel_title_archive":"Conversations Archivées","sidepanel_title_blocked":"Conversations Bloquées","sidepanel_title_cred":"Confirmer les identifiants","sidepanel_title_login":"Se Connecter","sidepanel_title_newtpk":"Démarrer une nouvelle Conversation","sidepanel_title_register":"Créer un compte","sidepanel_title_reset":"Remettre à Zéro le Mot de Passe","sidepanel_title_settings":"Paramètres","stay_logged_in":"Rester connecté","tabtitle_find_user":"trouver","tabtitle_group_by_id":"par identifiant","tabtitle_new_group":"nouveau groupe","tags_editor_no_tags":"Ajouter des étiquettes","tags_not_found":"Aucune étiquette définie. Ajoutez en.","title_all_contacts":"Tous les Contacts","title_group_members":"Membres du Groupe","title_manage_tags":"Gérer","title_not_found":"Pas trouvé","title_permissions":"Permissions","title_tag_manager":"Etiquettes (recherche & découverte)","topic_block_warning":"Êtes-vous sûr de vouloir bloquer cette conversation ?","topic_delete_warning":"Êtes-vous sûr de vouloir supprimer cette conversation ?","topic_name_editing_placeholder":"Nom libre du groupe","unnamed_topic":"Non nommé","update_available":"Mise à jour disponible.","upload_finishing":"fin...","user_not_found":"Pas trouvé","description_editing_placeholder":"Description facultative","label_description":"Description","button_security":"Sécurité","panel_title_crop":"Déplacez pour ajuster","panel_title_general":"Général","panel_title_members":"Membres","panel_title_security":"Sécurité","panel_title_info":"Informations","permissions_anonymous":"Anonyme","permissions_authenticated":"Authentifié","topic_delete":"Supprimer la Conversation","permissions_user":"Permissions d\'Utilisateur","password_reset_email_sent":"Un e-mail avec code de sécurité a été envoyé.","label_unarchive_topic":"Archivé:","menu_item_forward":"Transférer","forward_to":"Transférer à","forward_to_search_placeholder":"Rechercher des contacts","label_new_password":"Nouveau mot de passe","drafty_unknown":"Non supporté","already_in_call":"Vous êtes déjà dans un appel en cours!","call_cancelled":"annulé","call_declined":"refusé","call_missed":"manqué","calls_incoming":"Appel entrant","calls_outgoing":"Appel sortant","calls_you_label":"Tu","menu_item_video_call":"Appel vidéo","call_disconnected":"débranché","label_use_secure_connection":"Utiliser une connexion sécurisée","cred_confirmed_successfully":"Confirmé avec succès","menu_item_edit":"Modifier","editing_message":"Édition","message_edited_marker":", édité","icon_title_add_image":"Ajouter une image","icon_title_attach_file":"Pièce jointe","icon_title_delete":"Supprimer l\'enregistrement","icon_title_pause":"Interrompre la lecture","icon_title_play":"Lire l\'enregistrement","icon_title_record_voice":"Enregistrer un message vocal","icon_title_resume":"Reprendre la lecture","icon_title_send":"Envoyer le message","drag_file":"Faites glisser le fichier ici","drafty_video":"Enregistrement video","call_in_progress":"en cours","menu_item_audio_call":"Appel","unrecognized_video_format":"Le format de cette vidéo n\'est pas reconnu","loading_note":"Chargement...","password_i_have_code":"J\'ai du code","label_reset_password_tel":"Envoyer un SMS pour réinitialiser le mot de passe","mobile_phone_number":"Numéro de téléphone mobile","password_reset_sms_sent":"Un message texte avec un code de sécurité a été envoyé.","mobile_number_required":"Numéro de téléphone portable requis","current_email":"Courriel actuel","current_phone":"Numéro de téléphone actuel","new_email":"Nouvel e-mail","new_phone_number":"Nouveau numéro de téléphone","change_email":"Modifier l\'e-mail","change_phone":"Modifier le numéro de téléphone","call_busy":"occupé","failed_to_init_audio":"Échec de l\'initialisation de l\'enregistrement audio","calls_conference":"Conférence téléphonique","password_reset_success":"Mot de passe réinitialisé avec succès"}')}}]); \ No newline at end of file diff --git a/umd/226.prod.js b/umd/226.prod.js index d089117e..590a48bf 100644 --- a/umd/226.prod.js +++ b/umd/226.prod.js @@ -1 +1 @@ -"use strict";(globalThis.webpackChunktinode_webapp=globalThis.webpackChunktinode_webapp||[]).push([[226],{5226:e=>{e.exports=JSON.parse('{"action_block_contact":"封鎖聯絡人","action_cancel":"取消","action_clear_messages":"清除訊息","action_delete_messages":"為所有人清除訊息","action_leave_chat":"離開對話","action_report_chat":"檢舉對話","archived_contacts":"已封存的聯絡人 ({count})","badge_danger":"不可信","badge_owner":"擁有者","badge_staff":"員工管理","badge_verified":"已驗證/官方","badge_you":"您","block_contact_warning":"您確定要封鎖此聯絡人嗎?","blocked_contacts_link":"已封鎖的聯絡人 ({count})","button_add_members":"新增成員","button_cancel":"取消","button_confirm":"確認","button_create":"建立","button_delete_account":"刪除帳號","button_edit":"編輯","button_logout":"登出","button_ok":"OK","button_reset":"重設","button_send_request":"傳送要求","button_sign_in":"登入","button_sign_up":"註冊","button_subscribe":"訂閱","button_update":"更新","cannot_initiate_file_upload":"無法為檔案上傳初始化。","channel":"頻道","channel_prompt":"這是頻道","chat_invitation":"您已被邀請開始新對話。您接下來要做什麼呢?","chat_invitation_accept":"接受","chat_invitation_block":"封鎖","chat_invitation_ignore":"忽略","clear_messages_warning":"您確定要清除所有訊息嗎?此操作無法復原。","code_doesnot_match":"代碼不相符","contacts_not_found":"您沒有任何對話
¯∖_(ツ)_/¯","contacts_not_found_short":"沒有符合 \'\'{query}\'\' 的聯絡人","credential_email_prompt":"您的註冊電子郵件地址","delete_account":"刪除帳號","delete_account_warning":"您確定要刪除您的帳戶嗎?此操作無法撤消。","delete_messages_warning":"您確定要為所有人刪除所有訊息嗎?此操作無法復原。","download_action":"下載","drafty_attachment":"附加檔案","drafty_form":"表單:","drafty_image":"圖片","email_dative":"電子郵件地址","email_prompt":"電子郵件地址,例如:jdoe@example.com","enable_peers_messaging":"啟用","enter_confirmation_code_prompt":"輸入透過 {method} 傳送給您的確認碼:","error_invalid_id":"ID 無效","file_attachment_too_large":"檔案大小 {size} 超出 {limit} 限制。","forgot_password_link":"忘記密碼?","full_name_prompt":"全名,例如:王小明","granted_permissions":"已授權","group_has_no_members":"無成員","group_user_id_prompt":"群組或使用者 ID","image_caption_prompt":"圖片說明","invalid_content":"內容無效","invalid_security_token":"安全權杖無效","label_client":"客戶端:","label_content_type":"類型:","label_default_access_mode":"預設存取模式:","label_file_name":"檔名:","label_group_members":"群組成員:","label_incognito_mode":"無痕模式:","label_message_sound":"訊息提示聲:","label_muting_topic":"靜音:","label_other_user":"其他","label_password":"密碼","label_permissions":"權限:","label_private":"私人留言","label_push_notifications":"通知:","label_push_notifications_disabled":"通知 (需要 HTTPS):","label_reset_password":"傳送重設密碼郵件:","label_sdk":"SDK:","label_server":"伺服器:","label_server_address":"伺服器位址:","label_server_to_use":"使用的伺服器:","label_size":"大小:","label_topic_name":"名稱","label_user_contacts":"聯絡人","label_user_id":"ID:","label_wire_transport":"線路傳輸:","label_you":"您:","label_your_name":"您的名字","label_your_permissions":"您的權限:","last_seen_timestamp":"最後上線","leave_chat_warning":"您確定要離開此對話嗎?","link_contact_us":"聯絡我們","link_privacy_policy":"隱私權政策","link_terms_of_service":"服務條款","login_prompt":"登入","menu_item_archive_topic":"封存","menu_item_block":"封鎖","menu_item_clear_messages":"清除訊息","menu_item_clear_messages_for_all":"為所有人清除訊息","menu_item_delete":"刪除","menu_item_delete_for_all":"為所有人刪除","menu_item_delete_topic":"刪除","menu_item_edit_permissions":"編輯權限","menu_item_info":"Info","menu_item_member_delete":"移除","menu_item_mute":"靜音","menu_item_restore_topic":"恢復","menu_item_send_retry":"重試","menu_item_unblock":"解除封鎖","menu_item_unmute":"解除靜音","message_sending":"正在傳送...","message_sending_failed":"失敗","messages_not_readable":"沒有存取訊息的權限","messaging_disabled_prompt":"停用訊息","more_online_members":"+{overflow}","new_message_prompt":"新訊息","new_password_placeholder":"輸入新的密碼","no_connection":"無連線","no_contacts":"您沒有任何聯絡人 :-(","numeric_confirmation_code_prompt":"僅數字","online_now":"上線中","password_prompt":"密碼","password_unchanged_prompt":"未修改","peers_messaging_disabled":"Peer 已停用訊息。","permission_admin":"核可 ({val})","permission_delete":"刪除 ({val})","permission_join":"加入 ({val})","permission_owner":"擁有者 ({val})","permission_pres":"收到通知 ({val})","permission_read":"讀取 ({val})","permission_share":"分享 ({val})","permission_write":"撰寫 ({val})","phone_dative":"phone","private_editing_placeholder":"僅您可見","push_init_failed":"初始化通知失敗。","reconnect_countdown":"已斷線。將在 {seconds} 秒後重新連線…","reconnect_now":"現在重試","reload_update":"重新載入","report_chat_warning":"您確定要封鎖並檢舉此對話嗎?","requested_permissions":"重新請求","save_attachment":"儲存","search_for_contacts":"使用搜尋來尋找聯絡人","search_no_results":"搜尋無結果","search_placeholder":"例如 email:alice@example.com, tel:17025550003... 的清單","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支援","sidepanel_title_account_settings":"帳號設定","sidepanel_title_archive":"已封存的對話","sidepanel_title_blocked":"已封鎖的對話","sidepanel_title_cred":"確認認證","sidepanel_title_login":"登入","sidepanel_title_newtpk":"開始新對話","sidepanel_title_register":"建立帳號","sidepanel_title_reset":"重設密碼","sidepanel_title_settings":"設定","stay_logged_in":"保持登入","tabtitle_find_user":"尋找","tabtitle_group_by_id":"以 id","tabtitle_new_group":"新群組","tags_editor_no_tags":"新增一些標籤","tags_not_found":"未定義任何標籤。請新增一些標籤。","title_all_contacts":"所有聯絡人","title_group_members":"群組成員","title_manage_tags":"管理","title_not_found":"找不到","title_permissions":"權限","title_tag_manager":"標籤 (使用者探索)","topic_block_warning":"您確定要封鎖此對話嗎?","topic_delete_warning":"您確定要刪除此對話嗎?","topic_name_editing_placeholder":"群組的任意名稱","unnamed_topic":"未命名","update_available":"有可用的更新。","upload_finishing":"正在完成...","user_not_found":"找不到","description_editing_placeholder":"說明(可選)","label_description":"說明","button_security":"安全性","panel_title_crop":"拖動調整","panel_title_general":"一般","panel_title_members":"成員","panel_title_security":"安全性","panel_title_info":"資訊","permissions_anonymous":"匿名","permissions_authenticated":"已認證","topic_delete":"刪除聊天","permissions_user":"用戶權限","password_reset_email_sent":"已發送一封帶有安全代碼的電子郵件。","label_unarchive_topic":"存檔聊天:","menu_item_reply":"回答","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索聯繫人","label_new_password":"新密碼","drafty_unknown":"不支持","calls_incoming":"來電","calls_outgoing":"撥出電話","calls_you_label":"你","menu_item_video_call":"視頻電話","already_in_call":"你已經在說話了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒","call_disconnected":"斷開連接","label_use_secure_connection":"使用安全連接","cred_confirmed_successfully":"確認成功","menu_item_edit":"編輯","editing_message":"編輯","message_edited_marker":",編輯","icon_title_add_image":"添加圖片","icon_title_attach_file":"附加文件","icon_title_delete":"刪除錄音","icon_title_pause":"暫停播放","icon_title_play":"播放錄音","icon_title_record_voice":"錄製語音消息","icon_title_resume":"恢復播放","icon_title_send":"發信息","drag_file":"將文件拖到這裡","drafty_video":"視頻錄製","call_in_progress":"通話中","menu_item_audio_call":"稱呼","unrecognized_video_format":"無法識別此視頻的格式","loading_note":"加載中...","password_i_have_code":"我有代碼","label_reset_password_tel":"發送短信重置密碼","mobile_phone_number":"手機號碼","password_reset_sms_sent":"已發送帶有安全代碼的短信。","mobile_number_required":"需要手機號","current_email":"當前郵箱","current_phone":"當前電話號碼","new_email":"新電子郵件地址","new_phone_number":"新電話號碼","change_email":"更改郵箱","change_phone":"更改電話號碼","call_busy":"忙碌的","failed_to_init_audio":"初始化錄音失敗","password_reset_success":"密碼重置成功"}')}}]); \ No newline at end of file +"use strict";(globalThis.webpackChunktinode_webapp=globalThis.webpackChunktinode_webapp||[]).push([[226],{5226:e=>{e.exports=JSON.parse('{"action_block_contact":"封鎖聯絡人","action_cancel":"取消","action_clear_messages":"清除訊息","action_delete_messages":"為所有人清除訊息","action_leave_chat":"離開對話","action_report_chat":"檢舉對話","archived_contacts":"已封存的聯絡人 ({count})","badge_danger":"不可信","badge_owner":"擁有者","badge_staff":"員工管理","badge_verified":"已驗證/官方","badge_you":"您","block_contact_warning":"您確定要封鎖此聯絡人嗎?","blocked_contacts_link":"已封鎖的聯絡人 ({count})","button_add_members":"新增成員","button_cancel":"取消","button_confirm":"確認","button_create":"建立","button_delete_account":"刪除帳號","button_edit":"編輯","button_logout":"登出","button_ok":"OK","button_reset":"重設","button_send_request":"傳送要求","button_sign_in":"登入","button_sign_up":"註冊","button_subscribe":"訂閱","button_update":"更新","cannot_initiate_file_upload":"無法為檔案上傳初始化。","channel":"頻道","channel_prompt":"這是頻道","chat_invitation":"您已被邀請開始新對話。您接下來要做什麼呢?","chat_invitation_accept":"接受","chat_invitation_block":"封鎖","chat_invitation_ignore":"忽略","clear_messages_warning":"您確定要清除所有訊息嗎?此操作無法復原。","code_doesnot_match":"代碼不相符","contacts_not_found":"您沒有任何對話
¯∖_(ツ)_/¯","contacts_not_found_short":"沒有符合 \'\'{query}\'\' 的聯絡人","credential_email_prompt":"您的註冊電子郵件地址","delete_account":"刪除帳號","delete_account_warning":"您確定要刪除您的帳戶嗎?此操作無法撤消。","delete_messages_warning":"您確定要為所有人刪除所有訊息嗎?此操作無法復原。","download_action":"下載","drafty_attachment":"附加檔案","drafty_form":"表單:","drafty_image":"圖片","email_dative":"電子郵件地址","email_prompt":"電子郵件地址,例如:jdoe@example.com","enable_peers_messaging":"啟用","enter_confirmation_code_prompt":"輸入透過 {method} 傳送給您的確認碼:","error_invalid_id":"ID 無效","file_attachment_too_large":"檔案大小 {size} 超出 {limit} 限制。","forgot_password_link":"忘記密碼?","full_name_prompt":"全名,例如:王小明","granted_permissions":"已授權","group_has_no_members":"無成員","group_user_id_prompt":"群組或使用者 ID","image_caption_prompt":"圖片說明","invalid_content":"內容無效","invalid_security_token":"安全權杖無效","label_client":"客戶端:","label_content_type":"類型:","label_default_access_mode":"預設存取模式:","label_file_name":"檔名:","label_group_members":"群組成員:","label_incognito_mode":"無痕模式:","label_message_sound":"訊息提示聲:","label_muting_topic":"靜音:","label_other_user":"其他","label_password":"密碼","label_permissions":"權限:","label_private":"私人留言","label_push_notifications":"通知:","label_push_notifications_disabled":"通知 (需要 HTTPS):","label_reset_password":"傳送重設密碼郵件:","label_sdk":"SDK:","label_server":"伺服器:","label_server_address":"伺服器位址:","label_server_to_use":"使用的伺服器:","label_size":"大小:","label_topic_name":"名稱","label_user_contacts":"聯絡人","label_user_id":"ID:","label_wire_transport":"線路傳輸:","label_you":"您:","label_your_name":"您的名字","label_your_permissions":"您的權限:","last_seen_timestamp":"最後上線","leave_chat_warning":"您確定要離開此對話嗎?","link_contact_us":"聯絡我們","link_privacy_policy":"隱私權政策","link_terms_of_service":"服務條款","login_prompt":"登入","menu_item_archive_topic":"封存","menu_item_block":"封鎖","menu_item_clear_messages":"清除訊息","menu_item_clear_messages_for_all":"為所有人清除訊息","menu_item_delete":"刪除","menu_item_delete_for_all":"為所有人刪除","menu_item_delete_topic":"刪除","menu_item_edit_permissions":"編輯權限","menu_item_info":"Info","menu_item_member_delete":"移除","menu_item_mute":"靜音","menu_item_restore_topic":"恢復","menu_item_send_retry":"重試","menu_item_unblock":"解除封鎖","menu_item_unmute":"解除靜音","message_sending":"正在傳送...","message_sending_failed":"失敗","messages_not_readable":"沒有存取訊息的權限","messaging_disabled_prompt":"停用訊息","more_online_members":"+{overflow}","new_message_prompt":"新訊息","new_password_placeholder":"輸入新的密碼","no_connection":"無連線","no_contacts":"您沒有任何聯絡人 :-(","numeric_confirmation_code_prompt":"僅數字","online_now":"上線中","password_prompt":"密碼","password_unchanged_prompt":"未修改","peers_messaging_disabled":"Peer 已停用訊息。","permission_admin":"核可 ({val})","permission_delete":"刪除 ({val})","permission_join":"加入 ({val})","permission_owner":"擁有者 ({val})","permission_pres":"收到通知 ({val})","permission_read":"讀取 ({val})","permission_share":"分享 ({val})","permission_write":"撰寫 ({val})","phone_dative":"phone","private_editing_placeholder":"僅您可見","push_init_failed":"初始化通知失敗。","reconnect_countdown":"已斷線。將在 {seconds} 秒後重新連線…","reconnect_now":"現在重試","reload_update":"重新載入","report_chat_warning":"您確定要封鎖並檢舉此對話嗎?","requested_permissions":"重新請求","save_attachment":"儲存","search_for_contacts":"使用搜尋來尋找聯絡人","search_no_results":"搜尋無結果","search_placeholder":"例如 email:alice@example.com, tel:17025550003... 的清單","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支援","sidepanel_title_account_settings":"帳號設定","sidepanel_title_archive":"已封存的對話","sidepanel_title_blocked":"已封鎖的對話","sidepanel_title_cred":"確認認證","sidepanel_title_login":"登入","sidepanel_title_newtpk":"開始新對話","sidepanel_title_register":"建立帳號","sidepanel_title_reset":"重設密碼","sidepanel_title_settings":"設定","stay_logged_in":"保持登入","tabtitle_find_user":"尋找","tabtitle_group_by_id":"以 id","tabtitle_new_group":"新群組","tags_editor_no_tags":"新增一些標籤","tags_not_found":"未定義任何標籤。請新增一些標籤。","title_all_contacts":"所有聯絡人","title_group_members":"群組成員","title_manage_tags":"管理","title_not_found":"找不到","title_permissions":"權限","title_tag_manager":"標籤 (使用者探索)","topic_block_warning":"您確定要封鎖此對話嗎?","topic_delete_warning":"您確定要刪除此對話嗎?","topic_name_editing_placeholder":"群組的任意名稱","unnamed_topic":"未命名","update_available":"有可用的更新。","upload_finishing":"正在完成...","user_not_found":"找不到","description_editing_placeholder":"說明(可選)","label_description":"說明","button_security":"安全性","panel_title_crop":"拖動調整","panel_title_general":"一般","panel_title_members":"成員","panel_title_security":"安全性","panel_title_info":"資訊","permissions_anonymous":"匿名","permissions_authenticated":"已認證","topic_delete":"刪除聊天","permissions_user":"用戶權限","password_reset_email_sent":"已發送一封帶有安全代碼的電子郵件。","label_unarchive_topic":"存檔聊天:","menu_item_reply":"回答","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索聯繫人","label_new_password":"新密碼","drafty_unknown":"不支持","calls_incoming":"來電","calls_outgoing":"撥出電話","calls_you_label":"你","menu_item_video_call":"視頻電話","already_in_call":"你已經在說話了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒","call_disconnected":"斷開連接","label_use_secure_connection":"使用安全連接","cred_confirmed_successfully":"確認成功","menu_item_edit":"編輯","editing_message":"編輯","message_edited_marker":",編輯","icon_title_add_image":"添加圖片","icon_title_attach_file":"附加文件","icon_title_delete":"刪除錄音","icon_title_pause":"暫停播放","icon_title_play":"播放錄音","icon_title_record_voice":"錄製語音消息","icon_title_resume":"恢復播放","icon_title_send":"發信息","drag_file":"將文件拖到這裡","drafty_video":"視頻錄製","call_in_progress":"通話中","menu_item_audio_call":"稱呼","unrecognized_video_format":"無法識別此視頻的格式","loading_note":"加載中...","password_i_have_code":"我有代碼","label_reset_password_tel":"發送短信重置密碼","mobile_phone_number":"手機號碼","password_reset_sms_sent":"已發送帶有安全代碼的短信。","mobile_number_required":"需要手機號","current_email":"當前郵箱","current_phone":"當前電話號碼","new_email":"新電子郵件地址","new_phone_number":"新電話號碼","change_email":"更改郵箱","change_phone":"更改電話號碼","call_busy":"忙碌的","failed_to_init_audio":"初始化錄音失敗","calls_conference":"電話會議","password_reset_success":"密碼重置成功"}')}}]); \ No newline at end of file diff --git a/umd/514.prod.js b/umd/514.prod.js index 112c145b..e1266936 100644 --- a/umd/514.prod.js +++ b/umd/514.prod.js @@ -1 +1 @@ -"use strict";(globalThis.webpackChunktinode_webapp=globalThis.webpackChunktinode_webapp||[]).push([[514],{4514:e=>{e.exports=JSON.parse('{"action_block_contact":"Block Contact","action_cancel":"cancel","action_clear_messages":"Clear Messages","action_delete_messages":"Clear Messages for All","action_leave_chat":"Leave Conversation","action_report_chat":"Report Conversation","archived_contacts":"Archived contacts ({count})","badge_danger":"Untrustworthy","badge_owner":"owner","badge_staff":"Staff-managed","badge_verified":"Verified/official","badge_you":"you","block_contact_warning":"Are you sure you want to block this contact?","blocked_contacts_link":"Blocked contacts ({count})","button_add_members":"Add members","button_cancel":"Cancel","button_confirm":"Confirm","button_create":"Create","button_delete_account":"Delete account","button_edit":"Edit","button_logout":"Logout","button_ok":"OK","button_reset":"Reset","button_send_request":"Send request","button_sign_in":"Sign in","button_sign_up":"Sign up","button_subscribe":"Subscribe","button_update":"Update","cannot_initiate_file_upload":"Cannot initiate file upload.","channel":"channel","channel_prompt":"This is a channel","chat_invitation":"You are invited to start a new chat. What would you like to do?","chat_invitation_accept":"Accept","chat_invitation_block":"Block","chat_invitation_ignore":"Ignore","clear_messages_warning":"Are you sure you want to clear all messages? It cannot be undone.","code_doesnot_match":"Code does not match","contacts_not_found":"You have no chats
¯∖_(ツ)_/¯","contacts_not_found_short":"No contacts match \'\'{query}\'\'","credential_email_prompt":"Your registration email","delete_account":"Delete account","delete_account_warning":"Are you sure you want to delete your account? It cannot be undone.","delete_messages_warning":"Are you sure you want to delete all messages for everyone? It cannot be undone.","download_action":"download","drafty_attachment":"Attachment","drafty_form":"Form:","drafty_image":"Picture","email_dative":"email","email_prompt":"Email, e.g. jdoe@example.com","enable_peers_messaging":"Enable","enter_confirmation_code_prompt":"Confirmation code","error_invalid_id":"Invalid ID","file_attachment_too_large":"The file size {size} exceeds the {limit} limit.","forgot_password_link":"Forgot password?","full_name_prompt":"Full name, e.g. John Doe","granted_permissions":"Granted","group_has_no_members":"No members","group_user_id_prompt":"Group or User ID","image_caption_prompt":"Image caption","invalid_content":"invalid content","invalid_security_token":"Invalid security token","label_client":"Client:","label_content_type":"Content type:","label_default_access_mode":"Default access mode:","label_file_name":"File name:","label_group_members":"Group members:","label_incognito_mode":"Incognito mode:","label_message_sound":"Message sound:","label_muting_topic":"Muted:","label_other_user":"Other","label_password":"Password","label_permissions":"Permissions:","label_private":"Private comment","label_push_notifications":"Notification alerts:","label_push_notifications_disabled":"Notification alerts (requires HTTPS):","label_reset_password":"Send a password reset email:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server address:","label_server_to_use":"Server to use:","label_size":"Size:","label_topic_name":"Name","label_user_contacts":"Contacts","label_user_id":"ID:","label_wire_transport":"Wire transport:","label_you":"You:","label_your_name":"Your name","label_your_permissions":"Your permissions:","last_seen_timestamp":"Last seen","leave_chat_warning":"Are you sure you want to leave this conversation?","link_contact_us":"Contact Us","link_privacy_policy":"Privacy Policy","link_terms_of_service":"Terms of Service","login_prompt":"Login","menu_item_archive_topic":"Archive","menu_item_block":"Block","menu_item_clear_messages":"Clear messages","menu_item_clear_messages_for_all":"Clear for All","menu_item_delete":"Delete","menu_item_delete_for_all":"Delete for All","menu_item_delete_topic":"Delete","menu_item_edit_permissions":"Edit permissions","menu_item_info":"Info","menu_item_member_delete":"Remove","menu_item_mute":"Mute","menu_item_reply":"Reply","menu_item_restore_topic":"Restore","menu_item_send_retry":"Retry","menu_item_unblock":"Unblock","menu_item_unmute":"Unmute","message_sending":"sending...","message_sending_failed":"failed","messages_not_readable":"no access to messages","messaging_disabled_prompt":"Messaging disabled","more_online_members":"+{overflow} more","new_message_prompt":"New message","new_password_placeholder":"Enter new password","no_connection":"No connection","no_contacts":"You have no contacts :-(","numeric_confirmation_code_prompt":"Numbers only","online_now":"online now","password_prompt":"Password","password_unchanged_prompt":"Unchanged","peers_messaging_disabled":"Peer\'s messaging is disabled.","permission_admin":"Approve ({val})","permission_delete":"Delete ({val})","permission_join":"Join ({val})","permission_owner":"Owner ({val})","permission_pres":"Get notified ({val})","permission_read":"Read ({val})","permission_share":"Share ({val})","permission_write":"Write ({val})","phone_dative":"phone","private_editing_placeholder":"Visible to you only","push_init_failed":"Failed to initialize push notifications","reconnect_countdown":"Disconnected. Reconnecting in {seconds}…","reconnect_now":"Try now","reload_update":"Reload","report_chat_warning":"Are you sure you want to block and report this conversation?","requested_permissions":"Requested","save_attachment":"save","search_for_contacts":"Use search to find contacts","search_no_results":"Search returned no results","search_placeholder":"List like email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_account_settings":"Account Settings","sidepanel_title_archive":"Archived Chats","sidepanel_title_blocked":"Blocked Chats","sidepanel_title_cred":"Confirm Credentials","sidepanel_title_login":"Sign In","sidepanel_title_newtpk":"Start New Chat","sidepanel_title_register":"Create Account","sidepanel_title_reset":"Reset Password","sidepanel_title_settings":"Settings","stay_logged_in":"Stay logged in","tabtitle_find_user":"find","tabtitle_group_by_id":"by id","tabtitle_new_group":"new group","tags_editor_no_tags":"Add some tags","tags_not_found":"No tags defined. Add some.","title_all_contacts":"All Contacts","title_group_members":"Group Members","title_manage_tags":"Manage","title_not_found":"Not found","title_permissions":"Permissions","title_tag_manager":"Tags (search & discovery)","topic_block_warning":"Are you sure you want to block this conversation?","topic_delete_warning":"Are you sure you want to delete this conversation?","topic_name_editing_placeholder":"Freeform name of the group","unnamed_topic":"Unnamed","update_available":"Update available.","upload_finishing":"finishing...","user_not_found":"Not found","description_editing_placeholder":"Optional description","label_description":"Description","button_security":"Security","panel_title_crop":"Drag to Adjust","panel_title_general":"General","panel_title_members":"Members","panel_title_security":"Security","panel_title_info":"Info","permissions_anonymous":"Anonymous","permissions_authenticated":"Authenticated","topic_delete":"Delete Conversation","permissions_user":"User\'s Permissions","password_reset_email_sent":"An email with security code has been sent.","label_unarchive_topic":"Archived:","menu_item_forward":"Forward","forward_to":"Forward to","forward_to_search_placeholder":"Search contacts","label_new_password":"New password","drafty_unknown":"Unsupported","calls_incoming":"Incoming call","calls_outgoing":"Outgoing call","calls_you_label":"You","menu_item_video_call":"Video call","already_in_call":"You already in an ongoing call!","call_cancelled":"cancelled","call_missed":"missed","call_declined":"declined","call_disconnected":"disconnected","label_use_secure_connection":"Use secure connection","cred_confirmed_successfully":"Confirmed successfully","menu_item_edit":"Edit","editing_message":"Editing","message_edited_marker":", edited","icon_title_add_image":"Add image","icon_title_attach_file":"Attach file","icon_title_delete":"Delete","icon_title_pause":"Pause","icon_title_play":"Play","icon_title_record_voice":"Record voice message","icon_title_resume":"Resume","icon_title_send":"Send message","drag_file":"Drag file here","drafty_video":"Video recording","call_in_progress":"in progress","menu_item_audio_call":"Call","unrecognized_video_format":"Format of this video is not recognized","loading_note":"Loading...","password_i_have_code":"I have code","label_reset_password_tel":"Send a password reset SMS:","mobile_phone_number":"Mobile phone number","password_reset_sms_sent":"A text message with security code has been sent.","mobile_number_required":"Mobile phone number required","current_email":"Current email","current_phone":"Current phone number","new_email":"New email","new_phone_number":"New phone number","change_email":"Change email","change_phone":"Change phone number","call_busy":"busy","failed_to_init_audio":"Failed to initialize audio recording","pin_message":"Pin","unpin_message":"Unpin","calls_conference":"Conference call","password_reset_success":"Password reset successfully"}')}}]); \ No newline at end of file +"use strict";(globalThis.webpackChunktinode_webapp=globalThis.webpackChunktinode_webapp||[]).push([[514],{4514:e=>{e.exports=JSON.parse('{"action_block_contact":"Block Contact","action_cancel":"cancel","action_clear_messages":"Clear Messages","action_delete_messages":"Clear Messages for All","action_leave_chat":"Leave Conversation","action_report_chat":"Report Conversation","archived_contacts":"Archived contacts ({count})","badge_danger":"Untrustworthy","badge_owner":"owner","badge_staff":"Staff-managed","badge_verified":"Verified/official","badge_you":"you","block_contact_warning":"Are you sure you want to block this contact?","blocked_contacts_link":"Blocked contacts ({count})","button_add_members":"Add members","button_cancel":"Cancel","button_confirm":"Confirm","button_create":"Create","button_delete_account":"Delete account","button_edit":"Edit","button_logout":"Logout","button_ok":"OK","button_reset":"Reset","button_send_request":"Send request","button_sign_in":"Sign in","button_sign_up":"Sign up","button_subscribe":"Subscribe","button_update":"Update","cannot_initiate_file_upload":"Cannot initiate file upload.","channel":"channel","channel_prompt":"This is a channel","chat_invitation":"You are invited to start a new chat. What would you like to do?","chat_invitation_accept":"Accept","chat_invitation_block":"Block","chat_invitation_ignore":"Ignore","clear_messages_warning":"Are you sure you want to clear all messages? It cannot be undone.","code_doesnot_match":"Code does not match","contacts_not_found":"You have no chats
¯∖_(ツ)_/¯","contacts_not_found_short":"No contacts match \'\'{query}\'\'","credential_email_prompt":"Your registration email","delete_account":"Delete account","delete_account_warning":"Are you sure you want to delete your account? It cannot be undone.","delete_messages_warning":"Are you sure you want to delete all messages for everyone? It cannot be undone.","download_action":"download","drafty_attachment":"Attachment","drafty_form":"Form:","drafty_image":"Picture","email_dative":"email","email_prompt":"Email, e.g. jdoe@example.com","enable_peers_messaging":"Enable","enter_confirmation_code_prompt":"Confirmation code","error_invalid_id":"Invalid ID","file_attachment_too_large":"The file size {size} exceeds the {limit} limit.","forgot_password_link":"Forgot password?","full_name_prompt":"Full name, e.g. John Doe","granted_permissions":"Granted","group_has_no_members":"No members","group_user_id_prompt":"Group or User ID","image_caption_prompt":"Image caption","invalid_content":"invalid content","invalid_security_token":"Invalid security token","label_client":"Client:","label_content_type":"Content type:","label_default_access_mode":"Default access mode:","label_file_name":"File name:","label_group_members":"Group members:","label_incognito_mode":"Incognito mode:","label_message_sound":"Message sound:","label_muting_topic":"Muted:","label_other_user":"Other","label_password":"Password","label_permissions":"Permissions:","label_private":"Private comment","label_push_notifications":"Notification alerts:","label_push_notifications_disabled":"Notification alerts (requires HTTPS):","label_reset_password":"Send a password reset email:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server address:","label_server_to_use":"Server to use:","label_size":"Size:","label_topic_name":"Name","label_user_contacts":"Contacts","label_user_id":"ID:","label_wire_transport":"Wire transport:","label_you":"You:","label_your_name":"Your name","label_your_permissions":"Your permissions:","last_seen_timestamp":"Last seen","leave_chat_warning":"Are you sure you want to leave this conversation?","link_contact_us":"Contact Us","link_privacy_policy":"Privacy Policy","link_terms_of_service":"Terms of Service","login_prompt":"Login","menu_item_archive_topic":"Archive","menu_item_block":"Block","menu_item_clear_messages":"Clear messages","menu_item_clear_messages_for_all":"Clear for All","menu_item_delete":"Delete","menu_item_delete_for_all":"Delete for All","menu_item_delete_topic":"Delete","menu_item_edit_permissions":"Edit permissions","menu_item_info":"Info","menu_item_member_delete":"Remove","menu_item_mute":"Mute","menu_item_reply":"Reply","menu_item_restore_topic":"Restore","menu_item_send_retry":"Retry","menu_item_unblock":"Unblock","menu_item_unmute":"Unmute","message_sending":"sending...","message_sending_failed":"failed","messages_not_readable":"no access to messages","messaging_disabled_prompt":"Messaging disabled","more_online_members":"+{overflow} more","new_message_prompt":"New message","new_password_placeholder":"Enter new password","no_connection":"No connection","no_contacts":"You have no contacts :-(","numeric_confirmation_code_prompt":"Numbers only","online_now":"online now","password_prompt":"Password","password_unchanged_prompt":"Unchanged","peers_messaging_disabled":"Peer\'s messaging is disabled.","permission_admin":"Approve ({val})","permission_delete":"Delete ({val})","permission_join":"Join ({val})","permission_owner":"Owner ({val})","permission_pres":"Get notified ({val})","permission_read":"Read ({val})","permission_share":"Share ({val})","permission_write":"Write ({val})","phone_dative":"phone","private_editing_placeholder":"Visible to you only","push_init_failed":"Failed to initialize push notifications","reconnect_countdown":"Disconnected. Reconnecting in {seconds}…","reconnect_now":"Try now","reload_update":"Reload","report_chat_warning":"Are you sure you want to block and report this conversation?","requested_permissions":"Requested","save_attachment":"save","search_for_contacts":"Use search to find contacts","search_no_results":"Search returned no results","search_placeholder":"List like email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notifications","sidepanel_title_acc_support":"Support","sidepanel_title_account_settings":"Account Settings","sidepanel_title_archive":"Archived Chats","sidepanel_title_blocked":"Blocked Chats","sidepanel_title_cred":"Confirm Credentials","sidepanel_title_login":"Sign In","sidepanel_title_newtpk":"Start New Chat","sidepanel_title_register":"Create Account","sidepanel_title_reset":"Reset Password","sidepanel_title_settings":"Settings","stay_logged_in":"Stay logged in","tabtitle_find_user":"find","tabtitle_group_by_id":"by id","tabtitle_new_group":"new group","tags_editor_no_tags":"Add some tags","tags_not_found":"No tags defined. Add some.","title_all_contacts":"All Contacts","title_group_members":"Group Members","title_manage_tags":"Manage","title_not_found":"Not found","title_permissions":"Permissions","title_tag_manager":"Tags (search & discovery)","topic_block_warning":"Are you sure you want to block this conversation?","topic_delete_warning":"Are you sure you want to delete this conversation?","topic_name_editing_placeholder":"Freeform name of the group","unnamed_topic":"Unnamed","update_available":"Update available.","upload_finishing":"finishing...","user_not_found":"Not found","description_editing_placeholder":"Optional description","label_description":"Description","button_security":"Security","panel_title_crop":"Drag to Adjust","panel_title_general":"General","panel_title_members":"Members","panel_title_security":"Security","panel_title_info":"Info","permissions_anonymous":"Anonymous","permissions_authenticated":"Authenticated","topic_delete":"Delete Conversation","permissions_user":"User\'s Permissions","password_reset_email_sent":"An email with security code has been sent.","label_unarchive_topic":"Archived:","menu_item_forward":"Forward","forward_to":"Forward to","forward_to_search_placeholder":"Search contacts","label_new_password":"New password","drafty_unknown":"Unsupported","calls_incoming":"Incoming call","calls_outgoing":"Outgoing call","calls_you_label":"You","menu_item_video_call":"Video call","already_in_call":"You already in an ongoing call!","call_cancelled":"cancelled","call_missed":"missed","call_declined":"declined","call_disconnected":"disconnected","label_use_secure_connection":"Use secure connection","cred_confirmed_successfully":"Confirmed successfully","menu_item_edit":"Edit","editing_message":"Editing","message_edited_marker":", edited","icon_title_add_image":"Add image","icon_title_attach_file":"Attach file","icon_title_delete":"Delete","icon_title_pause":"Pause","icon_title_play":"Play","icon_title_record_voice":"Record voice message","icon_title_resume":"Resume","icon_title_send":"Send message","drag_file":"Drag file here","drafty_video":"Video recording","call_in_progress":"in progress","menu_item_audio_call":"Call","unrecognized_video_format":"Format of this video is not recognized","loading_note":"Loading...","password_i_have_code":"I have code","label_reset_password_tel":"Send a password reset SMS:","mobile_phone_number":"Mobile phone number","password_reset_sms_sent":"A text message with security code has been sent.","mobile_number_required":"Mobile phone number required","current_email":"Current email","current_phone":"Current phone number","new_email":"New email","new_phone_number":"New phone number","change_email":"Change email","change_phone":"Change phone number","call_busy":"busy","failed_to_init_audio":"Failed to initialize audio recording","pin_message":"Pin","unpin_message":"Unpin","calls_conference":"Conference call","password_reset_success":"Password reset successfully","join_conference":"+ Join"}')}}]); \ No newline at end of file diff --git a/umd/700.prod.js b/umd/700.prod.js index b2e96349..9fb7e044 100644 --- a/umd/700.prod.js +++ b/umd/700.prod.js @@ -1 +1 @@ -"use strict";(globalThis.webpackChunktinode_webapp=globalThis.webpackChunktinode_webapp||[]).push([[700],{5700:e=>{e.exports=JSON.parse('{"action_block_contact":"屏蔽联系人","action_cancel":"取消","action_clear_messages":"删除讯息","action_delete_messages":"删除所有帖子","action_leave_chat":"离开","action_report_chat":"检举垃圾邮件","archived_contacts":"已归档联系人 ({count})","badge_danger":"可疑的","badge_owner":"所有者","badge_staff":"在员工管理下","badge_verified":"值得信赖","badge_you":"你","block_contact_warning":"您确定要阻止此联系人吗?","blocked_contacts_link":"封锁的联络人 ({count})","button_add_members":"添加成员","button_cancel":"取消","button_confirm":"确认","button_create":"创建","button_delete_account":"删除帐户","button_edit":"编辑","button_logout":"登出","button_ok":"好","button_reset":"重置","button_send_request":"发送请求","button_sign_in":"登录","button_sign_up":"注册","button_subscribe":"订阅","button_update":"更新","cannot_initiate_file_upload":"无法初始化文件上传。","channel":"频道","channel_prompt":"这是一个频道","chat_invitation":"你受邀开始新会话。你想怎么做?","chat_invitation_accept":"接受","chat_invitation_block":"屏蔽","chat_invitation_ignore":"忽略","clear_messages_warning":"您确定要清除所有消息吗?无法撤消。","code_doesnot_match":"代码不匹配","contacts_not_found":"你尚无会话
¯∖_(ツ)_/¯","contacts_not_found_short":"无联系人匹配\'\'{query}\'\'","credential_email_prompt":"你的注册邮箱","delete_account":"删除帐户","delete_account_warning":"您确定要删除您的帐户吗?无法撤消。","delete_messages_warning":"您确定要删除所有消息吗?无法撤消。","download_action":"下载","drafty_attachment":"附件","drafty_form":"形式:","drafty_image":"图像","email_dative":"电子邮件","email_prompt":"电子邮件,例如 zhang@example.com","enable_peers_messaging":"启用","enter_confirmation_code_prompt":"输入通过{method}发送的验证码:","error_invalid_id":"无效 ID","file_attachment_too_large":"文件大小 {size} 超过 {limit} 限制。","forgot_password_link":"忘记密码?","full_name_prompt":"全名,例如张伟","granted_permissions":"已授予","group_has_no_members":"无成员","group_user_id_prompt":"群组或用户 ID","image_caption_prompt":"图片标题","invalid_content":"无效内容","invalid_security_token":"无效的安全令牌","label_client":"客户端:","label_content_type":"内容类型:","label_default_access_mode":"默认访问模式:","label_file_name":"文件名:","label_group_members":"群组成员:","label_incognito_mode":"无痕模式:","label_message_sound":"消息提示音:","label_muting_topic":"已静音:","label_other_user":"其他","label_password":"密码","label_permissions":"权限:","label_private":"私人评论","label_push_notifications":"通知提醒:","label_push_notifications_disabled":"通知提醒(需要 HTTPS):","label_reset_password":"发送密码重置邮件:","label_sdk":"开发包:","label_server":"服务器:","label_server_address":"服务器地址:","label_server_to_use":"使用的服务器:","label_size":"大小:","label_topic_name":"名称","label_user_contacts":"往来","label_user_id":"地址:","label_wire_transport":"线路传输:","label_you":"你:","label_your_name":"你的姓名","label_your_permissions":"你的权限:","last_seen_timestamp":"最后可见","leave_chat_warning":"您确定要退出此对话吗?","link_contact_us":"联系我们","link_privacy_policy":"隐私政策","link_terms_of_service":"条款和条件","login_prompt":"登录","menu_item_archive_topic":"归档","menu_item_block":"屏蔽","menu_item_clear_messages":"清空消息","menu_item_clear_messages_for_all":"全部清除","menu_item_delete":"删除","menu_item_delete_for_all":"全部删除","menu_item_delete_topic":"删除","menu_item_edit_permissions":"编辑权限","menu_item_info":"信息","menu_item_member_delete":"移除","menu_item_mute":"静音","menu_item_restore_topic":"从存档中恢复","menu_item_send_retry":"重试","menu_item_unblock":"取消屏蔽","menu_item_unmute":"取消静音","message_sending":"正在发送...","message_sending_failed":"发送失败","messages_not_readable":"无消息访问权限","messaging_disabled_prompt":"消息已禁用","more_online_members":"还有{overflow}个","new_message_prompt":"新消息","new_password_placeholder":"输入新密码","no_connection":"无连接","no_contacts":"你尚无联系人 (._.)","numeric_confirmation_code_prompt":"仅数字","online_now":"在线","password_prompt":"密码","password_unchanged_prompt":"未改变","peers_messaging_disabled":"成员间消息已禁用。","permission_admin":"批准 ({val})","permission_delete":"删除 ({val})","permission_join":"加入 ({val})","permission_owner":"所有者 ({val})","permission_pres":"获取通知 ({val})","permission_read":"读取 ({val})","permission_share":"分享 ({val})","permission_write":"写入 ({val})","phone_dative":"电话","private_editing_placeholder":"仅自己可见","push_init_failed":"初始化推送通知失败","reconnect_countdown":"连接已断开。{seconds} 秒后重新连接…","reconnect_now":"立即尝试","reload_update":"重新载入","report_chat_warning":"您确定要停止并报告此对话吗?","requested_permissions":"已请求","save_attachment":"保存","search_for_contacts":"使用搜索寻找联系人","search_no_results":"搜索返回任何结果","search_placeholder":"列表如 email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支持","sidepanel_title_account_settings":"帐号设定","sidepanel_title_archive":"已存档会话","sidepanel_title_blocked":"被阻止的聊天","sidepanel_title_cred":"确认凭据","sidepanel_title_login":"登录","sidepanel_title_newtpk":"开始新会话","sidepanel_title_register":"创建账户","sidepanel_title_reset":"重置密码","sidepanel_title_settings":"设置","stay_logged_in":"保持登录","tabtitle_find_user":"搜索","tabtitle_group_by_id":"通过 id","tabtitle_new_group":"新群组","tags_editor_no_tags":"添加一些标签","tags_not_found":"尚未定义标签。添加一些。","title_all_contacts":"全部联系人","title_group_members":"群组成员","title_manage_tags":"管理标签","title_not_found":"无法找到","title_permissions":"权限","title_tag_manager":"标签(用户发现)","topic_block_warning":"您确定要阻止此对话吗?","topic_delete_warning":"您确定要删除此对话吗?","topic_name_editing_placeholder":"群组自由格式名称","unnamed_topic":"未命名","update_available":"更新可用。","upload_finishing":"正在结束...","user_not_found":"未找到","description_editing_placeholder":"说明(可选)","label_description":"说明","button_security":"安全","panel_title_crop":"拖动调整","panel_title_general":"常用设定","panel_title_members":"成员","panel_title_security":"安全","panel_title_info":"信息","permissions_anonymous":"匿名","permissions_authenticated":"已认证","topic_delete":"删除聊天","permissions_user":"用户权限","password_reset_email_sent":"已发送一封带有安全代码的电子邮件。","label_unarchive_topic":"存档:","menu_item_reply":"回复","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索联系人","label_new_password":"新密码","drafty_unknown":"不支持","calls_incoming":"来电","calls_outgoing":"拨出电话","calls_you_label":"你","menu_item_video_call":"视频电话","already_in_call":"你已经在说话了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒","call_disconnected":"断开连接","label_use_secure_connection":"使用安全连接","cred_confirmed_successfully":"确认成功","menu_item_edit":"编辑","editing_message":"编辑","message_edited_marker":",编辑","icon_title_add_image":"添加图片","icon_title_attach_file":"附加文件","icon_title_delete":"删除录音","icon_title_pause":"暂停播放","icon_title_play":"播放录音","icon_title_record_voice":"录制语音信息","icon_title_resume":"恢复播放","icon_title_send":"发信息","drag_file":"将文件拖到这里","drafty_video":"视频录制","call_in_progress":"通话中","menu_item_audio_call":"称呼","unrecognized_video_format":"无法识别此视频的格式","loading_note":"加载中...","password_i_have_code":"我有代码","label_reset_password_tel":"发送短信重置密码","mobile_phone_number":"手机号","password_reset_sms_sent":"已发送带有安全代码的短信。","mobile_number_required":"需要手机号","current_email":"当前邮箱","current_phone":"当前电话号码","new_email":"新电子邮件地址","new_phone_number":"新电话号码","change_email":"更改邮箱","change_phone":"更改电话号码","call_busy":"忙碌的","failed_to_init_audio":"初始化录音失败","password_reset_success":"密码重置成功"}')}}]); \ No newline at end of file +"use strict";(globalThis.webpackChunktinode_webapp=globalThis.webpackChunktinode_webapp||[]).push([[700],{5700:e=>{e.exports=JSON.parse('{"action_block_contact":"屏蔽联系人","action_cancel":"取消","action_clear_messages":"删除讯息","action_delete_messages":"删除所有帖子","action_leave_chat":"离开","action_report_chat":"检举垃圾邮件","archived_contacts":"已归档联系人 ({count})","badge_danger":"可疑的","badge_owner":"所有者","badge_staff":"在员工管理下","badge_verified":"值得信赖","badge_you":"你","block_contact_warning":"您确定要阻止此联系人吗?","blocked_contacts_link":"封锁的联络人 ({count})","button_add_members":"添加成员","button_cancel":"取消","button_confirm":"确认","button_create":"创建","button_delete_account":"删除帐户","button_edit":"编辑","button_logout":"登出","button_ok":"好","button_reset":"重置","button_send_request":"发送请求","button_sign_in":"登录","button_sign_up":"注册","button_subscribe":"订阅","button_update":"更新","cannot_initiate_file_upload":"无法初始化文件上传。","channel":"频道","channel_prompt":"这是一个频道","chat_invitation":"你受邀开始新会话。你想怎么做?","chat_invitation_accept":"接受","chat_invitation_block":"屏蔽","chat_invitation_ignore":"忽略","clear_messages_warning":"您确定要清除所有消息吗?无法撤消。","code_doesnot_match":"代码不匹配","contacts_not_found":"你尚无会话
¯∖_(ツ)_/¯","contacts_not_found_short":"无联系人匹配\'\'{query}\'\'","credential_email_prompt":"你的注册邮箱","delete_account":"删除帐户","delete_account_warning":"您确定要删除您的帐户吗?无法撤消。","delete_messages_warning":"您确定要删除所有消息吗?无法撤消。","download_action":"下载","drafty_attachment":"附件","drafty_form":"形式:","drafty_image":"图像","email_dative":"电子邮件","email_prompt":"电子邮件,例如 zhang@example.com","enable_peers_messaging":"启用","enter_confirmation_code_prompt":"输入通过{method}发送的验证码:","error_invalid_id":"无效 ID","file_attachment_too_large":"文件大小 {size} 超过 {limit} 限制。","forgot_password_link":"忘记密码?","full_name_prompt":"全名,例如张伟","granted_permissions":"已授予","group_has_no_members":"无成员","group_user_id_prompt":"群组或用户 ID","image_caption_prompt":"图片标题","invalid_content":"无效内容","invalid_security_token":"无效的安全令牌","label_client":"客户端:","label_content_type":"内容类型:","label_default_access_mode":"默认访问模式:","label_file_name":"文件名:","label_group_members":"群组成员:","label_incognito_mode":"无痕模式:","label_message_sound":"消息提示音:","label_muting_topic":"已静音:","label_other_user":"其他","label_password":"密码","label_permissions":"权限:","label_private":"私人评论","label_push_notifications":"通知提醒:","label_push_notifications_disabled":"通知提醒(需要 HTTPS):","label_reset_password":"发送密码重置邮件:","label_sdk":"开发包:","label_server":"服务器:","label_server_address":"服务器地址:","label_server_to_use":"使用的服务器:","label_size":"大小:","label_topic_name":"名称","label_user_contacts":"往来","label_user_id":"地址:","label_wire_transport":"线路传输:","label_you":"你:","label_your_name":"你的姓名","label_your_permissions":"你的权限:","last_seen_timestamp":"最后可见","leave_chat_warning":"您确定要退出此对话吗?","link_contact_us":"联系我们","link_privacy_policy":"隐私政策","link_terms_of_service":"条款和条件","login_prompt":"登录","menu_item_archive_topic":"归档","menu_item_block":"屏蔽","menu_item_clear_messages":"清空消息","menu_item_clear_messages_for_all":"全部清除","menu_item_delete":"删除","menu_item_delete_for_all":"全部删除","menu_item_delete_topic":"删除","menu_item_edit_permissions":"编辑权限","menu_item_info":"信息","menu_item_member_delete":"移除","menu_item_mute":"静音","menu_item_restore_topic":"从存档中恢复","menu_item_send_retry":"重试","menu_item_unblock":"取消屏蔽","menu_item_unmute":"取消静音","message_sending":"正在发送...","message_sending_failed":"发送失败","messages_not_readable":"无消息访问权限","messaging_disabled_prompt":"消息已禁用","more_online_members":"还有{overflow}个","new_message_prompt":"新消息","new_password_placeholder":"输入新密码","no_connection":"无连接","no_contacts":"你尚无联系人 (._.)","numeric_confirmation_code_prompt":"仅数字","online_now":"在线","password_prompt":"密码","password_unchanged_prompt":"未改变","peers_messaging_disabled":"成员间消息已禁用。","permission_admin":"批准 ({val})","permission_delete":"删除 ({val})","permission_join":"加入 ({val})","permission_owner":"所有者 ({val})","permission_pres":"获取通知 ({val})","permission_read":"读取 ({val})","permission_share":"分享 ({val})","permission_write":"写入 ({val})","phone_dative":"电话","private_editing_placeholder":"仅自己可见","push_init_failed":"初始化推送通知失败","reconnect_countdown":"连接已断开。{seconds} 秒后重新连接…","reconnect_now":"立即尝试","reload_update":"重新载入","report_chat_warning":"您确定要停止并报告此对话吗?","requested_permissions":"已请求","save_attachment":"保存","search_for_contacts":"使用搜索寻找联系人","search_no_results":"搜索返回任何结果","search_placeholder":"列表如 email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支持","sidepanel_title_account_settings":"帐号设定","sidepanel_title_archive":"已存档会话","sidepanel_title_blocked":"被阻止的聊天","sidepanel_title_cred":"确认凭据","sidepanel_title_login":"登录","sidepanel_title_newtpk":"开始新会话","sidepanel_title_register":"创建账户","sidepanel_title_reset":"重置密码","sidepanel_title_settings":"设置","stay_logged_in":"保持登录","tabtitle_find_user":"搜索","tabtitle_group_by_id":"通过 id","tabtitle_new_group":"新群组","tags_editor_no_tags":"添加一些标签","tags_not_found":"尚未定义标签。添加一些。","title_all_contacts":"全部联系人","title_group_members":"群组成员","title_manage_tags":"管理标签","title_not_found":"无法找到","title_permissions":"权限","title_tag_manager":"标签(用户发现)","topic_block_warning":"您确定要阻止此对话吗?","topic_delete_warning":"您确定要删除此对话吗?","topic_name_editing_placeholder":"群组自由格式名称","unnamed_topic":"未命名","update_available":"更新可用。","upload_finishing":"正在结束...","user_not_found":"未找到","description_editing_placeholder":"说明(可选)","label_description":"说明","button_security":"安全","panel_title_crop":"拖动调整","panel_title_general":"常用设定","panel_title_members":"成员","panel_title_security":"安全","panel_title_info":"信息","permissions_anonymous":"匿名","permissions_authenticated":"已认证","topic_delete":"删除聊天","permissions_user":"用户权限","password_reset_email_sent":"已发送一封带有安全代码的电子邮件。","label_unarchive_topic":"存档:","menu_item_reply":"回复","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索联系人","label_new_password":"新密码","drafty_unknown":"不支持","calls_incoming":"来电","calls_outgoing":"拨出电话","calls_you_label":"你","menu_item_video_call":"视频电话","already_in_call":"你已经在说话了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒","call_disconnected":"断开连接","label_use_secure_connection":"使用安全连接","cred_confirmed_successfully":"确认成功","menu_item_edit":"编辑","editing_message":"编辑","message_edited_marker":",编辑","icon_title_add_image":"添加图片","icon_title_attach_file":"附加文件","icon_title_delete":"删除录音","icon_title_pause":"暂停播放","icon_title_play":"播放录音","icon_title_record_voice":"录制语音信息","icon_title_resume":"恢复播放","icon_title_send":"发信息","drag_file":"将文件拖到这里","drafty_video":"视频录制","call_in_progress":"通话中","menu_item_audio_call":"称呼","unrecognized_video_format":"无法识别此视频的格式","loading_note":"加载中...","password_i_have_code":"我有代码","label_reset_password_tel":"发送短信重置密码","mobile_phone_number":"手机号","password_reset_sms_sent":"已发送带有安全代码的短信。","mobile_number_required":"需要手机号","current_email":"当前邮箱","current_phone":"当前电话号码","new_email":"新电子邮件地址","new_phone_number":"新电话号码","change_email":"更改邮箱","change_phone":"更改电话号码","call_busy":"忙碌的","failed_to_init_audio":"初始化录音失败","calls_conference":"电话会议","password_reset_success":"密码重置成功"}')}}]); \ No newline at end of file diff --git a/umd/734.prod.js b/umd/734.prod.js index 65c4b6d2..6456a1d7 100644 --- a/umd/734.prod.js +++ b/umd/734.prod.js @@ -1 +1 @@ -"use strict";(globalThis.webpackChunktinode_webapp=globalThis.webpackChunktinode_webapp||[]).push([[734],{3734:e=>{e.exports=JSON.parse('{"action_block_contact":"Заблокировать контакт","action_cancel":"отменить","action_clear_messages":"Удалить сообщения","action_delete_messages":"Удалить сообщения","action_leave_chat":"Уйти из чата","action_report_chat":"Сообщить о нарушении","archived_contacts":"Чаты в архиве ({count})","badge_danger":"Подозрительный","badge_owner":"влад.","badge_staff":"Администрация","badge_verified":"Верифицированный","badge_you":"вы","block_contact_warning":"Вы действительно заблокировать этот контакт?","blocked_contacts_link":"Заблокированные ({count})","button_add_members":"Добавить","button_cancel":"Отменить","button_confirm":"Подтвердить","button_create":"Создать","button_delete_account":"Удалить аккаунт","button_edit":"Изменить","button_logout":"Выйти","button_ok":"OK","button_reset":"Изменить","button_send_request":"Отправить","button_sign_in":"Войти","button_sign_up":"Создать аккаунт","button_subscribe":"Подписаться","button_update":"Применить","cannot_initiate_file_upload":"Ошибка загрузки файла.","channel":"канал","channel_prompt":"Создать канал","chat_invitation":"Вас пригласили начать новый чат. Как вы хотите поступить?","chat_invitation_accept":"Принять","chat_invitation_block":"Заблокировать","chat_invitation_ignore":"Игнорировать","clear_messages_warning":"Вы действительно хотите удалить все сообщения в чате? Их будет невозможно восстановить.","code_doesnot_match":"Код не совпадает","contacts_not_found":"Чатов нет
¯∖_(ツ)_/¯","contacts_not_found_short":"Нет контактов для запроса \'\'{query}\'\'","credential_email_prompt":"Регистрационный емейл","delete_account":"Удалить аккаунт","delete_account_warning":"Вы уверены, что ходите удалить свой аккаунт? Его невозможно будет восстановить.","delete_messages_warning":"Вы действительно хотите удалить все сообщения?","download_action":"скачать","drafty_attachment":"Аттачмент","drafty_form":"Форма:","drafty_image":"Картинка","email_dative":"емейлу","email_prompt":"Email, напр. ivan@example.com","enable_peers_messaging":"Разблокировать.","enter_confirmation_code_prompt":"Код подтверждения, полученный по {method}:","error_invalid_id":"Неверный ID","file_attachment_too_large":"Размер файла {size} превышает {limit} лимит.","forgot_password_link":"Напомнить пароль","full_name_prompt":"Полное имя, напр. Иван Петров","granted_permissions":"Получены","group_has_no_members":"Нет участников","group_user_id_prompt":"ID чата или пользователя","image_caption_prompt":"Подпись к фото","invalid_content":"сообщение не читается","invalid_security_token":"Токен некорректен","label_client":"Клиент:","label_content_type":"Тип:","label_default_access_mode":"Доступ по умолчанию:","label_file_name":"Имя файла:","label_group_members":"Участники чата:","label_incognito_mode":"Режим инкогнито:","label_message_sound":"Звук нового сообщения:","label_muting_topic":"Без уведомлений","label_other_user":"Второй","label_password":"Пароль","label_permissions":"Права доступа:","label_private":"Комментарий","label_push_notifications":"Уведомления:","label_push_notifications_disabled":"Уведомления (требуют HTTPS):","label_reset_password":"Отправить емейл для смены пароля:","label_sdk":"SDK:","label_server":"Сервер:","label_server_address":"Адрес сервера:","label_server_to_use":"Использовать сервер:","label_size":"Размер:","label_topic_name":"Название","label_user_contacts":"Конакты","label_user_id":"ID:","label_wire_transport":"Соединение:","label_you":"Вы:","label_your_name":"Ваше имя","label_your_permissions":"Ваши права доступа:","last_seen_timestamp":"Был активен","leave_chat_warning":"Вы действительно хотите покинуть этот чат?","link_contact_us":"Связаться с нами","link_privacy_policy":"Политика конфиденциальности","link_terms_of_service":"Условия сервиса","login_prompt":"Логин","menu_item_archive_topic":"В архив","menu_item_block":"Заблокировать","menu_item_clear_messages":"Удалить сообщения","menu_item_clear_messages_for_all":"Удалить для всех","menu_item_delete":"Удалить","menu_item_delete_for_all":"Удалить для всех","menu_item_delete_topic":"Удалить чат","menu_item_edit_permissions":"Права доступа","menu_item_info":"Информация","menu_item_member_delete":"Отписать","menu_item_mute":"Не уведомлять","menu_item_restore_topic":"Разархивировать","menu_item_send_retry":"Отправить заново","menu_item_unblock":"Разблокировать","menu_item_unmute":"Уведомлять","message_sending":"в пути...","message_sending_failed":"ошибка","messages_not_readable":"нет доступа к сообщениям","messaging_disabled_prompt":"Отправка недоступна","more_online_members":"+еще {overflow}","new_message_prompt":"Новое сообщение","new_password_placeholder":"Введите новый пароль","no_connection":"Нет связи","no_contacts":"Ничего нет :-(","numeric_confirmation_code_prompt":"Только цифры","online_now":"онлайн","password_prompt":"Пароль","password_unchanged_prompt":"Не изменен","peers_messaging_disabled":"Чат заблокирован у корреспондента.","permission_admin":"Подтверждать ({val})","permission_delete":"Удалять ({val})","permission_join":"Подписываться ({val})","permission_owner":"Владелец ({val})","permission_pres":"Уведомлять ({val})","permission_read":"Читать ({val})","permission_share":"Приглашать ({val})","permission_write":"Писать ({val})","phone_dative":"телефону","private_editing_placeholder":"Виден только вам","push_init_failed":"Ошибка инициализации пуш уведомлений","reconnect_countdown":"Нет связи. Подключение через {seconds}…","reconnect_now":"Подключить сейчас.","reload_update":"Обновить","report_chat_warning":"Вы действительно хотите сообщить о нарушении и заблокировать этот чат?","requested_permissions":"Требуются","save_attachment":"сохранить","search_for_contacts":"Поиск контактов","search_no_results":"Ничего не найдено","search_placeholder":"Список, напр. email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"Уведомления","sidepanel_title_acc_support":"Поддержка","sidepanel_title_account_settings":"Настройки аккаунта","sidepanel_title_archive":"Архив чатов","sidepanel_title_blocked":"Заблокированные чаты","sidepanel_title_cred":"Подтвердить","sidepanel_title_login":"Авторизация","sidepanel_title_newtpk":"Новый чат","sidepanel_title_register":"Зарегистрироваться","sidepanel_title_reset":"Сменить пароль","sidepanel_title_settings":"Настройки","stay_logged_in":"Запомнить","tabtitle_find_user":"найти","tabtitle_group_by_id":"по id","tabtitle_new_group":"создать","tags_editor_no_tags":"Добавьте теги","tags_not_found":"Тегов нет. Добавьте.","title_all_contacts":"Все контакты","title_group_members":"Участники","title_manage_tags":"Редактировать","title_not_found":"Не найден","title_permissions":"Права доступа","title_tag_manager":"Теги для поиска","topic_block_warning":"Вы действительно хотите заблокировать этот чат?","topic_delete_warning":"Вы действительно хотите удалить этот чат?","topic_name_editing_placeholder":"Название чата","unnamed_topic":"Без названия","update_available":"Есть новая версия приложения.","upload_finishing":"завершение...","user_not_found":"Не найден","description_editing_placeholder":"Описание (не обязательно)","label_description":"Описание","button_security":"Безопасность","panel_title_crop":"Обрезать картинку","panel_title_general":"Общие настройки","panel_title_members":"Участники","panel_title_security":"Безопасность","panel_title_info":"Подробности","permissions_anonymous":"Анонимный","permissions_authenticated":"Авторизованный","topic_delete":"Удалить чат","permissions_user":"Права доступа","password_reset_email_sent":"Сообщение было отправлено на указанный email.","label_unarchive_topic":"Архивирован:","menu_item_reply":"Ответить","menu_item_forward":"Переслать","forward_to":"Переслать","forward_to_search_placeholder":"Поиск контактов","label_new_password":"Новый пароль","drafty_unknown":"Не поддерживается","calls_incoming":"Входящий звонок","calls_outgoing":"Исходящий звонок","calls_you_label":"Вы","menu_item_video_call":"Видеозвонок","already_in_call":"Вы уже звоните кому-то!","call_cancelled":"отменен","call_missed":"пропущен","call_declined":"отклонен","call_disconnected":"разъединен","label_use_secure_connection":"Безопасное соединение","cred_confirmed_successfully":"Подтверждено успешно","menu_item_edit":"Изменить","editing_message":"Редактирование","message_edited_marker":", изменено","icon_title_add_image":"Добавить изображение","icon_title_attach_file":"Прикрепить файл","icon_title_delete":"Удалить запись","icon_title_pause":"Пауза воспроизведения","icon_title_play":"Воспроизвести запись","icon_title_record_voice":"Записать голосовое сообщение","icon_title_resume":"Продолжить","icon_title_send":"Отправить сообщение","drag_file":"Перетащите файл сюда","drafty_video":"Видеозапись","call_in_progress":"в процессе","menu_item_audio_call":"Позвонить","unrecognized_video_format":"Неизвестный формат видео файла","loading_note":"Загружается...","password_i_have_code":"У меня есть код","label_reset_password_tel":"Отправить SMS для сброса пароля","mobile_phone_number":"Номер мобильного телефона","password_reset_sms_sent":"SMS с защитным кодом отправлен.","mobile_number_required":"Номер мобильного телефона","current_email":"Текущий e-mail","current_phone":"Текущий номер телефона","new_email":"Новый e-mail","new_phone_number":"Новый номер телефона","change_email":"Изменить e-mail","change_phone":"Изменить номер телефона","call_busy":"занято","failed_to_init_audio":"Не удалось инициализировать аудиозапись","password_reset_success":"Пароль успешно изменен"}')}}]); \ No newline at end of file +"use strict";(globalThis.webpackChunktinode_webapp=globalThis.webpackChunktinode_webapp||[]).push([[734],{3734:e=>{e.exports=JSON.parse('{"action_block_contact":"Заблокировать контакт","action_cancel":"отменить","action_clear_messages":"Удалить сообщения","action_delete_messages":"Удалить сообщения","action_leave_chat":"Уйти из чата","action_report_chat":"Сообщить о нарушении","archived_contacts":"Чаты в архиве ({count})","badge_danger":"Подозрительный","badge_owner":"влад.","badge_staff":"Администрация","badge_verified":"Верифицированный","badge_you":"вы","block_contact_warning":"Вы действительно заблокировать этот контакт?","blocked_contacts_link":"Заблокированные ({count})","button_add_members":"Добавить","button_cancel":"Отменить","button_confirm":"Подтвердить","button_create":"Создать","button_delete_account":"Удалить аккаунт","button_edit":"Изменить","button_logout":"Выйти","button_ok":"OK","button_reset":"Изменить","button_send_request":"Отправить","button_sign_in":"Войти","button_sign_up":"Создать аккаунт","button_subscribe":"Подписаться","button_update":"Применить","cannot_initiate_file_upload":"Ошибка загрузки файла.","channel":"канал","channel_prompt":"Создать канал","chat_invitation":"Вас пригласили начать новый чат. Как вы хотите поступить?","chat_invitation_accept":"Принять","chat_invitation_block":"Заблокировать","chat_invitation_ignore":"Игнорировать","clear_messages_warning":"Вы действительно хотите удалить все сообщения в чате? Их будет невозможно восстановить.","code_doesnot_match":"Код не совпадает","contacts_not_found":"Чатов нет
¯∖_(ツ)_/¯","contacts_not_found_short":"Нет контактов для запроса \'\'{query}\'\'","credential_email_prompt":"Регистрационный емейл","delete_account":"Удалить аккаунт","delete_account_warning":"Вы уверены, что ходите удалить свой аккаунт? Его невозможно будет восстановить.","delete_messages_warning":"Вы действительно хотите удалить все сообщения?","download_action":"скачать","drafty_attachment":"Аттачмент","drafty_form":"Форма:","drafty_image":"Картинка","email_dative":"емейлу","email_prompt":"Email, напр. ivan@example.com","enable_peers_messaging":"Разблокировать.","enter_confirmation_code_prompt":"Код подтверждения, полученный по {method}:","error_invalid_id":"Неверный ID","file_attachment_too_large":"Размер файла {size} превышает {limit} лимит.","forgot_password_link":"Напомнить пароль","full_name_prompt":"Полное имя, напр. Иван Петров","granted_permissions":"Получены","group_has_no_members":"Нет участников","group_user_id_prompt":"ID чата или пользователя","image_caption_prompt":"Подпись к фото","invalid_content":"сообщение не читается","invalid_security_token":"Токен некорректен","label_client":"Клиент:","label_content_type":"Тип:","label_default_access_mode":"Доступ по умолчанию:","label_file_name":"Имя файла:","label_group_members":"Участники чата:","label_incognito_mode":"Режим инкогнито:","label_message_sound":"Звук нового сообщения:","label_muting_topic":"Без уведомлений","label_other_user":"Второй","label_password":"Пароль","label_permissions":"Права доступа:","label_private":"Комментарий","label_push_notifications":"Уведомления:","label_push_notifications_disabled":"Уведомления (требуют HTTPS):","label_reset_password":"Отправить емейл для смены пароля:","label_sdk":"SDK:","label_server":"Сервер:","label_server_address":"Адрес сервера:","label_server_to_use":"Использовать сервер:","label_size":"Размер:","label_topic_name":"Название","label_user_contacts":"Конакты","label_user_id":"ID:","label_wire_transport":"Соединение:","label_you":"Вы:","label_your_name":"Ваше имя","label_your_permissions":"Ваши права доступа:","last_seen_timestamp":"Был активен","leave_chat_warning":"Вы действительно хотите покинуть этот чат?","link_contact_us":"Связаться с нами","link_privacy_policy":"Политика конфиденциальности","link_terms_of_service":"Условия сервиса","login_prompt":"Логин","menu_item_archive_topic":"В архив","menu_item_block":"Заблокировать","menu_item_clear_messages":"Удалить сообщения","menu_item_clear_messages_for_all":"Удалить для всех","menu_item_delete":"Удалить","menu_item_delete_for_all":"Удалить для всех","menu_item_delete_topic":"Удалить чат","menu_item_edit_permissions":"Права доступа","menu_item_info":"Информация","menu_item_member_delete":"Отписать","menu_item_mute":"Не уведомлять","menu_item_restore_topic":"Разархивировать","menu_item_send_retry":"Отправить заново","menu_item_unblock":"Разблокировать","menu_item_unmute":"Уведомлять","message_sending":"в пути...","message_sending_failed":"ошибка","messages_not_readable":"нет доступа к сообщениям","messaging_disabled_prompt":"Отправка недоступна","more_online_members":"+еще {overflow}","new_message_prompt":"Новое сообщение","new_password_placeholder":"Введите новый пароль","no_connection":"Нет связи","no_contacts":"Ничего нет :-(","numeric_confirmation_code_prompt":"Только цифры","online_now":"онлайн","password_prompt":"Пароль","password_unchanged_prompt":"Не изменен","peers_messaging_disabled":"Чат заблокирован у корреспондента.","permission_admin":"Подтверждать ({val})","permission_delete":"Удалять ({val})","permission_join":"Подписываться ({val})","permission_owner":"Владелец ({val})","permission_pres":"Уведомлять ({val})","permission_read":"Читать ({val})","permission_share":"Приглашать ({val})","permission_write":"Писать ({val})","phone_dative":"телефону","private_editing_placeholder":"Виден только вам","push_init_failed":"Ошибка инициализации пуш уведомлений","reconnect_countdown":"Нет связи. Подключение через {seconds}…","reconnect_now":"Подключить сейчас.","reload_update":"Обновить","report_chat_warning":"Вы действительно хотите сообщить о нарушении и заблокировать этот чат?","requested_permissions":"Требуются","save_attachment":"сохранить","search_for_contacts":"Поиск контактов","search_no_results":"Ничего не найдено","search_placeholder":"Список, напр. email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"Уведомления","sidepanel_title_acc_support":"Поддержка","sidepanel_title_account_settings":"Настройки аккаунта","sidepanel_title_archive":"Архив чатов","sidepanel_title_blocked":"Заблокированные чаты","sidepanel_title_cred":"Подтвердить","sidepanel_title_login":"Авторизация","sidepanel_title_newtpk":"Новый чат","sidepanel_title_register":"Зарегистрироваться","sidepanel_title_reset":"Сменить пароль","sidepanel_title_settings":"Настройки","stay_logged_in":"Запомнить","tabtitle_find_user":"найти","tabtitle_group_by_id":"по id","tabtitle_new_group":"создать","tags_editor_no_tags":"Добавьте теги","tags_not_found":"Тегов нет. Добавьте.","title_all_contacts":"Все контакты","title_group_members":"Участники","title_manage_tags":"Редактировать","title_not_found":"Не найден","title_permissions":"Права доступа","title_tag_manager":"Теги для поиска","topic_block_warning":"Вы действительно хотите заблокировать этот чат?","topic_delete_warning":"Вы действительно хотите удалить этот чат?","topic_name_editing_placeholder":"Название чата","unnamed_topic":"Без названия","update_available":"Есть новая версия приложения.","upload_finishing":"завершение...","user_not_found":"Не найден","description_editing_placeholder":"Описание (не обязательно)","label_description":"Описание","button_security":"Безопасность","panel_title_crop":"Обрезать картинку","panel_title_general":"Общие настройки","panel_title_members":"Участники","panel_title_security":"Безопасность","panel_title_info":"Подробности","permissions_anonymous":"Анонимный","permissions_authenticated":"Авторизованный","topic_delete":"Удалить чат","permissions_user":"Права доступа","password_reset_email_sent":"Сообщение было отправлено на указанный email.","label_unarchive_topic":"Архивирован:","menu_item_reply":"Ответить","menu_item_forward":"Переслать","forward_to":"Переслать","forward_to_search_placeholder":"Поиск контактов","label_new_password":"Новый пароль","drafty_unknown":"Не поддерживается","calls_incoming":"Входящий звонок","calls_outgoing":"Исходящий звонок","calls_you_label":"Вы","menu_item_video_call":"Видеозвонок","already_in_call":"Вы уже звоните кому-то!","call_cancelled":"отменен","call_missed":"пропущен","call_declined":"отклонен","call_disconnected":"разъединен","label_use_secure_connection":"Безопасное соединение","cred_confirmed_successfully":"Подтверждено успешно","menu_item_edit":"Изменить","editing_message":"Редактирование","message_edited_marker":", изменено","icon_title_add_image":"Добавить изображение","icon_title_attach_file":"Прикрепить файл","icon_title_delete":"Удалить запись","icon_title_pause":"Пауза воспроизведения","icon_title_play":"Воспроизвести запись","icon_title_record_voice":"Записать голосовое сообщение","icon_title_resume":"Продолжить","icon_title_send":"Отправить сообщение","drag_file":"Перетащите файл сюда","drafty_video":"Видеозапись","call_in_progress":"в процессе","menu_item_audio_call":"Позвонить","unrecognized_video_format":"Неизвестный формат видео файла","loading_note":"Загружается...","password_i_have_code":"У меня есть код","label_reset_password_tel":"Отправить SMS для сброса пароля","mobile_phone_number":"Номер мобильного телефона","password_reset_sms_sent":"SMS с защитным кодом отправлен.","mobile_number_required":"Номер мобильного телефона","current_email":"Текущий e-mail","current_phone":"Текущий номер телефона","new_email":"Новый e-mail","new_phone_number":"Новый номер телефона","change_email":"Изменить e-mail","change_phone":"Изменить номер телефона","call_busy":"занято","failed_to_init_audio":"Не удалось инициализировать аудиозапись","calls_conference":"Групповой звонок","password_reset_success":"Пароль успешно изменен"}')}}]); \ No newline at end of file diff --git a/umd/817.prod.js b/umd/817.prod.js index c6808e54..d9c88d3b 100644 --- a/umd/817.prod.js +++ b/umd/817.prod.js @@ -1 +1 @@ -"use strict";(globalThis.webpackChunktinode_webapp=globalThis.webpackChunktinode_webapp||[]).push([[817],{4817:e=>{e.exports=JSON.parse('{"action_block_contact":"Blochează contact","action_cancel":"anulează","action_clear_messages":"Șterge mesajele","action_delete_messages":"Șterge toate mesajele","action_leave_chat":"Ieși din conversație","action_report_chat":"Raportează conversația","archived_contacts":"Contacte arhivate ({count})","badge_danger":"Suspicios","badge_owner":"owner","badge_staff":"Administrare","badge_verified":"Verificat","badge_you":"tu","block_contact_warning":"Ești sigur că dorești să blochezi acest contact?","blocked_contacts_link":"Contact blocate ({count})","button_add_members":"Adaugă persoane","button_cancel":"Anulează","button_confirm":"Confirmă","button_create":"Creează","button_delete_account":"Șterge cont","button_edit":"Editează","button_logout":"Deconectare","button_ok":"OK","button_reset":"Resetează","button_send_request":"Trimite cerere","button_sign_in":"Conectează-te","button_sign_up":"Creează cont","button_subscribe":"Subscribe","button_update":"Actualizează","cannot_initiate_file_upload":"Nu se poate face încărcarea.","channel":"canal","channel_prompt":"Acesta este un canal","chat_invitation":"Ai primit invitație într-o conversație. Accepți?","chat_invitation_accept":"Da, accept","chat_invitation_block":"Blochează","chat_invitation_ignore":"Ignoră","clear_messages_warning":"Ești sigur că dorești să ștergi mesajele? Acestea nu pot fi recuperate.","code_doesnot_match":"Codul furnizat nu este valid","contacts_not_found":"Nu ai contacte salvate
¯∖_(ツ)_/¯","contacts_not_found_short":"Niciun contact găsit după criteriile \'\'{query}\'\'","credential_email_prompt":"Adresa de e-mail","delete_account":"Șterge contul","delete_account_warning":"Ești sigur că dorești să ștergi contul? Acesta nu va putea fi recuperat.","delete_messages_warning":"Ești sigur că dorești să șterge mesajele din toate conversațiile? Acestea nu pot fi recuperate.","download_action":"download","drafty_attachment":"Atasament","drafty_form":"Formă:","drafty_image":"Imagine","email_dative":"email","email_prompt":"Adresa de e-mail","enable_peers_messaging":"Activează","enter_confirmation_code_prompt":"Introu codul de confirmare trimis pe {method}:","error_invalid_id":"ID Invalid","file_attachment_too_large":"Dimensiunea fișiterului {size} depășește limita de {limit}.","forgot_password_link":"Ți-ai uitat parola?","full_name_prompt":"Numele tău","granted_permissions":"Oferite","group_has_no_members":"În acest grup nu se află persoane","group_user_id_prompt":"Grup sau user ID","image_caption_prompt":"Titlul imaginii","invalid_content":"conținut invalid","invalid_security_token":"Codul de securitate este invalid","label_client":"Client:","label_content_type":"Tip conținut:","label_default_access_mode":"Default access mode:","label_file_name":"Nume fișier:","label_group_members":"Membrii grupului:","label_incognito_mode":"Mod incognito:","label_message_sound":"Sunet de mesaj:","label_muting_topic":"Mod silențios (muted):","label_other_user":"Altele","label_password":"Parola","label_permissions":"Permisiuni:","label_private":"Comentariu privat","label_push_notifications":"Alerte de notificare:","label_push_notifications_disabled":"Alerte de notificare (necesită HTTPS):","label_reset_password":"Resetează parola:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Adresa serverului:","label_server_to_use":"Server de utilizat:","label_size":"Size:","label_topic_name":"Nume","label_user_contacts":"Contacte","label_user_id":"ID:","label_wire_transport":"Transportul legat:","label_you":"Tu:","label_your_name":"Numele tău","label_your_permissions":"Permisiuniile tale:","last_seen_timestamp":"Văzut ultima dată","leave_chat_warning":"Ești sigur că dorești să ieși din conersație?","link_contact_us":"Contactează-ne","link_privacy_policy":"Politica de Confidențialitate","link_terms_of_service":"Termenii Serviciului","login_prompt":"Conectează-te","menu_item_archive_topic":"Arhivează","menu_item_block":"Blochează","menu_item_clear_messages":"Șterge mesajele","menu_item_clear_messages_for_all":"Ștergele pe toate","menu_item_delete":"Șterge","menu_item_delete_for_all":"Ștergele pe toate","menu_item_delete_topic":"Șterge","menu_item_edit_permissions":"Editează permisiuni","menu_item_info":"Info","menu_item_member_delete":"Șterge persoană","menu_item_mute":"Mute","menu_item_restore_topic":"Restabili","menu_item_send_retry":"Reîncearcă","menu_item_unblock":"Deblochează","menu_item_unmute":"Unmute","message_sending":"se trimite...","message_sending_failed":"eroare","messages_not_readable":"Mesajele nu pot fi citite","messaging_disabled_prompt":"Mesageria este dezactivată","more_online_members":"+{overflow} mai mult","new_message_prompt":"Mesaj nou","new_password_placeholder":"Introdu parolă","no_connection":"Nu există conexiune","no_contacts":"Nu ai contacte adăugate :-(","numeric_confirmation_code_prompt":"Doar cifre","online_now":"online acum","password_prompt":"Parola","password_unchanged_prompt":"Neschimbată","peers_messaging_disabled":"Mesageria de tip Peer este dezactivată.","permission_admin":"Aprobare ({val})","permission_delete":"Ștergere ({val})","permission_join":"Participare ({val})","permission_owner":"Deținător ({val})","permission_pres":"Notificare ({val})","permission_read":"Citire ({val})","permission_share":"Distribuire ({val})","permission_write":"Scriere ({val})","phone_dative":"telefon","private_editing_placeholder":"Vizibil doar ție","push_init_failed":"Nu s-a reușit inițializarea tip push notifications","reconnect_countdown":"Deconectat. Se încearcă conectarea în {seconds}…","reconnect_now":"Încearcă din nou","reload_update":"Reîncarcă","report_chat_warning":"Ești sigur că dorești să blochezi și să raportezi această conversație?","requested_permissions":"Necesare","save_attachment":"salvează","search_for_contacts":"Caută în contacte","search_no_results":"Nu s-au găsit rezultate","search_placeholder":"Caută după e-mail sau număr telefon...","sidepanel_title_acc_notifications":"Notificări","sidepanel_title_acc_support":"Ajutor","sidepanel_title_account_settings":"Setările Contului","sidepanel_title_archive":"Conversații Arhivate","sidepanel_title_blocked":"Conversații Blocate","sidepanel_title_cred":"Confirmă credențiale","sidepanel_title_login":"Conectează-te","sidepanel_title_newtpk":"Creeză un nou Chat","sidepanel_title_register":"Creează Cont","sidepanel_title_reset":"Resetează Parola","sidepanel_title_settings":"Setări","stay_logged_in":"Rămâi conectat","tabtitle_find_user":"caută","tabtitle_group_by_id":"după id","tabtitle_new_group":"grup nou","tags_editor_no_tags":"Adaugă tag-uri","tags_not_found":"Niciun tag definit. Adaugă.","title_all_contacts":"Toate Contactele","title_group_members":"Persoanele din grup","title_manage_tags":"Administrează","title_not_found":"Nu a fost găsit","title_permissions":"Permisiuni","title_tag_manager":"Tag-uri (user discovery)","topic_block_warning":"Ești sigur că dorești să blochezi această conversație?","topic_delete_warning":"Ești sigur că dorești să șterge această conversație?","topic_name_editing_placeholder":"Numele grupului","unnamed_topic":"Nedenumit","update_available":"Actualizare disponibilă.","upload_finishing":"se încarcă...","user_not_found":"Utilizatorul nu a fost găsit","description_editing_placeholder":"Descriere (opțional)","label_description":"Descriere","button_security":"Securitate","panel_title_crop":"Trageți pentru a ajusta","panel_title_general":"Generale","panel_title_members":"Membri","panel_title_security":"Securitate","panel_title_info":"Info","permissions_anonymous":"Anonim","permissions_authenticated":"Autentificat","topic_delete":"Ștergeți Chat","permissions_user":"Permisiunile utilizatorului","password_reset_email_sent":"A fost trimis un e-mail cu cod de securitate.","label_unarchive_topic":"Arhivat:","menu_item_reply":"A raspunde","menu_item_forward":"Redirecţiona","forward_to":"Redirecționați către","forward_to_search_placeholder":"Căutați contacte","label_new_password":"Parolă Nouă","drafty_unknown":"Neacceptat","calls_incoming":"Apel primit","calls_outgoing":"Apel efectuat","calls_you_label":"Tu","menu_item_video_call":"Apel video","already_in_call":"Deja vorbesti!","call_cancelled":"anulat","call_missed":"pierdut","call_declined":"refuzat","call_disconnected":"deconectat","label_use_secure_connection":"Utilizați conexiune securizată","cred_confirmed_successfully":"Confirmat cu succes","menu_item_edit":"Editează","editing_message":"Editare","message_edited_marker":", editat","icon_title_add_image":"Adauga imagine","icon_title_attach_file":"Ataseaza fisier","icon_title_delete":"Ștergeți înregistrarea","icon_title_pause":"Întrerupeți redarea","icon_title_play":"Redați înregistrarea","icon_title_record_voice":"Înregistrați mesajul vocal","icon_title_resume":"Reluați redarea","icon_title_send":"Trimite mesaj","drag_file":"Trageți fișierul aici","drafty_video":"Înregistrare video","call_in_progress":"în curs","menu_item_audio_call":"Apel","unrecognized_video_format":"Formatul acestui videoclip nu este recunoscut","loading_note":"Se încarcă...","password_i_have_code":"Am cod","label_reset_password_tel":"Trimite SMS pentru a reseta parola","mobile_phone_number":"Număr de telefon mobil","password_reset_sms_sent":"A fost trimis un mesaj text cu cod de securitate.","mobile_number_required":"Este necesar un număr de telefon mobil","current_email":"E-mail curent","current_phone":"Număr de telefon actual","new_email":"E-mail nou","new_phone_number":"Număr de telefon nou","change_email":"Schimbați adresa de e-mail","change_phone":"Schimbați numărul de telefon","call_busy":"ocupat","failed_to_init_audio":"Inițializarea înregistrării audio a eșuat","password_reset_success":"Resetarea parolei cu succes"}')}}]); \ No newline at end of file +"use strict";(globalThis.webpackChunktinode_webapp=globalThis.webpackChunktinode_webapp||[]).push([[817],{4817:e=>{e.exports=JSON.parse('{"action_block_contact":"Blochează contact","action_cancel":"anulează","action_clear_messages":"Șterge mesajele","action_delete_messages":"Șterge toate mesajele","action_leave_chat":"Ieși din conversație","action_report_chat":"Raportează conversația","archived_contacts":"Contacte arhivate ({count})","badge_danger":"Suspicios","badge_owner":"owner","badge_staff":"Administrare","badge_verified":"Verificat","badge_you":"tu","block_contact_warning":"Ești sigur că dorești să blochezi acest contact?","blocked_contacts_link":"Contact blocate ({count})","button_add_members":"Adaugă persoane","button_cancel":"Anulează","button_confirm":"Confirmă","button_create":"Creează","button_delete_account":"Șterge cont","button_edit":"Editează","button_logout":"Deconectare","button_ok":"OK","button_reset":"Resetează","button_send_request":"Trimite cerere","button_sign_in":"Conectează-te","button_sign_up":"Creează cont","button_subscribe":"Subscribe","button_update":"Actualizează","cannot_initiate_file_upload":"Nu se poate face încărcarea.","channel":"canal","channel_prompt":"Acesta este un canal","chat_invitation":"Ai primit invitație într-o conversație. Accepți?","chat_invitation_accept":"Da, accept","chat_invitation_block":"Blochează","chat_invitation_ignore":"Ignoră","clear_messages_warning":"Ești sigur că dorești să ștergi mesajele? Acestea nu pot fi recuperate.","code_doesnot_match":"Codul furnizat nu este valid","contacts_not_found":"Nu ai contacte salvate
¯∖_(ツ)_/¯","contacts_not_found_short":"Niciun contact găsit după criteriile \'\'{query}\'\'","credential_email_prompt":"Adresa de e-mail","delete_account":"Șterge contul","delete_account_warning":"Ești sigur că dorești să ștergi contul? Acesta nu va putea fi recuperat.","delete_messages_warning":"Ești sigur că dorești să șterge mesajele din toate conversațiile? Acestea nu pot fi recuperate.","download_action":"download","drafty_attachment":"Atasament","drafty_form":"Formă:","drafty_image":"Imagine","email_dative":"email","email_prompt":"Adresa de e-mail","enable_peers_messaging":"Activează","enter_confirmation_code_prompt":"Introu codul de confirmare trimis pe {method}:","error_invalid_id":"ID Invalid","file_attachment_too_large":"Dimensiunea fișiterului {size} depășește limita de {limit}.","forgot_password_link":"Ți-ai uitat parola?","full_name_prompt":"Numele tău","granted_permissions":"Oferite","group_has_no_members":"În acest grup nu se află persoane","group_user_id_prompt":"Grup sau user ID","image_caption_prompt":"Titlul imaginii","invalid_content":"conținut invalid","invalid_security_token":"Codul de securitate este invalid","label_client":"Client:","label_content_type":"Tip conținut:","label_default_access_mode":"Default access mode:","label_file_name":"Nume fișier:","label_group_members":"Membrii grupului:","label_incognito_mode":"Mod incognito:","label_message_sound":"Sunet de mesaj:","label_muting_topic":"Mod silențios (muted):","label_other_user":"Altele","label_password":"Parola","label_permissions":"Permisiuni:","label_private":"Comentariu privat","label_push_notifications":"Alerte de notificare:","label_push_notifications_disabled":"Alerte de notificare (necesită HTTPS):","label_reset_password":"Resetează parola:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Adresa serverului:","label_server_to_use":"Server de utilizat:","label_size":"Size:","label_topic_name":"Nume","label_user_contacts":"Contacte","label_user_id":"ID:","label_wire_transport":"Transportul legat:","label_you":"Tu:","label_your_name":"Numele tău","label_your_permissions":"Permisiuniile tale:","last_seen_timestamp":"Văzut ultima dată","leave_chat_warning":"Ești sigur că dorești să ieși din conersație?","link_contact_us":"Contactează-ne","link_privacy_policy":"Politica de Confidențialitate","link_terms_of_service":"Termenii Serviciului","login_prompt":"Conectează-te","menu_item_archive_topic":"Arhivează","menu_item_block":"Blochează","menu_item_clear_messages":"Șterge mesajele","menu_item_clear_messages_for_all":"Ștergele pe toate","menu_item_delete":"Șterge","menu_item_delete_for_all":"Ștergele pe toate","menu_item_delete_topic":"Șterge","menu_item_edit_permissions":"Editează permisiuni","menu_item_info":"Info","menu_item_member_delete":"Șterge persoană","menu_item_mute":"Mute","menu_item_restore_topic":"Restabili","menu_item_send_retry":"Reîncearcă","menu_item_unblock":"Deblochează","menu_item_unmute":"Unmute","message_sending":"se trimite...","message_sending_failed":"eroare","messages_not_readable":"Mesajele nu pot fi citite","messaging_disabled_prompt":"Mesageria este dezactivată","more_online_members":"+{overflow} mai mult","new_message_prompt":"Mesaj nou","new_password_placeholder":"Introdu parolă","no_connection":"Nu există conexiune","no_contacts":"Nu ai contacte adăugate :-(","numeric_confirmation_code_prompt":"Doar cifre","online_now":"online acum","password_prompt":"Parola","password_unchanged_prompt":"Neschimbată","peers_messaging_disabled":"Mesageria de tip Peer este dezactivată.","permission_admin":"Aprobare ({val})","permission_delete":"Ștergere ({val})","permission_join":"Participare ({val})","permission_owner":"Deținător ({val})","permission_pres":"Notificare ({val})","permission_read":"Citire ({val})","permission_share":"Distribuire ({val})","permission_write":"Scriere ({val})","phone_dative":"telefon","private_editing_placeholder":"Vizibil doar ție","push_init_failed":"Nu s-a reușit inițializarea tip push notifications","reconnect_countdown":"Deconectat. Se încearcă conectarea în {seconds}…","reconnect_now":"Încearcă din nou","reload_update":"Reîncarcă","report_chat_warning":"Ești sigur că dorești să blochezi și să raportezi această conversație?","requested_permissions":"Necesare","save_attachment":"salvează","search_for_contacts":"Caută în contacte","search_no_results":"Nu s-au găsit rezultate","search_placeholder":"Caută după e-mail sau număr telefon...","sidepanel_title_acc_notifications":"Notificări","sidepanel_title_acc_support":"Ajutor","sidepanel_title_account_settings":"Setările Contului","sidepanel_title_archive":"Conversații Arhivate","sidepanel_title_blocked":"Conversații Blocate","sidepanel_title_cred":"Confirmă credențiale","sidepanel_title_login":"Conectează-te","sidepanel_title_newtpk":"Creeză un nou Chat","sidepanel_title_register":"Creează Cont","sidepanel_title_reset":"Resetează Parola","sidepanel_title_settings":"Setări","stay_logged_in":"Rămâi conectat","tabtitle_find_user":"caută","tabtitle_group_by_id":"după id","tabtitle_new_group":"grup nou","tags_editor_no_tags":"Adaugă tag-uri","tags_not_found":"Niciun tag definit. Adaugă.","title_all_contacts":"Toate Contactele","title_group_members":"Persoanele din grup","title_manage_tags":"Administrează","title_not_found":"Nu a fost găsit","title_permissions":"Permisiuni","title_tag_manager":"Tag-uri (user discovery)","topic_block_warning":"Ești sigur că dorești să blochezi această conversație?","topic_delete_warning":"Ești sigur că dorești să șterge această conversație?","topic_name_editing_placeholder":"Numele grupului","unnamed_topic":"Nedenumit","update_available":"Actualizare disponibilă.","upload_finishing":"se încarcă...","user_not_found":"Utilizatorul nu a fost găsit","description_editing_placeholder":"Descriere (opțional)","label_description":"Descriere","button_security":"Securitate","panel_title_crop":"Trageți pentru a ajusta","panel_title_general":"Generale","panel_title_members":"Membri","panel_title_security":"Securitate","panel_title_info":"Info","permissions_anonymous":"Anonim","permissions_authenticated":"Autentificat","topic_delete":"Ștergeți Chat","permissions_user":"Permisiunile utilizatorului","password_reset_email_sent":"A fost trimis un e-mail cu cod de securitate.","label_unarchive_topic":"Arhivat:","menu_item_reply":"A raspunde","menu_item_forward":"Redirecţiona","forward_to":"Redirecționați către","forward_to_search_placeholder":"Căutați contacte","label_new_password":"Parolă Nouă","drafty_unknown":"Neacceptat","calls_incoming":"Apel primit","calls_outgoing":"Apel efectuat","calls_you_label":"Tu","menu_item_video_call":"Apel video","already_in_call":"Deja vorbesti!","call_cancelled":"anulat","call_missed":"pierdut","call_declined":"refuzat","call_disconnected":"deconectat","label_use_secure_connection":"Utilizați conexiune securizată","cred_confirmed_successfully":"Confirmat cu succes","menu_item_edit":"Editează","editing_message":"Editare","message_edited_marker":", editat","icon_title_add_image":"Adauga imagine","icon_title_attach_file":"Ataseaza fisier","icon_title_delete":"Ștergeți înregistrarea","icon_title_pause":"Întrerupeți redarea","icon_title_play":"Redați înregistrarea","icon_title_record_voice":"Înregistrați mesajul vocal","icon_title_resume":"Reluați redarea","icon_title_send":"Trimite mesaj","drag_file":"Trageți fișierul aici","drafty_video":"Înregistrare video","call_in_progress":"în curs","menu_item_audio_call":"Apel","unrecognized_video_format":"Formatul acestui videoclip nu este recunoscut","loading_note":"Se încarcă...","password_i_have_code":"Am cod","label_reset_password_tel":"Trimite SMS pentru a reseta parola","mobile_phone_number":"Număr de telefon mobil","password_reset_sms_sent":"A fost trimis un mesaj text cu cod de securitate.","mobile_number_required":"Este necesar un număr de telefon mobil","current_email":"E-mail curent","current_phone":"Număr de telefon actual","new_email":"E-mail nou","new_phone_number":"Număr de telefon nou","change_email":"Schimbați adresa de e-mail","change_phone":"Schimbați numărul de telefon","call_busy":"ocupat","failed_to_init_audio":"Inițializarea înregistrării audio a eșuat","calls_conference":"Apel de conferinta","password_reset_success":"Resetarea parolei cu succes"}')}}]); \ No newline at end of file diff --git a/umd/898.prod.js b/umd/898.prod.js index ea597306..1fd789cd 100644 --- a/umd/898.prod.js +++ b/umd/898.prod.js @@ -1 +1 @@ -"use strict";(globalThis.webpackChunktinode_webapp=globalThis.webpackChunktinode_webapp||[]).push([[898],{898:e=>{e.exports=JSON.parse('{"action_block_contact":"연락차단","action_cancel":"취소","action_clear_messages":"메시지지우기","action_delete_messages":"모든메시지지우기","action_leave_chat":"대화나누기","action_report_chat":"대화기록","archived_contacts":"보관된연락처({수})","badge_danger":"의심 많은","badge_owner":"소유자","badge_staff":"직원 관리하에","badge_verified":"확인 됨","badge_you":"당신","block_contact_warning":"이연락처를차단하시겠습니까?","blocked_contacts_link":"차단된연락처({수})","button_add_members":"회원추가","button_cancel":"취소","button_confirm":"확인","button_create":"작성","button_delete_account":"계정삭제","button_edit":"편집","button_logout":"로그아웃","button_ok":"OK","button_reset":"재설정","button_send_request":"요청보내기","button_sign_in":"로그인","button_sign_up":"가입","button_subscribe":"구독","button_update":"업데이트","cannot_initiate_file_upload":"파일업로드를시작할수없습니다.","channel":"채널","channel_prompt":"이 채널입니다","chat_invitation":"새로운대화를시작하도록초대되었습니다.무엇을하시겠습니까?","chat_invitation_accept":"수락","chat_invitation_block":"차단","chat_invitation_ignore":"무시","clear_messages_warning":"모든메시지를지우시겠습니까?실행취소할수없습니다.","code_doesnot_match":"코드가일치하지않습니다","contacts_not_found":"채팅이없습니다
¯∖_(ツ)_/¯","contacts_not_found_short":"\'{문의}\'와일치하는연락처가없습니다.","credential_email_prompt":"등록이메일","delete_account":"계정삭제","delete_account_warning":"계정을삭제하시겠습니까?실행취소할수없습니다.","delete_messages_warning":"모든사람의모든메시지를삭제하시겠습니까?실행취소할수없습니다.","download_action":"다운로드","drafty_attachment":"부착","drafty_form":"형태:","drafty_image":"이미지","email_dative":"이메일","email_prompt":"이메일(예:hong@example.com)","enable_peers_messaging":"활성화","enter_confirmation_code_prompt":"{방법}으로보낸확인코드를입력하십시오:","error_invalid_id":"잘못된ID","file_attachment_too_large":"파일크기{크기}이(가){제한}제한을초과합니다.","forgot_password_link":"비밀번호를잊으셨습니까?","full_name_prompt":"전체이름(예:홍길동)","granted_permissions":"승낙하다","group_has_no_members":"회원없음","group_user_id_prompt":"그룹또는사용자ID","image_caption_prompt":"이미지설명","invalid_content":"잘못된내용","invalid_security_token":"유효하지않은보안토큰","label_client":"클라이언트: ","label_content_type":"컨텐츠유형: ","label_default_access_mode":"기본액세스모드: ","label_file_name":"파일이름: ","label_group_members":"그룹회원: ","label_incognito_mode":"시크릿모드: ","label_message_sound":"메시지소리: ","label_muting_topic":"음소거: ","label_other_user":"기타","label_password":"비밀번호","label_permissions":"권한: ","label_private":"개인코멘트","label_push_notifications":"통지경보: ","label_push_notifications_disabled":"통지경보(HTTPS필요): ","label_reset_password":"비밀번호재설정이메일보내기: ","label_sdk":"SDK:","label_server":"서버: ","label_server_address":"서버주소: ","label_server_to_use":"사용할서버:","label_size":"크기: ","label_topic_name":"이름","label_user_contacts":"연락처","label_user_id":"ID:","label_wire_transport":"와이어수송:","label_you":"당신: ","label_your_name":"이름","label_your_permissions":"권한: ","last_seen_timestamp":"마지막으로본","leave_chat_warning":"이대화를나가시겠습니까?","link_contact_us":"문의처","link_privacy_policy":"개인정보보호정책","link_terms_of_service":"서비스약관","login_prompt":"로그인","menu_item_archive_topic":"보관","menu_item_block":"차단","menu_item_clear_messages":"메시지지우기","menu_item_clear_messages_for_all":"모두지우기","menu_item_delete":"삭제","menu_item_delete_for_all":"모두삭제","menu_item_delete_topic":"삭제","menu_item_edit_permissions":"편집권한","menu_item_info":"정보","menu_item_member_delete":"제거","menu_item_mute":"음소거","menu_item_restore_topic":"복원","menu_item_send_retry":"다시시도","menu_item_unblock":"차단해제","menu_item_unmute":"음소거해제","message_sending":"보내기...","message_sending_failed":"실패","messages_not_readable":"메시지에 액세스 할 수 없습니다","messaging_disabled_prompt":"메시지비활성화","more_online_members":"+{넘침}더보기","new_message_prompt":"새메시지","new_password_placeholder":"새비밀번호입력","no_connection":"연결없음","no_contacts":"연락처가없습니다 (._.)","numeric_confirmation_code_prompt":"숫자만","online_now":"현재접속중","password_prompt":"비밀번호","password_unchanged_prompt":"변경되지않음","peers_messaging_disabled":"동료의메시지가비활성화되었습니다.","permission_admin":"승인({val})","permission_delete":"삭제({val})","permission_join":"참여({val})","permission_owner":"소유자({val})","permission_pres":"알림받기({val})","permission_read":"읽기({val})","permission_share":"공유({val})","permission_write":"쓰기({val})","phone_dative":"전화","private_editing_placeholder":"나만볼수있습니다","push_init_failed":"푸시알림을초기화하지못했습니다","reconnect_countdown":"연결이끊어졌습니다.다시연결하는중{초}…","reconnect_now":"지금시도","reload_update":"재로드","report_chat_warning":"이대화를차단하고기록하시겠습니까?","requested_permissions":"요청","save_attachment":"저장","search_for_contacts":"검색을사용하여연락처찾기","search_no_results":"검색결과가없습니다","search_placeholder":"email:alice@example.com,tel:17025550003...와같은목록","sidepanel_title_acc_notifications":"알림","sidepanel_title_acc_support":"지원","sidepanel_title_account_settings":"계정설정","sidepanel_title_archive":"보관된채팅","sidepanel_title_blocked":"차단된채팅","sidepanel_title_cred":"자격증명확인","sidepanel_title_login":"로그인","sidepanel_title_newtpk":"새채팅시작","sidepanel_title_register":"계정만들기","sidepanel_title_reset":"비밀번호재설정","sidepanel_title_settings":"설정","stay_logged_in":"로그인상태유지","tabtitle_find_user":"찾기","tabtitle_group_by_id":"id로","tabtitle_new_group":"새그룹","tags_editor_no_tags":"일부태그추가","tags_not_found":"태그가정의되지않았습니다.일부를추가하십시오.","title_all_contacts":"모든연락처","title_group_members":"그룹구성원","title_manage_tags":"관리","title_not_found":"찾을수없음","title_permissions":"권한","title_tag_manager":"태그(사용자검색)","topic_block_warning":"이대화를차단하시겠습니까?","topic_delete_warning":"이대화를삭제하시겠습니까?","topic_name_editing_placeholder":"그룹의자유형이름","unnamed_topic":"이름없는","update_available":"업데이트가능.","upload_finishing":"마무리...","user_not_found":"찾을수없음","description_editing_placeholder":"설명(선택 사항)","label_description":"설명","button_security":"보안","panel_title_crop":"드래그하여 조정","panel_title_general":"일반","panel_title_members":"구성원","panel_title_security":"보안","panel_title_info":"정보","permissions_anonymous":"익명","permissions_authenticated":"인증됨","topic_delete":"채팅 삭제","permissions_user":"사용자 권한","password_reset_email_sent":"보안 코드가 포함된 이메일이 전송되었습니다.","label_unarchive_topic":"보관됨:","menu_item_reply":"회신하다","menu_item_forward":"리디렉션","forward_to":"메시지를 리디렉션","forward_to_search_placeholder":"연락처 검색","label_new_password":"새 비밀번호","drafty_unknown":"지원되지 않음","calls_incoming":"수신 전화","calls_outgoing":"발신 전화","calls_you_label":"너","menu_item_video_call":"영상 통화","already_in_call":"당신은 이미 말하고 있습니다!","call_cancelled":"취소 된","call_missed":"부재중","call_declined":"통화 거부","call_disconnected":"연결 끊김","label_use_secure_connection":"보안 연결 사용","cred_confirmed_successfully":"성공적으로 확인됨","menu_item_edit":"편집","editing_message":"교정하다","message_edited_marker":" 수정됨","icon_title_add_image":"이미지 추가","icon_title_attach_file":"파일을 첨부","icon_title_delete":"녹음 삭제","icon_title_pause":"재생 일시 중지","icon_title_play":"녹음 재생","icon_title_record_voice":"음성 메시지 녹음","icon_title_resume":"재생 재개","icon_title_send":"문자 보내","drag_file":"여기로 파일 드래그","drafty_video":"녹화","call_in_progress":"통화 중","menu_item_audio_call":"전화","unrecognized_video_format":"이 동영상의 형식을 인식할 수 없습니다.","loading_note":"로드 중...","password_i_have_code":"코드가 있습니다","label_reset_password_tel":"비밀번호 재설정을 위해 SMS 보내기","mobile_phone_number":"휴대전화 번호","password_reset_sms_sent":"보안 코드가 포함된 문자 메시지가 전송되었습니다.","mobile_number_required":"휴대전화 번호 필요","current_email":"현재 이메일","current_phone":"현재 전화번호","new_email":"새 이메일 주소","new_phone_number":"새 전화번호","change_email":"이메일 변경","change_phone":"전화번호 변경","call_busy":"바쁘다","failed_to_init_audio":"오디오 녹음 초기화 실패","password_reset_success":"비밀번호 재설정 성공"}')}}]); \ No newline at end of file +"use strict";(globalThis.webpackChunktinode_webapp=globalThis.webpackChunktinode_webapp||[]).push([[898],{898:e=>{e.exports=JSON.parse('{"action_block_contact":"연락차단","action_cancel":"취소","action_clear_messages":"메시지지우기","action_delete_messages":"모든메시지지우기","action_leave_chat":"대화나누기","action_report_chat":"대화기록","archived_contacts":"보관된연락처({수})","badge_danger":"의심 많은","badge_owner":"소유자","badge_staff":"직원 관리하에","badge_verified":"확인 됨","badge_you":"당신","block_contact_warning":"이연락처를차단하시겠습니까?","blocked_contacts_link":"차단된연락처({수})","button_add_members":"회원추가","button_cancel":"취소","button_confirm":"확인","button_create":"작성","button_delete_account":"계정삭제","button_edit":"편집","button_logout":"로그아웃","button_ok":"OK","button_reset":"재설정","button_send_request":"요청보내기","button_sign_in":"로그인","button_sign_up":"가입","button_subscribe":"구독","button_update":"업데이트","cannot_initiate_file_upload":"파일업로드를시작할수없습니다.","channel":"채널","channel_prompt":"이 채널입니다","chat_invitation":"새로운대화를시작하도록초대되었습니다.무엇을하시겠습니까?","chat_invitation_accept":"수락","chat_invitation_block":"차단","chat_invitation_ignore":"무시","clear_messages_warning":"모든메시지를지우시겠습니까?실행취소할수없습니다.","code_doesnot_match":"코드가일치하지않습니다","contacts_not_found":"채팅이없습니다
¯∖_(ツ)_/¯","contacts_not_found_short":"\'{문의}\'와일치하는연락처가없습니다.","credential_email_prompt":"등록이메일","delete_account":"계정삭제","delete_account_warning":"계정을삭제하시겠습니까?실행취소할수없습니다.","delete_messages_warning":"모든사람의모든메시지를삭제하시겠습니까?실행취소할수없습니다.","download_action":"다운로드","drafty_attachment":"부착","drafty_form":"형태:","drafty_image":"이미지","email_dative":"이메일","email_prompt":"이메일(예:hong@example.com)","enable_peers_messaging":"활성화","enter_confirmation_code_prompt":"{방법}으로보낸확인코드를입력하십시오:","error_invalid_id":"잘못된ID","file_attachment_too_large":"파일크기{크기}이(가){제한}제한을초과합니다.","forgot_password_link":"비밀번호를잊으셨습니까?","full_name_prompt":"전체이름(예:홍길동)","granted_permissions":"승낙하다","group_has_no_members":"회원없음","group_user_id_prompt":"그룹또는사용자ID","image_caption_prompt":"이미지설명","invalid_content":"잘못된내용","invalid_security_token":"유효하지않은보안토큰","label_client":"클라이언트: ","label_content_type":"컨텐츠유형: ","label_default_access_mode":"기본액세스모드: ","label_file_name":"파일이름: ","label_group_members":"그룹회원: ","label_incognito_mode":"시크릿모드: ","label_message_sound":"메시지소리: ","label_muting_topic":"음소거: ","label_other_user":"기타","label_password":"비밀번호","label_permissions":"권한: ","label_private":"개인코멘트","label_push_notifications":"통지경보: ","label_push_notifications_disabled":"통지경보(HTTPS필요): ","label_reset_password":"비밀번호재설정이메일보내기: ","label_sdk":"SDK:","label_server":"서버: ","label_server_address":"서버주소: ","label_server_to_use":"사용할서버:","label_size":"크기: ","label_topic_name":"이름","label_user_contacts":"연락처","label_user_id":"ID:","label_wire_transport":"와이어수송:","label_you":"당신: ","label_your_name":"이름","label_your_permissions":"권한: ","last_seen_timestamp":"마지막으로본","leave_chat_warning":"이대화를나가시겠습니까?","link_contact_us":"문의처","link_privacy_policy":"개인정보보호정책","link_terms_of_service":"서비스약관","login_prompt":"로그인","menu_item_archive_topic":"보관","menu_item_block":"차단","menu_item_clear_messages":"메시지지우기","menu_item_clear_messages_for_all":"모두지우기","menu_item_delete":"삭제","menu_item_delete_for_all":"모두삭제","menu_item_delete_topic":"삭제","menu_item_edit_permissions":"편집권한","menu_item_info":"정보","menu_item_member_delete":"제거","menu_item_mute":"음소거","menu_item_restore_topic":"복원","menu_item_send_retry":"다시시도","menu_item_unblock":"차단해제","menu_item_unmute":"음소거해제","message_sending":"보내기...","message_sending_failed":"실패","messages_not_readable":"메시지에 액세스 할 수 없습니다","messaging_disabled_prompt":"메시지비활성화","more_online_members":"+{넘침}더보기","new_message_prompt":"새메시지","new_password_placeholder":"새비밀번호입력","no_connection":"연결없음","no_contacts":"연락처가없습니다 (._.)","numeric_confirmation_code_prompt":"숫자만","online_now":"현재접속중","password_prompt":"비밀번호","password_unchanged_prompt":"변경되지않음","peers_messaging_disabled":"동료의메시지가비활성화되었습니다.","permission_admin":"승인({val})","permission_delete":"삭제({val})","permission_join":"참여({val})","permission_owner":"소유자({val})","permission_pres":"알림받기({val})","permission_read":"읽기({val})","permission_share":"공유({val})","permission_write":"쓰기({val})","phone_dative":"전화","private_editing_placeholder":"나만볼수있습니다","push_init_failed":"푸시알림을초기화하지못했습니다","reconnect_countdown":"연결이끊어졌습니다.다시연결하는중{초}…","reconnect_now":"지금시도","reload_update":"재로드","report_chat_warning":"이대화를차단하고기록하시겠습니까?","requested_permissions":"요청","save_attachment":"저장","search_for_contacts":"검색을사용하여연락처찾기","search_no_results":"검색결과가없습니다","search_placeholder":"email:alice@example.com,tel:17025550003...와같은목록","sidepanel_title_acc_notifications":"알림","sidepanel_title_acc_support":"지원","sidepanel_title_account_settings":"계정설정","sidepanel_title_archive":"보관된채팅","sidepanel_title_blocked":"차단된채팅","sidepanel_title_cred":"자격증명확인","sidepanel_title_login":"로그인","sidepanel_title_newtpk":"새채팅시작","sidepanel_title_register":"계정만들기","sidepanel_title_reset":"비밀번호재설정","sidepanel_title_settings":"설정","stay_logged_in":"로그인상태유지","tabtitle_find_user":"찾기","tabtitle_group_by_id":"id로","tabtitle_new_group":"새그룹","tags_editor_no_tags":"일부태그추가","tags_not_found":"태그가정의되지않았습니다.일부를추가하십시오.","title_all_contacts":"모든연락처","title_group_members":"그룹구성원","title_manage_tags":"관리","title_not_found":"찾을수없음","title_permissions":"권한","title_tag_manager":"태그(사용자검색)","topic_block_warning":"이대화를차단하시겠습니까?","topic_delete_warning":"이대화를삭제하시겠습니까?","topic_name_editing_placeholder":"그룹의자유형이름","unnamed_topic":"이름없는","update_available":"업데이트가능.","upload_finishing":"마무리...","user_not_found":"찾을수없음","description_editing_placeholder":"설명(선택 사항)","label_description":"설명","button_security":"보안","panel_title_crop":"드래그하여 조정","panel_title_general":"일반","panel_title_members":"구성원","panel_title_security":"보안","panel_title_info":"정보","permissions_anonymous":"익명","permissions_authenticated":"인증됨","topic_delete":"채팅 삭제","permissions_user":"사용자 권한","password_reset_email_sent":"보안 코드가 포함된 이메일이 전송되었습니다.","label_unarchive_topic":"보관됨:","menu_item_reply":"회신하다","menu_item_forward":"리디렉션","forward_to":"메시지를 리디렉션","forward_to_search_placeholder":"연락처 검색","label_new_password":"새 비밀번호","drafty_unknown":"지원되지 않음","calls_incoming":"수신 전화","calls_outgoing":"발신 전화","calls_you_label":"너","menu_item_video_call":"영상 통화","already_in_call":"당신은 이미 말하고 있습니다!","call_cancelled":"취소 된","call_missed":"부재중","call_declined":"통화 거부","call_disconnected":"연결 끊김","label_use_secure_connection":"보안 연결 사용","cred_confirmed_successfully":"성공적으로 확인됨","menu_item_edit":"편집","editing_message":"교정하다","message_edited_marker":" 수정됨","icon_title_add_image":"이미지 추가","icon_title_attach_file":"파일을 첨부","icon_title_delete":"녹음 삭제","icon_title_pause":"재생 일시 중지","icon_title_play":"녹음 재생","icon_title_record_voice":"음성 메시지 녹음","icon_title_resume":"재생 재개","icon_title_send":"문자 보내","drag_file":"여기로 파일 드래그","drafty_video":"녹화","call_in_progress":"통화 중","menu_item_audio_call":"전화","unrecognized_video_format":"이 동영상의 형식을 인식할 수 없습니다.","loading_note":"로드 중...","password_i_have_code":"코드가 있습니다","label_reset_password_tel":"비밀번호 재설정을 위해 SMS 보내기","mobile_phone_number":"휴대전화 번호","password_reset_sms_sent":"보안 코드가 포함된 문자 메시지가 전송되었습니다.","mobile_number_required":"휴대전화 번호 필요","current_email":"현재 이메일","current_phone":"현재 전화번호","new_email":"새 이메일 주소","new_phone_number":"새 전화번호","change_email":"이메일 변경","change_phone":"전화번호 변경","call_busy":"바쁘다","failed_to_init_audio":"오디오 녹음 초기화 실패","calls_conference":"전화 회의","password_reset_success":"비밀번호 재설정 성공"}')}}]); \ No newline at end of file diff --git a/umd/92.prod.js b/umd/92.prod.js index 74b6e9d1..49fb98cd 100644 --- a/umd/92.prod.js +++ b/umd/92.prod.js @@ -1 +1 @@ -"use strict";(globalThis.webpackChunktinode_webapp=globalThis.webpackChunktinode_webapp||[]).push([[92],{6092:e=>{e.exports=JSON.parse('{"action_block_contact":"Kontakt blockieren","action_cancel":"Abbrechen","action_clear_messages":"Nachrichten leeren","action_delete_messages":"Nachrichten für alle löschen","action_leave_chat":"Unterhaltung verlassen","action_report_chat":"Unterhaltung melden","archived_contacts":"Archivierte Kontakte ({count})","badge_danger":"Verdächtig","badge_owner":"Besitzer","badge_staff":"Verwaltung","badge_verified":"Verifiziert","badge_you":"Sie","block_contact_warning":"Möchten Sie diesen Kontakt wirklich blockieren?","blocked_contacts_link":"Blockierte Kontakte ({count})","button_add_members":"Mitglieder hinzufügen","button_cancel":"Abbrechen","button_confirm":"Bestätigen","button_create":"Erstellen","button_delete_account":"Konto löschen","button_edit":"Bearbeiten","button_logout":"Abmelden","button_ok":"OK","button_reset":"Zurücksetzen","button_send_request":"Anfrage senden","button_sign_in":"Anmelden","button_sign_up":"Anmelden","button_subscribe":"Abbonieren","button_update":"Aktualisieren","cannot_initiate_file_upload":"Datei kann nicht hochgeladen werden.","channel":"Sender","channel_prompt":"Dies ist ein Sender","chat_invitation":"Sie sind eingeladen, an einem neuen Chat teilzunehmen. Was möchten Sie tun?","chat_invitation_accept":"Akzeptieren","chat_invitation_block":"Blockieren","chat_invitation_ignore":"Ignorieren","clear_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle leeren wollen? Das kann nicht rückgängig gemacht werden.","code_doesnot_match":"Code stimmt nicht überein","contacts_not_found":"Sie haben keine Unterhaltungen
¯∖_(ツ)_/¯","contacts_not_found_short":"Keine Kontakte für \'\'{query}\'\'","credential_email_prompt":"E-Mail Adresse für Registrierung","delete_account":"Konto löschen","delete_account_warning":"Möchten Sie das Konto wirklich löschen? Das kann nicht rückgängig gemacht werden","delete_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle löschen wollen? Das kann nicht rückgängig gemacht werden.","download_action":"herunterladen","drafty_attachment":"Dateianhang","drafty_form":"Formular:","drafty_image":"Bild","email_dative":"E-Mail","email_prompt":"E-Mail, z.B. lisam@beispiel.de","enable_peers_messaging":"Aktivieren","enter_confirmation_code_prompt":"Geben Sie den Bestätigungscode ein, der per {method} geschickt wurde:","error_invalid_id":"ungültige ID","file_attachment_too_large":"Die Dateigröße {size} überschreitet das Limit von {limit}.","forgot_password_link":"Passwort vergessen?","full_name_prompt":"Vollständiger Name, z.B. Lisa Musterfrau","granted_permissions":"Erteilt","group_has_no_members":"Keine Mitglieder","group_user_id_prompt":"Gruppe oder Benutzer ID","image_caption_prompt":"Bildunterschrift","invalid_content":"ungültiger Inhalt","invalid_security_token":"Ungültiger Sicherheitsschlüssel","label_client":"Client:","label_content_type":"Inhaltsart:","label_default_access_mode":"Standard Zugriffsmodus:","label_file_name":"Dateiname:","label_group_members":"Gruppenmitglieder:","label_incognito_mode":"inkognito-Modus:","label_message_sound":"Benachrichtigungston:","label_muting_topic":"Stumm geschaltet:","label_other_user":"Andere","label_password":"Passwort","label_permissions":"Berechtigungen:","label_private":"Privater Kommentar","label_push_notifications":"Benachrichtigungsmeldungen:","label_push_notifications_disabled":"Benachrichtigungsmeldungen (erfordert HTTPS):","label_reset_password":"Passwort per E-Mail wiederherstellen:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server Adresse:","label_server_to_use":"Server verwenden:","label_size":"Größe:","label_topic_name":"Name","label_user_contacts":"Kontakte","label_user_id":"ID:","label_wire_transport":"Übertragung per Kabel:","label_you":"Sie:","label_your_name":"Ihr Name","label_your_permissions":"Ihre Berechtigungen:","last_seen_timestamp":"Zuletzt gesehen","leave_chat_warning":"Möchten Sie diese Unterhaltung wirklich verlassen?","link_contact_us":"Kontakt","link_privacy_policy":"Datenschutzerklärung","link_terms_of_service":"Nutzungsbedingungen","login_prompt":"Anmelden","menu_item_archive_topic":"Archivieren","menu_item_block":"Blockieren","menu_item_clear_messages":"Nachrichten leeren","menu_item_clear_messages_for_all":"Für alle leeren","menu_item_delete":"Löschen","menu_item_delete_for_all":"Für alle löschen","menu_item_delete_topic":"Entfernen","menu_item_edit_permissions":"Berechtigungen ändern","menu_item_info":"Info","menu_item_member_delete":"Entfernen","menu_item_mute":"Unterhaltung stumm schalten","menu_item_restore_topic":"Wiederherstellen","menu_item_send_retry":"Wiederholen","menu_item_unblock":"Blockierung aufheben","menu_item_unmute":"Stumm schalten beenden","message_sending":"wird gesendet...","message_sending_failed":"fehlgeschlagen","messages_not_readable":"Neue Nachrichten können nicht gelesen werden","messaging_disabled_prompt":"Nachrichtenübermittlung deaktiviert","more_online_members":"+{overflow} mehr","new_message_prompt":"Neue Nachricht","new_password_placeholder":"Geben Sie ein neues Passwort ein","no_connection":"Keine Verbindung","no_contacts":"Sie haben keine Kontakte :-(","numeric_confirmation_code_prompt":"Nur zahlen","online_now":"jetzt online","password_prompt":"Passwort","password_unchanged_prompt":"unverändert","peers_messaging_disabled":"Gruppennachrichten sind deaktiviert","permission_admin":"Bestätigen ({val})","permission_delete":"Entfernen ({val})","permission_join":"Beitreten ({val})","permission_owner":"Besitzer ({val})","permission_pres":"Benachrichtigt werden ({val})","permission_read":"Lesen ({val})","permission_share":"Teilen ({val})","permission_write":"Schreiben ({val})","phone_dative":"Telefon","private_editing_placeholder":"Nur für Sie sichtbar","push_init_failed":"Initialisierung von Push-Benachrichtigungen fehlgeschlagen","reconnect_countdown":"Getrennt. Wiederverbinden in {seconds}…","reconnect_now":"Jetzt probieren","reload_update":"Neu laden","report_chat_warning":"Möchten Sie diese Unterhaltung wirklich blockieren und melden?","requested_permissions":"Angefordert","save_attachment":"Speichern","search_for_contacts":"Nutzen Sie die Suche um Kontakte zu finden","search_no_results":"Die Suche hatte keine Ergebnisse","search_placeholder":"Liste: email:lisa@beispiel.de, tel:17025550003...","sidepanel_title_acc_notifications":"Benachrichtigungen","sidepanel_title_acc_support":"Unterstützung","sidepanel_title_account_settings":"Konto-Einstellungen","sidepanel_title_archive":"Archivierte Unterhaltungen","sidepanel_title_blocked":"Blockierte Unterhaltungen","sidepanel_title_cred":"Anmeldeinformationen bestätigen","sidepanel_title_login":"Anmelden","sidepanel_title_newtpk":"Neue Unterhaltung starten","sidepanel_title_register":"Konto erstellen","sidepanel_title_reset":"Passwort zurücksetzen","sidepanel_title_settings":"Einstellungen","stay_logged_in":"Angemeldet bleiben","tabtitle_find_user":"Suchen","tabtitle_group_by_id":"nach ID","tabtitle_new_group":"Neue Gruppe","tags_editor_no_tags":"Schlagworte hinzufügen","tags_not_found":"Keine Schlagworte definiert. Erstellen Sie welche.","title_all_contacts":"Alle Kontakte","title_group_members":"Gruppenmitglieder","panel_title_info":"Info","title_manage_tags":"Verwalten","title_not_found":"Nicht gefunden","title_permissions":"Berechtigungen","title_tag_manager":"Schlagworte (Nutzer entdecken)","topic_block_warning":"Möchten Sie diese Unterhaltung wirklich blockieren?","topic_delete_warning":"Möchten Sie diese Unterhaltung wirklich löschen?","topic_name_editing_placeholder":"Freiform Name der Gruppe","unnamed_topic":"Unbenannt","update_available":"Aktualisierung verfügbar.","upload_finishing":"wird abgeschlossen...","user_not_found":"Nicht gefunden","description_editing_placeholder":"Beschreibung (optional)","label_description":"Beschreibung","button_security":"Sicherheit","panel_title_general":"Allgemein","panel_title_security":"Sicherheit","panel_title_crop":"Zum Anpassen ziehen","panel_title_members":"Mitglieder","permissions_anonymous":"Anonym","permissions_authenticated":"Authentifiziert","topic_delete":"Chat löschen","permissions_user":"Benutzerberechtigungen","password_reset_email_sent":"Eine E-Mail mit Sicherheitscode wurde gesendet.","label_unarchive_topic":"Archiviert:","menu_item_reply":"Antwort","menu_item_forward":"Nach vorne","forward_to":"Weiterleiten","forward_to_search_placeholder":"Kontakte durchsuchen","label_new_password":"Neues Kennwort","drafty_unknown":"Nicht unterstützt","calls_incoming":"Eingehender Anruf","calls_outgoing":"Ausgehender Anruf","calls_you_label":"Du","menu_item_video_call":"Videoanruf","already_in_call":"Du redest schon!","call_cancelled":"abgebrochen","call_missed":"verpasster","call_declined":"abgelehnt","call_disconnected":"getrennt","label_use_secure_connection":"Verwenden Sie eine sichere Verbindung","cred_confirmed_successfully":"Erfolgreich bestätigt","menu_item_edit":"Bearbeiten","editing_message":"Bearbeitung","message_edited_marker":", bearbeitet","icon_title_add_image":"Bild hinzufügen","icon_title_attach_file":"Datei anhängen","icon_title_delete":"Aufnahme löschen","icon_title_pause":"Wiedergabe pausieren","icon_title_play":"Aufnahme abspielen","icon_title_record_voice":"Sprachnachricht aufnehmen","icon_title_resume":"Wiedergabe fortsetzen","icon_title_send":"Nachricht senden","drag_file":"Datei hierher ziehen","drafty_video":"Videoaufnahme","call_in_progress":"in Arbeit","menu_item_audio_call":"Anruf","unrecognized_video_format":"Das Format dieses Videos wird nicht erkannt","loading_note":"Laden...","password_i_have_code":"Ich habe Code","label_reset_password_tel":"SMS zum Zurücksetzen des Passworts senden","mobile_phone_number":"Mobiltelefonnummer","password_reset_sms_sent":"Eine SMS mit einem Sicherheitscode wurde gesendet.","mobile_number_required":"Handynummer erforderlich","current_email":"Aktuelle E-Mail","current_phone":"Aktuelle Telefonnummer","new_email":"Neue E-Mail","new_phone_number":"Neue Telefonnummer","change_email":"E-Mail ändern","change_phone":"Telefonnummer ändern","call_busy":"besetzt","failed_to_init_audio":"Audioaufnahme konnte nicht initialisiert werden","password_reset_success":"Passwort erfolgreich zurückgesetzt"}')}}]); \ No newline at end of file +"use strict";(globalThis.webpackChunktinode_webapp=globalThis.webpackChunktinode_webapp||[]).push([[92],{6092:e=>{e.exports=JSON.parse('{"action_block_contact":"Kontakt blockieren","action_cancel":"Abbrechen","action_clear_messages":"Nachrichten leeren","action_delete_messages":"Nachrichten für alle löschen","action_leave_chat":"Unterhaltung verlassen","action_report_chat":"Unterhaltung melden","archived_contacts":"Archivierte Kontakte ({count})","badge_danger":"Verdächtig","badge_owner":"Besitzer","badge_staff":"Verwaltung","badge_verified":"Verifiziert","badge_you":"Sie","block_contact_warning":"Möchten Sie diesen Kontakt wirklich blockieren?","blocked_contacts_link":"Blockierte Kontakte ({count})","button_add_members":"Mitglieder hinzufügen","button_cancel":"Abbrechen","button_confirm":"Bestätigen","button_create":"Erstellen","button_delete_account":"Konto löschen","button_edit":"Bearbeiten","button_logout":"Abmelden","button_ok":"OK","button_reset":"Zurücksetzen","button_send_request":"Anfrage senden","button_sign_in":"Anmelden","button_sign_up":"Anmelden","button_subscribe":"Abbonieren","button_update":"Aktualisieren","cannot_initiate_file_upload":"Datei kann nicht hochgeladen werden.","channel":"Sender","channel_prompt":"Dies ist ein Sender","chat_invitation":"Sie sind eingeladen, an einem neuen Chat teilzunehmen. Was möchten Sie tun?","chat_invitation_accept":"Akzeptieren","chat_invitation_block":"Blockieren","chat_invitation_ignore":"Ignorieren","clear_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle leeren wollen? Das kann nicht rückgängig gemacht werden.","code_doesnot_match":"Code stimmt nicht überein","contacts_not_found":"Sie haben keine Unterhaltungen
¯∖_(ツ)_/¯","contacts_not_found_short":"Keine Kontakte für \'\'{query}\'\'","credential_email_prompt":"E-Mail Adresse für Registrierung","delete_account":"Konto löschen","delete_account_warning":"Möchten Sie das Konto wirklich löschen? Das kann nicht rückgängig gemacht werden","delete_messages_warning":"Sind Sie sicher, dass Sie diese Unterhaltung für alle löschen wollen? Das kann nicht rückgängig gemacht werden.","download_action":"herunterladen","drafty_attachment":"Dateianhang","drafty_form":"Formular:","drafty_image":"Bild","email_dative":"E-Mail","email_prompt":"E-Mail, z.B. lisam@beispiel.de","enable_peers_messaging":"Aktivieren","enter_confirmation_code_prompt":"Geben Sie den Bestätigungscode ein, der per {method} geschickt wurde:","error_invalid_id":"ungültige ID","file_attachment_too_large":"Die Dateigröße {size} überschreitet das Limit von {limit}.","forgot_password_link":"Passwort vergessen?","full_name_prompt":"Vollständiger Name, z.B. Lisa Musterfrau","granted_permissions":"Erteilt","group_has_no_members":"Keine Mitglieder","group_user_id_prompt":"Gruppe oder Benutzer ID","image_caption_prompt":"Bildunterschrift","invalid_content":"ungültiger Inhalt","invalid_security_token":"Ungültiger Sicherheitsschlüssel","label_client":"Client:","label_content_type":"Inhaltsart:","label_default_access_mode":"Standard Zugriffsmodus:","label_file_name":"Dateiname:","label_group_members":"Gruppenmitglieder:","label_incognito_mode":"inkognito-Modus:","label_message_sound":"Benachrichtigungston:","label_muting_topic":"Stumm geschaltet:","label_other_user":"Andere","label_password":"Passwort","label_permissions":"Berechtigungen:","label_private":"Privater Kommentar","label_push_notifications":"Benachrichtigungsmeldungen:","label_push_notifications_disabled":"Benachrichtigungsmeldungen (erfordert HTTPS):","label_reset_password":"Passwort per E-Mail wiederherstellen:","label_sdk":"SDK:","label_server":"Server:","label_server_address":"Server Adresse:","label_server_to_use":"Server verwenden:","label_size":"Größe:","label_topic_name":"Name","label_user_contacts":"Kontakte","label_user_id":"ID:","label_wire_transport":"Übertragung per Kabel:","label_you":"Sie:","label_your_name":"Ihr Name","label_your_permissions":"Ihre Berechtigungen:","last_seen_timestamp":"Zuletzt gesehen","leave_chat_warning":"Möchten Sie diese Unterhaltung wirklich verlassen?","link_contact_us":"Kontakt","link_privacy_policy":"Datenschutzerklärung","link_terms_of_service":"Nutzungsbedingungen","login_prompt":"Anmelden","menu_item_archive_topic":"Archivieren","menu_item_block":"Blockieren","menu_item_clear_messages":"Nachrichten leeren","menu_item_clear_messages_for_all":"Für alle leeren","menu_item_delete":"Löschen","menu_item_delete_for_all":"Für alle löschen","menu_item_delete_topic":"Entfernen","menu_item_edit_permissions":"Berechtigungen ändern","menu_item_info":"Info","menu_item_member_delete":"Entfernen","menu_item_mute":"Unterhaltung stumm schalten","menu_item_restore_topic":"Wiederherstellen","menu_item_send_retry":"Wiederholen","menu_item_unblock":"Blockierung aufheben","menu_item_unmute":"Stumm schalten beenden","message_sending":"wird gesendet...","message_sending_failed":"fehlgeschlagen","messages_not_readable":"Neue Nachrichten können nicht gelesen werden","messaging_disabled_prompt":"Nachrichtenübermittlung deaktiviert","more_online_members":"+{overflow} mehr","new_message_prompt":"Neue Nachricht","new_password_placeholder":"Geben Sie ein neues Passwort ein","no_connection":"Keine Verbindung","no_contacts":"Sie haben keine Kontakte :-(","numeric_confirmation_code_prompt":"Nur zahlen","online_now":"jetzt online","password_prompt":"Passwort","password_unchanged_prompt":"unverändert","peers_messaging_disabled":"Gruppennachrichten sind deaktiviert","permission_admin":"Bestätigen ({val})","permission_delete":"Entfernen ({val})","permission_join":"Beitreten ({val})","permission_owner":"Besitzer ({val})","permission_pres":"Benachrichtigt werden ({val})","permission_read":"Lesen ({val})","permission_share":"Teilen ({val})","permission_write":"Schreiben ({val})","phone_dative":"Telefon","private_editing_placeholder":"Nur für Sie sichtbar","push_init_failed":"Initialisierung von Push-Benachrichtigungen fehlgeschlagen","reconnect_countdown":"Getrennt. Wiederverbinden in {seconds}…","reconnect_now":"Jetzt probieren","reload_update":"Neu laden","report_chat_warning":"Möchten Sie diese Unterhaltung wirklich blockieren und melden?","requested_permissions":"Angefordert","save_attachment":"Speichern","search_for_contacts":"Nutzen Sie die Suche um Kontakte zu finden","search_no_results":"Die Suche hatte keine Ergebnisse","search_placeholder":"Liste: email:lisa@beispiel.de, tel:17025550003...","sidepanel_title_acc_notifications":"Benachrichtigungen","sidepanel_title_acc_support":"Unterstützung","sidepanel_title_account_settings":"Konto-Einstellungen","sidepanel_title_archive":"Archivierte Unterhaltungen","sidepanel_title_blocked":"Blockierte Unterhaltungen","sidepanel_title_cred":"Anmeldeinformationen bestätigen","sidepanel_title_login":"Anmelden","sidepanel_title_newtpk":"Neue Unterhaltung starten","sidepanel_title_register":"Konto erstellen","sidepanel_title_reset":"Passwort zurücksetzen","sidepanel_title_settings":"Einstellungen","stay_logged_in":"Angemeldet bleiben","tabtitle_find_user":"Suchen","tabtitle_group_by_id":"nach ID","tabtitle_new_group":"Neue Gruppe","tags_editor_no_tags":"Schlagworte hinzufügen","tags_not_found":"Keine Schlagworte definiert. Erstellen Sie welche.","title_all_contacts":"Alle Kontakte","title_group_members":"Gruppenmitglieder","panel_title_info":"Info","title_manage_tags":"Verwalten","title_not_found":"Nicht gefunden","title_permissions":"Berechtigungen","title_tag_manager":"Schlagworte (Nutzer entdecken)","topic_block_warning":"Möchten Sie diese Unterhaltung wirklich blockieren?","topic_delete_warning":"Möchten Sie diese Unterhaltung wirklich löschen?","topic_name_editing_placeholder":"Freiform Name der Gruppe","unnamed_topic":"Unbenannt","update_available":"Aktualisierung verfügbar.","upload_finishing":"wird abgeschlossen...","user_not_found":"Nicht gefunden","description_editing_placeholder":"Beschreibung (optional)","label_description":"Beschreibung","button_security":"Sicherheit","panel_title_general":"Allgemein","panel_title_security":"Sicherheit","panel_title_crop":"Zum Anpassen ziehen","panel_title_members":"Mitglieder","permissions_anonymous":"Anonym","permissions_authenticated":"Authentifiziert","topic_delete":"Chat löschen","permissions_user":"Benutzerberechtigungen","password_reset_email_sent":"Eine E-Mail mit Sicherheitscode wurde gesendet.","label_unarchive_topic":"Archiviert:","menu_item_reply":"Antwort","menu_item_forward":"Nach vorne","forward_to":"Weiterleiten","forward_to_search_placeholder":"Kontakte durchsuchen","label_new_password":"Neues Kennwort","drafty_unknown":"Nicht unterstützt","calls_incoming":"Eingehender Anruf","calls_outgoing":"Ausgehender Anruf","calls_you_label":"Du","menu_item_video_call":"Videoanruf","already_in_call":"Du redest schon!","call_cancelled":"abgebrochen","call_missed":"verpasster","call_declined":"abgelehnt","call_disconnected":"getrennt","label_use_secure_connection":"Verwenden Sie eine sichere Verbindung","cred_confirmed_successfully":"Erfolgreich bestätigt","menu_item_edit":"Bearbeiten","editing_message":"Bearbeitung","message_edited_marker":", bearbeitet","icon_title_add_image":"Bild hinzufügen","icon_title_attach_file":"Datei anhängen","icon_title_delete":"Aufnahme löschen","icon_title_pause":"Wiedergabe pausieren","icon_title_play":"Aufnahme abspielen","icon_title_record_voice":"Sprachnachricht aufnehmen","icon_title_resume":"Wiedergabe fortsetzen","icon_title_send":"Nachricht senden","drag_file":"Datei hierher ziehen","drafty_video":"Videoaufnahme","call_in_progress":"in Arbeit","menu_item_audio_call":"Anruf","unrecognized_video_format":"Das Format dieses Videos wird nicht erkannt","loading_note":"Laden...","password_i_have_code":"Ich habe Code","label_reset_password_tel":"SMS zum Zurücksetzen des Passworts senden","mobile_phone_number":"Mobiltelefonnummer","password_reset_sms_sent":"Eine SMS mit einem Sicherheitscode wurde gesendet.","mobile_number_required":"Handynummer erforderlich","current_email":"Aktuelle E-Mail","current_phone":"Aktuelle Telefonnummer","new_email":"Neue E-Mail","new_phone_number":"Neue Telefonnummer","change_email":"E-Mail ändern","change_phone":"Telefonnummer ändern","call_busy":"besetzt","failed_to_init_audio":"Audioaufnahme konnte nicht initialisiert werden","calls_conference":"Telefonkonferenz","password_reset_success":"Passwort erfolgreich zurückgesetzt"}')}}]); \ No newline at end of file diff --git a/umd/932.prod.js b/umd/932.prod.js index 5d94aeef..3f4d081f 100644 --- a/umd/932.prod.js +++ b/umd/932.prod.js @@ -1 +1 @@ -"use strict";(globalThis.webpackChunktinode_webapp=globalThis.webpackChunktinode_webapp||[]).push([[932],{9932:e=>{e.exports=JSON.parse('{"action_block_contact":"Bloquear contacto","action_cancel":"cancelar","action_clear_messages":"Borrar mensajes","action_delete_messages":"Borrar mensajes para todos","action_leave_chat":"Dejar conversación","action_report_chat":"Reportar conversación","archived_contacts":"Contactos archivados ({count})","badge_danger":"Suspicaz","badge_owner":"propietario","badge_staff":"Administración","badge_verified":"Verificado","badge_you":"tú","block_contact_warning":"¿Estás seguro de que quieres bloquear a este contacto?","blocked_contacts_link":"Contactos bloqueados ({count})","button_add_members":"Añadir miembros","button_cancel":"Cancelar","button_confirm":"Confirmar","button_create":"Crear","button_delete_account":"Eliminar cuenta","button_edit":"Editar","button_logout":"Cerrar sesión","button_ok":"OK","button_reset":"Restablecer","button_send_request":"Enviar petición","button_sign_in":"Entrar","button_sign_up":"Regístrate","button_subscribe":"Suscribirse","button_update":"Actualizar","cannot_initiate_file_upload":"No se pudo iniciar la carga del archivo.","channel":"canal","channel_prompt":"Este es un canal","chat_invitation":"Estás invitado a participar en un nuevo chat. ¿Qué te gustaría hacer?","chat_invitation_accept":"Aceptar","chat_invitation_block":"Bloquear","chat_invitation_ignore":"Ignorar","clear_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes? Esta acción es irreversible.","code_doesnot_match":"El código no coincide","contacts_not_found":"No tienes chats
¯∖_(ツ)_/¯","contacts_not_found_short":"Ningún contacto coincide con \'\'{query}\'\'","credential_email_prompt":"Tu correo electrónico de registro","delete_account":"Eliminar cuenta","delete_account_warning":"¿Estás seguro de que deseas eliminar permanentemente tu cuenta? Esta acción es irreversible.","delete_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes para todos? Esta acción es irreversible.","download_action":"descargar","drafty_attachment":"Archivo","drafty_form":"Formulario:","drafty_image":"Imagen","email_dative":"correo electrónico","email_prompt":"Correo electrónico, p.ej. juan@example.com","enable_peers_messaging":"Habilitar","enter_confirmation_code_prompt":"Introduzca el código de confirmación enviado a tu {method}:","error_invalid_id":"ID inválido","file_attachment_too_large":"El tamaño del archivo {size} excede el límite de {limit}.","forgot_password_link":"¿Olvidaste tu contraseña?","full_name_prompt":"Nombre completo, p.ej. Juan González Hernández","granted_permissions":"Otorgados","group_has_no_members":"No hay miembros","group_user_id_prompt":"ID del grupo o usuario","image_caption_prompt":"Añade un comentario","invalid_content":"contenido inválido","invalid_security_token":"Token de seguridad inválido","label_client":"Cliente:","label_content_type":"Tipo de contenido:","label_default_access_mode":"Modo de acceso predeterminado:","label_file_name":"Nombre del archivo:","label_group_members":"Miembros del grupo:","label_incognito_mode":"Modo incógnito:","label_message_sound":"Sonido de mensaje:","label_muting_topic":"Silenciado:","label_other_user":"Otros","label_password":"Contraseña","label_permissions":"Permisos:","label_private":"Comentario privado","label_push_notifications":"Alertas de notificaciones:","label_push_notifications_disabled":"Alertas de notificaciones (requiere HTTPS):","label_reset_password":"Enviar un correo electrónico de restablecimiento de contraseña:","label_sdk":"SDK:","label_server":"Servidor:","label_server_address":"Dirección del servidor:","label_server_to_use":"Servidor para usar:","label_size":"Tamaño:","label_topic_name":"Nombre del tema","label_user_contacts":"Contactos","label_user_id":"ID:","label_wire_transport":"Transporte de alambre:","label_you":"Tú:","label_your_name":"Tu nombre","label_your_permissions":"Tus permisos:","last_seen_timestamp":"Últ. vez","leave_chat_warning":"¿Estás seguro de que quieres dejar esta conversación?","link_contact_us":"Contáctanos","link_privacy_policy":"Política de privacidad","link_terms_of_service":"Términos de uso","login_prompt":"Nombre de usuario","menu_item_archive_topic":"Archivar","menu_item_block":"Bloquear","menu_item_clear_messages":"Borrar mensajes","menu_item_clear_messages_for_all":"Borrar para todos","menu_item_delete":"Eliminar","menu_item_delete_for_all":"Eliminar para todos","menu_item_delete_topic":"Eliminar","menu_item_edit_permissions":"Editar permisos","menu_item_info":"Información","menu_item_member_delete":"Eliminar","menu_item_mute":"Silenciar","menu_item_restore_topic":"Restaurar","menu_item_send_retry":"Inténtalo de nuevo","menu_item_unblock":"Desbloquear","menu_item_unmute":"Anular el silencio","message_sending":"enviando...","message_sending_failed":"no se pudo enviar el mensaje","messages_not_readable":"sin acceso a mensajes","messaging_disabled_prompt":"El envío de mensajes está deshabilitado","more_online_members":"+{overflow} más","new_message_prompt":"Nuevo mensaje","new_password_placeholder":"Introduzca una nueva contraseña","no_connection":"Sin conexión","no_contacts":"No tienes contactos :-(","numeric_confirmation_code_prompt":"Sólo números","online_now":"en línea","password_prompt":"Contraseña","password_unchanged_prompt":"Sin cambios","peers_messaging_disabled":"La mensajería Peer está deshabilitada.","permission_admin":"Approbar ({val})","permission_delete":"Eliminar ({val})","permission_join":"Unirse ({val})","permission_owner":"Propietario ({val})","permission_pres":"Ser notificado ({val})","permission_read":"Leer ({val})","permission_share":"Compartir ({val})","permission_write":"Escribir ({val})","phone_dative":"teléfono","private_editing_placeholder":"Sólo visible para tí","push_init_failed":"Error al inicializar las notificaciones push","reconnect_countdown":"Desconectado. Reconectando en {seconds}…","reconnect_now":"Reintentar","reload_update":"Recargar","report_chat_warning":"¿Estás seguro de que quieres bloquear y reportar a esta conversación?","requested_permissions":"Solicitados","save_attachment":"guardar","search_for_contacts":"Usa la búsqueda para encontrar contactos","search_no_results":"La búsqueda no arrojó resultados","search_placeholder":"Ej. email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notificaciones","sidepanel_title_acc_support":"Soporte","sidepanel_title_account_settings":"Ajustes de la cuenta","sidepanel_title_archive":"Chats archivados","sidepanel_title_blocked":"Chats bloqueados","sidepanel_title_cred":"Confirmar credenciales","sidepanel_title_login":"Iniciar sesión","sidepanel_title_newtpk":"Iniciar un nuevo chat","sidepanel_title_register":"Crear cuenta","sidepanel_title_reset":"Restablecer contraseña","sidepanel_title_settings":"Ajustes","stay_logged_in":"Permanecer conectado","tabtitle_find_user":"encontrar","tabtitle_group_by_id":"por ID","tabtitle_new_group":"nuevo grupo","tags_editor_no_tags":"Añadir etiquetas","tags_not_found":"No hay etiquetas definidas. Añade unas.","title_all_contacts":"Todos los contactos","title_group_members":"Miembros del grupo","title_manage_tags":"Gestionar","title_not_found":"No encontrado","title_permissions":"Permisos","title_tag_manager":"Etiquetas (descubrimiento de usuarios)","topic_block_warning":"¿Estás seguro de que quieres bloquear esta conversación","topic_delete_warning":"¿Estás seguro de que quieres eliminar esta conversación?","topic_name_editing_placeholder":"Nombre del grupo","unnamed_topic":"Sin nombre","update_available":"Actualización disponible.","upload_finishing":"terminando...","user_not_found":"Usuario no encontrado","description_editing_placeholder":"Descripción (opcional)","label_description":"Descripción","button_security":"Seguridad","panel_title_crop":"Arrastra para ajustar","panel_title_general":"General","panel_title_members":"Miembros","panel_title_security":"Seguridad","panel_title_info":"Información","permissions_anonymous":"Anónimo","permissions_authenticated":"Autenticado","topic_delete":"Eliminar chat","permissions_user":"Permisos del usuario","password_reset_email_sent":"Se ha enviado un correo electrónico con el código de seguridad.","label_unarchive_topic":"Archivado:","menu_item_reply":"Respuesta","menu_item_forward":"Reenviar","forward_to":"Reenviar a","forward_to_search_placeholder":"Buscar contactos","label_new_password":"Nueva contraseña","drafty_unknown":"No soportado","calls_incoming":"Llamada entrante","calls_outgoing":"Llamada saliente","calls_you_label":"Tú","menu_item_video_call":"Videollamada","already_in_call":"¡Ya estás hablando!","call_cancelled":"cancelada","call_missed":"perdida","call_declined":"rechazada","call_disconnected":"desconectada","label_use_secure_connection":"Usar conexión segura","cred_confirmed_successfully":"Confirmado con éxito","menu_item_edit":"Editar","editing_message":"Edición","message_edited_marker":", editado","icon_title_add_image":"Añadir imagen","icon_title_attach_file":"Adjuntar archivo","icon_title_delete":"Eliminar grabación","icon_title_pause":"Pausar reproducción","icon_title_play":"Reproducir grabación","icon_title_record_voice":"Grabar mensaje de voz","icon_title_resume":"Reanudar la reproducción","icon_title_send":"Enviar mensaje","drag_file":"Arrastra el archivo aquí","drafty_video":"Grabación de vídeo","call_in_progress":"en progreso","menu_item_audio_call":"Llamada","unrecognized_video_format":"No se reconoce el formato de este video","loading_note":"Cargando...","password_i_have_code":"Tengo código","label_reset_password_tel":"Enviar SMS para restablecer la contraseña","mobile_phone_number":"Número de teléfono móvil","password_reset_sms_sent":"Se ha enviado un mensaje de texto con un código de seguridad.","mobile_number_required":"Número de teléfono móvil requerido","current_email":"Correo electrónico actual","current_phone":"Número de teléfono actual","new_email":"Nuevo correo electrónico","new_phone_number":"Nuevo número de teléfono","change_email":"Cambiar correo electrónico","change_phone":"Cambiar número de teléfono","call_busy":"ocupado","failed_to_init_audio":"Error al inicializar la grabación de audio","password_reset_success":"Restablecimiento de contraseña con éxito"}')}}]); \ No newline at end of file +"use strict";(globalThis.webpackChunktinode_webapp=globalThis.webpackChunktinode_webapp||[]).push([[932],{9932:e=>{e.exports=JSON.parse('{"action_block_contact":"Bloquear contacto","action_cancel":"cancelar","action_clear_messages":"Borrar mensajes","action_delete_messages":"Borrar mensajes para todos","action_leave_chat":"Dejar conversación","action_report_chat":"Reportar conversación","archived_contacts":"Contactos archivados ({count})","badge_danger":"Suspicaz","badge_owner":"propietario","badge_staff":"Administración","badge_verified":"Verificado","badge_you":"tú","block_contact_warning":"¿Estás seguro de que quieres bloquear a este contacto?","blocked_contacts_link":"Contactos bloqueados ({count})","button_add_members":"Añadir miembros","button_cancel":"Cancelar","button_confirm":"Confirmar","button_create":"Crear","button_delete_account":"Eliminar cuenta","button_edit":"Editar","button_logout":"Cerrar sesión","button_ok":"OK","button_reset":"Restablecer","button_send_request":"Enviar petición","button_sign_in":"Entrar","button_sign_up":"Regístrate","button_subscribe":"Suscribirse","button_update":"Actualizar","cannot_initiate_file_upload":"No se pudo iniciar la carga del archivo.","channel":"canal","channel_prompt":"Este es un canal","chat_invitation":"Estás invitado a participar en un nuevo chat. ¿Qué te gustaría hacer?","chat_invitation_accept":"Aceptar","chat_invitation_block":"Bloquear","chat_invitation_ignore":"Ignorar","clear_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes? Esta acción es irreversible.","code_doesnot_match":"El código no coincide","contacts_not_found":"No tienes chats
¯∖_(ツ)_/¯","contacts_not_found_short":"Ningún contacto coincide con \'\'{query}\'\'","credential_email_prompt":"Tu correo electrónico de registro","delete_account":"Eliminar cuenta","delete_account_warning":"¿Estás seguro de que deseas eliminar permanentemente tu cuenta? Esta acción es irreversible.","delete_messages_warning":"¿Estás seguro de que quieres eliminar todos los mensajes para todos? Esta acción es irreversible.","download_action":"descargar","drafty_attachment":"Archivo","drafty_form":"Formulario:","drafty_image":"Imagen","email_dative":"correo electrónico","email_prompt":"Correo electrónico, p.ej. juan@example.com","enable_peers_messaging":"Habilitar","enter_confirmation_code_prompt":"Introduzca el código de confirmación enviado a tu {method}:","error_invalid_id":"ID inválido","file_attachment_too_large":"El tamaño del archivo {size} excede el límite de {limit}.","forgot_password_link":"¿Olvidaste tu contraseña?","full_name_prompt":"Nombre completo, p.ej. Juan González Hernández","granted_permissions":"Otorgados","group_has_no_members":"No hay miembros","group_user_id_prompt":"ID del grupo o usuario","image_caption_prompt":"Añade un comentario","invalid_content":"contenido inválido","invalid_security_token":"Token de seguridad inválido","label_client":"Cliente:","label_content_type":"Tipo de contenido:","label_default_access_mode":"Modo de acceso predeterminado:","label_file_name":"Nombre del archivo:","label_group_members":"Miembros del grupo:","label_incognito_mode":"Modo incógnito:","label_message_sound":"Sonido de mensaje:","label_muting_topic":"Silenciado:","label_other_user":"Otros","label_password":"Contraseña","label_permissions":"Permisos:","label_private":"Comentario privado","label_push_notifications":"Alertas de notificaciones:","label_push_notifications_disabled":"Alertas de notificaciones (requiere HTTPS):","label_reset_password":"Enviar un correo electrónico de restablecimiento de contraseña:","label_sdk":"SDK:","label_server":"Servidor:","label_server_address":"Dirección del servidor:","label_server_to_use":"Servidor para usar:","label_size":"Tamaño:","label_topic_name":"Nombre del tema","label_user_contacts":"Contactos","label_user_id":"ID:","label_wire_transport":"Transporte de alambre:","label_you":"Tú:","label_your_name":"Tu nombre","label_your_permissions":"Tus permisos:","last_seen_timestamp":"Últ. vez","leave_chat_warning":"¿Estás seguro de que quieres dejar esta conversación?","link_contact_us":"Contáctanos","link_privacy_policy":"Política de privacidad","link_terms_of_service":"Términos de uso","login_prompt":"Nombre de usuario","menu_item_archive_topic":"Archivar","menu_item_block":"Bloquear","menu_item_clear_messages":"Borrar mensajes","menu_item_clear_messages_for_all":"Borrar para todos","menu_item_delete":"Eliminar","menu_item_delete_for_all":"Eliminar para todos","menu_item_delete_topic":"Eliminar","menu_item_edit_permissions":"Editar permisos","menu_item_info":"Información","menu_item_member_delete":"Eliminar","menu_item_mute":"Silenciar","menu_item_restore_topic":"Restaurar","menu_item_send_retry":"Inténtalo de nuevo","menu_item_unblock":"Desbloquear","menu_item_unmute":"Anular el silencio","message_sending":"enviando...","message_sending_failed":"no se pudo enviar el mensaje","messages_not_readable":"sin acceso a mensajes","messaging_disabled_prompt":"El envío de mensajes está deshabilitado","more_online_members":"+{overflow} más","new_message_prompt":"Nuevo mensaje","new_password_placeholder":"Introduzca una nueva contraseña","no_connection":"Sin conexión","no_contacts":"No tienes contactos :-(","numeric_confirmation_code_prompt":"Sólo números","online_now":"en línea","password_prompt":"Contraseña","password_unchanged_prompt":"Sin cambios","peers_messaging_disabled":"La mensajería Peer está deshabilitada.","permission_admin":"Approbar ({val})","permission_delete":"Eliminar ({val})","permission_join":"Unirse ({val})","permission_owner":"Propietario ({val})","permission_pres":"Ser notificado ({val})","permission_read":"Leer ({val})","permission_share":"Compartir ({val})","permission_write":"Escribir ({val})","phone_dative":"teléfono","private_editing_placeholder":"Sólo visible para tí","push_init_failed":"Error al inicializar las notificaciones push","reconnect_countdown":"Desconectado. Reconectando en {seconds}…","reconnect_now":"Reintentar","reload_update":"Recargar","report_chat_warning":"¿Estás seguro de que quieres bloquear y reportar a esta conversación?","requested_permissions":"Solicitados","save_attachment":"guardar","search_for_contacts":"Usa la búsqueda para encontrar contactos","search_no_results":"La búsqueda no arrojó resultados","search_placeholder":"Ej. email:alice@example.com, tel:17025550003...","sidepanel_title_acc_notifications":"Notificaciones","sidepanel_title_acc_support":"Soporte","sidepanel_title_account_settings":"Ajustes de la cuenta","sidepanel_title_archive":"Chats archivados","sidepanel_title_blocked":"Chats bloqueados","sidepanel_title_cred":"Confirmar credenciales","sidepanel_title_login":"Iniciar sesión","sidepanel_title_newtpk":"Iniciar un nuevo chat","sidepanel_title_register":"Crear cuenta","sidepanel_title_reset":"Restablecer contraseña","sidepanel_title_settings":"Ajustes","stay_logged_in":"Permanecer conectado","tabtitle_find_user":"encontrar","tabtitle_group_by_id":"por ID","tabtitle_new_group":"nuevo grupo","tags_editor_no_tags":"Añadir etiquetas","tags_not_found":"No hay etiquetas definidas. Añade unas.","title_all_contacts":"Todos los contactos","title_group_members":"Miembros del grupo","title_manage_tags":"Gestionar","title_not_found":"No encontrado","title_permissions":"Permisos","title_tag_manager":"Etiquetas (descubrimiento de usuarios)","topic_block_warning":"¿Estás seguro de que quieres bloquear esta conversación","topic_delete_warning":"¿Estás seguro de que quieres eliminar esta conversación?","topic_name_editing_placeholder":"Nombre del grupo","unnamed_topic":"Sin nombre","update_available":"Actualización disponible.","upload_finishing":"terminando...","user_not_found":"Usuario no encontrado","description_editing_placeholder":"Descripción (opcional)","label_description":"Descripción","button_security":"Seguridad","panel_title_crop":"Arrastra para ajustar","panel_title_general":"General","panel_title_members":"Miembros","panel_title_security":"Seguridad","panel_title_info":"Información","permissions_anonymous":"Anónimo","permissions_authenticated":"Autenticado","topic_delete":"Eliminar chat","permissions_user":"Permisos del usuario","password_reset_email_sent":"Se ha enviado un correo electrónico con el código de seguridad.","label_unarchive_topic":"Archivado:","menu_item_reply":"Respuesta","menu_item_forward":"Reenviar","forward_to":"Reenviar a","forward_to_search_placeholder":"Buscar contactos","label_new_password":"Nueva contraseña","drafty_unknown":"No soportado","calls_incoming":"Llamada entrante","calls_outgoing":"Llamada saliente","calls_you_label":"Tú","menu_item_video_call":"Videollamada","already_in_call":"¡Ya estás hablando!","call_cancelled":"cancelada","call_missed":"perdida","call_declined":"rechazada","call_disconnected":"desconectada","label_use_secure_connection":"Usar conexión segura","cred_confirmed_successfully":"Confirmado con éxito","menu_item_edit":"Editar","editing_message":"Edición","message_edited_marker":", editado","icon_title_add_image":"Añadir imagen","icon_title_attach_file":"Adjuntar archivo","icon_title_delete":"Eliminar grabación","icon_title_pause":"Pausar reproducción","icon_title_play":"Reproducir grabación","icon_title_record_voice":"Grabar mensaje de voz","icon_title_resume":"Reanudar la reproducción","icon_title_send":"Enviar mensaje","drag_file":"Arrastra el archivo aquí","drafty_video":"Grabación de vídeo","call_in_progress":"en progreso","menu_item_audio_call":"Llamada","unrecognized_video_format":"No se reconoce el formato de este video","loading_note":"Cargando...","password_i_have_code":"Tengo código","label_reset_password_tel":"Enviar SMS para restablecer la contraseña","mobile_phone_number":"Número de teléfono móvil","password_reset_sms_sent":"Se ha enviado un mensaje de texto con un código de seguridad.","mobile_number_required":"Número de teléfono móvil requerido","current_email":"Correo electrónico actual","current_phone":"Número de teléfono actual","new_email":"Nuevo correo electrónico","new_phone_number":"Nuevo número de teléfono","change_email":"Cambiar correo electrónico","change_phone":"Cambiar número de teléfono","call_busy":"ocupado","failed_to_init_audio":"Error al inicializar la grabación de audio","calls_conference":"Conferencia","password_reset_success":"Restablecimiento de contraseña con éxito"}')}}]); \ No newline at end of file diff --git a/umd/index.dev.js b/umd/index.dev.js index 3e984299..5cbcb372 100644 --- a/umd/index.dev.js +++ b/umd/index.dev.js @@ -10390,7 +10390,15 @@ __webpack_require__.r(__webpack_exports__); class CallMessage extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) { render() { - const bigIcon = this.props.vc ? 'video_call' : 'call'; + const bigIcon = this.props.vc ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "composed-material" + }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { + className: "material-icons gray second-small" + }, "group"), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { + className: "material-icons gray big outline" + }, "call")) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { + className: "material-icons big gray" + }, "call")); const isCallDropped = ['busy', 'declined', 'disconnected', 'missed'].includes(this.props.callState); const successClass = 'material-icons medium ' + (isCallDropped ? 'red' : 'green'); const callIcon = this.props.incoming ? isCallDropped ? 'call_missed' : 'call_received' : isCallDropped ? 'call_missed_outgoing' : 'call_made'; @@ -10475,7 +10483,13 @@ class CallMessage extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComp className: successClass }, callIcon), " ", duration), allowJoin ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", { onClick: this.props.onCallJoin - }, "Join") : null)); + }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, { + id: "join_conference", + defaultMessage: [{ + "type": 0, + "value": "+ Join" + }] + })) : null)); } } @@ -13909,7 +13923,7 @@ class InlineVideo extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComp }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement('img', this.props), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "play-control" }, this.props.onClick ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { - className: "material-icons white bigger" + className: "material-icons white x-big" }, "play_arrow") : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", { src: "img/broken_video.png", style: { @@ -16503,9 +16517,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var livekit_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! livekit-client */ "./node_modules/livekit-client/dist/livekit-client.esm.mjs"); -/* harmony import */ var _letter_tile_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./letter-tile.jsx */ "./src/widgets/letter-tile.jsx"); - +/* harmony import */ var _letter_tile_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./letter-tile.jsx */ "./src/widgets/letter-tile.jsx"); class VCCarouselItem extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) { @@ -16569,7 +16581,7 @@ class VCCarouselItem extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureC className: "material-icons muted" }, "mic_off") : null, cameraPub && cameraPub.isMuted ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "avatar-box carousel-item" - }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_letter_tile_jsx__WEBPACK_IMPORTED_MODULE_2__["default"], { + }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_letter_tile_jsx__WEBPACK_IMPORTED_MODULE_1__["default"], { tinode: this.props.tinode, avatar: this.props.photo, topic: this.props.identity, @@ -16594,11 +16606,10 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var livekit_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! livekit-client */ "./node_modules/livekit-client/dist/livekit-client.esm.mjs"); -/* harmony import */ var _letter_tile_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./letter-tile.jsx */ "./src/widgets/letter-tile.jsx"); -/* harmony import */ var _vc_carousel_item_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./vc-carousel-item.jsx */ "./src/widgets/vc-carousel-item.jsx"); -/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants.js */ "./src/constants.js"); - +/* harmony import */ var livekit_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! livekit-client */ "livekit-client"); +/* harmony import */ var livekit_client__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(livekit_client__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _vc_carousel_item_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./vc-carousel-item.jsx */ "./src/widgets/vc-carousel-item.jsx"); +/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../constants.js */ "./src/constants.js"); @@ -16614,7 +16625,7 @@ class VCCarousel extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component this.nextRef = react__WEBPACK_IMPORTED_MODULE_0___default().createRef(); } handlePrevClick() { - const gap = _constants_js__WEBPACK_IMPORTED_MODULE_4__.VC_CAROUSEL_ITEM_GAP; + const gap = _constants_js__WEBPACK_IMPORTED_MODULE_3__.VC_CAROUSEL_ITEM_GAP; const width = this.carouselRef.current.offsetWidth; this.carouselRef.current.scrollBy(-(width + gap), 0); if (this.carouselRef.current.scrollLeft - width - gap <= 0) { @@ -16625,7 +16636,7 @@ class VCCarousel extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component } } handleNextClick() { - const gap = _constants_js__WEBPACK_IMPORTED_MODULE_4__.VC_CAROUSEL_ITEM_GAP; + const gap = _constants_js__WEBPACK_IMPORTED_MODULE_3__.VC_CAROUSEL_ITEM_GAP; const width = this.carouselRef.current.offsetWidth; this.carouselRef.current.scrollBy(width + gap, 0); if (this.carouselRef.current.scrollWidth !== 0) { @@ -16643,7 +16654,7 @@ class VCCarousel extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component const participant = party.participant; const cameraPub = participant.getTrack(livekit_client__WEBPACK_IMPORTED_MODULE_1__.Track.Source.Camera); const micPub = participant.getTrack(livekit_client__WEBPACK_IMPORTED_MODULE_1__.Track.Source.Microphone); - peers.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_vc_carousel_item_jsx__WEBPACK_IMPORTED_MODULE_3__["default"], { + peers.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_vc_carousel_item_jsx__WEBPACK_IMPORTED_MODULE_2__["default"], { tinode: this.props.tinode, isSpeaking: participant.isSpeaking, cameraPub: cameraPub ? cameraPub : null, @@ -16711,7 +16722,8 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl"); /* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var livekit_client__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! livekit-client */ "./node_modules/livekit-client/dist/livekit-client.esm.mjs"); +/* harmony import */ var livekit_client__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! livekit-client */ "livekit-client"); +/* harmony import */ var livekit_client__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(livekit_client__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _letter_tile_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./letter-tile.jsx */ "./src/widgets/letter-tile.jsx"); /* harmony import */ var _vc_carousel_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./vc-carousel.jsx */ "./src/widgets/vc-carousel.jsx"); /* harmony import */ var _lib_blob_helpers_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/blob-helpers.js */ "./src/lib/blob-helpers.js"); @@ -17332,6 +17344,16 @@ if (false) {} else { } +/***/ }), + +/***/ "livekit-client": +/*!********************************!*\ + !*** external "LivekitClient" ***! + \********************************/ +/***/ ((module) => { + +module.exports = LivekitClient; + /***/ }), /***/ "react": @@ -22447,23909 +22469,6 @@ const unwrap = (value) => reverseTransformCache.get(value); -/***/ }), - -/***/ "./node_modules/livekit-client/dist/livekit-client.esm.mjs": -/*!*****************************************************************!*\ - !*** ./node_modules/livekit-client/dist/livekit-client.esm.mjs ***! - \*****************************************************************/ -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ AudioPresets: () => (/* binding */ AudioPresets), -/* harmony export */ ConnectionCheck: () => (/* binding */ ConnectionCheck), -/* harmony export */ ConnectionError: () => (/* binding */ ConnectionError), -/* harmony export */ ConnectionQuality: () => (/* binding */ ConnectionQuality), -/* harmony export */ ConnectionState: () => (/* binding */ ConnectionState), -/* harmony export */ CriticalTimers: () => (/* binding */ CriticalTimers), -/* harmony export */ DataPacket_Kind: () => (/* binding */ DataPacket_Kind), -/* harmony export */ DefaultReconnectPolicy: () => (/* binding */ DefaultReconnectPolicy), -/* harmony export */ DeviceUnsupportedError: () => (/* binding */ DeviceUnsupportedError), -/* harmony export */ DisconnectReason: () => (/* binding */ DisconnectReason), -/* harmony export */ EngineEvent: () => (/* binding */ EngineEvent), -/* harmony export */ LivekitError: () => (/* binding */ LivekitError), -/* harmony export */ LocalAudioTrack: () => (/* binding */ LocalAudioTrack), -/* harmony export */ LocalParticipant: () => (/* binding */ LocalParticipant), -/* harmony export */ LocalTrack: () => (/* binding */ LocalTrack), -/* harmony export */ LocalTrackPublication: () => (/* binding */ LocalTrackPublication), -/* harmony export */ LocalVideoTrack: () => (/* binding */ LocalVideoTrack), -/* harmony export */ LogLevel: () => (/* binding */ LogLevel), -/* harmony export */ MediaDeviceFailure: () => (/* binding */ MediaDeviceFailure), -/* harmony export */ NegotiationError: () => (/* binding */ NegotiationError), -/* harmony export */ Participant: () => (/* binding */ Participant), -/* harmony export */ ParticipantEvent: () => (/* binding */ ParticipantEvent), -/* harmony export */ PublishDataError: () => (/* binding */ PublishDataError), -/* harmony export */ RemoteAudioTrack: () => (/* binding */ RemoteAudioTrack), -/* harmony export */ RemoteParticipant: () => (/* binding */ RemoteParticipant), -/* harmony export */ RemoteTrack: () => (/* binding */ RemoteTrack), -/* harmony export */ RemoteTrackPublication: () => (/* binding */ RemoteTrackPublication), -/* harmony export */ RemoteVideoTrack: () => (/* binding */ RemoteVideoTrack), -/* harmony export */ Room: () => (/* binding */ Room), -/* harmony export */ RoomEvent: () => (/* binding */ RoomEvent), -/* harmony export */ RoomState: () => (/* binding */ RoomState), -/* harmony export */ ScreenSharePresets: () => (/* binding */ ScreenSharePresets), -/* harmony export */ Track: () => (/* binding */ Track), -/* harmony export */ TrackEvent: () => (/* binding */ TrackEvent), -/* harmony export */ TrackInvalidError: () => (/* binding */ TrackInvalidError), -/* harmony export */ TrackPublication: () => (/* binding */ TrackPublication), -/* harmony export */ UnexpectedConnectionState: () => (/* binding */ UnexpectedConnectionState), -/* harmony export */ UnsupportedServer: () => (/* binding */ UnsupportedServer), -/* harmony export */ VideoPreset: () => (/* binding */ VideoPreset), -/* harmony export */ VideoPresets: () => (/* binding */ VideoPresets), -/* harmony export */ VideoPresets43: () => (/* binding */ VideoPresets43), -/* harmony export */ VideoQuality: () => (/* binding */ VideoQuality), -/* harmony export */ attachToElement: () => (/* binding */ attachToElement), -/* harmony export */ createAudioAnalyser: () => (/* binding */ createAudioAnalyser), -/* harmony export */ createLocalAudioTrack: () => (/* binding */ createLocalAudioTrack), -/* harmony export */ createLocalScreenTracks: () => (/* binding */ createLocalScreenTracks), -/* harmony export */ createLocalTracks: () => (/* binding */ createLocalTracks), -/* harmony export */ createLocalVideoTrack: () => (/* binding */ createLocalVideoTrack), -/* harmony export */ detachTrack: () => (/* binding */ detachTrack), -/* harmony export */ getEmptyAudioStreamTrack: () => (/* binding */ getEmptyAudioStreamTrack), -/* harmony export */ getEmptyVideoStreamTrack: () => (/* binding */ getEmptyVideoStreamTrack), -/* harmony export */ isBackupCodec: () => (/* binding */ isBackupCodec), -/* harmony export */ isBrowserSupported: () => (/* binding */ isBrowserSupported), -/* harmony export */ isCodecEqual: () => (/* binding */ isCodecEqual), -/* harmony export */ protocolVersion: () => (/* binding */ protocolVersion), -/* harmony export */ setLogExtension: () => (/* binding */ setLogExtension), -/* harmony export */ setLogLevel: () => (/* binding */ setLogLevel), -/* harmony export */ supportsAV1: () => (/* binding */ supportsAV1), -/* harmony export */ supportsAdaptiveStream: () => (/* binding */ supportsAdaptiveStream), -/* harmony export */ supportsDynacast: () => (/* binding */ supportsDynacast), -/* harmony export */ supportsVP9: () => (/* binding */ supportsVP9), -/* harmony export */ version: () => (/* binding */ version) -/* harmony export */ }); -function _mergeNamespaces(n, m) { - m.forEach(function (e) { - e && typeof e !== 'string' && !Array.isArray(e) && Object.keys(e).forEach(function (k) { - if (k !== 'default' && !(k in n)) { - var d = Object.getOwnPropertyDescriptor(e, k); - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: function () { return e[k]; } - }); - } - }); - }); - return Object.freeze(n); -} - -var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; - -function getDefaultExportFromCjs (x) { - return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; -} - -var loglevel = {exports: {}}; - -/* -* loglevel - https://github.com/pimterry/loglevel -* -* Copyright (c) 2013 Tim Perry -* Licensed under the MIT license. -*/ -(function (module) { - (function (root, definition) { - - if (module.exports) { - module.exports = definition(); - } else { - root.log = definition(); - } - })(commonjsGlobal, function () { - - // Slightly dubious tricks to cut down minimized file size - var noop = function () {}; - var undefinedType = "undefined"; - var isIE = typeof window !== undefinedType && typeof window.navigator !== undefinedType && /Trident\/|MSIE /.test(window.navigator.userAgent); - var logMethods = ["trace", "debug", "info", "warn", "error"]; - - // Cross-browser bind equivalent that works at least back to IE6 - function bindMethod(obj, methodName) { - var method = obj[methodName]; - if (typeof method.bind === 'function') { - return method.bind(obj); - } else { - try { - return Function.prototype.bind.call(method, obj); - } catch (e) { - // Missing bind shim or IE8 + Modernizr, fallback to wrapping - return function () { - return Function.prototype.apply.apply(method, [obj, arguments]); - }; - } - } - } - - // Trace() doesn't print the message in IE, so for that case we need to wrap it - function traceForIE() { - if (console.log) { - if (console.log.apply) { - console.log.apply(console, arguments); - } else { - // In old IE, native console methods themselves don't have apply(). - Function.prototype.apply.apply(console.log, [console, arguments]); - } - } - if (console.trace) console.trace(); - } - - // Build the best logging method possible for this env - // Wherever possible we want to bind, not wrap, to preserve stack traces - function realMethod(methodName) { - if (methodName === 'debug') { - methodName = 'log'; - } - if (typeof console === undefinedType) { - return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives - } else if (methodName === 'trace' && isIE) { - return traceForIE; - } else if (console[methodName] !== undefined) { - return bindMethod(console, methodName); - } else if (console.log !== undefined) { - return bindMethod(console, 'log'); - } else { - return noop; - } - } - - // These private functions always need `this` to be set properly - - function replaceLoggingMethods(level, loggerName) { - /*jshint validthis:true */ - for (var i = 0; i < logMethods.length; i++) { - var methodName = logMethods[i]; - this[methodName] = i < level ? noop : this.methodFactory(methodName, level, loggerName); - } - - // Define log.log as an alias for log.debug - this.log = this.debug; - } - - // In old IE versions, the console isn't present until you first open it. - // We build realMethod() replacements here that regenerate logging methods - function enableLoggingWhenConsoleArrives(methodName, level, loggerName) { - return function () { - if (typeof console !== undefinedType) { - replaceLoggingMethods.call(this, level, loggerName); - this[methodName].apply(this, arguments); - } - }; - } - - // By default, we use closely bound real methods wherever possible, and - // otherwise we wait for a console to appear, and then try again. - function defaultMethodFactory(methodName, level, loggerName) { - /*jshint validthis:true */ - return realMethod(methodName) || enableLoggingWhenConsoleArrives.apply(this, arguments); - } - function Logger(name, defaultLevel, factory) { - var self = this; - var currentLevel; - defaultLevel = defaultLevel == null ? "WARN" : defaultLevel; - var storageKey = "loglevel"; - if (typeof name === "string") { - storageKey += ":" + name; - } else if (typeof name === "symbol") { - storageKey = undefined; - } - function persistLevelIfPossible(levelNum) { - var levelName = (logMethods[levelNum] || 'silent').toUpperCase(); - if (typeof window === undefinedType || !storageKey) return; - - // Use localStorage if available - try { - window.localStorage[storageKey] = levelName; - return; - } catch (ignore) {} - - // Use session cookie as fallback - try { - window.document.cookie = encodeURIComponent(storageKey) + "=" + levelName + ";"; - } catch (ignore) {} - } - function getPersistedLevel() { - var storedLevel; - if (typeof window === undefinedType || !storageKey) return; - try { - storedLevel = window.localStorage[storageKey]; - } catch (ignore) {} - - // Fallback to cookies if local storage gives us nothing - if (typeof storedLevel === undefinedType) { - try { - var cookie = window.document.cookie; - var location = cookie.indexOf(encodeURIComponent(storageKey) + "="); - if (location !== -1) { - storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1]; - } - } catch (ignore) {} - } - - // If the stored level is not valid, treat it as if nothing was stored. - if (self.levels[storedLevel] === undefined) { - storedLevel = undefined; - } - return storedLevel; - } - function clearPersistedLevel() { - if (typeof window === undefinedType || !storageKey) return; - - // Use localStorage if available - try { - window.localStorage.removeItem(storageKey); - return; - } catch (ignore) {} - - // Use session cookie as fallback - try { - window.document.cookie = encodeURIComponent(storageKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC"; - } catch (ignore) {} - } - - /* - * - * Public logger API - see https://github.com/pimterry/loglevel for details - * - */ - - self.name = name; - self.levels = { - "TRACE": 0, - "DEBUG": 1, - "INFO": 2, - "WARN": 3, - "ERROR": 4, - "SILENT": 5 - }; - self.methodFactory = factory || defaultMethodFactory; - self.getLevel = function () { - return currentLevel; - }; - self.setLevel = function (level, persist) { - if (typeof level === "string" && self.levels[level.toUpperCase()] !== undefined) { - level = self.levels[level.toUpperCase()]; - } - if (typeof level === "number" && level >= 0 && level <= self.levels.SILENT) { - currentLevel = level; - if (persist !== false) { - // defaults to true - persistLevelIfPossible(level); - } - replaceLoggingMethods.call(self, level, name); - if (typeof console === undefinedType && level < self.levels.SILENT) { - return "No console available for logging"; - } - } else { - throw "log.setLevel() called with invalid level: " + level; - } - }; - self.setDefaultLevel = function (level) { - defaultLevel = level; - if (!getPersistedLevel()) { - self.setLevel(level, false); - } - }; - self.resetLevel = function () { - self.setLevel(defaultLevel, false); - clearPersistedLevel(); - }; - self.enableAll = function (persist) { - self.setLevel(self.levels.TRACE, persist); - }; - self.disableAll = function (persist) { - self.setLevel(self.levels.SILENT, persist); - }; - - // Initialize with the right level - var initialLevel = getPersistedLevel(); - if (initialLevel == null) { - initialLevel = defaultLevel; - } - self.setLevel(initialLevel, false); - } - - /* - * - * Top-level API - * - */ - - var defaultLogger = new Logger(); - var _loggersByName = {}; - defaultLogger.getLogger = function getLogger(name) { - if (typeof name !== "symbol" && typeof name !== "string" || name === "") { - throw new TypeError("You must supply a name when creating a logger."); - } - var logger = _loggersByName[name]; - if (!logger) { - logger = _loggersByName[name] = new Logger(name, defaultLogger.getLevel(), defaultLogger.methodFactory); - } - return logger; - }; - - // Grab the current global log variable in case of overwrite - var _log = typeof window !== undefinedType ? window.log : undefined; - defaultLogger.noConflict = function () { - if (typeof window !== undefinedType && window.log === defaultLogger) { - window.log = _log; - } - return defaultLogger; - }; - defaultLogger.getLoggers = function getLoggers() { - return _loggersByName; - }; - - // ES6 default export, for compatibility - defaultLogger['default'] = defaultLogger; - return defaultLogger; - }); -})(loglevel); -var loglevelExports = loglevel.exports; - -var LogLevel; -(function (LogLevel) { - LogLevel[LogLevel["trace"] = 0] = "trace"; - LogLevel[LogLevel["debug"] = 1] = "debug"; - LogLevel[LogLevel["info"] = 2] = "info"; - LogLevel[LogLevel["warn"] = 3] = "warn"; - LogLevel[LogLevel["error"] = 4] = "error"; - LogLevel[LogLevel["silent"] = 5] = "silent"; -})(LogLevel || (LogLevel = {})); -const livekitLogger = loglevelExports.getLogger('livekit'); -livekitLogger.setLevel(LogLevel.info); -function setLogLevel(level) { - livekitLogger.setLevel(level); -} -/** - * use this to hook into the logging function to allow sending internal livekit logs to third party services - * if set, the browser logs will lose their stacktrace information (see https://github.com/pimterry/loglevel#writing-plugins) - */ -function setLogExtension(extension) { - const originalFactory = livekitLogger.methodFactory; - livekitLogger.methodFactory = (methodName, logLevel, loggerName) => { - const rawMethod = originalFactory(methodName, logLevel, loggerName); - const configLevel = livekitLogger.getLevel(); - const needLog = logLevel >= configLevel && logLevel < LogLevel.silent; - return (msg, context) => { - if (context) rawMethod(msg, context);else rawMethod(msg); - if (needLog) { - extension(logLevel, msg, context); - } - }; - }; - livekitLogger.setLevel(livekitLogger.getLevel()); // Be sure to call setLevel method in order to apply plugin -} - -var long = Long; - -/** - * wasm optimizations, to do native i64 multiplication and divide - */ -var wasm = null; -try { - wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11])), {}).exports; -} catch (e) { - // no wasm support :( -} - -/** - * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers. - * See the from* functions below for more convenient ways of constructing Longs. - * @exports Long - * @class A Long class for representing a 64 bit two's-complement integer value. - * @param {number} low The low (signed) 32 bits of the long - * @param {number} high The high (signed) 32 bits of the long - * @param {boolean=} unsigned Whether unsigned or not, defaults to signed - * @constructor - */ -function Long(low, high, unsigned) { - /** - * The low 32 bits as a signed value. - * @type {number} - */ - this.low = low | 0; - - /** - * The high 32 bits as a signed value. - * @type {number} - */ - this.high = high | 0; - - /** - * Whether unsigned or not. - * @type {boolean} - */ - this.unsigned = !!unsigned; -} - -// The internal representation of a long is the two given signed, 32-bit values. -// We use 32-bit pieces because these are the size of integers on which -// Javascript performs bit-operations. For operations like addition and -// multiplication, we split each number into 16 bit pieces, which can easily be -// multiplied within Javascript's floating-point representation without overflow -// or change in sign. -// -// In the algorithms below, we frequently reduce the negative case to the -// positive case by negating the input(s) and then post-processing the result. -// Note that we must ALWAYS check specially whether those values are MIN_VALUE -// (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as -// a positive number, it overflows back into a negative). Not handling this -// case would often result in infinite recursion. -// -// Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from* -// methods on which they depend. - -/** - * An indicator used to reliably determine if an object is a Long or not. - * @type {boolean} - * @const - * @private - */ -Long.prototype.__isLong__; -Object.defineProperty(Long.prototype, "__isLong__", { - value: true -}); - -/** - * @function - * @param {*} obj Object - * @returns {boolean} - * @inner - */ -function isLong(obj) { - return (obj && obj["__isLong__"]) === true; -} - -/** - * Tests if the specified object is a Long. - * @function - * @param {*} obj Object - * @returns {boolean} - */ -Long.isLong = isLong; - -/** - * A cache of the Long representations of small integer values. - * @type {!Object} - * @inner - */ -var INT_CACHE = {}; - -/** - * A cache of the Long representations of small unsigned integer values. - * @type {!Object} - * @inner - */ -var UINT_CACHE = {}; - -/** - * @param {number} value - * @param {boolean=} unsigned - * @returns {!Long} - * @inner - */ -function fromInt(value, unsigned) { - var obj, cachedObj, cache; - if (unsigned) { - value >>>= 0; - if (cache = 0 <= value && value < 256) { - cachedObj = UINT_CACHE[value]; - if (cachedObj) return cachedObj; - } - obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true); - if (cache) UINT_CACHE[value] = obj; - return obj; - } else { - value |= 0; - if (cache = -128 <= value && value < 128) { - cachedObj = INT_CACHE[value]; - if (cachedObj) return cachedObj; - } - obj = fromBits(value, value < 0 ? -1 : 0, false); - if (cache) INT_CACHE[value] = obj; - return obj; - } -} - -/** - * Returns a Long representing the given 32 bit integer value. - * @function - * @param {number} value The 32 bit integer in question - * @param {boolean=} unsigned Whether unsigned or not, defaults to signed - * @returns {!Long} The corresponding Long value - */ -Long.fromInt = fromInt; - -/** - * @param {number} value - * @param {boolean=} unsigned - * @returns {!Long} - * @inner - */ -function fromNumber(value, unsigned) { - if (isNaN(value)) return unsigned ? UZERO : ZERO; - if (unsigned) { - if (value < 0) return UZERO; - if (value >= TWO_PWR_64_DBL) return MAX_UNSIGNED_VALUE; - } else { - if (value <= -TWO_PWR_63_DBL) return MIN_VALUE; - if (value + 1 >= TWO_PWR_63_DBL) return MAX_VALUE; - } - if (value < 0) return fromNumber(-value, unsigned).neg(); - return fromBits(value % TWO_PWR_32_DBL | 0, value / TWO_PWR_32_DBL | 0, unsigned); -} - -/** - * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned. - * @function - * @param {number} value The number in question - * @param {boolean=} unsigned Whether unsigned or not, defaults to signed - * @returns {!Long} The corresponding Long value - */ -Long.fromNumber = fromNumber; - -/** - * @param {number} lowBits - * @param {number} highBits - * @param {boolean=} unsigned - * @returns {!Long} - * @inner - */ -function fromBits(lowBits, highBits, unsigned) { - return new Long(lowBits, highBits, unsigned); -} - -/** - * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is - * assumed to use 32 bits. - * @function - * @param {number} lowBits The low 32 bits - * @param {number} highBits The high 32 bits - * @param {boolean=} unsigned Whether unsigned or not, defaults to signed - * @returns {!Long} The corresponding Long value - */ -Long.fromBits = fromBits; - -/** - * @function - * @param {number} base - * @param {number} exponent - * @returns {number} - * @inner - */ -var pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4) - -/** - * @param {string} str - * @param {(boolean|number)=} unsigned - * @param {number=} radix - * @returns {!Long} - * @inner - */ -function fromString(str, unsigned, radix) { - if (str.length === 0) throw Error('empty string'); - if (str === "NaN" || str === "Infinity" || str === "+Infinity" || str === "-Infinity") return ZERO; - if (typeof unsigned === 'number') { - // For goog.math.long compatibility - radix = unsigned, unsigned = false; - } else { - unsigned = !!unsigned; - } - radix = radix || 10; - if (radix < 2 || 36 < radix) throw RangeError('radix'); - var p; - if ((p = str.indexOf('-')) > 0) throw Error('interior hyphen');else if (p === 0) { - return fromString(str.substring(1), unsigned, radix).neg(); - } - - // Do several (8) digits each time through the loop, so as to - // minimize the calls to the very expensive emulated div. - var radixToPower = fromNumber(pow_dbl(radix, 8)); - var result = ZERO; - for (var i = 0; i < str.length; i += 8) { - var size = Math.min(8, str.length - i), - value = parseInt(str.substring(i, i + size), radix); - if (size < 8) { - var power = fromNumber(pow_dbl(radix, size)); - result = result.mul(power).add(fromNumber(value)); - } else { - result = result.mul(radixToPower); - result = result.add(fromNumber(value)); - } - } - result.unsigned = unsigned; - return result; -} - -/** - * Returns a Long representation of the given string, written using the specified radix. - * @function - * @param {string} str The textual representation of the Long - * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed - * @param {number=} radix The radix in which the text is written (2-36), defaults to 10 - * @returns {!Long} The corresponding Long value - */ -Long.fromString = fromString; - -/** - * @function - * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val - * @param {boolean=} unsigned - * @returns {!Long} - * @inner - */ -function fromValue(val, unsigned) { - if (typeof val === 'number') return fromNumber(val, unsigned); - if (typeof val === 'string') return fromString(val, unsigned); - // Throws for non-objects, converts non-instanceof Long: - return fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned); -} - -/** - * Converts the specified value to a Long using the appropriate from* function for its type. - * @function - * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value - * @param {boolean=} unsigned Whether unsigned or not, defaults to signed - * @returns {!Long} - */ -Long.fromValue = fromValue; - -// NOTE: the compiler should inline these constant values below and then remove these variables, so there should be -// no runtime penalty for these. - -/** - * @type {number} - * @const - * @inner - */ -var TWO_PWR_16_DBL = 1 << 16; - -/** - * @type {number} - * @const - * @inner - */ -var TWO_PWR_24_DBL = 1 << 24; - -/** - * @type {number} - * @const - * @inner - */ -var TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL; - -/** - * @type {number} - * @const - * @inner - */ -var TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL; - -/** - * @type {number} - * @const - * @inner - */ -var TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2; - -/** - * @type {!Long} - * @const - * @inner - */ -var TWO_PWR_24 = fromInt(TWO_PWR_24_DBL); - -/** - * @type {!Long} - * @inner - */ -var ZERO = fromInt(0); - -/** - * Signed zero. - * @type {!Long} - */ -Long.ZERO = ZERO; - -/** - * @type {!Long} - * @inner - */ -var UZERO = fromInt(0, true); - -/** - * Unsigned zero. - * @type {!Long} - */ -Long.UZERO = UZERO; - -/** - * @type {!Long} - * @inner - */ -var ONE = fromInt(1); - -/** - * Signed one. - * @type {!Long} - */ -Long.ONE = ONE; - -/** - * @type {!Long} - * @inner - */ -var UONE = fromInt(1, true); - -/** - * Unsigned one. - * @type {!Long} - */ -Long.UONE = UONE; - -/** - * @type {!Long} - * @inner - */ -var NEG_ONE = fromInt(-1); - -/** - * Signed negative one. - * @type {!Long} - */ -Long.NEG_ONE = NEG_ONE; - -/** - * @type {!Long} - * @inner - */ -var MAX_VALUE = fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0, false); - -/** - * Maximum signed value. - * @type {!Long} - */ -Long.MAX_VALUE = MAX_VALUE; - -/** - * @type {!Long} - * @inner - */ -var MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF | 0, 0xFFFFFFFF | 0, true); - -/** - * Maximum unsigned value. - * @type {!Long} - */ -Long.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE; - -/** - * @type {!Long} - * @inner - */ -var MIN_VALUE = fromBits(0, 0x80000000 | 0, false); - -/** - * Minimum signed value. - * @type {!Long} - */ -Long.MIN_VALUE = MIN_VALUE; - -/** - * @alias Long.prototype - * @inner - */ -var LongPrototype = Long.prototype; - -/** - * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer. - * @returns {number} - */ -LongPrototype.toInt = function toInt() { - return this.unsigned ? this.low >>> 0 : this.low; -}; - -/** - * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa). - * @returns {number} - */ -LongPrototype.toNumber = function toNumber() { - if (this.unsigned) return (this.high >>> 0) * TWO_PWR_32_DBL + (this.low >>> 0); - return this.high * TWO_PWR_32_DBL + (this.low >>> 0); -}; - -/** - * Converts the Long to a string written in the specified radix. - * @param {number=} radix Radix (2-36), defaults to 10 - * @returns {string} - * @override - * @throws {RangeError} If `radix` is out of range - */ -LongPrototype.toString = function toString(radix) { - radix = radix || 10; - if (radix < 2 || 36 < radix) throw RangeError('radix'); - if (this.isZero()) return '0'; - if (this.isNegative()) { - // Unsigned Longs are never negative - if (this.eq(MIN_VALUE)) { - // We need to change the Long value before it can be negated, so we remove - // the bottom-most digit in this base and then recurse to do the rest. - var radixLong = fromNumber(radix), - div = this.div(radixLong), - rem1 = div.mul(radixLong).sub(this); - return div.toString(radix) + rem1.toInt().toString(radix); - } else return '-' + this.neg().toString(radix); - } - - // Do several (6) digits each time through the loop, so as to - // minimize the calls to the very expensive emulated div. - var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned), - rem = this; - var result = ''; - while (true) { - var remDiv = rem.div(radixToPower), - intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0, - digits = intval.toString(radix); - rem = remDiv; - if (rem.isZero()) return digits + result;else { - while (digits.length < 6) digits = '0' + digits; - result = '' + digits + result; - } - } -}; - -/** - * Gets the high 32 bits as a signed integer. - * @returns {number} Signed high bits - */ -LongPrototype.getHighBits = function getHighBits() { - return this.high; -}; - -/** - * Gets the high 32 bits as an unsigned integer. - * @returns {number} Unsigned high bits - */ -LongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() { - return this.high >>> 0; -}; - -/** - * Gets the low 32 bits as a signed integer. - * @returns {number} Signed low bits - */ -LongPrototype.getLowBits = function getLowBits() { - return this.low; -}; - -/** - * Gets the low 32 bits as an unsigned integer. - * @returns {number} Unsigned low bits - */ -LongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() { - return this.low >>> 0; -}; - -/** - * Gets the number of bits needed to represent the absolute value of this Long. - * @returns {number} - */ -LongPrototype.getNumBitsAbs = function getNumBitsAbs() { - if (this.isNegative()) - // Unsigned Longs are never negative - return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs(); - var val = this.high != 0 ? this.high : this.low; - for (var bit = 31; bit > 0; bit--) if ((val & 1 << bit) != 0) break; - return this.high != 0 ? bit + 33 : bit + 1; -}; - -/** - * Tests if this Long's value equals zero. - * @returns {boolean} - */ -LongPrototype.isZero = function isZero() { - return this.high === 0 && this.low === 0; -}; - -/** - * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}. - * @returns {boolean} - */ -LongPrototype.eqz = LongPrototype.isZero; - -/** - * Tests if this Long's value is negative. - * @returns {boolean} - */ -LongPrototype.isNegative = function isNegative() { - return !this.unsigned && this.high < 0; -}; - -/** - * Tests if this Long's value is positive. - * @returns {boolean} - */ -LongPrototype.isPositive = function isPositive() { - return this.unsigned || this.high >= 0; -}; - -/** - * Tests if this Long's value is odd. - * @returns {boolean} - */ -LongPrototype.isOdd = function isOdd() { - return (this.low & 1) === 1; -}; - -/** - * Tests if this Long's value is even. - * @returns {boolean} - */ -LongPrototype.isEven = function isEven() { - return (this.low & 1) === 0; -}; - -/** - * Tests if this Long's value equals the specified's. - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ -LongPrototype.equals = function equals(other) { - if (!isLong(other)) other = fromValue(other); - if (this.unsigned !== other.unsigned && this.high >>> 31 === 1 && other.high >>> 31 === 1) return false; - return this.high === other.high && this.low === other.low; -}; - -/** - * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}. - * @function - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ -LongPrototype.eq = LongPrototype.equals; - -/** - * Tests if this Long's value differs from the specified's. - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ -LongPrototype.notEquals = function notEquals(other) { - return !this.eq( /* validates */other); -}; - -/** - * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}. - * @function - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ -LongPrototype.neq = LongPrototype.notEquals; - -/** - * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}. - * @function - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ -LongPrototype.ne = LongPrototype.notEquals; - -/** - * Tests if this Long's value is less than the specified's. - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ -LongPrototype.lessThan = function lessThan(other) { - return this.comp( /* validates */other) < 0; -}; - -/** - * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}. - * @function - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ -LongPrototype.lt = LongPrototype.lessThan; - -/** - * Tests if this Long's value is less than or equal the specified's. - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ -LongPrototype.lessThanOrEqual = function lessThanOrEqual(other) { - return this.comp( /* validates */other) <= 0; -}; - -/** - * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}. - * @function - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ -LongPrototype.lte = LongPrototype.lessThanOrEqual; - -/** - * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}. - * @function - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ -LongPrototype.le = LongPrototype.lessThanOrEqual; - -/** - * Tests if this Long's value is greater than the specified's. - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ -LongPrototype.greaterThan = function greaterThan(other) { - return this.comp( /* validates */other) > 0; -}; - -/** - * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}. - * @function - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ -LongPrototype.gt = LongPrototype.greaterThan; - -/** - * Tests if this Long's value is greater than or equal the specified's. - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ -LongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) { - return this.comp( /* validates */other) >= 0; -}; - -/** - * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}. - * @function - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ -LongPrototype.gte = LongPrototype.greaterThanOrEqual; - -/** - * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}. - * @function - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ -LongPrototype.ge = LongPrototype.greaterThanOrEqual; - -/** - * Compares this Long's value with the specified's. - * @param {!Long|number|string} other Other value - * @returns {number} 0 if they are the same, 1 if the this is greater and -1 - * if the given one is greater - */ -LongPrototype.compare = function compare(other) { - if (!isLong(other)) other = fromValue(other); - if (this.eq(other)) return 0; - var thisNeg = this.isNegative(), - otherNeg = other.isNegative(); - if (thisNeg && !otherNeg) return -1; - if (!thisNeg && otherNeg) return 1; - // At this point the sign bits are the same - if (!this.unsigned) return this.sub(other).isNegative() ? -1 : 1; - // Both are positive if at least one is unsigned - return other.high >>> 0 > this.high >>> 0 || other.high === this.high && other.low >>> 0 > this.low >>> 0 ? -1 : 1; -}; - -/** - * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}. - * @function - * @param {!Long|number|string} other Other value - * @returns {number} 0 if they are the same, 1 if the this is greater and -1 - * if the given one is greater - */ -LongPrototype.comp = LongPrototype.compare; - -/** - * Negates this Long's value. - * @returns {!Long} Negated Long - */ -LongPrototype.negate = function negate() { - if (!this.unsigned && this.eq(MIN_VALUE)) return MIN_VALUE; - return this.not().add(ONE); -}; - -/** - * Negates this Long's value. This is an alias of {@link Long#negate}. - * @function - * @returns {!Long} Negated Long - */ -LongPrototype.neg = LongPrototype.negate; - -/** - * Returns the sum of this and the specified Long. - * @param {!Long|number|string} addend Addend - * @returns {!Long} Sum - */ -LongPrototype.add = function add(addend) { - if (!isLong(addend)) addend = fromValue(addend); - - // Divide each number into 4 chunks of 16 bits, and then sum the chunks. - - var a48 = this.high >>> 16; - var a32 = this.high & 0xFFFF; - var a16 = this.low >>> 16; - var a00 = this.low & 0xFFFF; - var b48 = addend.high >>> 16; - var b32 = addend.high & 0xFFFF; - var b16 = addend.low >>> 16; - var b00 = addend.low & 0xFFFF; - var c48 = 0, - c32 = 0, - c16 = 0, - c00 = 0; - c00 += a00 + b00; - c16 += c00 >>> 16; - c00 &= 0xFFFF; - c16 += a16 + b16; - c32 += c16 >>> 16; - c16 &= 0xFFFF; - c32 += a32 + b32; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c48 += a48 + b48; - c48 &= 0xFFFF; - return fromBits(c16 << 16 | c00, c48 << 16 | c32, this.unsigned); -}; - -/** - * Returns the difference of this and the specified Long. - * @param {!Long|number|string} subtrahend Subtrahend - * @returns {!Long} Difference - */ -LongPrototype.subtract = function subtract(subtrahend) { - if (!isLong(subtrahend)) subtrahend = fromValue(subtrahend); - return this.add(subtrahend.neg()); -}; - -/** - * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}. - * @function - * @param {!Long|number|string} subtrahend Subtrahend - * @returns {!Long} Difference - */ -LongPrototype.sub = LongPrototype.subtract; - -/** - * Returns the product of this and the specified Long. - * @param {!Long|number|string} multiplier Multiplier - * @returns {!Long} Product - */ -LongPrototype.multiply = function multiply(multiplier) { - if (this.isZero()) return ZERO; - if (!isLong(multiplier)) multiplier = fromValue(multiplier); - - // use wasm support if present - if (wasm) { - var low = wasm.mul(this.low, this.high, multiplier.low, multiplier.high); - return fromBits(low, wasm.get_high(), this.unsigned); - } - if (multiplier.isZero()) return ZERO; - if (this.eq(MIN_VALUE)) return multiplier.isOdd() ? MIN_VALUE : ZERO; - if (multiplier.eq(MIN_VALUE)) return this.isOdd() ? MIN_VALUE : ZERO; - if (this.isNegative()) { - if (multiplier.isNegative()) return this.neg().mul(multiplier.neg());else return this.neg().mul(multiplier).neg(); - } else if (multiplier.isNegative()) return this.mul(multiplier.neg()).neg(); - - // If both longs are small, use float multiplication - if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24)) return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned); - - // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products. - // We can skip products that would overflow. - - var a48 = this.high >>> 16; - var a32 = this.high & 0xFFFF; - var a16 = this.low >>> 16; - var a00 = this.low & 0xFFFF; - var b48 = multiplier.high >>> 16; - var b32 = multiplier.high & 0xFFFF; - var b16 = multiplier.low >>> 16; - var b00 = multiplier.low & 0xFFFF; - var c48 = 0, - c32 = 0, - c16 = 0, - c00 = 0; - c00 += a00 * b00; - c16 += c00 >>> 16; - c00 &= 0xFFFF; - c16 += a16 * b00; - c32 += c16 >>> 16; - c16 &= 0xFFFF; - c16 += a00 * b16; - c32 += c16 >>> 16; - c16 &= 0xFFFF; - c32 += a32 * b00; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c32 += a16 * b16; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c32 += a00 * b32; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; - c48 &= 0xFFFF; - return fromBits(c16 << 16 | c00, c48 << 16 | c32, this.unsigned); -}; - -/** - * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}. - * @function - * @param {!Long|number|string} multiplier Multiplier - * @returns {!Long} Product - */ -LongPrototype.mul = LongPrototype.multiply; - -/** - * Returns this Long divided by the specified. The result is signed if this Long is signed or - * unsigned if this Long is unsigned. - * @param {!Long|number|string} divisor Divisor - * @returns {!Long} Quotient - */ -LongPrototype.divide = function divide(divisor) { - if (!isLong(divisor)) divisor = fromValue(divisor); - if (divisor.isZero()) throw Error('division by zero'); - - // use wasm support if present - if (wasm) { - // guard against signed division overflow: the largest - // negative number / -1 would be 1 larger than the largest - // positive number, due to two's complement. - if (!this.unsigned && this.high === -0x80000000 && divisor.low === -1 && divisor.high === -1) { - // be consistent with non-wasm code path - return this; - } - var low = (this.unsigned ? wasm.div_u : wasm.div_s)(this.low, this.high, divisor.low, divisor.high); - return fromBits(low, wasm.get_high(), this.unsigned); - } - if (this.isZero()) return this.unsigned ? UZERO : ZERO; - var approx, rem, res; - if (!this.unsigned) { - // This section is only relevant for signed longs and is derived from the - // closure library as a whole. - if (this.eq(MIN_VALUE)) { - if (divisor.eq(ONE) || divisor.eq(NEG_ONE)) return MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE - else if (divisor.eq(MIN_VALUE)) return ONE;else { - // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|. - var halfThis = this.shr(1); - approx = halfThis.div(divisor).shl(1); - if (approx.eq(ZERO)) { - return divisor.isNegative() ? ONE : NEG_ONE; - } else { - rem = this.sub(divisor.mul(approx)); - res = approx.add(rem.div(divisor)); - return res; - } - } - } else if (divisor.eq(MIN_VALUE)) return this.unsigned ? UZERO : ZERO; - if (this.isNegative()) { - if (divisor.isNegative()) return this.neg().div(divisor.neg()); - return this.neg().div(divisor).neg(); - } else if (divisor.isNegative()) return this.div(divisor.neg()).neg(); - res = ZERO; - } else { - // The algorithm below has not been made for unsigned longs. It's therefore - // required to take special care of the MSB prior to running it. - if (!divisor.unsigned) divisor = divisor.toUnsigned(); - if (divisor.gt(this)) return UZERO; - if (divisor.gt(this.shru(1))) - // 15 >>> 1 = 7 ; with divisor = 8 ; true - return UONE; - res = UZERO; - } - - // Repeat the following until the remainder is less than other: find a - // floating-point that approximates remainder / other *from below*, add this - // into the result, and subtract it from the remainder. It is critical that - // the approximate value is less than or equal to the real value so that the - // remainder never becomes negative. - rem = this; - while (rem.gte(divisor)) { - // Approximate the result of division. This may be a little greater or - // smaller than the actual value. - approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber())); - - // We will tweak the approximate result by changing it in the 48-th digit or - // the smallest non-fractional digit, whichever is larger. - var log2 = Math.ceil(Math.log(approx) / Math.LN2), - delta = log2 <= 48 ? 1 : pow_dbl(2, log2 - 48), - // Decrease the approximation until it is smaller than the remainder. Note - // that if it is too large, the product overflows and is negative. - approxRes = fromNumber(approx), - approxRem = approxRes.mul(divisor); - while (approxRem.isNegative() || approxRem.gt(rem)) { - approx -= delta; - approxRes = fromNumber(approx, this.unsigned); - approxRem = approxRes.mul(divisor); - } - - // We know the answer can't be zero... and actually, zero would cause - // infinite recursion since we would make no progress. - if (approxRes.isZero()) approxRes = ONE; - res = res.add(approxRes); - rem = rem.sub(approxRem); - } - return res; -}; - -/** - * Returns this Long divided by the specified. This is an alias of {@link Long#divide}. - * @function - * @param {!Long|number|string} divisor Divisor - * @returns {!Long} Quotient - */ -LongPrototype.div = LongPrototype.divide; - -/** - * Returns this Long modulo the specified. - * @param {!Long|number|string} divisor Divisor - * @returns {!Long} Remainder - */ -LongPrototype.modulo = function modulo(divisor) { - if (!isLong(divisor)) divisor = fromValue(divisor); - - // use wasm support if present - if (wasm) { - var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(this.low, this.high, divisor.low, divisor.high); - return fromBits(low, wasm.get_high(), this.unsigned); - } - return this.sub(this.div(divisor).mul(divisor)); -}; - -/** - * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}. - * @function - * @param {!Long|number|string} divisor Divisor - * @returns {!Long} Remainder - */ -LongPrototype.mod = LongPrototype.modulo; - -/** - * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}. - * @function - * @param {!Long|number|string} divisor Divisor - * @returns {!Long} Remainder - */ -LongPrototype.rem = LongPrototype.modulo; - -/** - * Returns the bitwise NOT of this Long. - * @returns {!Long} - */ -LongPrototype.not = function not() { - return fromBits(~this.low, ~this.high, this.unsigned); -}; - -/** - * Returns the bitwise AND of this Long and the specified. - * @param {!Long|number|string} other Other Long - * @returns {!Long} - */ -LongPrototype.and = function and(other) { - if (!isLong(other)) other = fromValue(other); - return fromBits(this.low & other.low, this.high & other.high, this.unsigned); -}; - -/** - * Returns the bitwise OR of this Long and the specified. - * @param {!Long|number|string} other Other Long - * @returns {!Long} - */ -LongPrototype.or = function or(other) { - if (!isLong(other)) other = fromValue(other); - return fromBits(this.low | other.low, this.high | other.high, this.unsigned); -}; - -/** - * Returns the bitwise XOR of this Long and the given one. - * @param {!Long|number|string} other Other Long - * @returns {!Long} - */ -LongPrototype.xor = function xor(other) { - if (!isLong(other)) other = fromValue(other); - return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned); -}; - -/** - * Returns this Long with bits shifted to the left by the given amount. - * @param {number|!Long} numBits Number of bits - * @returns {!Long} Shifted Long - */ -LongPrototype.shiftLeft = function shiftLeft(numBits) { - if (isLong(numBits)) numBits = numBits.toInt(); - if ((numBits &= 63) === 0) return this;else if (numBits < 32) return fromBits(this.low << numBits, this.high << numBits | this.low >>> 32 - numBits, this.unsigned);else return fromBits(0, this.low << numBits - 32, this.unsigned); -}; - -/** - * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}. - * @function - * @param {number|!Long} numBits Number of bits - * @returns {!Long} Shifted Long - */ -LongPrototype.shl = LongPrototype.shiftLeft; - -/** - * Returns this Long with bits arithmetically shifted to the right by the given amount. - * @param {number|!Long} numBits Number of bits - * @returns {!Long} Shifted Long - */ -LongPrototype.shiftRight = function shiftRight(numBits) { - if (isLong(numBits)) numBits = numBits.toInt(); - if ((numBits &= 63) === 0) return this;else if (numBits < 32) return fromBits(this.low >>> numBits | this.high << 32 - numBits, this.high >> numBits, this.unsigned);else return fromBits(this.high >> numBits - 32, this.high >= 0 ? 0 : -1, this.unsigned); -}; - -/** - * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}. - * @function - * @param {number|!Long} numBits Number of bits - * @returns {!Long} Shifted Long - */ -LongPrototype.shr = LongPrototype.shiftRight; - -/** - * Returns this Long with bits logically shifted to the right by the given amount. - * @param {number|!Long} numBits Number of bits - * @returns {!Long} Shifted Long - */ -LongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) { - if (isLong(numBits)) numBits = numBits.toInt(); - numBits &= 63; - if (numBits === 0) return this;else { - var high = this.high; - if (numBits < 32) { - var low = this.low; - return fromBits(low >>> numBits | high << 32 - numBits, high >>> numBits, this.unsigned); - } else if (numBits === 32) return fromBits(high, 0, this.unsigned);else return fromBits(high >>> numBits - 32, 0, this.unsigned); - } -}; - -/** - * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}. - * @function - * @param {number|!Long} numBits Number of bits - * @returns {!Long} Shifted Long - */ -LongPrototype.shru = LongPrototype.shiftRightUnsigned; - -/** - * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}. - * @function - * @param {number|!Long} numBits Number of bits - * @returns {!Long} Shifted Long - */ -LongPrototype.shr_u = LongPrototype.shiftRightUnsigned; - -/** - * Converts this Long to signed. - * @returns {!Long} Signed long - */ -LongPrototype.toSigned = function toSigned() { - if (!this.unsigned) return this; - return fromBits(this.low, this.high, false); -}; - -/** - * Converts this Long to unsigned. - * @returns {!Long} Unsigned long - */ -LongPrototype.toUnsigned = function toUnsigned() { - if (this.unsigned) return this; - return fromBits(this.low, this.high, true); -}; - -/** - * Converts this Long to its byte representation. - * @param {boolean=} le Whether little or big endian, defaults to big endian - * @returns {!Array.} Byte representation - */ -LongPrototype.toBytes = function toBytes(le) { - return le ? this.toBytesLE() : this.toBytesBE(); -}; - -/** - * Converts this Long to its little endian byte representation. - * @returns {!Array.} Little endian byte representation - */ -LongPrototype.toBytesLE = function toBytesLE() { - var hi = this.high, - lo = this.low; - return [lo & 0xff, lo >>> 8 & 0xff, lo >>> 16 & 0xff, lo >>> 24, hi & 0xff, hi >>> 8 & 0xff, hi >>> 16 & 0xff, hi >>> 24]; -}; - -/** - * Converts this Long to its big endian byte representation. - * @returns {!Array.} Big endian byte representation - */ -LongPrototype.toBytesBE = function toBytesBE() { - var hi = this.high, - lo = this.low; - return [hi >>> 24, hi >>> 16 & 0xff, hi >>> 8 & 0xff, hi & 0xff, lo >>> 24, lo >>> 16 & 0xff, lo >>> 8 & 0xff, lo & 0xff]; -}; - -/** - * Creates a Long from its byte representation. - * @param {!Array.} bytes Byte representation - * @param {boolean=} unsigned Whether unsigned or not, defaults to signed - * @param {boolean=} le Whether little or big endian, defaults to big endian - * @returns {Long} The corresponding Long value - */ -Long.fromBytes = function fromBytes(bytes, unsigned, le) { - return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned); -}; - -/** - * Creates a Long from its little endian byte representation. - * @param {!Array.} bytes Little endian byte representation - * @param {boolean=} unsigned Whether unsigned or not, defaults to signed - * @returns {Long} The corresponding Long value - */ -Long.fromBytesLE = function fromBytesLE(bytes, unsigned) { - return new Long(bytes[0] | bytes[1] << 8 | bytes[2] << 16 | bytes[3] << 24, bytes[4] | bytes[5] << 8 | bytes[6] << 16 | bytes[7] << 24, unsigned); -}; - -/** - * Creates a Long from its big endian byte representation. - * @param {!Array.} bytes Big endian byte representation - * @param {boolean=} unsigned Whether unsigned or not, defaults to signed - * @returns {Long} The corresponding Long value - */ -Long.fromBytesBE = function fromBytesBE(bytes, unsigned) { - return new Long(bytes[4] << 24 | bytes[5] << 16 | bytes[6] << 8 | bytes[7], bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3], unsigned); -}; -var Long$1 = /*@__PURE__*/getDefaultExportFromCjs(long); - -var indexMinimal = {}; - -var minimal$1 = {}; - -var aspromise; -var hasRequiredAspromise; -function requireAspromise() { - if (hasRequiredAspromise) return aspromise; - hasRequiredAspromise = 1; - aspromise = asPromise; - - /** - * Callback as used by {@link util.asPromise}. - * @typedef asPromiseCallback - * @type {function} - * @param {Error|null} error Error, if any - * @param {...*} params Additional arguments - * @returns {undefined} - */ - - /** - * Returns a promise from a node-style callback function. - * @memberof util - * @param {asPromiseCallback} fn Function to call - * @param {*} ctx Function context - * @param {...*} params Function arguments - * @returns {Promise<*>} Promisified function - */ - function asPromise(fn, ctx /*, varargs */) { - var params = new Array(arguments.length - 1), - offset = 0, - index = 2, - pending = true; - while (index < arguments.length) params[offset++] = arguments[index++]; - return new Promise(function executor(resolve, reject) { - params[offset] = function callback(err /*, varargs */) { - if (pending) { - pending = false; - if (err) reject(err);else { - var params = new Array(arguments.length - 1), - offset = 0; - while (offset < params.length) params[offset++] = arguments[offset]; - resolve.apply(null, params); - } - } - }; - try { - fn.apply(ctx || null, params); - } catch (err) { - if (pending) { - pending = false; - reject(err); - } - } - }); - } - return aspromise; -} - -var base64$1 = {}; - -var hasRequiredBase64; -function requireBase64() { - if (hasRequiredBase64) return base64$1; - hasRequiredBase64 = 1; - (function (exports) { - - /** - * A minimal base64 implementation for number arrays. - * @memberof util - * @namespace - */ - var base64 = exports; - - /** - * Calculates the byte length of a base64 encoded string. - * @param {string} string Base64 encoded string - * @returns {number} Byte length - */ - base64.length = function length(string) { - var p = string.length; - if (!p) return 0; - var n = 0; - while (--p % 4 > 1 && string.charAt(p) === "=") ++n; - return Math.ceil(string.length * 3) / 4 - n; - }; - - // Base64 encoding table - var b64 = new Array(64); - - // Base64 decoding table - var s64 = new Array(123); - - // 65..90, 97..122, 48..57, 43, 47 - for (var i = 0; i < 64;) s64[b64[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++; - - /** - * Encodes a buffer to a base64 encoded string. - * @param {Uint8Array} buffer Source buffer - * @param {number} start Source start - * @param {number} end Source end - * @returns {string} Base64 encoded string - */ - base64.encode = function encode(buffer, start, end) { - var parts = null, - chunk = []; - var i = 0, - // output index - j = 0, - // goto index - t; // temporary - while (start < end) { - var b = buffer[start++]; - switch (j) { - case 0: - chunk[i++] = b64[b >> 2]; - t = (b & 3) << 4; - j = 1; - break; - case 1: - chunk[i++] = b64[t | b >> 4]; - t = (b & 15) << 2; - j = 2; - break; - case 2: - chunk[i++] = b64[t | b >> 6]; - chunk[i++] = b64[b & 63]; - j = 0; - break; - } - if (i > 8191) { - (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk)); - i = 0; - } - } - if (j) { - chunk[i++] = b64[t]; - chunk[i++] = 61; - if (j === 1) chunk[i++] = 61; - } - if (parts) { - if (i) parts.push(String.fromCharCode.apply(String, chunk.slice(0, i))); - return parts.join(""); - } - return String.fromCharCode.apply(String, chunk.slice(0, i)); - }; - var invalidEncoding = "invalid encoding"; - - /** - * Decodes a base64 encoded string to a buffer. - * @param {string} string Source string - * @param {Uint8Array} buffer Destination buffer - * @param {number} offset Destination offset - * @returns {number} Number of bytes written - * @throws {Error} If encoding is invalid - */ - base64.decode = function decode(string, buffer, offset) { - var start = offset; - var j = 0, - // goto index - t; // temporary - for (var i = 0; i < string.length;) { - var c = string.charCodeAt(i++); - if (c === 61 && j > 1) break; - if ((c = s64[c]) === undefined) throw Error(invalidEncoding); - switch (j) { - case 0: - t = c; - j = 1; - break; - case 1: - buffer[offset++] = t << 2 | (c & 48) >> 4; - t = c; - j = 2; - break; - case 2: - buffer[offset++] = (t & 15) << 4 | (c & 60) >> 2; - t = c; - j = 3; - break; - case 3: - buffer[offset++] = (t & 3) << 6 | c; - j = 0; - break; - } - } - if (j === 1) throw Error(invalidEncoding); - return offset - start; - }; - - /** - * Tests if the specified string appears to be base64 encoded. - * @param {string} string String to test - * @returns {boolean} `true` if probably base64 encoded, otherwise false - */ - base64.test = function test(string) { - return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(string); - }; - })(base64$1); - return base64$1; -} - -var eventemitter; -var hasRequiredEventemitter; -function requireEventemitter() { - if (hasRequiredEventemitter) return eventemitter; - hasRequiredEventemitter = 1; - eventemitter = EventEmitter; - - /** - * Constructs a new event emitter instance. - * @classdesc A minimal event emitter. - * @memberof util - * @constructor - */ - function EventEmitter() { - /** - * Registered listeners. - * @type {Object.} - * @private - */ - this._listeners = {}; - } - - /** - * Registers an event listener. - * @param {string} evt Event name - * @param {function} fn Listener - * @param {*} [ctx] Listener context - * @returns {util.EventEmitter} `this` - */ - EventEmitter.prototype.on = function on(evt, fn, ctx) { - (this._listeners[evt] || (this._listeners[evt] = [])).push({ - fn: fn, - ctx: ctx || this - }); - return this; - }; - - /** - * Removes an event listener or any matching listeners if arguments are omitted. - * @param {string} [evt] Event name. Removes all listeners if omitted. - * @param {function} [fn] Listener to remove. Removes all listeners of `evt` if omitted. - * @returns {util.EventEmitter} `this` - */ - EventEmitter.prototype.off = function off(evt, fn) { - if (evt === undefined) this._listeners = {};else { - if (fn === undefined) this._listeners[evt] = [];else { - var listeners = this._listeners[evt]; - for (var i = 0; i < listeners.length;) if (listeners[i].fn === fn) listeners.splice(i, 1);else ++i; - } - } - return this; - }; - - /** - * Emits an event by calling its listeners with the specified arguments. - * @param {string} evt Event name - * @param {...*} args Arguments - * @returns {util.EventEmitter} `this` - */ - EventEmitter.prototype.emit = function emit(evt) { - var listeners = this._listeners[evt]; - if (listeners) { - var args = [], - i = 1; - for (; i < arguments.length;) args.push(arguments[i++]); - for (i = 0; i < listeners.length;) listeners[i].fn.apply(listeners[i++].ctx, args); - } - return this; - }; - return eventemitter; -} - -var float; -var hasRequiredFloat; -function requireFloat() { - if (hasRequiredFloat) return float; - hasRequiredFloat = 1; - float = factory(factory); - - /** - * Reads / writes floats / doubles from / to buffers. - * @name util.float - * @namespace - */ - - /** - * Writes a 32 bit float to a buffer using little endian byte order. - * @name util.float.writeFloatLE - * @function - * @param {number} val Value to write - * @param {Uint8Array} buf Target buffer - * @param {number} pos Target buffer offset - * @returns {undefined} - */ - - /** - * Writes a 32 bit float to a buffer using big endian byte order. - * @name util.float.writeFloatBE - * @function - * @param {number} val Value to write - * @param {Uint8Array} buf Target buffer - * @param {number} pos Target buffer offset - * @returns {undefined} - */ - - /** - * Reads a 32 bit float from a buffer using little endian byte order. - * @name util.float.readFloatLE - * @function - * @param {Uint8Array} buf Source buffer - * @param {number} pos Source buffer offset - * @returns {number} Value read - */ - - /** - * Reads a 32 bit float from a buffer using big endian byte order. - * @name util.float.readFloatBE - * @function - * @param {Uint8Array} buf Source buffer - * @param {number} pos Source buffer offset - * @returns {number} Value read - */ - - /** - * Writes a 64 bit double to a buffer using little endian byte order. - * @name util.float.writeDoubleLE - * @function - * @param {number} val Value to write - * @param {Uint8Array} buf Target buffer - * @param {number} pos Target buffer offset - * @returns {undefined} - */ - - /** - * Writes a 64 bit double to a buffer using big endian byte order. - * @name util.float.writeDoubleBE - * @function - * @param {number} val Value to write - * @param {Uint8Array} buf Target buffer - * @param {number} pos Target buffer offset - * @returns {undefined} - */ - - /** - * Reads a 64 bit double from a buffer using little endian byte order. - * @name util.float.readDoubleLE - * @function - * @param {Uint8Array} buf Source buffer - * @param {number} pos Source buffer offset - * @returns {number} Value read - */ - - /** - * Reads a 64 bit double from a buffer using big endian byte order. - * @name util.float.readDoubleBE - * @function - * @param {Uint8Array} buf Source buffer - * @param {number} pos Source buffer offset - * @returns {number} Value read - */ - - // Factory function for the purpose of node-based testing in modified global environments - function factory(exports) { - // float: typed array - if (typeof Float32Array !== "undefined") (function () { - var f32 = new Float32Array([-0]), - f8b = new Uint8Array(f32.buffer), - le = f8b[3] === 128; - function writeFloat_f32_cpy(val, buf, pos) { - f32[0] = val; - buf[pos] = f8b[0]; - buf[pos + 1] = f8b[1]; - buf[pos + 2] = f8b[2]; - buf[pos + 3] = f8b[3]; - } - function writeFloat_f32_rev(val, buf, pos) { - f32[0] = val; - buf[pos] = f8b[3]; - buf[pos + 1] = f8b[2]; - buf[pos + 2] = f8b[1]; - buf[pos + 3] = f8b[0]; - } - - /* istanbul ignore next */ - exports.writeFloatLE = le ? writeFloat_f32_cpy : writeFloat_f32_rev; - /* istanbul ignore next */ - exports.writeFloatBE = le ? writeFloat_f32_rev : writeFloat_f32_cpy; - function readFloat_f32_cpy(buf, pos) { - f8b[0] = buf[pos]; - f8b[1] = buf[pos + 1]; - f8b[2] = buf[pos + 2]; - f8b[3] = buf[pos + 3]; - return f32[0]; - } - function readFloat_f32_rev(buf, pos) { - f8b[3] = buf[pos]; - f8b[2] = buf[pos + 1]; - f8b[1] = buf[pos + 2]; - f8b[0] = buf[pos + 3]; - return f32[0]; - } - - /* istanbul ignore next */ - exports.readFloatLE = le ? readFloat_f32_cpy : readFloat_f32_rev; - /* istanbul ignore next */ - exports.readFloatBE = le ? readFloat_f32_rev : readFloat_f32_cpy; - - // float: ieee754 - })();else (function () { - function writeFloat_ieee754(writeUint, val, buf, pos) { - var sign = val < 0 ? 1 : 0; - if (sign) val = -val; - if (val === 0) writeUint(1 / val > 0 ? /* positive */0 : /* negative 0 */2147483648, buf, pos);else if (isNaN(val)) writeUint(2143289344, buf, pos);else if (val > 3.4028234663852886e+38) - // +-Infinity - writeUint((sign << 31 | 2139095040) >>> 0, buf, pos);else if (val < 1.1754943508222875e-38) - // denormal - writeUint((sign << 31 | Math.round(val / 1.401298464324817e-45)) >>> 0, buf, pos);else { - var exponent = Math.floor(Math.log(val) / Math.LN2), - mantissa = Math.round(val * Math.pow(2, -exponent) * 8388608) & 8388607; - writeUint((sign << 31 | exponent + 127 << 23 | mantissa) >>> 0, buf, pos); - } - } - exports.writeFloatLE = writeFloat_ieee754.bind(null, writeUintLE); - exports.writeFloatBE = writeFloat_ieee754.bind(null, writeUintBE); - function readFloat_ieee754(readUint, buf, pos) { - var uint = readUint(buf, pos), - sign = (uint >> 31) * 2 + 1, - exponent = uint >>> 23 & 255, - mantissa = uint & 8388607; - return exponent === 255 ? mantissa ? NaN : sign * Infinity : exponent === 0 // denormal - ? sign * 1.401298464324817e-45 * mantissa : sign * Math.pow(2, exponent - 150) * (mantissa + 8388608); - } - exports.readFloatLE = readFloat_ieee754.bind(null, readUintLE); - exports.readFloatBE = readFloat_ieee754.bind(null, readUintBE); - })(); - - // double: typed array - if (typeof Float64Array !== "undefined") (function () { - var f64 = new Float64Array([-0]), - f8b = new Uint8Array(f64.buffer), - le = f8b[7] === 128; - function writeDouble_f64_cpy(val, buf, pos) { - f64[0] = val; - buf[pos] = f8b[0]; - buf[pos + 1] = f8b[1]; - buf[pos + 2] = f8b[2]; - buf[pos + 3] = f8b[3]; - buf[pos + 4] = f8b[4]; - buf[pos + 5] = f8b[5]; - buf[pos + 6] = f8b[6]; - buf[pos + 7] = f8b[7]; - } - function writeDouble_f64_rev(val, buf, pos) { - f64[0] = val; - buf[pos] = f8b[7]; - buf[pos + 1] = f8b[6]; - buf[pos + 2] = f8b[5]; - buf[pos + 3] = f8b[4]; - buf[pos + 4] = f8b[3]; - buf[pos + 5] = f8b[2]; - buf[pos + 6] = f8b[1]; - buf[pos + 7] = f8b[0]; - } - - /* istanbul ignore next */ - exports.writeDoubleLE = le ? writeDouble_f64_cpy : writeDouble_f64_rev; - /* istanbul ignore next */ - exports.writeDoubleBE = le ? writeDouble_f64_rev : writeDouble_f64_cpy; - function readDouble_f64_cpy(buf, pos) { - f8b[0] = buf[pos]; - f8b[1] = buf[pos + 1]; - f8b[2] = buf[pos + 2]; - f8b[3] = buf[pos + 3]; - f8b[4] = buf[pos + 4]; - f8b[5] = buf[pos + 5]; - f8b[6] = buf[pos + 6]; - f8b[7] = buf[pos + 7]; - return f64[0]; - } - function readDouble_f64_rev(buf, pos) { - f8b[7] = buf[pos]; - f8b[6] = buf[pos + 1]; - f8b[5] = buf[pos + 2]; - f8b[4] = buf[pos + 3]; - f8b[3] = buf[pos + 4]; - f8b[2] = buf[pos + 5]; - f8b[1] = buf[pos + 6]; - f8b[0] = buf[pos + 7]; - return f64[0]; - } - - /* istanbul ignore next */ - exports.readDoubleLE = le ? readDouble_f64_cpy : readDouble_f64_rev; - /* istanbul ignore next */ - exports.readDoubleBE = le ? readDouble_f64_rev : readDouble_f64_cpy; - - // double: ieee754 - })();else (function () { - function writeDouble_ieee754(writeUint, off0, off1, val, buf, pos) { - var sign = val < 0 ? 1 : 0; - if (sign) val = -val; - if (val === 0) { - writeUint(0, buf, pos + off0); - writeUint(1 / val > 0 ? /* positive */0 : /* negative 0 */2147483648, buf, pos + off1); - } else if (isNaN(val)) { - writeUint(0, buf, pos + off0); - writeUint(2146959360, buf, pos + off1); - } else if (val > 1.7976931348623157e+308) { - // +-Infinity - writeUint(0, buf, pos + off0); - writeUint((sign << 31 | 2146435072) >>> 0, buf, pos + off1); - } else { - var mantissa; - if (val < 2.2250738585072014e-308) { - // denormal - mantissa = val / 5e-324; - writeUint(mantissa >>> 0, buf, pos + off0); - writeUint((sign << 31 | mantissa / 4294967296) >>> 0, buf, pos + off1); - } else { - var exponent = Math.floor(Math.log(val) / Math.LN2); - if (exponent === 1024) exponent = 1023; - mantissa = val * Math.pow(2, -exponent); - writeUint(mantissa * 4503599627370496 >>> 0, buf, pos + off0); - writeUint((sign << 31 | exponent + 1023 << 20 | mantissa * 1048576 & 1048575) >>> 0, buf, pos + off1); - } - } - } - exports.writeDoubleLE = writeDouble_ieee754.bind(null, writeUintLE, 0, 4); - exports.writeDoubleBE = writeDouble_ieee754.bind(null, writeUintBE, 4, 0); - function readDouble_ieee754(readUint, off0, off1, buf, pos) { - var lo = readUint(buf, pos + off0), - hi = readUint(buf, pos + off1); - var sign = (hi >> 31) * 2 + 1, - exponent = hi >>> 20 & 2047, - mantissa = 4294967296 * (hi & 1048575) + lo; - return exponent === 2047 ? mantissa ? NaN : sign * Infinity : exponent === 0 // denormal - ? sign * 5e-324 * mantissa : sign * Math.pow(2, exponent - 1075) * (mantissa + 4503599627370496); - } - exports.readDoubleLE = readDouble_ieee754.bind(null, readUintLE, 0, 4); - exports.readDoubleBE = readDouble_ieee754.bind(null, readUintBE, 4, 0); - })(); - return exports; - } - - // uint helpers - - function writeUintLE(val, buf, pos) { - buf[pos] = val & 255; - buf[pos + 1] = val >>> 8 & 255; - buf[pos + 2] = val >>> 16 & 255; - buf[pos + 3] = val >>> 24; - } - function writeUintBE(val, buf, pos) { - buf[pos] = val >>> 24; - buf[pos + 1] = val >>> 16 & 255; - buf[pos + 2] = val >>> 8 & 255; - buf[pos + 3] = val & 255; - } - function readUintLE(buf, pos) { - return (buf[pos] | buf[pos + 1] << 8 | buf[pos + 2] << 16 | buf[pos + 3] << 24) >>> 0; - } - function readUintBE(buf, pos) { - return (buf[pos] << 24 | buf[pos + 1] << 16 | buf[pos + 2] << 8 | buf[pos + 3]) >>> 0; - } - return float; -} - -var inquire_1; -var hasRequiredInquire; -function requireInquire() { - if (hasRequiredInquire) return inquire_1; - hasRequiredInquire = 1; - inquire_1 = inquire; - - /** - * Requires a module only if available. - * @memberof util - * @param {string} moduleName Module to require - * @returns {?Object} Required module if available and not empty, otherwise `null` - */ - function inquire(moduleName) { - try { - var mod = undefined; // eslint-disable-line no-eval - if (mod && (mod.length || Object.keys(mod).length)) return mod; - } catch (e) {} // eslint-disable-line no-empty - return null; - } - return inquire_1; -} - -var utf8$2 = {}; - -var hasRequiredUtf8; -function requireUtf8() { - if (hasRequiredUtf8) return utf8$2; - hasRequiredUtf8 = 1; - (function (exports) { - - /** - * A minimal UTF8 implementation for number arrays. - * @memberof util - * @namespace - */ - var utf8 = exports; - - /** - * Calculates the UTF8 byte length of a string. - * @param {string} string String - * @returns {number} Byte length - */ - utf8.length = function utf8_length(string) { - var len = 0, - c = 0; - for (var i = 0; i < string.length; ++i) { - c = string.charCodeAt(i); - if (c < 128) len += 1;else if (c < 2048) len += 2;else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) { - ++i; - len += 4; - } else len += 3; - } - return len; - }; - - /** - * Reads UTF8 bytes as a string. - * @param {Uint8Array} buffer Source buffer - * @param {number} start Source start - * @param {number} end Source end - * @returns {string} String read - */ - utf8.read = function utf8_read(buffer, start, end) { - var len = end - start; - if (len < 1) return ""; - var parts = null, - chunk = [], - i = 0, - // char offset - t; // temporary - while (start < end) { - t = buffer[start++]; - if (t < 128) chunk[i++] = t;else if (t > 191 && t < 224) chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;else if (t > 239 && t < 365) { - t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000; - chunk[i++] = 0xD800 + (t >> 10); - chunk[i++] = 0xDC00 + (t & 1023); - } else chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63; - if (i > 8191) { - (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk)); - i = 0; - } - } - if (parts) { - if (i) parts.push(String.fromCharCode.apply(String, chunk.slice(0, i))); - return parts.join(""); - } - return String.fromCharCode.apply(String, chunk.slice(0, i)); - }; - - /** - * Writes a string as UTF8 bytes. - * @param {string} string Source string - * @param {Uint8Array} buffer Destination buffer - * @param {number} offset Destination offset - * @returns {number} Bytes written - */ - utf8.write = function utf8_write(string, buffer, offset) { - var start = offset, - c1, - // character 1 - c2; // character 2 - for (var i = 0; i < string.length; ++i) { - c1 = string.charCodeAt(i); - if (c1 < 128) { - buffer[offset++] = c1; - } else if (c1 < 2048) { - buffer[offset++] = c1 >> 6 | 192; - buffer[offset++] = c1 & 63 | 128; - } else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) { - c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF); - ++i; - buffer[offset++] = c1 >> 18 | 240; - buffer[offset++] = c1 >> 12 & 63 | 128; - buffer[offset++] = c1 >> 6 & 63 | 128; - buffer[offset++] = c1 & 63 | 128; - } else { - buffer[offset++] = c1 >> 12 | 224; - buffer[offset++] = c1 >> 6 & 63 | 128; - buffer[offset++] = c1 & 63 | 128; - } - } - return offset - start; - }; - })(utf8$2); - return utf8$2; -} - -var pool_1; -var hasRequiredPool; -function requirePool() { - if (hasRequiredPool) return pool_1; - hasRequiredPool = 1; - pool_1 = pool; - - /** - * An allocator as used by {@link util.pool}. - * @typedef PoolAllocator - * @type {function} - * @param {number} size Buffer size - * @returns {Uint8Array} Buffer - */ - - /** - * A slicer as used by {@link util.pool}. - * @typedef PoolSlicer - * @type {function} - * @param {number} start Start offset - * @param {number} end End offset - * @returns {Uint8Array} Buffer slice - * @this {Uint8Array} - */ - - /** - * A general purpose buffer pool. - * @memberof util - * @function - * @param {PoolAllocator} alloc Allocator - * @param {PoolSlicer} slice Slicer - * @param {number} [size=8192] Slab size - * @returns {PoolAllocator} Pooled allocator - */ - function pool(alloc, slice, size) { - var SIZE = size || 8192; - var MAX = SIZE >>> 1; - var slab = null; - var offset = SIZE; - return function pool_alloc(size) { - if (size < 1 || size > MAX) return alloc(size); - if (offset + size > SIZE) { - slab = alloc(SIZE); - offset = 0; - } - var buf = slice.call(slab, offset, offset += size); - if (offset & 7) - // align to 32 bit - offset = (offset | 7) + 1; - return buf; - }; - } - return pool_1; -} - -var longbits; -var hasRequiredLongbits; -function requireLongbits() { - if (hasRequiredLongbits) return longbits; - hasRequiredLongbits = 1; - longbits = LongBits; - var util = requireMinimal(); - - /** - * Constructs new long bits. - * @classdesc Helper class for working with the low and high bits of a 64 bit value. - * @memberof util - * @constructor - * @param {number} lo Low 32 bits, unsigned - * @param {number} hi High 32 bits, unsigned - */ - function LongBits(lo, hi) { - // note that the casts below are theoretically unnecessary as of today, but older statically - // generated converter code might still call the ctor with signed 32bits. kept for compat. - - /** - * Low bits. - * @type {number} - */ - this.lo = lo >>> 0; - - /** - * High bits. - * @type {number} - */ - this.hi = hi >>> 0; - } - - /** - * Zero bits. - * @memberof util.LongBits - * @type {util.LongBits} - */ - var zero = LongBits.zero = new LongBits(0, 0); - zero.toNumber = function () { - return 0; - }; - zero.zzEncode = zero.zzDecode = function () { - return this; - }; - zero.length = function () { - return 1; - }; - - /** - * Zero hash. - * @memberof util.LongBits - * @type {string} - */ - var zeroHash = LongBits.zeroHash = "\0\0\0\0\0\0\0\0"; - - /** - * Constructs new long bits from the specified number. - * @param {number} value Value - * @returns {util.LongBits} Instance - */ - LongBits.fromNumber = function fromNumber(value) { - if (value === 0) return zero; - var sign = value < 0; - if (sign) value = -value; - var lo = value >>> 0, - hi = (value - lo) / 4294967296 >>> 0; - if (sign) { - hi = ~hi >>> 0; - lo = ~lo >>> 0; - if (++lo > 4294967295) { - lo = 0; - if (++hi > 4294967295) hi = 0; - } - } - return new LongBits(lo, hi); - }; - - /** - * Constructs new long bits from a number, long or string. - * @param {Long|number|string} value Value - * @returns {util.LongBits} Instance - */ - LongBits.from = function from(value) { - if (typeof value === "number") return LongBits.fromNumber(value); - if (util.isString(value)) { - /* istanbul ignore else */ - if (util.Long) value = util.Long.fromString(value);else return LongBits.fromNumber(parseInt(value, 10)); - } - return value.low || value.high ? new LongBits(value.low >>> 0, value.high >>> 0) : zero; - }; - - /** - * Converts this long bits to a possibly unsafe JavaScript number. - * @param {boolean} [unsigned=false] Whether unsigned or not - * @returns {number} Possibly unsafe number - */ - LongBits.prototype.toNumber = function toNumber(unsigned) { - if (!unsigned && this.hi >>> 31) { - var lo = ~this.lo + 1 >>> 0, - hi = ~this.hi >>> 0; - if (!lo) hi = hi + 1 >>> 0; - return -(lo + hi * 4294967296); - } - return this.lo + this.hi * 4294967296; - }; - - /** - * Converts this long bits to a long. - * @param {boolean} [unsigned=false] Whether unsigned or not - * @returns {Long} Long - */ - LongBits.prototype.toLong = function toLong(unsigned) { - return util.Long ? new util.Long(this.lo | 0, this.hi | 0, Boolean(unsigned)) - /* istanbul ignore next */ : { - low: this.lo | 0, - high: this.hi | 0, - unsigned: Boolean(unsigned) - }; - }; - var charCodeAt = String.prototype.charCodeAt; - - /** - * Constructs new long bits from the specified 8 characters long hash. - * @param {string} hash Hash - * @returns {util.LongBits} Bits - */ - LongBits.fromHash = function fromHash(hash) { - if (hash === zeroHash) return zero; - return new LongBits((charCodeAt.call(hash, 0) | charCodeAt.call(hash, 1) << 8 | charCodeAt.call(hash, 2) << 16 | charCodeAt.call(hash, 3) << 24) >>> 0, (charCodeAt.call(hash, 4) | charCodeAt.call(hash, 5) << 8 | charCodeAt.call(hash, 6) << 16 | charCodeAt.call(hash, 7) << 24) >>> 0); - }; - - /** - * Converts this long bits to a 8 characters long hash. - * @returns {string} Hash - */ - LongBits.prototype.toHash = function toHash() { - return String.fromCharCode(this.lo & 255, this.lo >>> 8 & 255, this.lo >>> 16 & 255, this.lo >>> 24, this.hi & 255, this.hi >>> 8 & 255, this.hi >>> 16 & 255, this.hi >>> 24); - }; - - /** - * Zig-zag encodes this long bits. - * @returns {util.LongBits} `this` - */ - LongBits.prototype.zzEncode = function zzEncode() { - var mask = this.hi >> 31; - this.hi = ((this.hi << 1 | this.lo >>> 31) ^ mask) >>> 0; - this.lo = (this.lo << 1 ^ mask) >>> 0; - return this; - }; - - /** - * Zig-zag decodes this long bits. - * @returns {util.LongBits} `this` - */ - LongBits.prototype.zzDecode = function zzDecode() { - var mask = -(this.lo & 1); - this.lo = ((this.lo >>> 1 | this.hi << 31) ^ mask) >>> 0; - this.hi = (this.hi >>> 1 ^ mask) >>> 0; - return this; - }; - - /** - * Calculates the length of this longbits when encoded as a varint. - * @returns {number} Length - */ - LongBits.prototype.length = function length() { - var part0 = this.lo, - part1 = (this.lo >>> 28 | this.hi << 4) >>> 0, - part2 = this.hi >>> 24; - return part2 === 0 ? part1 === 0 ? part0 < 16384 ? part0 < 128 ? 1 : 2 : part0 < 2097152 ? 3 : 4 : part1 < 16384 ? part1 < 128 ? 5 : 6 : part1 < 2097152 ? 7 : 8 : part2 < 128 ? 9 : 10; - }; - return longbits; -} - -var hasRequiredMinimal; -function requireMinimal() { - if (hasRequiredMinimal) return minimal$1; - hasRequiredMinimal = 1; - (function (exports) { - - var util = exports; - - // used to return a Promise where callback is omitted - util.asPromise = requireAspromise(); - - // converts to / from base64 encoded strings - util.base64 = requireBase64(); - - // base class of rpc.Service - util.EventEmitter = requireEventemitter(); - - // float handling accross browsers - util.float = requireFloat(); - - // requires modules optionally and hides the call from bundlers - util.inquire = requireInquire(); - - // converts to / from utf8 encoded strings - util.utf8 = requireUtf8(); - - // provides a node-like buffer pool in the browser - util.pool = requirePool(); - - // utility to work with the low and high bits of a 64 bit value - util.LongBits = requireLongbits(); - - /** - * Whether running within node or not. - * @memberof util - * @type {boolean} - */ - util.isNode = Boolean(typeof commonjsGlobal !== "undefined" && commonjsGlobal && commonjsGlobal.process && commonjsGlobal.process.versions && commonjsGlobal.process.versions.node); - - /** - * Global object reference. - * @memberof util - * @type {Object} - */ - util.global = util.isNode && commonjsGlobal || typeof window !== "undefined" && window || typeof self !== "undefined" && self || commonjsGlobal; // eslint-disable-line no-invalid-this - - /** - * An immuable empty array. - * @memberof util - * @type {Array.<*>} - * @const - */ - util.emptyArray = Object.freeze ? Object.freeze([]) : /* istanbul ignore next */[]; // used on prototypes - - /** - * An immutable empty object. - * @type {Object} - * @const - */ - util.emptyObject = Object.freeze ? Object.freeze({}) : /* istanbul ignore next */{}; // used on prototypes - - /** - * Tests if the specified value is an integer. - * @function - * @param {*} value Value to test - * @returns {boolean} `true` if the value is an integer - */ - util.isInteger = Number.isInteger || /* istanbul ignore next */function isInteger(value) { - return typeof value === "number" && isFinite(value) && Math.floor(value) === value; - }; - - /** - * Tests if the specified value is a string. - * @param {*} value Value to test - * @returns {boolean} `true` if the value is a string - */ - util.isString = function isString(value) { - return typeof value === "string" || value instanceof String; - }; - - /** - * Tests if the specified value is a non-null object. - * @param {*} value Value to test - * @returns {boolean} `true` if the value is a non-null object - */ - util.isObject = function isObject(value) { - return value && typeof value === "object"; - }; - - /** - * Checks if a property on a message is considered to be present. - * This is an alias of {@link util.isSet}. - * @function - * @param {Object} obj Plain object or message instance - * @param {string} prop Property name - * @returns {boolean} `true` if considered to be present, otherwise `false` - */ - util.isset = - /** - * Checks if a property on a message is considered to be present. - * @param {Object} obj Plain object or message instance - * @param {string} prop Property name - * @returns {boolean} `true` if considered to be present, otherwise `false` - */ - util.isSet = function isSet(obj, prop) { - var value = obj[prop]; - if (value != null && obj.hasOwnProperty(prop)) - // eslint-disable-line eqeqeq, no-prototype-builtins - return typeof value !== "object" || (Array.isArray(value) ? value.length : Object.keys(value).length) > 0; - return false; - }; - - /** - * Any compatible Buffer instance. - * This is a minimal stand-alone definition of a Buffer instance. The actual type is that exported by node's typings. - * @interface Buffer - * @extends Uint8Array - */ - - /** - * Node's Buffer class if available. - * @type {Constructor} - */ - util.Buffer = function () { - try { - var Buffer = util.inquire("buffer").Buffer; - // refuse to use non-node buffers if not explicitly assigned (perf reasons): - return Buffer.prototype.utf8Write ? Buffer : /* istanbul ignore next */null; - } catch (e) { - /* istanbul ignore next */ - return null; - } - }(); - - // Internal alias of or polyfull for Buffer.from. - util._Buffer_from = null; - - // Internal alias of or polyfill for Buffer.allocUnsafe. - util._Buffer_allocUnsafe = null; - - /** - * Creates a new buffer of whatever type supported by the environment. - * @param {number|number[]} [sizeOrArray=0] Buffer size or number array - * @returns {Uint8Array|Buffer} Buffer - */ - util.newBuffer = function newBuffer(sizeOrArray) { - /* istanbul ignore next */ - return typeof sizeOrArray === "number" ? util.Buffer ? util._Buffer_allocUnsafe(sizeOrArray) : new util.Array(sizeOrArray) : util.Buffer ? util._Buffer_from(sizeOrArray) : typeof Uint8Array === "undefined" ? sizeOrArray : new Uint8Array(sizeOrArray); - }; - - /** - * Array implementation used in the browser. `Uint8Array` if supported, otherwise `Array`. - * @type {Constructor} - */ - util.Array = typeof Uint8Array !== "undefined" ? Uint8Array /* istanbul ignore next */ : Array; - - /** - * Any compatible Long instance. - * This is a minimal stand-alone definition of a Long instance. The actual type is that exported by long.js. - * @interface Long - * @property {number} low Low bits - * @property {number} high High bits - * @property {boolean} unsigned Whether unsigned or not - */ - - /** - * Long.js's Long class if available. - * @type {Constructor} - */ - util.Long = /* istanbul ignore next */util.global.dcodeIO && /* istanbul ignore next */util.global.dcodeIO.Long || /* istanbul ignore next */util.global.Long || util.inquire("long"); - - /** - * Regular expression used to verify 2 bit (`bool`) map keys. - * @type {RegExp} - * @const - */ - util.key2Re = /^true|false|0|1$/; - - /** - * Regular expression used to verify 32 bit (`int32` etc.) map keys. - * @type {RegExp} - * @const - */ - util.key32Re = /^-?(?:0|[1-9][0-9]*)$/; - - /** - * Regular expression used to verify 64 bit (`int64` etc.) map keys. - * @type {RegExp} - * @const - */ - util.key64Re = /^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/; - - /** - * Converts a number or long to an 8 characters long hash string. - * @param {Long|number} value Value to convert - * @returns {string} Hash - */ - util.longToHash = function longToHash(value) { - return value ? util.LongBits.from(value).toHash() : util.LongBits.zeroHash; - }; - - /** - * Converts an 8 characters long hash string to a long or number. - * @param {string} hash Hash - * @param {boolean} [unsigned=false] Whether unsigned or not - * @returns {Long|number} Original value - */ - util.longFromHash = function longFromHash(hash, unsigned) { - var bits = util.LongBits.fromHash(hash); - if (util.Long) return util.Long.fromBits(bits.lo, bits.hi, unsigned); - return bits.toNumber(Boolean(unsigned)); - }; - - /** - * Merges the properties of the source object into the destination object. - * @memberof util - * @param {Object.} dst Destination object - * @param {Object.} src Source object - * @param {boolean} [ifNotSet=false] Merges only if the key is not already set - * @returns {Object.} Destination object - */ - function merge(dst, src, ifNotSet) { - // used by converters - for (var keys = Object.keys(src), i = 0; i < keys.length; ++i) if (dst[keys[i]] === undefined || !ifNotSet) dst[keys[i]] = src[keys[i]]; - return dst; - } - util.merge = merge; - - /** - * Converts the first character of a string to lower case. - * @param {string} str String to convert - * @returns {string} Converted string - */ - util.lcFirst = function lcFirst(str) { - return str.charAt(0).toLowerCase() + str.substring(1); - }; - - /** - * Creates a custom error constructor. - * @memberof util - * @param {string} name Error name - * @returns {Constructor} Custom error constructor - */ - function newError(name) { - function CustomError(message, properties) { - if (!(this instanceof CustomError)) return new CustomError(message, properties); - - // Error.call(this, message); - // ^ just returns a new error instance because the ctor can be called as a function - - Object.defineProperty(this, "message", { - get: function () { - return message; - } - }); - - /* istanbul ignore next */ - if (Error.captureStackTrace) - // node - Error.captureStackTrace(this, CustomError);else Object.defineProperty(this, "stack", { - value: new Error().stack || "" - }); - if (properties) merge(this, properties); - } - CustomError.prototype = Object.create(Error.prototype, { - constructor: { - value: CustomError, - writable: true, - enumerable: false, - configurable: true - }, - name: { - get: function get() { - return name; - }, - set: undefined, - enumerable: false, - // configurable: false would accurately preserve the behavior of - // the original, but I'm guessing that was not intentional. - // For an actual error subclass, this property would - // be configurable. - configurable: true - }, - toString: { - value: function value() { - return this.name + ": " + this.message; - }, - writable: true, - enumerable: false, - configurable: true - } - }); - return CustomError; - } - util.newError = newError; - - /** - * Constructs a new protocol error. - * @classdesc Error subclass indicating a protocol specifc error. - * @memberof util - * @extends Error - * @template T extends Message - * @constructor - * @param {string} message Error message - * @param {Object.} [properties] Additional properties - * @example - * try { - * MyMessage.decode(someBuffer); // throws if required fields are missing - * } catch (e) { - * if (e instanceof ProtocolError && e.instance) - * console.log("decoded so far: " + JSON.stringify(e.instance)); - * } - */ - util.ProtocolError = newError("ProtocolError"); - - /** - * So far decoded message instance. - * @name util.ProtocolError#instance - * @type {Message} - */ - - /** - * A OneOf getter as returned by {@link util.oneOfGetter}. - * @typedef OneOfGetter - * @type {function} - * @returns {string|undefined} Set field name, if any - */ - - /** - * Builds a getter for a oneof's present field name. - * @param {string[]} fieldNames Field names - * @returns {OneOfGetter} Unbound getter - */ - util.oneOfGetter = function getOneOf(fieldNames) { - var fieldMap = {}; - for (var i = 0; i < fieldNames.length; ++i) fieldMap[fieldNames[i]] = 1; - - /** - * @returns {string|undefined} Set field name, if any - * @this Object - * @ignore - */ - return function () { - // eslint-disable-line consistent-return - for (var keys = Object.keys(this), i = keys.length - 1; i > -1; --i) if (fieldMap[keys[i]] === 1 && this[keys[i]] !== undefined && this[keys[i]] !== null) return keys[i]; - }; - }; - - /** - * A OneOf setter as returned by {@link util.oneOfSetter}. - * @typedef OneOfSetter - * @type {function} - * @param {string|undefined} value Field name - * @returns {undefined} - */ - - /** - * Builds a setter for a oneof's present field name. - * @param {string[]} fieldNames Field names - * @returns {OneOfSetter} Unbound setter - */ - util.oneOfSetter = function setOneOf(fieldNames) { - /** - * @param {string} name Field name - * @returns {undefined} - * @this Object - * @ignore - */ - return function (name) { - for (var i = 0; i < fieldNames.length; ++i) if (fieldNames[i] !== name) delete this[fieldNames[i]]; - }; - }; - - /** - * Default conversion options used for {@link Message#toJSON} implementations. - * - * These options are close to proto3's JSON mapping with the exception that internal types like Any are handled just like messages. More precisely: - * - * - Longs become strings - * - Enums become string keys - * - Bytes become base64 encoded strings - * - (Sub-)Messages become plain objects - * - Maps become plain objects with all string keys - * - Repeated fields become arrays - * - NaN and Infinity for float and double fields become strings - * - * @type {IConversionOptions} - * @see https://developers.google.com/protocol-buffers/docs/proto3?hl=en#json - */ - util.toJSONOptions = { - longs: String, - enums: String, - bytes: String, - json: true - }; - - // Sets up buffer utility according to the environment (called in index-minimal) - util._configure = function () { - var Buffer = util.Buffer; - /* istanbul ignore if */ - if (!Buffer) { - util._Buffer_from = util._Buffer_allocUnsafe = null; - return; - } - // because node 4.x buffers are incompatible & immutable - // see: https://github.com/dcodeIO/protobuf.js/pull/665 - util._Buffer_from = Buffer.from !== Uint8Array.from && Buffer.from || /* istanbul ignore next */ - function Buffer_from(value, encoding) { - return new Buffer(value, encoding); - }; - util._Buffer_allocUnsafe = Buffer.allocUnsafe || /* istanbul ignore next */ - function Buffer_allocUnsafe(size) { - return new Buffer(size); - }; - }; - })(minimal$1); - return minimal$1; -} - -var writer$2 = Writer$1; -var util$4 = requireMinimal(); -var BufferWriter$1; // cyclic - -var LongBits$1 = util$4.LongBits, - base64 = util$4.base64, - utf8$1 = util$4.utf8; - -/** - * Constructs a new writer operation instance. - * @classdesc Scheduled writer operation. - * @constructor - * @param {function(*, Uint8Array, number)} fn Function to call - * @param {number} len Value byte length - * @param {*} val Value to write - * @ignore - */ -function Op(fn, len, val) { - /** - * Function to call. - * @type {function(Uint8Array, number, *)} - */ - this.fn = fn; - - /** - * Value byte length. - * @type {number} - */ - this.len = len; - - /** - * Next operation. - * @type {Writer.Op|undefined} - */ - this.next = undefined; - - /** - * Value to write. - * @type {*} - */ - this.val = val; // type varies -} - -/* istanbul ignore next */ -function noop() {} // eslint-disable-line no-empty-function - -/** - * Constructs a new writer state instance. - * @classdesc Copied writer state. - * @memberof Writer - * @constructor - * @param {Writer} writer Writer to copy state from - * @ignore - */ -function State(writer) { - /** - * Current head. - * @type {Writer.Op} - */ - this.head = writer.head; - - /** - * Current tail. - * @type {Writer.Op} - */ - this.tail = writer.tail; - - /** - * Current buffer length. - * @type {number} - */ - this.len = writer.len; - - /** - * Next state. - * @type {State|null} - */ - this.next = writer.states; -} - -/** - * Constructs a new writer instance. - * @classdesc Wire format writer using `Uint8Array` if available, otherwise `Array`. - * @constructor - */ -function Writer$1() { - /** - * Current length. - * @type {number} - */ - this.len = 0; - - /** - * Operations head. - * @type {Object} - */ - this.head = new Op(noop, 0, 0); - - /** - * Operations tail - * @type {Object} - */ - this.tail = this.head; - - /** - * Linked forked states. - * @type {Object|null} - */ - this.states = null; - - // When a value is written, the writer calculates its byte length and puts it into a linked - // list of operations to perform when finish() is called. This both allows us to allocate - // buffers of the exact required size and reduces the amount of work we have to do compared - // to first calculating over objects and then encoding over objects. In our case, the encoding - // part is just a linked list walk calling operations with already prepared values. -} - -var create$1 = function create() { - return util$4.Buffer ? function create_buffer_setup() { - return (Writer$1.create = function create_buffer() { - return new BufferWriter$1(); - })(); - } - /* istanbul ignore next */ : function create_array() { - return new Writer$1(); - }; -}; - -/** - * Creates a new writer. - * @function - * @returns {BufferWriter|Writer} A {@link BufferWriter} when Buffers are supported, otherwise a {@link Writer} - */ -Writer$1.create = create$1(); - -/** - * Allocates a buffer of the specified size. - * @param {number} size Buffer size - * @returns {Uint8Array} Buffer - */ -Writer$1.alloc = function alloc(size) { - return new util$4.Array(size); -}; - -// Use Uint8Array buffer pool in the browser, just like node does with buffers -/* istanbul ignore else */ -if (util$4.Array !== Array) Writer$1.alloc = util$4.pool(Writer$1.alloc, util$4.Array.prototype.subarray); - -/** - * Pushes a new operation to the queue. - * @param {function(Uint8Array, number, *)} fn Function to call - * @param {number} len Value byte length - * @param {number} val Value to write - * @returns {Writer} `this` - * @private - */ -Writer$1.prototype._push = function push(fn, len, val) { - this.tail = this.tail.next = new Op(fn, len, val); - this.len += len; - return this; -}; -function writeByte(val, buf, pos) { - buf[pos] = val & 255; -} -function writeVarint32(val, buf, pos) { - while (val > 127) { - buf[pos++] = val & 127 | 128; - val >>>= 7; - } - buf[pos] = val; -} - -/** - * Constructs a new varint writer operation instance. - * @classdesc Scheduled varint writer operation. - * @extends Op - * @constructor - * @param {number} len Value byte length - * @param {number} val Value to write - * @ignore - */ -function VarintOp(len, val) { - this.len = len; - this.next = undefined; - this.val = val; -} -VarintOp.prototype = Object.create(Op.prototype); -VarintOp.prototype.fn = writeVarint32; - -/** - * Writes an unsigned 32 bit value as a varint. - * @param {number} value Value to write - * @returns {Writer} `this` - */ -Writer$1.prototype.uint32 = function write_uint32(value) { - // here, the call to this.push has been inlined and a varint specific Op subclass is used. - // uint32 is by far the most frequently used operation and benefits significantly from this. - this.len += (this.tail = this.tail.next = new VarintOp((value = value >>> 0) < 128 ? 1 : value < 16384 ? 2 : value < 2097152 ? 3 : value < 268435456 ? 4 : 5, value)).len; - return this; -}; - -/** - * Writes a signed 32 bit value as a varint. - * @function - * @param {number} value Value to write - * @returns {Writer} `this` - */ -Writer$1.prototype.int32 = function write_int32(value) { - return value < 0 ? this._push(writeVarint64, 10, LongBits$1.fromNumber(value)) // 10 bytes per spec - : this.uint32(value); -}; - -/** - * Writes a 32 bit value as a varint, zig-zag encoded. - * @param {number} value Value to write - * @returns {Writer} `this` - */ -Writer$1.prototype.sint32 = function write_sint32(value) { - return this.uint32((value << 1 ^ value >> 31) >>> 0); -}; -function writeVarint64(val, buf, pos) { - while (val.hi) { - buf[pos++] = val.lo & 127 | 128; - val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0; - val.hi >>>= 7; - } - while (val.lo > 127) { - buf[pos++] = val.lo & 127 | 128; - val.lo = val.lo >>> 7; - } - buf[pos++] = val.lo; -} - -/** - * Writes an unsigned 64 bit value as a varint. - * @param {Long|number|string} value Value to write - * @returns {Writer} `this` - * @throws {TypeError} If `value` is a string and no long library is present. - */ -Writer$1.prototype.uint64 = function write_uint64(value) { - var bits = LongBits$1.from(value); - return this._push(writeVarint64, bits.length(), bits); -}; - -/** - * Writes a signed 64 bit value as a varint. - * @function - * @param {Long|number|string} value Value to write - * @returns {Writer} `this` - * @throws {TypeError} If `value` is a string and no long library is present. - */ -Writer$1.prototype.int64 = Writer$1.prototype.uint64; - -/** - * Writes a signed 64 bit value as a varint, zig-zag encoded. - * @param {Long|number|string} value Value to write - * @returns {Writer} `this` - * @throws {TypeError} If `value` is a string and no long library is present. - */ -Writer$1.prototype.sint64 = function write_sint64(value) { - var bits = LongBits$1.from(value).zzEncode(); - return this._push(writeVarint64, bits.length(), bits); -}; - -/** - * Writes a boolish value as a varint. - * @param {boolean} value Value to write - * @returns {Writer} `this` - */ -Writer$1.prototype.bool = function write_bool(value) { - return this._push(writeByte, 1, value ? 1 : 0); -}; -function writeFixed32(val, buf, pos) { - buf[pos] = val & 255; - buf[pos + 1] = val >>> 8 & 255; - buf[pos + 2] = val >>> 16 & 255; - buf[pos + 3] = val >>> 24; -} - -/** - * Writes an unsigned 32 bit value as fixed 32 bits. - * @param {number} value Value to write - * @returns {Writer} `this` - */ -Writer$1.prototype.fixed32 = function write_fixed32(value) { - return this._push(writeFixed32, 4, value >>> 0); -}; - -/** - * Writes a signed 32 bit value as fixed 32 bits. - * @function - * @param {number} value Value to write - * @returns {Writer} `this` - */ -Writer$1.prototype.sfixed32 = Writer$1.prototype.fixed32; - -/** - * Writes an unsigned 64 bit value as fixed 64 bits. - * @param {Long|number|string} value Value to write - * @returns {Writer} `this` - * @throws {TypeError} If `value` is a string and no long library is present. - */ -Writer$1.prototype.fixed64 = function write_fixed64(value) { - var bits = LongBits$1.from(value); - return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi); -}; - -/** - * Writes a signed 64 bit value as fixed 64 bits. - * @function - * @param {Long|number|string} value Value to write - * @returns {Writer} `this` - * @throws {TypeError} If `value` is a string and no long library is present. - */ -Writer$1.prototype.sfixed64 = Writer$1.prototype.fixed64; - -/** - * Writes a float (32 bit). - * @function - * @param {number} value Value to write - * @returns {Writer} `this` - */ -Writer$1.prototype.float = function write_float(value) { - return this._push(util$4.float.writeFloatLE, 4, value); -}; - -/** - * Writes a double (64 bit float). - * @function - * @param {number} value Value to write - * @returns {Writer} `this` - */ -Writer$1.prototype.double = function write_double(value) { - return this._push(util$4.float.writeDoubleLE, 8, value); -}; -var writeBytes = util$4.Array.prototype.set ? function writeBytes_set(val, buf, pos) { - buf.set(val, pos); // also works for plain array values -} -/* istanbul ignore next */ : function writeBytes_for(val, buf, pos) { - for (var i = 0; i < val.length; ++i) buf[pos + i] = val[i]; -}; - -/** - * Writes a sequence of bytes. - * @param {Uint8Array|string} value Buffer or base64 encoded string to write - * @returns {Writer} `this` - */ -Writer$1.prototype.bytes = function write_bytes(value) { - var len = value.length >>> 0; - if (!len) return this._push(writeByte, 1, 0); - if (util$4.isString(value)) { - var buf = Writer$1.alloc(len = base64.length(value)); - base64.decode(value, buf, 0); - value = buf; - } - return this.uint32(len)._push(writeBytes, len, value); -}; - -/** - * Writes a string. - * @param {string} value Value to write - * @returns {Writer} `this` - */ -Writer$1.prototype.string = function write_string(value) { - var len = utf8$1.length(value); - return len ? this.uint32(len)._push(utf8$1.write, len, value) : this._push(writeByte, 1, 0); -}; - -/** - * Forks this writer's state by pushing it to a stack. - * Calling {@link Writer#reset|reset} or {@link Writer#ldelim|ldelim} resets the writer to the previous state. - * @returns {Writer} `this` - */ -Writer$1.prototype.fork = function fork() { - this.states = new State(this); - this.head = this.tail = new Op(noop, 0, 0); - this.len = 0; - return this; -}; - -/** - * Resets this instance to the last state. - * @returns {Writer} `this` - */ -Writer$1.prototype.reset = function reset() { - if (this.states) { - this.head = this.states.head; - this.tail = this.states.tail; - this.len = this.states.len; - this.states = this.states.next; - } else { - this.head = this.tail = new Op(noop, 0, 0); - this.len = 0; - } - return this; -}; - -/** - * Resets to the last state and appends the fork state's current write length as a varint followed by its operations. - * @returns {Writer} `this` - */ -Writer$1.prototype.ldelim = function ldelim() { - var head = this.head, - tail = this.tail, - len = this.len; - this.reset().uint32(len); - if (len) { - this.tail.next = head.next; // skip noop - this.tail = tail; - this.len += len; - } - return this; -}; - -/** - * Finishes the write operation. - * @returns {Uint8Array} Finished buffer - */ -Writer$1.prototype.finish = function finish() { - var head = this.head.next, - // skip noop - buf = this.constructor.alloc(this.len), - pos = 0; - while (head) { - head.fn(head.val, buf, pos); - pos += head.len; - head = head.next; - } - // this.head = this.tail = null; - return buf; -}; -Writer$1._configure = function (BufferWriter_) { - BufferWriter$1 = BufferWriter_; - Writer$1.create = create$1(); - BufferWriter$1._configure(); -}; - -var writer_buffer = BufferWriter; - -// extends Writer -var Writer = writer$2; -(BufferWriter.prototype = Object.create(Writer.prototype)).constructor = BufferWriter; -var util$3 = requireMinimal(); - -/** - * Constructs a new buffer writer instance. - * @classdesc Wire format writer using node buffers. - * @extends Writer - * @constructor - */ -function BufferWriter() { - Writer.call(this); -} -BufferWriter._configure = function () { - /** - * Allocates a buffer of the specified size. - * @function - * @param {number} size Buffer size - * @returns {Buffer} Buffer - */ - BufferWriter.alloc = util$3._Buffer_allocUnsafe; - BufferWriter.writeBytesBuffer = util$3.Buffer && util$3.Buffer.prototype instanceof Uint8Array && util$3.Buffer.prototype.set.name === "set" ? function writeBytesBuffer_set(val, buf, pos) { - buf.set(val, pos); // faster than copy (requires node >= 4 where Buffers extend Uint8Array and set is properly inherited) - // also works for plain array values - } - /* istanbul ignore next */ : function writeBytesBuffer_copy(val, buf, pos) { - if (val.copy) - // Buffer values - val.copy(buf, pos, 0, val.length);else for (var i = 0; i < val.length;) - // plain array values - buf[pos++] = val[i++]; - }; -}; - -/** - * @override - */ -BufferWriter.prototype.bytes = function write_bytes_buffer(value) { - if (util$3.isString(value)) value = util$3._Buffer_from(value, "base64"); - var len = value.length >>> 0; - this.uint32(len); - if (len) this._push(BufferWriter.writeBytesBuffer, len, value); - return this; -}; -function writeStringBuffer(val, buf, pos) { - if (val.length < 40) - // plain js is faster for short strings (probably due to redundant assertions) - util$3.utf8.write(val, buf, pos);else if (buf.utf8Write) buf.utf8Write(val, pos);else buf.write(val, pos); -} - -/** - * @override - */ -BufferWriter.prototype.string = function write_string_buffer(value) { - var len = util$3.Buffer.byteLength(value); - this.uint32(len); - if (len) this._push(writeStringBuffer, len, value); - return this; -}; - -/** - * Finishes the write operation. - * @name BufferWriter#finish - * @function - * @returns {Buffer} Finished buffer - */ - -BufferWriter._configure(); - -var reader = Reader$1; -var util$2 = requireMinimal(); -var BufferReader$1; // cyclic - -var LongBits = util$2.LongBits, - utf8 = util$2.utf8; - -/* istanbul ignore next */ -function indexOutOfRange(reader, writeLength) { - return RangeError("index out of range: " + reader.pos + " + " + (writeLength || 1) + " > " + reader.len); -} - -/** - * Constructs a new reader instance using the specified buffer. - * @classdesc Wire format reader using `Uint8Array` if available, otherwise `Array`. - * @constructor - * @param {Uint8Array} buffer Buffer to read from - */ -function Reader$1(buffer) { - /** - * Read buffer. - * @type {Uint8Array} - */ - this.buf = buffer; - - /** - * Read buffer position. - * @type {number} - */ - this.pos = 0; - - /** - * Read buffer length. - * @type {number} - */ - this.len = buffer.length; -} -var create_array = typeof Uint8Array !== "undefined" ? function create_typed_array(buffer) { - if (buffer instanceof Uint8Array || Array.isArray(buffer)) return new Reader$1(buffer); - throw Error("illegal buffer"); -} -/* istanbul ignore next */ : function create_array(buffer) { - if (Array.isArray(buffer)) return new Reader$1(buffer); - throw Error("illegal buffer"); -}; -var create = function create() { - return util$2.Buffer ? function create_buffer_setup(buffer) { - return (Reader$1.create = function create_buffer(buffer) { - return util$2.Buffer.isBuffer(buffer) ? new BufferReader$1(buffer) - /* istanbul ignore next */ : create_array(buffer); - })(buffer); - } - /* istanbul ignore next */ : create_array; -}; - -/** - * Creates a new reader using the specified buffer. - * @function - * @param {Uint8Array|Buffer} buffer Buffer to read from - * @returns {Reader|BufferReader} A {@link BufferReader} if `buffer` is a Buffer, otherwise a {@link Reader} - * @throws {Error} If `buffer` is not a valid buffer - */ -Reader$1.create = create(); -Reader$1.prototype._slice = util$2.Array.prototype.subarray || /* istanbul ignore next */util$2.Array.prototype.slice; - -/** - * Reads a varint as an unsigned 32 bit value. - * @function - * @returns {number} Value read - */ -Reader$1.prototype.uint32 = function read_uint32_setup() { - var value = 4294967295; // optimizer type-hint, tends to deopt otherwise (?!) - return function read_uint32() { - value = (this.buf[this.pos] & 127) >>> 0; - if (this.buf[this.pos++] < 128) return value; - value = (value | (this.buf[this.pos] & 127) << 7) >>> 0; - if (this.buf[this.pos++] < 128) return value; - value = (value | (this.buf[this.pos] & 127) << 14) >>> 0; - if (this.buf[this.pos++] < 128) return value; - value = (value | (this.buf[this.pos] & 127) << 21) >>> 0; - if (this.buf[this.pos++] < 128) return value; - value = (value | (this.buf[this.pos] & 15) << 28) >>> 0; - if (this.buf[this.pos++] < 128) return value; - - /* istanbul ignore if */ - if ((this.pos += 5) > this.len) { - this.pos = this.len; - throw indexOutOfRange(this, 10); - } - return value; - }; -}(); - -/** - * Reads a varint as a signed 32 bit value. - * @returns {number} Value read - */ -Reader$1.prototype.int32 = function read_int32() { - return this.uint32() | 0; -}; - -/** - * Reads a zig-zag encoded varint as a signed 32 bit value. - * @returns {number} Value read - */ -Reader$1.prototype.sint32 = function read_sint32() { - var value = this.uint32(); - return value >>> 1 ^ -(value & 1) | 0; -}; - -/* eslint-disable no-invalid-this */ - -function readLongVarint() { - // tends to deopt with local vars for octet etc. - var bits = new LongBits(0, 0); - var i = 0; - if (this.len - this.pos > 4) { - // fast route (lo) - for (; i < 4; ++i) { - // 1st..4th - bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0; - if (this.buf[this.pos++] < 128) return bits; - } - // 5th - bits.lo = (bits.lo | (this.buf[this.pos] & 127) << 28) >>> 0; - bits.hi = (bits.hi | (this.buf[this.pos] & 127) >> 4) >>> 0; - if (this.buf[this.pos++] < 128) return bits; - i = 0; - } else { - for (; i < 3; ++i) { - /* istanbul ignore if */ - if (this.pos >= this.len) throw indexOutOfRange(this); - // 1st..3th - bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0; - if (this.buf[this.pos++] < 128) return bits; - } - // 4th - bits.lo = (bits.lo | (this.buf[this.pos++] & 127) << i * 7) >>> 0; - return bits; - } - if (this.len - this.pos > 4) { - // fast route (hi) - for (; i < 5; ++i) { - // 6th..10th - bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0; - if (this.buf[this.pos++] < 128) return bits; - } - } else { - for (; i < 5; ++i) { - /* istanbul ignore if */ - if (this.pos >= this.len) throw indexOutOfRange(this); - // 6th..10th - bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0; - if (this.buf[this.pos++] < 128) return bits; - } - } - /* istanbul ignore next */ - throw Error("invalid varint encoding"); -} - -/* eslint-enable no-invalid-this */ - -/** - * Reads a varint as a signed 64 bit value. - * @name Reader#int64 - * @function - * @returns {Long} Value read - */ - -/** - * Reads a varint as an unsigned 64 bit value. - * @name Reader#uint64 - * @function - * @returns {Long} Value read - */ - -/** - * Reads a zig-zag encoded varint as a signed 64 bit value. - * @name Reader#sint64 - * @function - * @returns {Long} Value read - */ - -/** - * Reads a varint as a boolean. - * @returns {boolean} Value read - */ -Reader$1.prototype.bool = function read_bool() { - return this.uint32() !== 0; -}; -function readFixed32_end(buf, end) { - // note that this uses `end`, not `pos` - return (buf[end - 4] | buf[end - 3] << 8 | buf[end - 2] << 16 | buf[end - 1] << 24) >>> 0; -} - -/** - * Reads fixed 32 bits as an unsigned 32 bit integer. - * @returns {number} Value read - */ -Reader$1.prototype.fixed32 = function read_fixed32() { - /* istanbul ignore if */ - if (this.pos + 4 > this.len) throw indexOutOfRange(this, 4); - return readFixed32_end(this.buf, this.pos += 4); -}; - -/** - * Reads fixed 32 bits as a signed 32 bit integer. - * @returns {number} Value read - */ -Reader$1.prototype.sfixed32 = function read_sfixed32() { - /* istanbul ignore if */ - if (this.pos + 4 > this.len) throw indexOutOfRange(this, 4); - return readFixed32_end(this.buf, this.pos += 4) | 0; -}; - -/* eslint-disable no-invalid-this */ - -function readFixed64( /* this: Reader */ -) { - /* istanbul ignore if */ - if (this.pos + 8 > this.len) throw indexOutOfRange(this, 8); - return new LongBits(readFixed32_end(this.buf, this.pos += 4), readFixed32_end(this.buf, this.pos += 4)); -} - -/* eslint-enable no-invalid-this */ - -/** - * Reads fixed 64 bits. - * @name Reader#fixed64 - * @function - * @returns {Long} Value read - */ - -/** - * Reads zig-zag encoded fixed 64 bits. - * @name Reader#sfixed64 - * @function - * @returns {Long} Value read - */ - -/** - * Reads a float (32 bit) as a number. - * @function - * @returns {number} Value read - */ -Reader$1.prototype.float = function read_float() { - /* istanbul ignore if */ - if (this.pos + 4 > this.len) throw indexOutOfRange(this, 4); - var value = util$2.float.readFloatLE(this.buf, this.pos); - this.pos += 4; - return value; -}; - -/** - * Reads a double (64 bit float) as a number. - * @function - * @returns {number} Value read - */ -Reader$1.prototype.double = function read_double() { - /* istanbul ignore if */ - if (this.pos + 8 > this.len) throw indexOutOfRange(this, 4); - var value = util$2.float.readDoubleLE(this.buf, this.pos); - this.pos += 8; - return value; -}; - -/** - * Reads a sequence of bytes preceeded by its length as a varint. - * @returns {Uint8Array} Value read - */ -Reader$1.prototype.bytes = function read_bytes() { - var length = this.uint32(), - start = this.pos, - end = this.pos + length; - - /* istanbul ignore if */ - if (end > this.len) throw indexOutOfRange(this, length); - this.pos += length; - if (Array.isArray(this.buf)) - // plain array - return this.buf.slice(start, end); - return start === end // fix for IE 10/Win8 and others' subarray returning array of size 1 - ? new this.buf.constructor(0) : this._slice.call(this.buf, start, end); -}; - -/** - * Reads a string preceeded by its byte length as a varint. - * @returns {string} Value read - */ -Reader$1.prototype.string = function read_string() { - var bytes = this.bytes(); - return utf8.read(bytes, 0, bytes.length); -}; - -/** - * Skips the specified number of bytes if specified, otherwise skips a varint. - * @param {number} [length] Length if known, otherwise a varint is assumed - * @returns {Reader} `this` - */ -Reader$1.prototype.skip = function skip(length) { - if (typeof length === "number") { - /* istanbul ignore if */ - if (this.pos + length > this.len) throw indexOutOfRange(this, length); - this.pos += length; - } else { - do { - /* istanbul ignore if */ - if (this.pos >= this.len) throw indexOutOfRange(this); - } while (this.buf[this.pos++] & 128); - } - return this; -}; - -/** - * Skips the next element of the specified wire type. - * @param {number} wireType Wire type received - * @returns {Reader} `this` - */ -Reader$1.prototype.skipType = function (wireType) { - switch (wireType) { - case 0: - this.skip(); - break; - case 1: - this.skip(8); - break; - case 2: - this.skip(this.uint32()); - break; - case 3: - while ((wireType = this.uint32() & 7) !== 4) { - this.skipType(wireType); - } - break; - case 5: - this.skip(4); - break; - - /* istanbul ignore next */ - default: - throw Error("invalid wire type " + wireType + " at offset " + this.pos); - } - return this; -}; -Reader$1._configure = function (BufferReader_) { - BufferReader$1 = BufferReader_; - Reader$1.create = create(); - BufferReader$1._configure(); - var fn = util$2.Long ? "toLong" : /* istanbul ignore next */"toNumber"; - util$2.merge(Reader$1.prototype, { - int64: function read_int64() { - return readLongVarint.call(this)[fn](false); - }, - uint64: function read_uint64() { - return readLongVarint.call(this)[fn](true); - }, - sint64: function read_sint64() { - return readLongVarint.call(this).zzDecode()[fn](false); - }, - fixed64: function read_fixed64() { - return readFixed64.call(this)[fn](true); - }, - sfixed64: function read_sfixed64() { - return readFixed64.call(this)[fn](false); - } - }); -}; - -var reader_buffer = BufferReader; - -// extends Reader -var Reader = reader; -(BufferReader.prototype = Object.create(Reader.prototype)).constructor = BufferReader; -var util$1 = requireMinimal(); - -/** - * Constructs a new buffer reader instance. - * @classdesc Wire format reader using node buffers. - * @extends Reader - * @constructor - * @param {Buffer} buffer Buffer to read from - */ -function BufferReader(buffer) { - Reader.call(this, buffer); - - /** - * Read buffer. - * @name BufferReader#buf - * @type {Buffer} - */ -} - -BufferReader._configure = function () { - /* istanbul ignore else */ - if (util$1.Buffer) BufferReader.prototype._slice = util$1.Buffer.prototype.slice; -}; - -/** - * @override - */ -BufferReader.prototype.string = function read_string_buffer() { - var len = this.uint32(); // modifies pos - return this.buf.utf8Slice ? this.buf.utf8Slice(this.pos, this.pos = Math.min(this.pos + len, this.len)) : this.buf.toString("utf-8", this.pos, this.pos = Math.min(this.pos + len, this.len)); -}; - -/** - * Reads a sequence of bytes preceeded by its length as a varint. - * @name BufferReader#bytes - * @function - * @returns {Buffer} Value read - */ - -BufferReader._configure(); - -var rpc = {}; - -var service = Service; -var util = requireMinimal(); - -// Extends EventEmitter -(Service.prototype = Object.create(util.EventEmitter.prototype)).constructor = Service; - -/** - * A service method callback as used by {@link rpc.ServiceMethod|ServiceMethod}. - * - * Differs from {@link RPCImplCallback} in that it is an actual callback of a service method which may not return `response = null`. - * @typedef rpc.ServiceMethodCallback - * @template TRes extends Message - * @type {function} - * @param {Error|null} error Error, if any - * @param {TRes} [response] Response message - * @returns {undefined} - */ - -/** - * A service method part of a {@link rpc.Service} as created by {@link Service.create}. - * @typedef rpc.ServiceMethod - * @template TReq extends Message - * @template TRes extends Message - * @type {function} - * @param {TReq|Properties} request Request message or plain object - * @param {rpc.ServiceMethodCallback} [callback] Node-style callback called with the error, if any, and the response message - * @returns {Promise>} Promise if `callback` has been omitted, otherwise `undefined` - */ - -/** - * Constructs a new RPC service instance. - * @classdesc An RPC service as returned by {@link Service#create}. - * @exports rpc.Service - * @extends util.EventEmitter - * @constructor - * @param {RPCImpl} rpcImpl RPC implementation - * @param {boolean} [requestDelimited=false] Whether requests are length-delimited - * @param {boolean} [responseDelimited=false] Whether responses are length-delimited - */ -function Service(rpcImpl, requestDelimited, responseDelimited) { - if (typeof rpcImpl !== "function") throw TypeError("rpcImpl must be a function"); - util.EventEmitter.call(this); - - /** - * RPC implementation. Becomes `null` once the service is ended. - * @type {RPCImpl|null} - */ - this.rpcImpl = rpcImpl; - - /** - * Whether requests are length-delimited. - * @type {boolean} - */ - this.requestDelimited = Boolean(requestDelimited); - - /** - * Whether responses are length-delimited. - * @type {boolean} - */ - this.responseDelimited = Boolean(responseDelimited); -} - -/** - * Calls a service method through {@link rpc.Service#rpcImpl|rpcImpl}. - * @param {Method|rpc.ServiceMethod} method Reflected or static method - * @param {Constructor} requestCtor Request constructor - * @param {Constructor} responseCtor Response constructor - * @param {TReq|Properties} request Request message or plain object - * @param {rpc.ServiceMethodCallback} callback Service callback - * @returns {undefined} - * @template TReq extends Message - * @template TRes extends Message - */ -Service.prototype.rpcCall = function rpcCall(method, requestCtor, responseCtor, request, callback) { - if (!request) throw TypeError("request must be specified"); - var self = this; - if (!callback) return util.asPromise(rpcCall, self, method, requestCtor, responseCtor, request); - if (!self.rpcImpl) { - setTimeout(function () { - callback(Error("already ended")); - }, 0); - return undefined; - } - try { - return self.rpcImpl(method, requestCtor[self.requestDelimited ? "encodeDelimited" : "encode"](request).finish(), function rpcCallback(err, response) { - if (err) { - self.emit("error", err, method); - return callback(err); - } - if (response === null) { - self.end( /* endedByRPC */true); - return undefined; - } - if (!(response instanceof responseCtor)) { - try { - response = responseCtor[self.responseDelimited ? "decodeDelimited" : "decode"](response); - } catch (err) { - self.emit("error", err, method); - return callback(err); - } - } - self.emit("data", response, method); - return callback(null, response); - }); - } catch (err) { - self.emit("error", err, method); - setTimeout(function () { - callback(err); - }, 0); - return undefined; - } -}; - -/** - * Ends this service and emits the `end` event. - * @param {boolean} [endedByRPC=false] Whether the service has been ended by the RPC implementation. - * @returns {rpc.Service} `this` - */ -Service.prototype.end = function end(endedByRPC) { - if (this.rpcImpl) { - if (!endedByRPC) - // signal end to rpcImpl - this.rpcImpl(null, null, null); - this.rpcImpl = null; - this.emit("end").off(); - } - return this; -}; - -(function (exports) { - - /** - * Streaming RPC helpers. - * @namespace - */ - var rpc = exports; - - /** - * RPC implementation passed to {@link Service#create} performing a service request on network level, i.e. by utilizing http requests or websockets. - * @typedef RPCImpl - * @type {function} - * @param {Method|rpc.ServiceMethod,Message<{}>>} method Reflected or static method being called - * @param {Uint8Array} requestData Request data - * @param {RPCImplCallback} callback Callback function - * @returns {undefined} - * @example - * function rpcImpl(method, requestData, callback) { - * if (protobuf.util.lcFirst(method.name) !== "myMethod") // compatible with static code - * throw Error("no such method"); - * asynchronouslyObtainAResponse(requestData, function(err, responseData) { - * callback(err, responseData); - * }); - * } - */ - - /** - * Node-style callback as used by {@link RPCImpl}. - * @typedef RPCImplCallback - * @type {function} - * @param {Error|null} error Error, if any, otherwise `null` - * @param {Uint8Array|null} [response] Response data or `null` to signal end of stream, if there hasn't been an error - * @returns {undefined} - */ - - rpc.Service = service; -})(rpc); - -var roots = {}; - -(function (exports) { - - var protobuf = exports; - - /** - * Build type, one of `"full"`, `"light"` or `"minimal"`. - * @name build - * @type {string} - * @const - */ - protobuf.build = "minimal"; - - // Serialization - protobuf.Writer = writer$2; - protobuf.BufferWriter = writer_buffer; - protobuf.Reader = reader; - protobuf.BufferReader = reader_buffer; - - // Utility - protobuf.util = requireMinimal(); - protobuf.rpc = rpc; - protobuf.roots = roots; - protobuf.configure = configure; - - /* istanbul ignore next */ - /** - * Reconfigures the library according to the environment. - * @returns {undefined} - */ - function configure() { - protobuf.util._configure(); - protobuf.Writer._configure(protobuf.BufferWriter); - protobuf.Reader._configure(protobuf.BufferReader); - } - - // Set up buffer utility according to the environment - configure(); -})(indexMinimal); - -var minimal = indexMinimal; -var _m0 = /*@__PURE__*/getDefaultExportFromCjs(minimal); - -/* eslint-disable */ -(() => { - if (typeof globalThis !== "undefined") { - return globalThis; - } - if (typeof self !== "undefined") { - return self; - } - if (typeof window !== "undefined") { - return window; - } - if (typeof global !== "undefined") { - return global; - } - throw "Unable to locate global object"; -})(); -if (_m0.util.Long !== Long$1) { - _m0.util.Long = Long$1; - _m0.configure(); -} - -/* eslint-disable */ -var AudioCodec; -(function (AudioCodec) { - AudioCodec[AudioCodec["DEFAULT_AC"] = 0] = "DEFAULT_AC"; - AudioCodec[AudioCodec["OPUS"] = 1] = "OPUS"; - AudioCodec[AudioCodec["AAC"] = 2] = "AAC"; - AudioCodec[AudioCodec["UNRECOGNIZED"] = -1] = "UNRECOGNIZED"; -})(AudioCodec || (AudioCodec = {})); -var VideoCodec; -(function (VideoCodec) { - VideoCodec[VideoCodec["DEFAULT_VC"] = 0] = "DEFAULT_VC"; - VideoCodec[VideoCodec["H264_BASELINE"] = 1] = "H264_BASELINE"; - VideoCodec[VideoCodec["H264_MAIN"] = 2] = "H264_MAIN"; - VideoCodec[VideoCodec["H264_HIGH"] = 3] = "H264_HIGH"; - VideoCodec[VideoCodec["VP8"] = 4] = "VP8"; - VideoCodec[VideoCodec["UNRECOGNIZED"] = -1] = "UNRECOGNIZED"; -})(VideoCodec || (VideoCodec = {})); -var TrackType; -(function (TrackType) { - TrackType[TrackType["AUDIO"] = 0] = "AUDIO"; - TrackType[TrackType["VIDEO"] = 1] = "VIDEO"; - TrackType[TrackType["DATA"] = 2] = "DATA"; - TrackType[TrackType["UNRECOGNIZED"] = -1] = "UNRECOGNIZED"; -})(TrackType || (TrackType = {})); -function trackTypeFromJSON(object) { - switch (object) { - case 0: - case "AUDIO": - return TrackType.AUDIO; - case 1: - case "VIDEO": - return TrackType.VIDEO; - case 2: - case "DATA": - return TrackType.DATA; - case -1: - case "UNRECOGNIZED": - default: - return TrackType.UNRECOGNIZED; - } -} -function trackTypeToJSON(object) { - switch (object) { - case TrackType.AUDIO: - return "AUDIO"; - case TrackType.VIDEO: - return "VIDEO"; - case TrackType.DATA: - return "DATA"; - case TrackType.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} -var TrackSource; -(function (TrackSource) { - TrackSource[TrackSource["UNKNOWN"] = 0] = "UNKNOWN"; - TrackSource[TrackSource["CAMERA"] = 1] = "CAMERA"; - TrackSource[TrackSource["MICROPHONE"] = 2] = "MICROPHONE"; - TrackSource[TrackSource["SCREEN_SHARE"] = 3] = "SCREEN_SHARE"; - TrackSource[TrackSource["SCREEN_SHARE_AUDIO"] = 4] = "SCREEN_SHARE_AUDIO"; - TrackSource[TrackSource["UNRECOGNIZED"] = -1] = "UNRECOGNIZED"; -})(TrackSource || (TrackSource = {})); -function trackSourceFromJSON(object) { - switch (object) { - case 0: - case "UNKNOWN": - return TrackSource.UNKNOWN; - case 1: - case "CAMERA": - return TrackSource.CAMERA; - case 2: - case "MICROPHONE": - return TrackSource.MICROPHONE; - case 3: - case "SCREEN_SHARE": - return TrackSource.SCREEN_SHARE; - case 4: - case "SCREEN_SHARE_AUDIO": - return TrackSource.SCREEN_SHARE_AUDIO; - case -1: - case "UNRECOGNIZED": - default: - return TrackSource.UNRECOGNIZED; - } -} -function trackSourceToJSON(object) { - switch (object) { - case TrackSource.UNKNOWN: - return "UNKNOWN"; - case TrackSource.CAMERA: - return "CAMERA"; - case TrackSource.MICROPHONE: - return "MICROPHONE"; - case TrackSource.SCREEN_SHARE: - return "SCREEN_SHARE"; - case TrackSource.SCREEN_SHARE_AUDIO: - return "SCREEN_SHARE_AUDIO"; - case TrackSource.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} -var VideoQuality; -(function (VideoQuality) { - VideoQuality[VideoQuality["LOW"] = 0] = "LOW"; - VideoQuality[VideoQuality["MEDIUM"] = 1] = "MEDIUM"; - VideoQuality[VideoQuality["HIGH"] = 2] = "HIGH"; - VideoQuality[VideoQuality["OFF"] = 3] = "OFF"; - VideoQuality[VideoQuality["UNRECOGNIZED"] = -1] = "UNRECOGNIZED"; -})(VideoQuality || (VideoQuality = {})); -function videoQualityFromJSON(object) { - switch (object) { - case 0: - case "LOW": - return VideoQuality.LOW; - case 1: - case "MEDIUM": - return VideoQuality.MEDIUM; - case 2: - case "HIGH": - return VideoQuality.HIGH; - case 3: - case "OFF": - return VideoQuality.OFF; - case -1: - case "UNRECOGNIZED": - default: - return VideoQuality.UNRECOGNIZED; - } -} -function videoQualityToJSON(object) { - switch (object) { - case VideoQuality.LOW: - return "LOW"; - case VideoQuality.MEDIUM: - return "MEDIUM"; - case VideoQuality.HIGH: - return "HIGH"; - case VideoQuality.OFF: - return "OFF"; - case VideoQuality.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} -var ConnectionQuality$1; -(function (ConnectionQuality) { - ConnectionQuality[ConnectionQuality["POOR"] = 0] = "POOR"; - ConnectionQuality[ConnectionQuality["GOOD"] = 1] = "GOOD"; - ConnectionQuality[ConnectionQuality["EXCELLENT"] = 2] = "EXCELLENT"; - ConnectionQuality[ConnectionQuality["UNRECOGNIZED"] = -1] = "UNRECOGNIZED"; -})(ConnectionQuality$1 || (ConnectionQuality$1 = {})); -function connectionQualityFromJSON(object) { - switch (object) { - case 0: - case "POOR": - return ConnectionQuality$1.POOR; - case 1: - case "GOOD": - return ConnectionQuality$1.GOOD; - case 2: - case "EXCELLENT": - return ConnectionQuality$1.EXCELLENT; - case -1: - case "UNRECOGNIZED": - default: - return ConnectionQuality$1.UNRECOGNIZED; - } -} -function connectionQualityToJSON(object) { - switch (object) { - case ConnectionQuality$1.POOR: - return "POOR"; - case ConnectionQuality$1.GOOD: - return "GOOD"; - case ConnectionQuality$1.EXCELLENT: - return "EXCELLENT"; - case ConnectionQuality$1.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} -var ClientConfigSetting; -(function (ClientConfigSetting) { - ClientConfigSetting[ClientConfigSetting["UNSET"] = 0] = "UNSET"; - ClientConfigSetting[ClientConfigSetting["DISABLED"] = 1] = "DISABLED"; - ClientConfigSetting[ClientConfigSetting["ENABLED"] = 2] = "ENABLED"; - ClientConfigSetting[ClientConfigSetting["UNRECOGNIZED"] = -1] = "UNRECOGNIZED"; -})(ClientConfigSetting || (ClientConfigSetting = {})); -function clientConfigSettingFromJSON(object) { - switch (object) { - case 0: - case "UNSET": - return ClientConfigSetting.UNSET; - case 1: - case "DISABLED": - return ClientConfigSetting.DISABLED; - case 2: - case "ENABLED": - return ClientConfigSetting.ENABLED; - case -1: - case "UNRECOGNIZED": - default: - return ClientConfigSetting.UNRECOGNIZED; - } -} -function clientConfigSettingToJSON(object) { - switch (object) { - case ClientConfigSetting.UNSET: - return "UNSET"; - case ClientConfigSetting.DISABLED: - return "DISABLED"; - case ClientConfigSetting.ENABLED: - return "ENABLED"; - case ClientConfigSetting.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} -var DisconnectReason; -(function (DisconnectReason) { - DisconnectReason[DisconnectReason["UNKNOWN_REASON"] = 0] = "UNKNOWN_REASON"; - DisconnectReason[DisconnectReason["CLIENT_INITIATED"] = 1] = "CLIENT_INITIATED"; - DisconnectReason[DisconnectReason["DUPLICATE_IDENTITY"] = 2] = "DUPLICATE_IDENTITY"; - DisconnectReason[DisconnectReason["SERVER_SHUTDOWN"] = 3] = "SERVER_SHUTDOWN"; - DisconnectReason[DisconnectReason["PARTICIPANT_REMOVED"] = 4] = "PARTICIPANT_REMOVED"; - DisconnectReason[DisconnectReason["ROOM_DELETED"] = 5] = "ROOM_DELETED"; - DisconnectReason[DisconnectReason["STATE_MISMATCH"] = 6] = "STATE_MISMATCH"; - DisconnectReason[DisconnectReason["JOIN_FAILURE"] = 7] = "JOIN_FAILURE"; - DisconnectReason[DisconnectReason["UNRECOGNIZED"] = -1] = "UNRECOGNIZED"; -})(DisconnectReason || (DisconnectReason = {})); -function disconnectReasonFromJSON(object) { - switch (object) { - case 0: - case "UNKNOWN_REASON": - return DisconnectReason.UNKNOWN_REASON; - case 1: - case "CLIENT_INITIATED": - return DisconnectReason.CLIENT_INITIATED; - case 2: - case "DUPLICATE_IDENTITY": - return DisconnectReason.DUPLICATE_IDENTITY; - case 3: - case "SERVER_SHUTDOWN": - return DisconnectReason.SERVER_SHUTDOWN; - case 4: - case "PARTICIPANT_REMOVED": - return DisconnectReason.PARTICIPANT_REMOVED; - case 5: - case "ROOM_DELETED": - return DisconnectReason.ROOM_DELETED; - case 6: - case "STATE_MISMATCH": - return DisconnectReason.STATE_MISMATCH; - case 7: - case "JOIN_FAILURE": - return DisconnectReason.JOIN_FAILURE; - case -1: - case "UNRECOGNIZED": - default: - return DisconnectReason.UNRECOGNIZED; - } -} -function disconnectReasonToJSON(object) { - switch (object) { - case DisconnectReason.UNKNOWN_REASON: - return "UNKNOWN_REASON"; - case DisconnectReason.CLIENT_INITIATED: - return "CLIENT_INITIATED"; - case DisconnectReason.DUPLICATE_IDENTITY: - return "DUPLICATE_IDENTITY"; - case DisconnectReason.SERVER_SHUTDOWN: - return "SERVER_SHUTDOWN"; - case DisconnectReason.PARTICIPANT_REMOVED: - return "PARTICIPANT_REMOVED"; - case DisconnectReason.ROOM_DELETED: - return "ROOM_DELETED"; - case DisconnectReason.STATE_MISMATCH: - return "STATE_MISMATCH"; - case DisconnectReason.JOIN_FAILURE: - return "JOIN_FAILURE"; - case DisconnectReason.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} -var ReconnectReason; -(function (ReconnectReason) { - ReconnectReason[ReconnectReason["RR_UNKOWN"] = 0] = "RR_UNKOWN"; - ReconnectReason[ReconnectReason["RR_SIGNAL_DISCONNECTED"] = 1] = "RR_SIGNAL_DISCONNECTED"; - ReconnectReason[ReconnectReason["RR_PUBLISHER_FAILED"] = 2] = "RR_PUBLISHER_FAILED"; - ReconnectReason[ReconnectReason["RR_SUBSCRIBER_FAILED"] = 3] = "RR_SUBSCRIBER_FAILED"; - ReconnectReason[ReconnectReason["RR_SWITCH_CANDIDATE"] = 4] = "RR_SWITCH_CANDIDATE"; - ReconnectReason[ReconnectReason["UNRECOGNIZED"] = -1] = "UNRECOGNIZED"; -})(ReconnectReason || (ReconnectReason = {})); -var SubscriptionError; -(function (SubscriptionError) { - SubscriptionError[SubscriptionError["SE_UNKOWN"] = 0] = "SE_UNKOWN"; - SubscriptionError[SubscriptionError["SE_CODEC_UNSUPPORTED"] = 1] = "SE_CODEC_UNSUPPORTED"; - SubscriptionError[SubscriptionError["SE_TRACK_NOTFOUND"] = 2] = "SE_TRACK_NOTFOUND"; - SubscriptionError[SubscriptionError["UNRECOGNIZED"] = -1] = "UNRECOGNIZED"; -})(SubscriptionError || (SubscriptionError = {})); -function subscriptionErrorFromJSON(object) { - switch (object) { - case 0: - case "SE_UNKOWN": - return SubscriptionError.SE_UNKOWN; - case 1: - case "SE_CODEC_UNSUPPORTED": - return SubscriptionError.SE_CODEC_UNSUPPORTED; - case 2: - case "SE_TRACK_NOTFOUND": - return SubscriptionError.SE_TRACK_NOTFOUND; - case -1: - case "UNRECOGNIZED": - default: - return SubscriptionError.UNRECOGNIZED; - } -} -function subscriptionErrorToJSON(object) { - switch (object) { - case SubscriptionError.SE_UNKOWN: - return "SE_UNKOWN"; - case SubscriptionError.SE_CODEC_UNSUPPORTED: - return "SE_CODEC_UNSUPPORTED"; - case SubscriptionError.SE_TRACK_NOTFOUND: - return "SE_TRACK_NOTFOUND"; - case SubscriptionError.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} -var ParticipantInfo_State; -(function (ParticipantInfo_State) { - /** JOINING - websocket' connected, but not offered yet */ - ParticipantInfo_State[ParticipantInfo_State["JOINING"] = 0] = "JOINING"; - /** JOINED - server received client offer */ - ParticipantInfo_State[ParticipantInfo_State["JOINED"] = 1] = "JOINED"; - /** ACTIVE - ICE connectivity established */ - ParticipantInfo_State[ParticipantInfo_State["ACTIVE"] = 2] = "ACTIVE"; - /** DISCONNECTED - WS disconnected */ - ParticipantInfo_State[ParticipantInfo_State["DISCONNECTED"] = 3] = "DISCONNECTED"; - ParticipantInfo_State[ParticipantInfo_State["UNRECOGNIZED"] = -1] = "UNRECOGNIZED"; -})(ParticipantInfo_State || (ParticipantInfo_State = {})); -function participantInfo_StateFromJSON(object) { - switch (object) { - case 0: - case "JOINING": - return ParticipantInfo_State.JOINING; - case 1: - case "JOINED": - return ParticipantInfo_State.JOINED; - case 2: - case "ACTIVE": - return ParticipantInfo_State.ACTIVE; - case 3: - case "DISCONNECTED": - return ParticipantInfo_State.DISCONNECTED; - case -1: - case "UNRECOGNIZED": - default: - return ParticipantInfo_State.UNRECOGNIZED; - } -} -function participantInfo_StateToJSON(object) { - switch (object) { - case ParticipantInfo_State.JOINING: - return "JOINING"; - case ParticipantInfo_State.JOINED: - return "JOINED"; - case ParticipantInfo_State.ACTIVE: - return "ACTIVE"; - case ParticipantInfo_State.DISCONNECTED: - return "DISCONNECTED"; - case ParticipantInfo_State.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} -var Encryption_Type; -(function (Encryption_Type) { - Encryption_Type[Encryption_Type["NONE"] = 0] = "NONE"; - Encryption_Type[Encryption_Type["GCM"] = 1] = "GCM"; - Encryption_Type[Encryption_Type["CUSTOM"] = 2] = "CUSTOM"; - Encryption_Type[Encryption_Type["UNRECOGNIZED"] = -1] = "UNRECOGNIZED"; -})(Encryption_Type || (Encryption_Type = {})); -function encryption_TypeFromJSON(object) { - switch (object) { - case 0: - case "NONE": - return Encryption_Type.NONE; - case 1: - case "GCM": - return Encryption_Type.GCM; - case 2: - case "CUSTOM": - return Encryption_Type.CUSTOM; - case -1: - case "UNRECOGNIZED": - default: - return Encryption_Type.UNRECOGNIZED; - } -} -function encryption_TypeToJSON(object) { - switch (object) { - case Encryption_Type.NONE: - return "NONE"; - case Encryption_Type.GCM: - return "GCM"; - case Encryption_Type.CUSTOM: - return "CUSTOM"; - case Encryption_Type.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} -var DataPacket_Kind; -(function (DataPacket_Kind) { - DataPacket_Kind[DataPacket_Kind["RELIABLE"] = 0] = "RELIABLE"; - DataPacket_Kind[DataPacket_Kind["LOSSY"] = 1] = "LOSSY"; - DataPacket_Kind[DataPacket_Kind["UNRECOGNIZED"] = -1] = "UNRECOGNIZED"; -})(DataPacket_Kind || (DataPacket_Kind = {})); -function dataPacket_KindFromJSON(object) { - switch (object) { - case 0: - case "RELIABLE": - return DataPacket_Kind.RELIABLE; - case 1: - case "LOSSY": - return DataPacket_Kind.LOSSY; - case -1: - case "UNRECOGNIZED": - default: - return DataPacket_Kind.UNRECOGNIZED; - } -} -function dataPacket_KindToJSON(object) { - switch (object) { - case DataPacket_Kind.RELIABLE: - return "RELIABLE"; - case DataPacket_Kind.LOSSY: - return "LOSSY"; - case DataPacket_Kind.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} -var ServerInfo_Edition; -(function (ServerInfo_Edition) { - ServerInfo_Edition[ServerInfo_Edition["Standard"] = 0] = "Standard"; - ServerInfo_Edition[ServerInfo_Edition["Cloud"] = 1] = "Cloud"; - ServerInfo_Edition[ServerInfo_Edition["UNRECOGNIZED"] = -1] = "UNRECOGNIZED"; -})(ServerInfo_Edition || (ServerInfo_Edition = {})); -function serverInfo_EditionFromJSON(object) { - switch (object) { - case 0: - case "Standard": - return ServerInfo_Edition.Standard; - case 1: - case "Cloud": - return ServerInfo_Edition.Cloud; - case -1: - case "UNRECOGNIZED": - default: - return ServerInfo_Edition.UNRECOGNIZED; - } -} -function serverInfo_EditionToJSON(object) { - switch (object) { - case ServerInfo_Edition.Standard: - return "Standard"; - case ServerInfo_Edition.Cloud: - return "Cloud"; - case ServerInfo_Edition.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} -var ClientInfo_SDK; -(function (ClientInfo_SDK) { - ClientInfo_SDK[ClientInfo_SDK["UNKNOWN"] = 0] = "UNKNOWN"; - ClientInfo_SDK[ClientInfo_SDK["JS"] = 1] = "JS"; - ClientInfo_SDK[ClientInfo_SDK["SWIFT"] = 2] = "SWIFT"; - ClientInfo_SDK[ClientInfo_SDK["ANDROID"] = 3] = "ANDROID"; - ClientInfo_SDK[ClientInfo_SDK["FLUTTER"] = 4] = "FLUTTER"; - ClientInfo_SDK[ClientInfo_SDK["GO"] = 5] = "GO"; - ClientInfo_SDK[ClientInfo_SDK["UNITY"] = 6] = "UNITY"; - ClientInfo_SDK[ClientInfo_SDK["REACT_NATIVE"] = 7] = "REACT_NATIVE"; - ClientInfo_SDK[ClientInfo_SDK["RUST"] = 8] = "RUST"; - ClientInfo_SDK[ClientInfo_SDK["UNRECOGNIZED"] = -1] = "UNRECOGNIZED"; -})(ClientInfo_SDK || (ClientInfo_SDK = {})); -function clientInfo_SDKFromJSON(object) { - switch (object) { - case 0: - case "UNKNOWN": - return ClientInfo_SDK.UNKNOWN; - case 1: - case "JS": - return ClientInfo_SDK.JS; - case 2: - case "SWIFT": - return ClientInfo_SDK.SWIFT; - case 3: - case "ANDROID": - return ClientInfo_SDK.ANDROID; - case 4: - case "FLUTTER": - return ClientInfo_SDK.FLUTTER; - case 5: - case "GO": - return ClientInfo_SDK.GO; - case 6: - case "UNITY": - return ClientInfo_SDK.UNITY; - case 7: - case "REACT_NATIVE": - return ClientInfo_SDK.REACT_NATIVE; - case 8: - case "RUST": - return ClientInfo_SDK.RUST; - case -1: - case "UNRECOGNIZED": - default: - return ClientInfo_SDK.UNRECOGNIZED; - } -} -function clientInfo_SDKToJSON(object) { - switch (object) { - case ClientInfo_SDK.UNKNOWN: - return "UNKNOWN"; - case ClientInfo_SDK.JS: - return "JS"; - case ClientInfo_SDK.SWIFT: - return "SWIFT"; - case ClientInfo_SDK.ANDROID: - return "ANDROID"; - case ClientInfo_SDK.FLUTTER: - return "FLUTTER"; - case ClientInfo_SDK.GO: - return "GO"; - case ClientInfo_SDK.UNITY: - return "UNITY"; - case ClientInfo_SDK.REACT_NATIVE: - return "REACT_NATIVE"; - case ClientInfo_SDK.RUST: - return "RUST"; - case ClientInfo_SDK.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} -function createBaseRoom() { - return { - sid: "", - name: "", - emptyTimeout: 0, - maxParticipants: 0, - creationTime: 0, - turnPassword: "", - enabledCodecs: [], - metadata: "", - numParticipants: 0, - numPublishers: 0, - activeRecording: false - }; -} -const Room$1 = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.sid !== "") { - writer.uint32(10).string(message.sid); - } - if (message.name !== "") { - writer.uint32(18).string(message.name); - } - if (message.emptyTimeout !== 0) { - writer.uint32(24).uint32(message.emptyTimeout); - } - if (message.maxParticipants !== 0) { - writer.uint32(32).uint32(message.maxParticipants); - } - if (message.creationTime !== 0) { - writer.uint32(40).int64(message.creationTime); - } - if (message.turnPassword !== "") { - writer.uint32(50).string(message.turnPassword); - } - for (const v of message.enabledCodecs) { - Codec.encode(v, writer.uint32(58).fork()).ldelim(); - } - if (message.metadata !== "") { - writer.uint32(66).string(message.metadata); - } - if (message.numParticipants !== 0) { - writer.uint32(72).uint32(message.numParticipants); - } - if (message.numPublishers !== 0) { - writer.uint32(88).uint32(message.numPublishers); - } - if (message.activeRecording === true) { - writer.uint32(80).bool(message.activeRecording); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseRoom(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.sid = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - message.name = reader.string(); - continue; - case 3: - if (tag !== 24) { - break; - } - message.emptyTimeout = reader.uint32(); - continue; - case 4: - if (tag !== 32) { - break; - } - message.maxParticipants = reader.uint32(); - continue; - case 5: - if (tag !== 40) { - break; - } - message.creationTime = longToNumber$1(reader.int64()); - continue; - case 6: - if (tag !== 50) { - break; - } - message.turnPassword = reader.string(); - continue; - case 7: - if (tag !== 58) { - break; - } - message.enabledCodecs.push(Codec.decode(reader, reader.uint32())); - continue; - case 8: - if (tag !== 66) { - break; - } - message.metadata = reader.string(); - continue; - case 9: - if (tag !== 72) { - break; - } - message.numParticipants = reader.uint32(); - continue; - case 11: - if (tag !== 88) { - break; - } - message.numPublishers = reader.uint32(); - continue; - case 10: - if (tag !== 80) { - break; - } - message.activeRecording = reader.bool(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - sid: isSet$1(object.sid) ? String(object.sid) : "", - name: isSet$1(object.name) ? String(object.name) : "", - emptyTimeout: isSet$1(object.emptyTimeout) ? Number(object.emptyTimeout) : 0, - maxParticipants: isSet$1(object.maxParticipants) ? Number(object.maxParticipants) : 0, - creationTime: isSet$1(object.creationTime) ? Number(object.creationTime) : 0, - turnPassword: isSet$1(object.turnPassword) ? String(object.turnPassword) : "", - enabledCodecs: Array.isArray(object === null || object === void 0 ? void 0 : object.enabledCodecs) ? object.enabledCodecs.map(e => Codec.fromJSON(e)) : [], - metadata: isSet$1(object.metadata) ? String(object.metadata) : "", - numParticipants: isSet$1(object.numParticipants) ? Number(object.numParticipants) : 0, - numPublishers: isSet$1(object.numPublishers) ? Number(object.numPublishers) : 0, - activeRecording: isSet$1(object.activeRecording) ? Boolean(object.activeRecording) : false - }; - }, - toJSON(message) { - const obj = {}; - message.sid !== undefined && (obj.sid = message.sid); - message.name !== undefined && (obj.name = message.name); - message.emptyTimeout !== undefined && (obj.emptyTimeout = Math.round(message.emptyTimeout)); - message.maxParticipants !== undefined && (obj.maxParticipants = Math.round(message.maxParticipants)); - message.creationTime !== undefined && (obj.creationTime = Math.round(message.creationTime)); - message.turnPassword !== undefined && (obj.turnPassword = message.turnPassword); - if (message.enabledCodecs) { - obj.enabledCodecs = message.enabledCodecs.map(e => e ? Codec.toJSON(e) : undefined); - } else { - obj.enabledCodecs = []; - } - message.metadata !== undefined && (obj.metadata = message.metadata); - message.numParticipants !== undefined && (obj.numParticipants = Math.round(message.numParticipants)); - message.numPublishers !== undefined && (obj.numPublishers = Math.round(message.numPublishers)); - message.activeRecording !== undefined && (obj.activeRecording = message.activeRecording); - return obj; - }, - create(base) { - return Room$1.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l; - const message = createBaseRoom(); - message.sid = (_a = object.sid) !== null && _a !== void 0 ? _a : ""; - message.name = (_b = object.name) !== null && _b !== void 0 ? _b : ""; - message.emptyTimeout = (_c = object.emptyTimeout) !== null && _c !== void 0 ? _c : 0; - message.maxParticipants = (_d = object.maxParticipants) !== null && _d !== void 0 ? _d : 0; - message.creationTime = (_e = object.creationTime) !== null && _e !== void 0 ? _e : 0; - message.turnPassword = (_f = object.turnPassword) !== null && _f !== void 0 ? _f : ""; - message.enabledCodecs = ((_g = object.enabledCodecs) === null || _g === void 0 ? void 0 : _g.map(e => Codec.fromPartial(e))) || []; - message.metadata = (_h = object.metadata) !== null && _h !== void 0 ? _h : ""; - message.numParticipants = (_j = object.numParticipants) !== null && _j !== void 0 ? _j : 0; - message.numPublishers = (_k = object.numPublishers) !== null && _k !== void 0 ? _k : 0; - message.activeRecording = (_l = object.activeRecording) !== null && _l !== void 0 ? _l : false; - return message; - } -}; -function createBaseCodec() { - return { - mime: "", - fmtpLine: "" - }; -} -const Codec = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.mime !== "") { - writer.uint32(10).string(message.mime); - } - if (message.fmtpLine !== "") { - writer.uint32(18).string(message.fmtpLine); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseCodec(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.mime = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - message.fmtpLine = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - mime: isSet$1(object.mime) ? String(object.mime) : "", - fmtpLine: isSet$1(object.fmtpLine) ? String(object.fmtpLine) : "" - }; - }, - toJSON(message) { - const obj = {}; - message.mime !== undefined && (obj.mime = message.mime); - message.fmtpLine !== undefined && (obj.fmtpLine = message.fmtpLine); - return obj; - }, - create(base) { - return Codec.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b; - const message = createBaseCodec(); - message.mime = (_a = object.mime) !== null && _a !== void 0 ? _a : ""; - message.fmtpLine = (_b = object.fmtpLine) !== null && _b !== void 0 ? _b : ""; - return message; - } -}; -function createBaseParticipantPermission() { - return { - canSubscribe: false, - canPublish: false, - canPublishData: false, - canPublishSources: [], - hidden: false, - recorder: false, - canUpdateMetadata: false - }; -} -const ParticipantPermission = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.canSubscribe === true) { - writer.uint32(8).bool(message.canSubscribe); - } - if (message.canPublish === true) { - writer.uint32(16).bool(message.canPublish); - } - if (message.canPublishData === true) { - writer.uint32(24).bool(message.canPublishData); - } - writer.uint32(74).fork(); - for (const v of message.canPublishSources) { - writer.int32(v); - } - writer.ldelim(); - if (message.hidden === true) { - writer.uint32(56).bool(message.hidden); - } - if (message.recorder === true) { - writer.uint32(64).bool(message.recorder); - } - if (message.canUpdateMetadata === true) { - writer.uint32(80).bool(message.canUpdateMetadata); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseParticipantPermission(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - message.canSubscribe = reader.bool(); - continue; - case 2: - if (tag !== 16) { - break; - } - message.canPublish = reader.bool(); - continue; - case 3: - if (tag !== 24) { - break; - } - message.canPublishData = reader.bool(); - continue; - case 9: - if (tag === 72) { - message.canPublishSources.push(reader.int32()); - continue; - } - if (tag === 74) { - const end2 = reader.uint32() + reader.pos; - while (reader.pos < end2) { - message.canPublishSources.push(reader.int32()); - } - continue; - } - break; - case 7: - if (tag !== 56) { - break; - } - message.hidden = reader.bool(); - continue; - case 8: - if (tag !== 64) { - break; - } - message.recorder = reader.bool(); - continue; - case 10: - if (tag !== 80) { - break; - } - message.canUpdateMetadata = reader.bool(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - canSubscribe: isSet$1(object.canSubscribe) ? Boolean(object.canSubscribe) : false, - canPublish: isSet$1(object.canPublish) ? Boolean(object.canPublish) : false, - canPublishData: isSet$1(object.canPublishData) ? Boolean(object.canPublishData) : false, - canPublishSources: Array.isArray(object === null || object === void 0 ? void 0 : object.canPublishSources) ? object.canPublishSources.map(e => trackSourceFromJSON(e)) : [], - hidden: isSet$1(object.hidden) ? Boolean(object.hidden) : false, - recorder: isSet$1(object.recorder) ? Boolean(object.recorder) : false, - canUpdateMetadata: isSet$1(object.canUpdateMetadata) ? Boolean(object.canUpdateMetadata) : false - }; - }, - toJSON(message) { - const obj = {}; - message.canSubscribe !== undefined && (obj.canSubscribe = message.canSubscribe); - message.canPublish !== undefined && (obj.canPublish = message.canPublish); - message.canPublishData !== undefined && (obj.canPublishData = message.canPublishData); - if (message.canPublishSources) { - obj.canPublishSources = message.canPublishSources.map(e => trackSourceToJSON(e)); - } else { - obj.canPublishSources = []; - } - message.hidden !== undefined && (obj.hidden = message.hidden); - message.recorder !== undefined && (obj.recorder = message.recorder); - message.canUpdateMetadata !== undefined && (obj.canUpdateMetadata = message.canUpdateMetadata); - return obj; - }, - create(base) { - return ParticipantPermission.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c, _d, _e, _f, _g; - const message = createBaseParticipantPermission(); - message.canSubscribe = (_a = object.canSubscribe) !== null && _a !== void 0 ? _a : false; - message.canPublish = (_b = object.canPublish) !== null && _b !== void 0 ? _b : false; - message.canPublishData = (_c = object.canPublishData) !== null && _c !== void 0 ? _c : false; - message.canPublishSources = ((_d = object.canPublishSources) === null || _d === void 0 ? void 0 : _d.map(e => e)) || []; - message.hidden = (_e = object.hidden) !== null && _e !== void 0 ? _e : false; - message.recorder = (_f = object.recorder) !== null && _f !== void 0 ? _f : false; - message.canUpdateMetadata = (_g = object.canUpdateMetadata) !== null && _g !== void 0 ? _g : false; - return message; - } -}; -function createBaseParticipantInfo() { - return { - sid: "", - identity: "", - state: 0, - tracks: [], - metadata: "", - joinedAt: 0, - name: "", - version: 0, - permission: undefined, - region: "", - isPublisher: false - }; -} -const ParticipantInfo = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.sid !== "") { - writer.uint32(10).string(message.sid); - } - if (message.identity !== "") { - writer.uint32(18).string(message.identity); - } - if (message.state !== 0) { - writer.uint32(24).int32(message.state); - } - for (const v of message.tracks) { - TrackInfo.encode(v, writer.uint32(34).fork()).ldelim(); - } - if (message.metadata !== "") { - writer.uint32(42).string(message.metadata); - } - if (message.joinedAt !== 0) { - writer.uint32(48).int64(message.joinedAt); - } - if (message.name !== "") { - writer.uint32(74).string(message.name); - } - if (message.version !== 0) { - writer.uint32(80).uint32(message.version); - } - if (message.permission !== undefined) { - ParticipantPermission.encode(message.permission, writer.uint32(90).fork()).ldelim(); - } - if (message.region !== "") { - writer.uint32(98).string(message.region); - } - if (message.isPublisher === true) { - writer.uint32(104).bool(message.isPublisher); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseParticipantInfo(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.sid = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - message.identity = reader.string(); - continue; - case 3: - if (tag !== 24) { - break; - } - message.state = reader.int32(); - continue; - case 4: - if (tag !== 34) { - break; - } - message.tracks.push(TrackInfo.decode(reader, reader.uint32())); - continue; - case 5: - if (tag !== 42) { - break; - } - message.metadata = reader.string(); - continue; - case 6: - if (tag !== 48) { - break; - } - message.joinedAt = longToNumber$1(reader.int64()); - continue; - case 9: - if (tag !== 74) { - break; - } - message.name = reader.string(); - continue; - case 10: - if (tag !== 80) { - break; - } - message.version = reader.uint32(); - continue; - case 11: - if (tag !== 90) { - break; - } - message.permission = ParticipantPermission.decode(reader, reader.uint32()); - continue; - case 12: - if (tag !== 98) { - break; - } - message.region = reader.string(); - continue; - case 13: - if (tag !== 104) { - break; - } - message.isPublisher = reader.bool(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - sid: isSet$1(object.sid) ? String(object.sid) : "", - identity: isSet$1(object.identity) ? String(object.identity) : "", - state: isSet$1(object.state) ? participantInfo_StateFromJSON(object.state) : 0, - tracks: Array.isArray(object === null || object === void 0 ? void 0 : object.tracks) ? object.tracks.map(e => TrackInfo.fromJSON(e)) : [], - metadata: isSet$1(object.metadata) ? String(object.metadata) : "", - joinedAt: isSet$1(object.joinedAt) ? Number(object.joinedAt) : 0, - name: isSet$1(object.name) ? String(object.name) : "", - version: isSet$1(object.version) ? Number(object.version) : 0, - permission: isSet$1(object.permission) ? ParticipantPermission.fromJSON(object.permission) : undefined, - region: isSet$1(object.region) ? String(object.region) : "", - isPublisher: isSet$1(object.isPublisher) ? Boolean(object.isPublisher) : false - }; - }, - toJSON(message) { - const obj = {}; - message.sid !== undefined && (obj.sid = message.sid); - message.identity !== undefined && (obj.identity = message.identity); - message.state !== undefined && (obj.state = participantInfo_StateToJSON(message.state)); - if (message.tracks) { - obj.tracks = message.tracks.map(e => e ? TrackInfo.toJSON(e) : undefined); - } else { - obj.tracks = []; - } - message.metadata !== undefined && (obj.metadata = message.metadata); - message.joinedAt !== undefined && (obj.joinedAt = Math.round(message.joinedAt)); - message.name !== undefined && (obj.name = message.name); - message.version !== undefined && (obj.version = Math.round(message.version)); - message.permission !== undefined && (obj.permission = message.permission ? ParticipantPermission.toJSON(message.permission) : undefined); - message.region !== undefined && (obj.region = message.region); - message.isPublisher !== undefined && (obj.isPublisher = message.isPublisher); - return obj; - }, - create(base) { - return ParticipantInfo.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; - const message = createBaseParticipantInfo(); - message.sid = (_a = object.sid) !== null && _a !== void 0 ? _a : ""; - message.identity = (_b = object.identity) !== null && _b !== void 0 ? _b : ""; - message.state = (_c = object.state) !== null && _c !== void 0 ? _c : 0; - message.tracks = ((_d = object.tracks) === null || _d === void 0 ? void 0 : _d.map(e => TrackInfo.fromPartial(e))) || []; - message.metadata = (_e = object.metadata) !== null && _e !== void 0 ? _e : ""; - message.joinedAt = (_f = object.joinedAt) !== null && _f !== void 0 ? _f : 0; - message.name = (_g = object.name) !== null && _g !== void 0 ? _g : ""; - message.version = (_h = object.version) !== null && _h !== void 0 ? _h : 0; - message.permission = object.permission !== undefined && object.permission !== null ? ParticipantPermission.fromPartial(object.permission) : undefined; - message.region = (_j = object.region) !== null && _j !== void 0 ? _j : ""; - message.isPublisher = (_k = object.isPublisher) !== null && _k !== void 0 ? _k : false; - return message; - } -}; -function createBaseSimulcastCodecInfo() { - return { - mimeType: "", - mid: "", - cid: "", - layers: [] - }; -} -const SimulcastCodecInfo = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.mimeType !== "") { - writer.uint32(10).string(message.mimeType); - } - if (message.mid !== "") { - writer.uint32(18).string(message.mid); - } - if (message.cid !== "") { - writer.uint32(26).string(message.cid); - } - for (const v of message.layers) { - VideoLayer.encode(v, writer.uint32(34).fork()).ldelim(); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSimulcastCodecInfo(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.mimeType = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - message.mid = reader.string(); - continue; - case 3: - if (tag !== 26) { - break; - } - message.cid = reader.string(); - continue; - case 4: - if (tag !== 34) { - break; - } - message.layers.push(VideoLayer.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - mimeType: isSet$1(object.mimeType) ? String(object.mimeType) : "", - mid: isSet$1(object.mid) ? String(object.mid) : "", - cid: isSet$1(object.cid) ? String(object.cid) : "", - layers: Array.isArray(object === null || object === void 0 ? void 0 : object.layers) ? object.layers.map(e => VideoLayer.fromJSON(e)) : [] - }; - }, - toJSON(message) { - const obj = {}; - message.mimeType !== undefined && (obj.mimeType = message.mimeType); - message.mid !== undefined && (obj.mid = message.mid); - message.cid !== undefined && (obj.cid = message.cid); - if (message.layers) { - obj.layers = message.layers.map(e => e ? VideoLayer.toJSON(e) : undefined); - } else { - obj.layers = []; - } - return obj; - }, - create(base) { - return SimulcastCodecInfo.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c, _d; - const message = createBaseSimulcastCodecInfo(); - message.mimeType = (_a = object.mimeType) !== null && _a !== void 0 ? _a : ""; - message.mid = (_b = object.mid) !== null && _b !== void 0 ? _b : ""; - message.cid = (_c = object.cid) !== null && _c !== void 0 ? _c : ""; - message.layers = ((_d = object.layers) === null || _d === void 0 ? void 0 : _d.map(e => VideoLayer.fromPartial(e))) || []; - return message; - } -}; -function createBaseTrackInfo() { - return { - sid: "", - type: 0, - name: "", - muted: false, - width: 0, - height: 0, - simulcast: false, - disableDtx: false, - source: 0, - layers: [], - mimeType: "", - mid: "", - codecs: [], - stereo: false, - disableRed: false, - encryption: 0 - }; -} -const TrackInfo = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.sid !== "") { - writer.uint32(10).string(message.sid); - } - if (message.type !== 0) { - writer.uint32(16).int32(message.type); - } - if (message.name !== "") { - writer.uint32(26).string(message.name); - } - if (message.muted === true) { - writer.uint32(32).bool(message.muted); - } - if (message.width !== 0) { - writer.uint32(40).uint32(message.width); - } - if (message.height !== 0) { - writer.uint32(48).uint32(message.height); - } - if (message.simulcast === true) { - writer.uint32(56).bool(message.simulcast); - } - if (message.disableDtx === true) { - writer.uint32(64).bool(message.disableDtx); - } - if (message.source !== 0) { - writer.uint32(72).int32(message.source); - } - for (const v of message.layers) { - VideoLayer.encode(v, writer.uint32(82).fork()).ldelim(); - } - if (message.mimeType !== "") { - writer.uint32(90).string(message.mimeType); - } - if (message.mid !== "") { - writer.uint32(98).string(message.mid); - } - for (const v of message.codecs) { - SimulcastCodecInfo.encode(v, writer.uint32(106).fork()).ldelim(); - } - if (message.stereo === true) { - writer.uint32(112).bool(message.stereo); - } - if (message.disableRed === true) { - writer.uint32(120).bool(message.disableRed); - } - if (message.encryption !== 0) { - writer.uint32(128).int32(message.encryption); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTrackInfo(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.sid = reader.string(); - continue; - case 2: - if (tag !== 16) { - break; - } - message.type = reader.int32(); - continue; - case 3: - if (tag !== 26) { - break; - } - message.name = reader.string(); - continue; - case 4: - if (tag !== 32) { - break; - } - message.muted = reader.bool(); - continue; - case 5: - if (tag !== 40) { - break; - } - message.width = reader.uint32(); - continue; - case 6: - if (tag !== 48) { - break; - } - message.height = reader.uint32(); - continue; - case 7: - if (tag !== 56) { - break; - } - message.simulcast = reader.bool(); - continue; - case 8: - if (tag !== 64) { - break; - } - message.disableDtx = reader.bool(); - continue; - case 9: - if (tag !== 72) { - break; - } - message.source = reader.int32(); - continue; - case 10: - if (tag !== 82) { - break; - } - message.layers.push(VideoLayer.decode(reader, reader.uint32())); - continue; - case 11: - if (tag !== 90) { - break; - } - message.mimeType = reader.string(); - continue; - case 12: - if (tag !== 98) { - break; - } - message.mid = reader.string(); - continue; - case 13: - if (tag !== 106) { - break; - } - message.codecs.push(SimulcastCodecInfo.decode(reader, reader.uint32())); - continue; - case 14: - if (tag !== 112) { - break; - } - message.stereo = reader.bool(); - continue; - case 15: - if (tag !== 120) { - break; - } - message.disableRed = reader.bool(); - continue; - case 16: - if (tag !== 128) { - break; - } - message.encryption = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - sid: isSet$1(object.sid) ? String(object.sid) : "", - type: isSet$1(object.type) ? trackTypeFromJSON(object.type) : 0, - name: isSet$1(object.name) ? String(object.name) : "", - muted: isSet$1(object.muted) ? Boolean(object.muted) : false, - width: isSet$1(object.width) ? Number(object.width) : 0, - height: isSet$1(object.height) ? Number(object.height) : 0, - simulcast: isSet$1(object.simulcast) ? Boolean(object.simulcast) : false, - disableDtx: isSet$1(object.disableDtx) ? Boolean(object.disableDtx) : false, - source: isSet$1(object.source) ? trackSourceFromJSON(object.source) : 0, - layers: Array.isArray(object === null || object === void 0 ? void 0 : object.layers) ? object.layers.map(e => VideoLayer.fromJSON(e)) : [], - mimeType: isSet$1(object.mimeType) ? String(object.mimeType) : "", - mid: isSet$1(object.mid) ? String(object.mid) : "", - codecs: Array.isArray(object === null || object === void 0 ? void 0 : object.codecs) ? object.codecs.map(e => SimulcastCodecInfo.fromJSON(e)) : [], - stereo: isSet$1(object.stereo) ? Boolean(object.stereo) : false, - disableRed: isSet$1(object.disableRed) ? Boolean(object.disableRed) : false, - encryption: isSet$1(object.encryption) ? encryption_TypeFromJSON(object.encryption) : 0 - }; - }, - toJSON(message) { - const obj = {}; - message.sid !== undefined && (obj.sid = message.sid); - message.type !== undefined && (obj.type = trackTypeToJSON(message.type)); - message.name !== undefined && (obj.name = message.name); - message.muted !== undefined && (obj.muted = message.muted); - message.width !== undefined && (obj.width = Math.round(message.width)); - message.height !== undefined && (obj.height = Math.round(message.height)); - message.simulcast !== undefined && (obj.simulcast = message.simulcast); - message.disableDtx !== undefined && (obj.disableDtx = message.disableDtx); - message.source !== undefined && (obj.source = trackSourceToJSON(message.source)); - if (message.layers) { - obj.layers = message.layers.map(e => e ? VideoLayer.toJSON(e) : undefined); - } else { - obj.layers = []; - } - message.mimeType !== undefined && (obj.mimeType = message.mimeType); - message.mid !== undefined && (obj.mid = message.mid); - if (message.codecs) { - obj.codecs = message.codecs.map(e => e ? SimulcastCodecInfo.toJSON(e) : undefined); - } else { - obj.codecs = []; - } - message.stereo !== undefined && (obj.stereo = message.stereo); - message.disableRed !== undefined && (obj.disableRed = message.disableRed); - message.encryption !== undefined && (obj.encryption = encryption_TypeToJSON(message.encryption)); - return obj; - }, - create(base) { - return TrackInfo.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r; - const message = createBaseTrackInfo(); - message.sid = (_a = object.sid) !== null && _a !== void 0 ? _a : ""; - message.type = (_b = object.type) !== null && _b !== void 0 ? _b : 0; - message.name = (_c = object.name) !== null && _c !== void 0 ? _c : ""; - message.muted = (_d = object.muted) !== null && _d !== void 0 ? _d : false; - message.width = (_e = object.width) !== null && _e !== void 0 ? _e : 0; - message.height = (_f = object.height) !== null && _f !== void 0 ? _f : 0; - message.simulcast = (_g = object.simulcast) !== null && _g !== void 0 ? _g : false; - message.disableDtx = (_h = object.disableDtx) !== null && _h !== void 0 ? _h : false; - message.source = (_j = object.source) !== null && _j !== void 0 ? _j : 0; - message.layers = ((_k = object.layers) === null || _k === void 0 ? void 0 : _k.map(e => VideoLayer.fromPartial(e))) || []; - message.mimeType = (_l = object.mimeType) !== null && _l !== void 0 ? _l : ""; - message.mid = (_m = object.mid) !== null && _m !== void 0 ? _m : ""; - message.codecs = ((_o = object.codecs) === null || _o === void 0 ? void 0 : _o.map(e => SimulcastCodecInfo.fromPartial(e))) || []; - message.stereo = (_p = object.stereo) !== null && _p !== void 0 ? _p : false; - message.disableRed = (_q = object.disableRed) !== null && _q !== void 0 ? _q : false; - message.encryption = (_r = object.encryption) !== null && _r !== void 0 ? _r : 0; - return message; - } -}; -function createBaseVideoLayer() { - return { - quality: 0, - width: 0, - height: 0, - bitrate: 0, - ssrc: 0 - }; -} -const VideoLayer = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.quality !== 0) { - writer.uint32(8).int32(message.quality); - } - if (message.width !== 0) { - writer.uint32(16).uint32(message.width); - } - if (message.height !== 0) { - writer.uint32(24).uint32(message.height); - } - if (message.bitrate !== 0) { - writer.uint32(32).uint32(message.bitrate); - } - if (message.ssrc !== 0) { - writer.uint32(40).uint32(message.ssrc); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseVideoLayer(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - message.quality = reader.int32(); - continue; - case 2: - if (tag !== 16) { - break; - } - message.width = reader.uint32(); - continue; - case 3: - if (tag !== 24) { - break; - } - message.height = reader.uint32(); - continue; - case 4: - if (tag !== 32) { - break; - } - message.bitrate = reader.uint32(); - continue; - case 5: - if (tag !== 40) { - break; - } - message.ssrc = reader.uint32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - quality: isSet$1(object.quality) ? videoQualityFromJSON(object.quality) : 0, - width: isSet$1(object.width) ? Number(object.width) : 0, - height: isSet$1(object.height) ? Number(object.height) : 0, - bitrate: isSet$1(object.bitrate) ? Number(object.bitrate) : 0, - ssrc: isSet$1(object.ssrc) ? Number(object.ssrc) : 0 - }; - }, - toJSON(message) { - const obj = {}; - message.quality !== undefined && (obj.quality = videoQualityToJSON(message.quality)); - message.width !== undefined && (obj.width = Math.round(message.width)); - message.height !== undefined && (obj.height = Math.round(message.height)); - message.bitrate !== undefined && (obj.bitrate = Math.round(message.bitrate)); - message.ssrc !== undefined && (obj.ssrc = Math.round(message.ssrc)); - return obj; - }, - create(base) { - return VideoLayer.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c, _d, _e; - const message = createBaseVideoLayer(); - message.quality = (_a = object.quality) !== null && _a !== void 0 ? _a : 0; - message.width = (_b = object.width) !== null && _b !== void 0 ? _b : 0; - message.height = (_c = object.height) !== null && _c !== void 0 ? _c : 0; - message.bitrate = (_d = object.bitrate) !== null && _d !== void 0 ? _d : 0; - message.ssrc = (_e = object.ssrc) !== null && _e !== void 0 ? _e : 0; - return message; - } -}; -function createBaseDataPacket() { - return { - kind: 0, - value: undefined - }; -} -const DataPacket = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - var _a; - if (message.kind !== 0) { - writer.uint32(8).int32(message.kind); - } - switch ((_a = message.value) === null || _a === void 0 ? void 0 : _a.$case) { - case "user": - UserPacket.encode(message.value.user, writer.uint32(18).fork()).ldelim(); - break; - case "speaker": - ActiveSpeakerUpdate.encode(message.value.speaker, writer.uint32(26).fork()).ldelim(); - break; - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseDataPacket(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - message.kind = reader.int32(); - continue; - case 2: - if (tag !== 18) { - break; - } - message.value = { - $case: "user", - user: UserPacket.decode(reader, reader.uint32()) - }; - continue; - case 3: - if (tag !== 26) { - break; - } - message.value = { - $case: "speaker", - speaker: ActiveSpeakerUpdate.decode(reader, reader.uint32()) - }; - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - kind: isSet$1(object.kind) ? dataPacket_KindFromJSON(object.kind) : 0, - value: isSet$1(object.user) ? { - $case: "user", - user: UserPacket.fromJSON(object.user) - } : isSet$1(object.speaker) ? { - $case: "speaker", - speaker: ActiveSpeakerUpdate.fromJSON(object.speaker) - } : undefined - }; - }, - toJSON(message) { - var _a, _b, _c, _d, _e, _f; - const obj = {}; - message.kind !== undefined && (obj.kind = dataPacket_KindToJSON(message.kind)); - ((_a = message.value) === null || _a === void 0 ? void 0 : _a.$case) === "user" && (obj.user = ((_b = message.value) === null || _b === void 0 ? void 0 : _b.user) ? UserPacket.toJSON((_c = message.value) === null || _c === void 0 ? void 0 : _c.user) : undefined); - ((_d = message.value) === null || _d === void 0 ? void 0 : _d.$case) === "speaker" && (obj.speaker = ((_e = message.value) === null || _e === void 0 ? void 0 : _e.speaker) ? ActiveSpeakerUpdate.toJSON((_f = message.value) === null || _f === void 0 ? void 0 : _f.speaker) : undefined); - return obj; - }, - create(base) { - return DataPacket.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c, _d, _e, _f, _g; - const message = createBaseDataPacket(); - message.kind = (_a = object.kind) !== null && _a !== void 0 ? _a : 0; - if (((_b = object.value) === null || _b === void 0 ? void 0 : _b.$case) === "user" && ((_c = object.value) === null || _c === void 0 ? void 0 : _c.user) !== undefined && ((_d = object.value) === null || _d === void 0 ? void 0 : _d.user) !== null) { - message.value = { - $case: "user", - user: UserPacket.fromPartial(object.value.user) - }; - } - if (((_e = object.value) === null || _e === void 0 ? void 0 : _e.$case) === "speaker" && ((_f = object.value) === null || _f === void 0 ? void 0 : _f.speaker) !== undefined && ((_g = object.value) === null || _g === void 0 ? void 0 : _g.speaker) !== null) { - message.value = { - $case: "speaker", - speaker: ActiveSpeakerUpdate.fromPartial(object.value.speaker) - }; - } - return message; - } -}; -function createBaseActiveSpeakerUpdate() { - return { - speakers: [] - }; -} -const ActiveSpeakerUpdate = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - for (const v of message.speakers) { - SpeakerInfo.encode(v, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseActiveSpeakerUpdate(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.speakers.push(SpeakerInfo.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - speakers: Array.isArray(object === null || object === void 0 ? void 0 : object.speakers) ? object.speakers.map(e => SpeakerInfo.fromJSON(e)) : [] - }; - }, - toJSON(message) { - const obj = {}; - if (message.speakers) { - obj.speakers = message.speakers.map(e => e ? SpeakerInfo.toJSON(e) : undefined); - } else { - obj.speakers = []; - } - return obj; - }, - create(base) { - return ActiveSpeakerUpdate.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a; - const message = createBaseActiveSpeakerUpdate(); - message.speakers = ((_a = object.speakers) === null || _a === void 0 ? void 0 : _a.map(e => SpeakerInfo.fromPartial(e))) || []; - return message; - } -}; -function createBaseSpeakerInfo() { - return { - sid: "", - level: 0, - active: false - }; -} -const SpeakerInfo = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.sid !== "") { - writer.uint32(10).string(message.sid); - } - if (message.level !== 0) { - writer.uint32(21).float(message.level); - } - if (message.active === true) { - writer.uint32(24).bool(message.active); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSpeakerInfo(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.sid = reader.string(); - continue; - case 2: - if (tag !== 21) { - break; - } - message.level = reader.float(); - continue; - case 3: - if (tag !== 24) { - break; - } - message.active = reader.bool(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - sid: isSet$1(object.sid) ? String(object.sid) : "", - level: isSet$1(object.level) ? Number(object.level) : 0, - active: isSet$1(object.active) ? Boolean(object.active) : false - }; - }, - toJSON(message) { - const obj = {}; - message.sid !== undefined && (obj.sid = message.sid); - message.level !== undefined && (obj.level = message.level); - message.active !== undefined && (obj.active = message.active); - return obj; - }, - create(base) { - return SpeakerInfo.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c; - const message = createBaseSpeakerInfo(); - message.sid = (_a = object.sid) !== null && _a !== void 0 ? _a : ""; - message.level = (_b = object.level) !== null && _b !== void 0 ? _b : 0; - message.active = (_c = object.active) !== null && _c !== void 0 ? _c : false; - return message; - } -}; -function createBaseUserPacket() { - return { - participantSid: "", - payload: new Uint8Array(), - destinationSids: [], - topic: undefined - }; -} -const UserPacket = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.participantSid !== "") { - writer.uint32(10).string(message.participantSid); - } - if (message.payload.length !== 0) { - writer.uint32(18).bytes(message.payload); - } - for (const v of message.destinationSids) { - writer.uint32(26).string(v); - } - if (message.topic !== undefined) { - writer.uint32(34).string(message.topic); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUserPacket(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.participantSid = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - message.payload = reader.bytes(); - continue; - case 3: - if (tag !== 26) { - break; - } - message.destinationSids.push(reader.string()); - continue; - case 4: - if (tag !== 34) { - break; - } - message.topic = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - participantSid: isSet$1(object.participantSid) ? String(object.participantSid) : "", - payload: isSet$1(object.payload) ? bytesFromBase64$1(object.payload) : new Uint8Array(), - destinationSids: Array.isArray(object === null || object === void 0 ? void 0 : object.destinationSids) ? object.destinationSids.map(e => String(e)) : [], - topic: isSet$1(object.topic) ? String(object.topic) : undefined - }; - }, - toJSON(message) { - const obj = {}; - message.participantSid !== undefined && (obj.participantSid = message.participantSid); - message.payload !== undefined && (obj.payload = base64FromBytes$1(message.payload !== undefined ? message.payload : new Uint8Array())); - if (message.destinationSids) { - obj.destinationSids = message.destinationSids.map(e => e); - } else { - obj.destinationSids = []; - } - message.topic !== undefined && (obj.topic = message.topic); - return obj; - }, - create(base) { - return UserPacket.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c, _d; - const message = createBaseUserPacket(); - message.participantSid = (_a = object.participantSid) !== null && _a !== void 0 ? _a : ""; - message.payload = (_b = object.payload) !== null && _b !== void 0 ? _b : new Uint8Array(); - message.destinationSids = ((_c = object.destinationSids) === null || _c === void 0 ? void 0 : _c.map(e => e)) || []; - message.topic = (_d = object.topic) !== null && _d !== void 0 ? _d : undefined; - return message; - } -}; -function createBaseParticipantTracks() { - return { - participantSid: "", - trackSids: [] - }; -} -const ParticipantTracks = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.participantSid !== "") { - writer.uint32(10).string(message.participantSid); - } - for (const v of message.trackSids) { - writer.uint32(18).string(v); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseParticipantTracks(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.participantSid = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - message.trackSids.push(reader.string()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - participantSid: isSet$1(object.participantSid) ? String(object.participantSid) : "", - trackSids: Array.isArray(object === null || object === void 0 ? void 0 : object.trackSids) ? object.trackSids.map(e => String(e)) : [] - }; - }, - toJSON(message) { - const obj = {}; - message.participantSid !== undefined && (obj.participantSid = message.participantSid); - if (message.trackSids) { - obj.trackSids = message.trackSids.map(e => e); - } else { - obj.trackSids = []; - } - return obj; - }, - create(base) { - return ParticipantTracks.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b; - const message = createBaseParticipantTracks(); - message.participantSid = (_a = object.participantSid) !== null && _a !== void 0 ? _a : ""; - message.trackSids = ((_b = object.trackSids) === null || _b === void 0 ? void 0 : _b.map(e => e)) || []; - return message; - } -}; -function createBaseServerInfo() { - return { - edition: 0, - version: "", - protocol: 0, - region: "", - nodeId: "", - debugInfo: "" - }; -} -const ServerInfo = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.edition !== 0) { - writer.uint32(8).int32(message.edition); - } - if (message.version !== "") { - writer.uint32(18).string(message.version); - } - if (message.protocol !== 0) { - writer.uint32(24).int32(message.protocol); - } - if (message.region !== "") { - writer.uint32(34).string(message.region); - } - if (message.nodeId !== "") { - writer.uint32(42).string(message.nodeId); - } - if (message.debugInfo !== "") { - writer.uint32(50).string(message.debugInfo); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseServerInfo(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - message.edition = reader.int32(); - continue; - case 2: - if (tag !== 18) { - break; - } - message.version = reader.string(); - continue; - case 3: - if (tag !== 24) { - break; - } - message.protocol = reader.int32(); - continue; - case 4: - if (tag !== 34) { - break; - } - message.region = reader.string(); - continue; - case 5: - if (tag !== 42) { - break; - } - message.nodeId = reader.string(); - continue; - case 6: - if (tag !== 50) { - break; - } - message.debugInfo = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - edition: isSet$1(object.edition) ? serverInfo_EditionFromJSON(object.edition) : 0, - version: isSet$1(object.version) ? String(object.version) : "", - protocol: isSet$1(object.protocol) ? Number(object.protocol) : 0, - region: isSet$1(object.region) ? String(object.region) : "", - nodeId: isSet$1(object.nodeId) ? String(object.nodeId) : "", - debugInfo: isSet$1(object.debugInfo) ? String(object.debugInfo) : "" - }; - }, - toJSON(message) { - const obj = {}; - message.edition !== undefined && (obj.edition = serverInfo_EditionToJSON(message.edition)); - message.version !== undefined && (obj.version = message.version); - message.protocol !== undefined && (obj.protocol = Math.round(message.protocol)); - message.region !== undefined && (obj.region = message.region); - message.nodeId !== undefined && (obj.nodeId = message.nodeId); - message.debugInfo !== undefined && (obj.debugInfo = message.debugInfo); - return obj; - }, - create(base) { - return ServerInfo.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c, _d, _e, _f; - const message = createBaseServerInfo(); - message.edition = (_a = object.edition) !== null && _a !== void 0 ? _a : 0; - message.version = (_b = object.version) !== null && _b !== void 0 ? _b : ""; - message.protocol = (_c = object.protocol) !== null && _c !== void 0 ? _c : 0; - message.region = (_d = object.region) !== null && _d !== void 0 ? _d : ""; - message.nodeId = (_e = object.nodeId) !== null && _e !== void 0 ? _e : ""; - message.debugInfo = (_f = object.debugInfo) !== null && _f !== void 0 ? _f : ""; - return message; - } -}; -function createBaseClientInfo() { - return { - sdk: 0, - version: "", - protocol: 0, - os: "", - osVersion: "", - deviceModel: "", - browser: "", - browserVersion: "", - address: "", - network: "" - }; -} -const ClientInfo = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.sdk !== 0) { - writer.uint32(8).int32(message.sdk); - } - if (message.version !== "") { - writer.uint32(18).string(message.version); - } - if (message.protocol !== 0) { - writer.uint32(24).int32(message.protocol); - } - if (message.os !== "") { - writer.uint32(34).string(message.os); - } - if (message.osVersion !== "") { - writer.uint32(42).string(message.osVersion); - } - if (message.deviceModel !== "") { - writer.uint32(50).string(message.deviceModel); - } - if (message.browser !== "") { - writer.uint32(58).string(message.browser); - } - if (message.browserVersion !== "") { - writer.uint32(66).string(message.browserVersion); - } - if (message.address !== "") { - writer.uint32(74).string(message.address); - } - if (message.network !== "") { - writer.uint32(82).string(message.network); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseClientInfo(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - message.sdk = reader.int32(); - continue; - case 2: - if (tag !== 18) { - break; - } - message.version = reader.string(); - continue; - case 3: - if (tag !== 24) { - break; - } - message.protocol = reader.int32(); - continue; - case 4: - if (tag !== 34) { - break; - } - message.os = reader.string(); - continue; - case 5: - if (tag !== 42) { - break; - } - message.osVersion = reader.string(); - continue; - case 6: - if (tag !== 50) { - break; - } - message.deviceModel = reader.string(); - continue; - case 7: - if (tag !== 58) { - break; - } - message.browser = reader.string(); - continue; - case 8: - if (tag !== 66) { - break; - } - message.browserVersion = reader.string(); - continue; - case 9: - if (tag !== 74) { - break; - } - message.address = reader.string(); - continue; - case 10: - if (tag !== 82) { - break; - } - message.network = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - sdk: isSet$1(object.sdk) ? clientInfo_SDKFromJSON(object.sdk) : 0, - version: isSet$1(object.version) ? String(object.version) : "", - protocol: isSet$1(object.protocol) ? Number(object.protocol) : 0, - os: isSet$1(object.os) ? String(object.os) : "", - osVersion: isSet$1(object.osVersion) ? String(object.osVersion) : "", - deviceModel: isSet$1(object.deviceModel) ? String(object.deviceModel) : "", - browser: isSet$1(object.browser) ? String(object.browser) : "", - browserVersion: isSet$1(object.browserVersion) ? String(object.browserVersion) : "", - address: isSet$1(object.address) ? String(object.address) : "", - network: isSet$1(object.network) ? String(object.network) : "" - }; - }, - toJSON(message) { - const obj = {}; - message.sdk !== undefined && (obj.sdk = clientInfo_SDKToJSON(message.sdk)); - message.version !== undefined && (obj.version = message.version); - message.protocol !== undefined && (obj.protocol = Math.round(message.protocol)); - message.os !== undefined && (obj.os = message.os); - message.osVersion !== undefined && (obj.osVersion = message.osVersion); - message.deviceModel !== undefined && (obj.deviceModel = message.deviceModel); - message.browser !== undefined && (obj.browser = message.browser); - message.browserVersion !== undefined && (obj.browserVersion = message.browserVersion); - message.address !== undefined && (obj.address = message.address); - message.network !== undefined && (obj.network = message.network); - return obj; - }, - create(base) { - return ClientInfo.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; - const message = createBaseClientInfo(); - message.sdk = (_a = object.sdk) !== null && _a !== void 0 ? _a : 0; - message.version = (_b = object.version) !== null && _b !== void 0 ? _b : ""; - message.protocol = (_c = object.protocol) !== null && _c !== void 0 ? _c : 0; - message.os = (_d = object.os) !== null && _d !== void 0 ? _d : ""; - message.osVersion = (_e = object.osVersion) !== null && _e !== void 0 ? _e : ""; - message.deviceModel = (_f = object.deviceModel) !== null && _f !== void 0 ? _f : ""; - message.browser = (_g = object.browser) !== null && _g !== void 0 ? _g : ""; - message.browserVersion = (_h = object.browserVersion) !== null && _h !== void 0 ? _h : ""; - message.address = (_j = object.address) !== null && _j !== void 0 ? _j : ""; - message.network = (_k = object.network) !== null && _k !== void 0 ? _k : ""; - return message; - } -}; -function createBaseClientConfiguration() { - return { - video: undefined, - screen: undefined, - resumeConnection: 0, - disabledCodecs: undefined, - forceRelay: 0 - }; -} -const ClientConfiguration = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.video !== undefined) { - VideoConfiguration.encode(message.video, writer.uint32(10).fork()).ldelim(); - } - if (message.screen !== undefined) { - VideoConfiguration.encode(message.screen, writer.uint32(18).fork()).ldelim(); - } - if (message.resumeConnection !== 0) { - writer.uint32(24).int32(message.resumeConnection); - } - if (message.disabledCodecs !== undefined) { - DisabledCodecs.encode(message.disabledCodecs, writer.uint32(34).fork()).ldelim(); - } - if (message.forceRelay !== 0) { - writer.uint32(40).int32(message.forceRelay); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseClientConfiguration(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.video = VideoConfiguration.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - message.screen = VideoConfiguration.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 24) { - break; - } - message.resumeConnection = reader.int32(); - continue; - case 4: - if (tag !== 34) { - break; - } - message.disabledCodecs = DisabledCodecs.decode(reader, reader.uint32()); - continue; - case 5: - if (tag !== 40) { - break; - } - message.forceRelay = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - video: isSet$1(object.video) ? VideoConfiguration.fromJSON(object.video) : undefined, - screen: isSet$1(object.screen) ? VideoConfiguration.fromJSON(object.screen) : undefined, - resumeConnection: isSet$1(object.resumeConnection) ? clientConfigSettingFromJSON(object.resumeConnection) : 0, - disabledCodecs: isSet$1(object.disabledCodecs) ? DisabledCodecs.fromJSON(object.disabledCodecs) : undefined, - forceRelay: isSet$1(object.forceRelay) ? clientConfigSettingFromJSON(object.forceRelay) : 0 - }; - }, - toJSON(message) { - const obj = {}; - message.video !== undefined && (obj.video = message.video ? VideoConfiguration.toJSON(message.video) : undefined); - message.screen !== undefined && (obj.screen = message.screen ? VideoConfiguration.toJSON(message.screen) : undefined); - message.resumeConnection !== undefined && (obj.resumeConnection = clientConfigSettingToJSON(message.resumeConnection)); - message.disabledCodecs !== undefined && (obj.disabledCodecs = message.disabledCodecs ? DisabledCodecs.toJSON(message.disabledCodecs) : undefined); - message.forceRelay !== undefined && (obj.forceRelay = clientConfigSettingToJSON(message.forceRelay)); - return obj; - }, - create(base) { - return ClientConfiguration.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b; - const message = createBaseClientConfiguration(); - message.video = object.video !== undefined && object.video !== null ? VideoConfiguration.fromPartial(object.video) : undefined; - message.screen = object.screen !== undefined && object.screen !== null ? VideoConfiguration.fromPartial(object.screen) : undefined; - message.resumeConnection = (_a = object.resumeConnection) !== null && _a !== void 0 ? _a : 0; - message.disabledCodecs = object.disabledCodecs !== undefined && object.disabledCodecs !== null ? DisabledCodecs.fromPartial(object.disabledCodecs) : undefined; - message.forceRelay = (_b = object.forceRelay) !== null && _b !== void 0 ? _b : 0; - return message; - } -}; -function createBaseVideoConfiguration() { - return { - hardwareEncoder: 0 - }; -} -const VideoConfiguration = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.hardwareEncoder !== 0) { - writer.uint32(8).int32(message.hardwareEncoder); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseVideoConfiguration(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - message.hardwareEncoder = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - hardwareEncoder: isSet$1(object.hardwareEncoder) ? clientConfigSettingFromJSON(object.hardwareEncoder) : 0 - }; - }, - toJSON(message) { - const obj = {}; - message.hardwareEncoder !== undefined && (obj.hardwareEncoder = clientConfigSettingToJSON(message.hardwareEncoder)); - return obj; - }, - create(base) { - return VideoConfiguration.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a; - const message = createBaseVideoConfiguration(); - message.hardwareEncoder = (_a = object.hardwareEncoder) !== null && _a !== void 0 ? _a : 0; - return message; - } -}; -function createBaseDisabledCodecs() { - return { - codecs: [], - publish: [] - }; -} -const DisabledCodecs = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - for (const v of message.codecs) { - Codec.encode(v, writer.uint32(10).fork()).ldelim(); - } - for (const v of message.publish) { - Codec.encode(v, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseDisabledCodecs(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.codecs.push(Codec.decode(reader, reader.uint32())); - continue; - case 2: - if (tag !== 18) { - break; - } - message.publish.push(Codec.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - codecs: Array.isArray(object === null || object === void 0 ? void 0 : object.codecs) ? object.codecs.map(e => Codec.fromJSON(e)) : [], - publish: Array.isArray(object === null || object === void 0 ? void 0 : object.publish) ? object.publish.map(e => Codec.fromJSON(e)) : [] - }; - }, - toJSON(message) { - const obj = {}; - if (message.codecs) { - obj.codecs = message.codecs.map(e => e ? Codec.toJSON(e) : undefined); - } else { - obj.codecs = []; - } - if (message.publish) { - obj.publish = message.publish.map(e => e ? Codec.toJSON(e) : undefined); - } else { - obj.publish = []; - } - return obj; - }, - create(base) { - return DisabledCodecs.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b; - const message = createBaseDisabledCodecs(); - message.codecs = ((_a = object.codecs) === null || _a === void 0 ? void 0 : _a.map(e => Codec.fromPartial(e))) || []; - message.publish = ((_b = object.publish) === null || _b === void 0 ? void 0 : _b.map(e => Codec.fromPartial(e))) || []; - return message; - } -}; -var tsProtoGlobalThis$1 = (() => { - if (typeof globalThis !== "undefined") { - return globalThis; - } - if (typeof self !== "undefined") { - return self; - } - if (typeof window !== "undefined") { - return window; - } - if (typeof global !== "undefined") { - return global; - } - throw "Unable to locate global object"; -})(); -function bytesFromBase64$1(b64) { - if (tsProtoGlobalThis$1.Buffer) { - return Uint8Array.from(tsProtoGlobalThis$1.Buffer.from(b64, "base64")); - } else { - const bin = tsProtoGlobalThis$1.atob(b64); - const arr = new Uint8Array(bin.length); - for (let i = 0; i < bin.length; ++i) { - arr[i] = bin.charCodeAt(i); - } - return arr; - } -} -function base64FromBytes$1(arr) { - if (tsProtoGlobalThis$1.Buffer) { - return tsProtoGlobalThis$1.Buffer.from(arr).toString("base64"); - } else { - const bin = []; - arr.forEach(byte => { - bin.push(String.fromCharCode(byte)); - }); - return tsProtoGlobalThis$1.btoa(bin.join("")); - } -} -function longToNumber$1(long) { - if (long.gt(Number.MAX_SAFE_INTEGER)) { - throw new tsProtoGlobalThis$1.Error("Value is larger than Number.MAX_SAFE_INTEGER"); - } - return long.toNumber(); -} -if (_m0.util.Long !== Long$1) { - _m0.util.Long = Long$1; - _m0.configure(); -} -function isSet$1(value) { - return value !== null && value !== undefined; -} - -const maxRetryDelay = 7000; -const DEFAULT_RETRY_DELAYS_IN_MS = [0, 300, 2 * 2 * 300, 3 * 3 * 300, 4 * 4 * 300, maxRetryDelay, maxRetryDelay, maxRetryDelay, maxRetryDelay, maxRetryDelay]; -class DefaultReconnectPolicy { - constructor(retryDelays) { - this._retryDelays = retryDelays !== undefined ? [...retryDelays] : DEFAULT_RETRY_DELAYS_IN_MS; - } - nextRetryDelayInMs(context) { - if (context.retryCount >= this._retryDelays.length) return null; - const retryDelay = this._retryDelays[context.retryCount]; - if (context.retryCount <= 1) return retryDelay; - return retryDelay + Math.random() * 1000; - } -} - -/****************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/* global Reflect, Promise */ - - -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 { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -function __values(o) { - var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; - if (m) return m.call(o); - if (o && typeof o.length === "number") return { - next: function () { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - } - }; - throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); -} - -function __asyncValues(o) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); - function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } - function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } -} - -var events = {exports: {}}; - -var R = typeof Reflect === 'object' ? Reflect : null; -var ReflectApply = R && typeof R.apply === 'function' ? R.apply : function ReflectApply(target, receiver, args) { - return Function.prototype.apply.call(target, receiver, args); -}; -var ReflectOwnKeys; -if (R && typeof R.ownKeys === 'function') { - ReflectOwnKeys = R.ownKeys; -} else if (Object.getOwnPropertySymbols) { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target)); - }; -} else { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target); - }; -} -function ProcessEmitWarning(warning) { - if (console && console.warn) console.warn(warning); -} -var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { - return value !== value; -}; -function EventEmitter() { - EventEmitter.init.call(this); -} -events.exports = EventEmitter; -events.exports.once = once; - -// Backwards-compat with node 0.10.x -EventEmitter.EventEmitter = EventEmitter; -EventEmitter.prototype._events = undefined; -EventEmitter.prototype._eventsCount = 0; -EventEmitter.prototype._maxListeners = undefined; - -// By default EventEmitters will print a warning if more than 10 listeners are -// added to it. This is a useful default which helps finding memory leaks. -var defaultMaxListeners = 10; -function checkListener(listener) { - if (typeof listener !== 'function') { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } -} -Object.defineProperty(EventEmitter, 'defaultMaxListeners', { - enumerable: true, - get: function () { - return defaultMaxListeners; - }, - set: function (arg) { - if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { - throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); - } - defaultMaxListeners = arg; - } -}); -EventEmitter.init = function () { - if (this._events === undefined || this._events === Object.getPrototypeOf(this)._events) { - this._events = Object.create(null); - this._eventsCount = 0; - } - this._maxListeners = this._maxListeners || undefined; -}; - -// Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. -EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { - throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); - } - this._maxListeners = n; - return this; -}; -function _getMaxListeners(that) { - if (that._maxListeners === undefined) return EventEmitter.defaultMaxListeners; - return that._maxListeners; -} -EventEmitter.prototype.getMaxListeners = function getMaxListeners() { - return _getMaxListeners(this); -}; -EventEmitter.prototype.emit = function emit(type) { - var args = []; - for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); - var doError = type === 'error'; - var events = this._events; - if (events !== undefined) doError = doError && events.error === undefined;else if (!doError) return false; - - // If there is no 'error' event listener then throw. - if (doError) { - var er; - if (args.length > 0) er = args[0]; - if (er instanceof Error) { - // Note: The comments on the `throw` lines are intentional, they show - // up in Node's output if this results in an unhandled exception. - throw er; // Unhandled 'error' event - } - // At least give some kind of context to the user - var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); - err.context = er; - throw err; // Unhandled 'error' event - } - - var handler = events[type]; - if (handler === undefined) return false; - if (typeof handler === 'function') { - ReflectApply(handler, this, args); - } else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) ReflectApply(listeners[i], this, args); - } - return true; -}; -function _addListener(target, type, listener, prepend) { - var m; - var events; - var existing; - checkListener(listener); - events = target._events; - if (events === undefined) { - events = target._events = Object.create(null); - target._eventsCount = 0; - } else { - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (events.newListener !== undefined) { - target.emit('newListener', type, listener.listener ? listener.listener : listener); - - // Re-assign `events` because a newListener handler could have caused the - // this._events to be assigned to a new object - events = target._events; - } - existing = events[type]; - } - if (existing === undefined) { - // Optimize the case of one listener. Don't need the extra array object. - existing = events[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === 'function') { - // Adding the second element, need to change to array. - existing = events[type] = prepend ? [listener, existing] : [existing, listener]; - // If we've already got an array, just append. - } else if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - - // Check for listener leak - m = _getMaxListeners(target); - if (m > 0 && existing.length > m && !existing.warned) { - existing.warned = true; - // No error code for this since it is a Warning - // eslint-disable-next-line no-restricted-syntax - var w = new Error('Possible EventEmitter memory leak detected. ' + existing.length + ' ' + String(type) + ' listeners ' + 'added. Use emitter.setMaxListeners() to ' + 'increase limit'); - w.name = 'MaxListenersExceededWarning'; - w.emitter = target; - w.type = type; - w.count = existing.length; - ProcessEmitWarning(w); - } - } - return target; -} -EventEmitter.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); -}; -EventEmitter.prototype.on = EventEmitter.prototype.addListener; -EventEmitter.prototype.prependListener = function prependListener(type, listener) { - return _addListener(this, type, listener, true); -}; -function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - if (arguments.length === 0) return this.listener.call(this.target); - return this.listener.apply(this.target, arguments); - } -} -function _onceWrap(target, type, listener) { - var state = { - fired: false, - wrapFn: undefined, - target: target, - type: type, - listener: listener - }; - var wrapped = onceWrapper.bind(state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; -} -EventEmitter.prototype.once = function once(type, listener) { - checkListener(listener); - this.on(type, _onceWrap(this, type, listener)); - return this; -}; -EventEmitter.prototype.prependOnceListener = function prependOnceListener(type, listener) { - checkListener(listener); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; -}; - -// Emits a 'removeListener' event if and only if the listener was removed. -EventEmitter.prototype.removeListener = function removeListener(type, listener) { - var list, events, position, i, originalListener; - checkListener(listener); - events = this._events; - if (events === undefined) return this; - list = events[type]; - if (list === undefined) return this; - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) this._events = Object.create(null);else { - delete events[type]; - if (events.removeListener) this.emit('removeListener', type, list.listener || listener); - } - } else if (typeof list !== 'function') { - position = -1; - for (i = list.length - 1; i >= 0; i--) { - if (list[i] === listener || list[i].listener === listener) { - originalListener = list[i].listener; - position = i; - break; - } - } - if (position < 0) return this; - if (position === 0) list.shift();else { - spliceOne(list, position); - } - if (list.length === 1) events[type] = list[0]; - if (events.removeListener !== undefined) this.emit('removeListener', type, originalListener || listener); - } - return this; -}; -EventEmitter.prototype.off = EventEmitter.prototype.removeListener; -EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) { - var listeners, events, i; - events = this._events; - if (events === undefined) return this; - - // not listening for removeListener, no need to emit - if (events.removeListener === undefined) { - if (arguments.length === 0) { - this._events = Object.create(null); - this._eventsCount = 0; - } else if (events[type] !== undefined) { - if (--this._eventsCount === 0) this._events = Object.create(null);else delete events[type]; - } - return this; - } - - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - var keys = Object.keys(events); - var key; - for (i = 0; i < keys.length; ++i) { - key = keys[i]; - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - this.removeAllListeners('removeListener'); - this._events = Object.create(null); - this._eventsCount = 0; - return this; - } - listeners = events[type]; - if (typeof listeners === 'function') { - this.removeListener(type, listeners); - } else if (listeners !== undefined) { - // LIFO order - for (i = listeners.length - 1; i >= 0; i--) { - this.removeListener(type, listeners[i]); - } - } - return this; -}; -function _listeners(target, type, unwrap) { - var events = target._events; - if (events === undefined) return []; - var evlistener = events[type]; - if (evlistener === undefined) return []; - if (typeof evlistener === 'function') return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); -} -EventEmitter.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); -}; -EventEmitter.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); -}; -EventEmitter.listenerCount = function (emitter, type) { - if (typeof emitter.listenerCount === 'function') { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } -}; -EventEmitter.prototype.listenerCount = listenerCount; -function listenerCount(type) { - var events = this._events; - if (events !== undefined) { - var evlistener = events[type]; - if (typeof evlistener === 'function') { - return 1; - } else if (evlistener !== undefined) { - return evlistener.length; - } - } - return 0; -} -EventEmitter.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; -}; -function arrayClone(arr, n) { - var copy = new Array(n); - for (var i = 0; i < n; ++i) copy[i] = arr[i]; - return copy; -} -function spliceOne(list, index) { - for (; index + 1 < list.length; index++) list[index] = list[index + 1]; - list.pop(); -} -function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; -} -function once(emitter, name) { - return new Promise(function (resolve, reject) { - function errorListener(err) { - emitter.removeListener(name, resolver); - reject(err); - } - function resolver() { - if (typeof emitter.removeListener === 'function') { - emitter.removeListener('error', errorListener); - } - resolve([].slice.call(arguments)); - } - eventTargetAgnosticAddListener(emitter, name, resolver, { - once: true - }); - if (name !== 'error') { - addErrorHandlerIfEventEmitter(emitter, errorListener, { - once: true - }); - } - }); -} -function addErrorHandlerIfEventEmitter(emitter, handler, flags) { - if (typeof emitter.on === 'function') { - eventTargetAgnosticAddListener(emitter, 'error', handler, flags); - } -} -function eventTargetAgnosticAddListener(emitter, name, listener, flags) { - if (typeof emitter.on === 'function') { - if (flags.once) { - emitter.once(name, listener); - } else { - emitter.on(name, listener); - } - } else if (typeof emitter.addEventListener === 'function') { - // EventTarget does not have `error` event semantics like Node - // EventEmitters, we do not listen for `error` events here. - emitter.addEventListener(name, function wrapListener(arg) { - // IE does not have builtin `{ once: true }` support so we - // have to do it manually. - if (flags.once) { - emitter.removeEventListener(name, wrapListener); - } - listener(arg); - }); - } else { - throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); - } -} -var eventsExports = events.exports; - -/* - * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. - */ -/* eslint-env node */ - -let logDisabled_ = true; -let deprecationWarnings_ = true; - -/** - * Extract browser version out of the provided user agent string. - * - * @param {!string} uastring userAgent string. - * @param {!string} expr Regular expression used as match criteria. - * @param {!number} pos position in the version string to be returned. - * @return {!number} browser version. - */ -function extractVersion(uastring, expr, pos) { - const match = uastring.match(expr); - return match && match.length >= pos && parseInt(match[pos], 10); -} - -// Wraps the peerconnection event eventNameToWrap in a function -// which returns the modified event object (or false to prevent -// the event). -function wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) { - if (!window.RTCPeerConnection) { - return; - } - const proto = window.RTCPeerConnection.prototype; - const nativeAddEventListener = proto.addEventListener; - proto.addEventListener = function (nativeEventName, cb) { - if (nativeEventName !== eventNameToWrap) { - return nativeAddEventListener.apply(this, arguments); - } - const wrappedCallback = e => { - const modifiedEvent = wrapper(e); - if (modifiedEvent) { - if (cb.handleEvent) { - cb.handleEvent(modifiedEvent); - } else { - cb(modifiedEvent); - } - } - }; - this._eventMap = this._eventMap || {}; - if (!this._eventMap[eventNameToWrap]) { - this._eventMap[eventNameToWrap] = new Map(); - } - this._eventMap[eventNameToWrap].set(cb, wrappedCallback); - return nativeAddEventListener.apply(this, [nativeEventName, wrappedCallback]); - }; - const nativeRemoveEventListener = proto.removeEventListener; - proto.removeEventListener = function (nativeEventName, cb) { - if (nativeEventName !== eventNameToWrap || !this._eventMap || !this._eventMap[eventNameToWrap]) { - return nativeRemoveEventListener.apply(this, arguments); - } - if (!this._eventMap[eventNameToWrap].has(cb)) { - return nativeRemoveEventListener.apply(this, arguments); - } - const unwrappedCb = this._eventMap[eventNameToWrap].get(cb); - this._eventMap[eventNameToWrap].delete(cb); - if (this._eventMap[eventNameToWrap].size === 0) { - delete this._eventMap[eventNameToWrap]; - } - if (Object.keys(this._eventMap).length === 0) { - delete this._eventMap; - } - return nativeRemoveEventListener.apply(this, [nativeEventName, unwrappedCb]); - }; - Object.defineProperty(proto, 'on' + eventNameToWrap, { - get() { - return this['_on' + eventNameToWrap]; - }, - set(cb) { - if (this['_on' + eventNameToWrap]) { - this.removeEventListener(eventNameToWrap, this['_on' + eventNameToWrap]); - delete this['_on' + eventNameToWrap]; - } - if (cb) { - this.addEventListener(eventNameToWrap, this['_on' + eventNameToWrap] = cb); - } - }, - enumerable: true, - configurable: true - }); -} -function disableLog(bool) { - if (typeof bool !== 'boolean') { - return new Error('Argument type: ' + typeof bool + '. Please use a boolean.'); - } - logDisabled_ = bool; - return bool ? 'adapter.js logging disabled' : 'adapter.js logging enabled'; -} - -/** - * Disable or enable deprecation warnings - * @param {!boolean} bool set to true to disable warnings. - */ -function disableWarnings(bool) { - if (typeof bool !== 'boolean') { - return new Error('Argument type: ' + typeof bool + '. Please use a boolean.'); - } - deprecationWarnings_ = !bool; - return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled'); -} -function log() { - if (typeof window === 'object') { - if (logDisabled_) { - return; - } - if (typeof console !== 'undefined' && typeof console.log === 'function') { - console.log.apply(console, arguments); - } - } -} - -/** - * Shows a deprecation warning suggesting the modern and spec-compatible API. - */ -function deprecated(oldMethod, newMethod) { - if (!deprecationWarnings_) { - return; - } - console.warn(oldMethod + ' is deprecated, please use ' + newMethod + ' instead.'); -} - -/** - * Browser detector. - * - * @return {object} result containing browser and version - * properties. - */ -function detectBrowser(window) { - // Returned result object. - const result = { - browser: null, - version: null - }; - - // Fail early if it's not a browser - if (typeof window === 'undefined' || !window.navigator) { - result.browser = 'Not a browser.'; - return result; - } - const { - navigator - } = window; - if (navigator.mozGetUserMedia) { - // Firefox. - result.browser = 'firefox'; - result.version = extractVersion(navigator.userAgent, /Firefox\/(\d+)\./, 1); - } else if (navigator.webkitGetUserMedia || window.isSecureContext === false && window.webkitRTCPeerConnection) { - // Chrome, Chromium, Webview, Opera. - // Version matches Chrome/WebRTC version. - // Chrome 74 removed webkitGetUserMedia on http as well so we need the - // more complicated fallback to webkitRTCPeerConnection. - result.browser = 'chrome'; - result.version = extractVersion(navigator.userAgent, /Chrom(e|ium)\/(\d+)\./, 2); - } else if (window.RTCPeerConnection && navigator.userAgent.match(/AppleWebKit\/(\d+)\./)) { - // Safari. - result.browser = 'safari'; - result.version = extractVersion(navigator.userAgent, /AppleWebKit\/(\d+)\./, 1); - result.supportsUnifiedPlan = window.RTCRtpTransceiver && 'currentDirection' in window.RTCRtpTransceiver.prototype; - } else { - // Default fallthrough: not supported. - result.browser = 'Not a supported browser.'; - return result; - } - return result; -} - -/** - * Checks if something is an object. - * - * @param {*} val The something you want to check. - * @return true if val is an object, false otherwise. - */ -function isObject(val) { - return Object.prototype.toString.call(val) === '[object Object]'; -} - -/** - * Remove all empty objects and undefined values - * from a nested object -- an enhanced and vanilla version - * of Lodash's `compact`. - */ -function compactObject(data) { - if (!isObject(data)) { - return data; - } - return Object.keys(data).reduce(function (accumulator, key) { - const isObj = isObject(data[key]); - const value = isObj ? compactObject(data[key]) : data[key]; - const isEmptyObject = isObj && !Object.keys(value).length; - if (value === undefined || isEmptyObject) { - return accumulator; - } - return Object.assign(accumulator, { - [key]: value - }); - }, {}); -} - -/* iterates the stats graph recursively. */ -function walkStats(stats, base, resultSet) { - if (!base || resultSet.has(base.id)) { - return; - } - resultSet.set(base.id, base); - Object.keys(base).forEach(name => { - if (name.endsWith('Id')) { - walkStats(stats, stats.get(base[name]), resultSet); - } else if (name.endsWith('Ids')) { - base[name].forEach(id => { - walkStats(stats, stats.get(id), resultSet); - }); - } - }); -} - -/* filter getStats for a sender/receiver track. */ -function filterStats(result, track, outbound) { - const streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp'; - const filteredResult = new Map(); - if (track === null) { - return filteredResult; - } - const trackStats = []; - result.forEach(value => { - if (value.type === 'track' && value.trackIdentifier === track.id) { - trackStats.push(value); - } - }); - trackStats.forEach(trackStat => { - result.forEach(stats => { - if (stats.type === streamStatsType && stats.trackId === trackStat.id) { - walkStats(result, stats, filteredResult); - } - }); - }); - return filteredResult; -} - -/* - * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. - */ -/* eslint-env node */ -const logging = log; -function shimGetUserMedia$2(window, browserDetails) { - const navigator = window && window.navigator; - if (!navigator.mediaDevices) { - return; - } - const constraintsToChrome_ = function (c) { - if (typeof c !== 'object' || c.mandatory || c.optional) { - return c; - } - const cc = {}; - Object.keys(c).forEach(key => { - if (key === 'require' || key === 'advanced' || key === 'mediaSource') { - return; - } - const r = typeof c[key] === 'object' ? c[key] : { - ideal: c[key] - }; - if (r.exact !== undefined && typeof r.exact === 'number') { - r.min = r.max = r.exact; - } - const oldname_ = function (prefix, name) { - if (prefix) { - return prefix + name.charAt(0).toUpperCase() + name.slice(1); - } - return name === 'deviceId' ? 'sourceId' : name; - }; - if (r.ideal !== undefined) { - cc.optional = cc.optional || []; - let oc = {}; - if (typeof r.ideal === 'number') { - oc[oldname_('min', key)] = r.ideal; - cc.optional.push(oc); - oc = {}; - oc[oldname_('max', key)] = r.ideal; - cc.optional.push(oc); - } else { - oc[oldname_('', key)] = r.ideal; - cc.optional.push(oc); - } - } - if (r.exact !== undefined && typeof r.exact !== 'number') { - cc.mandatory = cc.mandatory || {}; - cc.mandatory[oldname_('', key)] = r.exact; - } else { - ['min', 'max'].forEach(mix => { - if (r[mix] !== undefined) { - cc.mandatory = cc.mandatory || {}; - cc.mandatory[oldname_(mix, key)] = r[mix]; - } - }); - } - }); - if (c.advanced) { - cc.optional = (cc.optional || []).concat(c.advanced); - } - return cc; - }; - const shimConstraints_ = function (constraints, func) { - if (browserDetails.version >= 61) { - return func(constraints); - } - constraints = JSON.parse(JSON.stringify(constraints)); - if (constraints && typeof constraints.audio === 'object') { - const remap = function (obj, a, b) { - if (a in obj && !(b in obj)) { - obj[b] = obj[a]; - delete obj[a]; - } - }; - constraints = JSON.parse(JSON.stringify(constraints)); - remap(constraints.audio, 'autoGainControl', 'googAutoGainControl'); - remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression'); - constraints.audio = constraintsToChrome_(constraints.audio); - } - if (constraints && typeof constraints.video === 'object') { - // Shim facingMode for mobile & surface pro. - let face = constraints.video.facingMode; - face = face && (typeof face === 'object' ? face : { - ideal: face - }); - const getSupportedFacingModeLies = browserDetails.version < 66; - if (face && (face.exact === 'user' || face.exact === 'environment' || face.ideal === 'user' || face.ideal === 'environment') && !(navigator.mediaDevices.getSupportedConstraints && navigator.mediaDevices.getSupportedConstraints().facingMode && !getSupportedFacingModeLies)) { - delete constraints.video.facingMode; - let matches; - if (face.exact === 'environment' || face.ideal === 'environment') { - matches = ['back', 'rear']; - } else if (face.exact === 'user' || face.ideal === 'user') { - matches = ['front']; - } - if (matches) { - // Look for matches in label, or use last cam for back (typical). - return navigator.mediaDevices.enumerateDevices().then(devices => { - devices = devices.filter(d => d.kind === 'videoinput'); - let dev = devices.find(d => matches.some(match => d.label.toLowerCase().includes(match))); - if (!dev && devices.length && matches.includes('back')) { - dev = devices[devices.length - 1]; // more likely the back cam - } - - if (dev) { - constraints.video.deviceId = face.exact ? { - exact: dev.deviceId - } : { - ideal: dev.deviceId - }; - } - constraints.video = constraintsToChrome_(constraints.video); - logging('chrome: ' + JSON.stringify(constraints)); - return func(constraints); - }); - } - } - constraints.video = constraintsToChrome_(constraints.video); - } - logging('chrome: ' + JSON.stringify(constraints)); - return func(constraints); - }; - const shimError_ = function (e) { - if (browserDetails.version >= 64) { - return e; - } - return { - name: { - PermissionDeniedError: 'NotAllowedError', - PermissionDismissedError: 'NotAllowedError', - InvalidStateError: 'NotAllowedError', - DevicesNotFoundError: 'NotFoundError', - ConstraintNotSatisfiedError: 'OverconstrainedError', - TrackStartError: 'NotReadableError', - MediaDeviceFailedDueToShutdown: 'NotAllowedError', - MediaDeviceKillSwitchOn: 'NotAllowedError', - TabCaptureError: 'AbortError', - ScreenCaptureError: 'AbortError', - DeviceCaptureError: 'AbortError' - }[e.name] || e.name, - message: e.message, - constraint: e.constraint || e.constraintName, - toString() { - return this.name + (this.message && ': ') + this.message; - } - }; - }; - const getUserMedia_ = function (constraints, onSuccess, onError) { - shimConstraints_(constraints, c => { - navigator.webkitGetUserMedia(c, onSuccess, e => { - if (onError) { - onError(shimError_(e)); - } - }); - }); - }; - navigator.getUserMedia = getUserMedia_.bind(navigator); - - // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia - // function which returns a Promise, it does not accept spec-style - // constraints. - if (navigator.mediaDevices.getUserMedia) { - const origGetUserMedia = navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices); - navigator.mediaDevices.getUserMedia = function (cs) { - return shimConstraints_(cs, c => origGetUserMedia(c).then(stream => { - if (c.audio && !stream.getAudioTracks().length || c.video && !stream.getVideoTracks().length) { - stream.getTracks().forEach(track => { - track.stop(); - }); - throw new DOMException('', 'NotFoundError'); - } - return stream; - }, e => Promise.reject(shimError_(e)))); - }; - } -} - -/* - * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. - */ -/* eslint-env node */ - -function shimGetDisplayMedia$1(window, getSourceId) { - if (window.navigator.mediaDevices && 'getDisplayMedia' in window.navigator.mediaDevices) { - return; - } - if (!window.navigator.mediaDevices) { - return; - } - // getSourceId is a function that returns a promise resolving with - // the sourceId of the screen/window/tab to be shared. - if (typeof getSourceId !== 'function') { - console.error('shimGetDisplayMedia: getSourceId argument is not ' + 'a function'); - return; - } - window.navigator.mediaDevices.getDisplayMedia = function getDisplayMedia(constraints) { - return getSourceId(constraints).then(sourceId => { - const widthSpecified = constraints.video && constraints.video.width; - const heightSpecified = constraints.video && constraints.video.height; - const frameRateSpecified = constraints.video && constraints.video.frameRate; - constraints.video = { - mandatory: { - chromeMediaSource: 'desktop', - chromeMediaSourceId: sourceId, - maxFrameRate: frameRateSpecified || 3 - } - }; - if (widthSpecified) { - constraints.video.mandatory.maxWidth = widthSpecified; - } - if (heightSpecified) { - constraints.video.mandatory.maxHeight = heightSpecified; - } - return window.navigator.mediaDevices.getUserMedia(constraints); - }); - }; -} - -/* - * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. - */ -/* eslint-env node */ -function shimMediaStream(window) { - window.MediaStream = window.MediaStream || window.webkitMediaStream; -} -function shimOnTrack$1(window) { - if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in window.RTCPeerConnection.prototype)) { - Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', { - get() { - return this._ontrack; - }, - set(f) { - if (this._ontrack) { - this.removeEventListener('track', this._ontrack); - } - this.addEventListener('track', this._ontrack = f); - }, - enumerable: true, - configurable: true - }); - const origSetRemoteDescription = window.RTCPeerConnection.prototype.setRemoteDescription; - window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription() { - if (!this._ontrackpoly) { - this._ontrackpoly = e => { - // onaddstream does not fire when a track is added to an existing - // stream. But stream.onaddtrack is implemented so we use that. - e.stream.addEventListener('addtrack', te => { - let receiver; - if (window.RTCPeerConnection.prototype.getReceivers) { - receiver = this.getReceivers().find(r => r.track && r.track.id === te.track.id); - } else { - receiver = { - track: te.track - }; - } - const event = new Event('track'); - event.track = te.track; - event.receiver = receiver; - event.transceiver = { - receiver - }; - event.streams = [e.stream]; - this.dispatchEvent(event); - }); - e.stream.getTracks().forEach(track => { - let receiver; - if (window.RTCPeerConnection.prototype.getReceivers) { - receiver = this.getReceivers().find(r => r.track && r.track.id === track.id); - } else { - receiver = { - track - }; - } - const event = new Event('track'); - event.track = track; - event.receiver = receiver; - event.transceiver = { - receiver - }; - event.streams = [e.stream]; - this.dispatchEvent(event); - }); - }; - this.addEventListener('addstream', this._ontrackpoly); - } - return origSetRemoteDescription.apply(this, arguments); - }; - } else { - // even if RTCRtpTransceiver is in window, it is only used and - // emitted in unified-plan. Unfortunately this means we need - // to unconditionally wrap the event. - wrapPeerConnectionEvent(window, 'track', e => { - if (!e.transceiver) { - Object.defineProperty(e, 'transceiver', { - value: { - receiver: e.receiver - } - }); - } - return e; - }); - } -} -function shimGetSendersWithDtmf(window) { - // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack. - if (typeof window === 'object' && window.RTCPeerConnection && !('getSenders' in window.RTCPeerConnection.prototype) && 'createDTMFSender' in window.RTCPeerConnection.prototype) { - const shimSenderWithDtmf = function (pc, track) { - return { - track, - get dtmf() { - if (this._dtmf === undefined) { - if (track.kind === 'audio') { - this._dtmf = pc.createDTMFSender(track); - } else { - this._dtmf = null; - } - } - return this._dtmf; - }, - _pc: pc - }; - }; - - // augment addTrack when getSenders is not available. - if (!window.RTCPeerConnection.prototype.getSenders) { - window.RTCPeerConnection.prototype.getSenders = function getSenders() { - this._senders = this._senders || []; - return this._senders.slice(); // return a copy of the internal state. - }; - - const origAddTrack = window.RTCPeerConnection.prototype.addTrack; - window.RTCPeerConnection.prototype.addTrack = function addTrack(track, stream) { - let sender = origAddTrack.apply(this, arguments); - if (!sender) { - sender = shimSenderWithDtmf(this, track); - this._senders.push(sender); - } - return sender; - }; - const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack; - window.RTCPeerConnection.prototype.removeTrack = function removeTrack(sender) { - origRemoveTrack.apply(this, arguments); - const idx = this._senders.indexOf(sender); - if (idx !== -1) { - this._senders.splice(idx, 1); - } - }; - } - const origAddStream = window.RTCPeerConnection.prototype.addStream; - window.RTCPeerConnection.prototype.addStream = function addStream(stream) { - this._senders = this._senders || []; - origAddStream.apply(this, [stream]); - stream.getTracks().forEach(track => { - this._senders.push(shimSenderWithDtmf(this, track)); - }); - }; - const origRemoveStream = window.RTCPeerConnection.prototype.removeStream; - window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) { - this._senders = this._senders || []; - origRemoveStream.apply(this, [stream]); - stream.getTracks().forEach(track => { - const sender = this._senders.find(s => s.track === track); - if (sender) { - // remove sender - this._senders.splice(this._senders.indexOf(sender), 1); - } - }); - }; - } else if (typeof window === 'object' && window.RTCPeerConnection && 'getSenders' in window.RTCPeerConnection.prototype && 'createDTMFSender' in window.RTCPeerConnection.prototype && window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) { - const origGetSenders = window.RTCPeerConnection.prototype.getSenders; - window.RTCPeerConnection.prototype.getSenders = function getSenders() { - const senders = origGetSenders.apply(this, []); - senders.forEach(sender => sender._pc = this); - return senders; - }; - Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', { - get() { - if (this._dtmf === undefined) { - if (this.track.kind === 'audio') { - this._dtmf = this._pc.createDTMFSender(this.track); - } else { - this._dtmf = null; - } - } - return this._dtmf; - } - }); - } -} -function shimGetStats(window) { - if (!window.RTCPeerConnection) { - return; - } - const origGetStats = window.RTCPeerConnection.prototype.getStats; - window.RTCPeerConnection.prototype.getStats = function getStats() { - const [selector, onSucc, onErr] = arguments; - - // If selector is a function then we are in the old style stats so just - // pass back the original getStats format to avoid breaking old users. - if (arguments.length > 0 && typeof selector === 'function') { - return origGetStats.apply(this, arguments); - } - - // When spec-style getStats is supported, return those when called with - // either no arguments or the selector argument is null. - if (origGetStats.length === 0 && (arguments.length === 0 || typeof selector !== 'function')) { - return origGetStats.apply(this, []); - } - const fixChromeStats_ = function (response) { - const standardReport = {}; - const reports = response.result(); - reports.forEach(report => { - const standardStats = { - id: report.id, - timestamp: report.timestamp, - type: { - localcandidate: 'local-candidate', - remotecandidate: 'remote-candidate' - }[report.type] || report.type - }; - report.names().forEach(name => { - standardStats[name] = report.stat(name); - }); - standardReport[standardStats.id] = standardStats; - }); - return standardReport; - }; - - // shim getStats with maplike support - const makeMapStats = function (stats) { - return new Map(Object.keys(stats).map(key => [key, stats[key]])); - }; - if (arguments.length >= 2) { - const successCallbackWrapper_ = function (response) { - onSucc(makeMapStats(fixChromeStats_(response))); - }; - return origGetStats.apply(this, [successCallbackWrapper_, selector]); - } - - // promise-support - return new Promise((resolve, reject) => { - origGetStats.apply(this, [function (response) { - resolve(makeMapStats(fixChromeStats_(response))); - }, reject]); - }).then(onSucc, onErr); - }; -} -function shimSenderReceiverGetStats(window) { - if (!(typeof window === 'object' && window.RTCPeerConnection && window.RTCRtpSender && window.RTCRtpReceiver)) { - return; - } - - // shim sender stats. - if (!('getStats' in window.RTCRtpSender.prototype)) { - const origGetSenders = window.RTCPeerConnection.prototype.getSenders; - if (origGetSenders) { - window.RTCPeerConnection.prototype.getSenders = function getSenders() { - const senders = origGetSenders.apply(this, []); - senders.forEach(sender => sender._pc = this); - return senders; - }; - } - const origAddTrack = window.RTCPeerConnection.prototype.addTrack; - if (origAddTrack) { - window.RTCPeerConnection.prototype.addTrack = function addTrack() { - const sender = origAddTrack.apply(this, arguments); - sender._pc = this; - return sender; - }; - } - window.RTCRtpSender.prototype.getStats = function getStats() { - const sender = this; - return this._pc.getStats().then(result => - /* Note: this will include stats of all senders that - * send a track with the same id as sender.track as - * it is not possible to identify the RTCRtpSender. - */ - filterStats(result, sender.track, true)); - }; - } - - // shim receiver stats. - if (!('getStats' in window.RTCRtpReceiver.prototype)) { - const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers; - if (origGetReceivers) { - window.RTCPeerConnection.prototype.getReceivers = function getReceivers() { - const receivers = origGetReceivers.apply(this, []); - receivers.forEach(receiver => receiver._pc = this); - return receivers; - }; - } - wrapPeerConnectionEvent(window, 'track', e => { - e.receiver._pc = e.srcElement; - return e; - }); - window.RTCRtpReceiver.prototype.getStats = function getStats() { - const receiver = this; - return this._pc.getStats().then(result => filterStats(result, receiver.track, false)); - }; - } - if (!('getStats' in window.RTCRtpSender.prototype && 'getStats' in window.RTCRtpReceiver.prototype)) { - return; - } - - // shim RTCPeerConnection.getStats(track). - const origGetStats = window.RTCPeerConnection.prototype.getStats; - window.RTCPeerConnection.prototype.getStats = function getStats() { - if (arguments.length > 0 && arguments[0] instanceof window.MediaStreamTrack) { - const track = arguments[0]; - let sender; - let receiver; - let err; - this.getSenders().forEach(s => { - if (s.track === track) { - if (sender) { - err = true; - } else { - sender = s; - } - } - }); - this.getReceivers().forEach(r => { - if (r.track === track) { - if (receiver) { - err = true; - } else { - receiver = r; - } - } - return r.track === track; - }); - if (err || sender && receiver) { - return Promise.reject(new DOMException('There are more than one sender or receiver for the track.', 'InvalidAccessError')); - } else if (sender) { - return sender.getStats(); - } else if (receiver) { - return receiver.getStats(); - } - return Promise.reject(new DOMException('There is no sender or receiver for the track.', 'InvalidAccessError')); - } - return origGetStats.apply(this, arguments); - }; -} -function shimAddTrackRemoveTrackWithNative(window) { - // shim addTrack/removeTrack with native variants in order to make - // the interactions with legacy getLocalStreams behave as in other browsers. - // Keeps a mapping stream.id => [stream, rtpsenders...] - window.RTCPeerConnection.prototype.getLocalStreams = function getLocalStreams() { - this._shimmedLocalStreams = this._shimmedLocalStreams || {}; - return Object.keys(this._shimmedLocalStreams).map(streamId => this._shimmedLocalStreams[streamId][0]); - }; - const origAddTrack = window.RTCPeerConnection.prototype.addTrack; - window.RTCPeerConnection.prototype.addTrack = function addTrack(track, stream) { - if (!stream) { - return origAddTrack.apply(this, arguments); - } - this._shimmedLocalStreams = this._shimmedLocalStreams || {}; - const sender = origAddTrack.apply(this, arguments); - if (!this._shimmedLocalStreams[stream.id]) { - this._shimmedLocalStreams[stream.id] = [stream, sender]; - } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) { - this._shimmedLocalStreams[stream.id].push(sender); - } - return sender; - }; - const origAddStream = window.RTCPeerConnection.prototype.addStream; - window.RTCPeerConnection.prototype.addStream = function addStream(stream) { - this._shimmedLocalStreams = this._shimmedLocalStreams || {}; - stream.getTracks().forEach(track => { - const alreadyExists = this.getSenders().find(s => s.track === track); - if (alreadyExists) { - throw new DOMException('Track already exists.', 'InvalidAccessError'); - } - }); - const existingSenders = this.getSenders(); - origAddStream.apply(this, arguments); - const newSenders = this.getSenders().filter(newSender => existingSenders.indexOf(newSender) === -1); - this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders); - }; - const origRemoveStream = window.RTCPeerConnection.prototype.removeStream; - window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) { - this._shimmedLocalStreams = this._shimmedLocalStreams || {}; - delete this._shimmedLocalStreams[stream.id]; - return origRemoveStream.apply(this, arguments); - }; - const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack; - window.RTCPeerConnection.prototype.removeTrack = function removeTrack(sender) { - this._shimmedLocalStreams = this._shimmedLocalStreams || {}; - if (sender) { - Object.keys(this._shimmedLocalStreams).forEach(streamId => { - const idx = this._shimmedLocalStreams[streamId].indexOf(sender); - if (idx !== -1) { - this._shimmedLocalStreams[streamId].splice(idx, 1); - } - if (this._shimmedLocalStreams[streamId].length === 1) { - delete this._shimmedLocalStreams[streamId]; - } - }); - } - return origRemoveTrack.apply(this, arguments); - }; -} -function shimAddTrackRemoveTrack(window, browserDetails) { - if (!window.RTCPeerConnection) { - return; - } - // shim addTrack and removeTrack. - if (window.RTCPeerConnection.prototype.addTrack && browserDetails.version >= 65) { - return shimAddTrackRemoveTrackWithNative(window); - } - - // also shim pc.getLocalStreams when addTrack is shimmed - // to return the original streams. - const origGetLocalStreams = window.RTCPeerConnection.prototype.getLocalStreams; - window.RTCPeerConnection.prototype.getLocalStreams = function getLocalStreams() { - const nativeStreams = origGetLocalStreams.apply(this); - this._reverseStreams = this._reverseStreams || {}; - return nativeStreams.map(stream => this._reverseStreams[stream.id]); - }; - const origAddStream = window.RTCPeerConnection.prototype.addStream; - window.RTCPeerConnection.prototype.addStream = function addStream(stream) { - this._streams = this._streams || {}; - this._reverseStreams = this._reverseStreams || {}; - stream.getTracks().forEach(track => { - const alreadyExists = this.getSenders().find(s => s.track === track); - if (alreadyExists) { - throw new DOMException('Track already exists.', 'InvalidAccessError'); - } - }); - // Add identity mapping for consistency with addTrack. - // Unless this is being used with a stream from addTrack. - if (!this._reverseStreams[stream.id]) { - const newStream = new window.MediaStream(stream.getTracks()); - this._streams[stream.id] = newStream; - this._reverseStreams[newStream.id] = stream; - stream = newStream; - } - origAddStream.apply(this, [stream]); - }; - const origRemoveStream = window.RTCPeerConnection.prototype.removeStream; - window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) { - this._streams = this._streams || {}; - this._reverseStreams = this._reverseStreams || {}; - origRemoveStream.apply(this, [this._streams[stream.id] || stream]); - delete this._reverseStreams[this._streams[stream.id] ? this._streams[stream.id].id : stream.id]; - delete this._streams[stream.id]; - }; - window.RTCPeerConnection.prototype.addTrack = function addTrack(track, stream) { - if (this.signalingState === 'closed') { - throw new DOMException('The RTCPeerConnection\'s signalingState is \'closed\'.', 'InvalidStateError'); - } - const streams = [].slice.call(arguments, 1); - if (streams.length !== 1 || !streams[0].getTracks().find(t => t === track)) { - // this is not fully correct but all we can manage without - // [[associated MediaStreams]] internal slot. - throw new DOMException('The adapter.js addTrack polyfill only supports a single ' + ' stream which is associated with the specified track.', 'NotSupportedError'); - } - const alreadyExists = this.getSenders().find(s => s.track === track); - if (alreadyExists) { - throw new DOMException('Track already exists.', 'InvalidAccessError'); - } - this._streams = this._streams || {}; - this._reverseStreams = this._reverseStreams || {}; - const oldStream = this._streams[stream.id]; - if (oldStream) { - // this is using odd Chrome behaviour, use with caution: - // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815 - // Note: we rely on the high-level addTrack/dtmf shim to - // create the sender with a dtmf sender. - oldStream.addTrack(track); - - // Trigger ONN async. - Promise.resolve().then(() => { - this.dispatchEvent(new Event('negotiationneeded')); - }); - } else { - const newStream = new window.MediaStream([track]); - this._streams[stream.id] = newStream; - this._reverseStreams[newStream.id] = stream; - this.addStream(newStream); - } - return this.getSenders().find(s => s.track === track); - }; - - // replace the internal stream id with the external one and - // vice versa. - function replaceInternalStreamId(pc, description) { - let sdp = description.sdp; - Object.keys(pc._reverseStreams || []).forEach(internalId => { - const externalStream = pc._reverseStreams[internalId]; - const internalStream = pc._streams[externalStream.id]; - sdp = sdp.replace(new RegExp(internalStream.id, 'g'), externalStream.id); - }); - return new RTCSessionDescription({ - type: description.type, - sdp - }); - } - function replaceExternalStreamId(pc, description) { - let sdp = description.sdp; - Object.keys(pc._reverseStreams || []).forEach(internalId => { - const externalStream = pc._reverseStreams[internalId]; - const internalStream = pc._streams[externalStream.id]; - sdp = sdp.replace(new RegExp(externalStream.id, 'g'), internalStream.id); - }); - return new RTCSessionDescription({ - type: description.type, - sdp - }); - } - ['createOffer', 'createAnswer'].forEach(function (method) { - const nativeMethod = window.RTCPeerConnection.prototype[method]; - const methodObj = { - [method]() { - const args = arguments; - const isLegacyCall = arguments.length && typeof arguments[0] === 'function'; - if (isLegacyCall) { - return nativeMethod.apply(this, [description => { - const desc = replaceInternalStreamId(this, description); - args[0].apply(null, [desc]); - }, err => { - if (args[1]) { - args[1].apply(null, err); - } - }, arguments[2]]); - } - return nativeMethod.apply(this, arguments).then(description => replaceInternalStreamId(this, description)); - } - }; - window.RTCPeerConnection.prototype[method] = methodObj[method]; - }); - const origSetLocalDescription = window.RTCPeerConnection.prototype.setLocalDescription; - window.RTCPeerConnection.prototype.setLocalDescription = function setLocalDescription() { - if (!arguments.length || !arguments[0].type) { - return origSetLocalDescription.apply(this, arguments); - } - arguments[0] = replaceExternalStreamId(this, arguments[0]); - return origSetLocalDescription.apply(this, arguments); - }; - - // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier - - const origLocalDescription = Object.getOwnPropertyDescriptor(window.RTCPeerConnection.prototype, 'localDescription'); - Object.defineProperty(window.RTCPeerConnection.prototype, 'localDescription', { - get() { - const description = origLocalDescription.get.apply(this); - if (description.type === '') { - return description; - } - return replaceInternalStreamId(this, description); - } - }); - window.RTCPeerConnection.prototype.removeTrack = function removeTrack(sender) { - if (this.signalingState === 'closed') { - throw new DOMException('The RTCPeerConnection\'s signalingState is \'closed\'.', 'InvalidStateError'); - } - // We can not yet check for sender instanceof RTCRtpSender - // since we shim RTPSender. So we check if sender._pc is set. - if (!sender._pc) { - throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' + 'does not implement interface RTCRtpSender.', 'TypeError'); - } - const isLocal = sender._pc === this; - if (!isLocal) { - throw new DOMException('Sender was not created by this connection.', 'InvalidAccessError'); - } - - // Search for the native stream the senders track belongs to. - this._streams = this._streams || {}; - let stream; - Object.keys(this._streams).forEach(streamid => { - const hasTrack = this._streams[streamid].getTracks().find(track => sender.track === track); - if (hasTrack) { - stream = this._streams[streamid]; - } - }); - if (stream) { - if (stream.getTracks().length === 1) { - // if this is the last track of the stream, remove the stream. This - // takes care of any shimmed _senders. - this.removeStream(this._reverseStreams[stream.id]); - } else { - // relying on the same odd chrome behaviour as above. - stream.removeTrack(sender.track); - } - this.dispatchEvent(new Event('negotiationneeded')); - } - }; -} -function shimPeerConnection$1(window, browserDetails) { - if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) { - // very basic support for old versions. - window.RTCPeerConnection = window.webkitRTCPeerConnection; - } - if (!window.RTCPeerConnection) { - return; - } - - // shim implicit creation of RTCSessionDescription/RTCIceCandidate - if (browserDetails.version < 53) { - ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'].forEach(function (method) { - const nativeMethod = window.RTCPeerConnection.prototype[method]; - const methodObj = { - [method]() { - arguments[0] = new (method === 'addIceCandidate' ? window.RTCIceCandidate : window.RTCSessionDescription)(arguments[0]); - return nativeMethod.apply(this, arguments); - } - }; - window.RTCPeerConnection.prototype[method] = methodObj[method]; - }); - } -} - -// Attempt to fix ONN in plan-b mode. -function fixNegotiationNeeded(window, browserDetails) { - wrapPeerConnectionEvent(window, 'negotiationneeded', e => { - const pc = e.target; - if (browserDetails.version < 72 || pc.getConfiguration && pc.getConfiguration().sdpSemantics === 'plan-b') { - if (pc.signalingState !== 'stable') { - return; - } - } - return e; - }); -} - -var chromeShim = /*#__PURE__*/Object.freeze({ - __proto__: null, - fixNegotiationNeeded: fixNegotiationNeeded, - shimAddTrackRemoveTrack: shimAddTrackRemoveTrack, - shimAddTrackRemoveTrackWithNative: shimAddTrackRemoveTrackWithNative, - shimGetDisplayMedia: shimGetDisplayMedia$1, - shimGetSendersWithDtmf: shimGetSendersWithDtmf, - shimGetStats: shimGetStats, - shimGetUserMedia: shimGetUserMedia$2, - shimMediaStream: shimMediaStream, - shimOnTrack: shimOnTrack$1, - shimPeerConnection: shimPeerConnection$1, - shimSenderReceiverGetStats: shimSenderReceiverGetStats -}); - -/* - * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. - */ -/* eslint-env node */ -function shimGetUserMedia$1(window, browserDetails) { - const navigator = window && window.navigator; - const MediaStreamTrack = window && window.MediaStreamTrack; - navigator.getUserMedia = function (constraints, onSuccess, onError) { - // Replace Firefox 44+'s deprecation warning with unprefixed version. - deprecated('navigator.getUserMedia', 'navigator.mediaDevices.getUserMedia'); - navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError); - }; - if (!(browserDetails.version > 55 && 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) { - const remap = function (obj, a, b) { - if (a in obj && !(b in obj)) { - obj[b] = obj[a]; - delete obj[a]; - } - }; - const nativeGetUserMedia = navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices); - navigator.mediaDevices.getUserMedia = function (c) { - if (typeof c === 'object' && typeof c.audio === 'object') { - c = JSON.parse(JSON.stringify(c)); - remap(c.audio, 'autoGainControl', 'mozAutoGainControl'); - remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression'); - } - return nativeGetUserMedia(c); - }; - if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) { - const nativeGetSettings = MediaStreamTrack.prototype.getSettings; - MediaStreamTrack.prototype.getSettings = function () { - const obj = nativeGetSettings.apply(this, arguments); - remap(obj, 'mozAutoGainControl', 'autoGainControl'); - remap(obj, 'mozNoiseSuppression', 'noiseSuppression'); - return obj; - }; - } - if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) { - const nativeApplyConstraints = MediaStreamTrack.prototype.applyConstraints; - MediaStreamTrack.prototype.applyConstraints = function (c) { - if (this.kind === 'audio' && typeof c === 'object') { - c = JSON.parse(JSON.stringify(c)); - remap(c, 'autoGainControl', 'mozAutoGainControl'); - remap(c, 'noiseSuppression', 'mozNoiseSuppression'); - } - return nativeApplyConstraints.apply(this, [c]); - }; - } - } -} - -/* - * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. - */ -/* eslint-env node */ - -function shimGetDisplayMedia(window, preferredMediaSource) { - if (window.navigator.mediaDevices && 'getDisplayMedia' in window.navigator.mediaDevices) { - return; - } - if (!window.navigator.mediaDevices) { - return; - } - window.navigator.mediaDevices.getDisplayMedia = function getDisplayMedia(constraints) { - if (!(constraints && constraints.video)) { - const err = new DOMException('getDisplayMedia without video ' + 'constraints is undefined'); - err.name = 'NotFoundError'; - // from https://heycam.github.io/webidl/#idl-DOMException-error-names - err.code = 8; - return Promise.reject(err); - } - if (constraints.video === true) { - constraints.video = { - mediaSource: preferredMediaSource - }; - } else { - constraints.video.mediaSource = preferredMediaSource; - } - return window.navigator.mediaDevices.getUserMedia(constraints); - }; -} - -/* - * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. - */ -/* eslint-env node */ -function shimOnTrack(window) { - if (typeof window === 'object' && window.RTCTrackEvent && 'receiver' in window.RTCTrackEvent.prototype && !('transceiver' in window.RTCTrackEvent.prototype)) { - Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', { - get() { - return { - receiver: this.receiver - }; - } - }); - } -} -function shimPeerConnection(window, browserDetails) { - if (typeof window !== 'object' || !(window.RTCPeerConnection || window.mozRTCPeerConnection)) { - return; // probably media.peerconnection.enabled=false in about:config - } - - if (!window.RTCPeerConnection && window.mozRTCPeerConnection) { - // very basic support for old versions. - window.RTCPeerConnection = window.mozRTCPeerConnection; - } - if (browserDetails.version < 53) { - // shim away need for obsolete RTCIceCandidate/RTCSessionDescription. - ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'].forEach(function (method) { - const nativeMethod = window.RTCPeerConnection.prototype[method]; - const methodObj = { - [method]() { - arguments[0] = new (method === 'addIceCandidate' ? window.RTCIceCandidate : window.RTCSessionDescription)(arguments[0]); - return nativeMethod.apply(this, arguments); - } - }; - window.RTCPeerConnection.prototype[method] = methodObj[method]; - }); - } - const modernStatsTypes = { - inboundrtp: 'inbound-rtp', - outboundrtp: 'outbound-rtp', - candidatepair: 'candidate-pair', - localcandidate: 'local-candidate', - remotecandidate: 'remote-candidate' - }; - const nativeGetStats = window.RTCPeerConnection.prototype.getStats; - window.RTCPeerConnection.prototype.getStats = function getStats() { - const [selector, onSucc, onErr] = arguments; - return nativeGetStats.apply(this, [selector || null]).then(stats => { - if (browserDetails.version < 53 && !onSucc) { - // Shim only promise getStats with spec-hyphens in type names - // Leave callback version alone; misc old uses of forEach before Map - try { - stats.forEach(stat => { - stat.type = modernStatsTypes[stat.type] || stat.type; - }); - } catch (e) { - if (e.name !== 'TypeError') { - throw e; - } - // Avoid TypeError: "type" is read-only, in old versions. 34-43ish - stats.forEach((stat, i) => { - stats.set(i, Object.assign({}, stat, { - type: modernStatsTypes[stat.type] || stat.type - })); - }); - } - } - return stats; - }).then(onSucc, onErr); - }; -} -function shimSenderGetStats(window) { - if (!(typeof window === 'object' && window.RTCPeerConnection && window.RTCRtpSender)) { - return; - } - if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) { - return; - } - const origGetSenders = window.RTCPeerConnection.prototype.getSenders; - if (origGetSenders) { - window.RTCPeerConnection.prototype.getSenders = function getSenders() { - const senders = origGetSenders.apply(this, []); - senders.forEach(sender => sender._pc = this); - return senders; - }; - } - const origAddTrack = window.RTCPeerConnection.prototype.addTrack; - if (origAddTrack) { - window.RTCPeerConnection.prototype.addTrack = function addTrack() { - const sender = origAddTrack.apply(this, arguments); - sender._pc = this; - return sender; - }; - } - window.RTCRtpSender.prototype.getStats = function getStats() { - return this.track ? this._pc.getStats(this.track) : Promise.resolve(new Map()); - }; -} -function shimReceiverGetStats(window) { - if (!(typeof window === 'object' && window.RTCPeerConnection && window.RTCRtpSender)) { - return; - } - if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) { - return; - } - const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers; - if (origGetReceivers) { - window.RTCPeerConnection.prototype.getReceivers = function getReceivers() { - const receivers = origGetReceivers.apply(this, []); - receivers.forEach(receiver => receiver._pc = this); - return receivers; - }; - } - wrapPeerConnectionEvent(window, 'track', e => { - e.receiver._pc = e.srcElement; - return e; - }); - window.RTCRtpReceiver.prototype.getStats = function getStats() { - return this._pc.getStats(this.track); - }; -} -function shimRemoveStream(window) { - if (!window.RTCPeerConnection || 'removeStream' in window.RTCPeerConnection.prototype) { - return; - } - window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) { - deprecated('removeStream', 'removeTrack'); - this.getSenders().forEach(sender => { - if (sender.track && stream.getTracks().includes(sender.track)) { - this.removeTrack(sender); - } - }); - }; -} -function shimRTCDataChannel(window) { - // rename DataChannel to RTCDataChannel (native fix in FF60): - // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851 - if (window.DataChannel && !window.RTCDataChannel) { - window.RTCDataChannel = window.DataChannel; - } -} -function shimAddTransceiver(window) { - // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647 - // Firefox ignores the init sendEncodings options passed to addTransceiver - // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918 - if (!(typeof window === 'object' && window.RTCPeerConnection)) { - return; - } - const origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver; - if (origAddTransceiver) { - window.RTCPeerConnection.prototype.addTransceiver = function addTransceiver() { - this.setParametersPromises = []; - // WebIDL input coercion and validation - let sendEncodings = arguments[1] && arguments[1].sendEncodings; - if (sendEncodings === undefined) { - sendEncodings = []; - } - sendEncodings = [...sendEncodings]; - const shouldPerformCheck = sendEncodings.length > 0; - if (shouldPerformCheck) { - // If sendEncodings params are provided, validate grammar - sendEncodings.forEach(encodingParam => { - if ('rid' in encodingParam) { - const ridRegex = /^[a-z0-9]{0,16}$/i; - if (!ridRegex.test(encodingParam.rid)) { - throw new TypeError('Invalid RID value provided.'); - } - } - if ('scaleResolutionDownBy' in encodingParam) { - if (!(parseFloat(encodingParam.scaleResolutionDownBy) >= 1.0)) { - throw new RangeError('scale_resolution_down_by must be >= 1.0'); - } - } - if ('maxFramerate' in encodingParam) { - if (!(parseFloat(encodingParam.maxFramerate) >= 0)) { - throw new RangeError('max_framerate must be >= 0.0'); - } - } - }); - } - const transceiver = origAddTransceiver.apply(this, arguments); - if (shouldPerformCheck) { - // Check if the init options were applied. If not we do this in an - // asynchronous way and save the promise reference in a global object. - // This is an ugly hack, but at the same time is way more robust than - // checking the sender parameters before and after the createOffer - // Also note that after the createoffer we are not 100% sure that - // the params were asynchronously applied so we might miss the - // opportunity to recreate offer. - const { - sender - } = transceiver; - const params = sender.getParameters(); - if (!('encodings' in params) || - // Avoid being fooled by patched getParameters() below. - params.encodings.length === 1 && Object.keys(params.encodings[0]).length === 0) { - params.encodings = sendEncodings; - sender.sendEncodings = sendEncodings; - this.setParametersPromises.push(sender.setParameters(params).then(() => { - delete sender.sendEncodings; - }).catch(() => { - delete sender.sendEncodings; - })); - } - } - return transceiver; - }; - } -} -function shimGetParameters(window) { - if (!(typeof window === 'object' && window.RTCRtpSender)) { - return; - } - const origGetParameters = window.RTCRtpSender.prototype.getParameters; - if (origGetParameters) { - window.RTCRtpSender.prototype.getParameters = function getParameters() { - const params = origGetParameters.apply(this, arguments); - if (!('encodings' in params)) { - params.encodings = [].concat(this.sendEncodings || [{}]); - } - return params; - }; - } -} -function shimCreateOffer(window) { - // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647 - // Firefox ignores the init sendEncodings options passed to addTransceiver - // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918 - if (!(typeof window === 'object' && window.RTCPeerConnection)) { - return; - } - const origCreateOffer = window.RTCPeerConnection.prototype.createOffer; - window.RTCPeerConnection.prototype.createOffer = function createOffer() { - if (this.setParametersPromises && this.setParametersPromises.length) { - return Promise.all(this.setParametersPromises).then(() => { - return origCreateOffer.apply(this, arguments); - }).finally(() => { - this.setParametersPromises = []; - }); - } - return origCreateOffer.apply(this, arguments); - }; -} -function shimCreateAnswer(window) { - // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647 - // Firefox ignores the init sendEncodings options passed to addTransceiver - // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918 - if (!(typeof window === 'object' && window.RTCPeerConnection)) { - return; - } - const origCreateAnswer = window.RTCPeerConnection.prototype.createAnswer; - window.RTCPeerConnection.prototype.createAnswer = function createAnswer() { - if (this.setParametersPromises && this.setParametersPromises.length) { - return Promise.all(this.setParametersPromises).then(() => { - return origCreateAnswer.apply(this, arguments); - }).finally(() => { - this.setParametersPromises = []; - }); - } - return origCreateAnswer.apply(this, arguments); - }; -} - -var firefoxShim = /*#__PURE__*/Object.freeze({ - __proto__: null, - shimAddTransceiver: shimAddTransceiver, - shimCreateAnswer: shimCreateAnswer, - shimCreateOffer: shimCreateOffer, - shimGetDisplayMedia: shimGetDisplayMedia, - shimGetParameters: shimGetParameters, - shimGetUserMedia: shimGetUserMedia$1, - shimOnTrack: shimOnTrack, - shimPeerConnection: shimPeerConnection, - shimRTCDataChannel: shimRTCDataChannel, - shimReceiverGetStats: shimReceiverGetStats, - shimRemoveStream: shimRemoveStream, - shimSenderGetStats: shimSenderGetStats -}); - -/* - * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. - */ -function shimLocalStreamsAPI(window) { - if (typeof window !== 'object' || !window.RTCPeerConnection) { - return; - } - if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) { - window.RTCPeerConnection.prototype.getLocalStreams = function getLocalStreams() { - if (!this._localStreams) { - this._localStreams = []; - } - return this._localStreams; - }; - } - if (!('addStream' in window.RTCPeerConnection.prototype)) { - const _addTrack = window.RTCPeerConnection.prototype.addTrack; - window.RTCPeerConnection.prototype.addStream = function addStream(stream) { - if (!this._localStreams) { - this._localStreams = []; - } - if (!this._localStreams.includes(stream)) { - this._localStreams.push(stream); - } - // Try to emulate Chrome's behaviour of adding in audio-video order. - // Safari orders by track id. - stream.getAudioTracks().forEach(track => _addTrack.call(this, track, stream)); - stream.getVideoTracks().forEach(track => _addTrack.call(this, track, stream)); - }; - window.RTCPeerConnection.prototype.addTrack = function addTrack(track) { - for (var _len = arguments.length, streams = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - streams[_key - 1] = arguments[_key]; - } - if (streams) { - streams.forEach(stream => { - if (!this._localStreams) { - this._localStreams = [stream]; - } else if (!this._localStreams.includes(stream)) { - this._localStreams.push(stream); - } - }); - } - return _addTrack.apply(this, arguments); - }; - } - if (!('removeStream' in window.RTCPeerConnection.prototype)) { - window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) { - if (!this._localStreams) { - this._localStreams = []; - } - const index = this._localStreams.indexOf(stream); - if (index === -1) { - return; - } - this._localStreams.splice(index, 1); - const tracks = stream.getTracks(); - this.getSenders().forEach(sender => { - if (tracks.includes(sender.track)) { - this.removeTrack(sender); - } - }); - }; - } -} -function shimRemoteStreamsAPI(window) { - if (typeof window !== 'object' || !window.RTCPeerConnection) { - return; - } - if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) { - window.RTCPeerConnection.prototype.getRemoteStreams = function getRemoteStreams() { - return this._remoteStreams ? this._remoteStreams : []; - }; - } - if (!('onaddstream' in window.RTCPeerConnection.prototype)) { - Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', { - get() { - return this._onaddstream; - }, - set(f) { - if (this._onaddstream) { - this.removeEventListener('addstream', this._onaddstream); - this.removeEventListener('track', this._onaddstreampoly); - } - this.addEventListener('addstream', this._onaddstream = f); - this.addEventListener('track', this._onaddstreampoly = e => { - e.streams.forEach(stream => { - if (!this._remoteStreams) { - this._remoteStreams = []; - } - if (this._remoteStreams.includes(stream)) { - return; - } - this._remoteStreams.push(stream); - const event = new Event('addstream'); - event.stream = stream; - this.dispatchEvent(event); - }); - }); - } - }); - const origSetRemoteDescription = window.RTCPeerConnection.prototype.setRemoteDescription; - window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription() { - const pc = this; - if (!this._onaddstreampoly) { - this.addEventListener('track', this._onaddstreampoly = function (e) { - e.streams.forEach(stream => { - if (!pc._remoteStreams) { - pc._remoteStreams = []; - } - if (pc._remoteStreams.indexOf(stream) >= 0) { - return; - } - pc._remoteStreams.push(stream); - const event = new Event('addstream'); - event.stream = stream; - pc.dispatchEvent(event); - }); - }); - } - return origSetRemoteDescription.apply(pc, arguments); - }; - } -} -function shimCallbacksAPI(window) { - if (typeof window !== 'object' || !window.RTCPeerConnection) { - return; - } - const prototype = window.RTCPeerConnection.prototype; - const origCreateOffer = prototype.createOffer; - const origCreateAnswer = prototype.createAnswer; - const setLocalDescription = prototype.setLocalDescription; - const setRemoteDescription = prototype.setRemoteDescription; - const addIceCandidate = prototype.addIceCandidate; - prototype.createOffer = function createOffer(successCallback, failureCallback) { - const options = arguments.length >= 2 ? arguments[2] : arguments[0]; - const promise = origCreateOffer.apply(this, [options]); - if (!failureCallback) { - return promise; - } - promise.then(successCallback, failureCallback); - return Promise.resolve(); - }; - prototype.createAnswer = function createAnswer(successCallback, failureCallback) { - const options = arguments.length >= 2 ? arguments[2] : arguments[0]; - const promise = origCreateAnswer.apply(this, [options]); - if (!failureCallback) { - return promise; - } - promise.then(successCallback, failureCallback); - return Promise.resolve(); - }; - let withCallback = function (description, successCallback, failureCallback) { - const promise = setLocalDescription.apply(this, [description]); - if (!failureCallback) { - return promise; - } - promise.then(successCallback, failureCallback); - return Promise.resolve(); - }; - prototype.setLocalDescription = withCallback; - withCallback = function (description, successCallback, failureCallback) { - const promise = setRemoteDescription.apply(this, [description]); - if (!failureCallback) { - return promise; - } - promise.then(successCallback, failureCallback); - return Promise.resolve(); - }; - prototype.setRemoteDescription = withCallback; - withCallback = function (candidate, successCallback, failureCallback) { - const promise = addIceCandidate.apply(this, [candidate]); - if (!failureCallback) { - return promise; - } - promise.then(successCallback, failureCallback); - return Promise.resolve(); - }; - prototype.addIceCandidate = withCallback; -} -function shimGetUserMedia(window) { - const navigator = window && window.navigator; - if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { - // shim not needed in Safari 12.1 - const mediaDevices = navigator.mediaDevices; - const _getUserMedia = mediaDevices.getUserMedia.bind(mediaDevices); - navigator.mediaDevices.getUserMedia = constraints => { - return _getUserMedia(shimConstraints(constraints)); - }; - } - if (!navigator.getUserMedia && navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { - navigator.getUserMedia = function getUserMedia(constraints, cb, errcb) { - navigator.mediaDevices.getUserMedia(constraints).then(cb, errcb); - }.bind(navigator); - } -} -function shimConstraints(constraints) { - if (constraints && constraints.video !== undefined) { - return Object.assign({}, constraints, { - video: compactObject(constraints.video) - }); - } - return constraints; -} -function shimRTCIceServerUrls(window) { - if (!window.RTCPeerConnection) { - return; - } - // migrate from non-spec RTCIceServer.url to RTCIceServer.urls - const OrigPeerConnection = window.RTCPeerConnection; - window.RTCPeerConnection = function RTCPeerConnection(pcConfig, pcConstraints) { - if (pcConfig && pcConfig.iceServers) { - const newIceServers = []; - for (let i = 0; i < pcConfig.iceServers.length; i++) { - let server = pcConfig.iceServers[i]; - if (server.urls === undefined && server.url) { - deprecated('RTCIceServer.url', 'RTCIceServer.urls'); - server = JSON.parse(JSON.stringify(server)); - server.urls = server.url; - delete server.url; - newIceServers.push(server); - } else { - newIceServers.push(pcConfig.iceServers[i]); - } - } - pcConfig.iceServers = newIceServers; - } - return new OrigPeerConnection(pcConfig, pcConstraints); - }; - window.RTCPeerConnection.prototype = OrigPeerConnection.prototype; - // wrap static methods. Currently just generateCertificate. - if ('generateCertificate' in OrigPeerConnection) { - Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', { - get() { - return OrigPeerConnection.generateCertificate; - } - }); - } -} -function shimTrackEventTransceiver(window) { - // Add event.transceiver member over deprecated event.receiver - if (typeof window === 'object' && window.RTCTrackEvent && 'receiver' in window.RTCTrackEvent.prototype && !('transceiver' in window.RTCTrackEvent.prototype)) { - Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', { - get() { - return { - receiver: this.receiver - }; - } - }); - } -} -function shimCreateOfferLegacy(window) { - const origCreateOffer = window.RTCPeerConnection.prototype.createOffer; - window.RTCPeerConnection.prototype.createOffer = function createOffer(offerOptions) { - if (offerOptions) { - if (typeof offerOptions.offerToReceiveAudio !== 'undefined') { - // support bit values - offerOptions.offerToReceiveAudio = !!offerOptions.offerToReceiveAudio; - } - const audioTransceiver = this.getTransceivers().find(transceiver => transceiver.receiver.track.kind === 'audio'); - if (offerOptions.offerToReceiveAudio === false && audioTransceiver) { - if (audioTransceiver.direction === 'sendrecv') { - if (audioTransceiver.setDirection) { - audioTransceiver.setDirection('sendonly'); - } else { - audioTransceiver.direction = 'sendonly'; - } - } else if (audioTransceiver.direction === 'recvonly') { - if (audioTransceiver.setDirection) { - audioTransceiver.setDirection('inactive'); - } else { - audioTransceiver.direction = 'inactive'; - } - } - } else if (offerOptions.offerToReceiveAudio === true && !audioTransceiver) { - this.addTransceiver('audio', { - direction: 'recvonly' - }); - } - if (typeof offerOptions.offerToReceiveVideo !== 'undefined') { - // support bit values - offerOptions.offerToReceiveVideo = !!offerOptions.offerToReceiveVideo; - } - const videoTransceiver = this.getTransceivers().find(transceiver => transceiver.receiver.track.kind === 'video'); - if (offerOptions.offerToReceiveVideo === false && videoTransceiver) { - if (videoTransceiver.direction === 'sendrecv') { - if (videoTransceiver.setDirection) { - videoTransceiver.setDirection('sendonly'); - } else { - videoTransceiver.direction = 'sendonly'; - } - } else if (videoTransceiver.direction === 'recvonly') { - if (videoTransceiver.setDirection) { - videoTransceiver.setDirection('inactive'); - } else { - videoTransceiver.direction = 'inactive'; - } - } - } else if (offerOptions.offerToReceiveVideo === true && !videoTransceiver) { - this.addTransceiver('video', { - direction: 'recvonly' - }); - } - } - return origCreateOffer.apply(this, arguments); - }; -} -function shimAudioContext(window) { - if (typeof window !== 'object' || window.AudioContext) { - return; - } - window.AudioContext = window.webkitAudioContext; -} - -var safariShim = /*#__PURE__*/Object.freeze({ - __proto__: null, - shimAudioContext: shimAudioContext, - shimCallbacksAPI: shimCallbacksAPI, - shimConstraints: shimConstraints, - shimCreateOfferLegacy: shimCreateOfferLegacy, - shimGetUserMedia: shimGetUserMedia, - shimLocalStreamsAPI: shimLocalStreamsAPI, - shimRTCIceServerUrls: shimRTCIceServerUrls, - shimRemoteStreamsAPI: shimRemoteStreamsAPI, - shimTrackEventTransceiver: shimTrackEventTransceiver -}); - -var sdp$1 = {exports: {}}; - -/* eslint-env node */ -(function (module) { - - // SDP helpers. - const SDPUtils = {}; - - // Generate an alphanumeric identifier for cname or mids. - // TODO: use UUIDs instead? https://gist.github.com/jed/982883 - SDPUtils.generateIdentifier = function () { - return Math.random().toString(36).substring(2, 12); - }; - - // The RTCP CNAME used by all peerconnections from the same JS. - SDPUtils.localCName = SDPUtils.generateIdentifier(); - - // Splits SDP into lines, dealing with both CRLF and LF. - SDPUtils.splitLines = function (blob) { - return blob.trim().split('\n').map(line => line.trim()); - }; - // Splits SDP into sessionpart and mediasections. Ensures CRLF. - SDPUtils.splitSections = function (blob) { - const parts = blob.split('\nm='); - return parts.map((part, index) => (index > 0 ? 'm=' + part : part).trim() + '\r\n'); - }; - - // Returns the session description. - SDPUtils.getDescription = function (blob) { - const sections = SDPUtils.splitSections(blob); - return sections && sections[0]; - }; - - // Returns the individual media sections. - SDPUtils.getMediaSections = function (blob) { - const sections = SDPUtils.splitSections(blob); - sections.shift(); - return sections; - }; - - // Returns lines that start with a certain prefix. - SDPUtils.matchPrefix = function (blob, prefix) { - return SDPUtils.splitLines(blob).filter(line => line.indexOf(prefix) === 0); - }; - - // Parses an ICE candidate line. Sample input: - // candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8 - // rport 55996" - // Input can be prefixed with a=. - SDPUtils.parseCandidate = function (line) { - let parts; - // Parse both variants. - if (line.indexOf('a=candidate:') === 0) { - parts = line.substring(12).split(' '); - } else { - parts = line.substring(10).split(' '); - } - const candidate = { - foundation: parts[0], - component: { - 1: 'rtp', - 2: 'rtcp' - }[parts[1]] || parts[1], - protocol: parts[2].toLowerCase(), - priority: parseInt(parts[3], 10), - ip: parts[4], - address: parts[4], - // address is an alias for ip. - port: parseInt(parts[5], 10), - // skip parts[6] == 'typ' - type: parts[7] - }; - for (let i = 8; i < parts.length; i += 2) { - switch (parts[i]) { - case 'raddr': - candidate.relatedAddress = parts[i + 1]; - break; - case 'rport': - candidate.relatedPort = parseInt(parts[i + 1], 10); - break; - case 'tcptype': - candidate.tcpType = parts[i + 1]; - break; - case 'ufrag': - candidate.ufrag = parts[i + 1]; // for backward compatibility. - candidate.usernameFragment = parts[i + 1]; - break; - default: - // extension handling, in particular ufrag. Don't overwrite. - if (candidate[parts[i]] === undefined) { - candidate[parts[i]] = parts[i + 1]; - } - break; - } - } - return candidate; - }; - - // Translates a candidate object into SDP candidate attribute. - // This does not include the a= prefix! - SDPUtils.writeCandidate = function (candidate) { - const sdp = []; - sdp.push(candidate.foundation); - const component = candidate.component; - if (component === 'rtp') { - sdp.push(1); - } else if (component === 'rtcp') { - sdp.push(2); - } else { - sdp.push(component); - } - sdp.push(candidate.protocol.toUpperCase()); - sdp.push(candidate.priority); - sdp.push(candidate.address || candidate.ip); - sdp.push(candidate.port); - const type = candidate.type; - sdp.push('typ'); - sdp.push(type); - if (type !== 'host' && candidate.relatedAddress && candidate.relatedPort) { - sdp.push('raddr'); - sdp.push(candidate.relatedAddress); - sdp.push('rport'); - sdp.push(candidate.relatedPort); - } - if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') { - sdp.push('tcptype'); - sdp.push(candidate.tcpType); - } - if (candidate.usernameFragment || candidate.ufrag) { - sdp.push('ufrag'); - sdp.push(candidate.usernameFragment || candidate.ufrag); - } - return 'candidate:' + sdp.join(' '); - }; - - // Parses an ice-options line, returns an array of option tags. - // Sample input: - // a=ice-options:foo bar - SDPUtils.parseIceOptions = function (line) { - return line.substring(14).split(' '); - }; - - // Parses a rtpmap line, returns RTCRtpCoddecParameters. Sample input: - // a=rtpmap:111 opus/48000/2 - SDPUtils.parseRtpMap = function (line) { - let parts = line.substring(9).split(' '); - const parsed = { - payloadType: parseInt(parts.shift(), 10) // was: id - }; - - parts = parts[0].split('/'); - parsed.name = parts[0]; - parsed.clockRate = parseInt(parts[1], 10); // was: clockrate - parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1; - // legacy alias, got renamed back to channels in ORTC. - parsed.numChannels = parsed.channels; - return parsed; - }; - - // Generates a rtpmap line from RTCRtpCodecCapability or - // RTCRtpCodecParameters. - SDPUtils.writeRtpMap = function (codec) { - let pt = codec.payloadType; - if (codec.preferredPayloadType !== undefined) { - pt = codec.preferredPayloadType; - } - const channels = codec.channels || codec.numChannels || 1; - return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate + (channels !== 1 ? '/' + channels : '') + '\r\n'; - }; - - // Parses a extmap line (headerextension from RFC 5285). Sample input: - // a=extmap:2 urn:ietf:params:rtp-hdrext:toffset - // a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset - SDPUtils.parseExtmap = function (line) { - const parts = line.substring(9).split(' '); - return { - id: parseInt(parts[0], 10), - direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv', - uri: parts[1], - attributes: parts.slice(2).join(' ') - }; - }; - - // Generates an extmap line from RTCRtpHeaderExtensionParameters or - // RTCRtpHeaderExtension. - SDPUtils.writeExtmap = function (headerExtension) { - return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) + (headerExtension.direction && headerExtension.direction !== 'sendrecv' ? '/' + headerExtension.direction : '') + ' ' + headerExtension.uri + (headerExtension.attributes ? ' ' + headerExtension.attributes : '') + '\r\n'; - }; - - // Parses a fmtp line, returns dictionary. Sample input: - // a=fmtp:96 vbr=on;cng=on - // Also deals with vbr=on; cng=on - SDPUtils.parseFmtp = function (line) { - const parsed = {}; - let kv; - const parts = line.substring(line.indexOf(' ') + 1).split(';'); - for (let j = 0; j < parts.length; j++) { - kv = parts[j].trim().split('='); - parsed[kv[0].trim()] = kv[1]; - } - return parsed; - }; - - // Generates a fmtp line from RTCRtpCodecCapability or RTCRtpCodecParameters. - SDPUtils.writeFmtp = function (codec) { - let line = ''; - let pt = codec.payloadType; - if (codec.preferredPayloadType !== undefined) { - pt = codec.preferredPayloadType; - } - if (codec.parameters && Object.keys(codec.parameters).length) { - const params = []; - Object.keys(codec.parameters).forEach(param => { - if (codec.parameters[param] !== undefined) { - params.push(param + '=' + codec.parameters[param]); - } else { - params.push(param); - } - }); - line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\r\n'; - } - return line; - }; - - // Parses a rtcp-fb line, returns RTCPRtcpFeedback object. Sample input: - // a=rtcp-fb:98 nack rpsi - SDPUtils.parseRtcpFb = function (line) { - const parts = line.substring(line.indexOf(' ') + 1).split(' '); - return { - type: parts.shift(), - parameter: parts.join(' ') - }; - }; - - // Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters. - SDPUtils.writeRtcpFb = function (codec) { - let lines = ''; - let pt = codec.payloadType; - if (codec.preferredPayloadType !== undefined) { - pt = codec.preferredPayloadType; - } - if (codec.rtcpFeedback && codec.rtcpFeedback.length) { - // FIXME: special handling for trr-int? - codec.rtcpFeedback.forEach(fb => { - lines += 'a=rtcp-fb:' + pt + ' ' + fb.type + (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') + '\r\n'; - }); - } - return lines; - }; - - // Parses a RFC 5576 ssrc media attribute. Sample input: - // a=ssrc:3735928559 cname:something - SDPUtils.parseSsrcMedia = function (line) { - const sp = line.indexOf(' '); - const parts = { - ssrc: parseInt(line.substring(7, sp), 10) - }; - const colon = line.indexOf(':', sp); - if (colon > -1) { - parts.attribute = line.substring(sp + 1, colon); - parts.value = line.substring(colon + 1); - } else { - parts.attribute = line.substring(sp + 1); - } - return parts; - }; - - // Parse a ssrc-group line (see RFC 5576). Sample input: - // a=ssrc-group:semantics 12 34 - SDPUtils.parseSsrcGroup = function (line) { - const parts = line.substring(13).split(' '); - return { - semantics: parts.shift(), - ssrcs: parts.map(ssrc => parseInt(ssrc, 10)) - }; - }; - - // Extracts the MID (RFC 5888) from a media section. - // Returns the MID or undefined if no mid line was found. - SDPUtils.getMid = function (mediaSection) { - const mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0]; - if (mid) { - return mid.substring(6); - } - }; - - // Parses a fingerprint line for DTLS-SRTP. - SDPUtils.parseFingerprint = function (line) { - const parts = line.substring(14).split(' '); - return { - algorithm: parts[0].toLowerCase(), - // algorithm is case-sensitive in Edge. - value: parts[1].toUpperCase() // the definition is upper-case in RFC 4572. - }; - }; - - // Extracts DTLS parameters from SDP media section or sessionpart. - // FIXME: for consistency with other functions this should only - // get the fingerprint line as input. See also getIceParameters. - SDPUtils.getDtlsParameters = function (mediaSection, sessionpart) { - const lines = SDPUtils.matchPrefix(mediaSection + sessionpart, 'a=fingerprint:'); - // Note: a=setup line is ignored since we use the 'auto' role in Edge. - return { - role: 'auto', - fingerprints: lines.map(SDPUtils.parseFingerprint) - }; - }; - - // Serializes DTLS parameters to SDP. - SDPUtils.writeDtlsParameters = function (params, setupType) { - let sdp = 'a=setup:' + setupType + '\r\n'; - params.fingerprints.forEach(fp => { - sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\r\n'; - }); - return sdp; - }; - - // Parses a=crypto lines into - // https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members - SDPUtils.parseCryptoLine = function (line) { - const parts = line.substring(9).split(' '); - return { - tag: parseInt(parts[0], 10), - cryptoSuite: parts[1], - keyParams: parts[2], - sessionParams: parts.slice(3) - }; - }; - SDPUtils.writeCryptoLine = function (parameters) { - return 'a=crypto:' + parameters.tag + ' ' + parameters.cryptoSuite + ' ' + (typeof parameters.keyParams === 'object' ? SDPUtils.writeCryptoKeyParams(parameters.keyParams) : parameters.keyParams) + (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') + '\r\n'; - }; - - // Parses the crypto key parameters into - // https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam* - SDPUtils.parseCryptoKeyParams = function (keyParams) { - if (keyParams.indexOf('inline:') !== 0) { - return null; - } - const parts = keyParams.substring(7).split('|'); - return { - keyMethod: 'inline', - keySalt: parts[0], - lifeTime: parts[1], - mkiValue: parts[2] ? parts[2].split(':')[0] : undefined, - mkiLength: parts[2] ? parts[2].split(':')[1] : undefined - }; - }; - SDPUtils.writeCryptoKeyParams = function (keyParams) { - return keyParams.keyMethod + ':' + keyParams.keySalt + (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') + (keyParams.mkiValue && keyParams.mkiLength ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength : ''); - }; - - // Extracts all SDES parameters. - SDPUtils.getCryptoParameters = function (mediaSection, sessionpart) { - const lines = SDPUtils.matchPrefix(mediaSection + sessionpart, 'a=crypto:'); - return lines.map(SDPUtils.parseCryptoLine); - }; - - // Parses ICE information from SDP media section or sessionpart. - // FIXME: for consistency with other functions this should only - // get the ice-ufrag and ice-pwd lines as input. - SDPUtils.getIceParameters = function (mediaSection, sessionpart) { - const ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart, 'a=ice-ufrag:')[0]; - const pwd = SDPUtils.matchPrefix(mediaSection + sessionpart, 'a=ice-pwd:')[0]; - if (!(ufrag && pwd)) { - return null; - } - return { - usernameFragment: ufrag.substring(12), - password: pwd.substring(10) - }; - }; - - // Serializes ICE parameters to SDP. - SDPUtils.writeIceParameters = function (params) { - let sdp = 'a=ice-ufrag:' + params.usernameFragment + '\r\n' + 'a=ice-pwd:' + params.password + '\r\n'; - if (params.iceLite) { - sdp += 'a=ice-lite\r\n'; - } - return sdp; - }; - - // Parses the SDP media section and returns RTCRtpParameters. - SDPUtils.parseRtpParameters = function (mediaSection) { - const description = { - codecs: [], - headerExtensions: [], - fecMechanisms: [], - rtcp: [] - }; - const lines = SDPUtils.splitLines(mediaSection); - const mline = lines[0].split(' '); - description.profile = mline[2]; - for (let i = 3; i < mline.length; i++) { - // find all codecs from mline[3..] - const pt = mline[i]; - const rtpmapline = SDPUtils.matchPrefix(mediaSection, 'a=rtpmap:' + pt + ' ')[0]; - if (rtpmapline) { - const codec = SDPUtils.parseRtpMap(rtpmapline); - const fmtps = SDPUtils.matchPrefix(mediaSection, 'a=fmtp:' + pt + ' '); - // Only the first a=fmtp: is considered. - codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {}; - codec.rtcpFeedback = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-fb:' + pt + ' ').map(SDPUtils.parseRtcpFb); - description.codecs.push(codec); - // parse FEC mechanisms from rtpmap lines. - switch (codec.name.toUpperCase()) { - case 'RED': - case 'ULPFEC': - description.fecMechanisms.push(codec.name.toUpperCase()); - break; - } - } - } - SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(line => { - description.headerExtensions.push(SDPUtils.parseExtmap(line)); - }); - const wildcardRtcpFb = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-fb:* ').map(SDPUtils.parseRtcpFb); - description.codecs.forEach(codec => { - wildcardRtcpFb.forEach(fb => { - const duplicate = codec.rtcpFeedback.find(existingFeedback => { - return existingFeedback.type === fb.type && existingFeedback.parameter === fb.parameter; - }); - if (!duplicate) { - codec.rtcpFeedback.push(fb); - } - }); - }); - // FIXME: parse rtcp. - return description; - }; - - // Generates parts of the SDP media section describing the capabilities / - // parameters. - SDPUtils.writeRtpDescription = function (kind, caps) { - let sdp = ''; - - // Build the mline. - sdp += 'm=' + kind + ' '; - sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs. - sdp += ' ' + (caps.profile || 'UDP/TLS/RTP/SAVPF') + ' '; - sdp += caps.codecs.map(codec => { - if (codec.preferredPayloadType !== undefined) { - return codec.preferredPayloadType; - } - return codec.payloadType; - }).join(' ') + '\r\n'; - sdp += 'c=IN IP4 0.0.0.0\r\n'; - sdp += 'a=rtcp:9 IN IP4 0.0.0.0\r\n'; - - // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb. - caps.codecs.forEach(codec => { - sdp += SDPUtils.writeRtpMap(codec); - sdp += SDPUtils.writeFmtp(codec); - sdp += SDPUtils.writeRtcpFb(codec); - }); - let maxptime = 0; - caps.codecs.forEach(codec => { - if (codec.maxptime > maxptime) { - maxptime = codec.maxptime; - } - }); - if (maxptime > 0) { - sdp += 'a=maxptime:' + maxptime + '\r\n'; - } - if (caps.headerExtensions) { - caps.headerExtensions.forEach(extension => { - sdp += SDPUtils.writeExtmap(extension); - }); - } - // FIXME: write fecMechanisms. - return sdp; - }; - - // Parses the SDP media section and returns an array of - // RTCRtpEncodingParameters. - SDPUtils.parseRtpEncodingParameters = function (mediaSection) { - const encodingParameters = []; - const description = SDPUtils.parseRtpParameters(mediaSection); - const hasRed = description.fecMechanisms.indexOf('RED') !== -1; - const hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1; - - // filter a=ssrc:... cname:, ignore PlanB-msid - const ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:').map(line => SDPUtils.parseSsrcMedia(line)).filter(parts => parts.attribute === 'cname'); - const primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc; - let secondarySsrc; - const flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID').map(line => { - const parts = line.substring(17).split(' '); - return parts.map(part => parseInt(part, 10)); - }); - if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) { - secondarySsrc = flows[0][1]; - } - description.codecs.forEach(codec => { - if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) { - let encParam = { - ssrc: primarySsrc, - codecPayloadType: parseInt(codec.parameters.apt, 10) - }; - if (primarySsrc && secondarySsrc) { - encParam.rtx = { - ssrc: secondarySsrc - }; - } - encodingParameters.push(encParam); - if (hasRed) { - encParam = JSON.parse(JSON.stringify(encParam)); - encParam.fec = { - ssrc: primarySsrc, - mechanism: hasUlpfec ? 'red+ulpfec' : 'red' - }; - encodingParameters.push(encParam); - } - } - }); - if (encodingParameters.length === 0 && primarySsrc) { - encodingParameters.push({ - ssrc: primarySsrc - }); - } - - // we support both b=AS and b=TIAS but interpret AS as TIAS. - let bandwidth = SDPUtils.matchPrefix(mediaSection, 'b='); - if (bandwidth.length) { - if (bandwidth[0].indexOf('b=TIAS:') === 0) { - bandwidth = parseInt(bandwidth[0].substring(7), 10); - } else if (bandwidth[0].indexOf('b=AS:') === 0) { - // use formula from JSEP to convert b=AS to TIAS value. - bandwidth = parseInt(bandwidth[0].substring(5), 10) * 1000 * 0.95 - 50 * 40 * 8; - } else { - bandwidth = undefined; - } - encodingParameters.forEach(params => { - params.maxBitrate = bandwidth; - }); - } - return encodingParameters; - }; - - // parses http://draft.ortc.org/#rtcrtcpparameters* - SDPUtils.parseRtcpParameters = function (mediaSection) { - const rtcpParameters = {}; - - // Gets the first SSRC. Note that with RTX there might be multiple - // SSRCs. - const remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:').map(line => SDPUtils.parseSsrcMedia(line)).filter(obj => obj.attribute === 'cname')[0]; - if (remoteSsrc) { - rtcpParameters.cname = remoteSsrc.value; - rtcpParameters.ssrc = remoteSsrc.ssrc; - } - - // Edge uses the compound attribute instead of reducedSize - // compound is !reducedSize - const rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize'); - rtcpParameters.reducedSize = rsize.length > 0; - rtcpParameters.compound = rsize.length === 0; - - // parses the rtcp-mux attrіbute. - // Note that Edge does not support unmuxed RTCP. - const mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux'); - rtcpParameters.mux = mux.length > 0; - return rtcpParameters; - }; - SDPUtils.writeRtcpParameters = function (rtcpParameters) { - let sdp = ''; - if (rtcpParameters.reducedSize) { - sdp += 'a=rtcp-rsize\r\n'; - } - if (rtcpParameters.mux) { - sdp += 'a=rtcp-mux\r\n'; - } - if (rtcpParameters.ssrc !== undefined && rtcpParameters.cname) { - sdp += 'a=ssrc:' + rtcpParameters.ssrc + ' cname:' + rtcpParameters.cname + '\r\n'; - } - return sdp; - }; - - // parses either a=msid: or a=ssrc:... msid lines and returns - // the id of the MediaStream and MediaStreamTrack. - SDPUtils.parseMsid = function (mediaSection) { - let parts; - const spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:'); - if (spec.length === 1) { - parts = spec[0].substring(7).split(' '); - return { - stream: parts[0], - track: parts[1] - }; - } - const planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:').map(line => SDPUtils.parseSsrcMedia(line)).filter(msidParts => msidParts.attribute === 'msid'); - if (planB.length > 0) { - parts = planB[0].value.split(' '); - return { - stream: parts[0], - track: parts[1] - }; - } - }; - - // SCTP - // parses draft-ietf-mmusic-sctp-sdp-26 first and falls back - // to draft-ietf-mmusic-sctp-sdp-05 - SDPUtils.parseSctpDescription = function (mediaSection) { - const mline = SDPUtils.parseMLine(mediaSection); - const maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:'); - let maxMessageSize; - if (maxSizeLine.length > 0) { - maxMessageSize = parseInt(maxSizeLine[0].substring(19), 10); - } - if (isNaN(maxMessageSize)) { - maxMessageSize = 65536; - } - const sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:'); - if (sctpPort.length > 0) { - return { - port: parseInt(sctpPort[0].substring(12), 10), - protocol: mline.fmt, - maxMessageSize - }; - } - const sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:'); - if (sctpMapLines.length > 0) { - const parts = sctpMapLines[0].substring(10).split(' '); - return { - port: parseInt(parts[0], 10), - protocol: parts[1], - maxMessageSize - }; - } - }; - - // SCTP - // outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers - // support by now receiving in this format, unless we originally parsed - // as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line - // protocol of DTLS/SCTP -- without UDP/ or TCP/) - SDPUtils.writeSctpDescription = function (media, sctp) { - let output = []; - if (media.protocol !== 'DTLS/SCTP') { - output = ['m=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\r\n', 'c=IN IP4 0.0.0.0\r\n', 'a=sctp-port:' + sctp.port + '\r\n']; - } else { - output = ['m=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\r\n', 'c=IN IP4 0.0.0.0\r\n', 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\r\n']; - } - if (sctp.maxMessageSize !== undefined) { - output.push('a=max-message-size:' + sctp.maxMessageSize + '\r\n'); - } - return output.join(''); - }; - - // Generate a session ID for SDP. - // https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1 - // recommends using a cryptographically random +ve 64-bit value - // but right now this should be acceptable and within the right range - SDPUtils.generateSessionId = function () { - return Math.random().toString().substr(2, 22); - }; - - // Write boiler plate for start of SDP - // sessId argument is optional - if not supplied it will - // be generated randomly - // sessVersion is optional and defaults to 2 - // sessUser is optional and defaults to 'thisisadapterortc' - SDPUtils.writeSessionBoilerplate = function (sessId, sessVer, sessUser) { - let sessionId; - const version = sessVer !== undefined ? sessVer : 2; - if (sessId) { - sessionId = sessId; - } else { - sessionId = SDPUtils.generateSessionId(); - } - const user = sessUser || 'thisisadapterortc'; - // FIXME: sess-id should be an NTP timestamp. - return 'v=0\r\n' + 'o=' + user + ' ' + sessionId + ' ' + version + ' IN IP4 127.0.0.1\r\n' + 's=-\r\n' + 't=0 0\r\n'; - }; - - // Gets the direction from the mediaSection or the sessionpart. - SDPUtils.getDirection = function (mediaSection, sessionpart) { - // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv. - const lines = SDPUtils.splitLines(mediaSection); - for (let i = 0; i < lines.length; i++) { - switch (lines[i]) { - case 'a=sendrecv': - case 'a=sendonly': - case 'a=recvonly': - case 'a=inactive': - return lines[i].substring(2); - // FIXME: What should happen here? - } - } - - if (sessionpart) { - return SDPUtils.getDirection(sessionpart); - } - return 'sendrecv'; - }; - SDPUtils.getKind = function (mediaSection) { - const lines = SDPUtils.splitLines(mediaSection); - const mline = lines[0].split(' '); - return mline[0].substring(2); - }; - SDPUtils.isRejected = function (mediaSection) { - return mediaSection.split(' ', 2)[1] === '0'; - }; - SDPUtils.parseMLine = function (mediaSection) { - const lines = SDPUtils.splitLines(mediaSection); - const parts = lines[0].substring(2).split(' '); - return { - kind: parts[0], - port: parseInt(parts[1], 10), - protocol: parts[2], - fmt: parts.slice(3).join(' ') - }; - }; - SDPUtils.parseOLine = function (mediaSection) { - const line = SDPUtils.matchPrefix(mediaSection, 'o=')[0]; - const parts = line.substring(2).split(' '); - return { - username: parts[0], - sessionId: parts[1], - sessionVersion: parseInt(parts[2], 10), - netType: parts[3], - addressType: parts[4], - address: parts[5] - }; - }; - - // a very naive interpretation of a valid SDP. - SDPUtils.isValidSDP = function (blob) { - if (typeof blob !== 'string' || blob.length === 0) { - return false; - } - const lines = SDPUtils.splitLines(blob); - for (let i = 0; i < lines.length; i++) { - if (lines[i].length < 2 || lines[i].charAt(1) !== '=') { - return false; - } - // TODO: check the modifier a bit more. - } - - return true; - }; - - // Expose public methods. - { - module.exports = SDPUtils; - } -})(sdp$1); -var sdpExports = sdp$1.exports; -var SDPUtils = /*@__PURE__*/getDefaultExportFromCjs(sdpExports); - -var sdp = /*#__PURE__*/_mergeNamespaces({ - __proto__: null, - default: SDPUtils -}, [sdpExports]); - -/* - * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. - */ -/* eslint-env node */ -function shimRTCIceCandidate(window) { - // foundation is arbitrarily chosen as an indicator for full support for - // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface - if (!window.RTCIceCandidate || window.RTCIceCandidate && 'foundation' in window.RTCIceCandidate.prototype) { - return; - } - const NativeRTCIceCandidate = window.RTCIceCandidate; - window.RTCIceCandidate = function RTCIceCandidate(args) { - // Remove the a= which shouldn't be part of the candidate string. - if (typeof args === 'object' && args.candidate && args.candidate.indexOf('a=') === 0) { - args = JSON.parse(JSON.stringify(args)); - args.candidate = args.candidate.substring(2); - } - if (args.candidate && args.candidate.length) { - // Augment the native candidate with the parsed fields. - const nativeCandidate = new NativeRTCIceCandidate(args); - const parsedCandidate = SDPUtils.parseCandidate(args.candidate); - for (const key in parsedCandidate) { - if (!(key in nativeCandidate)) { - Object.defineProperty(nativeCandidate, key, { - value: parsedCandidate[key] - }); - } - } - - // Override serializer to not serialize the extra attributes. - nativeCandidate.toJSON = function toJSON() { - return { - candidate: nativeCandidate.candidate, - sdpMid: nativeCandidate.sdpMid, - sdpMLineIndex: nativeCandidate.sdpMLineIndex, - usernameFragment: nativeCandidate.usernameFragment - }; - }; - return nativeCandidate; - } - return new NativeRTCIceCandidate(args); - }; - window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype; - - // Hook up the augmented candidate in onicecandidate and - // addEventListener('icecandidate', ...) - wrapPeerConnectionEvent(window, 'icecandidate', e => { - if (e.candidate) { - Object.defineProperty(e, 'candidate', { - value: new window.RTCIceCandidate(e.candidate), - writable: 'false' - }); - } - return e; - }); -} -function shimRTCIceCandidateRelayProtocol(window) { - if (!window.RTCIceCandidate || window.RTCIceCandidate && 'relayProtocol' in window.RTCIceCandidate.prototype) { - return; - } - - // Hook up the augmented candidate in onicecandidate and - // addEventListener('icecandidate', ...) - wrapPeerConnectionEvent(window, 'icecandidate', e => { - if (e.candidate) { - const parsedCandidate = SDPUtils.parseCandidate(e.candidate.candidate); - if (parsedCandidate.type === 'relay') { - // This is a libwebrtc-specific mapping of local type preference - // to relayProtocol. - e.candidate.relayProtocol = { - 0: 'tls', - 1: 'tcp', - 2: 'udp' - }[parsedCandidate.priority >> 24]; - } - } - return e; - }); -} -function shimMaxMessageSize(window, browserDetails) { - if (!window.RTCPeerConnection) { - return; - } - if (!('sctp' in window.RTCPeerConnection.prototype)) { - Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', { - get() { - return typeof this._sctp === 'undefined' ? null : this._sctp; - } - }); - } - const sctpInDescription = function (description) { - if (!description || !description.sdp) { - return false; - } - const sections = SDPUtils.splitSections(description.sdp); - sections.shift(); - return sections.some(mediaSection => { - const mLine = SDPUtils.parseMLine(mediaSection); - return mLine && mLine.kind === 'application' && mLine.protocol.indexOf('SCTP') !== -1; - }); - }; - const getRemoteFirefoxVersion = function (description) { - // TODO: Is there a better solution for detecting Firefox? - const match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/); - if (match === null || match.length < 2) { - return -1; - } - const version = parseInt(match[1], 10); - // Test for NaN (yes, this is ugly) - return version !== version ? -1 : version; - }; - const getCanSendMaxMessageSize = function (remoteIsFirefox) { - // Every implementation we know can send at least 64 KiB. - // Note: Although Chrome is technically able to send up to 256 KiB, the - // data does not reach the other peer reliably. - // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419 - let canSendMaxMessageSize = 65536; - if (browserDetails.browser === 'firefox') { - if (browserDetails.version < 57) { - if (remoteIsFirefox === -1) { - // FF < 57 will send in 16 KiB chunks using the deprecated PPID - // fragmentation. - canSendMaxMessageSize = 16384; - } else { - // However, other FF (and RAWRTC) can reassemble PPID-fragmented - // messages. Thus, supporting ~2 GiB when sending. - canSendMaxMessageSize = 2147483637; - } - } else if (browserDetails.version < 60) { - // Currently, all FF >= 57 will reset the remote maximum message size - // to the default value when a data channel is created at a later - // stage. :( - // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831 - canSendMaxMessageSize = browserDetails.version === 57 ? 65535 : 65536; - } else { - // FF >= 60 supports sending ~2 GiB - canSendMaxMessageSize = 2147483637; - } - } - return canSendMaxMessageSize; - }; - const getMaxMessageSize = function (description, remoteIsFirefox) { - // Note: 65536 bytes is the default value from the SDP spec. Also, - // every implementation we know supports receiving 65536 bytes. - let maxMessageSize = 65536; - - // FF 57 has a slightly incorrect default remote max message size, so - // we need to adjust it here to avoid a failure when sending. - // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697 - if (browserDetails.browser === 'firefox' && browserDetails.version === 57) { - maxMessageSize = 65535; - } - const match = SDPUtils.matchPrefix(description.sdp, 'a=max-message-size:'); - if (match.length > 0) { - maxMessageSize = parseInt(match[0].substring(19), 10); - } else if (browserDetails.browser === 'firefox' && remoteIsFirefox !== -1) { - // If the maximum message size is not present in the remote SDP and - // both local and remote are Firefox, the remote peer can receive - // ~2 GiB. - maxMessageSize = 2147483637; - } - return maxMessageSize; - }; - const origSetRemoteDescription = window.RTCPeerConnection.prototype.setRemoteDescription; - window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription() { - this._sctp = null; - // Chrome decided to not expose .sctp in plan-b mode. - // As usual, adapter.js has to do an 'ugly worakaround' - // to cover up the mess. - if (browserDetails.browser === 'chrome' && browserDetails.version >= 76) { - const { - sdpSemantics - } = this.getConfiguration(); - if (sdpSemantics === 'plan-b') { - Object.defineProperty(this, 'sctp', { - get() { - return typeof this._sctp === 'undefined' ? null : this._sctp; - }, - enumerable: true, - configurable: true - }); - } - } - if (sctpInDescription(arguments[0])) { - // Check if the remote is FF. - const isFirefox = getRemoteFirefoxVersion(arguments[0]); - - // Get the maximum message size the local peer is capable of sending - const canSendMMS = getCanSendMaxMessageSize(isFirefox); - - // Get the maximum message size of the remote peer. - const remoteMMS = getMaxMessageSize(arguments[0], isFirefox); - - // Determine final maximum message size - let maxMessageSize; - if (canSendMMS === 0 && remoteMMS === 0) { - maxMessageSize = Number.POSITIVE_INFINITY; - } else if (canSendMMS === 0 || remoteMMS === 0) { - maxMessageSize = Math.max(canSendMMS, remoteMMS); - } else { - maxMessageSize = Math.min(canSendMMS, remoteMMS); - } - - // Create a dummy RTCSctpTransport object and the 'maxMessageSize' - // attribute. - const sctp = {}; - Object.defineProperty(sctp, 'maxMessageSize', { - get() { - return maxMessageSize; - } - }); - this._sctp = sctp; - } - return origSetRemoteDescription.apply(this, arguments); - }; -} -function shimSendThrowTypeError(window) { - if (!(window.RTCPeerConnection && 'createDataChannel' in window.RTCPeerConnection.prototype)) { - return; - } - - // Note: Although Firefox >= 57 has a native implementation, the maximum - // message size can be reset for all data channels at a later stage. - // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831 - - function wrapDcSend(dc, pc) { - const origDataChannelSend = dc.send; - dc.send = function send() { - const data = arguments[0]; - const length = data.length || data.size || data.byteLength; - if (dc.readyState === 'open' && pc.sctp && length > pc.sctp.maxMessageSize) { - throw new TypeError('Message too large (can send a maximum of ' + pc.sctp.maxMessageSize + ' bytes)'); - } - return origDataChannelSend.apply(dc, arguments); - }; - } - const origCreateDataChannel = window.RTCPeerConnection.prototype.createDataChannel; - window.RTCPeerConnection.prototype.createDataChannel = function createDataChannel() { - const dataChannel = origCreateDataChannel.apply(this, arguments); - wrapDcSend(dataChannel, this); - return dataChannel; - }; - wrapPeerConnectionEvent(window, 'datachannel', e => { - wrapDcSend(e.channel, e.target); - return e; - }); -} - -/* shims RTCConnectionState by pretending it is the same as iceConnectionState. - * See https://bugs.chromium.org/p/webrtc/issues/detail?id=6145#c12 - * for why this is a valid hack in Chrome. In Firefox it is slightly incorrect - * since DTLS failures would be hidden. See - * https://bugzilla.mozilla.org/show_bug.cgi?id=1265827 - * for the Firefox tracking bug. - */ -function shimConnectionState(window) { - if (!window.RTCPeerConnection || 'connectionState' in window.RTCPeerConnection.prototype) { - return; - } - const proto = window.RTCPeerConnection.prototype; - Object.defineProperty(proto, 'connectionState', { - get() { - return { - completed: 'connected', - checking: 'connecting' - }[this.iceConnectionState] || this.iceConnectionState; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(proto, 'onconnectionstatechange', { - get() { - return this._onconnectionstatechange || null; - }, - set(cb) { - if (this._onconnectionstatechange) { - this.removeEventListener('connectionstatechange', this._onconnectionstatechange); - delete this._onconnectionstatechange; - } - if (cb) { - this.addEventListener('connectionstatechange', this._onconnectionstatechange = cb); - } - }, - enumerable: true, - configurable: true - }); - ['setLocalDescription', 'setRemoteDescription'].forEach(method => { - const origMethod = proto[method]; - proto[method] = function () { - if (!this._connectionstatechangepoly) { - this._connectionstatechangepoly = e => { - const pc = e.target; - if (pc._lastConnectionState !== pc.connectionState) { - pc._lastConnectionState = pc.connectionState; - const newEvent = new Event('connectionstatechange', e); - pc.dispatchEvent(newEvent); - } - return e; - }; - this.addEventListener('iceconnectionstatechange', this._connectionstatechangepoly); - } - return origMethod.apply(this, arguments); - }; - }); -} -function removeExtmapAllowMixed(window, browserDetails) { - /* remove a=extmap-allow-mixed for webrtc.org < M71 */ - if (!window.RTCPeerConnection) { - return; - } - if (browserDetails.browser === 'chrome' && browserDetails.version >= 71) { - return; - } - if (browserDetails.browser === 'safari' && browserDetails.version >= 605) { - return; - } - const nativeSRD = window.RTCPeerConnection.prototype.setRemoteDescription; - window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription(desc) { - if (desc && desc.sdp && desc.sdp.indexOf('\na=extmap-allow-mixed') !== -1) { - const sdp = desc.sdp.split('\n').filter(line => { - return line.trim() !== 'a=extmap-allow-mixed'; - }).join('\n'); - // Safari enforces read-only-ness of RTCSessionDescription fields. - if (window.RTCSessionDescription && desc instanceof window.RTCSessionDescription) { - arguments[0] = new window.RTCSessionDescription({ - type: desc.type, - sdp - }); - } else { - desc.sdp = sdp; - } - } - return nativeSRD.apply(this, arguments); - }; -} -function shimAddIceCandidateNullOrEmpty(window, browserDetails) { - // Support for addIceCandidate(null or undefined) - // as well as addIceCandidate({candidate: "", ...}) - // https://bugs.chromium.org/p/chromium/issues/detail?id=978582 - // Note: must be called before other polyfills which change the signature. - if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) { - return; - } - const nativeAddIceCandidate = window.RTCPeerConnection.prototype.addIceCandidate; - if (!nativeAddIceCandidate || nativeAddIceCandidate.length === 0) { - return; - } - window.RTCPeerConnection.prototype.addIceCandidate = function addIceCandidate() { - if (!arguments[0]) { - if (arguments[1]) { - arguments[1].apply(null); - } - return Promise.resolve(); - } - // Firefox 68+ emits and processes {candidate: "", ...}, ignore - // in older versions. - // Native support for ignoring exists for Chrome M77+. - // Safari ignores as well, exact version unknown but works in the same - // version that also ignores addIceCandidate(null). - if ((browserDetails.browser === 'chrome' && browserDetails.version < 78 || browserDetails.browser === 'firefox' && browserDetails.version < 68 || browserDetails.browser === 'safari') && arguments[0] && arguments[0].candidate === '') { - return Promise.resolve(); - } - return nativeAddIceCandidate.apply(this, arguments); - }; -} - -// Note: Make sure to call this ahead of APIs that modify -// setLocalDescription.length -function shimParameterlessSetLocalDescription(window, browserDetails) { - if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) { - return; - } - const nativeSetLocalDescription = window.RTCPeerConnection.prototype.setLocalDescription; - if (!nativeSetLocalDescription || nativeSetLocalDescription.length === 0) { - return; - } - window.RTCPeerConnection.prototype.setLocalDescription = function setLocalDescription() { - let desc = arguments[0] || {}; - if (typeof desc !== 'object' || desc.type && desc.sdp) { - return nativeSetLocalDescription.apply(this, arguments); - } - // The remaining steps should technically happen when SLD comes off the - // RTCPeerConnection's operations chain (not ahead of going on it), but - // this is too difficult to shim. Instead, this shim only covers the - // common case where the operations chain is empty. This is imperfect, but - // should cover many cases. Rationale: Even if we can't reduce the glare - // window to zero on imperfect implementations, there's value in tapping - // into the perfect negotiation pattern that several browsers support. - desc = { - type: desc.type, - sdp: desc.sdp - }; - if (!desc.type) { - switch (this.signalingState) { - case 'stable': - case 'have-local-offer': - case 'have-remote-pranswer': - desc.type = 'offer'; - break; - default: - desc.type = 'answer'; - break; - } - } - if (desc.sdp || desc.type !== 'offer' && desc.type !== 'answer') { - return nativeSetLocalDescription.apply(this, [desc]); - } - const func = desc.type === 'offer' ? this.createOffer : this.createAnswer; - return func.apply(this).then(d => nativeSetLocalDescription.apply(this, [d])); - }; -} - -var commonShim = /*#__PURE__*/Object.freeze({ - __proto__: null, - removeExtmapAllowMixed: removeExtmapAllowMixed, - shimAddIceCandidateNullOrEmpty: shimAddIceCandidateNullOrEmpty, - shimConnectionState: shimConnectionState, - shimMaxMessageSize: shimMaxMessageSize, - shimParameterlessSetLocalDescription: shimParameterlessSetLocalDescription, - shimRTCIceCandidate: shimRTCIceCandidate, - shimRTCIceCandidateRelayProtocol: shimRTCIceCandidateRelayProtocol, - shimSendThrowTypeError: shimSendThrowTypeError -}); - -/* - * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. - */ - -// Shimming starts here. -function adapterFactory() { - let { - window - } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { - shimChrome: true, - shimFirefox: true, - shimSafari: true - }; - // Utils. - const logging = log; - const browserDetails = detectBrowser(window); - const adapter = { - browserDetails, - commonShim, - extractVersion: extractVersion, - disableLog: disableLog, - disableWarnings: disableWarnings, - // Expose sdp as a convenience. For production apps include directly. - sdp - }; - - // Shim browser if found. - switch (browserDetails.browser) { - case 'chrome': - if (!chromeShim || !shimPeerConnection$1 || !options.shimChrome) { - logging('Chrome shim is not included in this adapter release.'); - return adapter; - } - if (browserDetails.version === null) { - logging('Chrome shim can not determine version, not shimming.'); - return adapter; - } - logging('adapter.js shimming chrome.'); - // Export to the adapter global object visible in the browser. - adapter.browserShim = chromeShim; - - // Must be called before shimPeerConnection. - shimAddIceCandidateNullOrEmpty(window, browserDetails); - shimParameterlessSetLocalDescription(window); - shimGetUserMedia$2(window, browserDetails); - shimMediaStream(window); - shimPeerConnection$1(window, browserDetails); - shimOnTrack$1(window); - shimAddTrackRemoveTrack(window, browserDetails); - shimGetSendersWithDtmf(window); - shimGetStats(window); - shimSenderReceiverGetStats(window); - fixNegotiationNeeded(window, browserDetails); - shimRTCIceCandidate(window); - shimRTCIceCandidateRelayProtocol(window); - shimConnectionState(window); - shimMaxMessageSize(window, browserDetails); - shimSendThrowTypeError(window); - removeExtmapAllowMixed(window, browserDetails); - break; - case 'firefox': - if (!firefoxShim || !shimPeerConnection || !options.shimFirefox) { - logging('Firefox shim is not included in this adapter release.'); - return adapter; - } - logging('adapter.js shimming firefox.'); - // Export to the adapter global object visible in the browser. - adapter.browserShim = firefoxShim; - - // Must be called before shimPeerConnection. - shimAddIceCandidateNullOrEmpty(window, browserDetails); - shimParameterlessSetLocalDescription(window); - shimGetUserMedia$1(window, browserDetails); - shimPeerConnection(window, browserDetails); - shimOnTrack(window); - shimRemoveStream(window); - shimSenderGetStats(window); - shimReceiverGetStats(window); - shimRTCDataChannel(window); - shimAddTransceiver(window); - shimGetParameters(window); - shimCreateOffer(window); - shimCreateAnswer(window); - shimRTCIceCandidate(window); - shimConnectionState(window); - shimMaxMessageSize(window, browserDetails); - shimSendThrowTypeError(window); - break; - case 'safari': - if (!safariShim || !options.shimSafari) { - logging('Safari shim is not included in this adapter release.'); - return adapter; - } - logging('adapter.js shimming safari.'); - // Export to the adapter global object visible in the browser. - adapter.browserShim = safariShim; - - // Must be called before shimCallbackAPI. - shimAddIceCandidateNullOrEmpty(window, browserDetails); - shimParameterlessSetLocalDescription(window); - shimRTCIceServerUrls(window); - shimCreateOfferLegacy(window); - shimCallbacksAPI(window); - shimLocalStreamsAPI(window); - shimRemoteStreamsAPI(window); - shimTrackEventTransceiver(window); - shimGetUserMedia(window); - shimAudioContext(window); - shimRTCIceCandidate(window); - shimRTCIceCandidateRelayProtocol(window); - shimMaxMessageSize(window, browserDetails); - shimSendThrowTypeError(window); - removeExtmapAllowMixed(window, browserDetails); - break; - default: - logging('Unsupported browser!'); - break; - } - return adapter; -} - -/* - * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. - */ -/* eslint-env node */ - -adapterFactory({ - window: typeof window === 'undefined' ? undefined : window -}); - -/* eslint-disable */ -var SignalTarget; -(function (SignalTarget) { - SignalTarget[SignalTarget["PUBLISHER"] = 0] = "PUBLISHER"; - SignalTarget[SignalTarget["SUBSCRIBER"] = 1] = "SUBSCRIBER"; - SignalTarget[SignalTarget["UNRECOGNIZED"] = -1] = "UNRECOGNIZED"; -})(SignalTarget || (SignalTarget = {})); -function signalTargetFromJSON(object) { - switch (object) { - case 0: - case "PUBLISHER": - return SignalTarget.PUBLISHER; - case 1: - case "SUBSCRIBER": - return SignalTarget.SUBSCRIBER; - case -1: - case "UNRECOGNIZED": - default: - return SignalTarget.UNRECOGNIZED; - } -} -function signalTargetToJSON(object) { - switch (object) { - case SignalTarget.PUBLISHER: - return "PUBLISHER"; - case SignalTarget.SUBSCRIBER: - return "SUBSCRIBER"; - case SignalTarget.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} -var StreamState; -(function (StreamState) { - StreamState[StreamState["ACTIVE"] = 0] = "ACTIVE"; - StreamState[StreamState["PAUSED"] = 1] = "PAUSED"; - StreamState[StreamState["UNRECOGNIZED"] = -1] = "UNRECOGNIZED"; -})(StreamState || (StreamState = {})); -function streamStateFromJSON(object) { - switch (object) { - case 0: - case "ACTIVE": - return StreamState.ACTIVE; - case 1: - case "PAUSED": - return StreamState.PAUSED; - case -1: - case "UNRECOGNIZED": - default: - return StreamState.UNRECOGNIZED; - } -} -function streamStateToJSON(object) { - switch (object) { - case StreamState.ACTIVE: - return "ACTIVE"; - case StreamState.PAUSED: - return "PAUSED"; - case StreamState.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} -var CandidateProtocol; -(function (CandidateProtocol) { - CandidateProtocol[CandidateProtocol["UDP"] = 0] = "UDP"; - CandidateProtocol[CandidateProtocol["TCP"] = 1] = "TCP"; - CandidateProtocol[CandidateProtocol["TLS"] = 2] = "TLS"; - CandidateProtocol[CandidateProtocol["UNRECOGNIZED"] = -1] = "UNRECOGNIZED"; -})(CandidateProtocol || (CandidateProtocol = {})); -function candidateProtocolFromJSON(object) { - switch (object) { - case 0: - case "UDP": - return CandidateProtocol.UDP; - case 1: - case "TCP": - return CandidateProtocol.TCP; - case 2: - case "TLS": - return CandidateProtocol.TLS; - case -1: - case "UNRECOGNIZED": - default: - return CandidateProtocol.UNRECOGNIZED; - } -} -function candidateProtocolToJSON(object) { - switch (object) { - case CandidateProtocol.UDP: - return "UDP"; - case CandidateProtocol.TCP: - return "TCP"; - case CandidateProtocol.TLS: - return "TLS"; - case CandidateProtocol.UNRECOGNIZED: - default: - return "UNRECOGNIZED"; - } -} -function createBaseSignalRequest() { - return { - message: undefined - }; -} -const SignalRequest = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - var _a; - switch ((_a = message.message) === null || _a === void 0 ? void 0 : _a.$case) { - case "offer": - SessionDescription.encode(message.message.offer, writer.uint32(10).fork()).ldelim(); - break; - case "answer": - SessionDescription.encode(message.message.answer, writer.uint32(18).fork()).ldelim(); - break; - case "trickle": - TrickleRequest.encode(message.message.trickle, writer.uint32(26).fork()).ldelim(); - break; - case "addTrack": - AddTrackRequest.encode(message.message.addTrack, writer.uint32(34).fork()).ldelim(); - break; - case "mute": - MuteTrackRequest.encode(message.message.mute, writer.uint32(42).fork()).ldelim(); - break; - case "subscription": - UpdateSubscription.encode(message.message.subscription, writer.uint32(50).fork()).ldelim(); - break; - case "trackSetting": - UpdateTrackSettings.encode(message.message.trackSetting, writer.uint32(58).fork()).ldelim(); - break; - case "leave": - LeaveRequest.encode(message.message.leave, writer.uint32(66).fork()).ldelim(); - break; - case "updateLayers": - UpdateVideoLayers.encode(message.message.updateLayers, writer.uint32(82).fork()).ldelim(); - break; - case "subscriptionPermission": - SubscriptionPermission.encode(message.message.subscriptionPermission, writer.uint32(90).fork()).ldelim(); - break; - case "syncState": - SyncState.encode(message.message.syncState, writer.uint32(98).fork()).ldelim(); - break; - case "simulate": - SimulateScenario.encode(message.message.simulate, writer.uint32(106).fork()).ldelim(); - break; - case "ping": - writer.uint32(112).int64(message.message.ping); - break; - case "updateMetadata": - UpdateParticipantMetadata.encode(message.message.updateMetadata, writer.uint32(122).fork()).ldelim(); - break; - case "pingReq": - Ping.encode(message.message.pingReq, writer.uint32(130).fork()).ldelim(); - break; - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSignalRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.message = { - $case: "offer", - offer: SessionDescription.decode(reader, reader.uint32()) - }; - continue; - case 2: - if (tag !== 18) { - break; - } - message.message = { - $case: "answer", - answer: SessionDescription.decode(reader, reader.uint32()) - }; - continue; - case 3: - if (tag !== 26) { - break; - } - message.message = { - $case: "trickle", - trickle: TrickleRequest.decode(reader, reader.uint32()) - }; - continue; - case 4: - if (tag !== 34) { - break; - } - message.message = { - $case: "addTrack", - addTrack: AddTrackRequest.decode(reader, reader.uint32()) - }; - continue; - case 5: - if (tag !== 42) { - break; - } - message.message = { - $case: "mute", - mute: MuteTrackRequest.decode(reader, reader.uint32()) - }; - continue; - case 6: - if (tag !== 50) { - break; - } - message.message = { - $case: "subscription", - subscription: UpdateSubscription.decode(reader, reader.uint32()) - }; - continue; - case 7: - if (tag !== 58) { - break; - } - message.message = { - $case: "trackSetting", - trackSetting: UpdateTrackSettings.decode(reader, reader.uint32()) - }; - continue; - case 8: - if (tag !== 66) { - break; - } - message.message = { - $case: "leave", - leave: LeaveRequest.decode(reader, reader.uint32()) - }; - continue; - case 10: - if (tag !== 82) { - break; - } - message.message = { - $case: "updateLayers", - updateLayers: UpdateVideoLayers.decode(reader, reader.uint32()) - }; - continue; - case 11: - if (tag !== 90) { - break; - } - message.message = { - $case: "subscriptionPermission", - subscriptionPermission: SubscriptionPermission.decode(reader, reader.uint32()) - }; - continue; - case 12: - if (tag !== 98) { - break; - } - message.message = { - $case: "syncState", - syncState: SyncState.decode(reader, reader.uint32()) - }; - continue; - case 13: - if (tag !== 106) { - break; - } - message.message = { - $case: "simulate", - simulate: SimulateScenario.decode(reader, reader.uint32()) - }; - continue; - case 14: - if (tag !== 112) { - break; - } - message.message = { - $case: "ping", - ping: longToNumber(reader.int64()) - }; - continue; - case 15: - if (tag !== 122) { - break; - } - message.message = { - $case: "updateMetadata", - updateMetadata: UpdateParticipantMetadata.decode(reader, reader.uint32()) - }; - continue; - case 16: - if (tag !== 130) { - break; - } - message.message = { - $case: "pingReq", - pingReq: Ping.decode(reader, reader.uint32()) - }; - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - message: isSet(object.offer) ? { - $case: "offer", - offer: SessionDescription.fromJSON(object.offer) - } : isSet(object.answer) ? { - $case: "answer", - answer: SessionDescription.fromJSON(object.answer) - } : isSet(object.trickle) ? { - $case: "trickle", - trickle: TrickleRequest.fromJSON(object.trickle) - } : isSet(object.addTrack) ? { - $case: "addTrack", - addTrack: AddTrackRequest.fromJSON(object.addTrack) - } : isSet(object.mute) ? { - $case: "mute", - mute: MuteTrackRequest.fromJSON(object.mute) - } : isSet(object.subscription) ? { - $case: "subscription", - subscription: UpdateSubscription.fromJSON(object.subscription) - } : isSet(object.trackSetting) ? { - $case: "trackSetting", - trackSetting: UpdateTrackSettings.fromJSON(object.trackSetting) - } : isSet(object.leave) ? { - $case: "leave", - leave: LeaveRequest.fromJSON(object.leave) - } : isSet(object.updateLayers) ? { - $case: "updateLayers", - updateLayers: UpdateVideoLayers.fromJSON(object.updateLayers) - } : isSet(object.subscriptionPermission) ? { - $case: "subscriptionPermission", - subscriptionPermission: SubscriptionPermission.fromJSON(object.subscriptionPermission) - } : isSet(object.syncState) ? { - $case: "syncState", - syncState: SyncState.fromJSON(object.syncState) - } : isSet(object.simulate) ? { - $case: "simulate", - simulate: SimulateScenario.fromJSON(object.simulate) - } : isSet(object.ping) ? { - $case: "ping", - ping: Number(object.ping) - } : isSet(object.updateMetadata) ? { - $case: "updateMetadata", - updateMetadata: UpdateParticipantMetadata.fromJSON(object.updateMetadata) - } : isSet(object.pingReq) ? { - $case: "pingReq", - pingReq: Ping.fromJSON(object.pingReq) - } : undefined - }; - }, - toJSON(message) { - var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19; - const obj = {}; - ((_a = message.message) === null || _a === void 0 ? void 0 : _a.$case) === "offer" && (obj.offer = ((_b = message.message) === null || _b === void 0 ? void 0 : _b.offer) ? SessionDescription.toJSON((_c = message.message) === null || _c === void 0 ? void 0 : _c.offer) : undefined); - ((_d = message.message) === null || _d === void 0 ? void 0 : _d.$case) === "answer" && (obj.answer = ((_e = message.message) === null || _e === void 0 ? void 0 : _e.answer) ? SessionDescription.toJSON((_f = message.message) === null || _f === void 0 ? void 0 : _f.answer) : undefined); - ((_g = message.message) === null || _g === void 0 ? void 0 : _g.$case) === "trickle" && (obj.trickle = ((_h = message.message) === null || _h === void 0 ? void 0 : _h.trickle) ? TrickleRequest.toJSON((_j = message.message) === null || _j === void 0 ? void 0 : _j.trickle) : undefined); - ((_k = message.message) === null || _k === void 0 ? void 0 : _k.$case) === "addTrack" && (obj.addTrack = ((_l = message.message) === null || _l === void 0 ? void 0 : _l.addTrack) ? AddTrackRequest.toJSON((_m = message.message) === null || _m === void 0 ? void 0 : _m.addTrack) : undefined); - ((_o = message.message) === null || _o === void 0 ? void 0 : _o.$case) === "mute" && (obj.mute = ((_p = message.message) === null || _p === void 0 ? void 0 : _p.mute) ? MuteTrackRequest.toJSON((_q = message.message) === null || _q === void 0 ? void 0 : _q.mute) : undefined); - ((_r = message.message) === null || _r === void 0 ? void 0 : _r.$case) === "subscription" && (obj.subscription = ((_s = message.message) === null || _s === void 0 ? void 0 : _s.subscription) ? UpdateSubscription.toJSON((_t = message.message) === null || _t === void 0 ? void 0 : _t.subscription) : undefined); - ((_u = message.message) === null || _u === void 0 ? void 0 : _u.$case) === "trackSetting" && (obj.trackSetting = ((_v = message.message) === null || _v === void 0 ? void 0 : _v.trackSetting) ? UpdateTrackSettings.toJSON((_w = message.message) === null || _w === void 0 ? void 0 : _w.trackSetting) : undefined); - ((_x = message.message) === null || _x === void 0 ? void 0 : _x.$case) === "leave" && (obj.leave = ((_y = message.message) === null || _y === void 0 ? void 0 : _y.leave) ? LeaveRequest.toJSON((_z = message.message) === null || _z === void 0 ? void 0 : _z.leave) : undefined); - ((_0 = message.message) === null || _0 === void 0 ? void 0 : _0.$case) === "updateLayers" && (obj.updateLayers = ((_1 = message.message) === null || _1 === void 0 ? void 0 : _1.updateLayers) ? UpdateVideoLayers.toJSON((_2 = message.message) === null || _2 === void 0 ? void 0 : _2.updateLayers) : undefined); - ((_3 = message.message) === null || _3 === void 0 ? void 0 : _3.$case) === "subscriptionPermission" && (obj.subscriptionPermission = ((_4 = message.message) === null || _4 === void 0 ? void 0 : _4.subscriptionPermission) ? SubscriptionPermission.toJSON((_5 = message.message) === null || _5 === void 0 ? void 0 : _5.subscriptionPermission) : undefined); - ((_6 = message.message) === null || _6 === void 0 ? void 0 : _6.$case) === "syncState" && (obj.syncState = ((_7 = message.message) === null || _7 === void 0 ? void 0 : _7.syncState) ? SyncState.toJSON((_8 = message.message) === null || _8 === void 0 ? void 0 : _8.syncState) : undefined); - ((_9 = message.message) === null || _9 === void 0 ? void 0 : _9.$case) === "simulate" && (obj.simulate = ((_10 = message.message) === null || _10 === void 0 ? void 0 : _10.simulate) ? SimulateScenario.toJSON((_11 = message.message) === null || _11 === void 0 ? void 0 : _11.simulate) : undefined); - ((_12 = message.message) === null || _12 === void 0 ? void 0 : _12.$case) === "ping" && (obj.ping = Math.round((_13 = message.message) === null || _13 === void 0 ? void 0 : _13.ping)); - ((_14 = message.message) === null || _14 === void 0 ? void 0 : _14.$case) === "updateMetadata" && (obj.updateMetadata = ((_15 = message.message) === null || _15 === void 0 ? void 0 : _15.updateMetadata) ? UpdateParticipantMetadata.toJSON((_16 = message.message) === null || _16 === void 0 ? void 0 : _16.updateMetadata) : undefined); - ((_17 = message.message) === null || _17 === void 0 ? void 0 : _17.$case) === "pingReq" && (obj.pingReq = ((_18 = message.message) === null || _18 === void 0 ? void 0 : _18.pingReq) ? Ping.toJSON((_19 = message.message) === null || _19 === void 0 ? void 0 : _19.pingReq) : undefined); - return obj; - }, - create(base) { - return SignalRequest.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20; - const message = createBaseSignalRequest(); - if (((_a = object.message) === null || _a === void 0 ? void 0 : _a.$case) === "offer" && ((_b = object.message) === null || _b === void 0 ? void 0 : _b.offer) !== undefined && ((_c = object.message) === null || _c === void 0 ? void 0 : _c.offer) !== null) { - message.message = { - $case: "offer", - offer: SessionDescription.fromPartial(object.message.offer) - }; - } - if (((_d = object.message) === null || _d === void 0 ? void 0 : _d.$case) === "answer" && ((_e = object.message) === null || _e === void 0 ? void 0 : _e.answer) !== undefined && ((_f = object.message) === null || _f === void 0 ? void 0 : _f.answer) !== null) { - message.message = { - $case: "answer", - answer: SessionDescription.fromPartial(object.message.answer) - }; - } - if (((_g = object.message) === null || _g === void 0 ? void 0 : _g.$case) === "trickle" && ((_h = object.message) === null || _h === void 0 ? void 0 : _h.trickle) !== undefined && ((_j = object.message) === null || _j === void 0 ? void 0 : _j.trickle) !== null) { - message.message = { - $case: "trickle", - trickle: TrickleRequest.fromPartial(object.message.trickle) - }; - } - if (((_k = object.message) === null || _k === void 0 ? void 0 : _k.$case) === "addTrack" && ((_l = object.message) === null || _l === void 0 ? void 0 : _l.addTrack) !== undefined && ((_m = object.message) === null || _m === void 0 ? void 0 : _m.addTrack) !== null) { - message.message = { - $case: "addTrack", - addTrack: AddTrackRequest.fromPartial(object.message.addTrack) - }; - } - if (((_o = object.message) === null || _o === void 0 ? void 0 : _o.$case) === "mute" && ((_p = object.message) === null || _p === void 0 ? void 0 : _p.mute) !== undefined && ((_q = object.message) === null || _q === void 0 ? void 0 : _q.mute) !== null) { - message.message = { - $case: "mute", - mute: MuteTrackRequest.fromPartial(object.message.mute) - }; - } - if (((_r = object.message) === null || _r === void 0 ? void 0 : _r.$case) === "subscription" && ((_s = object.message) === null || _s === void 0 ? void 0 : _s.subscription) !== undefined && ((_t = object.message) === null || _t === void 0 ? void 0 : _t.subscription) !== null) { - message.message = { - $case: "subscription", - subscription: UpdateSubscription.fromPartial(object.message.subscription) - }; - } - if (((_u = object.message) === null || _u === void 0 ? void 0 : _u.$case) === "trackSetting" && ((_v = object.message) === null || _v === void 0 ? void 0 : _v.trackSetting) !== undefined && ((_w = object.message) === null || _w === void 0 ? void 0 : _w.trackSetting) !== null) { - message.message = { - $case: "trackSetting", - trackSetting: UpdateTrackSettings.fromPartial(object.message.trackSetting) - }; - } - if (((_x = object.message) === null || _x === void 0 ? void 0 : _x.$case) === "leave" && ((_y = object.message) === null || _y === void 0 ? void 0 : _y.leave) !== undefined && ((_z = object.message) === null || _z === void 0 ? void 0 : _z.leave) !== null) { - message.message = { - $case: "leave", - leave: LeaveRequest.fromPartial(object.message.leave) - }; - } - if (((_0 = object.message) === null || _0 === void 0 ? void 0 : _0.$case) === "updateLayers" && ((_1 = object.message) === null || _1 === void 0 ? void 0 : _1.updateLayers) !== undefined && ((_2 = object.message) === null || _2 === void 0 ? void 0 : _2.updateLayers) !== null) { - message.message = { - $case: "updateLayers", - updateLayers: UpdateVideoLayers.fromPartial(object.message.updateLayers) - }; - } - if (((_3 = object.message) === null || _3 === void 0 ? void 0 : _3.$case) === "subscriptionPermission" && ((_4 = object.message) === null || _4 === void 0 ? void 0 : _4.subscriptionPermission) !== undefined && ((_5 = object.message) === null || _5 === void 0 ? void 0 : _5.subscriptionPermission) !== null) { - message.message = { - $case: "subscriptionPermission", - subscriptionPermission: SubscriptionPermission.fromPartial(object.message.subscriptionPermission) - }; - } - if (((_6 = object.message) === null || _6 === void 0 ? void 0 : _6.$case) === "syncState" && ((_7 = object.message) === null || _7 === void 0 ? void 0 : _7.syncState) !== undefined && ((_8 = object.message) === null || _8 === void 0 ? void 0 : _8.syncState) !== null) { - message.message = { - $case: "syncState", - syncState: SyncState.fromPartial(object.message.syncState) - }; - } - if (((_9 = object.message) === null || _9 === void 0 ? void 0 : _9.$case) === "simulate" && ((_10 = object.message) === null || _10 === void 0 ? void 0 : _10.simulate) !== undefined && ((_11 = object.message) === null || _11 === void 0 ? void 0 : _11.simulate) !== null) { - message.message = { - $case: "simulate", - simulate: SimulateScenario.fromPartial(object.message.simulate) - }; - } - if (((_12 = object.message) === null || _12 === void 0 ? void 0 : _12.$case) === "ping" && ((_13 = object.message) === null || _13 === void 0 ? void 0 : _13.ping) !== undefined && ((_14 = object.message) === null || _14 === void 0 ? void 0 : _14.ping) !== null) { - message.message = { - $case: "ping", - ping: object.message.ping - }; - } - if (((_15 = object.message) === null || _15 === void 0 ? void 0 : _15.$case) === "updateMetadata" && ((_16 = object.message) === null || _16 === void 0 ? void 0 : _16.updateMetadata) !== undefined && ((_17 = object.message) === null || _17 === void 0 ? void 0 : _17.updateMetadata) !== null) { - message.message = { - $case: "updateMetadata", - updateMetadata: UpdateParticipantMetadata.fromPartial(object.message.updateMetadata) - }; - } - if (((_18 = object.message) === null || _18 === void 0 ? void 0 : _18.$case) === "pingReq" && ((_19 = object.message) === null || _19 === void 0 ? void 0 : _19.pingReq) !== undefined && ((_20 = object.message) === null || _20 === void 0 ? void 0 : _20.pingReq) !== null) { - message.message = { - $case: "pingReq", - pingReq: Ping.fromPartial(object.message.pingReq) - }; - } - return message; - } -}; -function createBaseSignalResponse() { - return { - message: undefined - }; -} -const SignalResponse = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - var _a; - switch ((_a = message.message) === null || _a === void 0 ? void 0 : _a.$case) { - case "join": - JoinResponse.encode(message.message.join, writer.uint32(10).fork()).ldelim(); - break; - case "answer": - SessionDescription.encode(message.message.answer, writer.uint32(18).fork()).ldelim(); - break; - case "offer": - SessionDescription.encode(message.message.offer, writer.uint32(26).fork()).ldelim(); - break; - case "trickle": - TrickleRequest.encode(message.message.trickle, writer.uint32(34).fork()).ldelim(); - break; - case "update": - ParticipantUpdate.encode(message.message.update, writer.uint32(42).fork()).ldelim(); - break; - case "trackPublished": - TrackPublishedResponse.encode(message.message.trackPublished, writer.uint32(50).fork()).ldelim(); - break; - case "leave": - LeaveRequest.encode(message.message.leave, writer.uint32(66).fork()).ldelim(); - break; - case "mute": - MuteTrackRequest.encode(message.message.mute, writer.uint32(74).fork()).ldelim(); - break; - case "speakersChanged": - SpeakersChanged.encode(message.message.speakersChanged, writer.uint32(82).fork()).ldelim(); - break; - case "roomUpdate": - RoomUpdate.encode(message.message.roomUpdate, writer.uint32(90).fork()).ldelim(); - break; - case "connectionQuality": - ConnectionQualityUpdate.encode(message.message.connectionQuality, writer.uint32(98).fork()).ldelim(); - break; - case "streamStateUpdate": - StreamStateUpdate.encode(message.message.streamStateUpdate, writer.uint32(106).fork()).ldelim(); - break; - case "subscribedQualityUpdate": - SubscribedQualityUpdate.encode(message.message.subscribedQualityUpdate, writer.uint32(114).fork()).ldelim(); - break; - case "subscriptionPermissionUpdate": - SubscriptionPermissionUpdate.encode(message.message.subscriptionPermissionUpdate, writer.uint32(122).fork()).ldelim(); - break; - case "refreshToken": - writer.uint32(130).string(message.message.refreshToken); - break; - case "trackUnpublished": - TrackUnpublishedResponse.encode(message.message.trackUnpublished, writer.uint32(138).fork()).ldelim(); - break; - case "pong": - writer.uint32(144).int64(message.message.pong); - break; - case "reconnect": - ReconnectResponse.encode(message.message.reconnect, writer.uint32(154).fork()).ldelim(); - break; - case "pongResp": - Pong.encode(message.message.pongResp, writer.uint32(162).fork()).ldelim(); - break; - case "subscriptionResponse": - SubscriptionResponse.encode(message.message.subscriptionResponse, writer.uint32(170).fork()).ldelim(); - break; - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSignalResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.message = { - $case: "join", - join: JoinResponse.decode(reader, reader.uint32()) - }; - continue; - case 2: - if (tag !== 18) { - break; - } - message.message = { - $case: "answer", - answer: SessionDescription.decode(reader, reader.uint32()) - }; - continue; - case 3: - if (tag !== 26) { - break; - } - message.message = { - $case: "offer", - offer: SessionDescription.decode(reader, reader.uint32()) - }; - continue; - case 4: - if (tag !== 34) { - break; - } - message.message = { - $case: "trickle", - trickle: TrickleRequest.decode(reader, reader.uint32()) - }; - continue; - case 5: - if (tag !== 42) { - break; - } - message.message = { - $case: "update", - update: ParticipantUpdate.decode(reader, reader.uint32()) - }; - continue; - case 6: - if (tag !== 50) { - break; - } - message.message = { - $case: "trackPublished", - trackPublished: TrackPublishedResponse.decode(reader, reader.uint32()) - }; - continue; - case 8: - if (tag !== 66) { - break; - } - message.message = { - $case: "leave", - leave: LeaveRequest.decode(reader, reader.uint32()) - }; - continue; - case 9: - if (tag !== 74) { - break; - } - message.message = { - $case: "mute", - mute: MuteTrackRequest.decode(reader, reader.uint32()) - }; - continue; - case 10: - if (tag !== 82) { - break; - } - message.message = { - $case: "speakersChanged", - speakersChanged: SpeakersChanged.decode(reader, reader.uint32()) - }; - continue; - case 11: - if (tag !== 90) { - break; - } - message.message = { - $case: "roomUpdate", - roomUpdate: RoomUpdate.decode(reader, reader.uint32()) - }; - continue; - case 12: - if (tag !== 98) { - break; - } - message.message = { - $case: "connectionQuality", - connectionQuality: ConnectionQualityUpdate.decode(reader, reader.uint32()) - }; - continue; - case 13: - if (tag !== 106) { - break; - } - message.message = { - $case: "streamStateUpdate", - streamStateUpdate: StreamStateUpdate.decode(reader, reader.uint32()) - }; - continue; - case 14: - if (tag !== 114) { - break; - } - message.message = { - $case: "subscribedQualityUpdate", - subscribedQualityUpdate: SubscribedQualityUpdate.decode(reader, reader.uint32()) - }; - continue; - case 15: - if (tag !== 122) { - break; - } - message.message = { - $case: "subscriptionPermissionUpdate", - subscriptionPermissionUpdate: SubscriptionPermissionUpdate.decode(reader, reader.uint32()) - }; - continue; - case 16: - if (tag !== 130) { - break; - } - message.message = { - $case: "refreshToken", - refreshToken: reader.string() - }; - continue; - case 17: - if (tag !== 138) { - break; - } - message.message = { - $case: "trackUnpublished", - trackUnpublished: TrackUnpublishedResponse.decode(reader, reader.uint32()) - }; - continue; - case 18: - if (tag !== 144) { - break; - } - message.message = { - $case: "pong", - pong: longToNumber(reader.int64()) - }; - continue; - case 19: - if (tag !== 154) { - break; - } - message.message = { - $case: "reconnect", - reconnect: ReconnectResponse.decode(reader, reader.uint32()) - }; - continue; - case 20: - if (tag !== 162) { - break; - } - message.message = { - $case: "pongResp", - pongResp: Pong.decode(reader, reader.uint32()) - }; - continue; - case 21: - if (tag !== 170) { - break; - } - message.message = { - $case: "subscriptionResponse", - subscriptionResponse: SubscriptionResponse.decode(reader, reader.uint32()) - }; - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - message: isSet(object.join) ? { - $case: "join", - join: JoinResponse.fromJSON(object.join) - } : isSet(object.answer) ? { - $case: "answer", - answer: SessionDescription.fromJSON(object.answer) - } : isSet(object.offer) ? { - $case: "offer", - offer: SessionDescription.fromJSON(object.offer) - } : isSet(object.trickle) ? { - $case: "trickle", - trickle: TrickleRequest.fromJSON(object.trickle) - } : isSet(object.update) ? { - $case: "update", - update: ParticipantUpdate.fromJSON(object.update) - } : isSet(object.trackPublished) ? { - $case: "trackPublished", - trackPublished: TrackPublishedResponse.fromJSON(object.trackPublished) - } : isSet(object.leave) ? { - $case: "leave", - leave: LeaveRequest.fromJSON(object.leave) - } : isSet(object.mute) ? { - $case: "mute", - mute: MuteTrackRequest.fromJSON(object.mute) - } : isSet(object.speakersChanged) ? { - $case: "speakersChanged", - speakersChanged: SpeakersChanged.fromJSON(object.speakersChanged) - } : isSet(object.roomUpdate) ? { - $case: "roomUpdate", - roomUpdate: RoomUpdate.fromJSON(object.roomUpdate) - } : isSet(object.connectionQuality) ? { - $case: "connectionQuality", - connectionQuality: ConnectionQualityUpdate.fromJSON(object.connectionQuality) - } : isSet(object.streamStateUpdate) ? { - $case: "streamStateUpdate", - streamStateUpdate: StreamStateUpdate.fromJSON(object.streamStateUpdate) - } : isSet(object.subscribedQualityUpdate) ? { - $case: "subscribedQualityUpdate", - subscribedQualityUpdate: SubscribedQualityUpdate.fromJSON(object.subscribedQualityUpdate) - } : isSet(object.subscriptionPermissionUpdate) ? { - $case: "subscriptionPermissionUpdate", - subscriptionPermissionUpdate: SubscriptionPermissionUpdate.fromJSON(object.subscriptionPermissionUpdate) - } : isSet(object.refreshToken) ? { - $case: "refreshToken", - refreshToken: String(object.refreshToken) - } : isSet(object.trackUnpublished) ? { - $case: "trackUnpublished", - trackUnpublished: TrackUnpublishedResponse.fromJSON(object.trackUnpublished) - } : isSet(object.pong) ? { - $case: "pong", - pong: Number(object.pong) - } : isSet(object.reconnect) ? { - $case: "reconnect", - reconnect: ReconnectResponse.fromJSON(object.reconnect) - } : isSet(object.pongResp) ? { - $case: "pongResp", - pongResp: Pong.fromJSON(object.pongResp) - } : isSet(object.subscriptionResponse) ? { - $case: "subscriptionResponse", - subscriptionResponse: SubscriptionResponse.fromJSON(object.subscriptionResponse) - } : undefined - }; - }, - toJSON(message) { - var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33; - const obj = {}; - ((_a = message.message) === null || _a === void 0 ? void 0 : _a.$case) === "join" && (obj.join = ((_b = message.message) === null || _b === void 0 ? void 0 : _b.join) ? JoinResponse.toJSON((_c = message.message) === null || _c === void 0 ? void 0 : _c.join) : undefined); - ((_d = message.message) === null || _d === void 0 ? void 0 : _d.$case) === "answer" && (obj.answer = ((_e = message.message) === null || _e === void 0 ? void 0 : _e.answer) ? SessionDescription.toJSON((_f = message.message) === null || _f === void 0 ? void 0 : _f.answer) : undefined); - ((_g = message.message) === null || _g === void 0 ? void 0 : _g.$case) === "offer" && (obj.offer = ((_h = message.message) === null || _h === void 0 ? void 0 : _h.offer) ? SessionDescription.toJSON((_j = message.message) === null || _j === void 0 ? void 0 : _j.offer) : undefined); - ((_k = message.message) === null || _k === void 0 ? void 0 : _k.$case) === "trickle" && (obj.trickle = ((_l = message.message) === null || _l === void 0 ? void 0 : _l.trickle) ? TrickleRequest.toJSON((_m = message.message) === null || _m === void 0 ? void 0 : _m.trickle) : undefined); - ((_o = message.message) === null || _o === void 0 ? void 0 : _o.$case) === "update" && (obj.update = ((_p = message.message) === null || _p === void 0 ? void 0 : _p.update) ? ParticipantUpdate.toJSON((_q = message.message) === null || _q === void 0 ? void 0 : _q.update) : undefined); - ((_r = message.message) === null || _r === void 0 ? void 0 : _r.$case) === "trackPublished" && (obj.trackPublished = ((_s = message.message) === null || _s === void 0 ? void 0 : _s.trackPublished) ? TrackPublishedResponse.toJSON((_t = message.message) === null || _t === void 0 ? void 0 : _t.trackPublished) : undefined); - ((_u = message.message) === null || _u === void 0 ? void 0 : _u.$case) === "leave" && (obj.leave = ((_v = message.message) === null || _v === void 0 ? void 0 : _v.leave) ? LeaveRequest.toJSON((_w = message.message) === null || _w === void 0 ? void 0 : _w.leave) : undefined); - ((_x = message.message) === null || _x === void 0 ? void 0 : _x.$case) === "mute" && (obj.mute = ((_y = message.message) === null || _y === void 0 ? void 0 : _y.mute) ? MuteTrackRequest.toJSON((_z = message.message) === null || _z === void 0 ? void 0 : _z.mute) : undefined); - ((_0 = message.message) === null || _0 === void 0 ? void 0 : _0.$case) === "speakersChanged" && (obj.speakersChanged = ((_1 = message.message) === null || _1 === void 0 ? void 0 : _1.speakersChanged) ? SpeakersChanged.toJSON((_2 = message.message) === null || _2 === void 0 ? void 0 : _2.speakersChanged) : undefined); - ((_3 = message.message) === null || _3 === void 0 ? void 0 : _3.$case) === "roomUpdate" && (obj.roomUpdate = ((_4 = message.message) === null || _4 === void 0 ? void 0 : _4.roomUpdate) ? RoomUpdate.toJSON((_5 = message.message) === null || _5 === void 0 ? void 0 : _5.roomUpdate) : undefined); - ((_6 = message.message) === null || _6 === void 0 ? void 0 : _6.$case) === "connectionQuality" && (obj.connectionQuality = ((_7 = message.message) === null || _7 === void 0 ? void 0 : _7.connectionQuality) ? ConnectionQualityUpdate.toJSON((_8 = message.message) === null || _8 === void 0 ? void 0 : _8.connectionQuality) : undefined); - ((_9 = message.message) === null || _9 === void 0 ? void 0 : _9.$case) === "streamStateUpdate" && (obj.streamStateUpdate = ((_10 = message.message) === null || _10 === void 0 ? void 0 : _10.streamStateUpdate) ? StreamStateUpdate.toJSON((_11 = message.message) === null || _11 === void 0 ? void 0 : _11.streamStateUpdate) : undefined); - ((_12 = message.message) === null || _12 === void 0 ? void 0 : _12.$case) === "subscribedQualityUpdate" && (obj.subscribedQualityUpdate = ((_13 = message.message) === null || _13 === void 0 ? void 0 : _13.subscribedQualityUpdate) ? SubscribedQualityUpdate.toJSON((_14 = message.message) === null || _14 === void 0 ? void 0 : _14.subscribedQualityUpdate) : undefined); - ((_15 = message.message) === null || _15 === void 0 ? void 0 : _15.$case) === "subscriptionPermissionUpdate" && (obj.subscriptionPermissionUpdate = ((_16 = message.message) === null || _16 === void 0 ? void 0 : _16.subscriptionPermissionUpdate) ? SubscriptionPermissionUpdate.toJSON((_17 = message.message) === null || _17 === void 0 ? void 0 : _17.subscriptionPermissionUpdate) : undefined); - ((_18 = message.message) === null || _18 === void 0 ? void 0 : _18.$case) === "refreshToken" && (obj.refreshToken = (_19 = message.message) === null || _19 === void 0 ? void 0 : _19.refreshToken); - ((_20 = message.message) === null || _20 === void 0 ? void 0 : _20.$case) === "trackUnpublished" && (obj.trackUnpublished = ((_21 = message.message) === null || _21 === void 0 ? void 0 : _21.trackUnpublished) ? TrackUnpublishedResponse.toJSON((_22 = message.message) === null || _22 === void 0 ? void 0 : _22.trackUnpublished) : undefined); - ((_23 = message.message) === null || _23 === void 0 ? void 0 : _23.$case) === "pong" && (obj.pong = Math.round((_24 = message.message) === null || _24 === void 0 ? void 0 : _24.pong)); - ((_25 = message.message) === null || _25 === void 0 ? void 0 : _25.$case) === "reconnect" && (obj.reconnect = ((_26 = message.message) === null || _26 === void 0 ? void 0 : _26.reconnect) ? ReconnectResponse.toJSON((_27 = message.message) === null || _27 === void 0 ? void 0 : _27.reconnect) : undefined); - ((_28 = message.message) === null || _28 === void 0 ? void 0 : _28.$case) === "pongResp" && (obj.pongResp = ((_29 = message.message) === null || _29 === void 0 ? void 0 : _29.pongResp) ? Pong.toJSON((_30 = message.message) === null || _30 === void 0 ? void 0 : _30.pongResp) : undefined); - ((_31 = message.message) === null || _31 === void 0 ? void 0 : _31.$case) === "subscriptionResponse" && (obj.subscriptionResponse = ((_32 = message.message) === null || _32 === void 0 ? void 0 : _32.subscriptionResponse) ? SubscriptionResponse.toJSON((_33 = message.message) === null || _33 === void 0 ? void 0 : _33.subscriptionResponse) : undefined); - return obj; - }, - create(base) { - return SignalResponse.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35; - const message = createBaseSignalResponse(); - if (((_a = object.message) === null || _a === void 0 ? void 0 : _a.$case) === "join" && ((_b = object.message) === null || _b === void 0 ? void 0 : _b.join) !== undefined && ((_c = object.message) === null || _c === void 0 ? void 0 : _c.join) !== null) { - message.message = { - $case: "join", - join: JoinResponse.fromPartial(object.message.join) - }; - } - if (((_d = object.message) === null || _d === void 0 ? void 0 : _d.$case) === "answer" && ((_e = object.message) === null || _e === void 0 ? void 0 : _e.answer) !== undefined && ((_f = object.message) === null || _f === void 0 ? void 0 : _f.answer) !== null) { - message.message = { - $case: "answer", - answer: SessionDescription.fromPartial(object.message.answer) - }; - } - if (((_g = object.message) === null || _g === void 0 ? void 0 : _g.$case) === "offer" && ((_h = object.message) === null || _h === void 0 ? void 0 : _h.offer) !== undefined && ((_j = object.message) === null || _j === void 0 ? void 0 : _j.offer) !== null) { - message.message = { - $case: "offer", - offer: SessionDescription.fromPartial(object.message.offer) - }; - } - if (((_k = object.message) === null || _k === void 0 ? void 0 : _k.$case) === "trickle" && ((_l = object.message) === null || _l === void 0 ? void 0 : _l.trickle) !== undefined && ((_m = object.message) === null || _m === void 0 ? void 0 : _m.trickle) !== null) { - message.message = { - $case: "trickle", - trickle: TrickleRequest.fromPartial(object.message.trickle) - }; - } - if (((_o = object.message) === null || _o === void 0 ? void 0 : _o.$case) === "update" && ((_p = object.message) === null || _p === void 0 ? void 0 : _p.update) !== undefined && ((_q = object.message) === null || _q === void 0 ? void 0 : _q.update) !== null) { - message.message = { - $case: "update", - update: ParticipantUpdate.fromPartial(object.message.update) - }; - } - if (((_r = object.message) === null || _r === void 0 ? void 0 : _r.$case) === "trackPublished" && ((_s = object.message) === null || _s === void 0 ? void 0 : _s.trackPublished) !== undefined && ((_t = object.message) === null || _t === void 0 ? void 0 : _t.trackPublished) !== null) { - message.message = { - $case: "trackPublished", - trackPublished: TrackPublishedResponse.fromPartial(object.message.trackPublished) - }; - } - if (((_u = object.message) === null || _u === void 0 ? void 0 : _u.$case) === "leave" && ((_v = object.message) === null || _v === void 0 ? void 0 : _v.leave) !== undefined && ((_w = object.message) === null || _w === void 0 ? void 0 : _w.leave) !== null) { - message.message = { - $case: "leave", - leave: LeaveRequest.fromPartial(object.message.leave) - }; - } - if (((_x = object.message) === null || _x === void 0 ? void 0 : _x.$case) === "mute" && ((_y = object.message) === null || _y === void 0 ? void 0 : _y.mute) !== undefined && ((_z = object.message) === null || _z === void 0 ? void 0 : _z.mute) !== null) { - message.message = { - $case: "mute", - mute: MuteTrackRequest.fromPartial(object.message.mute) - }; - } - if (((_0 = object.message) === null || _0 === void 0 ? void 0 : _0.$case) === "speakersChanged" && ((_1 = object.message) === null || _1 === void 0 ? void 0 : _1.speakersChanged) !== undefined && ((_2 = object.message) === null || _2 === void 0 ? void 0 : _2.speakersChanged) !== null) { - message.message = { - $case: "speakersChanged", - speakersChanged: SpeakersChanged.fromPartial(object.message.speakersChanged) - }; - } - if (((_3 = object.message) === null || _3 === void 0 ? void 0 : _3.$case) === "roomUpdate" && ((_4 = object.message) === null || _4 === void 0 ? void 0 : _4.roomUpdate) !== undefined && ((_5 = object.message) === null || _5 === void 0 ? void 0 : _5.roomUpdate) !== null) { - message.message = { - $case: "roomUpdate", - roomUpdate: RoomUpdate.fromPartial(object.message.roomUpdate) - }; - } - if (((_6 = object.message) === null || _6 === void 0 ? void 0 : _6.$case) === "connectionQuality" && ((_7 = object.message) === null || _7 === void 0 ? void 0 : _7.connectionQuality) !== undefined && ((_8 = object.message) === null || _8 === void 0 ? void 0 : _8.connectionQuality) !== null) { - message.message = { - $case: "connectionQuality", - connectionQuality: ConnectionQualityUpdate.fromPartial(object.message.connectionQuality) - }; - } - if (((_9 = object.message) === null || _9 === void 0 ? void 0 : _9.$case) === "streamStateUpdate" && ((_10 = object.message) === null || _10 === void 0 ? void 0 : _10.streamStateUpdate) !== undefined && ((_11 = object.message) === null || _11 === void 0 ? void 0 : _11.streamStateUpdate) !== null) { - message.message = { - $case: "streamStateUpdate", - streamStateUpdate: StreamStateUpdate.fromPartial(object.message.streamStateUpdate) - }; - } - if (((_12 = object.message) === null || _12 === void 0 ? void 0 : _12.$case) === "subscribedQualityUpdate" && ((_13 = object.message) === null || _13 === void 0 ? void 0 : _13.subscribedQualityUpdate) !== undefined && ((_14 = object.message) === null || _14 === void 0 ? void 0 : _14.subscribedQualityUpdate) !== null) { - message.message = { - $case: "subscribedQualityUpdate", - subscribedQualityUpdate: SubscribedQualityUpdate.fromPartial(object.message.subscribedQualityUpdate) - }; - } - if (((_15 = object.message) === null || _15 === void 0 ? void 0 : _15.$case) === "subscriptionPermissionUpdate" && ((_16 = object.message) === null || _16 === void 0 ? void 0 : _16.subscriptionPermissionUpdate) !== undefined && ((_17 = object.message) === null || _17 === void 0 ? void 0 : _17.subscriptionPermissionUpdate) !== null) { - message.message = { - $case: "subscriptionPermissionUpdate", - subscriptionPermissionUpdate: SubscriptionPermissionUpdate.fromPartial(object.message.subscriptionPermissionUpdate) - }; - } - if (((_18 = object.message) === null || _18 === void 0 ? void 0 : _18.$case) === "refreshToken" && ((_19 = object.message) === null || _19 === void 0 ? void 0 : _19.refreshToken) !== undefined && ((_20 = object.message) === null || _20 === void 0 ? void 0 : _20.refreshToken) !== null) { - message.message = { - $case: "refreshToken", - refreshToken: object.message.refreshToken - }; - } - if (((_21 = object.message) === null || _21 === void 0 ? void 0 : _21.$case) === "trackUnpublished" && ((_22 = object.message) === null || _22 === void 0 ? void 0 : _22.trackUnpublished) !== undefined && ((_23 = object.message) === null || _23 === void 0 ? void 0 : _23.trackUnpublished) !== null) { - message.message = { - $case: "trackUnpublished", - trackUnpublished: TrackUnpublishedResponse.fromPartial(object.message.trackUnpublished) - }; - } - if (((_24 = object.message) === null || _24 === void 0 ? void 0 : _24.$case) === "pong" && ((_25 = object.message) === null || _25 === void 0 ? void 0 : _25.pong) !== undefined && ((_26 = object.message) === null || _26 === void 0 ? void 0 : _26.pong) !== null) { - message.message = { - $case: "pong", - pong: object.message.pong - }; - } - if (((_27 = object.message) === null || _27 === void 0 ? void 0 : _27.$case) === "reconnect" && ((_28 = object.message) === null || _28 === void 0 ? void 0 : _28.reconnect) !== undefined && ((_29 = object.message) === null || _29 === void 0 ? void 0 : _29.reconnect) !== null) { - message.message = { - $case: "reconnect", - reconnect: ReconnectResponse.fromPartial(object.message.reconnect) - }; - } - if (((_30 = object.message) === null || _30 === void 0 ? void 0 : _30.$case) === "pongResp" && ((_31 = object.message) === null || _31 === void 0 ? void 0 : _31.pongResp) !== undefined && ((_32 = object.message) === null || _32 === void 0 ? void 0 : _32.pongResp) !== null) { - message.message = { - $case: "pongResp", - pongResp: Pong.fromPartial(object.message.pongResp) - }; - } - if (((_33 = object.message) === null || _33 === void 0 ? void 0 : _33.$case) === "subscriptionResponse" && ((_34 = object.message) === null || _34 === void 0 ? void 0 : _34.subscriptionResponse) !== undefined && ((_35 = object.message) === null || _35 === void 0 ? void 0 : _35.subscriptionResponse) !== null) { - message.message = { - $case: "subscriptionResponse", - subscriptionResponse: SubscriptionResponse.fromPartial(object.message.subscriptionResponse) - }; - } - return message; - } -}; -function createBaseSimulcastCodec() { - return { - codec: "", - cid: "", - enableSimulcastLayers: false - }; -} -const SimulcastCodec = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.codec !== "") { - writer.uint32(10).string(message.codec); - } - if (message.cid !== "") { - writer.uint32(18).string(message.cid); - } - if (message.enableSimulcastLayers === true) { - writer.uint32(24).bool(message.enableSimulcastLayers); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSimulcastCodec(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.codec = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - message.cid = reader.string(); - continue; - case 3: - if (tag !== 24) { - break; - } - message.enableSimulcastLayers = reader.bool(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - codec: isSet(object.codec) ? String(object.codec) : "", - cid: isSet(object.cid) ? String(object.cid) : "", - enableSimulcastLayers: isSet(object.enableSimulcastLayers) ? Boolean(object.enableSimulcastLayers) : false - }; - }, - toJSON(message) { - const obj = {}; - message.codec !== undefined && (obj.codec = message.codec); - message.cid !== undefined && (obj.cid = message.cid); - message.enableSimulcastLayers !== undefined && (obj.enableSimulcastLayers = message.enableSimulcastLayers); - return obj; - }, - create(base) { - return SimulcastCodec.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c; - const message = createBaseSimulcastCodec(); - message.codec = (_a = object.codec) !== null && _a !== void 0 ? _a : ""; - message.cid = (_b = object.cid) !== null && _b !== void 0 ? _b : ""; - message.enableSimulcastLayers = (_c = object.enableSimulcastLayers) !== null && _c !== void 0 ? _c : false; - return message; - } -}; -function createBaseAddTrackRequest() { - return { - cid: "", - name: "", - type: 0, - width: 0, - height: 0, - muted: false, - disableDtx: false, - source: 0, - layers: [], - simulcastCodecs: [], - sid: "", - stereo: false, - disableRed: false, - encryption: 0 - }; -} -const AddTrackRequest = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.cid !== "") { - writer.uint32(10).string(message.cid); - } - if (message.name !== "") { - writer.uint32(18).string(message.name); - } - if (message.type !== 0) { - writer.uint32(24).int32(message.type); - } - if (message.width !== 0) { - writer.uint32(32).uint32(message.width); - } - if (message.height !== 0) { - writer.uint32(40).uint32(message.height); - } - if (message.muted === true) { - writer.uint32(48).bool(message.muted); - } - if (message.disableDtx === true) { - writer.uint32(56).bool(message.disableDtx); - } - if (message.source !== 0) { - writer.uint32(64).int32(message.source); - } - for (const v of message.layers) { - VideoLayer.encode(v, writer.uint32(74).fork()).ldelim(); - } - for (const v of message.simulcastCodecs) { - SimulcastCodec.encode(v, writer.uint32(82).fork()).ldelim(); - } - if (message.sid !== "") { - writer.uint32(90).string(message.sid); - } - if (message.stereo === true) { - writer.uint32(96).bool(message.stereo); - } - if (message.disableRed === true) { - writer.uint32(104).bool(message.disableRed); - } - if (message.encryption !== 0) { - writer.uint32(112).int32(message.encryption); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseAddTrackRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.cid = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - message.name = reader.string(); - continue; - case 3: - if (tag !== 24) { - break; - } - message.type = reader.int32(); - continue; - case 4: - if (tag !== 32) { - break; - } - message.width = reader.uint32(); - continue; - case 5: - if (tag !== 40) { - break; - } - message.height = reader.uint32(); - continue; - case 6: - if (tag !== 48) { - break; - } - message.muted = reader.bool(); - continue; - case 7: - if (tag !== 56) { - break; - } - message.disableDtx = reader.bool(); - continue; - case 8: - if (tag !== 64) { - break; - } - message.source = reader.int32(); - continue; - case 9: - if (tag !== 74) { - break; - } - message.layers.push(VideoLayer.decode(reader, reader.uint32())); - continue; - case 10: - if (tag !== 82) { - break; - } - message.simulcastCodecs.push(SimulcastCodec.decode(reader, reader.uint32())); - continue; - case 11: - if (tag !== 90) { - break; - } - message.sid = reader.string(); - continue; - case 12: - if (tag !== 96) { - break; - } - message.stereo = reader.bool(); - continue; - case 13: - if (tag !== 104) { - break; - } - message.disableRed = reader.bool(); - continue; - case 14: - if (tag !== 112) { - break; - } - message.encryption = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - cid: isSet(object.cid) ? String(object.cid) : "", - name: isSet(object.name) ? String(object.name) : "", - type: isSet(object.type) ? trackTypeFromJSON(object.type) : 0, - width: isSet(object.width) ? Number(object.width) : 0, - height: isSet(object.height) ? Number(object.height) : 0, - muted: isSet(object.muted) ? Boolean(object.muted) : false, - disableDtx: isSet(object.disableDtx) ? Boolean(object.disableDtx) : false, - source: isSet(object.source) ? trackSourceFromJSON(object.source) : 0, - layers: Array.isArray(object === null || object === void 0 ? void 0 : object.layers) ? object.layers.map(e => VideoLayer.fromJSON(e)) : [], - simulcastCodecs: Array.isArray(object === null || object === void 0 ? void 0 : object.simulcastCodecs) ? object.simulcastCodecs.map(e => SimulcastCodec.fromJSON(e)) : [], - sid: isSet(object.sid) ? String(object.sid) : "", - stereo: isSet(object.stereo) ? Boolean(object.stereo) : false, - disableRed: isSet(object.disableRed) ? Boolean(object.disableRed) : false, - encryption: isSet(object.encryption) ? encryption_TypeFromJSON(object.encryption) : 0 - }; - }, - toJSON(message) { - const obj = {}; - message.cid !== undefined && (obj.cid = message.cid); - message.name !== undefined && (obj.name = message.name); - message.type !== undefined && (obj.type = trackTypeToJSON(message.type)); - message.width !== undefined && (obj.width = Math.round(message.width)); - message.height !== undefined && (obj.height = Math.round(message.height)); - message.muted !== undefined && (obj.muted = message.muted); - message.disableDtx !== undefined && (obj.disableDtx = message.disableDtx); - message.source !== undefined && (obj.source = trackSourceToJSON(message.source)); - if (message.layers) { - obj.layers = message.layers.map(e => e ? VideoLayer.toJSON(e) : undefined); - } else { - obj.layers = []; - } - if (message.simulcastCodecs) { - obj.simulcastCodecs = message.simulcastCodecs.map(e => e ? SimulcastCodec.toJSON(e) : undefined); - } else { - obj.simulcastCodecs = []; - } - message.sid !== undefined && (obj.sid = message.sid); - message.stereo !== undefined && (obj.stereo = message.stereo); - message.disableRed !== undefined && (obj.disableRed = message.disableRed); - message.encryption !== undefined && (obj.encryption = encryption_TypeToJSON(message.encryption)); - return obj; - }, - create(base) { - return AddTrackRequest.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p; - const message = createBaseAddTrackRequest(); - message.cid = (_a = object.cid) !== null && _a !== void 0 ? _a : ""; - message.name = (_b = object.name) !== null && _b !== void 0 ? _b : ""; - message.type = (_c = object.type) !== null && _c !== void 0 ? _c : 0; - message.width = (_d = object.width) !== null && _d !== void 0 ? _d : 0; - message.height = (_e = object.height) !== null && _e !== void 0 ? _e : 0; - message.muted = (_f = object.muted) !== null && _f !== void 0 ? _f : false; - message.disableDtx = (_g = object.disableDtx) !== null && _g !== void 0 ? _g : false; - message.source = (_h = object.source) !== null && _h !== void 0 ? _h : 0; - message.layers = ((_j = object.layers) === null || _j === void 0 ? void 0 : _j.map(e => VideoLayer.fromPartial(e))) || []; - message.simulcastCodecs = ((_k = object.simulcastCodecs) === null || _k === void 0 ? void 0 : _k.map(e => SimulcastCodec.fromPartial(e))) || []; - message.sid = (_l = object.sid) !== null && _l !== void 0 ? _l : ""; - message.stereo = (_m = object.stereo) !== null && _m !== void 0 ? _m : false; - message.disableRed = (_o = object.disableRed) !== null && _o !== void 0 ? _o : false; - message.encryption = (_p = object.encryption) !== null && _p !== void 0 ? _p : 0; - return message; - } -}; -function createBaseTrickleRequest() { - return { - candidateInit: "", - target: 0 - }; -} -const TrickleRequest = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.candidateInit !== "") { - writer.uint32(10).string(message.candidateInit); - } - if (message.target !== 0) { - writer.uint32(16).int32(message.target); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTrickleRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.candidateInit = reader.string(); - continue; - case 2: - if (tag !== 16) { - break; - } - message.target = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - candidateInit: isSet(object.candidateInit) ? String(object.candidateInit) : "", - target: isSet(object.target) ? signalTargetFromJSON(object.target) : 0 - }; - }, - toJSON(message) { - const obj = {}; - message.candidateInit !== undefined && (obj.candidateInit = message.candidateInit); - message.target !== undefined && (obj.target = signalTargetToJSON(message.target)); - return obj; - }, - create(base) { - return TrickleRequest.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b; - const message = createBaseTrickleRequest(); - message.candidateInit = (_a = object.candidateInit) !== null && _a !== void 0 ? _a : ""; - message.target = (_b = object.target) !== null && _b !== void 0 ? _b : 0; - return message; - } -}; -function createBaseMuteTrackRequest() { - return { - sid: "", - muted: false - }; -} -const MuteTrackRequest = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.sid !== "") { - writer.uint32(10).string(message.sid); - } - if (message.muted === true) { - writer.uint32(16).bool(message.muted); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseMuteTrackRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.sid = reader.string(); - continue; - case 2: - if (tag !== 16) { - break; - } - message.muted = reader.bool(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - sid: isSet(object.sid) ? String(object.sid) : "", - muted: isSet(object.muted) ? Boolean(object.muted) : false - }; - }, - toJSON(message) { - const obj = {}; - message.sid !== undefined && (obj.sid = message.sid); - message.muted !== undefined && (obj.muted = message.muted); - return obj; - }, - create(base) { - return MuteTrackRequest.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b; - const message = createBaseMuteTrackRequest(); - message.sid = (_a = object.sid) !== null && _a !== void 0 ? _a : ""; - message.muted = (_b = object.muted) !== null && _b !== void 0 ? _b : false; - return message; - } -}; -function createBaseJoinResponse() { - return { - room: undefined, - participant: undefined, - otherParticipants: [], - serverVersion: "", - iceServers: [], - subscriberPrimary: false, - alternativeUrl: "", - clientConfiguration: undefined, - serverRegion: "", - pingTimeout: 0, - pingInterval: 0, - serverInfo: undefined, - sifTrailer: new Uint8Array() - }; -} -const JoinResponse = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.room !== undefined) { - Room$1.encode(message.room, writer.uint32(10).fork()).ldelim(); - } - if (message.participant !== undefined) { - ParticipantInfo.encode(message.participant, writer.uint32(18).fork()).ldelim(); - } - for (const v of message.otherParticipants) { - ParticipantInfo.encode(v, writer.uint32(26).fork()).ldelim(); - } - if (message.serverVersion !== "") { - writer.uint32(34).string(message.serverVersion); - } - for (const v of message.iceServers) { - ICEServer.encode(v, writer.uint32(42).fork()).ldelim(); - } - if (message.subscriberPrimary === true) { - writer.uint32(48).bool(message.subscriberPrimary); - } - if (message.alternativeUrl !== "") { - writer.uint32(58).string(message.alternativeUrl); - } - if (message.clientConfiguration !== undefined) { - ClientConfiguration.encode(message.clientConfiguration, writer.uint32(66).fork()).ldelim(); - } - if (message.serverRegion !== "") { - writer.uint32(74).string(message.serverRegion); - } - if (message.pingTimeout !== 0) { - writer.uint32(80).int32(message.pingTimeout); - } - if (message.pingInterval !== 0) { - writer.uint32(88).int32(message.pingInterval); - } - if (message.serverInfo !== undefined) { - ServerInfo.encode(message.serverInfo, writer.uint32(98).fork()).ldelim(); - } - if (message.sifTrailer.length !== 0) { - writer.uint32(106).bytes(message.sifTrailer); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseJoinResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.room = Room$1.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - message.participant = ParticipantInfo.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 26) { - break; - } - message.otherParticipants.push(ParticipantInfo.decode(reader, reader.uint32())); - continue; - case 4: - if (tag !== 34) { - break; - } - message.serverVersion = reader.string(); - continue; - case 5: - if (tag !== 42) { - break; - } - message.iceServers.push(ICEServer.decode(reader, reader.uint32())); - continue; - case 6: - if (tag !== 48) { - break; - } - message.subscriberPrimary = reader.bool(); - continue; - case 7: - if (tag !== 58) { - break; - } - message.alternativeUrl = reader.string(); - continue; - case 8: - if (tag !== 66) { - break; - } - message.clientConfiguration = ClientConfiguration.decode(reader, reader.uint32()); - continue; - case 9: - if (tag !== 74) { - break; - } - message.serverRegion = reader.string(); - continue; - case 10: - if (tag !== 80) { - break; - } - message.pingTimeout = reader.int32(); - continue; - case 11: - if (tag !== 88) { - break; - } - message.pingInterval = reader.int32(); - continue; - case 12: - if (tag !== 98) { - break; - } - message.serverInfo = ServerInfo.decode(reader, reader.uint32()); - continue; - case 13: - if (tag !== 106) { - break; - } - message.sifTrailer = reader.bytes(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - room: isSet(object.room) ? Room$1.fromJSON(object.room) : undefined, - participant: isSet(object.participant) ? ParticipantInfo.fromJSON(object.participant) : undefined, - otherParticipants: Array.isArray(object === null || object === void 0 ? void 0 : object.otherParticipants) ? object.otherParticipants.map(e => ParticipantInfo.fromJSON(e)) : [], - serverVersion: isSet(object.serverVersion) ? String(object.serverVersion) : "", - iceServers: Array.isArray(object === null || object === void 0 ? void 0 : object.iceServers) ? object.iceServers.map(e => ICEServer.fromJSON(e)) : [], - subscriberPrimary: isSet(object.subscriberPrimary) ? Boolean(object.subscriberPrimary) : false, - alternativeUrl: isSet(object.alternativeUrl) ? String(object.alternativeUrl) : "", - clientConfiguration: isSet(object.clientConfiguration) ? ClientConfiguration.fromJSON(object.clientConfiguration) : undefined, - serverRegion: isSet(object.serverRegion) ? String(object.serverRegion) : "", - pingTimeout: isSet(object.pingTimeout) ? Number(object.pingTimeout) : 0, - pingInterval: isSet(object.pingInterval) ? Number(object.pingInterval) : 0, - serverInfo: isSet(object.serverInfo) ? ServerInfo.fromJSON(object.serverInfo) : undefined, - sifTrailer: isSet(object.sifTrailer) ? bytesFromBase64(object.sifTrailer) : new Uint8Array() - }; - }, - toJSON(message) { - const obj = {}; - message.room !== undefined && (obj.room = message.room ? Room$1.toJSON(message.room) : undefined); - message.participant !== undefined && (obj.participant = message.participant ? ParticipantInfo.toJSON(message.participant) : undefined); - if (message.otherParticipants) { - obj.otherParticipants = message.otherParticipants.map(e => e ? ParticipantInfo.toJSON(e) : undefined); - } else { - obj.otherParticipants = []; - } - message.serverVersion !== undefined && (obj.serverVersion = message.serverVersion); - if (message.iceServers) { - obj.iceServers = message.iceServers.map(e => e ? ICEServer.toJSON(e) : undefined); - } else { - obj.iceServers = []; - } - message.subscriberPrimary !== undefined && (obj.subscriberPrimary = message.subscriberPrimary); - message.alternativeUrl !== undefined && (obj.alternativeUrl = message.alternativeUrl); - message.clientConfiguration !== undefined && (obj.clientConfiguration = message.clientConfiguration ? ClientConfiguration.toJSON(message.clientConfiguration) : undefined); - message.serverRegion !== undefined && (obj.serverRegion = message.serverRegion); - message.pingTimeout !== undefined && (obj.pingTimeout = Math.round(message.pingTimeout)); - message.pingInterval !== undefined && (obj.pingInterval = Math.round(message.pingInterval)); - message.serverInfo !== undefined && (obj.serverInfo = message.serverInfo ? ServerInfo.toJSON(message.serverInfo) : undefined); - message.sifTrailer !== undefined && (obj.sifTrailer = base64FromBytes(message.sifTrailer !== undefined ? message.sifTrailer : new Uint8Array())); - return obj; - }, - create(base) { - return JoinResponse.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c, _d, _e, _f, _g, _h, _j; - const message = createBaseJoinResponse(); - message.room = object.room !== undefined && object.room !== null ? Room$1.fromPartial(object.room) : undefined; - message.participant = object.participant !== undefined && object.participant !== null ? ParticipantInfo.fromPartial(object.participant) : undefined; - message.otherParticipants = ((_a = object.otherParticipants) === null || _a === void 0 ? void 0 : _a.map(e => ParticipantInfo.fromPartial(e))) || []; - message.serverVersion = (_b = object.serverVersion) !== null && _b !== void 0 ? _b : ""; - message.iceServers = ((_c = object.iceServers) === null || _c === void 0 ? void 0 : _c.map(e => ICEServer.fromPartial(e))) || []; - message.subscriberPrimary = (_d = object.subscriberPrimary) !== null && _d !== void 0 ? _d : false; - message.alternativeUrl = (_e = object.alternativeUrl) !== null && _e !== void 0 ? _e : ""; - message.clientConfiguration = object.clientConfiguration !== undefined && object.clientConfiguration !== null ? ClientConfiguration.fromPartial(object.clientConfiguration) : undefined; - message.serverRegion = (_f = object.serverRegion) !== null && _f !== void 0 ? _f : ""; - message.pingTimeout = (_g = object.pingTimeout) !== null && _g !== void 0 ? _g : 0; - message.pingInterval = (_h = object.pingInterval) !== null && _h !== void 0 ? _h : 0; - message.serverInfo = object.serverInfo !== undefined && object.serverInfo !== null ? ServerInfo.fromPartial(object.serverInfo) : undefined; - message.sifTrailer = (_j = object.sifTrailer) !== null && _j !== void 0 ? _j : new Uint8Array(); - return message; - } -}; -function createBaseReconnectResponse() { - return { - iceServers: [], - clientConfiguration: undefined - }; -} -const ReconnectResponse = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - for (const v of message.iceServers) { - ICEServer.encode(v, writer.uint32(10).fork()).ldelim(); - } - if (message.clientConfiguration !== undefined) { - ClientConfiguration.encode(message.clientConfiguration, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseReconnectResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.iceServers.push(ICEServer.decode(reader, reader.uint32())); - continue; - case 2: - if (tag !== 18) { - break; - } - message.clientConfiguration = ClientConfiguration.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - iceServers: Array.isArray(object === null || object === void 0 ? void 0 : object.iceServers) ? object.iceServers.map(e => ICEServer.fromJSON(e)) : [], - clientConfiguration: isSet(object.clientConfiguration) ? ClientConfiguration.fromJSON(object.clientConfiguration) : undefined - }; - }, - toJSON(message) { - const obj = {}; - if (message.iceServers) { - obj.iceServers = message.iceServers.map(e => e ? ICEServer.toJSON(e) : undefined); - } else { - obj.iceServers = []; - } - message.clientConfiguration !== undefined && (obj.clientConfiguration = message.clientConfiguration ? ClientConfiguration.toJSON(message.clientConfiguration) : undefined); - return obj; - }, - create(base) { - return ReconnectResponse.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a; - const message = createBaseReconnectResponse(); - message.iceServers = ((_a = object.iceServers) === null || _a === void 0 ? void 0 : _a.map(e => ICEServer.fromPartial(e))) || []; - message.clientConfiguration = object.clientConfiguration !== undefined && object.clientConfiguration !== null ? ClientConfiguration.fromPartial(object.clientConfiguration) : undefined; - return message; - } -}; -function createBaseTrackPublishedResponse() { - return { - cid: "", - track: undefined - }; -} -const TrackPublishedResponse = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.cid !== "") { - writer.uint32(10).string(message.cid); - } - if (message.track !== undefined) { - TrackInfo.encode(message.track, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTrackPublishedResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.cid = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - message.track = TrackInfo.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - cid: isSet(object.cid) ? String(object.cid) : "", - track: isSet(object.track) ? TrackInfo.fromJSON(object.track) : undefined - }; - }, - toJSON(message) { - const obj = {}; - message.cid !== undefined && (obj.cid = message.cid); - message.track !== undefined && (obj.track = message.track ? TrackInfo.toJSON(message.track) : undefined); - return obj; - }, - create(base) { - return TrackPublishedResponse.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a; - const message = createBaseTrackPublishedResponse(); - message.cid = (_a = object.cid) !== null && _a !== void 0 ? _a : ""; - message.track = object.track !== undefined && object.track !== null ? TrackInfo.fromPartial(object.track) : undefined; - return message; - } -}; -function createBaseTrackUnpublishedResponse() { - return { - trackSid: "" - }; -} -const TrackUnpublishedResponse = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.trackSid !== "") { - writer.uint32(10).string(message.trackSid); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTrackUnpublishedResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.trackSid = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - trackSid: isSet(object.trackSid) ? String(object.trackSid) : "" - }; - }, - toJSON(message) { - const obj = {}; - message.trackSid !== undefined && (obj.trackSid = message.trackSid); - return obj; - }, - create(base) { - return TrackUnpublishedResponse.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a; - const message = createBaseTrackUnpublishedResponse(); - message.trackSid = (_a = object.trackSid) !== null && _a !== void 0 ? _a : ""; - return message; - } -}; -function createBaseSessionDescription() { - return { - type: "", - sdp: "" - }; -} -const SessionDescription = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.type !== "") { - writer.uint32(10).string(message.type); - } - if (message.sdp !== "") { - writer.uint32(18).string(message.sdp); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSessionDescription(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.type = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - message.sdp = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - type: isSet(object.type) ? String(object.type) : "", - sdp: isSet(object.sdp) ? String(object.sdp) : "" - }; - }, - toJSON(message) { - const obj = {}; - message.type !== undefined && (obj.type = message.type); - message.sdp !== undefined && (obj.sdp = message.sdp); - return obj; - }, - create(base) { - return SessionDescription.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b; - const message = createBaseSessionDescription(); - message.type = (_a = object.type) !== null && _a !== void 0 ? _a : ""; - message.sdp = (_b = object.sdp) !== null && _b !== void 0 ? _b : ""; - return message; - } -}; -function createBaseParticipantUpdate() { - return { - participants: [] - }; -} -const ParticipantUpdate = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - for (const v of message.participants) { - ParticipantInfo.encode(v, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseParticipantUpdate(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.participants.push(ParticipantInfo.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - participants: Array.isArray(object === null || object === void 0 ? void 0 : object.participants) ? object.participants.map(e => ParticipantInfo.fromJSON(e)) : [] - }; - }, - toJSON(message) { - const obj = {}; - if (message.participants) { - obj.participants = message.participants.map(e => e ? ParticipantInfo.toJSON(e) : undefined); - } else { - obj.participants = []; - } - return obj; - }, - create(base) { - return ParticipantUpdate.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a; - const message = createBaseParticipantUpdate(); - message.participants = ((_a = object.participants) === null || _a === void 0 ? void 0 : _a.map(e => ParticipantInfo.fromPartial(e))) || []; - return message; - } -}; -function createBaseUpdateSubscription() { - return { - trackSids: [], - subscribe: false, - participantTracks: [] - }; -} -const UpdateSubscription = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - for (const v of message.trackSids) { - writer.uint32(10).string(v); - } - if (message.subscribe === true) { - writer.uint32(16).bool(message.subscribe); - } - for (const v of message.participantTracks) { - ParticipantTracks.encode(v, writer.uint32(26).fork()).ldelim(); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUpdateSubscription(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.trackSids.push(reader.string()); - continue; - case 2: - if (tag !== 16) { - break; - } - message.subscribe = reader.bool(); - continue; - case 3: - if (tag !== 26) { - break; - } - message.participantTracks.push(ParticipantTracks.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - trackSids: Array.isArray(object === null || object === void 0 ? void 0 : object.trackSids) ? object.trackSids.map(e => String(e)) : [], - subscribe: isSet(object.subscribe) ? Boolean(object.subscribe) : false, - participantTracks: Array.isArray(object === null || object === void 0 ? void 0 : object.participantTracks) ? object.participantTracks.map(e => ParticipantTracks.fromJSON(e)) : [] - }; - }, - toJSON(message) { - const obj = {}; - if (message.trackSids) { - obj.trackSids = message.trackSids.map(e => e); - } else { - obj.trackSids = []; - } - message.subscribe !== undefined && (obj.subscribe = message.subscribe); - if (message.participantTracks) { - obj.participantTracks = message.participantTracks.map(e => e ? ParticipantTracks.toJSON(e) : undefined); - } else { - obj.participantTracks = []; - } - return obj; - }, - create(base) { - return UpdateSubscription.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c; - const message = createBaseUpdateSubscription(); - message.trackSids = ((_a = object.trackSids) === null || _a === void 0 ? void 0 : _a.map(e => e)) || []; - message.subscribe = (_b = object.subscribe) !== null && _b !== void 0 ? _b : false; - message.participantTracks = ((_c = object.participantTracks) === null || _c === void 0 ? void 0 : _c.map(e => ParticipantTracks.fromPartial(e))) || []; - return message; - } -}; -function createBaseUpdateTrackSettings() { - return { - trackSids: [], - disabled: false, - quality: 0, - width: 0, - height: 0, - fps: 0, - priority: 0 - }; -} -const UpdateTrackSettings = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - for (const v of message.trackSids) { - writer.uint32(10).string(v); - } - if (message.disabled === true) { - writer.uint32(24).bool(message.disabled); - } - if (message.quality !== 0) { - writer.uint32(32).int32(message.quality); - } - if (message.width !== 0) { - writer.uint32(40).uint32(message.width); - } - if (message.height !== 0) { - writer.uint32(48).uint32(message.height); - } - if (message.fps !== 0) { - writer.uint32(56).uint32(message.fps); - } - if (message.priority !== 0) { - writer.uint32(64).uint32(message.priority); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUpdateTrackSettings(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.trackSids.push(reader.string()); - continue; - case 3: - if (tag !== 24) { - break; - } - message.disabled = reader.bool(); - continue; - case 4: - if (tag !== 32) { - break; - } - message.quality = reader.int32(); - continue; - case 5: - if (tag !== 40) { - break; - } - message.width = reader.uint32(); - continue; - case 6: - if (tag !== 48) { - break; - } - message.height = reader.uint32(); - continue; - case 7: - if (tag !== 56) { - break; - } - message.fps = reader.uint32(); - continue; - case 8: - if (tag !== 64) { - break; - } - message.priority = reader.uint32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - trackSids: Array.isArray(object === null || object === void 0 ? void 0 : object.trackSids) ? object.trackSids.map(e => String(e)) : [], - disabled: isSet(object.disabled) ? Boolean(object.disabled) : false, - quality: isSet(object.quality) ? videoQualityFromJSON(object.quality) : 0, - width: isSet(object.width) ? Number(object.width) : 0, - height: isSet(object.height) ? Number(object.height) : 0, - fps: isSet(object.fps) ? Number(object.fps) : 0, - priority: isSet(object.priority) ? Number(object.priority) : 0 - }; - }, - toJSON(message) { - const obj = {}; - if (message.trackSids) { - obj.trackSids = message.trackSids.map(e => e); - } else { - obj.trackSids = []; - } - message.disabled !== undefined && (obj.disabled = message.disabled); - message.quality !== undefined && (obj.quality = videoQualityToJSON(message.quality)); - message.width !== undefined && (obj.width = Math.round(message.width)); - message.height !== undefined && (obj.height = Math.round(message.height)); - message.fps !== undefined && (obj.fps = Math.round(message.fps)); - message.priority !== undefined && (obj.priority = Math.round(message.priority)); - return obj; - }, - create(base) { - return UpdateTrackSettings.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c, _d, _e, _f, _g; - const message = createBaseUpdateTrackSettings(); - message.trackSids = ((_a = object.trackSids) === null || _a === void 0 ? void 0 : _a.map(e => e)) || []; - message.disabled = (_b = object.disabled) !== null && _b !== void 0 ? _b : false; - message.quality = (_c = object.quality) !== null && _c !== void 0 ? _c : 0; - message.width = (_d = object.width) !== null && _d !== void 0 ? _d : 0; - message.height = (_e = object.height) !== null && _e !== void 0 ? _e : 0; - message.fps = (_f = object.fps) !== null && _f !== void 0 ? _f : 0; - message.priority = (_g = object.priority) !== null && _g !== void 0 ? _g : 0; - return message; - } -}; -function createBaseLeaveRequest() { - return { - canReconnect: false, - reason: 0 - }; -} -const LeaveRequest = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.canReconnect === true) { - writer.uint32(8).bool(message.canReconnect); - } - if (message.reason !== 0) { - writer.uint32(16).int32(message.reason); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseLeaveRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - message.canReconnect = reader.bool(); - continue; - case 2: - if (tag !== 16) { - break; - } - message.reason = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - canReconnect: isSet(object.canReconnect) ? Boolean(object.canReconnect) : false, - reason: isSet(object.reason) ? disconnectReasonFromJSON(object.reason) : 0 - }; - }, - toJSON(message) { - const obj = {}; - message.canReconnect !== undefined && (obj.canReconnect = message.canReconnect); - message.reason !== undefined && (obj.reason = disconnectReasonToJSON(message.reason)); - return obj; - }, - create(base) { - return LeaveRequest.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b; - const message = createBaseLeaveRequest(); - message.canReconnect = (_a = object.canReconnect) !== null && _a !== void 0 ? _a : false; - message.reason = (_b = object.reason) !== null && _b !== void 0 ? _b : 0; - return message; - } -}; -function createBaseUpdateVideoLayers() { - return { - trackSid: "", - layers: [] - }; -} -const UpdateVideoLayers = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.trackSid !== "") { - writer.uint32(10).string(message.trackSid); - } - for (const v of message.layers) { - VideoLayer.encode(v, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUpdateVideoLayers(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.trackSid = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - message.layers.push(VideoLayer.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - trackSid: isSet(object.trackSid) ? String(object.trackSid) : "", - layers: Array.isArray(object === null || object === void 0 ? void 0 : object.layers) ? object.layers.map(e => VideoLayer.fromJSON(e)) : [] - }; - }, - toJSON(message) { - const obj = {}; - message.trackSid !== undefined && (obj.trackSid = message.trackSid); - if (message.layers) { - obj.layers = message.layers.map(e => e ? VideoLayer.toJSON(e) : undefined); - } else { - obj.layers = []; - } - return obj; - }, - create(base) { - return UpdateVideoLayers.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b; - const message = createBaseUpdateVideoLayers(); - message.trackSid = (_a = object.trackSid) !== null && _a !== void 0 ? _a : ""; - message.layers = ((_b = object.layers) === null || _b === void 0 ? void 0 : _b.map(e => VideoLayer.fromPartial(e))) || []; - return message; - } -}; -function createBaseUpdateParticipantMetadata() { - return { - metadata: "", - name: "" - }; -} -const UpdateParticipantMetadata = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.metadata !== "") { - writer.uint32(10).string(message.metadata); - } - if (message.name !== "") { - writer.uint32(18).string(message.name); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUpdateParticipantMetadata(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.metadata = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - message.name = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - metadata: isSet(object.metadata) ? String(object.metadata) : "", - name: isSet(object.name) ? String(object.name) : "" - }; - }, - toJSON(message) { - const obj = {}; - message.metadata !== undefined && (obj.metadata = message.metadata); - message.name !== undefined && (obj.name = message.name); - return obj; - }, - create(base) { - return UpdateParticipantMetadata.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b; - const message = createBaseUpdateParticipantMetadata(); - message.metadata = (_a = object.metadata) !== null && _a !== void 0 ? _a : ""; - message.name = (_b = object.name) !== null && _b !== void 0 ? _b : ""; - return message; - } -}; -function createBaseICEServer() { - return { - urls: [], - username: "", - credential: "" - }; -} -const ICEServer = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - for (const v of message.urls) { - writer.uint32(10).string(v); - } - if (message.username !== "") { - writer.uint32(18).string(message.username); - } - if (message.credential !== "") { - writer.uint32(26).string(message.credential); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseICEServer(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.urls.push(reader.string()); - continue; - case 2: - if (tag !== 18) { - break; - } - message.username = reader.string(); - continue; - case 3: - if (tag !== 26) { - break; - } - message.credential = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - urls: Array.isArray(object === null || object === void 0 ? void 0 : object.urls) ? object.urls.map(e => String(e)) : [], - username: isSet(object.username) ? String(object.username) : "", - credential: isSet(object.credential) ? String(object.credential) : "" - }; - }, - toJSON(message) { - const obj = {}; - if (message.urls) { - obj.urls = message.urls.map(e => e); - } else { - obj.urls = []; - } - message.username !== undefined && (obj.username = message.username); - message.credential !== undefined && (obj.credential = message.credential); - return obj; - }, - create(base) { - return ICEServer.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c; - const message = createBaseICEServer(); - message.urls = ((_a = object.urls) === null || _a === void 0 ? void 0 : _a.map(e => e)) || []; - message.username = (_b = object.username) !== null && _b !== void 0 ? _b : ""; - message.credential = (_c = object.credential) !== null && _c !== void 0 ? _c : ""; - return message; - } -}; -function createBaseSpeakersChanged() { - return { - speakers: [] - }; -} -const SpeakersChanged = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - for (const v of message.speakers) { - SpeakerInfo.encode(v, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSpeakersChanged(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.speakers.push(SpeakerInfo.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - speakers: Array.isArray(object === null || object === void 0 ? void 0 : object.speakers) ? object.speakers.map(e => SpeakerInfo.fromJSON(e)) : [] - }; - }, - toJSON(message) { - const obj = {}; - if (message.speakers) { - obj.speakers = message.speakers.map(e => e ? SpeakerInfo.toJSON(e) : undefined); - } else { - obj.speakers = []; - } - return obj; - }, - create(base) { - return SpeakersChanged.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a; - const message = createBaseSpeakersChanged(); - message.speakers = ((_a = object.speakers) === null || _a === void 0 ? void 0 : _a.map(e => SpeakerInfo.fromPartial(e))) || []; - return message; - } -}; -function createBaseRoomUpdate() { - return { - room: undefined - }; -} -const RoomUpdate = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.room !== undefined) { - Room$1.encode(message.room, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseRoomUpdate(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.room = Room$1.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - room: isSet(object.room) ? Room$1.fromJSON(object.room) : undefined - }; - }, - toJSON(message) { - const obj = {}; - message.room !== undefined && (obj.room = message.room ? Room$1.toJSON(message.room) : undefined); - return obj; - }, - create(base) { - return RoomUpdate.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - const message = createBaseRoomUpdate(); - message.room = object.room !== undefined && object.room !== null ? Room$1.fromPartial(object.room) : undefined; - return message; - } -}; -function createBaseConnectionQualityInfo() { - return { - participantSid: "", - quality: 0, - score: 0 - }; -} -const ConnectionQualityInfo = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.participantSid !== "") { - writer.uint32(10).string(message.participantSid); - } - if (message.quality !== 0) { - writer.uint32(16).int32(message.quality); - } - if (message.score !== 0) { - writer.uint32(29).float(message.score); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseConnectionQualityInfo(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.participantSid = reader.string(); - continue; - case 2: - if (tag !== 16) { - break; - } - message.quality = reader.int32(); - continue; - case 3: - if (tag !== 29) { - break; - } - message.score = reader.float(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - participantSid: isSet(object.participantSid) ? String(object.participantSid) : "", - quality: isSet(object.quality) ? connectionQualityFromJSON(object.quality) : 0, - score: isSet(object.score) ? Number(object.score) : 0 - }; - }, - toJSON(message) { - const obj = {}; - message.participantSid !== undefined && (obj.participantSid = message.participantSid); - message.quality !== undefined && (obj.quality = connectionQualityToJSON(message.quality)); - message.score !== undefined && (obj.score = message.score); - return obj; - }, - create(base) { - return ConnectionQualityInfo.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c; - const message = createBaseConnectionQualityInfo(); - message.participantSid = (_a = object.participantSid) !== null && _a !== void 0 ? _a : ""; - message.quality = (_b = object.quality) !== null && _b !== void 0 ? _b : 0; - message.score = (_c = object.score) !== null && _c !== void 0 ? _c : 0; - return message; - } -}; -function createBaseConnectionQualityUpdate() { - return { - updates: [] - }; -} -const ConnectionQualityUpdate = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - for (const v of message.updates) { - ConnectionQualityInfo.encode(v, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseConnectionQualityUpdate(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.updates.push(ConnectionQualityInfo.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - updates: Array.isArray(object === null || object === void 0 ? void 0 : object.updates) ? object.updates.map(e => ConnectionQualityInfo.fromJSON(e)) : [] - }; - }, - toJSON(message) { - const obj = {}; - if (message.updates) { - obj.updates = message.updates.map(e => e ? ConnectionQualityInfo.toJSON(e) : undefined); - } else { - obj.updates = []; - } - return obj; - }, - create(base) { - return ConnectionQualityUpdate.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a; - const message = createBaseConnectionQualityUpdate(); - message.updates = ((_a = object.updates) === null || _a === void 0 ? void 0 : _a.map(e => ConnectionQualityInfo.fromPartial(e))) || []; - return message; - } -}; -function createBaseStreamStateInfo() { - return { - participantSid: "", - trackSid: "", - state: 0 - }; -} -const StreamStateInfo = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.participantSid !== "") { - writer.uint32(10).string(message.participantSid); - } - if (message.trackSid !== "") { - writer.uint32(18).string(message.trackSid); - } - if (message.state !== 0) { - writer.uint32(24).int32(message.state); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseStreamStateInfo(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.participantSid = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - message.trackSid = reader.string(); - continue; - case 3: - if (tag !== 24) { - break; - } - message.state = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - participantSid: isSet(object.participantSid) ? String(object.participantSid) : "", - trackSid: isSet(object.trackSid) ? String(object.trackSid) : "", - state: isSet(object.state) ? streamStateFromJSON(object.state) : 0 - }; - }, - toJSON(message) { - const obj = {}; - message.participantSid !== undefined && (obj.participantSid = message.participantSid); - message.trackSid !== undefined && (obj.trackSid = message.trackSid); - message.state !== undefined && (obj.state = streamStateToJSON(message.state)); - return obj; - }, - create(base) { - return StreamStateInfo.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c; - const message = createBaseStreamStateInfo(); - message.participantSid = (_a = object.participantSid) !== null && _a !== void 0 ? _a : ""; - message.trackSid = (_b = object.trackSid) !== null && _b !== void 0 ? _b : ""; - message.state = (_c = object.state) !== null && _c !== void 0 ? _c : 0; - return message; - } -}; -function createBaseStreamStateUpdate() { - return { - streamStates: [] - }; -} -const StreamStateUpdate = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - for (const v of message.streamStates) { - StreamStateInfo.encode(v, writer.uint32(10).fork()).ldelim(); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseStreamStateUpdate(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.streamStates.push(StreamStateInfo.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - streamStates: Array.isArray(object === null || object === void 0 ? void 0 : object.streamStates) ? object.streamStates.map(e => StreamStateInfo.fromJSON(e)) : [] - }; - }, - toJSON(message) { - const obj = {}; - if (message.streamStates) { - obj.streamStates = message.streamStates.map(e => e ? StreamStateInfo.toJSON(e) : undefined); - } else { - obj.streamStates = []; - } - return obj; - }, - create(base) { - return StreamStateUpdate.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a; - const message = createBaseStreamStateUpdate(); - message.streamStates = ((_a = object.streamStates) === null || _a === void 0 ? void 0 : _a.map(e => StreamStateInfo.fromPartial(e))) || []; - return message; - } -}; -function createBaseSubscribedQuality() { - return { - quality: 0, - enabled: false - }; -} -const SubscribedQuality = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.quality !== 0) { - writer.uint32(8).int32(message.quality); - } - if (message.enabled === true) { - writer.uint32(16).bool(message.enabled); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSubscribedQuality(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - message.quality = reader.int32(); - continue; - case 2: - if (tag !== 16) { - break; - } - message.enabled = reader.bool(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - quality: isSet(object.quality) ? videoQualityFromJSON(object.quality) : 0, - enabled: isSet(object.enabled) ? Boolean(object.enabled) : false - }; - }, - toJSON(message) { - const obj = {}; - message.quality !== undefined && (obj.quality = videoQualityToJSON(message.quality)); - message.enabled !== undefined && (obj.enabled = message.enabled); - return obj; - }, - create(base) { - return SubscribedQuality.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b; - const message = createBaseSubscribedQuality(); - message.quality = (_a = object.quality) !== null && _a !== void 0 ? _a : 0; - message.enabled = (_b = object.enabled) !== null && _b !== void 0 ? _b : false; - return message; - } -}; -function createBaseSubscribedCodec() { - return { - codec: "", - qualities: [] - }; -} -const SubscribedCodec = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.codec !== "") { - writer.uint32(10).string(message.codec); - } - for (const v of message.qualities) { - SubscribedQuality.encode(v, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSubscribedCodec(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.codec = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - message.qualities.push(SubscribedQuality.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - codec: isSet(object.codec) ? String(object.codec) : "", - qualities: Array.isArray(object === null || object === void 0 ? void 0 : object.qualities) ? object.qualities.map(e => SubscribedQuality.fromJSON(e)) : [] - }; - }, - toJSON(message) { - const obj = {}; - message.codec !== undefined && (obj.codec = message.codec); - if (message.qualities) { - obj.qualities = message.qualities.map(e => e ? SubscribedQuality.toJSON(e) : undefined); - } else { - obj.qualities = []; - } - return obj; - }, - create(base) { - return SubscribedCodec.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b; - const message = createBaseSubscribedCodec(); - message.codec = (_a = object.codec) !== null && _a !== void 0 ? _a : ""; - message.qualities = ((_b = object.qualities) === null || _b === void 0 ? void 0 : _b.map(e => SubscribedQuality.fromPartial(e))) || []; - return message; - } -}; -function createBaseSubscribedQualityUpdate() { - return { - trackSid: "", - subscribedQualities: [], - subscribedCodecs: [] - }; -} -const SubscribedQualityUpdate = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.trackSid !== "") { - writer.uint32(10).string(message.trackSid); - } - for (const v of message.subscribedQualities) { - SubscribedQuality.encode(v, writer.uint32(18).fork()).ldelim(); - } - for (const v of message.subscribedCodecs) { - SubscribedCodec.encode(v, writer.uint32(26).fork()).ldelim(); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSubscribedQualityUpdate(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.trackSid = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - message.subscribedQualities.push(SubscribedQuality.decode(reader, reader.uint32())); - continue; - case 3: - if (tag !== 26) { - break; - } - message.subscribedCodecs.push(SubscribedCodec.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - trackSid: isSet(object.trackSid) ? String(object.trackSid) : "", - subscribedQualities: Array.isArray(object === null || object === void 0 ? void 0 : object.subscribedQualities) ? object.subscribedQualities.map(e => SubscribedQuality.fromJSON(e)) : [], - subscribedCodecs: Array.isArray(object === null || object === void 0 ? void 0 : object.subscribedCodecs) ? object.subscribedCodecs.map(e => SubscribedCodec.fromJSON(e)) : [] - }; - }, - toJSON(message) { - const obj = {}; - message.trackSid !== undefined && (obj.trackSid = message.trackSid); - if (message.subscribedQualities) { - obj.subscribedQualities = message.subscribedQualities.map(e => e ? SubscribedQuality.toJSON(e) : undefined); - } else { - obj.subscribedQualities = []; - } - if (message.subscribedCodecs) { - obj.subscribedCodecs = message.subscribedCodecs.map(e => e ? SubscribedCodec.toJSON(e) : undefined); - } else { - obj.subscribedCodecs = []; - } - return obj; - }, - create(base) { - return SubscribedQualityUpdate.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c; - const message = createBaseSubscribedQualityUpdate(); - message.trackSid = (_a = object.trackSid) !== null && _a !== void 0 ? _a : ""; - message.subscribedQualities = ((_b = object.subscribedQualities) === null || _b === void 0 ? void 0 : _b.map(e => SubscribedQuality.fromPartial(e))) || []; - message.subscribedCodecs = ((_c = object.subscribedCodecs) === null || _c === void 0 ? void 0 : _c.map(e => SubscribedCodec.fromPartial(e))) || []; - return message; - } -}; -function createBaseTrackPermission() { - return { - participantSid: "", - allTracks: false, - trackSids: [], - participantIdentity: "" - }; -} -const TrackPermission = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.participantSid !== "") { - writer.uint32(10).string(message.participantSid); - } - if (message.allTracks === true) { - writer.uint32(16).bool(message.allTracks); - } - for (const v of message.trackSids) { - writer.uint32(26).string(v); - } - if (message.participantIdentity !== "") { - writer.uint32(34).string(message.participantIdentity); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTrackPermission(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.participantSid = reader.string(); - continue; - case 2: - if (tag !== 16) { - break; - } - message.allTracks = reader.bool(); - continue; - case 3: - if (tag !== 26) { - break; - } - message.trackSids.push(reader.string()); - continue; - case 4: - if (tag !== 34) { - break; - } - message.participantIdentity = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - participantSid: isSet(object.participantSid) ? String(object.participantSid) : "", - allTracks: isSet(object.allTracks) ? Boolean(object.allTracks) : false, - trackSids: Array.isArray(object === null || object === void 0 ? void 0 : object.trackSids) ? object.trackSids.map(e => String(e)) : [], - participantIdentity: isSet(object.participantIdentity) ? String(object.participantIdentity) : "" - }; - }, - toJSON(message) { - const obj = {}; - message.participantSid !== undefined && (obj.participantSid = message.participantSid); - message.allTracks !== undefined && (obj.allTracks = message.allTracks); - if (message.trackSids) { - obj.trackSids = message.trackSids.map(e => e); - } else { - obj.trackSids = []; - } - message.participantIdentity !== undefined && (obj.participantIdentity = message.participantIdentity); - return obj; - }, - create(base) { - return TrackPermission.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c, _d; - const message = createBaseTrackPermission(); - message.participantSid = (_a = object.participantSid) !== null && _a !== void 0 ? _a : ""; - message.allTracks = (_b = object.allTracks) !== null && _b !== void 0 ? _b : false; - message.trackSids = ((_c = object.trackSids) === null || _c === void 0 ? void 0 : _c.map(e => e)) || []; - message.participantIdentity = (_d = object.participantIdentity) !== null && _d !== void 0 ? _d : ""; - return message; - } -}; -function createBaseSubscriptionPermission() { - return { - allParticipants: false, - trackPermissions: [] - }; -} -const SubscriptionPermission = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.allParticipants === true) { - writer.uint32(8).bool(message.allParticipants); - } - for (const v of message.trackPermissions) { - TrackPermission.encode(v, writer.uint32(18).fork()).ldelim(); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSubscriptionPermission(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - message.allParticipants = reader.bool(); - continue; - case 2: - if (tag !== 18) { - break; - } - message.trackPermissions.push(TrackPermission.decode(reader, reader.uint32())); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - allParticipants: isSet(object.allParticipants) ? Boolean(object.allParticipants) : false, - trackPermissions: Array.isArray(object === null || object === void 0 ? void 0 : object.trackPermissions) ? object.trackPermissions.map(e => TrackPermission.fromJSON(e)) : [] - }; - }, - toJSON(message) { - const obj = {}; - message.allParticipants !== undefined && (obj.allParticipants = message.allParticipants); - if (message.trackPermissions) { - obj.trackPermissions = message.trackPermissions.map(e => e ? TrackPermission.toJSON(e) : undefined); - } else { - obj.trackPermissions = []; - } - return obj; - }, - create(base) { - return SubscriptionPermission.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b; - const message = createBaseSubscriptionPermission(); - message.allParticipants = (_a = object.allParticipants) !== null && _a !== void 0 ? _a : false; - message.trackPermissions = ((_b = object.trackPermissions) === null || _b === void 0 ? void 0 : _b.map(e => TrackPermission.fromPartial(e))) || []; - return message; - } -}; -function createBaseSubscriptionPermissionUpdate() { - return { - participantSid: "", - trackSid: "", - allowed: false - }; -} -const SubscriptionPermissionUpdate = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.participantSid !== "") { - writer.uint32(10).string(message.participantSid); - } - if (message.trackSid !== "") { - writer.uint32(18).string(message.trackSid); - } - if (message.allowed === true) { - writer.uint32(24).bool(message.allowed); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSubscriptionPermissionUpdate(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.participantSid = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - message.trackSid = reader.string(); - continue; - case 3: - if (tag !== 24) { - break; - } - message.allowed = reader.bool(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - participantSid: isSet(object.participantSid) ? String(object.participantSid) : "", - trackSid: isSet(object.trackSid) ? String(object.trackSid) : "", - allowed: isSet(object.allowed) ? Boolean(object.allowed) : false - }; - }, - toJSON(message) { - const obj = {}; - message.participantSid !== undefined && (obj.participantSid = message.participantSid); - message.trackSid !== undefined && (obj.trackSid = message.trackSid); - message.allowed !== undefined && (obj.allowed = message.allowed); - return obj; - }, - create(base) { - return SubscriptionPermissionUpdate.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c; - const message = createBaseSubscriptionPermissionUpdate(); - message.participantSid = (_a = object.participantSid) !== null && _a !== void 0 ? _a : ""; - message.trackSid = (_b = object.trackSid) !== null && _b !== void 0 ? _b : ""; - message.allowed = (_c = object.allowed) !== null && _c !== void 0 ? _c : false; - return message; - } -}; -function createBaseSyncState() { - return { - answer: undefined, - subscription: undefined, - publishTracks: [], - dataChannels: [], - offer: undefined - }; -} -const SyncState = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.answer !== undefined) { - SessionDescription.encode(message.answer, writer.uint32(10).fork()).ldelim(); - } - if (message.subscription !== undefined) { - UpdateSubscription.encode(message.subscription, writer.uint32(18).fork()).ldelim(); - } - for (const v of message.publishTracks) { - TrackPublishedResponse.encode(v, writer.uint32(26).fork()).ldelim(); - } - for (const v of message.dataChannels) { - DataChannelInfo.encode(v, writer.uint32(34).fork()).ldelim(); - } - if (message.offer !== undefined) { - SessionDescription.encode(message.offer, writer.uint32(42).fork()).ldelim(); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSyncState(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.answer = SessionDescription.decode(reader, reader.uint32()); - continue; - case 2: - if (tag !== 18) { - break; - } - message.subscription = UpdateSubscription.decode(reader, reader.uint32()); - continue; - case 3: - if (tag !== 26) { - break; - } - message.publishTracks.push(TrackPublishedResponse.decode(reader, reader.uint32())); - continue; - case 4: - if (tag !== 34) { - break; - } - message.dataChannels.push(DataChannelInfo.decode(reader, reader.uint32())); - continue; - case 5: - if (tag !== 42) { - break; - } - message.offer = SessionDescription.decode(reader, reader.uint32()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - answer: isSet(object.answer) ? SessionDescription.fromJSON(object.answer) : undefined, - subscription: isSet(object.subscription) ? UpdateSubscription.fromJSON(object.subscription) : undefined, - publishTracks: Array.isArray(object === null || object === void 0 ? void 0 : object.publishTracks) ? object.publishTracks.map(e => TrackPublishedResponse.fromJSON(e)) : [], - dataChannels: Array.isArray(object === null || object === void 0 ? void 0 : object.dataChannels) ? object.dataChannels.map(e => DataChannelInfo.fromJSON(e)) : [], - offer: isSet(object.offer) ? SessionDescription.fromJSON(object.offer) : undefined - }; - }, - toJSON(message) { - const obj = {}; - message.answer !== undefined && (obj.answer = message.answer ? SessionDescription.toJSON(message.answer) : undefined); - message.subscription !== undefined && (obj.subscription = message.subscription ? UpdateSubscription.toJSON(message.subscription) : undefined); - if (message.publishTracks) { - obj.publishTracks = message.publishTracks.map(e => e ? TrackPublishedResponse.toJSON(e) : undefined); - } else { - obj.publishTracks = []; - } - if (message.dataChannels) { - obj.dataChannels = message.dataChannels.map(e => e ? DataChannelInfo.toJSON(e) : undefined); - } else { - obj.dataChannels = []; - } - message.offer !== undefined && (obj.offer = message.offer ? SessionDescription.toJSON(message.offer) : undefined); - return obj; - }, - create(base) { - return SyncState.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b; - const message = createBaseSyncState(); - message.answer = object.answer !== undefined && object.answer !== null ? SessionDescription.fromPartial(object.answer) : undefined; - message.subscription = object.subscription !== undefined && object.subscription !== null ? UpdateSubscription.fromPartial(object.subscription) : undefined; - message.publishTracks = ((_a = object.publishTracks) === null || _a === void 0 ? void 0 : _a.map(e => TrackPublishedResponse.fromPartial(e))) || []; - message.dataChannels = ((_b = object.dataChannels) === null || _b === void 0 ? void 0 : _b.map(e => DataChannelInfo.fromPartial(e))) || []; - message.offer = object.offer !== undefined && object.offer !== null ? SessionDescription.fromPartial(object.offer) : undefined; - return message; - } -}; -function createBaseDataChannelInfo() { - return { - label: "", - id: 0, - target: 0 - }; -} -const DataChannelInfo = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.label !== "") { - writer.uint32(10).string(message.label); - } - if (message.id !== 0) { - writer.uint32(16).uint32(message.id); - } - if (message.target !== 0) { - writer.uint32(24).int32(message.target); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseDataChannelInfo(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.label = reader.string(); - continue; - case 2: - if (tag !== 16) { - break; - } - message.id = reader.uint32(); - continue; - case 3: - if (tag !== 24) { - break; - } - message.target = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - label: isSet(object.label) ? String(object.label) : "", - id: isSet(object.id) ? Number(object.id) : 0, - target: isSet(object.target) ? signalTargetFromJSON(object.target) : 0 - }; - }, - toJSON(message) { - const obj = {}; - message.label !== undefined && (obj.label = message.label); - message.id !== undefined && (obj.id = Math.round(message.id)); - message.target !== undefined && (obj.target = signalTargetToJSON(message.target)); - return obj; - }, - create(base) { - return DataChannelInfo.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c; - const message = createBaseDataChannelInfo(); - message.label = (_a = object.label) !== null && _a !== void 0 ? _a : ""; - message.id = (_b = object.id) !== null && _b !== void 0 ? _b : 0; - message.target = (_c = object.target) !== null && _c !== void 0 ? _c : 0; - return message; - } -}; -function createBaseSimulateScenario() { - return { - scenario: undefined - }; -} -const SimulateScenario = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - var _a; - switch ((_a = message.scenario) === null || _a === void 0 ? void 0 : _a.$case) { - case "speakerUpdate": - writer.uint32(8).int32(message.scenario.speakerUpdate); - break; - case "nodeFailure": - writer.uint32(16).bool(message.scenario.nodeFailure); - break; - case "migration": - writer.uint32(24).bool(message.scenario.migration); - break; - case "serverLeave": - writer.uint32(32).bool(message.scenario.serverLeave); - break; - case "switchCandidateProtocol": - writer.uint32(40).int32(message.scenario.switchCandidateProtocol); - break; - case "subscriberBandwidth": - writer.uint32(48).int64(message.scenario.subscriberBandwidth); - break; - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSimulateScenario(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - message.scenario = { - $case: "speakerUpdate", - speakerUpdate: reader.int32() - }; - continue; - case 2: - if (tag !== 16) { - break; - } - message.scenario = { - $case: "nodeFailure", - nodeFailure: reader.bool() - }; - continue; - case 3: - if (tag !== 24) { - break; - } - message.scenario = { - $case: "migration", - migration: reader.bool() - }; - continue; - case 4: - if (tag !== 32) { - break; - } - message.scenario = { - $case: "serverLeave", - serverLeave: reader.bool() - }; - continue; - case 5: - if (tag !== 40) { - break; - } - message.scenario = { - $case: "switchCandidateProtocol", - switchCandidateProtocol: reader.int32() - }; - continue; - case 6: - if (tag !== 48) { - break; - } - message.scenario = { - $case: "subscriberBandwidth", - subscriberBandwidth: longToNumber(reader.int64()) - }; - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - scenario: isSet(object.speakerUpdate) ? { - $case: "speakerUpdate", - speakerUpdate: Number(object.speakerUpdate) - } : isSet(object.nodeFailure) ? { - $case: "nodeFailure", - nodeFailure: Boolean(object.nodeFailure) - } : isSet(object.migration) ? { - $case: "migration", - migration: Boolean(object.migration) - } : isSet(object.serverLeave) ? { - $case: "serverLeave", - serverLeave: Boolean(object.serverLeave) - } : isSet(object.switchCandidateProtocol) ? { - $case: "switchCandidateProtocol", - switchCandidateProtocol: candidateProtocolFromJSON(object.switchCandidateProtocol) - } : isSet(object.subscriberBandwidth) ? { - $case: "subscriberBandwidth", - subscriberBandwidth: Number(object.subscriberBandwidth) - } : undefined - }; - }, - toJSON(message) { - var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o; - const obj = {}; - ((_a = message.scenario) === null || _a === void 0 ? void 0 : _a.$case) === "speakerUpdate" && (obj.speakerUpdate = Math.round((_b = message.scenario) === null || _b === void 0 ? void 0 : _b.speakerUpdate)); - ((_c = message.scenario) === null || _c === void 0 ? void 0 : _c.$case) === "nodeFailure" && (obj.nodeFailure = (_d = message.scenario) === null || _d === void 0 ? void 0 : _d.nodeFailure); - ((_e = message.scenario) === null || _e === void 0 ? void 0 : _e.$case) === "migration" && (obj.migration = (_f = message.scenario) === null || _f === void 0 ? void 0 : _f.migration); - ((_g = message.scenario) === null || _g === void 0 ? void 0 : _g.$case) === "serverLeave" && (obj.serverLeave = (_h = message.scenario) === null || _h === void 0 ? void 0 : _h.serverLeave); - ((_j = message.scenario) === null || _j === void 0 ? void 0 : _j.$case) === "switchCandidateProtocol" && (obj.switchCandidateProtocol = ((_k = message.scenario) === null || _k === void 0 ? void 0 : _k.switchCandidateProtocol) !== undefined ? candidateProtocolToJSON((_l = message.scenario) === null || _l === void 0 ? void 0 : _l.switchCandidateProtocol) : undefined); - ((_m = message.scenario) === null || _m === void 0 ? void 0 : _m.$case) === "subscriberBandwidth" && (obj.subscriberBandwidth = Math.round((_o = message.scenario) === null || _o === void 0 ? void 0 : _o.subscriberBandwidth)); - return obj; - }, - create(base) { - return SimulateScenario.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t; - const message = createBaseSimulateScenario(); - if (((_a = object.scenario) === null || _a === void 0 ? void 0 : _a.$case) === "speakerUpdate" && ((_b = object.scenario) === null || _b === void 0 ? void 0 : _b.speakerUpdate) !== undefined && ((_c = object.scenario) === null || _c === void 0 ? void 0 : _c.speakerUpdate) !== null) { - message.scenario = { - $case: "speakerUpdate", - speakerUpdate: object.scenario.speakerUpdate - }; - } - if (((_d = object.scenario) === null || _d === void 0 ? void 0 : _d.$case) === "nodeFailure" && ((_e = object.scenario) === null || _e === void 0 ? void 0 : _e.nodeFailure) !== undefined && ((_f = object.scenario) === null || _f === void 0 ? void 0 : _f.nodeFailure) !== null) { - message.scenario = { - $case: "nodeFailure", - nodeFailure: object.scenario.nodeFailure - }; - } - if (((_g = object.scenario) === null || _g === void 0 ? void 0 : _g.$case) === "migration" && ((_h = object.scenario) === null || _h === void 0 ? void 0 : _h.migration) !== undefined && ((_j = object.scenario) === null || _j === void 0 ? void 0 : _j.migration) !== null) { - message.scenario = { - $case: "migration", - migration: object.scenario.migration - }; - } - if (((_k = object.scenario) === null || _k === void 0 ? void 0 : _k.$case) === "serverLeave" && ((_l = object.scenario) === null || _l === void 0 ? void 0 : _l.serverLeave) !== undefined && ((_m = object.scenario) === null || _m === void 0 ? void 0 : _m.serverLeave) !== null) { - message.scenario = { - $case: "serverLeave", - serverLeave: object.scenario.serverLeave - }; - } - if (((_o = object.scenario) === null || _o === void 0 ? void 0 : _o.$case) === "switchCandidateProtocol" && ((_p = object.scenario) === null || _p === void 0 ? void 0 : _p.switchCandidateProtocol) !== undefined && ((_q = object.scenario) === null || _q === void 0 ? void 0 : _q.switchCandidateProtocol) !== null) { - message.scenario = { - $case: "switchCandidateProtocol", - switchCandidateProtocol: object.scenario.switchCandidateProtocol - }; - } - if (((_r = object.scenario) === null || _r === void 0 ? void 0 : _r.$case) === "subscriberBandwidth" && ((_s = object.scenario) === null || _s === void 0 ? void 0 : _s.subscriberBandwidth) !== undefined && ((_t = object.scenario) === null || _t === void 0 ? void 0 : _t.subscriberBandwidth) !== null) { - message.scenario = { - $case: "subscriberBandwidth", - subscriberBandwidth: object.scenario.subscriberBandwidth - }; - } - return message; - } -}; -function createBasePing() { - return { - timestamp: 0, - rtt: 0 - }; -} -const Ping = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.timestamp !== 0) { - writer.uint32(8).int64(message.timestamp); - } - if (message.rtt !== 0) { - writer.uint32(16).int64(message.rtt); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBasePing(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - message.timestamp = longToNumber(reader.int64()); - continue; - case 2: - if (tag !== 16) { - break; - } - message.rtt = longToNumber(reader.int64()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - timestamp: isSet(object.timestamp) ? Number(object.timestamp) : 0, - rtt: isSet(object.rtt) ? Number(object.rtt) : 0 - }; - }, - toJSON(message) { - const obj = {}; - message.timestamp !== undefined && (obj.timestamp = Math.round(message.timestamp)); - message.rtt !== undefined && (obj.rtt = Math.round(message.rtt)); - return obj; - }, - create(base) { - return Ping.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b; - const message = createBasePing(); - message.timestamp = (_a = object.timestamp) !== null && _a !== void 0 ? _a : 0; - message.rtt = (_b = object.rtt) !== null && _b !== void 0 ? _b : 0; - return message; - } -}; -function createBasePong() { - return { - lastPingTimestamp: 0, - timestamp: 0 - }; -} -const Pong = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.lastPingTimestamp !== 0) { - writer.uint32(8).int64(message.lastPingTimestamp); - } - if (message.timestamp !== 0) { - writer.uint32(16).int64(message.timestamp); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBasePong(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - message.lastPingTimestamp = longToNumber(reader.int64()); - continue; - case 2: - if (tag !== 16) { - break; - } - message.timestamp = longToNumber(reader.int64()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - lastPingTimestamp: isSet(object.lastPingTimestamp) ? Number(object.lastPingTimestamp) : 0, - timestamp: isSet(object.timestamp) ? Number(object.timestamp) : 0 - }; - }, - toJSON(message) { - const obj = {}; - message.lastPingTimestamp !== undefined && (obj.lastPingTimestamp = Math.round(message.lastPingTimestamp)); - message.timestamp !== undefined && (obj.timestamp = Math.round(message.timestamp)); - return obj; - }, - create(base) { - return Pong.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b; - const message = createBasePong(); - message.lastPingTimestamp = (_a = object.lastPingTimestamp) !== null && _a !== void 0 ? _a : 0; - message.timestamp = (_b = object.timestamp) !== null && _b !== void 0 ? _b : 0; - return message; - } -}; -function createBaseSubscriptionResponse() { - return { - trackSid: "", - err: 0 - }; -} -const SubscriptionResponse = { - encode(message) { - let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create(); - if (message.trackSid !== "") { - writer.uint32(10).string(message.trackSid); - } - if (message.err !== 0) { - writer.uint32(16).int32(message.err); - } - return writer; - }, - decode(input, length) { - const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSubscriptionResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - message.trackSid = reader.string(); - continue; - case 2: - if (tag !== 16) { - break; - } - message.err = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skipType(tag & 7); - } - return message; - }, - fromJSON(object) { - return { - trackSid: isSet(object.trackSid) ? String(object.trackSid) : "", - err: isSet(object.err) ? subscriptionErrorFromJSON(object.err) : 0 - }; - }, - toJSON(message) { - const obj = {}; - message.trackSid !== undefined && (obj.trackSid = message.trackSid); - message.err !== undefined && (obj.err = subscriptionErrorToJSON(message.err)); - return obj; - }, - create(base) { - return SubscriptionResponse.fromPartial(base !== null && base !== void 0 ? base : {}); - }, - fromPartial(object) { - var _a, _b; - const message = createBaseSubscriptionResponse(); - message.trackSid = (_a = object.trackSid) !== null && _a !== void 0 ? _a : ""; - message.err = (_b = object.err) !== null && _b !== void 0 ? _b : 0; - return message; - } -}; -var tsProtoGlobalThis = (() => { - if (typeof globalThis !== "undefined") { - return globalThis; - } - if (typeof self !== "undefined") { - return self; - } - if (typeof window !== "undefined") { - return window; - } - if (typeof global !== "undefined") { - return global; - } - throw "Unable to locate global object"; -})(); -function bytesFromBase64(b64) { - if (tsProtoGlobalThis.Buffer) { - return Uint8Array.from(tsProtoGlobalThis.Buffer.from(b64, "base64")); - } else { - const bin = tsProtoGlobalThis.atob(b64); - const arr = new Uint8Array(bin.length); - for (let i = 0; i < bin.length; ++i) { - arr[i] = bin.charCodeAt(i); - } - return arr; - } -} -function base64FromBytes(arr) { - if (tsProtoGlobalThis.Buffer) { - return tsProtoGlobalThis.Buffer.from(arr).toString("base64"); - } else { - const bin = []; - arr.forEach(byte => { - bin.push(String.fromCharCode(byte)); - }); - return tsProtoGlobalThis.btoa(bin.join("")); - } -} -function longToNumber(long) { - if (long.gt(Number.MAX_SAFE_INTEGER)) { - throw new tsProtoGlobalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); - } - return long.toNumber(); -} -if (_m0.util.Long !== Long$1) { - _m0.util.Long = Long$1; - _m0.configure(); -} -function isSet(value) { - return value !== null && value !== undefined; -} - -class LivekitError extends Error { - constructor(code, message) { - super(message || 'an error has occured'); - this.code = code; - } -} -class ConnectionError extends LivekitError { - constructor(message, reason, status) { - super(1, message); - this.status = status; - this.reason = reason; - } -} -class DeviceUnsupportedError extends LivekitError { - constructor(message) { - super(21, message !== null && message !== void 0 ? message : 'device is unsupported'); - } -} -class TrackInvalidError extends LivekitError { - constructor(message) { - super(20, message !== null && message !== void 0 ? message : 'track is invalid'); - } -} -class UnsupportedServer extends LivekitError { - constructor(message) { - super(10, message !== null && message !== void 0 ? message : 'unsupported server'); - } -} -class UnexpectedConnectionState extends LivekitError { - constructor(message) { - super(12, message !== null && message !== void 0 ? message : 'unexpected connection state'); - } -} -class NegotiationError extends LivekitError { - constructor(message) { - super(13, message !== null && message !== void 0 ? message : 'unable to negotiate'); - } -} -class PublishDataError extends LivekitError { - constructor(message) { - super(13, message !== null && message !== void 0 ? message : 'unable to publish data'); - } -} -var MediaDeviceFailure; -(function (MediaDeviceFailure) { - // user rejected permissions - MediaDeviceFailure["PermissionDenied"] = "PermissionDenied"; - // device is not available - MediaDeviceFailure["NotFound"] = "NotFound"; - // device is in use. On Windows, only a single tab may get access to a device at a time. - MediaDeviceFailure["DeviceInUse"] = "DeviceInUse"; - MediaDeviceFailure["Other"] = "Other"; -})(MediaDeviceFailure || (MediaDeviceFailure = {})); -(function (MediaDeviceFailure) { - function getFailure(error) { - if (error && 'name' in error) { - if (error.name === 'NotFoundError' || error.name === 'DevicesNotFoundError') { - return MediaDeviceFailure.NotFound; - } - if (error.name === 'NotAllowedError' || error.name === 'PermissionDeniedError') { - return MediaDeviceFailure.PermissionDenied; - } - if (error.name === 'NotReadableError' || error.name === 'TrackStartError') { - return MediaDeviceFailure.DeviceInUse; - } - return MediaDeviceFailure.Other; - } - } - MediaDeviceFailure.getFailure = getFailure; -})(MediaDeviceFailure || (MediaDeviceFailure = {})); - -/** - * Timers that can be overridden with platform specific implementations - * that ensure that they are fired. These should be used when it is critical - * that the timer fires on time. - */ -class CriticalTimers {} -// eslint-disable-next-line @typescript-eslint/no-implied-eval -CriticalTimers.setTimeout = function () { - return setTimeout(...arguments); -}; -// eslint-disable-next-line @typescript-eslint/no-implied-eval -CriticalTimers.setInterval = function () { - return setInterval(...arguments); -}; -CriticalTimers.clearTimeout = function () { - return clearTimeout(...arguments); -}; -CriticalTimers.clearInterval = function () { - return clearInterval(...arguments); -}; - -// tiny, simplified version of https://github.com/lancedikson/bowser/blob/master/src/parser-browsers.js -// reduced to only differentiate Chrome(ium) based browsers / Firefox / Safari -const commonVersionIdentifier = /version\/(\d+(\.?_?\d+)+)/i; -let browserDetails; -/** - * @internal - */ -function getBrowser(userAgent) { - let force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - if (typeof userAgent === 'undefined' && typeof navigator === 'undefined') { - return; - } - const ua = (userAgent !== null && userAgent !== void 0 ? userAgent : navigator.userAgent).toLowerCase(); - if (browserDetails === undefined || force) { - const browser = browsersList.find(_ref => { - let { - test - } = _ref; - return test.test(ua); - }); - browserDetails = browser === null || browser === void 0 ? void 0 : browser.describe(ua); - } - return browserDetails; -} -const browsersList = [{ - test: /firefox|iceweasel|fxios/i, - describe(ua) { - const browser = { - name: 'Firefox', - version: getMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i, ua) - }; - return browser; - } -}, { - test: /chrom|crios|crmo/i, - describe(ua) { - const browser = { - name: 'Chrome', - version: getMatch(/(?:chrome|chromium|crios|crmo)\/(\d+(\.?_?\d+)+)/i, ua) - }; - return browser; - } -}, /* Safari */ -{ - test: /safari|applewebkit/i, - describe(ua) { - const browser = { - name: 'Safari', - version: getMatch(commonVersionIdentifier, ua) - }; - return browser; - } -}]; -function getMatch(exp, ua) { - let id = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; - const match = ua.match(exp); - return match && match.length >= id && match[id] || ''; -} - -var version$1 = "1.10.0"; - -const version = version$1; -const protocolVersion = 9; - -function mergeDefaultOptions(options, audioDefaults, videoDefaults) { - const opts = Object.assign({}, options); - if (opts.audio === true) opts.audio = {}; - if (opts.video === true) opts.video = {}; - // use defaults - if (opts.audio) { - mergeObjectWithoutOverwriting(opts.audio, audioDefaults); - } - if (opts.video) { - mergeObjectWithoutOverwriting(opts.video, videoDefaults); - } - return opts; -} -function mergeObjectWithoutOverwriting(mainObject, objectToMerge) { - Object.keys(objectToMerge).forEach(key => { - if (mainObject[key] === undefined) mainObject[key] = objectToMerge[key]; - }); - return mainObject; -} -function constraintsForOptions(options) { - const constraints = {}; - if (options.video) { - // default video options - if (typeof options.video === 'object') { - const videoOptions = {}; - const target = videoOptions; - const source = options.video; - Object.keys(source).forEach(key => { - switch (key) { - case 'resolution': - // flatten VideoResolution fields - mergeObjectWithoutOverwriting(target, source.resolution); - break; - default: - target[key] = source[key]; - } - }); - constraints.video = videoOptions; - } else { - constraints.video = options.video; - } - } else { - constraints.video = false; - } - if (options.audio) { - if (typeof options.audio === 'object') { - constraints.audio = options.audio; - } else { - constraints.audio = true; - } - } else { - constraints.audio = false; - } - return constraints; -} -/** - * This function detects silence on a given [[Track]] instance. - * Returns true if the track seems to be entirely silent. - */ -function detectSilence(track) { - let timeOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200; - return __awaiter(this, void 0, void 0, function* () { - const ctx = getNewAudioContext(); - if (ctx) { - const analyser = ctx.createAnalyser(); - analyser.fftSize = 2048; - const bufferLength = analyser.frequencyBinCount; - const dataArray = new Uint8Array(bufferLength); - const source = ctx.createMediaStreamSource(new MediaStream([track.mediaStreamTrack])); - source.connect(analyser); - yield sleep(timeOffset); - analyser.getByteTimeDomainData(dataArray); - const someNoise = dataArray.some(sample => sample !== 128 && sample !== 0); - ctx.close(); - return !someNoise; - } - return false; - }); -} -/** - * @internal - */ -function getNewAudioContext() { - const AudioContext = - // @ts-ignore - typeof window !== 'undefined' && (window.AudioContext || window.webkitAudioContext); - if (AudioContext) { - return new AudioContext({ - latencyHint: 'interactive' - }); - } -} - -const separator = '|'; -const ddExtensionURI = 'https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension'; -function unpackStreamId(packed) { - const parts = packed.split(separator); - if (parts.length > 1) { - return [parts[0], packed.substr(parts[0].length + 1)]; - } - return [packed, '']; -} -function sleep(duration) { - return __awaiter(this, void 0, void 0, function* () { - return new Promise(resolve => setTimeout(resolve, duration)); - }); -} -/** @internal */ -function supportsTransceiver() { - return 'addTransceiver' in RTCPeerConnection.prototype; -} -/** @internal */ -function supportsAddTrack() { - return 'addTrack' in RTCPeerConnection.prototype; -} -function supportsAdaptiveStream() { - return typeof ResizeObserver !== undefined && typeof IntersectionObserver !== undefined; -} -function supportsDynacast() { - return supportsTransceiver(); -} -function supportsAV1() { - if (!('getCapabilities' in RTCRtpSender)) { - return false; - } - const capabilities = RTCRtpSender.getCapabilities('video'); - let hasAV1 = false; - if (capabilities) { - for (const codec of capabilities.codecs) { - if (codec.mimeType === 'video/AV1') { - hasAV1 = true; - break; - } - } - } - return hasAV1; -} -function supportsVP9() { - if (!('getCapabilities' in RTCRtpSender)) { - // technically speaking FireFox supports VP9, but SVC publishing is broken - // https://bugzilla.mozilla.org/show_bug.cgi?id=1633876 - return false; - } - const capabilities = RTCRtpSender.getCapabilities('video'); - let hasVP9 = false; - if (capabilities) { - for (const codec of capabilities.codecs) { - if (codec.mimeType === 'video/VP9') { - hasVP9 = true; - break; - } - } - } - return hasVP9; -} -function isSVCCodec(codec) { - return codec === 'av1' || codec === 'vp9'; -} -function supportsSetSinkId(elm) { - if (!document) { - return false; - } - if (!elm) { - elm = document.createElement('audio'); - } - return 'setSinkId' in elm; -} -const setCodecPreferencesVersions = { - Chrome: '100', - Safari: '15', - Firefox: '100' -}; -function supportsSetCodecPreferences(transceiver) { - if (!isWeb()) { - return false; - } - if (!('setCodecPreferences' in transceiver)) { - return false; - } - const browser = getBrowser(); - if (!(browser === null || browser === void 0 ? void 0 : browser.name) || !browser.version) { - // version is required - return false; - } - const v = setCodecPreferencesVersions[browser.name]; - if (v) { - return compareVersions(browser.version, v) >= 0; - } - return false; -} -function isBrowserSupported() { - return supportsTransceiver() || supportsAddTrack(); -} -function isFireFox() { - var _a; - return ((_a = getBrowser()) === null || _a === void 0 ? void 0 : _a.name) === 'Firefox'; -} -function isChromiumBased() { - var _a; - return ((_a = getBrowser()) === null || _a === void 0 ? void 0 : _a.name) === 'Chrome'; -} -function isSafari() { - var _a; - return ((_a = getBrowser()) === null || _a === void 0 ? void 0 : _a.name) === 'Safari'; -} -function isMobile() { - if (!isWeb()) return false; - return /Tablet|iPad|Mobile|Android|BlackBerry/.test(navigator.userAgent); -} -function isWeb() { - return typeof document !== 'undefined'; -} -function isReactNative() { - // navigator.product is deprecated on browsers, but will be set appropriately for react-native. - return navigator.product == 'ReactNative'; -} -function isCloud(serverUrl) { - return serverUrl.hostname.endsWith('.livekit.cloud'); -} -function getLKReactNativeInfo() { - // global defined only for ReactNative. - // @ts-ignore - if (global && global.LiveKitReactNativeGlobal) { - // @ts-ignore - return global.LiveKitReactNativeGlobal; - } - return undefined; -} -function getReactNativeOs() { - if (!isReactNative()) { - return undefined; - } - let info = getLKReactNativeInfo(); - if (info) { - return info.platform; - } - return undefined; -} -function getDevicePixelRatio() { - if (isWeb()) { - return window.devicePixelRatio; - } - if (isReactNative()) { - let info = getLKReactNativeInfo(); - if (info) { - return info.devicePixelRatio; - } - } - return 1; -} -function compareVersions(v1, v2) { - const parts1 = v1.split('.'); - const parts2 = v2.split('.'); - const k = Math.min(parts1.length, parts2.length); - for (let i = 0; i < k; ++i) { - const p1 = parseInt(parts1[i], 10); - const p2 = parseInt(parts2[i], 10); - if (p1 > p2) return 1; - if (p1 < p2) return -1; - if (i === k - 1 && p1 === p2) return 0; - } - if (v1 === '' && v2 !== '') { - return -1; - } else if (v2 === '') { - return 1; - } - return parts1.length == parts2.length ? 0 : parts1.length < parts2.length ? -1 : 1; -} -function roDispatchCallback(entries) { - for (const entry of entries) { - entry.target.handleResize(entry); - } -} -function ioDispatchCallback(entries) { - for (const entry of entries) { - entry.target.handleVisibilityChanged(entry); - } -} -let resizeObserver = null; -const getResizeObserver = () => { - if (!resizeObserver) resizeObserver = new ResizeObserver(roDispatchCallback); - return resizeObserver; -}; -let intersectionObserver = null; -const getIntersectionObserver = () => { - if (!intersectionObserver) { - intersectionObserver = new IntersectionObserver(ioDispatchCallback, { - root: null, - rootMargin: '0px' - }); - } - return intersectionObserver; -}; -function getClientInfo() { - var _a; - const info = ClientInfo.fromPartial({ - sdk: ClientInfo_SDK.JS, - protocol: protocolVersion, - version - }); - if (isReactNative()) { - info.os = (_a = getReactNativeOs()) !== null && _a !== void 0 ? _a : ''; - } - return info; -} -let emptyVideoStreamTrack; -function getEmptyVideoStreamTrack() { - if (!emptyVideoStreamTrack) { - emptyVideoStreamTrack = createDummyVideoStreamTrack(); - } - return emptyVideoStreamTrack; -} -function createDummyVideoStreamTrack() { - let width = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 16; - let height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 16; - let enabled = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - let paintContent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; - const canvas = document.createElement('canvas'); - // the canvas size is set to 16 by default, because electron apps seem to fail with smaller values - canvas.width = width; - canvas.height = height; - const ctx = canvas.getContext('2d'); - ctx === null || ctx === void 0 ? void 0 : ctx.fillRect(0, 0, canvas.width, canvas.height); - if (paintContent && ctx) { - ctx.beginPath(); - ctx.arc(width / 2, height / 2, 50, 0, Math.PI * 2, true); - ctx.closePath(); - ctx.fillStyle = 'grey'; - ctx.fill(); - } - // @ts-ignore - const dummyStream = canvas.captureStream(); - const [dummyTrack] = dummyStream.getTracks(); - if (!dummyTrack) { - throw Error('Could not get empty media stream video track'); - } - dummyTrack.enabled = enabled; - return dummyTrack; -} -let emptyAudioStreamTrack; -function getEmptyAudioStreamTrack() { - if (!emptyAudioStreamTrack) { - // implementation adapted from https://blog.mozilla.org/webrtc/warm-up-with-replacetrack/ - const ctx = new AudioContext(); - const oscillator = ctx.createOscillator(); - const dst = ctx.createMediaStreamDestination(); - oscillator.connect(dst); - oscillator.start(); - [emptyAudioStreamTrack] = dst.stream.getAudioTracks(); - if (!emptyAudioStreamTrack) { - throw Error('Could not get empty media stream audio track'); - } - emptyAudioStreamTrack.enabled = false; - } - return emptyAudioStreamTrack; -} -class Future { - constructor(futureBase, onFinally) { - this.onFinally = onFinally; - this.promise = new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { - this.resolve = resolve; - this.reject = reject; - if (futureBase) { - yield futureBase(resolve, reject); - } - })).finally(() => { - var _a; - return (_a = this.onFinally) === null || _a === void 0 ? void 0 : _a.call(this); - }); - } -} -/** - * Creates and returns an analyser web audio node that is attached to the provided track. - * Additionally returns a convenience method `calculateVolume` to perform instant volume readings on that track. - * Call the returned `cleanup` function to close the audioContext that has been created for the instance of this helper - */ -function createAudioAnalyser(track, options) { - const opts = Object.assign({ - cloneTrack: false, - fftSize: 2048, - smoothingTimeConstant: 0.8, - minDecibels: -100, - maxDecibels: -80 - }, options); - const audioContext = getNewAudioContext(); - if (!audioContext) { - throw new Error('Audio Context not supported on this browser'); - } - const streamTrack = opts.cloneTrack ? track.mediaStreamTrack.clone() : track.mediaStreamTrack; - const mediaStreamSource = audioContext.createMediaStreamSource(new MediaStream([streamTrack])); - const analyser = audioContext.createAnalyser(); - analyser.minDecibels = opts.minDecibels; - analyser.maxDecibels = opts.maxDecibels; - analyser.fftSize = opts.fftSize; - analyser.smoothingTimeConstant = opts.smoothingTimeConstant; - mediaStreamSource.connect(analyser); - const dataArray = new Uint8Array(analyser.frequencyBinCount); - /** - * Calculates the current volume of the track in the range from 0 to 1 - */ - const calculateVolume = () => { - analyser.getByteFrequencyData(dataArray); - let sum = 0; - for (const amplitude of dataArray) { - sum += Math.pow(amplitude / 255, 2); - } - const volume = Math.sqrt(sum / dataArray.length); - return volume; - }; - const cleanup = () => { - audioContext.close(); - if (opts.cloneTrack) { - streamTrack.stop(); - } - }; - return { - calculateVolume, - analyser, - cleanup - }; -} -class Mutex { - constructor() { - this._locking = Promise.resolve(); - this._locks = 0; - } - isLocked() { - return this._locks > 0; - } - lock() { - this._locks += 1; - let unlockNext; - const willLock = new Promise(resolve => unlockNext = () => { - this._locks -= 1; - resolve(); - }); - const willUnlock = this._locking.then(() => unlockNext); - this._locking = this._locking.then(() => willLock); - return willUnlock; - } -} - -var QueueTaskStatus; -(function (QueueTaskStatus) { - QueueTaskStatus[QueueTaskStatus["WAITING"] = 0] = "WAITING"; - QueueTaskStatus[QueueTaskStatus["RUNNING"] = 1] = "RUNNING"; - QueueTaskStatus[QueueTaskStatus["COMPLETED"] = 2] = "COMPLETED"; -})(QueueTaskStatus || (QueueTaskStatus = {})); -class AsyncQueue { - constructor() { - this.pendingTasks = new Map(); - this.taskMutex = new Mutex(); - this.nextTaskIndex = 0; - } - run(task) { - return __awaiter(this, void 0, void 0, function* () { - const taskInfo = { - id: this.nextTaskIndex++, - enqueuedAt: Date.now(), - status: QueueTaskStatus.WAITING - }; - this.pendingTasks.set(taskInfo.id, taskInfo); - const unlock = yield this.taskMutex.lock(); - try { - taskInfo.executedAt = Date.now(); - taskInfo.status = QueueTaskStatus.RUNNING; - return yield task(); - } finally { - taskInfo.status = QueueTaskStatus.COMPLETED; - this.pendingTasks.delete(taskInfo.id); - unlock(); - } - }); - } - flush() { - return __awaiter(this, void 0, void 0, function* () { - return this.run(() => __awaiter(this, void 0, void 0, function* () {})); - }); - } - snapshot() { - return Array.from(this.pendingTasks.values()); - } -} - -const passThroughQueueSignals = ['syncState', 'trickle', 'offer', 'answer', 'simulate', 'leave']; -function canPassThroughQueue(req) { - const canPass = passThroughQueueSignals.indexOf(req.$case) >= 0; - livekitLogger.trace('request allowed to bypass queue:', { - canPass, - req - }); - return canPass; -} -/** @internal */ -class SignalClient { - constructor() { - let useJSON = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - /** signal rtt in milliseconds */ - this.rtt = 0; - this.isConnected = false; - this.isReconnecting = false; - this.useJSON = useJSON; - this.requestQueue = new AsyncQueue(); - this.queuedRequests = []; - this.closingLock = new Mutex(); - } - join(url, token, opts, abortSignal) { - return __awaiter(this, void 0, void 0, function* () { - // during a full reconnect, we'd want to start the sequence even if currently - // connected - this.isConnected = false; - this.options = opts; - const res = yield this.connect(url, token, opts, abortSignal); - return res; - }); - } - reconnect(url, token, sid, reason) { - return __awaiter(this, void 0, void 0, function* () { - if (!this.options) { - livekitLogger.warn('attempted to reconnect without signal options being set, ignoring'); - return; - } - this.isReconnecting = true; - // clear ping interval and restart it once reconnected - this.clearPingInterval(); - const res = yield this.connect(url, token, Object.assign(Object.assign({}, this.options), { - reconnect: true, - sid, - reconnectReason: reason - })); - return res; - }); - } - connect(url, token, opts, abortSignal) { - this.connectOptions = opts; - if (url.startsWith('http')) { - url = url.replace('http', 'ws'); - } - // strip trailing slash - url = url.replace(/\/$/, ''); - url += '/rtc'; - const clientInfo = getClientInfo(); - const params = createConnectionParams(token, clientInfo, opts); - return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { - const abortHandler = () => __awaiter(this, void 0, void 0, function* () { - this.close(); - reject(new ConnectionError('room connection has been cancelled (signal)')); - }); - if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) { - abortHandler(); - } - abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.addEventListener('abort', abortHandler); - livekitLogger.debug("connecting to ".concat(url + params)); - if (this.ws) { - yield this.close(); - } - this.ws = new WebSocket(url + params); - this.ws.binaryType = 'arraybuffer'; - this.ws.onerror = ev => __awaiter(this, void 0, void 0, function* () { - if (!this.isConnected) { - try { - const resp = yield fetch("http".concat(url.substring(2), "/validate").concat(params)); - if (resp.status.toFixed(0).startsWith('4')) { - const msg = yield resp.text(); - reject(new ConnectionError(msg, 0 /* ConnectionErrorReason.NotAllowed */, resp.status)); - } else { - reject(new ConnectionError('Internal error', 2 /* ConnectionErrorReason.InternalError */, resp.status)); - } - } catch (e) { - reject(new ConnectionError('server was not reachable', 1 /* ConnectionErrorReason.ServerUnreachable */)); - } - - return; - } - // other errors, handle - this.handleWSError(ev); - }); - this.ws.onmessage = ev => __awaiter(this, void 0, void 0, function* () { - var _a, _b, _c, _d; - // not considered connected until JoinResponse is received - let resp; - if (typeof ev.data === 'string') { - const json = JSON.parse(ev.data); - resp = SignalResponse.fromJSON(json); - } else if (ev.data instanceof ArrayBuffer) { - resp = SignalResponse.decode(new Uint8Array(ev.data)); - } else { - livekitLogger.error("could not decode websocket message: ".concat(typeof ev.data)); - return; - } - if (!this.isConnected) { - let shouldProcessMessage = false; - // handle join message only - if (((_a = resp.message) === null || _a === void 0 ? void 0 : _a.$case) === 'join') { - this.isConnected = true; - abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.removeEventListener('abort', abortHandler); - this.pingTimeoutDuration = resp.message.join.pingTimeout; - this.pingIntervalDuration = resp.message.join.pingInterval; - if (this.pingTimeoutDuration && this.pingTimeoutDuration > 0) { - livekitLogger.debug('ping config', { - timeout: this.pingTimeoutDuration, - interval: this.pingIntervalDuration - }); - this.startPingInterval(); - } - resolve(resp.message.join); - } else if (opts.reconnect) { - // in reconnecting, any message received means signal reconnected - this.isConnected = true; - abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.removeEventListener('abort', abortHandler); - this.startPingInterval(); - if (((_b = resp.message) === null || _b === void 0 ? void 0 : _b.$case) === 'reconnect') { - resolve((_c = resp.message) === null || _c === void 0 ? void 0 : _c.reconnect); - } else { - resolve(); - shouldProcessMessage = true; - } - } else if (!opts.reconnect) { - // non-reconnect case, should receive join response first - reject(new ConnectionError("did not receive join response, got ".concat((_d = resp.message) === null || _d === void 0 ? void 0 : _d.$case, " instead"))); - } - if (!shouldProcessMessage) { - return; - } - } - if (this.signalLatency) { - yield sleep(this.signalLatency); - } - this.handleSignalResponse(resp); - }); - this.ws.onclose = ev => { - livekitLogger.warn("websocket closed", { - ev - }); - this.handleOnClose(ev.reason); - }; - })); - } - close() { - return __awaiter(this, void 0, void 0, function* () { - const unlock = yield this.closingLock.lock(); - try { - this.isConnected = false; - if (this.ws) { - this.ws.onclose = null; - this.ws.onmessage = null; - this.ws.onopen = null; - // calling `ws.close()` only starts the closing handshake (CLOSING state), prefer to wait until state is actually CLOSED - const closePromise = new Promise(resolve => { - if (this.ws) { - this.ws.onclose = resolve; - } else { - resolve(true); - } - }); - if (this.ws.readyState < this.ws.CLOSING) { - this.ws.close(); - // 250ms grace period for ws to close gracefully - yield Promise.race([closePromise, sleep(250)]); - } - this.ws = undefined; - this.clearPingInterval(); - } - } finally { - unlock(); - } - }); - } - // initial offer after joining - sendOffer(offer) { - livekitLogger.debug('sending offer', offer); - this.sendRequest({ - $case: 'offer', - offer: toProtoSessionDescription(offer) - }); - } - // answer a server-initiated offer - sendAnswer(answer) { - livekitLogger.debug('sending answer'); - return this.sendRequest({ - $case: 'answer', - answer: toProtoSessionDescription(answer) - }); - } - sendIceCandidate(candidate, target) { - livekitLogger.trace('sending ice candidate', candidate); - return this.sendRequest({ - $case: 'trickle', - trickle: { - candidateInit: JSON.stringify(candidate), - target - } - }); - } - sendMuteTrack(trackSid, muted) { - return this.sendRequest({ - $case: 'mute', - mute: { - sid: trackSid, - muted - } - }); - } - sendAddTrack(req) { - return this.sendRequest({ - $case: 'addTrack', - addTrack: AddTrackRequest.fromPartial(req) - }); - } - sendUpdateLocalMetadata(metadata, name) { - return this.sendRequest({ - $case: 'updateMetadata', - updateMetadata: { - metadata, - name - } - }); - } - sendUpdateTrackSettings(settings) { - this.sendRequest({ - $case: 'trackSetting', - trackSetting: settings - }); - } - sendUpdateSubscription(sub) { - return this.sendRequest({ - $case: 'subscription', - subscription: sub - }); - } - sendSyncState(sync) { - return this.sendRequest({ - $case: 'syncState', - syncState: sync - }); - } - sendUpdateVideoLayers(trackSid, layers) { - return this.sendRequest({ - $case: 'updateLayers', - updateLayers: { - trackSid, - layers - } - }); - } - sendUpdateSubscriptionPermissions(allParticipants, trackPermissions) { - return this.sendRequest({ - $case: 'subscriptionPermission', - subscriptionPermission: { - allParticipants, - trackPermissions - } - }); - } - sendSimulateScenario(scenario) { - return this.sendRequest({ - $case: 'simulate', - simulate: scenario - }); - } - sendPing() { - /** send both of ping and pingReq for compatibility to old and new server */ - return Promise.all([this.sendRequest({ - $case: 'ping', - ping: Date.now() - }), this.sendRequest({ - $case: 'pingReq', - pingReq: { - timestamp: Date.now(), - rtt: this.rtt - } - })]); - } - sendLeave() { - return this.sendRequest({ - $case: 'leave', - leave: { - canReconnect: false, - reason: DisconnectReason.CLIENT_INITIATED - } - }); - } - sendRequest(message) { - let fromQueue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - return __awaiter(this, void 0, void 0, function* () { - // capture all requests while reconnecting and put them in a queue - // unless the request originates from the queue, then don't enqueue again - const canQueue = !fromQueue && !canPassThroughQueue(message); - if (canQueue && this.isReconnecting) { - this.queuedRequests.push(() => __awaiter(this, void 0, void 0, function* () { - yield this.sendRequest(message, true); - })); - return; - } - // make sure previously queued requests are being sent first - if (!fromQueue) { - yield this.requestQueue.flush(); - } - if (this.signalLatency) { - yield sleep(this.signalLatency); - } - if (!this.ws || this.ws.readyState !== this.ws.OPEN) { - livekitLogger.error("cannot send signal request before connected, type: ".concat(message === null || message === void 0 ? void 0 : message.$case)); - return; - } - const req = { - message - }; - try { - if (this.useJSON) { - this.ws.send(JSON.stringify(SignalRequest.toJSON(req))); - } else { - this.ws.send(SignalRequest.encode(req).finish()); - } - } catch (e) { - livekitLogger.error('error sending signal message', { - error: e - }); - } - }); - } - handleSignalResponse(res) { - var _a, _b; - const msg = res.message; - if (msg == undefined) { - livekitLogger.debug('received unsupported message'); - return; - } - if (msg.$case === 'answer') { - const sd = fromProtoSessionDescription(msg.answer); - if (this.onAnswer) { - this.onAnswer(sd); - } - } else if (msg.$case === 'offer') { - const sd = fromProtoSessionDescription(msg.offer); - if (this.onOffer) { - this.onOffer(sd); - } - } else if (msg.$case === 'trickle') { - const candidate = JSON.parse(msg.trickle.candidateInit); - if (this.onTrickle) { - this.onTrickle(candidate, msg.trickle.target); - } - } else if (msg.$case === 'update') { - if (this.onParticipantUpdate) { - this.onParticipantUpdate((_a = msg.update.participants) !== null && _a !== void 0 ? _a : []); - } - } else if (msg.$case === 'trackPublished') { - if (this.onLocalTrackPublished) { - this.onLocalTrackPublished(msg.trackPublished); - } - } else if (msg.$case === 'speakersChanged') { - if (this.onSpeakersChanged) { - this.onSpeakersChanged((_b = msg.speakersChanged.speakers) !== null && _b !== void 0 ? _b : []); - } - } else if (msg.$case === 'leave') { - if (this.onLeave) { - this.onLeave(msg.leave); - } - } else if (msg.$case === 'mute') { - if (this.onRemoteMuteChanged) { - this.onRemoteMuteChanged(msg.mute.sid, msg.mute.muted); - } - } else if (msg.$case === 'roomUpdate') { - if (this.onRoomUpdate && msg.roomUpdate.room) { - this.onRoomUpdate(msg.roomUpdate.room); - } - } else if (msg.$case === 'connectionQuality') { - if (this.onConnectionQuality) { - this.onConnectionQuality(msg.connectionQuality); - } - } else if (msg.$case === 'streamStateUpdate') { - if (this.onStreamStateUpdate) { - this.onStreamStateUpdate(msg.streamStateUpdate); - } - } else if (msg.$case === 'subscribedQualityUpdate') { - if (this.onSubscribedQualityUpdate) { - this.onSubscribedQualityUpdate(msg.subscribedQualityUpdate); - } - } else if (msg.$case === 'subscriptionPermissionUpdate') { - if (this.onSubscriptionPermissionUpdate) { - this.onSubscriptionPermissionUpdate(msg.subscriptionPermissionUpdate); - } - } else if (msg.$case === 'refreshToken') { - if (this.onTokenRefresh) { - this.onTokenRefresh(msg.refreshToken); - } - } else if (msg.$case === 'trackUnpublished') { - if (this.onLocalTrackUnpublished) { - this.onLocalTrackUnpublished(msg.trackUnpublished); - } - } else if (msg.$case === 'subscriptionResponse') { - if (this.onSubscriptionError) { - this.onSubscriptionError(msg.subscriptionResponse); - } - } else if (msg.$case === 'pong') { - this.resetPingTimeout(); - } else if (msg.$case === 'pongResp') { - this.rtt = Date.now() - msg.pongResp.lastPingTimestamp; - this.resetPingTimeout(); - } else { - livekitLogger.debug('unsupported message', msg); - } - } - setReconnected() { - while (this.queuedRequests.length > 0) { - const req = this.queuedRequests.shift(); - if (req) { - this.requestQueue.run(req); - } - } - this.isReconnecting = false; - } - handleOnClose(reason) { - return __awaiter(this, void 0, void 0, function* () { - if (!this.isConnected) return; - yield this.close(); - livekitLogger.debug("websocket connection closed: ".concat(reason)); - if (this.onClose) { - this.onClose(reason); - } - }); - } - handleWSError(ev) { - livekitLogger.error('websocket error', ev); - } - /** - * Resets the ping timeout and starts a new timeout. - * Call this after receiving a pong message - */ - resetPingTimeout() { - this.clearPingTimeout(); - if (!this.pingTimeoutDuration) { - livekitLogger.warn('ping timeout duration not set'); - return; - } - this.pingTimeout = CriticalTimers.setTimeout(() => { - livekitLogger.warn("ping timeout triggered. last pong received at: ".concat(new Date(Date.now() - this.pingTimeoutDuration * 1000).toUTCString())); - this.handleOnClose('ping timeout'); - }, this.pingTimeoutDuration * 1000); - } - /** - * Clears ping timeout (does not start a new timeout) - */ - clearPingTimeout() { - if (this.pingTimeout) { - CriticalTimers.clearTimeout(this.pingTimeout); - } - } - startPingInterval() { - this.clearPingInterval(); - this.resetPingTimeout(); - if (!this.pingIntervalDuration) { - livekitLogger.warn('ping interval duration not set'); - return; - } - livekitLogger.debug('start ping interval'); - this.pingInterval = CriticalTimers.setInterval(() => { - this.sendPing(); - }, this.pingIntervalDuration * 1000); - } - clearPingInterval() { - livekitLogger.debug('clearing ping interval'); - this.clearPingTimeout(); - if (this.pingInterval) { - CriticalTimers.clearInterval(this.pingInterval); - } - } -} -function fromProtoSessionDescription(sd) { - const rsd = { - type: 'offer', - sdp: sd.sdp - }; - switch (sd.type) { - case 'answer': - case 'offer': - case 'pranswer': - case 'rollback': - rsd.type = sd.type; - break; - } - return rsd; -} -function toProtoSessionDescription(rsd) { - const sd = { - sdp: rsd.sdp, - type: rsd.type - }; - return sd; -} -function createConnectionParams(token, info, opts) { - var _a; - const params = new URLSearchParams(); - params.set('access_token', token); - // opts - if (opts.reconnect) { - params.set('reconnect', '1'); - if (opts.sid) { - params.set('sid', opts.sid); - } - } - params.set('auto_subscribe', opts.autoSubscribe ? '1' : '0'); - // ClientInfo - params.set('sdk', isReactNative() ? 'reactnative' : 'js'); - params.set('version', info.version); - params.set('protocol', info.protocol.toString()); - if (info.deviceModel) { - params.set('device_model', info.deviceModel); - } - if (info.os) { - params.set('os', info.os); - } - if (info.osVersion) { - params.set('os_version', info.osVersion); - } - if (info.browser) { - params.set('browser', info.browser); - } - if (info.browserVersion) { - params.set('browser_version', info.browserVersion); - } - if (opts.publishOnly !== undefined) { - params.set('publish', opts.publishOnly); - } - if (opts.adaptiveStream) { - params.set('adaptive_stream', '1'); - } - if (opts.reconnectReason) { - params.set('reconnect_reason', opts.reconnectReason.toString()); - } - // @ts-ignore - if ((_a = navigator.connection) === null || _a === void 0 ? void 0 : _a.type) { - // @ts-ignore - params.set('network', navigator.connection.type); - } - return "?".concat(params.toString()); -} - -const defaultId = 'default'; -class DeviceManager { - static getInstance() { - if (this.instance === undefined) { - this.instance = new DeviceManager(); - } - return this.instance; - } - getDevices(kind) { - let requestPermissions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - var _a; - return __awaiter(this, void 0, void 0, function* () { - if (((_a = DeviceManager.userMediaPromiseMap) === null || _a === void 0 ? void 0 : _a.size) > 0) { - livekitLogger.debug('awaiting getUserMedia promise'); - try { - if (kind) { - yield DeviceManager.userMediaPromiseMap.get(kind); - } else { - yield Promise.all(DeviceManager.userMediaPromiseMap.values()); - } - } catch (e) { - livekitLogger.warn('error waiting for media permissons'); - } - } - let devices = yield navigator.mediaDevices.enumerateDevices(); - if (requestPermissions && kind && ( - // for safari we need to skip this check, as otherwise it will re-acquire user media and fail on iOS https://bugs.webkit.org/show_bug.cgi?id=179363 - !DeviceManager.userMediaPromiseMap.get(kind) || !isSafari())) { - const isDummyDeviceOrEmpty = devices.length === 0 || devices.some(device => { - const noLabel = device.label === ''; - const isRelevant = kind ? device.kind === kind : true; - return noLabel && isRelevant; - }); - if (isDummyDeviceOrEmpty) { - const permissionsToAcquire = { - video: kind !== 'audioinput' && kind !== 'audiooutput', - audio: kind !== 'videoinput' - }; - const stream = yield navigator.mediaDevices.getUserMedia(permissionsToAcquire); - devices = yield navigator.mediaDevices.enumerateDevices(); - stream.getTracks().forEach(track => { - track.stop(); - }); - } - } - if (kind) { - devices = devices.filter(device => device.kind === kind); - } - return devices; - }); - } - normalizeDeviceId(kind, deviceId, groupId) { - return __awaiter(this, void 0, void 0, function* () { - if (deviceId !== defaultId) { - return deviceId; - } - // resolve actual device id if it's 'default': Chrome returns it when no - // device has been chosen - const devices = yield this.getDevices(kind); - const device = devices.find(d => d.groupId === groupId && d.deviceId !== defaultId); - return device === null || device === void 0 ? void 0 : device.deviceId; - }); - } -} -DeviceManager.mediaDeviceKinds = ['audioinput', 'audiooutput', 'videoinput']; -DeviceManager.userMediaPromiseMap = new Map(); - -var parser$1 = {}; - -var grammar$2 = {exports: {}}; - -var grammar$1 = grammar$2.exports = { - v: [{ - name: 'version', - reg: /^(\d*)$/ - }], - o: [{ - // o=- 20518 0 IN IP4 203.0.113.1 - // NB: sessionId will be a String in most cases because it is huge - name: 'origin', - reg: /^(\S*) (\d*) (\d*) (\S*) IP(\d) (\S*)/, - names: ['username', 'sessionId', 'sessionVersion', 'netType', 'ipVer', 'address'], - format: '%s %s %d %s IP%d %s' - }], - // default parsing of these only (though some of these feel outdated) - s: [{ - name: 'name' - }], - i: [{ - name: 'description' - }], - u: [{ - name: 'uri' - }], - e: [{ - name: 'email' - }], - p: [{ - name: 'phone' - }], - z: [{ - name: 'timezones' - }], - // TODO: this one can actually be parsed properly... - r: [{ - name: 'repeats' - }], - // TODO: this one can also be parsed properly - // k: [{}], // outdated thing ignored - t: [{ - // t=0 0 - name: 'timing', - reg: /^(\d*) (\d*)/, - names: ['start', 'stop'], - format: '%d %d' - }], - c: [{ - // c=IN IP4 10.47.197.26 - name: 'connection', - reg: /^IN IP(\d) (\S*)/, - names: ['version', 'ip'], - format: 'IN IP%d %s' - }], - b: [{ - // b=AS:4000 - push: 'bandwidth', - reg: /^(TIAS|AS|CT|RR|RS):(\d*)/, - names: ['type', 'limit'], - format: '%s:%s' - }], - m: [{ - // m=video 51744 RTP/AVP 126 97 98 34 31 - // NB: special - pushes to session - // TODO: rtp/fmtp should be filtered by the payloads found here? - reg: /^(\w*) (\d*) ([\w/]*)(?: (.*))?/, - names: ['type', 'port', 'protocol', 'payloads'], - format: '%s %d %s %s' - }], - a: [{ - // a=rtpmap:110 opus/48000/2 - push: 'rtp', - reg: /^rtpmap:(\d*) ([\w\-.]*)(?:\s*\/(\d*)(?:\s*\/(\S*))?)?/, - names: ['payload', 'codec', 'rate', 'encoding'], - format: function (o) { - return o.encoding ? 'rtpmap:%d %s/%s/%s' : o.rate ? 'rtpmap:%d %s/%s' : 'rtpmap:%d %s'; - } - }, { - // a=fmtp:108 profile-level-id=24;object=23;bitrate=64000 - // a=fmtp:111 minptime=10; useinbandfec=1 - push: 'fmtp', - reg: /^fmtp:(\d*) ([\S| ]*)/, - names: ['payload', 'config'], - format: 'fmtp:%d %s' - }, { - // a=control:streamid=0 - name: 'control', - reg: /^control:(.*)/, - format: 'control:%s' - }, { - // a=rtcp:65179 IN IP4 193.84.77.194 - name: 'rtcp', - reg: /^rtcp:(\d*)(?: (\S*) IP(\d) (\S*))?/, - names: ['port', 'netType', 'ipVer', 'address'], - format: function (o) { - return o.address != null ? 'rtcp:%d %s IP%d %s' : 'rtcp:%d'; - } - }, { - // a=rtcp-fb:98 trr-int 100 - push: 'rtcpFbTrrInt', - reg: /^rtcp-fb:(\*|\d*) trr-int (\d*)/, - names: ['payload', 'value'], - format: 'rtcp-fb:%s trr-int %d' - }, { - // a=rtcp-fb:98 nack rpsi - push: 'rtcpFb', - reg: /^rtcp-fb:(\*|\d*) ([\w-_]*)(?: ([\w-_]*))?/, - names: ['payload', 'type', 'subtype'], - format: function (o) { - return o.subtype != null ? 'rtcp-fb:%s %s %s' : 'rtcp-fb:%s %s'; - } - }, { - // a=extmap:2 urn:ietf:params:rtp-hdrext:toffset - // a=extmap:1/recvonly URI-gps-string - // a=extmap:3 urn:ietf:params:rtp-hdrext:encrypt urn:ietf:params:rtp-hdrext:smpte-tc 25@600/24 - push: 'ext', - reg: /^extmap:(\d+)(?:\/(\w+))?(?: (urn:ietf:params:rtp-hdrext:encrypt))? (\S*)(?: (\S*))?/, - names: ['value', 'direction', 'encrypt-uri', 'uri', 'config'], - format: function (o) { - return 'extmap:%d' + (o.direction ? '/%s' : '%v') + (o['encrypt-uri'] ? ' %s' : '%v') + ' %s' + (o.config ? ' %s' : ''); - } - }, { - // a=extmap-allow-mixed - name: 'extmapAllowMixed', - reg: /^(extmap-allow-mixed)/ - }, { - // a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR|2^20|1:32 - push: 'crypto', - reg: /^crypto:(\d*) ([\w_]*) (\S*)(?: (\S*))?/, - names: ['id', 'suite', 'config', 'sessionConfig'], - format: function (o) { - return o.sessionConfig != null ? 'crypto:%d %s %s %s' : 'crypto:%d %s %s'; - } - }, { - // a=setup:actpass - name: 'setup', - reg: /^setup:(\w*)/, - format: 'setup:%s' - }, { - // a=connection:new - name: 'connectionType', - reg: /^connection:(new|existing)/, - format: 'connection:%s' - }, { - // a=mid:1 - name: 'mid', - reg: /^mid:([^\s]*)/, - format: 'mid:%s' - }, { - // a=msid:0c8b064d-d807-43b4-b434-f92a889d8587 98178685-d409-46e0-8e16-7ef0db0db64a - name: 'msid', - reg: /^msid:(.*)/, - format: 'msid:%s' - }, { - // a=ptime:20 - name: 'ptime', - reg: /^ptime:(\d*(?:\.\d*)*)/, - format: 'ptime:%d' - }, { - // a=maxptime:60 - name: 'maxptime', - reg: /^maxptime:(\d*(?:\.\d*)*)/, - format: 'maxptime:%d' - }, { - // a=sendrecv - name: 'direction', - reg: /^(sendrecv|recvonly|sendonly|inactive)/ - }, { - // a=ice-lite - name: 'icelite', - reg: /^(ice-lite)/ - }, { - // a=ice-ufrag:F7gI - name: 'iceUfrag', - reg: /^ice-ufrag:(\S*)/, - format: 'ice-ufrag:%s' - }, { - // a=ice-pwd:x9cml/YzichV2+XlhiMu8g - name: 'icePwd', - reg: /^ice-pwd:(\S*)/, - format: 'ice-pwd:%s' - }, { - // a=fingerprint:SHA-1 00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33 - name: 'fingerprint', - reg: /^fingerprint:(\S*) (\S*)/, - names: ['type', 'hash'], - format: 'fingerprint:%s %s' - }, { - // a=candidate:0 1 UDP 2113667327 203.0.113.1 54400 typ host - // a=candidate:1162875081 1 udp 2113937151 192.168.34.75 60017 typ host generation 0 network-id 3 network-cost 10 - // a=candidate:3289912957 2 udp 1845501695 193.84.77.194 60017 typ srflx raddr 192.168.34.75 rport 60017 generation 0 network-id 3 network-cost 10 - // a=candidate:229815620 1 tcp 1518280447 192.168.150.19 60017 typ host tcptype active generation 0 network-id 3 network-cost 10 - // a=candidate:3289912957 2 tcp 1845501695 193.84.77.194 60017 typ srflx raddr 192.168.34.75 rport 60017 tcptype passive generation 0 network-id 3 network-cost 10 - push: 'candidates', - reg: /^candidate:(\S*) (\d*) (\S*) (\d*) (\S*) (\d*) typ (\S*)(?: raddr (\S*) rport (\d*))?(?: tcptype (\S*))?(?: generation (\d*))?(?: network-id (\d*))?(?: network-cost (\d*))?/, - names: ['foundation', 'component', 'transport', 'priority', 'ip', 'port', 'type', 'raddr', 'rport', 'tcptype', 'generation', 'network-id', 'network-cost'], - format: function (o) { - var str = 'candidate:%s %d %s %d %s %d typ %s'; - str += o.raddr != null ? ' raddr %s rport %d' : '%v%v'; - - // NB: candidate has three optional chunks, so %void middles one if it's missing - str += o.tcptype != null ? ' tcptype %s' : '%v'; - if (o.generation != null) { - str += ' generation %d'; - } - str += o['network-id'] != null ? ' network-id %d' : '%v'; - str += o['network-cost'] != null ? ' network-cost %d' : '%v'; - return str; - } - }, { - // a=end-of-candidates (keep after the candidates line for readability) - name: 'endOfCandidates', - reg: /^(end-of-candidates)/ - }, { - // a=remote-candidates:1 203.0.113.1 54400 2 203.0.113.1 54401 ... - name: 'remoteCandidates', - reg: /^remote-candidates:(.*)/, - format: 'remote-candidates:%s' - }, { - // a=ice-options:google-ice - name: 'iceOptions', - reg: /^ice-options:(\S*)/, - format: 'ice-options:%s' - }, { - // a=ssrc:2566107569 cname:t9YU8M1UxTF8Y1A1 - push: 'ssrcs', - reg: /^ssrc:(\d*) ([\w_-]*)(?::(.*))?/, - names: ['id', 'attribute', 'value'], - format: function (o) { - var str = 'ssrc:%d'; - if (o.attribute != null) { - str += ' %s'; - if (o.value != null) { - str += ':%s'; - } - } - return str; - } - }, { - // a=ssrc-group:FEC 1 2 - // a=ssrc-group:FEC-FR 3004364195 1080772241 - push: 'ssrcGroups', - // token-char = %x21 / %x23-27 / %x2A-2B / %x2D-2E / %x30-39 / %x41-5A / %x5E-7E - reg: /^ssrc-group:([\x21\x23\x24\x25\x26\x27\x2A\x2B\x2D\x2E\w]*) (.*)/, - names: ['semantics', 'ssrcs'], - format: 'ssrc-group:%s %s' - }, { - // a=msid-semantic: WMS Jvlam5X3SX1OP6pn20zWogvaKJz5Hjf9OnlV - name: 'msidSemantic', - reg: /^msid-semantic:\s?(\w*) (\S*)/, - names: ['semantic', 'token'], - format: 'msid-semantic: %s %s' // space after ':' is not accidental - }, { - // a=group:BUNDLE audio video - push: 'groups', - reg: /^group:(\w*) (.*)/, - names: ['type', 'mids'], - format: 'group:%s %s' - }, { - // a=rtcp-mux - name: 'rtcpMux', - reg: /^(rtcp-mux)/ - }, { - // a=rtcp-rsize - name: 'rtcpRsize', - reg: /^(rtcp-rsize)/ - }, { - // a=sctpmap:5000 webrtc-datachannel 1024 - name: 'sctpmap', - reg: /^sctpmap:([\w_/]*) (\S*)(?: (\S*))?/, - names: ['sctpmapNumber', 'app', 'maxMessageSize'], - format: function (o) { - return o.maxMessageSize != null ? 'sctpmap:%s %s %s' : 'sctpmap:%s %s'; - } - }, { - // a=x-google-flag:conference - name: 'xGoogleFlag', - reg: /^x-google-flag:([^\s]*)/, - format: 'x-google-flag:%s' - }, { - // a=rid:1 send max-width=1280;max-height=720;max-fps=30;depend=0 - push: 'rids', - reg: /^rid:([\d\w]+) (\w+)(?: ([\S| ]*))?/, - names: ['id', 'direction', 'params'], - format: function (o) { - return o.params ? 'rid:%s %s %s' : 'rid:%s %s'; - } - }, { - // a=imageattr:97 send [x=800,y=640,sar=1.1,q=0.6] [x=480,y=320] recv [x=330,y=250] - // a=imageattr:* send [x=800,y=640] recv * - // a=imageattr:100 recv [x=320,y=240] - push: 'imageattrs', - reg: new RegExp( - // a=imageattr:97 - '^imageattr:(\\d+|\\*)' + - // send [x=800,y=640,sar=1.1,q=0.6] [x=480,y=320] - '[\\s\\t]+(send|recv)[\\s\\t]+(\\*|\\[\\S+\\](?:[\\s\\t]+\\[\\S+\\])*)' + - // recv [x=330,y=250] - '(?:[\\s\\t]+(recv|send)[\\s\\t]+(\\*|\\[\\S+\\](?:[\\s\\t]+\\[\\S+\\])*))?'), - names: ['pt', 'dir1', 'attrs1', 'dir2', 'attrs2'], - format: function (o) { - return 'imageattr:%s %s %s' + (o.dir2 ? ' %s %s' : ''); - } - }, { - // a=simulcast:send 1,2,3;~4,~5 recv 6;~7,~8 - // a=simulcast:recv 1;4,5 send 6;7 - name: 'simulcast', - reg: new RegExp( - // a=simulcast: - '^simulcast:' + - // send 1,2,3;~4,~5 - '(send|recv) ([a-zA-Z0-9\\-_~;,]+)' + - // space + recv 6;~7,~8 - '(?:\\s?(send|recv) ([a-zA-Z0-9\\-_~;,]+))?' + - // end - '$'), - names: ['dir1', 'list1', 'dir2', 'list2'], - format: function (o) { - return 'simulcast:%s %s' + (o.dir2 ? ' %s %s' : ''); - } - }, { - // old simulcast draft 03 (implemented by Firefox) - // https://tools.ietf.org/html/draft-ietf-mmusic-sdp-simulcast-03 - // a=simulcast: recv pt=97;98 send pt=97 - // a=simulcast: send rid=5;6;7 paused=6,7 - name: 'simulcast_03', - reg: /^simulcast:[\s\t]+([\S+\s\t]+)$/, - names: ['value'], - format: 'simulcast: %s' - }, { - // a=framerate:25 - // a=framerate:29.97 - name: 'framerate', - reg: /^framerate:(\d+(?:$|\.\d+))/, - format: 'framerate:%s' - }, { - // RFC4570 - // a=source-filter: incl IN IP4 239.5.2.31 10.1.15.5 - name: 'sourceFilter', - reg: /^source-filter: *(excl|incl) (\S*) (IP4|IP6|\*) (\S*) (.*)/, - names: ['filterMode', 'netType', 'addressTypes', 'destAddress', 'srcList'], - format: 'source-filter: %s %s %s %s %s' - }, { - // a=bundle-only - name: 'bundleOnly', - reg: /^(bundle-only)/ - }, { - // a=label:1 - name: 'label', - reg: /^label:(.+)/, - format: 'label:%s' - }, { - // RFC version 26 for SCTP over DTLS - // https://tools.ietf.org/html/draft-ietf-mmusic-sctp-sdp-26#section-5 - name: 'sctpPort', - reg: /^sctp-port:(\d+)$/, - format: 'sctp-port:%s' - }, { - // RFC version 26 for SCTP over DTLS - // https://tools.ietf.org/html/draft-ietf-mmusic-sctp-sdp-26#section-6 - name: 'maxMessageSize', - reg: /^max-message-size:(\d+)$/, - format: 'max-message-size:%s' - }, { - // RFC7273 - // a=ts-refclk:ptp=IEEE1588-2008:39-A7-94-FF-FE-07-CB-D0:37 - push: 'tsRefClocks', - reg: /^ts-refclk:([^\s=]*)(?:=(\S*))?/, - names: ['clksrc', 'clksrcExt'], - format: function (o) { - return 'ts-refclk:%s' + (o.clksrcExt != null ? '=%s' : ''); - } - }, { - // RFC7273 - // a=mediaclk:direct=963214424 - name: 'mediaClk', - reg: /^mediaclk:(?:id=(\S*))? *([^\s=]*)(?:=(\S*))?(?: *rate=(\d+)\/(\d+))?/, - names: ['id', 'mediaClockName', 'mediaClockValue', 'rateNumerator', 'rateDenominator'], - format: function (o) { - var str = 'mediaclk:'; - str += o.id != null ? 'id=%s %s' : '%v%s'; - str += o.mediaClockValue != null ? '=%s' : ''; - str += o.rateNumerator != null ? ' rate=%s' : ''; - str += o.rateDenominator != null ? '/%s' : ''; - return str; - } - }, { - // a=keywds:keywords - name: 'keywords', - reg: /^keywds:(.+)$/, - format: 'keywds:%s' - }, { - // a=content:main - name: 'content', - reg: /^content:(.+)/, - format: 'content:%s' - }, - // BFCP https://tools.ietf.org/html/rfc4583 - { - // a=floorctrl:c-s - name: 'bfcpFloorCtrl', - reg: /^floorctrl:(c-only|s-only|c-s)/, - format: 'floorctrl:%s' - }, { - // a=confid:1 - name: 'bfcpConfId', - reg: /^confid:(\d+)/, - format: 'confid:%s' - }, { - // a=userid:1 - name: 'bfcpUserId', - reg: /^userid:(\d+)/, - format: 'userid:%s' - }, { - // a=floorid:1 - name: 'bfcpFloorId', - reg: /^floorid:(.+) (?:m-stream|mstrm):(.+)/, - names: ['id', 'mStream'], - format: 'floorid:%s mstrm:%s' - }, { - // any a= that we don't understand is kept verbatim on media.invalid - push: 'invalid', - names: ['value'] - }] -}; - -// set sensible defaults to avoid polluting the grammar with boring details -Object.keys(grammar$1).forEach(function (key) { - var objs = grammar$1[key]; - objs.forEach(function (obj) { - if (!obj.reg) { - obj.reg = /(.*)/; - } - if (!obj.format) { - obj.format = '%s'; - } - }); -}); -var grammarExports = grammar$2.exports; - -(function (exports) { - var toIntIfInt = function (v) { - return String(Number(v)) === v ? Number(v) : v; - }; - var attachProperties = function (match, location, names, rawName) { - if (rawName && !names) { - location[rawName] = toIntIfInt(match[1]); - } else { - for (var i = 0; i < names.length; i += 1) { - if (match[i + 1] != null) { - location[names[i]] = toIntIfInt(match[i + 1]); - } - } - } - }; - var parseReg = function (obj, location, content) { - var needsBlank = obj.name && obj.names; - if (obj.push && !location[obj.push]) { - location[obj.push] = []; - } else if (needsBlank && !location[obj.name]) { - location[obj.name] = {}; - } - var keyLocation = obj.push ? {} : - // blank object that will be pushed - needsBlank ? location[obj.name] : location; // otherwise, named location or root - - attachProperties(content.match(obj.reg), keyLocation, obj.names, obj.name); - if (obj.push) { - location[obj.push].push(keyLocation); - } - }; - var grammar = grammarExports; - var validLine = RegExp.prototype.test.bind(/^([a-z])=(.*)/); - exports.parse = function (sdp) { - var session = {}, - media = [], - location = session; // points at where properties go under (one of the above) - - // parse lines we understand - sdp.split(/(\r\n|\r|\n)/).filter(validLine).forEach(function (l) { - var type = l[0]; - var content = l.slice(2); - if (type === 'm') { - media.push({ - rtp: [], - fmtp: [] - }); - location = media[media.length - 1]; // point at latest media line - } - - for (var j = 0; j < (grammar[type] || []).length; j += 1) { - var obj = grammar[type][j]; - if (obj.reg.test(content)) { - return parseReg(obj, location, content); - } - } - }); - session.media = media; // link it up - return session; - }; - var paramReducer = function (acc, expr) { - var s = expr.split(/=(.+)/, 2); - if (s.length === 2) { - acc[s[0]] = toIntIfInt(s[1]); - } else if (s.length === 1 && expr.length > 1) { - acc[s[0]] = undefined; - } - return acc; - }; - exports.parseParams = function (str) { - return str.split(/;\s?/).reduce(paramReducer, {}); - }; - - // For backward compatibility - alias will be removed in 3.0.0 - exports.parseFmtpConfig = exports.parseParams; - exports.parsePayloads = function (str) { - return str.toString().split(' ').map(Number); - }; - exports.parseRemoteCandidates = function (str) { - var candidates = []; - var parts = str.split(' ').map(toIntIfInt); - for (var i = 0; i < parts.length; i += 3) { - candidates.push({ - component: parts[i], - ip: parts[i + 1], - port: parts[i + 2] - }); - } - return candidates; - }; - exports.parseImageAttributes = function (str) { - return str.split(' ').map(function (item) { - return item.substring(1, item.length - 1).split(',').reduce(paramReducer, {}); - }); - }; - exports.parseSimulcastStreamList = function (str) { - return str.split(';').map(function (stream) { - return stream.split(',').map(function (format) { - var scid, - paused = false; - if (format[0] !== '~') { - scid = toIntIfInt(format); - } else { - scid = toIntIfInt(format.substring(1, format.length)); - paused = true; - } - return { - scid: scid, - paused: paused - }; - }); - }); - }; -})(parser$1); - -var grammar = grammarExports; - -// customized util.format - discards excess arguments and can void middle ones -var formatRegExp = /%[sdv%]/g; -var format = function (formatStr) { - var i = 1; - var args = arguments; - var len = args.length; - return formatStr.replace(formatRegExp, function (x) { - if (i >= len) { - return x; // missing argument - } - - var arg = args[i]; - i += 1; - switch (x) { - case '%%': - return '%'; - case '%s': - return String(arg); - case '%d': - return Number(arg); - case '%v': - return ''; - } - }); - // NB: we discard excess arguments - they are typically undefined from makeLine -}; - -var makeLine = function (type, obj, location) { - var str = obj.format instanceof Function ? obj.format(obj.push ? location : location[obj.name]) : obj.format; - var args = [type + '=' + str]; - if (obj.names) { - for (var i = 0; i < obj.names.length; i += 1) { - var n = obj.names[i]; - if (obj.name) { - args.push(location[obj.name][n]); - } else { - // for mLine and push attributes - args.push(location[obj.names[i]]); - } - } - } else { - args.push(location[obj.name]); - } - return format.apply(null, args); -}; - -// RFC specified order -// TODO: extend this with all the rest -var defaultOuterOrder = ['v', 'o', 's', 'i', 'u', 'e', 'p', 'c', 'b', 't', 'r', 'z', 'a']; -var defaultInnerOrder = ['i', 'c', 'b', 'a']; -var writer$1 = function (session, opts) { - opts = opts || {}; - // ensure certain properties exist - if (session.version == null) { - session.version = 0; // 'v=0' must be there (only defined version atm) - } - - if (session.name == null) { - session.name = ' '; // 's= ' must be there if no meaningful name set - } - - session.media.forEach(function (mLine) { - if (mLine.payloads == null) { - mLine.payloads = ''; - } - }); - var outerOrder = opts.outerOrder || defaultOuterOrder; - var innerOrder = opts.innerOrder || defaultInnerOrder; - var sdp = []; - - // loop through outerOrder for matching properties on session - outerOrder.forEach(function (type) { - grammar[type].forEach(function (obj) { - if (obj.name in session && session[obj.name] != null) { - sdp.push(makeLine(type, obj, session)); - } else if (obj.push in session && session[obj.push] != null) { - session[obj.push].forEach(function (el) { - sdp.push(makeLine(type, obj, el)); - }); - } - }); - }); - - // then for each media line, follow the innerOrder - session.media.forEach(function (mLine) { - sdp.push(makeLine('m', grammar.m[0], mLine)); - innerOrder.forEach(function (type) { - grammar[type].forEach(function (obj) { - if (obj.name in mLine && mLine[obj.name] != null) { - sdp.push(makeLine(type, obj, mLine)); - } else if (obj.push in mLine && mLine[obj.push] != null) { - mLine[obj.push].forEach(function (el) { - sdp.push(makeLine(type, obj, el)); - }); - } - }); - }); - }); - return sdp.join('\r\n') + '\r\n'; -}; - -var parser = parser$1; -var writer = writer$1; -var write = writer; -var parse = parser.parse; -parser.parseParams; -parser.parseFmtpConfig; // Alias of parseParams(). -parser.parsePayloads; -parser.parseRemoteCandidates; -parser.parseImageAttributes; -parser.parseSimulcastStreamList; - -function r(r, e, n) { - var i, t, o; - void 0 === e && (e = 50), void 0 === n && (n = {}); - var a = null != (i = n.isImmediate) && i, - u = null != (t = n.callback) && t, - c = n.maxWait, - v = Date.now(), - l = []; - function f() { - if (void 0 !== c) { - var r = Date.now() - v; - if (r + e >= c) return c - r; - } - return e; - } - var d = function () { - var e = [].slice.call(arguments), - n = this; - return new Promise(function (i, t) { - var c = a && void 0 === o; - if (void 0 !== o && clearTimeout(o), o = setTimeout(function () { - if (o = void 0, v = Date.now(), !a) { - var i = r.apply(n, e); - u && u(i), l.forEach(function (r) { - return (0, r.resolve)(i); - }), l = []; - } - }, f()), c) { - var d = r.apply(n, e); - return u && u(d), i(d); - } - l.push({ - resolve: i, - reject: t - }); - }); - }; - return d.cancel = function (r) { - void 0 !== o && clearTimeout(o), l.forEach(function (e) { - return (0, e.reject)(r); - }), l = []; - }, d; -} - -const PCEvents = { - NegotiationStarted: 'negotiationStarted', - NegotiationComplete: 'negotiationComplete' -}; -/** @internal */ -class PCTransport extends eventsExports.EventEmitter { - constructor(config) { - let mediaConstraints = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - super(); - this.pendingCandidates = []; - this.restartingIce = false; - this.renegotiate = false; - this.trackBitrates = []; - this.remoteStereoMids = []; - this.remoteNackMids = []; - // debounced negotiate interface - this.negotiate = r(onError => { - this.emit(PCEvents.NegotiationStarted); - try { - this.createAndSendOffer(); - } catch (e) { - if (onError) { - onError(e); - } else { - throw e; - } - } - }, 100); - this.pc = isChromiumBased() ? - // @ts-expect-error chrome allows additional media constraints to be passed into the RTCPeerConnection constructor - new RTCPeerConnection(config, mediaConstraints) : new RTCPeerConnection(config); - } - get isICEConnected() { - return this.pc.iceConnectionState === 'connected' || this.pc.iceConnectionState === 'completed'; - } - addIceCandidate(candidate) { - return __awaiter(this, void 0, void 0, function* () { - if (this.pc.remoteDescription && !this.restartingIce) { - return this.pc.addIceCandidate(candidate); - } - this.pendingCandidates.push(candidate); - }); - } - setRemoteDescription(sd) { - return __awaiter(this, void 0, void 0, function* () { - if (sd.type === 'offer') { - let { - stereoMids, - nackMids - } = extractStereoAndNackAudioFromOffer(sd); - this.remoteStereoMids = stereoMids; - this.remoteNackMids = nackMids; - } - yield this.pc.setRemoteDescription(sd); - this.pendingCandidates.forEach(candidate => { - this.pc.addIceCandidate(candidate); - }); - this.pendingCandidates = []; - this.restartingIce = false; - if (this.renegotiate) { - this.renegotiate = false; - this.createAndSendOffer(); - } else if (sd.type === 'answer') { - this.emit(PCEvents.NegotiationComplete); - } - }); - } - createAndSendOffer(options) { - var _a; - return __awaiter(this, void 0, void 0, function* () { - if (this.onOffer === undefined) { - return; - } - if (options === null || options === void 0 ? void 0 : options.iceRestart) { - livekitLogger.debug('restarting ICE'); - this.restartingIce = true; - } - if (this.pc.signalingState === 'have-local-offer') { - // we're waiting for the peer to accept our offer, so we'll just wait - // the only exception to this is when ICE restart is needed - const currentSD = this.pc.remoteDescription; - if ((options === null || options === void 0 ? void 0 : options.iceRestart) && currentSD) { - // TODO: handle when ICE restart is needed but we don't have a remote description - // the best thing to do is to recreate the peerconnection - yield this.pc.setRemoteDescription(currentSD); - } else { - this.renegotiate = true; - return; - } - } else if (this.pc.signalingState === 'closed') { - livekitLogger.warn('could not createOffer with closed peer connection'); - return; - } - // actually negotiate - livekitLogger.debug('starting to negotiate'); - const offer = yield this.pc.createOffer(options); - const sdpParsed = parse((_a = offer.sdp) !== null && _a !== void 0 ? _a : ''); - sdpParsed.media.forEach(media => { - if (media.type === 'audio') { - ensureAudioNackAndStereo(media, [], []); - } else if (media.type === 'video') { - ensureVideoDDExtensionForSVC(media); - // mung sdp for codec bitrate setting that can't apply by sendEncoding - this.trackBitrates.some(trackbr => { - if (!media.msid || !media.msid.includes(trackbr.sid)) { - return false; - } - let codecPayload = 0; - media.rtp.some(rtp => { - if (rtp.codec.toUpperCase() === trackbr.codec.toUpperCase()) { - codecPayload = rtp.payload; - return true; - } - return false; - }); - // add x-google-max-bitrate to fmtp line if not exist - if (codecPayload > 0) { - if (!media.fmtp.some(fmtp => { - if (fmtp.payload === codecPayload) { - if (!fmtp.config.includes('x-google-start-bitrate')) { - fmtp.config += ";x-google-start-bitrate=".concat(trackbr.maxbr * 0.7); - } - if (!fmtp.config.includes('x-google-max-bitrate')) { - fmtp.config += ";x-google-max-bitrate=".concat(trackbr.maxbr); - } - return true; - } - return false; - })) { - media.fmtp.push({ - payload: codecPayload, - config: "x-google-start-bitrate=".concat(trackbr.maxbr * 0.7, ";x-google-max-bitrate=").concat(trackbr.maxbr) - }); - } - } - return true; - }); - } - }); - this.trackBitrates = []; - yield this.setMungedLocalDescription(offer, write(sdpParsed)); - this.onOffer(offer); - }); - } - createAndSetAnswer() { - var _a; - return __awaiter(this, void 0, void 0, function* () { - const answer = yield this.pc.createAnswer(); - const sdpParsed = parse((_a = answer.sdp) !== null && _a !== void 0 ? _a : ''); - sdpParsed.media.forEach(media => { - if (media.type === 'audio') { - ensureAudioNackAndStereo(media, this.remoteStereoMids, this.remoteNackMids); - } - }); - yield this.setMungedLocalDescription(answer, write(sdpParsed)); - return answer; - }); - } - setTrackCodecBitrate(sid, codec, maxbr) { - this.trackBitrates.push({ - sid, - codec, - maxbr - }); - } - close() { - this.pc.onconnectionstatechange = null; - this.pc.oniceconnectionstatechange = null; - this.pc.close(); - } - setMungedLocalDescription(sd, munged) { - return __awaiter(this, void 0, void 0, function* () { - const originalSdp = sd.sdp; - sd.sdp = munged; - try { - livekitLogger.debug('setting munged local description'); - yield this.pc.setLocalDescription(sd); - return; - } catch (e) { - livekitLogger.warn("not able to set ".concat(sd.type, ", falling back to unmodified sdp"), { - error: e - }); - sd.sdp = originalSdp; - } - try { - yield this.pc.setLocalDescription(sd); - } catch (e) { - // this error cannot always be caught. - // If the local description has a setCodecPreferences error, this error will be uncaught - let msg = 'unknown error'; - if (e instanceof Error) { - msg = e.message; - } else if (typeof e === 'string') { - msg = e; - } - throw new NegotiationError(msg); - } - }); - } -} -function ensureAudioNackAndStereo(media, stereoMids, nackMids) { - // found opus codec to add nack fb - let opusPayload = 0; - media.rtp.some(rtp => { - if (rtp.codec === 'opus') { - opusPayload = rtp.payload; - return true; - } - return false; - }); - // add nack rtcpfb if not exist - if (opusPayload > 0) { - if (!media.rtcpFb) { - media.rtcpFb = []; - } - if (nackMids.includes(media.mid) && !media.rtcpFb.some(fb => fb.payload === opusPayload && fb.type === 'nack')) { - media.rtcpFb.push({ - payload: opusPayload, - type: 'nack' - }); - } - if (stereoMids.includes(media.mid)) { - media.fmtp.some(fmtp => { - if (fmtp.payload === opusPayload) { - if (!fmtp.config.includes('stereo=1')) { - fmtp.config += ';stereo=1'; - } - return true; - } - return false; - }); - } - } -} -function ensureVideoDDExtensionForSVC(media) { - var _a, _b, _c, _d; - const codec = (_b = (_a = media.rtp[0]) === null || _a === void 0 ? void 0 : _a.codec) === null || _b === void 0 ? void 0 : _b.toLowerCase(); - if (!isSVCCodec(codec)) { - return; - } - let maxID = 0; - const ddFound = (_c = media.ext) === null || _c === void 0 ? void 0 : _c.some(ext => { - if (ext.uri === ddExtensionURI) { - return true; - } - if (ext.value > maxID) { - maxID = ext.value; - } - return false; - }); - if (!ddFound) { - (_d = media.ext) === null || _d === void 0 ? void 0 : _d.push({ - value: maxID + 1, - uri: ddExtensionURI - }); - } -} -function extractStereoAndNackAudioFromOffer(offer) { - var _a; - const stereoMids = []; - const nackMids = []; - const sdpParsed = parse((_a = offer.sdp) !== null && _a !== void 0 ? _a : ''); - let opusPayload = 0; - sdpParsed.media.forEach(media => { - var _a; - if (media.type === 'audio') { - media.rtp.some(rtp => { - if (rtp.codec === 'opus') { - opusPayload = rtp.payload; - return true; - } - return false; - }); - if ((_a = media.rtcpFb) === null || _a === void 0 ? void 0 : _a.some(fb => fb.payload === opusPayload && fb.type === 'nack')) { - nackMids.push(media.mid); - } - media.fmtp.some(fmtp => { - if (fmtp.payload === opusPayload) { - if (fmtp.config.includes('sprop-stereo=1')) { - stereoMids.push(media.mid); - } - return true; - } - return false; - }); - } - }); - return { - stereoMids, - nackMids - }; -} - -class RegionUrlProvider { - constructor(url, token) { - this.lastUpdateAt = 0; - this.settingsCacheTime = 3000; - this.attemptedRegions = []; - this.serverUrl = new URL(url); - this.token = token; - } - isCloud() { - return isCloud(this.serverUrl); - } - getNextBestRegionUrl(abortSignal) { - return __awaiter(this, void 0, void 0, function* () { - if (!this.isCloud()) { - throw Error('region availability is only supported for LiveKit Cloud domains'); - } - if (!this.regionSettings || Date.now() - this.lastUpdateAt > this.settingsCacheTime) { - this.regionSettings = yield this.fetchRegionSettings(abortSignal); - } - const regionsLeft = this.regionSettings.regions.filter(region => !this.attemptedRegions.find(attempted => attempted.url === region.url)); - if (regionsLeft.length > 0) { - const nextRegion = regionsLeft[0]; - this.attemptedRegions.push(nextRegion); - livekitLogger.debug("next region: ".concat(nextRegion.region)); - return nextRegion.url; - } else { - return null; - } - }); - } - resetAttempts() { - this.attemptedRegions = []; - } - fetchRegionSettings(signal) { - return __awaiter(this, void 0, void 0, function* () { - const regionSettingsResponse = yield fetch("".concat(getCloudConfigUrl(this.serverUrl), "/regions"), { - headers: { - authorization: "Bearer ".concat(this.token) - }, - signal - }); - if (regionSettingsResponse.ok) { - const regionSettings = yield regionSettingsResponse.json(); - this.lastUpdateAt = Date.now(); - return regionSettings; - } else { - throw new ConnectionError("Could not fetch region settings: ".concat(regionSettingsResponse.statusText), regionSettingsResponse.status === 401 ? 0 /* ConnectionErrorReason.NotAllowed */ : undefined, regionSettingsResponse.status); - } - }); - } -} -function getCloudConfigUrl(serverUrl) { - return "".concat(serverUrl.protocol.replace('ws', 'http'), "//").concat(serverUrl.host, "/settings"); -} - -class VideoPreset { - constructor(width, height, maxBitrate, maxFramerate, priority) { - this.width = width; - this.height = height; - this.encoding = { - maxBitrate, - maxFramerate, - priority - }; - } - get resolution() { - return { - width: this.width, - height: this.height, - frameRate: this.encoding.maxFramerate, - aspectRatio: this.width / this.height - }; - } -} -const backupCodecs = ['vp8', 'h264']; -function isBackupCodec(codec) { - return !!backupCodecs.find(backup => backup === codec); -} -function isCodecEqual(c1, c2) { - return (c1 === null || c1 === void 0 ? void 0 : c1.toLowerCase().replace(/audio\/|video\//y, '')) === (c2 === null || c2 === void 0 ? void 0 : c2.toLowerCase().replace(/audio\/|video\//y, '')); -} -var AudioPresets; -(function (AudioPresets) { - AudioPresets.telephone = { - maxBitrate: 12000 - }; - AudioPresets.speech = { - maxBitrate: 20000 - }; - AudioPresets.music = { - maxBitrate: 32000 - }; - AudioPresets.musicStereo = { - maxBitrate: 48000 - }; - AudioPresets.musicHighQuality = { - maxBitrate: 64000 - }; - AudioPresets.musicHighQualityStereo = { - maxBitrate: 96000 - }; -})(AudioPresets || (AudioPresets = {})); -/** - * Sane presets for video resolution/encoding - */ -const VideoPresets = { - h90: new VideoPreset(160, 90, 60000, 15), - h180: new VideoPreset(320, 180, 120000, 15), - h216: new VideoPreset(384, 216, 180000, 15), - h360: new VideoPreset(640, 360, 300000, 20), - h540: new VideoPreset(960, 540, 600000, 25), - h720: new VideoPreset(1280, 720, 1700000, 30), - h1080: new VideoPreset(1920, 1080, 3000000, 30), - h1440: new VideoPreset(2560, 1440, 5000000, 30), - h2160: new VideoPreset(3840, 2160, 8000000, 30) -}; -/** - * Four by three presets - */ -const VideoPresets43 = { - h120: new VideoPreset(160, 120, 80000, 15), - h180: new VideoPreset(240, 180, 100000, 15), - h240: new VideoPreset(320, 240, 150000, 15), - h360: new VideoPreset(480, 360, 225000, 20), - h480: new VideoPreset(640, 480, 300000, 20), - h540: new VideoPreset(720, 540, 450000, 25), - h720: new VideoPreset(960, 720, 1500000, 30), - h1080: new VideoPreset(1440, 1080, 2500000, 30), - h1440: new VideoPreset(1920, 1440, 3500000, 30) -}; -const ScreenSharePresets = { - h360fps3: new VideoPreset(640, 360, 200000, 3, 'medium'), - h720fps5: new VideoPreset(1280, 720, 400000, 5, 'medium'), - h720fps15: new VideoPreset(1280, 720, 1000000, 15, 'medium'), - h1080fps15: new VideoPreset(1920, 1080, 1500000, 15, 'medium'), - h1080fps30: new VideoPreset(1920, 1080, 3000000, 30, 'medium') -}; - -const publishDefaults = { - /** - * @deprecated - */ - audioBitrate: AudioPresets.music.maxBitrate, - audioPreset: AudioPresets.music, - dtx: true, - red: true, - forceStereo: false, - simulcast: true, - screenShareEncoding: ScreenSharePresets.h1080fps15.encoding, - stopMicTrackOnMute: false, - videoCodec: 'vp8', - backupCodec: { - codec: 'vp8', - encoding: VideoPresets.h540.encoding - } -}; -const audioDefaults = { - autoGainControl: true, - echoCancellation: true, - noiseSuppression: true -}; -const videoDefaults = { - resolution: VideoPresets.h720.resolution -}; -const roomOptionDefaults = { - adaptiveStream: false, - dynacast: false, - stopLocalTrackOnUnpublish: true, - reconnectPolicy: new DefaultReconnectPolicy(), - disconnectOnPageLeave: true, - expWebAudioMix: false -}; -const roomConnectOptionDefaults = { - autoSubscribe: true, - maxRetries: 1, - peerConnectionTimeout: 15000 -}; - -/** - * Events are the primary way LiveKit notifies your application of changes. - * - * The following are events emitted by [[Room]], listen to room events like - * - * ```typescript - * room.on(RoomEvent.TrackPublished, (track, publication, participant) => {}) - * ``` - */ -var RoomEvent; -(function (RoomEvent) { - /** - * When the connection to the server has been established - */ - RoomEvent["Connected"] = "connected"; - /** - * When the connection to the server has been interrupted and it's attempting - * to reconnect. - */ - RoomEvent["Reconnecting"] = "reconnecting"; - /** - * Fires when a reconnection has been successful. - */ - RoomEvent["Reconnected"] = "reconnected"; - /** - * When disconnected from room. This fires when room.disconnect() is called or - * when an unrecoverable connection issue had occured - */ - RoomEvent["Disconnected"] = "disconnected"; - /** - * Whenever the connection state of the room changes - * - * args: ([[ConnectionState]]) - */ - RoomEvent["ConnectionStateChanged"] = "connectionStateChanged"; - /** - * @deprecated StateChanged has been renamed to ConnectionStateChanged - */ - RoomEvent["StateChanged"] = "connectionStateChanged"; - /** - * When input or output devices on the machine have changed. - */ - RoomEvent["MediaDevicesChanged"] = "mediaDevicesChanged"; - /** - * When a [[RemoteParticipant]] joins *after* the local - * participant. It will not emit events for participants that are already - * in the room - * - * args: ([[RemoteParticipant]]) - */ - RoomEvent["ParticipantConnected"] = "participantConnected"; - /** - * When a [[RemoteParticipant]] leaves *after* the local - * participant has joined. - * - * args: ([[RemoteParticipant]]) - */ - RoomEvent["ParticipantDisconnected"] = "participantDisconnected"; - /** - * When a new track is published to room *after* the local - * participant has joined. It will not fire for tracks that are already published. - * - * A track published doesn't mean the participant has subscribed to it. It's - * simply reflecting the state of the room. - * - * args: ([[RemoteTrackPublication]], [[RemoteParticipant]]) - */ - RoomEvent["TrackPublished"] = "trackPublished"; - /** - * The [[LocalParticipant]] has subscribed to a new track. This event will **always** - * fire as long as new tracks are ready for use. - * - * args: ([[RemoteTrack]], [[RemoteTrackPublication]], [[RemoteParticipant]]) - */ - RoomEvent["TrackSubscribed"] = "trackSubscribed"; - /** - * Could not subscribe to a track - * - * args: (track sid, [[RemoteParticipant]]) - */ - RoomEvent["TrackSubscriptionFailed"] = "trackSubscriptionFailed"; - /** - * A [[RemoteParticipant]] has unpublished a track - * - * args: ([[RemoteTrackPublication]], [[RemoteParticipant]]) - */ - RoomEvent["TrackUnpublished"] = "trackUnpublished"; - /** - * A subscribed track is no longer available. Clients should listen to this - * event and ensure they detach tracks. - * - * args: ([[Track]], [[RemoteTrackPublication]], [[RemoteParticipant]]) - */ - RoomEvent["TrackUnsubscribed"] = "trackUnsubscribed"; - /** - * A track that was muted, fires on both [[RemoteParticipant]]s and [[LocalParticipant]] - * - * args: ([[TrackPublication]], [[Participant]]) - */ - RoomEvent["TrackMuted"] = "trackMuted"; - /** - * A track that was unmuted, fires on both [[RemoteParticipant]]s and [[LocalParticipant]] - * - * args: ([[TrackPublication]], [[Participant]]) - */ - RoomEvent["TrackUnmuted"] = "trackUnmuted"; - /** - * A local track was published successfully. This event is helpful to know - * when to update your local UI with the newly published track. - * - * args: ([[LocalTrackPublication]], [[LocalParticipant]]) - */ - RoomEvent["LocalTrackPublished"] = "localTrackPublished"; - /** - * A local track was unpublished. This event is helpful to know when to remove - * the local track from your UI. - * - * When a user stops sharing their screen by pressing "End" on the browser UI, - * this event will also fire. - * - * args: ([[LocalTrackPublication]], [[LocalParticipant]]) - */ - RoomEvent["LocalTrackUnpublished"] = "localTrackUnpublished"; - /** - * When a local audio track is published the SDK checks whether there is complete silence - * on that track and emits the LocalAudioSilenceDetected event in that case. - * This allows for applications to show UI informing users that they might have to - * reset their audio hardware or check for proper device connectivity. - */ - RoomEvent["LocalAudioSilenceDetected"] = "localAudioSilenceDetected"; - /** - * Active speakers changed. List of speakers are ordered by their audio level. - * loudest speakers first. This will include the LocalParticipant too. - * - * Speaker updates are sent only to the publishing participant and their subscribers. - * - * args: (Array<[[Participant]]>) - */ - RoomEvent["ActiveSpeakersChanged"] = "activeSpeakersChanged"; - /** - * Participant metadata is a simple way for app-specific state to be pushed to - * all users. - * When RoomService.UpdateParticipantMetadata is called to change a participant's - * state, *all* participants in the room will fire this event. - * - * args: (prevMetadata: string, [[Participant]]) - * - */ - RoomEvent["ParticipantMetadataChanged"] = "participantMetadataChanged"; - /** - * Participant's display name changed - * - * args: (name: string, [[Participant]]) - * - */ - RoomEvent["ParticipantNameChanged"] = "participantNameChanged"; - /** - * Room metadata is a simple way for app-specific state to be pushed to - * all users. - * When RoomService.UpdateRoomMetadata is called to change a room's state, - * *all* participants in the room will fire this event. - * - * args: (string) - */ - RoomEvent["RoomMetadataChanged"] = "roomMetadataChanged"; - /** - * Data received from another participant. - * Data packets provides the ability to use LiveKit to send/receive arbitrary payloads. - * All participants in the room will receive the messages sent to the room. - * - * args: (payload: Uint8Array, participant: [[Participant]], kind: [[DataPacket_Kind]], topic?: string) - */ - RoomEvent["DataReceived"] = "dataReceived"; - /** - * Connection quality was changed for a Participant. It'll receive updates - * from the local participant, as well as any [[RemoteParticipant]]s that we are - * subscribed to. - * - * args: (connectionQuality: [[ConnectionQuality]], participant: [[Participant]]) - */ - RoomEvent["ConnectionQualityChanged"] = "connectionQualityChanged"; - /** - * StreamState indicates if a subscribed (remote) track has been paused by the SFU - * (typically this happens because of subscriber's bandwidth constraints) - * - * When bandwidth conditions allow, the track will be resumed automatically. - * TrackStreamStateChanged will also be emitted when that happens. - * - * args: (pub: [[RemoteTrackPublication]], streamState: [[Track.StreamState]], - * participant: [[RemoteParticipant]]) - */ - RoomEvent["TrackStreamStateChanged"] = "trackStreamStateChanged"; - /** - * One of subscribed tracks have changed its permissions for the current - * participant. If permission was revoked, then the track will no longer - * be subscribed. If permission was granted, a TrackSubscribed event will - * be emitted. - * - * args: (pub: [[RemoteTrackPublication]], - * status: [[TrackPublication.SubscriptionStatus]], - * participant: [[RemoteParticipant]]) - */ - RoomEvent["TrackSubscriptionPermissionChanged"] = "trackSubscriptionPermissionChanged"; - /** - * One of subscribed tracks have changed its status for the current - * participant. - * - * args: (pub: [[RemoteTrackPublication]], - * status: [[TrackPublication.SubscriptionStatus]], - * participant: [[RemoteParticipant]]) - */ - RoomEvent["TrackSubscriptionStatusChanged"] = "trackSubscriptionStatusChanged"; - /** - * LiveKit will attempt to autoplay all audio tracks when you attach them to - * audio elements. However, if that fails, we'll notify you via AudioPlaybackStatusChanged. - * `Room.canPlayAudio` will indicate if audio playback is permitted. - */ - RoomEvent["AudioPlaybackStatusChanged"] = "audioPlaybackChanged"; - /** - * When we have encountered an error while attempting to create a track. - * The errors take place in getUserMedia(). - * Use MediaDeviceFailure.getFailure(error) to get the reason of failure. - * [[LocalParticipant.lastCameraError]] and [[LocalParticipant.lastMicrophoneError]] - * will indicate if it had an error while creating the audio or video track respectively. - * - * args: (error: Error) - */ - RoomEvent["MediaDevicesError"] = "mediaDevicesError"; - /** - * A participant's permission has changed. Currently only fired on LocalParticipant. - * args: (prevPermissions: [[ParticipantPermission]], participant: [[Participant]]) - */ - RoomEvent["ParticipantPermissionsChanged"] = "participantPermissionsChanged"; - /** - * Signal connected, can publish tracks. - */ - RoomEvent["SignalConnected"] = "signalConnected"; - /** - * Recording of a room has started/stopped. Room.isRecording will be updated too. - * args: (isRecording: boolean) - */ - RoomEvent["RecordingStatusChanged"] = "recordingStatusChanged"; - /** - * Emits whenever the current buffer status of a data channel changes - * args: (isLow: boolean, kind: [[DataPacket_Kind]]) - */ - RoomEvent["DCBufferStatusChanged"] = "dcBufferStatusChanged"; -})(RoomEvent || (RoomEvent = {})); -var ParticipantEvent; -(function (ParticipantEvent) { - /** - * When a new track is published to room *after* the local - * participant has joined. It will not fire for tracks that are already published. - * - * A track published doesn't mean the participant has subscribed to it. It's - * simply reflecting the state of the room. - * - * args: ([[RemoteTrackPublication]]) - */ - ParticipantEvent["TrackPublished"] = "trackPublished"; - /** - * Successfully subscribed to the [[RemoteParticipant]]'s track. - * This event will **always** fire as long as new tracks are ready for use. - * - * args: ([[RemoteTrack]], [[RemoteTrackPublication]]) - */ - ParticipantEvent["TrackSubscribed"] = "trackSubscribed"; - /** - * Could not subscribe to a track - * - * args: (track sid) - */ - ParticipantEvent["TrackSubscriptionFailed"] = "trackSubscriptionFailed"; - /** - * A [[RemoteParticipant]] has unpublished a track - * - * args: ([[RemoteTrackPublication]]) - */ - ParticipantEvent["TrackUnpublished"] = "trackUnpublished"; - /** - * A subscribed track is no longer available. Clients should listen to this - * event and ensure they detach tracks. - * - * args: ([[RemoteTrack]], [[RemoteTrackPublication]]) - */ - ParticipantEvent["TrackUnsubscribed"] = "trackUnsubscribed"; - /** - * A track that was muted, fires on both [[RemoteParticipant]]s and [[LocalParticipant]] - * - * args: ([[TrackPublication]]) - */ - ParticipantEvent["TrackMuted"] = "trackMuted"; - /** - * A track that was unmuted, fires on both [[RemoteParticipant]]s and [[LocalParticipant]] - * - * args: ([[TrackPublication]]) - */ - ParticipantEvent["TrackUnmuted"] = "trackUnmuted"; - /** - * A local track was published successfully. This event is helpful to know - * when to update your local UI with the newly published track. - * - * args: ([[LocalTrackPublication]]) - */ - ParticipantEvent["LocalTrackPublished"] = "localTrackPublished"; - /** - * A local track was unpublished. This event is helpful to know when to remove - * the local track from your UI. - * - * When a user stops sharing their screen by pressing "End" on the browser UI, - * this event will also fire. - * - * args: ([[LocalTrackPublication]]) - */ - ParticipantEvent["LocalTrackUnpublished"] = "localTrackUnpublished"; - /** - * Participant metadata is a simple way for app-specific state to be pushed to - * all users. - * When RoomService.UpdateParticipantMetadata is called to change a participant's - * state, *all* participants in the room will fire this event. - * To access the current metadata, see [[Participant.metadata]]. - * - * args: (prevMetadata: string) - * - */ - ParticipantEvent["ParticipantMetadataChanged"] = "participantMetadataChanged"; - /** - * Participant's display name changed - * - * args: (name: string, [[Participant]]) - * - */ - ParticipantEvent["ParticipantNameChanged"] = "participantNameChanged"; - /** - * Data received from this participant as sender. - * Data packets provides the ability to use LiveKit to send/receive arbitrary payloads. - * All participants in the room will receive the messages sent to the room. - * - * args: (payload: Uint8Array, kind: [[DataPacket_Kind]]) - */ - ParticipantEvent["DataReceived"] = "dataReceived"; - /** - * Has speaking status changed for the current participant - * - * args: (speaking: boolean) - */ - ParticipantEvent["IsSpeakingChanged"] = "isSpeakingChanged"; - /** - * Connection quality was changed for a Participant. It'll receive updates - * from the local participant, as well as any [[RemoteParticipant]]s that we are - * subscribed to. - * - * args: (connectionQuality: [[ConnectionQuality]]) - */ - ParticipantEvent["ConnectionQualityChanged"] = "connectionQualityChanged"; - /** - * StreamState indicates if a subscribed track has been paused by the SFU - * (typically this happens because of subscriber's bandwidth constraints) - * - * When bandwidth conditions allow, the track will be resumed automatically. - * TrackStreamStateChanged will also be emitted when that happens. - * - * args: (pub: [[RemoteTrackPublication]], streamState: [[Track.StreamState]]) - */ - ParticipantEvent["TrackStreamStateChanged"] = "trackStreamStateChanged"; - /** - * One of subscribed tracks have changed its permissions for the current - * participant. If permission was revoked, then the track will no longer - * be subscribed. If permission was granted, a TrackSubscribed event will - * be emitted. - * - * args: (pub: [[RemoteTrackPublication]], - * status: [[TrackPublication.SubscriptionStatus]]) - */ - ParticipantEvent["TrackSubscriptionPermissionChanged"] = "trackSubscriptionPermissionChanged"; - /** - * One of the remote participants publications has changed its subscription status. - * - */ - ParticipantEvent["TrackSubscriptionStatusChanged"] = "trackSubscriptionStatusChanged"; - // fired only on LocalParticipant - /** @internal */ - ParticipantEvent["MediaDevicesError"] = "mediaDevicesError"; - /** - * A participant's permission has changed. Currently only fired on LocalParticipant. - * args: (prevPermissions: [[ParticipantPermission]]) - */ - ParticipantEvent["ParticipantPermissionsChanged"] = "participantPermissionsChanged"; -})(ParticipantEvent || (ParticipantEvent = {})); -/** @internal */ -var EngineEvent; -(function (EngineEvent) { - EngineEvent["TransportsCreated"] = "transportsCreated"; - EngineEvent["Connected"] = "connected"; - EngineEvent["Disconnected"] = "disconnected"; - EngineEvent["Resuming"] = "resuming"; - EngineEvent["Resumed"] = "resumed"; - EngineEvent["Restarting"] = "restarting"; - EngineEvent["Restarted"] = "restarted"; - EngineEvent["SignalResumed"] = "signalResumed"; - EngineEvent["SignalRestarted"] = "signalRestarted"; - EngineEvent["Closing"] = "closing"; - EngineEvent["MediaTrackAdded"] = "mediaTrackAdded"; - EngineEvent["ActiveSpeakersUpdate"] = "activeSpeakersUpdate"; - EngineEvent["DataPacketReceived"] = "dataPacketReceived"; - EngineEvent["DCBufferStatusChanged"] = "dcBufferStatusChanged"; -})(EngineEvent || (EngineEvent = {})); -var TrackEvent; -(function (TrackEvent) { - TrackEvent["Message"] = "message"; - TrackEvent["Muted"] = "muted"; - TrackEvent["Unmuted"] = "unmuted"; - /** - * Only fires on LocalTracks - */ - TrackEvent["Restarted"] = "restarted"; - TrackEvent["Ended"] = "ended"; - TrackEvent["Subscribed"] = "subscribed"; - TrackEvent["Unsubscribed"] = "unsubscribed"; - /** @internal */ - TrackEvent["UpdateSettings"] = "updateSettings"; - /** @internal */ - TrackEvent["UpdateSubscription"] = "updateSubscription"; - /** @internal */ - TrackEvent["AudioPlaybackStarted"] = "audioPlaybackStarted"; - /** @internal */ - TrackEvent["AudioPlaybackFailed"] = "audioPlaybackFailed"; - /** - * @internal - * Only fires on LocalAudioTrack instances - */ - TrackEvent["AudioSilenceDetected"] = "audioSilenceDetected"; - /** @internal */ - TrackEvent["VisibilityChanged"] = "visibilityChanged"; - /** @internal */ - TrackEvent["VideoDimensionsChanged"] = "videoDimensionsChanged"; - /** @internal */ - TrackEvent["ElementAttached"] = "elementAttached"; - /** @internal */ - TrackEvent["ElementDetached"] = "elementDetached"; - /** - * @internal - * Only fires on LocalTracks - */ - TrackEvent["UpstreamPaused"] = "upstreamPaused"; - /** - * @internal - * Only fires on LocalTracks - */ - TrackEvent["UpstreamResumed"] = "upstreamResumed"; - /** - * @internal - * Fires on RemoteTrackPublication - */ - TrackEvent["SubscriptionPermissionChanged"] = "subscriptionPermissionChanged"; - /** - * Fires on RemoteTrackPublication - */ - TrackEvent["SubscriptionStatusChanged"] = "subscriptionStatusChanged"; - /** - * Fires on RemoteTrackPublication - */ - TrackEvent["SubscriptionFailed"] = "subscriptionFailed"; -})(TrackEvent || (TrackEvent = {})); - -const BACKGROUND_REACTION_DELAY = 5000; -// keep old audio elements when detached, we would re-use them since on iOS -// Safari tracks which audio elements have been "blessed" by the user. -const recycledElements = []; -class Track extends eventsExports.EventEmitter { - constructor(mediaTrack, kind) { - super(); - this.attachedElements = []; - this.isMuted = false; - /** - * indicates current state of stream, it'll indicate `paused` if the track - * has been paused by congestion controller - */ - this.streamState = Track.StreamState.Active; - this.isInBackground = false; - this._currentBitrate = 0; - this.appVisibilityChangedListener = () => { - if (this.backgroundTimeout) { - clearTimeout(this.backgroundTimeout); - } - // delay app visibility update if it goes to hidden - // update immediately if it comes back to focus - if (document.visibilityState === 'hidden') { - this.backgroundTimeout = setTimeout(() => this.handleAppVisibilityChanged(), BACKGROUND_REACTION_DELAY); - } else { - this.handleAppVisibilityChanged(); - } - }; - this.setMaxListeners(100); - this.kind = kind; - this._mediaStreamTrack = mediaTrack; - this._mediaStreamID = mediaTrack.id; - this.source = Track.Source.Unknown; - } - /** current receive bits per second */ - get currentBitrate() { - return this._currentBitrate; - } - get mediaStreamTrack() { - return this._mediaStreamTrack; - } - /** - * @internal - * used for keep mediaStream's first id, since it's id might change - * if we disable/enable a track - */ - get mediaStreamID() { - return this._mediaStreamID; - } - attach(element) { - let elementType = 'audio'; - if (this.kind === Track.Kind.Video) { - elementType = 'video'; - } - if (this.attachedElements.length === 0 && Track.Kind.Video) { - this.addAppVisibilityListener(); - } - if (!element) { - if (elementType === 'audio') { - recycledElements.forEach(e => { - if (e.parentElement === null && !element) { - element = e; - } - }); - if (element) { - // remove it from pool - recycledElements.splice(recycledElements.indexOf(element), 1); - } - } - if (!element) { - element = document.createElement(elementType); - } - } - if (!this.attachedElements.includes(element)) { - this.attachedElements.push(element); - } - // even if we believe it's already attached to the element, it's possible - // the element's srcObject was set to something else out of band. - // we'll want to re-attach it in that case - attachToElement(this.mediaStreamTrack, element); - // handle auto playback failures - const allMediaStreamTracks = element.srcObject.getTracks(); - if (allMediaStreamTracks.some(tr => tr.kind === 'audio')) { - // manually play audio to detect audio playback status - element.play().then(() => { - this.emit(TrackEvent.AudioPlaybackStarted); - }).catch(e => { - if (e.name === 'NotAllowedError') { - this.emit(TrackEvent.AudioPlaybackFailed, e); - } else { - livekitLogger.warn('could not playback audio', e); - } - // If audio playback isn't allowed make sure we still play back the video - if (element && allMediaStreamTracks.some(tr => tr.kind === 'video') && e.name === 'NotAllowedError') { - element.muted = true; - element.play().catch(() => { - // catch for Safari, exceeded options at this point to automatically play the media element - }); - } - }); - } - this.emit(TrackEvent.ElementAttached, element); - return element; - } - detach(element) { - try { - // detach from a single element - if (element) { - detachTrack(this.mediaStreamTrack, element); - const idx = this.attachedElements.indexOf(element); - if (idx >= 0) { - this.attachedElements.splice(idx, 1); - this.recycleElement(element); - this.emit(TrackEvent.ElementDetached, element); - } - return element; - } - const detached = []; - this.attachedElements.forEach(elm => { - detachTrack(this.mediaStreamTrack, elm); - detached.push(elm); - this.recycleElement(elm); - this.emit(TrackEvent.ElementDetached, elm); - }); - // remove all tracks - this.attachedElements = []; - return detached; - } finally { - if (this.attachedElements.length === 0) { - this.removeAppVisibilityListener(); - } - } - } - stop() { - this.stopMonitor(); - this._mediaStreamTrack.stop(); - } - enable() { - this._mediaStreamTrack.enabled = true; - } - disable() { - this._mediaStreamTrack.enabled = false; - } - /* @internal */ - stopMonitor() { - if (this.monitorInterval) { - clearInterval(this.monitorInterval); - } - } - recycleElement(element) { - if (element instanceof HTMLAudioElement) { - // we only need to re-use a single element - let shouldCache = true; - element.pause(); - recycledElements.forEach(e => { - if (!e.parentElement) { - shouldCache = false; - } - }); - if (shouldCache) { - recycledElements.push(element); - } - } - } - handleAppVisibilityChanged() { - return __awaiter(this, void 0, void 0, function* () { - this.isInBackground = document.visibilityState === 'hidden'; - }); - } - addAppVisibilityListener() { - if (isWeb()) { - this.isInBackground = document.visibilityState === 'hidden'; - document.addEventListener('visibilitychange', this.appVisibilityChangedListener); - } else { - this.isInBackground = false; - } - } - removeAppVisibilityListener() { - if (isWeb()) { - document.removeEventListener('visibilitychange', this.appVisibilityChangedListener); - } - } -} -/** @internal */ -function attachToElement(track, element) { - let mediaStream; - if (element.srcObject instanceof MediaStream) { - mediaStream = element.srcObject; - } else { - mediaStream = new MediaStream(); - } - // check if track matches existing track - let existingTracks; - if (track.kind === 'audio') { - existingTracks = mediaStream.getAudioTracks(); - } else { - existingTracks = mediaStream.getVideoTracks(); - } - if (!existingTracks.includes(track)) { - existingTracks.forEach(et => { - mediaStream.removeTrack(et); - }); - mediaStream.addTrack(track); - } - element.autoplay = true; - // In case there are no audio tracks present on the mediastream, we set the element as muted to ensure autoplay works - element.muted = mediaStream.getAudioTracks().length === 0; - if (element instanceof HTMLVideoElement) { - element.playsInline = true; - } - // avoid flicker - if (element.srcObject !== mediaStream) { - element.srcObject = mediaStream; - if ((isSafari() || isFireFox()) && element instanceof HTMLVideoElement) { - // Firefox also has a timing issue where video doesn't actually get attached unless - // performed out-of-band - // Safari 15 has a bug where in certain layouts, video element renders - // black until the page is resized or other changes take place. - // Resetting the src triggers it to render. - // https://developer.apple.com/forums/thread/690523 - setTimeout(() => { - element.srcObject = mediaStream; - // Safari 15 sometimes fails to start a video - // when the window is backgrounded before the first frame is drawn - // manually calling play here seems to fix that - element.play().catch(() => { - /* do nothing */ - }); - }, 0); - } - } -} -/** @internal */ -function detachTrack(track, element) { - if (element.srcObject instanceof MediaStream) { - const mediaStream = element.srcObject; - mediaStream.removeTrack(track); - if (mediaStream.getTracks().length > 0) { - element.srcObject = mediaStream; - } else { - element.srcObject = null; - } - } -} -(function (Track) { - let Kind; - (function (Kind) { - Kind["Audio"] = "audio"; - Kind["Video"] = "video"; - Kind["Unknown"] = "unknown"; - })(Kind = Track.Kind || (Track.Kind = {})); - let Source; - (function (Source) { - Source["Camera"] = "camera"; - Source["Microphone"] = "microphone"; - Source["ScreenShare"] = "screen_share"; - Source["ScreenShareAudio"] = "screen_share_audio"; - Source["Unknown"] = "unknown"; - })(Source = Track.Source || (Track.Source = {})); - let StreamState$1; - (function (StreamState) { - StreamState["Active"] = "active"; - StreamState["Paused"] = "paused"; - StreamState["Unknown"] = "unknown"; - })(StreamState$1 = Track.StreamState || (Track.StreamState = {})); - /** @internal */ - function kindToProto(k) { - switch (k) { - case Kind.Audio: - return TrackType.AUDIO; - case Kind.Video: - return TrackType.VIDEO; - default: - return TrackType.UNRECOGNIZED; - } - } - Track.kindToProto = kindToProto; - /** @internal */ - function kindFromProto(t) { - switch (t) { - case TrackType.AUDIO: - return Kind.Audio; - case TrackType.VIDEO: - return Kind.Video; - default: - return Kind.Unknown; - } - } - Track.kindFromProto = kindFromProto; - /** @internal */ - function sourceToProto(s) { - switch (s) { - case Source.Camera: - return TrackSource.CAMERA; - case Source.Microphone: - return TrackSource.MICROPHONE; - case Source.ScreenShare: - return TrackSource.SCREEN_SHARE; - case Source.ScreenShareAudio: - return TrackSource.SCREEN_SHARE_AUDIO; - default: - return TrackSource.UNRECOGNIZED; - } - } - Track.sourceToProto = sourceToProto; - /** @internal */ - function sourceFromProto(s) { - switch (s) { - case TrackSource.CAMERA: - return Source.Camera; - case TrackSource.MICROPHONE: - return Source.Microphone; - case TrackSource.SCREEN_SHARE: - return Source.ScreenShare; - case TrackSource.SCREEN_SHARE_AUDIO: - return Source.ScreenShareAudio; - default: - return Source.Unknown; - } - } - Track.sourceFromProto = sourceFromProto; - /** @internal */ - function streamStateFromProto(s) { - switch (s) { - case StreamState.ACTIVE: - return StreamState$1.Active; - case StreamState.PAUSED: - return StreamState$1.Paused; - default: - return StreamState$1.Unknown; - } - } - Track.streamStateFromProto = streamStateFromProto; -})(Track || (Track = {})); - -const lossyDataChannel = '_lossy'; -const reliableDataChannel = '_reliable'; -const minReconnectWait = 2 * 1000; -const leaveReconnect = 'leave-reconnect'; -var PCState; -(function (PCState) { - PCState[PCState["New"] = 0] = "New"; - PCState[PCState["Connected"] = 1] = "Connected"; - PCState[PCState["Disconnected"] = 2] = "Disconnected"; - PCState[PCState["Reconnecting"] = 3] = "Reconnecting"; - PCState[PCState["Closed"] = 4] = "Closed"; -})(PCState || (PCState = {})); -/** @internal */ -class RTCEngine extends eventsExports.EventEmitter { - get isClosed() { - return this._isClosed; - } - constructor(options) { - super(); - this.options = options; - this.rtcConfig = {}; - this.peerConnectionTimeout = roomConnectOptionDefaults.peerConnectionTimeout; - this.fullReconnectOnNext = false; - this.subscriberPrimary = false; - this.pcState = PCState.New; - this._isClosed = true; - this.pendingTrackResolvers = {}; - // true if publisher connection has already been established. - // this is helpful to know if we need to restart ICE on the publisher connection - this.hasPublished = false; - this.reconnectAttempts = 0; - this.reconnectStart = 0; - this.attemptingReconnect = false; - /** keeps track of how often an initial join connection has been tried */ - this.joinAttempts = 0; - /** specifies how often an initial join connection is allowed to retry */ - this.maxJoinAttempts = 1; - this.shouldFailNext = false; - this.handleDataChannel = _ref => { - let { - channel - } = _ref; - return __awaiter(this, void 0, void 0, function* () { - if (!channel) { - return; - } - if (channel.label === reliableDataChannel) { - this.reliableDCSub = channel; - } else if (channel.label === lossyDataChannel) { - this.lossyDCSub = channel; - } else { - return; - } - livekitLogger.debug("on data channel ".concat(channel.id, ", ").concat(channel.label)); - channel.onmessage = this.handleDataMessage; - }); - }; - this.handleDataMessage = message => __awaiter(this, void 0, void 0, function* () { - var _a, _b; - // make sure to respect incoming data message order by processing message events one after the other - const unlock = yield this.dataProcessLock.lock(); - try { - // decode - let buffer; - if (message.data instanceof ArrayBuffer) { - buffer = message.data; - } else if (message.data instanceof Blob) { - buffer = yield message.data.arrayBuffer(); - } else { - livekitLogger.error('unsupported data type', message.data); - return; - } - const dp = DataPacket.decode(new Uint8Array(buffer)); - if (((_a = dp.value) === null || _a === void 0 ? void 0 : _a.$case) === 'speaker') { - // dispatch speaker updates - this.emit(EngineEvent.ActiveSpeakersUpdate, dp.value.speaker.speakers); - } else if (((_b = dp.value) === null || _b === void 0 ? void 0 : _b.$case) === 'user') { - this.emit(EngineEvent.DataPacketReceived, dp.value.user, dp.kind); - } - } finally { - unlock(); - } - }); - this.handleDataError = event => { - const channel = event.currentTarget; - const channelKind = channel.maxRetransmits === 0 ? 'lossy' : 'reliable'; - if (event instanceof ErrorEvent) { - const { - error - } = event.error; - livekitLogger.error("DataChannel error on ".concat(channelKind, ": ").concat(event.message), error); - } else { - livekitLogger.error("Unknown DataChannel Error on ".concat(channelKind), event); - } - }; - this.handleBufferedAmountLow = event => { - const channel = event.currentTarget; - const channelKind = channel.maxRetransmits === 0 ? DataPacket_Kind.LOSSY : DataPacket_Kind.RELIABLE; - this.updateAndEmitDCBufferStatus(channelKind); - }; - // websocket reconnect behavior. if websocket is interrupted, and the PeerConnection - // continues to work, we can reconnect to websocket to continue the session - // after a number of retries, we'll close and give up permanently - this.handleDisconnect = (connection, disconnectReason) => { - if (this._isClosed) { - return; - } - livekitLogger.warn("".concat(connection, " disconnected")); - if (this.reconnectAttempts === 0) { - // only reset start time on the first try - this.reconnectStart = Date.now(); - } - const disconnect = duration => { - livekitLogger.warn("could not recover connection after ".concat(this.reconnectAttempts, " attempts, ").concat(duration, "ms. giving up")); - this.emit(EngineEvent.Disconnected); - this.close(); - }; - const duration = Date.now() - this.reconnectStart; - let delay = this.getNextRetryDelay({ - elapsedMs: duration, - retryCount: this.reconnectAttempts - }); - if (delay === null) { - disconnect(duration); - return; - } - if (connection === leaveReconnect) { - delay = 0; - } - livekitLogger.debug("reconnecting in ".concat(delay, "ms")); - this.clearReconnectTimeout(); - if (this.url && this.token && isCloud(new URL(this.url))) { - this.regionUrlProvider = new RegionUrlProvider(this.url, this.token); - } - this.reconnectTimeout = CriticalTimers.setTimeout(() => this.attemptReconnect(disconnectReason), delay); - }; - this.waitForRestarted = () => { - return new Promise((resolve, reject) => { - if (this.pcState === PCState.Connected) { - resolve(); - } - const onRestarted = () => { - this.off(EngineEvent.Disconnected, onDisconnected); - resolve(); - }; - const onDisconnected = () => { - this.off(EngineEvent.Restarted, onRestarted); - reject(); - }; - this.once(EngineEvent.Restarted, onRestarted); - this.once(EngineEvent.Disconnected, onDisconnected); - }); - }; - this.updateAndEmitDCBufferStatus = kind => { - const status = this.isBufferStatusLow(kind); - if (typeof status !== 'undefined' && status !== this.dcBufferStatus.get(kind)) { - this.dcBufferStatus.set(kind, status); - this.emit(EngineEvent.DCBufferStatusChanged, status, kind); - } - }; - this.isBufferStatusLow = kind => { - const dc = this.dataChannelForKind(kind); - if (dc) { - return dc.bufferedAmount <= dc.bufferedAmountLowThreshold; - } - }; - this.handleBrowserOnLine = () => { - // in case the engine is currently reconnecting, attempt a reconnect immediately after the browser state has changed to 'onLine' - if (this.client.isReconnecting) { - this.clearReconnectTimeout(); - this.attemptReconnect(ReconnectReason.RR_SIGNAL_DISCONNECTED); - } - }; - this.client = new SignalClient(); - this.client.signalLatency = this.options.expSignalLatency; - this.reconnectPolicy = this.options.reconnectPolicy; - this.registerOnLineListener(); - this.closingLock = new Mutex(); - this.dataProcessLock = new Mutex(); - this.dcBufferStatus = new Map([[DataPacket_Kind.LOSSY, true], [DataPacket_Kind.RELIABLE, true]]); - } - join(url, token, opts, abortSignal) { - return __awaiter(this, void 0, void 0, function* () { - this.url = url; - this.token = token; - this.signalOpts = opts; - try { - this.joinAttempts += 1; - const joinResponse = yield this.client.join(url, token, opts, abortSignal); - this._isClosed = false; - this.latestJoinResponse = joinResponse; - this.subscriberPrimary = joinResponse.subscriberPrimary; - if (!this.publisher) { - this.configure(joinResponse); - } - // create offer - if (!this.subscriberPrimary) { - this.negotiate(); - } - this.clientConfiguration = joinResponse.clientConfiguration; - return joinResponse; - } catch (e) { - if (e instanceof ConnectionError) { - if (e.reason === 1 /* ConnectionErrorReason.ServerUnreachable */) { - livekitLogger.warn("Couldn't connect to server, attempt ".concat(this.joinAttempts, " of ").concat(this.maxJoinAttempts)); - if (this.joinAttempts < this.maxJoinAttempts) { - return this.join(url, token, opts, abortSignal); - } - } - } - throw e; - } - }); - } - close() { - return __awaiter(this, void 0, void 0, function* () { - const unlock = yield this.closingLock.lock(); - if (this.isClosed) { - unlock(); - return; - } - try { - this._isClosed = true; - this.emit(EngineEvent.Closing); - this.removeAllListeners(); - this.deregisterOnLineListener(); - this.clearPendingReconnect(); - if (this.publisher && this.publisher.pc.signalingState !== 'closed') { - this.publisher.pc.getSenders().forEach(sender => { - var _a, _b; - try { - // TODO: react-native-webrtc doesn't have removeTrack yet. - if ((_a = this.publisher) === null || _a === void 0 ? void 0 : _a.pc.removeTrack) { - (_b = this.publisher) === null || _b === void 0 ? void 0 : _b.pc.removeTrack(sender); - } - } catch (e) { - livekitLogger.warn('could not removeTrack', { - error: e - }); - } - }); - this.publisher.close(); - this.publisher = undefined; - } - if (this.subscriber) { - this.subscriber.close(); - this.subscriber = undefined; - } - yield this.client.close(); - } finally { - unlock(); - } - }); - } - addTrack(req) { - if (this.pendingTrackResolvers[req.cid]) { - throw new TrackInvalidError('a track with the same ID has already been published'); - } - return new Promise((resolve, reject) => { - const publicationTimeout = setTimeout(() => { - delete this.pendingTrackResolvers[req.cid]; - reject(new ConnectionError('publication of local track timed out, no response from server')); - }, 10000); - this.pendingTrackResolvers[req.cid] = { - resolve: info => { - clearTimeout(publicationTimeout); - resolve(info); - }, - reject: () => { - clearTimeout(publicationTimeout); - reject(new Error('Cancelled publication by calling unpublish')); - } - }; - this.client.sendAddTrack(req); - }); - } - /** - * Removes sender from PeerConnection, returning true if it was removed successfully - * and a negotiation is necessary - * @param sender - * @returns - */ - removeTrack(sender) { - var _a; - if (sender.track && this.pendingTrackResolvers[sender.track.id]) { - const { - reject - } = this.pendingTrackResolvers[sender.track.id]; - if (reject) { - reject(); - } - delete this.pendingTrackResolvers[sender.track.id]; - } - try { - (_a = this.publisher) === null || _a === void 0 ? void 0 : _a.pc.removeTrack(sender); - return true; - } catch (e) { - livekitLogger.warn('failed to remove track', { - error: e, - method: 'removeTrack' - }); - } - return false; - } - updateMuteStatus(trackSid, muted) { - this.client.sendMuteTrack(trackSid, muted); - } - get dataSubscriberReadyState() { - var _a; - return (_a = this.reliableDCSub) === null || _a === void 0 ? void 0 : _a.readyState; - } - getConnectedServerAddress() { - return __awaiter(this, void 0, void 0, function* () { - if (this.primaryPC === undefined) { - return undefined; - } - return getConnectedAddress(this.primaryPC); - }); - } - configure(joinResponse) { - var _a; - // already configured - if (this.publisher || this.subscriber) { - return; - } - this.participantSid = (_a = joinResponse.participant) === null || _a === void 0 ? void 0 : _a.sid; - const rtcConfig = this.makeRTCConfiguration(joinResponse); - const googConstraints = { - optional: [{ - googDscp: true - }] - }; - this.publisher = new PCTransport(rtcConfig, googConstraints); - this.subscriber = new PCTransport(rtcConfig); - this.emit(EngineEvent.TransportsCreated, this.publisher, this.subscriber); - this.publisher.pc.onicecandidate = ev => { - if (!ev.candidate) return; - livekitLogger.trace('adding ICE candidate for peer', ev.candidate); - this.client.sendIceCandidate(ev.candidate, SignalTarget.PUBLISHER); - }; - this.subscriber.pc.onicecandidate = ev => { - if (!ev.candidate) return; - this.client.sendIceCandidate(ev.candidate, SignalTarget.SUBSCRIBER); - }; - this.publisher.onOffer = offer => { - this.client.sendOffer(offer); - }; - let primaryPC = this.publisher.pc; - let secondaryPC = this.subscriber.pc; - let subscriberPrimary = joinResponse.subscriberPrimary; - if (subscriberPrimary) { - primaryPC = this.subscriber.pc; - secondaryPC = this.publisher.pc; - // in subscriber primary mode, server side opens sub data channels. - this.subscriber.pc.ondatachannel = this.handleDataChannel; - } - this.primaryPC = primaryPC; - primaryPC.onconnectionstatechange = () => __awaiter(this, void 0, void 0, function* () { - livekitLogger.debug("primary PC state changed ".concat(primaryPC.connectionState)); - if (primaryPC.connectionState === 'connected') { - const shouldEmit = this.pcState === PCState.New; - this.pcState = PCState.Connected; - if (shouldEmit) { - this.emit(EngineEvent.Connected, joinResponse); - } - } else if (primaryPC.connectionState === 'failed') { - // on Safari, PeerConnection will switch to 'disconnected' during renegotiation - if (this.pcState === PCState.Connected) { - this.pcState = PCState.Disconnected; - this.handleDisconnect('primary peerconnection', subscriberPrimary ? ReconnectReason.RR_SUBSCRIBER_FAILED : ReconnectReason.RR_PUBLISHER_FAILED); - } - } - }); - secondaryPC.onconnectionstatechange = () => __awaiter(this, void 0, void 0, function* () { - livekitLogger.debug("secondary PC state changed ".concat(secondaryPC.connectionState)); - // also reconnect if secondary peerconnection fails - if (secondaryPC.connectionState === 'failed') { - this.handleDisconnect('secondary peerconnection', subscriberPrimary ? ReconnectReason.RR_PUBLISHER_FAILED : ReconnectReason.RR_SUBSCRIBER_FAILED); - } - }); - this.subscriber.pc.ontrack = ev => { - this.emit(EngineEvent.MediaTrackAdded, ev.track, ev.streams[0], ev.receiver); - }; - this.createDataChannels(); - // configure signaling client - this.client.onAnswer = sd => __awaiter(this, void 0, void 0, function* () { - if (!this.publisher) { - return; - } - livekitLogger.debug('received server answer', { - RTCSdpType: sd.type, - signalingState: this.publisher.pc.signalingState - }); - yield this.publisher.setRemoteDescription(sd); - }); - // add candidate on trickle - this.client.onTrickle = (candidate, target) => { - if (!this.publisher || !this.subscriber) { - return; - } - livekitLogger.trace('got ICE candidate from peer', { - candidate, - target - }); - if (target === SignalTarget.PUBLISHER) { - this.publisher.addIceCandidate(candidate); - } else { - this.subscriber.addIceCandidate(candidate); - } - }; - // when server creates an offer for the client - this.client.onOffer = sd => __awaiter(this, void 0, void 0, function* () { - if (!this.subscriber) { - return; - } - livekitLogger.debug('received server offer', { - RTCSdpType: sd.type, - signalingState: this.subscriber.pc.signalingState - }); - yield this.subscriber.setRemoteDescription(sd); - // answer the offer - const answer = yield this.subscriber.createAndSetAnswer(); - this.client.sendAnswer(answer); - }); - this.client.onLocalTrackPublished = res => { - livekitLogger.debug('received trackPublishedResponse', res); - const { - resolve - } = this.pendingTrackResolvers[res.cid]; - if (!resolve) { - livekitLogger.error("missing track resolver for ".concat(res.cid)); - return; - } - delete this.pendingTrackResolvers[res.cid]; - resolve(res.track); - }; - this.client.onTokenRefresh = token => { - this.token = token; - }; - this.client.onClose = () => { - this.handleDisconnect('signal', ReconnectReason.RR_SIGNAL_DISCONNECTED); - }; - this.client.onLeave = leave => { - if (leave === null || leave === void 0 ? void 0 : leave.canReconnect) { - this.fullReconnectOnNext = true; - this.primaryPC = undefined; - // reconnect immediately instead of waiting for next attempt - this.handleDisconnect(leaveReconnect); - } else { - this.emit(EngineEvent.Disconnected, leave === null || leave === void 0 ? void 0 : leave.reason); - this.close(); - } - livekitLogger.trace('leave request', { - leave - }); - }; - } - makeRTCConfiguration(serverResponse) { - const rtcConfig = Object.assign({}, this.rtcConfig); - // update ICE servers before creating PeerConnection - if (serverResponse.iceServers && !rtcConfig.iceServers) { - const rtcIceServers = []; - serverResponse.iceServers.forEach(iceServer => { - const rtcIceServer = { - urls: iceServer.urls - }; - if (iceServer.username) rtcIceServer.username = iceServer.username; - if (iceServer.credential) { - rtcIceServer.credential = iceServer.credential; - } - rtcIceServers.push(rtcIceServer); - }); - rtcConfig.iceServers = rtcIceServers; - } - if (serverResponse.clientConfiguration && serverResponse.clientConfiguration.forceRelay === ClientConfigSetting.ENABLED) { - rtcConfig.iceTransportPolicy = 'relay'; - } - // @ts-ignore - rtcConfig.sdpSemantics = 'unified-plan'; - // @ts-ignore - rtcConfig.continualGatheringPolicy = 'gather_continually'; - return rtcConfig; - } - createDataChannels() { - if (!this.publisher) { - return; - } - // clear old data channel callbacks if recreate - if (this.lossyDC) { - this.lossyDC.onmessage = null; - this.lossyDC.onerror = null; - } - if (this.reliableDC) { - this.reliableDC.onmessage = null; - this.reliableDC.onerror = null; - } - // create data channels - this.lossyDC = this.publisher.pc.createDataChannel(lossyDataChannel, { - // will drop older packets that arrive - ordered: true, - maxRetransmits: 0 - }); - this.reliableDC = this.publisher.pc.createDataChannel(reliableDataChannel, { - ordered: true - }); - // also handle messages over the pub channel, for backwards compatibility - this.lossyDC.onmessage = this.handleDataMessage; - this.reliableDC.onmessage = this.handleDataMessage; - // handle datachannel errors - this.lossyDC.onerror = this.handleDataError; - this.reliableDC.onerror = this.handleDataError; - // set up dc buffer threshold, set to 64kB (otherwise 0 by default) - this.lossyDC.bufferedAmountLowThreshold = 65535; - this.reliableDC.bufferedAmountLowThreshold = 65535; - // handle buffer amount low events - this.lossyDC.onbufferedamountlow = this.handleBufferedAmountLow; - this.reliableDC.onbufferedamountlow = this.handleBufferedAmountLow; - } - setPreferredCodec(transceiver, kind, videoCodec) { - if (!('getCapabilities' in RTCRtpSender)) { - return; - } - const cap = RTCRtpSender.getCapabilities(kind); - if (!cap) return; - livekitLogger.debug('get capabilities', cap); - const matched = []; - const partialMatched = []; - const unmatched = []; - cap.codecs.forEach(c => { - const codec = c.mimeType.toLowerCase(); - if (codec === 'audio/opus') { - matched.push(c); - return; - } - const matchesVideoCodec = codec === "video/".concat(videoCodec); - if (!matchesVideoCodec) { - unmatched.push(c); - return; - } - // for h264 codecs that have sdpFmtpLine available, use only if the - // profile-level-id is 42e01f for cross-browser compatibility - if (videoCodec === 'h264') { - if (c.sdpFmtpLine && c.sdpFmtpLine.includes('profile-level-id=42e01f')) { - matched.push(c); - } else { - partialMatched.push(c); - } - return; - } - matched.push(c); - }); - if (supportsSetCodecPreferences(transceiver)) { - transceiver.setCodecPreferences(matched.concat(partialMatched, unmatched)); - } - } - createSender(track, opts, encodings) { - return __awaiter(this, void 0, void 0, function* () { - if (supportsTransceiver()) { - return this.createTransceiverRTCRtpSender(track, opts, encodings); - } - if (supportsAddTrack()) { - livekitLogger.debug('using add-track fallback'); - return this.createRTCRtpSender(track.mediaStreamTrack); - } - throw new UnexpectedConnectionState('Required webRTC APIs not supported on this device'); - }); - } - createSimulcastSender(track, simulcastTrack, opts, encodings) { - return __awaiter(this, void 0, void 0, function* () { - // store RTCRtpSender - // @ts-ignore - if (supportsTransceiver()) { - return this.createSimulcastTransceiverSender(track, simulcastTrack, opts, encodings); - } - if (supportsAddTrack()) { - livekitLogger.debug('using add-track fallback'); - return this.createRTCRtpSender(track.mediaStreamTrack); - } - throw new UnexpectedConnectionState('Cannot stream on this device'); - }); - } - createTransceiverRTCRtpSender(track, opts, encodings) { - return __awaiter(this, void 0, void 0, function* () { - if (!this.publisher) { - throw new UnexpectedConnectionState('publisher is closed'); - } - const transceiverInit = { - direction: 'sendonly' - }; - if (encodings) { - transceiverInit.sendEncodings = encodings; - } - // addTransceiver for react-native is async. web is synchronous, but await won't effect it. - const transceiver = yield this.publisher.pc.addTransceiver(track.mediaStreamTrack, transceiverInit); - if (track.kind === Track.Kind.Video && opts.videoCodec) { - this.setPreferredCodec(transceiver, track.kind, opts.videoCodec); - track.codec = opts.videoCodec; - } - return transceiver.sender; - }); - } - createSimulcastTransceiverSender(track, simulcastTrack, opts, encodings) { - return __awaiter(this, void 0, void 0, function* () { - if (!this.publisher) { - throw new UnexpectedConnectionState('publisher is closed'); - } - const transceiverInit = { - direction: 'sendonly' - }; - if (encodings) { - transceiverInit.sendEncodings = encodings; - } - // addTransceiver for react-native is async. web is synchronous, but await won't effect it. - const transceiver = yield this.publisher.pc.addTransceiver(simulcastTrack.mediaStreamTrack, transceiverInit); - if (!opts.videoCodec) { - return; - } - this.setPreferredCodec(transceiver, track.kind, opts.videoCodec); - track.setSimulcastTrackSender(opts.videoCodec, transceiver.sender); - return transceiver.sender; - }); - } - createRTCRtpSender(track) { - return __awaiter(this, void 0, void 0, function* () { - if (!this.publisher) { - throw new UnexpectedConnectionState('publisher is closed'); - } - return this.publisher.pc.addTrack(track); - }); - } - attemptReconnect(reason) { - var _a, _b, _c; - return __awaiter(this, void 0, void 0, function* () { - if (this._isClosed) { - return; - } - // guard for attempting reconnection multiple times while one attempt is still not finished - if (this.attemptingReconnect) { - return; - } - if (((_a = this.clientConfiguration) === null || _a === void 0 ? void 0 : _a.resumeConnection) === ClientConfigSetting.DISABLED || - // signaling state could change to closed due to hardware sleep - // those connections cannot be resumed - ((_c = (_b = this.primaryPC) === null || _b === void 0 ? void 0 : _b.signalingState) !== null && _c !== void 0 ? _c : 'closed') === 'closed') { - this.fullReconnectOnNext = true; - } - try { - this.attemptingReconnect = true; - if (this.fullReconnectOnNext) { - yield this.restartConnection(); - } else { - yield this.resumeConnection(reason); - } - this.clearPendingReconnect(); - this.fullReconnectOnNext = false; - } catch (e) { - this.reconnectAttempts += 1; - let recoverable = true; - if (e instanceof UnexpectedConnectionState) { - livekitLogger.debug('received unrecoverable error', { - error: e - }); - // unrecoverable - recoverable = false; - } else if (!(e instanceof SignalReconnectError)) { - // cannot resume - this.fullReconnectOnNext = true; - } - if (recoverable) { - this.handleDisconnect('reconnect', ReconnectReason.RR_UNKOWN); - } else { - livekitLogger.info("could not recover connection after ".concat(this.reconnectAttempts, " attempts, ").concat(Date.now() - this.reconnectStart, "ms. giving up")); - this.emit(EngineEvent.Disconnected); - yield this.close(); - } - } finally { - this.attemptingReconnect = false; - } - }); - } - getNextRetryDelay(context) { - try { - return this.reconnectPolicy.nextRetryDelayInMs(context); - } catch (e) { - livekitLogger.warn('encountered error in reconnect policy', { - error: e - }); - } - // error in user code with provided reconnect policy, stop reconnecting - return null; - } - restartConnection(regionUrl) { - var _a, _b, _c, _d, _e; - return __awaiter(this, void 0, void 0, function* () { - try { - if (!this.url || !this.token) { - // permanent failure, don't attempt reconnection - throw new UnexpectedConnectionState('could not reconnect, url or token not saved'); - } - livekitLogger.info("reconnecting, attempt: ".concat(this.reconnectAttempts)); - this.emit(EngineEvent.Restarting); - if (this.client.isConnected) { - yield this.client.sendLeave(); - } - yield this.client.close(); - this.primaryPC = undefined; - (_a = this.publisher) === null || _a === void 0 ? void 0 : _a.close(); - this.publisher = undefined; - (_b = this.subscriber) === null || _b === void 0 ? void 0 : _b.close(); - this.subscriber = undefined; - let joinResponse; - try { - if (!this.signalOpts) { - livekitLogger.warn('attempted connection restart, without signal options present'); - throw new SignalReconnectError(); - } - // in case a regionUrl is passed, the region URL takes precedence - joinResponse = yield this.join(regionUrl !== null && regionUrl !== void 0 ? regionUrl : this.url, this.token, this.signalOpts); - } catch (e) { - if (e instanceof ConnectionError && e.reason === 0 /* ConnectionErrorReason.NotAllowed */) { - throw new UnexpectedConnectionState('could not reconnect, token might be expired'); - } - throw new SignalReconnectError(); - } - if (this.shouldFailNext) { - this.shouldFailNext = false; - throw new Error('simulated failure'); - } - this.client.setReconnected(); - this.emit(EngineEvent.SignalRestarted, joinResponse); - yield this.waitForPCReconnected(); - (_c = this.regionUrlProvider) === null || _c === void 0 ? void 0 : _c.resetAttempts(); - // reconnect success - this.emit(EngineEvent.Restarted); - } catch (error) { - const nextRegionUrl = yield (_d = this.regionUrlProvider) === null || _d === void 0 ? void 0 : _d.getNextBestRegionUrl(); - if (nextRegionUrl) { - yield this.restartConnection(nextRegionUrl); - return; - } else { - // no more regions to try (or we're not on cloud) - (_e = this.regionUrlProvider) === null || _e === void 0 ? void 0 : _e.resetAttempts(); - throw error; - } - } - }); - } - resumeConnection(reason) { - var _a; - return __awaiter(this, void 0, void 0, function* () { - if (!this.url || !this.token) { - // permanent failure, don't attempt reconnection - throw new UnexpectedConnectionState('could not reconnect, url or token not saved'); - } - // trigger publisher reconnect - if (!this.publisher || !this.subscriber) { - throw new UnexpectedConnectionState('publisher and subscriber connections unset'); - } - livekitLogger.info("resuming signal connection, attempt ".concat(this.reconnectAttempts)); - this.emit(EngineEvent.Resuming); - try { - const res = yield this.client.reconnect(this.url, this.token, this.participantSid, reason); - if (res) { - const rtcConfig = this.makeRTCConfiguration(res); - this.publisher.pc.setConfiguration(rtcConfig); - this.subscriber.pc.setConfiguration(rtcConfig); - } - } catch (e) { - let message = ''; - if (e instanceof Error) { - message = e.message; - } - if (e instanceof ConnectionError && e.reason === 0 /* ConnectionErrorReason.NotAllowed */) { - throw new UnexpectedConnectionState('could not reconnect, token might be expired'); - } - throw new SignalReconnectError(message); - } - this.emit(EngineEvent.SignalResumed); - if (this.shouldFailNext) { - this.shouldFailNext = false; - throw new Error('simulated failure'); - } - this.subscriber.restartingIce = true; - // only restart publisher if it's needed - if (this.hasPublished) { - yield this.publisher.createAndSendOffer({ - iceRestart: true - }); - } - yield this.waitForPCReconnected(); - this.client.setReconnected(); - // recreate publish datachannel if it's id is null - // (for safari https://bugs.webkit.org/show_bug.cgi?id=184688) - if (((_a = this.reliableDC) === null || _a === void 0 ? void 0 : _a.readyState) === 'open' && this.reliableDC.id === null) { - this.createDataChannels(); - } - // resume success - this.emit(EngineEvent.Resumed); - }); - } - waitForPCInitialConnection(timeout, abortController) { - return __awaiter(this, void 0, void 0, function* () { - if (this.pcState === PCState.Connected) { - return; - } - if (this.pcState !== PCState.New) { - throw new UnexpectedConnectionState('Expected peer connection to be new on initial connection'); - } - return new Promise((resolve, reject) => { - const abortHandler = () => { - livekitLogger.warn('closing engine'); - CriticalTimers.clearTimeout(connectTimeout); - reject(new ConnectionError('room connection has been cancelled', 3 /* ConnectionErrorReason.Cancelled */)); - }; - - if (abortController === null || abortController === void 0 ? void 0 : abortController.signal.aborted) { - abortHandler(); - } - abortController === null || abortController === void 0 ? void 0 : abortController.signal.addEventListener('abort', abortHandler); - const onConnected = () => { - CriticalTimers.clearTimeout(connectTimeout); - abortController === null || abortController === void 0 ? void 0 : abortController.signal.removeEventListener('abort', abortHandler); - resolve(); - }; - const connectTimeout = CriticalTimers.setTimeout(() => { - this.off(EngineEvent.Connected, onConnected); - reject(new ConnectionError('could not establish pc connection')); - }, timeout !== null && timeout !== void 0 ? timeout : this.peerConnectionTimeout); - this.once(EngineEvent.Connected, onConnected); - }); - }); - } - waitForPCReconnected() { - var _a; - return __awaiter(this, void 0, void 0, function* () { - const startTime = Date.now(); - let now = startTime; - this.pcState = PCState.Reconnecting; - livekitLogger.debug('waiting for peer connection to reconnect'); - while (now - startTime < this.peerConnectionTimeout) { - if (this.primaryPC === undefined) { - // we can abort early, connection is hosed - break; - } else if ( - // on Safari, we don't get a connectionstatechanged event during ICE restart - // this means we'd have to check its status manually and update address - // manually - now - startTime > minReconnectWait && ((_a = this.primaryPC) === null || _a === void 0 ? void 0 : _a.connectionState) === 'connected') { - this.pcState = PCState.Connected; - } - if (this.pcState === PCState.Connected) { - return; - } - yield sleep(100); - now = Date.now(); - } - // have not reconnected, throw - throw new ConnectionError('could not establish PC connection'); - }); - } - /* @internal */ - sendDataPacket(packet, kind) { - return __awaiter(this, void 0, void 0, function* () { - const msg = DataPacket.encode(packet).finish(); - // make sure we do have a data connection - yield this.ensurePublisherConnected(kind); - const dc = this.dataChannelForKind(kind); - if (dc) { - dc.send(msg); - } - this.updateAndEmitDCBufferStatus(kind); - }); - } - /** - * @internal - */ - ensureDataTransportConnected(kind) { - let subscriber = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.subscriberPrimary; - var _a, _b, _c; - return __awaiter(this, void 0, void 0, function* () { - const transport = subscriber ? this.subscriber : this.publisher; - const transportName = subscriber ? 'Subscriber' : 'Publisher'; - if (!transport) { - throw new ConnectionError("".concat(transportName, " connection not set")); - } - if (!subscriber && !((_a = this.publisher) === null || _a === void 0 ? void 0 : _a.isICEConnected) && ((_b = this.publisher) === null || _b === void 0 ? void 0 : _b.pc.iceConnectionState) !== 'checking') { - // start negotiation - this.negotiate(); - } - const targetChannel = this.dataChannelForKind(kind, subscriber); - if ((targetChannel === null || targetChannel === void 0 ? void 0 : targetChannel.readyState) === 'open') { - return; - } - // wait until ICE connected - const endTime = new Date().getTime() + this.peerConnectionTimeout; - while (new Date().getTime() < endTime) { - if (transport.isICEConnected && ((_c = this.dataChannelForKind(kind, subscriber)) === null || _c === void 0 ? void 0 : _c.readyState) === 'open') { - return; - } - yield sleep(50); - } - throw new ConnectionError("could not establish ".concat(transportName, " connection, state: ").concat(transport.pc.iceConnectionState)); - }); - } - ensurePublisherConnected(kind) { - return __awaiter(this, void 0, void 0, function* () { - yield this.ensureDataTransportConnected(kind, false); - }); - } - /* @internal */ - verifyTransport() { - // primary connection - if (!this.primaryPC) { - return false; - } - if (this.primaryPC.connectionState === 'closed' || this.primaryPC.connectionState === 'failed') { - return false; - } - // also verify publisher connection if it's needed or different - if (this.hasPublished && this.subscriberPrimary) { - if (!this.publisher) { - return false; - } - if (this.publisher.pc.connectionState === 'closed' || this.publisher.pc.connectionState === 'failed') { - return false; - } - } - // ensure signal is connected - if (!this.client.ws || this.client.ws.readyState === WebSocket.CLOSED) { - return false; - } - return true; - } - /** @internal */ - negotiate() { - // observe signal state - return new Promise((resolve, reject) => { - if (!this.publisher) { - reject(new NegotiationError('publisher is not defined')); - return; - } - this.hasPublished = true; - const handleClosed = () => { - livekitLogger.debug('engine disconnected while negotiation was ongoing'); - cleanup(); - resolve(); - return; - }; - this.on(EngineEvent.Closing, handleClosed); - const negotiationTimeout = setTimeout(() => { - reject('negotiation timed out'); - this.handleDisconnect('negotiation', ReconnectReason.RR_SIGNAL_DISCONNECTED); - }, this.peerConnectionTimeout); - const cleanup = () => { - clearTimeout(negotiationTimeout); - this.off(EngineEvent.Closing, handleClosed); - }; - this.publisher.once(PCEvents.NegotiationStarted, () => { - var _a; - (_a = this.publisher) === null || _a === void 0 ? void 0 : _a.once(PCEvents.NegotiationComplete, () => { - cleanup(); - resolve(); - }); - }); - this.publisher.negotiate(e => { - cleanup(); - reject(e); - if (e instanceof NegotiationError) { - this.fullReconnectOnNext = true; - } - this.handleDisconnect('negotiation', ReconnectReason.RR_UNKOWN); - }); - }); - } - dataChannelForKind(kind, sub) { - if (!sub) { - if (kind === DataPacket_Kind.LOSSY) { - return this.lossyDC; - } - if (kind === DataPacket_Kind.RELIABLE) { - return this.reliableDC; - } - } else { - if (kind === DataPacket_Kind.LOSSY) { - return this.lossyDCSub; - } - if (kind === DataPacket_Kind.RELIABLE) { - return this.reliableDCSub; - } - } - } - /* @internal */ - failNext() { - // debugging method to fail the next reconnect/resume attempt - this.shouldFailNext = true; - } - clearReconnectTimeout() { - if (this.reconnectTimeout) { - CriticalTimers.clearTimeout(this.reconnectTimeout); - } - } - clearPendingReconnect() { - this.clearReconnectTimeout(); - this.reconnectAttempts = 0; - } - registerOnLineListener() { - if (isWeb()) { - window.addEventListener('online', this.handleBrowserOnLine); - } - } - deregisterOnLineListener() { - if (isWeb()) { - window.removeEventListener('online', this.handleBrowserOnLine); - } - } -} -function getConnectedAddress(pc) { - var _a; - return __awaiter(this, void 0, void 0, function* () { - let selectedCandidatePairId = ''; - const candidatePairs = new Map(); - // id -> candidate ip - const candidates = new Map(); - const stats = yield pc.getStats(); - stats.forEach(v => { - switch (v.type) { - case 'transport': - selectedCandidatePairId = v.selectedCandidatePairId; - break; - case 'candidate-pair': - if (selectedCandidatePairId === '' && v.selected) { - selectedCandidatePairId = v.id; - } - candidatePairs.set(v.id, v); - break; - case 'remote-candidate': - candidates.set(v.id, "".concat(v.address, ":").concat(v.port)); - break; - } - }); - if (selectedCandidatePairId === '') { - return undefined; - } - const selectedID = (_a = candidatePairs.get(selectedCandidatePairId)) === null || _a === void 0 ? void 0 : _a.remoteCandidateId; - if (selectedID === undefined) { - return undefined; - } - return candidates.get(selectedID); - }); -} -class SignalReconnectError extends Error {} - -const monitorFrequency = 2000; -function computeBitrate(currentStats, prevStats) { - if (!prevStats) { - return 0; - } - let bytesNow; - let bytesPrev; - if ('bytesReceived' in currentStats) { - bytesNow = currentStats.bytesReceived; - bytesPrev = prevStats.bytesReceived; - } else if ('bytesSent' in currentStats) { - bytesNow = currentStats.bytesSent; - bytesPrev = prevStats.bytesSent; - } - if (bytesNow === undefined || bytesPrev === undefined || currentStats.timestamp === undefined || prevStats.timestamp === undefined) { - return 0; - } - return (bytesNow - bytesPrev) * 8 * 1000 / (currentStats.timestamp - prevStats.timestamp); -} - -const defaultDimensionsTimeout = 1000; -class LocalTrack extends Track { - /** - * - * @param mediaTrack - * @param kind - * @param constraints MediaTrackConstraints that are being used when restarting or reacquiring tracks - * @param userProvidedTrack Signals to the SDK whether or not the mediaTrack should be managed (i.e. released and reacquired) internally by the SDK - */ - constructor(mediaTrack, kind, constraints) { - let userProvidedTrack = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; - super(mediaTrack, kind); - this.isSettingUpProcessor = false; - this._isUpstreamPaused = false; - this.handleEnded = () => { - if (this.isInBackground) { - this.reacquireTrack = true; - } - this.emit(TrackEvent.Ended, this); - }; - this._mediaStreamTrack.addEventListener('ended', this.handleEnded); - this.constraints = constraints !== null && constraints !== void 0 ? constraints : mediaTrack.getConstraints(); - this.reacquireTrack = false; - this.providedByUser = userProvidedTrack; - this.muteLock = new Mutex(); - this.pauseUpstreamLock = new Mutex(); - } - get id() { - return this._mediaStreamTrack.id; - } - get dimensions() { - if (this.kind !== Track.Kind.Video) { - return undefined; - } - const { - width, - height - } = this._mediaStreamTrack.getSettings(); - if (width && height) { - return { - width, - height - }; - } - return undefined; - } - get isUpstreamPaused() { - return this._isUpstreamPaused; - } - get isUserProvided() { - return this.providedByUser; - } - get mediaStreamTrack() { - var _a, _b; - return (_b = (_a = this.processor) === null || _a === void 0 ? void 0 : _a.processedTrack) !== null && _b !== void 0 ? _b : this._mediaStreamTrack; - } - waitForDimensions() { - let timeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultDimensionsTimeout; - return __awaiter(this, void 0, void 0, function* () { - if (this.kind === Track.Kind.Audio) { - throw new Error('cannot get dimensions for audio tracks'); - } - const started = Date.now(); - while (Date.now() - started < timeout) { - const dims = this.dimensions; - if (dims) { - return dims; - } - yield sleep(50); - } - throw new TrackInvalidError('unable to get track dimensions after timeout'); - }); - } - /** - * @returns DeviceID of the device that is currently being used for this track - */ - getDeviceId() { - return __awaiter(this, void 0, void 0, function* () { - // screen share doesn't have a usable device id - if (this.source === Track.Source.ScreenShare) { - return; - } - const { - deviceId, - groupId - } = this._mediaStreamTrack.getSettings(); - const kind = this.kind === Track.Kind.Audio ? 'audioinput' : 'videoinput'; - return DeviceManager.getInstance().normalizeDeviceId(kind, deviceId, groupId); - }); - } - mute() { - return __awaiter(this, void 0, void 0, function* () { - this.setTrackMuted(true); - return this; - }); - } - unmute() { - return __awaiter(this, void 0, void 0, function* () { - this.setTrackMuted(false); - return this; - }); - } - replaceTrack(track) { - let userProvidedTrack = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - return __awaiter(this, void 0, void 0, function* () { - if (!this.sender) { - throw new TrackInvalidError('unable to replace an unpublished track'); - } - // detach - this.attachedElements.forEach(el => { - detachTrack(this._mediaStreamTrack, el); - }); - this._mediaStreamTrack.removeEventListener('ended', this.handleEnded); - // on Safari, the old audio track must be stopped before attempting to acquire - // the new track, otherwise the new track will stop with - // 'A MediaStreamTrack ended due to a capture failure` - if (!this.providedByUser) { - this._mediaStreamTrack.stop(); - } - track.addEventListener('ended', this.handleEnded); - livekitLogger.debug('replace MediaStreamTrack'); - if (this.sender) { - yield this.sender.replaceTrack(track); - } - this._mediaStreamTrack = track; - // sync muted state with the enabled state of the newly provided track - this._mediaStreamTrack.enabled = !this.isMuted; - yield this.resumeUpstream(); - this.attachedElements.forEach(el => { - attachToElement(track, el); - }); - this.mediaStream = new MediaStream([track]); - this.providedByUser = userProvidedTrack; - if (this.processor) { - yield this.stopProcessor(); - } - return this; - }); - } - restart(constraints) { - return __awaiter(this, void 0, void 0, function* () { - if (!constraints) { - constraints = this.constraints; - } - livekitLogger.debug('restarting track with constraints', constraints); - const streamConstraints = { - audio: false, - video: false - }; - if (this.kind === Track.Kind.Video) { - streamConstraints.video = constraints; - } else { - streamConstraints.audio = constraints; - } - // detach - this.attachedElements.forEach(el => { - detachTrack(this.mediaStreamTrack, el); - }); - this._mediaStreamTrack.removeEventListener('ended', this.handleEnded); - // on Safari, the old audio track must be stopped before attempting to acquire - // the new track, otherwise the new track will stop with - // 'A MediaStreamTrack ended due to a capture failure` - this._mediaStreamTrack.stop(); - // create new track and attach - const mediaStream = yield navigator.mediaDevices.getUserMedia(streamConstraints); - const newTrack = mediaStream.getTracks()[0]; - newTrack.addEventListener('ended', this.handleEnded); - livekitLogger.debug('re-acquired MediaStreamTrack'); - if (this.sender) { - // Track can be restarted after it's unpublished - yield this.sender.replaceTrack(newTrack); - } - this._mediaStreamTrack = newTrack; - yield this.resumeUpstream(); - this.mediaStream = mediaStream; - this.constraints = constraints; - if (this.processor) { - const processor = this.processor; - yield this.setProcessor(processor); - } else { - this.attachedElements.forEach(el => { - attachToElement(this._mediaStreamTrack, el); - }); - } - this.emit(TrackEvent.Restarted, this); - return this; - }); - } - setTrackMuted(muted) { - livekitLogger.debug("setting ".concat(this.kind, " track ").concat(muted ? 'muted' : 'unmuted')); - if (this.isMuted === muted && this._mediaStreamTrack.enabled !== muted) { - return; - } - this.isMuted = muted; - this._mediaStreamTrack.enabled = !muted; - this.emit(muted ? TrackEvent.Muted : TrackEvent.Unmuted, this); - } - get needsReAcquisition() { - return this._mediaStreamTrack.readyState !== 'live' || this._mediaStreamTrack.muted || !this._mediaStreamTrack.enabled || this.reacquireTrack; - } - handleAppVisibilityChanged() { - const _super = Object.create(null, { - handleAppVisibilityChanged: { - get: () => super.handleAppVisibilityChanged - } - }); - return __awaiter(this, void 0, void 0, function* () { - yield _super.handleAppVisibilityChanged.call(this); - if (!isMobile()) return; - livekitLogger.debug("visibility changed, is in Background: ".concat(this.isInBackground)); - if (!this.isInBackground && this.needsReAcquisition && !this.isUserProvided && !this.isMuted) { - livekitLogger.debug("track needs to be reaquired, restarting ".concat(this.source)); - yield this.restart(); - this.reacquireTrack = false; - } - }); - } - stop() { - var _a; - super.stop(); - (_a = this.processor) === null || _a === void 0 ? void 0 : _a.destroy(); - this.processor = undefined; - } - /** - * pauses publishing to the server without disabling the local MediaStreamTrack - * this is used to display a user's own video locally while pausing publishing to - * the server. - * this API is unsupported on Safari < 12 due to a bug - **/ - pauseUpstream() { - return __awaiter(this, void 0, void 0, function* () { - const unlock = yield this.pauseUpstreamLock.lock(); - try { - if (this._isUpstreamPaused === true) { - return; - } - if (!this.sender) { - livekitLogger.warn('unable to pause upstream for an unpublished track'); - return; - } - this._isUpstreamPaused = true; - this.emit(TrackEvent.UpstreamPaused, this); - const browser = getBrowser(); - if ((browser === null || browser === void 0 ? void 0 : browser.name) === 'Safari' && compareVersions(browser.version, '12.0') < 0) { - // https://bugs.webkit.org/show_bug.cgi?id=184911 - throw new DeviceUnsupportedError('pauseUpstream is not supported on Safari < 12.'); - } - yield this.sender.replaceTrack(null); - } finally { - unlock(); - } - }); - } - resumeUpstream() { - return __awaiter(this, void 0, void 0, function* () { - const unlock = yield this.pauseUpstreamLock.lock(); - try { - if (this._isUpstreamPaused === false) { - return; - } - if (!this.sender) { - livekitLogger.warn('unable to resume upstream for an unpublished track'); - return; - } - this._isUpstreamPaused = false; - this.emit(TrackEvent.UpstreamResumed, this); - yield this.sender.replaceTrack(this._mediaStreamTrack); - } finally { - unlock(); - } - }); - } - /** - * Sets a processor on this track. - * See https://github.com/livekit/track-processors-js for example usage - * - * @experimental - * - * @param processor - * @param showProcessedStreamLocally - * @returns - */ - setProcessor(processor) { - let showProcessedStreamLocally = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - var _a, _b; - return __awaiter(this, void 0, void 0, function* () { - if (this.isSettingUpProcessor) { - livekitLogger.warn('already trying to set up a processor'); - return; - } - livekitLogger.debug('setting up processor'); - this.isSettingUpProcessor = true; - if (this.processor) { - yield this.stopProcessor(); - } - if (this.kind === 'unknown') { - throw TypeError('cannot set processor on track of unknown kind'); - } - this.processorElement = (_a = this.processorElement) !== null && _a !== void 0 ? _a : document.createElement(this.kind); - this.processorElement.muted = true; - attachToElement(this._mediaStreamTrack, this.processorElement); - this.processorElement.play().catch(e => livekitLogger.error(e)); - const processorOptions = { - kind: this.kind, - track: this._mediaStreamTrack, - element: this.processorElement - }; - yield processor.init(processorOptions); - this.processor = processor; - if (this.processor.processedTrack) { - for (const el of this.attachedElements) { - if (el !== this.processorElement && showProcessedStreamLocally) { - detachTrack(this._mediaStreamTrack, el); - attachToElement(this.processor.processedTrack, el); - } - } - yield (_b = this.sender) === null || _b === void 0 ? void 0 : _b.replaceTrack(this.processor.processedTrack); - } - this.isSettingUpProcessor = false; - }); - } - getProcessor() { - return this.processor; - } - /** - * Stops the track processor - * See https://github.com/livekit/track-processors-js for example usage - * - * @experimental - * @returns - */ - stopProcessor() { - var _a, _b; - return __awaiter(this, void 0, void 0, function* () { - if (!this.processor) return; - livekitLogger.debug('stopping processor'); - (_a = this.processor.processedTrack) === null || _a === void 0 ? void 0 : _a.stop(); - yield this.processor.destroy(); - this.processor = undefined; - (_b = this.processorElement) === null || _b === void 0 ? void 0 : _b.remove(); - this.processorElement = undefined; - yield this.restart(); - }); - } -} - -class LocalAudioTrack extends LocalTrack { - /** - * - * @param mediaTrack - * @param constraints MediaTrackConstraints that are being used when restarting or reacquiring tracks - * @param userProvidedTrack Signals to the SDK whether or not the mediaTrack should be managed (i.e. released and reacquired) internally by the SDK - */ - constructor(mediaTrack, constraints) { - let userProvidedTrack = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; - super(mediaTrack, Track.Kind.Audio, constraints, userProvidedTrack); - /** @internal */ - this.stopOnMute = false; - this.monitorSender = () => __awaiter(this, void 0, void 0, function* () { - if (!this.sender) { - this._currentBitrate = 0; - return; - } - let stats; - try { - stats = yield this.getSenderStats(); - } catch (e) { - livekitLogger.error('could not get audio sender stats', { - error: e - }); - return; - } - if (stats && this.prevStats) { - this._currentBitrate = computeBitrate(stats, this.prevStats); - } - this.prevStats = stats; - }); - this.checkForSilence(); - } - setDeviceId(deviceId) { - return __awaiter(this, void 0, void 0, function* () { - if (this.constraints.deviceId === deviceId) { - return; - } - this.constraints.deviceId = deviceId; - if (!this.isMuted) { - yield this.restartTrack(); - } - }); - } - mute() { - const _super = Object.create(null, { - mute: { - get: () => super.mute - } - }); - return __awaiter(this, void 0, void 0, function* () { - const unlock = yield this.muteLock.lock(); - try { - // disabled special handling as it will cause BT headsets to switch communication modes - if (this.source === Track.Source.Microphone && this.stopOnMute && !this.isUserProvided) { - livekitLogger.debug('stopping mic track'); - // also stop the track, so that microphone indicator is turned off - this._mediaStreamTrack.stop(); - } - yield _super.mute.call(this); - return this; - } finally { - unlock(); - } - }); - } - unmute() { - const _super = Object.create(null, { - unmute: { - get: () => super.unmute - } - }); - return __awaiter(this, void 0, void 0, function* () { - const unlock = yield this.muteLock.lock(); - try { - if (this.source === Track.Source.Microphone && (this.stopOnMute || this._mediaStreamTrack.readyState === 'ended') && !this.isUserProvided) { - livekitLogger.debug('reacquiring mic track'); - yield this.restartTrack(); - } - yield _super.unmute.call(this); - return this; - } finally { - unlock(); - } - }); - } - restartTrack(options) { - return __awaiter(this, void 0, void 0, function* () { - let constraints; - if (options) { - const streamConstraints = constraintsForOptions({ - audio: options - }); - if (typeof streamConstraints.audio !== 'boolean') { - constraints = streamConstraints.audio; - } - } - yield this.restart(constraints); - }); - } - restart(constraints) { - const _super = Object.create(null, { - restart: { - get: () => super.restart - } - }); - return __awaiter(this, void 0, void 0, function* () { - const track = yield _super.restart.call(this, constraints); - this.checkForSilence(); - return track; - }); - } - /* @internal */ - startMonitor() { - if (!isWeb()) { - return; - } - if (this.monitorInterval) { - return; - } - this.monitorInterval = setInterval(() => { - this.monitorSender(); - }, monitorFrequency); - } - getSenderStats() { - var _a; - return __awaiter(this, void 0, void 0, function* () { - if (!((_a = this.sender) === null || _a === void 0 ? void 0 : _a.getStats)) { - return undefined; - } - const stats = yield this.sender.getStats(); - let audioStats; - stats.forEach(v => { - if (v.type === 'outbound-rtp') { - audioStats = { - type: 'audio', - streamId: v.id, - packetsSent: v.packetsSent, - packetsLost: v.packetsLost, - bytesSent: v.bytesSent, - timestamp: v.timestamp, - roundTripTime: v.roundTripTime, - jitter: v.jitter - }; - } - }); - return audioStats; - }); - } - checkForSilence() { - return __awaiter(this, void 0, void 0, function* () { - const trackIsSilent = yield detectSilence(this); - if (trackIsSilent) { - if (!this.isMuted) { - livekitLogger.warn('silence detected on local audio track'); - } - this.emit(TrackEvent.AudioSilenceDetected); - } - return trackIsSilent; - }); - } -} - -/** @internal */ -function mediaTrackToLocalTrack(mediaStreamTrack, constraints) { - switch (mediaStreamTrack.kind) { - case 'audio': - return new LocalAudioTrack(mediaStreamTrack, constraints, false); - case 'video': - return new LocalVideoTrack(mediaStreamTrack, constraints, false); - default: - throw new TrackInvalidError("unsupported track type: ".concat(mediaStreamTrack.kind)); - } -} -/* @internal */ -const presets169 = Object.values(VideoPresets); -/* @internal */ -const presets43 = Object.values(VideoPresets43); -/* @internal */ -const presetsScreenShare = Object.values(ScreenSharePresets); -/* @internal */ -const defaultSimulcastPresets169 = [VideoPresets.h180, VideoPresets.h360]; -/* @internal */ -const defaultSimulcastPresets43 = [VideoPresets43.h180, VideoPresets43.h360]; -/* @internal */ -const computeDefaultScreenShareSimulcastPresets = fromPreset => { - const layers = [{ - scaleResolutionDownBy: 2, - fps: 3 - }]; - return layers.map(t => { - var _a; - return new VideoPreset(Math.floor(fromPreset.width / t.scaleResolutionDownBy), Math.floor(fromPreset.height / t.scaleResolutionDownBy), Math.max(150000, Math.floor(fromPreset.encoding.maxBitrate / (Math.pow(t.scaleResolutionDownBy, 2) * (((_a = fromPreset.encoding.maxFramerate) !== null && _a !== void 0 ? _a : 30) / t.fps)))), t.fps, fromPreset.encoding.priority); - }); -}; -// /** -// * -// * @internal -// * @experimental -// */ -// const computeDefaultMultiCodecSimulcastEncodings = (width: number, height: number) => { -// // use vp8 as a default -// const vp8 = determineAppropriateEncoding(false, width, height); -// const vp9 = { ...vp8, maxBitrate: vp8.maxBitrate * 0.9 }; -// const h264 = { ...vp8, maxBitrate: vp8.maxBitrate * 1.1 }; -// const av1 = { ...vp8, maxBitrate: vp8.maxBitrate * 0.7 }; -// return { -// vp8, -// vp9, -// h264, -// av1, -// }; -// }; -const videoRids = ['q', 'h', 'f']; -/* @internal */ -function computeVideoEncodings(isScreenShare, width, height, options) { - var _a, _b; - let videoEncoding = options === null || options === void 0 ? void 0 : options.videoEncoding; - if (isScreenShare) { - videoEncoding = options === null || options === void 0 ? void 0 : options.screenShareEncoding; - } - const useSimulcast = options === null || options === void 0 ? void 0 : options.simulcast; - const scalabilityMode = options === null || options === void 0 ? void 0 : options.scalabilityMode; - const videoCodec = options === null || options === void 0 ? void 0 : options.videoCodec; - if (!videoEncoding && !useSimulcast && !scalabilityMode || !width || !height) { - // when we aren't simulcasting or svc, will need to return a single encoding without - // capping bandwidth. we always require a encoding for dynacast - return [{}]; - } - if (!videoEncoding) { - // find the right encoding based on width/height - videoEncoding = determineAppropriateEncoding(isScreenShare, width, height, videoCodec); - livekitLogger.debug('using video encoding', videoEncoding); - } - const original = new VideoPreset(width, height, videoEncoding.maxBitrate, videoEncoding.maxFramerate); - if (scalabilityMode && isSVCCodec(videoCodec)) { - livekitLogger.debug("using svc with scalabilityMode ".concat(scalabilityMode)); - const encodings = []; - // svc use first encoding as the original, so we sort encoding from high to low - switch (scalabilityMode) { - case 'L3T3': - case 'L3T3_KEY': - encodings.push({ - rid: videoRids[2], - maxBitrate: videoEncoding.maxBitrate, - /* @ts-ignore */ - maxFramerate: original.encoding.maxFramerate, - /* @ts-ignore */ - scalabilityMode: scalabilityMode - }); - livekitLogger.debug('encodings', encodings); - return encodings; - default: - // TODO : support other scalability modes - throw new Error("unsupported scalabilityMode: ".concat(scalabilityMode)); - } - } - if (!useSimulcast) { - return [videoEncoding]; - } - let presets = []; - if (isScreenShare) { - presets = (_a = sortPresets(options === null || options === void 0 ? void 0 : options.screenShareSimulcastLayers)) !== null && _a !== void 0 ? _a : defaultSimulcastLayers(isScreenShare, original); - } else { - presets = (_b = sortPresets(options === null || options === void 0 ? void 0 : options.videoSimulcastLayers)) !== null && _b !== void 0 ? _b : defaultSimulcastLayers(isScreenShare, original); - } - let midPreset; - if (presets.length > 0) { - const lowPreset = presets[0]; - if (presets.length > 1) { - [, midPreset] = presets; - } - // NOTE: - // 1. Ordering of these encodings is important. Chrome seems - // to use the index into encodings to decide which layer - // to disable when CPU constrained. - // So encodings should be ordered in increasing spatial - // resolution order. - // 2. ion-sfu translates rids into layers. So, all encodings - // should have the base layer `q` and then more added - // based on other conditions. - const size = Math.max(width, height); - if (size >= 960 && midPreset) { - return encodingsFromPresets(width, height, [lowPreset, midPreset, original]); - } - if (size >= 480) { - return encodingsFromPresets(width, height, [lowPreset, original]); - } - } - return encodingsFromPresets(width, height, [original]); -} -function computeTrackBackupEncodings(track, videoCodec, opts) { - var _a, _b, _c, _d; - if (!opts.backupCodec || opts.backupCodec.codec === opts.videoCodec) { - // backup codec publishing is disabled - return; - } - if (videoCodec !== opts.backupCodec.codec) { - livekitLogger.warn('requested a different codec than specified as backup', { - serverRequested: videoCodec, - backup: opts.backupCodec.codec - }); - } - opts.videoCodec = videoCodec; - // use backup encoding setting as videoEncoding for backup codec publishing - opts.videoEncoding = opts.backupCodec.encoding; - const settings = track.mediaStreamTrack.getSettings(); - const width = (_a = settings.width) !== null && _a !== void 0 ? _a : (_b = track.dimensions) === null || _b === void 0 ? void 0 : _b.width; - const height = (_c = settings.height) !== null && _c !== void 0 ? _c : (_d = track.dimensions) === null || _d === void 0 ? void 0 : _d.height; - const encodings = computeVideoEncodings(track.source === Track.Source.ScreenShare, width, height, opts); - return encodings; -} -/* @internal */ -function determineAppropriateEncoding(isScreenShare, width, height, codec) { - const presets = presetsForResolution(isScreenShare, width, height); - let { - encoding - } = presets[0]; - // handle portrait by swapping dimensions - const size = Math.max(width, height); - for (let i = 0; i < presets.length; i += 1) { - const preset = presets[i]; - encoding = preset.encoding; - if (preset.width >= size) { - break; - } - } - // presets are based on the assumption of vp8 as a codec - // for other codecs we adjust the maxBitrate if no specific videoEncoding has been provided - // TODO make the bitrate multipliers configurable per codec - if (codec) { - switch (codec) { - case 'av1': - encoding = Object.assign({}, encoding); - encoding.maxBitrate = encoding.maxBitrate * 0.7; - break; - case 'vp9': - encoding = Object.assign({}, encoding); - encoding.maxBitrate = encoding.maxBitrate * 0.85; - break; - } - } - return encoding; -} -/* @internal */ -function presetsForResolution(isScreenShare, width, height) { - if (isScreenShare) { - return presetsScreenShare; - } - const aspect = width > height ? width / height : height / width; - if (Math.abs(aspect - 16.0 / 9) < Math.abs(aspect - 4.0 / 3)) { - return presets169; - } - return presets43; -} -/* @internal */ -function defaultSimulcastLayers(isScreenShare, original) { - if (isScreenShare) { - return computeDefaultScreenShareSimulcastPresets(original); - } - const { - width, - height - } = original; - const aspect = width > height ? width / height : height / width; - if (Math.abs(aspect - 16.0 / 9) < Math.abs(aspect - 4.0 / 3)) { - return defaultSimulcastPresets169; - } - return defaultSimulcastPresets43; -} -// presets should be ordered by low, medium, high -function encodingsFromPresets(width, height, presets) { - const encodings = []; - presets.forEach((preset, idx) => { - if (idx >= videoRids.length) { - return; - } - const size = Math.min(width, height); - const rid = videoRids[idx]; - const encoding = { - rid, - scaleResolutionDownBy: Math.max(1, size / Math.min(preset.width, preset.height)), - maxBitrate: preset.encoding.maxBitrate - }; - if (preset.encoding.maxFramerate) { - encoding.maxFramerate = preset.encoding.maxFramerate; - } - if (preset.encoding.priority) { - encoding.priority = preset.encoding.priority; - encoding.networkPriority = preset.encoding.priority; - } - encodings.push(encoding); - }); - // RN ios simulcast requires all same framerates. - if (isReactNative() && getReactNativeOs() === 'ios') { - let topFramerate = undefined; - encodings.forEach(encoding => { - if (!topFramerate) { - topFramerate = encoding.maxFramerate; - } else if (encoding.maxFramerate && encoding.maxFramerate > topFramerate) { - topFramerate = encoding.maxFramerate; - } - }); - let notifyOnce = true; - encodings.forEach(encoding => { - var _a; - if (encoding.maxFramerate != topFramerate) { - if (notifyOnce) { - notifyOnce = false; - livekitLogger.info("Simulcast on iOS React-Native requires all encodings to share the same framerate."); - } - livekitLogger.info("Setting framerate of encoding \"".concat((_a = encoding.rid) !== null && _a !== void 0 ? _a : '', "\" to ").concat(topFramerate)); - encoding.maxFramerate = topFramerate; - } - }); - } - return encodings; -} -/** @internal */ -function sortPresets(presets) { - if (!presets) return; - return presets.sort((a, b) => { - const { - encoding: aEnc - } = a; - const { - encoding: bEnc - } = b; - if (aEnc.maxBitrate > bEnc.maxBitrate) { - return 1; - } - if (aEnc.maxBitrate < bEnc.maxBitrate) return -1; - if (aEnc.maxBitrate === bEnc.maxBitrate && aEnc.maxFramerate && bEnc.maxFramerate) { - return aEnc.maxFramerate > bEnc.maxFramerate ? 1 : -1; - } - return 0; - }); -} -/** @internal */ -class ScalabilityMode { - constructor(scalabilityMode) { - const results = scalabilityMode.match(/^L(\d)T(\d)(h|_KEY|_KEY_SHIFT){0,1}$/); - if (!results) { - throw new Error('invalid scalability mode'); - } - this.spatial = parseInt(results[1]); - this.temporal = parseInt(results[2]); - if (results.length > 3) { - switch (results[3]) { - case 'h': - case '_KEY': - case '_KEY_SHIFT': - this.suffix = results[3]; - } - } - } - toString() { - var _a; - return "L".concat(this.spatial, "T").concat(this.temporal).concat((_a = this.suffix) !== null && _a !== void 0 ? _a : ''); - } -} - -const refreshSubscribedCodecAfterNewCodec = 5000; -class LocalVideoTrack extends LocalTrack { - /** - * - * @param mediaTrack - * @param constraints MediaTrackConstraints that are being used when restarting or reacquiring tracks - * @param userProvidedTrack Signals to the SDK whether or not the mediaTrack should be managed (i.e. released and reacquired) internally by the SDK - */ - constructor(mediaTrack, constraints) { - let userProvidedTrack = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; - super(mediaTrack, Track.Kind.Video, constraints, userProvidedTrack); - /* @internal */ - this.simulcastCodecs = new Map(); - this.monitorSender = () => __awaiter(this, void 0, void 0, function* () { - if (!this.sender) { - this._currentBitrate = 0; - return; - } - let stats; - try { - stats = yield this.getSenderStats(); - } catch (e) { - livekitLogger.error('could not get audio sender stats', { - error: e - }); - return; - } - const statsMap = new Map(stats.map(s => [s.rid, s])); - if (this.prevStats) { - let totalBitrate = 0; - statsMap.forEach((s, key) => { - var _a; - const prev = (_a = this.prevStats) === null || _a === void 0 ? void 0 : _a.get(key); - totalBitrate += computeBitrate(s, prev); - }); - this._currentBitrate = totalBitrate; - } - this.prevStats = statsMap; - }); - this.senderLock = new Mutex(); - } - get isSimulcast() { - if (this.sender && this.sender.getParameters().encodings.length > 1) { - return true; - } - return false; - } - /* @internal */ - startMonitor(signalClient) { - var _a; - this.signalClient = signalClient; - if (!isWeb()) { - return; - } - // save original encodings - // TODO : merge simulcast tracks stats - const params = (_a = this.sender) === null || _a === void 0 ? void 0 : _a.getParameters(); - if (params) { - this.encodings = params.encodings; - } - if (this.monitorInterval) { - return; - } - this.monitorInterval = setInterval(() => { - this.monitorSender(); - }, monitorFrequency); - } - stop() { - this._mediaStreamTrack.getConstraints(); - this.simulcastCodecs.forEach(trackInfo => { - trackInfo.mediaStreamTrack.stop(); - }); - super.stop(); - } - mute() { - const _super = Object.create(null, { - mute: { - get: () => super.mute - } - }); - return __awaiter(this, void 0, void 0, function* () { - const unlock = yield this.muteLock.lock(); - try { - if (this.source === Track.Source.Camera && !this.isUserProvided) { - livekitLogger.debug('stopping camera track'); - // also stop the track, so that camera indicator is turned off - this._mediaStreamTrack.stop(); - } - yield _super.mute.call(this); - return this; - } finally { - unlock(); - } - }); - } - unmute() { - const _super = Object.create(null, { - unmute: { - get: () => super.unmute - } - }); - return __awaiter(this, void 0, void 0, function* () { - const unlock = yield this.muteLock.lock(); - try { - if (this.source === Track.Source.Camera && !this.isUserProvided) { - livekitLogger.debug('reacquiring camera track'); - yield this.restartTrack(); - } - yield _super.unmute.call(this); - return this; - } finally { - unlock(); - } - }); - } - getSenderStats() { - var _a; - return __awaiter(this, void 0, void 0, function* () { - if (!((_a = this.sender) === null || _a === void 0 ? void 0 : _a.getStats)) { - return []; - } - const items = []; - const stats = yield this.sender.getStats(); - stats.forEach(v => { - var _a; - if (v.type === 'outbound-rtp') { - const vs = { - type: 'video', - streamId: v.id, - frameHeight: v.frameHeight, - frameWidth: v.frameWidth, - firCount: v.firCount, - pliCount: v.pliCount, - nackCount: v.nackCount, - packetsSent: v.packetsSent, - bytesSent: v.bytesSent, - framesSent: v.framesSent, - timestamp: v.timestamp, - rid: (_a = v.rid) !== null && _a !== void 0 ? _a : v.id, - retransmittedPacketsSent: v.retransmittedPacketsSent, - qualityLimitationReason: v.qualityLimitationReason, - qualityLimitationResolutionChanges: v.qualityLimitationResolutionChanges - }; - // locate the appropriate remote-inbound-rtp item - const r = stats.get(v.remoteId); - if (r) { - vs.jitter = r.jitter; - vs.packetsLost = r.packetsLost; - vs.roundTripTime = r.roundTripTime; - } - items.push(vs); - } - }); - return items; - }); - } - setPublishingQuality(maxQuality) { - const qualities = []; - for (let q = VideoQuality.LOW; q <= VideoQuality.HIGH; q += 1) { - qualities.push({ - quality: q, - enabled: q <= maxQuality - }); - } - livekitLogger.debug("setting publishing quality. max quality ".concat(maxQuality)); - this.setPublishingLayers(qualities); - } - setDeviceId(deviceId) { - return __awaiter(this, void 0, void 0, function* () { - if (this.constraints.deviceId === deviceId) { - return; - } - this.constraints.deviceId = deviceId; - // when video is muted, underlying media stream track is stopped and - // will be restarted later - if (!this.isMuted) { - yield this.restartTrack(); - } - }); - } - restartTrack(options) { - return __awaiter(this, void 0, void 0, function* () { - let constraints; - if (options) { - const streamConstraints = constraintsForOptions({ - video: options - }); - if (typeof streamConstraints.video !== 'boolean') { - constraints = streamConstraints.video; - } - } - yield this.restart(constraints); - }); - } - addSimulcastTrack(codec, encodings) { - if (this.simulcastCodecs.has(codec)) { - throw new Error("".concat(codec, " already added")); - } - const simulcastCodecInfo = { - codec, - mediaStreamTrack: this.mediaStreamTrack.clone(), - sender: undefined, - encodings - }; - this.simulcastCodecs.set(codec, simulcastCodecInfo); - return simulcastCodecInfo; - } - setSimulcastTrackSender(codec, sender) { - const simulcastCodecInfo = this.simulcastCodecs.get(codec); - if (!simulcastCodecInfo) { - return; - } - simulcastCodecInfo.sender = sender; - // browser will reenable disabled codec/layers after new codec has been published, - // so refresh subscribedCodecs after publish a new codec - setTimeout(() => { - if (this.subscribedCodecs) { - this.setPublishingCodecs(this.subscribedCodecs); - } - }, refreshSubscribedCodecAfterNewCodec); - } - /** - * @internal - * Sets codecs that should be publishing - */ - setPublishingCodecs(codecs) { - var _a, codecs_1, codecs_1_1; - var _b, e_1, _c, _d; - return __awaiter(this, void 0, void 0, function* () { - livekitLogger.debug('setting publishing codecs', { - codecs, - currentCodec: this.codec - }); - // only enable simulcast codec for preference codec setted - if (!this.codec && codecs.length > 0) { - yield this.setPublishingLayers(codecs[0].qualities); - return []; - } - this.subscribedCodecs = codecs; - const newCodecs = []; - try { - for (_a = true, codecs_1 = __asyncValues(codecs); codecs_1_1 = yield codecs_1.next(), _b = codecs_1_1.done, !_b; _a = true) { - _d = codecs_1_1.value; - _a = false; - const codec = _d; - if (!this.codec || this.codec === codec.codec) { - yield this.setPublishingLayers(codec.qualities); - } else { - const simulcastCodecInfo = this.simulcastCodecs.get(codec.codec); - livekitLogger.debug("try setPublishingCodec for ".concat(codec.codec), simulcastCodecInfo); - if (!simulcastCodecInfo || !simulcastCodecInfo.sender) { - for (const q of codec.qualities) { - if (q.enabled) { - newCodecs.push(codec.codec); - break; - } - } - } else if (simulcastCodecInfo.encodings) { - livekitLogger.debug("try setPublishingLayersForSender ".concat(codec.codec)); - yield setPublishingLayersForSender(simulcastCodecInfo.sender, simulcastCodecInfo.encodings, codec.qualities, this.senderLock); - } - } - } - } catch (e_1_1) { - e_1 = { - error: e_1_1 - }; - } finally { - try { - if (!_a && !_b && (_c = codecs_1.return)) yield _c.call(codecs_1); - } finally { - if (e_1) throw e_1.error; - } - } - return newCodecs; - }); - } - /** - * @internal - * Sets layers that should be publishing - */ - setPublishingLayers(qualities) { - return __awaiter(this, void 0, void 0, function* () { - livekitLogger.debug('setting publishing layers', qualities); - if (!this.sender || !this.encodings) { - return; - } - yield setPublishingLayersForSender(this.sender, this.encodings, qualities, this.senderLock); - }); - } - handleAppVisibilityChanged() { - const _super = Object.create(null, { - handleAppVisibilityChanged: { - get: () => super.handleAppVisibilityChanged - } - }); - return __awaiter(this, void 0, void 0, function* () { - yield _super.handleAppVisibilityChanged.call(this); - if (!isMobile()) return; - if (this.isInBackground && this.source === Track.Source.Camera) { - this._mediaStreamTrack.enabled = false; - } - }); - } -} -function setPublishingLayersForSender(sender, senderEncodings, qualities, senderLock) { - return __awaiter(this, void 0, void 0, function* () { - const unlock = yield senderLock.lock(); - livekitLogger.debug('setPublishingLayersForSender', { - sender, - qualities, - senderEncodings - }); - try { - const params = sender.getParameters(); - const { - encodings - } = params; - if (!encodings) { - return; - } - if (encodings.length !== senderEncodings.length) { - livekitLogger.warn('cannot set publishing layers, encodings mismatch'); - return; - } - let hasChanged = false; - /* @ts-ignore */ - if (encodings.length === 1 && encodings[0].scalabilityMode) { - // svc dynacast encodings - const encoding = encodings[0]; - /* @ts-ignore */ - // const mode = new ScalabilityMode(encoding.scalabilityMode); - let maxQuality = VideoQuality.OFF; - qualities.forEach(q => { - if (q.enabled && (maxQuality === VideoQuality.OFF || q.quality > maxQuality)) { - maxQuality = q.quality; - } - }); - if (maxQuality === VideoQuality.OFF) { - if (encoding.active) { - encoding.active = false; - hasChanged = true; - } - } else if (!encoding.active /* || mode.spatial !== maxQuality + 1*/) { - hasChanged = true; - encoding.active = true; - /* disable closable spatial layer as it has video blur/frozen issue with current server/client - 1. chrome 113: when switching to up layer with scalability Mode change, it will generate a - low resolution frame and recover very quickly, but noticable - 2. livekit sfu: additional pli request cause video frozen for a few frames, also noticable - @ts-ignore - const originalMode = new ScalabilityMode(senderEncodings[0].scalabilityMode) - mode.spatial = maxQuality + 1; - mode.suffix = originalMode.suffix; - if (mode.spatial === 1) { - // no suffix for L1Tx - mode.suffix = undefined; - } - @ts-ignore - encoding.scalabilityMode = mode.toString(); - encoding.scaleResolutionDownBy = 2 ** (2 - maxQuality); - */ - } - } else { - // simulcast dynacast encodings - encodings.forEach((encoding, idx) => { - var _a; - let rid = (_a = encoding.rid) !== null && _a !== void 0 ? _a : ''; - if (rid === '') { - rid = 'q'; - } - const quality = videoQualityForRid(rid); - const subscribedQuality = qualities.find(q => q.quality === quality); - if (!subscribedQuality) { - return; - } - if (encoding.active !== subscribedQuality.enabled) { - hasChanged = true; - encoding.active = subscribedQuality.enabled; - livekitLogger.debug("setting layer ".concat(subscribedQuality.quality, " to ").concat(encoding.active ? 'enabled' : 'disabled')); - // FireFox does not support setting encoding.active to false, so we - // have a workaround of lowering its bitrate and resolution to the min. - if (isFireFox()) { - if (subscribedQuality.enabled) { - encoding.scaleResolutionDownBy = senderEncodings[idx].scaleResolutionDownBy; - encoding.maxBitrate = senderEncodings[idx].maxBitrate; - /* @ts-ignore */ - encoding.maxFrameRate = senderEncodings[idx].maxFrameRate; - } else { - encoding.scaleResolutionDownBy = 4; - encoding.maxBitrate = 10; - /* @ts-ignore */ - encoding.maxFrameRate = 2; - } - } - } - }); - } - if (hasChanged) { - params.encodings = encodings; - livekitLogger.debug("setting encodings", params.encodings); - yield sender.setParameters(params); - } - } finally { - unlock(); - } - }); -} -function videoQualityForRid(rid) { - switch (rid) { - case 'f': - return VideoQuality.HIGH; - case 'h': - return VideoQuality.MEDIUM; - case 'q': - return VideoQuality.LOW; - default: - return VideoQuality.UNRECOGNIZED; - } -} -function videoLayersFromEncodings(width, height, encodings) { - // default to a single layer, HQ - if (!encodings) { - return [{ - quality: VideoQuality.HIGH, - width, - height, - bitrate: 0, - ssrc: 0 - }]; - } - /* @ts-ignore */ - if (encodings.length === 1 && encodings[0].scalabilityMode) { - // svc layers - /* @ts-ignore */ - const sm = new ScalabilityMode(encodings[0].scalabilityMode); - const layers = []; - for (let i = 0; i < sm.spatial; i += 1) { - layers.push({ - quality: VideoQuality.HIGH - i, - width: width / Math.pow(2, i), - height: height / Math.pow(2, i), - bitrate: encodings[0].maxBitrate ? encodings[0].maxBitrate / Math.pow(3, i) : 0, - ssrc: 0 - }); - } - return layers; - } - return encodings.map(encoding => { - var _a, _b, _c; - const scale = (_a = encoding.scaleResolutionDownBy) !== null && _a !== void 0 ? _a : 1; - let quality = videoQualityForRid((_b = encoding.rid) !== null && _b !== void 0 ? _b : ''); - if (quality === VideoQuality.UNRECOGNIZED && encodings.length === 1) { - quality = VideoQuality.HIGH; - } - return { - quality, - width: width / scale, - height: height / scale, - bitrate: (_c = encoding.maxBitrate) !== null && _c !== void 0 ? _c : 0, - ssrc: 0 - }; - }); -} - -class RemoteTrack extends Track { - constructor(mediaTrack, sid, kind, receiver) { - super(mediaTrack, kind); - this.sid = sid; - this.receiver = receiver; - } - /** @internal */ - setMuted(muted) { - if (this.isMuted !== muted) { - this.isMuted = muted; - this._mediaStreamTrack.enabled = !muted; - this.emit(muted ? TrackEvent.Muted : TrackEvent.Unmuted, this); - } - } - /** @internal */ - setMediaStream(stream) { - // this is needed to determine when the track is finished - // we send each track down in its own MediaStream, so we can assume the - // current track is the only one that can be removed. - this.mediaStream = stream; - stream.onremovetrack = () => { - this.receiver = undefined; - this._currentBitrate = 0; - this.emit(TrackEvent.Ended, this); - }; - } - start() { - this.startMonitor(); - // use `enabled` of track to enable re-use of transceiver - super.enable(); - } - stop() { - this.stopMonitor(); - // use `enabled` of track to enable re-use of transceiver - super.disable(); - } - /* @internal */ - startMonitor() { - if (!this.monitorInterval) { - this.monitorInterval = setInterval(() => this.monitorReceiver(), monitorFrequency); - } - } -} - -class RemoteAudioTrack extends RemoteTrack { - constructor(mediaTrack, sid, receiver, audioContext, audioOutput) { - super(mediaTrack, sid, Track.Kind.Audio, receiver); - this.monitorReceiver = () => __awaiter(this, void 0, void 0, function* () { - if (!this.receiver) { - this._currentBitrate = 0; - return; - } - const stats = yield this.getReceiverStats(); - if (stats && this.prevStats && this.receiver) { - this._currentBitrate = computeBitrate(stats, this.prevStats); - } - this.prevStats = stats; - }); - this.audioContext = audioContext; - this.webAudioPluginNodes = []; - if (audioOutput) { - this.sinkId = audioOutput.deviceId; - } - } - /** - * sets the volume for all attached audio elements - */ - setVolume(volume) { - var _a; - for (const el of this.attachedElements) { - if (this.audioContext) { - (_a = this.gainNode) === null || _a === void 0 ? void 0 : _a.gain.setTargetAtTime(volume, 0, 0.1); - } else { - el.volume = volume; - } - } - this.elementVolume = volume; - } - /** - * gets the volume of attached audio elements (loudest) - */ - getVolume() { - if (this.elementVolume) { - return this.elementVolume; - } - let highestVolume = 0; - this.attachedElements.forEach(element => { - if (element.volume > highestVolume) { - highestVolume = element.volume; - } - }); - return highestVolume; - } - /** - * calls setSinkId on all attached elements, if supported - * @param deviceId audio output device - */ - setSinkId(deviceId) { - return __awaiter(this, void 0, void 0, function* () { - this.sinkId = deviceId; - yield Promise.all(this.attachedElements.map(elm => { - if (!supportsSetSinkId(elm)) { - return; - } - /* @ts-ignore */ - return elm.setSinkId(deviceId); - })); - }); - } - attach(element) { - const needsNewWebAudioConnection = this.attachedElements.length === 0; - if (!element) { - element = super.attach(); - } else { - super.attach(element); - } - if (this.elementVolume) { - element.volume = this.elementVolume; - } - if (this.sinkId && supportsSetSinkId(element)) { - /* @ts-ignore */ - element.setSinkId(this.sinkId); - } - if (this.audioContext && needsNewWebAudioConnection) { - livekitLogger.debug('using audio context mapping'); - this.connectWebAudio(this.audioContext, element); - element.volume = 0; - element.muted = true; - } - return element; - } - detach(element) { - let detached; - if (!element) { - detached = super.detach(); - this.disconnectWebAudio(); - } else { - detached = super.detach(element); - // if there are still any attached elements after detaching, connect webaudio to the first element that's left - // disconnect webaudio otherwise - if (this.audioContext) { - if (this.attachedElements.length > 0) { - this.connectWebAudio(this.audioContext, this.attachedElements[0]); - } else { - this.disconnectWebAudio(); - } - } - } - return detached; - } - /** - * @internal - * @experimental - */ - setAudioContext(audioContext) { - this.audioContext = audioContext; - if (audioContext && this.attachedElements.length > 0) { - this.connectWebAudio(audioContext, this.attachedElements[0]); - } else if (!audioContext) { - this.disconnectWebAudio(); - } - } - /** - * @internal - * @experimental - * @param {AudioNode[]} nodes - An array of WebAudio nodes. These nodes should not be connected to each other when passed, as the sdk will take care of connecting them in the order of the array. - */ - setWebAudioPlugins(nodes) { - this.webAudioPluginNodes = nodes; - if (this.attachedElements.length > 0 && this.audioContext) { - this.connectWebAudio(this.audioContext, this.attachedElements[0]); - } - } - connectWebAudio(context, element) { - this.disconnectWebAudio(); - // @ts-ignore attached elements always have a srcObject set - this.sourceNode = context.createMediaStreamSource(element.srcObject); - let lastNode = this.sourceNode; - this.webAudioPluginNodes.forEach(node => { - lastNode.connect(node); - lastNode = node; - }); - this.gainNode = context.createGain(); - lastNode.connect(this.gainNode); - this.gainNode.connect(context.destination); - if (this.elementVolume) { - this.gainNode.gain.setTargetAtTime(this.elementVolume, 0, 0.1); - } - // try to resume the context if it isn't running already - if (context.state !== 'running') { - context.resume().then(() => { - if (context.state !== 'running') { - this.emit(TrackEvent.AudioPlaybackFailed, new Error("Audio Context couldn't be started automatically")); - } - }).catch(e => { - this.emit(TrackEvent.AudioPlaybackFailed, e); - }); - } - } - disconnectWebAudio() { - var _a, _b; - (_a = this.gainNode) === null || _a === void 0 ? void 0 : _a.disconnect(); - (_b = this.sourceNode) === null || _b === void 0 ? void 0 : _b.disconnect(); - this.gainNode = undefined; - this.sourceNode = undefined; - } - getReceiverStats() { - return __awaiter(this, void 0, void 0, function* () { - if (!this.receiver || !this.receiver.getStats) { - return; - } - const stats = yield this.receiver.getStats(); - let receiverStats; - stats.forEach(v => { - if (v.type === 'inbound-rtp') { - receiverStats = { - type: 'audio', - timestamp: v.timestamp, - jitter: v.jitter, - bytesReceived: v.bytesReceived, - concealedSamples: v.concealedSamples, - concealmentEvents: v.concealmentEvents, - silentConcealedSamples: v.silentConcealedSamples, - silentConcealmentEvents: v.silentConcealmentEvents, - totalAudioEnergy: v.totalAudioEnergy, - totalSamplesDuration: v.totalSamplesDuration - }; - } - }); - return receiverStats; - }); - } -} - -const REACTION_DELAY = 100; -class RemoteVideoTrack extends RemoteTrack { - constructor(mediaTrack, sid, receiver, adaptiveStreamSettings) { - super(mediaTrack, sid, Track.Kind.Video, receiver); - this.elementInfos = []; - this.isObserved = false; - this.monitorReceiver = () => __awaiter(this, void 0, void 0, function* () { - if (!this.receiver) { - this._currentBitrate = 0; - return; - } - const stats = yield this.getReceiverStats(); - if (stats && this.prevStats && this.receiver) { - this._currentBitrate = computeBitrate(stats, this.prevStats); - } - this.prevStats = stats; - }); - this.debouncedHandleResize = r(() => { - this.updateDimensions(); - }, REACTION_DELAY); - this.adaptiveStreamSettings = adaptiveStreamSettings; - } - get isAdaptiveStream() { - return this.adaptiveStreamSettings !== undefined; - } - get mediaStreamTrack() { - if (this.isAdaptiveStream && !this.isObserved) { - livekitLogger.warn('When using adaptiveStream, you need to use remoteVideoTrack.attach() to add the track to a HTMLVideoElement, otherwise your video tracks might never start'); - } - return this._mediaStreamTrack; - } - /** @internal */ - setMuted(muted) { - super.setMuted(muted); - this.attachedElements.forEach(element => { - // detach or attach - if (muted) { - detachTrack(this._mediaStreamTrack, element); - } else { - attachToElement(this._mediaStreamTrack, element); - } - }); - } - attach(element) { - if (!element) { - element = super.attach(); - } else { - super.attach(element); - } - // It's possible attach is called multiple times on an element. When that's - // the case, we'd want to avoid adding duplicate elementInfos - if (this.adaptiveStreamSettings && this.elementInfos.find(info => info.element === element) === undefined) { - const elementInfo = new HTMLElementInfo(element); - this.observeElementInfo(elementInfo); - } - return element; - } - /** - * Observe an ElementInfo for changes when adaptive streaming. - * @param elementInfo - * @internal - */ - observeElementInfo(elementInfo) { - if (this.adaptiveStreamSettings && this.elementInfos.find(info => info === elementInfo) === undefined) { - elementInfo.handleResize = () => { - this.debouncedHandleResize(); - }; - elementInfo.handleVisibilityChanged = () => { - this.updateVisibility(); - }; - this.elementInfos.push(elementInfo); - elementInfo.observe(); - // trigger the first resize update cycle - // if the tab is backgrounded, the initial resize event does not fire until - // the tab comes into focus for the first time. - this.debouncedHandleResize(); - this.updateVisibility(); - this.isObserved = true; - } else { - livekitLogger.warn('visibility resize observer not triggered'); - } - } - /** - * Stop observing an ElementInfo for changes. - * @param elementInfo - * @internal - */ - stopObservingElementInfo(elementInfo) { - if (!this.isAdaptiveStream) { - livekitLogger.warn('stopObservingElementInfo ignored'); - return; - } - const stopElementInfos = this.elementInfos.filter(info => info === elementInfo); - for (const info of stopElementInfos) { - info.stopObserving(); - } - this.elementInfos = this.elementInfos.filter(info => info !== elementInfo); - this.updateVisibility(); - } - detach(element) { - let detachedElements = []; - if (element) { - this.stopObservingElement(element); - return super.detach(element); - } - detachedElements = super.detach(); - for (const e of detachedElements) { - this.stopObservingElement(e); - } - return detachedElements; - } - /** @internal */ - getDecoderImplementation() { - var _a; - return (_a = this.prevStats) === null || _a === void 0 ? void 0 : _a.decoderImplementation; - } - getReceiverStats() { - return __awaiter(this, void 0, void 0, function* () { - if (!this.receiver || !this.receiver.getStats) { - return; - } - const stats = yield this.receiver.getStats(); - let receiverStats; - stats.forEach(v => { - if (v.type === 'inbound-rtp') { - receiverStats = { - type: 'video', - framesDecoded: v.framesDecoded, - framesDropped: v.framesDropped, - framesReceived: v.framesReceived, - packetsReceived: v.packetsReceived, - packetsLost: v.packetsLost, - frameWidth: v.frameWidth, - frameHeight: v.frameHeight, - pliCount: v.pliCount, - firCount: v.firCount, - nackCount: v.nackCount, - jitter: v.jitter, - timestamp: v.timestamp, - bytesReceived: v.bytesReceived, - decoderImplementation: v.decoderImplementation - }; - } - }); - return receiverStats; - }); - } - stopObservingElement(element) { - const stopElementInfos = this.elementInfos.filter(info => info.element === element); - for (const info of stopElementInfos) { - info.stopObserving(); - } - this.elementInfos = this.elementInfos.filter(info => info.element !== element); - } - handleAppVisibilityChanged() { - const _super = Object.create(null, { - handleAppVisibilityChanged: { - get: () => super.handleAppVisibilityChanged - } - }); - return __awaiter(this, void 0, void 0, function* () { - yield _super.handleAppVisibilityChanged.call(this); - if (!this.isAdaptiveStream) return; - this.updateVisibility(); - }); - } - updateVisibility() { - var _a, _b; - const lastVisibilityChange = this.elementInfos.reduce((prev, info) => Math.max(prev, info.visibilityChangedAt || 0), 0); - const backgroundPause = ((_b = (_a = this.adaptiveStreamSettings) === null || _a === void 0 ? void 0 : _a.pauseVideoInBackground) !== null && _b !== void 0 ? _b : true // default to true - ) ? this.isInBackground : false; - const isPiPMode = this.elementInfos.some(info => info.pictureInPicture); - const isVisible = this.elementInfos.some(info => info.visible) && !backgroundPause || isPiPMode; - if (this.lastVisible === isVisible) { - return; - } - if (!isVisible && Date.now() - lastVisibilityChange < REACTION_DELAY) { - // delay hidden events - CriticalTimers.setTimeout(() => { - this.updateVisibility(); - }, REACTION_DELAY); - return; - } - this.lastVisible = isVisible; - this.emit(TrackEvent.VisibilityChanged, isVisible, this); - } - updateDimensions() { - var _a, _b, _c, _d; - let maxWidth = 0; - let maxHeight = 0; - for (const info of this.elementInfos) { - const pixelDensity = (_b = (_a = this.adaptiveStreamSettings) === null || _a === void 0 ? void 0 : _a.pixelDensity) !== null && _b !== void 0 ? _b : 1; - const pixelDensityValue = pixelDensity === 'screen' ? getDevicePixelRatio() : pixelDensity; - const currentElementWidth = info.width() * pixelDensityValue; - const currentElementHeight = info.height() * pixelDensityValue; - if (currentElementWidth + currentElementHeight > maxWidth + maxHeight) { - maxWidth = currentElementWidth; - maxHeight = currentElementHeight; - } - } - if (((_c = this.lastDimensions) === null || _c === void 0 ? void 0 : _c.width) === maxWidth && ((_d = this.lastDimensions) === null || _d === void 0 ? void 0 : _d.height) === maxHeight) { - return; - } - this.lastDimensions = { - width: maxWidth, - height: maxHeight - }; - this.emit(TrackEvent.VideoDimensionsChanged, this.lastDimensions, this); - } -} -class HTMLElementInfo { - get visible() { - return this.isPiP || this.isIntersecting; - } - get pictureInPicture() { - return this.isPiP; - } - constructor(element, visible) { - this.onVisibilityChanged = entry => { - var _a; - const { - target, - isIntersecting - } = entry; - if (target === this.element) { - this.isIntersecting = isIntersecting; - this.visibilityChangedAt = Date.now(); - (_a = this.handleVisibilityChanged) === null || _a === void 0 ? void 0 : _a.call(this); - } - }; - this.onEnterPiP = () => { - var _a; - this.isPiP = true; - (_a = this.handleVisibilityChanged) === null || _a === void 0 ? void 0 : _a.call(this); - }; - this.onLeavePiP = () => { - var _a; - this.isPiP = false; - (_a = this.handleVisibilityChanged) === null || _a === void 0 ? void 0 : _a.call(this); - }; - this.element = element; - this.isIntersecting = visible !== null && visible !== void 0 ? visible : isElementInViewport(element); - this.isPiP = isWeb() && document.pictureInPictureElement === element; - this.visibilityChangedAt = 0; - } - width() { - return this.element.clientWidth; - } - height() { - return this.element.clientHeight; - } - observe() { - // make sure we update the current visible state once we start to observe - this.isIntersecting = isElementInViewport(this.element); - this.isPiP = document.pictureInPictureElement === this.element; - this.element.handleResize = () => { - var _a; - (_a = this.handleResize) === null || _a === void 0 ? void 0 : _a.call(this); - }; - this.element.handleVisibilityChanged = this.onVisibilityChanged; - getIntersectionObserver().observe(this.element); - getResizeObserver().observe(this.element); - this.element.addEventListener('enterpictureinpicture', this.onEnterPiP); - this.element.addEventListener('leavepictureinpicture', this.onLeavePiP); - } - stopObserving() { - var _a, _b; - (_a = getIntersectionObserver()) === null || _a === void 0 ? void 0 : _a.unobserve(this.element); - (_b = getResizeObserver()) === null || _b === void 0 ? void 0 : _b.unobserve(this.element); - this.element.removeEventListener('enterpictureinpicture', this.onEnterPiP); - this.element.removeEventListener('leavepictureinpicture', this.onLeavePiP); - } -} -// does not account for occlusion by other elements -function isElementInViewport(el) { - let top = el.offsetTop; - let left = el.offsetLeft; - const width = el.offsetWidth; - const height = el.offsetHeight; - const { - hidden - } = el; - const { - opacity, - display - } = getComputedStyle(el); - while (el.offsetParent) { - el = el.offsetParent; - top += el.offsetTop; - left += el.offsetLeft; - } - return top < window.pageYOffset + window.innerHeight && left < window.pageXOffset + window.innerWidth && top + height > window.pageYOffset && left + width > window.pageXOffset && !hidden && (opacity !== '' ? parseFloat(opacity) > 0 : true) && display !== 'none'; -} - -class TrackPublication extends eventsExports.EventEmitter { - constructor(kind, id, name) { - super(); - this.metadataMuted = false; - this.handleMuted = () => { - this.emit(TrackEvent.Muted); - }; - this.handleUnmuted = () => { - this.emit(TrackEvent.Unmuted); - }; - this.setMaxListeners(100); - this.kind = kind; - this.trackSid = id; - this.trackName = name; - this.source = Track.Source.Unknown; - } - /** @internal */ - setTrack(track) { - if (this.track) { - this.track.off(TrackEvent.Muted, this.handleMuted); - this.track.off(TrackEvent.Unmuted, this.handleUnmuted); - } - this.track = track; - if (track) { - // forward events - track.on(TrackEvent.Muted, this.handleMuted); - track.on(TrackEvent.Unmuted, this.handleUnmuted); - } - } - get isMuted() { - return this.metadataMuted; - } - get isEnabled() { - return true; - } - get isSubscribed() { - return this.track !== undefined; - } - /** - * an [AudioTrack] if this publication holds an audio track - */ - get audioTrack() { - if (this.track instanceof LocalAudioTrack || this.track instanceof RemoteAudioTrack) { - return this.track; - } - } - /** - * an [VideoTrack] if this publication holds a video track - */ - get videoTrack() { - if (this.track instanceof LocalVideoTrack || this.track instanceof RemoteVideoTrack) { - return this.track; - } - } - /** @internal */ - updateInfo(info) { - this.trackSid = info.sid; - this.trackName = info.name; - this.source = Track.sourceFromProto(info.source); - this.mimeType = info.mimeType; - if (this.kind === Track.Kind.Video && info.width > 0) { - this.dimensions = { - width: info.width, - height: info.height - }; - this.simulcasted = info.simulcast; - } - this.trackInfo = info; - livekitLogger.trace('update publication info', { - info - }); - } -} -(function (TrackPublication) { - (function (SubscriptionStatus) { - SubscriptionStatus["Desired"] = "desired"; - SubscriptionStatus["Subscribed"] = "subscribed"; - SubscriptionStatus["Unsubscribed"] = "unsubscribed"; - })(TrackPublication.SubscriptionStatus || (TrackPublication.SubscriptionStatus = {})); - (function (PermissionStatus) { - PermissionStatus["Allowed"] = "allowed"; - PermissionStatus["NotAllowed"] = "not_allowed"; - })(TrackPublication.PermissionStatus || (TrackPublication.PermissionStatus = {})); -})(TrackPublication || (TrackPublication = {})); - -class LocalTrackPublication extends TrackPublication { - get isUpstreamPaused() { - var _a; - return (_a = this.track) === null || _a === void 0 ? void 0 : _a.isUpstreamPaused; - } - constructor(kind, ti, track) { - super(kind, ti.sid, ti.name); - this.track = undefined; - this.handleTrackEnded = () => { - this.emit(TrackEvent.Ended); - }; - this.updateInfo(ti); - this.setTrack(track); - } - setTrack(track) { - if (this.track) { - this.track.off(TrackEvent.Ended, this.handleTrackEnded); - } - super.setTrack(track); - if (track) { - track.on(TrackEvent.Ended, this.handleTrackEnded); - } - } - get isMuted() { - if (this.track) { - return this.track.isMuted; - } - return super.isMuted; - } - get audioTrack() { - return super.audioTrack; - } - get videoTrack() { - return super.videoTrack; - } - /** - * Mute the track associated with this publication - */ - mute() { - var _a; - return __awaiter(this, void 0, void 0, function* () { - return (_a = this.track) === null || _a === void 0 ? void 0 : _a.mute(); - }); - } - /** - * Unmute track associated with this publication - */ - unmute() { - var _a; - return __awaiter(this, void 0, void 0, function* () { - return (_a = this.track) === null || _a === void 0 ? void 0 : _a.unmute(); - }); - } - /** - * Pauses the media stream track associated with this publication from being sent to the server - * and signals "muted" event to other participants - * Useful if you want to pause the stream without pausing the local media stream track - */ - pauseUpstream() { - var _a; - return __awaiter(this, void 0, void 0, function* () { - yield (_a = this.track) === null || _a === void 0 ? void 0 : _a.pauseUpstream(); - }); - } - /** - * Resumes sending the media stream track associated with this publication to the server after a call to [[pauseUpstream()]] - * and signals "unmuted" event to other participants (unless the track is explicitly muted) - */ - resumeUpstream() { - var _a; - return __awaiter(this, void 0, void 0, function* () { - yield (_a = this.track) === null || _a === void 0 ? void 0 : _a.resumeUpstream(); - }); - } -} - -var ConnectionQuality; -(function (ConnectionQuality) { - ConnectionQuality["Excellent"] = "excellent"; - ConnectionQuality["Good"] = "good"; - ConnectionQuality["Poor"] = "poor"; - ConnectionQuality["Unknown"] = "unknown"; -})(ConnectionQuality || (ConnectionQuality = {})); -function qualityFromProto(q) { - switch (q) { - case ConnectionQuality$1.EXCELLENT: - return ConnectionQuality.Excellent; - case ConnectionQuality$1.GOOD: - return ConnectionQuality.Good; - case ConnectionQuality$1.POOR: - return ConnectionQuality.Poor; - default: - return ConnectionQuality.Unknown; - } -} -class Participant extends eventsExports.EventEmitter { - /** @internal */ - constructor(sid, identity, name, metadata) { - super(); - /** audio level between 0-1.0, 1 being loudest, 0 being softest */ - this.audioLevel = 0; - /** if participant is currently speaking */ - this.isSpeaking = false; - this._connectionQuality = ConnectionQuality.Unknown; - this.setMaxListeners(100); - this.sid = sid; - this.identity = identity; - this.name = name; - this.metadata = metadata; - this.audioTracks = new Map(); - this.videoTracks = new Map(); - this.tracks = new Map(); - } - getTracks() { - return Array.from(this.tracks.values()); - } - /** - * Finds the first track that matches the source filter, for example, getting - * the user's camera track with getTrackBySource(Track.Source.Camera). - * @param source - * @returns - */ - getTrack(source) { - for (const [, pub] of this.tracks) { - if (pub.source === source) { - return pub; - } - } - } - /** - * Finds the first track that matches the track's name. - * @param name - * @returns - */ - getTrackByName(name) { - for (const [, pub] of this.tracks) { - if (pub.trackName === name) { - return pub; - } - } - } - get connectionQuality() { - return this._connectionQuality; - } - get isCameraEnabled() { - var _a; - const track = this.getTrack(Track.Source.Camera); - return !((_a = track === null || track === void 0 ? void 0 : track.isMuted) !== null && _a !== void 0 ? _a : true); - } - get isMicrophoneEnabled() { - var _a; - const track = this.getTrack(Track.Source.Microphone); - return !((_a = track === null || track === void 0 ? void 0 : track.isMuted) !== null && _a !== void 0 ? _a : true); - } - get isScreenShareEnabled() { - const track = this.getTrack(Track.Source.ScreenShare); - return !!track; - } - get isLocal() { - return false; - } - /** when participant joined the room */ - get joinedAt() { - if (this.participantInfo) { - return new Date(this.participantInfo.joinedAt * 1000); - } - return new Date(); - } - /** @internal */ - updateInfo(info) { - // it's possible the update could be applied out of order due to await - // during reconnect sequences. when that happens, it's possible for server - // to have sent more recent version of participant info while JS is waiting - // to process the existing payload. - // when the participant sid remains the same, and we already have a later version - // of the payload, they can be safely skipped - if (this.participantInfo && this.participantInfo.sid === info.sid && this.participantInfo.version > info.version) { - return false; - } - this.identity = info.identity; - this.sid = info.sid; - this.setName(info.name); - this.setMetadata(info.metadata); - if (info.permission) { - this.setPermissions(info.permission); - } - // set this last so setMetadata can detect changes - this.participantInfo = info; - livekitLogger.trace('update participant info', { - info - }); - return true; - } - /** @internal */ - setMetadata(md) { - const changed = this.metadata !== md; - const prevMetadata = this.metadata; - this.metadata = md; - if (changed) { - this.emit(ParticipantEvent.ParticipantMetadataChanged, prevMetadata); - } - } - setName(name) { - const changed = this.name !== name; - this.name = name; - if (changed) { - this.emit(ParticipantEvent.ParticipantNameChanged, name); - } - } - /** @internal */ - setPermissions(permissions) { - var _a, _b, _c, _d, _e; - const prevPermissions = this.permissions; - const changed = permissions.canPublish !== ((_a = this.permissions) === null || _a === void 0 ? void 0 : _a.canPublish) || permissions.canSubscribe !== ((_b = this.permissions) === null || _b === void 0 ? void 0 : _b.canSubscribe) || permissions.canPublishData !== ((_c = this.permissions) === null || _c === void 0 ? void 0 : _c.canPublishData) || permissions.hidden !== ((_d = this.permissions) === null || _d === void 0 ? void 0 : _d.hidden) || permissions.recorder !== ((_e = this.permissions) === null || _e === void 0 ? void 0 : _e.recorder) || permissions.canPublishSources.length !== this.permissions.canPublishSources.length || permissions.canPublishSources.some((value, index) => { - var _a; - return value !== ((_a = this.permissions) === null || _a === void 0 ? void 0 : _a.canPublishSources[index]); - }); - this.permissions = permissions; - if (changed) { - this.emit(ParticipantEvent.ParticipantPermissionsChanged, prevPermissions); - } - return changed; - } - /** @internal */ - setIsSpeaking(speaking) { - if (speaking === this.isSpeaking) { - return; - } - this.isSpeaking = speaking; - if (speaking) { - this.lastSpokeAt = new Date(); - } - this.emit(ParticipantEvent.IsSpeakingChanged, speaking); - } - /** @internal */ - setConnectionQuality(q) { - const prevQuality = this._connectionQuality; - this._connectionQuality = qualityFromProto(q); - if (prevQuality !== this._connectionQuality) { - this.emit(ParticipantEvent.ConnectionQualityChanged, this._connectionQuality); - } - } - addTrackPublication(publication) { - // forward publication driven events - publication.on(TrackEvent.Muted, () => { - this.emit(ParticipantEvent.TrackMuted, publication); - }); - publication.on(TrackEvent.Unmuted, () => { - this.emit(ParticipantEvent.TrackUnmuted, publication); - }); - const pub = publication; - if (pub.track) { - pub.track.sid = publication.trackSid; - } - this.tracks.set(publication.trackSid, publication); - switch (publication.kind) { - case Track.Kind.Audio: - this.audioTracks.set(publication.trackSid, publication); - break; - case Track.Kind.Video: - this.videoTracks.set(publication.trackSid, publication); - break; - } - } -} - -function trackPermissionToProto(perms) { - var _a, _b, _c; - if (!perms.participantSid && !perms.participantIdentity) { - throw new Error('Invalid track permission, must provide at least one of participantIdentity and participantSid'); - } - return { - participantIdentity: (_a = perms.participantIdentity) !== null && _a !== void 0 ? _a : '', - participantSid: (_b = perms.participantSid) !== null && _b !== void 0 ? _b : '', - allTracks: (_c = perms.allowAll) !== null && _c !== void 0 ? _c : false, - trackSids: perms.allowedTrackSids || [] - }; -} - -class RemoteTrackPublication extends TrackPublication { - constructor(kind, ti, autoSubscribe) { - super(kind, ti.sid, ti.name); - this.track = undefined; - /** @internal */ - this.allowed = true; - this.disabled = false; - this.currentVideoQuality = VideoQuality.HIGH; - this.handleEnded = track => { - this.setTrack(undefined); - this.emit(TrackEvent.Ended, track); - }; - this.handleVisibilityChange = visible => { - livekitLogger.debug("adaptivestream video visibility ".concat(this.trackSid, ", visible=").concat(visible), { - trackSid: this.trackSid - }); - this.disabled = !visible; - this.emitTrackUpdate(); - }; - this.handleVideoDimensionsChange = dimensions => { - livekitLogger.debug("adaptivestream video dimensions ".concat(dimensions.width, "x").concat(dimensions.height), { - trackSid: this.trackSid - }); - this.videoDimensions = dimensions; - this.emitTrackUpdate(); - }; - this.subscribed = autoSubscribe; - this.updateInfo(ti); - } - /** - * Subscribe or unsubscribe to this remote track - * @param subscribed true to subscribe to a track, false to unsubscribe - */ - setSubscribed(subscribed) { - const prevStatus = this.subscriptionStatus; - const prevPermission = this.permissionStatus; - this.subscribed = subscribed; - // reset allowed status when desired subscription state changes - // server will notify client via signal message if it's not allowed - if (subscribed) { - this.allowed = true; - } - const sub = { - trackSids: [this.trackSid], - subscribe: this.subscribed, - participantTracks: [{ - // sending an empty participant id since TrackPublication doesn't keep it - // this is filled in by the participant that receives this message - participantSid: '', - trackSids: [this.trackSid] - }] - }; - this.emit(TrackEvent.UpdateSubscription, sub); - this.emitSubscriptionUpdateIfChanged(prevStatus); - this.emitPermissionUpdateIfChanged(prevPermission); - } - get subscriptionStatus() { - if (this.subscribed === false) { - return TrackPublication.SubscriptionStatus.Unsubscribed; - } - if (!super.isSubscribed) { - return TrackPublication.SubscriptionStatus.Desired; - } - return TrackPublication.SubscriptionStatus.Subscribed; - } - get permissionStatus() { - return this.allowed ? TrackPublication.PermissionStatus.Allowed : TrackPublication.PermissionStatus.NotAllowed; - } - /** - * Returns true if track is subscribed, and ready for playback - */ - get isSubscribed() { - if (this.subscribed === false) { - return false; - } - return super.isSubscribed; - } - // returns client's desire to subscribe to a track, also true if autoSubscribe is enabled - get isDesired() { - return this.subscribed !== false; - } - get isEnabled() { - return !this.disabled; - } - /** - * disable server from sending down data for this track. this is useful when - * the participant is off screen, you may disable streaming down their video - * to reduce bandwidth requirements - * @param enabled - */ - setEnabled(enabled) { - if (!this.isManualOperationAllowed() || this.disabled === !enabled) { - return; - } - this.disabled = !enabled; - this.emitTrackUpdate(); - } - /** - * for tracks that support simulcasting, adjust subscribed quality - * - * This indicates the highest quality the client can accept. if network - * bandwidth does not allow, server will automatically reduce quality to - * optimize for uninterrupted video - */ - setVideoQuality(quality) { - if (!this.isManualOperationAllowed() || this.currentVideoQuality === quality) { - return; - } - this.currentVideoQuality = quality; - this.videoDimensions = undefined; - this.emitTrackUpdate(); - } - setVideoDimensions(dimensions) { - var _a, _b; - if (!this.isManualOperationAllowed()) { - return; - } - if (((_a = this.videoDimensions) === null || _a === void 0 ? void 0 : _a.width) === dimensions.width && ((_b = this.videoDimensions) === null || _b === void 0 ? void 0 : _b.height) === dimensions.height) { - return; - } - if (this.track instanceof RemoteVideoTrack) { - this.videoDimensions = dimensions; - } - this.currentVideoQuality = undefined; - this.emitTrackUpdate(); - } - setVideoFPS(fps) { - if (!this.isManualOperationAllowed()) { - return; - } - if (!(this.track instanceof RemoteVideoTrack)) { - return; - } - if (this.fps === fps) { - return; - } - this.fps = fps; - this.emitTrackUpdate(); - } - get videoQuality() { - return this.currentVideoQuality; - } - /** @internal */ - setTrack(track) { - const prevStatus = this.subscriptionStatus; - const prevPermission = this.permissionStatus; - const prevTrack = this.track; - if (prevTrack === track) { - return; - } - if (prevTrack) { - // unregister listener - prevTrack.off(TrackEvent.VideoDimensionsChanged, this.handleVideoDimensionsChange); - prevTrack.off(TrackEvent.VisibilityChanged, this.handleVisibilityChange); - prevTrack.off(TrackEvent.Ended, this.handleEnded); - prevTrack.detach(); - prevTrack.stopMonitor(); - this.emit(TrackEvent.Unsubscribed, prevTrack); - } - super.setTrack(track); - if (track) { - track.sid = this.trackSid; - track.on(TrackEvent.VideoDimensionsChanged, this.handleVideoDimensionsChange); - track.on(TrackEvent.VisibilityChanged, this.handleVisibilityChange); - track.on(TrackEvent.Ended, this.handleEnded); - this.emit(TrackEvent.Subscribed, track); - } - this.emitPermissionUpdateIfChanged(prevPermission); - this.emitSubscriptionUpdateIfChanged(prevStatus); - } - /** @internal */ - setAllowed(allowed) { - const prevStatus = this.subscriptionStatus; - const prevPermission = this.permissionStatus; - this.allowed = allowed; - this.emitPermissionUpdateIfChanged(prevPermission); - this.emitSubscriptionUpdateIfChanged(prevStatus); - } - /** @internal */ - setSubscriptionError(error) { - this.emit(TrackEvent.SubscriptionFailed, error); - } - /** @internal */ - updateInfo(info) { - super.updateInfo(info); - const prevMetadataMuted = this.metadataMuted; - this.metadataMuted = info.muted; - if (this.track) { - this.track.setMuted(info.muted); - } else if (prevMetadataMuted !== info.muted) { - this.emit(info.muted ? TrackEvent.Muted : TrackEvent.Unmuted); - } - } - emitSubscriptionUpdateIfChanged(previousStatus) { - const currentStatus = this.subscriptionStatus; - if (previousStatus === currentStatus) { - return; - } - this.emit(TrackEvent.SubscriptionStatusChanged, currentStatus, previousStatus); - } - emitPermissionUpdateIfChanged(previousPermissionStatus) { - const currentPermissionStatus = this.permissionStatus; - if (currentPermissionStatus !== previousPermissionStatus) { - this.emit(TrackEvent.SubscriptionPermissionChanged, this.permissionStatus, previousPermissionStatus); - } - } - isManualOperationAllowed() { - if (this.kind === Track.Kind.Video && this.isAdaptiveStream) { - livekitLogger.warn('adaptive stream is enabled, cannot change video track settings', { - trackSid: this.trackSid - }); - return false; - } - if (!this.isDesired) { - livekitLogger.warn('cannot update track settings when not subscribed', { - trackSid: this.trackSid - }); - return false; - } - return true; - } - get isAdaptiveStream() { - return this.track instanceof RemoteVideoTrack && this.track.isAdaptiveStream; - } - /* @internal */ - emitTrackUpdate() { - const settings = UpdateTrackSettings.fromPartial({ - trackSids: [this.trackSid], - disabled: this.disabled, - fps: this.fps - }); - if (this.videoDimensions) { - settings.width = this.videoDimensions.width; - settings.height = this.videoDimensions.height; - } else if (this.currentVideoQuality !== undefined) { - settings.quality = this.currentVideoQuality; - } else { - // defaults to high quality - settings.quality = VideoQuality.HIGH; - } - this.emit(TrackEvent.UpdateSettings, settings); - } -} - -class RemoteParticipant extends Participant { - /** @internal */ - static fromParticipantInfo(signalClient, pi) { - return new RemoteParticipant(signalClient, pi.sid, pi.identity, pi.name, pi.metadata); - } - /** @internal */ - constructor(signalClient, sid, identity, name, metadata) { - super(sid, identity || '', name, metadata); - this.signalClient = signalClient; - this.tracks = new Map(); - this.audioTracks = new Map(); - this.videoTracks = new Map(); - } - addTrackPublication(publication) { - super.addTrackPublication(publication); - // register action events - publication.on(TrackEvent.UpdateSettings, settings => { - livekitLogger.debug('send update settings', settings); - this.signalClient.sendUpdateTrackSettings(settings); - }); - publication.on(TrackEvent.UpdateSubscription, sub => { - sub.participantTracks.forEach(pt => { - pt.participantSid = this.sid; - }); - this.signalClient.sendUpdateSubscription(sub); - }); - publication.on(TrackEvent.SubscriptionPermissionChanged, status => { - this.emit(ParticipantEvent.TrackSubscriptionPermissionChanged, publication, status); - }); - publication.on(TrackEvent.SubscriptionStatusChanged, status => { - this.emit(ParticipantEvent.TrackSubscriptionStatusChanged, publication, status); - }); - publication.on(TrackEvent.Subscribed, track => { - this.emit(ParticipantEvent.TrackSubscribed, track, publication); - }); - publication.on(TrackEvent.Unsubscribed, previousTrack => { - this.emit(ParticipantEvent.TrackUnsubscribed, previousTrack, publication); - }); - publication.on(TrackEvent.SubscriptionFailed, error => { - this.emit(ParticipantEvent.TrackSubscriptionFailed, publication.trackSid, error); - }); - } - getTrack(source) { - const track = super.getTrack(source); - if (track) { - return track; - } - } - getTrackByName(name) { - const track = super.getTrackByName(name); - if (track) { - return track; - } - } - /** - * sets the volume on the participant's microphone track - * if no track exists the volume will be applied when the microphone track is added - */ - setVolume(volume) { - this.volume = volume; - const audioPublication = this.getTrack(Track.Source.Microphone); - if (audioPublication && audioPublication.track) { - audioPublication.track.setVolume(volume); - } - } - /** - * gets the volume on the participant's microphone track - */ - getVolume() { - const audioPublication = this.getTrack(Track.Source.Microphone); - if (audioPublication && audioPublication.track) { - return audioPublication.track.getVolume(); - } - return this.volume; - } - /** @internal */ - addSubscribedMediaTrack(mediaTrack, sid, mediaStream, receiver, adaptiveStreamSettings, triesLeft) { - // find the track publication - // it's possible for the media track to arrive before participant info - let publication = this.getTrackPublication(sid); - // it's also possible that the browser didn't honor our original track id - // FireFox would use its own local uuid instead of server track id - if (!publication) { - if (!sid.startsWith('TR')) { - // find the first track that matches type - this.tracks.forEach(p => { - if (!publication && mediaTrack.kind === p.kind.toString()) { - publication = p; - } - }); - } - } - // when we couldn't locate the track, it's possible that the metadata hasn't - // yet arrived. Wait a bit longer for it to arrive, or fire an error - if (!publication) { - if (triesLeft === 0) { - livekitLogger.error('could not find published track', { - participant: this.sid, - trackSid: sid - }); - this.emit(ParticipantEvent.TrackSubscriptionFailed, sid); - return; - } - if (triesLeft === undefined) triesLeft = 20; - setTimeout(() => { - this.addSubscribedMediaTrack(mediaTrack, sid, mediaStream, receiver, adaptiveStreamSettings, triesLeft - 1); - }, 150); - return; - } - if (mediaTrack.readyState === 'ended') { - livekitLogger.error('unable to subscribe because MediaStreamTrack is ended. Do not call MediaStreamTrack.stop()', { - participant: this.sid, - trackSid: sid - }); - this.emit(ParticipantEvent.TrackSubscriptionFailed, sid); - return; - } - const isVideo = mediaTrack.kind === 'video'; - let track; - if (isVideo) { - track = new RemoteVideoTrack(mediaTrack, sid, receiver, adaptiveStreamSettings); - } else { - track = new RemoteAudioTrack(mediaTrack, sid, receiver, this.audioContext, this.audioOutput); - } - // set track info - track.source = publication.source; - // keep publication's muted status - track.isMuted = publication.isMuted; - track.setMediaStream(mediaStream); - track.start(); - publication.setTrack(track); - // set participant volume on new microphone tracks - if (this.volume !== undefined && track instanceof RemoteAudioTrack && track.source === Track.Source.Microphone) { - track.setVolume(this.volume); - } - return publication; - } - /** @internal */ - get hasMetadata() { - return !!this.participantInfo; - } - getTrackPublication(sid) { - return this.tracks.get(sid); - } - /** @internal */ - updateInfo(info) { - if (!super.updateInfo(info)) { - return false; - } - // we are getting a list of all available tracks, reconcile in here - // and send out events for changes - // reconcile track publications, publish events only if metadata is already there - // i.e. changes since the local participant has joined - const validTracks = new Map(); - const newTracks = new Map(); - info.tracks.forEach(ti => { - var _a; - let publication = this.getTrackPublication(ti.sid); - if (!publication) { - // new publication - const kind = Track.kindFromProto(ti.type); - if (!kind) { - return; - } - publication = new RemoteTrackPublication(kind, ti, (_a = this.signalClient.connectOptions) === null || _a === void 0 ? void 0 : _a.autoSubscribe); - publication.updateInfo(ti); - newTracks.set(ti.sid, publication); - const existingTrackOfSource = Array.from(this.tracks.values()).find(publishedTrack => publishedTrack.source === (publication === null || publication === void 0 ? void 0 : publication.source)); - if (existingTrackOfSource && publication.source !== Track.Source.Unknown) { - livekitLogger.debug("received a second track publication for ".concat(this.identity, " with the same source: ").concat(publication.source), { - oldTrack: existingTrackOfSource, - newTrack: publication, - participant: this, - participantInfo: info - }); - } - this.addTrackPublication(publication); - } else { - publication.updateInfo(ti); - } - validTracks.set(ti.sid, publication); - }); - // detect removed tracks - this.tracks.forEach(publication => { - if (!validTracks.has(publication.trackSid)) { - livekitLogger.trace('detected removed track on remote participant, unpublishing', { - publication, - participantSid: this.sid - }); - this.unpublishTrack(publication.trackSid, true); - } - }); - // always emit events for new publications, Room will not forward them unless it's ready - newTracks.forEach(publication => { - this.emit(ParticipantEvent.TrackPublished, publication); - }); - return true; - } - /** @internal */ - unpublishTrack(sid, sendUnpublish) { - const publication = this.tracks.get(sid); - if (!publication) { - return; - } - // also send unsubscribe, if track is actively subscribed - const { - track - } = publication; - if (track) { - track.stop(); - publication.setTrack(undefined); - } - // remove track from maps only after unsubscribed has been fired - this.tracks.delete(sid); - // remove from the right type map - switch (publication.kind) { - case Track.Kind.Audio: - this.audioTracks.delete(sid); - break; - case Track.Kind.Video: - this.videoTracks.delete(sid); - break; - } - if (sendUnpublish) { - this.emit(ParticipantEvent.TrackUnpublished, publication); - } - } - /** - * @internal - */ - setAudioContext(ctx) { - this.audioContext = ctx; - this.audioTracks.forEach(track => track.track instanceof RemoteAudioTrack && track.track.setAudioContext(ctx)); - } - /** - * @internal - */ - setAudioOutput(output) { - return __awaiter(this, void 0, void 0, function* () { - this.audioOutput = output; - const promises = []; - this.audioTracks.forEach(pub => { - var _a; - if (pub.track instanceof RemoteAudioTrack) { - promises.push(pub.track.setSinkId((_a = output.deviceId) !== null && _a !== void 0 ? _a : 'default')); - } - }); - yield Promise.all(promises); - }); - } - /** @internal */ - emit(event) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - livekitLogger.trace('participant event', { - participant: this.sid, - event, - args - }); - return super.emit(event, ...args); - } -} - -class LocalParticipant extends Participant { - /** @internal */ - constructor(sid, identity, engine, options) { - super(sid, identity); - this.pendingPublishing = new Set(); - this.pendingPublishPromises = new Map(); - this.participantTrackPermissions = []; - this.allParticipantsAllowedToSubscribe = true; - this.handleReconnecting = () => { - if (!this.reconnectFuture) { - this.reconnectFuture = new Future(); - } - }; - this.handleReconnected = () => { - var _a, _b; - (_b = (_a = this.reconnectFuture) === null || _a === void 0 ? void 0 : _a.resolve) === null || _b === void 0 ? void 0 : _b.call(_a); - this.reconnectFuture = undefined; - this.updateTrackSubscriptionPermissions(); - }; - this.handleDisconnected = () => { - var _a, _b; - (_b = (_a = this.reconnectFuture) === null || _a === void 0 ? void 0 : _a.reject) === null || _b === void 0 ? void 0 : _b.call(_a, 'Got disconnected during publishing attempt'); - this.reconnectFuture = undefined; - }; - this.updateTrackSubscriptionPermissions = () => { - livekitLogger.debug('updating track subscription permissions', { - allParticipantsAllowed: this.allParticipantsAllowedToSubscribe, - participantTrackPermissions: this.participantTrackPermissions - }); - this.engine.client.sendUpdateSubscriptionPermissions(this.allParticipantsAllowedToSubscribe, this.participantTrackPermissions.map(p => trackPermissionToProto(p))); - }; - /** @internal */ - this.onTrackUnmuted = track => { - this.onTrackMuted(track, track.isUpstreamPaused); - }; - // when the local track changes in mute status, we'll notify server as such - /** @internal */ - this.onTrackMuted = (track, muted) => { - if (muted === undefined) { - muted = true; - } - if (!track.sid) { - livekitLogger.error('could not update mute status for unpublished track', track); - return; - } - this.engine.updateMuteStatus(track.sid, muted); - }; - this.onTrackUpstreamPaused = track => { - livekitLogger.debug('upstream paused'); - this.onTrackMuted(track, true); - }; - this.onTrackUpstreamResumed = track => { - livekitLogger.debug('upstream resumed'); - this.onTrackMuted(track, track.isMuted); - }; - this.handleSubscribedQualityUpdate = update => __awaiter(this, void 0, void 0, function* () { - var _a, e_1, _b, _c; - var _d, _e; - if (!((_d = this.roomOptions) === null || _d === void 0 ? void 0 : _d.dynacast)) { - return; - } - const pub = this.videoTracks.get(update.trackSid); - if (!pub) { - livekitLogger.warn('received subscribed quality update for unknown track', { - method: 'handleSubscribedQualityUpdate', - sid: update.trackSid - }); - return; - } - if (update.subscribedCodecs.length > 0) { - if (!pub.videoTrack) { - return; - } - const newCodecs = yield pub.videoTrack.setPublishingCodecs(update.subscribedCodecs); - try { - for (var _f = true, newCodecs_1 = __asyncValues(newCodecs), newCodecs_1_1; newCodecs_1_1 = yield newCodecs_1.next(), _a = newCodecs_1_1.done, !_a; _f = true) { - _c = newCodecs_1_1.value; - _f = false; - const codec = _c; - if (isBackupCodec(codec)) { - livekitLogger.debug("publish ".concat(codec, " for ").concat(pub.videoTrack.sid)); - yield this.publishAdditionalCodecForTrack(pub.videoTrack, codec, pub.options); - } - } - } catch (e_1_1) { - e_1 = { - error: e_1_1 - }; - } finally { - try { - if (!_f && !_a && (_b = newCodecs_1.return)) yield _b.call(newCodecs_1); - } finally { - if (e_1) throw e_1.error; - } - } - } else if (update.subscribedQualities.length > 0) { - yield (_e = pub.videoTrack) === null || _e === void 0 ? void 0 : _e.setPublishingLayers(update.subscribedQualities); - } - }); - this.handleLocalTrackUnpublished = unpublished => { - const track = this.tracks.get(unpublished.trackSid); - if (!track) { - livekitLogger.warn('received unpublished event for unknown track', { - method: 'handleLocalTrackUnpublished', - trackSid: unpublished.trackSid - }); - return; - } - this.unpublishTrack(track.track); - }; - this.handleTrackEnded = track => __awaiter(this, void 0, void 0, function* () { - if (track.source === Track.Source.ScreenShare || track.source === Track.Source.ScreenShareAudio) { - livekitLogger.debug('unpublishing local track due to TrackEnded', { - track: track.sid - }); - this.unpublishTrack(track); - } else if (track.isUserProvided) { - yield track.mute(); - } else if (track instanceof LocalAudioTrack || track instanceof LocalVideoTrack) { - try { - if (isWeb()) { - try { - const currentPermissions = yield navigator === null || navigator === void 0 ? void 0 : navigator.permissions.query({ - // the permission query for camera and microphone currently not supported in Safari and Firefox - // @ts-ignore - name: track.source === Track.Source.Camera ? 'camera' : 'microphone' - }); - if (currentPermissions && currentPermissions.state === 'denied') { - livekitLogger.warn("user has revoked access to ".concat(track.source)); - // detect granted change after permissions were denied to try and resume then - currentPermissions.onchange = () => { - if (currentPermissions.state !== 'denied') { - if (!track.isMuted) { - track.restartTrack(); - } - currentPermissions.onchange = null; - } - }; - throw new Error('GetUserMedia Permission denied'); - } - } catch (e) { - // permissions query fails for firefox, we continue and try to restart the track - } - } - if (!track.isMuted) { - livekitLogger.debug('track ended, attempting to use a different device'); - yield track.restartTrack(); - } - } catch (e) { - livekitLogger.warn("could not restart track, muting instead"); - yield track.mute(); - } - } - }); - this.audioTracks = new Map(); - this.videoTracks = new Map(); - this.tracks = new Map(); - this.engine = engine; - this.roomOptions = options; - this.setupEngine(engine); - } - get lastCameraError() { - return this.cameraError; - } - get lastMicrophoneError() { - return this.microphoneError; - } - getTrack(source) { - const track = super.getTrack(source); - if (track) { - return track; - } - } - getTrackByName(name) { - const track = super.getTrackByName(name); - if (track) { - return track; - } - } - /** - * @internal - */ - setupEngine(engine) { - this.engine = engine; - this.engine.client.onRemoteMuteChanged = (trackSid, muted) => { - const pub = this.tracks.get(trackSid); - if (!pub || !pub.track) { - return; - } - if (muted) { - pub.mute(); - } else { - pub.unmute(); - } - }; - this.engine.client.onSubscribedQualityUpdate = this.handleSubscribedQualityUpdate; - this.engine.client.onLocalTrackUnpublished = this.handleLocalTrackUnpublished; - this.engine.on(EngineEvent.Connected, this.handleReconnected).on(EngineEvent.Restarted, this.handleReconnected).on(EngineEvent.Resumed, this.handleReconnected).on(EngineEvent.Restarting, this.handleReconnecting).on(EngineEvent.Resuming, this.handleReconnecting).on(EngineEvent.Disconnected, this.handleDisconnected); - } - /** - * Sets and updates the metadata of the local participant. - * Note: this requires `canUpdateOwnMetadata` permission encoded in the token. - * @param metadata - */ - setMetadata(metadata) { - var _a; - super.setMetadata(metadata); - this.engine.client.sendUpdateLocalMetadata(metadata, (_a = this.name) !== null && _a !== void 0 ? _a : ''); - } - /** - * Sets and updates the name of the local participant. - * Note: this requires `canUpdateOwnMetadata` permission encoded in the token. - * @param metadata - */ - setName(name) { - var _a; - super.setName(name); - this.engine.client.sendUpdateLocalMetadata((_a = this.metadata) !== null && _a !== void 0 ? _a : '', name); - } - /** - * Enable or disable a participant's camera track. - * - * If a track has already published, it'll mute or unmute the track. - * Resolves with a `LocalTrackPublication` instance if successful and `undefined` otherwise - */ - setCameraEnabled(enabled, options, publishOptions) { - return this.setTrackEnabled(Track.Source.Camera, enabled, options, publishOptions); - } - /** - * Enable or disable a participant's microphone track. - * - * If a track has already published, it'll mute or unmute the track. - * Resolves with a `LocalTrackPublication` instance if successful and `undefined` otherwise - */ - setMicrophoneEnabled(enabled, options, publishOptions) { - return this.setTrackEnabled(Track.Source.Microphone, enabled, options, publishOptions); - } - /** - * Start or stop sharing a participant's screen - * Resolves with a `LocalTrackPublication` instance if successful and `undefined` otherwise - */ - setScreenShareEnabled(enabled, options, publishOptions) { - return this.setTrackEnabled(Track.Source.ScreenShare, enabled, options, publishOptions); - } - setTrackEnabled(source, enabled, options, publishOptions) { - var _a, _b; - return __awaiter(this, void 0, void 0, function* () { - livekitLogger.debug('setTrackEnabled', { - source, - enabled - }); - let track = this.getTrack(source); - if (enabled) { - if (track) { - yield track.unmute(); - } else { - let localTracks; - if (this.pendingPublishing.has(source)) { - livekitLogger.info('skipping duplicate published source', { - source - }); - // no-op it's already been requested - return; - } - this.pendingPublishing.add(source); - try { - switch (source) { - case Track.Source.Camera: - localTracks = yield this.createTracks({ - video: (_a = options) !== null && _a !== void 0 ? _a : true - }); - break; - case Track.Source.Microphone: - localTracks = yield this.createTracks({ - audio: (_b = options) !== null && _b !== void 0 ? _b : true - }); - break; - case Track.Source.ScreenShare: - localTracks = yield this.createScreenTracks(Object.assign({}, options)); - break; - default: - throw new TrackInvalidError(source); - } - const publishPromises = []; - for (const localTrack of localTracks) { - livekitLogger.info('publishing track', { - localTrack - }); - publishPromises.push(this.publishTrack(localTrack, publishOptions)); - } - const publishedTracks = yield Promise.all(publishPromises); - // for screen share publications including audio, this will only return the screen share publication, not the screen share audio one - // revisit if we want to return an array of tracks instead for v2 - [track] = publishedTracks; - } catch (e) { - if (e instanceof Error && !(e instanceof TrackInvalidError)) { - this.emit(ParticipantEvent.MediaDevicesError, e); - } - throw e; - } finally { - this.pendingPublishing.delete(source); - } - } - } else if (track && track.track) { - // screenshare cannot be muted, unpublish instead - if (source === Track.Source.ScreenShare) { - track = yield this.unpublishTrack(track.track); - const screenAudioTrack = this.getTrack(Track.Source.ScreenShareAudio); - if (screenAudioTrack && screenAudioTrack.track) { - this.unpublishTrack(screenAudioTrack.track); - } - } else { - yield track.mute(); - } - } - return track; - }); - } - /** - * Publish both camera and microphone at the same time. This is useful for - * displaying a single Permission Dialog box to the end user. - */ - enableCameraAndMicrophone() { - return __awaiter(this, void 0, void 0, function* () { - if (this.pendingPublishing.has(Track.Source.Camera) || this.pendingPublishing.has(Track.Source.Microphone)) { - // no-op it's already been requested - return; - } - this.pendingPublishing.add(Track.Source.Camera); - this.pendingPublishing.add(Track.Source.Microphone); - try { - const tracks = yield this.createTracks({ - audio: true, - video: true - }); - yield Promise.all(tracks.map(track => this.publishTrack(track))); - } finally { - this.pendingPublishing.delete(Track.Source.Camera); - this.pendingPublishing.delete(Track.Source.Microphone); - } - }); - } - /** - * Create local camera and/or microphone tracks - * @param options - * @returns - */ - createTracks(options) { - var _a, _b; - return __awaiter(this, void 0, void 0, function* () { - const opts = mergeDefaultOptions(options, (_a = this.roomOptions) === null || _a === void 0 ? void 0 : _a.audioCaptureDefaults, (_b = this.roomOptions) === null || _b === void 0 ? void 0 : _b.videoCaptureDefaults); - const constraints = constraintsForOptions(opts); - let stream; - try { - stream = yield navigator.mediaDevices.getUserMedia(constraints); - } catch (err) { - if (err instanceof Error) { - if (constraints.audio) { - this.microphoneError = err; - } - if (constraints.video) { - this.cameraError = err; - } - } - throw err; - } - if (constraints.audio) { - this.microphoneError = undefined; - } - if (constraints.video) { - this.cameraError = undefined; - } - return stream.getTracks().map(mediaStreamTrack => { - const isAudio = mediaStreamTrack.kind === 'audio'; - isAudio ? options.audio : options.video; - let trackConstraints; - const conOrBool = isAudio ? constraints.audio : constraints.video; - if (typeof conOrBool !== 'boolean') { - trackConstraints = conOrBool; - } - const track = mediaTrackToLocalTrack(mediaStreamTrack, trackConstraints); - if (track.kind === Track.Kind.Video) { - track.source = Track.Source.Camera; - } else if (track.kind === Track.Kind.Audio) { - track.source = Track.Source.Microphone; - } - track.mediaStream = stream; - return track; - }); - }); - } - /** - * Creates a screen capture tracks with getDisplayMedia(). - * A LocalVideoTrack is always created and returned. - * If { audio: true }, and the browser supports audio capture, a LocalAudioTrack is also created. - */ - createScreenTracks(options) { - var _a; - return __awaiter(this, void 0, void 0, function* () { - if (options === undefined) { - options = {}; - } - if (options.resolution === undefined) { - options.resolution = ScreenSharePresets.h1080fps15.resolution; - } - let videoConstraints = true; - if (options.resolution) { - if (isSafari()) { - videoConstraints = { - width: { - max: options.resolution.width - }, - height: { - max: options.resolution.height - }, - frameRate: options.resolution.frameRate - }; - } else { - videoConstraints = { - width: { - ideal: options.resolution.width - }, - height: { - ideal: options.resolution.height - }, - frameRate: options.resolution.frameRate - }; - } - } - if (navigator.mediaDevices.getDisplayMedia === undefined) { - throw new DeviceUnsupportedError('getDisplayMedia not supported'); - } - const stream = yield navigator.mediaDevices.getDisplayMedia({ - audio: (_a = options.audio) !== null && _a !== void 0 ? _a : false, - video: videoConstraints, - // @ts-expect-error support for experimental display media features - controller: options.controller, - selfBrowserSurface: options.selfBrowserSurface, - surfaceSwitching: options.surfaceSwitching, - systemAudio: options.systemAudio - }); - const tracks = stream.getVideoTracks(); - if (tracks.length === 0) { - throw new TrackInvalidError('no video track found'); - } - const screenVideo = new LocalVideoTrack(tracks[0], undefined, false); - screenVideo.source = Track.Source.ScreenShare; - const localTracks = [screenVideo]; - if (stream.getAudioTracks().length > 0) { - const screenAudio = new LocalAudioTrack(stream.getAudioTracks()[0], undefined, false); - screenAudio.source = Track.Source.ScreenShareAudio; - localTracks.push(screenAudio); - } - return localTracks; - }); - } - /** - * Publish a new track to the room - * @param track - * @param options - */ - publishTrack(track, options) { - var _a, _b, _c; - return __awaiter(this, void 0, void 0, function* () { - yield (_a = this.reconnectFuture) === null || _a === void 0 ? void 0 : _a.promise; - if (track instanceof LocalTrack && this.pendingPublishPromises.has(track)) { - yield this.pendingPublishPromises.get(track); - } - // convert raw media track into audio or video track - if (track instanceof MediaStreamTrack) { - switch (track.kind) { - case 'audio': - track = new LocalAudioTrack(track, undefined, true); - break; - case 'video': - track = new LocalVideoTrack(track, undefined, true); - break; - default: - throw new TrackInvalidError("unsupported MediaStreamTrack kind ".concat(track.kind)); - } - } - // is it already published? if so skip - let existingPublication; - this.tracks.forEach(publication => { - if (!publication.track) { - return; - } - if (publication.track === track) { - existingPublication = publication; - } - }); - if (existingPublication) { - livekitLogger.warn('track has already been published, skipping'); - return existingPublication; - } - const isStereo = (options === null || options === void 0 ? void 0 : options.forceStereo) || 'channelCount' in track.mediaStreamTrack.getSettings() && - // @ts-ignore `channelCount` on getSettings() is currently only available for Safari, but is generally the best way to determine a stereo track https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackSettings/channelCount - track.mediaStreamTrack.getSettings().channelCount === 2 || track.mediaStreamTrack.getConstraints().channelCount === 2; - // disable dtx for stereo track if not enabled explicitly - if (isStereo) { - if (!options) { - options = {}; - } - if (options.dtx === undefined) { - livekitLogger.info("Opus DTX will be disabled for stereo tracks by default. Enable them explicitly to make it work."); - } - if (options.red === undefined) { - livekitLogger.info("Opus RED will be disabled for stereo tracks by default. Enable them explicitly to make it work."); - } - (_b = options.dtx) !== null && _b !== void 0 ? _b : options.dtx = false; - (_c = options.red) !== null && _c !== void 0 ? _c : options.red = false; - } - const opts = Object.assign(Object.assign({}, this.roomOptions.publishDefaults), options); - if (opts.source) { - track.source = opts.source; - } - const publishPromise = this.publish(track, opts, options, isStereo); - this.pendingPublishPromises.set(track, publishPromise); - try { - const publication = yield publishPromise; - return publication; - } catch (e) { - throw e; - } finally { - this.pendingPublishPromises.delete(track); - } - }); - } - publish(track, opts, options, isStereo) { - var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o; - return __awaiter(this, void 0, void 0, function* () { - const existingTrackOfSource = Array.from(this.tracks.values()).find(publishedTrack => track instanceof LocalTrack && publishedTrack.source === track.source); - if (existingTrackOfSource && track.source !== Track.Source.Unknown) { - try { - // throw an Error in order to capture the stack trace - throw Error("publishing a second track with the same source: ".concat(track.source)); - } catch (e) { - if (e instanceof Error) { - livekitLogger.warn(e.message, { - oldTrack: existingTrackOfSource, - newTrack: track, - trace: e.stack - }); - } - } - } - if (opts.stopMicTrackOnMute && track instanceof LocalAudioTrack) { - track.stopOnMute = true; - } - if (track.source === Track.Source.ScreenShare && isFireFox()) { - // Firefox does not work well with simulcasted screen share - // we frequently get no data on layer 0 when enabled - opts.simulcast = false; - } - // require full AV1/VP9 SVC support prior to using it - if (opts.videoCodec === 'av1' && !supportsAV1()) { - opts.videoCodec = undefined; - } - if (opts.videoCodec === 'vp9' && !supportsVP9()) { - opts.videoCodec = undefined; - } - // handle track actions - track.on(TrackEvent.Muted, this.onTrackMuted); - track.on(TrackEvent.Unmuted, this.onTrackUnmuted); - track.on(TrackEvent.Ended, this.handleTrackEnded); - track.on(TrackEvent.UpstreamPaused, this.onTrackUpstreamPaused); - track.on(TrackEvent.UpstreamResumed, this.onTrackUpstreamResumed); - // create track publication from track - const req = AddTrackRequest.fromPartial({ - // get local track id for use during publishing - cid: track.mediaStreamTrack.id, - name: options === null || options === void 0 ? void 0 : options.name, - type: Track.kindToProto(track.kind), - muted: track.isMuted, - source: Track.sourceToProto(track.source), - disableDtx: !((_a = opts.dtx) !== null && _a !== void 0 ? _a : true), - stereo: isStereo, - disableRed: !((_b = opts.red) !== null && _b !== void 0 ? _b : true) - }); - // compute encodings and layers for video - let encodings; - let simEncodings; - if (track.kind === Track.Kind.Video) { - let dims = { - width: 0, - height: 0 - }; - try { - dims = yield track.waitForDimensions(); - } catch (e) { - // use defaults, it's quite painful for congestion control without simulcast - // so using default dims according to publish settings - const defaultRes = (_d = (_c = this.roomOptions.videoCaptureDefaults) === null || _c === void 0 ? void 0 : _c.resolution) !== null && _d !== void 0 ? _d : VideoPresets.h720.resolution; - dims = { - width: defaultRes.width, - height: defaultRes.height - }; - // log failure - livekitLogger.error('could not determine track dimensions, using defaults', dims); - } - // width and height should be defined for video - req.width = dims.width; - req.height = dims.height; - // for svc codecs, disable simulcast and use vp8 for backup codec - if (track instanceof LocalVideoTrack) { - if (isSVCCodec(opts.videoCodec)) { - // set scalabilityMode to 'L3T3_KEY' by default - opts.scalabilityMode = (_e = opts.scalabilityMode) !== null && _e !== void 0 ? _e : 'L3T3_KEY'; - } - // set up backup - if (opts.videoCodec && opts.backupCodec && opts.videoCodec !== opts.backupCodec.codec) { - const simOpts = Object.assign({}, opts); - simOpts.simulcast = true; - simEncodings = computeTrackBackupEncodings(track, opts.backupCodec.codec, simOpts); - req.simulcastCodecs = [{ - codec: opts.videoCodec, - cid: track.mediaStreamTrack.id, - enableSimulcastLayers: true - }, { - codec: opts.backupCodec.codec, - cid: '', - enableSimulcastLayers: true - }]; - } else if (opts.videoCodec) { - // pass codec info to sfu so it can prefer codec for the client which don't support - // setCodecPreferences - req.simulcastCodecs = [{ - codec: opts.videoCodec, - cid: track.mediaStreamTrack.id, - enableSimulcastLayers: (_f = opts.simulcast) !== null && _f !== void 0 ? _f : false - }]; - } - } - encodings = computeVideoEncodings(track.source === Track.Source.ScreenShare, dims.width, dims.height, opts); - req.layers = videoLayersFromEncodings(req.width, req.height, encodings); - } else if (track.kind === Track.Kind.Audio) { - encodings = [{ - maxBitrate: (_h = (_g = opts.audioPreset) === null || _g === void 0 ? void 0 : _g.maxBitrate) !== null && _h !== void 0 ? _h : opts.audioBitrate, - priority: (_k = (_j = opts.audioPreset) === null || _j === void 0 ? void 0 : _j.priority) !== null && _k !== void 0 ? _k : 'high', - networkPriority: (_m = (_l = opts.audioPreset) === null || _l === void 0 ? void 0 : _l.priority) !== null && _m !== void 0 ? _m : 'high' - }]; - } - if (!this.engine || this.engine.isClosed) { - throw new UnexpectedConnectionState('cannot publish track when not connected'); - } - const ti = yield this.engine.addTrack(req); - let primaryCodecSupported = false; - let backupCodecSupported = false; - ti.codecs.forEach(c => { - if (isCodecEqual(c.mimeType, opts.videoCodec)) { - primaryCodecSupported = true; - } else if (opts.backupCodec && isCodecEqual(c.mimeType, opts.backupCodec.codec)) { - backupCodecSupported = true; - } - }); - if (req.simulcastCodecs.length > 0) { - if (!primaryCodecSupported && !backupCodecSupported) { - throw Error('cannot publish track, codec not supported by server'); - } - if (!primaryCodecSupported && opts.backupCodec) { - const backupCodec = opts.backupCodec; - opts = Object.assign({}, opts); - livekitLogger.debug("primary codec ".concat(opts.videoCodec, " not supported, fallback to ").concat(backupCodec.codec)); - opts.videoCodec = backupCodec.codec; - opts.videoEncoding = backupCodec.encoding; - encodings = simEncodings; - } - } - const publication = new LocalTrackPublication(track.kind, ti, track); - // save options for when it needs to be republished again - publication.options = opts; - track.sid = ti.sid; - if (!this.engine.publisher) { - throw new UnexpectedConnectionState('publisher is closed'); - } - livekitLogger.debug("publishing ".concat(track.kind, " with encodings"), { - encodings, - trackInfo: ti - }); - // store RTPSender - track.sender = yield this.engine.createSender(track, opts, encodings); - if (track.codec && isSVCCodec(track.codec) && encodings && ((_o = encodings[0]) === null || _o === void 0 ? void 0 : _o.maxBitrate)) { - this.engine.publisher.setTrackCodecBitrate(req.cid, track.codec, encodings[0].maxBitrate / 1000); - } - this.engine.negotiate(); - if (track instanceof LocalVideoTrack) { - track.startMonitor(this.engine.client); - } else if (track instanceof LocalAudioTrack) { - track.startMonitor(); - } - this.addTrackPublication(publication); - // send event for publication - this.emit(ParticipantEvent.LocalTrackPublished, publication); - return publication; - }); - } - get isLocal() { - return true; - } - /** @internal - * publish additional codec to existing track - */ - publishAdditionalCodecForTrack(track, videoCodec, options) { - var _a; - return __awaiter(this, void 0, void 0, function* () { - // is it not published? if so skip - let existingPublication; - this.tracks.forEach(publication => { - if (!publication.track) { - return; - } - if (publication.track === track) { - existingPublication = publication; - } - }); - if (!existingPublication) { - throw new TrackInvalidError('track is not published'); - } - if (!(track instanceof LocalVideoTrack)) { - throw new TrackInvalidError('track is not a video track'); - } - const opts = Object.assign(Object.assign({}, (_a = this.roomOptions) === null || _a === void 0 ? void 0 : _a.publishDefaults), options); - const encodings = computeTrackBackupEncodings(track, videoCodec, opts); - if (!encodings) { - livekitLogger.info("backup codec has been disabled, ignoring request to add additional codec for track"); - return; - } - const simulcastTrack = track.addSimulcastTrack(videoCodec, encodings); - const req = AddTrackRequest.fromPartial({ - cid: simulcastTrack.mediaStreamTrack.id, - type: Track.kindToProto(track.kind), - muted: track.isMuted, - source: Track.sourceToProto(track.source), - sid: track.sid, - simulcastCodecs: [{ - codec: opts.videoCodec, - cid: simulcastTrack.mediaStreamTrack.id, - enableSimulcastLayers: opts.simulcast - }] - }); - req.layers = videoLayersFromEncodings(req.width, req.height, encodings); - if (!this.engine || this.engine.isClosed) { - throw new UnexpectedConnectionState('cannot publish track when not connected'); - } - const ti = yield this.engine.addTrack(req); - yield this.engine.createSimulcastSender(track, simulcastTrack, opts, encodings); - this.engine.negotiate(); - livekitLogger.debug("published ".concat(videoCodec, " for track ").concat(track.sid), { - encodings, - trackInfo: ti - }); - }); - } - unpublishTrack(track, stopOnUnpublish) { - var _a, _b; - return __awaiter(this, void 0, void 0, function* () { - // look through all published tracks to find the right ones - const publication = this.getPublicationForTrack(track); - livekitLogger.debug('unpublishing track', { - track, - method: 'unpublishTrack' - }); - if (!publication || !publication.track) { - livekitLogger.warn('track was not unpublished because no publication was found', { - track, - method: 'unpublishTrack' - }); - return undefined; - } - track = publication.track; - track.off(TrackEvent.Muted, this.onTrackMuted); - track.off(TrackEvent.Unmuted, this.onTrackUnmuted); - track.off(TrackEvent.Ended, this.handleTrackEnded); - track.off(TrackEvent.UpstreamPaused, this.onTrackUpstreamPaused); - track.off(TrackEvent.UpstreamResumed, this.onTrackUpstreamResumed); - if (stopOnUnpublish === undefined) { - stopOnUnpublish = (_b = (_a = this.roomOptions) === null || _a === void 0 ? void 0 : _a.stopLocalTrackOnUnpublish) !== null && _b !== void 0 ? _b : true; - } - if (stopOnUnpublish) { - track.stop(); - } - let negotiationNeeded = false; - const trackSender = track.sender; - track.sender = undefined; - if (this.engine.publisher && this.engine.publisher.pc.connectionState !== 'closed' && trackSender) { - try { - for (const transceiver of this.engine.publisher.pc.getTransceivers()) { - // if sender is not currently sending (after replaceTrack(null)) - // removeTrack would have no effect. - // to ensure we end up successfully removing the track, manually set - // the transceiver to inactive - if (transceiver.sender === trackSender) { - transceiver.direction = 'inactive'; - negotiationNeeded = true; - } - } - if (this.engine.removeTrack(trackSender)) { - negotiationNeeded = true; - } - if (track instanceof LocalVideoTrack) { - for (const [, trackInfo] of track.simulcastCodecs) { - if (trackInfo.sender) { - if (this.engine.removeTrack(trackInfo.sender)) { - negotiationNeeded = true; - } - trackInfo.sender = undefined; - } - } - track.simulcastCodecs.clear(); - } - } catch (e) { - livekitLogger.warn('failed to unpublish track', { - error: e, - method: 'unpublishTrack' - }); - } - } - // remove from our maps - this.tracks.delete(publication.trackSid); - switch (publication.kind) { - case Track.Kind.Audio: - this.audioTracks.delete(publication.trackSid); - break; - case Track.Kind.Video: - this.videoTracks.delete(publication.trackSid); - break; - } - this.emit(ParticipantEvent.LocalTrackUnpublished, publication); - publication.setTrack(undefined); - if (negotiationNeeded) { - yield this.engine.negotiate(); - } - return publication; - }); - } - unpublishTracks(tracks) { - return __awaiter(this, void 0, void 0, function* () { - const results = yield Promise.all(tracks.map(track => this.unpublishTrack(track))); - return results.filter(track => track instanceof LocalTrackPublication); - }); - } - republishAllTracks(options) { - return __awaiter(this, void 0, void 0, function* () { - const localPubs = []; - this.tracks.forEach(pub => { - if (pub.track) { - if (options) { - pub.options = Object.assign(Object.assign({}, pub.options), options); - } - localPubs.push(pub); - } - }); - yield Promise.all(localPubs.map(pub => __awaiter(this, void 0, void 0, function* () { - const track = pub.track; - yield this.unpublishTrack(track, false); - yield this.publishTrack(track, pub.options); - }))); - }); - } - publishData(data, kind) { - let publishOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - return __awaiter(this, void 0, void 0, function* () { - const destination = Array.isArray(publishOptions) ? publishOptions : publishOptions === null || publishOptions === void 0 ? void 0 : publishOptions.destination; - const destinationSids = []; - const topic = !Array.isArray(publishOptions) ? publishOptions.topic : undefined; - if (destination !== undefined) { - destination.forEach(val => { - if (val instanceof RemoteParticipant) { - destinationSids.push(val.sid); - } else { - destinationSids.push(val); - } - }); - } - const packet = { - kind, - value: { - $case: 'user', - user: { - participantSid: this.sid, - payload: data, - destinationSids: destinationSids, - topic - } - } - }; - yield this.engine.sendDataPacket(packet, kind); - }); - } - /** - * Control who can subscribe to LocalParticipant's published tracks. - * - * By default, all participants can subscribe. This allows fine-grained control over - * who is able to subscribe at a participant and track level. - * - * Note: if access is given at a track-level (i.e. both [allParticipantsAllowed] and - * [ParticipantTrackPermission.allTracksAllowed] are false), any newer published tracks - * will not grant permissions to any participants and will require a subsequent - * permissions update to allow subscription. - * - * @param allParticipantsAllowed Allows all participants to subscribe all tracks. - * Takes precedence over [[participantTrackPermissions]] if set to true. - * By default this is set to true. - * @param participantTrackPermissions Full list of individual permissions per - * participant/track. Any omitted participants will not receive any permissions. - */ - setTrackSubscriptionPermissions(allParticipantsAllowed) { - let participantTrackPermissions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; - this.participantTrackPermissions = participantTrackPermissions; - this.allParticipantsAllowedToSubscribe = allParticipantsAllowed; - if (this.engine.client.isConnected) { - this.updateTrackSubscriptionPermissions(); - } - } - /** @internal */ - updateInfo(info) { - if (info.sid !== this.sid) { - // drop updates that specify a wrong sid. - // the sid for local participant is only explicitly set on join and full reconnect - return false; - } - if (!super.updateInfo(info)) { - return false; - } - // reconcile track mute status. - // if server's track mute status doesn't match actual, we'll have to update - // the server's copy - info.tracks.forEach(ti => { - var _a, _b; - const pub = this.tracks.get(ti.sid); - if (pub) { - const mutedOnServer = pub.isMuted || ((_b = (_a = pub.track) === null || _a === void 0 ? void 0 : _a.isUpstreamPaused) !== null && _b !== void 0 ? _b : false); - if (mutedOnServer !== ti.muted) { - livekitLogger.debug('updating server mute state after reconcile', { - sid: ti.sid, - muted: mutedOnServer - }); - this.engine.client.sendMuteTrack(ti.sid, mutedOnServer); - } - } - }); - return true; - } - getPublicationForTrack(track) { - let publication; - this.tracks.forEach(pub => { - const localTrack = pub.track; - if (!localTrack) { - return; - } - // this looks overly complicated due to this object tree - if (track instanceof MediaStreamTrack) { - if (localTrack instanceof LocalAudioTrack || localTrack instanceof LocalVideoTrack) { - if (localTrack.mediaStreamTrack === track) { - publication = pub; - } - } - } else if (track === localTrack) { - publication = pub; - } - }); - return publication; - } - /** @internal */ - publishedTracksInfo() { - const infos = []; - this.tracks.forEach(track => { - if (track.track !== undefined) { - infos.push({ - cid: track.track.mediaStreamID, - track: track.trackInfo - }); - } - }); - return infos; - } - /** @internal */ - dataChannelsInfo() { - const infos = []; - const getInfo = (dc, target) => { - if ((dc === null || dc === void 0 ? void 0 : dc.id) !== undefined && dc.id !== null) { - infos.push({ - label: dc.label, - id: dc.id, - target - }); - } - }; - getInfo(this.engine.dataChannelForKind(DataPacket_Kind.LOSSY), SignalTarget.PUBLISHER); - getInfo(this.engine.dataChannelForKind(DataPacket_Kind.RELIABLE), SignalTarget.PUBLISHER); - getInfo(this.engine.dataChannelForKind(DataPacket_Kind.LOSSY, true), SignalTarget.SUBSCRIBER); - getInfo(this.engine.dataChannelForKind(DataPacket_Kind.RELIABLE, true), SignalTarget.SUBSCRIBER); - return infos; - } -} - -var ConnectionState; -(function (ConnectionState) { - ConnectionState["Disconnected"] = "disconnected"; - ConnectionState["Connecting"] = "connecting"; - ConnectionState["Connected"] = "connected"; - ConnectionState["Reconnecting"] = "reconnecting"; -})(ConnectionState || (ConnectionState = {})); -const connectionReconcileFrequency = 2 * 1000; -/** @deprecated RoomState has been renamed to [[ConnectionState]] */ -const RoomState = ConnectionState; -/** - * In LiveKit, a room is the logical grouping for a list of participants. - * Participants in a room can publish tracks, and subscribe to others' tracks. - * - * a Room fires [[RoomEvent | RoomEvents]]. - * - * @noInheritDoc - */ -class Room extends eventsExports.EventEmitter { - /** - * Creates a new Room, the primary construct for a LiveKit session. - * @param options - */ - constructor(options) { - var _this; - super(); - _this = this; - this.state = ConnectionState.Disconnected; - /** - * list of participants that are actively speaking. when this changes - * a [[RoomEvent.ActiveSpeakersChanged]] event is fired - */ - this.activeSpeakers = []; - this.audioEnabled = true; - this.connect = (url, token, opts) => __awaiter(this, void 0, void 0, function* () { - // In case a disconnect called happened right before the connect call, make sure the disconnect is completed first by awaiting its lock - const unlockDisconnect = yield this.disconnectLock.lock(); - if (this.state === ConnectionState.Connected) { - // when the state is reconnecting or connected, this function returns immediately - livekitLogger.info("already connected to room ".concat(this.name)); - unlockDisconnect(); - return Promise.resolve(); - } - if (this.connectFuture) { - unlockDisconnect(); - return this.connectFuture.promise; - } - this.setAndEmitConnectionState(ConnectionState.Connecting); - const urlProvider = new RegionUrlProvider(url, token); - const connectFn = (resolve, reject, regionUrl) => __awaiter(this, void 0, void 0, function* () { - var _a; - if (this.abortController) { - this.abortController.abort(); - } - this.abortController = new AbortController(); - // at this point the intention to connect has been signalled so we can allow cancelling of the connection via disconnect() again - unlockDisconnect === null || unlockDisconnect === void 0 ? void 0 : unlockDisconnect(); - try { - yield this.attemptConnection(regionUrl !== null && regionUrl !== void 0 ? regionUrl : url, token, opts, this.abortController); - this.abortController = undefined; - resolve(); - } catch (e) { - if (isCloud(new URL(url)) && e instanceof ConnectionError && e.reason !== 3 /* ConnectionErrorReason.Cancelled */) { - let nextUrl = null; - try { - nextUrl = yield urlProvider.getNextBestRegionUrl((_a = this.abortController) === null || _a === void 0 ? void 0 : _a.signal); - } catch (error) { - if (error instanceof ConnectionError && (error.status === 401 || error.reason === 3 /* ConnectionErrorReason.Cancelled */)) { - reject(error); - return; - } - } - if (nextUrl) { - livekitLogger.debug('initial connection failed, retrying with another region'); - yield connectFn(resolve, reject, nextUrl); - } else { - reject(e); - } - } else { - reject(e); - } - } - }); - this.connectFuture = new Future(connectFn, () => { - this.clearConnectionFutures(); - }); - return this.connectFuture.promise; - }); - this.connectSignal = (url, token, engine, connectOptions, roomOptions, abortController) => __awaiter(this, void 0, void 0, function* () { - const joinResponse = yield engine.join(url, token, { - autoSubscribe: connectOptions.autoSubscribe, - publishOnly: connectOptions.publishOnly, - adaptiveStream: typeof roomOptions.adaptiveStream === 'object' ? true : roomOptions.adaptiveStream, - maxRetries: connectOptions.maxRetries - }, abortController.signal); - let serverInfo = joinResponse.serverInfo; - if (!serverInfo) { - serverInfo = { - version: joinResponse.serverVersion, - region: joinResponse.serverRegion - }; - } - livekitLogger.debug("connected to Livekit Server ".concat(Object.entries(serverInfo).map(_ref => { - let [key, value] = _ref; - return "".concat(key, ": ").concat(value); - }).join(', '))); - if (!joinResponse.serverVersion) { - throw new UnsupportedServer('unknown server version'); - } - if (joinResponse.serverVersion === '0.15.1' && this.options.dynacast) { - livekitLogger.debug('disabling dynacast due to server version'); - // dynacast has a bug in 0.15.1, so we cannot use it then - roomOptions.dynacast = false; - } - return joinResponse; - }); - this.applyJoinResponse = joinResponse => { - const pi = joinResponse.participant; - this.localParticipant.sid = pi.sid; - this.localParticipant.identity = pi.identity; - // populate remote participants, these should not trigger new events - this.handleParticipantUpdates([pi, ...joinResponse.otherParticipants]); - if (joinResponse.room) { - this.handleRoomUpdate(joinResponse.room); - } - }; - this.attemptConnection = (url, token, opts, abortController) => __awaiter(this, void 0, void 0, function* () { - var _b; - if (this.state === ConnectionState.Reconnecting) { - livekitLogger.info('Reconnection attempt replaced by new connection attempt'); - // make sure we close and recreate the existing engine in order to get rid of any potentially ongoing reconnection attempts - this.recreateEngine(); - } else { - // create engine if previously disconnected - this.maybeCreateEngine(); - } - this.acquireAudioContext(); - this.connOptions = Object.assign(Object.assign({}, roomConnectOptionDefaults), opts); - if (this.connOptions.rtcConfig) { - this.engine.rtcConfig = this.connOptions.rtcConfig; - } - if (this.connOptions.peerConnectionTimeout) { - this.engine.peerConnectionTimeout = this.connOptions.peerConnectionTimeout; - } - try { - const joinResponse = yield this.connectSignal(url, token, this.engine, this.connOptions, this.options, abortController); - this.applyJoinResponse(joinResponse); - // forward metadata changed for the local participant - this.setupLocalParticipantEvents(); - this.emit(RoomEvent.SignalConnected); - } catch (err) { - this.recreateEngine(); - this.handleDisconnect(this.options.stopLocalTrackOnUnpublish); - const resultingError = new ConnectionError("could not establish signal connection"); - if (err instanceof Error) { - resultingError.message = "".concat(resultingError.message, ": ").concat(err.message); - } - if (err instanceof ConnectionError) { - resultingError.reason = err.reason; - resultingError.status = err.status; - } - livekitLogger.debug("error trying to establish signal connection", { - error: err - }); - throw resultingError; - } - if (abortController.signal.aborted) { - this.recreateEngine(); - this.handleDisconnect(this.options.stopLocalTrackOnUnpublish); - throw new ConnectionError("Connection attempt aborted"); - } - try { - yield this.engine.waitForPCInitialConnection(this.connOptions.peerConnectionTimeout, abortController); - } catch (e) { - this.recreateEngine(); - this.handleDisconnect(this.options.stopLocalTrackOnUnpublish); - throw e; - } - // also hook unload event - if (isWeb() && this.options.disconnectOnPageLeave) { - // capturing both 'pagehide' and 'beforeunload' to capture broadest set of browser behaviors - window.addEventListener('pagehide', this.onPageLeave); - window.addEventListener('beforeunload', this.onPageLeave); - (_b = navigator.mediaDevices) === null || _b === void 0 ? void 0 : _b.addEventListener('devicechange', this.handleDeviceChange); - } - this.setAndEmitConnectionState(ConnectionState.Connected); - this.emit(RoomEvent.Connected); - this.registerConnectionReconcile(); - }); - /** - * disconnects the room, emits [[RoomEvent.Disconnected]] - */ - this.disconnect = function () { - let stopTracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; - return __awaiter(_this, void 0, void 0, function* () { - var _c, _d, _e, _f; - const unlock = yield this.disconnectLock.lock(); - try { - if (this.state === ConnectionState.Disconnected) { - livekitLogger.debug('already disconnected'); - return; - } - livekitLogger.info('disconnect from room', { - identity: this.localParticipant.identity - }); - if (this.state === ConnectionState.Connecting || this.state === ConnectionState.Reconnecting) { - // try aborting pending connection attempt - livekitLogger.warn('abort connection attempt'); - (_c = this.abortController) === null || _c === void 0 ? void 0 : _c.abort(); - // in case the abort controller didn't manage to cancel the connection attempt, reject the connect promise explicitly - (_e = (_d = this.connectFuture) === null || _d === void 0 ? void 0 : _d.reject) === null || _e === void 0 ? void 0 : _e.call(_d, new ConnectionError('Client initiated disconnect')); - this.connectFuture = undefined; - } - // send leave - if ((_f = this.engine) === null || _f === void 0 ? void 0 : _f.client.isConnected) { - yield this.engine.client.sendLeave(); - } - // close engine (also closes client) - if (this.engine) { - yield this.engine.close(); - } - this.handleDisconnect(stopTracks, DisconnectReason.CLIENT_INITIATED); - /* @ts-ignore */ - this.engine = undefined; - } finally { - unlock(); - } - }); - }; - this.onPageLeave = () => __awaiter(this, void 0, void 0, function* () { - yield this.disconnect(); - }); - this.handleRestarting = () => { - this.clearConnectionReconcile(); - // also unwind existing participants & existing subscriptions - for (const p of this.participants.values()) { - this.handleParticipantDisconnected(p.sid, p); - } - if (this.setAndEmitConnectionState(ConnectionState.Reconnecting)) { - this.emit(RoomEvent.Reconnecting); - } - }; - this.handleSignalRestarted = joinResponse => __awaiter(this, void 0, void 0, function* () { - livekitLogger.debug("signal reconnected to server", { - region: joinResponse.serverRegion - }); - this.cachedParticipantSids = []; - this.applyJoinResponse(joinResponse); - try { - // unpublish & republish tracks - const localPubs = []; - this.localParticipant.tracks.forEach(pub => { - if (pub.track) { - localPubs.push(pub); - } - }); - yield Promise.all(localPubs.map(pub => __awaiter(this, void 0, void 0, function* () { - const track = pub.track; - this.localParticipant.unpublishTrack(track, false); - if (!track.isMuted) { - if ((track instanceof LocalAudioTrack || track instanceof LocalVideoTrack) && !track.isUserProvided) { - // we need to restart the track before publishing, often a full reconnect - // is necessary because computer had gone to sleep. - livekitLogger.debug('restarting existing track', { - track: pub.trackSid - }); - yield track.restartTrack(); - } - livekitLogger.debug('publishing new track', { - track: pub.trackSid - }); - yield this.localParticipant.publishTrack(track, pub.options); - } - }))); - } catch (error) { - livekitLogger.error('error trying to re-publish tracks after reconnection', { - error - }); - } - try { - yield this.engine.waitForRestarted(); - livekitLogger.debug("fully reconnected to server", { - region: joinResponse.serverRegion - }); - } catch (_g) { - // reconnection failed, handleDisconnect is being invoked already, just return here - return; - } - this.setAndEmitConnectionState(ConnectionState.Connected); - this.emit(RoomEvent.Reconnected); - this.registerConnectionReconcile(); - // emit participant connected events after connection has been re-established - this.participants.forEach(participant => { - this.emit(RoomEvent.ParticipantConnected, participant); - }); - }); - this.handleParticipantUpdates = participantInfos => { - // handle changes to participant state, and send events - participantInfos.forEach(info => { - if (info.identity === this.localParticipant.identity) { - this.localParticipant.updateInfo(info); - return; - } - // ensure identity <=> sid mapping - const sid = this.identityToSid.get(info.identity); - if (sid && sid !== info.sid) { - // sid had changed, need to remove previous participant - this.handleParticipantDisconnected(sid, this.participants.get(sid)); - } - let remoteParticipant = this.participants.get(info.sid); - const isNewParticipant = !remoteParticipant; - // when it's disconnected, send updates - if (info.state === ParticipantInfo_State.DISCONNECTED) { - this.handleParticipantDisconnected(info.sid, remoteParticipant); - } else { - // create participant if doesn't exist - remoteParticipant = this.getOrCreateParticipant(info.sid, info); - if (!isNewParticipant) { - // just update, no events - remoteParticipant.updateInfo(info); - } - } - }); - }; - // updates are sent only when there's a change to speaker ordering - this.handleActiveSpeakersUpdate = speakers => { - const activeSpeakers = []; - const seenSids = {}; - speakers.forEach(speaker => { - seenSids[speaker.sid] = true; - if (speaker.sid === this.localParticipant.sid) { - this.localParticipant.audioLevel = speaker.level; - this.localParticipant.setIsSpeaking(true); - activeSpeakers.push(this.localParticipant); - } else { - const p = this.participants.get(speaker.sid); - if (p) { - p.audioLevel = speaker.level; - p.setIsSpeaking(true); - activeSpeakers.push(p); - } - } - }); - if (!seenSids[this.localParticipant.sid]) { - this.localParticipant.audioLevel = 0; - this.localParticipant.setIsSpeaking(false); - } - this.participants.forEach(p => { - if (!seenSids[p.sid]) { - p.audioLevel = 0; - p.setIsSpeaking(false); - } - }); - this.activeSpeakers = activeSpeakers; - this.emitWhenConnected(RoomEvent.ActiveSpeakersChanged, activeSpeakers); - }; - // process list of changed speakers - this.handleSpeakersChanged = speakerUpdates => { - const lastSpeakers = new Map(); - this.activeSpeakers.forEach(p => { - lastSpeakers.set(p.sid, p); - }); - speakerUpdates.forEach(speaker => { - let p = this.participants.get(speaker.sid); - if (speaker.sid === this.localParticipant.sid) { - p = this.localParticipant; - } - if (!p) { - return; - } - p.audioLevel = speaker.level; - p.setIsSpeaking(speaker.active); - if (speaker.active) { - lastSpeakers.set(speaker.sid, p); - } else { - lastSpeakers.delete(speaker.sid); - } - }); - const activeSpeakers = Array.from(lastSpeakers.values()); - activeSpeakers.sort((a, b) => b.audioLevel - a.audioLevel); - this.activeSpeakers = activeSpeakers; - this.emitWhenConnected(RoomEvent.ActiveSpeakersChanged, activeSpeakers); - }; - this.handleStreamStateUpdate = streamStateUpdate => { - streamStateUpdate.streamStates.forEach(streamState => { - const participant = this.participants.get(streamState.participantSid); - if (!participant) { - return; - } - const pub = participant.getTrackPublication(streamState.trackSid); - if (!pub || !pub.track) { - return; - } - pub.track.streamState = Track.streamStateFromProto(streamState.state); - participant.emit(ParticipantEvent.TrackStreamStateChanged, pub, pub.track.streamState); - this.emitWhenConnected(RoomEvent.TrackStreamStateChanged, pub, pub.track.streamState, participant); - }); - }; - this.handleSubscriptionPermissionUpdate = update => { - const participant = this.participants.get(update.participantSid); - if (!participant) { - return; - } - const pub = participant.getTrackPublication(update.trackSid); - if (!pub) { - return; - } - pub.setAllowed(update.allowed); - }; - this.handleSubscriptionError = update => { - const participant = Array.from(this.participants.values()).find(p => p.tracks.has(update.trackSid)); - if (!participant) { - return; - } - const pub = participant.getTrackPublication(update.trackSid); - if (!pub) { - return; - } - pub.setSubscriptionError(update.err); - }; - this.handleDataPacket = (userPacket, kind) => { - // find the participant - const participant = this.participants.get(userPacket.participantSid); - this.emit(RoomEvent.DataReceived, userPacket.payload, participant, kind, userPacket.topic); - // also emit on the participant - participant === null || participant === void 0 ? void 0 : participant.emit(ParticipantEvent.DataReceived, userPacket.payload, kind); - }; - this.handleAudioPlaybackStarted = () => { - if (this.canPlaybackAudio) { - return; - } - this.audioEnabled = true; - this.emit(RoomEvent.AudioPlaybackStatusChanged, true); - }; - this.handleAudioPlaybackFailed = e => { - livekitLogger.warn('could not playback audio', e); - if (!this.canPlaybackAudio) { - return; - } - this.audioEnabled = false; - this.emit(RoomEvent.AudioPlaybackStatusChanged, false); - }; - this.handleDeviceChange = () => __awaiter(this, void 0, void 0, function* () { - this.emit(RoomEvent.MediaDevicesChanged); - }); - this.handleRoomUpdate = room => { - const oldRoom = this.roomInfo; - this.roomInfo = room; - if (oldRoom && oldRoom.metadata !== room.metadata) { - this.emitWhenConnected(RoomEvent.RoomMetadataChanged, room.metadata); - } - if ((oldRoom === null || oldRoom === void 0 ? void 0 : oldRoom.activeRecording) !== room.activeRecording) { - this.emitWhenConnected(RoomEvent.RecordingStatusChanged, room.activeRecording); - } - }; - this.handleConnectionQualityUpdate = update => { - update.updates.forEach(info => { - if (info.participantSid === this.localParticipant.sid) { - this.localParticipant.setConnectionQuality(info.quality); - return; - } - const participant = this.participants.get(info.participantSid); - if (participant) { - participant.setConnectionQuality(info.quality); - } - }); - }; - this.onLocalParticipantMetadataChanged = metadata => { - this.emit(RoomEvent.ParticipantMetadataChanged, metadata, this.localParticipant); - }; - this.onLocalParticipantNameChanged = name => { - this.emit(RoomEvent.ParticipantNameChanged, name, this.localParticipant); - }; - this.onLocalTrackMuted = pub => { - this.emit(RoomEvent.TrackMuted, pub, this.localParticipant); - }; - this.onLocalTrackUnmuted = pub => { - this.emit(RoomEvent.TrackUnmuted, pub, this.localParticipant); - }; - this.onLocalTrackPublished = pub => __awaiter(this, void 0, void 0, function* () { - this.emit(RoomEvent.LocalTrackPublished, pub, this.localParticipant); - if (pub.track instanceof LocalAudioTrack) { - const trackIsSilent = yield pub.track.checkForSilence(); - if (trackIsSilent) { - this.emit(RoomEvent.LocalAudioSilenceDetected, pub); - } - } - }); - this.onLocalTrackUnpublished = pub => { - this.emit(RoomEvent.LocalTrackUnpublished, pub, this.localParticipant); - }; - this.onLocalConnectionQualityChanged = quality => { - this.emit(RoomEvent.ConnectionQualityChanged, quality, this.localParticipant); - }; - this.onMediaDevicesError = e => { - this.emit(RoomEvent.MediaDevicesError, e); - }; - this.onLocalParticipantPermissionsChanged = prevPermissions => { - this.emit(RoomEvent.ParticipantPermissionsChanged, prevPermissions, this.localParticipant); - }; - this.setMaxListeners(100); - this.participants = new Map(); - this.cachedParticipantSids = []; - this.identityToSid = new Map(); - this.options = Object.assign(Object.assign({}, roomOptionDefaults), options); - this.options.audioCaptureDefaults = Object.assign(Object.assign({}, audioDefaults), options === null || options === void 0 ? void 0 : options.audioCaptureDefaults); - this.options.videoCaptureDefaults = Object.assign(Object.assign({}, videoDefaults), options === null || options === void 0 ? void 0 : options.videoCaptureDefaults); - this.options.publishDefaults = Object.assign(Object.assign({}, publishDefaults), options === null || options === void 0 ? void 0 : options.publishDefaults); - this.maybeCreateEngine(); - this.disconnectLock = new Mutex(); - this.localParticipant = new LocalParticipant('', '', this.engine, this.options); - } - /** - * if the current room has a participant with `recorder: true` in its JWT grant - **/ - get isRecording() { - var _a, _b; - return (_b = (_a = this.roomInfo) === null || _a === void 0 ? void 0 : _a.activeRecording) !== null && _b !== void 0 ? _b : false; - } - /** server assigned unique room id */ - get sid() { - var _a, _b; - return (_b = (_a = this.roomInfo) === null || _a === void 0 ? void 0 : _a.sid) !== null && _b !== void 0 ? _b : ''; - } - /** user assigned name, derived from JWT token */ - get name() { - var _a, _b; - return (_b = (_a = this.roomInfo) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : ''; - } - /** room metadata */ - get metadata() { - var _a; - return (_a = this.roomInfo) === null || _a === void 0 ? void 0 : _a.metadata; - } - get numParticipants() { - var _a, _b; - return (_b = (_a = this.roomInfo) === null || _a === void 0 ? void 0 : _a.numParticipants) !== null && _b !== void 0 ? _b : 0; - } - get numPublishers() { - var _a, _b; - return (_b = (_a = this.roomInfo) === null || _a === void 0 ? void 0 : _a.numPublishers) !== null && _b !== void 0 ? _b : 0; - } - maybeCreateEngine() { - if (this.engine && !this.engine.isClosed) { - return; - } - this.engine = new RTCEngine(this.options); - this.engine.client.onParticipantUpdate = this.handleParticipantUpdates; - this.engine.client.onRoomUpdate = this.handleRoomUpdate; - this.engine.client.onSpeakersChanged = this.handleSpeakersChanged; - this.engine.client.onStreamStateUpdate = this.handleStreamStateUpdate; - this.engine.client.onSubscriptionPermissionUpdate = this.handleSubscriptionPermissionUpdate; - this.engine.client.onConnectionQuality = this.handleConnectionQualityUpdate; - this.engine.client.onSubscriptionError = this.handleSubscriptionError; - this.engine.on(EngineEvent.MediaTrackAdded, (mediaTrack, stream, receiver) => { - this.onTrackAdded(mediaTrack, stream, receiver); - }).on(EngineEvent.Disconnected, reason => { - this.handleDisconnect(this.options.stopLocalTrackOnUnpublish, reason); - }).on(EngineEvent.ActiveSpeakersUpdate, this.handleActiveSpeakersUpdate).on(EngineEvent.DataPacketReceived, this.handleDataPacket).on(EngineEvent.Resuming, () => { - this.clearConnectionReconcile(); - if (this.setAndEmitConnectionState(ConnectionState.Reconnecting)) { - this.emit(RoomEvent.Reconnecting); - } - this.cachedParticipantSids = Array.from(this.participants.keys()); - }).on(EngineEvent.Resumed, () => { - this.setAndEmitConnectionState(ConnectionState.Connected); - this.emit(RoomEvent.Reconnected); - this.registerConnectionReconcile(); - this.updateSubscriptions(); - // once reconnected, figure out if any participants connected during reconnect and emit events for it - const diffParticipants = Array.from(this.participants.values()).filter(p => !this.cachedParticipantSids.includes(p.sid)); - diffParticipants.forEach(p => this.emit(RoomEvent.ParticipantConnected, p)); - this.cachedParticipantSids = []; - }).on(EngineEvent.SignalResumed, () => { - if (this.state === ConnectionState.Reconnecting) { - this.sendSyncState(); - } - }).on(EngineEvent.Restarting, this.handleRestarting).on(EngineEvent.SignalRestarted, this.handleSignalRestarted).on(EngineEvent.DCBufferStatusChanged, (status, kind) => { - this.emit(RoomEvent.DCBufferStatusChanged, status, kind); - }); - if (this.localParticipant) { - this.localParticipant.setupEngine(this.engine); - } - } - /** - * getLocalDevices abstracts navigator.mediaDevices.enumerateDevices. - * In particular, it handles Chrome's unique behavior of creating `default` - * devices. When encountered, it'll be removed from the list of devices. - * The actual default device will be placed at top. - * @param kind - * @returns a list of available local devices - */ - static getLocalDevices(kind) { - let requestPermissions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - return DeviceManager.getInstance().getDevices(kind, requestPermissions); - } - /** - * prepares the connection to the livekit server by sending a HEAD request in order to - * 1. speed up DNS resolution - * 2. speed up TLS setup - * on the actual connection request - * throws an error if server is not reachable after the request timeout - * @experimental - */ - prepareConnection(url) { - return __awaiter(this, void 0, void 0, function* () { - yield fetch("http".concat(url.substring(2)), { - method: 'HEAD' - }); - }); - } - /** - * retrieves a participant by identity - * @param identity - * @returns - */ - getParticipantByIdentity(identity) { - if (this.localParticipant.identity === identity) { - return this.localParticipant; - } - const sid = this.identityToSid.get(identity); - if (sid) { - return this.participants.get(sid); - } - } - clearConnectionFutures() { - this.connectFuture = undefined; - } - /** - * @internal for testing - */ - simulateScenario(scenario) { - return __awaiter(this, void 0, void 0, function* () { - let postAction = () => {}; - let req; - switch (scenario) { - case 'signal-reconnect': - yield this.engine.client.close(); - if (this.engine.client.onClose) { - this.engine.client.onClose('simulate disconnect'); - } - break; - case 'speaker': - req = SimulateScenario.fromPartial({ - scenario: { - $case: 'speakerUpdate', - speakerUpdate: 3 - } - }); - break; - case 'node-failure': - req = SimulateScenario.fromPartial({ - scenario: { - $case: 'nodeFailure', - nodeFailure: true - } - }); - break; - case 'server-leave': - req = SimulateScenario.fromPartial({ - scenario: { - $case: 'serverLeave', - serverLeave: true - } - }); - break; - case 'migration': - req = SimulateScenario.fromPartial({ - scenario: { - $case: 'migration', - migration: true - } - }); - break; - case 'resume-reconnect': - this.engine.failNext(); - yield this.engine.client.close(); - if (this.engine.client.onClose) { - this.engine.client.onClose('simulate resume-reconnect'); - } - break; - case 'full-reconnect': - this.engine.fullReconnectOnNext = true; - yield this.engine.client.close(); - if (this.engine.client.onClose) { - this.engine.client.onClose('simulate full-reconnect'); - } - break; - case 'force-tcp': - case 'force-tls': - req = SimulateScenario.fromPartial({ - scenario: { - $case: 'switchCandidateProtocol', - switchCandidateProtocol: scenario === 'force-tls' ? 2 : 1 - } - }); - postAction = () => __awaiter(this, void 0, void 0, function* () { - const onLeave = this.engine.client.onLeave; - if (onLeave) { - onLeave({ - reason: DisconnectReason.CLIENT_INITIATED, - canReconnect: true - }); - } - }); - break; - } - if (req) { - this.engine.client.sendSimulateScenario(req); - postAction(); - } - }); - } - /** - * Browsers have different policies regarding audio playback. Most requiring - * some form of user interaction (click/tap/etc). - * In those cases, audio will be silent until a click/tap triggering one of the following - * - `startAudio` - * - `getUserMedia` - */ - startAudio() { - return __awaiter(this, void 0, void 0, function* () { - yield this.acquireAudioContext(); - const elements = []; - this.participants.forEach(p => { - p.audioTracks.forEach(t => { - if (t.track) { - t.track.attachedElements.forEach(e => { - elements.push(e); - }); - } - }); - }); - try { - yield Promise.all(elements.map(e => { - e.muted = false; - return e.play(); - })); - this.handleAudioPlaybackStarted(); - } catch (err) { - this.handleAudioPlaybackFailed(err); - throw err; - } - }); - } - /** - * Returns true if audio playback is enabled - */ - get canPlaybackAudio() { - return this.audioEnabled; - } - /** - * Returns the active audio output device used in this room. - * - * Note: to get the active `audioinput` or `videoinput` use [[LocalTrack.getDeviceId()]] - * - * @return the previously successfully set audio output device ID or an empty string if the default device is used. - */ - getActiveAudioOutputDevice() { - var _a, _b; - return (_b = (_a = this.options.audioOutput) === null || _a === void 0 ? void 0 : _a.deviceId) !== null && _b !== void 0 ? _b : ''; - } - /** - * Switches all active devices used in this room to the given device. - * - * Note: setting AudioOutput is not supported on some browsers. See [setSinkId](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/setSinkId#browser_compatibility) - * - * @param kind use `videoinput` for camera track, - * `audioinput` for microphone track, - * `audiooutput` to set speaker for all incoming audio tracks - * @param deviceId - */ - switchActiveDevice(kind, deviceId) { - let exact = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - var _a; - var _b; - return __awaiter(this, void 0, void 0, function* () { - const deviceConstraint = exact ? { - exact: deviceId - } : deviceId; - if (kind === 'audioinput') { - const prevDeviceId = this.options.audioCaptureDefaults.deviceId; - this.options.audioCaptureDefaults.deviceId = deviceConstraint; - const tracks = Array.from(this.localParticipant.audioTracks.values()).filter(track => track.source === Track.Source.Microphone); - try { - yield Promise.all(tracks.map(t => { - var _a; - return (_a = t.audioTrack) === null || _a === void 0 ? void 0 : _a.setDeviceId(deviceConstraint); - })); - } catch (e) { - this.options.audioCaptureDefaults.deviceId = prevDeviceId; - throw e; - } - } else if (kind === 'videoinput') { - const prevDeviceId = this.options.videoCaptureDefaults.deviceId; - this.options.videoCaptureDefaults.deviceId = deviceConstraint; - const tracks = Array.from(this.localParticipant.videoTracks.values()).filter(track => track.source === Track.Source.Camera); - try { - yield Promise.all(tracks.map(t => { - var _a; - return (_a = t.videoTrack) === null || _a === void 0 ? void 0 : _a.setDeviceId(deviceConstraint); - })); - } catch (e) { - this.options.videoCaptureDefaults.deviceId = prevDeviceId; - throw e; - } - } else if (kind === 'audiooutput') { - // TODO add support for webaudio mix once the API becomes available https://github.com/WebAudio/web-audio-api/pull/2498 - if (!supportsSetSinkId()) { - throw new Error('cannot switch audio output, setSinkId not supported'); - } - (_a = (_b = this.options).audioOutput) !== null && _a !== void 0 ? _a : _b.audioOutput = {}; - const prevDeviceId = this.options.audioOutput.deviceId; - this.options.audioOutput.deviceId = deviceId; - try { - yield Promise.all(Array.from(this.participants.values()).map(p => p.setAudioOutput({ - deviceId - }))); - } catch (e) { - this.options.audioOutput.deviceId = prevDeviceId; - throw e; - } - } - }); - } - setupLocalParticipantEvents() { - this.localParticipant.on(ParticipantEvent.ParticipantMetadataChanged, this.onLocalParticipantMetadataChanged).on(ParticipantEvent.ParticipantNameChanged, this.onLocalParticipantNameChanged).on(ParticipantEvent.TrackMuted, this.onLocalTrackMuted).on(ParticipantEvent.TrackUnmuted, this.onLocalTrackUnmuted).on(ParticipantEvent.LocalTrackPublished, this.onLocalTrackPublished).on(ParticipantEvent.LocalTrackUnpublished, this.onLocalTrackUnpublished).on(ParticipantEvent.ConnectionQualityChanged, this.onLocalConnectionQualityChanged).on(ParticipantEvent.MediaDevicesError, this.onMediaDevicesError).on(ParticipantEvent.ParticipantPermissionsChanged, this.onLocalParticipantPermissionsChanged); - } - recreateEngine() { - var _a; - (_a = this.engine) === null || _a === void 0 ? void 0 : _a.close(); - /* @ts-ignore */ - this.engine = undefined; - // clear out existing remote participants, since they may have attached - // the old engine - this.participants.clear(); - this.maybeCreateEngine(); - } - onTrackAdded(mediaTrack, stream, receiver) { - // don't fire onSubscribed when connecting - // WebRTC fires onTrack as soon as setRemoteDescription is called on the offer - // at that time, ICE connectivity has not been established so the track is not - // technically subscribed. - // We'll defer these events until when the room is connected or eventually disconnected. - if (this.state === ConnectionState.Connecting || this.state === ConnectionState.Reconnecting) { - const reconnectedHandler = () => { - this.onTrackAdded(mediaTrack, stream, receiver); - cleanup(); - }; - const cleanup = () => { - this.off(RoomEvent.Reconnected, reconnectedHandler); - this.off(RoomEvent.Connected, reconnectedHandler); - this.off(RoomEvent.Disconnected, cleanup); - }; - this.once(RoomEvent.Reconnected, reconnectedHandler); - this.once(RoomEvent.Connected, reconnectedHandler); - this.once(RoomEvent.Disconnected, cleanup); - return; - } - if (this.state === ConnectionState.Disconnected) { - livekitLogger.warn('skipping incoming track after Room disconnected'); - return; - } - const parts = unpackStreamId(stream.id); - const participantId = parts[0]; - let trackId = parts[1]; - if (!trackId || trackId === '') trackId = mediaTrack.id; - if (participantId === this.localParticipant.sid) { - livekitLogger.warn('tried to create RemoteParticipant for local participant'); - return; - } - const participant = this.getOrCreateParticipant(participantId); - let adaptiveStreamSettings; - if (this.options.adaptiveStream) { - if (typeof this.options.adaptiveStream === 'object') { - adaptiveStreamSettings = this.options.adaptiveStream; - } else { - adaptiveStreamSettings = {}; - } - } - participant.addSubscribedMediaTrack(mediaTrack, trackId, stream, receiver, adaptiveStreamSettings); - } - handleDisconnect() { - let shouldStopTracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; - let reason = arguments.length > 1 ? arguments[1] : undefined; - var _a; - this.clearConnectionReconcile(); - if (this.state === ConnectionState.Disconnected) { - return; - } - try { - this.participants.forEach(p => { - p.tracks.forEach(pub => { - p.unpublishTrack(pub.trackSid); - }); - }); - this.localParticipant.tracks.forEach(pub => { - var _a, _b; - if (pub.track) { - this.localParticipant.unpublishTrack(pub.track, shouldStopTracks); - } - if (shouldStopTracks) { - (_a = pub.track) === null || _a === void 0 ? void 0 : _a.detach(); - (_b = pub.track) === null || _b === void 0 ? void 0 : _b.stop(); - } - }); - this.localParticipant.off(ParticipantEvent.ParticipantMetadataChanged, this.onLocalParticipantMetadataChanged).off(ParticipantEvent.ParticipantNameChanged, this.onLocalParticipantNameChanged).off(ParticipantEvent.TrackMuted, this.onLocalTrackMuted).off(ParticipantEvent.TrackUnmuted, this.onLocalTrackUnmuted).off(ParticipantEvent.LocalTrackPublished, this.onLocalTrackPublished).off(ParticipantEvent.LocalTrackUnpublished, this.onLocalTrackUnpublished).off(ParticipantEvent.ConnectionQualityChanged, this.onLocalConnectionQualityChanged).off(ParticipantEvent.MediaDevicesError, this.onMediaDevicesError).off(ParticipantEvent.ParticipantPermissionsChanged, this.onLocalParticipantPermissionsChanged); - this.localParticipant.tracks.clear(); - this.localParticipant.videoTracks.clear(); - this.localParticipant.audioTracks.clear(); - this.participants.clear(); - this.activeSpeakers = []; - if (this.audioContext && typeof this.options.expWebAudioMix === 'boolean') { - this.audioContext.close(); - this.audioContext = undefined; - } - if (isWeb()) { - window.removeEventListener('beforeunload', this.onPageLeave); - window.removeEventListener('pagehide', this.onPageLeave); - (_a = navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.removeEventListener('devicechange', this.handleDeviceChange); - } - } finally { - this.setAndEmitConnectionState(ConnectionState.Disconnected); - this.emit(RoomEvent.Disconnected, reason); - } - } - handleParticipantDisconnected(sid, participant) { - // remove and send event - this.participants.delete(sid); - if (!participant) { - return; - } - this.identityToSid.delete(participant.identity); - participant.tracks.forEach(publication => { - participant.unpublishTrack(publication.trackSid, true); - }); - this.emit(RoomEvent.ParticipantDisconnected, participant); - } - acquireAudioContext() { - var _a, _b; - return __awaiter(this, void 0, void 0, function* () { - if (typeof this.options.expWebAudioMix !== 'boolean' && this.options.expWebAudioMix.audioContext) { - // override audio context with custom audio context if supplied by user - this.audioContext = this.options.expWebAudioMix.audioContext; - yield this.audioContext.resume(); - } else { - // by using an AudioContext, it reduces lag on audio elements - // https://stackoverflow.com/questions/9811429/html5-audio-tag-on-safari-has-a-delay/54119854#54119854 - this.audioContext = (_a = getNewAudioContext()) !== null && _a !== void 0 ? _a : undefined; - } - if (this.options.expWebAudioMix) { - this.participants.forEach(participant => participant.setAudioContext(this.audioContext)); - } - const newContextIsRunning = ((_b = this.audioContext) === null || _b === void 0 ? void 0 : _b.state) === 'running'; - if (newContextIsRunning !== this.canPlaybackAudio) { - this.audioEnabled = newContextIsRunning; - this.emit(RoomEvent.AudioPlaybackStatusChanged, newContextIsRunning); - } - }); - } - createParticipant(id, info) { - let participant; - if (info) { - participant = RemoteParticipant.fromParticipantInfo(this.engine.client, info); - } else { - participant = new RemoteParticipant(this.engine.client, id, '', undefined, undefined); - } - if (this.options.expWebAudioMix) { - participant.setAudioContext(this.audioContext); - } - return participant; - } - getOrCreateParticipant(id, info) { - if (this.participants.has(id)) { - return this.participants.get(id); - } - // it's possible for the RTC track to arrive before signaling data - // when this happens, we'll create the participant and make the track work - const participant = this.createParticipant(id, info); - this.participants.set(id, participant); - if (info) { - this.identityToSid.set(info.identity, info.sid); - // if we have valid info and the participant wasn't in the map before, we can assume the participant is new - // firing here to make sure that `ParticipantConnected` fires before the initial track events - this.emitWhenConnected(RoomEvent.ParticipantConnected, participant); - } - // also forward events - // trackPublished is only fired for tracks added after both local participant - // and remote participant joined the room - participant.on(ParticipantEvent.TrackPublished, trackPublication => { - this.emitWhenConnected(RoomEvent.TrackPublished, trackPublication, participant); - }).on(ParticipantEvent.TrackSubscribed, (track, publication) => { - // monitor playback status - if (track.kind === Track.Kind.Audio) { - track.on(TrackEvent.AudioPlaybackStarted, this.handleAudioPlaybackStarted); - track.on(TrackEvent.AudioPlaybackFailed, this.handleAudioPlaybackFailed); - } - this.emit(RoomEvent.TrackSubscribed, track, publication, participant); - }).on(ParticipantEvent.TrackUnpublished, publication => { - this.emit(RoomEvent.TrackUnpublished, publication, participant); - }).on(ParticipantEvent.TrackUnsubscribed, (track, publication) => { - this.emit(RoomEvent.TrackUnsubscribed, track, publication, participant); - }).on(ParticipantEvent.TrackSubscriptionFailed, sid => { - this.emit(RoomEvent.TrackSubscriptionFailed, sid, participant); - }).on(ParticipantEvent.TrackMuted, pub => { - this.emitWhenConnected(RoomEvent.TrackMuted, pub, participant); - }).on(ParticipantEvent.TrackUnmuted, pub => { - this.emitWhenConnected(RoomEvent.TrackUnmuted, pub, participant); - }).on(ParticipantEvent.ParticipantMetadataChanged, metadata => { - this.emitWhenConnected(RoomEvent.ParticipantMetadataChanged, metadata, participant); - }).on(ParticipantEvent.ParticipantNameChanged, name => { - this.emitWhenConnected(RoomEvent.ParticipantNameChanged, name, participant); - }).on(ParticipantEvent.ConnectionQualityChanged, quality => { - this.emitWhenConnected(RoomEvent.ConnectionQualityChanged, quality, participant); - }).on(ParticipantEvent.ParticipantPermissionsChanged, prevPermissions => { - this.emitWhenConnected(RoomEvent.ParticipantPermissionsChanged, prevPermissions, participant); - }).on(ParticipantEvent.TrackSubscriptionStatusChanged, (pub, status) => { - this.emitWhenConnected(RoomEvent.TrackSubscriptionStatusChanged, pub, status, participant); - }).on(ParticipantEvent.TrackSubscriptionFailed, (trackSid, error) => { - this.emit(RoomEvent.TrackSubscriptionFailed, trackSid, participant, error); - }).on(ParticipantEvent.TrackSubscriptionPermissionChanged, (pub, status) => { - this.emitWhenConnected(RoomEvent.TrackSubscriptionPermissionChanged, pub, status, participant); - }); - // update info at the end after callbacks have been set up - if (info) { - participant.updateInfo(info); - } - return participant; - } - sendSyncState() { - var _a, _b; - if (this.engine.subscriber === undefined || this.engine.subscriber.pc.localDescription === null) { - return; - } - const previousAnswer = this.engine.subscriber.pc.localDescription; - const previousOffer = this.engine.subscriber.pc.remoteDescription; - /* 1. autosubscribe on, so subscribed tracks = all tracks - unsub tracks, - in this case, we send unsub tracks, so server add all tracks to this - subscribe pc and unsub special tracks from it. - 2. autosubscribe off, we send subscribed tracks. - */ - const autoSubscribe = (_b = (_a = this.connOptions) === null || _a === void 0 ? void 0 : _a.autoSubscribe) !== null && _b !== void 0 ? _b : true; - const trackSids = new Array(); - this.participants.forEach(participant => { - participant.tracks.forEach(track => { - if (track.isDesired !== autoSubscribe) { - trackSids.push(track.trackSid); - } - }); - }); - this.engine.client.sendSyncState({ - answer: toProtoSessionDescription({ - sdp: previousAnswer.sdp, - type: previousAnswer.type - }), - offer: previousOffer ? toProtoSessionDescription({ - sdp: previousOffer.sdp, - type: previousOffer.type - }) : undefined, - subscription: { - trackSids, - subscribe: !autoSubscribe, - participantTracks: [] - }, - publishTracks: this.localParticipant.publishedTracksInfo(), - dataChannels: this.localParticipant.dataChannelsInfo() - }); - } - /** - * After resuming, we'll need to notify the server of the current - * subscription settings. - */ - updateSubscriptions() { - for (const p of this.participants.values()) { - for (const pub of p.videoTracks.values()) { - if (pub.isSubscribed && pub instanceof RemoteTrackPublication) { - pub.emitTrackUpdate(); - } - } - } - } - registerConnectionReconcile() { - this.clearConnectionReconcile(); - let consecutiveFailures = 0; - this.connectionReconcileInterval = CriticalTimers.setInterval(() => { - if ( - // ensure we didn't tear it down - !this.engine || - // engine detected close, but Room missed it - this.engine.isClosed || - // transports failed without notifying engine - !this.engine.verifyTransport()) { - consecutiveFailures++; - livekitLogger.warn('detected connection state mismatch', { - numFailures: consecutiveFailures - }); - if (consecutiveFailures >= 3) { - this.recreateEngine(); - this.handleDisconnect(this.options.stopLocalTrackOnUnpublish, DisconnectReason.STATE_MISMATCH); - } - } else { - consecutiveFailures = 0; - } - }, connectionReconcileFrequency); - } - clearConnectionReconcile() { - if (this.connectionReconcileInterval) { - CriticalTimers.clearInterval(this.connectionReconcileInterval); - } - } - setAndEmitConnectionState(state) { - if (state === this.state) { - // unchanged - return false; - } - this.state = state; - this.emit(RoomEvent.ConnectionStateChanged, this.state); - return true; - } - emitWhenConnected(event) { - if (this.state === ConnectionState.Connected) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - return this.emit(event, ...args); - } - return false; - } - /** - * Allows to populate a room with simulated participants. - * No actual connection to a server will be established, all state is - * @experimental - */ - simulateParticipants(options) { - var _a, _b; - return __awaiter(this, void 0, void 0, function* () { - const publishOptions = Object.assign({ - audio: true, - video: true, - useRealTracks: false - }, options.publish); - const participantOptions = Object.assign({ - count: 9, - audio: false, - video: true, - aspectRatios: [1.66, 1.7, 1.3] - }, options.participants); - this.handleDisconnect(); - this.roomInfo = { - sid: 'RM_SIMULATED', - name: 'simulated-room', - emptyTimeout: 0, - maxParticipants: 0, - creationTime: new Date().getTime(), - metadata: '', - numParticipants: 1, - numPublishers: 1, - turnPassword: '', - enabledCodecs: [], - activeRecording: false - }; - this.localParticipant.updateInfo(ParticipantInfo.fromPartial({ - identity: 'simulated-local', - name: 'local-name' - })); - this.setupLocalParticipantEvents(); - this.emit(RoomEvent.SignalConnected); - this.emit(RoomEvent.Connected); - this.setAndEmitConnectionState(ConnectionState.Connected); - if (publishOptions.video) { - const camPub = new LocalTrackPublication(Track.Kind.Video, TrackInfo.fromPartial({ - source: TrackSource.CAMERA, - sid: Math.floor(Math.random() * 10000).toString(), - type: TrackType.AUDIO, - name: 'video-dummy' - }), new LocalVideoTrack(publishOptions.useRealTracks ? (yield navigator.mediaDevices.getUserMedia({ - video: true - })).getVideoTracks()[0] : createDummyVideoStreamTrack((_a = 160 * participantOptions.aspectRatios[0]) !== null && _a !== void 0 ? _a : 1, 160, true, true))); - // @ts-ignore - this.localParticipant.addTrackPublication(camPub); - this.localParticipant.emit(ParticipantEvent.LocalTrackPublished, camPub); - } - if (publishOptions.audio) { - const audioPub = new LocalTrackPublication(Track.Kind.Audio, TrackInfo.fromPartial({ - source: TrackSource.MICROPHONE, - sid: Math.floor(Math.random() * 10000).toString(), - type: TrackType.AUDIO - }), new LocalAudioTrack(publishOptions.useRealTracks ? (yield navigator.mediaDevices.getUserMedia({ - audio: true - })).getAudioTracks()[0] : getEmptyAudioStreamTrack())); - // @ts-ignore - this.localParticipant.addTrackPublication(audioPub); - this.localParticipant.emit(ParticipantEvent.LocalTrackPublished, audioPub); - } - for (let i = 0; i < participantOptions.count - 1; i += 1) { - let info = ParticipantInfo.fromPartial({ - sid: Math.floor(Math.random() * 10000).toString(), - identity: "simulated-".concat(i), - state: ParticipantInfo_State.ACTIVE, - tracks: [], - joinedAt: Date.now() - }); - const p = this.getOrCreateParticipant(info.identity, info); - if (participantOptions.video) { - const dummyVideo = createDummyVideoStreamTrack((_b = 160 * participantOptions.aspectRatios[i % participantOptions.aspectRatios.length]) !== null && _b !== void 0 ? _b : 1, 160, false, true); - const videoTrack = TrackInfo.fromPartial({ - source: TrackSource.CAMERA, - sid: Math.floor(Math.random() * 10000).toString(), - type: TrackType.AUDIO - }); - p.addSubscribedMediaTrack(dummyVideo, videoTrack.sid, new MediaStream([dummyVideo])); - info.tracks = [...info.tracks, videoTrack]; - } - if (participantOptions.audio) { - const dummyTrack = getEmptyAudioStreamTrack(); - const audioTrack = TrackInfo.fromPartial({ - source: TrackSource.MICROPHONE, - sid: Math.floor(Math.random() * 10000).toString(), - type: TrackType.AUDIO - }); - p.addSubscribedMediaTrack(dummyTrack, audioTrack.sid, new MediaStream([dummyTrack])); - info.tracks = [...info.tracks, audioTrack]; - } - p.updateInfo(info); - } - }); - } - // /** @internal */ - emit(event) { - for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - args[_key2 - 1] = arguments[_key2]; - } - // active speaker updates are too spammy - if (event !== RoomEvent.ActiveSpeakersChanged) { - livekitLogger.debug("room event ".concat(event), { - event, - args - }); - } - return super.emit(event, ...args); - } -} - -var CheckStatus; -(function (CheckStatus) { - CheckStatus[CheckStatus["IDLE"] = 0] = "IDLE"; - CheckStatus[CheckStatus["RUNNING"] = 1] = "RUNNING"; - CheckStatus[CheckStatus["SKIPPED"] = 2] = "SKIPPED"; - CheckStatus[CheckStatus["SUCCESS"] = 3] = "SUCCESS"; - CheckStatus[CheckStatus["FAILED"] = 4] = "FAILED"; -})(CheckStatus || (CheckStatus = {})); -class Checker extends eventsExports.EventEmitter { - constructor(url, token) { - let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - super(); - this.status = CheckStatus.IDLE; - this.logs = []; - this.errorsAsWarnings = false; - this.url = url; - this.token = token; - this.name = this.constructor.name; - this.room = new Room(options.roomOptions); - this.connectOptions = options.connectOptions; - if (options.errorsAsWarnings) { - this.errorsAsWarnings = options.errorsAsWarnings; - } - } - run(onComplete) { - return __awaiter(this, void 0, void 0, function* () { - if (this.status !== CheckStatus.IDLE) { - throw Error('check is running already'); - } - this.setStatus(CheckStatus.RUNNING); - this.appendMessage("".concat(this.name, " started.")); - try { - yield this.perform(); - } catch (err) { - if (err instanceof Error) { - if (this.errorsAsWarnings) { - this.appendWarning(err.message); - } else { - this.appendError(err.message); - } - } - } - yield this.disconnect(); - // sleep for a bit to ensure disconnect - yield new Promise(resolve => setTimeout(resolve, 500)); - // @ts-ignore - if (this.status !== CheckStatus.SKIPPED) { - this.setStatus(this.isSuccess() ? CheckStatus.SUCCESS : CheckStatus.FAILED); - } - if (onComplete) { - onComplete(); - } - return this.getInfo(); - }); - } - isSuccess() { - return !this.logs.some(l => l.level === 'error'); - } - connect() { - return __awaiter(this, void 0, void 0, function* () { - if (this.room.state === ConnectionState.Connected) { - return this.room; - } - yield this.room.connect(this.url, this.token); - return this.room; - }); - } - disconnect() { - return __awaiter(this, void 0, void 0, function* () { - if (this.room && this.room.state !== ConnectionState.Disconnected) { - yield this.room.disconnect(); - // wait for it to go through - yield new Promise(resolve => setTimeout(resolve, 500)); - } - }); - } - skip() { - this.setStatus(CheckStatus.SKIPPED); - } - appendMessage(message) { - this.logs.push({ - level: 'info', - message - }); - this.emit('update', this.getInfo()); - } - appendWarning(message) { - this.logs.push({ - level: 'warning', - message - }); - this.emit('update', this.getInfo()); - } - appendError(message) { - this.logs.push({ - level: 'error', - message - }); - this.emit('update', this.getInfo()); - } - setStatus(status) { - this.status = status; - this.emit('update', this.getInfo()); - } - get engine() { - var _a; - return (_a = this.room) === null || _a === void 0 ? void 0 : _a.engine; - } - getInfo() { - return { - logs: this.logs, - name: this.name, - status: this.status, - description: this.description - }; - } -} - -/** - * Creates a local video and audio track at the same time. When acquiring both - * audio and video tracks together, it'll display a single permission prompt to - * the user instead of two separate ones. - * @param options - */ -function createLocalTracks(options) { - var _a, _b; - return __awaiter(this, void 0, void 0, function* () { - // set default options to true - options !== null && options !== void 0 ? options : options = {}; - (_a = options.audio) !== null && _a !== void 0 ? _a : options.audio = true; - (_b = options.video) !== null && _b !== void 0 ? _b : options.video = true; - const opts = mergeDefaultOptions(options, audioDefaults, videoDefaults); - const constraints = constraintsForOptions(opts); - // Keep a reference to the promise on DeviceManager and await it in getLocalDevices() - // works around iOS Safari Bug https://bugs.webkit.org/show_bug.cgi?id=179363 - const mediaPromise = navigator.mediaDevices.getUserMedia(constraints); - if (options.audio) { - DeviceManager.userMediaPromiseMap.set('audioinput', mediaPromise); - mediaPromise.catch(() => DeviceManager.userMediaPromiseMap.delete('audioinput')); - } - if (options.video) { - DeviceManager.userMediaPromiseMap.set('videoinput', mediaPromise); - mediaPromise.catch(() => DeviceManager.userMediaPromiseMap.delete('videoinput')); - } - const stream = yield mediaPromise; - return stream.getTracks().map(mediaStreamTrack => { - const isAudio = mediaStreamTrack.kind === 'audio'; - isAudio ? options.audio : options.video; - let trackConstraints; - const conOrBool = isAudio ? constraints.audio : constraints.video; - if (typeof conOrBool !== 'boolean') { - trackConstraints = conOrBool; - } - const track = mediaTrackToLocalTrack(mediaStreamTrack, trackConstraints); - if (track.kind === Track.Kind.Video) { - track.source = Track.Source.Camera; - } else if (track.kind === Track.Kind.Audio) { - track.source = Track.Source.Microphone; - } - track.mediaStream = stream; - return track; - }); - }); -} -/** - * Creates a [[LocalVideoTrack]] with getUserMedia() - * @param options - */ -function createLocalVideoTrack(options) { - return __awaiter(this, void 0, void 0, function* () { - const tracks = yield createLocalTracks({ - audio: false, - video: options - }); - return tracks[0]; - }); -} -function createLocalAudioTrack(options) { - return __awaiter(this, void 0, void 0, function* () { - const tracks = yield createLocalTracks({ - audio: options, - video: false - }); - return tracks[0]; - }); -} -/** - * Creates a screen capture tracks with getDisplayMedia(). - * A LocalVideoTrack is always created and returned. - * If { audio: true }, and the browser supports audio capture, a LocalAudioTrack is also created. - */ -function createLocalScreenTracks(options) { - var _a; - return __awaiter(this, void 0, void 0, function* () { - if (options === undefined) { - options = {}; - } - if (options.resolution === undefined) { - options.resolution = VideoPresets.h1080.resolution; - } - let videoConstraints = true; - if (options.resolution) { - videoConstraints = { - width: options.resolution.width, - height: options.resolution.height - }; - } - if (navigator.mediaDevices.getDisplayMedia === undefined) { - throw new DeviceUnsupportedError('getDisplayMedia not supported'); - } - // typescript definition is missing getDisplayMedia: https://github.com/microsoft/TypeScript/issues/33232 - // @ts-ignore - const stream = yield navigator.mediaDevices.getDisplayMedia({ - audio: (_a = options.audio) !== null && _a !== void 0 ? _a : false, - video: videoConstraints - }); - const tracks = stream.getVideoTracks(); - if (tracks.length === 0) { - throw new TrackInvalidError('no video track found'); - } - const screenVideo = new LocalVideoTrack(tracks[0], undefined, false); - screenVideo.source = Track.Source.ScreenShare; - const localTracks = [screenVideo]; - if (stream.getAudioTracks().length > 0) { - const screenAudio = new LocalAudioTrack(stream.getAudioTracks()[0], undefined, false); - screenAudio.source = Track.Source.ScreenShareAudio; - localTracks.push(screenAudio); - } - return localTracks; - }); -} - -class PublishAudioCheck extends Checker { - get description() { - return 'Can publish audio'; - } - perform() { - var _a; - return __awaiter(this, void 0, void 0, function* () { - const room = yield this.connect(); - const track = yield createLocalAudioTrack(); - room.localParticipant.publishTrack(track); - // wait for a few seconds to publish - yield new Promise(resolve => setTimeout(resolve, 3000)); - // verify RTC stats that it's publishing - const stats = yield (_a = track.sender) === null || _a === void 0 ? void 0 : _a.getStats(); - if (!stats) { - throw new Error('Could not get RTCStats'); - } - let numPackets = 0; - stats.forEach(stat => { - if (stat.type === 'outbound-rtp' && stat.mediaType === 'audio') { - numPackets = stat.packetsSent; - } - }); - if (numPackets === 0) { - throw new Error('Could not determine packets are sent'); - } - this.appendMessage("published ".concat(numPackets, " audio packets")); - }); - } -} - -class PublishVideoCheck extends Checker { - get description() { - return 'Can publish video'; - } - perform() { - var _a; - return __awaiter(this, void 0, void 0, function* () { - const room = yield this.connect(); - const track = yield createLocalVideoTrack(); - room.localParticipant.publishTrack(track); - // wait for a few seconds to publish - yield new Promise(resolve => setTimeout(resolve, 3000)); - // verify RTC stats that it's publishing - const stats = yield (_a = track.sender) === null || _a === void 0 ? void 0 : _a.getStats(); - if (!stats) { - throw new Error('Could not get RTCStats'); - } - let numPackets = 0; - stats.forEach(stat => { - if (stat.type === 'outbound-rtp' && stat.mediaType === 'video') { - numPackets = stat.packetsSent; - } - }); - if (numPackets === 0) { - throw new Error('Could not determine packets are sent'); - } - this.appendMessage("published ".concat(numPackets, " video packets")); - }); - } -} - -class ReconnectCheck extends Checker { - get description() { - return 'Resuming connection after interruption'; - } - perform() { - var _a; - return __awaiter(this, void 0, void 0, function* () { - const room = yield this.connect(); - let reconnectingTriggered = false; - let reconnected = false; - let reconnectResolver; - const reconnectTimeout = new Promise(resolve => { - setTimeout(resolve, 5000); - reconnectResolver = resolve; - }); - room.on(RoomEvent.Reconnecting, () => { - reconnectingTriggered = true; - }).on(RoomEvent.Reconnected, () => { - reconnected = true; - reconnectResolver(true); - }); - (_a = room.engine.client.ws) === null || _a === void 0 ? void 0 : _a.close(); - const onClose = room.engine.client.onClose; - if (onClose) { - onClose(''); - } - yield reconnectTimeout; - if (!reconnectingTriggered) { - throw new Error('Did not attempt to reconnect'); - } else if (!reconnected || room.state !== ConnectionState.Connected) { - this.appendWarning('reconnection is only possible in Redis-based configurations'); - throw new Error('Not able to reconnect'); - } - }); - } -} - -class TURNCheck extends Checker { - get description() { - return 'Can connect via TURN'; - } - perform() { - var _a, _b; - return __awaiter(this, void 0, void 0, function* () { - const signalClient = new SignalClient(); - const joinRes = yield signalClient.join(this.url, this.token, { - autoSubscribe: true, - maxRetries: 0 - }); - let hasTLS = false; - let hasTURN = false; - let hasSTUN = false; - for (let iceServer of joinRes.iceServers) { - for (let url of iceServer.urls) { - if (url.startsWith('turn:')) { - hasTURN = true; - hasSTUN = true; - } else if (url.startsWith('turns:')) { - hasTURN = true; - hasSTUN = true; - hasTLS = true; - } - if (url.startsWith('stun:')) { - hasSTUN = true; - } - } - } - if (!hasSTUN) { - this.appendWarning('No STUN servers configured on server side.'); - } else if (hasTURN && !hasTLS) { - this.appendWarning('TURN is configured server side, but TURN/TLS is unavailable.'); - } - yield signalClient.close(); - if (((_b = (_a = this.connectOptions) === null || _a === void 0 ? void 0 : _a.rtcConfig) === null || _b === void 0 ? void 0 : _b.iceServers) || hasTURN) { - yield this.room.connect(this.url, this.token, { - rtcConfig: { - iceTransportPolicy: 'relay' - } - }); - } else { - this.appendWarning('No TURN servers configured.'); - this.skip(); - yield new Promise(resolve => setTimeout(resolve, 0)); - } - }); - } -} - -class WebRTCCheck extends Checker { - get description() { - return 'Establishing WebRTC connection'; - } - perform() { - return __awaiter(this, void 0, void 0, function* () { - try { - console.log('initiating room connection'); - this.room = yield this.connect(); - console.log('now the room is connected'); - } catch (err) { - this.appendWarning('ports need to be open on firewall in order to connect.'); - throw err; - } - }); - } -} - -class WebSocketCheck extends Checker { - get description() { - return 'Connecting to signal connection via WebSocket'; - } - perform() { - return __awaiter(this, void 0, void 0, function* () { - if (this.url.startsWith('ws:') || this.url.startsWith('http:')) { - this.appendWarning('Server is insecure, clients may block connections to it'); - } - let signalClient = new SignalClient(); - const joinRes = yield signalClient.join(this.url, this.token, { - autoSubscribe: true, - maxRetries: 0 - }); - this.appendMessage("Connected to server, version ".concat(joinRes.serverVersion, ".")); - yield signalClient.close(); - }); - } -} - -class ConnectionCheck extends eventsExports.EventEmitter { - constructor(url, token) { - super(); - this.checkResults = new Map(); - this.url = url; - this.token = token; - } - getNextCheckId() { - const nextId = this.checkResults.size; - this.checkResults.set(nextId, { - logs: [], - status: CheckStatus.IDLE, - name: '', - description: '' - }); - return nextId; - } - updateCheck(checkId, info) { - this.checkResults.set(checkId, info); - this.emit('checkUpdate', checkId, info); - } - isSuccess() { - return Array.from(this.checkResults.values()).every(r => r.status !== CheckStatus.FAILED); - } - getResults() { - return Array.from(this.checkResults.values()); - } - createAndRunCheck(check) { - return __awaiter(this, void 0, void 0, function* () { - const checkId = this.getNextCheckId(); - const test = new check(this.url, this.token); - const handleUpdate = info => { - this.updateCheck(checkId, info); - }; - test.on('update', handleUpdate); - const result = yield test.run(); - test.off('update', handleUpdate); - return result; - }); - } - checkWebsocket() { - return __awaiter(this, void 0, void 0, function* () { - return this.createAndRunCheck(WebSocketCheck); - }); - } - checkWebRTC() { - return __awaiter(this, void 0, void 0, function* () { - return this.createAndRunCheck(WebRTCCheck); - }); - } - checkTURN() { - return __awaiter(this, void 0, void 0, function* () { - return this.createAndRunCheck(TURNCheck); - }); - } - checkReconnect() { - return __awaiter(this, void 0, void 0, function* () { - return this.createAndRunCheck(ReconnectCheck); - }); - } - checkPublishAudio() { - return __awaiter(this, void 0, void 0, function* () { - return this.createAndRunCheck(PublishAudioCheck); - }); - } - checkPublishVideo() { - return __awaiter(this, void 0, void 0, function* () { - return this.createAndRunCheck(PublishVideoCheck); - }); - } -} - - -//# sourceMappingURL=livekit-client.esm.mjs.map - - /***/ }) /******/ }); diff --git a/umd/index.dev.js.map b/umd/index.dev.js.map index c5291462..26b12919 100644 --- a/umd/index.dev.js.map +++ b/umd/index.dev.js.map @@ -1 +1 @@ -{"version":3,"file":"index.dev.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,8BAA8B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,qBAAM;AACrB,eAAe,qBAAM;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE,EAAE;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,YAAY;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA,wCAAwC,MAAM;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,QAAQ;AAC5C;AACA;AACA;AACA;AACA;AACA,2CAA2C,QAAQ,wEAAwE,KAAK;;AAEhI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,qBAAM;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,MAAM;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,iBAAiB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,aAAa,GAAG,KAAK;AACjD;AACA;AACA;AACA,+BAA+B,iBAAiB,IAAI,SAAS,GAAG,SAAS;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,IAAI;AACvD,KAAK;AACL;AACA,mBAAmB,MAAM,IAAI;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,GAAG;AACf;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,YAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,aAAa,WAAW;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,yBAAyB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,QAAQ;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,QAAQ;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,QAAQ;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,SAAS;AAClD;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B,6BAA6B,QAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ,UAAU,SAAS;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,EAAE;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE49B;AAC59B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC/jE+C;AAGxC,MAAMC,QAAQ,GAAG,YAAY,IAAID,wDAAe,IAAI,MAAM,CAAC;AAG3D,MAAME,OAAO,GAAG,kCAAkC;AAGlD,MAAMC,WAAW,GAAG;EAACC,MAAM,EAAE,eAAe;EAAEC,KAAK,EAAE;AAAgB,CAAC;AAGtE,MAAMC,YAAY,GAAGH,WAAW,CAACC,MAAM;AAGvC,MAAMG,eAAe,GAAG,IAAI;AAG5B,MAAMC,cAAc,GAAG,KAAK;AAE5B,MAAMC,UAAU,GAAG,KAAK;AAGxB,MAAMC,cAAc,GAAG,CAAC;AAExB,MAAMC,cAAc,GAAG,EAAE;AAEzB,MAAMC,aAAa,GAAG,EAAE;AAGxB,MAAMC,uBAAuB,GAAG,OAAO;AAEvC,MAAMC,mBAAmB,GAAG,SAAS;AAErC,MAAMC,mBAAmB,GAAG,IAAI;AAGhC,MAAMC,cAAc,GAAG,GAAG;AAI1B,MAAMC,gBAAgB,GAAG,GAAG;AAE5B,MAAMC,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EA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,gBAAgB,sCAAsC,SAAS;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,cAAc;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,SAAS;AAClE;AACA,uEAAuE,SAAS;AAChF,0EAA0E,SAAS;AACnF,sEAAsE,SAAS;AAC/E;AACA,6EAA6E,SAAS;AACtF;AACA;AACA,iGAAiG,sBAAsB;AACvH,oGAAoG,sBAAsB;AAC1H,oGAAoG,sBAAsB;AAC1H,2GAA2G,sBAAsB;AACjI;AACA,0BAA0B,wDAAY;;AAEtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,uCAAuC;AACvC;AACA;AACA;AACA;AACA,wCAAwC,0DAAS;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF,qBAAqB;AACxG;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA,sBAAsB;AACtB;AACA,mCAAmC,iEAAiE;AACpG;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,0BAA0B,mEAAmB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,yDAAS;AACrB,YAAY,yDAAS;AACrB;AACA;AACA;AACA,uFAAuF,eAAe;AACtG;AACA;AACA,0BAA0B,mEAAkB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iCAAiC;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,mEAAmB;AAClE;AACA;AACA;AACA,qEAAqE,eAAe;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,QAAQ;AAC/B;AACA;AACA;AACA;AACA;AACA,2CAA2C,QAAQ,kBAAkB,QAAQ;AAC7E;AACA;AACA,0CAA0C,QAAQ;AAClD;AACA;AACA;AACA;AACA;AACA,0CAA0C,QAAQ;AAClD;AACA;AACA;AACA;AACA,2BAA2B,0DAAS,IAAI,QAAQ,oBAAoB,kBAAkB;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,mEAAiB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,6DAAa;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,2CAAM;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,yDAAa;AACtC;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,yDAAa;AACtC;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS,GAAG,kBAAkB;AAC5C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,aAAa;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kCAAkC;AAClD,6BAA6B,6EAA6B,kBAAkB,0CAA0C;AACtH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,oEAAoB;AACjC;AACA;AACA;AACA,mBAAmB,yEAAyB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,6EAA6B;AACxC;AACA,qBAAqB,yCAAyC;AAC9D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,0DAAS;AACpC,2BAA2B,0DAAS;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE2R;AAC3R;;;;;;;;;;;;;;;;;;ACr6B0C;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,oDAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,WAAW;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,gBAAgB,eAAe,UAAU;AAC1F;AACA;AACA,yCAAyC,WAAW;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,wCAAwC;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,gBAAgB,eAAe;AAC/B;AACA;AACA,2BAA2B,UAAU,GAAG,qBAAqB;AAC7D;AACA;AACA,qCAAqC,WAAW;AAChD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,kCAAkC;AAC/D;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4GAA4G;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,gBAAgB,mCAAmC,UAAU;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEmD;AACnD;;;;;;;;;;;;;;;;;;;;;;;ACxZ0F;AAC1C;AACa;AAChC;;AAE7B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,QAAQ;AACrC;AACA;AACA,gDAAgD;AAChD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iHAAiH,WAAW;AAC5H;AACA;AACA,yDAAyD,cAAc,4BAA4B,cAAc,cAAc,GAAG,eAAe;AACjJ;AACA;AACA;AACA,0BAA0B,wDAAY;AACtC;AACA;AACA,6BAA6B,yDAAa;AAC1C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,WAAW;AAC/C,cAAc,sBAAsB,YAAY,UAAU;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,sBAAsB,QAAQ;AAC9B;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,yCAAyC,cAAc;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,uBAAuB,EAAE,aAAa;AACpD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,qCAAqC,IAAI,KAAK;AACzF;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,GAAG;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,kBAAkB,GAAG,gBAAgB;AACnD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,UAAU;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,2CAAM;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,yCAAyC;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,qCAAqC;AAC/E;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,KAAK;AACxD,cAAc,oCAAoC,GAAG,IAAI;AACzD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,eAAe,aAAa,oDAAoD;AACjI;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,uEAAuE,wBAAwB,WAAW;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,wBAAwB,aAAa,oDAAoD;AACpK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,eAAe,gCAAgC;AACxF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,yCAAyC;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,sBAAsB;AAClC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,KAAK;AAC7C,cAAc,oCAAoC,GAAG,IAAI;AACzD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,YAAY;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,YAAY;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD,IAAI,iCAAiC;AACrC,qBAAqB,iCAAiC;AACtD;AACA;AACA;AACA,gCAAgC,qDAAM;AACtC,8BAA8B,2DAAY;AAC1C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,2DAAY;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,2DAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,iEAAkB,KAAK,0DAAS;AACpC,IAAI,iEAAkB,KAAK,0DAAS;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,8DAAe;AACf;AACA,8DAAe;;AAE+D;AAC9E;;;;;;;;;;;;;;;;;;;ACjoCmE;AACN;;AAE7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,yCAAyC,IAAI;AAC9E;AACA,wBAAwB,qDAAI;AAC5B;AACA;AACA,oBAAoB,qDAAI,sDAAsD,qDAAI;AAClF,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,UAAU,IAAI;AACxC;AACA;AACA;AACA,WAAW,qDAAI;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAY;AACZ;AACA;AACA;AACA,CAAC;;AAE2B;;;;;;;;;;;;;;;;;;;ACvF5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEqG;;;;;;;;;;;;;;;;;;ACxLrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,IAAI,KAAK,cAAc;AACnD;AACA;AACA,sFAAsF,QAAQ;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,IAAI;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;;AAE4D;AAC5D;;;;;;;;;;;;;;;;;;;;;;;;AC1NiC;AACe;AACT;AAC+F;AAC5C;;AAE1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sCAAsC;;AAEvC;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,2CAAM;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,UAAU,6CAAQ;AAClB,UAAU,6CAAQ;AAClB,UAAU,6CAAQ;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,sBAAsB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,2CAAM;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,WAAW;AAC7B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iHAAiH,WAAW;AAC5H;AACA;AACA;AACA;AACA;AACA;AACA,gJAAgJ,qBAAqB;AACrK,+HAA+H,WAAW;AAC1I;AACA;AACA,yBAAyB,WAAW;AACpC,wHAAwH,WAAW;AACnI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,wDAAY;;AAEtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,4CAA4C,GAAG,mBAAmB;AAC1G;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,4CAA4C,GAAG,MAAM;AAC7F;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,uBAAuB,WAAW;AAClC,cAAc,SAAS,YAAY,UAAU;AAC7C;AACA,4BAA4B,0BAA0B;AACtD;AACA;AACA;AACA;AACA;AACA,qDAAqD,UAAU;AAC/D,KAAK;AACL;AACA,mBAAmB,kCAAkC;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,mBAAmB,6CAA6C;AAClI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,UAAU;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,iEAAkB,KAAK,0DAAS;AACpC,IAAI,iEAAkB,KAAK,0DAAS;AACpC,IAAI,8DAAe;AACnB;AACA,IAAI,8DAAe;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,yEAAyB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,oEAAoB;AAC5B,QAAQ,iEAAiB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,qDAAM;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL,WAAW,2DAAY,CAAC,kEAAkB;AAC1C;AACA;AACA,mBAAmB,iBAAiB;AACpC,gFAAgF;AAChF;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAiB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kEAAkB;AAClC;AACA;AACA;AACA,wDAAwD,iBAAiB;AACzE,QAAQ,iBAAiB;AACzB;AACA,2BAA2B,iBAAiB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kEAAkB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAiB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kEAAkB;AAClC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEoH;AACpH;;;;;;;;;;;;;;;;;;;ACjtCmE;AACN;;AAE7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,yCAAyC,IAAI;AAC9E;AACA,wBAAwB,qDAAI;AAC5B;AACA;AACA,oBAAoB,qDAAI,sDAAsD,qDAAI;AAClF,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,UAAU,IAAI;AACxC;AACA;AACA;AACA,WAAW,qDAAI;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAY;AACZ;AACA;AACA;AACA,CAAC;;AAE2B;;;;;;;;;;;;;;;;;;;ACvF5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEqG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxLrD;AAClB;;AAE9B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAAe;AACf;;;;;;;;;;;;;;;;;;;;ACvBoC;AACpC;;;;;;;;;;;;;;;;;;;ACDmE;AACN;;AAE7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,yCAAyC,IAAI;AAC9E;AACA,wBAAwB,qDAAI;AAC5B;AACA;AACA,oBAAoB,qDAAI,sDAAsD,qDAAI;AAClF,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,UAAU,IAAI;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,qDAAI;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAY;AACZ;AACA;AACA;AACA,CAAC;;AAE2B;;;;;;;;;;;;;;;;;;;AC9F5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEqG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxLrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,KAAK;AACL;AACA,GAAG;AACH,EAAE;AACF;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;;AAEA;;AAEA;AACA;AACA,sBAAsB,uBAAuB;AAC7C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA,wFAAwF;AACxF,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA,wEAAwE;AACxE,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH,CAAC;AACD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,4sCAA4sC;AAC5sC,EAAE;AACF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa;AACb;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,aAAa,OAAO;AACpB;AACA;;AAEA;AACA,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,aAAa,OAAO;AACpB;AACA;;AAEA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,aAAa,OAAO;AACpB;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa;AACb;AACA;AACA,wBAAwB;;AAExB;AACA,WAAW,QAAQ;AACnB,WAAW,mBAAmB;AAC9B,WAAW,SAAS;AACpB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,mBAAmB;AAC9B,WAAW,SAAS;AACpB,aAAa,OAAO;AACpB;AACA;;AAEA;AACA;AACA,WAAW,sBAAsB,+CAA+C;AAChF,WAAW,UAAU;AACrB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,sBAAsB,+CAA+C;AAChF,WAAW,UAAU;AACrB,aAAa;AACb;AACA;;AAEA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa;AACb;AACA,YAAY,YAAY;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,SAAS;AAC9B;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA,gEAAgE,kBAAkB;AAClF,aAAa;AACb;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,qBAAqB;AAChC,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2EAA2E,kBAAkB;AAC7F;AACA,WAAW,qBAAqB;AAChC,aAAa;AACb;AACA;;AAEA;AACA;AACA,WAAW,qBAAqB;AAChC,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA,iFAAiF,qBAAqB;AACtG;AACA,WAAW,qBAAqB;AAChC,aAAa;AACb;AACA;;AAEA;AACA,iFAAiF,qBAAqB;AACtG;AACA,WAAW,qBAAqB;AAChC,aAAa;AACb;AACA;;AAEA;AACA;AACA,WAAW,qBAAqB;AAChC,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA,iFAAiF,oBAAoB;AACrG;AACA,WAAW,qBAAqB;AAChC,aAAa;AACb;AACA;;AAEA;AACA;AACA,WAAW,qBAAqB;AAChC,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA,0FAA0F,2BAA2B;AACrH;AACA,WAAW,qBAAqB;AAChC,aAAa;AACb;AACA;;AAEA;AACA,0FAA0F,2BAA2B;AACrH;AACA,WAAW,qBAAqB;AAChC,aAAa;AACb;AACA;;AAEA;AACA;AACA,WAAW,qBAAqB;AAChC,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA,oFAAoF,uBAAuB;AAC3G;AACA,WAAW,qBAAqB;AAChC,aAAa;AACb;AACA;;AAEA;AACA;AACA,WAAW,qBAAqB;AAChC,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA,6FAA6F,8BAA8B;AAC3H;AACA,WAAW,qBAAqB;AAChC,aAAa;AACb;AACA;;AAEA;AACA,6FAA6F,8BAA8B;AAC3H;AACA,WAAW,qBAAqB;AAChC,aAAa;AACb;AACA;;AAEA;AACA;AACA,WAAW,qBAAqB;AAChC,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yEAAyE,mBAAmB;AAC5F;AACA,WAAW,qBAAqB;AAChC,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA,mDAAmD,kBAAkB;AACrE;AACA,aAAa,OAAO;AACpB;AACA;;AAEA;AACA;AACA,WAAW,qBAAqB;AAChC,aAAa,OAAO;AACpB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,qBAAqB;AAChC,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA,+EAA+E,oBAAoB;AACnG;AACA,WAAW,qBAAqB;AAChC,aAAa,OAAO;AACpB;AACA;;AAEA;AACA;AACA,WAAW,qBAAqB;AAChC,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE,IAAI;;AAEJ;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4EAA4E,oBAAoB;AAChG;AACA,WAAW,qBAAqB;AAChC,aAAa,OAAO;AACpB;AACA;;AAEA;AACA;AACA;AACA,WAAW,qBAAqB;AAChC,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oEAAoE,kBAAkB;AACtF;AACA,WAAW,qBAAqB;AAChC,aAAa,OAAO;AACpB;AACA;;AAEA;AACA;AACA,WAAW,qBAAqB;AAChC,aAAa,OAAO;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gEAAgE,kBAAkB;AAClF;AACA,WAAW,qBAAqB;AAChC,aAAa,OAAO;AACpB;AACA;;AAEA;AACA,gEAAgE,kBAAkB;AAClF;AACA,WAAW,qBAAqB;AAChC,aAAa,OAAO;AACpB;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,qBAAqB;AAChC,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,qBAAqB;AAChC,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,qBAAqB;AAChC,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,OAAO;AACpB;AACA;AACA;AACA,yCAAyC,6HAA6H;AACtK;;AAEA;AACA,6FAA6F,qBAAqB;AAClH;AACA,WAAW,cAAc;AACzB,aAAa,OAAO;AACpB;AACA;;AAEA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,OAAO;AACpB;AACA;AACA;AACA,yCAAyC,8HAA8H;AACvK;;AAEA;AACA,6GAA6G,sBAAsB;AACnI;AACA,WAAW,cAAc;AACzB,aAAa,OAAO;AACpB;AACA;;AAEA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA,MAAM,iEAAiE;AACvE;AACA;;AAEA;AACA,wGAAwG,8BAA8B;AACtI;AACA,WAAW,cAAc;AACzB,aAAa,OAAO;AACpB;AACA;;AAEA;AACA,wGAAwG,8BAA8B;AACtI;AACA,WAAW,cAAc;AACzB,aAAa,OAAO;AACpB;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,UAAU;AACrB,aAAa,iBAAiB;AAC9B;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,iBAAiB;AAC9B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,iBAAiB;AAC9B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,iBAAiB;AAC5B,WAAW,UAAU;AACrB,WAAW,UAAU;AACrB,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,iBAAiB;AAC5B,WAAW,UAAU;AACrB,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,iBAAiB;AAC5B,WAAW,UAAU;AACrB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0BAA0B,qBAAqB;AAC/C;AACA,YAAY;AACZ,aAAa,YAAY;AACzB,aAAa,MAAM;AACnB,eAAe;AACf;;AAEA;AACA;AACA;AACA,aAAa,mBAAmB;AAChC,aAAa,GAAG;AAChB,aAAa,MAAM;AACnB,eAAe,YAAY;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,oBAAoB,OAAO;;AAE3B;AACA;AACA,eAAe,YAAY;AAC3B,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,YAAY;AAC3B,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,sBAAsB,kBAAkB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA,gCAAgC,EAAE,mBAAmB,EAAE,iBAAiB,EAAE;AAC1E;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,UAAU;AACvB,aAAa,GAAG;AAChB,eAAe,mBAAmB;AAClC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,UAAU;AACvB,eAAe,mBAAmB;AAClC;AACA;AACA,gDAAgD;AAChD,sDAAsD;AACtD;AACA,wBAAwB,qBAAqB,qDAAqD;AAClG;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,MAAM;AACnB,eAAe,mBAAmB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,qBAAqB;AAClC,kBAAkB,qBAAqB;AACvC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,YAAY;AACzB,aAAa,QAAQ;AACrB,eAAe;AACf;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,YAAY;AACzB,aAAa,QAAQ;AACrB,eAAe;AACf;;AAEA;AACA;AACA;AACA;AACA,aAAa,YAAY;AACzB,aAAa,QAAQ;AACrB,eAAe,QAAQ;AACvB;;AAEA;AACA;AACA;AACA;AACA,aAAa,YAAY;AACzB,aAAa,QAAQ;AACrB,eAAe,QAAQ;AACvB;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,YAAY;AACzB,aAAa,QAAQ;AACrB,eAAe;AACf;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,YAAY;AACzB,aAAa,QAAQ;AACrB,eAAe;AACf;;AAEA;AACA;AACA;AACA;AACA,aAAa,YAAY;AACzB,aAAa,QAAQ;AACrB,eAAe,QAAQ;AACvB;;AAEA;AACA;AACA;AACA;AACA,aAAa,YAAY;AACzB,aAAa,QAAQ;AACrB,eAAe,QAAQ;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAK,IAAI;AACT;AACA;AACA;AACA,uGAAuG,qDAAqD;AAC5J;AACA,+DAA+D;AAC/D;AACA,4FAA4F;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAK,IAAI;AACT;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,SAAS;AACxB;AACA;AACA;AACA,2BAA2B;AAC3B;AACA,MAAM,aAAa;AACnB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA,sBAAsB,mBAAmB;AACzC;AACA,8BAA8B,4BAA4B;AAC1D;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,eAAe,YAAY;AAC3B,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,oCAAoC,+EAA+E;AACnH;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,YAAY;AAC3B,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,sBAAsB,mBAAmB;AACzC;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,gBAAgB;AAC9C;AACA,YAAY;AACZ,aAAa,QAAQ;AACrB,eAAe,YAAY;AAC3B;;AAEA;AACA,0BAA0B,gBAAgB;AAC1C;AACA,YAAY;AACZ,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,eAAe,YAAY;AAC3B,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,aAAa,YAAY;AACzB,aAAa,QAAQ;AACrB,eAAe,eAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,eAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,oBAAoB;AACjC,eAAe,eAAe;AAC9B;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB,eAAe,MAAM;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,eAAe;AAC9B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,eAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,eAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA,qJAAqJ;;AAErJ;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,wFAAwF;;AAExF;AACA;AACA,cAAc;AACd;AACA;AACA,uDAAuD,kCAAkC;;AAEzF;AACA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,GAAG;AAClB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;;AAEA;AACA;AACA,eAAe,iBAAiB;AAChC,iBAAiB,mBAAmB;AACpC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB,QAAQ;AAC1B,kBAAkB,QAAQ;AAC1B,kBAAkB,SAAS;AAC3B;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA,sCAAsC,EAAE;;AAExC;AACA;AACA,eAAe,aAAa;AAC5B,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,mBAAmB;AAClC,eAAe,mBAAmB;AAClC,eAAe,SAAS;AACxB,iBAAiB,mBAAmB;AACpC;AACA;AACA;AACA,+CAA+C,iBAAiB;AAChE;AACA;AACA;;AAEA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,oBAAoB;AACrC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,qDAAqD;AACrD;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,mBAAmB;AAClC;AACA;AACA,yCAAyC;AACzC,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;;AAEA;AACA,sCAAsC,uBAAuB;AAC7D;AACA,cAAc;AACd,iBAAiB,kBAAkB;AACnC;;AAEA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA,sBAAsB,uBAAuB;;AAE7C;AACA,mBAAmB,kBAAkB;AACrC;AACA;AACA;AACA;AACA;AACA,gEAAgE,QAAQ;AACxE;AACA;;AAEA;AACA,sCAAsC,uBAAuB;AAC7D;AACA,cAAc;AACd,eAAe,kBAAkB;AACjC,iBAAiB;AACjB;;AAEA;AACA;AACA,eAAe,UAAU;AACzB,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA,iBAAiB,QAAQ;AACzB,mBAAmB;AACnB;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;;AAEA;AACA,4CAA4C,sBAAsB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA,oBAAoB;;AAEpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,iCAAiC;AAC5C,WAAW,QAAQ;AACnB,WAAW,GAAG;AACd;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA,kBAAkB;AAClB;;AAEA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,qBAAqB,GAAG,oBAAoB,yCAAyC;AAClG;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,YAAY;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,iCAAiC;AAC5C,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB,YAAY,WAAW;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB,YAAY,WAAW;AACvB;AACA;;AAEA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB,YAAY,WAAW;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;;AAEA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB,YAAY,WAAW;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB,YAAY,WAAW;AACvB;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,kBAAkB,gBAAgB;AAClC;;AAEA;AACA;AACA,WAAW,mBAAmB;AAC9B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,0BAA0B,IAAI,4BAA4B;AACtE,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,YAAY;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,eAAe,QAAQ;AACvB;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,wCAAwC,qBAAqB,eAAe;AAC5E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,gDAAgD;AACrF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;;AAEA;;AAEA;AACA;AACA,oBAAoB;;AAEpB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,YAAY;AACvB;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,mBAAmB;AAC9B,aAAa,qBAAqB,GAAG,oBAAoB,sCAAsC;AAC/F,YAAY,OAAO;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA,IAAI;AACJ,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;;AAEA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;;AAEA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;;AAEA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,YAAY;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,yCAAyC,sCAAsC;AAC/E;AACA,iBAAiB,uBAAuB;AACxC;AACA;AACA,UAAU;AACV,WAAW,YAAY;AACvB,WAAW,MAAM;AACjB,aAAa;AACb;;AAEA;AACA,+BAA+B,mBAAmB,eAAe,qBAAqB;AACtF;AACA;AACA;AACA,UAAU;AACV,WAAW,uBAAuB;AAClC,WAAW,iCAAiC;AAC5C,aAAa,wBAAwB;AACrC;;AAEA;AACA;AACA,6CAA6C,qBAAqB;AAClE;AACA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA,mCAAmC,kCAAkC;AACrE,WAAW,qCAAqC;AAChD,WAAW,mBAAmB;AAC9B,WAAW,mBAAmB;AAC9B,WAAW,uBAAuB;AAClC,WAAW,iCAAiC;AAC5C,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC,sBAAsB;AACzD;AACA,YAAY;AACZ,aAAa,mCAAmC,YAAY,IAAI;AAChE,aAAa,YAAY;AACzB,aAAa,iBAAiB;AAC9B,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA,qCAAqC,cAAc;AACnD;AACA,YAAY;AACZ,aAAa,YAAY;AACzB,aAAa,iBAAiB;AAC9B,eAAe;AACf;;AAEA;AACA,CAAC;;AAED;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oCAAoC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kDAAkD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kDAAkD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,0CAA0C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8CAA8C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sDAAsD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,0CAA0C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,0CAA0C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wCAAwC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,0EAA0E;AAC1E,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,yEAAyE;AACzE,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,yFAAyF;AACzF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,mFAAmF;AACnF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA,sFAAsF;AACtF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,6EAA6E;AAC7E,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,8EAA8E;AAC9E,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,8EAA8E;AAC9E,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA,uFAAuF;AACvF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,+EAA+E;AAC/E,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,8EAA8E;AAC9E,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA,qFAAqF;AACrF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,8EAA8E;AAC9E,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,8EAA8E;AAC9E,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,uFAAuF;AACvF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,sFAAsF;AACtF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA,kFAAkF;AAClF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,+DAA+D,iBAAiB;AAC5G;AACA,oCAAoC,MAAM,+BAA+B,YAAY;AACrF,mCAAmC,MAAM,mCAAmC,YAAY;AACxF,gCAAgC;AAChC;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2GAA2G,uFAAuF,cAAc;AAChN,uBAAuB,8BAA8B,gDAAgD,wDAAwD;AAC7J,6CAA6C,sCAAsC,UAAU,mBAAmB,IAAI;AACpH;;AAEA,cAAc;;AAEd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,sBAAsB;AACxC;AACA;AACA,4EAA4E;;AAE5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,eAAe;AACf;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE;AACtE;AACA;AACA;AACA,IAAI;AACJ;AACA,8BAA8B,QAAQ;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,wEAAwE;AACxE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,mCAAmC,QAAQ;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA,SAAS,yBAAyB;AAClC;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,qCAAqC,YAAY;AACjD;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,GAAG;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG,IAAI;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,OAAO;AACP;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;;AAEA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA,aAAa;AACb,WAAW;AACX;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,KAAK;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gGAAgG,aAAa;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gCAAgC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED,aAAa;;AAEb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB;AACtB,6BAA6B;AAC7B;AACA;AACA;AACA,gEAAgE;AAChE,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP,mDAAmD;AACnD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;;AAEA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,mBAAmB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,mBAAmB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oCAAoC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8CAA8C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,iFAAiF;AACjF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,kFAAkF;AAClF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,kFAAkF;AAClF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,mFAAmF;AACnF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,kFAAkF;AAClF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,oFAAoF;AACpF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,gFAAgF;AAChF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,qFAAqF;AACrF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,0FAA0F;AAC1F,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,4FAA4F;AAC5F,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,sFAAsF;AACtF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA,qFAAqF;AACrF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA,sFAAsF;AACtF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,uFAAuF;AACvF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,gFAAgF;AAChF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA,qFAAqF;AACrF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,6FAA6F;AAC7F,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,6EAA6E;AAC7E,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA,mFAAmF;AACnF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,8EAA8E;AAC9E,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,yFAAyF;AACzF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA,2FAA2F;AAC3F,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,mFAAmF;AACnF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA,qFAAqF;AACrF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,qFAAqF;AACrF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA,mFAAmF;AACnF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA,2FAA2F;AAC3F,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,mFAAmF;AACnF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA,0FAA0F;AAC1F,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,gGAAgG;AAChG,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,6EAA6E;AAC7E,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,mFAAmF;AACnF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,oFAAoF;AACpF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,wEAAwE;AACxE,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,wEAAwE;AACxE,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,wFAAwF;AACxF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gDAAgD;;AAEjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,0CAA0C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,2EAA2E;AAC3E,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E;AAC/E;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA,iBAAiB;;AAEjB;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,sCAAsC,UAAU;AAChD,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH,mCAAmC,eAAe,WAAW;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,8BAA8B,aAAa;AAC3C,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;AACA,kBAAkB;AAClB,kCAAkC;AAClC,sBAAsB;AACtB,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,+BAA+B;AAC/B,+BAA+B,EAAE;AACjC;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,CAAC;AACD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,sBAAsB,kBAAkB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,oCAAoC;AACpC;AACA,gDAAgD;;AAEhD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA,0BAA0B;;AAE1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,4CAA4C;AAC5C;;AAEA,sBAAsB,kCAAkC;AACxD;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,uBAAuB,6BAA6B;AACpD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,kFAAkF;AAClF,KAAK;AACL;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,sBAAsB;AAC1C;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;;AAEA;AACA,wBAAwB;AACxB;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,WAAW;AACX;AACA,OAAO;AACP,KAAK;AACL,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,kFAAkF;AAClF,iBAAiB;AACjB;AACA;AACA;AACA,WAAW;AACX;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,oCAAoC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA4E;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8BAA8B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4CAA4C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;;AAEjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,uCAAuC;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,6CAA6C;AAChD;AACA;AACA;AACA;AACA;AACA,GAAG,8DAA8D;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sBAAsB;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,0BAA0B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,eAAe;AACf;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,oBAAoB;AACpB,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,kBAAkB,oBAAoB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,0EAA0E,IAAI;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA,mCAAmC,wBAAwB;AAC3D;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,+DAA+D;AACzH;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,kFAAkF;AACrF;AACA;AACA;AACA,GAAG,8EAA8E;AACjF,CAAC,4CAA4C;;AAE7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,8CAA8C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA,2FAA2F,aAAa;AACxG;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,wEAAwE;AAC7J;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,4EAA4E;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,QAAQ;AACR;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA,UAAU,aAAa;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,0CAA0C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD,sEAAsE;AACtE,sEAAsE;AACtE,iEAAiE;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,QAAQ;AACR;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6FAA6F,aAAa;AAC1G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,sBAAsB,kCAAkC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,+FAA+F,eAAe;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,QAAQ,aAAa;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAE6iC;AAC7iC;;;;;;;UCnxuBA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;;;;WCzBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,sDAAsD;WACtD,sCAAsC,iEAAiE;WACvG;WACA;WACA;WACA;WACA;WACA;;;;;WCzBA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF;;;;;WCRA;WACA;WACA;WACA;WACA;;;;;WCJA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC;;;;;WCPD;;;;;WCAA;WACA;WACA;WACA;WACA,uBAAuB,4BAA4B;WACnD;WACA;WACA;WACA,iBAAiB,oBAAoB;WACrC;WACA,mGAAmG,YAAY;WAC/G;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,mEAAmE,iCAAiC;WACpG;WACA;WACA;WACA;;;;;WCxCA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;WCNA;;;;;WCAA;;WAEA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;W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","sources":["webpack://tinode-webapp/./node_modules/@firebase/util/dist/index.esm2017.js","webpack://tinode-webapp/./src/config.js","webpack://tinode-webapp/./src/constants.js","webpack://tinode-webapp/./src/lib/blob-helpers.js","webpack://tinode-webapp/./src/lib/formatters.js","webpack://tinode-webapp/./src/lib/host-name.js","webpack://tinode-webapp/./src/lib/local-storage.js","webpack://tinode-webapp/./src/lib/navigation.js","webpack://tinode-webapp/./src/lib/strformat.js","webpack://tinode-webapp/./src/lib/utils.js","webpack://tinode-webapp/./src/version.js","webpack://tinode-webapp/./src/views/acc-notifications-view.jsx","webpack://tinode-webapp/./src/views/acc-security-view.jsx","webpack://tinode-webapp/./src/views/acc-support-view.jsx","webpack://tinode-webapp/./src/views/contacts-view.jsx","webpack://tinode-webapp/./src/views/info-view.jsx","webpack://tinode-webapp/./src/views/login-view.jsx","webpack://tinode-webapp/./src/views/logo-view.jsx","webpack://tinode-webapp/./src/views/messages-view.jsx","webpack://tinode-webapp/./src/views/new-topic-view.jsx","webpack://tinode-webapp/./src/views/settings-view.jsx","webpack://tinode-webapp/./src/views/sidepanel-view.jsx","webpack://tinode-webapp/./src/views/tinode-web.jsx","webpack://tinode-webapp/./src/views/topic-common-view.jsx","webpack://tinode-webapp/./src/views/validation-view.jsx","webpack://tinode-webapp/./src/widgets/alert.jsx","webpack://tinode-webapp/./src/widgets/attachment.jsx","webpack://tinode-webapp/./src/widgets/audio-player.jsx","webpack://tinode-webapp/./src/widgets/avatar-crop.jsx","webpack://tinode-webapp/./src/widgets/avatar-upload.jsx","webpack://tinode-webapp/./src/widgets/badge-list.jsx","webpack://tinode-webapp/./src/widgets/button-back.jsx","webpack://tinode-webapp/./src/widgets/call-incoming.jsx","webpack://tinode-webapp/./src/widgets/call-message.jsx","webpack://tinode-webapp/./src/widgets/call-panel.jsx","webpack://tinode-webapp/./src/widgets/call-status.jsx","webpack://tinode-webapp/./src/widgets/chat-message.jsx","webpack://tinode-webapp/./src/widgets/checkbox.jsx","webpack://tinode-webapp/./src/widgets/chip-input.jsx","webpack://tinode-webapp/./src/widgets/chip.jsx","webpack://tinode-webapp/./src/widgets/contact-action.jsx","webpack://tinode-webapp/./src/widgets/contact-badges.jsx","webpack://tinode-webapp/./src/widgets/contact-list.jsx","webpack://tinode-webapp/./src/widgets/contact.jsx","webpack://tinode-webapp/./src/widgets/context-menu.jsx","webpack://tinode-webapp/./src/widgets/cropper.jsx","webpack://tinode-webapp/./src/widgets/doc-preview.jsx","webpack://tinode-webapp/./src/widgets/error-panel.jsx","webpack://tinode-webapp/./src/widgets/file-progress.jsx","webpack://tinode-webapp/./src/widgets/forward-dialog.jsx","webpack://tinode-webapp/./src/widgets/group-manager.jsx","webpack://tinode-webapp/./src/widgets/group-subs.jsx","webpack://tinode-webapp/./src/widgets/host-selector.jsx","webpack://tinode-webapp/./src/widgets/image-preview.jsx","webpack://tinode-webapp/./src/widgets/in-place-edit.jsx","webpack://tinode-webapp/./src/widgets/inline-video.jsx","webpack://tinode-webapp/./src/widgets/invitation.jsx","webpack://tinode-webapp/./src/widgets/lazy-image.jsx","webpack://tinode-webapp/./src/widgets/letter-tile.jsx","webpack://tinode-webapp/./src/widgets/load-spinner.jsx","webpack://tinode-webapp/./src/widgets/menu-cancel.jsx","webpack://tinode-webapp/./src/widgets/menu-contacts.jsx","webpack://tinode-webapp/./src/widgets/menu-start.jsx","webpack://tinode-webapp/./src/widgets/meta-message.jsx","webpack://tinode-webapp/./src/widgets/new-topic-by-id.jsx","webpack://tinode-webapp/./src/widgets/new-topic-group.jsx","webpack://tinode-webapp/./src/widgets/permissions-editor.jsx","webpack://tinode-webapp/./src/widgets/pinned-messages.jsx","webpack://tinode-webapp/./src/widgets/received-marker.jsx","webpack://tinode-webapp/./src/widgets/search-contacts.jsx","webpack://tinode-webapp/./src/widgets/send-message.jsx","webpack://tinode-webapp/./src/widgets/side-navbar.jsx","webpack://tinode-webapp/./src/widgets/tag-manager.jsx","webpack://tinode-webapp/./src/widgets/topic-desc-edit.jsx","webpack://tinode-webapp/./src/widgets/topic-security.jsx","webpack://tinode-webapp/./src/widgets/unread-badge.jsx","webpack://tinode-webapp/./src/widgets/uploading-image.jsx","webpack://tinode-webapp/./src/widgets/vc-carousel-item.jsx","webpack://tinode-webapp/./src/widgets/vc-carousel.jsx","webpack://tinode-webapp/./src/widgets/vc-panel.jsx","webpack://tinode-webapp/./src/widgets/video-preview.jsx","webpack://tinode-webapp/./src/widgets/visible-password.jsx","webpack://tinode-webapp/./node_modules/react-dom/client.js","webpack://tinode-webapp/external var \"React\"","webpack://tinode-webapp/external var \"ReactDOM\"","webpack://tinode-webapp/external var \"ReactIntl\"","webpack://tinode-webapp/external var \"tinode\"","webpack://tinode-webapp/./node_modules/@firebase/app/dist/esm/index.esm2017.js","webpack://tinode-webapp/./node_modules/@firebase/component/dist/esm/index.esm2017.js","webpack://tinode-webapp/./node_modules/@firebase/installations/dist/esm/index.esm2017.js","webpack://tinode-webapp/./node_modules/@firebase/installations/node_modules/idb/build/index.js","webpack://tinode-webapp/./node_modules/@firebase/installations/node_modules/idb/build/wrap-idb-value.js","webpack://tinode-webapp/./node_modules/@firebase/logger/dist/esm/index.esm2017.js","webpack://tinode-webapp/./node_modules/@firebase/messaging/dist/esm/index.esm2017.js","webpack://tinode-webapp/./node_modules/@firebase/messaging/node_modules/idb/build/index.js","webpack://tinode-webapp/./node_modules/@firebase/messaging/node_modules/idb/build/wrap-idb-value.js","webpack://tinode-webapp/./node_modules/firebase/app/dist/esm/index.esm.js","webpack://tinode-webapp/./node_modules/firebase/messaging/dist/esm/index.esm.js","webpack://tinode-webapp/./node_modules/idb/build/index.js","webpack://tinode-webapp/./node_modules/idb/build/wrap-idb-value.js","webpack://tinode-webapp/./node_modules/livekit-client/dist/livekit-client.esm.mjs","webpack://tinode-webapp/webpack/bootstrap","webpack://tinode-webapp/webpack/runtime/compat get default export","webpack://tinode-webapp/webpack/runtime/create fake namespace object","webpack://tinode-webapp/webpack/runtime/define property getters","webpack://tinode-webapp/webpack/runtime/ensure chunk","webpack://tinode-webapp/webpack/runtime/get javascript chunk filename","webpack://tinode-webapp/webpack/runtime/global","webpack://tinode-webapp/webpack/runtime/hasOwnProperty shorthand","webpack://tinode-webapp/webpack/runtime/load script","webpack://tinode-webapp/webpack/runtime/make namespace object","webpack://tinode-webapp/webpack/runtime/publicPath","webpack://tinode-webapp/webpack/runtime/jsonp chunk loading","webpack://tinode-webapp/./src/index.js"],"sourcesContent":["/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Firebase constants. Some of these (@defines) can be overridden at compile-time.\r\n */\r\nconst CONSTANTS = {\r\n /**\r\n * @define {boolean} Whether this is the client Node.js SDK.\r\n */\r\n NODE_CLIENT: false,\r\n /**\r\n * @define {boolean} Whether this is the Admin Node.js SDK.\r\n */\r\n NODE_ADMIN: false,\r\n /**\r\n * Firebase SDK Version\r\n */\r\n SDK_VERSION: '${JSCORE_VERSION}'\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Throws an error if the provided assertion is falsy\r\n */\r\nconst assert = function (assertion, message) {\r\n if (!assertion) {\r\n throw assertionError(message);\r\n }\r\n};\r\n/**\r\n * Returns an Error object suitable for throwing.\r\n */\r\nconst assertionError = function (message) {\r\n return new Error('Firebase Database (' +\r\n CONSTANTS.SDK_VERSION +\r\n ') INTERNAL ASSERT FAILED: ' +\r\n message);\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst stringToByteArray$1 = function (str) {\r\n // TODO(user): Use native implementations if/when available\r\n const out = [];\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n let c = str.charCodeAt(i);\r\n if (c < 128) {\r\n out[p++] = c;\r\n }\r\n else if (c < 2048) {\r\n out[p++] = (c >> 6) | 192;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else if ((c & 0xfc00) === 0xd800 &&\r\n i + 1 < str.length &&\r\n (str.charCodeAt(i + 1) & 0xfc00) === 0xdc00) {\r\n // Surrogate Pair\r\n c = 0x10000 + ((c & 0x03ff) << 10) + (str.charCodeAt(++i) & 0x03ff);\r\n out[p++] = (c >> 18) | 240;\r\n out[p++] = ((c >> 12) & 63) | 128;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else {\r\n out[p++] = (c >> 12) | 224;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n }\r\n return out;\r\n};\r\n/**\r\n * Turns an array of numbers into the string given by the concatenation of the\r\n * characters to which the numbers correspond.\r\n * @param bytes Array of numbers representing characters.\r\n * @return Stringification of the array.\r\n */\r\nconst byteArrayToString = function (bytes) {\r\n // TODO(user): Use native implementations if/when available\r\n const out = [];\r\n let pos = 0, c = 0;\r\n while (pos < bytes.length) {\r\n const c1 = bytes[pos++];\r\n if (c1 < 128) {\r\n out[c++] = String.fromCharCode(c1);\r\n }\r\n else if (c1 > 191 && c1 < 224) {\r\n const c2 = bytes[pos++];\r\n out[c++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));\r\n }\r\n else if (c1 > 239 && c1 < 365) {\r\n // Surrogate Pair\r\n const c2 = bytes[pos++];\r\n const c3 = bytes[pos++];\r\n const c4 = bytes[pos++];\r\n const u = (((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63)) -\r\n 0x10000;\r\n out[c++] = String.fromCharCode(0xd800 + (u >> 10));\r\n out[c++] = String.fromCharCode(0xdc00 + (u & 1023));\r\n }\r\n else {\r\n const c2 = bytes[pos++];\r\n const c3 = bytes[pos++];\r\n out[c++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\r\n }\r\n }\r\n return out.join('');\r\n};\r\n// We define it as an object literal instead of a class because a class compiled down to es5 can't\r\n// be treeshaked. https://github.com/rollup/rollup/issues/1691\r\n// Static lookup maps, lazily populated by init_()\r\nconst base64 = {\r\n /**\r\n * Maps bytes to characters.\r\n */\r\n byteToCharMap_: null,\r\n /**\r\n * Maps characters to bytes.\r\n */\r\n charToByteMap_: null,\r\n /**\r\n * Maps bytes to websafe characters.\r\n * @private\r\n */\r\n byteToCharMapWebSafe_: null,\r\n /**\r\n * Maps websafe characters to bytes.\r\n * @private\r\n */\r\n charToByteMapWebSafe_: null,\r\n /**\r\n * Our default alphabet, shared between\r\n * ENCODED_VALS and ENCODED_VALS_WEBSAFE\r\n */\r\n ENCODED_VALS_BASE: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + 'abcdefghijklmnopqrstuvwxyz' + '0123456789',\r\n /**\r\n * Our default alphabet. Value 64 (=) is special; it means \"nothing.\"\r\n */\r\n get ENCODED_VALS() {\r\n return this.ENCODED_VALS_BASE + '+/=';\r\n },\r\n /**\r\n * Our websafe alphabet.\r\n */\r\n get ENCODED_VALS_WEBSAFE() {\r\n return this.ENCODED_VALS_BASE + '-_.';\r\n },\r\n /**\r\n * Whether this browser supports the atob and btoa functions. This extension\r\n * started at Mozilla but is now implemented by many browsers. We use the\r\n * ASSUME_* variables to avoid pulling in the full useragent detection library\r\n * but still allowing the standard per-browser compilations.\r\n *\r\n */\r\n HAS_NATIVE_SUPPORT: typeof atob === 'function',\r\n /**\r\n * Base64-encode an array of bytes.\r\n *\r\n * @param input An array of bytes (numbers with\r\n * value in [0, 255]) to encode.\r\n * @param webSafe Boolean indicating we should use the\r\n * alternative alphabet.\r\n * @return The base64 encoded string.\r\n */\r\n encodeByteArray(input, webSafe) {\r\n if (!Array.isArray(input)) {\r\n throw Error('encodeByteArray takes an array as a parameter');\r\n }\r\n this.init_();\r\n const byteToCharMap = webSafe\r\n ? this.byteToCharMapWebSafe_\r\n : this.byteToCharMap_;\r\n const output = [];\r\n for (let i = 0; i < input.length; i += 3) {\r\n const byte1 = input[i];\r\n const haveByte2 = i + 1 < input.length;\r\n const byte2 = haveByte2 ? input[i + 1] : 0;\r\n const haveByte3 = i + 2 < input.length;\r\n const byte3 = haveByte3 ? input[i + 2] : 0;\r\n const outByte1 = byte1 >> 2;\r\n const outByte2 = ((byte1 & 0x03) << 4) | (byte2 >> 4);\r\n let outByte3 = ((byte2 & 0x0f) << 2) | (byte3 >> 6);\r\n let outByte4 = byte3 & 0x3f;\r\n if (!haveByte3) {\r\n outByte4 = 64;\r\n if (!haveByte2) {\r\n outByte3 = 64;\r\n }\r\n }\r\n output.push(byteToCharMap[outByte1], byteToCharMap[outByte2], byteToCharMap[outByte3], byteToCharMap[outByte4]);\r\n }\r\n return output.join('');\r\n },\r\n /**\r\n * Base64-encode a string.\r\n *\r\n * @param input A string to encode.\r\n * @param webSafe If true, we should use the\r\n * alternative alphabet.\r\n * @return The base64 encoded string.\r\n */\r\n encodeString(input, webSafe) {\r\n // Shortcut for Mozilla browsers that implement\r\n // a native base64 encoder in the form of \"btoa/atob\"\r\n if (this.HAS_NATIVE_SUPPORT && !webSafe) {\r\n return btoa(input);\r\n }\r\n return this.encodeByteArray(stringToByteArray$1(input), webSafe);\r\n },\r\n /**\r\n * Base64-decode a string.\r\n *\r\n * @param input to decode.\r\n * @param webSafe True if we should use the\r\n * alternative alphabet.\r\n * @return string representing the decoded value.\r\n */\r\n decodeString(input, webSafe) {\r\n // Shortcut for Mozilla browsers that implement\r\n // a native base64 encoder in the form of \"btoa/atob\"\r\n if (this.HAS_NATIVE_SUPPORT && !webSafe) {\r\n return atob(input);\r\n }\r\n return byteArrayToString(this.decodeStringToByteArray(input, webSafe));\r\n },\r\n /**\r\n * Base64-decode a string.\r\n *\r\n * In base-64 decoding, groups of four characters are converted into three\r\n * bytes. If the encoder did not apply padding, the input length may not\r\n * be a multiple of 4.\r\n *\r\n * In this case, the last group will have fewer than 4 characters, and\r\n * padding will be inferred. If the group has one or two characters, it decodes\r\n * to one byte. If the group has three characters, it decodes to two bytes.\r\n *\r\n * @param input Input to decode.\r\n * @param webSafe True if we should use the web-safe alphabet.\r\n * @return bytes representing the decoded value.\r\n */\r\n decodeStringToByteArray(input, webSafe) {\r\n this.init_();\r\n const charToByteMap = webSafe\r\n ? this.charToByteMapWebSafe_\r\n : this.charToByteMap_;\r\n const output = [];\r\n for (let i = 0; i < input.length;) {\r\n const byte1 = charToByteMap[input.charAt(i++)];\r\n const haveByte2 = i < input.length;\r\n const byte2 = haveByte2 ? charToByteMap[input.charAt(i)] : 0;\r\n ++i;\r\n const haveByte3 = i < input.length;\r\n const byte3 = haveByte3 ? charToByteMap[input.charAt(i)] : 64;\r\n ++i;\r\n const haveByte4 = i < input.length;\r\n const byte4 = haveByte4 ? charToByteMap[input.charAt(i)] : 64;\r\n ++i;\r\n if (byte1 == null || byte2 == null || byte3 == null || byte4 == null) {\r\n throw new DecodeBase64StringError();\r\n }\r\n const outByte1 = (byte1 << 2) | (byte2 >> 4);\r\n output.push(outByte1);\r\n if (byte3 !== 64) {\r\n const outByte2 = ((byte2 << 4) & 0xf0) | (byte3 >> 2);\r\n output.push(outByte2);\r\n if (byte4 !== 64) {\r\n const outByte3 = ((byte3 << 6) & 0xc0) | byte4;\r\n output.push(outByte3);\r\n }\r\n }\r\n }\r\n return output;\r\n },\r\n /**\r\n * Lazy static initialization function. Called before\r\n * accessing any of the static map variables.\r\n * @private\r\n */\r\n init_() {\r\n if (!this.byteToCharMap_) {\r\n this.byteToCharMap_ = {};\r\n this.charToByteMap_ = {};\r\n this.byteToCharMapWebSafe_ = {};\r\n this.charToByteMapWebSafe_ = {};\r\n // We want quick mappings back and forth, so we precompute two maps.\r\n for (let i = 0; i < this.ENCODED_VALS.length; i++) {\r\n this.byteToCharMap_[i] = this.ENCODED_VALS.charAt(i);\r\n this.charToByteMap_[this.byteToCharMap_[i]] = i;\r\n this.byteToCharMapWebSafe_[i] = this.ENCODED_VALS_WEBSAFE.charAt(i);\r\n this.charToByteMapWebSafe_[this.byteToCharMapWebSafe_[i]] = i;\r\n // Be forgiving when decoding and correctly decode both encodings.\r\n if (i >= this.ENCODED_VALS_BASE.length) {\r\n this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(i)] = i;\r\n this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(i)] = i;\r\n }\r\n }\r\n }\r\n }\r\n};\r\n/**\r\n * An error encountered while decoding base64 string.\r\n */\r\nclass DecodeBase64StringError extends Error {\r\n constructor() {\r\n super(...arguments);\r\n this.name = 'DecodeBase64StringError';\r\n }\r\n}\r\n/**\r\n * URL-safe base64 encoding\r\n */\r\nconst base64Encode = function (str) {\r\n const utf8Bytes = stringToByteArray$1(str);\r\n return base64.encodeByteArray(utf8Bytes, true);\r\n};\r\n/**\r\n * URL-safe base64 encoding (without \".\" padding in the end).\r\n * e.g. Used in JSON Web Token (JWT) parts.\r\n */\r\nconst base64urlEncodeWithoutPadding = function (str) {\r\n // Use base64url encoding and remove padding in the end (dot characters).\r\n return base64Encode(str).replace(/\\./g, '');\r\n};\r\n/**\r\n * URL-safe base64 decoding\r\n *\r\n * NOTE: DO NOT use the global atob() function - it does NOT support the\r\n * base64Url variant encoding.\r\n *\r\n * @param str To be decoded\r\n * @return Decoded result, if possible\r\n */\r\nconst base64Decode = function (str) {\r\n try {\r\n return base64.decodeString(str, true);\r\n }\r\n catch (e) {\r\n console.error('base64Decode failed: ', e);\r\n }\r\n return null;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Do a deep-copy of basic JavaScript Objects or Arrays.\r\n */\r\nfunction deepCopy(value) {\r\n return deepExtend(undefined, value);\r\n}\r\n/**\r\n * Copy properties from source to target (recursively allows extension\r\n * of Objects and Arrays). Scalar values in the target are over-written.\r\n * If target is undefined, an object of the appropriate type will be created\r\n * (and returned).\r\n *\r\n * We recursively copy all child properties of plain Objects in the source- so\r\n * that namespace- like dictionaries are merged.\r\n *\r\n * Note that the target can be a function, in which case the properties in\r\n * the source Object are copied onto it as static properties of the Function.\r\n *\r\n * Note: we don't merge __proto__ to prevent prototype pollution\r\n */\r\nfunction deepExtend(target, source) {\r\n if (!(source instanceof Object)) {\r\n return source;\r\n }\r\n switch (source.constructor) {\r\n case Date:\r\n // Treat Dates like scalars; if the target date object had any child\r\n // properties - they will be lost!\r\n const dateValue = source;\r\n return new Date(dateValue.getTime());\r\n case Object:\r\n if (target === undefined) {\r\n target = {};\r\n }\r\n break;\r\n case Array:\r\n // Always copy the array source and overwrite the target.\r\n target = [];\r\n break;\r\n default:\r\n // Not a plain Object - treat it as a scalar.\r\n return source;\r\n }\r\n for (const prop in source) {\r\n // use isValidKey to guard against prototype pollution. See https://snyk.io/vuln/SNYK-JS-LODASH-450202\r\n if (!source.hasOwnProperty(prop) || !isValidKey(prop)) {\r\n continue;\r\n }\r\n target[prop] = deepExtend(target[prop], source[prop]);\r\n }\r\n return target;\r\n}\r\nfunction isValidKey(key) {\r\n return key !== '__proto__';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Polyfill for `globalThis` object.\r\n * @returns the `globalThis` object for the given environment.\r\n * @public\r\n */\r\nfunction getGlobal() {\r\n if (typeof self !== 'undefined') {\r\n return self;\r\n }\r\n if (typeof window !== 'undefined') {\r\n return window;\r\n }\r\n if (typeof global !== 'undefined') {\r\n return global;\r\n }\r\n throw new Error('Unable to locate global object.');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nconst getDefaultsFromGlobal = () => getGlobal().__FIREBASE_DEFAULTS__;\r\n/**\r\n * Attempt to read defaults from a JSON string provided to\r\n * process(.)env(.)__FIREBASE_DEFAULTS__ or a JSON file whose path is in\r\n * process(.)env(.)__FIREBASE_DEFAULTS_PATH__\r\n * The dots are in parens because certain compilers (Vite?) cannot\r\n * handle seeing that variable in comments.\r\n * See https://github.com/firebase/firebase-js-sdk/issues/6838\r\n */\r\nconst getDefaultsFromEnvVariable = () => {\r\n if (typeof process === 'undefined' || typeof process.env === 'undefined') {\r\n return;\r\n }\r\n const defaultsJsonString = process.env.__FIREBASE_DEFAULTS__;\r\n if (defaultsJsonString) {\r\n return JSON.parse(defaultsJsonString);\r\n }\r\n};\r\nconst getDefaultsFromCookie = () => {\r\n if (typeof document === 'undefined') {\r\n return;\r\n }\r\n let match;\r\n try {\r\n match = document.cookie.match(/__FIREBASE_DEFAULTS__=([^;]+)/);\r\n }\r\n catch (e) {\r\n // Some environments such as Angular Universal SSR have a\r\n // `document` object but error on accessing `document.cookie`.\r\n return;\r\n }\r\n const decoded = match && base64Decode(match[1]);\r\n return decoded && JSON.parse(decoded);\r\n};\r\n/**\r\n * Get the __FIREBASE_DEFAULTS__ object. It checks in order:\r\n * (1) if such an object exists as a property of `globalThis`\r\n * (2) if such an object was provided on a shell environment variable\r\n * (3) if such an object exists in a cookie\r\n * @public\r\n */\r\nconst getDefaults = () => {\r\n try {\r\n return (getDefaultsFromGlobal() ||\r\n getDefaultsFromEnvVariable() ||\r\n getDefaultsFromCookie());\r\n }\r\n catch (e) {\r\n /**\r\n * Catch-all for being unable to get __FIREBASE_DEFAULTS__ due\r\n * to any environment case we have not accounted for. Log to\r\n * info instead of swallowing so we can find these unknown cases\r\n * and add paths for them if needed.\r\n */\r\n console.info(`Unable to get __FIREBASE_DEFAULTS__ due to: ${e}`);\r\n return;\r\n }\r\n};\r\n/**\r\n * Returns emulator host stored in the __FIREBASE_DEFAULTS__ object\r\n * for the given product.\r\n * @returns a URL host formatted like `127.0.0.1:9999` or `[::1]:4000` if available\r\n * @public\r\n */\r\nconst getDefaultEmulatorHost = (productName) => { var _a, _b; return (_b = (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a.emulatorHosts) === null || _b === void 0 ? void 0 : _b[productName]; };\r\n/**\r\n * Returns emulator hostname and port stored in the __FIREBASE_DEFAULTS__ object\r\n * for the given product.\r\n * @returns a pair of hostname and port like `[\"::1\", 4000]` if available\r\n * @public\r\n */\r\nconst getDefaultEmulatorHostnameAndPort = (productName) => {\r\n const host = getDefaultEmulatorHost(productName);\r\n if (!host) {\r\n return undefined;\r\n }\r\n const separatorIndex = host.lastIndexOf(':'); // Finding the last since IPv6 addr also has colons.\r\n if (separatorIndex <= 0 || separatorIndex + 1 === host.length) {\r\n throw new Error(`Invalid host ${host} with no separate hostname and port!`);\r\n }\r\n // eslint-disable-next-line no-restricted-globals\r\n const port = parseInt(host.substring(separatorIndex + 1), 10);\r\n if (host[0] === '[') {\r\n // Bracket-quoted `[ipv6addr]:port` => return \"ipv6addr\" (without brackets).\r\n return [host.substring(1, separatorIndex - 1), port];\r\n }\r\n else {\r\n return [host.substring(0, separatorIndex), port];\r\n }\r\n};\r\n/**\r\n * Returns Firebase app config stored in the __FIREBASE_DEFAULTS__ object.\r\n * @public\r\n */\r\nconst getDefaultAppConfig = () => { var _a; return (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a.config; };\r\n/**\r\n * Returns an experimental setting on the __FIREBASE_DEFAULTS__ object (properties\r\n * prefixed by \"_\")\r\n * @public\r\n */\r\nconst getExperimentalSetting = (name) => { var _a; return (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a[`_${name}`]; };\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nclass Deferred {\r\n constructor() {\r\n this.reject = () => { };\r\n this.resolve = () => { };\r\n this.promise = new Promise((resolve, reject) => {\r\n this.resolve = resolve;\r\n this.reject = reject;\r\n });\r\n }\r\n /**\r\n * Our API internals are not promiseified and cannot because our callback APIs have subtle expectations around\r\n * invoking promises inline, which Promises are forbidden to do. This method accepts an optional node-style callback\r\n * and returns a node-style callback which will resolve or reject the Deferred's promise.\r\n */\r\n wrapCallback(callback) {\r\n return (error, value) => {\r\n if (error) {\r\n this.reject(error);\r\n }\r\n else {\r\n this.resolve(value);\r\n }\r\n if (typeof callback === 'function') {\r\n // Attaching noop handler just in case developer wasn't expecting\r\n // promises\r\n this.promise.catch(() => { });\r\n // Some of our callbacks don't expect a value and our own tests\r\n // assert that the parameter length is 1\r\n if (callback.length === 1) {\r\n callback(error);\r\n }\r\n else {\r\n callback(error, value);\r\n }\r\n }\r\n };\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction createMockUserToken(token, projectId) {\r\n if (token.uid) {\r\n throw new Error('The \"uid\" field is no longer supported by mockUserToken. Please use \"sub\" instead for Firebase Auth User ID.');\r\n }\r\n // Unsecured JWTs use \"none\" as the algorithm.\r\n const header = {\r\n alg: 'none',\r\n type: 'JWT'\r\n };\r\n const project = projectId || 'demo-project';\r\n const iat = token.iat || 0;\r\n const sub = token.sub || token.user_id;\r\n if (!sub) {\r\n throw new Error(\"mockUserToken must contain 'sub' or 'user_id' field!\");\r\n }\r\n const payload = Object.assign({ \r\n // Set all required fields to decent defaults\r\n iss: `https://securetoken.google.com/${project}`, aud: project, iat, exp: iat + 3600, auth_time: iat, sub, user_id: sub, firebase: {\r\n sign_in_provider: 'custom',\r\n identities: {}\r\n } }, token);\r\n // Unsecured JWTs use the empty string as a signature.\r\n const signature = '';\r\n return [\r\n base64urlEncodeWithoutPadding(JSON.stringify(header)),\r\n base64urlEncodeWithoutPadding(JSON.stringify(payload)),\r\n signature\r\n ].join('.');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns navigator.userAgent string or '' if it's not defined.\r\n * @return user agent string\r\n */\r\nfunction getUA() {\r\n if (typeof navigator !== 'undefined' &&\r\n typeof navigator['userAgent'] === 'string') {\r\n return navigator['userAgent'];\r\n }\r\n else {\r\n return '';\r\n }\r\n}\r\n/**\r\n * Detect Cordova / PhoneGap / Ionic frameworks on a mobile device.\r\n *\r\n * Deliberately does not rely on checking `file://` URLs (as this fails PhoneGap\r\n * in the Ripple emulator) nor Cordova `onDeviceReady`, which would normally\r\n * wait for a callback.\r\n */\r\nfunction isMobileCordova() {\r\n return (typeof window !== 'undefined' &&\r\n // @ts-ignore Setting up an broadly applicable index signature for Window\r\n // just to deal with this case would probably be a bad idea.\r\n !!(window['cordova'] || window['phonegap'] || window['PhoneGap']) &&\r\n /ios|iphone|ipod|ipad|android|blackberry|iemobile/i.test(getUA()));\r\n}\r\n/**\r\n * Detect Node.js.\r\n *\r\n * @return true if Node.js environment is detected or specified.\r\n */\r\n// Node detection logic from: https://github.com/iliakan/detect-node/\r\nfunction isNode() {\r\n var _a;\r\n const forceEnvironment = (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a.forceEnvironment;\r\n if (forceEnvironment === 'node') {\r\n return true;\r\n }\r\n else if (forceEnvironment === 'browser') {\r\n return false;\r\n }\r\n try {\r\n return (Object.prototype.toString.call(global.process) === '[object process]');\r\n }\r\n catch (e) {\r\n return false;\r\n }\r\n}\r\n/**\r\n * Detect Browser Environment\r\n */\r\nfunction isBrowser() {\r\n return typeof self === 'object' && self.self === self;\r\n}\r\nfunction isBrowserExtension() {\r\n const runtime = typeof chrome === 'object'\r\n ? chrome.runtime\r\n : typeof browser === 'object'\r\n ? browser.runtime\r\n : undefined;\r\n return typeof runtime === 'object' && runtime.id !== undefined;\r\n}\r\n/**\r\n * Detect React Native.\r\n *\r\n * @return true if ReactNative environment is detected.\r\n */\r\nfunction isReactNative() {\r\n return (typeof navigator === 'object' && navigator['product'] === 'ReactNative');\r\n}\r\n/** Detects Electron apps. */\r\nfunction isElectron() {\r\n return getUA().indexOf('Electron/') >= 0;\r\n}\r\n/** Detects Internet Explorer. */\r\nfunction isIE() {\r\n const ua = getUA();\r\n return ua.indexOf('MSIE ') >= 0 || ua.indexOf('Trident/') >= 0;\r\n}\r\n/** Detects Universal Windows Platform apps. */\r\nfunction isUWP() {\r\n return getUA().indexOf('MSAppHost/') >= 0;\r\n}\r\n/**\r\n * Detect whether the current SDK build is the Node version.\r\n *\r\n * @return true if it's the Node SDK build.\r\n */\r\nfunction isNodeSdk() {\r\n return CONSTANTS.NODE_CLIENT === true || CONSTANTS.NODE_ADMIN === true;\r\n}\r\n/** Returns true if we are running in Safari. */\r\nfunction isSafari() {\r\n return (!isNode() &&\r\n navigator.userAgent.includes('Safari') &&\r\n !navigator.userAgent.includes('Chrome'));\r\n}\r\n/**\r\n * This method checks if indexedDB is supported by current browser/service worker context\r\n * @return true if indexedDB is supported by current browser/service worker context\r\n */\r\nfunction isIndexedDBAvailable() {\r\n try {\r\n return typeof indexedDB === 'object';\r\n }\r\n catch (e) {\r\n return false;\r\n }\r\n}\r\n/**\r\n * This method validates browser/sw context for indexedDB by opening a dummy indexedDB database and reject\r\n * if errors occur during the database open operation.\r\n *\r\n * @throws exception if current browser/sw context can't run idb.open (ex: Safari iframe, Firefox\r\n * private browsing)\r\n */\r\nfunction validateIndexedDBOpenable() {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n let preExist = true;\r\n const DB_CHECK_NAME = 'validate-browser-context-for-indexeddb-analytics-module';\r\n const request = self.indexedDB.open(DB_CHECK_NAME);\r\n request.onsuccess = () => {\r\n request.result.close();\r\n // delete database only when it doesn't pre-exist\r\n if (!preExist) {\r\n self.indexedDB.deleteDatabase(DB_CHECK_NAME);\r\n }\r\n resolve(true);\r\n };\r\n request.onupgradeneeded = () => {\r\n preExist = false;\r\n };\r\n request.onerror = () => {\r\n var _a;\r\n reject(((_a = request.error) === null || _a === void 0 ? void 0 : _a.message) || '');\r\n };\r\n }\r\n catch (error) {\r\n reject(error);\r\n }\r\n });\r\n}\r\n/**\r\n *\r\n * This method checks whether cookie is enabled within current browser\r\n * @return true if cookie is enabled within current browser\r\n */\r\nfunction areCookiesEnabled() {\r\n if (typeof navigator === 'undefined' || !navigator.cookieEnabled) {\r\n return false;\r\n }\r\n return true;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Standardized Firebase Error.\r\n *\r\n * Usage:\r\n *\r\n * // Typescript string literals for type-safe codes\r\n * type Err =\r\n * 'unknown' |\r\n * 'object-not-found'\r\n * ;\r\n *\r\n * // Closure enum for type-safe error codes\r\n * // at-enum {string}\r\n * var Err = {\r\n * UNKNOWN: 'unknown',\r\n * OBJECT_NOT_FOUND: 'object-not-found',\r\n * }\r\n *\r\n * let errors: Map = {\r\n * 'generic-error': \"Unknown error\",\r\n * 'file-not-found': \"Could not find file: {$file}\",\r\n * };\r\n *\r\n * // Type-safe function - must pass a valid error code as param.\r\n * let error = new ErrorFactory('service', 'Service', errors);\r\n *\r\n * ...\r\n * throw error.create(Err.GENERIC);\r\n * ...\r\n * throw error.create(Err.FILE_NOT_FOUND, {'file': fileName});\r\n * ...\r\n * // Service: Could not file file: foo.txt (service/file-not-found).\r\n *\r\n * catch (e) {\r\n * assert(e.message === \"Could not find file: foo.txt.\");\r\n * if ((e as FirebaseError)?.code === 'service/file-not-found') {\r\n * console.log(\"Could not read file: \" + e['file']);\r\n * }\r\n * }\r\n */\r\nconst ERROR_NAME = 'FirebaseError';\r\n// Based on code from:\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Custom_Error_Types\r\nclass FirebaseError extends Error {\r\n constructor(\r\n /** The error code for this error. */\r\n code, message, \r\n /** Custom data for this error. */\r\n customData) {\r\n super(message);\r\n this.code = code;\r\n this.customData = customData;\r\n /** The custom name for all FirebaseErrors. */\r\n this.name = ERROR_NAME;\r\n // Fix For ES5\r\n // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\r\n Object.setPrototypeOf(this, FirebaseError.prototype);\r\n // Maintains proper stack trace for where our error was thrown.\r\n // Only available on V8.\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, ErrorFactory.prototype.create);\r\n }\r\n }\r\n}\r\nclass ErrorFactory {\r\n constructor(service, serviceName, errors) {\r\n this.service = service;\r\n this.serviceName = serviceName;\r\n this.errors = errors;\r\n }\r\n create(code, ...data) {\r\n const customData = data[0] || {};\r\n const fullCode = `${this.service}/${code}`;\r\n const template = this.errors[code];\r\n const message = template ? replaceTemplate(template, customData) : 'Error';\r\n // Service Name: Error message (service/code).\r\n const fullMessage = `${this.serviceName}: ${message} (${fullCode}).`;\r\n const error = new FirebaseError(fullCode, fullMessage, customData);\r\n return error;\r\n }\r\n}\r\nfunction replaceTemplate(template, data) {\r\n return template.replace(PATTERN, (_, key) => {\r\n const value = data[key];\r\n return value != null ? String(value) : `<${key}?>`;\r\n });\r\n}\r\nconst PATTERN = /\\{\\$([^}]+)}/g;\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Evaluates a JSON string into a javascript object.\r\n *\r\n * @param {string} str A string containing JSON.\r\n * @return {*} The javascript object representing the specified JSON.\r\n */\r\nfunction jsonEval(str) {\r\n return JSON.parse(str);\r\n}\r\n/**\r\n * Returns JSON representing a javascript object.\r\n * @param {*} data Javascript object to be stringified.\r\n * @return {string} The JSON contents of the object.\r\n */\r\nfunction stringify(data) {\r\n return JSON.stringify(data);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Decodes a Firebase auth. token into constituent parts.\r\n *\r\n * Notes:\r\n * - May return with invalid / incomplete claims if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst decode = function (token) {\r\n let header = {}, claims = {}, data = {}, signature = '';\r\n try {\r\n const parts = token.split('.');\r\n header = jsonEval(base64Decode(parts[0]) || '');\r\n claims = jsonEval(base64Decode(parts[1]) || '');\r\n signature = parts[2];\r\n data = claims['d'] || {};\r\n delete claims['d'];\r\n }\r\n catch (e) { }\r\n return {\r\n header,\r\n claims,\r\n data,\r\n signature\r\n };\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and checks the validity of its time-based claims. Will return true if the\r\n * token is within the time window authorized by the 'nbf' (not-before) and 'iat' (issued-at) claims.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isValidTimestamp = function (token) {\r\n const claims = decode(token).claims;\r\n const now = Math.floor(new Date().getTime() / 1000);\r\n let validSince = 0, validUntil = 0;\r\n if (typeof claims === 'object') {\r\n if (claims.hasOwnProperty('nbf')) {\r\n validSince = claims['nbf'];\r\n }\r\n else if (claims.hasOwnProperty('iat')) {\r\n validSince = claims['iat'];\r\n }\r\n if (claims.hasOwnProperty('exp')) {\r\n validUntil = claims['exp'];\r\n }\r\n else {\r\n // token will expire after 24h by default\r\n validUntil = validSince + 86400;\r\n }\r\n }\r\n return (!!now &&\r\n !!validSince &&\r\n !!validUntil &&\r\n now >= validSince &&\r\n now <= validUntil);\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and returns its issued at time if valid, null otherwise.\r\n *\r\n * Notes:\r\n * - May return null if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst issuedAtTime = function (token) {\r\n const claims = decode(token).claims;\r\n if (typeof claims === 'object' && claims.hasOwnProperty('iat')) {\r\n return claims['iat'];\r\n }\r\n return null;\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and checks the validity of its format. Expects a valid issued-at time.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isValidFormat = function (token) {\r\n const decoded = decode(token), claims = decoded.claims;\r\n return !!claims && typeof claims === 'object' && claims.hasOwnProperty('iat');\r\n};\r\n/**\r\n * Attempts to peer into an auth token and determine if it's an admin auth token by looking at the claims portion.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n */\r\nconst isAdmin = function (token) {\r\n const claims = decode(token).claims;\r\n return typeof claims === 'object' && claims['admin'] === true;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction contains(obj, key) {\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n}\r\nfunction safeGet(obj, key) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n return obj[key];\r\n }\r\n else {\r\n return undefined;\r\n }\r\n}\r\nfunction isEmpty(obj) {\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction map(obj, fn, contextObj) {\r\n const res = {};\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n res[key] = fn.call(contextObj, obj[key], key, obj);\r\n }\r\n }\r\n return res;\r\n}\r\n/**\r\n * Deep equal two objects. Support Arrays and Objects.\r\n */\r\nfunction deepEqual(a, b) {\r\n if (a === b) {\r\n return true;\r\n }\r\n const aKeys = Object.keys(a);\r\n const bKeys = Object.keys(b);\r\n for (const k of aKeys) {\r\n if (!bKeys.includes(k)) {\r\n return false;\r\n }\r\n const aProp = a[k];\r\n const bProp = b[k];\r\n if (isObject(aProp) && isObject(bProp)) {\r\n if (!deepEqual(aProp, bProp)) {\r\n return false;\r\n }\r\n }\r\n else if (aProp !== bProp) {\r\n return false;\r\n }\r\n }\r\n for (const k of bKeys) {\r\n if (!aKeys.includes(k)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction isObject(thing) {\r\n return thing !== null && typeof thing === 'object';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Rejects if the given promise doesn't resolve in timeInMS milliseconds.\r\n * @internal\r\n */\r\nfunction promiseWithTimeout(promise, timeInMS = 2000) {\r\n const deferredPromise = new Deferred();\r\n setTimeout(() => deferredPromise.reject('timeout!'), timeInMS);\r\n promise.then(deferredPromise.resolve, deferredPromise.reject);\r\n return deferredPromise.promise;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a querystring-formatted string (e.g. &arg=val&arg2=val2) from a\r\n * params object (e.g. {arg: 'val', arg2: 'val2'})\r\n * Note: You must prepend it with ? when adding it to a URL.\r\n */\r\nfunction querystring(querystringParams) {\r\n const params = [];\r\n for (const [key, value] of Object.entries(querystringParams)) {\r\n if (Array.isArray(value)) {\r\n value.forEach(arrayVal => {\r\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(arrayVal));\r\n });\r\n }\r\n else {\r\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\r\n }\r\n }\r\n return params.length ? '&' + params.join('&') : '';\r\n}\r\n/**\r\n * Decodes a querystring (e.g. ?arg=val&arg2=val2) into a params object\r\n * (e.g. {arg: 'val', arg2: 'val2'})\r\n */\r\nfunction querystringDecode(querystring) {\r\n const obj = {};\r\n const tokens = querystring.replace(/^\\?/, '').split('&');\r\n tokens.forEach(token => {\r\n if (token) {\r\n const [key, value] = token.split('=');\r\n obj[decodeURIComponent(key)] = decodeURIComponent(value);\r\n }\r\n });\r\n return obj;\r\n}\r\n/**\r\n * Extract the query string part of a URL, including the leading question mark (if present).\r\n */\r\nfunction extractQuerystring(url) {\r\n const queryStart = url.indexOf('?');\r\n if (!queryStart) {\r\n return '';\r\n }\r\n const fragmentStart = url.indexOf('#', queryStart);\r\n return url.substring(queryStart, fragmentStart > 0 ? fragmentStart : undefined);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview SHA-1 cryptographic hash.\r\n * Variable names follow the notation in FIPS PUB 180-3:\r\n * http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf.\r\n *\r\n * Usage:\r\n * var sha1 = new sha1();\r\n * sha1.update(bytes);\r\n * var hash = sha1.digest();\r\n *\r\n * Performance:\r\n * Chrome 23: ~400 Mbit/s\r\n * Firefox 16: ~250 Mbit/s\r\n *\r\n */\r\n/**\r\n * SHA-1 cryptographic hash constructor.\r\n *\r\n * The properties declared here are discussed in the above algorithm document.\r\n * @constructor\r\n * @final\r\n * @struct\r\n */\r\nclass Sha1 {\r\n constructor() {\r\n /**\r\n * Holds the previous values of accumulated variables a-e in the compress_\r\n * function.\r\n * @private\r\n */\r\n this.chain_ = [];\r\n /**\r\n * A buffer holding the partially computed hash result.\r\n * @private\r\n */\r\n this.buf_ = [];\r\n /**\r\n * An array of 80 bytes, each a part of the message to be hashed. Referred to\r\n * as the message schedule in the docs.\r\n * @private\r\n */\r\n this.W_ = [];\r\n /**\r\n * Contains data needed to pad messages less than 64 bytes.\r\n * @private\r\n */\r\n this.pad_ = [];\r\n /**\r\n * @private {number}\r\n */\r\n this.inbuf_ = 0;\r\n /**\r\n * @private {number}\r\n */\r\n this.total_ = 0;\r\n this.blockSize = 512 / 8;\r\n this.pad_[0] = 128;\r\n for (let i = 1; i < this.blockSize; ++i) {\r\n this.pad_[i] = 0;\r\n }\r\n this.reset();\r\n }\r\n reset() {\r\n this.chain_[0] = 0x67452301;\r\n this.chain_[1] = 0xefcdab89;\r\n this.chain_[2] = 0x98badcfe;\r\n this.chain_[3] = 0x10325476;\r\n this.chain_[4] = 0xc3d2e1f0;\r\n this.inbuf_ = 0;\r\n this.total_ = 0;\r\n }\r\n /**\r\n * Internal compress helper function.\r\n * @param buf Block to compress.\r\n * @param offset Offset of the block in the buffer.\r\n * @private\r\n */\r\n compress_(buf, offset) {\r\n if (!offset) {\r\n offset = 0;\r\n }\r\n const W = this.W_;\r\n // get 16 big endian words\r\n if (typeof buf === 'string') {\r\n for (let i = 0; i < 16; i++) {\r\n // TODO(user): [bug 8140122] Recent versions of Safari for Mac OS and iOS\r\n // have a bug that turns the post-increment ++ operator into pre-increment\r\n // during JIT compilation. We have code that depends heavily on SHA-1 for\r\n // correctness and which is affected by this bug, so I've removed all uses\r\n // of post-increment ++ in which the result value is used. We can revert\r\n // this change once the Safari bug\r\n // (https://bugs.webkit.org/show_bug.cgi?id=109036) has been fixed and\r\n // most clients have been updated.\r\n W[i] =\r\n (buf.charCodeAt(offset) << 24) |\r\n (buf.charCodeAt(offset + 1) << 16) |\r\n (buf.charCodeAt(offset + 2) << 8) |\r\n buf.charCodeAt(offset + 3);\r\n offset += 4;\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < 16; i++) {\r\n W[i] =\r\n (buf[offset] << 24) |\r\n (buf[offset + 1] << 16) |\r\n (buf[offset + 2] << 8) |\r\n buf[offset + 3];\r\n offset += 4;\r\n }\r\n }\r\n // expand to 80 words\r\n for (let i = 16; i < 80; i++) {\r\n const t = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\r\n W[i] = ((t << 1) | (t >>> 31)) & 0xffffffff;\r\n }\r\n let a = this.chain_[0];\r\n let b = this.chain_[1];\r\n let c = this.chain_[2];\r\n let d = this.chain_[3];\r\n let e = this.chain_[4];\r\n let f, k;\r\n // TODO(user): Try to unroll this loop to speed up the computation.\r\n for (let i = 0; i < 80; i++) {\r\n if (i < 40) {\r\n if (i < 20) {\r\n f = d ^ (b & (c ^ d));\r\n k = 0x5a827999;\r\n }\r\n else {\r\n f = b ^ c ^ d;\r\n k = 0x6ed9eba1;\r\n }\r\n }\r\n else {\r\n if (i < 60) {\r\n f = (b & c) | (d & (b | c));\r\n k = 0x8f1bbcdc;\r\n }\r\n else {\r\n f = b ^ c ^ d;\r\n k = 0xca62c1d6;\r\n }\r\n }\r\n const t = (((a << 5) | (a >>> 27)) + f + e + k + W[i]) & 0xffffffff;\r\n e = d;\r\n d = c;\r\n c = ((b << 30) | (b >>> 2)) & 0xffffffff;\r\n b = a;\r\n a = t;\r\n }\r\n this.chain_[0] = (this.chain_[0] + a) & 0xffffffff;\r\n this.chain_[1] = (this.chain_[1] + b) & 0xffffffff;\r\n this.chain_[2] = (this.chain_[2] + c) & 0xffffffff;\r\n this.chain_[3] = (this.chain_[3] + d) & 0xffffffff;\r\n this.chain_[4] = (this.chain_[4] + e) & 0xffffffff;\r\n }\r\n update(bytes, length) {\r\n // TODO(johnlenz): tighten the function signature and remove this check\r\n if (bytes == null) {\r\n return;\r\n }\r\n if (length === undefined) {\r\n length = bytes.length;\r\n }\r\n const lengthMinusBlock = length - this.blockSize;\r\n let n = 0;\r\n // Using local instead of member variables gives ~5% speedup on Firefox 16.\r\n const buf = this.buf_;\r\n let inbuf = this.inbuf_;\r\n // The outer while loop should execute at most twice.\r\n while (n < length) {\r\n // When we have no data in the block to top up, we can directly process the\r\n // input buffer (assuming it contains sufficient data). This gives ~25%\r\n // speedup on Chrome 23 and ~15% speedup on Firefox 16, but requires that\r\n // the data is provided in large chunks (or in multiples of 64 bytes).\r\n if (inbuf === 0) {\r\n while (n <= lengthMinusBlock) {\r\n this.compress_(bytes, n);\r\n n += this.blockSize;\r\n }\r\n }\r\n if (typeof bytes === 'string') {\r\n while (n < length) {\r\n buf[inbuf] = bytes.charCodeAt(n);\r\n ++inbuf;\r\n ++n;\r\n if (inbuf === this.blockSize) {\r\n this.compress_(buf);\r\n inbuf = 0;\r\n // Jump to the outer loop so we use the full-block optimization.\r\n break;\r\n }\r\n }\r\n }\r\n else {\r\n while (n < length) {\r\n buf[inbuf] = bytes[n];\r\n ++inbuf;\r\n ++n;\r\n if (inbuf === this.blockSize) {\r\n this.compress_(buf);\r\n inbuf = 0;\r\n // Jump to the outer loop so we use the full-block optimization.\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n this.inbuf_ = inbuf;\r\n this.total_ += length;\r\n }\r\n /** @override */\r\n digest() {\r\n const digest = [];\r\n let totalBits = this.total_ * 8;\r\n // Add pad 0x80 0x00*.\r\n if (this.inbuf_ < 56) {\r\n this.update(this.pad_, 56 - this.inbuf_);\r\n }\r\n else {\r\n this.update(this.pad_, this.blockSize - (this.inbuf_ - 56));\r\n }\r\n // Add # bits.\r\n for (let i = this.blockSize - 1; i >= 56; i--) {\r\n this.buf_[i] = totalBits & 255;\r\n totalBits /= 256; // Don't use bit-shifting here!\r\n }\r\n this.compress_(this.buf_);\r\n let n = 0;\r\n for (let i = 0; i < 5; i++) {\r\n for (let j = 24; j >= 0; j -= 8) {\r\n digest[n] = (this.chain_[i] >> j) & 255;\r\n ++n;\r\n }\r\n }\r\n return digest;\r\n }\r\n}\n\n/**\r\n * Helper to make a Subscribe function (just like Promise helps make a\r\n * Thenable).\r\n *\r\n * @param executor Function which can make calls to a single Observer\r\n * as a proxy.\r\n * @param onNoObservers Callback when count of Observers goes to zero.\r\n */\r\nfunction createSubscribe(executor, onNoObservers) {\r\n const proxy = new ObserverProxy(executor, onNoObservers);\r\n return proxy.subscribe.bind(proxy);\r\n}\r\n/**\r\n * Implement fan-out for any number of Observers attached via a subscribe\r\n * function.\r\n */\r\nclass ObserverProxy {\r\n /**\r\n * @param executor Function which can make calls to a single Observer\r\n * as a proxy.\r\n * @param onNoObservers Callback when count of Observers goes to zero.\r\n */\r\n constructor(executor, onNoObservers) {\r\n this.observers = [];\r\n this.unsubscribes = [];\r\n this.observerCount = 0;\r\n // Micro-task scheduling by calling task.then().\r\n this.task = Promise.resolve();\r\n this.finalized = false;\r\n this.onNoObservers = onNoObservers;\r\n // Call the executor asynchronously so subscribers that are called\r\n // synchronously after the creation of the subscribe function\r\n // can still receive the very first value generated in the executor.\r\n this.task\r\n .then(() => {\r\n executor(this);\r\n })\r\n .catch(e => {\r\n this.error(e);\r\n });\r\n }\r\n next(value) {\r\n this.forEachObserver((observer) => {\r\n observer.next(value);\r\n });\r\n }\r\n error(error) {\r\n this.forEachObserver((observer) => {\r\n observer.error(error);\r\n });\r\n this.close(error);\r\n }\r\n complete() {\r\n this.forEachObserver((observer) => {\r\n observer.complete();\r\n });\r\n this.close();\r\n }\r\n /**\r\n * Subscribe function that can be used to add an Observer to the fan-out list.\r\n *\r\n * - We require that no event is sent to a subscriber sychronously to their\r\n * call to subscribe().\r\n */\r\n subscribe(nextOrObserver, error, complete) {\r\n let observer;\r\n if (nextOrObserver === undefined &&\r\n error === undefined &&\r\n complete === undefined) {\r\n throw new Error('Missing Observer.');\r\n }\r\n // Assemble an Observer object when passed as callback functions.\r\n if (implementsAnyMethods(nextOrObserver, [\r\n 'next',\r\n 'error',\r\n 'complete'\r\n ])) {\r\n observer = nextOrObserver;\r\n }\r\n else {\r\n observer = {\r\n next: nextOrObserver,\r\n error,\r\n complete\r\n };\r\n }\r\n if (observer.next === undefined) {\r\n observer.next = noop;\r\n }\r\n if (observer.error === undefined) {\r\n observer.error = noop;\r\n }\r\n if (observer.complete === undefined) {\r\n observer.complete = noop;\r\n }\r\n const unsub = this.unsubscribeOne.bind(this, this.observers.length);\r\n // Attempt to subscribe to a terminated Observable - we\r\n // just respond to the Observer with the final error or complete\r\n // event.\r\n if (this.finalized) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n try {\r\n if (this.finalError) {\r\n observer.error(this.finalError);\r\n }\r\n else {\r\n observer.complete();\r\n }\r\n }\r\n catch (e) {\r\n // nothing\r\n }\r\n return;\r\n });\r\n }\r\n this.observers.push(observer);\r\n return unsub;\r\n }\r\n // Unsubscribe is synchronous - we guarantee that no events are sent to\r\n // any unsubscribed Observer.\r\n unsubscribeOne(i) {\r\n if (this.observers === undefined || this.observers[i] === undefined) {\r\n return;\r\n }\r\n delete this.observers[i];\r\n this.observerCount -= 1;\r\n if (this.observerCount === 0 && this.onNoObservers !== undefined) {\r\n this.onNoObservers(this);\r\n }\r\n }\r\n forEachObserver(fn) {\r\n if (this.finalized) {\r\n // Already closed by previous event....just eat the additional values.\r\n return;\r\n }\r\n // Since sendOne calls asynchronously - there is no chance that\r\n // this.observers will become undefined.\r\n for (let i = 0; i < this.observers.length; i++) {\r\n this.sendOne(i, fn);\r\n }\r\n }\r\n // Call the Observer via one of it's callback function. We are careful to\r\n // confirm that the observe has not been unsubscribed since this asynchronous\r\n // function had been queued.\r\n sendOne(i, fn) {\r\n // Execute the callback asynchronously\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n if (this.observers !== undefined && this.observers[i] !== undefined) {\r\n try {\r\n fn(this.observers[i]);\r\n }\r\n catch (e) {\r\n // Ignore exceptions raised in Observers or missing methods of an\r\n // Observer.\r\n // Log error to console. b/31404806\r\n if (typeof console !== 'undefined' && console.error) {\r\n console.error(e);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n close(err) {\r\n if (this.finalized) {\r\n return;\r\n }\r\n this.finalized = true;\r\n if (err !== undefined) {\r\n this.finalError = err;\r\n }\r\n // Proxy is no longer needed - garbage collect references\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.task.then(() => {\r\n this.observers = undefined;\r\n this.onNoObservers = undefined;\r\n });\r\n }\r\n}\r\n/** Turn synchronous function into one called asynchronously. */\r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\nfunction async(fn, onError) {\r\n return (...args) => {\r\n Promise.resolve(true)\r\n .then(() => {\r\n fn(...args);\r\n })\r\n .catch((error) => {\r\n if (onError) {\r\n onError(error);\r\n }\r\n });\r\n };\r\n}\r\n/**\r\n * Return true if the object passed in implements any of the named methods.\r\n */\r\nfunction implementsAnyMethods(obj, methods) {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return false;\r\n }\r\n for (const method of methods) {\r\n if (method in obj && typeof obj[method] === 'function') {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\nfunction noop() {\r\n // do nothing\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Check to make sure the appropriate number of arguments are provided for a public function.\r\n * Throws an error if it fails.\r\n *\r\n * @param fnName The function name\r\n * @param minCount The minimum number of arguments to allow for the function call\r\n * @param maxCount The maximum number of argument to allow for the function call\r\n * @param argCount The actual number of arguments provided.\r\n */\r\nconst validateArgCount = function (fnName, minCount, maxCount, argCount) {\r\n let argError;\r\n if (argCount < minCount) {\r\n argError = 'at least ' + minCount;\r\n }\r\n else if (argCount > maxCount) {\r\n argError = maxCount === 0 ? 'none' : 'no more than ' + maxCount;\r\n }\r\n if (argError) {\r\n const error = fnName +\r\n ' failed: Was called with ' +\r\n argCount +\r\n (argCount === 1 ? ' argument.' : ' arguments.') +\r\n ' Expects ' +\r\n argError +\r\n '.';\r\n throw new Error(error);\r\n }\r\n};\r\n/**\r\n * Generates a string to prefix an error message about failed argument validation\r\n *\r\n * @param fnName The function name\r\n * @param argName The name of the argument\r\n * @return The prefix to add to the error thrown for validation.\r\n */\r\nfunction errorPrefix(fnName, argName) {\r\n return `${fnName} failed: ${argName} argument `;\r\n}\r\n/**\r\n * @param fnName\r\n * @param argumentNumber\r\n * @param namespace\r\n * @param optional\r\n */\r\nfunction validateNamespace(fnName, namespace, optional) {\r\n if (optional && !namespace) {\r\n return;\r\n }\r\n if (typeof namespace !== 'string') {\r\n //TODO: I should do more validation here. We only allow certain chars in namespaces.\r\n throw new Error(errorPrefix(fnName, 'namespace') + 'must be a valid firebase namespace.');\r\n }\r\n}\r\nfunction validateCallback(fnName, argumentName, \r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\ncallback, optional) {\r\n if (optional && !callback) {\r\n return;\r\n }\r\n if (typeof callback !== 'function') {\r\n throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid function.');\r\n }\r\n}\r\nfunction validateContextObject(fnName, argumentName, context, optional) {\r\n if (optional && !context) {\r\n return;\r\n }\r\n if (typeof context !== 'object' || context === null) {\r\n throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid context object.');\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Code originally came from goog.crypt.stringToUtf8ByteArray, but for some reason they\r\n// automatically replaced '\\r\\n' with '\\n', and they didn't handle surrogate pairs,\r\n// so it's been modified.\r\n// Note that not all Unicode characters appear as single characters in JavaScript strings.\r\n// fromCharCode returns the UTF-16 encoding of a character - so some Unicode characters\r\n// use 2 characters in Javascript. All 4-byte UTF-8 characters begin with a first\r\n// character in the range 0xD800 - 0xDBFF (the first character of a so-called surrogate\r\n// pair).\r\n// See http://www.ecma-international.org/ecma-262/5.1/#sec-15.1.3\r\n/**\r\n * @param {string} str\r\n * @return {Array}\r\n */\r\nconst stringToByteArray = function (str) {\r\n const out = [];\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n let c = str.charCodeAt(i);\r\n // Is this the lead surrogate in a surrogate pair?\r\n if (c >= 0xd800 && c <= 0xdbff) {\r\n const high = c - 0xd800; // the high 10 bits.\r\n i++;\r\n assert(i < str.length, 'Surrogate pair missing trail surrogate.');\r\n const low = str.charCodeAt(i) - 0xdc00; // the low 10 bits.\r\n c = 0x10000 + (high << 10) + low;\r\n }\r\n if (c < 128) {\r\n out[p++] = c;\r\n }\r\n else if (c < 2048) {\r\n out[p++] = (c >> 6) | 192;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else if (c < 65536) {\r\n out[p++] = (c >> 12) | 224;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else {\r\n out[p++] = (c >> 18) | 240;\r\n out[p++] = ((c >> 12) & 63) | 128;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n }\r\n return out;\r\n};\r\n/**\r\n * Calculate length without actually converting; useful for doing cheaper validation.\r\n * @param {string} str\r\n * @return {number}\r\n */\r\nconst stringLength = function (str) {\r\n let p = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n const c = str.charCodeAt(i);\r\n if (c < 128) {\r\n p++;\r\n }\r\n else if (c < 2048) {\r\n p += 2;\r\n }\r\n else if (c >= 0xd800 && c <= 0xdbff) {\r\n // Lead surrogate of a surrogate pair. The pair together will take 4 bytes to represent.\r\n p += 4;\r\n i++; // skip trail surrogate.\r\n }\r\n else {\r\n p += 3;\r\n }\r\n }\r\n return p;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Copied from https://stackoverflow.com/a/2117523\r\n * Generates a new uuid.\r\n * @public\r\n */\r\nconst uuidv4 = function () {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\r\n const r = (Math.random() * 16) | 0, v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n};\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The amount of milliseconds to exponentially increase.\r\n */\r\nconst DEFAULT_INTERVAL_MILLIS = 1000;\r\n/**\r\n * The factor to backoff by.\r\n * Should be a number greater than 1.\r\n */\r\nconst DEFAULT_BACKOFF_FACTOR = 2;\r\n/**\r\n * The maximum milliseconds to increase to.\r\n *\r\n *

Visible for testing\r\n */\r\nconst MAX_VALUE_MILLIS = 4 * 60 * 60 * 1000; // Four hours, like iOS and Android.\r\n/**\r\n * The percentage of backoff time to randomize by.\r\n * See\r\n * http://go/safe-client-behavior#step-1-determine-the-appropriate-retry-interval-to-handle-spike-traffic\r\n * for context.\r\n *\r\n *

Visible for testing\r\n */\r\nconst RANDOM_FACTOR = 0.5;\r\n/**\r\n * Based on the backoff method from\r\n * https://github.com/google/closure-library/blob/master/closure/goog/math/exponentialbackoff.js.\r\n * Extracted here so we don't need to pass metadata and a stateful ExponentialBackoff object around.\r\n */\r\nfunction calculateBackoffMillis(backoffCount, intervalMillis = DEFAULT_INTERVAL_MILLIS, backoffFactor = DEFAULT_BACKOFF_FACTOR) {\r\n // Calculates an exponentially increasing value.\r\n // Deviation: calculates value from count and a constant interval, so we only need to save value\r\n // and count to restore state.\r\n const currBaseValue = intervalMillis * Math.pow(backoffFactor, backoffCount);\r\n // A random \"fuzz\" to avoid waves of retries.\r\n // Deviation: randomFactor is required.\r\n const randomWait = Math.round(\r\n // A fraction of the backoff value to add/subtract.\r\n // Deviation: changes multiplication order to improve readability.\r\n RANDOM_FACTOR *\r\n currBaseValue *\r\n // A random float (rounded to int by Math.round above) in the range [-1, 1]. Determines\r\n // if we add or subtract.\r\n (Math.random() - 0.5) *\r\n 2);\r\n // Limits backoff to max to avoid effectively permanent backoff.\r\n return Math.min(MAX_VALUE_MILLIS, currBaseValue + randomWait);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provide English ordinal letters after a number\r\n */\r\nfunction ordinal(i) {\r\n if (!Number.isFinite(i)) {\r\n return `${i}`;\r\n }\r\n return i + indicator(i);\r\n}\r\nfunction indicator(i) {\r\n i = Math.abs(i);\r\n const cent = i % 100;\r\n if (cent >= 10 && cent <= 20) {\r\n return 'th';\r\n }\r\n const dec = i % 10;\r\n if (dec === 1) {\r\n return 'st';\r\n }\r\n if (dec === 2) {\r\n return 'nd';\r\n }\r\n if (dec === 3) {\r\n return 'rd';\r\n }\r\n return 'th';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction getModularInstance(service) {\r\n if (service && service._delegate) {\r\n return service._delegate;\r\n }\r\n else {\r\n return service;\r\n }\r\n}\n\nexport { CONSTANTS, DecodeBase64StringError, Deferred, ErrorFactory, FirebaseError, MAX_VALUE_MILLIS, RANDOM_FACTOR, Sha1, areCookiesEnabled, assert, assertionError, async, base64, base64Decode, base64Encode, base64urlEncodeWithoutPadding, calculateBackoffMillis, contains, createMockUserToken, createSubscribe, decode, deepCopy, deepEqual, deepExtend, errorPrefix, extractQuerystring, getDefaultAppConfig, getDefaultEmulatorHost, getDefaultEmulatorHostnameAndPort, getDefaults, getExperimentalSetting, getGlobal, getModularInstance, getUA, isAdmin, isBrowser, isBrowserExtension, isElectron, isEmpty, isIE, isIndexedDBAvailable, isMobileCordova, isNode, isNodeSdk, isReactNative, isSafari, isUWP, isValidFormat, isValidTimestamp, issuedAtTime, jsonEval, map, ordinal, promiseWithTimeout, querystring, querystringDecode, safeGet, stringLength, stringToByteArray, stringify, uuidv4, validateArgCount, validateCallback, validateContextObject, validateIndexedDBOpenable, validateNamespace };\n//# sourceMappingURL=index.esm2017.js.map\n","import { PACKAGE_VERSION } from './version.js';\n\n// Name of this application, used in the User-Agent.\nexport const APP_NAME = 'TinodeWeb/' + (PACKAGE_VERSION || '0.21');\n\n// API key. Use https://github.com/tinode/chat/tree/master/keygen to generate your own\nexport const API_KEY = 'AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K';\n\n// The array of possible hosts to connect to.\nexport const KNOWN_HOSTS = {hosted: 'web.tinode.co', local: 'localhost:6060'};\n\n// Default host name and port to connect to.\nexport const DEFAULT_HOST = KNOWN_HOSTS.hosted;\n\n// Enable console logging.\nexport const LOGGING_ENABLED = true;\n\n// Minimum time between two keypress notifications, milliseconds.\nexport const KEYPRESS_DELAY = 3_000;\n// Delay before sending a read notification, milliseconds.\nexport const READ_DELAY = 1_500;\n\n// The default shortest allowed tag length. Matches the value on the server.\nexport const MIN_TAG_LENGTH = 2;\n// The default greatest allowed tag length. Matches the value on the server.\nexport const MAX_TAG_LENGTH = 96;\n// The default maximum number of tags allowed. Matches the value on the server.\nexport const MAX_TAG_COUNT = 16;\n\n// Access mode for P2P subscriptions initiated by the current user.\nexport const DEFAULT_P2P_ACCESS_MODE = 'JRWPS';\n// Access mode for new group topics created by the current user.\nexport const NEW_GRP_ACCESS_MODE = 'JRWPSAO';\n// Access mode for a channel.\nexport const CHANNEL_ACCESS_MODE = 'JR';\n\n// Access mode for no access.\nexport const NO_ACCESS_MODE = 'N';\n\n// Mediaquery breakpoint between desktop and mobile, in px. Should match the value\n// in @media (max-size: 640px) in base.css\nexport const MEDIA_BREAKPOINT = 640;\n// Size of css 'rem' unit in pixels. Default 1rem = 10pt = 13px.\nexport const REM_SIZE = 13;\n\n// Size of the avatar image: when image dimensions are greater or the image is not square, it's resized to\n// a square of this size or less.\nexport const AVATAR_SIZE = 384;\n\n// Maximum size of an avatar in bytes for sending in-band. Bigger avatars will be sent out of band (as uploads).\nexport const MAX_AVATAR_BYTES = 4096;\n\n// Size of the broken_image shown in MessagesView\nexport const BROKEN_IMAGE_SIZE = 32;\n\n// Size of video preview when dimensions are missing.\nexport const NO_DIMENSIONS_VIDEO = 128;\n\n// Number of chat messages to fetch in one call.\nexport const MESSAGES_PAGE = 24;\n\n// Default maximum in-band (included directly into the message) attachment size which fits into\n// a message of 256K in size. Used when the server-provided value is unavailable. The actual\n// binary size of the attachment should be smaller due to base64 encoding expansion and some overhead,\n// for instance 1024 bytes.\n// Increase this limit to a greater value in production, if desired. Also increase\n// max_message_size in the server config.\nexport const MAX_INBAND_ATTACHMENT_SIZE = 262_144;\n\n// Default absolute maximum attachment size to be used with the server = 8MB.\n// Used when the server-provided value is unavailable. Increase to something like 100MB in production.\nexport const MAX_EXTERN_ATTACHMENT_SIZE = 1 << 23;\n\n// Maximum allowed linear dimension (pixels) of an image sent inline. Larger images will be shrunk\n// to make the larger dimension fit under this size. You may want to adjust it to 1600 or\n// 2400 for production.\nexport const MAX_IMAGE_DIM = 1024;\n\n// Linear dimensions of image preview: shrink image under this size for previews.\nexport const IMAGE_PREVIEW_DIM = 64;\n\n// Linear dimensions of video screencapture: shrink image under this size for previews.\nexport const VIDEO_PREVIEW_DIM = 96;\n\n// Linear dimensions of image thumbnail: shrink image under this size for thumbnails in reply quote previews.\nexport const IMAGE_THUMBNAIL_DIM = 36;\n// Width of video thumbnail: allow it to be wider, but not taller. Use IMAGE_THUMBNAIL_DIM for height.\nexport const VIDEO_THUMBNAIL_WIDTH = 48;\n\n// Maximum number of online users to be shown in a topic title bar. Others will be\n// hidden under \"+X more\"\nexport const MAX_ONLINE_IN_TOPIC = 4;\n\n// Maximum length of user name, topic title, and private comment.\nexport const MAX_TITLE_LENGTH = 60;\n// Maximum length of topic description.\nexport const MAX_TOPIC_DESCRIPTION_LENGTH = 360;\n// Maximum length of user name when displaying a video call.\nexport const MAX_PEER_TITLE_LENGTH = 20;\n\n// Length of message previews in chat list, in characters.\nexport const MESSAGE_PREVIEW_LENGTH = 80;\n\n// Length of a quote in quoted reply (for outgoing messages).\nexport const QUOTED_REPLY_LENGTH = 30;\n// Length of a preview of a forwarded message.\nexport const FORWARDED_PREVIEW_LENGTH = 84;\n// Length of preview for a message being edited.\nexport const EDIT_PREVIEW_LENGTH = 48;\n\n// Minimum duration of an audio recording in milliseconds (2 sec).\nexport const MIN_DURATION = 2_000;\n// Maximum duration of an audio recording in milliseconds (10 min).\nexport const MAX_DURATION = 600_000;\n\n// Link for \"Contact Us\".\nexport const LINK_CONTACT_US = 'mailto:support@tinode.co';\n\n// Link to Privacy Policy.\nexport const LINK_PRIVACY_POLICY = 'https://tinode.co/privacy.html';\n\n// Link to Terms of Service.\nexport const LINK_TERMS_OF_SERVICE = 'https://tinode.co/terms.html';\n\n// When user starts a P2P topic, automatic subscription does not\n// happen until the first message. Setting this option to true enables\n// immediate subscription.\nexport const IMMEDIATE_P2P_SUBSCRIPTION = false;\n","// Video call states.\nexport const CALL_STATE_NONE = 0;\nexport const CALL_STATE_OUTGOING_INITATED = 1;\nexport const CALL_STATE_INCOMING_RECEIVED = 2;\nexport const CALL_STATE_IN_PROGRESS = 3;\n\n// Video call message headers representing call state.\nexport const CALL_HEAD_STARTED = 'started';\n\n// Gap between video conference carousel items.\nexport const VC_CAROUSEL_ITEM_GAP = 16;\n","// File and image helper functions.\n\n// Supported image MIME types and corresponding file extensions.\nexport const SUPPORTED_IMAGE_FORMATS = ['image/jpeg', 'image/gif', 'image/png', 'image/svg', 'image/svg+xml'];\nexport const MIME_EXTENSIONS = ['jpg', 'gif', 'png', 'svg', 'svg'];\n\n// Get an URL from a theCard photo: either create a data: URL or return reference URL.\nexport function makeImageUrl(photo) {\n if (photo && typeof photo == 'object') {\n if (photo.ref) {\n return photo.ref\n }\n if (photo.data && photo.type) {\n const mime = photo.type.startsWith('image/') ? photo.type : ('image/' + photo.type);\n return 'data:' + mime + ';base64,' + photo.data;\n }\n }\n return null;\n}\n\n// Calculate linear dimensions for scaling image down to fit under a certain size.\n// Returns an object which contains destination sizes, source sizes, and offsets\n// into source (when making square images).\nexport function fitImageSize(width, height, maxWidth, maxHeight, forceSquare) {\n // Sanitize input\n width = width | 0;\n height = height | 0;\n maxWidth = maxWidth | 0;\n maxHeight = maxHeight | 0;\n\n if (width <= 0 || height <= 0 || maxWidth <= 0 || maxHeight <= 0) {\n return null;\n }\n\n if (forceSquare) {\n maxWidth = maxHeight = Math.min(maxWidth, maxHeight);\n }\n\n const scale = Math.min(\n Math.min(width, maxWidth) / width,\n Math.min(height, maxHeight) / height\n );\n\n const size = {\n dstWidth: (width * scale) | 0,\n dstHeight: (height * scale) | 0,\n };\n\n if (forceSquare) {\n // Also calculate parameters for making the image square.\n size.dstWidth = size.dstHeight = Math.min(size.dstWidth, size.dstHeight);\n size.srcWidth = size.srcHeight = Math.min(width, height);\n size.xoffset = ((width - size.srcWidth) / 2) | 0;\n size.yoffset = ((height - size.srcWidth) / 2) | 0;\n } else {\n size.xoffset = size.yoffset = 0;\n size.srcWidth = width;\n size.srcHeight = height;\n }\n return size;\n}\n\n// Ensure file's extension matches mime content type\nexport function fileNameForMime(fname, mime) {\n const idx = SUPPORTED_IMAGE_FORMATS.indexOf(mime);\n if (idx < 0 || !fname) {\n // Unknown mime or empty name.\n return fname;\n }\n const ext = MIME_EXTENSIONS[idx];\n\n const at = fname.lastIndexOf('.');\n if (at >= 0) {\n fname = fname.substring(0, at);\n }\n return fname + '.' + ext;\n}\n\n// Scale uploaded image to fit under certain dimensions and byte size, optionally constraining to a square.\n// Returns a promise which is resolven on success or rejected on failure.\nexport function imageScaled(fileOrBlob, maxWidth, maxHeight, maxSize, forceSquare) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onerror = function(err) {\n reject(new Error(\"Image format unrecognized\"));\n }\n img.onload = async function() {\n // Once the image is loaded, the URL is no longer needed.\n URL.revokeObjectURL(img.src);\n\n // Calculate the desired image dimensions.\n const dim = fitImageSize(img.width, img.height, maxWidth, maxHeight, forceSquare);\n if (!dim) {\n reject(new Error(\"Invalid image\"));\n return;\n }\n let canvas = document.createElement('canvas');\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n let ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(img, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight,\n 0, 0, dim.dstWidth, dim.dstHeight);\n\n const mime = SUPPORTED_IMAGE_FORMATS.includes(fileOrBlob.type) ? fileOrBlob.type : 'image/jpeg';\n // Generate blob to check size of the image.\n let blob = await new Promise(resolve => canvas.toBlob(resolve, mime));\n if (!blob) {\n reject(new Error(\"Unsupported image format\"));\n return;\n }\n // Ensure the image is not too large. Shrink the image keeping the aspect ratio.\n // Do nothing if maxsize is <= 0.\n while (maxSize > 0 && blob.length > maxSize) {\n dim.dstWidth = (dim.dstWidth * 0.70710678118) | 0;\n dim.dstHeight = (dim.dstHeight * 0.70710678118) | 0;\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(img, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight,\n 0, 0, dim.dstWidth, dim.dstHeight);\n blob = await new Promise(resolve => canvas.toBlob(resolve, mime));\n }\n\n canvas = null;\n resolve({mime: mime, blob: blob, width: dim.dstWidth, height: dim.dstHeight, name: fileNameForMime(fileOrBlob.name, mime)});\n };\n img.src = URL.createObjectURL(fileOrBlob);\n });\n}\n\n// Scale and crop image according to specified dimensions.\n// The coordinates are in unscaled image pixels, i.e. cut the rectangle first then scale it.\n// returns a promise.\nexport function imageCrop(mime, objURL, left, top, width, height, scale) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onerror = _ => {\n reject(new Error(\"Image format unrecognized\"));\n };\n img.onload = _ => {\n // Once the image is loaded, the URL is no longer needed.\n URL.revokeObjectURL(img.src);\n\n let canvas = document.createElement('canvas');\n canvas.width = width * scale;\n canvas.height = height * scale;\n let ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(img, left, top, width, height, 0, 0, canvas.width, canvas.height);\n\n mime = SUPPORTED_IMAGE_FORMATS.includes(mime) ? mime : 'image/jpeg';\n // Generate blob to check size of the image.\n canvas.toBlob((blob) => {\n // Allow GC.\n canvas = null;\n if (blob) {\n resolve({mime: mime, blob: blob, width: width, height: height});\n } else {\n reject(new Error(\"Unsupported image format\"));\n }\n }, mime);\n };\n img.src = objURL;\n });\n}\n\n// Convert file to base64 string.\nexport function fileToBase64(file) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = _ => {\n reject(reader.error);\n };\n reader.onload = _ => {\n resolve({mime: file.type, bits: reader.result.split(',')[1], name: file.name});\n };\n reader.readAsDataURL(file);\n });\n}\n\n// Convert Blob to base64 string. Returns a promise resolved with the base64 string and mime.\nexport function blobToBase64(blob) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = _ => {\n reject(reader.error);\n };\n reader.onload = _ => {\n resolve({mime: blob.type, bits: reader.result.split(',')[1]});\n };\n reader.readAsDataURL(blob);\n });\n}\n\n// File pasted from the clipboard. It's either an inline image or a file attachment.\nexport function filePasted(event, onImageSuccess, onAttachmentSuccess, onError) {\n const items = (event.clipboardData || event.originalEvent.clipboardData || {}).items;\n if (!items || !items.length) {\n return false;\n }\n\n for (let i in items) {\n const item = items[i];\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (!file) {\n console.error(\"Failed to get file object from pasted file item\", item.kind, item.type);\n onError(\"Failed to get file object from pasted file item\");\n continue;\n }\n if (file.type && file.type.split('/')[0] == 'image') {\n onImageSuccess(file);\n } else {\n onAttachmentSuccess(file);\n }\n // Indicate that the pasted data contains a file.\n return true;\n }\n }\n // No file found.\n return false;\n}\n\n// Get mime type from data URL header.\nexport function getMimeType(header) {\n const mime = /^data:(image\\/[-+a-z0-9.]+);base64/.exec(header);\n return (mime && mime.length > 1) ? mime[1] : null;\n}\n\n// Given length of a binary object in bytes, calculate the length after\n// base64 encoding.\nexport function base64EncodedLen(n) {\n return Math.floor((n + 2) / 3) * 4;\n}\n\n// Given length of a base64-encoded object, calculate decoded size of the\n// pbject in bytes.\nexport function base64DecodedLen(n) {\n return Math.floor(n / 4) * 3;\n}\n\n// Re-encode string to standard base64 encoding with padding.\n// The string may be base64-URL encoded without the padding.\nexport function base64ReEncode(str) {\n if (str) {\n str = str.replace(/-/g, '+').replace(/_/g, '/');\n try {\n str = btoa(atob(str));\n } catch(err) {\n console.error(\"Failed to base64 re-encode string.\", err);\n str = null;\n }\n }\n return str;\n}\n\n// Convert a base64 encoded string with the provided mime type into a Blob.\nexport function base64ToBlob(str, mime) {\n if (!str) {\n return null;\n }\n\n try {\n // Make blob.\n const bin = atob(str);\n const length = bin.length;\n const buf = new ArrayBuffer(length);\n const arr = new Uint8Array(buf);\n for (let i = 0; i < length; i++) {\n arr[i] = bin.charCodeAt(i);\n }\n\n return new Blob([buf], { type: mime });\n } catch(err) {\n console.error(\"Failed to convert base64 to blob: \", err);\n }\n\n return null;\n}\n\nexport function intArrayToBase64(arr) {\n if (!Array.isArray(arr)) {\n return null;\n }\n try {\n let bin = '';\n new Uint8Array(arr).forEach(b => bin += String.fromCharCode(b));\n return window.btoa(bin);\n } catch (err) {}\n return null;\n}\n\nexport function base64ToIntArray(b64) {\n const arr = [];\n try {\n const bin = window.atob(b64);\n [...bin].forEach(c => {\n arr.push(c.charCodeAt(0));\n });\n return arr;\n } catch (err) {}\n return null;\n}\n","import React from 'react';\nimport { defineMessages } from 'react-intl';\n\nimport { Drafty } from 'tinode-sdk';\n\nimport AudioPlayer from '../widgets/audio-player.jsx'\nimport CallMessage from '../widgets/call-message.jsx'\nimport CallStatus from '../widgets/call-status.jsx';\nimport InlineVideo from '../widgets/inline-video.jsx';\nimport LazyImage from '../widgets/lazy-image.jsx'\nimport UploadingImage from '../widgets/uploading-image.jsx'\n\nimport { BROKEN_IMAGE_SIZE, IMAGE_THUMBNAIL_DIM, NO_DIMENSIONS_VIDEO, REM_SIZE, VIDEO_THUMBNAIL_WIDTH } from '../config.js';\nimport { base64ToBlob, blobToBase64, fitImageSize, imageScaled } from './blob-helpers.js';\nimport { idToColorClass, secondsToTime, shortenFileName } from './strformat.js';\nimport { cancelablePromise, sanitizeUrlForMime } from './utils.js';\n\nconst messages = defineMessages({\n drafty_form: {\n id: 'drafty_form',\n defaultMessage: 'Form: ',\n description: 'Comment for form in Drafty'\n },\n drafty_attachment: {\n id: 'drafty_attachment',\n defaultMessage: 'Attachment',\n description: 'Comment for attachment in Drafty'\n },\n drafty_image: {\n id: 'drafty_image',\n defaultMessage: 'Picture',\n description: 'Comment for embedded images in Drafty'\n },\n drafty_video: {\n id: 'drafty_video',\n defaultMessage: 'Video recording',\n description: 'Comment for videos embedded in Drafty'\n },\n drafty_unknown: {\n id: 'drafty_unknown',\n defaultMessage: 'Unsupported',\n description: 'Unsupported entity in drafty'\n }\n});\n\n// The main Drafty formatter: converts Drafty elements into React classes. 'this' is set by the caller.\n// 'this' must contain:\n// viewportWidth:\n// authorizeURL:\n// onImagePreview:\n// onVideoPreview:\n// onFormButtonClick:\n// onQuoteClick:\nexport function fullFormatter(style, data, values, key, stack) {\n if (stack.includes('QQ')) {\n return quoteFormatter.call(this, style, data, values, key);\n }\n\n if (!style) {\n // Unformatted.\n return values;\n }\n\n let el = Drafty.tagName(style);\n let attr = Drafty.attrValue(style, data) || {};\n attr.key = key;\n switch (style) {\n case 'AU':\n // Show audio player.\n if (attr.src) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'audio'));\n attr.duration = data.duration > 0 ? (data.duration | 0) : undefined;\n attr.preview = data.preview;\n attr.loading = 'lazy';\n }\n el = AudioPlayer;\n // Audio element cannot have content.\n values = null;\n break;\n case 'BR':\n values = null;\n break;\n case 'EX':\n // Ignore.\n break;\n case 'HL':\n // Highlighted text. Assign class name.\n attr.className = 'highlight';\n break;\n case 'HD':\n el = null;\n values = null;\n break;\n case 'IM':\n // Additional processing for images\n el = handleImageData.call(this, el, data, attr);\n // Image element cannot have content.\n values = null;\n break;\n case 'BN':\n // Button\n attr.onClick = this.onFormButtonClick;\n let inner = React.Children.map(values, (child) => {\n return typeof child == 'string' ? child : undefined;\n });\n if (!inner || inner.length == 0) {\n inner = [attr.name]\n }\n // Get text which will be sent back when the button is clicked.\n attr['data-title'] = inner.join('');\n break;\n case 'MN':\n // Mention\n attr.className = 'mention'\n if (data) {\n attr.className += ' ' + idToColorClass(data.val, false, true);\n }\n break;\n case 'FM':\n // Form\n attr.className = 'bot-form';\n break;\n case 'RW':\n // Form element formatting is dependent on element content.\n break;\n case 'QQ':\n // Quote/citation.\n attr.className = 'reply-quote'\n attr.onClick = this.onQuoteClick;\n break;\n case 'VC':\n el = CallMessage;\n // Video call messages do not have content.\n values = null;\n if (data) {\n attr.callState = data.state;\n attr.incoming = data.incoming;\n attr.duration = data.duration;\n attr.vc = data.vc;\n attr.onCallJoin = this.onCallJoin;\n }\n break;\n case 'VD':\n // Additional processing for videos.\n el = handleVideoData.call(this, el, data, attr);\n // Video element cannot have content.\n values = null;\n break;\n default:\n if (!el) {\n // Unknown element.\n el = React.Fragment;\n attr = {key: key};\n // Generate comment for unknown element.\n let body = values;\n if (!Array.isArray(values) || !values.join('').trim()) {\n body = [{this.formatMessage(messages.drafty_unknown)}];\n }\n values = [extension, ' '].concat(body);\n }\n break;\n }\n if (!el) {\n return values;\n }\n return React.createElement(el, attr, values);\n}\n\n// Additional processing of image data.\nfunction handleImageData(el, data, attr) {\n if (!data) {\n attr.src = 'img/broken_image.png';\n attr.style = {\n width: IMAGE_THUMBNAIL_DIM + 'px',\n height: IMAGE_THUMBNAIL_DIM + 'px',\n };\n return el;\n }\n\n attr.className = 'inline-image';\n const dim = fitImageSize(data.width, data.height,\n this.viewportWidth > 0 ? Math.min(this.viewportWidth - REM_SIZE * 6.5, REM_SIZE * 34.5) :\n REM_SIZE * 34.5, REM_SIZE * 24, false) ||\n {dstWidth: BROKEN_IMAGE_SIZE, dstHeight: BROKEN_IMAGE_SIZE};\n attr.style = {\n width: dim.dstWidth + 'px',\n height: dim.dstHeight + 'px',\n // Looks like a Chrome bug: broken image does not respect 'width' and 'height'.\n minWidth: dim.dstWidth + 'px',\n minHeight: dim.dstHeight + 'px'\n };\n if (!Drafty.isProcessing(data)) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'image'));\n attr.alt = data.name;\n if (attr.src) {\n if (Math.max(data.width || 0, data.height || 0) > IMAGE_THUMBNAIL_DIM) {\n // Allow previews for large enough images.\n attr.onClick = this.onImagePreview;\n attr.className += ' image-clickable';\n }\n attr.loading = 'lazy';\n } else {\n attr.src = null;\n }\n } else {\n // Use custom element instead of .\n el = UploadingImage;\n }\n\n return el;\n}\n\n// Additional processing of attached video data.\nfunction handleVideoData(el, data, attr) {\n if (!data) {\n attr.src = 'img/broken_video.png';\n attr.style = {\n width: IMAGE_THUMBNAIL_DIM + 'px',\n height: IMAGE_THUMBNAIL_DIM + 'px',\n };\n return el;\n }\n attr.className = 'inline-image';\n const dim = fitImageSize(data.width, data.height,\n this.viewportWidth > 0 ? Math.min(this.viewportWidth - REM_SIZE * 6.5, REM_SIZE * 34.5) :\n REM_SIZE * 34.5, REM_SIZE * 24, false) ||\n {dstWidth: NO_DIMENSIONS_VIDEO, dstHeight: NO_DIMENSIONS_VIDEO};\n attr.style = {\n width: dim.dstWidth + 'px',\n height: dim.dstHeight + 'px',\n // Looks like a Chrome bug: broken image does not respect 'width' and 'height'.\n minWidth: dim.dstWidth + 'px',\n minHeight: dim.dstHeight + 'px'\n };\n if (!Drafty.isProcessing(data)) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'image'));\n attr.alt = data.name;\n if (data.ref || data.val) {\n attr.onClick = this.onVideoPreview;\n attr.loading = 'lazy';\n }\n el = InlineVideo;\n } else {\n // Use custom element instead of or

\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n );\n }\n};\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport InPlaceEdit from '../widgets/in-place-edit.jsx';\nimport PermissionsEditor from '../widgets/permissions-editor.jsx';\n\nconst messages = defineMessages({\n delete_account: {\n id: 'delete_account',\n defaultMessage: 'Delete account',\n description: 'Title for delete account warning'\n },\n delete_account_warning: {\n id: 'delete_account_warning',\n defaultMessage: 'Are you sure you want to delete your account? It cannot be undone.',\n description: 'Warning message when deleting an account'\n }\n});\n\nclass AccSecurityView extends React.Component {\n constructor(props) {\n super(props);\n\n const me = this.props.tinode.getMeTopic();\n let blockedCount = 0;\n me.contacts((c) => {\n if (c.acs && !c.acs.isJoiner()) {\n blockedCount ++;\n }\n });\n const defacs = me.getDefaultAccess();\n this.state = {\n auth: defacs ? defacs.auth : null,\n anon: defacs ? defacs.anon : null,\n showPermissionEditorFor: undefined,\n blockedCount: blockedCount,\n };\n\n this.handlePasswordUpdate = this.handlePasswordUpdate.bind(this);\n this.handleLaunchPermissionsEditor = this.handleLaunchPermissionsEditor.bind(this);\n this.handleHidePermissionsEditor = this.handleHidePermissionsEditor.bind(this);\n this.handlePermissionsChanged = this.handlePermissionsChanged.bind(this);\n this.handleDeleteAccount = this.handleDeleteAccount.bind(this);\n }\n\n handlePasswordUpdate(pwd) {\n this.setState({password: pwd});\n this.props.onUpdatePassword(pwd);\n }\n\n handleLaunchPermissionsEditor(which) {\n this.setState({\n showPermissionEditorFor: which,\n editedPermissions: this.state[which]\n });\n }\n\n handleHidePermissionsEditor() {\n this.setState({showPermissionEditorFor: undefined});\n }\n\n handlePermissionsChanged(perm) {\n let defacs = {};\n defacs[this.state.showPermissionEditorFor] = perm;\n this.props.onUpdateAccountDesc('me', undefined, undefined, defacs);\n\n let newState = {showPermissionEditorFor: undefined};\n newState[this.state.showPermissionEditorFor] = perm;\n this.setState(newState);\n }\n\n handleDeleteAccount(e) {\n e.preventDefault();\n const {formatMessage} = this.props.intl;\n this.props.onShowAlert(\n formatMessage(messages.delete_account), // title\n formatMessage(messages.delete_account_warning), // content\n (_ => this.props.onDeleteAccount()), // onConfirm\n null, // use default text \"OK\"\n true, // Show Reject button\n null // use default text \"Cancel\"\n );\n }\n\n render() {\n return (\n <>{this.state.showPermissionEditorFor ?\n \n :\n
\n
\n \n
\n {\n (password_unchanged) => \n }\n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
Auth: {this.state.auth}
\n
Anon: {this.state.anon}
\n
\n
\n {this.state.blockedCount > 0 ?\n <>\n \n }\n );\n }\n};\n\nexport default injectIntl(AccSecurityView);\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { APP_NAME, LINK_CONTACT_US, LINK_PRIVACY_POLICY, LINK_TERMS_OF_SERVICE } from '../config.js';\n\nexport default class AccSupportView extends React.PureComponent {\n render() {\n return (\n
\n \n
\n
\n
\n \n {APP_NAME}\n
\n
\n \n {Tinode.getLibrary()}\n
\n
\n \n {this.props.serverVersion}\n
\n
\n \n {this.props.serverAddress}\n
\n
\n
\n );\n }\n};\n","/* ContactsView holds all contacts-related stuff */\nimport React from 'react';\nimport { FormattedMessage, defineMessages } from 'react-intl';\n\nimport ContactList from '../widgets/contact-list.jsx';\n\nimport { updateFavicon } from '../lib/utils.js';\n\nconst messages = defineMessages({\n archived_contacts_title: {\n id: \"archived_contacts\",\n defaultMessage: \"Archived contacts ({count})\",\n description: \"Label for archived chats\"\n }\n});\n\nexport default class ContactsView extends React.Component {\n constructor(props) {\n super(props);\n\n this.handleAction = this.handleAction.bind(this);\n\n this.state = ContactsView.deriveStateFromProps(props);\n }\n\n static deriveStateFromProps(props) {\n const contacts = [];\n let unreadThreads = 0;\n let archivedCount = 0;\n props.chatList.forEach(c => {\n const blocked = c.acs && !c.acs.isJoiner();\n // Show only blocked contacts only when props.blocked == true.\n if (blocked && props.blocked) {\n contacts.push(c);\n }\n if (blocked || props.blocked) {\n return;\n }\n\n if (c.private && c.private.arch) {\n if (props.archive) {\n contacts.push(c);\n } else {\n archivedCount ++;\n }\n } else if (!props.archive) {\n contacts.push(c);\n unreadThreads += c.unread > 0 ? 1 : 0;\n }\n });\n\n contacts.sort((a, b) => {\n return (b.touched || 0) - (a.touched || 0);\n });\n\n if (archivedCount > 0) {\n contacts.push({\n action: 'archive',\n title: messages.archived_contacts_title,\n values: {count: archivedCount}\n });\n }\n\n return {\n contactList: contacts,\n unreadThreads: unreadThreads\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.chatList != this.props.chatList ||\n prevProps.archive != this.props.archive ||\n prevProps.blocked != this.props.blocked) {\n const newState = ContactsView.deriveStateFromProps(this.props);\n this.setState(newState);\n if (newState.unreadThreads != prevState.unreadThreads) {\n updateFavicon(newState.unreadThreads);\n }\n }\n }\n\n handleAction(action_ignored) {\n this.props.onShowArchive();\n }\n\n render() {\n return (\n ¯∖_(ツ)_/¯\"\n description=\"HTML message shown in ContactList when no contacts are found\">{\n (no_contacts) => \n }\n );\n }\n};\n","// InfoView: panel with topic/user info.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { AccessMode, Tinode } from 'tinode-sdk';\n\nimport AvatarUpload from '../widgets/avatar-upload.jsx';\nimport BadgeList from '../widgets/badge-list.jsx';\nimport CheckBox from '../widgets/checkbox.jsx';\nimport ContactList from '../widgets/contact-list.jsx';\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport GroupManager from '../widgets/group-manager.jsx';\nimport MenuCancel from '../widgets/menu-cancel.jsx';\nimport PermissionsEditor from '../widgets/permissions-editor.jsx';\nimport TopicCommonView from './topic-common-view.jsx';\nimport TopicSecurity from '../widgets/topic-security.jsx';\n\nimport { MAX_TITLE_LENGTH, MAX_TOPIC_DESCRIPTION_LENGTH, NO_ACCESS_MODE } from '../config.js';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { theCard, clipStr } from '../lib/utils.js';\n\nconst messages = defineMessages({\n info: {\n id: 'panel_title_info',\n description: 'Title for InfoView',\n defaultMessage: 'Info'\n },\n general: {\n id: 'panel_title_general',\n description: 'Title for TopicCommon.',\n defaultMessage: 'General'\n },\n security: {\n id: 'panel_title_security',\n description: 'Title for TopicSecirity and AccSecurity.',\n defaultMessage: 'Security'\n },\n members: {\n id: 'panel_title_members',\n description: 'Title for managing group members view.',\n defaultMessage: 'Members'\n },\n crop: {\n id: 'panel_title_crop',\n description: 'Title for AvatarCropView.',\n defaultMessage: 'Drag to Adjust'\n },\n perm_want: {\n id: 'requested_permissions',\n defaultMessage: 'Requested',\n description: 'Title for permissions'\n },\n perm_given: {\n id: 'granted_permissions',\n defaultMessage: 'Granted',\n description: 'Title for permissions'\n },\n perm_auth: {\n id: 'permissions_authenticated',\n defaultMessage: 'Authenticated',\n description: 'Title for editing default authenticated permissions'\n },\n perm_anon: {\n id: 'permissions_anonymous',\n defaultMessage: 'Anonymous',\n description: 'Title for editing default anonymous permissions'\n },\n perm_user: {\n id: 'permissions_user',\n defaultMessage: 'User\\'s Permissions',\n description: 'Title for editing user\\'s permissions'\n },\n edit_permissions: {\n id: 'menu_item_edit_permissions',\n defaultMessage: 'Edit permissions',\n description: 'Menu item [Edit permissions]'\n },\n});\n\nclass InfoView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n topic: null,\n owner: false,\n admin: false,\n sharer: false,\n deleter: false,\n muted: false,\n address: null,\n groupTopic: undefined,\n channel: undefined,\n fullName: undefined,\n description: undefined,\n avatar: null,\n private: null,\n selectedContact: null,\n access: null,\n modeGiven: null,\n modeWant: null,\n modeGiven2: null, // P2P topic, the other user mode given\n modeWant2: null, // P2P topic, the other user mode want\n auth: null,\n anon: null,\n contactList: [],\n trustedBadges: [],\n previousMetaDesc: undefined,\n previousSubsUpdated: undefined,\n };\n\n this.resetSubs = this.resetSubs.bind(this);\n this.resetDesc = this.resetDesc.bind(this);\n this.resetTags = this.resetTags.bind(this);\n this.onMetaDesc = this.onMetaDesc.bind(this);\n this.onSubsUpdated = this.onSubsUpdated.bind(this);\n this.handleImageChanged = this.handleImageChanged.bind(this);\n this.handleMuted = this.handleMuted.bind(this);\n this.handleUnarchive = this.handleUnarchive.bind(this);\n this.handlePermissionsChanged = this.handlePermissionsChanged.bind(this);\n this.handleLaunchPermissionsEditor = this.handleLaunchPermissionsEditor.bind(this);\n this.handleShowAddMembers = this.handleShowAddMembers.bind(this);\n this.handleMemberUpdateRequest = this.handleMemberUpdateRequest.bind(this);\n this.handleMemberSelected = this.handleMemberSelected.bind(this);\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleBackNavigate = this.handleBackNavigate.bind(this);\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n if (this.onMetaDesc != topic.onMetaDesc) {\n this.previousMetaDesc = topic.onMetaDesc;\n topic.onMetaDesc = this.onMetaDesc;\n\n this.previousSubsUpdated = topic.onSubsUpdated;\n topic.onSubsUpdated = this.onSubsUpdated;\n }\n\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n this.resetDesc(topic, props);\n this.resetSubs(topic, props);\n this.resetTags(topic);\n }\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.setState({topic: null});\n topic.onMetaDesc = this.previousMetaDesc;\n topic.onSubsUpdated = this.previousSubsUpdated;\n }\n\n resetSubs(topic, props) {\n const newState = {contactList: []};\n if (topic.getType() == 'p2p') {\n // Fetch the other party in the p2p conversation.\n // Topic may not be ready yet, so check if user is found.\n const user2 = topic.subscriber(props.topic);\n if (user2) {\n newState.modeGiven2 = user2.acs.getGiven();\n newState.modeWant2 = user2.acs.getWant();\n } else {\n newState.modeGiven2 = NO_ACCESS_MODE;\n newState.modeWant2 = NO_ACCESS_MODE;\n }\n } else {\n topic.subscribers((sub) => {\n newState.contactList.push(sub);\n }, this);\n }\n\n this.setState(newState);\n }\n\n resetDesc(topic, props) {\n const defacs = topic.getDefaultAccess() || {};\n const acs = topic.getAccessMode();\n\n const badges = [];\n if (topic.trusted) {\n for (const [key, val] of Object.entries(topic.trusted)) {\n if (val) {\n badges.push(key);\n }\n }\n }\n\n this.setState({\n owner: acs && acs.isOwner(),\n admin: acs && acs.isAdmin(),\n sharer: acs && acs.isSharer(),\n deleter: acs && acs.isDeleter(),\n muted: acs && acs.isMuted(),\n\n fullName: clipStr(topic.public && topic.public.fn, MAX_TITLE_LENGTH),\n description: clipStr(topic.public && topic.public.note, MAX_TOPIC_DESCRIPTION_LENGTH),\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n trustedBadges: badges,\n private: clipStr(topic.private && topic.private.comment, MAX_TITLE_LENGTH),\n archived: topic.isArchived(),\n address: topic.name,\n groupTopic: topic.isGroupType(),\n channel: topic.isChannelType() || topic.chan,\n access: acs ? acs.getMode() : undefined,\n modeGiven: acs ? acs.getGiven() : undefined,\n modeWant: acs ? acs.getWant() : undefined,\n auth: defacs.auth,\n anon: defacs.anon\n });\n }\n\n resetTags(topic) {\n if (topic.getType() != 'grp') {\n return;\n }\n\n const acs = topic.getAccessMode();\n if (acs && acs.isOwner()) {\n // Requesting tags: owner is editing the topic.\n topic.getMeta(topic.startMetaQuery().withTags().build());\n }\n }\n\n onMetaDesc(desc) {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.resetDesc(topic, this.props);\n\n if (this.previousMetaDesc && this.previousMetaDesc != this.onMetaDesc) {\n this.previousMetaDesc(desc);\n }\n }\n\n onSubsUpdated(subs) {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.resetSubs(topic, this.props);\n\n if (this.previousSubsUpdated && this.previousSubsUpdated != this.onSubsUpdated) {\n this.previousSubsUpdated(subs);\n }\n }\n\n handleImageChanged(mime, img) {\n this.setState({avatar: img});\n this.props.onTopicDescUpdate(this.props.topic, theCard(null, img || Tinode.DEL_CHAR), null);\n }\n\n handleMuted(ignored, checked) {\n this.setState({muted: checked});\n this.props.onChangePermissions(this.props.topic, checked ? '-P' : '+P');\n }\n\n handleUnarchive(ignored, ignored2) {\n this.props.onTopicUnArchive(this.props.topic);\n }\n\n handlePermissionsChanged(which, perm) {\n switch (which) {\n case 'auth':\n this.props.onTopicDescUpdateRequest(this.props.topic, null, null, {auth: perm});\n break;\n case 'anon':\n this.props.onTopicDescUpdateRequest(this.props.topic, null, null, {anon: perm});\n break;\n case 'mode':\n case 'want':\n this.props.onChangePermissions(this.props.topic, perm);\n break;\n case 'given':\n this.props.onChangePermissions(this.props.topic, perm, this.props.topic);\n break;\n case 'user':\n this.props.onChangePermissions(this.props.topic, perm, this.state.userPermissionsEdited);\n break;\n }\n\n this.handleBackNavigate();\n }\n\n handleLaunchPermissionsEditor(which, uid) {\n const {formatMessage} = this.props.intl;\n let toEdit, toCompare, toSkip, titleEdit, titleCompare, userTitle, userAvatar;\n switch (which) {\n case 'mode':\n toEdit = this.state.access;\n break;\n case 'want':\n toEdit = this.state.modeWant;\n toCompare = this.state.modeGiven;\n if (this.state.owner) {\n // Don't allow owner to unset 'O' permission. All other permissions are OK.\n toSkip = 'O';\n } else {\n // Allow accepting any of 'ASDO' permissions but don't allow asking for them.\n toSkip = AccessMode.encode(AccessMode.diff('ASDO', this.state.modeGiven));\n if (this.state.channel) {\n // Channels are read-only.\n toSkip += 'W';\n }\n }\n titleEdit = formatMessage(messages.perm_want);\n titleCompare = formatMessage(messages.perm_given);\n break;\n case 'given':\n toEdit = this.state.modeGiven2;\n toCompare = this.state.modeWant2;\n toSkip = this.state.groupTopic ? (this.state.owner ? '' : 'O') : 'ASDO';\n titleEdit = formatMessage(messages.perm_given);\n titleCompare = formatMessage(messages.perm_want);\n break;\n case 'auth':\n toEdit = this.state.auth;\n toSkip = 'O';\n break;\n case 'anon':\n toEdit = this.state.anon;\n toSkip = 'O';\n break;\n case 'user': {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n const user = topic.subscriber(uid);\n if (!user || !user.acs) {\n return;\n }\n toEdit = user.acs.getGiven();\n toCompare = user.acs.getWant();\n toSkip = this.state.owner ? '' : 'O';\n titleEdit = formatMessage(messages.perm_given);\n titleCompare = formatMessage(messages.perm_want);\n if (user.public) {\n userTitle = user.public.fn;\n userAvatar = user.public.photo;\n }\n break;\n }\n default:\n console.error(\"Unknown permission editing mode '\" + which + \"'\");\n return;\n }\n this.setState({\n userPermissionsEdited: uid,\n userPermissionsTitle: userTitle,\n userPermissionsAvatar: userAvatar,\n editedPermissions: toEdit,\n immutablePermissions: toCompare,\n editedPermissionsTitle: titleEdit,\n immutablePermissionsTitle: titleCompare,\n editedPermissionsSkipped: toSkip,\n });\n this.props.onNavigate(`perm/${which}`);\n }\n\n handleShowAddMembers(e) {\n e.preventDefault();\n this.props.onInitFind();\n this.props.onNavigate('members');\n }\n\n handleMemberUpdateRequest(members, added, removed) {\n this.props.onMemberUpdateRequest(this.props.topic, added, removed);\n this.props.onNavigate('info');\n }\n\n handleMemberSelected(uid) {\n this.setState({selectedContact: uid});\n }\n\n handleBackNavigate() {\n const args = (this.props.panel || 'info').split('/');\n if (args[0] == 'info') {\n this.props.onNavigate(null);\n } else if (args[0] == 'perm') {\n if (args[1] == 'user') {\n this.props.onNavigate('info');\n } else {\n this.props.onNavigate('security');\n }\n } else {\n this.props.onNavigate('info');\n }\n }\n\n handleContextMenu(params) {\n const {formatMessage} = this.props.intl;\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n const user = topic.subscriber(params.topicName);\n if (!user || !user.acs) {\n return;\n }\n\n const isMe = this.props.tinode.isMe(params.topicName);\n const menuItems = [{\n title: formatMessage(messages.edit_permissions),\n handler: _ => this.handleLaunchPermissionsEditor(isMe ? 'want' : 'user', params.topicName)\n }];\n if (!isMe) {\n menuItems.push('member_delete');\n }\n menuItems.push(user.acs.isMuted() ? 'member_unmute' : 'member_mute');\n if (!isMe) {\n menuItems.push(user.acs.isJoiner() ? 'member_block' : 'member_unblock');\n }\n this.props.showContextMenu({\n topicName: this.props.topic,\n x: params.x,\n y: params.y,\n user: params.topicName}, menuItems);\n }\n\n render() {\n const args = (this.props.panel || 'info').split('/');\n const view = args[0];\n args.shift();\n\n const {formatMessage} = this.props.intl;\n const panelTitle = formatMessage((view == 'perm' ? messages['perm_' + args[0]] : messages[view])\n || messages['info']);\n\n return (\n
\n
\n
{panelTitle}
\n
\n \n
\n
\n {this.props.displayMobile ?\n : null}\n {view == 'members' ?\n \n :\n view == 'perm' && args.length > 0 ?\n this.handlePermissionsChanged(args[0], mode)}\n onCancel={this.handleBackNavigate} />\n :\n view == 'general' ?\n \n :\n view == 'security' ?\n \n :\n
\n
\n {e.preventDefault(); this.props.onNavigate('general');}}>\n edit \n \n \n
\n \n
\n
\n
\n
{this.state.fullName}\n {this.state.channel ? \"channel\" : null}
\n
\n {this.state.private ?\n
\n
\n
{this.state.private}
\n
\n : null\n }\n
\n  \n {this.state.address}\n
\n
\n \n
\n {this.state.description ?\n
\n \n
{this.state.description}
\n
: null}\n
\n
\n
\n \n \n
\n {this.state.archived ?\n
\n \n \n
\n :\n null\n }\n
\n \n {this.state.groupTopic && this.state.sharer ?\n <>\n
\n
\n \n
\n \n {\n (no_members) => \n }\n \n :\n null\n }\n
\n }\n
\n );\n }\n};\n\nexport default injectIntl(InfoView);\n","// Login form.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\nimport VisiblePassword from '../widgets/visible-password.jsx';\n\nexport default class LoginView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n login: props.login,\n password: '',\n hostName: props.serverAddress,\n saveToken: props.persist\n };\n this.handleLoginChange = this.handleLoginChange.bind(this);\n this.handlePasswordChange = this.handlePasswordChange.bind(this);\n this.handleToggleSaveToken = this.handleToggleSaveToken.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n }\n\n handleLoginChange(e) {\n this.setState({login: e.target.value});\n }\n\n handlePasswordChange(e) {\n this.setState({password: e.target.value});\n }\n\n handleToggleSaveToken() {\n this.props.onPersistenceChange(!this.state.saveToken);\n this.setState({saveToken: !this.state.saveToken});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n this.props.onLogin(this.state.login.trim(), this.state.password.trim());\n }\n\n render() {\n let submitClasses = 'primary';\n if (this.props.disabled) {\n submitClasses += ' disabled';\n }\n\n return (\n
\n \n {\n (login_prompt) => \n }\n \n \n {\n (password_prompt) => \n }\n \n
\n \n \n \n \n \n
\n
\n \n
\n
\n );\n }\n};\n","/* This is just a static page to display when no conversation is selected. */\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { APP_NAME } from '../config.js';\n\nexport default class LogoView extends React.PureComponent {\n render() {\n const version = APP_NAME + ' (' + Tinode.getLibrary() + ')';\n return (\n
\n
\n \n \"logo\"\n

Tinode Web

\n
\n

{version}

\n

{this.props.serverVersion} ({this.props.serverAddress})

\n
\n
\n );\n }\n};\n","// Panel with a chat.\n\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport CallPanel from '../widgets/call-panel.jsx';\nimport ChatMessage from '../widgets/chat-message.jsx';\nimport ContactBadges from '../widgets/contact-badges.jsx';\nimport DocPreview from '../widgets/doc-preview.jsx';\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport GroupSubs from '../widgets/group-subs.jsx';\nimport ImagePreview from '../widgets/image-preview.jsx';\nimport Invitation from '../widgets/invitation.jsx';\nimport LetterTile from '../widgets/letter-tile.jsx';\nimport LoadSpinner from '../widgets/load-spinner.jsx';\nimport LogoView from './logo-view.jsx';\nimport MetaMessage from '../widgets/meta-message.jsx';\nimport PinnedMessages from '../widgets/pinned-messages.jsx';\nimport SendMessage from '../widgets/send-message.jsx';\nimport VCPanel from '../widgets/vc-panel.jsx';\nimport VideoPreview from '../widgets/video-preview.jsx';\n\nimport { DEFAULT_P2P_ACCESS_MODE, EDIT_PREVIEW_LENGTH, IMAGE_PREVIEW_DIM, IMMEDIATE_P2P_SUBSCRIPTION,\n KEYPRESS_DELAY, MESSAGES_PAGE, MAX_EXTERN_ATTACHMENT_SIZE, MAX_IMAGE_DIM, MAX_INBAND_ATTACHMENT_SIZE,\n READ_DELAY, QUOTED_REPLY_LENGTH, VIDEO_PREVIEW_DIM } from '../config.js';\nimport { CALL_STATE_OUTGOING_INITATED, CALL_STATE_IN_PROGRESS } from '../constants.js';\nimport { blobToBase64, fileToBase64, imageScaled, makeImageUrl } from '../lib/blob-helpers.js';\nimport HashNavigation from '../lib/navigation.js';\nimport { bytesToHumanSize, relativeDateFormat, shortDateFormat } from '../lib/strformat.js';\n\n// Run timer with this frequency (ms) for checking notification queue.\nconst NOTIFICATION_EXEC_INTERVAL = 300;\n// Scroll distance before [go to latest message] button is shown.\nconst SHOW_GO_TO_LAST_DIST = 100;\n// Sctoll distance from the top when fetching the page of earlier messages is triggered.\nconst FETCH_PAGE_TRIGGER = 40;\n\nconst messages = defineMessages({\n online_now: {\n id: 'online_now',\n defaultMessage: 'online now',\n description: 'Indicator that the user or topic is currently online',\n },\n last_seen: {\n id: 'last_seen_timestamp',\n defaultMessage: 'Last seen',\n description: 'Label for the timestamp of when the user or topic was last online'\n },\n not_found: {\n id: 'title_not_found',\n defaultMessage: 'Not found',\n description: 'Title shown when topic is not found'\n },\n channel: {\n id: 'channel',\n defaultMessage: 'channel',\n description: 'Subtitle shown for channels in MessagesView instead of last seen'\n },\n file_attachment_too_large: {\n id: 'file_attachment_too_large',\n defaultMessage: 'The file size {size} exceeds the {limit} limit.',\n description: 'Error message when attachment is too large'\n },\n invalid_content: {\n id: 'invalid_content',\n defaultMessage: 'invalid content',\n description: 'Shown when the message is unreadable'\n },\n editing_message: {\n id: 'editing_message',\n defaultMessage: 'Editing',\n description: 'Title over message editing preview'\n },\n drag_file: {\n id: 'drag_file',\n defaultMessage: 'Drag file here',\n description: 'Prompt on the file drag-n-drop overlay banner'\n }\n});\n\n// Checks if the access permissions are granted but not yet accepted.\nfunction isUnconfirmed(acs) {\n if (acs) {\n const ex = acs.getExcessive() || '';\n return acs.isJoiner('given') && (ex.includes('R') || ex.includes('W'));\n }\n return false;\n}\n\nfunction isPeerRestricted(acs) {\n if (acs) {\n const ms = acs.getMissing() || '';\n return acs.isJoiner('want') && (ms.includes('R') || ms.includes('W'));\n }\n return false;\n}\n\nfunction shouldPresentCallPanel(callState) {\n // Show call panel if either:\n // - call is outgoing (and the client is waiting for the other side to pick up) or,\n // - call is already in progress.\n return callState == CALL_STATE_OUTGOING_INITATED || callState == CALL_STATE_IN_PROGRESS;\n}\n\nclass MessagesView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = MessagesView.getDerivedStateFromProps(props, {});\n\n this.componentSetup = this.componentSetup.bind(this);\n this.leave = this.leave.bind(this);\n this.sendMessage = this.sendMessage.bind(this);\n this.retrySend = this.retrySend.bind(this);\n this.sendImageAttachment = this.sendImageAttachment.bind(this);\n this.sendVideoAttachment = this.sendVideoAttachment.bind(this);\n this.sendFileAttachment = this.sendFileAttachment.bind(this);\n this.sendAudioAttachment = this.sendAudioAttachment.bind(this);\n this.sendKeyPress = this.sendKeyPress.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.handleScrollReference = this.handleScrollReference.bind(this);\n this.mountDnDEvents = this.mountDnDEvents.bind(this);\n this.handleScrollEvent = this.handleScrollEvent.bind(this);\n this.handleDescChange = this.handleDescChange.bind(this);\n this.handleSubsUpdated = this.handleSubsUpdated.bind(this);\n this.handleMessageUpdate = this.handleMessageUpdate.bind(this);\n this.handleAuxUpdate = this.handleAuxUpdate.bind(this);\n this.handleAllMessagesReceived = this.handleAllMessagesReceived.bind(this);\n this.handleInfoReceipt = this.handleInfoReceipt.bind(this);\n this.handleExpandMedia = this.handleExpandMedia.bind(this);\n this.handleClosePreview = this.handleClosePreview.bind(this);\n this.handleFormResponse = this.handleFormResponse.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n this.handleShowMessageContextMenu = this.handleShowMessageContextMenu.bind(this);\n this.handleNewChatAcceptance = this.handleNewChatAcceptance.bind(this);\n this.handleEnablePeer = this.handleEnablePeer.bind(this);\n this.handleAttachFile = this.handleAttachFile.bind(this);\n this.handleAttachImageOrVideo = this.handleAttachImageOrVideo.bind(this);\n this.handleCancelUpload = this.handleCancelUpload.bind(this);\n this.postReadNotification = this.postReadNotification.bind(this);\n this.clearNotificationQueue = this.clearNotificationQueue.bind(this);\n this.goToLatestMessage = this.goToLatestMessage.bind(this);\n this.handleFileDrop = this.handleFileDrop.bind(this);\n\n this.handlePickReply = this.handlePickReply.bind(this);\n this.handleEditMessage = this.handleEditMessage.bind(this);\n this.handleCancelReply = this.handleCancelReply.bind(this);\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n this.handleUnpinMessage = this.handleUnpinMessage.bind(this);\n this.handleCallHangup = this.handleCallHangup.bind(this);\n\n this.isDragEnabled = this.isDragEnabled.bind(this);\n this.handleDragStart = this.handleDragStart.bind(this);\n this.handleDragIn = this.handleDragIn.bind(this);\n this.handleDragOut = this.handleDragOut.bind(this);\n this.handleDrag = this.handleDrag.bind(this);\n this.handleDrop = this.handleDrop.bind(this);\n\n this.chatMessageRefs = [];\n this.getOrCreateMessageRef = this.getOrCreateMessageRef.bind(this);\n this.getVisibleMessageRange = this.getVisibleMessageRange.bind(this);\n\n // Keeps track of the drag event.\n // Need a counter b/c the browser's 'drag' events may fire multiple times\n // when the user takes the mouse pointer over the container:\n // for the component itself and for all nested/child elements.\n this.dragCounter = 0;\n this.dndRef = null;\n\n this.readNotificationQueue = [];\n this.readNotificationTimer = null;\n\n this.keyPressTimer = null;\n }\n\n getOrCreateMessageRef(seqId) {\n if (this.chatMessageRefs[seqId]) {\n return this.chatMessageRefs[seqId];\n }\n const ref = React.createRef();\n this.chatMessageRefs[seqId] = ref;\n return ref;\n }\n\n getVisibleMessageRange(holderRect) {\n let min = Number.MAX_SAFE_INTEGER, max = -1;\n let visibilityStatus = false;\n this.chatMessageRefs.every((ref, seq) => {\n if (ref.current) {\n const { top, bottom, height } = ref.current.getBoundingClientRect();\n const visible = top <= holderRect.top ? holderRect.top - top <= height : bottom - holderRect.bottom <= height;\n if (visible) {\n visibilityStatus = true;\n min = Math.min(min, seq);\n max = Math.max(max, seq);\n } else if (visibilityStatus) {\n // The remaining elements are no longer visible, no need to iterate them.\n return false;\n }\n }\n return true;\n });\n\n return max >= min ? {min: min, max: max} : {min: 0, max: 0};\n }\n\n componentDidMount() {\n if (this.messagesScroller) {\n this.messagesScroller.addEventListener('scroll', this.handleScrollEvent);\n }\n\n // Drag and drop events\n this.mountDnDEvents(this.dndRef);\n\n this.componentSetup({}, {});\n }\n\n componentWillUnmount() {\n if (this.messagesScroller) {\n this.messagesScroller.removeEventListener('scroll', this.handleScrollEvent);\n }\n\n // Flush all notifications.\n this.clearNotificationQueue();\n\n // Drag and drop events\n if (this.dndRef) {\n this.dndRef.removeEventListener('dragstart', this.handleDragStart);\n this.dndRef.removeEventListener('dragenter', this.handleDragIn);\n this.dndRef.removeEventListener('dragleave', this.handleDragOut);\n this.dndRef.removeEventListener('dragover', this.handleDrag);\n this.dndRef.removeEventListener('drop', this.handleDrop);\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n // Scroll last message into view on component update e.g. on message received\n // or vertical shrinking.\n if (this.messagesScroller &&\n (prevState.topic != this.state.topic || prevState.maxSeqId != this.state.maxSeqId ||\n prevState.minSeqId != this.state.minSeqId)) {\n // New message.\n if (this.state.scrollPosition < SHOW_GO_TO_LAST_DIST) {\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight -\n this.state.scrollPosition - this.messagesScroller.offsetHeight;\n }\n }\n\n if (!this.props.applicationVisible) {\n // If application is not visible, flush all unsent 'read' notifications.\n this.clearNotificationQueue();\n } else {\n // Otherwise assume there are unread messages.\n this.postReadNotification(0);\n }\n\n this.componentSetup(prevProps, prevState);\n }\n\n componentSetup(prevProps, prevState) {\n const topic = this.props.tinode ? this.props.tinode.getTopic(this.state.topic) : undefined;\n if (this.state.topic != prevState.topic) {\n if (prevState.topic && !Tinode.isNewGroupTopicName(prevState.topic)) {\n this.leave(prevState.topic);\n if (prevState.rtcPanel) {\n this.handleCallHangup(prevState.topic, prevProps.callSeq);\n }\n }\n\n if (topic) {\n topic.onData = this.handleMessageUpdate;\n topic.onAllMessagesReceived = this.handleAllMessagesReceived;\n topic.onInfo = this.handleInfoReceipt;\n topic.onMetaDesc = this.handleDescChange;\n topic.onSubsUpdated = this.handleSubsUpdated;\n topic.onPres = this.handleSubsUpdated;\n topic.onAuxUpdated = this.handleAuxUpdate;\n }\n }\n\n if (topic) {\n if ((this.state.topic != prevState.topic) || (this.props.myUserId && !prevProps.myUserId)) {\n // Don't immediately subscribe to a new p2p topic, wait for the first message.\n const newTopic = (this.props.newTopicParams && this.props.newTopicParams._topicName == this.props.topic);\n if (topic.isP2PType() && newTopic && !IMMEDIATE_P2P_SUBSCRIPTION) {\n topic.getMeta(topic.startMetaQuery().withDesc().build());\n } else if (this.props.myUserId) {\n this.subscribe(topic);\n }\n } else if (topic.isSubscribed() && this.state.isReader && !prevState.isReader) {\n // If reader status has changed and data became available.\n topic.getMeta(topic.startMetaQuery().withLaterData().build());\n }\n }\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n let nextState = {};\n if (!nextProps.topic) {\n // Default state: no topic.\n nextState = {\n minSeqId: -1,\n maxSeqId: -1,\n latestClearId: -1,\n onlineSubs: [],\n topic: null,\n title: '',\n avatar: null,\n isVerified: false,\n isStaff: false,\n isDangerous: false,\n deleted: false,\n docPreview: null,\n imagePreview: null,\n imagePostview: null,\n videoPreview: null,\n videoPostview: null,\n rtcPanel: null,\n typingIndicator: false,\n scrollPosition: 0,\n fetchingMessages: false,\n peerMessagingDisabled: false,\n channel: false,\n reply: null,\n contentToEdit: null,\n showGoToLastButton: false,\n dragging: false,\n pins: [],\n selectedPin: 0,\n subsVersion: 0\n };\n } else if (nextProps.topic != prevState.topic) {\n const topic = nextProps.tinode.getTopic(nextProps.topic);\n\n nextState = {\n topic: nextProps.topic,\n deleted: topic._deleted,\n docPreview: null,\n imagePreview: null,\n imagePostview: null,\n videoPreview: null,\n videoPostview: null,\n rtcPanel: null,\n typingIndicator: false,\n scrollPosition: 0,\n fetchingMessages: false,\n showGoToLastButton: false,\n contentToEdit: null,\n dragging: false,\n selectedPin: 0\n };\n\n if (nextProps.forwardMessage) {\n // We are forwarding a message. Show preview.\n nextState.reply = {\n content: nextProps.forwardMessage.preview,\n seq: null\n };\n } else {\n nextState.reply = null;\n }\n\n if (topic) {\n // Topic exists.\n const subs = [];\n\n if (nextProps.connected) {\n topic.subscribers((sub) => {\n if (sub.online && sub.user != nextProps.myUserId) {\n subs.push(sub);\n }\n });\n }\n\n Object.assign(nextState, {\n onlineSubs: subs\n });\n\n if (topic.public) {\n Object.assign(nextState, {\n title: topic.public.fn,\n avatar: makeImageUrl(topic.public.photo)\n });\n } else {\n Object.assign(nextState, {\n title: '',\n avatar: null\n });\n }\n\n const peer = topic.p2pPeerDesc();\n if (peer) {\n Object.assign(nextState, {\n peerMessagingDisabled: isPeerRestricted(peer.acs)\n });\n } else if (prevState.peerMessagingDisabled) {\n Object.assign(nextState, {\n peerMessagingDisabled: false\n });\n }\n Object.assign(nextState, {\n minSeqId: topic.minMsgSeq(),\n maxSeqId: topic.maxMsgSeq(),\n latestClearId: topic.maxClearId(),\n channel: topic.isChannelType(),\n pins: (topic.aux('pins') || []).slice()\n });\n\n if (nextProps.callTopic == topic.name && shouldPresentCallPanel(nextProps.callState)) {\n nextState.rtcPanel = nextProps.callTopic;\n }\n } else {\n // Invalid topic.\n Object.assign(nextState, {\n minSeqId: -1,\n maxSeqId: -1,\n latestClearId: -1,\n onlineSubs: [],\n title: '',\n avatar: null,\n peerMessagingDisabled: false,\n channel: false,\n pins: []\n });\n }\n } else {\n // We are still in same topic. Show the call panel if necessary.\n if (nextProps.callTopic == prevState.topic && !prevState.rtcPanel &&\n shouldPresentCallPanel(nextProps.callState)) {\n nextState.rtcPanel = nextProps.callTopic;\n }\n }\n\n if (nextProps.acs) {\n if (nextProps.acs.isWriter() != prevState.isWriter) {\n nextState.isWriter = !prevState.isWriter;\n }\n if (nextProps.acs.isReader() != prevState.isReader) {\n nextState.isReader = !prevState.isReader;\n }\n if (nextProps.acs.isAdmin() != prevState.isAdmin) {\n nextState.isAdmin = !prevState.isAdmin;\n }\n if (!nextProps.acs.isReader('given') != prevState.readingBlocked) {\n nextState.readingBlocked = !prevState.readingBlocked;\n }\n if (nextProps.acs.isSharer() != prevState.isSharer) {\n nextState.isSharer = !prevState.isSharer;\n }\n } else {\n if (prevState.isWriter) {\n nextState.isWriter = false;\n }\n if (prevState.isReader) {\n nextState.isReader = false;\n }\n if (prevState.isAdmin) {\n nextState.isAdmin = false;\n }\n if (!prevState.readingBlocked) {\n prevState.readingBlocked = true;\n }\n if (prevState.isSharer) {\n nextState.isSharer = false;\n }\n }\n\n if (isUnconfirmed(nextProps.acs) == !prevState.unconformed) {\n nextState.unconfirmed = !prevState.unconformed;\n }\n\n // Clear subscribers online when there is no connection.\n if (!nextProps.connected && prevState.onlineSubs && prevState.onlineSubs.length > 0) {\n nextState.onlineSubs = [];\n }\n\n return nextState;\n }\n\n subscribe(topic) {\n if (topic.isSubscribed() || !this.props.ready) {\n return;\n }\n\n // Is this a new topic?\n const newTopic = (this.props.newTopicParams && this.props.newTopicParams._topicName == this.props.topic);\n // Don't request the tags. They are useless unless the user\n // is the owner and is editing the topic.\n let getQuery = topic.startMetaQuery().withLaterDesc().withLaterSub().withAux();\n if (this.state.isReader || newTopic) {\n // Reading is either permitted or we don't know because it's a new topic. Ask for messages.\n getQuery = getQuery.withLaterData(MESSAGES_PAGE);\n if (this.state.isReader) {\n getQuery = getQuery.withLaterDel();\n }\n // And show \"loading\" spinner.\n this.setState({ fetchingMessages: true });\n }\n\n const setQuery = newTopic ? this.props.newTopicParams : undefined;\n topic.subscribe(getQuery.build(), setQuery)\n .then(ctrl => {\n if (ctrl.code == 303) {\n // Redirect to another topic requested.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', ctrl.params.topic));\n return;\n }\n if (this.state.topic != ctrl.topic) {\n this.setState({topic: ctrl.topic});\n }\n if (this.state.deleted) {\n this.setState({deleted: false});\n }\n this.props.onNewTopicCreated(this.props.topic, ctrl.topic);\n // If there are unsent messages (except hard-failed and video call messages),\n // try sending them now. Hard-failed and unsent video call messages will be dropped.\n let discard = [];\n topic.queuedMessages(pub => {\n if (pub._sending) {\n return;\n }\n if (pub._fatal || (pub.head && pub.head.webrtc)) {\n // Filter out unsent failed & video call messages.\n discard.push(pub.seq);\n return;\n }\n if (topic.isSubscribed()) {\n this.retrySend(pub);\n }\n });\n if (discard.length > 0) {\n topic.delMessagesList(discard, true);\n }\n })\n .catch(err => {\n console.error(\"Failed subscription to\", this.state.topic, err);\n this.props.onError(err.message, 'err');\n const blankState = MessagesView.getDerivedStateFromProps({}, {});\n blankState.title = this.props.intl.formatMessage(messages.not_found);\n this.setState(blankState);\n });\n }\n\n leave(oldTopicName) {\n if (!oldTopicName || !this.props.tinode.isTopicCached(oldTopicName)) {\n return;\n }\n\n const oldTopic = this.props.tinode.getTopic(oldTopicName);\n if (oldTopic && oldTopic.isSubscribed()) {\n oldTopic.leave(false)\n .catch(_ => { /* do nothing here */ })\n .finally(_ => {\n // We don't care if the request succeeded or failed.\n // The topic is dead regardless.\n this.setState({fetchingMessages: false});\n oldTopic.onData = undefined;\n oldTopic.onAllMessagesReceived = undefined;\n oldTopic.onInfo = undefined;\n oldTopic.onMetaDesc = undefined;\n oldTopic.onSubsUpdated = undefined;\n oldTopic.onPres = undefined;\n oldTopic.onAuxUpdated = undefined;\n });\n }\n }\n\n // Don't use React.createRef as the ref.current is not available in componentDidMount in this component.\n handleScrollReference(node) {\n if (node) {\n node.addEventListener('scroll', this.handleScrollEvent);\n this.messagesScroller = node;\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight -\n this.state.scrollPosition - this.messagesScroller.offsetHeight;\n }\n }\n\n // Get older messages and show/hide [go to latest message] button.\n handleScrollEvent(event) {\n const pos = event.target.scrollHeight - event.target.scrollTop - event.target.offsetHeight;\n this.setState({\n scrollPosition: pos,\n // Show [go to latest message] if far enough from bottom and scrolling down.\n showGoToLastButton: (pos > SHOW_GO_TO_LAST_DIST) && (pos < this.state.scrollPosition),\n });\n\n if (this.state.fetchingMessages || this.processingScrollEvent) {\n return;\n }\n\n if (event.target.scrollTop <= FETCH_PAGE_TRIGGER) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic && topic.isSubscribed()) {\n this.processingScrollEvent = true;\n const {min, max} = this.getVisibleMessageRange(event.target.getBoundingClientRect());\n const gaps = topic.msgHasMoreMessages(min, max, false);\n if (gaps.length > 0) {\n this.setState({fetchingMessages: true}, _ => {\n topic.getMessagesPage(MESSAGES_PAGE, gaps, min, max)\n .catch(err => this.props.onError(err.message, 'err'))\n .finally(_ => this.setState({fetchingMessages: false}));\n });\n }\n }\n }\n this.processingScrollEvent = false;\n }\n\n /* Mount drag and drop events */\n mountDnDEvents(dnd) {\n if (dnd) {\n dnd.addEventListener('dragstart', this.handleDragStart);\n dnd.addEventListener('dragenter', this.handleDragIn);\n dnd.addEventListener('dragleave', this.handleDragOut);\n dnd.addEventListener('dragover', this.handleDrag);\n dnd.addEventListener('drop', this.handleDrop);\n this.dndRef = dnd;\n }\n }\n\n goToLatestMessage() {\n this.setState({scrollPosition: 0});\n if (this.messagesScroller) {\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight - this.messagesScroller.offsetHeight;\n }\n }\n\n handleDescChange(desc) {\n if (desc.public) {\n this.setState({\n title: desc.public.fn,\n avatar: makeImageUrl(desc.public.photo)\n });\n } else {\n this.setState({\n title: '',\n avatar: null\n });\n }\n\n if (desc.acs) {\n this.setState({\n isWriter: desc.acs.isWriter(),\n isReader: desc.acs.isReader(),\n isAdmin: desc.acs.isAdmin(),\n readingBlocked: !desc.acs.isReader('given'),\n unconfirmed: isUnconfirmed(desc.acs),\n });\n }\n }\n\n postReadNotification(seq) {\n // Ignore notifications if the app is invisible.\n if (!this.props.applicationVisible) {\n return;\n }\n\n // Set up the timer if it's not running already.\n if (!this.readNotificationTimer) {\n this.readNotificationTimer = setInterval(_ => {\n if (this.readNotificationQueue.length == 0) {\n // Shut down the timer if the queue is empty.\n clearInterval(this.readNotificationTimer);\n this.readNotificationTimer = null;\n return;\n }\n\n let seq = -1;\n while (this.readNotificationQueue.length > 0) {\n const n = this.readNotificationQueue[0];\n if (n.topicName != this.state.topic) {\n // Topic has changed. Drop the notification.\n this.readNotificationQueue.shift();\n continue;\n }\n\n const now = new Date();\n if (n.sendAt <= now) {\n // Remove expired notification from queue.\n this.readNotificationQueue.shift();\n seq = Math.max(seq, n.seq);\n } else {\n break;\n }\n }\n\n // Send only one notification for the whole batch of messages.\n if (seq >= 0) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic) {\n topic.noteRead(seq);\n }\n }\n }, NOTIFICATION_EXEC_INTERVAL);\n }\n\n const now = new Date();\n this.readNotificationQueue.push({\n topicName: this.state.topic,\n seq: seq,\n sendAt: now.setMilliseconds(now.getMilliseconds() + READ_DELAY)\n });\n }\n\n // Clear notification queue and timer.\n clearNotificationQueue() {\n this.readNotificationQueue = [];\n if (this.readNotificationTimer) {\n clearInterval(this.readNotificationTimer);\n this.readNotificationTimer = null;\n }\n }\n\n handleSubsUpdated() {\n if (this.state.topic) {\n const subs = [];\n const topic = this.props.tinode.getTopic(this.state.topic);\n topic.subscribers(sub => {\n if (sub.online && sub.user != this.props.myUserId) {\n subs.push(sub);\n }\n });\n const newState = {onlineSubs: subs, subsVersion: this.state.subsVersion + 1};\n const peer = topic.p2pPeerDesc();\n if (peer) {\n Object.assign(newState, {\n peerMessagingDisabled: isPeerRestricted(peer.acs)\n });\n } else if (this.state.peerMessagingDisabled) {\n Object.assign(newState, {\n peerMessagingDisabled: false\n });\n }\n this.setState(newState);\n }\n }\n\n // The 'msg' could be false-ish if some message ranges were deleted.\n handleMessageUpdate(msg) {\n if (!this.state.topic) {\n return;\n }\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (!msg) {\n // msg could be null if one or more messages were deleted.\n // Updating state to force redraw.\n this.setState({latestClearId: topic.maxClearId()});\n return;\n }\n\n clearTimeout(this.keyPressTimer)\n this.setState({maxSeqId: topic.maxMsgSeq(), minSeqId: topic.minMsgSeq(), typingIndicator: false}, _ => {\n // Scroll to the bottom if the message is added to the end of the message\n // list if already at the bottom, otherwise show [go to latest] button.\n // Implemented as a callback to be sure the scroll height has been updated.\n if (topic.isNewMessage(msg.seq)) {\n if (this.state.scrollPosition > SHOW_GO_TO_LAST_DIST) {\n this.setState({showGoToLastButton: true});\n } else {\n this.goToLatestMessage();\n }\n } else {\n if (this.messagesScroller) {\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight - this.state.scrollPosition -\n this.messagesScroller.offsetHeight;\n }\n }\n });\n\n // Aknowledge messages except own messages. They are\n // automatically assumed to be read and recived.\n const status = topic.msgStatus(msg, true);\n if (status >= Tinode.MESSAGE_STATUS_SENT && msg.from != this.props.myUserId) {\n this.postReadNotification(msg.seq);\n }\n }\n\n handleAllMessagesReceived(count) {\n this.setState({fetchingMessages: false});\n if (count > 0) {\n // 0 means \"latest\".\n this.postReadNotification(0);\n }\n\n // Load pinned message too (if any);\n const topic = this.props.tinode.getTopic(this.state.topic);\n topic.getPinnedMessages();\n }\n\n handleAuxUpdate(aux) {\n const pins = (aux['pins'] || []).slice();\n let selectedPin = this.state.selectedPin;\n if (pins.length > this.state.pins.length) {\n // New pins added, show the latest.\n selectedPin = 0;\n } else if (selectedPin >= pins.length) {\n selectedPin = Math.max(0, pins.length - 1);\n }\n this.setState({pins: pins, selectedPin: selectedPin});\n }\n\n handleInfoReceipt(info) {\n switch (info.what) {\n case 'kp': {\n clearTimeout(this.keyPressTimer);\n this.keyPressTimer = setTimeout(_ => this.setState({typingIndicator: false}), KEYPRESS_DELAY + 1000);\n if (!this.state.typingIndicator) {\n this.setState({typingIndicator: true});\n }\n break;\n }\n case 'read':\n case 'recv':\n // Redraw due to changed recv/read status.\n this.forceUpdate();\n break;\n default:\n console.info(\"Other change in topic: \", info.what);\n }\n }\n\n handleExpandMedia(content) {\n if (!content) {\n return;\n }\n\n if (content.video) {\n this.setState({videoPostview: content});\n } else {\n this.setState({imagePostview: content});\n }\n }\n\n handleClosePreview() {\n if (this.state.imagePreview && this.state.imagePreview.url) {\n URL.revokeObjectURL(this.state.imagePreview.url);\n }\n if (this.state.videoPreview && this.state.videoPreview.url) {\n URL.revokeObjectURL(this.state.videoPreview.url);\n }\n this.setState({ imagePostview: null, imagePreview: null, docPreview: null, videoPreview: null, videoPostview: null});\n }\n\n handleFormResponse(action, text, data) {\n if (action == 'pub') {\n this.sendMessage(Drafty.attachJSON(Drafty.parse(text), data));\n } else if (action == 'url') {\n const url = new URL(data.ref);\n const params = url.searchParams;\n for (let key in data.resp) {\n if (data.resp.hasOwnProperty(key)) {\n params.set(key, data.resp[key]);\n }\n }\n ['name', 'seq'].forEach(key => {\n if (data[key]) {\n params.set(key, data[key]);\n }\n });\n params.set('uid', this.props.myUserId);\n params.set('topic', this.state.topic);\n url.search = params;\n window.open(url, '_blank');\n } else {\n console.info(\"Unknown action in form\", action);\n }\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.showContextMenu({ topicName: this.state.topic, y: e.pageY, x: e.pageX });\n }\n\n handleShowMessageContextMenu(params, messageSpecificMenuItems) {\n if (params.userFrom == 'chan') {\n params.userFrom = this.state.topic;\n params.userName = this.state.title;\n }\n params.topicName = this.state.topic;\n const menuItems = messageSpecificMenuItems || [];\n const topic = this.props.tinode.getTopic(params.topicName);\n if (topic) {\n if (!topic.isChannelType()) {\n menuItems.push('message_delete');\n }\n const acs = topic.getAccessMode();\n if (acs && acs.isDeleter()) {\n menuItems.push('message_delete_hard');\n }\n }\n this.props.showContextMenu(params, menuItems);\n }\n\n handleNewChatAcceptance(action) {\n this.props.onNewChat(this.state.topic, action);\n }\n\n handleEnablePeer(e) {\n e.preventDefault();\n this.props.onChangePermissions(this.state.topic, DEFAULT_P2P_ACCESS_MODE, this.state.topic);\n }\n\n sendKeyPress(audio) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic.isSubscribed()) {\n if (audio) {\n topic.noteRecording(true);\n } else {\n topic.noteKeyPress();\n }\n }\n }\n\n // sendMessage sends the message with an optional subscription to topic first.\n sendMessage(msg, uploadCompletionPromise, uploader) {\n let head;\n if (this.props.forwardMessage) {\n // We are forwarding a message.\n msg = this.props.forwardMessage.msg;\n head = this.props.forwardMessage.head;\n this.handleCancelReply();\n } else if (this.state.reply) {\n if (this.state.reply.editing) {\n if (msg == this.state.contentToEdit) {\n // Message unchanged.\n this.handleCancelReply();\n return;\n }\n // Editing an existing message.\n head = {replace: ':' + this.state.reply.seq};\n } else if (this.state.reply.content) {\n // Replying to a message in this topic.\n // Turn it into Drafty so we can make a quoted Drafty object later.\n head = {reply: '' + this.state.reply.seq};\n if (typeof msg == 'string') {\n msg = Drafty.parse(msg);\n }\n msg = Drafty.append(Drafty.sanitizeEntities(this.state.reply.content), msg);\n }\n this.handleCancelReply();\n }\n this.props.sendMessage(msg, uploadCompletionPromise, uploader, head);\n }\n\n // Retry sending a message.\n retrySend(pub) {\n this.props.sendMessage(pub.content, undefined, undefined, pub.head)\n .then(_ => {\n // All good. Remove the original message draft from the cache.\n const topic = this.props.tinode.getTopic(this.state.topic);\n topic.delMessagesList([pub.seq], true);\n });\n }\n\n // Send attachment as Drafty message:\n // - if file is too large, upload it and send a s link.\n // - if file is small enough, just send it in-band.\n sendFileAttachment(file) {\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n if (file.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(file);\n const msg = Drafty.attachFile(null, {\n mime: file.type,\n filename: file.name,\n size: file.size,\n urlPromise: uploadCompletionPromise\n });\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n } else {\n // Small enough to send inband.\n fileToBase64(file)\n .then(b64 => this.sendMessage(Drafty.attachFile(null, {\n mime: b64.mime,\n data: b64.bits,\n filename: b64.name,\n size: file.size\n })))\n .catch(err => this.props.onError(err.message, 'err'));\n }\n }\n\n // handleAttachFile method is called when [Attach file] button is clicked: launch attachment preview.\n handleAttachFile(file) {\n const maxExternAttachmentSize = this.props.tinode.getServerParam('maxFileUploadSize', MAX_EXTERN_ATTACHMENT_SIZE);\n\n if (file.size > maxExternAttachmentSize) {\n // Too large.\n this.props.onError(this.props.intl.formatMessage(messages.file_attachment_too_large,\n {size: bytesToHumanSize(file.size), limit: bytesToHumanSize(maxExternAttachmentSize)}), 'err');\n } else {\n this.setState({\n docPreview: {\n file: file,\n name: file.name,\n size: file.size,\n type: file.type\n }\n });\n }\n }\n\n handleCallHangup(topic, seq) {\n this.props.onVideoCallClosed();\n this.setState({\n rtcPanel: null\n });\n this.props.onCallHangup(topic, seq);\n }\n\n // sendImageAttachment sends the image bits as Drafty message.\n sendImageAttachment(caption, blob) {\n const mime = this.state.imagePreview.mime;\n const width = this.state.imagePreview.width;\n const height = this.state.imagePreview.height;\n const fname = this.state.imagePreview.filename;\n\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n if (blob.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(blob);\n\n // Make small preview to show while uploading.\n imageScaled(blob, IMAGE_PREVIEW_DIM, IMAGE_PREVIEW_DIM, -1, false)\n // Convert tiny image into base64 for serialization and previewing.\n .then(scaled => blobToBase64(scaled.blob))\n .then(b64 => {\n let msg = Drafty.insertImage(null, 0, {\n mime: mime,\n _tempPreview: b64.bits, // This preview will not be serialized.\n bits: b64.bits, // Image thumbnail.\n width: width,\n height: height,\n filename: fname,\n size: blob.size,\n urlPromise: uploadCompletionPromise\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n })\n .catch(err => this.props.onError(err, 'err'));\n return;\n }\n\n // Send the image inband if it's not too big. The image has been scaled already\n // in image preview.\n blobToBase64(blob)\n .then(b64 => {\n let msg = Drafty.insertImage(null, 0, {\n mime: b64.mime,\n bits: b64.bits,\n width: width,\n height: height,\n filename: fname,\n size: blob.size\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n this.sendMessage(msg);\n });\n }\n\n // sendVideoAttachment sends the video bits as Drafty message.\n sendVideoAttachment(caption, videoBlob, previewBlob, params) {\n const width = params.width;\n const height = params.height;\n\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n const uploads = [];\n let uploader;\n if ((videoBlob.size + previewBlob.size) > maxInbandAttachmentSize) {\n // One or both are too large to send inband. Uploading out of band and sending as a link.\n uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n\n uploads[0] = videoBlob.size > maxInbandAttachmentSize * 0.675 ? uploader.upload(videoBlob) : null;\n uploads[1] = previewBlob.size > maxInbandAttachmentSize * 0.275 ? uploader.upload(previewBlob) : null;\n }\n\n if (uploads.length == 0) {\n // Both video and preview are small enough to send inband.\n Promise.all([blobToBase64(videoBlob), blobToBase64(previewBlob)])\n .then(b64s => {\n const [v64, i64] = b64s;\n let msg = Drafty.insertVideo(null, 0, {\n mime: v64.mime,\n bits: v64.bits,\n preview: i64.bits,\n premime: i64.mime,\n width: width,\n height: height,\n duration: params.duration,\n filename: params.name,\n size: videoBlob.size\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n this.sendMessage(msg);\n });\n return;\n }\n\n const uploadCompletionPromise = Promise.all(uploads);\n\n const b64conv = [];\n // Small video converted to base64.\n b64conv[0] = uploads[0] ? null : blobToBase64(videoBlob);\n // Full-size preview fits inline.\n b64conv[1] = uploads[1] ? null : imageScaled(previewBlob, MAX_IMAGE_DIM, MAX_IMAGE_DIM, -1, false)\n .then(scaled => blobToBase64(scaled.blob));\n // Small preview to show while uploading.\n b64conv[2] = imageScaled(previewBlob, VIDEO_PREVIEW_DIM, VIDEO_PREVIEW_DIM, -1, false)\n .then(scaled => blobToBase64(scaled.blob));\n // Convert tiny image into base64 for serialization and previewing.\n Promise.all(b64conv)\n .then(b64s => {\n const [video, img, preview] = b64s;\n let msg = Drafty.insertVideo(null, 0, {\n mime: params.mime,\n bits: video ? video.bits : null,\n _tempPreview: preview.bits,\n preview: img ? img.bits : preview.bits,\n premime: img ? img.mime : preview.mime,\n width: width,\n height: height,\n duration: params.duration,\n filename: params.name,\n size: videoBlob.size,\n urlPromise: uploadCompletionPromise\n });\n\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n })\n .catch(err => this.props.onError(err.message, 'err'));\n }\n\n // handleAttachImageOrVideo method is called when [Attach image or video] button is clicked: launch image or video preview.\n handleAttachImageOrVideo(file) {\n const maxExternAttachmentSize = this.props.tinode.getServerParam('maxFileUploadSize', MAX_EXTERN_ATTACHMENT_SIZE);\n\n if (file.type.startsWith('video/')) {\n this.setState({videoPreview: {\n url: URL.createObjectURL(file),\n blob: file,\n filename: file.name,\n size: file.size,\n mime: file.type\n }});\n return;\n }\n\n // Get image dimensions and size, optionally scale it down.\n imageScaled(file, MAX_IMAGE_DIM, MAX_IMAGE_DIM, maxExternAttachmentSize, false)\n .then(scaled => {\n this.setState({imagePreview: {\n url: URL.createObjectURL(scaled.blob),\n blob: scaled.blob,\n filename: scaled.name,\n width: scaled.width,\n height: scaled.height,\n size: scaled.blob.size,\n mime: scaled.mime\n }});\n }).catch(err => {\n this.props.onError(err.message, 'err');\n });\n }\n\n // handleFileDrop is called when the user drags & drops a file upon the message view.\n handleFileDrop(files) {\n if (!files || files.length == 0) {\n return;\n }\n const file = files[0];\n if (file.type && file.type.startsWith('image/')) {\n this.handleAttachImageOrVideo(file);\n } else {\n this.handleAttachFile(file);\n }\n }\n\n // sendAudioAttachment sends audio bits inband as Drafty message (no preview).\n sendAudioAttachment(url, preview, duration) {\n fetch(url)\n .then(result => result.blob())\n .then(blob => {\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = this.props.tinode.getServerParam('maxMessageSize', MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024;\n if (blob.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = this.props.tinode.getLargeFileHelper();\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(blob);\n const msg = Drafty.appendAudio(null, {\n mime: blob.type,\n size: blob.size,\n duration: duration,\n preview: preview,\n urlPromise: uploadCompletionPromise\n });\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader);\n } else {\n // Small enough to send inband.\n blobToBase64(blob)\n .then(b64 => {\n this.sendMessage(Drafty.appendAudio(null, {\n mime: b64.mime,\n bits: b64.bits,\n size: blob.size,\n duration: duration,\n preview: preview,\n }))\n })\n }\n })\n .catch(err => {this.props.onError(err.message, 'err')});;\n }\n\n handleCancelUpload(seq, uploader) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n const found = topic.findMessage(seq);\n if (found) {\n found._cancelled = true;\n }\n uploader.cancel();\n }\n\n // seq: seq ID of the source message\n // context: message content.\n // senderId: UID of the sender of the source message.\n // senderName: full name of the sender of the original message.\n handlePickReply(seq, content, senderId, senderName) {\n if (!seq || !content) {\n this.setState({reply: null});\n return;\n }\n\n content = typeof content == 'string' ? Drafty.init(content) : content;\n if (Drafty.isValid(content)) {\n content = Drafty.replyContent(content, QUOTED_REPLY_LENGTH);\n } else {\n // /!\\ invalid content.\n content = Drafty.append(Drafty.init('\\u26A0 '),\n Drafty.wrapInto(this.props.intl.formatMessage(messages.invalid_content), 'EM'));\n }\n\n this.setState({\n reply: {\n content: Drafty.quote(senderName, senderId, content),\n seq: seq\n }\n });\n this.props.onCancelForwardMessage();\n }\n\n // seq: seq ID of the message to edit.\n // context: message content.\n handleEditMessage(seq, content) {\n if (!seq || !content) {\n this.setState({reply: null});\n return;\n }\n\n content = typeof content == 'string' ? Drafty.init(content) : content;\n const editable = Drafty.toMarkdown(content);\n if (Drafty.isValid(content)) {\n content = Drafty.replyContent(content, EDIT_PREVIEW_LENGTH);\n } else {\n // /!\\ invalid content.\n content = Drafty.append(Drafty.init('\\u26A0 '),\n Drafty.wrapInto(this.props.intl.formatMessage(messages.invalid_content), 'EM'));\n }\n\n this.setState({\n reply: {\n content: Drafty.quote(this.props.intl.formatMessage(messages.editing_message), null, content),\n seq: seq,\n editing: true\n },\n contentToEdit: editable\n });\n this.props.onCancelForwardMessage();\n }\n\n\n handleCancelReply() {\n this.setState({reply: null, contentToEdit: null});\n this.props.onCancelForwardMessage();\n }\n\n handleQuoteClick(replyToSeq) {\n const ref = this.getOrCreateMessageRef(replyToSeq);\n if (ref && ref.current) {\n ref.current.scrollIntoView({block: \"center\", behavior: \"smooth\"});\n ref.current.classList.add('flash');\n setTimeout(_ => {ref.current.classList.remove('flash')} , 1000);\n } else {\n console.error(\"Unresolved message ref\", replyToSeq);\n }\n }\n\n handleUnpinMessage(seq) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n topic.pinMessage(seq, false);\n }\n\n isDragEnabled() {\n return this.state.isWriter && !this.state.unconfirmed && !this.props.forwardMessage && !this.state.peerMessagingDisabled;\n }\n\n handleDragStart(e) {\n e.preventDefault();\n e.stopPropagation();\n e.dataTransfer.clearData();\n }\n\n handleDragIn(e) {\n e.preventDefault();\n e.stopPropagation();\n this.dragCounter++;\n if (e.dataTransfer.items && e.dataTransfer.items.length > 0) {\n this.setState({dragging: true});\n }\n }\n\n handleDragOut(e) {\n e.preventDefault();\n e.stopPropagation();\n this.dragCounter--;\n if (this.dragCounter <= 0) {\n this.setState({dragging: false});\n }\n }\n\n handleDrag(e) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n handleDrop(e) {\n e.preventDefault();\n e.stopPropagation();\n this.setState({dragging: false});\n if (this.isDragEnabled() && e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n this.handleFileDrop(e.dataTransfer.files);\n this.dragCounter = 0;\n }\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n\n let component;\n if (!this.state.topic) {\n component = (\n \n );\n } else {\n let component2;\n if (this.state.imagePreview) {\n // Preview image before sending.\n component2 = (\n \n );\n } else if (this.state.videoPreview) {\n // Preview video.\n component2 = (\n \n );\n } else if (this.state.imagePostview) {\n // Expand received image.\n component2 = (\n \n );\n } else if (this.state.videoPostview) {\n // Play received video.\n component2 = (\n \n );\n } else if (this.state.docPreview) {\n // Preview attachment before sending.\n component2 = (\n \n );\n } else if (this.state.rtcPanel) {\n // P2P call.\n if (Tinode.isP2PTopicName(this.state.rtcPanel)) {\n component2 = (\n \n );\n } else {\n // Video conference or stream.\n component2 = (\n \n );\n }\n } else {\n const topic = this.props.tinode.getTopic(this.state.topic);\n const isChannel = topic.isChannelType();\n const groupTopic = topic.isGroupType() && !isChannel;\n const icon_badges = [];\n if (topic.trusted) {\n if (topic.trusted.verified) {\n icon_badges.push({icon: 'verified', color: 'badge-inv'});\n }\n if (topic.trusted.staff) {\n icon_badges.push({icon: 'staff', color: 'badge-inv'});\n }\n if (topic.trusted.danger) {\n icon_badges.push({icon: 'dangerous', color: 'badge-inv'});\n }\n }\n\n const pinnedMessages = [];\n this.state.pins.forEach(seq => pinnedMessages.push(topic.latestMsgVersion(seq) || topic.findMessage(seq)));\n\n const messageNodes = [];\n let previousFrom = null;\n let prevDate = null;\n let chatBoxClass = null;\n topic.messages((msg, prev, next, i) => {\n let nextFrom = next ? (next.from || 'chan') : null;\n\n let sequence = 'single';\n let thisFrom = msg.from || 'chan';\n if (thisFrom == previousFrom) {\n if (thisFrom == nextFrom) {\n sequence = 'middle';\n } else {\n sequence = 'last';\n }\n } else if (thisFrom == nextFrom) {\n sequence = 'first';\n }\n previousFrom = thisFrom;\n\n const isReply = !(thisFrom == this.props.myUserId);\n const deliveryStatus = topic.msgStatus(msg, true);\n\n let userFrom = thisFrom, userName, userAvatar;\n const user = topic.userDesc(thisFrom);\n if (user && user.public) {\n userName = user.public.fn;\n userAvatar = makeImageUrl(user.public.photo);\n }\n chatBoxClass = groupTopic ? 'chat-box group' : 'chat-box';\n\n // Ref for this chat message.\n const ref = this.getOrCreateMessageRef(msg.seq);\n let replyToSeq = msg.head ? parseInt(msg.head.reply) : null;\n if (!replyToSeq || isNaN(replyToSeq)) {\n replyToSeq = null;\n }\n\n if (msg.hi) {\n // Deleted message.\n messageNodes.push(\n \n );\n } else {\n const thisDate = new Date(msg.ts);\n // This message was sent on a different date than the previous.\n if (!prevDate || prevDate.toDateString() != thisDate.toDateString()) {\n messageNodes.push(\n \n );\n prevDate = thisDate;\n }\n messageNodes.push(\n \n );\n }\n });\n\n let lastSeen = null;\n if (isChannel) {\n lastSeen = formatMessage(messages.channel);\n } else {\n const cont = this.props.tinode.getMeTopic().getContact(this.state.topic);\n if (cont && Tinode.isP2PTopicName(cont.topic)) {\n if (cont.online) {\n lastSeen = formatMessage(messages.online_now);\n } else if (cont.seen) {\n lastSeen = formatMessage(messages.last_seen) + \": \" +\n shortDateFormat(cont.seen.when, this.props.intl.locale);\n // TODO: also handle user agent in c.seen.ua\n }\n }\n }\n const avatar = this.state.avatar || true;\n const online = this.state.deleted ? null :\n this.props.online ? 'online' + (this.state.typingIndicator ? ' typing' : '') : 'offline';\n\n const titleClass = 'panel-title' + (this.state.deleted ? ' deleted' : '');\n\n let messagesComponent = (\n <>\n
\n \n
\n
    \n {messageNodes}\n
\n
\n {!this.state.isReader ?\n
\n {this.state.readingBlocked ?\n
\n \n
\n : null }\n
\n : null }\n
\n {this.state.peerMessagingDisabled && !this.state.unconfirmed ?\n
\n block .\n
: null}\n {this.state.unconfirmed ?\n \n :\n }\n \n );\n\n component2 = (\n <>\n
\n {this.props.displayMobile ?\n {e.preventDefault(); this.props.onHideMessagesView();}}>\n arrow_back\n \n :\n null}\n
\n \n {!isChannel ? : null}\n
\n
\n
{\n this.state.title ||\n \n }
\n
{lastSeen}
\n
\n
\n {!this.props.displayMobile ?\n this.setState({selectedPin: index})}\n onSelected={this.handleQuoteClick}\n onCancel={this.handleUnpinMessage} />\n : null}\n {groupTopic ?\n :\n null\n }\n \n
\n {this.props.displayMobile ?\n <>\n this.setState({selectedPin: index})}\n onSelected={this.handleQuoteClick}\n onCancel={this.handleUnpinMessage} />\n \n \n : null}\n \n {messagesComponent}\n {this.state.dragging && this.isDragEnabled() ?\n
{formatMessage(messages.drag_file)}
\n : null}\n \n );\n }\n component =
{component2}
\n }\n return component;\n }\n};\n\nexport default injectIntl(MessagesView);\n","// Create new topic and invite users or send an invite.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport ContactList from '../widgets/contact-list.jsx';\nimport NewTopicById from '../widgets/new-topic-by-id.jsx';\nimport NewTopicGroup from '../widgets/new-topic-group.jsx';\nimport SearchContacts from '../widgets/search-contacts.jsx';\n\nimport HashNavigation from '../lib/navigation.js';\nimport { theCard } from '../lib/utils.js';\n\nconst messages = defineMessages({\n search_for_contacts: {\n id: \"search_for_contacts\",\n defaultMessage: \"Use search to find contacts\",\n description: \"Text shown in contacts view when user entered no search query.\"\n },\n search_no_results: {\n id: \"search_no_results\",\n defaultMessage: \"Search returned no results\",\n description: \"Text shown in contacts view when query returned no results.\"\n },\n search_placeholder: {\n id: \"search_placeholder\",\n defaultMessage: \"List like alice@example.com, +17025550003...\",\n description: \"Placeholder in contacts search field\"\n },\n});\n\nclass NewTopicView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n tabSelected: 'find',\n searchQuery: null\n };\n\n this.handleTabClick = this.handleTabClick.bind(this);\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleSearchResultSelected = this.handleSearchResultSelected.bind(this);\n this.handleNewGroupSubmit = this.handleNewGroupSubmit.bind(this);\n this.handleGroupByID = this.handleGroupByID.bind(this);\n }\n\n componentDidMount() {\n this.props.onInitFind();\n }\n\n handleTabClick(e) {\n e.preventDefault();\n HashNavigation.navigateTo(HashNavigation.addUrlParam(window.location.hash, 'tab', e.currentTarget.dataset.id));\n this.setState({tabSelected: e.currentTarget.dataset.id});\n }\n\n handleSearchContacts(query) {\n this.props.onSearchContacts(query);\n this.setState({searchQuery: Tinode.isNullValue(query) ? null : query});\n }\n\n handleSearchResultSelected(topicName) {\n if (this.state.tabSelected == 'find') {\n HashNavigation.navigateTo(HashNavigation.removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(topicName);\n }\n }\n\n handleNewGroupSubmit(name, description, dataUrl, priv, tags, isChannel) {\n HashNavigation.navigateTo(HashNavigation.removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(undefined,\n {public: theCard(name, dataUrl, null, description), private: priv, tags: tags}, isChannel);\n }\n\n handleGroupByID(topicName) {\n HashNavigation.navigateTo(HashNavigation.removeUrlParam(window.location.hash, 'tab'));\n this.props.onCreateTopic(topicName);\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const no_contacts_placeholder = formatMessage(this.state.searchQuery ?\n messages.search_no_results : messages.search_for_contacts);\n const search_placeholder = formatMessage(messages.search_placeholder);\n return (\n
\n \n {this.state.tabSelected === 'grp' ?\n :\n this.state.tabSelected === 'byid' ?\n :\n
\n \n \n
}\n
\n );\n }\n};\n\nexport default injectIntl(NewTopicView);\n","// Tinode config panel.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\n\nimport HostSelector from '../widgets/host-selector.jsx';\n\nexport default class SettingsView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n transport: props.transport || 'def',\n serverAddress: props.serverAddress,\n secureConnection: props.secureConnection,\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleTransportSelected = this.handleTransportSelected.bind(this);\n this.handleServerAddressChange = this.handleServerAddressChange.bind(this);\n this.handleToggleSecure = this.handleToggleSecure.bind(this);\n }\n\n handleSubmit(e) {\n e.preventDefault();\n this.props.onUpdate({\n transport: this.state.transport,\n serverAddress: this.state.serverAddress,\n secureConnection: this.state.secureConnection,\n });\n }\n\n handleTransportSelected(e) {\n this.setState({transport: e.currentTarget.value});\n }\n\n handleServerAddressChange(name) {\n this.setState({serverAddress: name});\n }\n\n handleToggleSecure(e) {\n this.setState({secureConnection: !this.state.secureConnection});\n }\n\n render() {\n const names = {def: \"default\", ws: \"websocket\", lp: \"long polling\"};\n const transportOptions = [];\n ['def', 'ws', 'lp'].forEach(item => {\n const id = 'transport-' + item;\n const name = names[item];\n transportOptions.push(\n
  • \n \n \n
  • \n );\n });\n\n return (\n
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n \n
    \n
    \n
      \n {transportOptions}\n
    \n
    \n
    \n \n
    \n \n );\n }\n};\n","import React, { Suspense } from 'react';\nimport { defineMessages, FormattedMessage, injectIntl } from 'react-intl';\n\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport LoadSpinner from '../widgets/load-spinner.jsx';\nimport SideNavbar from '../widgets/side-navbar.jsx';\nimport TopicCommonView from './topic-common-view.jsx';\n\nconst AccountSettingsView = React.lazy(_ => import('./account-settings-view.jsx'));\nimport ContactsView from './contacts-view.jsx';\nconst CreateAccountView = React.lazy(_ => import('./create-account-view.jsx'));\nimport AccNotificationsView from './acc-notifications-view.jsx';\nimport AccSecurityView from './acc-security-view.jsx';\nimport AccSupportView from './acc-support-view.jsx';\nimport LoginView from './login-view.jsx';\nimport NewTopicView from './new-topic-view.jsx';\nconst PasswordResetView = React.lazy(_ => import('./password-reset-view.jsx'));\nimport SettingsView from './settings-view.jsx';\nimport ValidationView from './validation-view.jsx';\n\n// Panel titles for translation.\nconst messages = defineMessages({\n login: {\n id: 'sidepanel_title_login',\n description: 'Sidepanel title for LoginView.',\n defaultMessage: 'Sign In'\n },\n register: {\n id: 'sidepanel_title_register',\n description: 'Sidepanel title for CreateAccountView.',\n defaultMessage: 'Create Account'\n },\n settings: {\n id: 'sidepanel_title_settings',\n description: 'Sidepanel title for SettingsView.',\n defaultMessage: 'Settings'\n },\n edit: {\n id: 'sidepanel_title_account_settings',\n description: 'Sidepanel title for AccountSettingsView.',\n defaultMessage: 'Account Settings'\n },\n general: {\n id: 'panel_title_general',\n description: 'Title for TopicCommon.',\n defaultMessage: 'General'\n },\n security: {\n id: 'panel_title_security',\n description: 'Title for TopicSecirity and AccSecurity.',\n defaultMessage: 'Security'\n },\n crop: {\n id: 'panel_title_crop',\n description: 'Title for AvatarCropView.',\n defaultMessage: 'Drag to Adjust'\n },\n notif: {\n id: 'sidepanel_title_acc_notifications',\n description: 'Sidepanel title for AccNotificationsView.',\n defaultMessage: 'Notifications'\n },\n support: {\n id: 'sidepanel_title_acc_support',\n description: 'Sidepanel title for AccSupportView.',\n defaultMessage: 'Support'\n },\n newtpk: {\n id: 'sidepanel_title_newtpk',\n description: 'Sidepanel title for NewTopicView.',\n defaultMessage: 'Start New Chat'\n },\n cred: {\n id: 'sidepanel_title_cred',\n description: 'Sidepanel title for ValidationView.',\n defaultMessage: 'Confirm Credentials'\n },\n reset: {\n id: 'sidepanel_title_reset',\n description: 'Sidepanel title for PasswordResetView.',\n defaultMessage: 'Reset Password'\n },\n archive: {\n id: 'sidepanel_title_archive',\n description: 'Sidepanel title for ContactsView-Archive.',\n defaultMessage: 'Archived Chats'\n },\n blocked: {\n id: 'sidepanel_title_blocked',\n description: 'Sidepanel title for ContactsView-Blocked.',\n defaultMessage: 'Blocked Chats'\n }\n});\n\nclass SidepanelView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleNewTopic = this.handleNewTopic.bind(this);\n }\n\n handleNewTopic() {\n this.props.onNavigate('newtpk');\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const view = this.props.state || (this.props.myUserId ? 'contacts' : 'login');\n\n let title, avatar, badges;\n if (view == 'contacts') {\n title = this.props.title;\n avatar = this.props.avatar ? this.props.avatar : true;\n badges = this.props.trustedBadges;\n } else {\n title = formatMessage(messages[view]);\n avatar = false;\n badges = null;\n }\n\n let onCancel;\n if (['login', 'contacts'].indexOf(view) == -1) {\n onCancel = this.props.onCancel;\n }\n\n return (\n
    \n \n\n \n\n \n\n {view === 'login' ?\n :\n\n view === 'register' ?\n
    }>\n \n :\n\n view === 'settings' ?\n :\n\n view === 'edit' ?\n
    }>\n \n :\n\n (view === 'general' || view === 'crop') ?\n :\n\n view === 'notif' ?\n :\n\n view === 'security' ?\n :\n\n view === 'support' ?\n :\n\n (view === 'contacts' || view == 'archive' || view == 'blocked') ?\n :\n\n view === 'newtpk' ?\n :\n\n view === 'cred' ?\n :\n\n view === 'reset' ?\n
    }>\n \n :\n null}\n
    \n );\n }\n};\n\nexport default injectIntl(SidepanelView);\n","// The top-level class to hold all functionality together.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { initializeApp as firebaseInitApp } from 'firebase/app';\nimport { getMessaging as firebaseGetMessaging, getToken as firebaseGetToken,\n deleteToken as firebaseDelToken, onMessage as firebaseOnMessage } from 'firebase/messaging';\n\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport Alert from '../widgets/alert.jsx';\nimport ContextMenu from '../widgets/context-menu.jsx';\nimport ForwardDialog from '../widgets/forward-dialog.jsx';\nimport CallIncoming from '../widgets/call-incoming.jsx';\nconst PhoneCountrySelector = React.lazy(_ => import('../widgets/phone-country-selector.jsx'));\n\nimport InfoView from './info-view.jsx';\nimport MessagesView from './messages-view.jsx';\nimport SidepanelView from './sidepanel-view.jsx';\n\nimport { API_KEY, APP_NAME, DEFAULT_P2P_ACCESS_MODE, FORWARDED_PREVIEW_LENGTH, LOGGING_ENABLED,\n MEDIA_BREAKPOINT } from '../config.js';\nimport { CALL_STATE_NONE, CALL_STATE_OUTGOING_INITATED,\n CALL_STATE_INCOMING_RECEIVED, CALL_STATE_IN_PROGRESS,\n CALL_HEAD_STARTED } from '../constants.js';\nimport { PACKAGE_VERSION } from '../version.js';\nimport { base64ReEncode, makeImageUrl } from '../lib/blob-helpers.js';\nimport { detectServerAddress, isLocalHost, isSecureConnection } from '../lib/host-name.js';\nimport LocalStorageUtil from '../lib/local-storage.js';\nimport HashNavigation from '../lib/navigation.js';\nimport { secondsToTime } from '../lib/strformat.js'\nimport { updateFavicon } from '../lib/utils.js';\n\n// Sound to play on message received.\nconst POP_SOUND = new Audio('audio/msg.m4a');\n\nconst messages = defineMessages({\n reconnect_countdown: {\n id: 'reconnect_countdown',\n defaultMessage: 'Disconnected. Reconnecting in {seconds}…',\n description: 'Message shown when an app update is available.'\n },\n reconnect_now: {\n id: 'reconnect_now',\n defaultMessage: 'Try now',\n description: 'Prompt for reconnecting now'\n },\n push_init_failed: {\n id: 'push_init_failed',\n defaultMessage: 'Failed to initialize push notifications',\n description: 'Error message when push notifications have failed to initialize.'\n },\n invalid_security_token: {\n id: 'invalid_security_token',\n defaultMessage: 'Invalid security token',\n description: 'Error message when resetting password.'\n },\n no_connection: {\n id: 'no_connection',\n defaultMessage: 'No connection',\n description: 'Warning that the user is offline.'\n },\n code_doesnot_match: {\n id: 'code_doesnot_match',\n defaultMessage: 'Code does not match',\n description: 'Error message when the credential validation code is incorrect.'\n },\n menu_item_info: {\n id: 'menu_item_info',\n defaultMessage: 'Info',\n description: 'Show extended topic information'\n },\n menu_item_audio_call: {\n id: 'menu_item_audio_call',\n defaultMessage: 'Call',\n description: 'Start audio call'\n },\n menu_item_video_call: {\n id: 'menu_item_video_call',\n defaultMessage: 'Video call',\n description: 'Start video call'\n },\n cred_confirmed_successfully: {\n id: 'cred_confirmed_successfully',\n defaultMessage: 'Confirmed successfully',\n description: 'Notification message that the credential was successfully validated.'\n },\n password_reset_success: {\n id: 'password_reset_success',\n defaultMessage: 'Password reset successfully',\n description: 'Notification message that the password was successfully reset.'\n }\n});\n\nclass TinodeWeb extends React.Component {\n constructor(props) {\n super(props);\n\n this.selfRef = React.createRef();\n\n this.state = this.getBlankState();\n\n this.handleResize = this.handleResize.bind(this);\n this.handleHashRoute = this.handleHashRoute.bind(this);\n this.handleOnline = this.handleOnline.bind(this);\n this.checkForAppUpdate = this.checkForAppUpdate.bind(this);\n this.handleVisibilityEvent = this.handleVisibilityEvent.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleLoginRequest = this.handleLoginRequest.bind(this);\n this.handlePersistenceChange = this.handlePersistenceChange.bind(this);\n this.handleConnected = this.handleConnected.bind(this);\n this.handleAutoreconnectIteration = this.handleAutoreconnectIteration.bind(this);\n this.doLogin = this.doLogin.bind(this);\n this.handleLoginSuccessful = this.handleLoginSuccessful.bind(this);\n this.handleDisconnect = this.handleDisconnect.bind(this);\n this.tnMeMetaDesc = this.tnMeMetaDesc.bind(this);\n this.tnMeContactUpdate = this.tnMeContactUpdate.bind(this);\n this.tnMeSubsUpdated = this.tnMeSubsUpdated.bind(this);\n this.resetContactList = this.resetContactList.bind(this);\n this.tnInitFind = this.tnInitFind.bind(this);\n this.tnFndSubsUpdated = this.tnFndSubsUpdated.bind(this);\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleTopicSelected = this.handleTopicSelected.bind(this);\n this.handleHideMessagesView = this.handleHideMessagesView.bind(this);\n this.handleSendMessage = this.handleSendMessage.bind(this);\n this.handleNewChatInvitation = this.handleNewChatInvitation.bind(this);\n this.handleNewAccount = this.handleNewAccount.bind(this);\n this.handleNewAccountRequest = this.handleNewAccountRequest.bind(this);\n this.handleUpdatePasswordRequest = this.handleUpdatePasswordRequest.bind(this);\n this.handleUpdateAccountTagsRequest = this.handleUpdateAccountTagsRequest.bind(this);\n this.handleToggleIncognitoMode = this.handleToggleIncognitoMode.bind(this);\n this.handleSettings = this.handleSettings.bind(this);\n this.handleGlobalSettings = this.handleGlobalSettings.bind(this);\n this.handleShowArchive = this.handleShowArchive.bind(this);\n this.handleShowBlocked = this.handleShowBlocked.bind(this);\n this.handleToggleMessageSounds = this.handleToggleMessageSounds.bind(this);\n this.handleCredAdd = this.handleCredAdd.bind(this);\n this.handleCredDelete = this.handleCredDelete.bind(this);\n this.handleCredConfirm = this.handleCredConfirm.bind(this);\n this.initFCMessaging = this.initFCMessaging.bind(this);\n this.toggleFCMToken = this.toggleFCMToken.bind(this);\n this.handlePushMessage = this.handlePushMessage.bind(this);\n this.handleSidepanelCancel = this.handleSidepanelCancel.bind(this);\n this.handleStartTopicRequest = this.handleStartTopicRequest.bind(this);\n this.handleNewTopicCreated = this.handleNewTopicCreated.bind(this);\n this.handleTopicUpdateRequest = this.handleTopicUpdateRequest.bind(this);\n this.handleUnarchive = this.handleUnarchive.bind(this);\n this.handleChangePermissions = this.handleChangePermissions.bind(this);\n this.handleTagsUpdateRequest = this.handleTagsUpdateRequest.bind(this);\n this.handleLogout = this.handleLogout.bind(this);\n this.handleDeleteAccount = this.handleDeleteAccount.bind(this);\n this.handleDeleteTopicRequest = this.handleDeleteTopicRequest.bind(this);\n this.handleDeleteMessagesRequest = this.handleDeleteMessagesRequest.bind(this);\n this.handleLeaveUnsubRequest = this.handleLeaveUnsubRequest.bind(this);\n this.handleBlockTopicRequest = this.handleBlockTopicRequest.bind(this);\n this.handleReportTopic = this.handleReportTopic.bind(this);\n this.handleShowContextMenu = this.handleShowContextMenu.bind(this);\n this.defaultTopicContextMenu = this.defaultTopicContextMenu.bind(this);\n this.handleHideContextMenu = this.handleHideContextMenu.bind(this);\n this.handleShowAlert = this.handleShowAlert.bind(this);\n this.handleShowInfoView = this.handleShowInfoView.bind(this);\n this.handleMemberUpdateRequest = this.handleMemberUpdateRequest.bind(this);\n this.handleValidateCredentialsRequest = this.handleValidateCredentialsRequest.bind(this);\n this.handlePasswordResetRequest = this.handlePasswordResetRequest.bind(this);\n this.handleResetPassword = this.handleResetPassword.bind(this);\n this.handleContextMenuAction = this.handleContextMenuAction.bind(this);\n this.handleShowCountrySelector = this.handleShowCountrySelector.bind(this);\n\n this.handleShowForwardDialog = this.handleShowForwardDialog.bind(this);\n this.handleHideForwardDialog = this.handleHideForwardDialog.bind(this);\n\n this.handleStartVideoCall = this.handleStartVideoCall.bind(this);\n this.handleStartAudioCall = this.handleStartAudioCall.bind(this);\n this.handleInfoMessage = this.handleInfoMessage.bind(this);\n this.handleDataMessage = this.handleDataMessage.bind(this);\n this.handleCallClose = this.handleCallClose.bind(this);\n\n this.handleCallInvite = this.handleCallInvite.bind(this);\n this.handleCallRinging = this.handleCallRinging.bind(this);\n this.handleCallHangup = this.handleCallHangup.bind(this);\n this.handleCallSendOffer = this.handleCallSendOffer.bind(this);\n this.handleCallIceCandidate = this.handleCallIceCandidate.bind(this);\n this.handleCallSendAnswer = this.handleCallSendAnswer.bind(this);\n this.handleVCCallJoin = this.handleVCCallJoin.bind(this);\n\n this.handleCallAccept = this.handleCallAccept.bind(this);\n\n this.sendMessageToTopic = this.sendMessageToTopic.bind(this);\n\n // FIXME: this is unused.\n this.callTimeoutTimer = null;\n }\n\n getBlankState() {\n const settings = LocalStorageUtil.getObject('settings') || {};\n const persist = !!LocalStorageUtil.getObject('keep-logged-in');\n\n return {\n connected: false,\n // Connected and subscribed to 'me'\n ready: false,\n // Try to re-login on new connection.\n autoLogin: false,\n transport: settings.transport || null,\n serverAddress: settings.serverAddress || detectServerAddress(),\n secureConnection: settings.secureConnection === undefined ?\n isSecureConnection() : settings.secureConnection,\n serverVersion: \"no connection\",\n // \"On\" is the default, so saving the \"off\" state.\n messageSounds: !settings.messageSoundsOff,\n incognitoMode: false,\n // Persistent request to enable alerts.\n desktopAlerts: persist && !!settings.desktopAlerts,\n // Enable / disable checkbox.\n desktopAlertsEnabled: (isSecureConnection() || isLocalHost()) &&\n (typeof firebaseInitApp != 'undefined') && (typeof navigator != 'undefined') &&\n (typeof FIREBASE_INIT != 'undefined'),\n firebaseToken: persist ? LocalStorageUtil.getObject('firebase-token') : null,\n\n applicationVisible: !document.hidden,\n\n errorText: '',\n errorLevel: null,\n errorAction: undefined,\n errorActionText: null,\n\n sidePanelSelected: 'login',\n sidePanelTitle: null,\n sidePanelAvatar: null,\n myTrustedBadges: [],\n loadSpinnerVisible: false,\n\n login: '',\n password: '',\n persist: persist,\n myUserId: null,\n liveConnection: navigator.onLine,\n topicSelected: '',\n topicSelectedOnline: false,\n topicSelectedAcs: null,\n newTopicParams: null,\n loginDisabled: false,\n displayMobile: (window.innerWidth <= MEDIA_BREAKPOINT),\n infoPanel: undefined,\n mobilePanel: 'sidepanel',\n\n // Video calls.\n callTopic: undefined,\n callState: CALL_STATE_NONE,\n callAudioOnly: undefined,\n // If true, call state should be transitioned to CALL_STATE_IN_PROGRESS upon\n // switching to the call topic.\n callShouldStart: false,\n\n contextMenuVisible: false,\n contextMenuBounds: null,\n contextMenuClickAt: null,\n contextMenuParams: null,\n contextMenuItems: [],\n\n forwardDialogVisible: false,\n forwardMessage: null,\n\n // Modal alert dialog.\n alertVisible: false,\n alertParams: {},\n\n // Chats as shown in the ContactsView\n chatList: [],\n // Contacts returned by a search query.\n searchResults: [],\n // Merged results of a search query and p2p chats.\n searchableContacts: [],\n // Credential validation.\n reqCredMethod: undefined,\n credMethod: undefined,\n credCode: undefined,\n credToken: undefined,\n // Topic to go to after login.\n requestedTopic: undefined\n };\n }\n\n componentDidMount() {\n window.addEventListener('resize', this.handleResize);\n this.handleOnlineOn = _ => { this.handleOnline(true); }\n window.addEventListener('online', this.handleOnlineOn);\n this.handleOnlineOff = _ => { this.handleOnline(false); }\n window.addEventListener('offline', this.handleOnlineOff);\n window.addEventListener('hashchange', this.handleHashRoute);\n\n // Process background notifications from the service worker.\n if (typeof BroadcastChannel == 'function') {\n const serviceWorkerChannel = new BroadcastChannel('tinode-sw');\n serviceWorkerChannel.addEventListener('message', this.handlePushMessage);\n } else {\n // Safari is broken by design.\n console.warn(\"Your browser does not support BroadcastChannel. Some features will not be available\");\n }\n\n // Window/tab visible or invisible for pausing timers.\n document.addEventListener('visibilitychange', this.handleVisibilityEvent);\n\n this.setState({\n viewportWidth: document.documentElement.clientWidth,\n viewportHeight: document.documentElement.clientHeight\n });\n\n new Promise((resolve, reject) => {\n this.tinode = TinodeWeb.tnSetup(this.state.serverAddress, isSecureConnection(), this.state.transport,\n this.props.intl.locale, this.state.persist, resolve);\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;\n this.tinode.onInfoMessage = this.handleInfoMessage;\n this.tinode.onDataMessage = this.handleDataMessage;\n }).then(_ => {\n // Initialize desktop alerts.\n if (this.state.desktopAlertsEnabled) {\n this.initFCMessaging().catch(_ => {\n // do nothing: handled earlier.\n // catch needed to pervent unnecessary logging of error.\n });\n }\n\n // Read contacts from cache.\n this.resetContactList();\n\n const token = this.state.persist ? LocalStorageUtil.getObject('auth-token') : undefined;\n if (token) {\n this.setState({autoLogin: true});\n\n // When reading from storage, date is returned as string.\n token.expires = new Date(token.expires);\n this.tinode.setAuthToken(token);\n this.tinode.connect().catch(err => {\n // Socket error\n this.handleError(err.message, 'err');\n });\n }\n\n this.readTimer = null;\n this.readTimerCallback = null;\n\n // Parse the hash navigation params.\n const parsedNav = HashNavigation.parseUrlHash(window.location.hash);\n // Maybe navigate to home screen.\n if (!['cred', 'reset', 'register'].includes(parsedNav.path[0])) {\n // Save possible topic name.\n this.setState({requestedTopic: parsedNav.path[1]});\n const path = parsedNav.params && parsedNav.params.cred_done ?\n HashNavigation.addUrlParam('', 'cred_done', parsedNav.params.cred_done):\n '';\n HashNavigation.navigateTo(path);\n } else {\n this.handleHashRoute();\n }\n });\n }\n\n componentWillUnmount() {\n window.removeEventListener('resize', this.handleResize);\n window.removeEventListener('hashchange', this.handleHashRoute);\n window.removeEventListener('online', this.handleOnlineOn);\n window.removeEventListener('offline', this.handleOnlineOff);\n document.removeEventListener('visibilitychange', this.handleVisibilityEvent);\n }\n\n // Setup transport (usually websocket) and server address. This will terminate connection with the server.\n static tnSetup(serverAddress, secureConnection, transport, locale, persistentCache, onSetupCompleted) {\n const tinode = new Tinode({appName: APP_NAME, host: serverAddress, apiKey: API_KEY, transport: transport,\n secure: secureConnection, persist: persistentCache}, onSetupCompleted);\n tinode.setHumanLanguage(locale);\n tinode.enableLogging(LOGGING_ENABLED, true);\n return tinode;\n }\n\n // Tinode received a push notification from the server.\n handlePushMessage(payload) {\n this.tinode.oobNotification(payload.data || {});\n }\n\n initFCMessaging() {\n const {formatMessage, locale} = this.props.intl;\n const onError = (msg, err) => {\n console.error(msg, err);\n this.handleError(formatMessage(messages.push_init_failed), 'err');\n this.setState({firebaseToken: null});\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n }\n\n try {\n this.fcm = firebaseGetMessaging(firebaseInitApp(FIREBASE_INIT, APP_NAME));\n return navigator.serviceWorker.getRegistration('/service-worker.js').then(reg => {\n return reg || navigator.serviceWorker.register('/service-worker.js').then(reg => {\n this.checkForAppUpdate(reg);\n return reg;\n });\n }).then(reg => {\n // Pass locale and version config to the service worker.\n (reg.active || reg.installing).postMessage(JSON.stringify({locale: locale, version: PACKAGE_VERSION}));\n // Request token.\n return TinodeWeb.requestFCMToken(this.fcm, reg);\n }).then(token => {\n const persist = LocalStorageUtil.getObject('keep-logged-in');\n if (token != this.state.firebaseToken) {\n this.tinode.setDeviceToken(token);\n if (persist) {\n LocalStorageUtil.setObject('firebase-token', token);\n }\n }\n this.setState({firebaseToken: token, desktopAlerts: true});\n if (persist) {\n LocalStorageUtil.updateObject('settings', {desktopAlerts: true});\n }\n\n // Handhe FCM pushes\n // (a) for channels always,\n // (b) pushes when the app is in foreground but has no focus.\n firebaseOnMessage(this.fcm, payload => { this.handlePushMessage(payload); });\n }).catch(err => {\n // SW registration or FCM has failed :(\n onError(err);\n throw err;\n });\n } catch (err) {\n onError(err);\n return Promise.reject(err);\n }\n }\n\n // Google's FCM API is idiotic.\n static requestFCMToken(fcm, sw) {\n return firebaseGetToken(fcm, {\n serviceWorkerRegistration: sw,\n vapidKey: FIREBASE_INIT.messagingVapidKey\n }).then(token => {\n if (token) {\n return token;\n } else if (typeof Notification != 'undefined') {\n // Try to request permissions.\n return Notification.requestPermission().then(permission => {\n if (permission === 'granted') {\n return firebaseGetToken(fcm, {\n serviceWorkerRegistration: reg,\n vapidKey: FIREBASE_INIT.messagingVapidKey\n }).then(token => {\n if (token) {\n return token;\n } else {\n throw new Error(\"Failed to initialize notifications\");\n }\n });\n } else {\n throw new Error(\"No permission to send notifications: \" + permission);\n }\n });\n }\n throw new Error(\"Notifications are not supported\");\n });\n }\n\n handleResize() {\n const mobile = document.documentElement.clientWidth <= MEDIA_BREAKPOINT;\n this.setState({\n viewportWidth: document.documentElement.clientWidth,\n viewportHeight: document.documentElement.clientHeight\n });\n if (this.state.displayMobile != mobile) {\n this.setState({displayMobile: mobile});\n }\n }\n\n // Check if a newer version of TinodeWeb app is available at the server.\n checkForAppUpdate(reg) {\n reg.onupdatefound = _ => {\n const installingWorker = reg.installing;\n installingWorker.onstatechange = _ => {\n if (installingWorker.state == 'installed' && navigator.serviceWorker.controller) {\n const msg = <>\n \n \n .;\n this.handleError(msg, 'info');\n }\n }\n }\n }\n\n // Handle for hash navigation (hashchange) event: update state.\n handleHashRoute() {\n const hash = HashNavigation.parseUrlHash(window.location.hash);\n // Start with panel parameters.\n const newState = {\n infoPanel: hash.params.info,\n newTopicTabSelected: hash.params.tab\n };\n\n if (hash.path && hash.path.length > 0) {\n // Left-side panel selector.\n if (['register','settings','edit','notif','security','support','general','crop',\n 'cred','reset','newtpk','archive','blocked','contacts',''].includes(hash.path[0])) {\n newState.sidePanelSelected = hash.path[0];\n } else {\n console.warn(\"Unknown sidepanel view\", hash.path[0]);\n }\n\n // Topic for MessagesView selector.\n let topicName = hash.path[1] || null;\n if (topicName != this.state.topicSelected) {\n if (!Tinode.topicType(topicName)) {\n // Clear invalid topic name and hide messages view on mobile.\n topicName = null;\n newState.mobilePanel = 'sidepanel';\n } else {\n // Topic valid: show messages view on mobile.\n newState.mobilePanel = 'topic-view';\n }\n Object.assign(newState, {\n topicSelected: topicName,\n topicSelectedAcs: this.tinode.getTopicAccessMode(topicName)\n });\n }\n } else {\n // Empty hashpath\n Object.assign(newState, {sidePanelSelected: '', topicSelected: null});\n }\n\n // Save credential validation parameters, if available.\n if (hash.params.method) {\n newState.credMethod = hash.params.method;\n }\n if (hash.params.code) {\n newState.credCode = hash.params.code;\n }\n if (hash.params.token) {\n newState.credToken = hash.params.token;\n }\n\n // Show a message if validation was successful.\n if (hash.params.cred_done) {\n Object.assign(newState,\n TinodeWeb.stateForError(this.props.intl.formatMessage(messages.cred_confirmed_successfully), 'info'));\n }\n\n this.setState(newState);\n }\n\n handleOnline(online) {\n if (online) {\n this.handleError();\n clearInterval(this.reconnectCountdown);\n this.tinode.reconnect();\n } else {\n this.handleError(this.props.intl.formatMessage(messages.no_connection), 'warn');\n }\n this.setState({liveConnection: online});\n }\n\n handleVisibilityEvent() {\n this.setState({applicationVisible: !document.hidden});\n }\n\n static stateForError(err, level, action, actionText) {\n return {\n errorText: err,\n errorLevel: level,\n errorAction: action,\n errorActionText: actionText,\n callShouldStart: false,\n };\n }\n\n handleError(err, level, action, actionText) {\n this.setState(TinodeWeb.stateForError(err, level, action, actionText));\n }\n\n // User clicked Login button in the side panel.\n handleLoginRequest(login, password) {\n this.setState({\n loginDisabled: true,\n login: login,\n password: password,\n loadSpinnerVisible: true,\n autoLogin: true\n });\n this.handleError('', null);\n\n if (this.tinode.isConnected()) {\n this.doLogin(login, password, null, {meth: this.state.credMethod, resp: this.state.credCode});\n } else {\n this.tinode.connect().catch(err => {\n // Socket error\n this.setState({loginDisabled: false, autoLogin: false, loadSpinnerVisible: false});\n this.handleError(err.message, 'err');\n });\n }\n\n if (this.state.desktopAlertsEnabled && !this.state.firebaseToken) {\n // Firefox and Safari: \"The Notification permission may only be requested from inside a\n // short running user-generated event handler\".\n this.initFCMessaging();\n }\n }\n\n // Enable or disable saving the password and IndexedDB.\n handlePersistenceChange(persist) {\n if (persist) {\n this.tinode.initStorage().then(_ => {\n LocalStorageUtil.setObject('keep-logged-in', true);\n this.setState({persist: true});\n });\n } else {\n this.tinode.clearStorage().then(_ => {\n LocalStorageUtil.setObject('keep-logged-in', false);\n this.setState({persist: false});\n });\n }\n }\n\n // Connection succeeded.\n handleConnected() {\n // Just to be sure.\n clearInterval(this.reconnectCountdown);\n this.handleError();\n\n const params = this.tinode.getServerInfo();\n this.setState({\n serverVersion: params.ver + ' ' + (params.build ? params.build : 'none'),\n // \"reqCred\":{\"auth\":[\"email\"]}\n reqCredMethod: ((params.reqCred || {}).auth || [])[0] || 'email'\n });\n\n if (this.state.autoLogin) {\n this.doLogin(this.state.login, this.state.password, null,\n {meth: this.state.credMethod, resp: this.state.credCode});\n }\n }\n\n // Called for each auto-reconnect iteration.\n handleAutoreconnectIteration(sec, prom) {\n clearInterval(this.reconnectCountdown);\n\n if (sec < 0) {\n // Clear error\n this.handleError();\n return;\n }\n\n if (prom) {\n // Reconnecting now\n prom.then(_ => {\n // Reconnected: clear error\n this.handleError();\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n return;\n }\n\n const {formatMessage} = this.props.intl;\n let count = sec / 1000;\n count = count | count;\n this.reconnectCountdown = setInterval(_ => {\n if (count < -10) {\n // Count could go to negative if computer woke up from sleep.\n clearInterval(this.reconnectCountdown);\n this.tinode.reconnect();\n return;\n }\n\n const fmtTime = (count > 99) ? secondsToTime(count) : count;\n this.handleError(\n formatMessage(messages.reconnect_countdown, {seconds: fmtTime}),\n 'warn',\n _ => {\n clearInterval(this.reconnectCountdown);\n this.tinode.reconnect();\n },\n formatMessage(messages.reconnect_now)\n );\n count -= 1;\n }, 1000);\n }\n\n // Connection lost\n handleDisconnect(err) {\n this.setState({\n connected: false,\n ready: false,\n topicSelectedOnline: false,\n errorText: err && err.message ? err.message : \"Disconnected\",\n errorLevel: err && err.message ? 'err' : 'warn',\n loginDisabled: false,\n contextMenuVisible: false,\n forwardDialogVisible: false,\n serverVersion: \"no connection\"\n });\n }\n\n doLogin(login, password, tmpToken, cred) {\n if (this.tinode.isAuthenticated()) {\n // Already logged in. Go to default screen.\n HashNavigation.navigateTo('');\n return;\n }\n\n let token = tmpToken || (this.tinode.getAuthToken() || {}).token;\n if (!(login && password) && !token) {\n // No login credentials provided.\n // Make sure we are on the login page.\n HashNavigation.navigateTo('');\n this.setState({loginDisabled: false});\n return;\n }\n\n // Sanitize and package credentail.\n cred = Tinode.credential(cred);\n // May be disconnected.\n let connectionPromise = this.tinode.isConnected() ? Promise.resolve() : this.tinode.connect();\n // Try to login with login/password. If they are not available, try token; if no token, ask for login/password.\n let loginPromise;\n if (login && password) {\n token = null;\n this.setState({password: null});\n loginPromise = connectionPromise.then(_ => this.tinode.loginBasic(login, password, cred));\n } else {\n loginPromise = connectionPromise.then(_ => this.tinode.loginToken(token, cred));\n }\n\n loginPromise.then(ctrl => {\n if (ctrl.code >= 300 && ctrl.text === 'validate credentials') {\n this.setState({loadSpinnerVisible: false});\n if (cred) {\n this.handleError(this.props.intl.formatMessage(messages.code_doesnot_match), 'warn');\n }\n TinodeWeb.navigateToCredentialsView(ctrl.params);\n } else {\n this.handleLoginSuccessful();\n }\n }).catch(err => {\n const autoLogin = err.code >= 500;\n // Connection or login failed, report error.\n this.setState({\n loginDisabled: false,\n credMethod: undefined,\n credCode: undefined,\n loadSpinnerVisible: false,\n autoLogin: autoLogin\n });\n this.handleError(err.message, 'err');\n console.warn(\"Login failed\", err);\n if (!autoLogin) {\n if (token) {\n this.handleLogout();\n }\n HashNavigation.navigateTo('');\n }\n });\n }\n\n static navigateToCredentialsView(params) {\n const parsed = HashNavigation.parseUrlHash(window.location.hash);\n parsed.path[0] = 'cred';\n parsed.params['method'] = params.cred[0];\n parsed.params['token'] = params.token;\n parsed.params['code'] = params.code;\n HashNavigation.navigateTo(HashNavigation.composeUrlHash(parsed.path, parsed.params));\n }\n\n handleLoginSuccessful() {\n this.handleError();\n\n // Refresh authentication token.\n if (LocalStorageUtil.getObject('keep-logged-in')) {\n LocalStorageUtil.setObject('auth-token', this.tinode.getAuthToken());\n }\n\n const goToTopic = this.state.requestedTopic;\n // Logged in fine, subscribe to 'me' attaching callbacks from the contacts view.\n const me = this.tinode.getMeTopic();\n me.onMetaDesc = this.tnMeMetaDesc;\n me.onContactUpdate = this.tnMeContactUpdate;\n me.onSubsUpdated = this.tnMeSubsUpdated;\n this.setState({\n connected: true,\n credMethod: undefined,\n credCode: undefined,\n credToken: undefined,\n myUserId: this.tinode.getCurrentUserID(),\n autoLogin: true,\n requestedTopic: undefined,\n });\n // Subscribe, fetch topic desc, the list of subscriptions. Messages are not fetched.\n me.subscribe(\n me.startMetaQuery().\n withLaterSub().\n withDesc().\n withTags().\n withCred().\n build()\n ).catch(err => {\n this.tinode.disconnect();\n localStorage.removeItem('auth-token');\n this.handleError(err.message, 'err');\n HashNavigation.navigateTo('');\n }).finally(_ => {\n this.setState({loadSpinnerVisible: false});\n });\n let urlHash = HashNavigation.setUrlSidePanel(window.location.hash, 'contacts');\n if (goToTopic) {\n urlHash = HashNavigation.setUrlTopic(urlHash, goToTopic);\n }\n HashNavigation.navigateTo(urlHash);\n }\n\n tnMeMetaDesc(desc) {\n if (desc) {\n if (desc.public) {\n this.setState({\n sidePanelTitle: desc.public.fn,\n sidePanelAvatar: makeImageUrl(desc.public.photo)\n });\n }\n if (desc.trusted) {\n const badges = [];\n for (const [key, val] of Object.entries(desc.trusted)) {\n if (val) {\n badges.push(key);\n }\n }\n this.setState({\n myTrustedBadges: badges,\n });\n }\n if (desc.acs) {\n this.setState({\n incognitoMode: !desc.acs.isPresencer()\n });\n }\n }\n }\n\n // Reactions to updates to the contact list.\n tnMeContactUpdate(what, cont) {\n if (what == 'on' || what == 'off') {\n this.resetContactList();\n if (this.state.topicSelected == cont.topic) {\n this.setState({topicSelectedOnline: (what == 'on')});\n }\n } else if (what == 'read') {\n this.resetContactList();\n } else if (what == 'msg' && cont) {\n // Check if the topic is archived. If so, don't play a sound.\n const topic = this.tinode.getTopic(cont.topic);\n const archived = topic && topic.isArchived();\n\n // New message received. Maybe the message is from the current user, then unread is 0.\n if (cont.unread > 0 && this.state.messageSounds && !archived) {\n // Skip update if the topic is currently open, otherwise the badge will annoyingly flash.\n if (document.hidden || this.state.topicSelected != cont.topic) {\n POP_SOUND.play().catch(_ => {\n // play() throws if the user did not click the app first: https://goo.gl/xX8pDD.\n });\n }\n }\n // Reorder contact list to use possibly updated 'touched'.\n this.resetContactList();\n } else if (what == 'recv') {\n // Explicitly ignoring \"recv\" -- it causes no visible updates to contact list.\n } else if (what == 'gone' || what == 'unsub') {\n // Topic deleted or user unsubscribed. Remove topic from view.\n // If the currently selected topic is gone, clear the selection.\n if (this.state.topicSelected == cont.topic) {\n this.handleTopicSelected(null);\n }\n // Redraw without the deleted topic.\n this.resetContactList();\n } else if (what == 'acs') {\n // Permissions changed. If it's for the currently selected topic,\n // update the views.\n if (this.state.topicSelected == cont.topic) {\n this.setState({topicSelectedAcs: cont.acs});\n }\n } else if (what == 'del') {\n // TODO: messages deleted (hard or soft) -- update pill counter.\n } else if (what == 'upd' || what == 'call') {\n // upd, call - handled by the SDK. Explicitly ignoring here.\n } else {\n // TODO(gene): handle other types of notifications:\n // * ua -- user agent changes (maybe display a pictogram for mobile/desktop).\n console.info(\"Unsupported (yet) presence update:\", what, \"in\", (cont || {}).topic);\n }\n }\n\n tnMeSubsUpdated(unused) {\n this.resetContactList();\n }\n\n // Merge search results and contact list to create a single flat\n // list of known contacts for GroupManager to use.\n static prepareSearchableContacts(chatList, foundContacts) {\n const merged = {};\n\n // For chatList topics merge only p2p topics and convert them to the\n // same format as foundContacts.\n for (const c of chatList) {\n if (Tinode.isP2PTopicName(c.topic)) {\n merged[c.topic] = {\n user: c.topic,\n updated: c.updated,\n public: c.public,\n private: c.private,\n acs: c.acs\n };\n }\n }\n\n // Add all foundCountacts if they have not been added already.\n for (const c of foundContacts) {\n if (!merged[c.user]) {\n merged[c.user] = c;\n }\n }\n\n return Object.values(merged);\n }\n\n resetContactList() {\n const newState = {\n chatList: []\n };\n\n if (!this.state.ready) {\n newState.ready = true;\n }\n\n this.tinode.getMeTopic().contacts((c) => {\n if (!c.topic && !c.user) {\n // Contacts expect c.topic to be set.\n c.topic = c.name;\n }\n\n newState.chatList.push(c);\n if (this.state.topicSelected == c.topic) {\n newState.topicSelectedOnline = c.online;\n newState.topicSelectedAcs = c.acs;\n }\n });\n\n const past = new Date(0);\n newState.chatList.sort((a, b) => {\n return (a.touched || past).getTime() - (b.touched || past).getTime();\n });\n\n // Merge search results and chat list.\n newState.searchableContacts = TinodeWeb.prepareSearchableContacts(newState.chatList, this.state.searchResults);\n this.setState(newState);\n }\n\n /* Fnd topic: find contacts by tokens */\n tnInitFind() {\n const fnd = this.tinode.getFndTopic();\n fnd.onSubsUpdated = this.tnFndSubsUpdated;\n if (fnd.isSubscribed()) {\n this.tnFndSubsUpdated();\n } else {\n fnd.subscribe(fnd.startMetaQuery().withSub().build()).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n }\n\n tnFndSubsUpdated() {\n const foundContacts = [];\n // Don't attempt to create P2P topics which already exist. Server will reject the duplicates.\n this.tinode.getFndTopic().contacts((s) => {\n foundContacts.push(s);\n });\n this.setState({\n searchResults: foundContacts,\n searchableContacts: TinodeWeb.prepareSearchableContacts(this.state.chatList, foundContacts)\n });\n }\n\n /** Called when the user enters a contact into the contact search field in the NewAccount panel\n @param query {Array} is an array of contacts to search for\n */\n handleSearchContacts(query) {\n const fnd = this.tinode.getFndTopic();\n fnd.setMeta({desc: {public: query}})\n .then(_ => fnd.getMeta(fnd.startMetaQuery().withSub().build()))\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n // User clicked on a topic in the side panel or deleted a topic.\n handleTopicSelected(topicName) {\n // Clear newTopicParams after use.\n if (this.state.newTopicParams && this.state.newTopicParams._topicName != topicName) {\n this.setState({\n newTopicParams: null\n });\n }\n\n if (topicName) {\n this.setState({\n errorText: '',\n errorLevel: null,\n mobilePanel: 'topic-view',\n infoPanel: undefined\n });\n // Different topic selected.\n if (this.state.topicSelected != topicName) {\n this.setState({\n topicSelectedOnline: this.tinode.isTopicOnline(topicName),\n topicSelectedAcs: this.tinode.getTopicAccessMode(topicName),\n forwardMessage: null\n });\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', topicName));\n }\n } else {\n // Currently selected contact deleted\n this.setState({\n topicSelected: null,\n errorText: '',\n errorLevel: null,\n mobilePanel: 'sidepanel',\n topicSelectedOnline: false,\n topicSelectedAcs: null,\n infoPanel: undefined,\n forwardMessage: null\n });\n\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', null));\n }\n }\n\n // In mobile view user requested to show sidepanel\n handleHideMessagesView() {\n this.setState({\n mobilePanel: 'sidepanel'\n });\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, null));\n }\n\n // User is sending a message, either plain text or a drafty object, possibly\n // with attachments.\n // - msg - Drafty message with content\n // - promise - Promise to be resolved when the upload is completed\n // - uploadCompletionPromise - for tracking progress\n // - head - head dictionary to be attached to the message\n handleSendMessage(msg, uploadCompletionPromise, uploader, head) {\n const topic = this.tinode.getTopic(this.state.topicSelected);\n /* TODO: check if return is required */\n return this.sendMessageToTopic(topic, msg, uploadCompletionPromise, uploader, head);\n }\n\n sendMessageToTopic(topic, msg, uploadCompletionPromise, uploader, head) {\n msg = topic.createMessage(msg, false);\n // The uploader is used to show progress.\n msg._uploader = uploader;\n\n if (head) {\n msg.head = Object.assign(msg.head || {}, head);\n }\n\n const completion = [];\n if (uploadCompletionPromise) {\n completion.push(uploadCompletionPromise);\n }\n\n if (!topic.isSubscribed()) {\n // Topic is not subscribed yet. Subscribe.\n const subscribePromise =\n topic.subscribe()\n .then(_ => {\n // If there are unsent messages (except video call messages),\n // try sending them now. Unsent video call messages will be dropped.\n let calls = [];\n topic.queuedMessages(pub => {\n if (pub._sending || pub.seq == msg.seq) {\n return;\n }\n if (pub.head && pub.head.webrtc) {\n // Filter out unsent video call messages.\n calls.push(pub.seq);\n return;\n }\n if (topic.isSubscribed()) {\n topic.publishMessage(pub);\n }\n });\n if (calls.length > 0) {\n topic.delMessagesList(calls, true);\n }\n });\n completion.push(subscribePromise);\n }\n\n // TODO: check if return is required.\n return topic.publishDraft(msg, Promise.all(completion))\n .then(ctrl => {\n if (topic.isArchived()) {\n topic.archive(false);\n }\n return ctrl;\n })\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleNewChatInvitation(topicName, action) {\n const topic = this.tinode.getTopic(topicName);\n let response = null;\n switch (action) {\n case 'accept':\n // Accept given permissions.\n const mode = topic.getAccessMode().getGiven();\n response = topic.setMeta({sub: {mode: mode}});\n if (topic.isP2PType()) {\n // For P2P topics change 'given' permission of the peer too.\n // In p2p topics the other user has the same name as the topic.\n response = response.then(_ => topic.setMeta({sub: {user: topicName, mode: mode}}));\n }\n break;\n case 'delete':\n // Ignore invitation by deleting it.\n response = topic.delTopic(true);\n break;\n case 'block':\n // Ban the topic making futher invites impossible.\n // Just self-ban.\n const am = topic.getAccessMode().updateWant('-JP').getWant();\n response = topic.setMeta({sub: {mode: am}}).then(_ => this.handleTopicSelected(null));\n break;\n default:\n console.warn(\"Unknown invitation action\", '\"' + action + '\"\"');\n }\n\n if (response != null) {\n response.catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n // User chose a Sign Up menu item.\n handleNewAccount() {\n this.handleError();\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, 'register'));\n }\n\n // Actual registration of a new account.\n handleNewAccountRequest(login_, password_, public_, cred_, tags_) {\n // Clear old error, if any.\n this.handleError();\n\n this.tinode.connect(this.state.serverAddress)\n .then(_ => {\n let attachments;\n if (public_ && public_.photo && public_.photo.ref) {\n attachments = [public_.photo.ref];\n }\n return this.tinode.createAccountBasic(login_, password_,\n {public: public_, tags: tags_, cred: Tinode.credential(cred_), attachments: attachments});\n }).then(ctrl => {\n if (ctrl.code >= 300 && ctrl.text == 'validate credentials') {\n TinodeWeb.navigateToCredentialsView(ctrl.params);\n } else {\n this.handleLoginSuccessful(this);\n }\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleToggleIncognitoMode(on) {\n // Make state undefined.\n this.setState({incognitoMode: null});\n\n const me = this.tinode.getMeTopic();\n const am = me.getAccessMode().updateWant(on ? '-P' : '+P').getWant();\n me.setMeta({sub: {mode: am}}).catch(err => {\n // Request failed, keep existing state.\n this.setState({incognitoMode: !on});\n this.handleError(err.message, 'err');\n });\n }\n\n handleUpdateAccountTagsRequest(_, tags) {\n this.tinode.getMeTopic().setMeta({tags: tags})\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n // User chose Settings menu item.\n handleSettings() {\n this.handleError();\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'edit' : 'settings'));\n }\n\n // User updated global parameters.\n handleGlobalSettings(settings) {\n const serverAddress = settings.serverAddress || this.state.serverAddress;\n const transport = settings.transport || this.state.transport;\n const secureConnection = settings.secureConnection === undefined ?\n this.state.secureConnection : settings.secureConnection;\n if (this.tinode) {\n this.tinode.clearStorage();\n this.tinode.onDisconnect = undefined;\n this.tinode.disconnect();\n }\n this.tinode = TinodeWeb.tnSetup(serverAddress, secureConnection, transport,\n this.props.intl.locale, LocalStorageUtil.getObject('keep-logged-in'));\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;\n this.tinode.onInfoMessage = this.handleInfoMessage;\n this.tinode.onDataMessage = this.handleDataMessage;\n\n this.setState({\n serverAddress: serverAddress,\n transport: transport,\n secureConnection: secureConnection,\n });\n LocalStorageUtil.setObject('settings', {\n serverAddress: serverAddress,\n transport: transport,\n secureConnection: secureConnection,\n });\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, ''));\n }\n\n // User chose 'Archived chats'.\n handleShowArchive() {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'archive' : ''));\n }\n\n // User viewes 'Blocked chats'.\n handleShowBlocked() {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'blocked' : ''));\n }\n\n toggleFCMToken(enabled) {\n if (enabled) {\n this.setState({desktopAlerts: null});\n if (!this.state.firebaseToken) {\n this.initFCMessaging();\n } else {\n this.setState({desktopAlerts: true});\n if (LocalStorageUtil.getObject('keep-logged-in')) {\n LocalStorageUtil.updateObject('settings', {desktopAlerts: true});\n }\n }\n } else if (this.state.firebaseToken && this.fcm) {\n firebaseDelToken(this.fcm).catch(err => {\n console.error(\"Unable to delete token.\", err);\n }).finally(_ => {\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n localStorage.removeItem('firebase-token');\n this.setState({desktopAlerts: false, firebaseToken: null});\n // Inform the server that the token was deleted.\n this.tinode.setDeviceToken(null);\n });\n } else {\n this.setState({desktopAlerts: false, firebaseToken: null});\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n }\n }\n\n handleToggleMessageSounds(enabled) {\n this.setState({messageSounds: enabled});\n LocalStorageUtil.updateObject('settings', {\n messageSoundsOff: !enabled\n });\n }\n\n handleCredAdd(method, value) {\n const me = this.tinode.getMeTopic();\n me.setMeta({cred: {meth: method, val: value}})\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleCredDelete(method, value) {\n const me = this.tinode.getMeTopic();\n me.delCredential(method, value)\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleCredConfirm(method, response) {\n TinodeWeb.navigateToCredentialsView({cred: [method], code: response});\n }\n\n // User clicked Cancel button in Setting or Sign Up panel.\n handleSidepanelCancel() {\n const parsed = HashNavigation.parseUrlHash(window.location.hash);\n let path = '';\n if (['security','support','general','notif'].includes(parsed.path[0])) {\n path = 'edit';\n } else if ('crop' == parsed.path[0]) {\n path = 'general';\n } else if ('blocked' == parsed.path[0]) {\n path = 'security';\n } else if (this.state.myUserId) {\n path = 'contacts';\n }\n parsed.path[0] = path;\n if (parsed.params) {\n delete parsed.params.code;\n delete parsed.params.method;\n delete parsed.params.tab;\n delete parsed.params.scheme;\n delete parsed.params.token;\n }\n HashNavigation.navigateTo(HashNavigation.composeUrlHash(parsed.path, parsed.params));\n this.setState({errorText: '', errorLevel: null});\n }\n\n // Sidepanel navigator. No need to bind to 'this'.\n basicNavigator(hash) {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, hash));\n }\n\n // Topic info navigator. No need to bind to 'this'.\n infoNavigator(hash) {\n HashNavigation.navigateTo(HashNavigation.setUrlInfoPanel(window.location.hash, hash));\n }\n\n // Request to start a topic, new or selected from search results, or \"by ID\".\n handleStartTopicRequest(topicName, newTopicParams, isChannel) {\n // Check if topic is indeed new. If not, launch it.\n if (topicName && this.tinode.isTopicCached(topicName)) {\n this.handleTopicSelected(topicName);\n return;\n }\n\n const params = {};\n if (Tinode.isP2PTopicName(topicName)) {\n // Because we are initiating the subscription, set 'want' to all permissions.\n params.sub = {mode: DEFAULT_P2P_ACCESS_MODE};\n // Give the other user all permissions too.\n params.desc = {defacs: {auth: DEFAULT_P2P_ACCESS_MODE}};\n } else {\n topicName = topicName || this.tinode.newGroupTopicName(isChannel);\n if (newTopicParams) {\n params.desc = {public: newTopicParams.public, private: {comment: newTopicParams.private}};\n params.tags = newTopicParams.tags;\n }\n }\n params._topicName = topicName;\n this.setState({newTopicParams: params}, _ => {this.handleTopicSelected(topicName)});\n }\n\n // New topic was created, here is the new topic name.\n handleNewTopicCreated(oldName, newName) {\n let nextState = {};\n if (this.state.callShouldStart) {\n nextState = {callState: CALL_STATE_IN_PROGRESS, callShouldStart: false};\n }\n if (this.state.topicSelected == oldName && oldName != newName) {\n // If the current URl contains the old topic name, replace it with new.\n // Update the name of the selected topic first so the navigator doen't clear\n // the state.\n nextState.topicSelected = newName;\n }\n this.setState(nextState, _ => {\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', newName));\n });\n }\n\n handleTopicUpdateRequest(topicName, pub, priv, defacs) {\n this.handleError();\n\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n const params = {};\n let attachments;\n if (pub) {\n if (pub.photo) {\n if (pub.photo.ref && pub.photo.ref != Tinode.DEL_CHAR) {\n attachments = [pub.photo.ref];\n } else if (!pub.photo.data || pub.photo.data == Tinode.DEL_CHAR) {\n pub.photo = Tinode.DEL_CHAR;\n }\n }\n params.public = pub;\n }\n\n if (typeof priv == 'string') {\n params.private = (priv === Tinode.DEL_CHAR) ?\n Tinode.DEL_CHAR : {comment: priv};\n }\n if (defacs) {\n params.defacs = defacs;\n }\n topic.setMeta({desc: params, attachments: attachments})\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleUnarchive(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n topic.archive(false).catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleUpdatePasswordRequest(password) {\n this.handleError();\n\n if (password) {\n this.tinode.updateAccountBasic(null, this.tinode.getCurrentLogin(), password)\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleChangePermissions(topicName, mode, uid) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n const am = topic.getAccessMode();\n if (uid) {\n am.updateGiven(mode);\n mode = am.getGiven();\n } else {\n am.updateWant(mode);\n mode = am.getWant();\n }\n topic.setMeta({sub: {user: uid, mode: mode}})\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleTagsUpdateRequest(topicName, tags) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n topic.setMeta({tags: tags})\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleLogout() {\n updateFavicon(0);\n\n // Remove stored data.\n localStorage.removeItem('auth-token');\n localStorage.removeItem('firebase-token');\n localStorage.removeItem('settings');\n if (this.state.firebaseToken) {\n firebaseDelToken(this.fcm);\n }\n\n clearInterval(this.reconnectCountdown);\n\n let cleared;\n if (this.tinode) {\n cleared = this.tinode.clearStorage();\n this.tinode.onDisconnect = undefined;\n this.tinode.disconnect();\n } else {\n cleared = Promose.resolve();\n }\n this.setState(this.getBlankState());\n\n cleared.then(_ => {\n this.tinode = TinodeWeb.tnSetup(this.state.serverAddress, isSecureConnection(),\n this.state.transport, this.props.intl.locale, LocalStorageUtil.getObject('keep-logged-in'), _ => {\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;\n this.tinode.onInfoMessage = this.handleInfoMessage;\n this.tinode.onDataMessage = this.handleDataMessage;\n HashNavigation.navigateTo('');\n })\n });\n }\n\n handleDeleteAccount() {\n this.tinode.delCurrentUser(true).then(_ => {\n this.handleLogout();\n });\n }\n\n handleDeleteTopicRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // Request to hard-delete topic.\n topic.delTopic(true).then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleDeleteMessagesRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // Request hard-delete all messages.\n topic.delMessagesAll(true)\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleLeaveUnsubRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n topic.leave(true).then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleBlockTopicRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n topic.updateMode(null, '-JP')\n .then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n })\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleReportTopic(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // Publish spam report.\n this.tinode.report('report', topicName);\n\n // Remove J and P permissions.\n topic.updateMode(null, '-JP')\n .then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n })\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleShowContextMenu(params, menuItems) {\n this.setState({\n contextMenuVisible: true,\n contextMenuClickAt: {x: params.x, y: params.y},\n contextMenuParams: params,\n contextMenuItems: menuItems || this.defaultTopicContextMenu(params.topicName),\n contextMenuBounds: this.selfRef.current.getBoundingClientRect()\n });\n }\n\n //\n handleShowForwardDialog(params) {\n if (this.state.sidePanelSelected == 'newtpk') {\n // If the Find panel is active, close it.\n this.handleSidepanelCancel();\n }\n const header = '➦ ' + params.userName;\n const content = typeof params.content == 'string' ? Drafty.init(params.content) : Drafty.forwardedContent(params.content);\n const preview = Drafty.preview(content, FORWARDED_PREVIEW_LENGTH, true);\n const msg = Drafty.append(Drafty.appendLineBreak(Drafty.mention(header, params.userFrom)), content);\n const msgPreview = Drafty.quote(header, params.userFrom, preview);\n\n const head = {\n forwarded: params.topicName + ':' + params.seq\n };\n this.setState({\n forwardDialogVisible: true,\n forwardMessage: { head: head, msg: msg, preview: msgPreview }\n });\n }\n\n defaultTopicContextMenu(topicName) {\n const topic = this.tinode.getTopic(topicName);\n\n if (topic._deleted) {\n return [\n 'topic_delete'\n ];\n }\n\n let muted = false, blocked = false, self_blocked = false, subscribed = false, deleter = false,\n archived = false, webrtc = false, writer = false;\n if (topic) {\n subscribed = topic.isSubscribed();\n archived = topic.isArchived();\n\n const acs = topic.getAccessMode();\n if (acs) {\n muted = acs.isMuted();\n blocked = !acs.isJoiner();\n self_blocked = !acs.isJoiner('want');\n deleter = acs.isDeleter();\n writer = acs.isWriter();\n }\n }\n\n webrtc = writer && !!this.tinode.getServerParam('iceServers');\n const mediaServerAvailable = !!this.tinode.getServerParam('vcEndpoint');\n\n return [\n subscribed ? {\n title: this.props.intl.formatMessage(messages.menu_item_info),\n handler: this.handleShowInfoView\n } : null,\n subscribed && Tinode.isP2PTopicName(topicName) && webrtc ? {\n title: this.props.intl.formatMessage(messages.menu_item_audio_call),\n handler: this.handleStartAudioCall\n } : null,\n subscribed && webrtc ? {\n title: this.props.intl.formatMessage(messages.menu_item_video_call),\n disabled: Tinode.isGroupTopicName(topicName) && !mediaServerAvailable,\n handler: this.handleStartVideoCall\n } : null,\n subscribed ? 'messages_clear' : null,\n subscribed && deleter ? 'messages_clear_hard' : null,\n muted ? (blocked ? null : 'topic_unmute') : 'topic_mute',\n self_blocked ? 'topic_unblock' : 'topic_block',\n archived ? 'topic_restore' : 'topic_archive',\n 'topic_delete'\n ];\n }\n\n handleHideContextMenu() {\n this.setState({\n contextMenuVisible: false,\n contextMenuClickAt: null,\n contextMenuParams: null,\n contextMenuBounds: null\n });\n }\n\n handleHideForwardDialog(keepForwardedMessage) {\n this.setState({\n forwardDialogVisible: false,\n forwardMessage: keepForwardedMessage ? this.state.forwardMessage : null\n });\n }\n\n handleContextMenuAction(action, promise, params) {\n if (action == 'topic_archive') {\n if (promise && params.topicName && params.topicName == this.state.topicSelected) {\n promise.then(_ => {\n this.handleTopicSelected(null);\n });\n }\n } else if (action == 'menu_item_forward') {\n this.handleShowForwardDialog(params);\n }\n }\n\n handleShowAlert(title, content, onConfirm, confirmText, onReject, rejectText) {\n this.setState({\n alertVisible: true,\n alertParams: {\n title: title,\n content: content,\n onConfirm: onConfirm,\n confirm: confirmText,\n onReject: onReject,\n reject: rejectText\n }\n });\n }\n\n handleShowInfoView() {\n HashNavigation.navigateTo(HashNavigation.addUrlParam(window.location.hash, 'info', 'info'));\n this.setState({infoPanel: 'info'});\n }\n\n handleMemberUpdateRequest(topicName, added, removed) {\n if (!topicName) {\n return;\n }\n\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n if (added && added.length > 0) {\n added.forEach(uid => {\n topic.invite(uid, null)\n .catch(err => this.handleError(err.message, 'err'));\n });\n }\n\n if (removed && removed.length > 0) {\n removed.forEach(uid => {\n topic.delSubscription(uid)\n .catch(err => this.handleError(err.message, 'err'));\n });\n }\n }\n\n handleValidateCredentialsRequest(cred, code, token) {\n if (this.tinode.isAuthenticated()) {\n // Adding new email or phone number in account setting.\n this.tinode.getMeTopic().setMeta({cred: {meth: cred, resp: code}})\n .then(_ => HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, 'contacts')))\n .catch(err => this.handleError(err.message, 'err'));\n } else {\n // Credential validation on signup.\n this.setState({credMethod: cred, credCode: code, credToken: token});\n this.doLogin(null, null, token, {meth: cred, resp: code});\n }\n }\n\n handlePasswordResetRequest(method, value) {\n // If already connected, connnect() will return a resolved promise.\n return this.tinode.connect()\n .then(_ => this.tinode.requestResetAuthSecret('basic', method, value))\n .catch(err => {\n // Socket error\n this.handleError(err.message, 'err');\n });\n }\n\n handleResetPassword(newPassword, tempAuth) {\n const secret = base64ReEncode(tempAuth.secret);\n if (!secret || !tempAuth.scheme) {\n this.handleError(this.props.intl.formatMessage(messages.invalid_security_token), 'err');\n } else {\n this.tinode.connect()\n .then(_ => this.tinode.updateAccountBasic(null, null, newPassword, {scheme: tempAuth.scheme, secret: secret}))\n .then(_ => {\n this.handleError(this.props.intl.formatMessage(messages.password_reset_success), 'info');\n HashNavigation.navigateTo('');\n })\n .catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n }\n\n handleShowCountrySelector(code, dial, selectedCallback) {\n this.handleShowAlert(\"Select country\",\n
    }>\n {\n this.setState({alertVisible: false});\n selectedCallback(c, d);\n }} />\n ,\n null, null, _ => {}, \"Cancel\");\n }\n\n handleStartVideoCall() {\n this.setState({\n callTopic: this.state.topicSelected,\n callState: CALL_STATE_OUTGOING_INITATED,\n callAudioOnly: false\n });\n }\n\n handleStartAudioCall() {\n this.setState({\n callTopic: this.state.topicSelected,\n callState: CALL_STATE_OUTGOING_INITATED,\n callAudioOnly: true\n });\n }\n\n handleCallInvite(callTopic, callSeq, callState, audioOnly) {\n switch (callState) {\n case CALL_STATE_OUTGOING_INITATED:\n const head = { webrtc: CALL_HEAD_STARTED, aonly: !!audioOnly };\n const msg = Drafty.videoCall(audioOnly);\n if (Tinode.isGroupTopicName(callTopic)) {\n // Video conference.\n head.vc = true;\n }\n return this.handleSendMessage(msg, undefined, undefined, head)\n .then(ctrl => {\n if (ctrl.code < 200 || ctrl.code >= 300 || !ctrl.params || !ctrl.params.seq) {\n this.handleCallClose();\n return ctrl;\n }\n this.setState({callSeq: ctrl.params['seq']});\n return ctrl\n });\n break;\n case CALL_STATE_IN_PROGRESS:\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n // We've accepted the call. Let the other side know.\n topic.videoCall('accept', callSeq);\n break;\n }\n }\n\n handleCallRinging(callTopic, callSeq) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('ringing', callSeq);\n }\n\n handleCallHangup(callTopic, callSeq) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('hang-up', callSeq);\n }\n\n handleCallSendOffer(callTopic, callSeq, sdp) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('offer', callSeq, sdp);\n }\n\n handleCallIceCandidate(callTopic, callSeq, candidate) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('ice-candidate', callSeq, candidate);\n }\n handleCallSendAnswer(callTopic, callSeq, sdp) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('answer', callSeq, sdp);\n }\n\n handleVCCallJoin(callTopic, callSeq) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('vc-join', callSeq);\n }\n\n handleCallClose() {\n if (this.callTimeoutTimer) {\n clearTimeout(this.callTimeoutTimer);\n }\n this.setState({\n callTopic: undefined,\n callState: CALL_STATE_NONE,\n callAudioOnly: undefined\n });\n }\n\n handleCallAccept(topicName, setCallTopic, callSeq) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n if (topic.isSubscribed()) {\n this.handleTopicSelected(setCallTopic ? topicName : this.state.callTopic);\n const upd = {\n callState: CALL_STATE_IN_PROGRESS\n }\n if (setCallTopic) {\n upd.callTopic = topicName;\n upd.callSeq = callSeq;\n }\n this.setState(upd);\n } else {\n // We need to switch and subscribe to callTopic first.\n this.setState({\n callShouldStart: true,\n }, _ => this.handleTopicSelected(this.state.callTopic));\n }\n }\n\n handleInfoMessage(info) {\n if (info.what != 'call') {\n return;\n }\n switch (info.event) {\n case 'accept':\n // If another my session has accepted the call.\n if (Tinode.isMeTopicName(info.topic) && this.tinode.isMe(info.from)) {\n this.setState({\n callTopic: null,\n callState: CALL_STATE_NONE,\n callSeq: null,\n callAudioOnly: undefined\n });\n return;\n }\n if (info.topic == this.state.callTopic) {\n // Update state.\n this.setState({callState: CALL_STATE_IN_PROGRESS});\n }\n break;\n case 'hang-up':\n // Remote hangup.\n this.handleCallClose();\n break;\n }\n }\n\n handleDataMessage(data) {\n if (data.head && data.head.webrtc && data.head.webrtc == CALL_HEAD_STARTED && Tinode.isP2PTopicName(data.topic)) {\n // If it's a video call invite message.\n // See if we need to display incoming call UI.\n const topic = this.tinode.getTopic(data.topic);\n if (topic) {\n // Check if a later version of the message exists (which means the call\n // has been either accepted or finished already).\n const msg = topic.latestMsgVersion(data.seq) || data;\n if (msg.head && msg.head.webrtc && msg.head.webrtc == CALL_HEAD_STARTED) {\n // This is a legit new call.\n if (data.from != this.state.myUserId) {\n if (this.state.callState == CALL_STATE_NONE) {\n // Incoming call.\n this.setState({\n callTopic: data.topic,\n callState: CALL_STATE_INCOMING_RECEIVED,\n callSeq: data.seq,\n callAudioOnly: !!msg.head.aonly\n });\n } else {\n // Another call is either in progress or being established.\n // Reject the incoming call.\n this.handleCallHangup(data.topic, data.seq);\n }\n }\n }\n } else {\n console.warn(\"Received vc data message from unknown topic\", data.topic);\n }\n }\n }\n\n render() {\n return (\n
    \n {this.state.contextMenuVisible ?\n {\n if (topicName == this.state.topicSelected) {\n this.handleTopicSelected(null);\n }\n }}\n onError={this.handleError} />\n :\n null\n }\n {this.state.forwardDialogVisible ?\n \n :\n null\n }\n {this.state.callTopic && this.state.callState == CALL_STATE_INCOMING_RECEIVED ?\n \n :\n null\n }\n {this.state.alertVisible ?\n this.setState({alertVisible: false})) : null}\n reject={this.state.alertParams.reject}\n onConfirm={this.state.alertParams.onConfirm ?\n (_ => {this.setState({alertVisible: false}); this.state.alertParams.onConfirm();}) : null}\n confirm={this.state.alertParams.confirm}\n /> : null}\n\n {!this.state.displayMobile || this.state.mobilePanel == 'sidepanel' ?\n \n : null}\n\n {!this.state.displayMobile || (this.state.mobilePanel == 'topic-view' && !this.state.infoPanel) ?\n \n : null}\n\n {this.state.infoPanel ?\n \n :\n null\n }\n
    \n );\n }\n};\n\nexport default injectIntl(TinodeWeb);\n","// View for editing topic parameters (including 'me' topic).\n\nimport React from 'react';\n\nimport TopicDescEdit from '../widgets/topic-desc-edit.jsx';\n\nimport { arrayEqual } from '../lib/utils.js';\n\nexport default class TopicCommonView extends React.Component {\n constructor(props) {\n super(props);\n\n const topic = this.props.tinode.getTopic(this.props.topic);\n const acs = topic.getAccessMode();\n this.state = {\n tags: []\n };\n\n this.previousTagsUpdated = undefined;\n\n this.onTagsUpdated = this.onTagsUpdated.bind(this);\n this.handleTagsUpdated = this.handleTagsUpdated.bind(this);\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n if (topic.onTagsUpdated != this.onTagsUpdated) {\n if (topic.getType() == 'grp') {\n this.previousTagsUpdated = topic.onTagsUpdated;\n topic.onTagsUpdated = this.onTagsUpdated;\n } else {\n this.previousTagsUpdated = undefined;\n }\n }\n\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n }\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onTagsUpdated = this.previousTagsUpdated;\n }\n\n // Server informs that the tags have been updated.\n onTagsUpdated(tags) {\n this.setState({tags: tags});\n\n if (this.previousTagsUpdated && this.previousTagsUpdated != this.onTagsUpdated) {\n this.previousTagsUpdated(tags);\n }\n }\n\n // Request server to change tags.\n handleTagsUpdated(tags) {\n if (!arrayEqual(this.state.tags.slice(0), tags.slice(0))) {\n this.props.onUpdateTagsRequest(this.props.topic, tags);\n }\n }\n\n render() {\n return (\n
    \n \n
    \n );\n }\n};\n","// ValidationView: panel for confirming credentials, like email or phone.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n phone: {\n id: 'phone_dative',\n defaultMessage: 'phone',\n description: \"Dative case of 'phone', i.e. 'phone' in 'by phone'\",\n },\n email: {\n id: 'email_dative',\n defaultMessage: 'email',\n description: \"Dative case of 'email', i.e. 'email' in 'by email'\",\n }\n});\n\nclass ValidationView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n code: props.credCode || '',\n codeReceived: props.credCode\n };\n\n this.handleCodeChange = this.handleCodeChange.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n if (nextProps.credCode != prevState.codeReceived) {\n return {\n code: nextProps.credCode || '',\n codeReceived: nextProps.credCode\n };\n }\n\n return prevState;\n }\n\n componentDidMount() {\n // Submit code automatically if it's received from the parent.\n if (this.props.credCode) {\n this.props.onSubmit(this.props.credMethod, this.props.credCode, this.props.credToken);\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n // Submit code automatically if it's received from the parent.\n if (this.state.codeReceived && this.state.code && this.state.code != prevState.code) {\n this.props.onSubmit(this.props.credMethod, this.state.code, this.props.credToken);\n }\n }\n\n\n handleCodeChange(e) {\n this.setState({code: e.target.value.replace(/[^\\d]/g, '')});\n }\n\n handleKeyPress(e) {\n if (e.key === 'Enter') {\n this.handleSubmit(e);\n } else if (e.key == 'Escape') {\n this.handleCancel(e);\n }\n }\n\n handleSubmit(e) {\n e.preventDefault();\n if (this.state.code && this.state.code.trim()) {\n this.props.onSubmit(this.props.credMethod, this.state.code.trim(), this.props.credToken);\n }\n }\n\n handleCancel(e) {\n e.preventDefault();\n this.props.onCancel();\n }\n\n render() {\n const { formatMessage } = this.props.intl;\n const methods = {'email': formatMessage(messages.email), 'tel': formatMessage(messages.phone)};\n const method = methods[this.props.credMethod] || this.props.credMethod;\n return (\n
    \n
    \n \n
    \n
    \n {\n (numbers_only) => \n }\n
    \n
    \n \n \n
    \n
    \n );\n }\n};\n\nexport default injectIntl(ValidationView);\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class Alert extends React.PureComponent {\n render() {\n return (
    \n
    \n
    {this.props.title}
    \n
    {this.props.content}
    \n
    \n {this.props.onReject ?\n \n :\n null\n }\n {this.props.onConfirm ?\n \n :\n null\n }\n
    \n
    \n
    );\n }\n};\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport FileProgress from './file-progress.jsx';\nimport { bytesToHumanSize } from '../lib/strformat.js';\nimport { isUrlRelative, sanitizeUrl } from '../lib/utils.js';\n\nexport default class Attachment extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n downloader: null,\n progress: 0\n };\n\n this.downloadFile = this.downloadFile.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n downloadFile(url, filename, mimetype) {\n if (!url) {\n this.props.onError(\"Invalid download URL '\" + url + \"'\");\n return;\n }\n\n const downloader = this.props.tinode.getLargeFileHelper();\n this.setState({downloader: downloader});\n downloader.download(url, filename, mimetype,\n loaded => this.setState({progress: loaded / this.props.size}),\n err => this.props.onError(err, 'err')\n )\n .then(_ => this.setState({downloader: null, progress: 0}))\n .catch(err => {\n if (err) {\n this.props.onError(\"Error downloading file: \" + err.message, 'err');\n }\n this.setState({downloader: null, progress: 0});\n });\n }\n\n handleCancel() {\n if (this.props.uploading) {\n this.props.onCancelUpload();\n } else if (this.state.downloader) {\n this.state.downloader.cancel();\n }\n }\n\n render() {\n let filename = this.props.filename || 'file_attachment';\n if (filename.length > 36) {\n filename = filename.substr(0, 16) + '...' + filename.substr(-16);\n }\n let size = this.props.size > 0 ?\n ({bytesToHumanSize(this.props.size)}) :\n null;\n\n // Detect if the download URL is relative or absolute.\n // If the URL is relative use LargeFileHelper to attach authentication\n // credentials to the request.\n let url, helperFunc;\n if (!this.props.uploading && !this.state.downloader && isUrlRelative(this.props.downloadUrl)) {\n // Relative URL. Use download helper.\n url = '#';\n helperFunc = (e) => {\n e.preventDefault();\n this.downloadFile(this.props.downloadUrl, this.props.filename, this.props.mimetype);\n };\n } else {\n url = sanitizeUrl(this.props.downloadUrl);\n helperFunc = null;\n }\n const downloadWidget = <>file_download ;\n return (\n
    \n
    insert_drive_file
    \n
    \n
    {filename} {size}
    \n {this.props.uploading || this.state.downloader ?\n \n :\n
    {url ?\n {downloadWidget}\n :\n {downloadWidget}\n }
    \n }\n
    \n
    \n );\n }\n};\n","// Audio recorder widget.\n\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat';\nimport { base64ToIntArray } from '../lib/blob-helpers';\n\n// Make canvas bigger than the element size to reduce blurring.\nconst CANVAS_UPSCALING = 2.0;\n// Thickness of a visualization bar.\nconst LINE_WIDTH = 3 * CANVAS_UPSCALING;\n// Spacing between two visualization bars.\nconst SPACING = 2 * CANVAS_UPSCALING;\n// Color of histogram bars.\nconst BAR_COLOR = '#888A';\nconst BAR_COLOR_DARK = '#666C';\nconst THUMB_COLOR = '#444E';\n// Minimum number of amplitude bars to draw.\nconst MIN_PREVIEW_LENGTH = 16;\n\nconst messages = defineMessages({\n icon_title_play: {\n id: 'icon_title_play',\n defaultMessage: 'Play recording',\n description: 'Icon tool tip for starting audio playback'\n }\n});\n\nclass AudioPlayer extends React.PureComponent {\n constructor(props) {\n super(props);\n\n let preview = base64ToIntArray(this.props.preview);\n if (!Array.isArray(preview) || preview.length < MIN_PREVIEW_LENGTH) {\n preview = null;\n }\n\n this.state = {\n canPlay: false,\n playing: false,\n currentTime: '0:00',\n duration: this.props.duration > 0 ? secondsToTime(this.props.duration / 1000) : '-:--',\n longMin: this.props.duration >= 600000,\n preview: preview\n };\n\n this.initAudio = this.initAudio.bind(this);\n this.initCanvas = this.initCanvas.bind(this);\n this.resampleBars = this.resampleBars.bind(this);\n this.visualize = this.visualize.bind(this);\n\n this.handlePlay = this.handlePlay.bind(this);\n this.handleSeek = this.handleSeek.bind(this);\n this.handleError = this.handleError.bind(this);\n\n this.audioPlayer = null;\n\n this.viewBuffer = [];\n this.canvasRef = React.createRef();\n }\n\n componentDidMount() {\n if (this.props.src) {\n this.initAudio();\n }\n\n this.initCanvas();\n }\n\n componentWillUnmount() {\n if (this.audioPlayer) {\n this.audioPlayer.onloadedmetadata = null;\n this.audioPlayer.ontimeupdate = null;\n this.audioPlayer.onended = null;\n this.audioPlayer.pause();\n this.audioPlayer = null;\n }\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.src != prevProps.src) {\n this.initAudio();\n }\n\n if (this.props.preview != prevProps.preview) {\n let preview = base64ToIntArray(this.props.preview);\n if (!Array.isArray(preview) || preview.length < MIN_PREVIEW_LENGTH) {\n preview = null;\n }\n this.setState({preview: preview}, this.initCanvas);\n }\n }\n\n initAudio() {\n this.audioPlayer = new Audio(this.props.src);\n this.audioPlayer.onloadedmetadata = _ => this.setState({canPlay: true});\n this.audioPlayer.ontimeupdate = _ => this.setState({\n currentTime: secondsToTime(this.audioPlayer.currentTime, this.state.longMin)\n });\n this.audioPlayer.onended = _ => {\n this.audioPlayer.currentTime = 0;\n this.setState({playing: false, currentTime: secondsToTime(0, this.state.longMin)})\n }\n }\n\n initCanvas() {\n // Force canvas aspect ratio to match one of the element + upscale canvas to reduce blurring.\n this.canvasRef.current.width = this.canvasRef.current.offsetWidth * CANVAS_UPSCALING;\n this.canvasRef.current.height = this.canvasRef.current.offsetHeight * CANVAS_UPSCALING;\n\n this.canvasContext = this.canvasRef.current.getContext('2d');\n this.canvasContext.lineCap = 'round';\n\n this.viewBuffer = this.resampleBars(this.state.preview);\n this.visualize();\n }\n\n // Draw amplitude of sound.\n visualize() {\n if (!this.canvasRef.current) {\n return;\n }\n\n const width = this.effectiveWidth;\n const height = this.canvasRef.current.height;\n\n this.canvasContext.lineWidth = LINE_WIDTH;\n\n const drawFrame = _ => {\n if (!this.canvasRef.current || !this.audioPlayer) {\n // The component is unmounted.\n return;\n }\n\n this.canvasContext.clearRect(0, 0, this.canvasRef.current.width, height);\n\n if (this.viewBuffer) {\n if (this.state.playing) {\n window.requestAnimationFrame(drawFrame);\n }\n\n // Current playback position.\n const thumbAt = this.props.duration ?\n Math.max(0, Math.min(this.audioPlayer.currentTime * 1000 / this.props.duration, 1)) * (width - LINE_WIDTH * 2) : -1;\n\n // Draw amplitude bars.\n this.canvasContext.beginPath();\n this.canvasContext.strokeStyle = BAR_COLOR_DARK;\n for (let i = 0; i < this.viewBuffer.length; i++) {\n let x = 1 + i * (LINE_WIDTH + SPACING) + LINE_WIDTH * 0.5;\n let y = Math.max(this.viewBuffer[i] * height * 0.9, 1);\n\n const color = x < thumbAt ? BAR_COLOR_DARK : BAR_COLOR;\n if (this.canvasContext.strokeStyle != color) {\n this.canvasContext.stroke();\n this.canvasContext.beginPath();\n this.canvasContext.strokeStyle = color;\n }\n\n this.canvasContext.moveTo(x, (height - y) * 0.5);\n this.canvasContext.lineTo(x, (height + y) * 0.5);\n }\n // Actually draw the bars on canvas.\n this.canvasContext.stroke();\n\n // Draw thumb.\n if (this.props.duration) {\n this.canvasContext.beginPath();\n this.canvasContext.arc(thumbAt + LINE_WIDTH * 2, height * 0.5, LINE_WIDTH * 2, 0, 2 * Math.PI);\n this.canvasContext.fillStyle = THUMB_COLOR;\n this.canvasContext.fill();\n }\n }\n }\n\n drawFrame();\n }\n\n // Quick and dirty downsampling of the original preview bars into a smaller (or equal) number of bars we can display here.\n resampleBars(original) {\n const dstCount = ((this.canvasRef.current.width - SPACING) / (LINE_WIDTH + SPACING)) | 0;\n // Remove extra padding on the right due to fractional bar which is not drawn.\n this.effectiveWidth = dstCount * (LINE_WIDTH + SPACING) + SPACING;\n\n if (!Array.isArray(original) || original.length == 0) {\n return Array.apply(null, Array(dstCount)).map(_ => 0.01);\n }\n\n const factor = original.length / dstCount;\n let amps = [];\n let maxAmp = -1;\n for (let i=0; i 0) {\n return amps.map(a => a / maxAmp);\n }\n return Array.apply(null, Array(dstCount)).map(_ => 0.01);\n }\n\n handlePlay(e) {\n e.preventDefault();\n if (!this.state.canPlay) {\n return;\n }\n\n if (this.state.playing) {\n this.audioPlayer.pause();\n this.setState({playing: false});\n } else if (this.audioPlayer.readyState >= 2) {\n this.audioPlayer.play();\n this.setState({playing: true}, this.visualize);\n }\n }\n\n handleError(err) {\n console.error(err);\n }\n\n handleSeek(e) {\n e.preventDefault();\n if (e.target && this.props.duration) {\n const rect = e.target.getBoundingClientRect();\n const offset = (e.clientX - rect.left) / this.effectiveWidth * CANVAS_UPSCALING;\n this.audioPlayer.currentTime = this.props.duration * offset / 1000;\n this.setState({currentTime: secondsToTime(this.audioPlayer.currentTime, this.state.longMin)});\n if (!this.state.playing) {\n this.visualize();\n }\n }\n }\n\n render() {\n const playClass = 'material-icons' +\n (this.props.short ? '' : ' large') +\n (this.state.canPlay ? '' : ' disabled');\n const play = (\n {this.state.playing ? 'pause_circle' :\n (this.state.canPlay ? 'play_circle' : 'not_interested')}\n );\n return (
    {this.props.short ?\n <>\n \n {play}\n \n :\n <>\n {play}\n
    \n \n
    {this.state.currentTime}/{this.state.duration}
    \n
    \n \n }\n
    );\n }\n}\n\nexport default injectIntl(AudioPlayer);\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport Cropper from './cropper.jsx';\nimport { imageCrop } from '../lib/blob-helpers.js';\n\nexport default class AvatarCrop extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n scale: 1\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleChange = this.handleChange.bind(this);\n }\n\n // Cut out in image coordinates and desired scale factor.\n handleChange(left, top, width, height, scale) {\n this.setState({\n left: left,\n top: top,\n width: width,\n height: height,\n scale: scale\n });\n }\n\n handleSubmit() {\n imageCrop(this.props.mime, this.props.avatar,\n this.state.left, this.state.top, this.state.width, this.state.height,\n this.state.scale)\n .then(img => {\n this.props.onSubmit(img.mime, img.blob, img.width, img.height);\n })\n .catch(err => {\n this.props.onError(err);\n });\n }\n\n render() {\n return (\n
    \n
    \n \n
    \n
    \n {this.props.onCancel ?\n \n : null}\n \n
    \n
    \n );\n }\n};\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\nimport LoadSpinner from './load-spinner.jsx';\n\nimport { sanitizeUrlForMime } from '../lib/utils.js';\n\nimport { AVATAR_SIZE } from '../config.js';\n\nexport default class AvatarUpload extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n source: props.avatar\n };\n\n this.handleFileReceived = this.handleFileReceived.bind(this);\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.avatar != prevProps.avatar) {\n this.setState({source: this.props.avatar});\n }\n }\n\n handleFileReceived(e) {\n const image = e.target.files[0];\n this.props.onImageUpdated(image.type, URL.createObjectURL(image), image.name);\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n render() {\n // Randomize id value in case more than one AvatarUpload is shown\n // at the same time.\n const randId = 'file-input-avatar-' + ('' + Math.random()).substring(0, 4);\n const className = 'avatar-upload' + (this.props.readOnly ? ' read-only' : '');\n return (\n
    \n {this.props.readOnly || !this.state.source ?\n null :\n {e.preventDefault(); this.props.onImageUpdated();}}>\n clear\n }\n {this.state.source ?\n :\n this.props.readOnly && this.props.uid ?\n
    \n \n
    \n :\n
    {AVATAR_SIZE}×{AVATAR_SIZE}
    }\n {this.props.readOnly ? null :\n }\n {this.props.readOnly ? null :\n }\n \n
    \n );\n }\n};\n","import React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nconst icon_mapping = {'staff': 'verified_user'};\n\nconst messages = defineMessages({\n badge_verified: {\n id: 'badge_verified',\n defaultMessage: 'Verified/official',\n description: 'Explanation of a verified account or topic badge'\n },\n badge_staff: {\n id: 'badge_staff',\n defaultMessage: 'Staff-managed',\n description: 'Explanation of a staff-managed account or topic badge'\n },\n badge_danger: {\n id: 'badge_danger',\n defaultMessage: 'Untrustworthy',\n description: 'Suspicious or untrustworthy account or topic badge'\n },\n});\n\n\n/* Trusted badges with labels: verified, staff, danger */\nclass BadgeList extends React.PureComponent {\n render() {\n const {formatMessage} = this.props.intl;\n let badges = null;\n if (this.props.trustedBadges && this.props.trustedBadges.length > 0) {\n badges = [];\n this.props.trustedBadges.forEach(b => {\n const comment = this.props.short ? null : formatMessage(messages['badge_' + b]);\n const style = 'material-icons ' + b + '-color';\n badges.push(
    {icon_mapping[b] || b} {comment}
    );\n });\n return <>{badges};\n }\n return null;\n }\n};\n\nexport default injectIntl(BadgeList);\n","// The <- button to be displayed in title bars.\nimport React from 'react';\n\nexport default class ButtonBack extends React.PureComponent {\n render() {\n return (\n {e.preventDefault(); this.props.onBack();}}>\n arrow_back\n \n );\n }\n}\n","// IncomingCall: displays Accept & Reject buttons for incoming calls.\nimport React from 'react';\n\nimport BadgeList from './badge-list.jsx';\nimport LetterTile from './letter-tile.jsx';\n\nimport { MAX_TITLE_LENGTH, MAX_PEER_TITLE_LENGTH } from '../config.js';\nimport { CALL_STATE_INCOMING_RECEIVED } from '../constants.js';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { clipStr } from '../lib/utils.js'\n\nconst RING_SOUND = new Audio('audio/call-in.m4a');\n\nexport default class CallIncoming extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n topic: null,\n fullName: undefined,\n avatar: null,\n trustedBadges: [],\n previousMetaDesc: undefined,\n };\n\n this.resetDesc = this.resetDesc.bind(this);\n this.onMetaDesc = this.onMetaDesc.bind(this);\n this.handleRejectCall = this.handleRejectCall.bind(this);\n this.handleAcceptCall = this.handleAcceptCall.bind(this);\n this.ringTimer = null;\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n\n this.resetDesc(topic);\n if (this.props.callState == CALL_STATE_INCOMING_RECEIVED) {\n // play() throws if the user did not click the app first: https://goo.gl/xX8pDD.\n RING_SOUND.play().catch(_ => {});\n this.ringTimer = setInterval(_ => {RING_SOUND.play().catch(_ => {})}, 2000);\n this.props.onRinging(this.props.topic, this.props.seq);\n }\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n if (this.onMetaDesc != topic.onMetaDesc) {\n this.previousMetaDesc = topic.onMetaDesc;\n topic.onMetaDesc = this.onMetaDesc;\n }\n\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n this.resetDesc(topic, props);\n }\n }\n\n componentWillUnmount() {\n if (this.ringTimer != null) {\n clearInterval(this.ringTimer);\n RING_SOUND.pause();\n }\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.setState({topic: null});\n topic.onMetaDesc = this.previousMetaDesc;\n }\n\n resetDesc(topic) {\n const badges = [];\n if (topic.trusted) {\n for (const [key, val] of Object.entries(topic.trusted)) {\n if (val) {\n badges.push(key);\n }\n }\n }\n\n this.setState({\n fullName: clipStr(topic.public ? topic.public.fn : undefined, MAX_TITLE_LENGTH),\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n trustedBadges: badges,\n });\n }\n\n onMetaDesc(desc) {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.resetDesc(topic);\n\n if (this.previousMetaDesc && this.previousMetaDesc != this.onMetaDesc) {\n this.previousMetaDesc(desc);\n }\n }\n\n handleAcceptCall() {\n this.props.onAcceptCall(this.props.topic);\n }\n\n handleRejectCall() {\n this.props.onReject(this.props.topic, this.props.seq);\n this.props.onClose();\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    {clipStr(this.state.fullName, MAX_PEER_TITLE_LENGTH)}\n
    \n
    \n
    \n {this.props.callState == CALL_STATE_INCOMING_RECEIVED ?\n <>\n \n \n \n :\n null\n }\n
    \n
    \n
    \n );\n }\n};\n","// Chat message describing a video or voice call.\n\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat.js';\n\nexport default class CallMessage extends React.PureComponent {\n render() {\n const bigIcon = this.props.vc ? 'video_call' : 'call';\n const isCallDropped = ['busy', 'declined', 'disconnected', 'missed'].includes(this.props.callState);\n const successClass = 'material-icons medium ' + (isCallDropped ? 'red' : 'green');\n const callIcon = this.props.incoming ?\n (isCallDropped ? 'call_missed' : 'call_received') :\n (isCallDropped ? 'call_missed_outgoing' : 'call_made');\n const title = this.props.vc ?\n :\n this.props.incoming ?\n :\n ;\n let duration;\n if (isCallDropped) {\n switch (this.props.callState) {\n case 'busy':\n duration = ;\n break;\n case 'declined':\n duration = ;\n break;\n case 'missed':\n duration = this.props.incoming ?\n :\n ;\n break;\n default:\n duration = ;\n break;\n }\n } else {\n duration = {secondsToTime(this.props.duration / 1000)};\n }\n const allowJoin = this.props.vc && this.props.callState == 'started';\n return
    \n
    {bigIcon}
    \n
    \n
    {title}
    \n
    {callIcon} {duration}
    \n {allowJoin ?\n Join\n : null}\n
    \n
    ;\n }\n}\n","// CallPanel displays call in progress: local and remote viewports and controls.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport LetterTile from './letter-tile.jsx';\n\nimport { MAX_PEER_TITLE_LENGTH } from '../config.js';\nimport { CALL_STATE_OUTGOING_INITATED, CALL_STATE_IN_PROGRESS } from '../constants.js';\n\nimport { clipStr } from '../lib/utils.js'\n\nconst RING_SOUND = new Audio('audio/call-out.m4a');\nRING_SOUND.loop = true;\nconst CALL_ENDED_SOUND = new Audio('audio/call-end.m4a');\nCALL_ENDED_SOUND.loop = true;\nconst DIALING_SOUND = new Audio('audio/dialing.m4a');\n\nconst VIDEO_MUTED_EVENT = 'video:muted';\nconst VIDEO_UNMUTED_EVENT = 'video:unmuted';\n\nconst messages = defineMessages({\n already_in_call: {\n id: 'already_in_call',\n defaultMessage: 'You already in an ongoing call!',\n description: 'Error message when the user tried to accept a new call without finishing pervious one',\n }\n});\n\nclass CallPanel extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n localStream: undefined,\n remoteStream: undefined,\n pc: undefined,\n dataChannel: undefined,\n\n previousOnInfo: undefined,\n waitingForPeer: false,\n // If true, the client has received a remote SDP from the peer and has sent a local SDP to the peer.\n callInitialSetupComplete: false,\n audioOnly: props.callAudioOnly,\n // Video mute/unmute in progress.\n videoToggleInProgress: false,\n // Indicates if the remote peer has informed us that their camera is on.\n remoteVideoLive: false,\n };\n\n this.localStreamConstraints = {\n audio: true,\n video: !props.callAudioOnly\n };\n this.isOutgoingCall = props.callState == CALL_STATE_OUTGOING_INITATED;\n\n this.localRef = React.createRef();\n this.remoteRef = React.createRef();\n // Cache for remote ice candidates until initial setup gets completed.\n this.remoteIceCandidatesCache = [];\n\n this.onInfo = this.onInfo.bind(this);\n this.start = this.start.bind(this);\n this.stop = this.stop.bind(this);\n\n this.createPeerConnection = this.createPeerConnection.bind(this);\n this.canSendOffer = this.canSendOffer.bind(this);\n this.drainRemoteIceCandidatesCache = this.drainRemoteIceCandidatesCache.bind(this);\n\n this.handleNegotiationNeededEvent = this.handleNegotiationNeededEvent.bind(this);\n this.handleICECandidateEvent = this.handleICECandidateEvent.bind(this);\n this.handleNewICECandidateMsg = this.handleNewICECandidateMsg.bind(this);\n this.handleICEConnectionStateChangeEvent = this.handleICEConnectionStateChangeEvent.bind(this);\n this.handleSignalingStateChangeEvent = this.handleSignalingStateChangeEvent.bind(this);\n this.handleICEGatheringStateChangeEvent = this.handleICEGatheringStateChangeEvent.bind(this);\n this.handleIceCandidateErrorEvent = this.handleIceCandidateErrorEvent.bind(this);\n this.handleTrackEvent = this.handleTrackEvent.bind(this);\n\n this.handleVideoOfferMsg = this.handleVideoOfferMsg.bind(this);\n this.handleVideoAnswerMsg = this.handleVideoAnswerMsg.bind(this);\n this.handleNewICECandidateMsg = this.handleNewICECandidateMsg.bind(this);\n\n this.reportError = this.reportError.bind(this);\n this.handleGetUserMediaError = this.handleGetUserMediaError.bind(this);\n\n this.stopTracks = this.stopTracks.bind(this);\n this.disconnectMedia = this.disconnectMedia.bind(this);\n\n this.handleCloseClick = this.handleCloseClick.bind(this);\n this.handleToggleCameraClick = this.handleToggleCameraClick.bind(this);\n this.handleToggleMicClick = this.handleToggleMicClick.bind(this);\n\n this.handleRemoteHangup = this.handleRemoteHangup.bind(this);\n this.handleVideoCallAccepted = this.handleVideoCallAccepted.bind(this);\n\n this.muteVideo = this.muteVideo.bind(this);\n this.unmuteVideo = this.unmuteVideo.bind(this);\n this.emptyVideoTrack = this.emptyVideoTrack.bind(this);\n\n this.handleDataChannelEvent = this.handleDataChannelEvent.bind(this);\n this.handleDataChannelError = this.handleDataChannelError.bind(this);\n this.handleDataChannelMessage = this.handleDataChannelMessage.bind(this);\n this.handleDataChannelOpen = this.handleDataChannelOpen.bind(this);\n this.handleDataChannelClose = this.handleDataChannelClose.bind(this);\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n this.previousOnInfo = topic.onInfo;\n topic.onInfo = this.onInfo;\n if ((this.props.callState == CALL_STATE_OUTGOING_INITATED ||\n this.props.callState == CALL_STATE_IN_PROGRESS) && this.localRef.current) {\n this.start();\n }\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onInfo = this.previousOnInfo;\n this.stop();\n }\n\n handleVideoCallAccepted(info) {\n RING_SOUND.pause();\n // Create peer connection with a data channel.\n const pc = this.createPeerConnection(true);\n const stream = this.state.localStream;\n stream.getTracks().forEach(track => {\n pc.addTrack(track, stream);\n\n if (track.kind == 'video' && this.state.audioOnly) {\n // This is an audio-only call.\n // Remove dummy video track (placeholder remains).\n track.enabled = false;\n track.stop();\n stream.removeTrack(track);\n }\n });\n }\n\n onInfo(info) {\n if (info.what != 'call') {\n return;\n }\n switch (info.event) {\n case 'accept':\n this.handleVideoCallAccepted(info);\n break;\n case 'answer':\n this.handleVideoAnswerMsg(info);\n break;\n case 'ice-candidate':\n this.handleNewICECandidateMsg(info);\n break;\n case 'hang-up':\n this.handleRemoteHangup(info);\n break;\n case 'offer':\n this.handleVideoOfferMsg(info);\n break;\n case 'ringing':\n // play() throws if the user did not click the app first: https://goo.gl/xX8pDD.\n RING_SOUND.play().catch(_ => {});\n break;\n default:\n console.warn(\"Unknown call event\", info.event);\n break;\n }\n }\n\n // Creates an empty video track placeholder.\n emptyVideoTrack() {\n const width = 640;\n const height = 480;\n const canvas = Object.assign(document.createElement(\"canvas\"), {width, height});\n canvas.getContext('2d').fillRect(0, 0, width, height);\n const stream = canvas.captureStream(0);\n return Object.assign(stream.getVideoTracks()[0], {enabled: false});\n }\n\n start() {\n if (this.state.localStream) {\n this.props.onError(this.props.intl.formatMessage(messages.already_in_call), 'info');\n return;\n }\n\n if (this.props.callState == CALL_STATE_IN_PROGRESS) {\n // We apparently just accepted the call.\n this.props.onInvite(this.props.topic, this.props.seq, CALL_STATE_IN_PROGRESS, this.props.callAudioOnly);\n return;\n }\n\n // This is an outgoing call waiting for the other side to pick up.\n // Start local video.\n navigator.mediaDevices.getUserMedia(this.localStreamConstraints)\n .then(stream => {\n if (!this.localStreamConstraints.video) {\n // Starting an audio-only call. Create a dummy video track\n // (so video can be enabled during the call if the user desires).\n stream.addTrack(this.emptyVideoTrack());\n }\n this.setState({localStream: stream, waitingForPeer: true});\n this.localRef.current.srcObject = stream;\n\n DIALING_SOUND.play();\n\n // Send call invitation.\n this.props.onInvite(this.props.topic, this.props.seq, this.props.callState, this.props.callAudioOnly);\n })\n .catch(this.handleGetUserMediaError);\n }\n\n stop() {\n CALL_ENDED_SOUND.pause();\n CALL_ENDED_SOUND.currentTime = 0;\n RING_SOUND.pause();\n RING_SOUND.currentTime = 0;\n\n this.stopTracks(this.state.localStream);\n this.stopTracks(this.state.remoteStream);\n this.disconnectMedia(this.localRef.current);\n this.disconnectMedia(this.remoteRef.current);\n if (this.state.pc) {\n this.state.pc.ontrack = null;\n this.state.pc.onremovetrack = null;\n this.state.pc.onremovestream = null;\n this.state.pc.onicecandidate = null;\n this.state.pc.oniceconnectionstatechange = null;\n this.state.pc.onsignalingstatechange = null;\n this.state.pc.onicegatheringstatechange = null;\n this.state.pc.onnegotiationneeded = null;\n this.state.pc.onicecandidateerror = null;\n this.state.pc.ondatachannel = null;\n\n if (this.state.dataChannel && (this.state.dataChannel.readyState == 'open' || this.state.dataChannel.readyState == 'connecting')) {\n this.state.dataChannel.close();\n }\n this.state.pc.close();\n }\n this.setState({pc: null, waitingForPeer: false});\n }\n\n disconnectMedia(el) {\n if (!el) {\n return;\n }\n\n el.srcObject = null;\n el.src = '';\n }\n\n stopTracks(stream) {\n if (!stream) {\n return;\n }\n\n let tracks = stream.getTracks();\n if (tracks) {\n tracks.forEach(track => {\n track.stop();\n track.enabled = false;\n });\n }\n }\n\n handleDataChannelError(error) {\n console.error('data channel error', error);\n }\n\n handleDataChannelMessage(event) {\n switch (event.data) {\n case VIDEO_MUTED_EVENT:\n this.setState({remoteVideoLive: false}, _ => { this.remoteRef.current.srcObject = this.state.remoteStream; });\n break;\n case VIDEO_UNMUTED_EVENT:\n this.setState({remoteVideoLive: true}, _ => { this.remoteRef.current.srcObject = this.state.remoteStream; });\n break;\n default:\n break;\n }\n }\n\n handleDataChannelOpen(event) {\n if (!this.state.audioOnly) {\n event.target.send(VIDEO_UNMUTED_EVENT);\n }\n }\n\n handleDataChannelClose(event) {\n console.log('close data channel:', event);\n }\n\n handleDataChannelEvent(event) {\n console.log('data channel event:', event);\n const channel = event.channel;\n channel.onerror = this.handleDataChannelError;\n channel.onmessage = this.handleDataChannelMessage;\n channel.onopen = this.handleDataChannelOpen;\n channel.onclose = this.handleDataChannelClose;\n this.setState({dataChannel: channel});\n }\n\n createPeerConnection(withDataChannel) {\n const iceServers = this.props.tinode.getServerParam('iceServers', null);\n const pc = iceServers ? new RTCPeerConnection({iceServers: iceServers}) : new RTCPeerConnection();\n\n pc.onicecandidate = this.handleICECandidateEvent;\n pc.oniceconnectionstatechange = this.handleICEConnectionStateChangeEvent;\n pc.onicegatheringstatechange = this.handleICEGatheringStateChangeEvent;\n pc.onsignalingstatechange = this.handleSignalingStateChangeEvent;\n pc.onnegotiationneeded = this.handleNegotiationNeededEvent;\n pc.onicecandidateerror = this.handleIceCandidateErrorEvent;\n pc.ontrack = this.handleTrackEvent;\n pc.ondatachannel = this.handleDataChannelEvent;\n\n let stateUpdate = {pc: pc, waitingForPeer: false};\n if (withDataChannel) {\n // Create data channel for exchanging events.\n const channel = pc.createDataChannel(\"events\", {ordered: true});\n channel.onerror = this.handleDataChannelError;\n channel.onmessage = this.handleDataChannelMessage;\n channel.onopen = this.handleDataChannelOpen;\n channel.onclose = this.handleDataChannelClose;\n stateUpdate.dataChannel = channel;\n }\n this.setState(stateUpdate);\n return pc;\n }\n\n handleVideoAnswerMsg(info) {\n // Configure the remote description, which is the SDP payload\n // in 'info' message.\n const desc = new RTCSessionDescription(info.payload);\n this.state.pc.setRemoteDescription(desc)\n .then(_ => {\n this.setState({ callInitialSetupComplete: true }, _ => this.drainRemoteIceCandidatesCache());\n })\n .catch(err => this.reportError(err));\n }\n\n reportError(err) {\n this.props.onError(err.message, 'err');\n }\n\n canSendOffer() {\n return this.isOutgoingCall || this.state.callInitialSetupComplete;\n }\n\n handleNegotiationNeededEvent(event) {\n const pc = event.target;\n if (!this.canSendOffer()) {\n return;\n }\n pc.createOffer().then(offer => {\n return pc.setLocalDescription(offer);\n })\n .then(_ => {\n this.props.onSendOffer(this.props.topic, this.props.seq, pc.localDescription.toJSON());\n })\n .catch(err => this.reportError(err));\n }\n\n handleIceCandidateErrorEvent(event) {\n console.warn(\"ICE candidate error:\", event);\n }\n\n handleICECandidateEvent(event) {\n if (event.candidate) {\n this.props.onIceCandidate(this.props.topic, this.props.seq, event.candidate.toJSON());\n }\n }\n\n handleNewICECandidateMsg(info) {\n const candidate = new RTCIceCandidate(info.payload);\n if (this.state.callInitialSetupComplete) {\n this.state.pc.addIceCandidate(candidate)\n .catch(err => {\n if (candidate.candidate) {\n this.reportError(err);\n }\n console.warn(\"Error adding new ice candidate\", candidate, err);\n });\n } else {\n this.remoteIceCandidatesCache.push(candidate);\n }\n }\n\n drainRemoteIceCandidatesCache() {\n this.remoteIceCandidatesCache.forEach(candidate => {\n this.state.pc.addIceCandidate(candidate)\n .catch(err => {\n if (candidate.candidate) {\n this.reportError(err);\n }\n console.warn(\"Error adding cached ice candidate\", candidate, err);\n });\n });\n this.remoteIceCandidatesCache = [];\n }\n\n handleICEConnectionStateChangeEvent(event) {\n switch (event.target.iceConnectionState) {\n case 'closed':\n case 'failed':\n this.handleCloseClick();\n break;\n }\n }\n\n handleSignalingStateChangeEvent(event) {\n if (event.target.signalingState == 'closed') {\n this.handleCloseClick();\n }\n }\n\n handleICEGatheringStateChangeEvent(event) {\n // ICE gathering change state\n }\n\n handleTrackEvent(event) {\n // Remote video becomes available.\n this.remoteRef.current.srcObject = event.streams[0];\n this.setState({remoteStream: event.streams[0]});\n }\n\n handleGetUserMediaError(e) {\n console.error(\"Error opening camera and/or microphone\", e);\n switch(e.name) {\n case 'NotFoundError':\n // Cannot start the call b/c no camera and/or microphone found.\n this.reportError(e);\n break;\n case 'SecurityError':\n case 'PermissionDeniedError':\n // Do nothing; this is the same as the user canceling the call.\n break;\n default:\n this.reportError(e);\n break;\n }\n\n // Make sure we shut down our end of the RTCPeerConnection so we're\n // ready to try again.\n this.handleCloseClick();\n }\n\n handleVideoOfferMsg(info) {\n let localStream = null;\n // If needed, create peer connection.\n // Not creating data channel since it should be created by the peer.\n const pc = this.state.pc ? this.state.pc : this.createPeerConnection(false);\n const desc = new RTCSessionDescription(info.payload);\n\n pc.setRemoteDescription(desc).then(_ => {\n return navigator.mediaDevices.getUserMedia(this.localStreamConstraints);\n })\n .then(stream => {\n let dummyVideo;\n if (!this.localStreamConstraints.video) {\n // Starting an audio-only call. Create an empty video track so\n // so the user can enable the video during the call.\n dummyVideo = this.emptyVideoTrack();\n stream.addTrack(dummyVideo);\n }\n localStream = stream;\n this.localRef.current.srcObject = stream;\n this.setState({localStream: stream});\n\n localStream.getTracks().forEach(track => {\n pc.addTrack(track, localStream);\n });\n\n if (dummyVideo) {\n dummyVideo.enabled = false;\n dummyVideo.stop();\n stream.removeTrack(dummyVideo);\n }\n })\n .then(_ => {\n return pc.createAnswer();\n })\n .then(answer => {\n return pc.setLocalDescription(answer);\n })\n .then(_ => {\n this.props.onSendAnswer(this.props.topic, this.props.seq, pc.localDescription.toJSON());\n this.setState({ callInitialSetupComplete: true }, _ => this.drainRemoteIceCandidatesCache());\n })\n .catch(this.handleGetUserMediaError);\n }\n\n // Call disconnected by remote.\n handleRemoteHangup() {\n if (!this.state.waitingForPeer) {\n // This is live call, just hang up.\n this.handleCloseClick();\n } else {\n // This is a call which is not yet connected.\n // Stop pulse animation.\n this.setState({waitingForPeer: false});\n // Change sound and wait a bit before ending it.\n RING_SOUND.pause();\n RING_SOUND.currentTime = 0;\n CALL_ENDED_SOUND.loop = true;\n CALL_ENDED_SOUND.play().catch(_ => {});\n setTimeout(_ => {\n this.handleCloseClick();\n }, 2000);\n }\n }\n\n handleCloseClick() {\n this.stop();\n this.props.onHangup(this.props.topic, this.props.seq);\n }\n\n // Ends video track and turns off the camera.\n muteVideo() {\n if (!this.state.pc || !this.state.dataChannel) {\n return;\n }\n\n const stream = this.state.localStream;\n const t = stream.getVideoTracks()[0];\n t.enabled = false;\n t.stop();\n\n stream.removeTrack(t);\n this.state.dataChannel.send(VIDEO_MUTED_EVENT);\n this.setState({videoToggleInProgress: false});\n }\n\n unmuteVideo() {\n if (!this.state.pc || !this.state.dataChannel) {\n return;\n }\n navigator.mediaDevices.getUserMedia({ video: true })\n .then(stream => {\n // Will extract video track from stream and throw stream away,\n // and replace video track in the media sender.\n this.localRef.current.srcObject = null;\n const sender = this.state.pc.getSenders().find(s => s.track.kind == 'video');\n const track = stream.getVideoTracks()[0];\n // Remote track from new stream.\n stream.removeTrack(track);\n // Add this track to the existing local stream.\n this.state.localStream.addTrack(track);\n return sender.replaceTrack(track);\n })\n .then(_ => {\n this.localRef.current.srcObject = this.state.localStream;\n this.state.dataChannel.send(VIDEO_UNMUTED_EVENT);\n })\n .catch(err => this.handleGetUserMediaError(err))\n .finally(_ => { this.setState({videoToggleInProgress: false}); }); // Make sure we redraw the mute/unmute icons (e.g. camera -> camera_off).\n }\n\n handleToggleCameraClick() {\n if (this.state.videoToggleInProgress) {\n // Toggle currently in progress.\n return;\n }\n const tracks = this.state.localStream.getVideoTracks();\n this.setState({videoToggleInProgress: true}, _ => {\n if (tracks && tracks.length > 0 && tracks[0].enabled && tracks[0].readyState == 'live') {\n this.muteVideo();\n } else {\n this.unmuteVideo();\n }\n this.setState({audioOnly: !this.state.audioOnly});\n });\n }\n\n handleToggleMicClick() {\n const stream = this.state.localStream;\n const t = stream.getAudioTracks()[0];\n t.enabled = !t.enabled;\n // Make sure we redraw the mute/unmute icons (e.g. mic -> mic_off).\n this.forceUpdate();\n }\n\n render() {\n const audioTracks = this.state.localStream && this.state.localStream.getAudioTracks();\n const videoTracks = !this.state.audioOnly && this.state.localStream && this.state.localStream.getVideoTracks();\n const disabled = !this.state.pc || !this.state.dataChannel || !(audioTracks && audioTracks[0]);\n const audioIcon = audioTracks && audioTracks[0] && audioTracks[0].enabled ? 'mic' : 'mic_off';\n const videoIcon = videoTracks && videoTracks[0] && videoTracks[0].enabled && videoTracks[0].readyState == 'live' ? 'videocam' : 'videocam_off';\n const peerTitle = clipStr(this.props.title, MAX_PEER_TITLE_LENGTH);\n const pulseAnimation = this.state.waitingForPeer ? ' pulse' : '';\n\n let remoteActive = false;\n if (this.remoteRef.current && this.remoteRef.current.srcObject && this.state.remoteVideoLive) {\n const rstream = this.remoteRef.current.srcObject;\n if (rstream.getVideoTracks().length > 0) {\n const t = rstream.getVideoTracks()[0];\n remoteActive = t.enabled && t.readyState == 'live';\n }\n }\n\n return (\n <>\n
    \n
    \n
    \n
    \n
    \n {remoteActive ?\n <>\n
    \n
    \n
    \n \n \n \n
    \n
    \n \n );\n }\n};\n\nexport default injectIntl(CallPanel);\n","// The counter of unread messages in the topic.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat.js';\n\n// Props:\n// incoming: true | false.\n// success: true | false.\nexport default class CallStatus extends React.PureComponent {\n render() {\n const isCallDropped = ['busy', 'declined', 'disconnected', 'missed'].includes(this.props.callState);\n const icon2 = this.props.incoming ?\n (isCallDropped ? 'call_missed' : 'call_received') :\n (isCallDropped ? 'call_missed_outgoing' : 'call_made');\n let duration;\n if (isCallDropped) {\n switch (this.props.callState) {\n case 'busy':\n duration = ;\n break;\n case 'declined':\n duration = ;\n break;\n case 'missed':\n duration = this.props.incoming ?\n :\n ;\n break;\n default:\n duration = ;\n break;\n }\n } else if (['accepted', 'started'].includes(this.props.callState) && !this.props.duration) {\n duration = \n } else {\n duration = {secondsToTime(this.props.duration / 1000)};\n }\n return (\n <>\n
    \n call{icon2}\n
    {duration}\n \n );\n }\n};\n","// Single chat message bubble, sent or received.\n\nimport React from 'react';\nimport { FormattedMessage, injectIntl } from 'react-intl';\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport Attachment from './attachment.jsx';\nimport LetterTile from './letter-tile.jsx';\nimport ReceivedMarker from './received-marker.jsx'\n\nimport { fullFormatter } from '../lib/formatters.js';\nimport { sanitizeUrl } from '../lib/utils.js';\n\nclass BaseChatMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n progress: 0\n };\n\n if (props.uploader) {\n props.uploader.onProgress = this.handleProgress.bind(this);\n }\n\n this.handleExpandImage = this.handleExpandImage.bind(this);\n this.handlePlayVideo = this.handlePlayVideo.bind(this);\n this.handleFormButtonClick = this.handleFormButtonClick.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n this.handleCancelUpload = this.handleCancelUpload.bind(this);\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n this.handleCallJoin = this.handleCallJoin.bind(this);\n\n this.formatterContext = {\n formatMessage: props.intl.formatMessage.bind(props.intl),\n viewportWidth: props.viewportWidth,\n authorizeURL: props.tinode.authorizeURL.bind(props.tinode),\n\n onImagePreview: this.handleExpandImage,\n onVideoPreview: this.handlePlayVideo,\n onFormButtonClick: this.handleFormButtonClick,\n onQuoteClick: this.handleQuoteClick,\n onCallJoin: this.handleCallJoin\n };\n }\n\n handleExpandImage(e) {\n e.preventDefault();\n this.props.onExpandMedia({\n url: e.target.src,\n filename: e.target.dataset.name,\n width: e.target.dataset.width,\n height: e.target.dataset.height,\n size: e.target.dataset.size,\n type: e.target.dataset.mime\n });\n }\n\n handlePlayVideo(e) {\n e.preventDefault();\n this.props.onExpandMedia({\n video: true,\n url: e.target.dataset.src,\n preview: e.target.src,\n filename: e.target.dataset.name,\n width: e.target.dataset.width,\n height: e.target.dataset.height,\n duration: e.target.dataset.duration,\n size: e.target.dataset.size,\n type: e.target.dataset.mime\n });\n }\n\n handleFormButtonClick(e) {\n e.preventDefault();\n const data = {\n seq: this.props.seq\n };\n data.resp = {};\n if (e.target.dataset.name) {\n data.resp[e.target.dataset.name] = e.target.dataset.val ? e.target.dataset.val :\n e.target.dataset.val === undefined ? 1 : '' + e.target.dataset.val;\n }\n if (e.target.dataset.act == 'url') {\n data.ref = sanitizeUrl(e.target.dataset.ref) || 'about:blank';\n }\n const text = e.target.dataset.title || 'unknown';\n this.props.onFormResponse(e.target.dataset.act, text, data);\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n const menuItems = [];\n if (this.props.received == Tinode.MESSAGE_STATUS_FAILED) {\n menuItems.push('menu_item_send_retry');\n }\n if (this.props.received > Tinode.MESSAGE_STATUS_FATAL) {\n if (this.props.userIsWriter) {\n menuItems.push('menu_item_reply');\n if (!this.props.response) {\n let immutable = false;\n Drafty.entities(this.props.content, (_0, _1, tp) => {\n immutable = ['AU', 'EX', 'FM', 'IM', 'VC', 'VD'].includes(tp);\n return immutable;\n });\n if (!immutable) {\n Drafty.styles(this.props.content, tp => {\n immutable = ['QQ'].includes(tp);\n return immutable;\n });\n }\n if (!immutable) {\n menuItems.push('menu_item_edit');\n }\n }\n }\n if (this.props.userIsAdmin) {\n menuItems.push(this.props.pinned ? 'menu_item_unpin' : 'menu_item_pin');\n }\n }\n menuItems.push('menu_item_forward');\n\n this.props.showContextMenu({\n seq: this.props.seq,\n replace: this.props.edited ? parseInt(this.props.edited.split(':')[1]) : 0,\n content: this.props.content,\n userFrom: this.props.userFrom,\n userName: this.props.userName,\n y: e.pageY,\n x: e.pageX,\n pickReply: this.props.pickReply,\n editMessage: this.props.editMessage,\n }, menuItems);\n }\n\n handleProgress(ratio) {\n this.setState({progress: ratio});\n }\n\n handleCancelUpload() {\n this.props.onCancelUpload(this.props.seq, this.props.uploader);\n }\n\n handleQuoteClick(e) {\n e.preventDefault();\n e.stopPropagation();\n const replyToSeq = this.props.replyToSeq;\n if (replyToSeq) {\n this.props.onQuoteClick(replyToSeq);\n }\n }\n\n handleCallJoin() {\n this.props.onAcceptCall(this.props.topic, true, this.props.seq);\n }\n\n render() {\n const sideClass = this.props.sequence + ' ' + (this.props.response ? 'left' : 'right');\n const bubbleClass = (this.props.sequence == 'single' || this.props.sequence == 'last') ? 'bubble tip' : 'bubble';\n const avatar = this.props.userAvatar || true;\n const fullDisplay = (this.props.isGroup && this.props.response &&\n (this.props.sequence == 'single' || this.props.sequence == 'last'));\n\n let content = this.props.content;\n const attachments = [];\n if (this.props.mimeType == Drafty.getContentType() && Drafty.isValid(content)) {\n Drafty.attachments(content, (att, i) => {\n if (att.mime == 'application/json') {\n // Don't show json objects as attachments.\n // They are not meant for users.\n return;\n }\n attachments.push();\n }, this);\n const tree = Drafty.format(content, fullFormatter, this.formatterContext);\n content = React.createElement(React.Fragment, null, tree);\n } else if (typeof content != 'string') {\n content = <>warning_amber \n \n }\n\n return (\n
  • \n {this.props.isGroup && this.props.response ?\n
    \n {fullDisplay ?\n :\n null}\n
    :\n null}\n
    \n
    \n
    \n
    \n {content}\n {attachments}\n
    \n {this.props.timestamp ?\n \n : null}\n
    \n {this.props.showContextMenu ?\n \n \n expand_more\n \n : null\n }\n
    \n {fullDisplay ?\n
    \n {this.props.userName ||\n \n }\n
    \n : null\n }\n
    \n
  • \n );\n }\n};\n\nconst IntlChatMessage = injectIntl(BaseChatMessage);\nconst ChatMessage = React.forwardRef((props, ref) => );\n\nexport default ChatMessage;\n","import React from 'react';\n\n/* CheckBox: styled three-state checkbox, either clickable or static */\nexport default class CheckBox extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleChange = this.handleChange.bind(this);\n }\n\n handleChange() {\n this.props.onChange(this.props.name, !this.props.checked);\n }\n\n render() {\n let classList = ['material-icons'];\n let iconName;\n if (Array.isArray(this.props.className)) {\n classList.push(...this.props.className);\n } else if (this.props.className) {\n classList.push(this.props.className);\n }\n if (this.props.onChange) {\n if (this.props.checked) {\n classList.push('blue', 'clickable');\n iconName = 'check_box';\n } else if (this.props.checked === false) {\n classList.push('blue', 'clickable');\n iconName = 'check_box_outline_blank';\n } else {\n classList.push('lt-blue');\n iconName = 'indeterminate_check_box';\n }\n } else {\n if (this.props.checked) {\n iconName = 'check_box';\n } else {\n iconName = 'check_box_outline_blank';\n }\n }\n let attrs = {\n className: classList.join(' '),\n id: this.props.id,\n };\n if (this.props.onChange) {\n attrs.onClick = this.handleChange;\n }\n return React.createElement('i', attrs, iconName);\n }\n}\n","import React from 'react';\n\nimport Chip from './chip.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\n/* BEGIN ChipInput: group membership widget */\nexport default class ChipInput extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = ChipInput.deriveStateFromProps(props);\n this.state.input = '';\n this.state.focused = false;\n\n this.handleTextInput = this.handleTextInput.bind(this);\n this.removeChipAt = this.removeChipAt.bind(this);\n this.handleChipCancel = this.handleChipCancel.bind(this);\n this.handleFocusGained = this.handleFocusGained.bind(this);\n this.handleFocusLost = this.handleFocusLost.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n static deriveStateFromProps(props) {\n return {\n placeholder: props.chips ? '' : props.prompt,\n sortedChips: ChipInput.sortChips(props.chips, props.staticMembers),\n chipIndex: ChipInput.indexChips(props.chips)\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.chips != this.props.chips ||\n prevProps.staticMembers != this.props.staticMembers ||\n prevProps.prompt != this.props.prompt) {\n this.setState(ChipInput.deriveStateFromProps(this.props));\n }\n if (!prevState || this.props.chips.length > prevState.sortedChips.length) {\n this.setState({input: ''});\n }\n }\n\n // Map chip index to user name\n static indexChips(chips) {\n const index = {};\n let count = 0;\n chips.forEach(item => {\n index[item.user] = count;\n count ++;\n });\n return index;\n }\n\n // Have non-removable chips appear before all other chips.\n static sortChips(chips, keep) {\n const required = [];\n const normal = [];\n chips.forEach(item => {\n if (keep && keep.includes(item.user)) {\n required.push(item);\n } else {\n normal.push(item);\n }\n });\n return required.concat(normal);\n }\n\n handleTextInput(e) {\n this.setState({input: e.target.value});\n if (this.props.filterFunc) {\n this.props.filterFunc(e.target.value);\n }\n }\n\n removeChipAt(idx) {\n const removed = this.state.sortedChips[idx];\n this.props.onChipRemoved(removed.user, this.state.chipIndex[removed.user]);\n }\n\n handleChipCancel(item, idx) {\n this.removeChipAt(idx);\n }\n\n handleFocusGained() {\n this.setState({focused: true});\n }\n\n handleFocusLost() {\n this.setState({focused: false});\n if (this.props.onFocusLost) {\n this.props.onFocusLost(this.state.input);\n }\n }\n\n handleKeyDown(e) {\n if (e.key === 'Backspace') {\n if (this.state.input.length == 0 && this.state.sortedChips.length > 0) {\n const at = this.state.sortedChips.length - 1;\n if (this.state.sortedChips[at].user !== this.props.staticMembers) {\n this.removeChipAt(at);\n }\n }\n } else if (e.key === 'Enter') {\n if (this.props.onEnter) {\n this.props.onEnter(this.state.input);\n }\n } else if (e.key === 'Escape') {\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n }\n }\n\n render() {\n const chips = [];\n let count = 0;\n const staticMembers = this.props.staticMembers || [];\n this.state.sortedChips.forEach(item => {\n chips.push(\n \n );\n count++;\n });\n const className = \"chip-input\" + (this.state.focused ? ' focused' : '');\n const autoFocus = !(this.props.tabIndex > 0);\n return (\n
    \n {chips}\n \n
    \n );\n }\n};\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\n\nexport default class Chip extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n handleCancel(e) {\n e.preventDefault();\n this.props.onCancel(this.props.topic, this.props.index);\n }\n\n render() {\n const title = this.props.title || this.props.topic;\n const className = this.props.invalid ? 'chip invalid' : 'chip';\n return (\n
    \n {this.props.noAvatar ?\n :\n
    \n \n
    \n }\n {title}\n {this.props.onCancel && !this.props.required ?\n ×\n : }\n
    \n );\n }\n};\n","// A panel included into a list of contacts with an action text.\nimport React from 'react';\nimport { injectIntl } from 'react-intl';\n\nclass ContactAction extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.onAction(this.props.action);\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n return (\n
  • \n
    {formatMessage(this.props.title, this.props.values)}
    \n
  • \n );\n }\n};\n\nexport default injectIntl(ContactAction);\n","import React from 'react';\n\nconst icon_mapping = {'muted': 'notifications_off', 'banned': 'block', 'staff': 'verified_user'};\n\n/* Contact's labels: [you], or icons [muted], [blocked] */\nexport default class ContactBadges extends React.PureComponent {\n render() {\n let badges = null;\n if (this.props.badges && this.props.badges.length > 0) {\n badges = [];\n this.props.badges.forEach(b => {\n const color = (b.color ? ' ' + b.color : '');\n if (b.icon) {\n badges.push({icon_mapping[b.icon] || b.icon});\n } else {\n badges.push({b.name});\n }\n });\n return <>{badges};\n }\n return null;\n }\n};\n","// ContactList: component for showing a list of contacts,\n// such as a list of group members in a group chat.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport Contact from './contact.jsx';\nimport ContactAction from './contact-action.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\nimport { MESSAGE_PREVIEW_LENGTH } from '../config.js';\n\nconst messages = defineMessages({\n badge_you: {\n id: 'badge_you',\n defaultMessage: 'you',\n description: 'Badge for indicating the current user'\n },\n badge_owner: {\n id: 'badge_owner',\n defaultMessage: 'owner',\n description: 'Badge for indicating the owner'\n }\n});\n\nclass ContactList extends React.Component {\n render() {\n const { formatMessage } = this.props.intl;\n const showCheckmark = Array.isArray(this.props.topicSelected);\n const contactNodes = [];\n let contactsCount = 0;\n if (this.props.contacts && this.props.contacts.length > 0) {\n this.props.contacts.forEach(c => {\n if (c.action) {\n // Action item\n contactNodes.push(\n );\n } else {\n // Normal contact\n const key = this.props.showMode ? c.user : (c.topic || c.user);\n // If filter function is provided, filter out the items\n // which don't satisfy the condition.\n if (this.props.filterFunc && this.props.filter) {\n const filterOn = [key];\n if (c.private && c.private.comment) {\n filterOn.push(('' + c.private.comment).toLowerCase());\n }\n if (c.public && c.public.fn) {\n filterOn.push(('' + c.public.fn).toLowerCase());\n }\n if (!this.props.filterFunc(this.props.filter, filterOn)) {\n return;\n }\n }\n\n const isChannel = Tinode.isChannelTopicName(key);\n const isGroup = !isChannel && Tinode.isGroupTopicName(key);\n const selected = showCheckmark ?\n (this.props.topicSelected.indexOf(key) > -1) :\n (this.props.topicSelected === key);\n const badges = [];\n if (this.props.showMode) {\n if (key == this.props.myUserId) {\n badges.push({name: formatMessage(messages.badge_you), color: 'green'});\n }\n if (c.acs && c.acs.isOwner()) {\n badges.push({name: formatMessage(messages.badge_owner), color: 'blue'});\n }\n }\n\n const comment = Array.isArray(c.private) ?\n c.private.join(',') : (c.private ? c.private.comment : null);\n let preview;\n let forwarded;\n let previewIsResponse;\n let deliveryStatus;\n if (!this.props.showMode && c.latestMessage) {\n const msg = c.latestMessage();\n if (msg) {\n forwarded = msg.head ? msg.head.forwarded : null;\n deliveryStatus = msg._status || c.msgStatus(msg, true);\n previewIsResponse = msg.from != this.props.myUserId;\n if (msg.content) {\n preview = typeof msg.content == 'string' ?\n msg.content.substr(0, MESSAGE_PREVIEW_LENGTH) :\n Drafty.preview(msg.content, MESSAGE_PREVIEW_LENGTH);\n }\n }\n }\n\n contactNodes.push(\n \n );\n contactsCount ++;\n }\n }, this);\n }\n\n return (\n
    \n {contactsCount == 0 ?\n
    \n :\n null\n }\n {contactNodes.length > 0 ?\n
      \n {contactNodes}\n
    \n :\n null\n }\n
    \n );\n }\n};\n\nexport default injectIntl(ContactList);\n","// A single topic or user.\nimport React from 'react';\nimport { FormattedMessage, injectIntl } from 'react-intl';\n\nimport ContactBadges from './contact-badges.jsx';\nimport LetterTile from './letter-tile.jsx';\nimport UnreadBadge from './unread-badge.jsx';\n\nimport { Drafty } from 'tinode-sdk';\n\nimport { previewFormatter } from '../lib/formatters.js';\nimport { deliveryMarker } from '../lib/utils.js';\n\nclass Contact extends React.Component {\n constructor(props) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n if (this.props.onSelected) {\n // Index this.props.index is used by GroupManager.\n this.props.onSelected(this.props.item, this.props.index);\n }\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.showContextMenu({ topicName: this.props.item, y: e.pageY, x: e.pageX });\n }\n\n render() {\n let title = this.props.title;\n if (!title) {\n title = ;\n } else if (title.length > 30) {\n // FIXME: this is probably wrong for RTL languages.\n title = title.substring(0, 28) + '…';\n }\n const online = this.props.now ? 'online' : 'offline';\n const avatar = this.props.avatar ? this.props.avatar : true;\n const badges = this.props.badges ? this.props.badges.slice() : [];\n const icon_badges = [];\n if (this.props.isVerified) {\n icon_badges.push({icon: 'verified', color: 'verified-color'});\n }\n if (this.props.isStaff) {\n icon_badges.push({icon: 'staff', color: 'staff-color'});\n }\n if (this.props.isDangerous) {\n icon_badges.push({icon: 'dangerous', color: 'danger-color'});\n }\n if (this.props.acs) {\n if (this.props.showMode) {\n badges.push({name: this.props.acs.getMode(), key: 'mode'});\n }\n if (this.props.acs.isMuted()) {\n icon_badges.push({icon: 'muted'});\n }\n if (!this.props.acs.isJoiner()) {\n icon_badges.push({icon: 'banned'});\n }\n }\n\n // The this.props.preview contains alreay shortened Drafty or string.\n let preview;\n if (typeof this.props.preview == 'string') {\n preview = this.props.preview;\n } else if (Drafty.isValid(this.props.preview)) {\n preview = React.createElement(React.Fragment, null, Drafty.format(this.props.preview, previewFormatter,\n {formatMessage: this.props.intl.formatMessage, previewIsResponse: this.props.previewIsResponse}));\n } else if (this.props.preview) {\n preview =\n <>warning_amber \n \n ;\n }\n\n const icon = deliveryMarker(this.props.received);\n const marker = icon ? {icon.name} : null;\n const titleClass = 'contact-title' + (this.props.deleted ? ' deleted' : '');\n\n return (\n
  • \n
    \n \n {this.props.deleted ? cancel :\n this.props.showOnline ? :\n (this.props.showCheckmark && this.props.selected) ?\n check_circle\n : null}\n
    \n
    \n
    {title}\n {this.props.isGroup ? group : null}\n {this.props.isChannel ? \"channel\" : null}\n \n {!this.props.deleted ? : null}\n
    \n {this.props.showMode ?\n :\n this.props.small ? null :
    {marker}{preview || this.props.comment || '\\u00A0'}
    }\n
    \n {this.props.showContextMenu ?\n \n \n expand_more\n \n : null}\n
  • \n );\n }\n};\n\nexport default injectIntl(Contact);\n","// Context Menu: popup/dropdown menu.\nimport React from 'react';\nimport { injectIntl, defineMessages } from 'react-intl';\n\nimport { REM_SIZE } from '../config.js';\n\nconst messages = defineMessages({\n info: {\n id: 'menu_item_info',\n defaultMessage: 'Info',\n description: 'Show extended topic information'\n },\n clear_messages: {\n id: 'menu_item_clear_messages',\n defaultMessage: 'Clear messages',\n description: 'Delete all messages'\n },\n clear_for_all: {\n id: 'menu_item_clear_messages_for_all',\n defaultMessage: 'Clear for All',\n description: 'Delete all message(s) for all members'\n },\n delete: {\n id: 'menu_item_delete',\n defaultMessage: 'Delete',\n description: 'Delete selected messages'\n },\n delete_for_all: {\n id: 'menu_item_delete_for_all',\n defaultMessage: 'Delete for All',\n description: 'Delete selected message(s) for all members'\n },\n send_retry: {\n id: 'menu_item_send_retry',\n defaultMessage: 'Retry',\n description: 'Retry sending message'\n },\n mute: {\n id: 'menu_item_mute',\n defaultMessage: 'Mute',\n description: 'Turn off notifications'\n },\n unmute: {\n id: 'menu_item_unmute',\n defaultMessage: 'Unmute',\n description: 'Turn notifications on'\n },\n reply: {\n id: 'menu_item_reply',\n defaultMessage: 'Reply',\n description: 'Reply to message'\n },\n forward: {\n id: 'menu_item_forward',\n defaultMessage: 'Forward',\n description: 'Forward message'\n },\n edit: {\n id: 'menu_item_edit',\n defaultMessage: 'Edit',\n description: 'Edit message'\n },\n topic_delete: {\n id: 'menu_item_delete_topic',\n defaultMessage: 'Delete',\n description: 'Delete entire topic'\n },\n topic_delete_warning: {\n id: 'topic_delete_warning',\n defaultMessage: 'Are you sure you want to delete this conversation? It cannot be undone.',\n description: 'Alert warning when deleting entire topic'\n },\n delete_messages_warning: {\n id: 'delete_messages_warning',\n defaultMessage: 'Are you sure you want to delete all messages for everyone? It cannot be undone.',\n description: 'Alert dialog warning when hard-deleting all messages.'\n },\n unblock: {\n id: 'menu_item_unblock',\n defaultMessage: 'Unblock',\n description: 'Unblock topic or user'\n },\n // Generic string suitable for either topic or user.\n block: {\n id: 'menu_item_block',\n defaultMessage: 'Block',\n description: 'Block topic or user'\n },\n topic_block_warning: {\n id: 'topic_block_warning',\n defaultMessage: 'Are you sure you want to block this conversation?',\n description: 'Alert warning when blocking a topic.'\n },\n member_delete: {\n id: 'menu_item_member_delete',\n defaultMessage: 'Remove',\n description: 'Remove user from topic'\n },\n archive: {\n id: 'menu_item_archive_topic',\n defaultMessage: 'Archive',\n description: 'Move topic from the list of active chats to archive'\n },\n unarchive: {\n id: 'menu_item_restore_topic',\n defaultMessage: 'Restore',\n description: 'Restore topic from archive'\n },\n edit_permissions: {\n id: 'menu_item_edit_permissions',\n defaultMessage: 'Edit permissions',\n description: 'Menu item [Edit permissions]'\n },\n clear_messages_warning: {\n id: 'clear_messages_warning',\n defaultMessage: 'Are you sure you want to clear all messages? It cannot be undone.',\n description: 'Alert dialog warning when deleting all messages.'\n },\n pin_message: {\n id: 'pin_message',\n defaultMessage: 'Pin',\n description: 'Menu item [Pin] for pinning message to the top.'\n },\n unpin_message: {\n id: 'unpin_message',\n defaultMessage: 'Unpin',\n description: 'Menu item [Unpin] for un-pinning the message.'\n },\n});\n\nclass ContextMenu extends React.Component {\n constructor(props) {\n super(props);\n\n this.selfRef = React.createRef();\n\n const {formatMessage} = props.intl;\n\n this.handlePageClick = this.handlePageClick.bind(this);\n this.handleEscapeKey = this.handleEscapeKey.bind(this);\n this.handleClick = this.handleClick.bind(this);\n\n // Preconfigured menu items.\n this.MenuItems = {\n 'topic_info': {\n id: 'topic_info',\n title: formatMessage(messages.info),\n handler: null\n },\n 'messages_clear': {\n id: 'messages_clear',\n title: formatMessage(messages.clear_messages),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.clear_messages), // title\n formatMessage(messages.clear_messages_warning), // content\n (_ => { this.deleteMessages(true, false, params, errorHandler); }), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'messages_clear_hard': {\n id: 'messages_clear_hard',\n title: formatMessage(messages.clear_for_all),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.clear_for_all), // title\n formatMessage(messages.delete_messages_warning), // content\n (_ => { return this.deleteMessages(true, true, params, errorHandler); }),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'message_delete': {\n id: 'message_delete',\n title: formatMessage(messages.delete),\n handler: (params, errorHandler) => {\n return this.deleteMessages(false, false, params, errorHandler);\n }\n },\n 'message_delete_hard': {\n id: 'message_delete_hard',\n title: formatMessage(messages.delete_for_all),\n handler: (params, errorHandler) => {\n return this.deleteMessages(false, true, params, errorHandler);\n }\n },\n 'menu_item_send_retry': {\n id: 'menu_item_send_retry',\n title: formatMessage(messages.send_retry),\n handler: (params, errorHandler) => {\n return this.retryMessage(params, errorHandler);\n }\n },\n 'menu_item_reply': {\n id: 'menu_item_reply',\n title: formatMessage(messages.reply),\n handler: (params, errorHandler) => {\n return this.replyToMessage(params, errorHandler);\n }\n },\n 'menu_item_forward': {\n id: 'menu_item_forward',\n title: formatMessage(messages.forward),\n handler: _ => {} /* the action is taken directly in tinode-web */\n },\n 'menu_item_edit': {\n id: 'menu_item_edit',\n title: formatMessage(messages.edit),\n handler: (params, errorHandler) => {\n return this.editMessage(params, errorHandler);\n }\n },\n 'menu_item_pin': {\n id: 'menu_item_pin',\n title: formatMessage(messages.pin_message),\n handler: (params, errorHandler) => {\n return this.pinMessage(true, params, errorHandler);\n }\n },\n 'menu_item_unpin': {\n id: 'menu_item_unpin',\n title: formatMessage(messages.unpin_message),\n handler: (params, errorHandler) => {\n return this.pinMessage(false, params, errorHandler);\n }\n },\n 'topic_unmute': {\n id: 'topic_unmute',\n title: formatMessage(messages.unmute),\n handler: this.topicPermissionSetter.bind(this, '+P')\n },\n 'topic_mute': {\n id: 'topic_mute',\n title: formatMessage(messages.mute),\n handler: this.topicPermissionSetter.bind(this, '-P')\n },\n 'topic_unblock': {\n id: 'topic_unblock',\n title: formatMessage(messages.unblock),\n handler: this.topicPermissionSetter.bind(this, '+JP')\n },\n 'topic_block': {\n id: 'topic_block',\n title: formatMessage(messages.block),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.block), // title\n formatMessage(messages.topic_block_warning), // content\n (_ => this.topicPermissionSetter('-JP', params, errorHandler).then(ctrl => {\n this.props.onTopicRemoved(params.topicName);\n return ctrl;\n })),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'topic_delete': {\n id: 'topic_delete',\n title: formatMessage(messages.topic_delete),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n formatMessage(messages.topic_delete), // title\n formatMessage(messages.topic_delete_warning), // content\n (_ => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.delTopic(true).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'topic_archive': {\n id: 'topic_archive',\n title: formatMessage(messages.archive),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.archive(true).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'topic_restore': {\n id: 'topic_restore',\n title: formatMessage(messages.unarchive),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.archive(false).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n // menu_item_edit_permissions is defined elsewhere.\n 'permissions': {\n id: 'permissions',\n title: formatMessage(messages.edit_permissions),\n handler: null\n },\n 'member_delete': {\n id: 'member_delete',\n title: formatMessage(messages.member_delete),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic || !params.user) {\n console.warn(\"Topic or user not found: '\" + params.topicName + \"', '\" + params.user + \"'\");\n return;\n }\n return topic.delSubscription(params.user).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'member_mute': {\n id: 'member_mute',\n title: formatMessage(messages.mute),\n handler: this.topicPermissionSetter.bind(this, '-P')\n },\n 'member_unmute': {\n id: 'member_unmute',\n title: formatMessage(messages.unmute),\n handler: this.topicPermissionSetter.bind(this, '+P')\n },\n 'member_block': {\n id: 'member_block',\n title: formatMessage(messages.block),\n handler: this.topicPermissionSetter.bind(this, '-JP')\n },\n 'member_unblock': {\n id: 'member_unblock',\n title: formatMessage(messages.unblock),\n handler: this.topicPermissionSetter.bind(this, '+JP')\n },\n };\n }\n\n componentDidMount() {\n document.addEventListener('mousedown', this.handlePageClick, false);\n document.addEventListener('keyup', this.handleEscapeKey, false);\n }\n\n componentWillUnmount() {\n document.removeEventListener('mousedown', this.handlePageClick, false);\n document.removeEventListener('keyup', this.handleEscapeKey, false);\n }\n\n handlePageClick(e) {\n if (this.selfRef.current.contains(e.target)) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n this.props.hide();\n }\n\n handleEscapeKey(e) {\n if (e.keyCode === 27) {\n this.props.hide();\n }\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.hide();\n let item = this.props.items[e.currentTarget.dataset.id];\n if (typeof item == 'string') {\n item = this.MenuItems[item];\n }\n\n if (!item) {\n console.error(\"Invalid menu item ID\", e.currentTarget.dataset.id);\n } else {\n this.props.onAction(\n item.id,\n item.handler(this.props.params, this.props.onError),\n this.props.params);\n }\n }\n\n // Menu Actions\n\n deleteMessages(all, hard, params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n\n // We don't know if the message is still pending (e.g. attachment is being uploaded),\n // so try cancelling first. No harm if we can't cancel.\n // The message can be cancelled if transmission to the server has not\n // started yet or if the message send has failed.\n if (!all && topic.cancelSend(params.seq)) {\n return;\n }\n\n const promise = all ?\n topic.delMessagesAll(hard) :\n params.replace > 0 ?\n topic.delMessagesEdits(params.replace, hard) :\n topic.delMessagesList([params.seq], hard);\n\n return promise.catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n // Retries sending failed message.\n retryMessage(params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n // Remove the existing message entry.\n if (!topic || !topic.flushMessage(params.seq)) {\n return;\n }\n const msg = topic.createMessage(params.content, false);\n return topic.publishDraft(msg).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n // Pin or unpin the message.\n pinMessage(pin, params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n return;\n }\n topic.pinMessage(params.seq, pin)\n .catch(err => errorHandler ? errorHandler(err.message, 'err') : null);\n }\n\n // Function is used by context menu to set permissions.\n topicPermissionSetter(mode, params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found\", params.topicName);\n return;\n }\n\n let result = topic.updateMode(params.user, mode);\n if (errorHandler) {\n result = result.catch(err => errorHandler(err.message, 'err'));\n }\n return result;\n }\n\n replyToMessage(params, errorHandler) {\n params.pickReply(params.seq, params.content, params.userFrom, params.userName, errorHandler);\n }\n\n editMessage(params, errorHandler) {\n params.editMessage(params.replace || params.seq, params.content, errorHandler);\n }\n\n render() {\n const menu = [];\n let count = 0;\n this.props.items.forEach(item => {\n if (typeof item == 'string') {\n item = this.MenuItems[item];\n }\n if (item && item.title) {\n const className = item.disabled ? 'disabled' : undefined;\n menu.push(\n item.title == '-' ?\n
  • \n :\n
  • {item.title}
  • \n );\n }\n count++;\n });\n\n // Ensure that menu is inside the app-container.\n const hSize = 12 * REM_SIZE;\n const vSize = REM_SIZE * (0.7 + menu.length * 2.5);\n const left = (this.props.bounds.right - this.props.clickAt.x < hSize) ?\n (this.props.clickAt.x - this.props.bounds.left - hSize) :\n (this.props.clickAt.x - this.props.bounds.left);\n const top = (this.props.bounds.bottom - this.props.clickAt.y < vSize) ?\n (this.props.clickAt.y - this.props.bounds.top - vSize) :\n (this.props.clickAt.y - this.props.bounds.top);\n\n const position = {\n left: left + 'px',\n top: top + 'px'\n };\n\n return (\n
      \n {menu}\n
    \n );\n }\n}\n\nexport default injectIntl(ContextMenu);\n","// Image zoom and crop widget.\n\nimport React from 'react';\n\nconst DEFAULT_MAX_ZOOM = 2.5;\n\nexport default class Cropper extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n // Coordinates of the top left corner of the image in container coordinates.\n panX: 0,\n panY: 0,\n // Origin of the zoom in image coordinates.\n originX: 0,\n originY: 0,\n // Zoom scale.\n zoom: 1,\n // Zoom min and max.\n minZoom: 0,\n maxZoom: DEFAULT_MAX_ZOOM,\n };\n\n // References to DOM elements for hooking up events and getting screen dimensions.\n // The transparent element which captures mouse moves (moves with the image).\n this.overlay = React.createRef();\n // The image cutout window or view port (static).\n this.cutout = React.createRef();\n // Scaled and translated image preview.\n this.preview = React.createRef();\n // The main container (static).\n this.boundingBox = React.createRef();\n\n // The original image width and height before any scaling.\n this.imageWidth = 0;\n this.imageHeight = 0;\n\n // Mouse position when dragging.\n this.mouseX = 0\n this.mouseY = 0;\n // Length of the previous mouse move when dragging.\n this.prevDistance = 0;\n\n // Bounding rectangles of static elements.\n this.cutoutRect = {};\n this.bBoxRect = {};\n // Center of the bounding box.\n this.originX = 0;\n this.originY = 0;\n\n this.initScaling = this.initScaling.bind(this);\n this.onZoom = this.onZoom.bind(this);\n this.handleZoom = this.handleZoom.bind(this);\n this.mouseDown = this.mouseDown.bind(this);\n this.mouseUp = this.mouseUp.bind(this);\n this.mouseMove = this.mouseMove.bind(this);\n this.mouseTouch = this.mouseTouch.bind(this);\n this.positionAll = this.positionAll.bind(this);\n this.translate = this.translate.bind(this);\n }\n\n componentDidMount() {\n this.overlay.current.addEventListener('mousedown', this.mouseDown, { passive: true });\n this.overlay.current.addEventListener('touchstart', this.mouseDown, { passive: true });\n\n // The rectangle position is in viewport coordinates.\n this.bBoxRect = this.boundingBox.current.getBoundingClientRect();\n // Center of the bounding box in container coordinates.\n this.originX = this.bBoxRect.width / 2;\n this.originY = this.bBoxRect.height / 2;\n\n // The rectangle position is in viewport coordinates.\n this.cutoutRect = this.cutout.current.getBoundingClientRect();\n }\n\n componentWillUnmount() {\n this.overlay.current.removeEventListener('mousedown', this.mouseDown);\n this.overlay.current.removeEventListener('touchstart', this.mouseDown);\n }\n\n // Position all elements.\n positionAll(panX, panY, zoom) {\n // Zoom origin in image preview coordinates.\n this.setState({\n panX: panX,\n panY: panY,\n zoom: zoom,\n originX: this.originX - panX,\n originY: this.originY - panY,\n });\n\n // Pass cut out coordinates to caller.\n const left = (this.originX - panX) * zoom - this.originX;\n const top = (this.originY - panY) * zoom - this.originY;\n this.props.onChange(\n (left + this.cutoutRect.left - this.bBoxRect.left) / zoom,\n (top + this.cutoutRect.top - this.bBoxRect.top) / zoom,\n this.cutoutRect.width / zoom,\n this.cutoutRect.height / zoom,\n zoom);\n }\n\n // Check if new location is within the limits.\n static checkBound(currPan, img, cutout, delta) {\n let nextDiff = Math.min(0, cutout[0] - img[0] - delta, img[1] - cutout[1] + delta);\n if (nextDiff == 0) {\n // Cutout is completely within the image.\n currPan += delta;\n } else if (Math.min(0, cutout[0] - img[0], img[1] - cutout[1]) < nextDiff) {\n // Cutout is outside of the range but closer to the bound.\n currPan += delta;\n }\n return currPan;\n }\n\n initScaling() {\n // Initialize components.\n const imgRect = this.preview.current.getBoundingClientRect();\n\n this.imageWidth = imgRect.width;\n this.imageHeight = imgRect.height;\n\n // Set zoom slider's min and max values. Make sure the scaled image cannot be smaller than the cutout.\n const minZoom = Math.max(this.cutoutRect.width / imgRect.width, this.cutoutRect.height / imgRect.height);\n this.setState({\n minZoom: minZoom,\n maxZoom: Math.max(DEFAULT_MAX_ZOOM, minZoom + 1)\n });\n\n // Initial zoom level fills the bounding box at the smallest image dimension and overflows the largest, i.e. \"fill\" not \"fit\".\n const zoom = Math.max(this.bBoxRect.width / imgRect.width, this.bBoxRect.height / imgRect.height);\n // Converting from viewport coordinates to container, then panning.\n const panX = this.cutoutRect.left - this.bBoxRect.left -\n (imgRect.width - this.cutoutRect.width) / 2;\n const panY = this.cutoutRect.top - this.bBoxRect.top -\n (imgRect.height - this.cutoutRect.height) / 2;\n\n this.positionAll(panX, panY, zoom);\n }\n\n onZoom(e) {\n this.handleZoom(e.target.value);\n }\n\n handleZoom(zoom) {\n let panX = this.state.panX;\n let panY = this.state.panY;\n\n // Ensure that the image at the new zoom is not outside of the cutout boundaries.\n // Calculate image coordinates at the new zoom.\n const imgLeft = this.originX - (this.originX - panX) * zoom;\n const imgRight = imgLeft + this.imageWidth * zoom;\n // Cutout in the same coordinates as the image.\n const coLeft = this.cutoutRect.left - this.bBoxRect.left;\n const coRight = coLeft + this.cutoutRect.width;\n if (coLeft < imgLeft) {\n panX -= imgLeft - coLeft;\n } else if (coRight > imgRight) {\n panX += coRight - imgRight;\n }\n const imgTop = this.originY - (this.originY - panY) * zoom;\n const imgBottom = imgTop + this.imageHeight * zoom;\n const coTop = this.cutoutRect.top - this.bBoxRect.top;\n const coBottom = coTop + this.cutoutRect.height;\n if (coTop < imgTop) {\n panY -= imgTop - coTop;\n } else if (coBottom > imgBottom) {\n panY += coBottom - imgBottom;\n }\n\n this.positionAll(panX, panY, zoom);\n }\n\n mouseDown(e) {\n if (e.touches) {\n this.mouseX = e.touches[0].pageX;\n this.mouseY = e.touches[0].pageY;\n } else {\n this.mouseX = e.pageX;\n this.mouseY = e.pageY;\n }\n\n window.addEventListener('mousemove', this.mouseMove, { passive: false });\n window.addEventListener('touchmove', this.mouseTouch, { passive: false });\n window.addEventListener('mouseup', this.mouseUp, { passive: true });\n window.addEventListener('touchend', this.mouseUp, { passive: true });\n // Disable text selection in the entire document.\n document.body.style['userSelect'] = 'none';\n }\n\n // Perform image panning.\n translate(pageX, pageY) {\n const dX = pageX - this.mouseX;\n const dY = pageY - this.mouseY;\n\n this.mouseX = pageX;\n this.mouseY = pageY;\n\n // Make sure the image is within the cutout window.\n const imgRect = this.preview.current.getBoundingClientRect();\n\n // Check if the new position is within the boundaries, and if not if it's closer to them.\n let panX = Cropper.checkBound(this.state.panX, [imgRect.left, imgRect.right],\n [this.cutoutRect.left, this.cutoutRect.right], dX);\n let panY = Cropper.checkBound(this.state.panY, [imgRect.top, imgRect.bottom],\n [this.cutoutRect.top, this.cutoutRect.bottom], dY);\n\n this.positionAll(panX, panY, this.state.zoom);\n }\n\n // Image panning.\n mouseMove(e) {\n e.preventDefault();\n this.translate(e.pageX, e.pageY);\n }\n\n mouseTouch(e) {\n e.preventDefault();\n\n if (e.touches.length == 1) {\n this.translate(e.touches[0].pageX, e.touches[0].pageY);\n return;\n }\n\n // Image zooming by pinching.\n const [touch0, touch1] = e.touches;\n const distance = Math.sqrt((touch0.pageX - touch1.pageX) * (touch0.pageX - touch1.pageX) +\n (touch0.pageY - touch1.pageY) * (touch0.pageY - touch1.pageY));\n\n if (!this.prevDistance) {\n this.prevDistance = distance / this.state.zoom;\n }\n\n let scale = (distance / this.prevDistance);\n this.handleZoom(Math.max(this.minZoom, Math.min(this.maxZoom, scale)));\n }\n\n mouseUp(e) {\n window.removeEventListener('mousemove', this.mouseMove);\n window.removeEventListener('touchmove', this.mouseTouch);\n window.removeEventListener('mouseup', this.mouseUp);\n window.removeEventListener('touchend', this.mouseUp);\n // Re-enable text selection.\n document.body.style['userSelect'] = '';\n\n this.positionAll(this.state.panX, this.state.panY, this.state.zoom);\n }\n\n render() {\n // transform3d: position and scale.\n const t3d = `translate3d(${this.state.panX}px, ${this.state.panY}px, 0) scale(${this.state.zoom})`;\n // transformOrigin: zoom origin.\n const orig = `${this.state.originX}px ${this.state.originY}px`;\n\n // Overlay position and size are exactly equal to the position and size of the transformed image\n // except it uses different coordinates.\n const overlay = {\n top: `${this.originY - this.state.originY * this.state.zoom}px`,\n left: `${this.originX - this.state.originX * this.state.zoom}px`,\n width: `${this.imageWidth * this.state.zoom}px`,\n height: `${this.imageHeight * this.state.zoom}px`\n };\n return (\n
    \n
    \n \"\"\n\n
    \n
    \n
    \n
    \n \n
    \n
    \n );\n }\n}\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport SendMessage from '../widgets/send-message.jsx';\n\nimport { bytesToHumanSize, shortenFileName } from '../lib/strformat.js';\n\n// Get material icon name from mime type.\nfunction iconFromMime(mime) {\n // If more icons become available in material icons, add them to this mime-to-icon mapping.\n const mimeToIcon = {default: 'insert_drive_file', image: 'image', text: 'description', video: 'theaters'};\n\n return mimeToIcon[mime] || mimeToIcon[(mime || '').split('/')[0]] || mimeToIcon['default'];\n}\n\nexport default class DocPreview extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleSendDoc = this.handleSendDoc.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n componentDidMount() {\n document.addEventListener('keydown', this.handleKeyDown);\n }\n\n componentWillUnmount() {\n document.removeEventListener('keydown', this.handleKeyDown);\n }\n\n handleKeyDown(e) {\n e.preventDefault();\n if (e.key === 'Escape') {\n this.props.onClose();\n }\n }\n\n handleSendDoc(caption) {\n this.props.onClose();\n this.props.onSendMessage(this.props.content.file);\n }\n\n render() {\n if (!this.props.content) {\n return null;\n }\n return (\n
    \n \n
    \n
    \n {iconFromMime(this.props.content.type)}\n
    {shortenFileName(this.props.content.name, 24) || '-'}
    \n
    {this.props.content.type || 'application/octet-stream'}
    \n
    {bytesToHumanSize(this.props.content.size)}
    \n
    \n
    \n \n
    \n );\n }\n};\n","import React from 'react';\n\nimport MenuCancel from './menu-cancel.jsx';\n\nexport default class ErrorPanel extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n show: false,\n };\n\n this.hide = this.hide.bind(this);\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.level !== this.props.level) {\n this.setState({\n show: !(!this.props.level)\n });\n }\n }\n\n hide() {\n this.setState({show: false});\n if (this.props.onClearError) {\n this.props.onClearError();\n }\n }\n\n render() {\n const icons = {err: 'error', warn: 'warning', info: 'info'}\n const level = icons[this.props.level] || '';\n const className = 'info-box ' + level;\n return (\n
    \n
    {level}
    \n \n {this.props.text}\n {this.props.action ?\n <>\n   {e.preventDefault(); this.props.action();}}>\n {this.props.actionText}\n \n \n : null}\n \n
    \n
    \n );\n }\n};\n","// File uload/download progress indicator with a cancel inside.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class FileProgress extends React.PureComponent {\n render() {\n return (\n
    \n
    \n {this.props.progress < 0.999 ?\n {e.preventDefault(); this.props.onCancel();}}>\n close \n \n :\n \n }\n
    \n );\n }\n}\n","// Forward Menu: message forwarding popup/dropdown menu.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport ContactList from './contact-list.jsx';\nimport SearchContacts from './search-contacts.jsx';\n\nexport default class ForwardDialog extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n query: null\n };\n\n this.handleEscapeKey = this.handleEscapeKey.bind(this);\n this.handleClose = this.handleClose.bind(this);\n\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleContactSelected = this.handleContactSelected.bind(this);\n }\n\n componentDidMount() {\n this.props.onInitFind();\n }\n\n handleEscapeKey(e) {\n if (e.keyCode === 27) {\n // Not forwarding the message.\n this.props.hide(false);\n }\n }\n\n handleClose(e) {\n e.preventDefault();\n this.props.hide(false);\n }\n\n handleSearchContacts(query) {\n this.setState({ query: Tinode.isNullValue(query) ? null : query });\n this.props.onSearchContacts(query);\n }\n\n handleContactSelected(uid) {\n this.props.onTopicSelected(uid);\n this.props.hide(true);\n }\n\n render() {\n let contacts = this.state.query != null ? this.props.searchResults : this.props.contacts;\n // Filter out contacts without a 'W' or 'J' permissions as well as the current topic.\n contacts = contacts.filter((c) => {\n return (c.name != this.props.topicSelected) && c.acs.isJoiner() && c.acs.isWriter();\n });\n\n return (\n
    \n
    \n
    \n
    \n \n
    \n {\n (search_placeholder) => \n }\n {\n (not_found_placeholder) => \n }\n
    \n
    \n );\n }\n}\n","// GroupMembers: control for managing a list of group members.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport ChipInput from './chip-input.jsx';\nimport ContactList from './contact-list.jsx';\n\nconst messages = defineMessages({\n no_contacts: {\n id: 'no_contacts',\n defaultMessage: 'You have no contacts :-(',\n description: 'Shown in ContactsView when the user has no contacts'\n },\n contacts_not_found_short: {\n id: 'contacts_not_found_short',\n defaultMessage: \"No contacts match ''{query}''\",\n description: 'Shown in ContactsView when search returned no results'\n }\n});\n\nclass GroupManager extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n // Array of topic members\n members: props.members,\n index: GroupManager.indexMembers(props.members),\n staticMembers: GroupManager.staticMembers(props.members, props.keepInitialMembers, props.requiredMember),\n contactFilter: '',\n noContactsMessage: props.intl.formatMessage(messages.no_contacts),\n selectedContacts: GroupManager.selectedContacts(props.members)\n };\n\n this.handleContactSelected = this.handleContactSelected.bind(this);\n this.handleMemberRemoved = this.handleMemberRemoved.bind(this);\n this.handleContactFilter = this.handleContactFilter.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static indexMembers(members) {\n let index = {};\n members.forEach(m => {\n index[m.user] = {delta: 0, present: true}; // Delta: 0 unchanged, +1 added, -1 removed\n });\n return index;\n }\n\n static staticMembers(members, keepInitial, requiredMember) {\n let stat = [];\n members.forEach(m => {\n if (keepInitial || m.user == requiredMember) {\n stat.push(m.user);\n }\n });\n return stat;\n }\n\n static selectedContacts(members) {\n let sel = [];\n members.forEach(m => {\n sel.push(m.user);\n });\n return sel;\n }\n\n handleContactSelected(userId, index) {\n let status = this.state.index[userId];\n if (status) {\n if (status.present) {\n // Prevent duplicate members\n return;\n }\n status.delta += 1;\n status.present = true;\n } else {\n status = {delta: 1, present: true};\n }\n\n let m = this.state.members.slice();\n m.push(this.props.contacts[index]);\n\n const sel = GroupManager.selectedContacts(m);\n\n const i = this.state.index;\n i[userId] = status;\n\n this.setState({members: m, index: i, selectedContacts: sel});\n }\n\n handleMemberRemoved(userId, index) {\n const status = this.state.index[userId];\n if (!status || !status.present) {\n return;\n }\n status.present = false;\n status.delta -= 1;\n\n let m = this.state.members.slice();\n m.splice(index, 1);\n\n const sel = GroupManager.selectedContacts(m);\n\n const i = this.state.index;\n i[userId] = status;\n\n this.setState({members: m, index: i, selectedContacts: sel});\n }\n\n handleContactFilter(val) {\n const {formatMessage} = this.props.intl;\n const msg = !val ?\n formatMessage(messages.no_contacts) :\n formatMessage(messages.contacts_not_found_short, {query: val});\n\n this.setState({contactFilter: val, noContactsMessage: msg});\n }\n\n static doContactFiltering(filter, values) {\n if (filter) {\n for (let i=0; i= 0) {\n return true;\n }\n }\n return false;\n }\n return true;\n }\n\n handleSubmit() {\n const members = [];\n const added = [];\n const removed = [];\n\n const keys = Object.keys(this.state.index);\n keys.forEach(k => {\n if (this.state.index[k].present) {\n members.push(k);\n }\n\n if (this.state.index[k].delta > 0) {\n added.push(k);\n } else if (this.state.index[k].delta < 0) {\n removed.push(k);\n }\n });\n this.props.onSubmit(members, added, removed);\n }\n\n handleCancel() {\n this.props.onCancel();\n }\n\n render() {\n return (\n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n \n
    \n \n \n
    \n
    \n );\n }\n};\n\nexport default injectIntl(GroupManager);\n","// GroupSubs: a list of group subscribers currently online.\n// Show in the topic title bar\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { MAX_ONLINE_IN_TOPIC } from '../config.js'\n\nimport LetterTile from './letter-tile.jsx';\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\nexport default class GroupSubs extends React.Component {\n constructor(props) {\n super(props);\n }\n\n render() {\n const usersOnline = [];\n const totalCount = (this.props.subscribers || []).length;\n const countToShow = Math.min(MAX_ONLINE_IN_TOPIC, totalCount);\n\n (this.props.subscribers || []).some((sub) => {\n usersOnline.push(\n
    \n \n
    \n );\n return usersOnline.length == countToShow;\n });\n if (usersOnline.length == 0) {\n return null;\n }\n return (\n
    {usersOnline} {totalCount > countToShow ?\n \n \n : null}\n
    \n );\n }\n};\n","import React from 'react';\n\nimport { KNOWN_HOSTS } from '../config.js';\n\n/* Combobox for selecting host name */\n\nexport default class HostSelector extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n hostName: props.serverAddress,\n changed: false\n };\n\n this.handleHostNameChange = this.handleHostNameChange.bind(this);\n this.handleEditingFinished = this.handleEditingFinished.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n handleHostNameChange(e) {\n this.setState({hostName: e.target.value, changed: true});\n }\n\n handleEditingFinished() {\n if (this.state.changed) {\n this.setState({changed: false});\n this.props.onServerAddressChange(this.state.hostName.trim());\n }\n }\n\n handleKeyDown(e) {\n if (e.key == 'Enter') {\n this.handleEditingFinished();\n }\n }\n\n render() {\n const hostOptions = [];\n for (let key in KNOWN_HOSTS) {\n let item = KNOWN_HOSTS[key];\n hostOptions.push(\n