@banta/sdk 4.6.22 โ†’ 4.6.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("rxjs"),require("rxjs/operators"),require("@angular/core"),require("marked"),require("dompurify"),require("@angular/platform-browser"),require("@angular/common"),require("@angular/material/icon"),require("@angular/material/progress-spinner"),require("@angular/material/button"),require("@angular/cdk/overlay"),require("@angular/material/form-field"),require("@angular/material/input"),require("@angular/forms"),require("@angular/cdk/portal"),require("@angular/material/dialog"),require("@banta/common"),require("@angular/router"),require("@angular/material/snack-bar"),require("@angular/material/menu"),require("@angular/cdk/text-field"),require("@angular/material/tooltip"),require("@angular/material/select")):"function"==typeof define&&define.amd?define("@banta/sdk",["exports","rxjs","rxjs/operators","@angular/core","marked","dompurify","@angular/platform-browser","@angular/common","@angular/material/icon","@angular/material/progress-spinner","@angular/material/button","@angular/cdk/overlay","@angular/material/form-field","@angular/material/input","@angular/forms","@angular/cdk/portal","@angular/material/dialog","@banta/common","@angular/router","@angular/material/snack-bar","@angular/material/menu","@angular/cdk/text-field","@angular/material/tooltip","@angular/material/select"],t):t(((e="undefined"!=typeof globalThis?globalThis:e||self).banta=e.banta||{},e.banta.sdk={}),e.rxjs,e.rxjs.operators,e.ng.core,e.marked,e.DOMPurify,e.ng.platformBrowser,e.ng.common,e.ng.material.icon,e.ng.material.progressSpinner,e.ng.material.button,e.ng.cdk.overlay,e.ng.material.formField,e.ng.material.input,e.ng.forms,e.ng.cdk.portal,e.ng.material.dialog,e.common$1,e.ng.router,e.ng.material.snackBar,e.ng.material.menu,e.ng.cdk.textField,e.ng.material.tooltip,e.ng.material.select)}(this,(function(e,t,r,a,n,o,s,i,c,l,d,u,h,g,y,p,m,f,b,w,k,v,_,x){"use strict";var j=function(){function e(){this.relative="",this.tooltip="",this.updateInterval=null,this.showAbsolute=!1}return e.prototype.ngOnDestroy=function(){this.updateInterval&&clearInterval(this.updateInterval)},Object.defineProperty(e.prototype,"value",{get:function(){return this._value},set:function(e){this._value=e,this.update()},enumerable:!1,configurable:!0}),e.prototype.update=function(){var e=this,t=Date.now()-this.value,r=6e4,a=36e5,n=24*a,o=7*n,s=30*n;this.showAbsolute=!1;var i=0;if(t>31536e6)return this.showAbsolute=!0,void(this.relative="abs");if(t>s){var c=Math.floor(t/s);this.relative=1===c?c+" month ago":c+" months ago"}else if(t>o){var l=Math.floor(t/o);this.relative=1===l?l+" week ago":l+" weeks ago"}else if(t>n){var d=Math.floor(t/n);this.relative=1===d?d+" day ago":d+" days ago"}else if(t>a){var u=Math.floor(t/a);this.relative=1===u?u+" hour ago":u+" hours ago",i=18e5}else if(t>r){var h=Math.floor(t/r);this.relative=1===h?h+" minute ago":h+" minutes ago",i=45e3}else t>3e4?(this.relative="about a minute ago",i=6e4):(this.relative="just now",i=3e4);"undefined"!=typeof window&&(clearInterval(this.updateInterval),i>0&&(this.updateInterval=setInterval((function(){return e.update()}))))},e}();j.decorators=[{type:a.Component,args:[{selector:"banta-timestamp",template:'\n <span *ngIf="showAbsolute" [title]="value | date : \'short\'">\n {{value | date : \'shortDate\'}}\n </span>\n <span *ngIf="!showAbsolute" [title]="value | date : \'short\'">\n {{relative}}\n </span>\n ',styles:[""]}]}],j.propDecorators={value:[{type:a.Input}]};var M=function(){function e(){}return e.prototype.ngAfterViewInit=function(){"undefined"!=typeof window&&document.body.appendChild(this.containerElement.nativeElement)},e.prototype.ngOnDestroy=function(){this.containerElement.nativeElement.remove()},e.prototype.close=function(){this.isOpen=!1},e.prototype.open=function(e,t){this.currentImage=e,this.images=t,this.isOpen=!0},e}();M.decorators=[{type:a.Component,args:[{selector:"banta-lightbox",template:'<div \r\n class="banta-lightbox-container" \r\n #container\r\n [class.open]="isOpen"\r\n >\r\n\r\n <a class="underlay" (click)="close()" href="javascript:;"></a>\r\n\r\n <a class="close-button" href="javascript:;" (click)="close()">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n\r\n <img [src]="currentImage" />\r\n</div>\r\n',styles:["::ng-deep .banta-lightbox-container{position:fixed;top:0;left:0;right:0;bottom:0;opacity:0;pointer-events:none;background-color:rgba(0,0,0,.75);color:#fff;z-index:10000;transition:opacity .25s ease-in-out;display:flex;align-items:center;justify-content:center}::ng-deep .banta-lightbox-container a.underlay{z-index:0;position:absolute;top:0;left:0;right:0;bottom:0;opacity:0}::ng-deep .banta-lightbox-container img{z-index:10;max-width:95%}::ng-deep .banta-lightbox-container.open{opacity:1;pointer-events:auto}::ng-deep .banta-lightbox-container a.close-button{position:absolute;top:0;right:0;padding:.75em;z-index:20}"]}]}],M.propDecorators={containerElement:[{type:a.ViewChild,args:["container"]}]};n.marked.use({extensions:[{name:"underline",level:"inline",start:function(e){var t;return null===(t=e.match(/\+\+/))||void 0===t?void 0:t.index},tokenizer:function(e,t){var r=/^\+\+(.*?)\+\+/.exec(e);if(r)return{type:"underline",raw:r[0],text:this.lexer.inlineTokens(r[1].trim())}},renderer:function(e){return"<u>"+this.parser.parseInline(e.text)+"</u>"}}]});var S=function(){function e(e){var t=this;this.sanitizer=e,this.renderer=new n.Renderer({headerPrefix:""});var r=this.renderer.link;this.renderer.link=function(e,a,n){return r.call(t.renderer,e,a,n).replace(/^<a /,'<a target="_blank" rel="noopener" ')}}return e.prototype.transform=function(e){return e?this.sanitizer.bypassSecurityTrustHtml(o.sanitize(n.marked.parse(e,{renderer:this.renderer}),{FORBID_TAGS:["h1","h2","h3","h4"],KEEP_CONTENT:!0})):""},e}();S.decorators=[{type:a.Pipe,args:[{name:"markdownToHtml"}]}],S.ctorParameters=function(){return[{type:s.DomSanitizer}]},o.addHook("afterSanitizeAttributes",(function(e){"target"in e&&(e.setAttribute("target","_blank"),e.setAttribute("rel","noopener noreferrer")),e.hasAttribute("target")||!e.hasAttribute("xlink:href")&&!e.hasAttribute("href")||e.setAttribute("xlink:show","new")}));var I=function(){function e(e){this.sanitizer=e}return e.prototype.transform=function(e){if(e)return this.sanitizer.bypassSecurityTrustResourceUrl(e)},e}();I.decorators=[{type:a.Pipe,args:[{name:"trustResourceUrl"}]}],I.ctorParameters=function(){return[{type:s.DomSanitizer}]};var O=function(){function e(){}return e.prototype.transform=function(e,t){var r=this;if(!e)return"";if(!t)return e;for(var a=e,n=0,o=t.length;n<o;++n){var s=t[n];a=a.replace(new RegExp(""+this.escapeRegExp(s.text),"gi"),"@{"+(n+1)+"}")}return a=a.replace(/@\{(\d+)\}/g,(function(e,a){return t[a-1]?r.formatLink(t[a-1]):e}))},e.prototype.formatLink=function(e){return"<a"+(e.external?' target="_blank" rel="noopener"':"")+' href="'+e.link+'">'+e.text+"</a>"},e.prototype.escapeRegExp=function(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},e}();O.decorators=[{type:a.Pipe,args:[{name:"mentionLinker"}]}];var C=function(){function e(e){this.elementRef=e,this.loading=!1,this.editing=!1,this.loadingMessage="Please wait...",this.error=!1,this.errorMessage="An error has occurred",this.removed=new t.Subject,this.activated=new t.Subject,this.loaded=new t.Subject,this._viewLoaded=!1}return Object.defineProperty(e.prototype,"attachment",{get:function(){return this._attachment},set:function(e){this._attachment=e,this.checkLoad()},enumerable:!1,configurable:!0}),e.prototype.ngOnInit=function(){"undefined"!=typeof window&&setTimeout((function(){window.twttr&&window.twttr.widgets.load()}),100)},e.prototype.ngAfterViewInit=function(){this._viewLoaded=!0,this.checkLoad()},e.prototype.checkLoad=function(){var e,t=this;this._attachment&&this._viewLoaded&&(null===(e=this.elementRef)||void 0===e?void 0:e.nativeElement)&&("undefined"==typeof window?this.loaded.next():setTimeout((function(){return t.loaded.next()}),250))},e.prototype.activate=function(){this.activated.next()},e.prototype.remove=function(){this.removed.next()},Object.defineProperty(e.prototype,"isError",{get:function(){var e,t;return this.error||(null===(t=null===(e=this.attachment)||void 0===e?void 0:e.transientState)||void 0===t?void 0:t.error)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"theErrorMessage",{get:function(){var e,t;return this.errorMessage||(null===(t=null===(e=this.attachment)||void 0===e?void 0:e.transientState)||void 0===t?void 0:t.errorMessage)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isLoading",{get:function(){var e;return this.loading||!this.attachment||(null===(e=this.attachment.transientState)||void 0===e?void 0:e.loading)||!this.attachment.url},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isImageAttachment",{get:function(){return!!this.attachment.type.startsWith("image/")},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"hasFrame",{get:function(){return!!this.attachment&&("iframe"===this.attachment.type||"card"===this.attachment.type&&this.attachment.card.player)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"frameUrl",{get:function(){if(this.attachment)return"iframe"===this.attachment.type?this.attachment.url:"card"===this.attachment.type?this.attachment.card.player:void 0},enumerable:!1,configurable:!0}),e}();C.decorators=[{type:a.Component,args:[{selector:"banta-attachment",template:'<button type="button" (click)="remove()" mat-mini-fab color="primary" class="remove-button" *ngIf="editing">\r\n <mat-icon>close</mat-icon>\r\n</button>\r\n\r\n<ng-container *ngIf="isError">\r\n <mat-icon class="error">close</mat-icon>\r\n <em class="error">{{theErrorMessage}}</em>\r\n</ng-container>\r\n<ng-container *ngIf="!isError">\r\n <ng-container *ngIf="isLoading">\r\n <mat-spinner></mat-spinner>\r\n <em>{{loadingMessage}}</em>\r\n </ng-container>\r\n <ng-container *ngIf="!isLoading">\r\n <iframe *ngIf="hasFrame"\r\n sandbox="allow-scripts allow-popups allow-same-origin allow-presentation" \r\n [src]="frameUrl | trustResourceUrl"></iframe>\r\n <a *ngIf="attachment.type === \'card\'" class="card-attachment" [href]="attachment.url" target="_blank" [class.has-image]="attachment.card.image">\r\n <img \r\n *ngIf="attachment.card.image"\r\n class="thumbnail" \r\n [src]="attachment.card.image"\r\n />\r\n <div class="description">\r\n <h1>{{attachment.card.title}}</h1>\r\n <div class="summary">\r\n {{attachment.card.description}}\r\n </div>\r\n <cite>{{attachment.card.url}}</cite>\r\n </div>\r\n </a>\r\n <a class="image-attachment" *ngIf="isImageAttachment" href="javascript:;" (click)="activate()">\r\n <img [src]="attachment.url" alt="Image Attachment">\r\n </a>\r\n <blockquote *ngIf="attachment.type === \'tweet\'" \r\n class="twitter-tweet">\r\n <p lang="en" dir="ltr"></p>\r\n <a [href]="attachment.url"></a>\r\n </blockquote>\r\n </ng-container>\r\n</ng-container>',styles:[":host{position:relative;display:block}:host.loading{outline:1px solid #333;padding:1em 0;width:300px;text-align:center}:host.loading mat-spinner{display:block;margin:0 auto .5em;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}a.card-attachment{display:flex;align-items:flex-start;gap:1em;width:100%;border:1px solid #666;border-radius:4px;padding:1em;box-sizing:border-box;background-color:#191919;margin:1em 0}a.card-attachment img{width:250px;aspect-ratio:16/9;-o-object-fit:cover;object-fit:cover;border-radius:10px}a.card-attachment.has-image h1{font-size:22px}a.card-attachment h1{min-width:0;margin:0 0 .5em;font-size:26px}a.card-attachment cite{min-width:0;opacity:.75;margin-top:1em;display:block;font-size:80%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}a.card-attachment .description{min-width:0;width:100%}a.card-attachment .summary{overflow-x:hidden;text-overflow:ellipsis}.remove-button{position:absolute;right:10px;top:10px;margin:0;z-index:1}a.image-attachment{width:300px;position:relative;text-align:center}a.image-attachment.with-border{outline:1px solid #333;padding:1em 0}a.image-attachment mat-spinner{display:block;margin:0 auto .5em;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}a.image-attachment mat-icon.error{display:block;font-size:48px;width:48px;height:48px;margin:0 auto .5em}a.image-attachment .error{color:#b76363}a.image-attachment img{width:300px;border-radius:10px;max-width:100%;max-height:20em;-o-object-fit:cover;object-fit:cover}iframe{border:none;width:100%;aspect-ratio:16/9}@media (max-width:700px){a.card-attachment{flex-direction:column}a.card-attachment img{width:100%}}"]}]}],C.ctorParameters=function(){return[{type:a.ElementRef}]},C.propDecorators={attachment:[{type:a.Input}],loading:[{type:a.Input}],editing:[{type:a.Input}],loadingMessage:[{type:a.Input}],error:[{type:a.Input}],errorMessage:[{type:a.Input}],removed:[{type:a.Output}],activated:[{type:a.Output}],loaded:[{type:a.Output}],isLoading:[{type:a.HostBinding,args:["class.loading"]}]};var P=function(){function e(){this.editing=!1,this.remove=new t.Subject,this.loaded=new t.Subject,this.loadedAttachments=new WeakMap}return e.prototype.ngAfterViewInit=function(){},e.prototype.markAttachmentLoaded=function(e){this.loadedAttachments.set(e,!0),this.allAttachmentsLoaded&&this.loaded.next()},e.prototype.isAttachmentLoaded=function(e){return this.loadedAttachments.has(e)},Object.defineProperty(e.prototype,"allAttachmentsLoaded",{get:function(){var e=this;return this.attachments.every((function(t){return e.isAttachmentLoaded(t)}))},enumerable:!1,configurable:!0}),e.prototype.removeAttachment=function(e){this.remove.next(e)},e.prototype.isImageAttachment=function(e){return!!e.type.startsWith("image/")},e.prototype.isCardAttachment=function(e){return!!["card"].includes(e.type)},e.prototype.showLightbox=function(e){this.lightbox.open(e.url,this.attachments.filter((function(e){return"image/png"===e.type})).map((function(e){return e.url})))},Object.defineProperty(e.prototype,"inlineAttachments",{get:function(){return this.attachments.filter((function(e){return"card"!==e.type&&("inline"===e.style||!e.style)}))},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"blockAttachments",{get:function(){return this.attachments.filter((function(e){return"block"===e.style||"card"===e.type}))},enumerable:!1,configurable:!0}),e.prototype.attachmentId=function(e,t){return t.url},e}();P.decorators=[{type:a.Component,args:[{selector:"banta-attachments",template:'<ng-container *ngIf="attachments?.length > 0">\r\n <banta-lightbox #lightbox></banta-lightbox>\r\n <div class="block-attachments">\r\n <ng-container *ngFor="let attachment of blockAttachments; trackBy: attachmentId">\r\n <banta-attachment \r\n [attachment]="attachment"\r\n [editing]="editing"\r\n (loaded)="markAttachmentLoaded(attachment)"\r\n (removed)="removeAttachment(attachment)"\r\n (activated)="showLightbox(attachment)"\r\n ></banta-attachment>\r\n </ng-container>\r\n </div>\r\n\r\n <div \r\n class="inline-attachments" \r\n [class.single]="attachments?.length === 1" \r\n *ngIf="attachments && attachments?.length > 0"\r\n >\r\n <ng-container *ngFor="let attachment of inlineAttachments; trackBy: attachmentId">\r\n <banta-attachment \r\n [attachment]="attachment"\r\n [editing]="editing"\r\n (loaded)="markAttachmentLoaded(attachment)"\r\n (removed)="removeAttachment(attachment)"\r\n (activated)="showLightbox(attachment)"\r\n ></banta-attachment>\r\n </ng-container>\r\n </div>\r\n</ng-container>',styles:[".block-attachments{display:flex;flex-direction:column}.block-attachments banta-attachment{width:100%}.inline-attachments{flex-direction:row;margin-top:15px;display:flex;gap:20px;flex-wrap:wrap}"]}]}],P.propDecorators={attachments:[{type:a.Input}],editing:[{type:a.Input}],lightbox:[{type:a.ViewChild,args:["lightbox"]}],remove:[{type:a.Output}],loaded:[{type:a.Output}]};var E=[j,M,S,O,I,C,P],A=function(){};A.decorators=[{type:a.NgModule,args:[{declarations:E,imports:[i.CommonModule,c.MatIconModule,l.MatProgressSpinnerModule,d.MatButtonModule],exports:E}]}];var T=function(e,t){return(T=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])})(e,t)};function L(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function r(){this.constructor=e}T(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}function q(e,t,r,a){var n,o=arguments.length,s=o<3?t:null===a?a=Object.getOwnPropertyDescriptor(t,r):a;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,a);else for(var i=e.length-1;i>=0;i--)(n=e[i])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s}function z(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function D(e,t,r,a){return new(r||(r=Promise))((function(n,o){function s(e){try{c(a.next(e))}catch(e){o(e)}}function i(e){try{c(a.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?n(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,i)}c((a=a.apply(e,t||[])).next())}))}function R(e,t){var r,a,n,o,s={label:0,sent:function(){if(1&n[0])throw n[1];return n[1]},trys:[],ops:[]};return o={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function i(o){return function(i){return function(o){if(r)throw new TypeError("Generator is already executing.");for(;s;)try{if(r=1,a&&(n=2&o[0]?a.return:o[0]?a.throw||((n=a.return)&&n.call(a),0):a.next)&&!(n=n.call(a,o[1])).done)return n;switch(a=0,n&&(o=[2&o[0],n.value]),o[0]){case 0:case 1:n=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,a=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(n=s.trys,(n=n.length>0&&n[n.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!n||o[1]>n[0]&&o[1]<n[3])){s.label=o[1];break}if(6===o[0]&&s.label<n[1]){s.label=n[1],n=o;break}if(n&&s.label<n[2]){s.label=n[2],s.ops.push(o);break}n[2]&&s.ops.pop(),s.trys.pop();continue}o=t.call(e,s)}catch(e){o=[6,e],a=0}finally{r=n=0}if(5&o[0])throw o[1];return{value:o[0]?o[1]:void 0,done:!0}}([o,i])}}}Object.create;function U(e){var t="function"==typeof Symbol&&Symbol.iterator,r=t&&e[t],a=0;if(r)return r.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&a>=e.length&&(e=void 0),{value:e&&e[a++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function F(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var a,n,o=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(a=o.next()).done;)s.push(a.value)}catch(e){n={error:e}}finally{try{a&&!a.done&&(r=o.return)&&r.call(o)}finally{if(n)throw n.error}}return s}function V(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(F(arguments[t]));return e}Object.create;var $={grinning:{keywords:["face","smile","happy","joy",":D","grin"],char:"๐Ÿ˜€",category:"people"},grimacing:{keywords:["face","grimace","teeth"],char:"๐Ÿ˜ฌ",category:"people"},grin:{keywords:["face","happy","smile","joy","kawaii"],char:"๐Ÿ˜",category:"people"},joy:{keywords:["face","cry","tears","weep","happy","happytears","haha"],char:"๐Ÿ˜‚",category:"people"},smiley:{keywords:["face","happy","joy","haha",":D",":)","smile","funny"],char:"๐Ÿ˜ƒ",category:"people"},smile:{keywords:["face","happy","joy","funny","haha","laugh","like",":D",":)"],char:"๐Ÿ˜„",category:"people"},sweat_smile:{keywords:["face","hot","happy","laugh","sweat","smile","relief"],char:"๐Ÿ˜…",category:"people"},laughing:{keywords:["happy","joy","lol","satisfied","haha","face","glad","XD","laugh"],char:"๐Ÿ˜†",category:"people"},innocent:{keywords:["face","angel","heaven","halo"],char:"๐Ÿ˜‡",category:"people"},wink:{keywords:["face","happy","mischievous","secret",";)","smile"],char:"๐Ÿ˜‰",category:"people"},blush:{keywords:["face","smile","happy","flushed","crush","embarrassed","shy","joy"],char:"๐Ÿ˜Š",category:"people"},slightly_smiling:{keywords:["face","smile"],char:"๐Ÿ™‚",category:"people"},upside_down:{keywords:["face","flipped","silly","smile"],char:"๐Ÿ™ƒ",category:"people"},relaxed:{keywords:["face","blush","massage","happiness"],char:"โ˜บ๏ธ",category:"people"},yum:{keywords:["happy","joy","tongue","smile","face","silly","yummy","nom"],char:"๐Ÿ˜‹",category:"people"},relieved:{keywords:["face","relaxed","phew","massage","happiness"],char:"๐Ÿ˜Œ",category:"people"},heart_eyes:{keywords:["face","love","like","affection","valentines","infatuation","crush","heart"],char:"๐Ÿ˜",category:"people"},kissing_heart:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:"๐Ÿ˜˜",category:"people"},kissing:{keywords:["love","like","face","3","valentines","infatuation","kiss"],char:"๐Ÿ˜—",category:"people"},kissing_smiling_eyes:{keywords:["face","affection","valentines","infatuation","kiss"],char:"๐Ÿ˜™",category:"people"},kissing_closed_eyes:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:"๐Ÿ˜š",category:"people"},stuck_out_tongue_winking_eye:{keywords:["face","prank","childish","playful","mischievous","smile","wink","tongue"],char:"๐Ÿ˜œ",category:"people"},stuck_out_tongue_closed_eyes:{keywords:["face","prank","playful","mischievous","smile","tongue"],char:"๐Ÿ˜",category:"people"},stuck_out_tongue:{keywords:["face","prank","childish","playful","mischievous","smile","tongue"],char:"๐Ÿ˜›",category:"people"},money_mouth:{keywords:["face","rich","dollar","money"],char:"๐Ÿค‘",category:"people"},nerd:{keywords:["face","nerdy","geek","dork"],char:"๐Ÿค“",category:"people"},sunglasses:{keywords:["face","cool","smile","summer","beach","sunglass"],char:"๐Ÿ˜Ž",category:"people"},hugging:{keywords:["face","smile","hug"],char:"๐Ÿค—",category:"people"},smirk:{keywords:["face","smile","mean","prank","smug","sarcasm"],char:"๐Ÿ˜",category:"people"},no_mouth:{keywords:["face","hellokitty"],char:"๐Ÿ˜ถ",category:"people"},neutral_face:{keywords:["indifference","meh",":|","neutral"],char:"๐Ÿ˜",category:"people"},expressionless:{keywords:["face","indifferent","-_-","meh","deadpan"],char:"๐Ÿ˜‘",category:"people"},unamused:{keywords:["indifference","bored","straight face","serious","sarcasm"],char:"๐Ÿ˜’",category:"people"},rolling_eyes:{keywords:["face","eyeroll","frustrated"],char:"๐Ÿ™„",category:"people"},thinking:{keywords:["face","hmmm","think","consider"],char:"๐Ÿค”",category:"people"},flushed:{keywords:["face","blush","shy","flattered"],char:"๐Ÿ˜ณ",category:"people"},disappointed:{keywords:["face","sad","upset","depressed",":("],char:"๐Ÿ˜ž",category:"people"},worried:{keywords:["face","concern","nervous",":("],char:"๐Ÿ˜Ÿ",category:"people"},angry:{keywords:["mad","face","annoyed","frustrated"],char:"๐Ÿ˜ ",category:"people"},rage:{keywords:["angry","mad","hate","despise"],char:"๐Ÿ˜ก",category:"people"},pensive:{keywords:["face","sad","depressed","okay","upset"],char:"๐Ÿ˜”",category:"people"},confused:{keywords:["face","indifference","huh","weird","hmmm",":/"],char:"๐Ÿ˜•",category:"people"},slightly_sad:{keywords:["face","frowning","disappointed","sad","upset"],char:"๐Ÿ™",category:"people"},white_frowning:{keywords:["face","sad","upset","frown"],char:"โ˜น",category:"people"},persevere:{keywords:["face","sick","no","upset","oops"],char:"๐Ÿ˜ฃ",category:"people"},confounded:{keywords:["face","confused","sick","unwell","oops",":S"],char:"๐Ÿ˜–",category:"people"},tired_face:{keywords:["sick","whine","upset","frustrated"],char:"๐Ÿ˜ซ",category:"people"},weary:{keywords:["face","tired","sleepy","sad","frustrated","upset"],char:"๐Ÿ˜ฉ",category:"people"},triumph:{keywords:["face","gas","phew","proud","pride"],char:"๐Ÿ˜ค",category:"people"},open_mouth:{keywords:["face","surprise","impressed","wow","whoa",":O"],char:"๐Ÿ˜ฎ",category:"people"},scream:{keywords:["face","munch","scared","omg"],char:"๐Ÿ˜ฑ",category:"people"},fearful:{keywords:["face","scared","terrified","nervous","oops","huh"],char:"๐Ÿ˜จ",category:"people"},cold_sweat:{keywords:["face","nervous","sweat"],char:"๐Ÿ˜ฐ",category:"people"},hushed:{keywords:["face","woo","shh"],char:"๐Ÿ˜ฏ",category:"people"},frowning:{keywords:["face","aw","what"],char:"๐Ÿ˜ฆ",category:"people"},anguished:{keywords:["face","stunned","nervous"],char:"๐Ÿ˜ง",category:"people"},cry:{keywords:["face","tears","sad","depressed","upset",":'("],char:"๐Ÿ˜ข",category:"people"},disappointed_relieved:{keywords:["face","phew","sweat","nervous"],char:"๐Ÿ˜ฅ",category:"people"},sleepy:{keywords:["face","tired","rest","nap"],char:"๐Ÿ˜ช",category:"people"},sweat:{keywords:["face","hot","sad","tired","exercise"],char:"๐Ÿ˜“",category:"people"},sob:{keywords:["face","cry","tears","sad","upset","depressed"],char:"๐Ÿ˜ญ",category:"people"},dizzy_face:{keywords:["spent","unconscious","xox","dizzy"],char:"๐Ÿ˜ต",category:"people"},astonished:{keywords:["face","xox","surprised","poisoned"],char:"๐Ÿ˜ฒ",category:"people"},zipper_mouth:{keywords:["face","sealed","zipper","secret"],char:"๐Ÿค",category:"people"},mask:{keywords:["face","sick","ill","disease"],char:"๐Ÿ˜ท",category:"people"},thermometer_face:{keywords:["sick","temperature","thermometer","cold"],char:"๐Ÿค’",category:"people"},bandage_face:{keywords:["injured","clumsy","bandage","hurt"],char:"๐Ÿค•",category:"people"},sleeping:{keywords:["face","tired","sleepy","night","zzz"],char:"๐Ÿ˜ด",category:"people"},zzz:{keywords:["sleepy","tired"],char:"๐Ÿ’ค",category:"people"},hankey:{keywords:["poop","shitface","fail","turd","shit"],char:"๐Ÿ’ฉ",category:"people"},smiling_imp:{keywords:["devil","horns"],char:"๐Ÿ˜ˆ",category:"people"},imp:{keywords:["devil","angry","horns"],char:"๐Ÿ‘ฟ",category:"people"},japanese_ogre:{keywords:["monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre"],char:"๐Ÿ‘น",category:"people"},japanese_goblin:{keywords:["red","evil","mask","monster","scary","creepy","japanese","goblin"],char:"๐Ÿ‘บ",category:"people"},skull:{keywords:["dead","skeleton","creepy"],char:"๐Ÿ’€",category:"people"},ghost:{keywords:["halloween","spooky","scary"],char:"๐Ÿ‘ป",category:"people"},alien:{keywords:["UFO","paul","weird","outer_space"],char:"๐Ÿ‘ฝ",category:"people"},robot:{keywords:["computer","machine"],char:"๐Ÿค–",category:"people"},smiley_cat:{keywords:["animal","cats","happy","smile"],char:"๐Ÿ˜บ",category:"people"},smile_cat:{keywords:["animal","cats","smile"],char:"๐Ÿ˜ธ",category:"people"},joy_cat:{keywords:["animal","cats","haha","happy","tears"],char:"๐Ÿ˜น",category:"people"},heart_eyes_cat:{keywords:["animal","love","like","affection","cats","valentines","heart"],char:"๐Ÿ˜ป",category:"people"},smirk_cat:{keywords:["animal","cats","smirk"],char:"๐Ÿ˜ผ",category:"people"},kissing_cat:{keywords:["animal","cats","kiss"],char:"๐Ÿ˜ฝ",category:"people"},scream_cat:{keywords:["animal","cats","munch","scared","scream"],char:"๐Ÿ™€",category:"people"},crying_cat_face:{keywords:["animal","tears","weep","sad","cats","upset","cry"],char:"๐Ÿ˜ฟ",category:"people"},pouting_cat:{keywords:["animal","cats"],char:"๐Ÿ˜พ",category:"people"},raised_hands:{keywords:["gesture","hooray","yea","celebration","hands"],char:"๐Ÿ™Œ",category:"people"},clap:{keywords:["hands","praise","applause","congrats","yay"],char:"๐Ÿ‘",category:"people"},wave:{keywords:["hands","gesture","goodbye","solong","farewell","hello","palm"],char:"๐Ÿ‘‹",category:"people"},"+1":{keywords:["thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],char:"๐Ÿ‘",category:"people"},minus1:{keywords:["thumbsdown","no","dislike","hand"],char:"๐Ÿ‘Ž",category:"people"},facepunch:{keywords:["angry","violence","fist","hit","attack","hand"],char:"๐Ÿ‘Š",category:"people"},fist:{keywords:["fingers","hand","grasp"],char:"โœŠ",category:"people"},v:{keywords:["fingers","ohyeah","hand","peace","victory","two"],char:"โœŒ๏ธ",category:"people"},ok_hand:{keywords:["fingers","limbs","perfect","ok"],char:"๐Ÿ‘Œ",category:"people"},hand:{keywords:["fingers","stop","highfive","palm","ban","raised_hand"],char:"โœ‹",category:"people"},open_hands:{keywords:["fingers","butterfly","hands","open"],char:"๐Ÿ‘",category:"people"},muscle:{keywords:["arm","flex","hand","summer","strong","biceps"],char:"๐Ÿ’ช",category:"people"},pray:{keywords:["please","hope","wish","namaste","highfive"],char:"๐Ÿ™",category:"people"},point_up:{keywords:["hand","fingers","direction","up"],char:"โ˜๏ธ",category:"people"},point_up_2:{keywords:["fingers","hand","direction","up"],char:"๐Ÿ‘†",category:"people"},point_down:{keywords:["fingers","hand","direction","down"],char:"๐Ÿ‘‡",category:"people"},point_left:{keywords:["direction","fingers","hand","left"],char:"๐Ÿ‘ˆ",category:"people"},point_right:{keywords:["fingers","hand","direction","right"],char:"๐Ÿ‘‰",category:"people"},middle_finger:{keywords:["hand","fingers","rude"],char:"๐Ÿ–•",category:"people"},splayed_fingers:{keywords:["hand","fingers","palm"],char:"๐Ÿ–",category:"people"},sign_of_horns:{keywords:["hand","fingers","evil_eye","metal","rock_on"],char:"๐Ÿค˜",category:"people"},vulcan_salute:{keywords:["hand","fingers","spock","star trek"],char:"๐Ÿ––",category:"people"},writing_hand:{keywords:["pen","stationery","write"],char:"โœ",category:"people"},nail_care:{keywords:["beauty","manicure","finger","fashion","nail"],char:"๐Ÿ’…",category:"people"},lips:{keywords:["mouth","kiss"],char:"๐Ÿ‘„",category:"people"},tongue:{keywords:["mouth","playful"],char:"๐Ÿ‘…",category:"people"},ear:{keywords:["face","hear","sound","listen"],char:"๐Ÿ‘‚",category:"people"},nose:{keywords:["smell","sniff"],char:"๐Ÿ‘ƒ",category:"people"},eye:{keywords:["face","look","see","watch","stare"],char:"๐Ÿ‘",category:"people"},eyes:{keywords:["look","watch","stalk","peek","see"],char:"๐Ÿ‘€",category:"people"},bust_in_silhouette:{keywords:["user","person","human"],char:"๐Ÿ‘ค",category:"people"},busts_in_silhouette:{keywords:["user","person","human","group","team"],char:"๐Ÿ‘ฅ",category:"people"},speaking_head:{keywords:["user","person","human"],char:"๐Ÿ—ฃ",category:"people"},baby:{keywords:["child","boy","girl","toddler"],char:"๐Ÿ‘ถ",category:"people"},boy:{keywords:["man","male","guy","teenager"],char:"๐Ÿ‘ฆ",category:"people"},girl:{keywords:["female","woman","teenager"],char:"๐Ÿ‘ง",category:"people"},man:{keywords:["mustache","father","dad","guy","classy","sir","moustache"],char:"๐Ÿ‘จ",category:"people"},woman:{keywords:["female","girls","lady"],char:"๐Ÿ‘ฉ",category:"people"},person_with_blond_hair:{keywords:["man","male","boy","blonde","guy","person"],char:"๐Ÿ‘ฑ",category:"people"},older_man:{keywords:["human","male","men","old","elder","senior"],char:"๐Ÿ‘ด",category:"people"},older_woman:{keywords:["human","female","women","lady","old","elder","senior"],char:"๐Ÿ‘ต",category:"people"},man_with_gua_pi_mao:{keywords:["male","boy","chinese"],char:"๐Ÿ‘ฒ",category:"people"},man_with_turban:{keywords:["male","indian","hinduism","arabs"],char:"๐Ÿ‘ณ",category:"people"},cop:{keywords:["man","police","law","legal","enforcement","arrest","911"],char:"๐Ÿ‘ฎ",category:"people"},construction_worker:{keywords:["male","human","wip","guy","build","construction","worker","labor"],char:"๐Ÿ‘ท",category:"people"},guardsman:{keywords:["uk","gb","british","male","guy","royal"],char:"๐Ÿ’‚",category:"people"},sleuth:{keywords:["human","spy","detective"],char:"๐Ÿ•ต",category:"people"},santa:{keywords:["festival","man","male","xmas","father christmas"],char:"๐ŸŽ…",category:"people"},angel:{keywords:["heaven","wings","halo"],char:"๐Ÿ‘ผ",category:"people"},princess:{keywords:["girl","woman","female","blond","crown","royal","queen"],char:"๐Ÿ‘ธ",category:"people"},bride_with_veil:{keywords:["couple","marriage","wedding","woman","bride"],char:"๐Ÿ‘ฐ",category:"people"},runner:{keywords:["man","walking","exercise","race","running"],char:"๐Ÿƒ",category:"people"},walking:{keywords:["human","feet","steps"],char:"๐Ÿšถ",category:"people"},dancer:{keywords:["female","girl","woman","fun"],char:"๐Ÿ’ƒ",category:"people"},dancers:{keywords:["female","bunny","women","girls"],char:"๐Ÿ‘ฏ",category:"people"},couple:{keywords:["pair","people","human","love","date","dating","like","affection","valentines","marriage"],char:"๐Ÿ‘ซ",category:"people"},two_men_holding_hands:{keywords:["pair","couple","love","like","bromance","friendship","people","human"],char:"๐Ÿ‘ฌ",category:"people"},two_women_holding_hands:{keywords:["pair","friendship","couple","love","like","female","people","human"],char:"๐Ÿ‘ญ",category:"people"},bow:{keywords:["man","male","boy"],char:"๐Ÿ™‡",category:"people"},information_desk_person:{keywords:["female","girl","woman","human","information"],char:"๐Ÿ’",category:"people"},no_good:{keywords:["female","girl","woman","nope"],char:"๐Ÿ™…",category:"people"},ok_woman:{keywords:["women","girl","female","pink","human","woman"],char:"๐Ÿ™†",category:"people"},raising_hand:{keywords:["female","girl","woman"],char:"๐Ÿ™‹",category:"people"},person_with_pouting_face:{keywords:["female","girl","woman"],char:"๐Ÿ™Ž",category:"people"},person_frowning:{keywords:["female","girl","woman","sad","depressed","discouraged","unhappy"],char:"๐Ÿ™",category:"people"},haircut:{keywords:["female","girl","woman"],char:"๐Ÿ’‡",category:"people"},massage:{keywords:["female","girl","woman","head"],char:"๐Ÿ’†",category:"people"},couple_with_heart:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"๐Ÿ’‘",category:"people"},female_couple_with_heart:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ‘ฉ",category:"people"},male_couple_with_heart:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"๐Ÿ‘จโ€โค๏ธโ€๐Ÿ‘จ",category:"people"},couplekiss:{keywords:["pair","valentines","love","like","dating","marriage"],char:"๐Ÿ’",category:"people"},female_couplekiss:{keywords:["pair","valentines","love","like","dating","marriage"],char:"๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ",category:"people"},male_couplekiss:{keywords:["pair","valentines","love","like","dating","marriage"],char:"๐Ÿ‘จโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ",category:"people"},family:{keywords:["home","parents","child","mom","dad","father","mother","people","human"],char:"๐Ÿ‘ช",category:"people"},family_man_woman_girl:{keywords:["home","parents","people","human","child"],char:"๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง",category:"people"},family_man_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ",category:"people"},family_man_woman_boys:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ",category:"people"},family_man_woman_girls:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง",category:"people"},family_women_boy:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ",category:"people"},family_women_girl:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ง",category:"people"},family_women_girl_boy:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ",category:"people"},family_women_boys:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ",category:"people"},family_women_girls:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง",category:"people"},family_men_boy:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆ",category:"people"},family_men_girl:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ง",category:"people"},family_men_girl_boy:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ",category:"people"},family_men_boys:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ",category:"people"},family_men_girls:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง",category:"people"},womans_clothes:{keywords:["fashion","shopping","female"],char:"๐Ÿ‘š",category:"people"},shirt:{keywords:["fashion","cloth","casual","tshirt","tee"],char:"๐Ÿ‘•",category:"people"},jeans:{keywords:["fashion","shopping"],char:"๐Ÿ‘–",category:"people"},necktie:{keywords:["shirt","suitup","formal","fashion","cloth","business"],char:"๐Ÿ‘”",category:"people"},dress:{keywords:["clothes","fashion","shopping"],char:"๐Ÿ‘—",category:"people"},bikini:{keywords:["swimming","female","woman","girl","fashion","beach","summer"],char:"๐Ÿ‘™",category:"people"},kimono:{keywords:["dress","fashion","women","female","japanese"],char:"๐Ÿ‘˜",category:"people"},lipstick:{keywords:["female","girl","fashion","woman"],char:"๐Ÿ’„",category:"people"},kiss:{keywords:["face","lips","love","like","affection","valentines"],char:"๐Ÿ’‹",category:"people"},footprints:{keywords:["feet","tracking","walking","beach"],char:"๐Ÿ‘ฃ",category:"people"},high_heel:{keywords:["fashion","shoes","female","pumps","stiletto"],char:"๐Ÿ‘ ",category:"people"},sandal:{keywords:["shoes","fashion","flip flops"],char:"๐Ÿ‘ก",category:"people"},boot:{keywords:["shoes","fashion"],char:"๐Ÿ‘ข",category:"people"},mans_shoe:{keywords:["fashion","male"],char:"๐Ÿ‘ž",category:"people"},athletic_shoe:{keywords:["shoes","sports","sneakers"],char:"๐Ÿ‘Ÿ",category:"people"},womans_hat:{keywords:["fashion","accessories","female","lady","spring"],char:"๐Ÿ‘’",category:"people"},tophat:{keywords:["magic","gentleman","classy","circus"],char:"๐ŸŽฉ",category:"people"},helmet:{keywords:["construction","build"],char:"โ›‘",category:"people"},mortar_board:{keywords:["school","college","degree","university","graduation","cap","hat","legal","learn","education"],char:"๐ŸŽ“",category:"people"},crown:{keywords:["king","kod","leader","royalty","lord"],char:"๐Ÿ‘‘",category:"people"},school_satchel:{keywords:["student","education","bag","backpack"],char:"๐ŸŽ’",category:"people"},pouch:{keywords:["bag","accessories","shopping"],char:"๐Ÿ‘",category:"people"},purse:{keywords:["fashion","accessories","money","sales","shopping"],char:"๐Ÿ‘›",category:"people"},handbag:{keywords:["fashion","accessory","accessories","shopping"],char:"๐Ÿ‘œ",category:"people"},briefcase:{keywords:["business","documents","work","law","legal"],char:"๐Ÿ’ผ",category:"people"},eyeglasses:{keywords:["fashion","accessories","eyesight","nerdy","dork","geek"],char:"๐Ÿ‘“",category:"people"},dark_sunglasses:{keywords:["face","cool","accessories"],char:"๐Ÿ•ถ",category:"people"},ring:{keywords:["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],char:"๐Ÿ’",category:"people"},closed_umbrella:{keywords:["weather","rain","drizzle"],char:"๐ŸŒ‚",category:"people"},dog:{keywords:["animal","friend","nature","woof","puppy","pet","faithful"],char:"๐Ÿถ",category:"animals_and_nature"},cat:{keywords:["animal","meow","nature","pet","kitten"],char:"๐Ÿฑ",category:"animals_and_nature"},mouse:{keywords:["animal","nature","cheese","rodent"],char:"๐Ÿญ",category:"animals_and_nature"},hamster:{keywords:["animal","nature"],char:"๐Ÿน",category:"animals_and_nature"},rabbit:{keywords:["animal","nature","pet","spring","magic","bunny"],char:"๐Ÿฐ",category:"animals_and_nature"},bear:{keywords:["animal","nature","wild"],char:"๐Ÿป",category:"animals_and_nature"},panda_face:{keywords:["animal","nature","panda"],char:"๐Ÿผ",category:"animals_and_nature"},koala:{keywords:["animal","nature"],char:"๐Ÿจ",category:"animals_and_nature"},tiger:{keywords:["animal","cat","danger","wild","nature","roar"],char:"๐Ÿฏ",category:"animals_and_nature"},lion_face:{keywords:["animal","nature"],char:"๐Ÿฆ",category:"animals_and_nature"},cow:{keywords:["beef","ox","animal","nature","moo","milk"],char:"๐Ÿฎ",category:"animals_and_nature"},pig:{keywords:["animal","oink","nature"],char:"๐Ÿท",category:"animals_and_nature"},pig_nose:{keywords:["animal","oink"],char:"๐Ÿฝ",category:"animals_and_nature"},frog:{keywords:["animal","nature","croak","toad"],char:"๐Ÿธ",category:"animals_and_nature"},octopus:{keywords:["animal","creature","ocean","sea","nature","beach"],char:"๐Ÿ™",category:"animals_and_nature"},monkey_face:{keywords:["animal","nature","circus"],char:"๐Ÿต",category:"animals_and_nature"},see_no_evil:{keywords:["monkey","animal","nature","haha"],char:"๐Ÿ™ˆ",category:"animals_and_nature"},hear_no_evil:{keywords:["animal","monkey","nature"],char:"๐Ÿ™‰",category:"animals_and_nature"},speak_no_evil:{keywords:["monkey","animal","nature","omg"],char:"๐Ÿ™Š",category:"animals_and_nature"},monkey:{keywords:["animal","nature","banana","circus"],char:"๐Ÿ’",category:"animals_and_nature"},chicken:{keywords:["animal","cluck","nature","bird"],char:"๐Ÿ”",category:"animals_and_nature"},penguin:{keywords:["animal","nature"],char:"๐Ÿง",category:"animals_and_nature"},bird:{keywords:["animal","nature","fly","tweet","spring"],char:"๐Ÿฆ",category:"animals_and_nature"},baby_chick:{keywords:["animal","chicken","bird"],char:"๐Ÿค",category:"animals_and_nature"},hatching_chick:{keywords:["animal","chicken","egg","born","baby","bird"],char:"๐Ÿฃ",category:"animals_and_nature"},hatched_chick:{keywords:["animal","chicken","baby","bird"],char:"๐Ÿฅ",category:"animals_and_nature"},wolf:{keywords:["animal","nature","wild"],char:"๐Ÿบ",category:"animals_and_nature"},boar:{keywords:["animal","nature"],char:"๐Ÿ—",category:"animals_and_nature"},horse:{keywords:["animal","brown","nature"],char:"๐Ÿด",category:"animals_and_nature"},unicorn_face:{keywords:["animal","nature","mystical"],char:"๐Ÿฆ„",category:"animals_and_nature"},bee:{keywords:["animal","insect","nature","bug","spring","honey"],char:"๐Ÿ",category:"animals_and_nature"},bug:{keywords:["animal","insect","nature","worm"],char:"๐Ÿ›",category:"animals_and_nature"},snail:{keywords:["slow","animal","shell"],char:"๐ŸŒ",category:"animals_and_nature"},beetle:{keywords:["animal","insect","nature","ladybug"],char:"๐Ÿž",category:"animals_and_nature"},ant:{keywords:["animal","insect","nature","bug"],char:"๐Ÿœ",category:"animals_and_nature"},spider:{keywords:["animal","arachnid"],char:"๐Ÿ•ท",category:"animals_and_nature"},scorpion:{keywords:["animal","arachnid"],char:"๐Ÿฆ‚",category:"animals_and_nature"},crab:{keywords:["animal","crustacean"],char:"๐Ÿฆ€",category:"animals_and_nature"},snake:{keywords:["animal","evil","nature","hiss","python"],char:"๐Ÿ",category:"animals_and_nature"},turtle:{keywords:["animal","slow","nature","tortoise"],char:"๐Ÿข",category:"animals_and_nature"},tropical_fish:{keywords:["animal","swim","ocean","beach","nemo"],char:"๐Ÿ ",category:"animals_and_nature"},fish:{keywords:["animal","food","nature"],char:"๐ŸŸ",category:"animals_and_nature"},blowfish:{keywords:["animal","nature","food","sea","ocean"],char:"๐Ÿก",category:"animals_and_nature"},dolphin:{keywords:["animal","nature","fish","sea","ocean","flipper","fins","beach"],char:"๐Ÿฌ",category:"animals_and_nature"},whale:{keywords:["animal","nature","sea","ocean"],char:"๐Ÿณ",category:"animals_and_nature"},whale2:{keywords:["animal","nature","sea","ocean"],char:"๐Ÿ‹",category:"animals_and_nature"},crocodile:{keywords:["animal","nature","reptile","lizard","alligator"],char:"๐ŸŠ",category:"animals_and_nature"},leopard:{keywords:["animal","nature"],char:"๐Ÿ†",category:"animals_and_nature"},tiger2:{keywords:["animal","nature","roar"],char:"๐Ÿ…",category:"animals_and_nature"},water_buffalo:{keywords:["animal","nature","ox","cow"],char:"๐Ÿƒ",category:"animals_and_nature"},ox:{keywords:["animal","cow","beef"],char:"๐Ÿ‚",category:"animals_and_nature"},cow2:{keywords:["beef","ox","animal","nature","moo","milk"],char:"๐Ÿ„",category:"animals_and_nature"},dromedary_camel:{keywords:["animal","hot","desert","hump"],char:"๐Ÿช",category:"animals_and_nature"},camel:{keywords:["animal","nature","hot","desert","hump"],char:"๐Ÿซ",category:"animals_and_nature"},elephant:{keywords:["animal","nature","nose","thailand","circus"],char:"๐Ÿ˜",category:"animals_and_nature"},goat:{keywords:["animal","nature"],char:"๐Ÿ",category:"animals_and_nature"},ram:{keywords:["animal","sheep","nature"],char:"๐Ÿ",category:"animals_and_nature"},sheep:{keywords:["animal","nature","wool","shipit"],char:"๐Ÿ‘",category:"animals_and_nature"},racehorse:{keywords:["animal","gamble","luck"],char:"๐ŸŽ",category:"animals_and_nature"},pig2:{keywords:["animal","nature"],char:"๐Ÿ–",category:"animals_and_nature"},rat:{keywords:["animal","mouse","rodent"],char:"๐Ÿ€",category:"animals_and_nature"},mouse2:{keywords:["animal","nature","rodent"],char:"๐Ÿ",category:"animals_and_nature"},rooster:{keywords:["animal","nature","chicken"],char:"๐Ÿ“",category:"animals_and_nature"},turkey:{keywords:["animal","bird"],char:"๐Ÿฆƒ",category:"animals_and_nature"},dove_of_peace:{keywords:["animal","bird"],char:"๐Ÿ•Š",category:"animals_and_nature"},dog2:{keywords:["animal","nature","friend","doge","pet","faithful"],char:"๐Ÿ•",category:"animals_and_nature"},poodle:{keywords:["dog","animal","101","nature","pet"],char:"๐Ÿฉ",category:"animals_and_nature"},cat2:{keywords:["animal","meow","pet","cats"],char:"๐Ÿˆ",category:"animals_and_nature"},rabbit2:{keywords:["animal","nature","pet","magic","spring"],char:"๐Ÿ‡",category:"animals_and_nature"},chipmunk:{keywords:["animal","nature","rodent","squirrel"],char:"๐Ÿฟ",category:"animals_and_nature"},feet:{keywords:["animal","tracking","footprints","dog","cat","pet","paw_prints"],char:"๐Ÿพ",category:"animals_and_nature"},dragon:{keywords:["animal","myth","nature","chinese","green"],char:"๐Ÿ‰",category:"animals_and_nature"},dragon_face:{keywords:["animal","myth","nature","chinese","green"],char:"๐Ÿฒ",category:"animals_and_nature"},cactus:{keywords:["vegetable","plant","nature"],char:"๐ŸŒต",category:"animals_and_nature"},christmas_tree:{keywords:["festival","vacation","december","xmas","celebration"],char:"๐ŸŽ„",category:"animals_and_nature"},evergreen_tree:{keywords:["plant","nature"],char:"๐ŸŒฒ",category:"animals_and_nature"},deciduous_tree:{keywords:["plant","nature"],char:"๐ŸŒณ",category:"animals_and_nature"},palm_tree:{keywords:["plant","vegetable","nature","summer","beach","mojito","tropical"],char:"๐ŸŒด",category:"animals_and_nature"},seedling:{keywords:["plant","nature","grass","lawn","spring"],char:"๐ŸŒฑ",category:"animals_and_nature"},herb:{keywords:["vegetable","plant","medicine","weed","grass","lawn"],char:"๐ŸŒฟ",category:"animals_and_nature"},shamrock:{keywords:["vegetable","plant","nature","irish","clover"],char:"โ˜˜",category:"animals_and_nature"},four_leaf_clover:{keywords:["vegetable","plant","nature","lucky","irish"],char:"๐Ÿ€",category:"animals_and_nature"},bamboo:{keywords:["plant","nature","vegetable","panda","pine_decoration"],char:"๐ŸŽ",category:"animals_and_nature"},tanabata_tree:{keywords:["plant","nature","branch","summer"],char:"๐ŸŽ‹",category:"animals_and_nature"},leaves:{keywords:["nature","plant","tree","vegetable","grass","lawn","spring"],char:"๐Ÿƒ",category:"animals_and_nature"},fallen_leaf:{keywords:["nature","plant","vegetable","leaves"],char:"๐Ÿ‚",category:"animals_and_nature"},maple_leaf:{keywords:["nature","plant","vegetable","canada","fall"],char:"๐Ÿ",category:"animals_and_nature"},ear_of_rice:{keywords:["nature","plant"],char:"๐ŸŒพ",category:"animals_and_nature"},hibiscus:{keywords:["plant","vegetable","flowers","beach"],char:"๐ŸŒบ",category:"animals_and_nature"},sunflower:{keywords:["nature","plant","fall"],char:"๐ŸŒป",category:"animals_and_nature"},rose:{keywords:["flowers","valentines","love","spring"],char:"๐ŸŒน",category:"animals_and_nature"},tulip:{keywords:["flowers","plant","nature","summer","spring"],char:"๐ŸŒท",category:"animals_and_nature"},blossom:{keywords:["nature","flowers","yellow"],char:"๐ŸŒผ",category:"animals_and_nature"},cherry_blossom:{keywords:["nature","plant","spring","flower"],char:"๐ŸŒธ",category:"animals_and_nature"},bouquet:{keywords:["flowers","nature","spring"],char:"๐Ÿ’",category:"animals_and_nature"},mushroom:{keywords:["plant","vegetable"],char:"๐Ÿ„",category:"animals_and_nature"},chestnut:{keywords:["food","squirrel"],char:"๐ŸŒฐ",category:"animals_and_nature"},jack_o_lantern:{keywords:["halloween","light","pumpkin","creepy","fall"],char:"๐ŸŽƒ",category:"animals_and_nature"},shell:{keywords:["nature","sea","beach"],char:"๐Ÿš",category:"animals_and_nature"},spider_web:{keywords:["animal","insect","arachnid","silk"],char:"๐Ÿ•ธ",category:"animals_and_nature"},earth_americas:{keywords:["globe","world","USA","international"],char:"๐ŸŒŽ",category:"animals_and_nature"},earth_africa:{keywords:["globe","world","international"],char:"๐ŸŒ",category:"animals_and_nature"},earth_asia:{keywords:["globe","world","east","international"],char:"๐ŸŒ",category:"animals_and_nature"},full_moon:{keywords:["nature","yellow","twilight","planet","space","night","evening","sleep"],char:"๐ŸŒ•",category:"animals_and_nature"},waning_gibbous_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],char:"๐ŸŒ–",category:"animals_and_nature"},last_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"๐ŸŒ—",category:"animals_and_nature"},waning_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"๐ŸŒ˜",category:"animals_and_nature"},new_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"๐ŸŒ‘",category:"animals_and_nature"},waxing_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"๐ŸŒ’",category:"animals_and_nature"},first_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"๐ŸŒ“",category:"animals_and_nature"},moon:{keywords:["nature","night","sky","gray","twilight","planet","space","evening","sleep"],char:"๐ŸŒ”",category:"animals_and_nature"},new_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"๐ŸŒš",category:"animals_and_nature"},full_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"๐ŸŒ",category:"animals_and_nature"},first_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"๐ŸŒ›",category:"animals_and_nature"},last_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"๐ŸŒœ",category:"animals_and_nature"},sun_with_face:{keywords:["nature","morning","sky"],char:"๐ŸŒž",category:"animals_and_nature"},crescent_moon:{keywords:["night","sleep","sky","evening","magic"],char:"๐ŸŒ™",category:"animals_and_nature"},star:{keywords:["night","yellow"],char:"โญ",category:"animals_and_nature"},star2:{keywords:["night","sparkle","awesome","good","magic"],char:"๐ŸŒŸ",category:"animals_and_nature"},dizzy:{keywords:["star","sparkle","shoot","magic"],char:"๐Ÿ’ซ",category:"animals_and_nature"},sparkles:{keywords:["stars","shine","shiny","cool","awesome","good","magic"],char:"โœจ",category:"animals_and_nature"},comet:{keywords:["space"],char:"โ˜„",category:"animals_and_nature"},sunny:{keywords:["weather","nature","brightness","summer","beach","spring"],char:"โ˜€๏ธ",category:"animals_and_nature"},white_sun_with_small_cloud:{keywords:["weather"],char:"๐ŸŒค",category:"animals_and_nature"},partly_sunny:{keywords:["weather","nature","cloudy","morning","fall","spring"],char:"โ›…",category:"animals_and_nature"},white_sun_behind_cloud:{keywords:["weather"],char:"๐ŸŒฅ",category:"animals_and_nature"},white_sun_behind_cloud_with_rain:{keywords:["weather"],char:"๐ŸŒฆ",category:"animals_and_nature"},cloud:{keywords:["weather","sky"],char:"โ˜๏ธ",category:"animals_and_nature"},cloud_with_rain:{keywords:["weather"],char:"๐ŸŒง",category:"animals_and_nature"},thunder_cloud_and_rain:{keywords:["weather","lightning"],char:"โ›ˆ",category:"animals_and_nature"},cloud_with_lightning:{keywords:["weather","thunder"],char:"๐ŸŒฉ",category:"animals_and_nature"},zap:{keywords:["thunder","weather","lightning bolt","fast"],char:"โšก",category:"animals_and_nature"},fire:{keywords:["hot","cook","flame"],char:"๐Ÿ”ฅ",category:"animals_and_nature"},boom:{keywords:["bomb","explode","explosion","collision","blown"],char:"๐Ÿ’ฅ",category:"animals_and_nature"},snowflake:{keywords:["winter","season","cold","weather","christmas","xmas"],char:"โ„๏ธ",category:"animals_and_nature"},cloud_with_snow:{keywords:["weather"],char:"๐ŸŒจ",category:"animals_and_nature"},snowman:{keywords:["winter","season","cold","weather","christmas","xmas","frozen","without_snow"],char:"โ›„",category:"animals_and_nature"},snowman_with_snow:{keywords:["winter","season","cold","weather","christmas","xmas","frozen"],char:"โ˜ƒ",category:"animals_and_nature"},wind_blowing_face:{keywords:["gust","air"],char:"๐ŸŒฌ",category:"animals_and_nature"},dash:{keywords:["wind","air","fast","shoo","fart","smoke","puff"],char:"๐Ÿ’จ",category:"animals_and_nature"},cloud_with_tornado:{keywords:["weather","cyclone","twister"],char:"๐ŸŒช",category:"animals_and_nature"},fog:{keywords:["weather"],char:"๐ŸŒซ",category:"animals_and_nature"},umbrella_without_rain:{keywords:["weather","spring"],char:"โ˜‚",category:"animals_and_nature"},umbrella:{keywords:["rainy","weather","spring"],char:"โ˜”",category:"animals_and_nature"},droplet:{keywords:["water","drip","faucet","spring"],char:"๐Ÿ’ง",category:"animals_and_nature"},sweat_drops:{keywords:["water","drip","oops"],char:"๐Ÿ’ฆ",category:"animals_and_nature"},ocean:{keywords:["sea","water","wave","nature","tsunami","disaster"],char:"๐ŸŒŠ",category:"animals_and_nature"},green_apple:{keywords:["fruit","nature"],char:"๐Ÿ",category:"food_and_drink"},apple:{keywords:["fruit","mac","school"],char:"๐ŸŽ",category:"food_and_drink"},pear:{keywords:["fruit","nature","food"],char:"๐Ÿ",category:"food_and_drink"},tangerine:{keywords:["food","fruit","nature","orange"],char:"๐ŸŠ",category:"food_and_drink"},lemon:{keywords:["fruit","nature"],char:"๐Ÿ‹",category:"food_and_drink"},banana:{keywords:["fruit","food","monkey"],char:"๐ŸŒ",category:"food_and_drink"},watermelon:{keywords:["fruit","food","picnic","summer"],char:"๐Ÿ‰",category:"food_and_drink"},grapes:{keywords:["fruit","food","wine"],char:"๐Ÿ‡",category:"food_and_drink"},strawberry:{keywords:["fruit","food","nature"],char:"๐Ÿ“",category:"food_and_drink"},melon:{keywords:["fruit","nature","food"],char:"๐Ÿˆ",category:"food_and_drink"},cherries:{keywords:["food","fruit"],char:"๐Ÿ’",category:"food_and_drink"},peach:{keywords:["fruit","nature","food"],char:"๐Ÿ‘",category:"food_and_drink"},pineapple:{keywords:["fruit","nature","food"],char:"๐Ÿ",category:"food_and_drink"},tomato:{keywords:["fruit","vegetable","nature","food"],char:"๐Ÿ…",category:"food_and_drink"},eggplant:{keywords:["vegetable","nature","food","aubergine"],char:"๐Ÿ†",category:"food_and_drink"},hot_pepper:{keywords:["food","spicy","chilli","chili"],char:"๐ŸŒถ",category:"food_and_drink"},corn:{keywords:["food","vegetable","plant"],char:"๐ŸŒฝ",category:"food_and_drink"},sweet_potato:{keywords:["food","nature"],char:"๐Ÿ ",category:"food_and_drink"},honey_pot:{keywords:["bees","sweet","kitchen"],char:"๐Ÿฏ",category:"food_and_drink"},bread:{keywords:["food","wheat","breakfast","toast"],char:"๐Ÿž",category:"food_and_drink"},cheese_wedge:{keywords:["food","chadder"],char:"๐Ÿง€",category:"food_and_drink"},poultry_leg:{keywords:["food","meat","drumstick","bird","chicken","turkey"],char:"๐Ÿ—",category:"food_and_drink"},meat_on_bone:{keywords:["good","food","drumstick"],char:"๐Ÿ–",category:"food_and_drink"},fried_shrimp:{keywords:["food","animal","appetizer","summer"],char:"๐Ÿค",category:"food_and_drink"},egg:{keywords:["food","breakfast","kitchen"],char:"๐Ÿณ",category:"food_and_drink"},hamburger:{keywords:["meat","fast food","beef","cheeseburger","mcdonalds","burger king"],char:"๐Ÿ”",category:"food_and_drink"},fries:{keywords:["chips","snack","fast food"],char:"๐ŸŸ",category:"food_and_drink"},hot_dog:{keywords:["food","frankfurter","hotdog"],char:"๐ŸŒญ",category:"food_and_drink"},pizza:{keywords:["food","party"],char:"๐Ÿ•",category:"food_and_drink"},spaghetti:{keywords:["food","italian","noodle"],char:"๐Ÿ",category:"food_and_drink"},taco:{keywords:["food","mexican"],char:"๐ŸŒฎ",category:"food_and_drink"},burrito:{keywords:["food","mexican"],char:"๐ŸŒฏ",category:"food_and_drink"},ramen:{keywords:["food","japanese","noodle","chopsticks"],char:"๐Ÿœ",category:"food_and_drink"},stew:{keywords:["food","meat","soup"],char:"๐Ÿฒ",category:"food_and_drink"},fish_cake:{keywords:["food","japan","sea","beach"],char:"๐Ÿฅ",category:"food_and_drink"},sushi:{keywords:["food","fish","japanese","rice"],char:"๐Ÿฃ",category:"food_and_drink"},bento:{keywords:["food","japanese","box"],char:"๐Ÿฑ",category:"food_and_drink"},curry:{keywords:["food","spicy","hot","indian"],char:"๐Ÿ›",category:"food_and_drink"},rice_ball:{keywords:["food","japanese"],char:"๐Ÿ™",category:"food_and_drink"},rice:{keywords:["food","china","asian"],char:"๐Ÿš",category:"food_and_drink"},rice_cracker:{keywords:["food","japanese"],char:"๐Ÿ˜",category:"food_and_drink"},oden:{keywords:["food","japanese"],char:"๐Ÿข",category:"food_and_drink"},dango:{keywords:["food","dessert","sweet","japanese","barbecue","meat"],char:"๐Ÿก",category:"food_and_drink"},shaved_ice:{keywords:["hot","dessert","summer"],char:"๐Ÿง",category:"food_and_drink"},ice_cream:{keywords:["food","hot","dessert"],char:"๐Ÿจ",category:"food_and_drink"},icecream:{keywords:["food","hot","dessert","summer"],char:"๐Ÿฆ",category:"food_and_drink"},cake:{keywords:["food","dessert"],char:"๐Ÿฐ",category:"food_and_drink"},birthday:{keywords:["food","dessert","cake"],char:"๐ŸŽ‚",category:"food_and_drink"},custard:{keywords:["dessert","food"],char:"๐Ÿฎ",category:"food_and_drink"},candy:{keywords:["snack","dessert","sweet","lolly"],char:"๐Ÿฌ",category:"food_and_drink"},lollipop:{keywords:["food","snack","candy","sweet"],char:"๐Ÿญ",category:"food_and_drink"},chocolate_bar:{keywords:["food","snack","dessert","sweet"],char:"๐Ÿซ",category:"food_and_drink"},popcorn:{keywords:["food","movie theater","films","snack"],char:"๐Ÿฟ",category:"food_and_drink"},doughnut:{keywords:["food","dessert","snack","sweet","donut"],char:"๐Ÿฉ",category:"food_and_drink"},cookie:{keywords:["food","snack","oreo","chocolate","sweet","dessert"],char:"๐Ÿช",category:"food_and_drink"},beer:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:"๐Ÿบ",category:"food_and_drink"},beers:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:"๐Ÿป",category:"food_and_drink"},wine_glass:{keywords:["drink","beverage","drunk","alcohol","booze"],char:"๐Ÿท",category:"food_and_drink"},cocktail:{keywords:["drink","drunk","alcohol","beverage","booze","mojito"],char:"๐Ÿธ",category:"food_and_drink"},tropical_drink:{keywords:["beverage","cocktail","summer","beach","alcohol","booze","mojito"],char:"๐Ÿน",category:"food_and_drink"},bottle:{keywords:["drink","wine","champagne"],char:"๐Ÿพ",category:"food_and_drink"},sake:{keywords:["wine","drink","drunk","beverage","japanese","alcohol","booze"],char:"๐Ÿถ",category:"food_and_drink"},tea:{keywords:["drink","bowl","breakfast","green","british"],char:"๐Ÿต",category:"food_and_drink"},coffee:{keywords:["beverage","caffeine","latte","espresso"],char:"โ˜•",category:"food_and_drink"},baby_bottle:{keywords:["food","container","milk"],char:"๐Ÿผ",category:"food_and_drink"},fork_and_knife:{keywords:["cutlery","kitchen"],char:"๐Ÿด",category:"food_and_drink"},fork_and_knife_with_plate:{keywords:["food","eat","meal","lunch","dinner","restaurant"],char:"๐Ÿฝ",category:"food_and_drink"},soccer:{keywords:["sports","football"],char:"โšฝ",category:"activity"},basketball:{keywords:["sports","balls","NBA"],char:"๐Ÿ€",category:"activity"},football:{keywords:["sports","balls","NFL"],char:"๐Ÿˆ",category:"activity"},baseball:{keywords:["sports","balls"],char:"โšพ",category:"activity"},tennis:{keywords:["sports","balls","green"],char:"๐ŸŽพ",category:"activity"},volleyball:{keywords:["sports","balls"],char:"๐Ÿ",category:"activity"},rugby_football:{keywords:["sports","team"],char:"๐Ÿ‰",category:"activity"},"8ball":{keywords:["pool","hobby","game","luck","magic"],char:"๐ŸŽฑ",category:"activity"},golf:{keywords:["sports","business","flag","hole","summer"],char:"โ›ณ",category:"activity"},golfer:{keywords:["sports","business"],char:"๐ŸŒ",category:"activity"},table_tennis:{keywords:["sports","pingpong"],char:"๐Ÿ“",category:"activity"},badminton:{keywords:["sports"],char:"๐Ÿธ",category:"activity"},ice_hockey:{keywords:["sports"],char:"๐Ÿ’",category:"activity"},field_hockey:{keywords:["sports"],char:"๐Ÿ‘",category:"activity"},cricket:{keywords:["sports"],char:"๐Ÿ",category:"activity"},ski:{keywords:["sports","winter","cold","snow"],char:"๐ŸŽฟ",category:"activity"},skier:{keywords:["sports","winter","snow"],char:"โ›ท",category:"activity"},snowboarder:{keywords:["sports","winter"],char:"๐Ÿ‚",category:"activity"},ice_skate:{keywords:["sports"],char:"โ›ธ",category:"activity"},bow_and_arrow:{keywords:["sports"],char:"๐Ÿน",category:"activity"},fishing_pole_and_fish:{keywords:["food","hobby","summer"],char:"๐ŸŽฃ",category:"activity"},rowboat:{keywords:["sports","hobby","water","ship"],char:"๐Ÿšฃ",category:"activity"},swimmer:{keywords:["sports","exercise","human","athlete","water","summer"],char:"๐ŸŠ",category:"activity"},surfer:{keywords:["sports","ocean","sea","summer","beach"],char:"๐Ÿ„",category:"activity"},bath:{keywords:["clean","shower","bathroom"],char:"๐Ÿ›€",category:"activity"},person_with_ball:{keywords:["sports","human"],char:"โ›น",category:"activity"},weight_lifter:{keywords:["sports","training","exercise"],char:"๐Ÿ‹",category:"activity"},bicyclist:{keywords:["sports","bike","exercise","hipster"],char:"๐Ÿšด",category:"activity"},mountain_bicyclist:{keywords:["transportation","sports","human","race","bike"],char:"๐Ÿšต",category:"activity"},horse_racing:{keywords:["animal","betting","competition","gambling","luck"],char:"๐Ÿ‡",category:"activity"},man_levitating:{keywords:["suit","business","levitate","hover","jump"],char:"๐Ÿ•ด",category:"activity"},trophy:{keywords:["win","award","contest","place","ftw","ceremony"],char:"๐Ÿ†",category:"activity"},running_shirt_with_sash:{keywords:["play","pageant"],char:"๐ŸŽฝ",category:"activity"},sports_medal:{keywords:["award","winning"],char:"๐Ÿ…",category:"activity"},military_medal:{keywords:["award","winning","army"],char:"๐ŸŽ–",category:"activity"},reminder_ribbon:{keywords:["sports","cause","support","awareness"],char:"๐ŸŽ—",category:"activity"},rosette:{keywords:["flower","decoration","military"],char:"๐Ÿต",category:"activity"},ticket:{keywords:["event","concert","pass"],char:"๐ŸŽซ",category:"activity"},admission_ticket:{keywords:["sports","concert","entrance"],char:"๐ŸŽŸ",category:"activity"},performing_arts:{keywords:["acting","theater","drama"],char:"๐ŸŽญ",category:"activity"},art:{keywords:["design","paint","draw","colors"],char:"๐ŸŽจ",category:"activity"},circus_tent:{keywords:["festival","carnival","party"],char:"๐ŸŽช",category:"activity"},microphone:{keywords:["sound","music","PA"],char:"๐ŸŽค",category:"activity"},headphones:{keywords:["music","score","gadgets"],char:"๐ŸŽง",category:"activity"},musical_score:{keywords:["treble","clef"],char:"๐ŸŽผ",category:"activity"},musical_keyboard:{keywords:["piano","instrument"],char:"๐ŸŽน",category:"activity"},saxophone:{keywords:["music","instrument","jazz","blues"],char:"๐ŸŽท",category:"activity"},trumpet:{keywords:["music","brass"],char:"๐ŸŽบ",category:"activity"},guitar:{keywords:["music","instrument"],char:"๐ŸŽธ",category:"activity"},violin:{keywords:["music","instrument","orchestra","symphony"],char:"๐ŸŽป",category:"activity"},clapper:{keywords:["movie","film","record"],char:"๐ŸŽฌ",category:"activity"},video_game:{keywords:["play","console","PS4","controller"],char:"๐ŸŽฎ",category:"activity"},space_invader:{keywords:["game","arcade","play"],char:"๐Ÿ‘พ",category:"activity"},dart:{keywords:["game","play","bar"],char:"๐ŸŽฏ",category:"activity"},game_die:{keywords:["dice","random","tabletop","play","luck"],char:"๐ŸŽฒ",category:"activity"},slot_machine:{keywords:["bet","gamble","vegas","fruit machine","luck","casino"],char:"๐ŸŽฐ",category:"activity"},bowling:{keywords:["sports","fun","play"],char:"๐ŸŽณ",category:"activity"},car:{keywords:["red","transportation","vehicle"],char:"๐Ÿš—",category:"travel_and_places"},taxi:{keywords:["uber","vehicle","cars","transportation"],char:"๐Ÿš•",category:"travel_and_places"},blue_car:{keywords:["transportation","vehicle"],char:"๐Ÿš™",category:"travel_and_places"},bus:{keywords:["car","vehicle","transportation"],char:"๐ŸšŒ",category:"travel_and_places"},trolleybus:{keywords:["bart","transportation","vehicle"],char:"๐ŸšŽ",category:"travel_and_places"},racing_car:{keywords:["sports","race","fast","formula","f1"],char:"๐ŸŽ",category:"travel_and_places"},police_car:{keywords:["vehicle","cars","transportation","law","legal","enforcement"],char:"๐Ÿš“",category:"travel_and_places"},ambulance:{keywords:["health","911","hospital"],char:"๐Ÿš‘",category:"travel_and_places"},fire_engine:{keywords:["transportation","cars","vehicle"],char:"๐Ÿš’",category:"travel_and_places"},minibus:{keywords:["vehicle","car","transportation"],char:"๐Ÿš",category:"travel_and_places"},truck:{keywords:["cars","transportation"],char:"๐Ÿšš",category:"travel_and_places"},articulated_lorry:{keywords:["vehicle","cars","transportation","express"],char:"๐Ÿš›",category:"travel_and_places"},tractor:{keywords:["vehicle","car","farming","agriculture"],char:"๐Ÿšœ",category:"travel_and_places"},racing_motorcycle:{keywords:["race","sports","fast"],char:"๐Ÿ",category:"travel_and_places"},bike:{keywords:["sports","bicycle","exercise","hipster"],char:"๐Ÿšฒ",category:"travel_and_places"},rotating_light:{keywords:["police","ambulance","911","emergency","alert","error","pinged","law","legal"],char:"๐Ÿšจ",category:"travel_and_places"},oncoming_police_car:{keywords:["vehicle","law","legal","enforcement","911"],char:"๐Ÿš”",category:"travel_and_places"},oncoming_bus:{keywords:["vehicle","transportation"],char:"๐Ÿš",category:"travel_and_places"},oncoming_automobile:{keywords:["car","vehicle","transportation"],char:"๐Ÿš˜",category:"travel_and_places"},oncoming_taxi:{keywords:["vehicle","cars","uber"],char:"๐Ÿš–",category:"travel_and_places"},aerial_tramway:{keywords:["transportation","vehicle","ski"],char:"๐Ÿšก",category:"travel_and_places"},mountain_cableway:{keywords:["transportation","vehicle","ski"],char:"๐Ÿš ",category:"travel_and_places"},suspension_railway:{keywords:["vehicle","transportation"],char:"๐ŸšŸ",category:"travel_and_places"},railway_car:{keywords:["transportation","vehicle"],char:"๐Ÿšƒ",category:"travel_and_places"},train:{keywords:["transportation","vehicle","carriage","public","travel"],char:"๐Ÿš‹",category:"travel_and_places"},monorail:{keywords:["transportation","vehicle"],char:"๐Ÿš",category:"travel_and_places"},bullettrain_side:{keywords:["transportation","vehicle"],char:"๐Ÿš„",category:"travel_and_places"},bullettrain_front:{keywords:["transportation","vehicle","speed","fast","public","travel"],char:"๐Ÿš…",category:"travel_and_places"},light_rail:{keywords:["transportation","vehicle"],char:"๐Ÿšˆ",category:"travel_and_places"},mountain_railway:{keywords:["transportation","vehicle"],char:"๐Ÿšž",category:"travel_and_places"},steam_locomotive:{keywords:["transportation","vehicle","train"],char:"๐Ÿš‚",category:"travel_and_places"},train2:{keywords:["transportation","vehicle"],char:"๐Ÿš†",category:"travel_and_places"},metro:{keywords:["transportation","blue-square","mrt","underground","tube"],char:"๐Ÿš‡",category:"travel_and_places"},tram:{keywords:["transportation","vehicle"],char:"๐ŸšŠ",category:"travel_and_places"},station:{keywords:["transportation","vehicle","public"],char:"๐Ÿš‰",category:"travel_and_places"},helicopter:{keywords:["transportation","vehicle","fly"],char:"๐Ÿš",category:"travel_and_places"},small_airplane:{keywords:["flight","transportation","fly","vehicle"],char:"๐Ÿ›ฉ",category:"travel_and_places"},airplane:{keywords:["vehicle","transportation","flight","fly"],char:"โœˆ๏ธ",category:"travel_and_places"},airplane_departure:{keywords:["airport","flight","landing"],char:"๐Ÿ›ซ",category:"travel_and_places"},airplane_arrival:{keywords:["airport","flight","boarding"],char:"๐Ÿ›ฌ",category:"travel_and_places"},boat:{keywords:["ship","summer","transportation","water","sailing","sailboat"],char:"โ›ต",category:"travel_and_places"},motor_boat:{keywords:["ship"],char:"๐Ÿ›ฅ",category:"travel_and_places"},speedboat:{keywords:["ship","transportation","vehicle","summer"],char:"๐Ÿšค",category:"travel_and_places"},ferry:{keywords:["boat","ship","yacht"],char:"โ›ด",category:"travel_and_places"},passenger_ship:{keywords:["yacht","cruise","ferry"],char:"๐Ÿ›ณ",category:"travel_and_places"},rocket:{keywords:["launch","ship","staffmode","NASA","outer space","outer_space","fly"],char:"๐Ÿš€",category:"travel_and_places"},artificial_satellite:{keywords:["communication","gps","orbit","spaceflight","NASA","ISS"],char:"๐Ÿ›ฐ",category:"travel_and_places"},seat:{keywords:["sit","airplane","transport","bus","flight","fly"],char:"๐Ÿ’บ",category:"travel_and_places"},anchor:{keywords:["ship","ferry","sea","boat"],char:"โš“",category:"travel_and_places"},construction:{keywords:["wip","progress","caution","warning"],char:"๐Ÿšง",category:"travel_and_places"},fuelpump:{keywords:["gas station","petroleum"],char:"โ›ฝ",category:"travel_and_places"},busstop:{keywords:["transportation","wait"],char:"๐Ÿš",category:"travel_and_places"},vertical_traffic_light:{keywords:["transportation","driving"],char:"๐Ÿšฆ",category:"travel_and_places"},traffic_light:{keywords:["transportation","signal"],char:"๐Ÿšฅ",category:"travel_and_places"},checkered_flag:{keywords:["contest","finishline","race","gokart"],char:"๐Ÿ",category:"travel_and_places"},ship:{keywords:["transportation","titanic","deploy"],char:"๐Ÿšข",category:"travel_and_places"},ferris_wheel:{keywords:["photo","carnival","londoneye"],char:"๐ŸŽก",category:"travel_and_places"},roller_coaster:{keywords:["carnival","playground","photo","fun"],char:"๐ŸŽข",category:"travel_and_places"},carousel_horse:{keywords:["photo","carnival"],char:"๐ŸŽ ",category:"travel_and_places"},building_construction:{keywords:["wip","working","progress"],char:"๐Ÿ—",category:"travel_and_places"},foggy:{keywords:["photo","mountain"],char:"๐ŸŒ",category:"travel_and_places"},tokyo_tower:{keywords:["photo","japanese"],char:"๐Ÿ—ผ",category:"travel_and_places"},factory:{keywords:["building","industry","pollution","smoke"],char:"๐Ÿญ",category:"travel_and_places"},fountain:{keywords:["photo","summer","water","fresh"],char:"โ›ฒ",category:"travel_and_places"},rice_scene:{keywords:["photo","japan","asia","tsukimi"],char:"๐ŸŽ‘",category:"travel_and_places"},mountain:{keywords:["photo","nature","environment"],char:"โ›ฐ",category:"travel_and_places"},snow_capped_mountain:{keywords:["photo","nature","environment","winter","cold"],char:"๐Ÿ”",category:"travel_and_places"},mount_fuji:{keywords:["photo","mountain","nature","japanese"],char:"๐Ÿ—ป",category:"travel_and_places"},volcano:{keywords:["photo","nature","disaster"],char:"๐ŸŒ‹",category:"travel_and_places"},japan:{keywords:["nation","country","japanese","asia"],char:"๐Ÿ—พ",category:"travel_and_places"},camping:{keywords:["photo","outdoors","tent"],char:"๐Ÿ•",category:"travel_and_places"},tent:{keywords:["photo","camping","outdoors"],char:"โ›บ",category:"travel_and_places"},national_park:{keywords:["photo","environment","nature"],char:"๐Ÿž",category:"travel_and_places"},motorway:{keywords:["road","cupertino","interstate","highway"],char:"๐Ÿ›ฃ",category:"travel_and_places"},railway_track:{keywords:["train","transportation"],char:"๐Ÿ›ค",category:"travel_and_places"},sunrise:{keywords:["morning","view","vacation","photo"],char:"๐ŸŒ…",category:"travel_and_places"},sunrise_over_mountains:{keywords:["view","vacation","photo"],char:"๐ŸŒ„",category:"travel_and_places"},desert:{keywords:["photo","warm","saharah"],char:"๐Ÿœ",category:"travel_and_places"},beach_with_umbrella:{keywords:["weather","summer","sunny","sand","mojito"],char:"๐Ÿ–",category:"travel_and_places"},desert_island:{keywords:["photo","tropical","mojito"],char:"๐Ÿ",category:"travel_and_places"},city_sunrise:{keywords:["photo","good morning","dawn"],char:"๐ŸŒ‡",category:"travel_and_places"},city_sunset:{keywords:["photo","evening","sky","buildings"],char:"๐ŸŒ†",category:"travel_and_places"},cityscape:{keywords:["photo","night life","urban"],char:"๐Ÿ™",category:"travel_and_places"},night_with_stars:{keywords:["evening","city","downtown"],char:"๐ŸŒƒ",category:"travel_and_places"},bridge_at_night:{keywords:["photo","sanfrancisco"],char:"๐ŸŒ‰",category:"travel_and_places"},milky_way:{keywords:["photo","space","stars"],char:"๐ŸŒŒ",category:"travel_and_places"},stars:{keywords:["night","photo"],char:"๐ŸŒ ",category:"travel_and_places"},sparkler:{keywords:["stars","night","shine"],char:"๐ŸŽ‡",category:"travel_and_places"},fireworks:{keywords:["photo","festival","carnival","congratulations"],char:"๐ŸŽ†",category:"travel_and_places"},rainbow:{keywords:["nature","happy","unicorn","photo","sky","spring"],char:"๐ŸŒˆ",category:"travel_and_places"},buildings:{keywords:["houses","photo"],char:"๐Ÿ˜",category:"travel_and_places"},european_castle:{keywords:["building","royalty","history"],char:"๐Ÿฐ",category:"travel_and_places"},japanese_castle:{keywords:["photo","building"],char:"๐Ÿฏ",category:"travel_and_places"},stadium:{keywords:["photo","place","sports","concert","venue"],char:"๐ŸŸ",category:"travel_and_places"},statue_of_liberty:{keywords:["american","newyork"],char:"๐Ÿ—ฝ",category:"travel_and_places"},house:{keywords:["building","home"],char:"๐Ÿ ",category:"travel_and_places"},house_with_garden:{keywords:["home","plant","nature"],char:"๐Ÿก",category:"travel_and_places"},derelict_house:{keywords:["abandon","evict","broken","building"],char:"๐Ÿš",category:"travel_and_places"},office:{keywords:["building","bureau","work"],char:"๐Ÿข",category:"travel_and_places"},department_store:{keywords:["building","shopping","mall"],char:"๐Ÿฌ",category:"travel_and_places"},post_office:{keywords:["building","email","communication"],char:"๐Ÿฃ",category:"travel_and_places"},european_post_office:{keywords:["building","email"],char:"๐Ÿค",category:"travel_and_places"},hospital:{keywords:["building","health","surgery","doctor"],char:"๐Ÿฅ",category:"travel_and_places"},bank:{keywords:["building","money","sales","cash","business","enterprise"],char:"๐Ÿฆ",category:"travel_and_places"},hotel:{keywords:["building","accomodation","checkin"],char:"๐Ÿจ",category:"travel_and_places"},convenience_store:{keywords:["building","shopping","groceries"],char:"๐Ÿช",category:"travel_and_places"},school:{keywords:["building","student","education","learn","teach"],char:"๐Ÿซ",category:"travel_and_places"},love_hotel:{keywords:["like","affection","dating"],char:"๐Ÿฉ",category:"travel_and_places"},wedding:{keywords:["love","like","affection","couple","marriage","bride","groom"],char:"๐Ÿ’’",category:"travel_and_places"},museum:{keywords:["art","culture","history"],char:"๐Ÿ›",category:"travel_and_places"},church:{keywords:["building","religion","christ"],char:"โ›ช",category:"travel_and_places"},mosque:{keywords:["islam","worship","minaret"],char:"๐Ÿ•Œ",category:"travel_and_places"},synagogue:{keywords:["judaism","worship","temple","jewish"],char:"๐Ÿ•",category:"travel_and_places"},kaaba:{keywords:["mecca","mosque","islam"],char:"๐Ÿ•‹",category:"travel_and_places"},shinto_shrine:{keywords:["temple","japan","kyoto"],char:"โ›ฉ",category:"travel_and_places"},watch:{keywords:["time","accessories"],char:"โŒš",category:"objects"},iphone:{keywords:["technology","apple","gadgets","dial"],char:"๐Ÿ“ฑ",category:"objects"},calling:{keywords:["iphone","incoming"],char:"๐Ÿ“ฒ",category:"objects"},computer:{keywords:["technology","laptop","screen","display","monitor"],char:"๐Ÿ’ป",category:"objects"},keyboard:{keywords:["technology","computer","type","input","text"],char:"โŒจ",category:"objects"},desktop_computer:{keywords:["technology","computing","screen"],char:"๐Ÿ–ฅ",category:"objects"},printer:{keywords:["paper","ink"],char:"๐Ÿ–จ",category:"objects"},three_button_mouse:{keywords:["click"],char:"๐Ÿ–ฑ",category:"objects"},trackball:{keywords:["technology","trackpad"],char:"๐Ÿ–ฒ",category:"objects"},joystick:{keywords:["game","play"],char:"๐Ÿ•น",category:"objects"},compression:{keywords:["tool"],char:"๐Ÿ—œ",category:"objects"},minidisc:{keywords:["technology","record","data","disk","90s"],char:"๐Ÿ’ฝ",category:"objects"},floppy_disk:{keywords:["oldschool","technology","save","90s","80s"],char:"๐Ÿ’พ",category:"objects"},cd:{keywords:["technology","dvd","disk","disc","90s"],char:"๐Ÿ’ฟ",category:"objects"},dvd:{keywords:["cd","disk","disc"],char:"๐Ÿ“€",category:"objects"},vhs:{keywords:["record","video","oldschool","90s","80s"],char:"๐Ÿ“ผ",category:"objects"},camera:{keywords:["gadgets","photography"],char:"๐Ÿ“ท",category:"objects"},camera_with_flash:{keywords:["photography","gadgets"],char:"๐Ÿ“ธ",category:"objects"},video_camera:{keywords:["film","record"],char:"๐Ÿ“น",category:"objects"},movie_camera:{keywords:["film","record"],char:"๐ŸŽฅ",category:"objects"},film_projector:{keywords:["video","tape","record","movie"],char:"๐Ÿ“ฝ",category:"objects"},film_frames:{keywords:["movie"],char:"๐ŸŽž",category:"objects"},telephone_receiver:{keywords:["technology","communication","dial"],char:"๐Ÿ“ž",category:"objects"},phone:{keywords:["technology","communication","dial","telephone"],char:"โ˜Ž๏ธ",category:"objects"},pager:{keywords:["bbcall","oldschool","90s"],char:"๐Ÿ“Ÿ",category:"objects"},fax:{keywords:["communication","technology"],char:"๐Ÿ“ ",category:"objects"},tv:{keywords:["technology","program","oldschool","show","television"],char:"๐Ÿ“บ",category:"objects"},radio:{keywords:["communication","music","podcast","program"],char:"๐Ÿ“ป",category:"objects"},studio_microphone:{keywords:["singer","recording","artist"],char:"๐ŸŽ™",category:"objects"},level_slider:{keywords:["scale"],char:"๐ŸŽš",category:"objects"},control_knobs:{keywords:["dial"],char:"๐ŸŽ›",category:"objects"},stopwatch:{keywords:["time","deadline"],char:"โฑ",category:"objects"},timer_clock:{keywords:["alarm"],char:"โฒ",category:"objects"},alarm_clock:{keywords:["time","wake"],char:"โฐ",category:"objects"},mantelpiece_clock:{keywords:["time"],char:"๐Ÿ•ฐ",category:"objects"},hourglass_flowing_sand:{keywords:["oldschool","time","countdown"],char:"โณ",category:"objects"},hourglass:{keywords:["time","clock","oldschool","limit","exam","quiz","test"],char:"โŒ›",category:"objects"},satellite:{keywords:["communication","future","radio","space"],char:"๐Ÿ“ก",category:"objects"},battery:{keywords:["power","energy","sustain"],char:"๐Ÿ”‹",category:"objects"},electric_plug:{keywords:["charger","power"],char:"๐Ÿ”Œ",category:"objects"},bulb:{keywords:["light","electricity","idea"],char:"๐Ÿ’ก",category:"objects"},flashlight:{keywords:["dark","camping","sight","night"],char:"๐Ÿ”ฆ",category:"objects"},candle:{keywords:["fire","wax"],char:"๐Ÿ•ฏ",category:"objects"},wastebasket:{keywords:["bin","trash","rubbish","garbage","toss"],char:"๐Ÿ—‘",category:"objects"},oil_drum:{keywords:["barrell"],char:"๐Ÿ›ข",category:"objects"},money_with_wings:{keywords:["dollar","bills","payment","sale"],char:"๐Ÿ’ธ",category:"objects"},dollar:{keywords:["money","sales","bill","currency"],char:"๐Ÿ’ต",category:"objects"},yen:{keywords:["money","sales","japanese","dollar","currency"],char:"๐Ÿ’ด",category:"objects"},euro:{keywords:["money","sales","dollar","currency"],char:"๐Ÿ’ถ",category:"objects"},pound:{keywords:["british","sterling","money","sales","bills","uk","england","currency"],char:"๐Ÿ’ท",category:"objects"},moneybag:{keywords:["dollar","payment","coins","sale"],char:"๐Ÿ’ฐ",category:"objects"},credit_card:{keywords:["money","sales","dollar","bill","payment","shopping"],char:"๐Ÿ’ณ",category:"objects"},gem:{keywords:["blue","ruby","diamond","jewelry"],char:"๐Ÿ’Ž",category:"objects"},scales:{keywords:["law","fairness","weight"],char:"โš–",category:"objects"},wrench:{keywords:["tools","diy","ikea","fix","maintainer"],char:"๐Ÿ”ง",category:"objects"},hammer:{keywords:["tools","build","create"],char:"๐Ÿ”จ",category:"objects"},hammer_and_pick:{keywords:["tools","build","create"],char:"โš’",category:"objects"},hammer_and_wrench:{keywords:["tools","build","create"],char:"๐Ÿ› ",category:"objects"},pick:{keywords:["tools","dig"],char:"โ›",category:"objects"},nut_and_bolt:{keywords:["handy","tools","fix"],char:"๐Ÿ”ฉ",category:"objects"},gear:{keywords:["cog"],char:"โš™",category:"objects"},chains:{keywords:["lock","arrest"],char:"โ›“",category:"objects"},gun:{keywords:["violence","weapon","pistol","revolver"],char:"๐Ÿ”ซ",category:"objects"},bomb:{keywords:["boom","explode","explosion","terrorism"],char:"๐Ÿ’ฃ",category:"objects"},hocho:{keywords:["knife","blade","cutlery","kitchen","weapon"],char:"๐Ÿ”ช",category:"objects"},dagger_knife:{keywords:["weapon"],char:"๐Ÿ—ก",category:"objects"},crossed_swords:{keywords:["weapon"],char:"โš”",category:"objects"},shield:{keywords:["protection","security"],char:"๐Ÿ›ก",category:"objects"},smoking:{keywords:["kills","tobacco","cigarette","joint","smoke"],char:"๐Ÿšฌ",category:"objects"},skull_and_crossbones:{keywords:["poison","danger","deadly","scary"],char:"โ˜ ",category:"objects"},coffin:{keywords:["vampire","dead","die","death","rip","graveyard","cemetery"],char:"โšฐ",category:"objects"},funeral_urn:{keywords:["dead","die","death","rip","ashes"],char:"โšฑ",category:"objects"},amphora:{keywords:["vase","jar"],char:"๐Ÿบ",category:"objects"},crystal_ball:{keywords:["disco","party","magic","circus","fortune_teller"],char:"๐Ÿ”ฎ",category:"objects"},prayer_beads:{keywords:["dhikr","religious"],char:"๐Ÿ“ฟ",category:"objects"},barber:{keywords:["hair","salon","style"],char:"๐Ÿ’ˆ",category:"objects"},alembic:{keywords:["distilling","science","experiment"],char:"โš—",category:"objects"},telescope:{keywords:["stars","space","zoom"],char:"๐Ÿ”ญ",category:"objects"},microscope:{keywords:["laboratory","experiment","zoomin","science","study"],char:"๐Ÿ”ฌ",category:"objects"},hole:{keywords:["embarrassing"],char:"๐Ÿ•ณ",category:"objects"},pill:{keywords:["health","medicine","doctor","pharmacy","drug"],char:"๐Ÿ’Š",category:"objects"},syringe:{keywords:["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],char:"๐Ÿ’‰",category:"objects"},thermometer:{keywords:["weather","temperature","hot","cold"],char:"๐ŸŒก",category:"objects"},label:{keywords:["sale","tag"],char:"๐Ÿท",category:"objects"},bookmark:{keywords:["favorite","label","save"],char:"๐Ÿ”–",category:"objects"},toilet:{keywords:["restroom","wc","washroom","bathroom","potty"],char:"๐Ÿšฝ",category:"objects"},shower:{keywords:["clean","water","bathroom"],char:"๐Ÿšฟ",category:"objects"},bathtub:{keywords:["clean","shower","bathroom"],char:"๐Ÿ›",category:"objects"},key:{keywords:["lock","door","password"],char:"๐Ÿ”‘",category:"objects"},old_key:{keywords:["lock","door","password"],char:"๐Ÿ—",category:"objects"},couch_and_lamp:{keywords:["read","chill"],char:"๐Ÿ›‹",category:"objects"},sleeping_accommodation:{keywords:["bed","rest"],char:"๐Ÿ›Œ",category:"objects"},bed:{keywords:["sleep","rest"],char:"๐Ÿ›",category:"objects"},door:{keywords:["house","entry","exit"],char:"๐Ÿšช",category:"objects"},bellhop_bell:{keywords:["service"],char:"๐Ÿ›Ž",category:"objects"},frame_with_picture:{keywords:["photography"],char:"๐Ÿ–ผ",category:"objects"},world_map:{keywords:["location","direction"],char:"๐Ÿ—บ",category:"objects"},umbrella_on_ground:{keywords:["weather","summer"],char:"โ›ฑ",category:"objects"},moyai:{keywords:["rock","easter island","moai"],char:"๐Ÿ—ฟ",category:"objects"},shopping_bags:{keywords:["mall","buy","purchase"],char:"๐Ÿ›",category:"objects"},balloon:{keywords:["party","celebration","birthday","circus"],char:"๐ŸŽˆ",category:"objects"},flags:{keywords:["fish","japanese","koinobori","carp","banner"],char:"๐ŸŽ",category:"objects"},ribbon:{keywords:["decoration","pink","girl","bowtie"],char:"๐ŸŽ€",category:"objects"},gift:{keywords:["present","birthday","christmas","xmas"],char:"๐ŸŽ",category:"objects"},confetti_ball:{keywords:["festival","party","birthday","circus"],char:"๐ŸŽŠ",category:"objects"},tada:{keywords:["party","contulations","birthday","magic","circus"],char:"๐ŸŽ‰",category:"objects"},dolls:{keywords:["japanese","toy","kimono"],char:"๐ŸŽŽ",category:"objects"},wind_chime:{keywords:["nature","ding","spring","bell"],char:"๐ŸŽ",category:"objects"},crossed_flags:{keywords:["japanese","nation","country","border"],char:"๐ŸŽŒ",category:"objects"},izakaya_lantern:{keywords:["light","paper","halloween","spooky"],char:"๐Ÿฎ",category:"objects"},envelope:{keywords:["letter","postal","inbox","communication"],char:"โœ‰๏ธ",category:"objects"},envelope_with_arrow:{keywords:["email","communication"],char:"๐Ÿ“ฉ",category:"objects"},incoming_envelope:{keywords:["email","inbox"],char:"๐Ÿ“จ",category:"objects"},email:{keywords:["communication","inbox"],char:"๐Ÿ“ง",category:"objects"},love_letter:{keywords:["email","like","affection","envelope","valentines"],char:"๐Ÿ’Œ",category:"objects"},postbox:{keywords:["email","letter","envelope"],char:"๐Ÿ“ฎ",category:"objects"},mailbox_closed:{keywords:["email","communication","inbox"],char:"๐Ÿ“ช",category:"objects"},mailbox:{keywords:["email","inbox","communication"],char:"๐Ÿ“ซ",category:"objects"},mailbox_with_mail:{keywords:["email","inbox","communication"],char:"๐Ÿ“ฌ",category:"objects"},mailbox_with_no_mail:{keywords:["email","inbox"],char:"๐Ÿ“ญ",category:"objects"},package:{keywords:["mail","gift","cardboard","box","moving"],char:"๐Ÿ“ฆ",category:"objects"},postal_horn:{keywords:["instrument","music"],char:"๐Ÿ“ฏ",category:"objects"},inbox_tray:{keywords:["email","documents"],char:"๐Ÿ“ฅ",category:"objects"},outbox_tray:{keywords:["inbox","email"],char:"๐Ÿ“ค",category:"objects"},scroll:{keywords:["documents","ancient","history","paper"],char:"๐Ÿ“œ",category:"objects"},page_with_curl:{keywords:["documents","office","paper"],char:"๐Ÿ“ƒ",category:"objects"},bookmark_tabs:{keywords:["favorite","save","order","tidy"],char:"๐Ÿ“‘",category:"objects"},bar_chart:{keywords:["graph","presentation","stats"],char:"๐Ÿ“Š",category:"objects"},chart_with_upwards_trend:{keywords:["graph","presentation","stats","recovery","business","economics","money","sales","good","success"],char:"๐Ÿ“ˆ",category:"objects"},chart_with_downwards_trend:{keywords:["graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],char:"๐Ÿ“‰",category:"objects"},page_facing_up:{keywords:["documents","office","paper","information"],char:"๐Ÿ“„",category:"objects"},date:{keywords:["calendar","schedule"],char:"๐Ÿ“…",category:"objects"},calendar:{keywords:["schedule","date","planning"],char:"๐Ÿ“†",category:"objects"},spiral_calendar_pad:{keywords:["date","schedule","planning"],char:"๐Ÿ—“",category:"objects"},card_index:{keywords:["business","stationery"],char:"๐Ÿ“‡",category:"objects"},card_file_box:{keywords:["business","stationery"],char:"๐Ÿ—ƒ",category:"objects"},ballot_box_with_ballot:{keywords:["election","vote"],char:"๐Ÿ—ณ",category:"objects"},file_cabinet:{keywords:["filing","organizing"],char:"๐Ÿ—„",category:"objects"},clipboard:{keywords:["stationery","documents"],char:"๐Ÿ“‹",category:"objects"},spiral_note_pad:{keywords:["memo","stationery"],char:"๐Ÿ—’",category:"objects"},file_folder:{keywords:["documents","business","office"],char:"๐Ÿ“",category:"objects"},open_file_folder:{keywords:["documents","load"],char:"๐Ÿ“‚",category:"objects"},card_index_dividers:{keywords:["organizing","business","stationery"],char:"๐Ÿ—‚",category:"objects"},rolled_up_newspaper:{keywords:["press","headline"],char:"๐Ÿ—ž",category:"objects"},newspaper:{keywords:["press","headline"],char:"๐Ÿ“ฐ",category:"objects"},notebook:{keywords:["stationery","record","notes","paper","study"],char:"๐Ÿ““",category:"objects"},closed_book:{keywords:["read","library","knowledge","textbook","learn"],char:"๐Ÿ“•",category:"objects"},green_book:{keywords:["read","library","knowledge","study"],char:"๐Ÿ“—",category:"objects"},blue_book:{keywords:["read","library","knowledge","learn","study"],char:"๐Ÿ“˜",category:"objects"},orange_book:{keywords:["read","library","knowledge","textbook","study"],char:"๐Ÿ“™",category:"objects"},notebook_with_decorative_cover:{keywords:["classroom","notes","record","paper","study"],char:"๐Ÿ“”",category:"objects"},ledger:{keywords:["notes","paper"],char:"๐Ÿ“’",category:"objects"},books:{keywords:["literature","library","study"],char:"๐Ÿ“š",category:"objects"},book:{keywords:["open_book","read","library","knowledge","literature","learn","study"],char:"๐Ÿ“–",category:"objects"},link:{keywords:["rings","url"],char:"๐Ÿ”—",category:"objects"},paperclip:{keywords:["documents","stationery"],char:"๐Ÿ“Ž",category:"objects"},linked_paperclips:{keywords:["documents","stationery"],char:"๐Ÿ–‡",category:"objects"},scissors:{keywords:["stationery","cut"],char:"โœ‚๏ธ",category:"objects"},triangular_ruler:{keywords:["stationery","math","architect","sketch"],char:"๐Ÿ“",category:"objects"},straight_ruler:{keywords:["stationery","calculate","length","math","school","drawing","architect","sketch"],char:"๐Ÿ“",category:"objects"},pushpin:{keywords:["stationery","mark","here"],char:"๐Ÿ“Œ",category:"objects"},round_pushpin:{keywords:["stationery","location","map","here"],char:"๐Ÿ“",category:"objects"},triangular_flag_on_post:{keywords:["mark","milestone","place"],char:"๐Ÿšฉ",category:"objects"},waving_white_flag:{keywords:["losing","loser","lost","surrender","give up","fail"],char:"๐Ÿณ",category:"objects"},waving_black_flag:{keywords:["pirate"],char:"๐Ÿด",category:"objects"},closed_lock_with_key:{keywords:["security","privacy"],char:"๐Ÿ”",category:"objects"},lock:{keywords:["security","password","padlock"],char:"๐Ÿ”’",category:"objects"},unlock:{keywords:["privacy","security"],char:"๐Ÿ”“",category:"objects"},lock_with_ink_pen:{keywords:["security","secret"],char:"๐Ÿ”",category:"objects"},lower_left_ballpoint_pen:{keywords:["stationery","writing","write"],char:"๐Ÿ–Š",category:"objects"},lower_left_fountain_pen:{keywords:["stationery","writing","write"],char:"๐Ÿ–‹",category:"objects"},black_nib:{keywords:["pen","stationery","writing","write"],char:"โœ’๏ธ",category:"objects"},memo:{keywords:["write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study"],char:"๐Ÿ“",category:"objects"},pencil2:{keywords:["stationery","write","paper","writing","school","study"],char:"โœ๏ธ",category:"objects"},lower_left_crayon:{keywords:["drawing","creativity"],char:"๐Ÿ–",category:"objects"},lower_left_paintbrush:{keywords:["drawing","creativity","art"],char:"๐Ÿ–Œ",category:"objects"},mag:{keywords:["search","zoom","find","detective"],char:"๐Ÿ”",category:"objects"},mag_right:{keywords:["search","zoom","find","detective"],char:"๐Ÿ”Ž",category:"objects"},heart:{keywords:["love","like","valentines"],char:"โค๏ธ",category:"symbols"},yellow_heart:{keywords:["love","like","affection","valentines"],char:"๐Ÿ’›",category:"symbols"},green_heart:{keywords:["love","like","affection","valentines"],char:"๐Ÿ’š",category:"symbols"},blue_heart:{keywords:["love","like","affection","valentines"],char:"๐Ÿ’™",category:"symbols"},purple_heart:{keywords:["love","like","affection","valentines"],char:"๐Ÿ’œ",category:"symbols"},broken_heart:{keywords:["sad","sorry","break","heart","heartbreak"],char:"๐Ÿ’”",category:"symbols"},heavy_heart_exclamation_mark_ornament:{keywords:["decoration","love"],char:"โฃ",category:"symbols"},two_hearts:{keywords:["love","like","affection","valentines","heart"],char:"๐Ÿ’•",category:"symbols"},revolving_hearts:{keywords:["love","like","affection","valentines"],char:"๐Ÿ’ž",category:"symbols"},heartbeat:{keywords:["love","like","affection","valentines","pink","heart"],char:"๐Ÿ’“",category:"symbols"},heartpulse:{keywords:["like","love","affection","valentines","pink"],char:"๐Ÿ’—",category:"symbols"},sparkling_heart:{keywords:["love","like","affection","valentines"],char:"๐Ÿ’–",category:"symbols"},cupid:{keywords:["love","like","heart","affection","valentines"],char:"๐Ÿ’˜",category:"symbols"},gift_heart:{keywords:["love","valentines"],char:"๐Ÿ’",category:"symbols"},heart_decoration:{keywords:["purple-square","love","like"],char:"๐Ÿ’Ÿ",category:"symbols"},peace_symbol:{keywords:["hippie"],char:"โ˜ฎ",category:"symbols"},latin_cross:{keywords:["christianity"],char:"โœ",category:"symbols"},star_and_crescent:{keywords:["islam"],char:"โ˜ช",category:"symbols"},om_symbol:{keywords:["hinduism","buddhism","sikhism","jainism"],char:"๐Ÿ•‰",category:"symbols"},wheel_of_dharma:{keywords:["hinduism","buddhism","sikhism","jainism"],char:"โ˜ธ",category:"symbols"},star_of_david:{keywords:["judaism"],char:"โœก",category:"symbols"},six_pointed_star:{keywords:["purple-square","religion","jewish","hexagram"],char:"๐Ÿ”ฏ",category:"symbols"},menorah_with_nine_branches:{keywords:["hanukkah","candles","jewish"],char:"๐Ÿ•Ž",category:"symbols"},yin_yang:{keywords:["balance"],char:"โ˜ฏ",category:"symbols"},orthodox_cross:{keywords:["suppedaneum","religion"],char:"โ˜ฆ",category:"symbols"},place_of_worship:{keywords:["religion","church","temple","prayer"],char:"๐Ÿ›",category:"symbols"},ophiuchus:{keywords:["sign","purple-square","constellation","astrology"],char:"โ›Ž",category:"symbols"},aries:{keywords:["sign","purple-square","zodiac","astrology"],char:"โ™ˆ",category:"symbols"},taurus:{keywords:["purple-square","sign","zodiac","astrology"],char:"โ™‰",category:"symbols"},gemini:{keywords:["sign","zodiac","purple-square","astrology"],char:"โ™Š",category:"symbols"},cancer:{keywords:["sign","zodiac","purple-square","astrology"],char:"โ™‹",category:"symbols"},leo:{keywords:["sign","purple-square","zodiac","astrology"],char:"โ™Œ",category:"symbols"},virgo:{keywords:["sign","zodiac","purple-square","astrology"],char:"โ™",category:"symbols"},libra:{keywords:["sign","purple-square","zodiac","astrology"],char:"โ™Ž",category:"symbols"},scorpius:{keywords:["sign","zodiac","purple-square","astrology","scorpio"],char:"โ™",category:"symbols"},sagittarius:{keywords:["sign","zodiac","purple-square","astrology"],char:"โ™",category:"symbols"},capricorn:{keywords:["sign","zodiac","purple-square","astrology"],char:"โ™‘",category:"symbols"},aquarius:{keywords:["sign","purple-square","zodiac","astrology"],char:"โ™’",category:"symbols"},pisces:{keywords:["purple-square","sign","zodiac","astrology"],char:"โ™“",category:"symbols"},id:{keywords:["purple-square","words"],char:"๐Ÿ†”",category:"symbols"},atom_symbol:{keywords:["science"],char:"โš›",category:"symbols"},u7a7a:{keywords:["kanji","japanese","chinese","empty","sky","blue-square"],char:"๐Ÿˆณ",category:"symbols"},u5272:{keywords:["cut","divide","chinese","kanji","pink-square"],char:"๐Ÿˆน",category:"symbols"},radioactive_sign:{keywords:["nuclear","danger"],char:"โ˜ข",category:"symbols"},biohazard_sign:{keywords:["danger"],char:"โ˜ฃ",category:"symbols"},mobile_phone_off:{keywords:["mute","orange-square","silence","quiet"],char:"๐Ÿ“ด",category:"symbols"},vibration_mode:{keywords:["orange-square","phone"],char:"๐Ÿ“ณ",category:"symbols"},u6709:{keywords:["orange-square","chinese","have","kanji"],char:"๐Ÿˆถ",category:"symbols"},u7121:{keywords:["nothing","chinese","kanji","japanese","orange-square"],char:"๐Ÿˆš",category:"symbols"},u7533:{keywords:["chinese","japanese","kanji","orange-square"],char:"๐Ÿˆธ",category:"symbols"},u55b6:{keywords:["japanese","opening hours","orange-square"],char:"๐Ÿˆบ",category:"symbols"},u6708:{keywords:["chinese","month","moon","japanese","orange-square","kanji"],char:"๐Ÿˆท๏ธ",category:"symbols"},eight_pointed_black_star:{keywords:["orange-square","shape","polygon"],char:"โœด๏ธ",category:"symbols"},vs:{keywords:["words","orange-square"],char:"๐Ÿ†š",category:"symbols"},accept:{keywords:["ok","good","chinese","kanji","agree","yes","orange-circle"],char:"๐Ÿ‰‘",category:"symbols"},white_flower:{keywords:["japanese","spring"],char:"๐Ÿ’ฎ",category:"symbols"},ideograph_advantage:{keywords:["chinese","kanji","obtain","get","circle"],char:"๐Ÿ‰",category:"symbols"},secret:{keywords:["privacy","chinese","sshh","kanji","red-circle"],char:"ใŠ™๏ธ",category:"symbols"},congratulations:{keywords:["chinese","kanji","japanese","red-circle"],char:"ใŠ—๏ธ",category:"symbols"},u5408:{keywords:["japanese","chinese","join","kanji","red-square"],char:"๐Ÿˆด",category:"symbols"},u6e80:{keywords:["full","chinese","japanese","red-square","kanji"],char:"๐Ÿˆต",category:"symbols"},u7981:{keywords:["kanji","japanese","chinese","forbidden","limit","restricted","red-square"],char:"๐Ÿˆฒ",category:"symbols"},a:{keywords:["red-square","alphabet","letter"],char:"๐Ÿ…ฐ๏ธ",category:"symbols"},b:{keywords:["red-square","alphabet","letter"],char:"๐Ÿ…ฑ๏ธ",category:"symbols"},ab:{keywords:["red-square","alphabet"],char:"๐Ÿ†Ž",category:"symbols"},cl:{keywords:["alphabet","words","red-square"],char:"๐Ÿ†‘",category:"symbols"},o2:{keywords:["alphabet","red-square","letter"],char:"๐Ÿ…พ๏ธ",category:"symbols"},sos:{keywords:["help","red-square","words","emergency","911"],char:"๐Ÿ†˜",category:"symbols"},no_entry:{keywords:["limit","security","privacy","bad","denied","stop","circle"],char:"โ›”",category:"symbols"},name_badge:{keywords:["fire","forbid"],char:"๐Ÿ“›",category:"symbols"},no_entry_sign:{keywords:["forbid","stop","limit","denied","disallow","circle"],char:"๐Ÿšซ",category:"symbols"},x:{keywords:["no","delete","remove","cancel"],char:"โŒ",category:"symbols"},o:{keywords:["circle","round"],char:"โญ•",category:"symbols"},anger:{keywords:["angry","mad"],char:"๐Ÿ’ข",category:"symbols"},hotsprings:{keywords:["bath","warm","relax"],char:"โ™จ๏ธ",category:"symbols"},no_pedestrians:{keywords:["rules","crossing","walking","circle"],char:"๐Ÿšท",category:"symbols"},do_not_litter:{keywords:["trash","bin","garbage","circle"],char:"๐Ÿšฏ",category:"symbols"},no_bicycles:{keywords:["cyclist","prohibited","circle"],char:"๐Ÿšณ",category:"symbols"},"non-potable_water":{keywords:["drink","faucet","tap","circle"],char:"๐Ÿšฑ",category:"symbols"},underage:{keywords:["18","drink","pub","night","minor","circle"],char:"๐Ÿ”ž",category:"symbols"},no_mobile_phones:{keywords:["iphone","mute","circle"],char:"๐Ÿ“ต",category:"symbols"},exclamation:{keywords:["heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"],char:"โ—",category:"symbols"},grey_exclamation:{keywords:["surprise","punctuation","gray","wow","warning"],char:"โ•",category:"symbols"},question:{keywords:["doubt","confused"],char:"โ“",category:"symbols"},grey_question:{keywords:["doubts","gray","huh","confused"],char:"โ”",category:"symbols"},bangbang:{keywords:["exclamation","surprise"],char:"โ€ผ๏ธ",category:"symbols"},interrobang:{keywords:["wat","punctuation","surprise"],char:"โ‰๏ธ",category:"symbols"},100:{keywords:["score","perfect","numbers","century","exam","quiz","test","pass","hundred"],char:"๐Ÿ’ฏ",category:"symbols"},low_brightness:{keywords:["sun","afternoon","warm","summer"],char:"๐Ÿ”…",category:"symbols"},high_brightness:{keywords:["sun","light"],char:"๐Ÿ”†",category:"symbols"},trident:{keywords:["weapon","spear"],char:"๐Ÿ”ฑ",category:"symbols"},fleur_de_lis:{keywords:["decorative","scout"],char:"โšœ",category:"symbols"},part_alternation_mark:{keywords:["graph","presentation","stats","business","economics","bad"],char:"ใ€ฝ๏ธ",category:"symbols"},warning:{keywords:["exclamation","wip","alert","error","problem","issue"],char:"โš ๏ธ",category:"symbols"},children_crossing:{keywords:["school","warning","danger","sign","driving","yellow-diamond"],char:"๐Ÿšธ",category:"symbols"},beginner:{keywords:["badge","shield"],char:"๐Ÿ”ฐ",category:"symbols"},recycle:{keywords:["arrow","environment","garbage","trash"],char:"โ™ป๏ธ",category:"symbols"},u6307:{keywords:["chinese","point","green-square","kanji"],char:"๐Ÿˆฏ",category:"symbols"},chart:{keywords:["green-square","graph","presentation","stats"],char:"๐Ÿ’น",category:"symbols"},sparkle:{keywords:["stars","green-square","awesome","good","fireworks"],char:"โ‡๏ธ",category:"symbols"},eight_spoked_asterisk:{keywords:["star","sparkle","green-square"],char:"โœณ๏ธ",category:"symbols"},negative_squared_cross_mark:{keywords:["x","green-square","no","deny"],char:"โŽ",category:"symbols"},white_check_mark:{keywords:["green-square","ok","agree","vote","election","answer"],char:"โœ…",category:"symbols"},diamond_shape_with_a_dot_inside:{keywords:["jewel","blue","gem","crystal","fancy"],char:"๐Ÿ’ ",category:"symbols"},cyclone:{keywords:["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin"],char:"๐ŸŒ€",category:"symbols"},loop:{keywords:["tape","cassette"],char:"โžฟ",category:"symbols"},globe_with_meridians:{keywords:["earth","international","world","internet","interweb","i18n"],char:"๐ŸŒ",category:"symbols"},m:{keywords:["alphabet","blue-circle","letter"],char:"โ“‚๏ธ",category:"symbols"},atm:{keywords:["money","sales","cash","blue-square","payment","bank"],char:"๐Ÿง",category:"symbols"},sa:{keywords:["japanese","blue-square","katakana"],char:"๐Ÿˆ‚๏ธ",category:"symbols"},passport_control:{keywords:["custom","blue-square"],char:"๐Ÿ›‚",category:"symbols"},customs:{keywords:["passport","border","blue-square"],char:"๐Ÿ›ƒ",category:"symbols"},baggage_claim:{keywords:["blue-square","airport","transport"],char:"๐Ÿ›„",category:"symbols"},left_luggage:{keywords:["blue-square","travel"],char:"๐Ÿ›…",category:"symbols"},wheelchair:{keywords:["blue-square","disabled","a11y","accessibility"],char:"โ™ฟ",category:"symbols"},no_smoking:{keywords:["cigarette","blue-square","smell","smoke"],char:"๐Ÿšญ",category:"symbols"},wc:{keywords:["toilet","restroom","blue-square"],char:"๐Ÿšพ",category:"symbols"},parking:{keywords:["cars","blue-square","alphabet","letter"],char:"๐Ÿ…ฟ๏ธ",category:"symbols"},potable_water:{keywords:["blue-square","liquid","restroom","cleaning","faucet"],char:"๐Ÿšฐ",category:"symbols"},mens:{keywords:["toilet","restroom","wc","blue-square","gender","male"],char:"๐Ÿšน",category:"symbols"},womens:{keywords:["purple-square","woman","female","toilet","loo","restroom","gender"],char:"๐Ÿšบ",category:"symbols"},baby_symbol:{keywords:["orange-square","child"],char:"๐Ÿšผ",category:"symbols"},restroom:{keywords:["blue-square","toilet","refresh","wc","gender"],char:"๐Ÿšป",category:"symbols"},put_litter_in_its_place:{keywords:["blue-square","sign","human","info"],char:"๐Ÿšฎ",category:"symbols"},cinema:{keywords:["blue-square","record","film","movie","curtain","stage","theater"],char:"๐ŸŽฆ",category:"symbols"},signal_strength:{keywords:["blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"],char:"๐Ÿ“ถ",category:"symbols"},koko:{keywords:["blue-square","here","katakana","japanese","destination"],char:"๐Ÿˆ",category:"symbols"},ng:{keywords:["blue-square","words","shape","icon"],char:"๐Ÿ†–",category:"symbols"},ok:{keywords:["good","agree","yes","blue-square"],char:"๐Ÿ†—",category:"symbols"},up:{keywords:["blue-square","above","high"],char:"๐Ÿ†™",category:"symbols"},cool:{keywords:["words","blue-square"],char:"๐Ÿ†’",category:"symbols"},new:{keywords:["blue-square","words","start"],char:"๐Ÿ†•",category:"symbols"},free:{keywords:["blue-square","words"],char:"๐Ÿ†“",category:"symbols"},zero:{keywords:["0","numbers","blue-square","null"],char:"0๏ธโƒฃ",category:"symbols"},one:{keywords:["blue-square","numbers","1"],char:"1๏ธโƒฃ",category:"symbols"},two:{keywords:["numbers","2","prime","blue-square"],char:"2๏ธโƒฃ",category:"symbols"},three:{keywords:["3","numbers","prime","blue-square"],char:"3๏ธโƒฃ",category:"symbols"},four:{keywords:["4","numbers","blue-square"],char:"4๏ธโƒฃ",category:"symbols"},five:{keywords:["5","numbers","blue-square","prime"],char:"5๏ธโƒฃ",category:"symbols"},six:{keywords:["6","numbers","blue-square"],char:"6๏ธโƒฃ",category:"symbols"},seven:{keywords:["7","numbers","blue-square","prime"],char:"7๏ธโƒฃ",category:"symbols"},eight:{keywords:["8","blue-square","numbers"],char:"8๏ธโƒฃ",category:"symbols"},nine:{keywords:["blue-square","numbers","9"],char:"9๏ธโƒฃ",category:"symbols"},keycap_ten:{keywords:["numbers","10","blue-square"],char:"๐Ÿ”Ÿ",category:"symbols"},keycap_star:{keywords:["asterisk"],char:"*โƒฃ",category:"symbols"},1234:{keywords:["numbers","blue-square"],char:"๐Ÿ”ข",category:"symbols"},arrow_forward:{keywords:["blue-square","right","direction","play"],char:"โ–ถ๏ธ",category:"symbols"},double_vertical_bar:{keywords:["pause","blue-square"],char:"โธ",category:"symbols"},black_right_pointing_triangle_with_double_vertical_bar:{keywords:["forward","next","blue-square"],char:"โญ",category:"symbols"},black_square_for_stop:{keywords:["blue-square"],char:"โน",category:"symbols"},black_circle_for_record:{keywords:["blue-square"],char:"โบ",category:"symbols"},black_right_pointing_double_triangle_with_vertical_bar:{keywords:["blue-square","play","pause"],char:"โฏ",category:"symbols"},black_left_pointing_double_triangle_with_vertical_bar:{keywords:["backward"],char:"โฎ",category:"symbols"},fast_forward:{keywords:["blue-square","play","speed","continue"],char:"โฉ",category:"symbols"},rewind:{keywords:["play","blue-square"],char:"โช",category:"symbols"},twisted_rightwards_arrows:{keywords:["blue-square","shuffle","music","random"],char:"๐Ÿ”€",category:"symbols"},repeat:{keywords:["loop","record"],char:"๐Ÿ”",category:"symbols"},repeat_one:{keywords:["blue-square","loop"],char:"๐Ÿ”‚",category:"symbols"},arrow_backward:{keywords:["blue-square","left","direction"],char:"โ—€๏ธ",category:"symbols"},arrow_up_small:{keywords:["blue-square","triangle","direction","point","forward","top"],char:"๐Ÿ”ผ",category:"symbols"},arrow_down_small:{keywords:["blue-square","direction","bottom"],char:"๐Ÿ”ฝ",category:"symbols"},arrow_double_up:{keywords:["blue-square","direction","top"],char:"โซ",category:"symbols"},arrow_double_down:{keywords:["blue-square","direction","bottom"],char:"โฌ",category:"symbols"},arrow_right:{keywords:["blue-square","next"],char:"โžก๏ธ",category:"symbols"},arrow_left:{keywords:["blue-square","previous","back"],char:"โฌ…๏ธ",category:"symbols"},arrow_up:{keywords:["blue-square","continue","top","direction"],char:"โฌ†๏ธ",category:"symbols"},arrow_down:{keywords:["blue-square","direction","bottom"],char:"โฌ‡๏ธ",category:"symbols"},arrow_upper_right:{keywords:["blue-square","point","direction","diagonal","northeast"],char:"โ†—๏ธ",category:"symbols"},arrow_lower_right:{keywords:["blue-square","direction","diagonal","southeast"],char:"โ†˜๏ธ",category:"symbols"},arrow_lower_left:{keywords:["blue-square","direction","diagonal","southwest"],char:"โ†™๏ธ",category:"symbols"},arrow_upper_left:{keywords:["blue-square","point","direction","diagonal","northwest"],char:"โ†–๏ธ",category:"symbols"},arrow_up_down:{keywords:["blue-square","direction","way","vertical"],char:"โ†•๏ธ",category:"symbols"},left_right_arrow:{keywords:["shape","direction","horizontal","sideways"],char:"โ†”๏ธ",category:"symbols"},arrows_counterclockwise:{keywords:["blue-square","sync","cycle"],char:"๐Ÿ”„",category:"symbols"},arrow_right_hook:{keywords:["blue-square","return","rotate","direction"],char:"โ†ช๏ธ",category:"symbols"},leftwards_arrow_with_hook:{keywords:["back","return","blue-square","undo","enter"],char:"โ†ฉ๏ธ",category:"symbols"},arrow_heading_up:{keywords:["blue-square","direction","top"],char:"โคด๏ธ",category:"symbols"},arrow_heading_down:{keywords:["blue-square","direction","bottom"],char:"โคต๏ธ",category:"symbols"},hash:{keywords:["symbol","blue-square","twitter"],char:"#๏ธโƒฃ",category:"symbols"},information_source:{keywords:["blue-square","alphabet","letter"],char:"โ„น๏ธ",category:"symbols"},abc:{keywords:["blue-square","alphabet"],char:"๐Ÿ”ค",category:"symbols"},abcd:{keywords:["blue-square","alphabet"],char:"๐Ÿ”ก",category:"symbols"},capital_abcd:{keywords:["alphabet","words","blue-square"],char:"๐Ÿ” ",category:"symbols"},symbols:{keywords:["blue-square","music","note","ampersand","percent","glyphs","characters"],char:"๐Ÿ”ฃ",category:"symbols"},musical_note:{keywords:["score","tone","sound"],char:"๐ŸŽต",category:"symbols"},notes:{keywords:["music","score"],char:"๐ŸŽถ",category:"symbols"},wavy_dash:{keywords:["draw","line","moustache","mustache","squiggle","scribble"],char:"ใ€ฐ๏ธ",category:"symbols"},curly_loop:{keywords:["scribble","draw","shape","squiggle"],char:"โžฐ",category:"symbols"},heavy_check_mark:{keywords:["ok","nike","answer","yes","tick"],char:"โœ”๏ธ",category:"symbols"},arrows_clockwise:{keywords:["sync","cycle","round","repeat"],char:"๐Ÿ”ƒ",category:"symbols"},heavy_plus_sign:{keywords:["math","calculation","addition","more","increase"],char:"โž•",category:"symbols"},heavy_minus_sign:{keywords:["math","calculation","subtract","less"],char:"โž–",category:"symbols"},heavy_division_sign:{keywords:["divide","math","calculation"],char:"โž—",category:"symbols"},heavy_multiplication_x:{keywords:["math","calculation"],char:"โœ–๏ธ",category:"symbols"},heavy_dollar_sign:{keywords:["money","sales","payment","currency","buck"],char:"๐Ÿ’ฒ",category:"symbols"},currency_exchange:{keywords:["money","sales","dollar","travel"],char:"๐Ÿ’ฑ",category:"symbols"},copyright:{keywords:["ip","license","circle","law","legal"],char:"ยฉ๏ธ",category:"symbols"},registered:{keywords:["alphabet","circle"],char:"ยฎ๏ธ",category:"symbols"},tm:{keywords:["trademark","brand","law","legal"],char:"โ„ข๏ธ",category:"symbols"},end:{keywords:["words","arrow"],char:"๐Ÿ”š",category:"symbols"},back:{keywords:["arrow","words","return"],char:"๐Ÿ”™",category:"symbols"},on:{keywords:["arrow","words"],char:"๐Ÿ”›",category:"symbols"},top:{keywords:["words","blue-square"],char:"๐Ÿ”",category:"symbols"},soon:{keywords:["arrow","words"],char:"๐Ÿ”œ",category:"symbols"},ballot_box_with_check:{keywords:["ok","agree","confirm","black-square","vote","election","yes"],char:"โ˜‘๏ธ",category:"symbols"},radio_button:{keywords:["input","old","music","circle"],char:"๐Ÿ”˜",category:"symbols"},white_circle:{keywords:["shape","round"],char:"โšช",category:"symbols"},black_circle:{keywords:["shape","button","round"],char:"โšซ",category:"symbols"},red_circle:{keywords:["shape","error","danger"],char:"๐Ÿ”ด",category:"symbols"},large_blue_circle:{keywords:["shape","icon","button"],char:"๐Ÿ”ต",category:"symbols"},small_orange_diamond:{keywords:["shape","jewel","gem"],char:"๐Ÿ”ธ",category:"symbols"},small_blue_diamond:{keywords:["shape","jewel","gem"],char:"๐Ÿ”น",category:"symbols"},large_orange_diamond:{keywords:["shape","jewel","gem"],char:"๐Ÿ”ถ",category:"symbols"},large_blue_diamond:{keywords:["shape","jewel","gem"],char:"๐Ÿ”ท",category:"symbols"},small_red_triangle:{keywords:["shape","direction","up","top"],char:"๐Ÿ”บ",category:"symbols"},black_small_square:{keywords:["shape","icon"],char:"โ–ช๏ธ",category:"symbols"},white_small_square:{keywords:["shape","icon"],char:"โ–ซ๏ธ",category:"symbols"},black_large_square:{keywords:["shape","icon","button"],char:"โฌ›",category:"symbols"},white_large_square:{keywords:["shape","icon","stone","button"],char:"โฌœ",category:"symbols"},small_red_triangle_down:{keywords:["shape","direction","bottom"],char:"๐Ÿ”ป",category:"symbols"},black_medium_square:{keywords:["shape","button","icon"],char:"โ—ผ๏ธ",category:"symbols"},white_medium_square:{keywords:["shape","stone","icon"],char:"โ—ป๏ธ",category:"symbols"},black_medium_small_square:{keywords:["icon","shape","button"],char:"โ—พ",category:"symbols"},white_medium_small_square:{keywords:["shape","stone","icon","button"],char:"โ—ฝ",category:"symbols"},black_square_button:{keywords:["shape","input","frame"],char:"๐Ÿ”ฒ",category:"symbols"},white_square_button:{keywords:["shape","input"],char:"๐Ÿ”ณ",category:"symbols"},speaker:{keywords:["sound","volume","silence","broadcast"],char:"๐Ÿ”ˆ",category:"symbols"},sound:{keywords:["volume","speaker","broadcast"],char:"๐Ÿ”‰",category:"symbols"},loud_sound:{keywords:["volume","noise","noisy","speaker","broadcast"],char:"๐Ÿ”Š",category:"symbols"},mute:{keywords:["sound","volume","silence","quiet"],char:"๐Ÿ”‡",category:"symbols"},mega:{keywords:["sound","speaker","volume"],char:"๐Ÿ“ฃ",category:"symbols"},loudspeaker:{keywords:["volume","sound"],char:"๐Ÿ“ข",category:"symbols"},bell:{keywords:["sound","notification","christmas","xmas","chime"],char:"๐Ÿ””",category:"symbols"},no_bell:{keywords:["sound","volume","mute","quiet","silent"],char:"๐Ÿ”•",category:"symbols"},black_joker:{keywords:["poker","cards","game","play","magic"],char:"๐Ÿƒ",category:"symbols"},mahjong:{keywords:["game","play","chinese","kanji"],char:"๐Ÿ€„",category:"symbols"},spades:{keywords:["poker","cards","suits","magic"],char:"โ™ ๏ธ",category:"symbols"},clubs:{keywords:["poker","cards","magic","suits"],char:"โ™ฃ๏ธ",category:"symbols"},hearts:{keywords:["poker","cards","magic","suits"],char:"โ™ฅ๏ธ",category:"symbols"},diamonds:{keywords:["poker","cards","magic","suits"],char:"โ™ฆ๏ธ",category:"symbols"},flower_playing_cards:{keywords:["game","sunset","red"],char:"๐ŸŽด",category:"symbols"},thought_balloon:{keywords:["bubble","cloud","speech","thinking"],char:"๐Ÿ’ญ",category:"symbols"},right_anger_bubble:{keywords:["caption","speech","thinking","mad"],char:"๐Ÿ—ฏ",category:"symbols"},speech_balloon:{keywords:["bubble","words","message","talk","chatting"],char:"๐Ÿ’ฌ",category:"symbols"},left_speech_bubble:{keywords:["words","message","talk","chatting"],char:"๐Ÿ—จ",category:"symbols"},clock1:{keywords:["time","late","early","schedule"],char:"๐Ÿ•",category:"symbols"},clock2:{keywords:["time","late","early","schedule"],char:"๐Ÿ•‘",category:"symbols"},clock3:{keywords:["time","late","early","schedule"],char:"๐Ÿ•’",category:"symbols"},clock4:{keywords:["time","late","early","schedule"],char:"๐Ÿ•“",category:"symbols"},clock5:{keywords:["time","late","early","schedule"],char:"๐Ÿ•”",category:"symbols"},clock6:{keywords:["time","late","early","schedule","dawn","dusk"],char:"๐Ÿ••",category:"symbols"},clock7:{keywords:["time","late","early","schedule"],char:"๐Ÿ•–",category:"symbols"},clock8:{keywords:["time","late","early","schedule"],char:"๐Ÿ•—",category:"symbols"},clock9:{keywords:["time","late","early","schedule"],char:"๐Ÿ•˜",category:"symbols"},clock10:{keywords:["time","late","early","schedule"],char:"๐Ÿ•™",category:"symbols"},clock11:{keywords:["time","late","early","schedule"],char:"๐Ÿ•š",category:"symbols"},clock12:{keywords:["time","noon","midnight","midday","late","early","schedule"],char:"๐Ÿ•›",category:"symbols"},clock130:{keywords:["time","late","early","schedule"],char:"๐Ÿ•œ",category:"symbols"},clock230:{keywords:["time","late","early","schedule"],char:"๐Ÿ•",category:"symbols"},clock330:{keywords:["time","late","early","schedule"],char:"๐Ÿ•ž",category:"symbols"},clock430:{keywords:["time","late","early","schedule"],char:"๐Ÿ•Ÿ",category:"symbols"},clock530:{keywords:["time","late","early","schedule"],char:"๐Ÿ• ",category:"symbols"},clock630:{keywords:["time","late","early","schedule"],char:"๐Ÿ•ก",category:"symbols"},clock730:{keywords:["time","late","early","schedule"],char:"๐Ÿ•ข",category:"symbols"},clock830:{keywords:["time","late","early","schedule"],char:"๐Ÿ•ฃ",category:"symbols"},clock930:{keywords:["time","late","early","schedule"],char:"๐Ÿ•ค",category:"symbols"},clock1030:{keywords:["time","late","early","schedule"],char:"๐Ÿ•ฅ",category:"symbols"},clock1130:{keywords:["time","late","early","schedule"],char:"๐Ÿ•ฆ",category:"symbols"},clock1230:{keywords:["time","late","early","schedule"],char:"๐Ÿ•ง",category:"symbols"},af:{keywords:["afghanistan","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ซ",category:"flags"},ax:{keywords:["ร…land","islands","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ฝ",category:"flags"},al:{keywords:["albania","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ฑ",category:"flags"},dz:{keywords:["algeria","flag","nation","country","banner"],char:"๐Ÿ‡ฉ๐Ÿ‡ฟ",category:"flags"},as:{keywords:["american","samoa","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ธ",category:"flags"},ad:{keywords:["andorra","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ฉ",category:"flags"},ao:{keywords:["angola","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ด",category:"flags"},ai:{keywords:["anguilla","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ฎ",category:"flags"},aq:{keywords:["antarctica","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ถ",category:"flags"},ag:{keywords:["antigua","barbuda","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ฌ",category:"flags"},ar:{keywords:["argentina","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ท",category:"flags"},am:{keywords:["armenia","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ฒ",category:"flags"},aw:{keywords:["aruba","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ผ",category:"flags"},au:{keywords:["australia","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡บ",category:"flags"},at:{keywords:["austria","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡น",category:"flags"},az:{keywords:["azerbaijan","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ฟ",category:"flags"},bs:{keywords:["bahamas","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ธ",category:"flags"},bh:{keywords:["bahrain","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ญ",category:"flags"},bd:{keywords:["bangladesh","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ฉ",category:"flags"},bb:{keywords:["barbados","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ง",category:"flags"},by:{keywords:["belarus","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡พ",category:"flags"},be:{keywords:["belgium","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ช",category:"flags"},bz:{keywords:["belize","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ฟ",category:"flags"},bj:{keywords:["benin","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ฏ",category:"flags"},bm:{keywords:["bermuda","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ฒ",category:"flags"},bt:{keywords:["bhutan","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡น",category:"flags"},bo:{keywords:["bolivia","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ด",category:"flags"},bq:{keywords:["bonaire","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ถ",category:"flags"},ba:{keywords:["bosnia","herzegovina","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ฆ",category:"flags"},bw:{keywords:["botswana","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ผ",category:"flags"},br:{keywords:["brazil","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ท",category:"flags"},io:{keywords:["british","indian","ocean","territory","flag","nation","country","banner"],char:"๐Ÿ‡ฎ๐Ÿ‡ด",category:"flags"},vg:{keywords:["british","virgin","islands","bvi","flag","nation","country","banner"],char:"๐Ÿ‡ป๐Ÿ‡ฌ",category:"flags"},bn:{keywords:["brunei","darussalam","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ณ",category:"flags"},bg:{keywords:["bulgaria","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ฌ",category:"flags"},bf:{keywords:["burkina","faso","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ซ",category:"flags"},bi:{keywords:["burundi","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ฎ",category:"flags"},cv:{keywords:["cabo","verde","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ป",category:"flags"},kh:{keywords:["cambodia","flag","nation","country","banner"],char:"๐Ÿ‡ฐ๐Ÿ‡ญ",category:"flags"},cm:{keywords:["cameroon","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ฒ",category:"flags"},ca:{keywords:["canada","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ฆ",category:"flags"},ic:{keywords:["canary","islands","flag","nation","country","banner"],char:"๐Ÿ‡ฎ๐Ÿ‡จ",category:"flags"},ky:{keywords:["cayman","islands","flag","nation","country","banner"],char:"๐Ÿ‡ฐ๐Ÿ‡พ",category:"flags"},cf:{keywords:["central","african","republic","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ซ",category:"flags"},td:{keywords:["chad","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ฉ",category:"flags"},chile:{keywords:["flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ฑ",category:"flags"},cn:{keywords:["china","chinese","prc","flag","country","nation","banner"],char:"๐Ÿ‡จ๐Ÿ‡ณ",category:"flags"},cx:{keywords:["christmas","island","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ฝ",category:"flags"},cc:{keywords:["cocos","keeling","islands","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡จ",category:"flags"},co:{keywords:["colombia","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ด",category:"flags"},km:{keywords:["comoros","flag","nation","country","banner"],char:"๐Ÿ‡ฐ๐Ÿ‡ฒ",category:"flags"},cg:{keywords:["congo","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ฌ",category:"flags"},drc:{keywords:["congo","democratic","republic","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ฉ",category:"flags"},ck:{keywords:["cook","islands","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ฐ",category:"flags"},cr:{keywords:["costa","rica","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ท",category:"flags"},hr:{keywords:["croatia","flag","nation","country","banner"],char:"๐Ÿ‡ญ๐Ÿ‡ท",category:"flags"},cu:{keywords:["cuba","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡บ",category:"flags"},cw:{keywords:["curaรงao","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ผ",category:"flags"},cy:{keywords:["cyprus","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡พ",category:"flags"},cz:{keywords:["czech_republic","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ฟ",category:"flags"},dk:{keywords:["denmark","flag","nation","country","banner"],char:"๐Ÿ‡ฉ๐Ÿ‡ฐ",category:"flags"},dj:{keywords:["djibouti","flag","nation","country","banner"],char:"๐Ÿ‡ฉ๐Ÿ‡ฏ",category:"flags"},dm:{keywords:["dominica","flag","nation","country","banner"],char:"๐Ÿ‡ฉ๐Ÿ‡ฒ",category:"flags"},do:{keywords:["dominican","republic","flag","nation","country","banner"],char:"๐Ÿ‡ฉ๐Ÿ‡ด",category:"flags"},ec:{keywords:["ecuador","flag","nation","country","banner"],char:"๐Ÿ‡ช๐Ÿ‡จ",category:"flags"},eg:{keywords:["egypt","flag","nation","country","banner"],char:"๐Ÿ‡ช๐Ÿ‡ฌ",category:"flags"},sv:{keywords:["el","salvador","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ป",category:"flags"},gq:{keywords:["equatorial","guinea","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ถ",category:"flags"},er:{keywords:["eritrea","flag","nation","country","banner"],char:"๐Ÿ‡ช๐Ÿ‡ท",category:"flags"},ee:{keywords:["estonia","flag","nation","country","banner"],char:"๐Ÿ‡ช๐Ÿ‡ช",category:"flags"},et:{keywords:["ethiopia","flag","nation","country","banner"],char:"๐Ÿ‡ช๐Ÿ‡น",category:"flags"},eu:{keywords:["european","union","flag","banner"],char:"๐Ÿ‡ช๐Ÿ‡บ",category:"flags"},fk:{keywords:["falkland","islands","malvinas","flag","nation","country","banner"],char:"๐Ÿ‡ซ๐Ÿ‡ฐ",category:"flags"},fo:{keywords:["faroe","islands","flag","nation","country","banner"],char:"๐Ÿ‡ซ๐Ÿ‡ด",category:"flags"},fj:{keywords:["fiji","flag","nation","country","banner"],char:"๐Ÿ‡ซ๐Ÿ‡ฏ",category:"flags"},fi:{keywords:["finland","flag","nation","country","banner"],char:"๐Ÿ‡ซ๐Ÿ‡ฎ",category:"flags"},fr:{keywords:["banner","flag","nation","france","french","country"],char:"๐Ÿ‡ซ๐Ÿ‡ท",category:"flags"},gf:{keywords:["french","guiana","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ซ",category:"flags"},pf:{keywords:["french","polynesia","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ซ",category:"flags"},tf:{keywords:["french","southern","territories","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ซ",category:"flags"},ga:{keywords:["gabon","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ฆ",category:"flags"},gm:{keywords:["gambia","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ฒ",category:"flags"},ge:{keywords:["georgia","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ช",category:"flags"},de:{keywords:["german","nation","flag","country","banner"],char:"๐Ÿ‡ฉ๐Ÿ‡ช",category:"flags"},gh:{keywords:["ghana","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ญ",category:"flags"},gi:{keywords:["gibraltar","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ฎ",category:"flags"},gr:{keywords:["greece","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ท",category:"flags"},gl:{keywords:["greenland","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ฑ",category:"flags"},gd:{keywords:["grenada","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ฉ",category:"flags"},gp:{keywords:["guadeloupe","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ต",category:"flags"},gu:{keywords:["guam","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡บ",category:"flags"},gt:{keywords:["guatemala","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡น",category:"flags"},gg:{keywords:["guernsey","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ฌ",category:"flags"},gn:{keywords:["guinea","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ณ",category:"flags"},gw:{keywords:["guinea","bissau","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ผ",category:"flags"},gy:{keywords:["guyana","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡พ",category:"flags"},ht:{keywords:["haiti","flag","nation","country","banner"],char:"๐Ÿ‡ญ๐Ÿ‡น",category:"flags"},hn:{keywords:["honduras","flag","nation","country","banner"],char:"๐Ÿ‡ญ๐Ÿ‡ณ",category:"flags"},hk:{keywords:["hong","kong","flag","nation","country","banner"],char:"๐Ÿ‡ญ๐Ÿ‡ฐ",category:"flags"},hu:{keywords:["hungary","flag","nation","country","banner"],char:"๐Ÿ‡ญ๐Ÿ‡บ",category:"flags"},is:{keywords:["iceland","flag","nation","country","banner"],char:"๐Ÿ‡ฎ๐Ÿ‡ธ",category:"flags"},in:{keywords:["india","flag","nation","country","banner"],char:"๐Ÿ‡ฎ๐Ÿ‡ณ",category:"flags"},indonesia:{keywords:["flag","nation","country","banner"],char:"๐Ÿ‡ฎ๐Ÿ‡ฉ",category:"flags"},ir:{keywords:["iran,","islamic","republic","flag","nation","country","banner"],char:"๐Ÿ‡ฎ๐Ÿ‡ท",category:"flags"},iq:{keywords:["iraq","flag","nation","country","banner"],char:"๐Ÿ‡ฎ๐Ÿ‡ถ",category:"flags"},ie:{keywords:["ireland","flag","nation","country","banner"],char:"๐Ÿ‡ฎ๐Ÿ‡ช",category:"flags"},im:{keywords:["isle","man","flag","nation","country","banner"],char:"๐Ÿ‡ฎ๐Ÿ‡ฒ",category:"flags"},il:{keywords:["israel","flag","nation","country","banner"],char:"๐Ÿ‡ฎ๐Ÿ‡ฑ",category:"flags"},it:{keywords:["italy","flag","nation","country","banner"],char:"๐Ÿ‡ฎ๐Ÿ‡น",category:"flags"},ci:{keywords:["ivory","coast","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ฎ",category:"flags"},jm:{keywords:["jamaica","flag","nation","country","banner"],char:"๐Ÿ‡ฏ๐Ÿ‡ฒ",category:"flags"},jp:{keywords:["japanese","nation","flag","country","banner"],char:"๐Ÿ‡ฏ๐Ÿ‡ต",category:"flags"},je:{keywords:["jersey","flag","nation","country","banner"],char:"๐Ÿ‡ฏ๐Ÿ‡ช",category:"flags"},jo:{keywords:["jordan","flag","nation","country","banner"],char:"๐Ÿ‡ฏ๐Ÿ‡ด",category:"flags"},kz:{keywords:["kazakhstan","flag","nation","country","banner"],char:"๐Ÿ‡ฐ๐Ÿ‡ฟ",category:"flags"},ke:{keywords:["kenya","flag","nation","country","banner"],char:"๐Ÿ‡ฐ๐Ÿ‡ช",category:"flags"},ki:{keywords:["kiribati","flag","nation","country","banner"],char:"๐Ÿ‡ฐ๐Ÿ‡ฎ",category:"flags"},xk:{keywords:["kosovo","flag","nation","country","banner"],char:"๐Ÿ‡ฝ๐Ÿ‡ฐ",category:"flags"},kw:{keywords:["kuwait","flag","nation","country","banner"],char:"๐Ÿ‡ฐ๐Ÿ‡ผ",category:"flags"},kg:{keywords:["kyrgyzstan","flag","nation","country","banner"],char:"๐Ÿ‡ฐ๐Ÿ‡ฌ",category:"flags"},la:{keywords:["lao","democratic","republic","flag","nation","country","banner"],char:"๐Ÿ‡ฑ๐Ÿ‡ฆ",category:"flags"},lv:{keywords:["latvia","flag","nation","country","banner"],char:"๐Ÿ‡ฑ๐Ÿ‡ป",category:"flags"},lb:{keywords:["lebanon","flag","nation","country","banner"],char:"๐Ÿ‡ฑ๐Ÿ‡ง",category:"flags"},ls:{keywords:["lesotho","flag","nation","country","banner"],char:"๐Ÿ‡ฑ๐Ÿ‡ธ",category:"flags"},lr:{keywords:["liberia","flag","nation","country","banner"],char:"๐Ÿ‡ฑ๐Ÿ‡ท",category:"flags"},ly:{keywords:["libya","flag","nation","country","banner"],char:"๐Ÿ‡ฑ๐Ÿ‡พ",category:"flags"},li:{keywords:["liechtenstein","flag","nation","country","banner"],char:"๐Ÿ‡ฑ๐Ÿ‡ฎ",category:"flags"},lt:{keywords:["lithuania","flag","nation","country","banner"],char:"๐Ÿ‡ฑ๐Ÿ‡น",category:"flags"},lu:{keywords:["luxembourg","flag","nation","country","banner"],char:"๐Ÿ‡ฑ๐Ÿ‡บ",category:"flags"},mo:{keywords:["macao","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ด",category:"flags"},mk:{keywords:["macedonia,","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ฐ",category:"flags"},mg:{keywords:["madagascar","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ฌ",category:"flags"},mw:{keywords:["malawi","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ผ",category:"flags"},my:{keywords:["malaysia","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡พ",category:"flags"},mv:{keywords:["maldives","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ป",category:"flags"},ml:{keywords:["mali","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ฑ",category:"flags"},mt:{keywords:["malta","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡น",category:"flags"},mh:{keywords:["marshall","islands","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ญ",category:"flags"},mq:{keywords:["martinique","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ถ",category:"flags"},mr:{keywords:["mauritania","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ท",category:"flags"},mu:{keywords:["mauritius","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡บ",category:"flags"},yt:{keywords:["mayotte","flag","nation","country","banner"],char:"๐Ÿ‡พ๐Ÿ‡น",category:"flags"},mx:{keywords:["mexico","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ฝ",category:"flags"},fm:{keywords:["micronesia,","federated","states","flag","nation","country","banner"],char:"๐Ÿ‡ซ๐Ÿ‡ฒ",category:"flags"},md:{keywords:["moldova,","republic","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ฉ",category:"flags"},mc:{keywords:["monaco","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡จ",category:"flags"},mn:{keywords:["mongolia","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ณ",category:"flags"},me:{keywords:["montenegro","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ช",category:"flags"},ms:{keywords:["montserrat","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ธ",category:"flags"},ma:{keywords:["morocco","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ฆ",category:"flags"},mz:{keywords:["mozambique","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ฟ",category:"flags"},mm:{keywords:["myanmar","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ฒ",category:"flags"},na:{keywords:["namibia","flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡ฆ",category:"flags"},nr:{keywords:["nauru","flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡ท",category:"flags"},np:{keywords:["nepal","flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡ต",category:"flags"},nl:{keywords:["netherlands","flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡ฑ",category:"flags"},nc:{keywords:["new","caledonia","flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡จ",category:"flags"},nz:{keywords:["new","zealand","flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡ฟ",category:"flags"},ni:{keywords:["nicaragua","flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡ฎ",category:"flags"},ne:{keywords:["niger","flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡ช",category:"flags"},nigeria:{keywords:["flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡ฌ",category:"flags"},nu:{keywords:["niue","flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡บ",category:"flags"},nf:{keywords:["norfolk","island","flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡ซ",category:"flags"},mp:{keywords:["northern","mariana","islands","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ต",category:"flags"},kp:{keywords:["north","korea","nation","flag","country","banner"],char:"๐Ÿ‡ฐ๐Ÿ‡ต",category:"flags"},no:{keywords:["norway","flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡ด",category:"flags"},om:{keywords:["oman","flag","nation","country","banner"],char:"๐Ÿ‡ด๐Ÿ‡ฒ",category:"flags"},pk:{keywords:["pakistan","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ฐ",category:"flags"},pw:{keywords:["palau","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ผ",category:"flags"},ps:{keywords:["palestine","palestinian","territories","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ธ",category:"flags"},pa:{keywords:["panama","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ฆ",category:"flags"},pg:{keywords:["papua","new","guinea","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ฌ",category:"flags"},py:{keywords:["paraguay","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡พ",category:"flags"},pe:{keywords:["peru","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ช",category:"flags"},ph:{keywords:["philippines","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ญ",category:"flags"},pn:{keywords:["pitcairn","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ณ",category:"flags"},pl:{keywords:["poland","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ฑ",category:"flags"},pt:{keywords:["portugal","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡น",category:"flags"},pr:{keywords:["puerto","rico","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ท",category:"flags"},qa:{keywords:["qatar","flag","nation","country","banner"],char:"๐Ÿ‡ถ๐Ÿ‡ฆ",category:"flags"},re:{keywords:["rรฉunion","flag","nation","country","banner"],char:"๐Ÿ‡ท๐Ÿ‡ช",category:"flags"},ro:{keywords:["romania","flag","nation","country","banner"],char:"๐Ÿ‡ท๐Ÿ‡ด",category:"flags"},ru:{keywords:["russian","federation","flag","nation","country","banner"],char:"๐Ÿ‡ท๐Ÿ‡บ",category:"flags"},rw:{keywords:["rwanda","flag","nation","country","banner"],char:"๐Ÿ‡ท๐Ÿ‡ผ",category:"flags"},bl:{keywords:["saint","barthรฉlemy","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ฑ",category:"flags"},sh:{keywords:["saint","helena","ascension","tristan","cunha","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ญ",category:"flags"},kn:{keywords:["saint","kitts","nevis","flag","nation","country","banner"],char:"๐Ÿ‡ฐ๐Ÿ‡ณ",category:"flags"},lc:{keywords:["saint","lucia","flag","nation","country","banner"],char:"๐Ÿ‡ฑ๐Ÿ‡จ",category:"flags"},pm:{keywords:["saint","pierre","miquelon","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ฒ",category:"flags"},vc:{keywords:["saint","vincent","grenadines","flag","nation","country","banner"],char:"๐Ÿ‡ป๐Ÿ‡จ",category:"flags"},ws:{keywords:["samoa","flag","nation","country","banner"],char:"๐Ÿ‡ผ๐Ÿ‡ธ",category:"flags"},sm:{keywords:["san","marino","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ฒ",category:"flags"},st:{keywords:["sao","tome","principe","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡น",category:"flags"},saudi_arabia:{keywords:["flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ฆ",category:"flags"},sn:{keywords:["senegal","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ณ",category:"flags"},rs:{keywords:["serbia","flag","nation","country","banner"],char:"๐Ÿ‡ท๐Ÿ‡ธ",category:"flags"},sc:{keywords:["seychelles","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡จ",category:"flags"},sl:{keywords:["sierra","leone","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ฑ",category:"flags"},sg:{keywords:["singapore","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ฌ",category:"flags"},sx:{keywords:["sint","maarten","dutch","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ฝ",category:"flags"},sk:{keywords:["slovakia","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ฐ",category:"flags"},si:{keywords:["slovenia","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ฎ",category:"flags"},sb:{keywords:["solomon","islands","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ง",category:"flags"},so:{keywords:["somalia","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ด",category:"flags"},za:{keywords:["south","africa","flag","nation","country","banner"],char:"๐Ÿ‡ฟ๐Ÿ‡ฆ",category:"flags"},gs:{keywords:["south","georgia","sandwich","islands","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ธ",category:"flags"},kr:{keywords:["south","korea","nation","flag","country","banner"],char:"๐Ÿ‡ฐ๐Ÿ‡ท",category:"flags"},ss:{keywords:["south","sudan","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ธ",category:"flags"},es:{keywords:["spain","flag","nation","country","banner"],char:"๐Ÿ‡ช๐Ÿ‡ธ",category:"flags"},lk:{keywords:["sri","lanka","flag","nation","country","banner"],char:"๐Ÿ‡ฑ๐Ÿ‡ฐ",category:"flags"},sd:{keywords:["sudan","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ฉ",category:"flags"},sr:{keywords:["suriname","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ท",category:"flags"},sz:{keywords:["swaziland","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ฟ",category:"flags"},se:{keywords:["sweden","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ช",category:"flags"},ch:{keywords:["switzerland","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ญ",category:"flags"},sy:{keywords:["syrian","arab","republic","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡พ",category:"flags"},tw:{keywords:["taiwan","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ผ",category:"flags"},tj:{keywords:["tajikistan","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ฏ",category:"flags"},tz:{keywords:["tanzania,","united","republic","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ฟ",category:"flags"},th:{keywords:["thailand","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ญ",category:"flags"},tl:{keywords:["timor","leste","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ฑ",category:"flags"},tg:{keywords:["togo","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ฌ",category:"flags"},tk:{keywords:["tokelau","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ฐ",category:"flags"},to:{keywords:["tonga","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ด",category:"flags"},tt:{keywords:["trinidad","tobago","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡น",category:"flags"},tn:{keywords:["tunisia","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ณ",category:"flags"},tr:{keywords:["turkey","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ท",category:"flags"},turkmenistan:{keywords:["flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ฒ",category:"flags"},tc:{keywords:["turks","caicos","islands","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡จ",category:"flags"},tuvalu:{keywords:["flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ป",category:"flags"},ug:{keywords:["uganda","flag","nation","country","banner"],char:"๐Ÿ‡บ๐Ÿ‡ฌ",category:"flags"},ua:{keywords:["ukraine","flag","nation","country","banner"],char:"๐Ÿ‡บ๐Ÿ‡ฆ",category:"flags"},ae:{keywords:["united","arab","emirates","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ช",category:"flags"},gb:{keywords:["united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"],char:"๐Ÿ‡ฌ๐Ÿ‡ง",category:"flags"},us:{keywords:["united","states","america","flag","nation","country","banner"],char:"๐Ÿ‡บ๐Ÿ‡ธ",category:"flags"},vi:{keywords:["virgin","islands","us","flag","nation","country","banner"],char:"๐Ÿ‡ป๐Ÿ‡ฎ",category:"flags"},uy:{keywords:["uruguay","flag","nation","country","banner"],char:"๐Ÿ‡บ๐Ÿ‡พ",category:"flags"},uz:{keywords:["uzbekistan","flag","nation","country","banner"],char:"๐Ÿ‡บ๐Ÿ‡ฟ",category:"flags"},vu:{keywords:["vanuatu","flag","nation","country","banner"],char:"๐Ÿ‡ป๐Ÿ‡บ",category:"flags"},va:{keywords:["vatican","city","flag","nation","country","banner"],char:"๐Ÿ‡ป๐Ÿ‡ฆ",category:"flags"},ve:{keywords:["venezuela","bolivarian","republic","flag","nation","country","banner"],char:"๐Ÿ‡ป๐Ÿ‡ช",category:"flags"},vn:{keywords:["viet","nam","flag","nation","country","banner"],char:"๐Ÿ‡ป๐Ÿ‡ณ",category:"flags"},wf:{keywords:["wallis","futuna","flag","nation","country","banner"],char:"๐Ÿ‡ผ๐Ÿ‡ซ",category:"flags"},eh:{keywords:["western","sahara","flag","nation","country","banner"],char:"๐Ÿ‡ช๐Ÿ‡ญ",category:"flags"},ye:{keywords:["yemen","flag","nation","country","banner"],char:"๐Ÿ‡พ๐Ÿ‡ช",category:"flags"},zm:{keywords:["zambia","flag","nation","country","banner"],char:"๐Ÿ‡ฟ๐Ÿ‡ฒ",category:"flags"},zw:{keywords:["zimbabwe","flag","nation","country","banner"],char:"๐Ÿ‡ฟ๐Ÿ‡ผ",category:"flags"},octocat:{keywords:["animal","octopus","github","custom_"],char:null,category:"_custom"},shipit:{keywords:["squirrel","detective","animal","sherlock","inspector","custom_"],char:null,category:"_custom"},bowtie:{keywords:["face","formal","fashion","suit","classy","magic","circus"],char:null,category:"_custom"},neckbeard:{keywords:["nerdy","face","custom_"],char:null,category:"_custom"},metal:{keywords:["fingers","rocknroll","concert","band","custom_"],char:null,category:"_custom"},fu:{keywords:["fuck","finger","dislike","thumbsdown","disapprove","no","custom_"],char:null,category:"_custom"},trollface:{keywords:["internet","meme","custom_"],char:null,category:"_custom"},godmode:{keywords:["doom","oldschool"],char:null,category:"_custom"},goberserk:{keywords:["doom","rage","bloody","hurt"],char:null,category:"_custom"},finnadie:{keywords:["doom","oldschool"],char:null,category:"_custom"},feelsgood:{keywords:["doom","oldschool"],char:null,category:"_custom"},rage1:{keywords:["angry","mad","hate","despise"],char:null,category:"_custom"},rage2:{keywords:["angry","mad","hate","despise"],char:null,category:"_custom"},rage3:{keywords:["angry","mad","hate","despise"],char:null,category:"_custom"},rage4:{keywords:["angry","mad","hate","despise"],char:null,category:"_custom"},suspect:{keywords:["mad","custom_"],char:null,category:"_custom"},hurtrealbad:{keywords:["mad","injured","doom","oldschool","custom_"],char:null,category:"_custom"}},B=function(){function e(e){this.sanitizer=e,this.activeCategory="people",this.searchResults=[],this.searchVisible=!1,this.selected=new t.Subject}return Object.defineProperty(e.prototype,"searchQuery",{get:function(){return this._searchQuery},set:function(e){var t=this;this._searchQuery=e,setTimeout((function(){t.searchResults=Object.keys($).filter((function(t){return t.includes(e)})).map((function(e){return $[e]})),t.searchResults.splice(50,t.searchResults.length),console.log("looking for '"+e+"' => "+t.searchResults.length+" results")}))},enumerable:!1,configurable:!0}),e.prototype.humanize=function(e){return e.replace(/(^| )[a-z]/g,(function(e){return e.toUpperCase()})).replace(/_/g," ")},e.prototype.select=function(e){this.selected.next(e)},e.prototype.pairs=function(e){return Object.keys(e).map((function(t){return[t,e[t]]}))},e.prototype.hideSearch=function(){var e=this;setTimeout((function(){e.searchVisible=!1}))},e.prototype.showSearch=function(){var e=this;setTimeout((function(){e.searchVisible=!0}))},e.prototype.ngOnInit=function(){var e,t,r={},a={symbols:"warning",people:"people",animals_and_nature:"nature",travel_and_places:"location_on",activity:"local_activity",food_and_drink:"restaurant",objects:"computer",flags:"flag"};try{for(var n=U(this.pairs($)),o=n.next();!o.done;o=n.next()){var s=o.value,i=(s[0],s[1]);r[i.category]||(r[i.category]={name:i.category,icon:a[i.category]||"code",emojis:[]}),i.html=this.sanitizer.bypassSecurityTrustHtml(twemoji.parse(i.char||"")),r[i.category].emojis.push(i)}}catch(t){e={error:t}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(e)throw e.error}}this.categories=this.pairs(r).map((function(e){return e[1]}))},e}();B.decorators=[{type:a.Component,args:[{selector:"emoji-selector-panel",template:'<div class="search-box" *ngIf="searchVisible">\r\n\t<a mat-icon-button href="javascript:;" (click)="hideSearch()">\r\n\t\t<mat-icon>arrow_back</mat-icon>\r\n\t</a>\r\n\t<mat-form-field appearance="outline" floatLabel="always">\r\n\t\t<mat-label>Search for emoji</mat-label>\r\n\t\t<input name="search" type="text" matInput placeholder="Start typing" [(ngModel)]="searchQuery" />\r\n\t</mat-form-field>\r\n</div>\r\n\r\n<div class="selector">\r\n\t<ng-container *ngIf="searchVisible">\r\n\t\t<div class="emoji-list">\r\n\t\t\t<a href="javascript:;" (click)="select(emoji.char)" \r\n\t\t\t\t*ngFor="let emoji of searchResults" [innerHtml]="emoji.html || \'\'">\r\n\t\t\t</a>\r\n\t\t</div>\r\n\t</ng-container>\r\n\t<ng-container *ngIf="!searchVisible">\r\n\t\t<div class="categories">\r\n\t\t\t<ng-container *ngIf="!searchVisible">\r\n\t\t\t\t<a [title]="humanize(category.name)" [class.active]="activeCategory === category.name" mat-icon-button *ngFor="let category of categories" (click)="activeCategory = category.name">\r\n\t\t\t\t\t<mat-icon>{{category.icon}}</mat-icon>\r\n\t\t\t\t</a>\r\n\r\n\t\t\t\t<a title="Search" [class.active] mat-icon-button (click)="showSearch()">\r\n\t\t\t\t\t<mat-icon>search</mat-icon>\r\n\t\t\t\t</a>\r\n\t\t\t</ng-container>\r\n\t\t</div>\r\n\t\t<ng-container *ngFor="let category of categories">\r\n\t\t\t<div class="emoji-list" *ngIf="activeCategory && activeCategory == category.name">\r\n\t\t\t\t<a href="javascript:;" (click)="select(emoji.char)" \r\n\t\t\t\t\t*ngFor="let emoji of category.emojis" [innerHtml]="emoji.html || \'\'">\r\n\t\t\t\t</a>\r\n\t\t\t</div>\r\n\t\t</ng-container>\r\n\t</ng-container>\r\n</div>',styles:[":host{background:#111;color:#fff;border:1px solid #333;border-radius:5px;padding:.5em;width:calc(9*(32px + 1em));max-width:calc(100vw - 1.5em - 5px)}.selector{display:flex;flex-direction:column}.categories a{opacity:.25;transition:opacity .4s ease-in-out}.categories a:hover{opacity:.5}.categories a.active{opacity:1}.emoji-list{flex-grow:1;overflow-y:auto;height:20em}.emoji-list a{display:inline-block;padding:2px;margin:4px;background-color:#111}.emoji-list a ::ng-deep .emoji{width:32px;height:32px}.emoji-list a:hover{background-color:#333}.search-box{display:flex;align-items:baseline}.search-box mat-form-field{flex-grow:1}@media (max-width:500px){.selector{flex-direction:row;height:27em}.emoji-list{height:auto}}:host-context(.banta-mobile) .selector{flex-direction:row;height:27em}:host-context(.banta-mobile) .emoji-list{height:auto}"]}]}],B.ctorParameters=function(){return[{type:s.DomSanitizer}]},B.propDecorators={selected:[{type:a.Output}]};var N=function(){function e(e,r){this.elementRef=e,this.overlay=r,this._selected=new t.Subject,this.showEmojiPanel=!1,this.overlayX="end",this.overlayY="top"}return Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isOpen",{get:function(){return this.overlayRef},enumerable:!1,configurable:!0}),e.prototype.insert=function(e){this._selected.next(e)},e.prototype.close=function(){if(this.overlayRef)return this.overlayRef.dispose(),void(this.overlayRef=null)},e.prototype.show=function(){var e=this;this.isOpen&&this.close(),this.overlayRef=this.overlay.create({positionStrategy:this.overlay.position().flexibleConnectedTo(this.elementRef).withPositions([{originX:"end",originY:"bottom",overlayX:this.overlayX,overlayY:this.overlayY}]).withFlexibleDimensions(!0),hasBackdrop:!0,disposeOnNavigation:!0,scrollStrategy:this.overlay.scrollStrategies.reposition({autoClose:!0})}),this.overlayRef.backdropClick().subscribe((function(){e.close()})),this.overlayRef.keydownEvents().subscribe((function(t){"Escape"===t.key&&e.close()})),this.overlayRef.attach(this.selectorPanelTemplate)},e}();N.decorators=[{type:a.Component,args:[{selector:"emoji-selector-button",template:'\n <button #button type="button" mat-icon-button (click)="show()">\n <mat-icon>emoji_emotions</mat-icon>\n </button>\n <ng-template cdkPortal #selectorPanelTemplate="cdkPortal">\n <emoji-selector-panel \n #panel\n (selected)="insert($event)"\n ></emoji-selector-panel>\n </ng-template>\n ',styles:["\n :host {\n display: block;\n position: relative;\n }\n\n button {\n color: #666\n }\n "]}]}],N.ctorParameters=function(){return[{type:a.ElementRef},{type:u.Overlay}]},N.propDecorators={selectorPanelTemplate:[{type:a.ViewChild,args:["selectorPanelTemplate"]}],selected:[{type:a.Output}],overlayX:[{type:a.Input}],overlayY:[{type:a.Input}]};var H=[B,N],W=function(){};W.decorators=[{type:a.NgModule,args:[{declarations:H,imports:[i.CommonModule,y.FormsModule,c.MatIconModule,d.MatButtonModule,h.MatFormFieldModule,g.MatInputModule,u.OverlayModule,p.PortalModule],exports:H}]}];var Y=function(){function e(){this._userChanged=new t.BehaviorSubject(null),this._attachmentScrapers=[],this._attachmentResolvers=[]}return Object.defineProperty(e.prototype,"userChanged",{get:function(){return this._userChanged},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"user",{get:function(){return this._user},set:function(e){this._user=e,this._userChanged.next(e)},enumerable:!1,configurable:!0}),e.prototype.registerAttachmentScraper=function(e){this._attachmentScrapers.push(e)},e.prototype.registerAttachmentResolver=function(e){this._attachmentResolvers.push(e)},Object.defineProperty(e.prototype,"attachmentScrapers",{get:function(){return this._attachmentScrapers.slice()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"attachmentResolvers",{get:function(){return this._attachmentResolvers.slice()},enumerable:!1,configurable:!0}),e}(),K=function(){function e(e,r){this.backend=e,this.matDialog=r,this._subs=new t.Subscription,this.auxOpen=!1,this.auxTitle="Notifications",this.auxMode="notifications",this.mobileFocus=null,this.newNotifications=!1,this.chatLabel="Chat",this.commentsLabel="Comments",this._signInSelected=new t.Subject,this.pointOpen=null,this.pointSubChat=null,this.newPointSubMessage={},this.genericAvatarUrl="https://gravatar.com/avatar/915c804e0be607a4ad766ddadea5c48a?s=512&d=https://codepen.io/assets/avatars/user-avatar-512x512-6e240cf350d2f1cc07c2bed234c3a3bb5f1b237023c204c782622e80d6b212ba.png"}return e.prototype.ngOnInit=function(){var e=this;this._subs.add(this.backend.userChanged.subscribe((function(t){return e.currentUser=t}))),this._subs.add(this.backend.notificationsChanged.subscribe((function(t){return e.notifications=t}))),this._subs.add(this.backend.newNotification.subscribe((function(t){e.newNotifications=!0})))},e.prototype.sendPointSubMessage=function(){return D(this,void 0,void 0,(function(){var e,t,r;return R(this,(function(a){switch(a.label){case 0:if(e=(this.newPointSubMessage.message||"").trim(),this.newPointSubMessage.message="",""===e)return[2];t={user:null,sentAt:Date.now(),likes:0,message:e},a.label=1;case 1:return a.trys.push([1,3,,4]),[4,this.pointSubChat.send(t)];case 2:return a.sent(),[3,4];case 3:return r=a.sent(),console.error("Failed to send point sub-message:"),console.error(r),[3,4];case 4:return[2]}}))}))},e.prototype.goToMessage=function(e){return D(this,void 0,void 0,(function(){var t,r,a,n,o,s;return R(this,(function(i){switch(i.label){case 0:if(t=e,!e.parentMessageId)return[3,5];r=void 0,i.label=1;case 1:return i.trys.push([1,3,,4]),[4,this.backend.getMessage(e.topicId,e.parentMessageId)];case 2:return r=i.sent(),[3,4];case 3:return a=i.sent(),console.error("Received exception while fetching parent message:"),console.error(a),[3,4];case 4:if(!r)return console.error("Failed to look up parent message "+e.topicId+"/"+e.parentMessageId),console.error("Original message was:"),console.dir(t),[2];e=r,i.label=5;case 5:return"comment"!==(n=this.getViewType(e))?[3,8]:(this.pointSubChat&&(this.pointSubChat.close&&this.pointSubChat.close(),this.pointSubChat=null),this.mobileFocus="points",this.pointOpen=e,o=this,[4,this.backend.getSourceForThread(e.topicId,e.id)]);case 6:return o.pointSubChat=i.sent(),s=this,[4,this.backend.refreshMessage(e)];case 7:return s.pointOpen=i.sent(),this.newPointSubMessage={},[3,9];case 8:"chat"===n&&(this.mobileFocus="firehose",this.firehose.jumpToMessage(e)),i.label=9;case 9:return[2]}}))}))},e.prototype.pointUnfocus=function(){this.pointOpen=null,this.pointSubChat&&(this.pointSubChat.close&&this.pointSubChat.close(),this.pointSubChat=null)},e.prototype.ngOnDestroy=function(){this._subs.unsubscribe()},e.prototype.showAux=function(e,t){this.auxOpen=!0,this.auxTitle=e,this.auxMode=t,this.mobileFocus="aux"},e.prototype.showNotifications=function(){this.showAux("Notifications","notifications")},Object.defineProperty(e.prototype,"topicID",{get:function(){return this._topicID},set:function(e){this._topicID=e,this.close(),this.connectToTopic(this._topicID)},enumerable:!1,configurable:!0}),e.prototype.connectToTopic=function(e){return D(this,void 0,void 0,(function(){var t,r;return R(this,(function(a){switch(a.label){case 0:return t=this,[4,this.backend.getSourceForTopic(e+"_firehose")];case 1:return t.firehoseSource=a.sent(),r=this,[4,this.backend.getSourceForTopic(e+"_thepoint")];case 2:return r.pointSource=a.sent(),[2]}}))}))},Object.defineProperty(e.prototype,"signInSelected",{get:function(){return this._signInSelected},enumerable:!1,configurable:!0}),e.prototype.showSignIn=function(){this._signInSelected.next()},e.prototype.close=function(){this.firehoseSource&&(this.firehoseSource.close&&this.firehoseSource.close(),this.firehoseSource=null),this.pointSource&&(this.pointSource.close&&this.pointSource.close(),this.pointSource=null)},Object.defineProperty(e.prototype,"hasPoint",{get:function(){return null!=this.pointOpen},enumerable:!1,configurable:!0}),e.prototype.closeAux=function(){this.auxOpen=!1,this.mobileFocus="firehose"},e.prototype.getViewType=function(e){return e.topicId.endsWith("_firehose")?"chat":(e.topicId.endsWith("_thepoint"),"comment")},e.prototype.upvoteMessage=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(e){return[2]}))}))},e.prototype.showProfile=function(e){this.profileUser=e,this.showAux("@"+e.username+"'s Profile","profile")},e.prototype.sendReport=function(e){this.auxOpen=!1,alert("would send report")},e.prototype.reportMessage=function(e){this.reportedMessage=e,this.showAux("Report message from @"+e.user.username,"report")},e}();K.decorators=[{type:a.Component,args:[{selector:"banta",template:'\r\n<mat-menu #userMenu="matMenu">\r\n <ng-container *ngIf="currentUser">\r\n <button [disabled]="true" mat-menu-item>{{currentUser.displayName}} (@{{currentUser.username}})</button>\r\n <button mat-menu-item (click)="signOut()">Sign Out</button>\r\n </ng-container>\r\n <ng-container *ngIf="!currentUser">\r\n <button mat-menu-item>Sign In</button>\r\n </ng-container>\r\n <button mat-menu-item>Help</button>\r\n</mat-menu>\r\n\r\n<div class="tabs">\r\n <div>\r\n <a mat-button (click)="mobileFocus = \'chat\'">{{chatLabel}}</a>\r\n <a mat-button (click)="mobileFocus = \'comments\'">{{commentsLabel}}</a>\r\n </div>\r\n <div class="spacer"></div>\r\n <div>\r\n <ng-container *ngIf="currentUser">\r\n <button mat-button [matMenuTriggerFor]="userMenu">\r\n @{{currentUser.username}}\r\n </button>\r\n <button mat-icon-button (click)="showNotifications()">\r\n <mat-icon>notification_important</mat-icon>\r\n </button>\r\n </ng-container>\r\n \r\n <button mat-button *ngIf="!currentUser" (click)="showSignIn()">\r\n Sign In\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<div class="firehose" [class.focus]="mobileFocus === \'chat\'">\r\n <header>\r\n <div>\r\n <label (click)="mobileFocus = \'chat\'">{{chatLabel}}</label>\r\n <div class="spacer"></div>\r\n\r\n <ng-container *ngIf="currentUser">\r\n <button mat-button [matMenuTriggerFor]="userMenu">\r\n @{{currentUser.username}}\r\n </button>\r\n <button mat-icon-button (click)="showNotifications()">\r\n <mat-icon>notification_important</mat-icon>\r\n </button>\r\n </ng-container>\r\n \r\n <button mat-button *ngIf="!currentUser" (click)="showSignIn()">\r\n Sign In\r\n </button>\r\n </div>\r\n </header>\r\n <banta-chat \r\n #firehose\r\n [source]="firehoseSource"\r\n (signInSelected)="showSignIn()"\r\n (upvoted)="upvoteMessage($event)"\r\n (userSelected)="showProfile($event.user)"\r\n (reported)="reportMessage($event)"\r\n ></banta-chat>\r\n</div>\r\n\r\n<div class="aux" [class.focus]="mobileFocus === \'aux\'" [class.open]="auxOpen">\r\n <header>\r\n <div>\r\n <label>{{auxTitle}}</label>\r\n <div class="spacer"></div>\r\n <button mat-icon-button (click)="auxOpen = false">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </header>\r\n <div class="aux-contents">\r\n <ng-container *ngIf="auxMode === \'profile\'">\r\n <ng-container *ngIf="profileUser">\r\n\r\n <div>\r\n <strong style="font-size: 125%;">\r\n {{profileUser.displayName}}\r\n </strong>\r\n @{{profileUser.username}}\r\n </div>\r\n\r\n <br/>\r\n <strong>Top Messages</strong>\r\n\r\n <div>\r\n <em>Not yet available</em>\r\n </div>\r\n\r\n <br/>\r\n <strong>Recent Messages</strong>\r\n\r\n <div>\r\n <em>Not yet available</em>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf="auxMode === \'report\'">\r\n <p>Are you sure you want to report this message?</p>\r\n\r\n <banta-live-message [message]="reportedMessage"></banta-live-message>\r\n\r\n <div style="text-align: center;">\r\n <button mat-raised-button color="primary" (click)="sendReport(reportedMessage)">Yes, Report</button>\r\n &nbsp;\r\n <button mat-raised-button color="secondary" (click)="auxOpen = false">No, Cancel</button>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n <ng-container *ngIf="auxMode === \'notifications\'">\r\n\r\n <div *ngIf="!notifications || notifications.length === 0">\r\n <em>You do not have any notifications yet</em>\r\n </div>\r\n \r\n <div class="notifications">\r\n <div class="notification" *ngFor="let notif of notifications">\r\n <div>\r\n <ng-container *ngIf="notif.type === \'upvote\'">\r\n @{{notif.message?.user?.username}} upvoted your post\r\n \r\n <banta-live-message\r\n [message]="notif.message"\r\n (upvoted)="upvoteMessage(notif.message)"\r\n (reported)="reportMessage(notif.message)"\r\n (selected)="goToMessage(notif.message)">\r\n </banta-live-message>\r\n\r\n </ng-container>\r\n <ng-container *ngIf="notif.type === \'notice\'">\r\n <div>\r\n {{notif.message}}\r\n </div>\r\n <a mat-button target="_blank" href="{{notif.actionUrl}}">\r\n {{notif.actionLabel}}\r\n </a>\r\n </ng-container>\r\n <ng-container *ngIf="notif.type === \'mention\'">\r\n You were mentioned by @{{notif.message?.user?.username}}\r\n\r\n <banta-live-message\r\n [message]="notif.message"\r\n (upvoted)="upvoteMessage(notif.message)"\r\n (reported)="reportMessage(notif.message)"\r\n (selected)="goToMessage(notif.message)">\r\n </banta-live-message>\r\n\r\n </ng-container>\r\n <ng-container *ngIf="notif.type === \'reply\'">\r\n @{{notif.replyMessage?.user?.username}} replied to your post\r\n \r\n <banta-live-message\r\n [message]="notif.replyMessage"\r\n (upvoted)="upvoteMessage(notif.replyMessage)"\r\n (reported)="reportMessage(notif.replyMessage)"\r\n (selected)="goToMessage(notif.replyMessage)">\r\n </banta-live-message>\r\n </ng-container>\r\n </div>\r\n\r\n <banta-timestamp [value]="notif.sentAt"></banta-timestamp>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</div>\r\n<div class="points" [class.focus]="mobileFocus === \'points\'">\r\n <header>\r\n <div>\r\n <label>{{commentsLabel}}</label>\r\n </div>\r\n </header>\r\n <div class="point-focus">\r\n <div class="actions">\r\n <button mat-button (click)="pointUnfocus()">\r\n <mat-icon>arrow_back</mat-icon>\r\n Back\r\n </button>\r\n\r\n <div class="spacer"></div>\r\n \r\n <ng-container *ngIf="pointOpen">\r\n <div class="counted-action">\r\n <div class="count-indicator"> \r\n {{pointOpen.likes}}\r\n </div>\r\n <button mat-icon-button>\r\n <mat-icon>thumb_up</mat-icon>\r\n </button>\r\n </div>\r\n\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf="!pointSubChat">\r\n Error: No subchat\r\n </div>\r\n \r\n <banta-comment-view\r\n class="subcomments"\r\n *ngIf="pointSubChat"\r\n [newestLast]="true"\r\n [allowReplies]="false"\r\n [source]="pointSubChat"\r\n (upvoted)="upvoteMessage($event)"\r\n (reported)="reportMessage($event)"\r\n (userSelected)="showProfile($event.user)"\r\n >\r\n \r\n <banta-comment\r\n class="focused-comment"\r\n data-before\r\n *ngIf="pointOpen"\r\n (upvoted)="upvoteMessage(pointOpen)"\r\n (userSelected)="showProfile(pointOpen.user)"\r\n (reported)="reportMessage(pointOpen)"\r\n [showReplyAction]="false"\r\n [message]="pointOpen"\r\n ></banta-comment>\r\n \r\n <div class="message reply">\r\n Reply:\r\n <form class="new-message" (submit)="sendPointSubMessage()">\r\n <textarea \r\n name="message" \r\n (keydown)="newPointSubMessageKeyDown($event)"\r\n [(ngModel)]="newPointSubMessage.message"></textarea>\r\n \r\n <div class="actions">\r\n <button [disabled]="!newPointSubMessage.message" \r\n mat-raised-button color="primary">Send</button>\r\n </div>\r\n </form>\r\n </div>\r\n </banta-comment-view>\r\n </div>\r\n <div class="points-section">\r\n <banta-comments\r\n [source]="pointSource"\r\n (signInSelected)="showSignIn()"\r\n (upvoted)="upvoteMessage($event)"\r\n (reported)="reportMessage($event)"\r\n (selected)="goToMessage($event)"\r\n (userSelected)="showProfile($event.user)"\r\n ></banta-comments>\r\n </div>\r\n</div>',styles:[':host{display:flex;flex-direction:row;padding:.5em;height:40em;position:relative}.counted-action{display:flex;align-items:center}.count-indicator{font-size:9pt;padding:0 3px;border-radius:3px;border:1px solid #333}header{position:relative;margin-bottom:1em}header div{display:flex;align-items:center;height:30px}header button{color:#666}header label{text-transform:uppercase;z-index:1;font-size:12pt;letter-spacing:2px;font-weight:100;color:#333;margin:0 auto 0 0;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis}header:after,header label{display:block;position:relative}header:after{content:"";border:1px solid #ccc;height:0;width:100%;z-index:0}.points{max-width:50em;display:flex;flex-direction:column}:host.point-focus .points{width:66%;max-width:50em}:host.point-focus .points .points-section{opacity:0;pointer-events:none}:host.point-focus .points .point-focus{opacity:1;pointer-events:auto}:host.point-focus .points .point-focus .actions{display:flex}banta-comments{flex-grow:1}.points{width:33%;margin-left:.5em;font-size:12pt;flex-shrink:0;max-width:30em;transition:width .2s ease-in,max-width .2s ease-in;position:relative}.points .points-section{opacity:1;z-index:2}.points .point-focus,.points .points-section{flex-grow:1;display:flex;flex-direction:column;transition:opacity .2s ease-in}.points .point-focus{position:absolute;width:100%;bottom:0;top:1.75em;right:0;left:0;padding:.5em;opacity:0}.firehose{flex-grow:1;font-size:10pt;display:flex;flex-direction:column}form{display:flex;padding:.5em 0;align-items:center}form textarea{font-size:14pt;min-height:6em}form input[type=text],form textarea{background:#000;color:#fff;border:1px solid #333;width:100%}form input[type=text]{height:1em}form .actions{margin-left:1em}form button{display:block;margin:0 0 0 auto}.subcomments ::ng-deep banta-comment{font-size:10pt}.subcomments ::ng-deep banta-comment.focused-comment{background:#001321;color:#fff;font-size:12pt}.aux{width:0;min-width:0;overflow-x:hidden;transition:width .4s ease-out,min-width .4s ease-out;display:flex;flex-direction:column}.aux.open{width:30em;min-width:18em}.aux .aux-contents{width:30em;min-width:10em;max-width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;flex-grow:1}.notifications .notification{border-bottom:1px solid #333;padding:1em}.notifications .notification banta-timestamp{display:block;text-align:right;font-size:9pt;color:#999}.message.reply{padding:1em}.tabs{display:none}@media (max-width:1015px){:host{flex-direction:column}.tabs{display:flex;position:absolute;top:0;left:0;right:0;width:100%;z-index:10;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);background:rgba(0,0,0,.5)}.points{width:100%;max-width:100%;margin-left:0}header{display:none}.aux,:host.point-focus .points{width:100%;max-width:100%}.aux{min-width:0}.aux,.firehose,.points{position:absolute;top:2em;left:0;right:0;bottom:0;z-index:0;background:#000}.aux.focus,.firehose.focus,.points.focus{z-index:2}}:host-context(.mat-dark-theme) :host{background:#090909;color:#fff}:host-context(.mat-dark-theme) form textarea{background:#ccc;color:#333}:host-context(.mat-dark-theme) header:after{border-color:#222}:host-context(.mat-dark-theme) header label{color:#aaa}']}]}],K.ctorParameters=function(){return[{type:Y},{type:m.MatDialog}]},K.propDecorators={firehose:[{type:a.ViewChild,args:["firehose",{static:!0}]}],topicID:[{type:a.Input}],chatLabel:[{type:a.Input}],commentsLabel:[{type:a.Input}],signInSelected:[{type:a.Output}],hasPoint:[{type:a.HostBinding,args:["class.point-focus"]}]};var Q=function(){};Q.decorators=[{type:a.Component,args:[{selector:"banta-logo",template:"banta",styles:["\n :host {\n font-family: 'Odibee Sans', sans-serif;\n font-size: 40pt;\n }\n\n :host.small {\n font-size: 30pt;\n }\n "]}]}];var X=function(){function e(){this._selected=new t.Subject,this._reported=new t.Subject,this._upvoted=new t.Subject,this._userSelected=new t.Subject}return Object.defineProperty(e.prototype,"userSelected",{get:function(){return this._userSelected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"reported",{get:function(){return this._reported},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"upvoted",{get:function(){return this._upvoted},enumerable:!1,configurable:!0}),e.prototype.avatarForUser=function(e){return e&&e.avatarUrl?"url("+e.avatarUrl+")":null},e.prototype.upvote=function(){this._upvoted.next()},e.prototype.report=function(){this._reported.next()},e.prototype.select=function(){this._selected.next()},e.prototype.selectUser=function(){this._userSelected.next()},e}();X.decorators=[{type:a.Component,args:[{selector:"banta-chat-message",template:'<div class="message-content">\r\n <div class="user" (click)="selectUser()">\r\n <div class="avatar" [style.background-image]="avatarForUser(message.user)"></div>\r\n <label>{{message.user.username}}</label>\r\n </div>\r\n <div class="content">\r\n <div (click)="select()">\r\n {{message.message}}\r\n </div>\r\n <div class="status">\r\n <div class="count-indicator" *ngIf="message.likes > 0">\r\n {{message.likes}} <mat-icon [inline]="true">star</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<div class="actions">\r\n <button mat-icon-button matTooltip="Upvote" matTooltipPosition="below" (click)="upvote()">\r\n <mat-icon [inline]="true">thumb_up</mat-icon>\r\n </button>\r\n <button mat-icon-button matTooltip="Report" matTooltipPosition="below" (click)="report()">\r\n <mat-icon [inline]="true">report</mat-icon>\r\n </button>\r\n</div>',styles:[':host{display:flex;flex-direction:row;align-items:center;padding:0 1em;background-color:#fff;color:#000;transition:background-color .4s ease-out}:host .message-content .content{color:#111}:host:hover{background-color:#ddd}:host.highlight{background:#00121b}:host.highlight:hover{background:#01324d}:host:nth-child(2n){background-color:#eee}:host:nth-child(2n):hover{background:#ddd}:host:nth-child(2n) .message-content .content{color:#222}:host:nth-child(2n).highlight{background:#001a2a}:host:nth-child(2n).highlight:hover{background:#002b44}:host .message-content{display:flex;flex-direction:row;flex-grow:1;align-items:center}:host .message-content .content{display:flex;flex-direction:row;padding:5px 0}:host .message-content .content .status{display:flex;flex-direction:row;align-items:center;margin-left:1em}:host .message-content .content .status mat-icon{margin-left:.5em}:host .user{color:#999;font-weight:400;text-align:right;margin-right:.25em;flex-shrink:0;display:flex;align-items:center}:host .user .avatar{background-position:50%;background-size:cover;background-color:#333;border-radius:100%;flex-shrink:0;flex-grow:0;margin-right:1em;width:2em;height:2em}:host .user:after{content:":";margin-right:1em}:host .content{flex-grow:1}:host .actions{flex-shrink:0;white-space:nowrap;opacity:0;transition:opacity .4s ease-out}:host:hover .actions{opacity:1}.count-indicator{white-space:nowrap}:host-context(.mat-dark-theme){background-color:#000;color:#fff}:host-context(.mat-dark-theme) .message-content .content{color:#ddd}:host-context(.mat-dark-theme):hover{background-color:#111}:host-context(.mat-dark-theme):nth-child(2n).highlight{background:#001a2a}:host-context(.mat-dark-theme):nth-child(2n).highlight:hover{background:#002b44}:host-context(.mat-dark-theme):nth-child(2n):hover{background-color:#111}:host-context(.mat-dark-theme):nth-child(2n){background-color:#080808}:host-context(.mat-dark-theme):nth-child(2n) .message-content .content{color:#eee}label{margin:0}']}]}],X.propDecorators={message:[{type:a.Input}],userSelected:[{type:a.Output}],selected:[{type:a.Output}],reported:[{type:a.Output}],upvoted:[{type:a.Output}]};var J=function(){function e(e){this.backend=e,this._upvoted=new t.Subject,this._reported=new t.Subject,this._selected=new t.Subject}return Object.defineProperty(e.prototype,"upvoted",{get:function(){return this._upvoted},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"reported",{get:function(){return this._reported},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"message",{get:function(){return this._message},set:function(e){var t=this,r=null;this._message&&(r=this._message.id),this._message=e,e&&r===e.id||(this.unsubscribe&&this.unsubscribe(),e&&(this.unsubscribe=this.backend.watchMessage(e,(function(e){return t.message=e}))))},enumerable:!1,configurable:!0}),e.prototype.report=function(){this._reported.next()},e.prototype.upvote=function(){this._upvoted.next()},e.prototype.select=function(){this._selected.next()},e}();J.decorators=[{type:a.Component,args:[{selector:"banta-live-chat-message",template:'\n <banta-chat-message \n *ngIf="message"\n [message]="message"\n (upvoted)="upvote()"\n (reported)="report()"\n (selected)="select()"\n ></banta-chat-message>\n ',styles:[""]}]}],J.ctorParameters=function(){return[{type:Y}]},J.propDecorators={upvoted:[{type:a.Output}],reported:[{type:a.Output}],selected:[{type:a.Output}],message:[{type:a.Input}]};var G=function(){function e(e,r){this.backend=e,this.elementRef=r,this._sourceSubs=new t.Subscription,this._selected=new t.Subject,this._selected$=this._selected.asObservable(),this._reported=new t.Subject,this._reported$=this._reported.asObservable(),this._upvoted=new t.Subject,this._upvoted$=this._upvoted.asObservable(),this._userSelected=new t.Subject,this._userSelected$=this._userSelected.asObservable(),this._received=new t.Subject,this._received$=this._received.asObservable(),this.messages=[],this.maxMessages=200}return Object.defineProperty(e.prototype,"source",{get:function(){return this._source},set:function(e){var r=this;this._sourceSubs&&(this._sourceSubs.unsubscribe(),this._sourceSubs=null),this._source=e,this.messages=[],e&&(this._sourceSubs=new t.Subscription,this.messages=e.messages.slice(),console.log("Source set:"),console.dir(e),console.log("Messages loaded:"),console.dir(this.messages),this._sourceSubs.add(this._source.messageReceived.subscribe((function(e){return r.messageReceived(e)}))),this._sourceSubs.add(this._source.messageSent.subscribe((function(e){return r.messageSent(e)}))),this._sourceSubs.add(this.backend.userChanged.subscribe((function(e){return r.currentUser=e}))),this.getInitialMessages())},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected$},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"userSelected",{get:function(){return this._userSelected$},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"reported",{get:function(){return this._reported$},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"upvoted",{get:function(){return this._upvoted$},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"received",{get:function(){return this._received$},enumerable:!1,configurable:!0}),e.prototype.getInitialMessages=function(){return D(this,void 0,void 0,(function(){var e;return R(this,(function(t){switch(t.label){case 0:return[4,this._source.getExistingMessages()];case 1:return(e=t.sent()).forEach((function(e){var t;return null!==(t=e.transientState)&&void 0!==t?t:e.transientState={}})),this.messages=e.slice().reverse(),this.sortMessages(),[2]}}))}))},e.prototype.sortMessages=function(){var e;this.source&&(e=function(e,t){return e.sentAt-t.sentAt},this.messages.sort(e))},e.prototype.addMessage=function(e){if(this.messages.length>this.maxMessages+1)for(;this.messages.length>this.maxMessages;)this.messages.shift();this.messages.push(e),this.sortMessages()},e.prototype.messageReceived=function(e){var t=this;this.addMessage(e),this._received.next(e),this.isScrolledToLatest()&&setTimeout((function(){return t.scrollToLatest()}))},e.prototype.isScrolledToLatest=function(){if(!this.messageContainer)return!1;var e=this.messageContainer.nativeElement;return e.scrollTop>e.scrollHeight-e.offsetHeight-10},e.prototype.messageSent=function(e){var t=this;this.addMessage(e),this.messageContainer&&setTimeout((function(){return t.scrollToLatest()}))},e.prototype.scrollToLatest=function(){if(this.messageContainer){var e=this.messageContainer.nativeElement;e.scrollTop=e.scrollHeight}},e.prototype.jumpTo=function(e){var t=this.elementRef.nativeElement.querySelector('banta-chat-message[data-id="'+e.id+'"]');t?(t.scrollIntoView({behavior:"smooth"}),this.flashMessage(e)):alert("could not find message "+e.id)},e.prototype.flashMessage=function(e){e&&(this.flashedMessageId=e.id)},e.prototype.mentionsMe=function(e){return!!this.currentUser&&!!e.message.includes("@"+this.currentUser.username)},e.prototype.upvoteMessage=function(e){this._upvoted.next(e)},e.prototype.reportMessage=function(e){this._reported.next(e)},e.prototype.selectMessage=function(e){this._selected.next(e)},e.prototype.selectMessageUser=function(e){this._userSelected.next(e)},e.prototype.avatarForUser=function(e){return e&&e.avatarUrl?"url("+e.avatarUrl+")":null},e}();G.decorators=[{type:a.Component,args:[{selector:"banta-chat-view",template:'<div class="message-container" #messageContainer>\r\n <ng-content select="[data-before]"></ng-content>\r\n <ng-container *ngFor="let message of messages">\r\n <banta-chat-message\r\n *ngIf="!message.hidden"\r\n [message]="message"\r\n [class.highlight]="mentionsMe(message)" \r\n [class.flash]="message.id === flashedMessageId"\r\n (selected)="selectMessage(message)"\r\n (upvoted)="upvoteMessage(message)"\r\n (reported)="reportMessage(message)"\r\n (userSelected)="selectMessageUser(message)"\r\n [attr.data-id]="message.id"\r\n >\r\n </banta-chat-message>\r\n </ng-container>\r\n <ng-content select=":not([data-before])"></ng-content>\r\n</div>',styles:[":host{display:flex;flex-direction:column;flex-grow:1}.message-container{flex-grow:1;overflow-y:auto;overflow-x:hidden;height:10em;color:#000;background:#fff;padding:.5em 1em .5em .5em}.message-container.no-scroll{height:auto;overflow-y:visible}:host-context(.mat-dark-theme) .message-container{color:#fff;background:#000}banta-chat-message.flash{-webkit-animation:flash;animation:flash;-webkit-animation-duration:2.5s;animation-duration:2.5s;-webkit-animation-iteration-count:1;animation-iteration-count:1}@-webkit-keyframes flash{0%{transform:scale(1);background:#425700}25%{transform:scale(1.05)}50%{transform:scale(1)}75%{transform:scale(1.05)}to{transform:scale(1)}}@keyframes flash{0%{transform:scale(1);background:#425700}25%{transform:scale(1.05)}50%{transform:scale(1)}75%{transform:scale(1.05)}to{transform:scale(1)}}"]}]}],G.ctorParameters=function(){return[{type:Y},{type:a.ElementRef}]},G.propDecorators={source:[{type:a.Input}],selected:[{type:a.Output}],userSelected:[{type:a.Output}],reported:[{type:a.Output}],upvoted:[{type:a.Output}],received:[{type:a.Output}],messageContainer:[{type:a.ViewChild,args:["messageContainer"]}],maxMessages:[{type:a.Input}]};var Z=function(){function e(e){this.backend=e,this._subs=new t.Subscription,this.user=null,this.signInLabel="Sign In",this.sendLabel="Send",this.permissionDeniedLabel="Send",this._selected=new t.Subject,this._selected$=this._selected.asObservable(),this._reported=new t.Subject,this._reported$=this._reported.asObservable(),this._upvoted=new t.Subject,this._upvoted$=this._upvoted.asObservable(),this._userSelected=new t.Subject,this._userSelected$=this._userSelected.asObservable(),this._permissionDeniedError=new t.Subject,this._permissionDeniedError$=this._permissionDeniedError.asObservable(),this._signInSelected=new t.Subject,this._signInSelected$=this._signInSelected.asObservable(),this._received=new t.Subject,this._received$=this._received.asObservable(),this.showEmojiPanel=!1,this.newMessage={}}return e.prototype.ngOnInit=function(){var e=this;this._subs.add(this.backend.userChanged.subscribe((function(t){return e.user=t})))},e.prototype.ngOnDestroy=function(){this._subs.unsubscribe()},Object.defineProperty(e.prototype,"source",{get:function(){return this._source},set:function(e){this._source=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"topicID",{get:function(){return this._source.identifier},set:function(e){this.setSourceFromTopicID(e)},enumerable:!1,configurable:!0}),e.prototype.setSourceFromTopicID=function(e){return D(this,void 0,void 0,(function(){var t;return R(this,(function(r){switch(r.label){case 0:return this._source&&this._source.close&&this._source.close(),this._source=null,t=this,[4,this.backend.getSourceForTopic(e)];case 1:return t._source=r.sent(),[2]}}))}))},Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected$},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"reported",{get:function(){return this._reported$},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"upvoted",{get:function(){return this._upvoted$},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"userSelected",{get:function(){return this._userSelected$},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"permissionDeniedError",{get:function(){return this._permissionDeniedError$},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"signInSelected",{get:function(){return this._signInSelected$},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"received",{get:function(){return this._received$},enumerable:!1,configurable:!0}),e.prototype.onReceived=function(e){this._received.next(e)},e.prototype.showSignIn=function(){this._signInSelected.next()},e.prototype.sendPermissionError=function(e){this._permissionDeniedError.next(e)},e.prototype.insertEmoji=function(e){var t=this.newMessage.message||"";this.newMessage.message=t+e},e.prototype.onKeyDown=function(e){},e.prototype.jumpToMessage=function(e){this.chatView&&this.chatView.jumpTo(e)},e.prototype.select=function(e){this._selected.next(e)},e.prototype.selectUser=function(e){this._userSelected.next(e)},e.prototype.report=function(e){this._reported.next(e)},e.prototype.upvote=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){switch(t.label){case 0:return[4,this.source.likeMessage(e.id)];case 1:return t.sent(),this._upvoted.next(e),[2]}}))}))},Object.defineProperty(e.prototype,"canChat",{get:function(){return!!this.user},enumerable:!1,configurable:!0}),e.prototype.sendMessage=function(){var e;return D(this,void 0,void 0,(function(){var t,r,a;return R(this,(function(n){switch(n.label){case 0:if(!this.source)return[2];if(t=(this.newMessage.message||"").trim(),this.newMessage.message="",""===t)return[2];r={user:null,sentAt:Date.now(),likes:0,url:"undefined"!=typeof window?location.href:void 0,message:t},n.label=1;case 1:return n.trys.push([1,5,,6]),[4,null===(e=this.shouldInterceptMessageSend)||void 0===e?void 0:e.call(this,r,this.source)];case 2:return n.sent()?[3,4]:[4,this.source.send(r)];case 3:n.sent(),n.label=4;case 4:return[3,6];case 5:return a=n.sent(),console.error("Failed to send message: ",r),console.error(a),[3,6];case 6:return[2]}}))}))},e}();Z.decorators=[{type:a.Component,args:[{selector:"banta-chat",template:'<banta-chat-view \r\n #chatView\r\n [source]="source"\r\n (upvoted)="upvote($event)"\r\n (reported)="report($event)"\r\n (selected)="select($event)"\r\n (received)="onReceived($event)"\r\n (userSelected)="selectUser($event)"\r\n ></banta-chat-view>\r\n\r\n<form class="new-message" (submit)="sendMessage()">\r\n \r\n <div class="entry-container">\r\n <input\r\n type="text"\r\n name="message" \r\n (keydown)="onKeyDown($event)"\r\n [(ngModel)]="newMessage.message" />\r\n \r\n <emoji-selector-button\r\n (selected)="insertEmoji($event)"\r\n ></emoji-selector-button>\r\n </div>\r\n\r\n <div class="actions">\r\n\r\n <ng-container *ngIf="!user">\r\n <button type="button" (click)="showSignIn()" mat-raised-button color="primary">{{signInLabel}}</button>\r\n </ng-container>\r\n <ng-container *ngIf="user">\r\n <button *ngIf="canChat" [disabled]="!newMessage.message" mat-raised-button color="primary">{{sendLabel}}</button>\r\n <button *ngIf="!canChat" type="button" (click)="sendPermissionError()" mat-raised-button color="primary">{{permissionDeniedLabel}}</button>\r\n </ng-container>\r\n </div>\r\n</form>',styles:[":host{flex-direction:column;border-radius:5px;padding:10px;font-size:10pt;min-height:1px}.entry-container,:host{display:flex;flex-grow:1}.entry-container{flex-direction:row;position:relative}.entry-container emoji-selector-button{position:absolute;right:0;top:.15em}.entry-container input{height:2.6em;font-size:12pt;padding-left:1em}.entry-container input:-webkit-autofill,.entry-container input:-webkit-autofill:focus,.entry-container input:-webkit-autofill:hover{outline:1px solid #9da302;-webkit-text-fill-color:#9da302;-webkit-box-shadow:0 0 0 1000px #211e07 inset;-webkit-transition:background-color 5000s ease-in-out 0s;transition:background-color 5000s ease-in-out 0s;caret-color:#9da302}.entry-container emoji-selector-panel{pointer-events:none;opacity:0;position:absolute;bottom:3.5em;right:0}.entry-container emoji-selector-panel.visible{opacity:1;pointer-events:auto}form{display:flex;padding:.5em 0;align-items:center}form textarea{font-size:14pt;background:#000;color:#fff;border:1px solid #333;min-height:6em;width:100%}form input[type=text]{background:#fff;color:#000;border:1px solid #ccc;width:100%;height:2.5em}form .actions{margin-left:1em}form button{display:block;margin:0 0 0 auto}:host-context(.mat-dark-theme) form input[type=text]{background:#000;color:#fff;border:1px solid #333}"]}]}],Z.ctorParameters=function(){return[{type:Y}]},Z.propDecorators={shouldInterceptMessageSend:[{type:a.Input}],source:[{type:a.Input}],topicID:[{type:a.Input}],signInLabel:[{type:a.Input}],sendLabel:[{type:a.Input}],permissionDeniedLabel:[{type:a.Input}],selected:[{type:a.Output}],reported:[{type:a.Output}],upvoted:[{type:a.Output}],userSelected:[{type:a.Output}],permissionDeniedError:[{type:a.Output}],signInSelected:[{type:a.Output}],received:[{type:a.Output}],chatView:[{type:a.ViewChild,args:["chatView",{static:!0}]}]};var ee=[X,J,G,Z],te=function(){};te.decorators=[{type:a.NgModule,args:[{declarations:ee,imports:[i.CommonModule,y.FormsModule,c.MatIconModule,d.MatButtonModule,W],exports:ee}]}];var re=function(){function e(){this._upvoted=new t.Subject,this._reported=new t.Subject,this._selected=new t.Subject}return Object.defineProperty(e.prototype,"upvoted",{get:function(){return this._upvoted},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"reported",{get:function(){return this._reported},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"message",{get:function(){return this._message},set:function(e){this._message=e,this.viewType=this.getViewType(e)},enumerable:!1,configurable:!0}),e.prototype.getViewType=function(e){return e.topicId.endsWith("_firehose")?"chat":(e.topicId.endsWith("_thepoint"),"comment")},e.prototype.upvote=function(){this._upvoted.next()},e.prototype.report=function(){this._reported.next()},e.prototype.select=function(){this._selected.next()},e}();re.decorators=[{type:a.Component,args:[{selector:"banta-live-message",template:'\n <ng-container *ngIf="message">\n <banta-live-chat-message\n *ngIf="viewType === \'chat\'"\n [message]="message"\n (upvoted)="upvote(message)"\n (reported)="report(message)"\n (selected)="select(message)">\n </banta-live-chat-message>\n\n <banta-live-comment \n *ngIf="viewType === \'comment\'"\n [message]="message"\n (upvoted)="upvote(message)"\n (reported)="report(message)"\n (selected)="select(message)">\n </banta-live-comment>\n </ng-container>\n ',styles:[""]}]}],re.ctorParameters=function(){return[]},re.propDecorators={upvoted:[{type:a.Output}],reported:[{type:a.Output}],selected:[{type:a.Output}],message:[{type:a.Input}]};var ae=function(){function e(e){this.elementRef=e,this._reported=new t.Subject,this._selected=new t.Subject,this._liked=new t.Subject,this._unliked=new t.Subject,this._shared=new t.Subject,this._userSelected=new t.Subject,this._avatarSelected=new t.Subject,this._usernameSelected=new t.Subject,this.maxLength=1500,this.isNew=!1,this.visible=!1,this.showReplyAction=!0,this.loaded=new t.Subject,this.isLoaded=!1,this.mine=!1,this.editing=!1,this._editStarted=new t.Subject,this._deleted=new t.Subject,this._editEnded=new t.Subject,this._edited=new t.Subject}return Object.defineProperty(e.prototype,"element",{get:function(){return this.elementRef.nativeElement},enumerable:!1,configurable:!0}),e.prototype.ngOnInit=function(){var e=this,t=0+100*Math.random();setTimeout((function(){e.isNew=!0,e.visible=!0,setTimeout((function(){return e.isNew=!1}),1e3)}),t)},e.prototype.markAttachmentsLoaded=function(){this.isLoaded=!0,this.loaded.next()},Object.defineProperty(e.prototype,"isHighlighted",{get:function(){var e,t,r;return null!==(r=null===(t=null===(e=this.message)||void 0===e?void 0:e.transientState)||void 0===t?void 0:t.highlighted)&&void 0!==r&&r},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"message",{get:function(){return this._message},set:function(e){var t;this._message=e,(null===(t=this._message.attachments)||void 0===t?void 0:t.length)>0?this.isLoaded=!1:(this.isLoaded=!0,this.loaded.next())},enumerable:!1,configurable:!0}),e.prototype.waitForLoad=function(){return D(this,void 0,void 0,(function(){return R(this,(function(e){switch(e.label){case 0:return this.isLoaded?[2,!0]:[4,this.loaded.pipe(r.take(1)).toPromise()];case 1:return e.sent(),[2]}}))}))},Object.defineProperty(e.prototype,"userSelected",{get:function(){return this._userSelected.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"usernameSelected",{get:function(){return this._usernameSelected.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"avatarSelected",{get:function(){return this._avatarSelected.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"reported",{get:function(){return this._reported.asObservable()},enumerable:!1,configurable:!0}),e.prototype.saveEdit=function(){this._edited.next(this.editedMessage)},e.prototype.endEditing=function(){this._editEnded.next()},e.prototype.startEdit=function(){this._editStarted.next(),this.editedMessage=this.message.message},e.prototype.delete=function(){this._deleted.next()},Object.defineProperty(e.prototype,"liked",{get:function(){return this._liked.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"unliked",{get:function(){return this._unliked.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"edited",{get:function(){return this._edited.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"deleted",{get:function(){return this._deleted.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"editStarted",{get:function(){return this._editStarted.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"editEnded",{get:function(){return this._editEnded.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"shared",{get:function(){return this._shared.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"commentId",{get:function(){var e;return null===(e=this.message)||void 0===e?void 0:e.id},enumerable:!1,configurable:!0}),e.prototype.report=function(){this._reported.next()},e.prototype.like=function(){this._liked.next()},e.prototype.unlike=function(){this._unliked.next()},e.prototype.share=function(){this._shared.next(this.message)},e.prototype.select=function(){this._selected.next()},e.prototype.selectUser=function(){this._userSelected.next()},e.prototype.selectUsername=function(e){this._usernameSelected.next(e),this.selectUser()},e.prototype.selectAvatar=function(e){this._avatarSelected.next(e),this.selectUser()},e.prototype.avatarForUser=function(e){var t=this.genericAvatarUrl;return e&&e.avatarUrl&&(t=e.avatarUrl),"url("+t+")"},Object.defineProperty(e.prototype,"replyCount",{get:function(){var e;return(null===(e=this.message.submessages)||void 0===e?void 0:e.length)||this.message.submessageCount||0},enumerable:!1,configurable:!0}),e}();ae.decorators=[{type:a.Component,args:[{selector:"banta-comment",template:'\r\n<mat-menu #pointItemMenu="matMenu">\r\n <button mat-menu-item (click)="share()">\r\n <mat-icon>share</mat-icon>\r\n Share\r\n </button>\r\n <button *ngIf="!mine" mat-menu-item (click)="report()">\r\n <mat-icon>warning</mat-icon>\r\n Report\r\n </button>\r\n <button *ngIf="mine" [disabled]="!permissions?.canEdit" mat-menu-item (click)="startEdit()">\r\n <mat-icon>edit</mat-icon>\r\n Edit\r\n </button>\r\n <button *ngIf="mine" [disabled]="!permissions?.canDelete" mat-menu-item (click)="delete()">\r\n <mat-icon>delete</mat-icon>\r\n Delete\r\n </button>\r\n\r\n <button *ngFor="let menuItem of customMenuItems" mat-menu-item (click)="menuItem.action(message)">\r\n <mat-icon>{{menuItem.icon}}</mat-icon>\r\n {{menuItem.label}}\r\n </button>\r\n\r\n</mat-menu>\r\n\r\n<div class="message-content">\r\n <div class="user">\r\n <div class="user-1">\r\n <a\r\n href="javascript:;"\r\n class="avatar"\r\n (click)="selectAvatar(message.user)"\r\n [style.background-image]="avatarForUser(message.user)"></a>\r\n <div class="user-identity">\r\n <a href="javascript:;" class="display-name" (click)="selectUser()">{{message.user.displayName}}</a>\r\n <a href="javascript:;" class="username" (click)="selectUsername(message.user)">@{{message.user.username}}</a>\r\n </div>\r\n </div>\r\n <div class="user-2">\r\n <span class="user-tag" *ngIf="message.user.tag">{{message.user.tag}}</span>\r\n <banta-timestamp [value]="message.sentAt"></banta-timestamp>\r\n <span class="spacer"></span>\r\n </div>\r\n </div>\r\n <div class="content" *ngIf="!editing">\r\n <span class="banta-message-content" [innerHTML]="message.message | mentionLinker: message.mentionLinks | markdownToHtml"></span>\r\n <banta-attachments \r\n [attachments]="message.attachments"\r\n (loaded)="markAttachmentsLoaded()"\r\n ></banta-attachments>\r\n <ul class="message-facts">\r\n <li *ngIf="message.edits?.length > 0">(Edited)</li>\r\n </ul>\r\n </div>\r\n <div class="content" *ngIf="editing" style="padding-bottom: 2em;">\r\n <div>\r\n <mat-form-field floatLabel="always" appearance="outline" style="width: 100%;">\r\n <mat-label>Edit Message</mat-label>\r\n <textarea matInput [(ngModel)]="editedMessage" [maxlength]="maxLength"></textarea>\r\n </mat-form-field>\r\n </div>\r\n <button mat-raised-button (click)="saveEdit()">Save</button> &nbsp;\r\n <button mat-button (click)="endEditing()">Cancel</button>\r\n </div>\r\n\r\n\r\n <div class="actions">\r\n <div class="spacer"></div>\r\n <div class="counted-action" *ngIf="showReplyAction">\r\n <button mat-button [matTooltip]="replyCount > 0 ? \'Replies\' : \'Reply\'" matTooltipPosition="below" (click)="select()">\r\n <mat-icon [inline]="true">comment</mat-icon>\r\n <span class="count-indicator">\r\n {{replyCount > 0 ? \'Replies\' : \'Reply\'}}\r\n {{replyCount > 0 ? \'(\' + replyCount + \')\' : \'\'}}\r\n </span>\r\n </button>\r\n </div>\r\n <div class="counted-action" [class.active]="message.userState?.liked">\r\n <button \r\n *ngIf="message.transientState?.liking"\r\n mat-icon-button \r\n [disabled]="true" \r\n [matTooltip]="upvoting ? \'Please wait...\' : message.userState?.liked ? \'Unlike\' : \'Like\'" \r\n matTooltipPosition="below" \r\n >\r\n <mat-spinner [diameter]="15" style="margin-left: 1em;"></mat-spinner>\r\n </button>\r\n <button \r\n *ngIf="!message.transientState?.liking"\r\n mat-button \r\n [matTooltip]="permissions?.canLike ? upvoting ? \'Please wait...\' : \'Like\' : permissions?.canLikeErrorMessage" \r\n matTooltipPosition="below" \r\n (click)="message.userState?.liked ? unlike() : like()" \r\n >\r\n <mat-icon [inline]="true">thumb_up</mat-icon>\r\n <span class="count-indicator" *ngIf="message.likes > 0">\r\n {{message.likes}}\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <button mat-icon-button [matMenuTriggerFor]="pointItemMenu">\r\n <mat-icon [inline]="true">more_vert</mat-icon>\r\n </button>\r\n </div>\r\n</div>\r\n',styles:["@-webkit-keyframes comment-appear{0%{transform:translate(6em)}to{transform:translate(0)}}@keyframes comment-appear{0%{transform:translate(6em)}to{transform:translate(0)}}:host{display:flex;flex-direction:column;position:relative;padding:.5em;visibility:hidden}:host.new{visibility:visible;-webkit-animation-name:comment-appear;animation-name:comment-appear;-webkit-animation-duration:.25s;animation-duration:.25s;-webkit-animation-fill-mode:both;animation-fill-mode:both}:host.highlighted{background:#00223a;outline:2px solid #003277}:host.visible{visibility:visible}:host:hover{background:#eee}:host .message-content .content{margin-left:60px;margin-right:.5em}:host .message-content .attachments-row{margin-top:15px;display:flex;gap:10px}:host .message-content .attachments-row img{border-radius:10px;width:300px;max-width:100%;max-height:20em;-o-object-fit:cover;object-fit:cover}:host.abbreviated .message-content .content{text-overflow:ellipsis;overflow-y:hidden}:host .actions{display:flex;padding-right:10px;margin-left:60px;align-items:center}:host .actions button,banta-timestamp{color:#666;flex-shrink:0}banta-timestamp{font-size:10pt;margin-left:1em;text-align:right}.user{position:relative;margin:1em 0 0;display:flex;align-items:center;flex-wrap:wrap}.user .user-1,.user .user-2{display:flex;flex-wrap:nowrap;align-items:center;min-width:0}.user .user-2{margin:1em 0}.user .user-identity{display:flex;flex-direction:column;min-width:0}.user .display-name,.user .username{z-index:1;position:relative;padding:0 0 0 1em;font-size:10pt;color:#000;margin:0 auto 0 0;display:block;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;flex-shrink:1;flex-grow:0;min-width:0}.user .display-name.username.username.username,.user .username.username.username.username{color:#666}.avatar{height:48px;width:48px;background-position:50%;background-size:cover;background-color:#333;border-radius:100%;flex-shrink:0;flex-grow:0}.counted-action{display:flex;align-items:center}.counted-action.active .count-indicator,.counted-action.active button{color:#00a5ff}.counted-action button .count-indicator{margin-left:.5em}.count-indicator{font-size:9pt;padding:0 0 0 3px;color:#666}:host-context(.mat-dark-theme) .count-indicator{border-color:#333}:host-context(.mat-dark-theme):hover{background:#060606}.user-tag,:host-context(.mat-dark-theme) .user .display-name,:host-context(.mat-dark-theme) .user .username{color:#fff}.user-tag{text-transform:uppercase;font-size:12px;border:1px solid #b27373;background:#7a412b;padding:3px 5px;margin:0 .5em 0 1em;border-radius:3px}.spacer{flex-shrink:1;flex-grow:1}ul.message-facts{margin:0;padding:0;color:#666}ul.message-facts li{list-style-type:none;border-left:1px solid #666;font-size:10pt;padding-left:.5em;margin-left:.5em;margin-top:.5em}ul.message-facts li:first-child{border-left:1px solid transparent;margin-left:0;padding-left:0}@media (max-width:400px){.avatar{height:32px;width:32px}:host .actions{margin-left:0;margin-top:.5em}:host .message-content .content{margin-left:44px;margin-right:.5em}}:host-context(.banta-mobile) .avatar{height:32px;width:32px}:host-context(.banta-mobile) :host .actions{margin-left:0;margin-top:.5em}:host-context(.banta-mobile) :host .message-content .content{margin-left:44px;margin-right:.5em}.card-attachment a{display:flex;align-items:flex-start;gap:1em;width:100%;border:1px solid #666;border-radius:4px;padding:1em;box-sizing:border-box;background-color:#191919}.card-attachment a img{width:300px;aspect-ratio:16/9;-o-object-fit:cover;object-fit:cover;border-radius:10px}.card-attachment a h1{margin:0;font-size:30px}"]}]}],ae.ctorParameters=function(){return[{type:a.ElementRef}]},ae.propDecorators={maxLength:[{type:a.Input}],isNew:[{type:a.HostBinding,args:["class.new"]}],isHighlighted:[{type:a.HostBinding,args:["class.highlighted"]}],visible:[{type:a.HostBinding,args:["class.visible"]}],message:[{type:a.Input}],customMenuItems:[{type:a.Input}],showReplyAction:[{type:a.Input}],loaded:[{type:a.Output}],userSelected:[{type:a.Output}],usernameSelected:[{type:a.Output}],avatarSelected:[{type:a.Output}],reported:[{type:a.Output}],permissions:[{type:a.Input}],mine:[{type:a.Input}],editing:[{type:a.Input}],liked:[{type:a.Output}],unliked:[{type:a.Output}],selected:[{type:a.Output}],edited:[{type:a.Output}],deleted:[{type:a.Output}],editStarted:[{type:a.Output}],editEnded:[{type:a.Output}],shared:[{type:a.Output}],genericAvatarUrl:[{type:a.Input}],commentId:[{type:a.HostBinding,args:["attr.data-comment-id"]}]};var ne=function(){function e(e){var r=this;this.backend=e,this._sourceSubs=new t.Subscription,this._selected=new t.Subject,this._liked=new t.Subject,this._unliked=new t.Subject,this._reported=new t.Subject,this._userSelected=new t.Subject,this._usernameSelected=new t.Subject,this._avatarSelected=new t.Subject,this._shared=new t.Subject,this._deleted=new t.Subject,this._messageEdited=new t.Subject,this.showEmptyState=!0,this.allowReplies=!0,this.customMenuItems=[],this.menuMessage=null,this.messages=[],this.customSortEnabled=!1,this.sourceLoaded=new Promise((function(e){return r.markSourceLoaded=e})),this.maxMessages=2e3,this.maxVisibleMessages=200,this.newestLast=!1,this.isViewingMore=!1,this.isLoadingMore=!1,this.hasMore=!1,this.newMessages=[],this.olderMessages=[],this.sortOrderChanged=new t.Subject}return Object.defineProperty(e.prototype,"comments",{get:function(){return Array.from(this.commentsQuery)},enumerable:!1,configurable:!0}),e.prototype.isMessageLoadedInContext=function(e){return this.olderMessages.find((function(t){return t.id===e.id}))||this.messages.find((function(t){return t.id===e.id}))||this.newMessages.find((function(t){return t.id===e.id}))},e.prototype.loadMessageInContext=function(e){return D(this,void 0,void 0,(function(){var t,r,a,n;return R(this,(function(o){switch(o.label){case 0:return[4,this.sourceLoaded];case 1:o.sent(),console.log("Loading message "+e.id+" in context..."),o.label=2;case 2:return!this.hasMore||this.isMessageLoadedInContext(e)?[3,4]:(console.log("...Need to load more comments to find "+e.id),[4,this.showMore()]);case 3:return o.sent(),[3,2];case 4:return this.isMessageLoadedInContext(e)?(t=this.maxVisibleMessages,r=[].concat(this.olderMessages,this.messages,this.newMessages),(a=r.findIndex((function(t){return t.id===e.id})))<0?(console.error("Error while loading message in context: Message was not present in message list!"),[2,!1]):(n=Math.max(0,a-t/2),this.newMessages=r.splice(0,n),this.messages=r.splice(0,t),this.olderMessages=r,this.isViewingMore=!0,[2])):(console.error("Error while loading message in context: Failed to find message "+e.id+", maybe it was deleted!"),[2,!1])}}))}))},e.prototype.getCommentComponentForMessage=function(e){if(!e)throw new Error("You must pass a valid ChatMessage");return this.comments.find((function(t){var r;return(null===(r=t.message)||void 0===r?void 0:r.id)===e.id}))},Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"messageEdited",{get:function(){return this._messageEdited.asObservable()},enumerable:!1,configurable:!0}),e.prototype.saveEdit=function(e,t){this._messageEdited.next({message:e,newMessage:t})},Object.defineProperty(e.prototype,"userSelected",{get:function(){return this._userSelected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"reported",{get:function(){return this._reported},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"liked",{get:function(){return this._liked},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"unliked",{get:function(){return this._unliked},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"usernameSelected",{get:function(){return this._usernameSelected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"avatarSelected",{get:function(){return this._avatarSelected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"shared",{get:function(){return this._shared},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"deleted",{get:function(){return this._deleted},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"source",{get:function(){return this._source},set:function(e){var r=this;if(this.customSortEnabled=(null==e?void 0:e.sortOrder)!==f.CommentsOrder.NEWEST,this.newMessages=[],this.olderMessages=[],window.bantaSourceDebug=e,this._sourceSubs&&(this._sourceSubs.unsubscribe(),this._sourceSubs=null),this._source=e,e){var a=(e.messages||[]).slice();this.messages=a,this.olderMessages=a.splice(this.maxVisibleMessages,a.length),this.hasMore=!0,this._sourceSubs=new t.Subscription,this._sourceSubs.add(this._source.messageReceived.subscribe((function(e){return r.messageReceived(e)}))),this._sourceSubs.add(this._source.messageSent.subscribe((function(e){return r.messageSent(e)}))),this._sourceSubs.add(this.backend.userChanged.subscribe((function(e){return r.currentUser=e}))),this.getInitialMessages()}},enumerable:!1,configurable:!0}),e.prototype.likeMessage=function(e){this._liked.next(e)},e.prototype.unlikeMessage=function(e){this._unliked.next(e)},e.prototype.reportMessage=function(e){this._reported.next(e)},e.prototype.selectMessage=function(e){this._selected.next(e)},e.prototype.selectMessageUser=function(e){this._userSelected.next(e)},e.prototype.selectUsername=function(e){this._usernameSelected.next(e)},e.prototype.selectAvatar=function(e){this._avatarSelected.next(e)},e.prototype.sharedMessage=function(e){this._shared.next(e)},e.prototype.startEditing=function(e){this.messages.forEach((function(e){return e.transientState.editing=!1})),e.transientState.editing=!0},e.prototype.deleteMessage=function(e){this._deleted.next(e)},e.prototype.getInitialMessages=function(){return D(this,void 0,void 0,(function(){var e;return R(this,(function(t){switch(t.label){case 0:return[4,this._source.getExistingMessages()];case 1:return(e=t.sent()).forEach((function(e){var t;return null!==(t=e.transientState)&&void 0!==t?t:e.transientState={}})),this.messages=this.newestLast?e.slice().reverse():e,this.sortMessages(),this.markSourceLoaded&&this.markSourceLoaded(),[2]}}))}))},e.prototype.messageIdentity=function(e,t){return t.id},e.prototype.showNew=function(){return D(this,void 0,void 0,(function(){var e,t;return R(this,(function(r){return e=f.CommentsOrder.NEWEST,this.source&&this.source.sortOrder!==e?(this.sortOrderChanged.next(e),[2]):(this.isViewingMore=!1,this.newestLast?this.messages=this.messages.concat(this.newMessages.splice(0,this.newMessages.length)):this.messages=this.newMessages.splice(0,this.newMessages.length).concat(this.messages),t=this.messages.splice(this.maxVisibleMessages,this.messages.length),this.olderMessages=t.concat(this.olderMessages),this.olderMessages.splice(this.maxMessages-this.maxVisibleMessages,this.olderMessages.length),this.hasMore=this.olderMessages.length>0,[2])}))}))},e.prototype.showMore=function(){var e,t;return D(this,void 0,void 0,(function(){var r,a;return R(this,(function(n){switch(n.label){case 0:return this.isViewingMore=!0,this.olderMessages.length>0&&(this.isLoadingMore=!1,this.messages=this.messages.concat(this.olderMessages.splice(0,50))),this.isLoadingMore=!0,20,(r=this.newestLast?null!==(e=this.olderMessages[0])&&void 0!==e?e:this.messages[0]:null!==(t=this.olderMessages[this.olderMessages.length-1])&&void 0!==t?t:this.messages[this.messages.length-1])?[4,this.source.loadAfter(r,20)]:(this.isLoadingMore=!1,this.hasMore=!1,[2]);case 1:return a=n.sent(),this.newestLast&&(a=a.slice().reverse()),a.forEach((function(e){var t;return null!==(t=e.transientState)&&void 0!==t?t:e.transientState={}})),this.newestLast?this.messages=a.concat(this.messages):this.messages=this.messages.concat(a),this.isLoadingMore=!1,0===a.length&&(console.log("Reached the end of the list."),this.hasMore=!1),[2]}}))}))},e.prototype.addMessage=function(e){var t;e.transientState||null!==(t=e.transientState)&&void 0!==t||(e.transientState={});var r=this.messages,a=this.olderMessages,n=this.newestLast;if(this.isViewingMore&&(r=this.newMessages,a=null),n){r.push(e);var o=r.splice(this.maxVisibleMessages,r.length);null==a||a.push.apply(a,V(o))}else{r.unshift(e);o=r.splice(this.maxVisibleMessages,r.length);null==a||a.unshift.apply(a,V(o))}(null==a?void 0:a.length)>0&&(this.hasMore=!0),e.pagingCursor=String(this.incrementPagingCursors()),this.sortMessages()},e.prototype.incrementPagingCursors=function(){var e,t,r,a;if(this.source.sortOrder===f.CommentsOrder.NEWEST){var n=0;try{for(var o=U([this.messages,this.olderMessages,this.newMessages]),s=o.next();!s.done;s=o.next()){var i=s.value;try{for(var c=(r=void 0,U(i)),l=c.next();!l.done;l=c.next()){var d=l.value;if(d.pagingCursor){var u=Number(d.pagingCursor)+1;u>n&&(n=u),d.pagingCursor=String(u)}}}catch(e){r={error:e}}finally{try{l&&!l.done&&(a=c.return)&&a.call(c)}finally{if(r)throw r.error}}}}catch(t){e={error:t}}finally{try{s&&!s.done&&(t=o.return)&&t.call(o)}finally{if(e)throw e.error}}return n}},e.prototype.waitForAllCommentsToLoad=function(){return D(this,void 0,void 0,(function(){return R(this,(function(e){switch(e.label){case 0:return[4,new Promise((function(e){return setTimeout(e,100)}))];case 1:return e.sent(),[4,this.sourceLoaded];case 2:return e.sent(),[4,Promise.all(this.comments.map((function(e){return e.waitForLoad()})))];case 3:return e.sent(),[2]}}))}))},e.prototype.sortMessages=function(){var e,t=this;this.source&&(this.source.sortOrder===f.CommentsOrder.LIKES?e=function(e,t){return t.likes-e.likes}:this.source.sortOrder===f.CommentsOrder.NEWEST?e=function(e,r){return(r.sentAt-e.sentAt)*(t.newestLast?-1:1)}:this.source.sortOrder===f.CommentsOrder.OLDEST&&(e=function(e,r){return(e.sentAt-r.sentAt)*(t.newestLast?-1:1)}),this.messages.sort(e),this.olderMessages.sort(e),this.newMessages.sort(e))},e.prototype.messageReceived=function(e){var t=this;this.addMessage(e),this.isScrolledToLatest()&&setTimeout((function(){return t.scrollToLatest()}))},e.prototype.isScrolledToLatest=function(){if(!this.messageContainer)return!1;var e=this.messageContainer.nativeElement;return e.scrollTop>e.scrollHeight-e.offsetHeight-10},e.prototype.messageSent=function(e){this.addMessage(e),this.messageContainer&&this.scrollToLatest()},e.prototype.scrollToLatest=function(){if(this.messageContainer){var e=this.messageContainer.nativeElement;e.scrollTop=e.scrollHeight}},e.prototype.mentionsMe=function(e){return!!this.currentUser&&!!e.message.includes("@"+this.currentUser.username)},e}();ne.decorators=[{type:a.Component,args:[{selector:"banta-comment-view",template:'<div class="message-container">\r\n <ng-content select="[data-before]"></ng-content>\r\n\r\n <a mat-button class="nav" [class.visible]="!newestLast && (isViewingMore || customSortEnabled)" href="javascript:;" (click)="showNew()">\r\n <mat-icon>file_upload</mat-icon>\r\n New\r\n <ng-container *ngIf="newMessages.length >= 1">\r\n ({{newMessages.length}})\r\n </ng-container>\r\n </a>\r\n <a mat-button class="nav" [class.visible]="newestLast && hasMore && !isLoadingMore" href="javascript:;" (click)="showMore()">Show earlier</a>\r\n\r\n <ng-container *ngIf="messages.length === 0">\r\n <div class="empty-state" *ngIf="showEmptyState">\r\n Be the first to comment!\r\n </div>\r\n </ng-container>\r\n <ng-container *ngFor="let message of messages; trackBy: messageIdentity">\r\n <banta-comment\r\n *ngIf="!message.hidden"\r\n class="abbreviated"\r\n \r\n [customMenuItems]="customMenuItems"\r\n [message]="message"\r\n [mine]="currentUser?.id === message.user?.id"\r\n [permissions]="source?.permissions"\r\n [showReplyAction]="allowReplies"\r\n [editing]="message.transientState.editing"\r\n [genericAvatarUrl]="genericAvatarUrl"\r\n (click)="isViewingMore = true"\r\n (editStarted)="startEditing(message)"\r\n (deleted)="deleteMessage(message)"\r\n (editEnded)="message.transientState.editing = false"\r\n (edited)="saveEdit(message, $event)"\r\n (userSelected)="selectMessageUser(message)"\r\n (avatarSelected)="selectAvatar($event)"\r\n (usernameSelected)="selectUsername($event)"\r\n (liked)="likeMessage(message)"\r\n (unliked)="unlikeMessage(message)"\r\n (reported)="reportMessage(message)"\r\n (selected)="selectMessage(message)"\r\n (shared)="sharedMessage($event)"\r\n ></banta-comment>\r\n <div class="inline-replies-container" *ngIf="selectedMessage === message">\r\n <ng-content select=".inline-replies"></ng-content>\r\n </div>\r\n </ng-container>\r\n\r\n <a mat-button class="nav" [class.visible]="newestLast && (isViewingMore || customSortEnabled)" href="javascript:;" (click)="showNew()">\r\n <mat-icon>file_download</mat-icon>\r\n New\r\n <ng-container *ngIf="newMessages.length >= 1">\r\n ({{newMessages.length}})\r\n </ng-container>\r\n </a>\r\n <a mat-button class="nav" [class.visible]="!newestLast && hasMore && !isLoadingMore" href="javascript:;" (click)="showMore()">Show more</a>\r\n\r\n <div class="loading-more" *ngIf="isLoadingMore">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n\r\n \x3c!-- <div style="color: #666">\r\n n={{newMessages.length}}, m={{messages.length}}, o={{olderMessages.length}},\r\n v={{maxVisibleMessages}}, M={{maxMessages}}\r\n </div> --\x3e\r\n\r\n <ng-content select=":not([data-before]):not(.inline-replies)"></ng-content>\r\n</div>\r\n',styles:[":host{flex-grow:1;display:flex;flex-direction:column;opacity:1;transition:opacity .2s ease-in}.message-container{flex-grow:1;overflow-x:hidden;color:#111;background:#fff;padding:.5em 1em 3em .5em;opacity:1;transition:opacity .5s ease-in-out;position:relative}.message-container.no-scroll{height:auto;overflow-y:visible}.message-container.faded{opacity:.25}.message-container .overlay{position:absolute;top:0;left:0;right:0;bottom:0;z-index:10}:host.fixed-height .message-container{overflow-y:auto}:host-context(.mat-dark-theme) .message-container{color:#fff;background:#111}.empty-state{text-align:center;margin:3em;color:#666}:host-context(.mat-dark-theme) .empty-state{color:#666}a.nav{position:absolute;right:.5em;z-index:10;text-align:center;opacity:0;transition:opacity .4s ease-in-out;pointer-events:none;border-radius:2em;background:#222}a.nav.visible{opacity:1;pointer-events:auto}.loading-more{padding:2em;text-align:center;margin:0 auto;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}@media (max-width:400px){.message-container{padding:0 0 3em}}"]}]}],ne.ctorParameters=function(){return[{type:Y}]},ne.propDecorators={showEmptyState:[{type:a.Input}],allowReplies:[{type:a.Input}],customMenuItems:[{type:a.Input}],commentsQuery:[{type:a.ViewChildren,args:[ae]}],fixedHeight:[{type:a.Input},{type:a.HostBinding,args:["class.fixed-height"]}],selectedMessage:[{type:a.Input}],selected:[{type:a.Output}],messageEdited:[{type:a.Output}],userSelected:[{type:a.Output}],reported:[{type:a.Output}],liked:[{type:a.Output}],unliked:[{type:a.Output}],usernameSelected:[{type:a.Output}],avatarSelected:[{type:a.Output}],shared:[{type:a.Output}],deleted:[{type:a.Output}],source:[{type:a.Input}],genericAvatarUrl:[{type:a.Input}],messageContainer:[{type:a.ViewChild,args:["messageContainer"]}],maxMessages:[{type:a.Input}],maxVisibleMessages:[{type:a.Input}],newestLast:[{type:a.Input}],sortOrderChanged:[{type:a.Output}]};var oe=function(){};oe.decorators=[{type:a.Directive,args:[{selector:"[bantaReplySendOptions]"}]}];var se=function(){function e(e,r,a,n,o){var s=this;this.backend=e,this.elementRef=r,this.activatedRoute=a,this.matSnackBar=n,this.ngZone=o,this.isMobileSized=!1,this.viewReady=new Promise((function(e){return s.markViewReady=e})),this._loadingMessage="",this.loadingMessageVisible=!1,this.loading=!0,this.showLoadingScreen=!1,this.customMenuItems=[],this._loadingMessageIndex=0,this.maxCommentLength=1500,this.loadingMessages=["Just a second...","We're definitely working on it.","There's no need to refresh.","It's definitely worth the wait!","This has never happened before.","We'll keep trying, but it's not looking great. \n Commenting & chat services may be down. \n If you continue to experience issues, please contact support.\n "],this.useInlineReplies=!0,this.loaded=new Promise((function(e){return s.markLoaded=e})),this._signInSelected=new t.Subject,this._permissionDeniedError=new t.Subject,this._editAvatarSelected=new t.Subject,this._upvoted=new t.Subject,this._reported=new t.Subject,this._selected=new t.Subject,this._userSelected=new t.Subject,this._shared=new t.Subject,this._usernameSelected=new t.Subject,this._avatarSelected=new t.Subject,this._sourceIsOwned=!1,this._subs=new t.Subscription,this._sortOrder=f.CommentsOrder.NEWEST,this.selectedMessageVisible=!1,this.signInLabel="Sign In",this.sendLabel="Send",this.replyLabel="Reply",this.sendingLabel="Sending",this.permissionDeniedLabel="Send",this.postCommentLabel="Post a comment",this.postReplyLabel="Post a reply",this.allowAttachments=!0,this.maxVisibleMessages=20,this.genericAvatarUrl="https://gravatar.com/avatar/"+Date.now().toString(16)+"?s=512&d=robohash",this.participants=[],this.hashtags=[{hashtag:"error",description:"Cause an error"},{hashtag:"timeout",description:"Cause a slow timeout error"},{hashtag:"slow",description:"Be slow when this message is posted"}],this.loadingSharedComment=!1,this.sharedCommentMissing=!1,this.sendMessage=function(e){return D(s,void 0,void 0,(function(){var t,r;return R(this,(function(a){switch(a.label){case 0:return a.trys.push([0,4,,5]),[4,null===(t=this.shouldInterceptMessageSend)||void 0===t?void 0:t.call(this,e,this.source)];case 1:return a.sent()?[3,3]:[4,this.source.send(e)];case 2:a.sent(),a.label=3;case 3:return this.source.sortOrder!==f.CommentsOrder.NEWEST&&(this.sortOrder=f.CommentsOrder.NEWEST),[2,!0];case 4:return r=a.sent(),this.handleBackendException(r,"Could not send: "),[3,5];case 5:return[2]}}))}))},this.sendReply=function(e){return D(s,void 0,void 0,(function(){var t,r;return R(this,(function(a){switch(a.label){case 0:return a.trys.push([0,4,,5]),[4,null===(t=this.shouldInterceptMessageSend)||void 0===t?void 0:t.call(this,e,this.selectedMessageThread)];case 1:return a.sent()?[3,3]:[4,this.selectedMessageThread.send(e)];case 2:a.sent(),a.label=3;case 3:return[2,!0];case 4:return r=a.sent(),this.handleBackendException(r,"Could not send reply: "),[3,5];case 5:return[2]}}))}))}}return Object.defineProperty(e.prototype,"element",{get:function(){return this.elementRef.nativeElement},enumerable:!1,configurable:!0}),e.prototype.handleBackendExceptionAsAlert=function(e,t){void 0===t&&(t="");try{this.handleBackendException(e,t)}catch(e){alert(e.message)}},e.prototype.handleBackendException=function(e,t){void 0===t&&(t="");var r=e.message;if(!r.startsWith("permission-denied|")||!(r=r.replace(/^permission-denied\|/,"")).startsWith("app-handle|"))throw new Error(""+t+r);this.sendPermissionDenied(r.replace(/^app-handle\|/,""))},e.prototype.ngOnInit=function(){var e=this;if(this._subs.add(this.backend.userChanged.subscribe((function(t){return e.user=t}))),this.startLoading(),"undefined"!=typeof window){var t=window.location.search.substring(1).split("&").map((function(e){return e.split("=")})).reduce((function(e,t){var r=F(t,2),a=r[0],n=r[1];return e[decodeURIComponent(a)]=decodeURIComponent(n),e}),{}).comment;t&&(this.sharedCommentID=t)}},e.prototype.ngAfterViewInit=function(){var e=this;if("undefined"!=typeof window){var t=function(){var t=e.elementRef.nativeElement.getBoundingClientRect();e.ngZone.run((function(){setTimeout((function(){e.width=t.width,e.height=t.height,e.isMobileSized=e.width<500}))}))};"undefined"!=typeof ResizeObserver?(this.resizeObserver=new ResizeObserver(t),this.resizeObserver.observe(this.elementRef.nativeElement)):setTimeout((function(){e.width=e.elementRef.nativeElement.clientWidth,e.height=e.elementRef.nativeElement.clientHeight,e.isMobileSized=e.width<500}),1e3),t()}this.markViewReady()},e.prototype.ngOnDestroy=function(){this._subs.unsubscribe(),this.resizeObserver&&this.resizeObserver.disconnect()},e.prototype.setSourceFromTopicID=function(e){return D(this,void 0,void 0,(function(){var t=this;return R(this,(function(r){return"undefined"==typeof window||setTimeout((function(){return D(t,void 0,void 0,(function(){var t;return R(this,(function(r){switch(r.label){case 0:return console.log("[banta-comments] Subscribing to topic source '"+e+"'"),t=this,[4,this.backend.getSourceForTopic(e,{sortOrder:this.sortOrder})];case 1:return t.source=r.sent(),this._sourceIsOwned=!0,[2]}}))}))})),[2]}))}))},Object.defineProperty(e.prototype,"loadingMessage",{get:function(){return this._loadingMessage},set:function(e){var t=this;this.loadingMessageVisible=!1,setTimeout((function(){t._loadingMessage=e,t._loadingMessage=e,setTimeout((function(){t.loadingMessageVisible=!0}))}),500)},enumerable:!1,configurable:!0}),e.prototype.startLoading=function(){return D(this,void 0,void 0,(function(){var e=this;return R(this,(function(t){switch(t.label){case 0:return this.loadingStartedAt=this.messageChangedAt=Date.now(),this.updateLoading()?[2]:[4,new Promise((function(e){return setTimeout((function(){return e()}),100)}))];case 1:return t.sent(),this.updateLoading()?[2]:[4,new Promise((function(e){return setTimeout((function(){return e()}),250)}))];case 2:return t.sent(),this.updateLoading()?[2]:[4,new Promise((function(e){return setTimeout((function(){return e()}),500)}))];case 3:return t.sent(),this.updateLoading()?[2]:(console.log("[Banta] Loading is taking a long time! Showing loading screen."),this.showLoadingScreen=!0,"undefined"!=typeof window&&(this._loadingTimer=setInterval((function(){return e.updateLoading()}),1e3)),[2])}}))}))},e.prototype.getCommentComponentForMessage=function(e){var t;return e.parentMessageId?null===(t=this.threadView)||void 0===t?void 0:t.getCommentComponentForMessage(e):this.commentView.getCommentComponentForMessage(e)},Object.defineProperty(e.prototype,"threadView",{get:function(){var e=this;return Array.from(this.threadViewQuery).filter((function(t){return t!==e.commentView}))[0]},enumerable:!1,configurable:!0}),e.prototype.waitForThreadView=function(){return D(this,void 0,void 0,(function(){return R(this,(function(e){switch(e.label){case 0:return this.threadView?[2,this.threadView]:[4,this.threadViewQuery.changes.pipe(r.take(1)).toPromise()];case 1:return e.sent(),[2,this.threadView]}}))}))},e.prototype.updateLoading=function(){var e,t,r=this;if((null===(e=this.source)||void 0===e?void 0:e.state)&&"connecting"!==(null===(t=this.source)||void 0===t?void 0:t.state))return clearInterval(this._loadingTimer),this.loadingMessage="Here we go!",setTimeout((function(){r.loading=!1,r.markLoaded()}),750),!0;return this.messageChangedAt+5e3<Date.now()&&this.loadingMessages[this._loadingMessageIndex]&&(this.loadingMessage=this.loadingMessages[this._loadingMessageIndex++],this.messageChangedAt=Date.now()),!1},Object.defineProperty(e.prototype,"source",{get:function(){return this._source},set:function(e){var r,a=this;this._source&&this._sourceIsOwned&&(this._source.close(),null===(r=this._sourceSubscription)||void 0===r||r.unsubscribe(),this._source=null,this.participants=[]),this._source=e,this._sourceIsOwned=!1,this._sourceSubscription=new t.Subscription,e&&(this.sharedCommentID&&(this.navigateToSharedComment(this.sharedCommentID),this.lastSharedCommentID=this.sharedCommentID,this.sharedCommentID=null),this._source.messages.forEach((function(e){return a.addParticipant(e)})),this._sourceSubscription.add(this._source.messageReceived.subscribe((function(e){return a.addParticipant(e)}))),this._sourceSubscription.add(this._source.messageSent.subscribe((function(e){return a.addParticipant(e)}))),this._sourceSubscription.add(this._source.messageObserved.subscribe((function(e){return a.addParticipant(e)}))),this._sourceSubscription.add(this._source.messageUpdated.subscribe((function(e){var t;console.log("comments received message: ",e),e.id===(null===(t=a.selectedMessage)||void 0===t?void 0:t.id)&&e.hidden&&(a.unselectMessage(),a.matSnackBar.open("The thread you were viewing was removed.",void 0,{duration:2500}))}))))},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"topicID",{get:function(){return this._topicID},set:function(e){var t=this;this._topicID!==e&&(this._topicID=e,setTimeout((function(){return t.setSourceFromTopicID(e)})))},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"signInSelected",{get:function(){return this._signInSelected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"editAvatarSelected",{get:function(){return this._editAvatarSelected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"permissionDeniedError",{get:function(){return this._permissionDeniedError},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"upvoted",{get:function(){return this._upvoted.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"reported",{get:function(){return this._reported.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"userSelected",{get:function(){return this._userSelected.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"usernameSelected",{get:function(){return this._usernameSelected.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"avatarSelected",{get:function(){return this._avatarSelected.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"shared",{get:function(){return this._shared.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"sortOrder",{get:function(){return this._sortOrder},set:function(e){var t=this;this._sortOrder!==e&&(this._sortOrder=e,setTimeout((function(){t.setSourceFromTopicID(t.topicID)})))},enumerable:!1,configurable:!0}),e.prototype.scrollToComment=function(e){return D(this,void 0,void 0,(function(){var t;return R(this,(function(r){switch(r.label){case 0:return"undefined"==typeof window?[2]:[4,this.commentView.waitForAllCommentsToLoad()];case 1:return r.sent(),(t=document.querySelector('[data-comment-id="'+e+'"]'))&&t.scrollIntoView({inline:"center",block:"center"}),[2]}}))}))},e.prototype.navigateToSharedComment=function(e){var t,r,a,n;return D(this,void 0,void 0,(function(){var o,s,i,c,l=this;return R(this,(function(d){switch(d.label){case 0:return this.loadingSharedComment=!0,[4,new Promise((function(e){return setTimeout(e,10)}))];case 1:return d.sent(),this.sharedCommentMissing=!1,[4,this.source.ready];case 2:return d.sent(),[4,this.viewReady];case 3:return d.sent(),[4,this.loaded];case 4:d.sent(),console.log("Navigating to shared comment with ID '"+e+"'..."),d.label=5;case 5:return d.trys.push([5,7,,8]),[4,this.source.get(e)];case 6:return o=d.sent(),[3,8];case 7:return s=d.sent(),console.error("Failed to find comment from URL: "+s.message),this.sharedCommentMissing=!0,this.loadingSharedComment=!1,"undefined"!=typeof window&&setTimeout((function(){l.element.querySelector(".loading-comment").scrollIntoView({block:"center",inline:"center"})}),200),[2];case 8:return null!==(t=o.transientState)&&void 0!==t||(o.transientState={}),o.parentMessageId?[4,this.source.get(o.parentMessageId)]:[3,17];case 9:return i=d.sent(),null!==(r=i.transientState)&&void 0!==r||(i.transientState={}),[4,this.commentView.loadMessageInContext(i)];case 10:return d.sent(),[4,this.selectMessage(i)];case 11:return[4,(c=d.sent()).ready];case 12:return d.sent(),[4,this.waitForThreadView()];case 13:return d.sent(),[4,this.threadView.loadMessageInContext(o)];case 14:return d.sent(),[4,c.get(o.id)];case 15:return o=d.sent(),null!==(a=o.transientState)&&void 0!==a||(o.transientState={}),o.transientState.highlighted=!0,console.dir(o),[4,new Promise((function(e){return setTimeout((function(){return e()}),500)}))];case 16:return d.sent(),[3,19];case 17:return[4,this.commentView.loadMessageInContext(o)];case 18:d.sent(),null!==(n=o.transientState)&&void 0!==n||(o.transientState={}),o.transientState.highlighted=!0,d.label=19;case 19:return this.loadingSharedComment=!1,[4,this.scrollToComment(e)];case 20:return d.sent(),[2]}}))}))},e.prototype.handlePermissionDenied=function(e){e.startsWith("app-handle|")?this.sendPermissionDenied(e.replace(/^app-handle\|/,"")):alert(e)},e.prototype.sendPermissionDenied=function(e){this._permissionDeniedError.next(e)},e.prototype.scrollToMessage=function(e){var t=this.elementRef.nativeElement.querySelector('[data-comment-id="'+e.id+'"]');t&&t.scrollIntoView({block:"center",inline:"start"})},e.prototype.addParticipant=function(e){e&&e.user&&e.user.id&&(this.participants.find((function(t){return t.id===e.user.id}))||this.participants.push(e.user))},e.prototype.likeMessage=function(e,t){return D(this,void 0,void 0,(function(){var r;return R(this,(function(a){switch(a.label){case 0:return this.user?[3,2]:[4,this.showSignIn()];case 1:return a.sent(),[2];case 2:this._upvoted.next(t),t.transientState.liking=!0,a.label=3;case 3:return a.trys.push([3,5,6,8]),[4,e.likeMessage(t.id)];case 4:return a.sent(),[3,8];case 5:return r=a.sent(),this.handleBackendExceptionAsAlert(r,"Could not like this message: "),[3,8];case 6:return[4,new Promise((function(e){return setTimeout((function(){return e()}),250)}))];case 7:return a.sent(),t.transientState.liking=!1,[7];case 8:return[2]}}))}))},e.prototype.unlikeMessage=function(e,t){var r;return D(this,void 0,void 0,(function(){var a;return R(this,(function(n){switch(n.label){case 0:return this.user?[3,2]:[4,this.showSignIn()];case 1:return n.sent(),[2];case 2:this._upvoted.next(t),t.transientState.liking=!0,(null===(r=t.userState)||void 0===r?void 0:r.liked)&&(t.likes=(t.likes||0)-1),n.label=3;case 3:return n.trys.push([3,5,,6]),[4,e.unlikeMessage(t.id)];case 4:return n.sent(),[3,6];case 5:return a=n.sent(),this.handleBackendExceptionAsAlert(a,"Failed to unlike this message: "),[3,6];case 6:return[4,new Promise((function(e){return setTimeout((function(){return e()}),250)}))];case 7:return n.sent(),t.transientState.liking=!1,[2]}}))}))},e.prototype.reportMessage=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){return this._reported.next(e),[2]}))}))},e.prototype.unselectMessage=function(){return D(this,void 0,void 0,(function(){var e,t=this;return R(this,(function(r){return e=this.selectedMessage,this._selected.next(null),this.selectedMessage=null,this.selectedMessageThread&&(this.selectedMessageThread.close&&this.selectedMessageThread.close(),this.selectedMessageThread=null),e&&setTimeout((function(){return t.scrollToMessage(e)})),[2]}))}))},e.prototype.toggleSelectedMessage=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){switch(t.label){case 0:return this.selectedMessage!==e?[3,2]:[4,this.unselectMessage()];case 1:return t.sent(),[3,4];case 2:return[4,this.selectMessage(e)];case 3:t.sent(),t.label=4;case 4:return[2]}}))}))},e.prototype.selectMessage=function(e){return D(this,void 0,void 0,(function(){var t,r=this;return R(this,(function(a){switch(a.label){case 0:return this.selectedMessage===e?(console.log("[Banta] Thread "+this.topicID+"/"+e.id+" is already open."),[2,this.selectedMessageThread]):(this._selected.next(e),console.log("[Banta] Opening thread for "+this.topicID+"/"+e.id+"..."),[4,this.backend.getSourceForThread(this.topicID,e.id)]);case 1:return(t=a.sent())?(console.log("[Banta] Thread opened for "+this.topicID+"/"+e.id+"."),setTimeout((function(){return r.selectedMessageVisible=!0})),setTimeout((function(){return D(r,void 0,void 0,(function(){return R(this,(function(r){return this.selectedMessage=e,this.selectedMessageThread=t,[2]}))}))}),250),[2,t]):(console.warn("Failed to locate thread for message "+this.topicID+"/"+e.id+"!"),[2,null])}}))}))},e.prototype.showSignIn=function(){return D(this,void 0,void 0,(function(){return R(this,(function(e){return this._signInSelected.next(),[2]}))}))},e.prototype.showEditAvatar=function(){return D(this,void 0,void 0,(function(){return R(this,(function(e){return this._editAvatarSelected.next(),[2]}))}))},e.prototype.selectMessageUser=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){return this._userSelected.next(e),[2]}))}))},e.prototype.selectUsername=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){return this._usernameSelected.next(e),[2]}))}))},e.prototype.selectAvatar=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){return this._avatarSelected.next(e),[2]}))}))},e.prototype.shareMessage=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){return this._shared.next(e),[2]}))}))},e.prototype.deleteMessage=function(e){var t;return D(this,void 0,void 0,(function(){var r;return R(this,(function(a){switch(a.label){case 0:return this.user?[3,2]:[4,this.showSignIn()];case 1:return a.sent(),[2];case 2:if(!confirm("Are you sure you want to delete this comment? You cannot undo this action."))return[2];a.label=3;case 3:return a.trys.push([3,5,,6]),[4,this.source.deleteMessage(e.id)];case 4:return a.sent(),(null===(t=this.selectedMessage)||void 0===t?void 0:t.id)===e.id&&this.unselectMessage(),[3,6];case 5:return r=a.sent(),this.handleBackendExceptionAsAlert(r,"Could not delete message: "),[3,6];case 6:return[2]}}))}))},e.prototype.editMessage=function(e,t,r){return D(this,void 0,void 0,(function(){var a;return R(this,(function(n){switch(n.label){case 0:return this.user?[3,2]:[4,this.showSignIn()];case 1:return n.sent(),[2];case 2:return n.trys.push([2,4,,5]),[4,e.editMessage(t.id,r)];case 3:return n.sent(),[3,5];case 4:return a=n.sent(),this.handleBackendExceptionAsAlert(a,"Could not edit this message: "),[2];case 5:return t.message=r,t.transientState.editing=!1,[2]}}))}))},e.prototype.startEditing=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){return this.selectedMessage.transientState.editing=!1,e.transientState.editing=!0,[2]}))}))},e.prototype.saveEdit=function(e,t){return D(this,void 0,void 0,(function(){var r;return R(this,(function(a){switch(a.label){case 0:return this.user?[3,2]:[4,this.showSignIn()];case 1:return a.sent(),[2];case 2:return a.trys.push([2,4,,5]),[4,this.source.editMessage(e.id,t)];case 3:return a.sent(),e.transientState.editing=!1,[3,5];case 4:return r=a.sent(),this.handleBackendExceptionAsAlert(r,"Could not edit message: "),[3,5];case 5:return[2]}}))}))},e}();se.decorators=[{type:a.Component,args:[{selector:"banta-comments",template:'<ng-container *ngIf="loading">\r\n <div class="loading-screen" [class.visible]="showLoadingScreen">\r\n <h1>Loading...</h1>\r\n <div>\r\n <mat-spinner [diameter]="300" [strokeWidth]="2"></mat-spinner>\r\n </div>\r\n\r\n <p class="loading-message" [class.visible]="loadingMessageVisible">{{loadingMessage}}</p>\r\n </div>\r\n</ng-container>\r\n<ng-container *ngIf="!loading">\r\n <div class="focused" [class.visible]="selectedMessageVisible" *ngIf="selectedMessage && !useInlineReplies">\r\n\r\n <div>\r\n <a mat-button href="javascript:;" (click)="unselectMessage()">\r\n <mat-icon>arrow_back</mat-icon>\r\n Latest Comments\r\n </a>\r\n </div>\r\n\r\n <banta-comment\r\n [message]="selectedMessage"\r\n [liking]="selectedMessage.transientState.liking"\r\n [mine]="user?.id === selectedMessage.user?.id"\r\n [permissions]="source?.permissions"\r\n [showReplyAction]="false"\r\n [editing]="selectedMessage.transientState.editing"\r\n [maxLength]="maxCommentLength"\r\n [genericAvatarUrl]="genericAvatarUrl"\r\n (editStarted)="startEditing(selectedMessage)"\r\n (editEnded)="selectedMessage.transientState.editing = false"\r\n (edited)="saveEdit(selectedMessage, $event)"\r\n (userSelected)="selectMessageUser(selectedMessage)"\r\n (avatarSelected)="selectAvatar($event)"\r\n (usernameSelected)="selectUsername($event)"\r\n (liked)="likeMessage(source, selectedMessage)"\r\n (unliked)="unlikeMessage(source, selectedMessage)"\r\n (reported)="reportMessage(selectedMessage)"\r\n (selected)="toggleSelectedMessage(selectedMessage)"\r\n (shared)="shareMessage($event)"\r\n (deleted)="deleteMessage(selectedMessage)"\r\n ></banta-comment>\r\n\r\n <div class="replies">\r\n\r\n <ng-container *ngIf="!selectedMessageThread">\r\n <div class="loading">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf="selectedMessageThread">\r\n <banta-comment-view\r\n class="replies"\r\n #threadView\r\n [source]="selectedMessageThread"\r\n [allowReplies]="false"\r\n [fixedHeight]="false"\r\n [showEmptyState]="false"\r\n [newestLast]="true"\r\n [genericAvatarUrl]="genericAvatarUrl"\r\n (liked)="likeMessage(selectedMessageThread, $event)"\r\n (unliked)="unlikeMessage(selectedMessageThread, $event)"\r\n (messageEdited)="editMessage(selectedMessageThread, $event.message, $event.newMessage)"\r\n (reported)="reportMessage($event)"\r\n (usernameSelected)="selectUsername($event)"\r\n (avatarSelected)="selectAvatar($event)"\r\n (shared)="shareMessage($event)"\r\n (deleted)="deleteMessage($event)"\r\n [customMenuItems]="customMenuItems"\r\n ></banta-comment-view>\r\n\r\n <banta-comment-field\r\n [sendLabel]="replyLabel"\r\n [sendingLabel]="sendingLabel"\r\n [hashtags]="hashtags"\r\n [participants]="participants"\r\n (signInSelected)="showSignIn()"\r\n (editAvatarSelected)="showEditAvatar()"\r\n [source]="selectedMessageThread"\r\n [maxLength]="maxCommentLength"\r\n [canComment]="source?.permissions?.canPost"\r\n [signInLabel]="signInLabel"\r\n [permissionDeniedLabel]="source?.permissions?.canPostErrorMessage || permissionDeniedLabel"\r\n (permissionDeniedError)="handlePermissionDenied($event)"\r\n [shouldInterceptMessageSend]="shouldInterceptMessageSend"\r\n [user]="user"\r\n [label]="postReplyLabel"\r\n [submit]="sendReply"\r\n [allowAttachments]="allowAttachments"\r\n [genericAvatarUrl]="genericAvatarUrl"\r\n >\r\n <ng-container *ngTemplateOutlet="sendReplyOptionsTemplate"></ng-container>\r\n </banta-comment-field>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class="main" [class.hidden]="selectedMessage && !useInlineReplies">\r\n <banta-comment-field\r\n [source]="source"\r\n [user]="user"\r\n [sendLabel]="sendLabel"\r\n [sendingLabel]="sendingLabel"\r\n [signInLabel]="signInLabel"\r\n [canComment]="source?.permissions?.canPost"\r\n [hashtags]="hashtags"\r\n [participants]="participants"\r\n [label]="postCommentLabel"\r\n [maxLength]="maxCommentLength"\r\n (editAvatarSelected)="showEditAvatar()"\r\n (signInSelected)="showSignIn()"\r\n [permissionDeniedLabel]="source?.permissions?.canPostErrorMessage || permissionDeniedLabel"\r\n (permissionDeniedError)="handlePermissionDenied($event)"\r\n [shouldInterceptMessageSend]="shouldInterceptMessageSend"\r\n [submit]="sendMessage"\r\n [allowAttachments]="allowAttachments"\r\n [genericAvatarUrl]="genericAvatarUrl"\r\n >\r\n \r\n </banta-comment-field>\r\n\r\n <banta-comment-sort\r\n [(sort)]="sortOrder"></banta-comment-sort>\r\n\r\n <div class="loading-comment" *ngIf="loadingSharedComment">\r\n <h1>Loading the comment you linked to...</h1>\r\n <mat-spinner [diameter]="300" [strokeWidth]="2"></mat-spinner>\r\n <p>\r\n If there are a lot of comments, this might take awhile!\r\n </p>\r\n </div>\r\n <div class="loading-comment" *ngIf="!loadingSharedComment && lastSharedCommentID">\r\n <ng-container *ngIf="sharedCommentMissing">\r\n\r\n <a class="close" mat-icon-button matTooltip="Close this notice" href="javascript:;" (click)="lastSharedCommentID = null">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n\r\n <h1>\r\n <mat-icon>error</mat-icon>\r\n Uh oh!\r\n </h1>\r\n\r\n <p>The comment you linked to can\'t be found! It may have been removed.</p>\r\n </ng-container>\r\n <ng-container *ngIf="!sharedCommentMissing">\r\n <a class="close" mat-icon-button matTooltip="Close this notice" href="javascript:;" (click)="lastSharedCommentID = null">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n <button mat-button (click)="navigateToSharedComment(lastSharedCommentID)">\r\n <mat-icon>move_down</mat-icon> Jump to shared comment\r\n </button>\r\n </ng-container>\r\n </div>\r\n\r\n <banta-comment-view\r\n #commentView\r\n [class.faded]="selectedMessage && !useInlineReplies"\r\n [source]="source"\r\n [fixedHeight]="fixedHeight"\r\n [maxMessages]="maxMessages"\r\n [maxVisibleMessages]="maxVisibleMessages"\r\n [genericAvatarUrl]="genericAvatarUrl"\r\n [customMenuItems]="customMenuItems"\r\n (userSelected)="selectMessageUser($event)"\r\n (sortOrderChanged)="sortOrder = $event"\r\n (selected)="toggleSelectedMessage($event)"\r\n (liked)="likeMessage(source, $event)"\r\n (unliked)="unlikeMessage(source, $event)"\r\n (messageEdited)="editMessage(source, $event.message, $event.newMessage)"\r\n (reported)="reportMessage($event)"\r\n (usernameSelected)="selectUsername($event)"\r\n (avatarSelected)="selectAvatar($event)"\r\n (shared)="shareMessage($event)"\r\n [selectedMessage]="selectedMessage"\r\n (deleted)="deleteMessage($event)"\r\n >\r\n <div class="inline-replies">\r\n <div class="focused" [class.visible]="selectedMessageVisible" *ngIf="selectedMessage">\r\n <div class="replies">\r\n \r\n <ng-container *ngIf="!selectedMessageThread">\r\n <div class="loading">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n </ng-container>\r\n \r\n <ng-container *ngIf="selectedMessageThread">\r\n <banta-comment-view\r\n [source]="selectedMessageThread"\r\n [allowReplies]="false"\r\n [fixedHeight]="false"\r\n [showEmptyState]="false"\r\n [newestLast]="true"\r\n [genericAvatarUrl]="genericAvatarUrl"\r\n (liked)="likeMessage(selectedMessageThread, $event)"\r\n (unliked)="unlikeMessage(selectedMessageThread, $event)"\r\n (messageEdited)="editMessage(selectedMessageThread, $event.message, $event.newMessage)"\r\n (reported)="reportMessage($event)"\r\n (usernameSelected)="selectUsername($event)"\r\n (avatarSelected)="selectAvatar($event)"\r\n (shared)="shareMessage($event)"\r\n (deleted)="deleteMessage($event)"\r\n ></banta-comment-view>\r\n \r\n <banta-comment-field\r\n [sendLabel]="replyLabel"\r\n [sendingLabel]="sendingLabel"\r\n [hashtags]="hashtags"\r\n [participants]="participants"\r\n (signInSelected)="showSignIn()"\r\n [maxLength]="maxCommentLength"\r\n (editAvatarSelected)="showEditAvatar()"\r\n [source]="selectedMessageThread"\r\n [canComment]="source?.permissions?.canPost"\r\n [signInLabel]="signInLabel"\r\n [permissionDeniedLabel]="source?.permissions?.canPostErrorMessage || permissionDeniedLabel"\r\n (permissionDeniedError)="handlePermissionDenied($event)"\r\n [shouldInterceptMessageSend]="shouldInterceptMessageSend"\r\n [user]="user"\r\n [label]="postReplyLabel"\r\n [submit]="sendReply"\r\n [allowAttachments]="allowAttachments"\r\n [genericAvatarUrl]="genericAvatarUrl"\r\n >\r\n <ng-container *ngTemplateOutlet="sendReplyOptionsTemplate"></ng-container>\r\n </banta-comment-field>\r\n </ng-container>\r\n </div>\r\n </div> \r\n </div>\r\n </banta-comment-view>\r\n </div>\r\n</ng-container>\r\n',styles:[":host{display:flex;flex-direction:column}@-webkit-keyframes select-comment{0%{transform:scale(1.15)}to{transform:scale(1)}}@keyframes select-comment{0%{transform:scale(1.15)}to{transform:scale(1)}}.focused{-webkit-animation-name:select-comment;animation-name:select-comment;-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.focused .replies{margin-top:1em;margin-left:2em;border-left:2px solid #333;padding-left:2em}banta-comment-view{opacity:1;transition:opacity .4s ease-in-out}banta-comment-view.faded{opacity:.25}.loading{display:block;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;margin:0 auto;min-height:16em}.main.hidden{display:none}.loading-screen{text-align:center;opacity:0;transition:opacity .25s ease-in-out}.loading-screen.visible{opacity:1}.loading-screen h1{font-weight:100}.loading-screen mat-spinner{margin:5em auto}.loading-screen .loading-message{opacity:0;transition:opacity .25s ease-in-out;width:500px;max-width:100%;margin:0 auto}.loading-screen .loading-message.visible{opacity:1}banta-comment-sort{margin:0 0 0 auto;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;display:block}.inline-replies{margin-left:4em}@media (max-width:500px){.focused .replies{margin-left:0}.inline-replies{margin-left:1em}.focused .replies{padding-left:.5em}banta-comment-sort{margin:0;width:100%}}:host-context(.banta-mobile) .focused .replies{margin-left:0}:host-context(.banta-mobile) .inline-replies{margin-left:1em}:host-context(.banta-mobile) .focused .replies{padding-left:.5em}:host-context(.banta-mobile) banta-comment-sort{margin:0;width:100%}.loading-comment{z-index:100;border:1px solid #333;background:#000;color:#fff;padding:1em;border-radius:4px;text-align:center;position:relative}.loading-comment a.close{position:absolute;top:1em;right:1em}.loading-comment h1{font-weight:100;text-align:center}.loading-comment mat-spinner{margin:0 auto}"]}]}],se.ctorParameters=function(){return[{type:Y},{type:a.ElementRef},{type:b.ActivatedRoute},{type:w.MatSnackBar},{type:a.NgZone}]},se.propDecorators={isMobileSized:[{type:a.HostBinding,args:["class.banta-mobile"]}],sendReplyOptionsTemplate:[{type:a.ContentChild,args:[oe,{read:a.TemplateRef}]}],customMenuItems:[{type:a.Input}],maxCommentLength:[{type:a.Input}],loadingMessages:[{type:a.Input}],useInlineReplies:[{type:a.Input}],commentView:[{type:a.ViewChild,args:["commentView"]}],threadViewQuery:[{type:a.ViewChildren,args:[ne]}],signInLabel:[{type:a.Input}],sendLabel:[{type:a.Input}],replyLabel:[{type:a.Input}],sendingLabel:[{type:a.Input}],permissionDeniedLabel:[{type:a.Input}],postCommentLabel:[{type:a.Input}],postReplyLabel:[{type:a.Input}],allowAttachments:[{type:a.Input}],fixedHeight:[{type:a.Input}],maxMessages:[{type:a.Input}],maxVisibleMessages:[{type:a.Input}],genericAvatarUrl:[{type:a.Input}],shouldInterceptMessageSend:[{type:a.Input}],participants:[{type:a.Input}],source:[{type:a.Input}],hashtags:[{type:a.Input}],topicID:[{type:a.Input}],signInSelected:[{type:a.Output}],editAvatarSelected:[{type:a.Output}],permissionDeniedError:[{type:a.Output}],upvoted:[{type:a.Output}],reported:[{type:a.Output}],selected:[{type:a.Output}],userSelected:[{type:a.Output}],usernameSelected:[{type:a.Output}],avatarSelected:[{type:a.Output}],shared:[{type:a.Output}]};var ie=function(){function e(e){this.backend=e,this._upvoted=new t.Subject,this._reported=new t.Subject,this._selected=new t.Subject}return Object.defineProperty(e.prototype,"upvoted",{get:function(){return this._upvoted},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"reported",{get:function(){return this._reported},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"message",{get:function(){return this._message},set:function(e){var t=this,r=null;this._message&&(r=this._message.id),this._message=e,e&&r===e.id||(this.unsubscribe&&this.unsubscribe(),e&&(this.unsubscribe=this.backend.watchMessage(e,(function(e){return t.message=e}))))},enumerable:!1,configurable:!0}),e.prototype.report=function(){this._reported.next()},e.prototype.upvote=function(){this._upvoted.next()},e.prototype.select=function(){this._selected.next()},e}();ie.decorators=[{type:a.Component,args:[{selector:"banta-live-comment",template:'\n <banta-comment \n *ngIf="message"\n [message]="message"\n (upvoted)="upvote()"\n (reported)="report()"\n (selected)="select()"\n ></banta-comment>\n ',styles:[""]}]}],ie.ctorParameters=function(){return[{type:Y}]},ie.propDecorators={upvoted:[{type:a.Output}],reported:[{type:a.Output}],selected:[{type:a.Output}],message:[{type:a.Input}]};var ce=function(){function e(e){this.chatBackend=e,this._subs=new t.Subscription,this.canComment=!0,this.allowAttachments=!1,this.signInSelected=new t.Subject,this.editAvatarSelected=new t.Subject,this.sending=!1,this.expandError=!1,this._text="",this.sendLabel="Send",this.sendingLabel="Sending",this.label="Post a comment",this.permissionDeniedLabel="Unavailable",this.signInLabel="Sign In",this.maxLength=1500,this.placeholder="",this.textChanged=new t.Subject,this.participants=[],this._permissionDeniedError=new t.Subject,this.autocompleteVisible=!1,this.autocompleteOptions=[],this.autoCompleteSelected=0,this.chatMessageAttachments=[]}return Object.defineProperty(e.prototype,"source",{get:function(){return this._source},set:function(e){var r,a=this;this._source&&(null===(r=this._subs)||void 0===r||r.unsubscribe(),this._source=null),this._source=e,this._subs=new t.Subscription,this._source&&setTimeout((function(){a._source.connectionStateChanged&&a._subs.add(a._source.connectionStateChanged.subscribe((function(e){"lost"===e?a.transientMessage="Reconnecting...":"restored"===e?a.transientMessage=void 0:"connecting"===e&&(a.transientMessage="Connecting...")})))}))},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"text",{get:function(){return this._text},set:function(e){this._text=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"userAvatarUrl",{get:function(){var e;return(null===(e=this.user)||void 0===e?void 0:e.avatarUrl)||this.genericAvatarUrl},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"permissionDeniedError",{get:function(){return this._permissionDeniedError},enumerable:!1,configurable:!0}),e.prototype.ngAfterViewInit=function(){"undefined"!=typeof window&&(document.body.querySelector("[ng-version]")||document.body).appendChild(this.autocompleteEl.nativeElement)},e.prototype.sendPermissionDenied=function(e){this._permissionDeniedError.next(e)},e.prototype.showAutoComplete=function(e){if("undefined"!=typeof window){this.autoCompleteSelected=0,this.autocompleteOptions=e;var t=this.autocompleteContainerEl.nativeElement.getBoundingClientRect();this.autocompleteEl.nativeElement.getBoundingClientRect();this.autocompleteEl.nativeElement.style.left=window.scrollX+t.left+"px",this.autocompleteEl.nativeElement.style.top=window.scrollY+t.top+"px",this.autocompleteEl.nativeElement.style.width=t.width+"px",this.autocompleteVisible=!0}},e.prototype.activateAutoComplete=function(e){e.action(),this.dismissAutoComplete()},e.prototype.dismissAutoComplete=function(){this.autocompleteVisible=!1,this.completionFunc=null,this.completionPrefix=""},e.prototype.indicateError=function(e){var t=this;this.sendError=new Error(e),this.expandError=!1,clearTimeout(this.errorTimeout),this.errorTimeout=setTimeout((function(){t.expandError=!0,t.errorTimeout=setTimeout((function(){t.expandError=!1}),5e3)}),100),"undefined"!=typeof window&&window.innerWidth<430&&alert(e)},Object.defineProperty(e.prototype,"isValidMessage",{get:function(){return this.text||this.chatMessageAttachments.length>0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"hasPendingAttachments",{get:function(){return this.chatMessageAttachments.some((function(e){return e.transientState}))},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"sendButtonEnabled",{get:function(){return!this.canComment||this.isValidMessage&&!this.hasPendingAttachments&&!this.sending},enumerable:!1,configurable:!0}),e.prototype.autocomplete=function(e){return D(this,void 0,void 0,(function(){var t;return R(this,(function(r){return t=this.textareaEl.nativeElement,this.text=this.text.slice(0,t.selectionStart-this.completionPrefix.length)+e+this.text.slice(t.selectionStart),[2]}))}))},e.prototype.insert=function(e){return D(this,void 0,void 0,(function(){var t;return R(this,(function(r){return t=this.textareaEl.nativeElement,this.text=this.text.slice(0,t.selectionStart)+e+this.text.slice(t.selectionStart),[2]}))}))},e.prototype.onKeyDown=function(e){return D(this,void 0,void 0,(function(){var t=this;return R(this,(function(r){switch(r.label){case 0:if(this.autocompleteVisible){if("Escape"===e.key)return this.dismissAutoComplete(),[2];if("Shift"===e.key)return[2];if("Enter"===e.key&&this.autocompleteOptions[this.autoCompleteSelected])return this.activateAutoComplete(this.autocompleteOptions[this.autoCompleteSelected]),e.stopPropagation(),e.preventDefault(),[2];if("ArrowUp"===e.key)return 0===this.autoCompleteSelected?this.autoCompleteSelected=this.autocompleteOptions.length-1:this.autoCompleteSelected=this.autoCompleteSelected-1,e.stopPropagation(),e.preventDefault(),[2];if("ArrowDown"===e.key)return this.autoCompleteSelected=(this.autoCompleteSelected+1)%this.autocompleteOptions.length,e.stopPropagation(),e.preventDefault(),[2]}return"Enter"===e.key&&e.ctrlKey?[4,this.sendMessage()]:[3,2];case 1:return r.sent(),[2];case 2:if(this.completionFunc){if("Backspace"===e.key){if(this.completionPrefix=this.completionPrefix.slice(0,this.completionPrefix.length-1),""===this.completionPrefix)return this.dismissAutoComplete(),[2]}else{if(" "===e.key||e.key.length>1)return this.dismissAutoComplete(),[2];this.completionPrefix+=e.key}this.showAutoComplete(this.completionFunc(this.completionPrefix))}else":"===e.key?this.startAutoComplete(e,(function(e){return(e=e.slice(1)).startsWith("-")&&(e=e.slice(1)),Object.keys($).filter((function(t){return t.includes(e)||$[t].keywords.some((function(t){return t.includes(e)}))})).map((function(e){return{label:$[e].char+" "+e,action:function(){return t.autocomplete($[e].char)}}})).slice(0,5)})):"@"===e.key?this.startAutoComplete(e,(function(e){return e=e.slice(1),t.participants.filter((function(t){return t.username.includes(e)})).map((function(e){return{label:"@"+e.username+" -- "+e.displayName,action:function(){return t.autocomplete("@"+e.username)}}}))})):"#"===e.key&&this.startAutoComplete(e,(function(e){return e=e.slice(1),t.hashtags.filter((function(t){return t.hashtag.includes(e)})).map((function(e){return{label:"#"+e.hashtag+(e.description?" -- "+e.description:""),action:function(){return t.autocomplete("#"+e.hashtag)}}})).slice(0,5)}));return[2]}}))}))},e.prototype.startAutoComplete=function(e,t){this.completionPrefix=e.key,this.completionFunc=t,this.showAutoComplete(this.completionFunc(this.completionPrefix))},e.prototype.onBlur=function(){var e=this;setTimeout((function(){return e.dismissAutoComplete()}),250)},e.prototype.insertEmoji=function(e){this.text+=e},e.prototype.showSignIn=function(){this.signInSelected.next()},e.prototype.showEditAvatar=function(){this.editAvatarSelected.next()},e.prototype.sendMessage=function(){return D(this,void 0,void 0,(function(){var e,t,r,a=this;return R(this,(function(n){switch(n.label){case 0:if(!this.source)return[2];this.sending=!0,this.sendError=null,n.label=1;case 1:if(n.trys.push([1,,7,8]),e=(this.text||"").trim(),this.canComment&&!this.isValidMessage)return[2];t={user:this.user,sentAt:Date.now(),url:"undefined"!=typeof window?location.href:void 0,likes:0,message:e,attachments:this.chatMessageAttachments.filter((function(e){return e.url}))},n.label=2;case 2:return n.trys.push([2,4,,6]),[4,this.submit(t)];case 3:return n.sent(),this.text="",this.chatMessageAttachments=[],[3,6];case 4:return r=n.sent(),[4,new Promise((function(e){return setTimeout((function(){return e()}),1e3)}))];case 5:return n.sent(),this.indicateError(r.message),[3,6];case 6:return[3,8];case 7:return this.sending=!1,setTimeout((function(){a.textareaEl.nativeElement.focus()}),100),[7];case 8:return[2]}}))}))},e.prototype.addedAttachment=function(e){this.chatMessageAttachments.push(e)},e.prototype.attachmentError=function(e){var t=this;setTimeout((function(){t.chatMessageAttachments=t.chatMessageAttachments.filter((function(t){return t!==e}))}),3e3)},e.prototype.removeAttachment=function(e){var t=this.chatMessageAttachments.indexOf(e);t>=0&&this.chatMessageAttachments.splice(t,1)},e.prototype.alertError=function(){this.sendError&&alert(this.sendError.message)},e}();ce.decorators=[{type:a.Component,args:[{selector:"banta-comment-field",template:'<form class="new-message" (submit)="sendMessage()">\r\n <div class="avatar-container">\r\n <a href="javascript:;"\r\n class="avatar"\r\n (click)="showEditAvatar()"\r\n [style.background-image]="\'url(\' + userAvatarUrl + \')\'"\r\n ></a>\r\n </div>\r\n <div class="text-container">\r\n <div class="field-container">\r\n <div class="field-row">\r\n <mat-form-field class="message-field" appearance="outline" floatLabel="always">\r\n <mat-label>{{label}}</mat-label>\r\n <textarea\r\n #textarea\r\n name="message"\r\n attachmentScraper\r\n [(attachments)]="chatMessageAttachments"\r\n [placeholder]="placeholder"\r\n matInput\r\n cdkTextareaAutosize\r\n [maxlength]="maxLength"\r\n (keydown)="onKeyDown($event)"\r\n (blur)="onBlur()"\r\n [disabled]="sending"\r\n [(ngModel)]="text"></textarea>\r\n </mat-form-field>\r\n <div class="options-line">\r\n <mat-spinner *ngIf="sending" class="icon loading" diameter="18" strokeWidth="2"></mat-spinner>\r\n <div *ngIf="sendError" class="error-message" [class.expanded]="expandError" [matTooltip]="sendError.message" (click)="alertError()">\r\n <mat-icon *ngIf="sendError">error</mat-icon>\r\n {{sendError.message}}\r\n </div>\r\n <div *ngIf="!sendError && transientMessage" class="transient-message" [class.expanded]="true" [matTooltip]="transientMessage" (click)="alertError()">\r\n <mat-spinner [inline]="true" [diameter]="15"></mat-spinner>\r\n {{transientMessage}}\r\n </div>\r\n <div class="spacer"></div>\r\n <div class="custom">\r\n <ng-content></ng-content>\r\n </div>\r\n <banta-attachment-button \r\n *ngIf="allowAttachments"\r\n (addedAttachment)="addedAttachment($event)"\r\n (attachmentError)="attachmentError($event)"\r\n ></banta-attachment-button>\r\n <emoji-selector-button (selected)="insertEmoji($event)"></emoji-selector-button>\r\n </div>\r\n \r\n </div>\r\n <div #autocompleteContainer class="autocomplete-container">\r\n <div #autocomplete class="autocomplete" [class.visible]="autocompleteVisible">\r\n\r\n <div>\r\n <strong>{{completionPrefix}}</strong>...\r\n </div>\r\n <a\r\n mat-button\r\n *ngFor="let option of autocompleteOptions; index as index"\r\n (click)="activateAutoComplete(option)"\r\n [class.active]="autoCompleteSelected === index"\r\n >\r\n {{option.label}}\r\n </a>\r\n </div>\r\n </div>\r\n\r\n <banta-attachments \r\n [attachments]="chatMessageAttachments"\r\n [editing]="true"\r\n (remove)="removeAttachment($event)"\r\n ></banta-attachments>\r\n </div>\r\n </div>\r\n <div class="actions">\r\n <ng-container *ngIf="!user">\r\n <button\r\n mat-raised-button\r\n color="primary"\r\n type="button"\r\n (click)="showSignIn()"\r\n >{{signInLabel}}</button>\r\n </ng-container>\r\n <ng-container *ngIf="user">\r\n <button\r\n mat-raised-button\r\n class="send"\r\n color="primary"\r\n [disabled]="!sendButtonEnabled"\r\n >\r\n <ng-container *ngIf="canComment">\r\n <mat-icon *ngIf="!sending">chevron_right</mat-icon>\r\n <mat-spinner *ngIf="sending" class="icon" diameter="18" strokeWidth="2"></mat-spinner>\r\n </ng-container>\r\n <span class="label">\r\n <ng-container *ngIf="!canComment">\r\n {{permissionDeniedLabel}}\r\n </ng-container>\r\n <ng-container *ngIf="canComment">\r\n <ng-container *ngIf="!sending">\r\n {{sendLabel}}\r\n </ng-container>\r\n <ng-container *ngIf="sending">\r\n {{sendingLabel}}\r\n </ng-container>\r\n </ng-container>\r\n </span>\r\n </button>\r\n </ng-container>\r\n </div>\r\n</form>',styles:["@-webkit-keyframes comment-field-appear{0%{transform:translateY(128px);opacity:0}to{transform:translate(0);opacity:1}}@keyframes comment-field-appear{0%{transform:translateY(128px);opacity:0}to{transform:translate(0);opacity:1}}:host{margin:0 2em 0 0;display:block;-webkit-animation-name:comment-field-appear;animation-name:comment-field-appear;-webkit-animation-duration:.8s;animation-duration:.8s;-webkit-animation-delay:.4s;animation-delay:.4s;-webkit-animation-fill-mode:both;animation-fill-mode:both;position:relative;z-index:20}.avatar-container{width:calc(48px + 1.75em);display:flex;justify-content:flex-end;flex-shrink:0}.avatar-container .avatar{width:48px;height:48px;background:#000;border-radius:100%;background-size:cover;background-repeat:no-repeat;background-position:50%;margin-top:.75em;margin-right:.75em}form{display:flex;padding:.5em;align-items:center}form .text-container{position:relative;display:flex;flex-grow:1;min-width:0}form .text-container textarea{font-size:14pt;width:100%}form .text-container textarea[disabled]{opacity:.5}form .text-container mat-spinner.loading{position:absolute;left:.5em;bottom:.5em}form .text-container .options-line{display:flex;align-items:center}form .text-container .options-line>*{flex-shrink:0}form .text-container .options-line .transient-message{display:flex;flex-direction:row;align-items:center;gap:.5em}form .text-container .options-line .error-message{left:.5em;bottom:.5em;color:#683333;overflow-x:hidden;max-width:1.5em;white-space:nowrap;transition:max-width 2s ease-in-out;text-overflow:ellipsis;overflow:hidden;flex-shrink:1}form .text-container .options-line .error-message.expanded,form .text-container .options-line .error-message:hover{max-width:100%}form .text-container .options-line .error-message mat-icon{vertical-align:middle}form input[type=text]{background:#000;color:#fff;border:1px solid #333;width:100%;height:1em}form .actions{margin-left:1em;flex-shrink:0}form button{display:block;margin:0 0 0 auto}form.new-message{display:flex;align-items:flex-start;min-width:0}form.new-message .field-container{flex-grow:1;display:flex;flex-direction:column;min-width:0}form.new-message mat-form-field{width:100%}form.new-message mat-form-field ::ng-deep .mat-form-field-wrapper{padding-bottom:0}form.new-message button{margin:1.25em 0 0}button.send{min-width:9em}textarea{max-height:7em}.autocomplete-container{width:calc(100% - 2em);position:relative;pointer-events:none;top:-2em}.autocomplete{visibility:hidden;pointer-events:none;position:absolute;background:#333;padding:.5em;display:flex;flex-direction:column;z-index:100}.autocomplete.visible{visibility:visible;pointer-events:auto}.autocomplete a{width:100%;text-align:left}.autocomplete a.active{background:#555}.image-attachments-container{display:flex;gap:20px}.image-attachments-container .image-attachment{width:300px;position:relative;text-align:center}.image-attachments-container .image-attachment.with-border{outline:1px solid #333;padding:1em 0}.image-attachments-container .image-attachment mat-spinner{display:block;margin:0 auto .5em;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.image-attachments-container .image-attachment mat-icon.error{display:block;font-size:48px;width:48px;height:48px;margin:0 auto .5em}.image-attachments-container .image-attachment .error{color:#b76363}.image-attachments-container .image-attachment img{width:300px;border-radius:10px}.image-attachments-container .image-attachment .remove-img{position:absolute;right:10px;top:10px;margin:0}.card-attachment,.field-row{position:relative}.card-attachment a{display:flex;align-items:flex-start;gap:1em;width:100%;border:1px solid #666;border-radius:4px;padding:2em;box-sizing:border-box;background-color:#191919}.card-attachment a img{width:300px;aspect-ratio:16/9;-o-object-fit:cover;object-fit:cover;border-radius:10px}.card-attachment a h1{margin:0;font-size:30px}.card-attachment .remove-img{position:absolute;right:10px;top:10px;margin:0}@media (max-width:500px){:host{margin:0}.avatar-container{width:auto;flex-shrink:0}.avatar-container .avatar{width:32px;height:32px;margin-top:1.5em}:host.can-comment button.send .label,:host:not(.can-comment) .text-container,:host:not(.can-comment) mat-form-field.message-field{display:none}button.send{min-width:auto;margin-top:1.5em}}:host-context(.banta-mobile) :host{margin:0}:host-context(.banta-mobile) .avatar-container{width:auto;flex-shrink:0}:host-context(.banta-mobile) .avatar-container .avatar{width:32px;height:32px;margin-top:1.5em}:host-context(.banta-mobile) :host.can-comment button.send .label,:host-context(.banta-mobile) :host:not(.can-comment) .text-container,:host-context(.banta-mobile) :host:not(.can-comment) mat-form-field.message-field{display:none}:host-context(.banta-mobile) button.send{min-width:auto;margin-top:1.5em}"]}]}],ce.ctorParameters=function(){return[{type:Y}]},ce.propDecorators={source:[{type:a.Input}],user:[{type:a.Input}],canComment:[{type:a.HostBinding,args:["class.can-comment"]},{type:a.Input}],allowAttachments:[{type:a.Input}],signInSelected:[{type:a.Output}],editAvatarSelected:[{type:a.Output}],transientMessage:[{type:a.Input}],sendLabel:[{type:a.Input}],sendingLabel:[{type:a.Input}],label:[{type:a.Input}],permissionDeniedLabel:[{type:a.Input}],signInLabel:[{type:a.Input}],maxLength:[{type:a.Input}],placeholder:[{type:a.Input}],textChanged:[{type:a.Output}],shouldInterceptMessageSend:[{type:a.Input}],autocompleteEl:[{type:a.ViewChild,args:["autocomplete"]}],autocompleteContainerEl:[{type:a.ViewChild,args:["autocompleteContainer"]}],textareaEl:[{type:a.ViewChild,args:["textarea"]}],hashtags:[{type:a.Input}],participants:[{type:a.Input}],genericAvatarUrl:[{type:a.Input}],permissionDeniedError:[{type:a.Output}],submit:[{type:a.Input}]};var le=function(){function e(){this.commentsOrder=f.CommentsOrder,this._sortChange=new t.Subject,this._sort=f.CommentsOrder.LIKES}return Object.defineProperty(e.prototype,"sort",{get:function(){return this._sort},set:function(e){var t=this;this._sort!==e&&(this._sort=e,setTimeout((function(){return t._sortChange.next(e)})))},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"sortChange",{get:function(){return this._sortChange.asObservable()},enumerable:!1,configurable:!0}),e}();le.decorators=[{type:a.Component,args:[{selector:"banta-comment-sort",template:'<mat-form-field appearance="outline" floatLabel="always">\r\n <mat-label>Sort by</mat-label>\r\n <mat-select [(value)]="sort" >\r\n <mat-option [value]="commentsOrder.NEWEST">Newest</mat-option>\r\n <mat-option [value]="commentsOrder.OLDEST">Oldest</mat-option>\r\n <mat-option [value]="commentsOrder.LIKES">Likes</mat-option>\r\n </mat-select>\r\n</mat-form-field>',styles:["mat-form-field{width:100%}"]}]}],le.propDecorators={sort:[{type:a.Input}],sortChange:[{type:a.Output}]};var de=function(){function e(e){this.cdnProvider=e,this._addedAttachment=new t.Subject,this._attachmentError=new t.Subject}return Object.defineProperty(e.prototype,"addedAttachment",{get:function(){return this._addedAttachment.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"attachmentError",{get:function(){return this._attachmentError.asObservable()},enumerable:!1,configurable:!0}),e.prototype.show=function(){this.fileInput.nativeElement.click()},e.prototype.fileChange=function(e){return D(this,void 0,void 0,(function(){var t,r,a,n,o;return R(this,(function(s){switch(s.label){case 0:if(!(t=e.currentTarget).files.length)return[3,5];console.log("[Banta] File Added to comment"),r=t.files[0],a=void 0,n={type:r.type,url:void 0,transientState:{uploading:!0,error:!1,errorMessage:void 0}},this._addedAttachment.next(n),s.label=1;case 1:return s.trys.push([1,3,,4]),[4,this.cdnProvider.uploadImage(r)];case 2:return a=s.sent(),[3,4];case 3:return o=s.sent(),n.transientState.error=!0,n.transientState.errorMessage="Failed to upload",console.error("[Banta] Caught an error while uploading image to CDN:"),console.error(o),alert("Failed to upload image. Please try again later."),this._attachmentError.next(n),[2];case 4:if(!a)return[2];n.url=a,n.transientState=void 0,s.label=5;case 5:return[2]}}))}))},e}();de.decorators=[{type:a.Component,args:[{selector:"banta-attachment-button",template:'<button matTooltip="Add an image or gif" #button type="button" mat-icon-button (click)="show()">\r\n\t<mat-icon>image</mat-icon>\r\n</button>\r\n<input style="display: none;" #fileUpload [multiple]="false" (change)="fileChange($event)" type="file" >',styles:["button{color:#666}"]}]}],de.ctorParameters=function(){return[{type:f.CDNProvider}]},de.propDecorators={fileInput:[{type:a.ViewChild,args:["fileUpload",{static:!1}]}],addedAttachment:[{type:a.Output}],attachmentError:[{type:a.Output}]};var ue=function(){function e(e,r){this.elementRef=e,this.chatBackend=r,this.attachments=[],this.attachmentsChange=new t.Subject,this.scrapeDebounce=1500,this.fragments=new Map}return e.prototype.ngOnInit=function(){var e=this;"undefined"!=typeof window&&this.element.addEventListener("keydown",(function(){clearTimeout(e.scrapeTimeout),e.scrapeTimeout=setTimeout((function(){return e.scrape()}),e.scrapeDebounce)}))},Object.defineProperty(e.prototype,"element",{get:function(){var e;return null===(e=this.elementRef)||void 0===e?void 0:e.nativeElement},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"text",{get:function(){return this.element.value},enumerable:!1,configurable:!0}),e.prototype.scrape=function(){var e,t,r,a,n,o,s,i,c,l,d=this,u={likes:0,message:this.text,sentAt:void 0,user:null,attachments:this.attachments},h=[];try{for(var g=U(this.chatBackend.attachmentScrapers),y=g.next();!y.done;y=g.next()){var p=y.value,m=p.findFragments(u);if(m)try{for(var f=(r=void 0,U(m)),b=f.next();!b.done;b=f.next()){var w=b.value;h.push(w.text),this.fragments.has(w.text)||(console.log("Scraped new fragment:"),console.dir(w),this.fragments.set(w.text,{fragment:w,resolution:void 0}))}}catch(e){r={error:e}}finally{try{b&&!b.done&&(a=f.return)&&a.call(f)}finally{if(r)throw r.error}}else console.error("Attachment fragment scraper "+p.constructor.name+" is implemented incorrectly: Returned null instead of array")}}catch(t){e={error:t}}finally{try{y&&!y.done&&(t=g.return)&&t.call(g)}finally{if(e)throw e.error}}var k=[];try{for(var v=U(this.fragments),_=v.next();!_.done;_=v.next()){var x=F(_.value,1)[0];h.includes(x)||k.push(x)}}catch(e){n={error:e}}finally{try{_&&!_.done&&(o=v.return)&&o.call(v)}finally{if(n)throw n.error}}try{for(var j=U(k),M=j.next();!M.done;M=j.next()){var S=M.value;console.log("Removed fragment: "+S),this.fragments.delete(S)}}catch(e){s={error:e}}finally{try{M&&!M.done&&(i=j.return)&&i.call(j)}finally{if(s)throw s.error}}var I=function(e,t){if(t.resolution)return"continue";t.resolution=new Promise((function(r,a){return D(d,void 0,void 0,(function(){var a,n,o,s,i,c,l,d;return R(this,(function(h){switch(h.label){case 0:console.log("Resolving fragment "+e),h.label=1;case 1:h.trys.push([1,8,9,10]),a=U(this.chatBackend.attachmentResolvers),n=a.next(),h.label=2;case 2:if(n.done)return[3,7];o=n.value,console.log("- Trying resolver "+o.constructor.name+"..."),h.label=3;case 3:return h.trys.push([3,5,,6]),[4,o.resolveFragment(u,t.fragment)];case 4:return(s=h.sent())?(console.log("Resolved fragment "+e+" into attachment:"),console.dir(s),this.attachments.push(s),this.attachmentsChange.next(this.attachments.slice()),r(s),[3,7]):[3,6];case 5:return i=h.sent(),console.error("Caught error during attachment resolver "+o.constructor.name+":"),console.error(i),[3,6];case 6:return n=a.next(),[3,2];case 7:return[3,10];case 8:return c=h.sent(),l={error:c},[3,10];case 9:try{n&&!n.done&&(d=a.return)&&d.call(a)}finally{if(l)throw l.error}return[7];case 10:return[2]}}))}))}))};try{for(var O=U(this.fragments),C=O.next();!C.done;C=O.next()){var P=F(C.value,2);I(x=P[0],P[1])}}catch(e){c={error:e}}finally{try{C&&!C.done&&(l=O.return)&&l.call(O)}finally{if(c)throw c.error}}},e}();ue.decorators=[{type:a.Directive,args:[{selector:"[attachmentScraper]"}]}],ue.ctorParameters=function(){return[{type:a.ElementRef},{type:Y}]},ue.propDecorators={attachments:[{type:a.Input}],attachmentsChange:[{type:a.Output}]};var he=[ae,ne,se,ie,ce,le,de,oe,ue],ge=function(){};ge.decorators=[{type:a.NgModule,args:[{declarations:he,imports:[i.CommonModule,v.TextFieldModule,y.FormsModule,c.MatIconModule,h.MatFormFieldModule,g.MatInputModule,d.MatButtonModule,k.MatMenuModule,l.MatProgressSpinnerModule,A,W,_.MatTooltipModule,x.MatSelectModule,u.OverlayModule,p.PortalModule],exports:he}]}];var ye=function(e){function r(r,a,n,o){var s=e.call(this)||this;return s.backend=r,s.identifier=a,s.parentIdentifier=n,s.sortOrder=o,s.subscription=new t.Subscription,s._state="connecting",s._connectionStateChanged=new t.Subject,s.messageMap=new Map,s._messageReceived=new t.Subject,s._messageUpdated=new t.Subject,s._messageSent=new t.Subject,s._messageObserved=new t.Subject,s.messages=[],s.ready=new Promise((function(e){return s.markReady=e})),s}return L(r,e),Object.defineProperty(r.prototype,"state",{get:function(){return this._state},set:function(e){var t=this;this._state=e,setTimeout((function(){return t._connectionStateChanged.next(t._state)}))},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"connectionStateChanged",{get:function(){return this._connectionStateChanged.asObservable()},enumerable:!1,configurable:!0}),r.prototype.bind=function(t){var r=Object.create(null,{bind:{get:function(){return e.prototype.bind}}});return D(this,void 0,void 0,(function(){var e=this;return R(this,(function(a){switch(a.label){case 0:return r.bind.call(this,t),this.state="connected",this.markReady(),[4,this.subscribeToTopic()];case 1:return a.sent(),this.subscription.add(this.backend.userChanged.subscribe((function(){return e.authenticate()}))),t.addEventListener("open",(function(){return D(e,void 0,void 0,(function(){return R(this,(function(e){return this.state="connected",[2]}))}))})),t.addEventListener("lost",(function(){return D(e,void 0,void 0,(function(){return R(this,(function(e){return this.state="lost",[2]}))}))})),t.addEventListener("restore",(function(){return D(e,void 0,void 0,(function(){return R(this,(function(e){switch(e.label){case 0:return this.state="restored",[4,this.authenticate()];case 1:return e.sent(),[4,this.subscribeToTopic()];case 2:return e.sent(),[2]}}))}))})),[2,this]}}))}))},r.prototype.mapOrUpdateMessages=function(e){var t=this;return e.map((function(e){return t.mapOrUpdateMessage(e)}))},r.prototype.mapOrUpdateMessage=function(e){var t=this.messageMap.get(e.id);return t?e=Object.assign(t,e):(this.messageMap.set(e.id,e),this._messageObserved.next(e)),e},r.prototype.getExistingMessages=function(){return D(this,void 0,void 0,(function(){var e;return R(this,(function(t){switch(t.label){case 0:return[4,this.peer.getExistingMessages()];case 1:return e=t.sent(),[2,e=this.mapOrUpdateMessages(e)]}}))}))},r.prototype.ensureConnection=function(e){return D(this,void 0,void 0,(function(){var t;return R(this,(function(r){if(t="Connection to chat services is not currently available.","connected"!==this.state&&"restored"!==this.state)throw e?new Error(e+": "+t):new Error(""+t);return[2]}))}))},r.prototype.editMessage=function(e,t){return D(this,void 0,void 0,(function(){return R(this,(function(r){switch(r.label){case 0:return[4,this.ensureConnection()];case 1:return r.sent(),[4,this.peer.editMessage(e,t)];case 2:return r.sent(),[2]}}))}))},r.prototype.subscribeToTopic=function(){return D(this,void 0,void 0,(function(){return R(this,(function(e){switch(e.label){case 0:return[4,this.peer.subscribe(this.identifier,this.parentIdentifier,this.sortOrder)];case 1:return e.sent(),[2]}}))}))},r.prototype.authenticate=function(){var e;return D(this,void 0,void 0,(function(){var t;return R(this,(function(r){switch(r.label){case 0:if(!this.backend.user)return[3,4];r.label=1;case 1:return r.trys.push([1,3,,4]),[4,this.peer.authenticate(null===(e=this.backend.user)||void 0===e?void 0:e.token)];case 2:return r.sent(),[3,4];case 3:return t=r.sent(),console.error("Could not authenticate with Banta server:"),console.error(t),[3,4];case 4:return[2]}}))}))},r.prototype.close=function(){e.prototype.close.call(this),this.subscription.unsubscribe()},r.prototype.onPermissions=function(e){window.bantaPermissionsDebug=e,this.permissions=e},r.prototype.onChatMessage=function(e){if(this.messageMap.has(e.id))return this.mapOrUpdateMessage(e);e.hidden||(this.messageMap.set(e.id,e),this._messageReceived.next(e))},Object.defineProperty(r.prototype,"messageReceived",{get:function(){return this._messageReceived.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"messageUpdated",{get:function(){return this._messageUpdated.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"messageSent",{get:function(){return this._messageSent.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"messageObserved",{get:function(){return this._messageObserved.asObservable()},enumerable:!1,configurable:!0}),r.prototype.send=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){switch(t.label){case 0:return[4,this.ensureConnection()];case 1:return t.sent(),[4,this.peer.sendMessage(e)];case 2:return[2,t.sent()]}}))}))},r.prototype.loadAfter=function(e,t){return D(this,void 0,void 0,(function(){var r;return R(this,(function(a){switch(a.label){case 0:return e?e.pagingCursor?(r=this.mapOrUpdateMessages,[4,this.peer.loadAfter(Number(e.pagingCursor),t)]):[2,[]]:[2];case 1:return[2,r.apply(this,[a.sent()])]}}))}))},r.prototype.get=function(e){return D(this,void 0,void 0,(function(){var t,r;return R(this,(function(a){switch(a.label){case 0:return this.messageMap.has(e)?[2,this.messageMap.get(e)]:[4,this.ensureConnection("Could not get message")];case 1:return a.sent(),[4,this.peer.getMessage(e)];case 2:return t=a.sent(),this.messageMap.has(e)?(r=this.messageMap.get(e),Object.assign(r,t),t=r):this.messageMap.set(e,t),[2,t]}}))}))},r.prototype.getCount=function(){return D(this,void 0,void 0,(function(){return R(this,(function(e){switch(e.label){case 0:return[4,this.peer.getCount()];case 1:return[2,e.sent()]}}))}))},r.prototype.likeMessage=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){switch(t.label){case 0:return[4,this.ensureConnection()];case 1:return t.sent(),[4,this.peer.likeMessage(e)];case 2:return[2,t.sent()]}}))}))},r.prototype.unlikeMessage=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){switch(t.label){case 0:return[4,this.ensureConnection()];case 1:return t.sent(),[4,this.peer.unlikeMessage(e)];case 2:return[2,t.sent()]}}))}))},r.prototype.deleteMessage=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){switch(t.label){case 0:return[4,this.ensureConnection()];case 1:return t.sent(),[4,this.peer.deleteMessage(e)];case 2:return[2,t.sent()]}}))}))},r}(f.SocketRPC);q([f.RpcEvent(),z("design:type",Function),z("design:paramtypes",[Object]),z("design:returntype",void 0)],ye.prototype,"onPermissions",null),q([f.RpcEvent(),z("design:type",Function),z("design:paramtypes",[Object]),z("design:returntype",void 0)],ye.prototype,"onChatMessage",null);var pe="BANTA_SDK_OPTIONS",me=function(e){function t(t){var r=e.call(this)||this;return r.options=t,r}return L(t,e),Object.defineProperty(t.prototype,"serviceUrl",{get:function(){var e,t;return""+(null!==(t=null===(e=this.options)||void 0===e?void 0:e.serviceUrl)&&void 0!==t?t:"http://localhost:3422")},enumerable:!1,configurable:!0}),t.prototype.connectToService=function(){return D(this,void 0,void 0,(function(){var e;return R(this,(function(t){switch(t.label){case 0:return e=new f.DurableSocket(this.serviceUrl.replace(/^http/,"ws")+"/socket"),[4,new Promise((function(t,r){e.onopen=function(){t()},e.onclose=function(e){503===e.code&&(console.error("Failed to connect to chat service!"),r(e))}}))];case 1:return t.sent(),e.onerror=void 0,[2,e]}}))}))},t.prototype.getSourceForTopic=function(e,t){return D(this,void 0,void 0,(function(){var r,a;return R(this,(function(n){switch(n.label){case 0:return a=(r=new ye(this,e,void 0,(null==t?void 0:t.sortOrder)||f.CommentsOrder.NEWEST)).bind,[4,this.connectToService()];case 1:return[4,a.apply(r,[n.sent()])];case 2:return[2,n.sent()]}}))}))},t.prototype.getSourceForThread=function(e,t,r){return D(this,void 0,void 0,(function(){var a,n;return R(this,(function(o){switch(o.label){case 0:return n=(a=new ye(this,e,t,(null==r?void 0:r.sortOrder)||f.CommentsOrder.NEWEST)).bind,[4,this.connectToService()];case 1:return[4,n.apply(a,[o.sent()])];case 2:return[2,o.sent()]}}))}))},t.prototype.getSourceCountForTopic=function(e){return D(this,void 0,void 0,(function(){var t;return R(this,(function(r){switch(r.label){case 0:return[4,fetch(this.serviceUrl+"/topics/"+e)];case 1:return(t=r.sent()).status>=400?[2,0]:[4,t.json()];case 2:return[2,r.sent().messageCount||0]}}))}))},t.prototype.refreshMessage=function(e){throw new Error("Method not implemented.")},t.prototype.getMessage=function(e,t){throw new Error("Method not implemented.")},t.prototype.getSubMessage=function(e,t,r){throw new Error("Method not implemented.")},t.prototype.watchMessage=function(e,t){throw new Error("Method not implemented.")},t.prototype.getCardForUrl=function(e){return D(this,void 0,void 0,(function(){var t,r,a;return R(this,(function(n){switch(n.label){case 0:return[4,fetch(this.serviceUrl+"/urls",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:e})})];case 1:return 404==(t=n.sent()).status?[2,null]:t.status>=400?(r=Error.bind,a="Failed to retrieve URL card: "+t.status+". Body: '",[4,t.text()]):[3,3];case 2:throw new(r.apply(Error,[void 0,a+n.sent()+"'"]));case 3:return[4,t.json()];case 4:return[2,n.sent()]}}))}))},t}(Y);me.decorators=[{type:a.Injectable}],me.ctorParameters=function(){return[{type:void 0,decorators:[{type:a.Inject,args:[pe]}]}]};var fe=new RegExp("(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?","ig"),be=function(){function e(){}return e.prototype.findFragments=function(e){var t;return e.attachments&&e.attachments.filter((function(e){return"url"===e.type})).length>0?null:Array.from(null!==(t=e.message.match(fe))&&void 0!==t?t:[]).reduce((function(e,t){return e.includes(t)||e.push(t),e}),[]).map((function(t){return{text:t,offset:e.message.indexOf(t),type:"url"}}))},e}(),we=function(){function e(e){this.backend=e}return e.prototype.resolveFragment=function(e,t){return D(this,void 0,void 0,(function(){var e;return R(this,(function(r){switch(r.label){case 0:return"url"!==t.type?[2,null]:[4,this.backend.getCardForUrl(t.text)];case 1:return(e=r.sent())?[2,{type:"card",url:t.text,card:e,style:"block"}]:[2]}}))}))},e}();we.decorators=[{type:a.Injectable}],we.ctorParameters=function(){return[{type:Y}]};var ke=function(){function e(){}return e.prototype.resolveFragment=function(e,t){return D(this,void 0,void 0,(function(){var e,r;return R(this,(function(a){return"url"!==t.type?[2,null]:(t.text.match(/https?:\/\/(www\.|m\.)?youtube.com\/watch\?v=/)&&(r=/watch\?v=([^&]+)/.exec(t.text))&&(e=r[1]),e?[2,{type:"iframe",url:"https://www.youtube.com/embed/"+e,style:"block"}]:[2,null])}))}))},e}(),ve=function(){function e(){}return e.prototype.resolveFragment=function(e,t){var r;return D(this,void 0,void 0,(function(){var e;return R(this,(function(a){return"url"===t.type&&t.text.startsWith("https://giphy.com/gifs")&&(e=null===(r=/[^-\/]+$/.exec(t.text))||void 0===r?void 0:r.toString())?[2,{type:"iframe",url:"https://giphy.com/embed/"+e,style:"inline"}]:[2,null]}))}))},e}(),_e=function(){function e(){}return e.prototype.resolveFragment=function(e,t){return D(this,void 0,void 0,(function(){return R(this,(function(e){return"url"===t.type&&t.text.startsWith("https://twitter.com/")?[2,{type:"tweet",url:t.text,style:"block"}]:[2,null]}))}))},e}(),xe=function(){function e(e){if("undefined"!=typeof window&&!document.querySelector('script[src="https://platform.twitter.com/widgets.js"]')){var t=document.createElement("script");t.src="https://platform.twitter.com/widgets.js",t.async=!0,document.body.appendChild(t)}e.registerAttachmentScraper(new be),e.registerAttachmentResolver(new ve),e.registerAttachmentResolver(new ke),e.registerAttachmentResolver(new _e),e.registerAttachmentResolver(new we(e))}return e.configure=function(t){return{ngModule:e,providers:[{provide:pe,useValue:t||{}},{provide:Y,useClass:me}]}},e}();xe.decorators=[{type:a.NgModule,args:[{imports:[i.CommonModule,y.FormsModule,A,ge,te,W,c.MatIconModule,d.MatButtonModule,_.MatTooltipModule,k.MatMenuModule,m.MatDialogModule,h.MatFormFieldModule,g.MatInputModule,l.MatProgressSpinnerModule,w.MatSnackBarModule,u.OverlayModule,p.PortalModule],declarations:[K,Q,re],exports:[K,Q,re,A,te,ge,W]}]}],xe.ctorParameters=function(){return[{type:Y}]},e.AttachmentButtonComponent=de,e.AttachmentScraperDirective=ue,e.BANTA_SDK_OPTIONS=pe,e.BantaAttachmentComponent=C,e.BantaAttachmentsComponent=P,e.BantaChatComponent=Z,e.BantaCommentsComponent=se,e.BantaCommonModule=A,e.BantaComponent=K,e.BantaLogoComponent=Q,e.BantaMarkdownToHtmlPipe=S,e.BantaMentionLinkerPipe=O,e.BantaReplySendOptionsDirective=oe,e.BantaSdkModule=xe,e.BantaTrustResourceUrlPipe=I,e.ChatBackend=me,e.ChatBackendBase=Y,e.ChatMessageComponent=X,e.ChatModule=te,e.ChatSource=ye,e.ChatViewComponent=G,e.CommentComponent=ae,e.CommentFieldComponent=ce,e.CommentSortComponent=le,e.CommentViewComponent=ne,e.CommentsModule=ge,e.EMOJIS=$,e.EmojiModule=W,e.EmojiSelectorButtonComponent=N,e.EmojiSelectorPanelComponent=B,e.GiphyAttachmentResolver=ve,e.LightboxComponent=M,e.LiveChatMessageComponent=J,e.LiveCommentComponent=ie,e.LiveMessageComponent=re,e.TimestampComponent=j,e.TweetAttachmentResolver=_e,e.UrlAttachmentResolver=we,e.UrlAttachmentScraper=be,e.YouTubeAttachmentResolver=ke,e.lazyConnection=function(e){return new t.Observable((function(r){var a=new t.Subject,n=a.subscribe(r);return e.start(a),function(){n.unsubscribe(),e.stop()}})).pipe(r.publish()).refCount()},Object.defineProperty(e,"__esModule",{value:!0})}));
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("rxjs"),require("rxjs/operators"),require("@angular/core"),require("marked"),require("dompurify"),require("@angular/platform-browser"),require("@angular/common"),require("@angular/material/icon"),require("@angular/material/progress-spinner"),require("@angular/material/button"),require("@angular/cdk/overlay"),require("@angular/material/form-field"),require("@angular/material/input"),require("@angular/forms"),require("@angular/cdk/portal"),require("@angular/material/dialog"),require("@banta/common"),require("@angular/router"),require("@angular/material/snack-bar"),require("@angular/material/menu"),require("@angular/cdk/text-field"),require("@angular/material/tooltip"),require("@angular/material/select")):"function"==typeof define&&define.amd?define("@banta/sdk",["exports","rxjs","rxjs/operators","@angular/core","marked","dompurify","@angular/platform-browser","@angular/common","@angular/material/icon","@angular/material/progress-spinner","@angular/material/button","@angular/cdk/overlay","@angular/material/form-field","@angular/material/input","@angular/forms","@angular/cdk/portal","@angular/material/dialog","@banta/common","@angular/router","@angular/material/snack-bar","@angular/material/menu","@angular/cdk/text-field","@angular/material/tooltip","@angular/material/select"],t):t(((e="undefined"!=typeof globalThis?globalThis:e||self).banta=e.banta||{},e.banta.sdk={}),e.rxjs,e.rxjs.operators,e.ng.core,e.marked,e.DOMPurify,e.ng.platformBrowser,e.ng.common,e.ng.material.icon,e.ng.material.progressSpinner,e.ng.material.button,e.ng.cdk.overlay,e.ng.material.formField,e.ng.material.input,e.ng.forms,e.ng.cdk.portal,e.ng.material.dialog,e.common$1,e.ng.router,e.ng.material.snackBar,e.ng.material.menu,e.ng.cdk.textField,e.ng.material.tooltip,e.ng.material.select)}(this,(function(e,t,r,a,n,o,s,i,c,l,d,u,h,g,y,p,m,f,b,w,k,v,_,x){"use strict";var j=function(){function e(){this.relative="",this.tooltip="",this.updateInterval=null,this.showAbsolute=!1}return e.prototype.ngOnDestroy=function(){this.updateInterval&&clearInterval(this.updateInterval)},Object.defineProperty(e.prototype,"value",{get:function(){return this._value},set:function(e){this._value=e,this.update()},enumerable:!1,configurable:!0}),e.prototype.update=function(){var e=this,t=Date.now()-this.value,r=6e4,a=36e5,n=24*a,o=7*n,s=30*n;this.showAbsolute=!1;var i=0;if(t>31536e6)return this.showAbsolute=!0,void(this.relative="abs");if(t>s){var c=Math.floor(t/s);this.relative=1===c?c+" month ago":c+" months ago"}else if(t>o){var l=Math.floor(t/o);this.relative=1===l?l+" week ago":l+" weeks ago"}else if(t>n){var d=Math.floor(t/n);this.relative=1===d?d+" day ago":d+" days ago"}else if(t>a){var u=Math.floor(t/a);this.relative=1===u?u+" hour ago":u+" hours ago",i=18e5}else if(t>r){var h=Math.floor(t/r);this.relative=1===h?h+" minute ago":h+" minutes ago",i=45e3}else t>3e4?(this.relative="about a minute ago",i=6e4):(this.relative="just now",i=3e4);"undefined"!=typeof window&&(clearInterval(this.updateInterval),i>0&&(this.updateInterval=setInterval((function(){return e.update()}))))},e}();j.decorators=[{type:a.Component,args:[{selector:"banta-timestamp",template:'\n <span *ngIf="showAbsolute" [title]="value | date : \'short\'">\n {{value | date : \'shortDate\'}}\n </span>\n <span *ngIf="!showAbsolute" [title]="value | date : \'short\'">\n {{relative}}\n </span>\n ',styles:[""]}]}],j.propDecorators={value:[{type:a.Input}]};var M=function(){function e(){}return e.prototype.ngAfterViewInit=function(){"undefined"!=typeof window&&document.body.appendChild(this.containerElement.nativeElement)},e.prototype.ngOnDestroy=function(){this.containerElement.nativeElement.remove()},e.prototype.close=function(){this.isOpen=!1},e.prototype.open=function(e,t){this.currentImage=e,this.images=t,this.isOpen=!0},e}();M.decorators=[{type:a.Component,args:[{selector:"banta-lightbox",template:'<div \r\n class="banta-lightbox-container" \r\n #container\r\n [class.open]="isOpen"\r\n >\r\n\r\n <a class="underlay" (click)="close()" href="javascript:;"></a>\r\n\r\n <a class="close-button" href="javascript:;" (click)="close()">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n\r\n <img [src]="currentImage" />\r\n</div>\r\n',styles:["::ng-deep .banta-lightbox-container{position:fixed;top:0;left:0;right:0;bottom:0;opacity:0;pointer-events:none;background-color:rgba(0,0,0,.75);color:#fff;z-index:10000;transition:opacity .25s ease-in-out;display:flex;align-items:center;justify-content:center}::ng-deep .banta-lightbox-container a.underlay{z-index:0;position:absolute;top:0;left:0;right:0;bottom:0;opacity:0}::ng-deep .banta-lightbox-container img{z-index:10;max-width:95%}::ng-deep .banta-lightbox-container.open{opacity:1;pointer-events:auto}::ng-deep .banta-lightbox-container a.close-button{position:absolute;top:0;right:0;padding:.75em;z-index:20}"]}]}],M.propDecorators={containerElement:[{type:a.ViewChild,args:["container"]}]};n.marked.use({extensions:[{name:"underline",level:"inline",start:function(e){var t;return null===(t=e.match(/\+\+/))||void 0===t?void 0:t.index},tokenizer:function(e,t){var r=/^\+\+(.*?)\+\+/.exec(e);if(r)return{type:"underline",raw:r[0],text:this.lexer.inlineTokens(r[1].trim())}},renderer:function(e){return"<u>"+this.parser.parseInline(e.text)+"</u>"}}]});var S=function(){function e(e){var t=this;this.sanitizer=e,this.renderer=new n.Renderer({headerPrefix:""});var r=this.renderer.link;this.renderer.link=function(e,a,n){return r.call(t.renderer,e,a,n).replace(/^<a /,'<a target="_blank" rel="noopener" ')}}return e.prototype.transform=function(e){return e?this.sanitizer.bypassSecurityTrustHtml(o.sanitize(n.marked.parse(e,{renderer:this.renderer}),{FORBID_TAGS:["h1","h2","h3","h4"],KEEP_CONTENT:!0})):""},e}();S.decorators=[{type:a.Pipe,args:[{name:"markdownToHtml"}]}],S.ctorParameters=function(){return[{type:s.DomSanitizer}]},o.addHook("afterSanitizeAttributes",(function(e){"target"in e&&(e.setAttribute("target","_blank"),e.setAttribute("rel","noopener noreferrer")),e.hasAttribute("target")||!e.hasAttribute("xlink:href")&&!e.hasAttribute("href")||e.setAttribute("xlink:show","new")}));var I=function(){function e(e){this.sanitizer=e}return e.prototype.transform=function(e){if(e)return this.sanitizer.bypassSecurityTrustResourceUrl(e)},e}();I.decorators=[{type:a.Pipe,args:[{name:"trustResourceUrl"}]}],I.ctorParameters=function(){return[{type:s.DomSanitizer}]};var O=function(){function e(){}return e.prototype.transform=function(e,t){var r=this;if(!e)return"";if(!t)return e;for(var a=e,n=0,o=t.length;n<o;++n){var s=t[n];a=a.replace(new RegExp(""+this.escapeRegExp(s.text),"gi"),"@{"+(n+1)+"}")}return a=a.replace(/@\{(\d+)\}/g,(function(e,a){return t[a-1]?r.formatLink(t[a-1]):e}))},e.prototype.formatLink=function(e){return"<a"+(e.external?' target="_blank" rel="noopener"':"")+' href="'+e.link+'">'+e.text+"</a>"},e.prototype.escapeRegExp=function(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},e}();O.decorators=[{type:a.Pipe,args:[{name:"mentionLinker"}]}];var C=function(){function e(e){this.elementRef=e,this.loading=!1,this.editing=!1,this.loadingMessage="Please wait...",this.error=!1,this.errorMessage="An error has occurred",this.removed=new t.Subject,this.activated=new t.Subject,this.loaded=new t.Subject,this._viewLoaded=!1}return Object.defineProperty(e.prototype,"attachment",{get:function(){return this._attachment},set:function(e){this._attachment=e,this.checkLoad()},enumerable:!1,configurable:!0}),e.prototype.ngOnInit=function(){"undefined"!=typeof window&&setTimeout((function(){window.twttr&&window.twttr.widgets.load()}),100)},e.prototype.ngAfterViewInit=function(){this._viewLoaded=!0,this.checkLoad()},e.prototype.checkLoad=function(){var e,t=this;this._attachment&&this._viewLoaded&&(null===(e=this.elementRef)||void 0===e?void 0:e.nativeElement)&&("undefined"==typeof window?this.loaded.next():setTimeout((function(){return t.loaded.next()}),250))},e.prototype.activate=function(){this.activated.next()},e.prototype.remove=function(){this.removed.next()},Object.defineProperty(e.prototype,"isError",{get:function(){var e,t;return this.error||(null===(t=null===(e=this.attachment)||void 0===e?void 0:e.transientState)||void 0===t?void 0:t.error)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"theErrorMessage",{get:function(){var e,t;return this.errorMessage||(null===(t=null===(e=this.attachment)||void 0===e?void 0:e.transientState)||void 0===t?void 0:t.errorMessage)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isLoading",{get:function(){var e;return this.loading||!this.attachment||(null===(e=this.attachment.transientState)||void 0===e?void 0:e.loading)||!this.attachment.url},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isImageAttachment",{get:function(){return!!this.attachment.type.startsWith("image/")},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"hasFrame",{get:function(){return!!this.attachment&&("iframe"===this.attachment.type||"card"===this.attachment.type&&this.attachment.card.player)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"frameUrl",{get:function(){if(this.attachment)return"iframe"===this.attachment.type?this.attachment.url:"card"===this.attachment.type?this.attachment.card.player:void 0},enumerable:!1,configurable:!0}),e}();C.decorators=[{type:a.Component,args:[{selector:"banta-attachment",template:'<button type="button" (click)="remove()" mat-mini-fab color="primary" class="remove-button" *ngIf="editing">\r\n <mat-icon>close</mat-icon>\r\n</button>\r\n\r\n<ng-container *ngIf="isError">\r\n <mat-icon class="error">close</mat-icon>\r\n <em class="error">{{theErrorMessage}}</em>\r\n</ng-container>\r\n<ng-container *ngIf="!isError">\r\n <ng-container *ngIf="isLoading">\r\n <mat-spinner></mat-spinner>\r\n <em>{{loadingMessage}}</em>\r\n </ng-container>\r\n <ng-container *ngIf="!isLoading">\r\n <iframe *ngIf="hasFrame"\r\n sandbox="allow-scripts allow-popups allow-same-origin allow-presentation" \r\n [src]="frameUrl | trustResourceUrl"></iframe>\r\n <a *ngIf="attachment.type === \'card\'" class="card-attachment" [href]="attachment.url" target="_blank" [class.has-image]="attachment.card.image">\r\n <img \r\n *ngIf="attachment.card.image"\r\n class="thumbnail" \r\n [src]="attachment.card.image"\r\n />\r\n <div class="description">\r\n <h1>{{attachment.card.title}}</h1>\r\n <div class="summary">\r\n {{attachment.card.description}}\r\n </div>\r\n <cite>{{attachment.card.url}}</cite>\r\n </div>\r\n </a>\r\n <a class="image-attachment" *ngIf="isImageAttachment" href="javascript:;" (click)="activate()">\r\n <img [src]="attachment.url" alt="Image Attachment">\r\n </a>\r\n <blockquote *ngIf="attachment.type === \'tweet\'" \r\n class="twitter-tweet">\r\n <p lang="en" dir="ltr"></p>\r\n <a [href]="attachment.url"></a>\r\n </blockquote>\r\n </ng-container>\r\n</ng-container>',styles:[":host{position:relative;display:block}:host.loading{outline:1px solid #333;padding:1em 0;width:300px;text-align:center}:host.loading mat-spinner{display:block;margin:0 auto .5em;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}a.card-attachment{display:flex;align-items:flex-start;gap:1em;width:100%;border:1px solid #666;border-radius:4px;padding:1em;box-sizing:border-box;background-color:#191919;margin:1em 0}a.card-attachment img{width:250px;aspect-ratio:16/9;-o-object-fit:cover;object-fit:cover;border-radius:10px}a.card-attachment.has-image h1{font-size:22px}a.card-attachment h1{min-width:0;margin:0 0 .5em;font-size:26px}a.card-attachment cite{min-width:0;opacity:.75;margin-top:1em;display:block;font-size:80%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}a.card-attachment .description{min-width:0;width:100%}a.card-attachment .summary{overflow-x:hidden;text-overflow:ellipsis}.remove-button{position:absolute;right:10px;top:10px;margin:0;z-index:1}a.image-attachment{width:300px;position:relative;text-align:center}a.image-attachment.with-border{outline:1px solid #333;padding:1em 0}a.image-attachment mat-spinner{display:block;margin:0 auto .5em;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}a.image-attachment mat-icon.error{display:block;font-size:48px;width:48px;height:48px;margin:0 auto .5em}a.image-attachment .error{color:#b76363}a.image-attachment img{width:300px;border-radius:10px;max-width:100%;max-height:20em;-o-object-fit:cover;object-fit:cover}iframe{border:none;width:100%;aspect-ratio:16/9}@media (max-width:700px){a.card-attachment{flex-direction:column}a.card-attachment img{width:100%}}"]}]}],C.ctorParameters=function(){return[{type:a.ElementRef}]},C.propDecorators={attachment:[{type:a.Input}],loading:[{type:a.Input}],editing:[{type:a.Input}],loadingMessage:[{type:a.Input}],error:[{type:a.Input}],errorMessage:[{type:a.Input}],removed:[{type:a.Output}],activated:[{type:a.Output}],loaded:[{type:a.Output}],isLoading:[{type:a.HostBinding,args:["class.loading"]}]};var P=function(){function e(){this.editing=!1,this.remove=new t.Subject,this.loaded=new t.Subject,this.loadedAttachments=new WeakMap}return e.prototype.ngAfterViewInit=function(){},e.prototype.markAttachmentLoaded=function(e){this.loadedAttachments.set(e,!0),this.allAttachmentsLoaded&&this.loaded.next()},e.prototype.isAttachmentLoaded=function(e){return this.loadedAttachments.has(e)},Object.defineProperty(e.prototype,"allAttachmentsLoaded",{get:function(){var e=this;return this.attachments.every((function(t){return e.isAttachmentLoaded(t)}))},enumerable:!1,configurable:!0}),e.prototype.removeAttachment=function(e){this.remove.next(e)},e.prototype.isImageAttachment=function(e){return!!e.type.startsWith("image/")},e.prototype.isCardAttachment=function(e){return!!["card"].includes(e.type)},e.prototype.showLightbox=function(e){this.lightbox.open(e.url,this.attachments.filter((function(e){return"image/png"===e.type})).map((function(e){return e.url})))},Object.defineProperty(e.prototype,"inlineAttachments",{get:function(){return this.attachments.filter((function(e){return"card"!==e.type&&("inline"===e.style||!e.style)}))},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"blockAttachments",{get:function(){return this.attachments.filter((function(e){return"block"===e.style||"card"===e.type}))},enumerable:!1,configurable:!0}),e.prototype.attachmentId=function(e,t){return t.url},e}();P.decorators=[{type:a.Component,args:[{selector:"banta-attachments",template:'<ng-container *ngIf="attachments?.length > 0">\r\n <banta-lightbox #lightbox></banta-lightbox>\r\n <div class="block-attachments">\r\n <ng-container *ngFor="let attachment of blockAttachments; trackBy: attachmentId">\r\n <banta-attachment \r\n [attachment]="attachment"\r\n [editing]="editing"\r\n (loaded)="markAttachmentLoaded(attachment)"\r\n (removed)="removeAttachment(attachment)"\r\n (activated)="showLightbox(attachment)"\r\n ></banta-attachment>\r\n </ng-container>\r\n </div>\r\n\r\n <div \r\n class="inline-attachments" \r\n [class.single]="attachments?.length === 1" \r\n *ngIf="attachments && attachments?.length > 0"\r\n >\r\n <ng-container *ngFor="let attachment of inlineAttachments; trackBy: attachmentId">\r\n <banta-attachment \r\n [attachment]="attachment"\r\n [editing]="editing"\r\n (loaded)="markAttachmentLoaded(attachment)"\r\n (removed)="removeAttachment(attachment)"\r\n (activated)="showLightbox(attachment)"\r\n ></banta-attachment>\r\n </ng-container>\r\n </div>\r\n</ng-container>',styles:[".block-attachments{display:flex;flex-direction:column}.block-attachments banta-attachment{width:100%}.inline-attachments{flex-direction:row;margin-top:15px;display:flex;gap:20px;flex-wrap:wrap}"]}]}],P.propDecorators={attachments:[{type:a.Input}],editing:[{type:a.Input}],lightbox:[{type:a.ViewChild,args:["lightbox"]}],remove:[{type:a.Output}],loaded:[{type:a.Output}]};var E=[j,M,S,O,I,C,P],A=function(){};A.decorators=[{type:a.NgModule,args:[{declarations:E,imports:[i.CommonModule,c.MatIconModule,l.MatProgressSpinnerModule,d.MatButtonModule],exports:E}]}];var T=function(e,t){return(T=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])})(e,t)};function L(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function r(){this.constructor=e}T(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}function q(e,t,r,a){var n,o=arguments.length,s=o<3?t:null===a?a=Object.getOwnPropertyDescriptor(t,r):a;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,a);else for(var i=e.length-1;i>=0;i--)(n=e[i])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s}function z(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function D(e,t,r,a){return new(r||(r=Promise))((function(n,o){function s(e){try{c(a.next(e))}catch(e){o(e)}}function i(e){try{c(a.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?n(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,i)}c((a=a.apply(e,t||[])).next())}))}function R(e,t){var r,a,n,o,s={label:0,sent:function(){if(1&n[0])throw n[1];return n[1]},trys:[],ops:[]};return o={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function i(o){return function(i){return function(o){if(r)throw new TypeError("Generator is already executing.");for(;s;)try{if(r=1,a&&(n=2&o[0]?a.return:o[0]?a.throw||((n=a.return)&&n.call(a),0):a.next)&&!(n=n.call(a,o[1])).done)return n;switch(a=0,n&&(o=[2&o[0],n.value]),o[0]){case 0:case 1:n=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,a=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(n=s.trys,(n=n.length>0&&n[n.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!n||o[1]>n[0]&&o[1]<n[3])){s.label=o[1];break}if(6===o[0]&&s.label<n[1]){s.label=n[1],n=o;break}if(n&&s.label<n[2]){s.label=n[2],s.ops.push(o);break}n[2]&&s.ops.pop(),s.trys.pop();continue}o=t.call(e,s)}catch(e){o=[6,e],a=0}finally{r=n=0}if(5&o[0])throw o[1];return{value:o[0]?o[1]:void 0,done:!0}}([o,i])}}}Object.create;function U(e){var t="function"==typeof Symbol&&Symbol.iterator,r=t&&e[t],a=0;if(r)return r.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&a>=e.length&&(e=void 0),{value:e&&e[a++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function F(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var a,n,o=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(a=o.next()).done;)s.push(a.value)}catch(e){n={error:e}}finally{try{a&&!a.done&&(r=o.return)&&r.call(o)}finally{if(n)throw n.error}}return s}function V(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(F(arguments[t]));return e}Object.create;var $={grinning:{keywords:["face","smile","happy","joy",":D","grin"],char:"๐Ÿ˜€",category:"people"},grimacing:{keywords:["face","grimace","teeth"],char:"๐Ÿ˜ฌ",category:"people"},grin:{keywords:["face","happy","smile","joy","kawaii"],char:"๐Ÿ˜",category:"people"},joy:{keywords:["face","cry","tears","weep","happy","happytears","haha"],char:"๐Ÿ˜‚",category:"people"},smiley:{keywords:["face","happy","joy","haha",":D",":)","smile","funny"],char:"๐Ÿ˜ƒ",category:"people"},smile:{keywords:["face","happy","joy","funny","haha","laugh","like",":D",":)"],char:"๐Ÿ˜„",category:"people"},sweat_smile:{keywords:["face","hot","happy","laugh","sweat","smile","relief"],char:"๐Ÿ˜…",category:"people"},laughing:{keywords:["happy","joy","lol","satisfied","haha","face","glad","XD","laugh"],char:"๐Ÿ˜†",category:"people"},innocent:{keywords:["face","angel","heaven","halo"],char:"๐Ÿ˜‡",category:"people"},wink:{keywords:["face","happy","mischievous","secret",";)","smile"],char:"๐Ÿ˜‰",category:"people"},blush:{keywords:["face","smile","happy","flushed","crush","embarrassed","shy","joy"],char:"๐Ÿ˜Š",category:"people"},slightly_smiling:{keywords:["face","smile"],char:"๐Ÿ™‚",category:"people"},upside_down:{keywords:["face","flipped","silly","smile"],char:"๐Ÿ™ƒ",category:"people"},relaxed:{keywords:["face","blush","massage","happiness"],char:"โ˜บ๏ธ",category:"people"},yum:{keywords:["happy","joy","tongue","smile","face","silly","yummy","nom"],char:"๐Ÿ˜‹",category:"people"},relieved:{keywords:["face","relaxed","phew","massage","happiness"],char:"๐Ÿ˜Œ",category:"people"},heart_eyes:{keywords:["face","love","like","affection","valentines","infatuation","crush","heart"],char:"๐Ÿ˜",category:"people"},kissing_heart:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:"๐Ÿ˜˜",category:"people"},kissing:{keywords:["love","like","face","3","valentines","infatuation","kiss"],char:"๐Ÿ˜—",category:"people"},kissing_smiling_eyes:{keywords:["face","affection","valentines","infatuation","kiss"],char:"๐Ÿ˜™",category:"people"},kissing_closed_eyes:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:"๐Ÿ˜š",category:"people"},stuck_out_tongue_winking_eye:{keywords:["face","prank","childish","playful","mischievous","smile","wink","tongue"],char:"๐Ÿ˜œ",category:"people"},stuck_out_tongue_closed_eyes:{keywords:["face","prank","playful","mischievous","smile","tongue"],char:"๐Ÿ˜",category:"people"},stuck_out_tongue:{keywords:["face","prank","childish","playful","mischievous","smile","tongue"],char:"๐Ÿ˜›",category:"people"},money_mouth:{keywords:["face","rich","dollar","money"],char:"๐Ÿค‘",category:"people"},nerd:{keywords:["face","nerdy","geek","dork"],char:"๐Ÿค“",category:"people"},sunglasses:{keywords:["face","cool","smile","summer","beach","sunglass"],char:"๐Ÿ˜Ž",category:"people"},hugging:{keywords:["face","smile","hug"],char:"๐Ÿค—",category:"people"},smirk:{keywords:["face","smile","mean","prank","smug","sarcasm"],char:"๐Ÿ˜",category:"people"},no_mouth:{keywords:["face","hellokitty"],char:"๐Ÿ˜ถ",category:"people"},neutral_face:{keywords:["indifference","meh",":|","neutral"],char:"๐Ÿ˜",category:"people"},expressionless:{keywords:["face","indifferent","-_-","meh","deadpan"],char:"๐Ÿ˜‘",category:"people"},unamused:{keywords:["indifference","bored","straight face","serious","sarcasm"],char:"๐Ÿ˜’",category:"people"},rolling_eyes:{keywords:["face","eyeroll","frustrated"],char:"๐Ÿ™„",category:"people"},thinking:{keywords:["face","hmmm","think","consider"],char:"๐Ÿค”",category:"people"},flushed:{keywords:["face","blush","shy","flattered"],char:"๐Ÿ˜ณ",category:"people"},disappointed:{keywords:["face","sad","upset","depressed",":("],char:"๐Ÿ˜ž",category:"people"},worried:{keywords:["face","concern","nervous",":("],char:"๐Ÿ˜Ÿ",category:"people"},angry:{keywords:["mad","face","annoyed","frustrated"],char:"๐Ÿ˜ ",category:"people"},rage:{keywords:["angry","mad","hate","despise"],char:"๐Ÿ˜ก",category:"people"},pensive:{keywords:["face","sad","depressed","okay","upset"],char:"๐Ÿ˜”",category:"people"},confused:{keywords:["face","indifference","huh","weird","hmmm",":/"],char:"๐Ÿ˜•",category:"people"},slightly_sad:{keywords:["face","frowning","disappointed","sad","upset"],char:"๐Ÿ™",category:"people"},white_frowning:{keywords:["face","sad","upset","frown"],char:"โ˜น",category:"people"},persevere:{keywords:["face","sick","no","upset","oops"],char:"๐Ÿ˜ฃ",category:"people"},confounded:{keywords:["face","confused","sick","unwell","oops",":S"],char:"๐Ÿ˜–",category:"people"},tired_face:{keywords:["sick","whine","upset","frustrated"],char:"๐Ÿ˜ซ",category:"people"},weary:{keywords:["face","tired","sleepy","sad","frustrated","upset"],char:"๐Ÿ˜ฉ",category:"people"},triumph:{keywords:["face","gas","phew","proud","pride"],char:"๐Ÿ˜ค",category:"people"},open_mouth:{keywords:["face","surprise","impressed","wow","whoa",":O"],char:"๐Ÿ˜ฎ",category:"people"},scream:{keywords:["face","munch","scared","omg"],char:"๐Ÿ˜ฑ",category:"people"},fearful:{keywords:["face","scared","terrified","nervous","oops","huh"],char:"๐Ÿ˜จ",category:"people"},cold_sweat:{keywords:["face","nervous","sweat"],char:"๐Ÿ˜ฐ",category:"people"},hushed:{keywords:["face","woo","shh"],char:"๐Ÿ˜ฏ",category:"people"},frowning:{keywords:["face","aw","what"],char:"๐Ÿ˜ฆ",category:"people"},anguished:{keywords:["face","stunned","nervous"],char:"๐Ÿ˜ง",category:"people"},cry:{keywords:["face","tears","sad","depressed","upset",":'("],char:"๐Ÿ˜ข",category:"people"},disappointed_relieved:{keywords:["face","phew","sweat","nervous"],char:"๐Ÿ˜ฅ",category:"people"},sleepy:{keywords:["face","tired","rest","nap"],char:"๐Ÿ˜ช",category:"people"},sweat:{keywords:["face","hot","sad","tired","exercise"],char:"๐Ÿ˜“",category:"people"},sob:{keywords:["face","cry","tears","sad","upset","depressed"],char:"๐Ÿ˜ญ",category:"people"},dizzy_face:{keywords:["spent","unconscious","xox","dizzy"],char:"๐Ÿ˜ต",category:"people"},astonished:{keywords:["face","xox","surprised","poisoned"],char:"๐Ÿ˜ฒ",category:"people"},zipper_mouth:{keywords:["face","sealed","zipper","secret"],char:"๐Ÿค",category:"people"},mask:{keywords:["face","sick","ill","disease"],char:"๐Ÿ˜ท",category:"people"},thermometer_face:{keywords:["sick","temperature","thermometer","cold"],char:"๐Ÿค’",category:"people"},bandage_face:{keywords:["injured","clumsy","bandage","hurt"],char:"๐Ÿค•",category:"people"},sleeping:{keywords:["face","tired","sleepy","night","zzz"],char:"๐Ÿ˜ด",category:"people"},zzz:{keywords:["sleepy","tired"],char:"๐Ÿ’ค",category:"people"},hankey:{keywords:["poop","shitface","fail","turd","shit"],char:"๐Ÿ’ฉ",category:"people"},smiling_imp:{keywords:["devil","horns"],char:"๐Ÿ˜ˆ",category:"people"},imp:{keywords:["devil","angry","horns"],char:"๐Ÿ‘ฟ",category:"people"},japanese_ogre:{keywords:["monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre"],char:"๐Ÿ‘น",category:"people"},japanese_goblin:{keywords:["red","evil","mask","monster","scary","creepy","japanese","goblin"],char:"๐Ÿ‘บ",category:"people"},skull:{keywords:["dead","skeleton","creepy"],char:"๐Ÿ’€",category:"people"},ghost:{keywords:["halloween","spooky","scary"],char:"๐Ÿ‘ป",category:"people"},alien:{keywords:["UFO","paul","weird","outer_space"],char:"๐Ÿ‘ฝ",category:"people"},robot:{keywords:["computer","machine"],char:"๐Ÿค–",category:"people"},smiley_cat:{keywords:["animal","cats","happy","smile"],char:"๐Ÿ˜บ",category:"people"},smile_cat:{keywords:["animal","cats","smile"],char:"๐Ÿ˜ธ",category:"people"},joy_cat:{keywords:["animal","cats","haha","happy","tears"],char:"๐Ÿ˜น",category:"people"},heart_eyes_cat:{keywords:["animal","love","like","affection","cats","valentines","heart"],char:"๐Ÿ˜ป",category:"people"},smirk_cat:{keywords:["animal","cats","smirk"],char:"๐Ÿ˜ผ",category:"people"},kissing_cat:{keywords:["animal","cats","kiss"],char:"๐Ÿ˜ฝ",category:"people"},scream_cat:{keywords:["animal","cats","munch","scared","scream"],char:"๐Ÿ™€",category:"people"},crying_cat_face:{keywords:["animal","tears","weep","sad","cats","upset","cry"],char:"๐Ÿ˜ฟ",category:"people"},pouting_cat:{keywords:["animal","cats"],char:"๐Ÿ˜พ",category:"people"},raised_hands:{keywords:["gesture","hooray","yea","celebration","hands"],char:"๐Ÿ™Œ",category:"people"},clap:{keywords:["hands","praise","applause","congrats","yay"],char:"๐Ÿ‘",category:"people"},wave:{keywords:["hands","gesture","goodbye","solong","farewell","hello","palm"],char:"๐Ÿ‘‹",category:"people"},"+1":{keywords:["thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],char:"๐Ÿ‘",category:"people"},minus1:{keywords:["thumbsdown","no","dislike","hand"],char:"๐Ÿ‘Ž",category:"people"},facepunch:{keywords:["angry","violence","fist","hit","attack","hand"],char:"๐Ÿ‘Š",category:"people"},fist:{keywords:["fingers","hand","grasp"],char:"โœŠ",category:"people"},v:{keywords:["fingers","ohyeah","hand","peace","victory","two"],char:"โœŒ๏ธ",category:"people"},ok_hand:{keywords:["fingers","limbs","perfect","ok"],char:"๐Ÿ‘Œ",category:"people"},hand:{keywords:["fingers","stop","highfive","palm","ban","raised_hand"],char:"โœ‹",category:"people"},open_hands:{keywords:["fingers","butterfly","hands","open"],char:"๐Ÿ‘",category:"people"},muscle:{keywords:["arm","flex","hand","summer","strong","biceps"],char:"๐Ÿ’ช",category:"people"},pray:{keywords:["please","hope","wish","namaste","highfive"],char:"๐Ÿ™",category:"people"},point_up:{keywords:["hand","fingers","direction","up"],char:"โ˜๏ธ",category:"people"},point_up_2:{keywords:["fingers","hand","direction","up"],char:"๐Ÿ‘†",category:"people"},point_down:{keywords:["fingers","hand","direction","down"],char:"๐Ÿ‘‡",category:"people"},point_left:{keywords:["direction","fingers","hand","left"],char:"๐Ÿ‘ˆ",category:"people"},point_right:{keywords:["fingers","hand","direction","right"],char:"๐Ÿ‘‰",category:"people"},middle_finger:{keywords:["hand","fingers","rude"],char:"๐Ÿ–•",category:"people"},splayed_fingers:{keywords:["hand","fingers","palm"],char:"๐Ÿ–",category:"people"},sign_of_horns:{keywords:["hand","fingers","evil_eye","metal","rock_on"],char:"๐Ÿค˜",category:"people"},vulcan_salute:{keywords:["hand","fingers","spock","star trek"],char:"๐Ÿ––",category:"people"},writing_hand:{keywords:["pen","stationery","write"],char:"โœ",category:"people"},nail_care:{keywords:["beauty","manicure","finger","fashion","nail"],char:"๐Ÿ’…",category:"people"},lips:{keywords:["mouth","kiss"],char:"๐Ÿ‘„",category:"people"},tongue:{keywords:["mouth","playful"],char:"๐Ÿ‘…",category:"people"},ear:{keywords:["face","hear","sound","listen"],char:"๐Ÿ‘‚",category:"people"},nose:{keywords:["smell","sniff"],char:"๐Ÿ‘ƒ",category:"people"},eye:{keywords:["face","look","see","watch","stare"],char:"๐Ÿ‘",category:"people"},eyes:{keywords:["look","watch","stalk","peek","see"],char:"๐Ÿ‘€",category:"people"},bust_in_silhouette:{keywords:["user","person","human"],char:"๐Ÿ‘ค",category:"people"},busts_in_silhouette:{keywords:["user","person","human","group","team"],char:"๐Ÿ‘ฅ",category:"people"},speaking_head:{keywords:["user","person","human"],char:"๐Ÿ—ฃ",category:"people"},baby:{keywords:["child","boy","girl","toddler"],char:"๐Ÿ‘ถ",category:"people"},boy:{keywords:["man","male","guy","teenager"],char:"๐Ÿ‘ฆ",category:"people"},girl:{keywords:["female","woman","teenager"],char:"๐Ÿ‘ง",category:"people"},man:{keywords:["mustache","father","dad","guy","classy","sir","moustache"],char:"๐Ÿ‘จ",category:"people"},woman:{keywords:["female","girls","lady"],char:"๐Ÿ‘ฉ",category:"people"},person_with_blond_hair:{keywords:["man","male","boy","blonde","guy","person"],char:"๐Ÿ‘ฑ",category:"people"},older_man:{keywords:["human","male","men","old","elder","senior"],char:"๐Ÿ‘ด",category:"people"},older_woman:{keywords:["human","female","women","lady","old","elder","senior"],char:"๐Ÿ‘ต",category:"people"},man_with_gua_pi_mao:{keywords:["male","boy","chinese"],char:"๐Ÿ‘ฒ",category:"people"},man_with_turban:{keywords:["male","indian","hinduism","arabs"],char:"๐Ÿ‘ณ",category:"people"},cop:{keywords:["man","police","law","legal","enforcement","arrest","911"],char:"๐Ÿ‘ฎ",category:"people"},construction_worker:{keywords:["male","human","wip","guy","build","construction","worker","labor"],char:"๐Ÿ‘ท",category:"people"},guardsman:{keywords:["uk","gb","british","male","guy","royal"],char:"๐Ÿ’‚",category:"people"},sleuth:{keywords:["human","spy","detective"],char:"๐Ÿ•ต",category:"people"},santa:{keywords:["festival","man","male","xmas","father christmas"],char:"๐ŸŽ…",category:"people"},angel:{keywords:["heaven","wings","halo"],char:"๐Ÿ‘ผ",category:"people"},princess:{keywords:["girl","woman","female","blond","crown","royal","queen"],char:"๐Ÿ‘ธ",category:"people"},bride_with_veil:{keywords:["couple","marriage","wedding","woman","bride"],char:"๐Ÿ‘ฐ",category:"people"},runner:{keywords:["man","walking","exercise","race","running"],char:"๐Ÿƒ",category:"people"},walking:{keywords:["human","feet","steps"],char:"๐Ÿšถ",category:"people"},dancer:{keywords:["female","girl","woman","fun"],char:"๐Ÿ’ƒ",category:"people"},dancers:{keywords:["female","bunny","women","girls"],char:"๐Ÿ‘ฏ",category:"people"},couple:{keywords:["pair","people","human","love","date","dating","like","affection","valentines","marriage"],char:"๐Ÿ‘ซ",category:"people"},two_men_holding_hands:{keywords:["pair","couple","love","like","bromance","friendship","people","human"],char:"๐Ÿ‘ฌ",category:"people"},two_women_holding_hands:{keywords:["pair","friendship","couple","love","like","female","people","human"],char:"๐Ÿ‘ญ",category:"people"},bow:{keywords:["man","male","boy"],char:"๐Ÿ™‡",category:"people"},information_desk_person:{keywords:["female","girl","woman","human","information"],char:"๐Ÿ’",category:"people"},no_good:{keywords:["female","girl","woman","nope"],char:"๐Ÿ™…",category:"people"},ok_woman:{keywords:["women","girl","female","pink","human","woman"],char:"๐Ÿ™†",category:"people"},raising_hand:{keywords:["female","girl","woman"],char:"๐Ÿ™‹",category:"people"},person_with_pouting_face:{keywords:["female","girl","woman"],char:"๐Ÿ™Ž",category:"people"},person_frowning:{keywords:["female","girl","woman","sad","depressed","discouraged","unhappy"],char:"๐Ÿ™",category:"people"},haircut:{keywords:["female","girl","woman"],char:"๐Ÿ’‡",category:"people"},massage:{keywords:["female","girl","woman","head"],char:"๐Ÿ’†",category:"people"},couple_with_heart:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"๐Ÿ’‘",category:"people"},female_couple_with_heart:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ‘ฉ",category:"people"},male_couple_with_heart:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"๐Ÿ‘จโ€โค๏ธโ€๐Ÿ‘จ",category:"people"},couplekiss:{keywords:["pair","valentines","love","like","dating","marriage"],char:"๐Ÿ’",category:"people"},female_couplekiss:{keywords:["pair","valentines","love","like","dating","marriage"],char:"๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ",category:"people"},male_couplekiss:{keywords:["pair","valentines","love","like","dating","marriage"],char:"๐Ÿ‘จโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ",category:"people"},family:{keywords:["home","parents","child","mom","dad","father","mother","people","human"],char:"๐Ÿ‘ช",category:"people"},family_man_woman_girl:{keywords:["home","parents","people","human","child"],char:"๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง",category:"people"},family_man_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ",category:"people"},family_man_woman_boys:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ",category:"people"},family_man_woman_girls:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง",category:"people"},family_women_boy:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ",category:"people"},family_women_girl:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ง",category:"people"},family_women_girl_boy:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ",category:"people"},family_women_boys:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ",category:"people"},family_women_girls:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง",category:"people"},family_men_boy:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆ",category:"people"},family_men_girl:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ง",category:"people"},family_men_girl_boy:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ",category:"people"},family_men_boys:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ",category:"people"},family_men_girls:{keywords:["home","parents","people","human","children"],char:"๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง",category:"people"},womans_clothes:{keywords:["fashion","shopping","female"],char:"๐Ÿ‘š",category:"people"},shirt:{keywords:["fashion","cloth","casual","tshirt","tee"],char:"๐Ÿ‘•",category:"people"},jeans:{keywords:["fashion","shopping"],char:"๐Ÿ‘–",category:"people"},necktie:{keywords:["shirt","suitup","formal","fashion","cloth","business"],char:"๐Ÿ‘”",category:"people"},dress:{keywords:["clothes","fashion","shopping"],char:"๐Ÿ‘—",category:"people"},bikini:{keywords:["swimming","female","woman","girl","fashion","beach","summer"],char:"๐Ÿ‘™",category:"people"},kimono:{keywords:["dress","fashion","women","female","japanese"],char:"๐Ÿ‘˜",category:"people"},lipstick:{keywords:["female","girl","fashion","woman"],char:"๐Ÿ’„",category:"people"},kiss:{keywords:["face","lips","love","like","affection","valentines"],char:"๐Ÿ’‹",category:"people"},footprints:{keywords:["feet","tracking","walking","beach"],char:"๐Ÿ‘ฃ",category:"people"},high_heel:{keywords:["fashion","shoes","female","pumps","stiletto"],char:"๐Ÿ‘ ",category:"people"},sandal:{keywords:["shoes","fashion","flip flops"],char:"๐Ÿ‘ก",category:"people"},boot:{keywords:["shoes","fashion"],char:"๐Ÿ‘ข",category:"people"},mans_shoe:{keywords:["fashion","male"],char:"๐Ÿ‘ž",category:"people"},athletic_shoe:{keywords:["shoes","sports","sneakers"],char:"๐Ÿ‘Ÿ",category:"people"},womans_hat:{keywords:["fashion","accessories","female","lady","spring"],char:"๐Ÿ‘’",category:"people"},tophat:{keywords:["magic","gentleman","classy","circus"],char:"๐ŸŽฉ",category:"people"},helmet:{keywords:["construction","build"],char:"โ›‘",category:"people"},mortar_board:{keywords:["school","college","degree","university","graduation","cap","hat","legal","learn","education"],char:"๐ŸŽ“",category:"people"},crown:{keywords:["king","kod","leader","royalty","lord"],char:"๐Ÿ‘‘",category:"people"},school_satchel:{keywords:["student","education","bag","backpack"],char:"๐ŸŽ’",category:"people"},pouch:{keywords:["bag","accessories","shopping"],char:"๐Ÿ‘",category:"people"},purse:{keywords:["fashion","accessories","money","sales","shopping"],char:"๐Ÿ‘›",category:"people"},handbag:{keywords:["fashion","accessory","accessories","shopping"],char:"๐Ÿ‘œ",category:"people"},briefcase:{keywords:["business","documents","work","law","legal"],char:"๐Ÿ’ผ",category:"people"},eyeglasses:{keywords:["fashion","accessories","eyesight","nerdy","dork","geek"],char:"๐Ÿ‘“",category:"people"},dark_sunglasses:{keywords:["face","cool","accessories"],char:"๐Ÿ•ถ",category:"people"},ring:{keywords:["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],char:"๐Ÿ’",category:"people"},closed_umbrella:{keywords:["weather","rain","drizzle"],char:"๐ŸŒ‚",category:"people"},dog:{keywords:["animal","friend","nature","woof","puppy","pet","faithful"],char:"๐Ÿถ",category:"animals_and_nature"},cat:{keywords:["animal","meow","nature","pet","kitten"],char:"๐Ÿฑ",category:"animals_and_nature"},mouse:{keywords:["animal","nature","cheese","rodent"],char:"๐Ÿญ",category:"animals_and_nature"},hamster:{keywords:["animal","nature"],char:"๐Ÿน",category:"animals_and_nature"},rabbit:{keywords:["animal","nature","pet","spring","magic","bunny"],char:"๐Ÿฐ",category:"animals_and_nature"},bear:{keywords:["animal","nature","wild"],char:"๐Ÿป",category:"animals_and_nature"},panda_face:{keywords:["animal","nature","panda"],char:"๐Ÿผ",category:"animals_and_nature"},koala:{keywords:["animal","nature"],char:"๐Ÿจ",category:"animals_and_nature"},tiger:{keywords:["animal","cat","danger","wild","nature","roar"],char:"๐Ÿฏ",category:"animals_and_nature"},lion_face:{keywords:["animal","nature"],char:"๐Ÿฆ",category:"animals_and_nature"},cow:{keywords:["beef","ox","animal","nature","moo","milk"],char:"๐Ÿฎ",category:"animals_and_nature"},pig:{keywords:["animal","oink","nature"],char:"๐Ÿท",category:"animals_and_nature"},pig_nose:{keywords:["animal","oink"],char:"๐Ÿฝ",category:"animals_and_nature"},frog:{keywords:["animal","nature","croak","toad"],char:"๐Ÿธ",category:"animals_and_nature"},octopus:{keywords:["animal","creature","ocean","sea","nature","beach"],char:"๐Ÿ™",category:"animals_and_nature"},monkey_face:{keywords:["animal","nature","circus"],char:"๐Ÿต",category:"animals_and_nature"},see_no_evil:{keywords:["monkey","animal","nature","haha"],char:"๐Ÿ™ˆ",category:"animals_and_nature"},hear_no_evil:{keywords:["animal","monkey","nature"],char:"๐Ÿ™‰",category:"animals_and_nature"},speak_no_evil:{keywords:["monkey","animal","nature","omg"],char:"๐Ÿ™Š",category:"animals_and_nature"},monkey:{keywords:["animal","nature","banana","circus"],char:"๐Ÿ’",category:"animals_and_nature"},chicken:{keywords:["animal","cluck","nature","bird"],char:"๐Ÿ”",category:"animals_and_nature"},penguin:{keywords:["animal","nature"],char:"๐Ÿง",category:"animals_and_nature"},bird:{keywords:["animal","nature","fly","tweet","spring"],char:"๐Ÿฆ",category:"animals_and_nature"},baby_chick:{keywords:["animal","chicken","bird"],char:"๐Ÿค",category:"animals_and_nature"},hatching_chick:{keywords:["animal","chicken","egg","born","baby","bird"],char:"๐Ÿฃ",category:"animals_and_nature"},hatched_chick:{keywords:["animal","chicken","baby","bird"],char:"๐Ÿฅ",category:"animals_and_nature"},wolf:{keywords:["animal","nature","wild"],char:"๐Ÿบ",category:"animals_and_nature"},boar:{keywords:["animal","nature"],char:"๐Ÿ—",category:"animals_and_nature"},horse:{keywords:["animal","brown","nature"],char:"๐Ÿด",category:"animals_and_nature"},unicorn_face:{keywords:["animal","nature","mystical"],char:"๐Ÿฆ„",category:"animals_and_nature"},bee:{keywords:["animal","insect","nature","bug","spring","honey"],char:"๐Ÿ",category:"animals_and_nature"},bug:{keywords:["animal","insect","nature","worm"],char:"๐Ÿ›",category:"animals_and_nature"},snail:{keywords:["slow","animal","shell"],char:"๐ŸŒ",category:"animals_and_nature"},beetle:{keywords:["animal","insect","nature","ladybug"],char:"๐Ÿž",category:"animals_and_nature"},ant:{keywords:["animal","insect","nature","bug"],char:"๐Ÿœ",category:"animals_and_nature"},spider:{keywords:["animal","arachnid"],char:"๐Ÿ•ท",category:"animals_and_nature"},scorpion:{keywords:["animal","arachnid"],char:"๐Ÿฆ‚",category:"animals_and_nature"},crab:{keywords:["animal","crustacean"],char:"๐Ÿฆ€",category:"animals_and_nature"},snake:{keywords:["animal","evil","nature","hiss","python"],char:"๐Ÿ",category:"animals_and_nature"},turtle:{keywords:["animal","slow","nature","tortoise"],char:"๐Ÿข",category:"animals_and_nature"},tropical_fish:{keywords:["animal","swim","ocean","beach","nemo"],char:"๐Ÿ ",category:"animals_and_nature"},fish:{keywords:["animal","food","nature"],char:"๐ŸŸ",category:"animals_and_nature"},blowfish:{keywords:["animal","nature","food","sea","ocean"],char:"๐Ÿก",category:"animals_and_nature"},dolphin:{keywords:["animal","nature","fish","sea","ocean","flipper","fins","beach"],char:"๐Ÿฌ",category:"animals_and_nature"},whale:{keywords:["animal","nature","sea","ocean"],char:"๐Ÿณ",category:"animals_and_nature"},whale2:{keywords:["animal","nature","sea","ocean"],char:"๐Ÿ‹",category:"animals_and_nature"},crocodile:{keywords:["animal","nature","reptile","lizard","alligator"],char:"๐ŸŠ",category:"animals_and_nature"},leopard:{keywords:["animal","nature"],char:"๐Ÿ†",category:"animals_and_nature"},tiger2:{keywords:["animal","nature","roar"],char:"๐Ÿ…",category:"animals_and_nature"},water_buffalo:{keywords:["animal","nature","ox","cow"],char:"๐Ÿƒ",category:"animals_and_nature"},ox:{keywords:["animal","cow","beef"],char:"๐Ÿ‚",category:"animals_and_nature"},cow2:{keywords:["beef","ox","animal","nature","moo","milk"],char:"๐Ÿ„",category:"animals_and_nature"},dromedary_camel:{keywords:["animal","hot","desert","hump"],char:"๐Ÿช",category:"animals_and_nature"},camel:{keywords:["animal","nature","hot","desert","hump"],char:"๐Ÿซ",category:"animals_and_nature"},elephant:{keywords:["animal","nature","nose","thailand","circus"],char:"๐Ÿ˜",category:"animals_and_nature"},goat:{keywords:["animal","nature"],char:"๐Ÿ",category:"animals_and_nature"},ram:{keywords:["animal","sheep","nature"],char:"๐Ÿ",category:"animals_and_nature"},sheep:{keywords:["animal","nature","wool","shipit"],char:"๐Ÿ‘",category:"animals_and_nature"},racehorse:{keywords:["animal","gamble","luck"],char:"๐ŸŽ",category:"animals_and_nature"},pig2:{keywords:["animal","nature"],char:"๐Ÿ–",category:"animals_and_nature"},rat:{keywords:["animal","mouse","rodent"],char:"๐Ÿ€",category:"animals_and_nature"},mouse2:{keywords:["animal","nature","rodent"],char:"๐Ÿ",category:"animals_and_nature"},rooster:{keywords:["animal","nature","chicken"],char:"๐Ÿ“",category:"animals_and_nature"},turkey:{keywords:["animal","bird"],char:"๐Ÿฆƒ",category:"animals_and_nature"},dove_of_peace:{keywords:["animal","bird"],char:"๐Ÿ•Š",category:"animals_and_nature"},dog2:{keywords:["animal","nature","friend","doge","pet","faithful"],char:"๐Ÿ•",category:"animals_and_nature"},poodle:{keywords:["dog","animal","101","nature","pet"],char:"๐Ÿฉ",category:"animals_and_nature"},cat2:{keywords:["animal","meow","pet","cats"],char:"๐Ÿˆ",category:"animals_and_nature"},rabbit2:{keywords:["animal","nature","pet","magic","spring"],char:"๐Ÿ‡",category:"animals_and_nature"},chipmunk:{keywords:["animal","nature","rodent","squirrel"],char:"๐Ÿฟ",category:"animals_and_nature"},feet:{keywords:["animal","tracking","footprints","dog","cat","pet","paw_prints"],char:"๐Ÿพ",category:"animals_and_nature"},dragon:{keywords:["animal","myth","nature","chinese","green"],char:"๐Ÿ‰",category:"animals_and_nature"},dragon_face:{keywords:["animal","myth","nature","chinese","green"],char:"๐Ÿฒ",category:"animals_and_nature"},cactus:{keywords:["vegetable","plant","nature"],char:"๐ŸŒต",category:"animals_and_nature"},christmas_tree:{keywords:["festival","vacation","december","xmas","celebration"],char:"๐ŸŽ„",category:"animals_and_nature"},evergreen_tree:{keywords:["plant","nature"],char:"๐ŸŒฒ",category:"animals_and_nature"},deciduous_tree:{keywords:["plant","nature"],char:"๐ŸŒณ",category:"animals_and_nature"},palm_tree:{keywords:["plant","vegetable","nature","summer","beach","mojito","tropical"],char:"๐ŸŒด",category:"animals_and_nature"},seedling:{keywords:["plant","nature","grass","lawn","spring"],char:"๐ŸŒฑ",category:"animals_and_nature"},herb:{keywords:["vegetable","plant","medicine","weed","grass","lawn"],char:"๐ŸŒฟ",category:"animals_and_nature"},shamrock:{keywords:["vegetable","plant","nature","irish","clover"],char:"โ˜˜",category:"animals_and_nature"},four_leaf_clover:{keywords:["vegetable","plant","nature","lucky","irish"],char:"๐Ÿ€",category:"animals_and_nature"},bamboo:{keywords:["plant","nature","vegetable","panda","pine_decoration"],char:"๐ŸŽ",category:"animals_and_nature"},tanabata_tree:{keywords:["plant","nature","branch","summer"],char:"๐ŸŽ‹",category:"animals_and_nature"},leaves:{keywords:["nature","plant","tree","vegetable","grass","lawn","spring"],char:"๐Ÿƒ",category:"animals_and_nature"},fallen_leaf:{keywords:["nature","plant","vegetable","leaves"],char:"๐Ÿ‚",category:"animals_and_nature"},maple_leaf:{keywords:["nature","plant","vegetable","canada","fall"],char:"๐Ÿ",category:"animals_and_nature"},ear_of_rice:{keywords:["nature","plant"],char:"๐ŸŒพ",category:"animals_and_nature"},hibiscus:{keywords:["plant","vegetable","flowers","beach"],char:"๐ŸŒบ",category:"animals_and_nature"},sunflower:{keywords:["nature","plant","fall"],char:"๐ŸŒป",category:"animals_and_nature"},rose:{keywords:["flowers","valentines","love","spring"],char:"๐ŸŒน",category:"animals_and_nature"},tulip:{keywords:["flowers","plant","nature","summer","spring"],char:"๐ŸŒท",category:"animals_and_nature"},blossom:{keywords:["nature","flowers","yellow"],char:"๐ŸŒผ",category:"animals_and_nature"},cherry_blossom:{keywords:["nature","plant","spring","flower"],char:"๐ŸŒธ",category:"animals_and_nature"},bouquet:{keywords:["flowers","nature","spring"],char:"๐Ÿ’",category:"animals_and_nature"},mushroom:{keywords:["plant","vegetable"],char:"๐Ÿ„",category:"animals_and_nature"},chestnut:{keywords:["food","squirrel"],char:"๐ŸŒฐ",category:"animals_and_nature"},jack_o_lantern:{keywords:["halloween","light","pumpkin","creepy","fall"],char:"๐ŸŽƒ",category:"animals_and_nature"},shell:{keywords:["nature","sea","beach"],char:"๐Ÿš",category:"animals_and_nature"},spider_web:{keywords:["animal","insect","arachnid","silk"],char:"๐Ÿ•ธ",category:"animals_and_nature"},earth_americas:{keywords:["globe","world","USA","international"],char:"๐ŸŒŽ",category:"animals_and_nature"},earth_africa:{keywords:["globe","world","international"],char:"๐ŸŒ",category:"animals_and_nature"},earth_asia:{keywords:["globe","world","east","international"],char:"๐ŸŒ",category:"animals_and_nature"},full_moon:{keywords:["nature","yellow","twilight","planet","space","night","evening","sleep"],char:"๐ŸŒ•",category:"animals_and_nature"},waning_gibbous_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],char:"๐ŸŒ–",category:"animals_and_nature"},last_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"๐ŸŒ—",category:"animals_and_nature"},waning_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"๐ŸŒ˜",category:"animals_and_nature"},new_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"๐ŸŒ‘",category:"animals_and_nature"},waxing_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"๐ŸŒ’",category:"animals_and_nature"},first_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"๐ŸŒ“",category:"animals_and_nature"},moon:{keywords:["nature","night","sky","gray","twilight","planet","space","evening","sleep"],char:"๐ŸŒ”",category:"animals_and_nature"},new_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"๐ŸŒš",category:"animals_and_nature"},full_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"๐ŸŒ",category:"animals_and_nature"},first_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"๐ŸŒ›",category:"animals_and_nature"},last_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"๐ŸŒœ",category:"animals_and_nature"},sun_with_face:{keywords:["nature","morning","sky"],char:"๐ŸŒž",category:"animals_and_nature"},crescent_moon:{keywords:["night","sleep","sky","evening","magic"],char:"๐ŸŒ™",category:"animals_and_nature"},star:{keywords:["night","yellow"],char:"โญ",category:"animals_and_nature"},star2:{keywords:["night","sparkle","awesome","good","magic"],char:"๐ŸŒŸ",category:"animals_and_nature"},dizzy:{keywords:["star","sparkle","shoot","magic"],char:"๐Ÿ’ซ",category:"animals_and_nature"},sparkles:{keywords:["stars","shine","shiny","cool","awesome","good","magic"],char:"โœจ",category:"animals_and_nature"},comet:{keywords:["space"],char:"โ˜„",category:"animals_and_nature"},sunny:{keywords:["weather","nature","brightness","summer","beach","spring"],char:"โ˜€๏ธ",category:"animals_and_nature"},white_sun_with_small_cloud:{keywords:["weather"],char:"๐ŸŒค",category:"animals_and_nature"},partly_sunny:{keywords:["weather","nature","cloudy","morning","fall","spring"],char:"โ›…",category:"animals_and_nature"},white_sun_behind_cloud:{keywords:["weather"],char:"๐ŸŒฅ",category:"animals_and_nature"},white_sun_behind_cloud_with_rain:{keywords:["weather"],char:"๐ŸŒฆ",category:"animals_and_nature"},cloud:{keywords:["weather","sky"],char:"โ˜๏ธ",category:"animals_and_nature"},cloud_with_rain:{keywords:["weather"],char:"๐ŸŒง",category:"animals_and_nature"},thunder_cloud_and_rain:{keywords:["weather","lightning"],char:"โ›ˆ",category:"animals_and_nature"},cloud_with_lightning:{keywords:["weather","thunder"],char:"๐ŸŒฉ",category:"animals_and_nature"},zap:{keywords:["thunder","weather","lightning bolt","fast"],char:"โšก",category:"animals_and_nature"},fire:{keywords:["hot","cook","flame"],char:"๐Ÿ”ฅ",category:"animals_and_nature"},boom:{keywords:["bomb","explode","explosion","collision","blown"],char:"๐Ÿ’ฅ",category:"animals_and_nature"},snowflake:{keywords:["winter","season","cold","weather","christmas","xmas"],char:"โ„๏ธ",category:"animals_and_nature"},cloud_with_snow:{keywords:["weather"],char:"๐ŸŒจ",category:"animals_and_nature"},snowman:{keywords:["winter","season","cold","weather","christmas","xmas","frozen","without_snow"],char:"โ›„",category:"animals_and_nature"},snowman_with_snow:{keywords:["winter","season","cold","weather","christmas","xmas","frozen"],char:"โ˜ƒ",category:"animals_and_nature"},wind_blowing_face:{keywords:["gust","air"],char:"๐ŸŒฌ",category:"animals_and_nature"},dash:{keywords:["wind","air","fast","shoo","fart","smoke","puff"],char:"๐Ÿ’จ",category:"animals_and_nature"},cloud_with_tornado:{keywords:["weather","cyclone","twister"],char:"๐ŸŒช",category:"animals_and_nature"},fog:{keywords:["weather"],char:"๐ŸŒซ",category:"animals_and_nature"},umbrella_without_rain:{keywords:["weather","spring"],char:"โ˜‚",category:"animals_and_nature"},umbrella:{keywords:["rainy","weather","spring"],char:"โ˜”",category:"animals_and_nature"},droplet:{keywords:["water","drip","faucet","spring"],char:"๐Ÿ’ง",category:"animals_and_nature"},sweat_drops:{keywords:["water","drip","oops"],char:"๐Ÿ’ฆ",category:"animals_and_nature"},ocean:{keywords:["sea","water","wave","nature","tsunami","disaster"],char:"๐ŸŒŠ",category:"animals_and_nature"},green_apple:{keywords:["fruit","nature"],char:"๐Ÿ",category:"food_and_drink"},apple:{keywords:["fruit","mac","school"],char:"๐ŸŽ",category:"food_and_drink"},pear:{keywords:["fruit","nature","food"],char:"๐Ÿ",category:"food_and_drink"},tangerine:{keywords:["food","fruit","nature","orange"],char:"๐ŸŠ",category:"food_and_drink"},lemon:{keywords:["fruit","nature"],char:"๐Ÿ‹",category:"food_and_drink"},banana:{keywords:["fruit","food","monkey"],char:"๐ŸŒ",category:"food_and_drink"},watermelon:{keywords:["fruit","food","picnic","summer"],char:"๐Ÿ‰",category:"food_and_drink"},grapes:{keywords:["fruit","food","wine"],char:"๐Ÿ‡",category:"food_and_drink"},strawberry:{keywords:["fruit","food","nature"],char:"๐Ÿ“",category:"food_and_drink"},melon:{keywords:["fruit","nature","food"],char:"๐Ÿˆ",category:"food_and_drink"},cherries:{keywords:["food","fruit"],char:"๐Ÿ’",category:"food_and_drink"},peach:{keywords:["fruit","nature","food"],char:"๐Ÿ‘",category:"food_and_drink"},pineapple:{keywords:["fruit","nature","food"],char:"๐Ÿ",category:"food_and_drink"},tomato:{keywords:["fruit","vegetable","nature","food"],char:"๐Ÿ…",category:"food_and_drink"},eggplant:{keywords:["vegetable","nature","food","aubergine"],char:"๐Ÿ†",category:"food_and_drink"},hot_pepper:{keywords:["food","spicy","chilli","chili"],char:"๐ŸŒถ",category:"food_and_drink"},corn:{keywords:["food","vegetable","plant"],char:"๐ŸŒฝ",category:"food_and_drink"},sweet_potato:{keywords:["food","nature"],char:"๐Ÿ ",category:"food_and_drink"},honey_pot:{keywords:["bees","sweet","kitchen"],char:"๐Ÿฏ",category:"food_and_drink"},bread:{keywords:["food","wheat","breakfast","toast"],char:"๐Ÿž",category:"food_and_drink"},cheese_wedge:{keywords:["food","chadder"],char:"๐Ÿง€",category:"food_and_drink"},poultry_leg:{keywords:["food","meat","drumstick","bird","chicken","turkey"],char:"๐Ÿ—",category:"food_and_drink"},meat_on_bone:{keywords:["good","food","drumstick"],char:"๐Ÿ–",category:"food_and_drink"},fried_shrimp:{keywords:["food","animal","appetizer","summer"],char:"๐Ÿค",category:"food_and_drink"},egg:{keywords:["food","breakfast","kitchen"],char:"๐Ÿณ",category:"food_and_drink"},hamburger:{keywords:["meat","fast food","beef","cheeseburger","mcdonalds","burger king"],char:"๐Ÿ”",category:"food_and_drink"},fries:{keywords:["chips","snack","fast food"],char:"๐ŸŸ",category:"food_and_drink"},hot_dog:{keywords:["food","frankfurter","hotdog"],char:"๐ŸŒญ",category:"food_and_drink"},pizza:{keywords:["food","party"],char:"๐Ÿ•",category:"food_and_drink"},spaghetti:{keywords:["food","italian","noodle"],char:"๐Ÿ",category:"food_and_drink"},taco:{keywords:["food","mexican"],char:"๐ŸŒฎ",category:"food_and_drink"},burrito:{keywords:["food","mexican"],char:"๐ŸŒฏ",category:"food_and_drink"},ramen:{keywords:["food","japanese","noodle","chopsticks"],char:"๐Ÿœ",category:"food_and_drink"},stew:{keywords:["food","meat","soup"],char:"๐Ÿฒ",category:"food_and_drink"},fish_cake:{keywords:["food","japan","sea","beach"],char:"๐Ÿฅ",category:"food_and_drink"},sushi:{keywords:["food","fish","japanese","rice"],char:"๐Ÿฃ",category:"food_and_drink"},bento:{keywords:["food","japanese","box"],char:"๐Ÿฑ",category:"food_and_drink"},curry:{keywords:["food","spicy","hot","indian"],char:"๐Ÿ›",category:"food_and_drink"},rice_ball:{keywords:["food","japanese"],char:"๐Ÿ™",category:"food_and_drink"},rice:{keywords:["food","china","asian"],char:"๐Ÿš",category:"food_and_drink"},rice_cracker:{keywords:["food","japanese"],char:"๐Ÿ˜",category:"food_and_drink"},oden:{keywords:["food","japanese"],char:"๐Ÿข",category:"food_and_drink"},dango:{keywords:["food","dessert","sweet","japanese","barbecue","meat"],char:"๐Ÿก",category:"food_and_drink"},shaved_ice:{keywords:["hot","dessert","summer"],char:"๐Ÿง",category:"food_and_drink"},ice_cream:{keywords:["food","hot","dessert"],char:"๐Ÿจ",category:"food_and_drink"},icecream:{keywords:["food","hot","dessert","summer"],char:"๐Ÿฆ",category:"food_and_drink"},cake:{keywords:["food","dessert"],char:"๐Ÿฐ",category:"food_and_drink"},birthday:{keywords:["food","dessert","cake"],char:"๐ŸŽ‚",category:"food_and_drink"},custard:{keywords:["dessert","food"],char:"๐Ÿฎ",category:"food_and_drink"},candy:{keywords:["snack","dessert","sweet","lolly"],char:"๐Ÿฌ",category:"food_and_drink"},lollipop:{keywords:["food","snack","candy","sweet"],char:"๐Ÿญ",category:"food_and_drink"},chocolate_bar:{keywords:["food","snack","dessert","sweet"],char:"๐Ÿซ",category:"food_and_drink"},popcorn:{keywords:["food","movie theater","films","snack"],char:"๐Ÿฟ",category:"food_and_drink"},doughnut:{keywords:["food","dessert","snack","sweet","donut"],char:"๐Ÿฉ",category:"food_and_drink"},cookie:{keywords:["food","snack","oreo","chocolate","sweet","dessert"],char:"๐Ÿช",category:"food_and_drink"},beer:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:"๐Ÿบ",category:"food_and_drink"},beers:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:"๐Ÿป",category:"food_and_drink"},wine_glass:{keywords:["drink","beverage","drunk","alcohol","booze"],char:"๐Ÿท",category:"food_and_drink"},cocktail:{keywords:["drink","drunk","alcohol","beverage","booze","mojito"],char:"๐Ÿธ",category:"food_and_drink"},tropical_drink:{keywords:["beverage","cocktail","summer","beach","alcohol","booze","mojito"],char:"๐Ÿน",category:"food_and_drink"},bottle:{keywords:["drink","wine","champagne"],char:"๐Ÿพ",category:"food_and_drink"},sake:{keywords:["wine","drink","drunk","beverage","japanese","alcohol","booze"],char:"๐Ÿถ",category:"food_and_drink"},tea:{keywords:["drink","bowl","breakfast","green","british"],char:"๐Ÿต",category:"food_and_drink"},coffee:{keywords:["beverage","caffeine","latte","espresso"],char:"โ˜•",category:"food_and_drink"},baby_bottle:{keywords:["food","container","milk"],char:"๐Ÿผ",category:"food_and_drink"},fork_and_knife:{keywords:["cutlery","kitchen"],char:"๐Ÿด",category:"food_and_drink"},fork_and_knife_with_plate:{keywords:["food","eat","meal","lunch","dinner","restaurant"],char:"๐Ÿฝ",category:"food_and_drink"},soccer:{keywords:["sports","football"],char:"โšฝ",category:"activity"},basketball:{keywords:["sports","balls","NBA"],char:"๐Ÿ€",category:"activity"},football:{keywords:["sports","balls","NFL"],char:"๐Ÿˆ",category:"activity"},baseball:{keywords:["sports","balls"],char:"โšพ",category:"activity"},tennis:{keywords:["sports","balls","green"],char:"๐ŸŽพ",category:"activity"},volleyball:{keywords:["sports","balls"],char:"๐Ÿ",category:"activity"},rugby_football:{keywords:["sports","team"],char:"๐Ÿ‰",category:"activity"},"8ball":{keywords:["pool","hobby","game","luck","magic"],char:"๐ŸŽฑ",category:"activity"},golf:{keywords:["sports","business","flag","hole","summer"],char:"โ›ณ",category:"activity"},golfer:{keywords:["sports","business"],char:"๐ŸŒ",category:"activity"},table_tennis:{keywords:["sports","pingpong"],char:"๐Ÿ“",category:"activity"},badminton:{keywords:["sports"],char:"๐Ÿธ",category:"activity"},ice_hockey:{keywords:["sports"],char:"๐Ÿ’",category:"activity"},field_hockey:{keywords:["sports"],char:"๐Ÿ‘",category:"activity"},cricket:{keywords:["sports"],char:"๐Ÿ",category:"activity"},ski:{keywords:["sports","winter","cold","snow"],char:"๐ŸŽฟ",category:"activity"},skier:{keywords:["sports","winter","snow"],char:"โ›ท",category:"activity"},snowboarder:{keywords:["sports","winter"],char:"๐Ÿ‚",category:"activity"},ice_skate:{keywords:["sports"],char:"โ›ธ",category:"activity"},bow_and_arrow:{keywords:["sports"],char:"๐Ÿน",category:"activity"},fishing_pole_and_fish:{keywords:["food","hobby","summer"],char:"๐ŸŽฃ",category:"activity"},rowboat:{keywords:["sports","hobby","water","ship"],char:"๐Ÿšฃ",category:"activity"},swimmer:{keywords:["sports","exercise","human","athlete","water","summer"],char:"๐ŸŠ",category:"activity"},surfer:{keywords:["sports","ocean","sea","summer","beach"],char:"๐Ÿ„",category:"activity"},bath:{keywords:["clean","shower","bathroom"],char:"๐Ÿ›€",category:"activity"},person_with_ball:{keywords:["sports","human"],char:"โ›น",category:"activity"},weight_lifter:{keywords:["sports","training","exercise"],char:"๐Ÿ‹",category:"activity"},bicyclist:{keywords:["sports","bike","exercise","hipster"],char:"๐Ÿšด",category:"activity"},mountain_bicyclist:{keywords:["transportation","sports","human","race","bike"],char:"๐Ÿšต",category:"activity"},horse_racing:{keywords:["animal","betting","competition","gambling","luck"],char:"๐Ÿ‡",category:"activity"},man_levitating:{keywords:["suit","business","levitate","hover","jump"],char:"๐Ÿ•ด",category:"activity"},trophy:{keywords:["win","award","contest","place","ftw","ceremony"],char:"๐Ÿ†",category:"activity"},running_shirt_with_sash:{keywords:["play","pageant"],char:"๐ŸŽฝ",category:"activity"},sports_medal:{keywords:["award","winning"],char:"๐Ÿ…",category:"activity"},military_medal:{keywords:["award","winning","army"],char:"๐ŸŽ–",category:"activity"},reminder_ribbon:{keywords:["sports","cause","support","awareness"],char:"๐ŸŽ—",category:"activity"},rosette:{keywords:["flower","decoration","military"],char:"๐Ÿต",category:"activity"},ticket:{keywords:["event","concert","pass"],char:"๐ŸŽซ",category:"activity"},admission_ticket:{keywords:["sports","concert","entrance"],char:"๐ŸŽŸ",category:"activity"},performing_arts:{keywords:["acting","theater","drama"],char:"๐ŸŽญ",category:"activity"},art:{keywords:["design","paint","draw","colors"],char:"๐ŸŽจ",category:"activity"},circus_tent:{keywords:["festival","carnival","party"],char:"๐ŸŽช",category:"activity"},microphone:{keywords:["sound","music","PA"],char:"๐ŸŽค",category:"activity"},headphones:{keywords:["music","score","gadgets"],char:"๐ŸŽง",category:"activity"},musical_score:{keywords:["treble","clef"],char:"๐ŸŽผ",category:"activity"},musical_keyboard:{keywords:["piano","instrument"],char:"๐ŸŽน",category:"activity"},saxophone:{keywords:["music","instrument","jazz","blues"],char:"๐ŸŽท",category:"activity"},trumpet:{keywords:["music","brass"],char:"๐ŸŽบ",category:"activity"},guitar:{keywords:["music","instrument"],char:"๐ŸŽธ",category:"activity"},violin:{keywords:["music","instrument","orchestra","symphony"],char:"๐ŸŽป",category:"activity"},clapper:{keywords:["movie","film","record"],char:"๐ŸŽฌ",category:"activity"},video_game:{keywords:["play","console","PS4","controller"],char:"๐ŸŽฎ",category:"activity"},space_invader:{keywords:["game","arcade","play"],char:"๐Ÿ‘พ",category:"activity"},dart:{keywords:["game","play","bar"],char:"๐ŸŽฏ",category:"activity"},game_die:{keywords:["dice","random","tabletop","play","luck"],char:"๐ŸŽฒ",category:"activity"},slot_machine:{keywords:["bet","gamble","vegas","fruit machine","luck","casino"],char:"๐ŸŽฐ",category:"activity"},bowling:{keywords:["sports","fun","play"],char:"๐ŸŽณ",category:"activity"},car:{keywords:["red","transportation","vehicle"],char:"๐Ÿš—",category:"travel_and_places"},taxi:{keywords:["uber","vehicle","cars","transportation"],char:"๐Ÿš•",category:"travel_and_places"},blue_car:{keywords:["transportation","vehicle"],char:"๐Ÿš™",category:"travel_and_places"},bus:{keywords:["car","vehicle","transportation"],char:"๐ŸšŒ",category:"travel_and_places"},trolleybus:{keywords:["bart","transportation","vehicle"],char:"๐ŸšŽ",category:"travel_and_places"},racing_car:{keywords:["sports","race","fast","formula","f1"],char:"๐ŸŽ",category:"travel_and_places"},police_car:{keywords:["vehicle","cars","transportation","law","legal","enforcement"],char:"๐Ÿš“",category:"travel_and_places"},ambulance:{keywords:["health","911","hospital"],char:"๐Ÿš‘",category:"travel_and_places"},fire_engine:{keywords:["transportation","cars","vehicle"],char:"๐Ÿš’",category:"travel_and_places"},minibus:{keywords:["vehicle","car","transportation"],char:"๐Ÿš",category:"travel_and_places"},truck:{keywords:["cars","transportation"],char:"๐Ÿšš",category:"travel_and_places"},articulated_lorry:{keywords:["vehicle","cars","transportation","express"],char:"๐Ÿš›",category:"travel_and_places"},tractor:{keywords:["vehicle","car","farming","agriculture"],char:"๐Ÿšœ",category:"travel_and_places"},racing_motorcycle:{keywords:["race","sports","fast"],char:"๐Ÿ",category:"travel_and_places"},bike:{keywords:["sports","bicycle","exercise","hipster"],char:"๐Ÿšฒ",category:"travel_and_places"},rotating_light:{keywords:["police","ambulance","911","emergency","alert","error","pinged","law","legal"],char:"๐Ÿšจ",category:"travel_and_places"},oncoming_police_car:{keywords:["vehicle","law","legal","enforcement","911"],char:"๐Ÿš”",category:"travel_and_places"},oncoming_bus:{keywords:["vehicle","transportation"],char:"๐Ÿš",category:"travel_and_places"},oncoming_automobile:{keywords:["car","vehicle","transportation"],char:"๐Ÿš˜",category:"travel_and_places"},oncoming_taxi:{keywords:["vehicle","cars","uber"],char:"๐Ÿš–",category:"travel_and_places"},aerial_tramway:{keywords:["transportation","vehicle","ski"],char:"๐Ÿšก",category:"travel_and_places"},mountain_cableway:{keywords:["transportation","vehicle","ski"],char:"๐Ÿš ",category:"travel_and_places"},suspension_railway:{keywords:["vehicle","transportation"],char:"๐ŸšŸ",category:"travel_and_places"},railway_car:{keywords:["transportation","vehicle"],char:"๐Ÿšƒ",category:"travel_and_places"},train:{keywords:["transportation","vehicle","carriage","public","travel"],char:"๐Ÿš‹",category:"travel_and_places"},monorail:{keywords:["transportation","vehicle"],char:"๐Ÿš",category:"travel_and_places"},bullettrain_side:{keywords:["transportation","vehicle"],char:"๐Ÿš„",category:"travel_and_places"},bullettrain_front:{keywords:["transportation","vehicle","speed","fast","public","travel"],char:"๐Ÿš…",category:"travel_and_places"},light_rail:{keywords:["transportation","vehicle"],char:"๐Ÿšˆ",category:"travel_and_places"},mountain_railway:{keywords:["transportation","vehicle"],char:"๐Ÿšž",category:"travel_and_places"},steam_locomotive:{keywords:["transportation","vehicle","train"],char:"๐Ÿš‚",category:"travel_and_places"},train2:{keywords:["transportation","vehicle"],char:"๐Ÿš†",category:"travel_and_places"},metro:{keywords:["transportation","blue-square","mrt","underground","tube"],char:"๐Ÿš‡",category:"travel_and_places"},tram:{keywords:["transportation","vehicle"],char:"๐ŸšŠ",category:"travel_and_places"},station:{keywords:["transportation","vehicle","public"],char:"๐Ÿš‰",category:"travel_and_places"},helicopter:{keywords:["transportation","vehicle","fly"],char:"๐Ÿš",category:"travel_and_places"},small_airplane:{keywords:["flight","transportation","fly","vehicle"],char:"๐Ÿ›ฉ",category:"travel_and_places"},airplane:{keywords:["vehicle","transportation","flight","fly"],char:"โœˆ๏ธ",category:"travel_and_places"},airplane_departure:{keywords:["airport","flight","landing"],char:"๐Ÿ›ซ",category:"travel_and_places"},airplane_arrival:{keywords:["airport","flight","boarding"],char:"๐Ÿ›ฌ",category:"travel_and_places"},boat:{keywords:["ship","summer","transportation","water","sailing","sailboat"],char:"โ›ต",category:"travel_and_places"},motor_boat:{keywords:["ship"],char:"๐Ÿ›ฅ",category:"travel_and_places"},speedboat:{keywords:["ship","transportation","vehicle","summer"],char:"๐Ÿšค",category:"travel_and_places"},ferry:{keywords:["boat","ship","yacht"],char:"โ›ด",category:"travel_and_places"},passenger_ship:{keywords:["yacht","cruise","ferry"],char:"๐Ÿ›ณ",category:"travel_and_places"},rocket:{keywords:["launch","ship","staffmode","NASA","outer space","outer_space","fly"],char:"๐Ÿš€",category:"travel_and_places"},artificial_satellite:{keywords:["communication","gps","orbit","spaceflight","NASA","ISS"],char:"๐Ÿ›ฐ",category:"travel_and_places"},seat:{keywords:["sit","airplane","transport","bus","flight","fly"],char:"๐Ÿ’บ",category:"travel_and_places"},anchor:{keywords:["ship","ferry","sea","boat"],char:"โš“",category:"travel_and_places"},construction:{keywords:["wip","progress","caution","warning"],char:"๐Ÿšง",category:"travel_and_places"},fuelpump:{keywords:["gas station","petroleum"],char:"โ›ฝ",category:"travel_and_places"},busstop:{keywords:["transportation","wait"],char:"๐Ÿš",category:"travel_and_places"},vertical_traffic_light:{keywords:["transportation","driving"],char:"๐Ÿšฆ",category:"travel_and_places"},traffic_light:{keywords:["transportation","signal"],char:"๐Ÿšฅ",category:"travel_and_places"},checkered_flag:{keywords:["contest","finishline","race","gokart"],char:"๐Ÿ",category:"travel_and_places"},ship:{keywords:["transportation","titanic","deploy"],char:"๐Ÿšข",category:"travel_and_places"},ferris_wheel:{keywords:["photo","carnival","londoneye"],char:"๐ŸŽก",category:"travel_and_places"},roller_coaster:{keywords:["carnival","playground","photo","fun"],char:"๐ŸŽข",category:"travel_and_places"},carousel_horse:{keywords:["photo","carnival"],char:"๐ŸŽ ",category:"travel_and_places"},building_construction:{keywords:["wip","working","progress"],char:"๐Ÿ—",category:"travel_and_places"},foggy:{keywords:["photo","mountain"],char:"๐ŸŒ",category:"travel_and_places"},tokyo_tower:{keywords:["photo","japanese"],char:"๐Ÿ—ผ",category:"travel_and_places"},factory:{keywords:["building","industry","pollution","smoke"],char:"๐Ÿญ",category:"travel_and_places"},fountain:{keywords:["photo","summer","water","fresh"],char:"โ›ฒ",category:"travel_and_places"},rice_scene:{keywords:["photo","japan","asia","tsukimi"],char:"๐ŸŽ‘",category:"travel_and_places"},mountain:{keywords:["photo","nature","environment"],char:"โ›ฐ",category:"travel_and_places"},snow_capped_mountain:{keywords:["photo","nature","environment","winter","cold"],char:"๐Ÿ”",category:"travel_and_places"},mount_fuji:{keywords:["photo","mountain","nature","japanese"],char:"๐Ÿ—ป",category:"travel_and_places"},volcano:{keywords:["photo","nature","disaster"],char:"๐ŸŒ‹",category:"travel_and_places"},japan:{keywords:["nation","country","japanese","asia"],char:"๐Ÿ—พ",category:"travel_and_places"},camping:{keywords:["photo","outdoors","tent"],char:"๐Ÿ•",category:"travel_and_places"},tent:{keywords:["photo","camping","outdoors"],char:"โ›บ",category:"travel_and_places"},national_park:{keywords:["photo","environment","nature"],char:"๐Ÿž",category:"travel_and_places"},motorway:{keywords:["road","cupertino","interstate","highway"],char:"๐Ÿ›ฃ",category:"travel_and_places"},railway_track:{keywords:["train","transportation"],char:"๐Ÿ›ค",category:"travel_and_places"},sunrise:{keywords:["morning","view","vacation","photo"],char:"๐ŸŒ…",category:"travel_and_places"},sunrise_over_mountains:{keywords:["view","vacation","photo"],char:"๐ŸŒ„",category:"travel_and_places"},desert:{keywords:["photo","warm","saharah"],char:"๐Ÿœ",category:"travel_and_places"},beach_with_umbrella:{keywords:["weather","summer","sunny","sand","mojito"],char:"๐Ÿ–",category:"travel_and_places"},desert_island:{keywords:["photo","tropical","mojito"],char:"๐Ÿ",category:"travel_and_places"},city_sunrise:{keywords:["photo","good morning","dawn"],char:"๐ŸŒ‡",category:"travel_and_places"},city_sunset:{keywords:["photo","evening","sky","buildings"],char:"๐ŸŒ†",category:"travel_and_places"},cityscape:{keywords:["photo","night life","urban"],char:"๐Ÿ™",category:"travel_and_places"},night_with_stars:{keywords:["evening","city","downtown"],char:"๐ŸŒƒ",category:"travel_and_places"},bridge_at_night:{keywords:["photo","sanfrancisco"],char:"๐ŸŒ‰",category:"travel_and_places"},milky_way:{keywords:["photo","space","stars"],char:"๐ŸŒŒ",category:"travel_and_places"},stars:{keywords:["night","photo"],char:"๐ŸŒ ",category:"travel_and_places"},sparkler:{keywords:["stars","night","shine"],char:"๐ŸŽ‡",category:"travel_and_places"},fireworks:{keywords:["photo","festival","carnival","congratulations"],char:"๐ŸŽ†",category:"travel_and_places"},rainbow:{keywords:["nature","happy","unicorn","photo","sky","spring"],char:"๐ŸŒˆ",category:"travel_and_places"},buildings:{keywords:["houses","photo"],char:"๐Ÿ˜",category:"travel_and_places"},european_castle:{keywords:["building","royalty","history"],char:"๐Ÿฐ",category:"travel_and_places"},japanese_castle:{keywords:["photo","building"],char:"๐Ÿฏ",category:"travel_and_places"},stadium:{keywords:["photo","place","sports","concert","venue"],char:"๐ŸŸ",category:"travel_and_places"},statue_of_liberty:{keywords:["american","newyork"],char:"๐Ÿ—ฝ",category:"travel_and_places"},house:{keywords:["building","home"],char:"๐Ÿ ",category:"travel_and_places"},house_with_garden:{keywords:["home","plant","nature"],char:"๐Ÿก",category:"travel_and_places"},derelict_house:{keywords:["abandon","evict","broken","building"],char:"๐Ÿš",category:"travel_and_places"},office:{keywords:["building","bureau","work"],char:"๐Ÿข",category:"travel_and_places"},department_store:{keywords:["building","shopping","mall"],char:"๐Ÿฌ",category:"travel_and_places"},post_office:{keywords:["building","email","communication"],char:"๐Ÿฃ",category:"travel_and_places"},european_post_office:{keywords:["building","email"],char:"๐Ÿค",category:"travel_and_places"},hospital:{keywords:["building","health","surgery","doctor"],char:"๐Ÿฅ",category:"travel_and_places"},bank:{keywords:["building","money","sales","cash","business","enterprise"],char:"๐Ÿฆ",category:"travel_and_places"},hotel:{keywords:["building","accomodation","checkin"],char:"๐Ÿจ",category:"travel_and_places"},convenience_store:{keywords:["building","shopping","groceries"],char:"๐Ÿช",category:"travel_and_places"},school:{keywords:["building","student","education","learn","teach"],char:"๐Ÿซ",category:"travel_and_places"},love_hotel:{keywords:["like","affection","dating"],char:"๐Ÿฉ",category:"travel_and_places"},wedding:{keywords:["love","like","affection","couple","marriage","bride","groom"],char:"๐Ÿ’’",category:"travel_and_places"},museum:{keywords:["art","culture","history"],char:"๐Ÿ›",category:"travel_and_places"},church:{keywords:["building","religion","christ"],char:"โ›ช",category:"travel_and_places"},mosque:{keywords:["islam","worship","minaret"],char:"๐Ÿ•Œ",category:"travel_and_places"},synagogue:{keywords:["judaism","worship","temple","jewish"],char:"๐Ÿ•",category:"travel_and_places"},kaaba:{keywords:["mecca","mosque","islam"],char:"๐Ÿ•‹",category:"travel_and_places"},shinto_shrine:{keywords:["temple","japan","kyoto"],char:"โ›ฉ",category:"travel_and_places"},watch:{keywords:["time","accessories"],char:"โŒš",category:"objects"},iphone:{keywords:["technology","apple","gadgets","dial"],char:"๐Ÿ“ฑ",category:"objects"},calling:{keywords:["iphone","incoming"],char:"๐Ÿ“ฒ",category:"objects"},computer:{keywords:["technology","laptop","screen","display","monitor"],char:"๐Ÿ’ป",category:"objects"},keyboard:{keywords:["technology","computer","type","input","text"],char:"โŒจ",category:"objects"},desktop_computer:{keywords:["technology","computing","screen"],char:"๐Ÿ–ฅ",category:"objects"},printer:{keywords:["paper","ink"],char:"๐Ÿ–จ",category:"objects"},three_button_mouse:{keywords:["click"],char:"๐Ÿ–ฑ",category:"objects"},trackball:{keywords:["technology","trackpad"],char:"๐Ÿ–ฒ",category:"objects"},joystick:{keywords:["game","play"],char:"๐Ÿ•น",category:"objects"},compression:{keywords:["tool"],char:"๐Ÿ—œ",category:"objects"},minidisc:{keywords:["technology","record","data","disk","90s"],char:"๐Ÿ’ฝ",category:"objects"},floppy_disk:{keywords:["oldschool","technology","save","90s","80s"],char:"๐Ÿ’พ",category:"objects"},cd:{keywords:["technology","dvd","disk","disc","90s"],char:"๐Ÿ’ฟ",category:"objects"},dvd:{keywords:["cd","disk","disc"],char:"๐Ÿ“€",category:"objects"},vhs:{keywords:["record","video","oldschool","90s","80s"],char:"๐Ÿ“ผ",category:"objects"},camera:{keywords:["gadgets","photography"],char:"๐Ÿ“ท",category:"objects"},camera_with_flash:{keywords:["photography","gadgets"],char:"๐Ÿ“ธ",category:"objects"},video_camera:{keywords:["film","record"],char:"๐Ÿ“น",category:"objects"},movie_camera:{keywords:["film","record"],char:"๐ŸŽฅ",category:"objects"},film_projector:{keywords:["video","tape","record","movie"],char:"๐Ÿ“ฝ",category:"objects"},film_frames:{keywords:["movie"],char:"๐ŸŽž",category:"objects"},telephone_receiver:{keywords:["technology","communication","dial"],char:"๐Ÿ“ž",category:"objects"},phone:{keywords:["technology","communication","dial","telephone"],char:"โ˜Ž๏ธ",category:"objects"},pager:{keywords:["bbcall","oldschool","90s"],char:"๐Ÿ“Ÿ",category:"objects"},fax:{keywords:["communication","technology"],char:"๐Ÿ“ ",category:"objects"},tv:{keywords:["technology","program","oldschool","show","television"],char:"๐Ÿ“บ",category:"objects"},radio:{keywords:["communication","music","podcast","program"],char:"๐Ÿ“ป",category:"objects"},studio_microphone:{keywords:["singer","recording","artist"],char:"๐ŸŽ™",category:"objects"},level_slider:{keywords:["scale"],char:"๐ŸŽš",category:"objects"},control_knobs:{keywords:["dial"],char:"๐ŸŽ›",category:"objects"},stopwatch:{keywords:["time","deadline"],char:"โฑ",category:"objects"},timer_clock:{keywords:["alarm"],char:"โฒ",category:"objects"},alarm_clock:{keywords:["time","wake"],char:"โฐ",category:"objects"},mantelpiece_clock:{keywords:["time"],char:"๐Ÿ•ฐ",category:"objects"},hourglass_flowing_sand:{keywords:["oldschool","time","countdown"],char:"โณ",category:"objects"},hourglass:{keywords:["time","clock","oldschool","limit","exam","quiz","test"],char:"โŒ›",category:"objects"},satellite:{keywords:["communication","future","radio","space"],char:"๐Ÿ“ก",category:"objects"},battery:{keywords:["power","energy","sustain"],char:"๐Ÿ”‹",category:"objects"},electric_plug:{keywords:["charger","power"],char:"๐Ÿ”Œ",category:"objects"},bulb:{keywords:["light","electricity","idea"],char:"๐Ÿ’ก",category:"objects"},flashlight:{keywords:["dark","camping","sight","night"],char:"๐Ÿ”ฆ",category:"objects"},candle:{keywords:["fire","wax"],char:"๐Ÿ•ฏ",category:"objects"},wastebasket:{keywords:["bin","trash","rubbish","garbage","toss"],char:"๐Ÿ—‘",category:"objects"},oil_drum:{keywords:["barrell"],char:"๐Ÿ›ข",category:"objects"},money_with_wings:{keywords:["dollar","bills","payment","sale"],char:"๐Ÿ’ธ",category:"objects"},dollar:{keywords:["money","sales","bill","currency"],char:"๐Ÿ’ต",category:"objects"},yen:{keywords:["money","sales","japanese","dollar","currency"],char:"๐Ÿ’ด",category:"objects"},euro:{keywords:["money","sales","dollar","currency"],char:"๐Ÿ’ถ",category:"objects"},pound:{keywords:["british","sterling","money","sales","bills","uk","england","currency"],char:"๐Ÿ’ท",category:"objects"},moneybag:{keywords:["dollar","payment","coins","sale"],char:"๐Ÿ’ฐ",category:"objects"},credit_card:{keywords:["money","sales","dollar","bill","payment","shopping"],char:"๐Ÿ’ณ",category:"objects"},gem:{keywords:["blue","ruby","diamond","jewelry"],char:"๐Ÿ’Ž",category:"objects"},scales:{keywords:["law","fairness","weight"],char:"โš–",category:"objects"},wrench:{keywords:["tools","diy","ikea","fix","maintainer"],char:"๐Ÿ”ง",category:"objects"},hammer:{keywords:["tools","build","create"],char:"๐Ÿ”จ",category:"objects"},hammer_and_pick:{keywords:["tools","build","create"],char:"โš’",category:"objects"},hammer_and_wrench:{keywords:["tools","build","create"],char:"๐Ÿ› ",category:"objects"},pick:{keywords:["tools","dig"],char:"โ›",category:"objects"},nut_and_bolt:{keywords:["handy","tools","fix"],char:"๐Ÿ”ฉ",category:"objects"},gear:{keywords:["cog"],char:"โš™",category:"objects"},chains:{keywords:["lock","arrest"],char:"โ›“",category:"objects"},gun:{keywords:["violence","weapon","pistol","revolver"],char:"๐Ÿ”ซ",category:"objects"},bomb:{keywords:["boom","explode","explosion","terrorism"],char:"๐Ÿ’ฃ",category:"objects"},hocho:{keywords:["knife","blade","cutlery","kitchen","weapon"],char:"๐Ÿ”ช",category:"objects"},dagger_knife:{keywords:["weapon"],char:"๐Ÿ—ก",category:"objects"},crossed_swords:{keywords:["weapon"],char:"โš”",category:"objects"},shield:{keywords:["protection","security"],char:"๐Ÿ›ก",category:"objects"},smoking:{keywords:["kills","tobacco","cigarette","joint","smoke"],char:"๐Ÿšฌ",category:"objects"},skull_and_crossbones:{keywords:["poison","danger","deadly","scary"],char:"โ˜ ",category:"objects"},coffin:{keywords:["vampire","dead","die","death","rip","graveyard","cemetery"],char:"โšฐ",category:"objects"},funeral_urn:{keywords:["dead","die","death","rip","ashes"],char:"โšฑ",category:"objects"},amphora:{keywords:["vase","jar"],char:"๐Ÿบ",category:"objects"},crystal_ball:{keywords:["disco","party","magic","circus","fortune_teller"],char:"๐Ÿ”ฎ",category:"objects"},prayer_beads:{keywords:["dhikr","religious"],char:"๐Ÿ“ฟ",category:"objects"},barber:{keywords:["hair","salon","style"],char:"๐Ÿ’ˆ",category:"objects"},alembic:{keywords:["distilling","science","experiment"],char:"โš—",category:"objects"},telescope:{keywords:["stars","space","zoom"],char:"๐Ÿ”ญ",category:"objects"},microscope:{keywords:["laboratory","experiment","zoomin","science","study"],char:"๐Ÿ”ฌ",category:"objects"},hole:{keywords:["embarrassing"],char:"๐Ÿ•ณ",category:"objects"},pill:{keywords:["health","medicine","doctor","pharmacy","drug"],char:"๐Ÿ’Š",category:"objects"},syringe:{keywords:["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],char:"๐Ÿ’‰",category:"objects"},thermometer:{keywords:["weather","temperature","hot","cold"],char:"๐ŸŒก",category:"objects"},label:{keywords:["sale","tag"],char:"๐Ÿท",category:"objects"},bookmark:{keywords:["favorite","label","save"],char:"๐Ÿ”–",category:"objects"},toilet:{keywords:["restroom","wc","washroom","bathroom","potty"],char:"๐Ÿšฝ",category:"objects"},shower:{keywords:["clean","water","bathroom"],char:"๐Ÿšฟ",category:"objects"},bathtub:{keywords:["clean","shower","bathroom"],char:"๐Ÿ›",category:"objects"},key:{keywords:["lock","door","password"],char:"๐Ÿ”‘",category:"objects"},old_key:{keywords:["lock","door","password"],char:"๐Ÿ—",category:"objects"},couch_and_lamp:{keywords:["read","chill"],char:"๐Ÿ›‹",category:"objects"},sleeping_accommodation:{keywords:["bed","rest"],char:"๐Ÿ›Œ",category:"objects"},bed:{keywords:["sleep","rest"],char:"๐Ÿ›",category:"objects"},door:{keywords:["house","entry","exit"],char:"๐Ÿšช",category:"objects"},bellhop_bell:{keywords:["service"],char:"๐Ÿ›Ž",category:"objects"},frame_with_picture:{keywords:["photography"],char:"๐Ÿ–ผ",category:"objects"},world_map:{keywords:["location","direction"],char:"๐Ÿ—บ",category:"objects"},umbrella_on_ground:{keywords:["weather","summer"],char:"โ›ฑ",category:"objects"},moyai:{keywords:["rock","easter island","moai"],char:"๐Ÿ—ฟ",category:"objects"},shopping_bags:{keywords:["mall","buy","purchase"],char:"๐Ÿ›",category:"objects"},balloon:{keywords:["party","celebration","birthday","circus"],char:"๐ŸŽˆ",category:"objects"},flags:{keywords:["fish","japanese","koinobori","carp","banner"],char:"๐ŸŽ",category:"objects"},ribbon:{keywords:["decoration","pink","girl","bowtie"],char:"๐ŸŽ€",category:"objects"},gift:{keywords:["present","birthday","christmas","xmas"],char:"๐ŸŽ",category:"objects"},confetti_ball:{keywords:["festival","party","birthday","circus"],char:"๐ŸŽŠ",category:"objects"},tada:{keywords:["party","contulations","birthday","magic","circus"],char:"๐ŸŽ‰",category:"objects"},dolls:{keywords:["japanese","toy","kimono"],char:"๐ŸŽŽ",category:"objects"},wind_chime:{keywords:["nature","ding","spring","bell"],char:"๐ŸŽ",category:"objects"},crossed_flags:{keywords:["japanese","nation","country","border"],char:"๐ŸŽŒ",category:"objects"},izakaya_lantern:{keywords:["light","paper","halloween","spooky"],char:"๐Ÿฎ",category:"objects"},envelope:{keywords:["letter","postal","inbox","communication"],char:"โœ‰๏ธ",category:"objects"},envelope_with_arrow:{keywords:["email","communication"],char:"๐Ÿ“ฉ",category:"objects"},incoming_envelope:{keywords:["email","inbox"],char:"๐Ÿ“จ",category:"objects"},email:{keywords:["communication","inbox"],char:"๐Ÿ“ง",category:"objects"},love_letter:{keywords:["email","like","affection","envelope","valentines"],char:"๐Ÿ’Œ",category:"objects"},postbox:{keywords:["email","letter","envelope"],char:"๐Ÿ“ฎ",category:"objects"},mailbox_closed:{keywords:["email","communication","inbox"],char:"๐Ÿ“ช",category:"objects"},mailbox:{keywords:["email","inbox","communication"],char:"๐Ÿ“ซ",category:"objects"},mailbox_with_mail:{keywords:["email","inbox","communication"],char:"๐Ÿ“ฌ",category:"objects"},mailbox_with_no_mail:{keywords:["email","inbox"],char:"๐Ÿ“ญ",category:"objects"},package:{keywords:["mail","gift","cardboard","box","moving"],char:"๐Ÿ“ฆ",category:"objects"},postal_horn:{keywords:["instrument","music"],char:"๐Ÿ“ฏ",category:"objects"},inbox_tray:{keywords:["email","documents"],char:"๐Ÿ“ฅ",category:"objects"},outbox_tray:{keywords:["inbox","email"],char:"๐Ÿ“ค",category:"objects"},scroll:{keywords:["documents","ancient","history","paper"],char:"๐Ÿ“œ",category:"objects"},page_with_curl:{keywords:["documents","office","paper"],char:"๐Ÿ“ƒ",category:"objects"},bookmark_tabs:{keywords:["favorite","save","order","tidy"],char:"๐Ÿ“‘",category:"objects"},bar_chart:{keywords:["graph","presentation","stats"],char:"๐Ÿ“Š",category:"objects"},chart_with_upwards_trend:{keywords:["graph","presentation","stats","recovery","business","economics","money","sales","good","success"],char:"๐Ÿ“ˆ",category:"objects"},chart_with_downwards_trend:{keywords:["graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],char:"๐Ÿ“‰",category:"objects"},page_facing_up:{keywords:["documents","office","paper","information"],char:"๐Ÿ“„",category:"objects"},date:{keywords:["calendar","schedule"],char:"๐Ÿ“…",category:"objects"},calendar:{keywords:["schedule","date","planning"],char:"๐Ÿ“†",category:"objects"},spiral_calendar_pad:{keywords:["date","schedule","planning"],char:"๐Ÿ—“",category:"objects"},card_index:{keywords:["business","stationery"],char:"๐Ÿ“‡",category:"objects"},card_file_box:{keywords:["business","stationery"],char:"๐Ÿ—ƒ",category:"objects"},ballot_box_with_ballot:{keywords:["election","vote"],char:"๐Ÿ—ณ",category:"objects"},file_cabinet:{keywords:["filing","organizing"],char:"๐Ÿ—„",category:"objects"},clipboard:{keywords:["stationery","documents"],char:"๐Ÿ“‹",category:"objects"},spiral_note_pad:{keywords:["memo","stationery"],char:"๐Ÿ—’",category:"objects"},file_folder:{keywords:["documents","business","office"],char:"๐Ÿ“",category:"objects"},open_file_folder:{keywords:["documents","load"],char:"๐Ÿ“‚",category:"objects"},card_index_dividers:{keywords:["organizing","business","stationery"],char:"๐Ÿ—‚",category:"objects"},rolled_up_newspaper:{keywords:["press","headline"],char:"๐Ÿ—ž",category:"objects"},newspaper:{keywords:["press","headline"],char:"๐Ÿ“ฐ",category:"objects"},notebook:{keywords:["stationery","record","notes","paper","study"],char:"๐Ÿ““",category:"objects"},closed_book:{keywords:["read","library","knowledge","textbook","learn"],char:"๐Ÿ“•",category:"objects"},green_book:{keywords:["read","library","knowledge","study"],char:"๐Ÿ“—",category:"objects"},blue_book:{keywords:["read","library","knowledge","learn","study"],char:"๐Ÿ“˜",category:"objects"},orange_book:{keywords:["read","library","knowledge","textbook","study"],char:"๐Ÿ“™",category:"objects"},notebook_with_decorative_cover:{keywords:["classroom","notes","record","paper","study"],char:"๐Ÿ“”",category:"objects"},ledger:{keywords:["notes","paper"],char:"๐Ÿ“’",category:"objects"},books:{keywords:["literature","library","study"],char:"๐Ÿ“š",category:"objects"},book:{keywords:["open_book","read","library","knowledge","literature","learn","study"],char:"๐Ÿ“–",category:"objects"},link:{keywords:["rings","url"],char:"๐Ÿ”—",category:"objects"},paperclip:{keywords:["documents","stationery"],char:"๐Ÿ“Ž",category:"objects"},linked_paperclips:{keywords:["documents","stationery"],char:"๐Ÿ–‡",category:"objects"},scissors:{keywords:["stationery","cut"],char:"โœ‚๏ธ",category:"objects"},triangular_ruler:{keywords:["stationery","math","architect","sketch"],char:"๐Ÿ“",category:"objects"},straight_ruler:{keywords:["stationery","calculate","length","math","school","drawing","architect","sketch"],char:"๐Ÿ“",category:"objects"},pushpin:{keywords:["stationery","mark","here"],char:"๐Ÿ“Œ",category:"objects"},round_pushpin:{keywords:["stationery","location","map","here"],char:"๐Ÿ“",category:"objects"},triangular_flag_on_post:{keywords:["mark","milestone","place"],char:"๐Ÿšฉ",category:"objects"},waving_white_flag:{keywords:["losing","loser","lost","surrender","give up","fail"],char:"๐Ÿณ",category:"objects"},waving_black_flag:{keywords:["pirate"],char:"๐Ÿด",category:"objects"},closed_lock_with_key:{keywords:["security","privacy"],char:"๐Ÿ”",category:"objects"},lock:{keywords:["security","password","padlock"],char:"๐Ÿ”’",category:"objects"},unlock:{keywords:["privacy","security"],char:"๐Ÿ”“",category:"objects"},lock_with_ink_pen:{keywords:["security","secret"],char:"๐Ÿ”",category:"objects"},lower_left_ballpoint_pen:{keywords:["stationery","writing","write"],char:"๐Ÿ–Š",category:"objects"},lower_left_fountain_pen:{keywords:["stationery","writing","write"],char:"๐Ÿ–‹",category:"objects"},black_nib:{keywords:["pen","stationery","writing","write"],char:"โœ’๏ธ",category:"objects"},memo:{keywords:["write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study"],char:"๐Ÿ“",category:"objects"},pencil2:{keywords:["stationery","write","paper","writing","school","study"],char:"โœ๏ธ",category:"objects"},lower_left_crayon:{keywords:["drawing","creativity"],char:"๐Ÿ–",category:"objects"},lower_left_paintbrush:{keywords:["drawing","creativity","art"],char:"๐Ÿ–Œ",category:"objects"},mag:{keywords:["search","zoom","find","detective"],char:"๐Ÿ”",category:"objects"},mag_right:{keywords:["search","zoom","find","detective"],char:"๐Ÿ”Ž",category:"objects"},heart:{keywords:["love","like","valentines"],char:"โค๏ธ",category:"symbols"},yellow_heart:{keywords:["love","like","affection","valentines"],char:"๐Ÿ’›",category:"symbols"},green_heart:{keywords:["love","like","affection","valentines"],char:"๐Ÿ’š",category:"symbols"},blue_heart:{keywords:["love","like","affection","valentines"],char:"๐Ÿ’™",category:"symbols"},purple_heart:{keywords:["love","like","affection","valentines"],char:"๐Ÿ’œ",category:"symbols"},broken_heart:{keywords:["sad","sorry","break","heart","heartbreak"],char:"๐Ÿ’”",category:"symbols"},heavy_heart_exclamation_mark_ornament:{keywords:["decoration","love"],char:"โฃ",category:"symbols"},two_hearts:{keywords:["love","like","affection","valentines","heart"],char:"๐Ÿ’•",category:"symbols"},revolving_hearts:{keywords:["love","like","affection","valentines"],char:"๐Ÿ’ž",category:"symbols"},heartbeat:{keywords:["love","like","affection","valentines","pink","heart"],char:"๐Ÿ’“",category:"symbols"},heartpulse:{keywords:["like","love","affection","valentines","pink"],char:"๐Ÿ’—",category:"symbols"},sparkling_heart:{keywords:["love","like","affection","valentines"],char:"๐Ÿ’–",category:"symbols"},cupid:{keywords:["love","like","heart","affection","valentines"],char:"๐Ÿ’˜",category:"symbols"},gift_heart:{keywords:["love","valentines"],char:"๐Ÿ’",category:"symbols"},heart_decoration:{keywords:["purple-square","love","like"],char:"๐Ÿ’Ÿ",category:"symbols"},peace_symbol:{keywords:["hippie"],char:"โ˜ฎ",category:"symbols"},latin_cross:{keywords:["christianity"],char:"โœ",category:"symbols"},star_and_crescent:{keywords:["islam"],char:"โ˜ช",category:"symbols"},om_symbol:{keywords:["hinduism","buddhism","sikhism","jainism"],char:"๐Ÿ•‰",category:"symbols"},wheel_of_dharma:{keywords:["hinduism","buddhism","sikhism","jainism"],char:"โ˜ธ",category:"symbols"},star_of_david:{keywords:["judaism"],char:"โœก",category:"symbols"},six_pointed_star:{keywords:["purple-square","religion","jewish","hexagram"],char:"๐Ÿ”ฏ",category:"symbols"},menorah_with_nine_branches:{keywords:["hanukkah","candles","jewish"],char:"๐Ÿ•Ž",category:"symbols"},yin_yang:{keywords:["balance"],char:"โ˜ฏ",category:"symbols"},orthodox_cross:{keywords:["suppedaneum","religion"],char:"โ˜ฆ",category:"symbols"},place_of_worship:{keywords:["religion","church","temple","prayer"],char:"๐Ÿ›",category:"symbols"},ophiuchus:{keywords:["sign","purple-square","constellation","astrology"],char:"โ›Ž",category:"symbols"},aries:{keywords:["sign","purple-square","zodiac","astrology"],char:"โ™ˆ",category:"symbols"},taurus:{keywords:["purple-square","sign","zodiac","astrology"],char:"โ™‰",category:"symbols"},gemini:{keywords:["sign","zodiac","purple-square","astrology"],char:"โ™Š",category:"symbols"},cancer:{keywords:["sign","zodiac","purple-square","astrology"],char:"โ™‹",category:"symbols"},leo:{keywords:["sign","purple-square","zodiac","astrology"],char:"โ™Œ",category:"symbols"},virgo:{keywords:["sign","zodiac","purple-square","astrology"],char:"โ™",category:"symbols"},libra:{keywords:["sign","purple-square","zodiac","astrology"],char:"โ™Ž",category:"symbols"},scorpius:{keywords:["sign","zodiac","purple-square","astrology","scorpio"],char:"โ™",category:"symbols"},sagittarius:{keywords:["sign","zodiac","purple-square","astrology"],char:"โ™",category:"symbols"},capricorn:{keywords:["sign","zodiac","purple-square","astrology"],char:"โ™‘",category:"symbols"},aquarius:{keywords:["sign","purple-square","zodiac","astrology"],char:"โ™’",category:"symbols"},pisces:{keywords:["purple-square","sign","zodiac","astrology"],char:"โ™“",category:"symbols"},id:{keywords:["purple-square","words"],char:"๐Ÿ†”",category:"symbols"},atom_symbol:{keywords:["science"],char:"โš›",category:"symbols"},u7a7a:{keywords:["kanji","japanese","chinese","empty","sky","blue-square"],char:"๐Ÿˆณ",category:"symbols"},u5272:{keywords:["cut","divide","chinese","kanji","pink-square"],char:"๐Ÿˆน",category:"symbols"},radioactive_sign:{keywords:["nuclear","danger"],char:"โ˜ข",category:"symbols"},biohazard_sign:{keywords:["danger"],char:"โ˜ฃ",category:"symbols"},mobile_phone_off:{keywords:["mute","orange-square","silence","quiet"],char:"๐Ÿ“ด",category:"symbols"},vibration_mode:{keywords:["orange-square","phone"],char:"๐Ÿ“ณ",category:"symbols"},u6709:{keywords:["orange-square","chinese","have","kanji"],char:"๐Ÿˆถ",category:"symbols"},u7121:{keywords:["nothing","chinese","kanji","japanese","orange-square"],char:"๐Ÿˆš",category:"symbols"},u7533:{keywords:["chinese","japanese","kanji","orange-square"],char:"๐Ÿˆธ",category:"symbols"},u55b6:{keywords:["japanese","opening hours","orange-square"],char:"๐Ÿˆบ",category:"symbols"},u6708:{keywords:["chinese","month","moon","japanese","orange-square","kanji"],char:"๐Ÿˆท๏ธ",category:"symbols"},eight_pointed_black_star:{keywords:["orange-square","shape","polygon"],char:"โœด๏ธ",category:"symbols"},vs:{keywords:["words","orange-square"],char:"๐Ÿ†š",category:"symbols"},accept:{keywords:["ok","good","chinese","kanji","agree","yes","orange-circle"],char:"๐Ÿ‰‘",category:"symbols"},white_flower:{keywords:["japanese","spring"],char:"๐Ÿ’ฎ",category:"symbols"},ideograph_advantage:{keywords:["chinese","kanji","obtain","get","circle"],char:"๐Ÿ‰",category:"symbols"},secret:{keywords:["privacy","chinese","sshh","kanji","red-circle"],char:"ใŠ™๏ธ",category:"symbols"},congratulations:{keywords:["chinese","kanji","japanese","red-circle"],char:"ใŠ—๏ธ",category:"symbols"},u5408:{keywords:["japanese","chinese","join","kanji","red-square"],char:"๐Ÿˆด",category:"symbols"},u6e80:{keywords:["full","chinese","japanese","red-square","kanji"],char:"๐Ÿˆต",category:"symbols"},u7981:{keywords:["kanji","japanese","chinese","forbidden","limit","restricted","red-square"],char:"๐Ÿˆฒ",category:"symbols"},a:{keywords:["red-square","alphabet","letter"],char:"๐Ÿ…ฐ๏ธ",category:"symbols"},b:{keywords:["red-square","alphabet","letter"],char:"๐Ÿ…ฑ๏ธ",category:"symbols"},ab:{keywords:["red-square","alphabet"],char:"๐Ÿ†Ž",category:"symbols"},cl:{keywords:["alphabet","words","red-square"],char:"๐Ÿ†‘",category:"symbols"},o2:{keywords:["alphabet","red-square","letter"],char:"๐Ÿ…พ๏ธ",category:"symbols"},sos:{keywords:["help","red-square","words","emergency","911"],char:"๐Ÿ†˜",category:"symbols"},no_entry:{keywords:["limit","security","privacy","bad","denied","stop","circle"],char:"โ›”",category:"symbols"},name_badge:{keywords:["fire","forbid"],char:"๐Ÿ“›",category:"symbols"},no_entry_sign:{keywords:["forbid","stop","limit","denied","disallow","circle"],char:"๐Ÿšซ",category:"symbols"},x:{keywords:["no","delete","remove","cancel"],char:"โŒ",category:"symbols"},o:{keywords:["circle","round"],char:"โญ•",category:"symbols"},anger:{keywords:["angry","mad"],char:"๐Ÿ’ข",category:"symbols"},hotsprings:{keywords:["bath","warm","relax"],char:"โ™จ๏ธ",category:"symbols"},no_pedestrians:{keywords:["rules","crossing","walking","circle"],char:"๐Ÿšท",category:"symbols"},do_not_litter:{keywords:["trash","bin","garbage","circle"],char:"๐Ÿšฏ",category:"symbols"},no_bicycles:{keywords:["cyclist","prohibited","circle"],char:"๐Ÿšณ",category:"symbols"},"non-potable_water":{keywords:["drink","faucet","tap","circle"],char:"๐Ÿšฑ",category:"symbols"},underage:{keywords:["18","drink","pub","night","minor","circle"],char:"๐Ÿ”ž",category:"symbols"},no_mobile_phones:{keywords:["iphone","mute","circle"],char:"๐Ÿ“ต",category:"symbols"},exclamation:{keywords:["heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"],char:"โ—",category:"symbols"},grey_exclamation:{keywords:["surprise","punctuation","gray","wow","warning"],char:"โ•",category:"symbols"},question:{keywords:["doubt","confused"],char:"โ“",category:"symbols"},grey_question:{keywords:["doubts","gray","huh","confused"],char:"โ”",category:"symbols"},bangbang:{keywords:["exclamation","surprise"],char:"โ€ผ๏ธ",category:"symbols"},interrobang:{keywords:["wat","punctuation","surprise"],char:"โ‰๏ธ",category:"symbols"},100:{keywords:["score","perfect","numbers","century","exam","quiz","test","pass","hundred"],char:"๐Ÿ’ฏ",category:"symbols"},low_brightness:{keywords:["sun","afternoon","warm","summer"],char:"๐Ÿ”…",category:"symbols"},high_brightness:{keywords:["sun","light"],char:"๐Ÿ”†",category:"symbols"},trident:{keywords:["weapon","spear"],char:"๐Ÿ”ฑ",category:"symbols"},fleur_de_lis:{keywords:["decorative","scout"],char:"โšœ",category:"symbols"},part_alternation_mark:{keywords:["graph","presentation","stats","business","economics","bad"],char:"ใ€ฝ๏ธ",category:"symbols"},warning:{keywords:["exclamation","wip","alert","error","problem","issue"],char:"โš ๏ธ",category:"symbols"},children_crossing:{keywords:["school","warning","danger","sign","driving","yellow-diamond"],char:"๐Ÿšธ",category:"symbols"},beginner:{keywords:["badge","shield"],char:"๐Ÿ”ฐ",category:"symbols"},recycle:{keywords:["arrow","environment","garbage","trash"],char:"โ™ป๏ธ",category:"symbols"},u6307:{keywords:["chinese","point","green-square","kanji"],char:"๐Ÿˆฏ",category:"symbols"},chart:{keywords:["green-square","graph","presentation","stats"],char:"๐Ÿ’น",category:"symbols"},sparkle:{keywords:["stars","green-square","awesome","good","fireworks"],char:"โ‡๏ธ",category:"symbols"},eight_spoked_asterisk:{keywords:["star","sparkle","green-square"],char:"โœณ๏ธ",category:"symbols"},negative_squared_cross_mark:{keywords:["x","green-square","no","deny"],char:"โŽ",category:"symbols"},white_check_mark:{keywords:["green-square","ok","agree","vote","election","answer"],char:"โœ…",category:"symbols"},diamond_shape_with_a_dot_inside:{keywords:["jewel","blue","gem","crystal","fancy"],char:"๐Ÿ’ ",category:"symbols"},cyclone:{keywords:["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin"],char:"๐ŸŒ€",category:"symbols"},loop:{keywords:["tape","cassette"],char:"โžฟ",category:"symbols"},globe_with_meridians:{keywords:["earth","international","world","internet","interweb","i18n"],char:"๐ŸŒ",category:"symbols"},m:{keywords:["alphabet","blue-circle","letter"],char:"โ“‚๏ธ",category:"symbols"},atm:{keywords:["money","sales","cash","blue-square","payment","bank"],char:"๐Ÿง",category:"symbols"},sa:{keywords:["japanese","blue-square","katakana"],char:"๐Ÿˆ‚๏ธ",category:"symbols"},passport_control:{keywords:["custom","blue-square"],char:"๐Ÿ›‚",category:"symbols"},customs:{keywords:["passport","border","blue-square"],char:"๐Ÿ›ƒ",category:"symbols"},baggage_claim:{keywords:["blue-square","airport","transport"],char:"๐Ÿ›„",category:"symbols"},left_luggage:{keywords:["blue-square","travel"],char:"๐Ÿ›…",category:"symbols"},wheelchair:{keywords:["blue-square","disabled","a11y","accessibility"],char:"โ™ฟ",category:"symbols"},no_smoking:{keywords:["cigarette","blue-square","smell","smoke"],char:"๐Ÿšญ",category:"symbols"},wc:{keywords:["toilet","restroom","blue-square"],char:"๐Ÿšพ",category:"symbols"},parking:{keywords:["cars","blue-square","alphabet","letter"],char:"๐Ÿ…ฟ๏ธ",category:"symbols"},potable_water:{keywords:["blue-square","liquid","restroom","cleaning","faucet"],char:"๐Ÿšฐ",category:"symbols"},mens:{keywords:["toilet","restroom","wc","blue-square","gender","male"],char:"๐Ÿšน",category:"symbols"},womens:{keywords:["purple-square","woman","female","toilet","loo","restroom","gender"],char:"๐Ÿšบ",category:"symbols"},baby_symbol:{keywords:["orange-square","child"],char:"๐Ÿšผ",category:"symbols"},restroom:{keywords:["blue-square","toilet","refresh","wc","gender"],char:"๐Ÿšป",category:"symbols"},put_litter_in_its_place:{keywords:["blue-square","sign","human","info"],char:"๐Ÿšฎ",category:"symbols"},cinema:{keywords:["blue-square","record","film","movie","curtain","stage","theater"],char:"๐ŸŽฆ",category:"symbols"},signal_strength:{keywords:["blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"],char:"๐Ÿ“ถ",category:"symbols"},koko:{keywords:["blue-square","here","katakana","japanese","destination"],char:"๐Ÿˆ",category:"symbols"},ng:{keywords:["blue-square","words","shape","icon"],char:"๐Ÿ†–",category:"symbols"},ok:{keywords:["good","agree","yes","blue-square"],char:"๐Ÿ†—",category:"symbols"},up:{keywords:["blue-square","above","high"],char:"๐Ÿ†™",category:"symbols"},cool:{keywords:["words","blue-square"],char:"๐Ÿ†’",category:"symbols"},new:{keywords:["blue-square","words","start"],char:"๐Ÿ†•",category:"symbols"},free:{keywords:["blue-square","words"],char:"๐Ÿ†“",category:"symbols"},zero:{keywords:["0","numbers","blue-square","null"],char:"0๏ธโƒฃ",category:"symbols"},one:{keywords:["blue-square","numbers","1"],char:"1๏ธโƒฃ",category:"symbols"},two:{keywords:["numbers","2","prime","blue-square"],char:"2๏ธโƒฃ",category:"symbols"},three:{keywords:["3","numbers","prime","blue-square"],char:"3๏ธโƒฃ",category:"symbols"},four:{keywords:["4","numbers","blue-square"],char:"4๏ธโƒฃ",category:"symbols"},five:{keywords:["5","numbers","blue-square","prime"],char:"5๏ธโƒฃ",category:"symbols"},six:{keywords:["6","numbers","blue-square"],char:"6๏ธโƒฃ",category:"symbols"},seven:{keywords:["7","numbers","blue-square","prime"],char:"7๏ธโƒฃ",category:"symbols"},eight:{keywords:["8","blue-square","numbers"],char:"8๏ธโƒฃ",category:"symbols"},nine:{keywords:["blue-square","numbers","9"],char:"9๏ธโƒฃ",category:"symbols"},keycap_ten:{keywords:["numbers","10","blue-square"],char:"๐Ÿ”Ÿ",category:"symbols"},keycap_star:{keywords:["asterisk"],char:"*โƒฃ",category:"symbols"},1234:{keywords:["numbers","blue-square"],char:"๐Ÿ”ข",category:"symbols"},arrow_forward:{keywords:["blue-square","right","direction","play"],char:"โ–ถ๏ธ",category:"symbols"},double_vertical_bar:{keywords:["pause","blue-square"],char:"โธ",category:"symbols"},black_right_pointing_triangle_with_double_vertical_bar:{keywords:["forward","next","blue-square"],char:"โญ",category:"symbols"},black_square_for_stop:{keywords:["blue-square"],char:"โน",category:"symbols"},black_circle_for_record:{keywords:["blue-square"],char:"โบ",category:"symbols"},black_right_pointing_double_triangle_with_vertical_bar:{keywords:["blue-square","play","pause"],char:"โฏ",category:"symbols"},black_left_pointing_double_triangle_with_vertical_bar:{keywords:["backward"],char:"โฎ",category:"symbols"},fast_forward:{keywords:["blue-square","play","speed","continue"],char:"โฉ",category:"symbols"},rewind:{keywords:["play","blue-square"],char:"โช",category:"symbols"},twisted_rightwards_arrows:{keywords:["blue-square","shuffle","music","random"],char:"๐Ÿ”€",category:"symbols"},repeat:{keywords:["loop","record"],char:"๐Ÿ”",category:"symbols"},repeat_one:{keywords:["blue-square","loop"],char:"๐Ÿ”‚",category:"symbols"},arrow_backward:{keywords:["blue-square","left","direction"],char:"โ—€๏ธ",category:"symbols"},arrow_up_small:{keywords:["blue-square","triangle","direction","point","forward","top"],char:"๐Ÿ”ผ",category:"symbols"},arrow_down_small:{keywords:["blue-square","direction","bottom"],char:"๐Ÿ”ฝ",category:"symbols"},arrow_double_up:{keywords:["blue-square","direction","top"],char:"โซ",category:"symbols"},arrow_double_down:{keywords:["blue-square","direction","bottom"],char:"โฌ",category:"symbols"},arrow_right:{keywords:["blue-square","next"],char:"โžก๏ธ",category:"symbols"},arrow_left:{keywords:["blue-square","previous","back"],char:"โฌ…๏ธ",category:"symbols"},arrow_up:{keywords:["blue-square","continue","top","direction"],char:"โฌ†๏ธ",category:"symbols"},arrow_down:{keywords:["blue-square","direction","bottom"],char:"โฌ‡๏ธ",category:"symbols"},arrow_upper_right:{keywords:["blue-square","point","direction","diagonal","northeast"],char:"โ†—๏ธ",category:"symbols"},arrow_lower_right:{keywords:["blue-square","direction","diagonal","southeast"],char:"โ†˜๏ธ",category:"symbols"},arrow_lower_left:{keywords:["blue-square","direction","diagonal","southwest"],char:"โ†™๏ธ",category:"symbols"},arrow_upper_left:{keywords:["blue-square","point","direction","diagonal","northwest"],char:"โ†–๏ธ",category:"symbols"},arrow_up_down:{keywords:["blue-square","direction","way","vertical"],char:"โ†•๏ธ",category:"symbols"},left_right_arrow:{keywords:["shape","direction","horizontal","sideways"],char:"โ†”๏ธ",category:"symbols"},arrows_counterclockwise:{keywords:["blue-square","sync","cycle"],char:"๐Ÿ”„",category:"symbols"},arrow_right_hook:{keywords:["blue-square","return","rotate","direction"],char:"โ†ช๏ธ",category:"symbols"},leftwards_arrow_with_hook:{keywords:["back","return","blue-square","undo","enter"],char:"โ†ฉ๏ธ",category:"symbols"},arrow_heading_up:{keywords:["blue-square","direction","top"],char:"โคด๏ธ",category:"symbols"},arrow_heading_down:{keywords:["blue-square","direction","bottom"],char:"โคต๏ธ",category:"symbols"},hash:{keywords:["symbol","blue-square","twitter"],char:"#๏ธโƒฃ",category:"symbols"},information_source:{keywords:["blue-square","alphabet","letter"],char:"โ„น๏ธ",category:"symbols"},abc:{keywords:["blue-square","alphabet"],char:"๐Ÿ”ค",category:"symbols"},abcd:{keywords:["blue-square","alphabet"],char:"๐Ÿ”ก",category:"symbols"},capital_abcd:{keywords:["alphabet","words","blue-square"],char:"๐Ÿ” ",category:"symbols"},symbols:{keywords:["blue-square","music","note","ampersand","percent","glyphs","characters"],char:"๐Ÿ”ฃ",category:"symbols"},musical_note:{keywords:["score","tone","sound"],char:"๐ŸŽต",category:"symbols"},notes:{keywords:["music","score"],char:"๐ŸŽถ",category:"symbols"},wavy_dash:{keywords:["draw","line","moustache","mustache","squiggle","scribble"],char:"ใ€ฐ๏ธ",category:"symbols"},curly_loop:{keywords:["scribble","draw","shape","squiggle"],char:"โžฐ",category:"symbols"},heavy_check_mark:{keywords:["ok","nike","answer","yes","tick"],char:"โœ”๏ธ",category:"symbols"},arrows_clockwise:{keywords:["sync","cycle","round","repeat"],char:"๐Ÿ”ƒ",category:"symbols"},heavy_plus_sign:{keywords:["math","calculation","addition","more","increase"],char:"โž•",category:"symbols"},heavy_minus_sign:{keywords:["math","calculation","subtract","less"],char:"โž–",category:"symbols"},heavy_division_sign:{keywords:["divide","math","calculation"],char:"โž—",category:"symbols"},heavy_multiplication_x:{keywords:["math","calculation"],char:"โœ–๏ธ",category:"symbols"},heavy_dollar_sign:{keywords:["money","sales","payment","currency","buck"],char:"๐Ÿ’ฒ",category:"symbols"},currency_exchange:{keywords:["money","sales","dollar","travel"],char:"๐Ÿ’ฑ",category:"symbols"},copyright:{keywords:["ip","license","circle","law","legal"],char:"ยฉ๏ธ",category:"symbols"},registered:{keywords:["alphabet","circle"],char:"ยฎ๏ธ",category:"symbols"},tm:{keywords:["trademark","brand","law","legal"],char:"โ„ข๏ธ",category:"symbols"},end:{keywords:["words","arrow"],char:"๐Ÿ”š",category:"symbols"},back:{keywords:["arrow","words","return"],char:"๐Ÿ”™",category:"symbols"},on:{keywords:["arrow","words"],char:"๐Ÿ”›",category:"symbols"},top:{keywords:["words","blue-square"],char:"๐Ÿ”",category:"symbols"},soon:{keywords:["arrow","words"],char:"๐Ÿ”œ",category:"symbols"},ballot_box_with_check:{keywords:["ok","agree","confirm","black-square","vote","election","yes"],char:"โ˜‘๏ธ",category:"symbols"},radio_button:{keywords:["input","old","music","circle"],char:"๐Ÿ”˜",category:"symbols"},white_circle:{keywords:["shape","round"],char:"โšช",category:"symbols"},black_circle:{keywords:["shape","button","round"],char:"โšซ",category:"symbols"},red_circle:{keywords:["shape","error","danger"],char:"๐Ÿ”ด",category:"symbols"},large_blue_circle:{keywords:["shape","icon","button"],char:"๐Ÿ”ต",category:"symbols"},small_orange_diamond:{keywords:["shape","jewel","gem"],char:"๐Ÿ”ธ",category:"symbols"},small_blue_diamond:{keywords:["shape","jewel","gem"],char:"๐Ÿ”น",category:"symbols"},large_orange_diamond:{keywords:["shape","jewel","gem"],char:"๐Ÿ”ถ",category:"symbols"},large_blue_diamond:{keywords:["shape","jewel","gem"],char:"๐Ÿ”ท",category:"symbols"},small_red_triangle:{keywords:["shape","direction","up","top"],char:"๐Ÿ”บ",category:"symbols"},black_small_square:{keywords:["shape","icon"],char:"โ–ช๏ธ",category:"symbols"},white_small_square:{keywords:["shape","icon"],char:"โ–ซ๏ธ",category:"symbols"},black_large_square:{keywords:["shape","icon","button"],char:"โฌ›",category:"symbols"},white_large_square:{keywords:["shape","icon","stone","button"],char:"โฌœ",category:"symbols"},small_red_triangle_down:{keywords:["shape","direction","bottom"],char:"๐Ÿ”ป",category:"symbols"},black_medium_square:{keywords:["shape","button","icon"],char:"โ—ผ๏ธ",category:"symbols"},white_medium_square:{keywords:["shape","stone","icon"],char:"โ—ป๏ธ",category:"symbols"},black_medium_small_square:{keywords:["icon","shape","button"],char:"โ—พ",category:"symbols"},white_medium_small_square:{keywords:["shape","stone","icon","button"],char:"โ—ฝ",category:"symbols"},black_square_button:{keywords:["shape","input","frame"],char:"๐Ÿ”ฒ",category:"symbols"},white_square_button:{keywords:["shape","input"],char:"๐Ÿ”ณ",category:"symbols"},speaker:{keywords:["sound","volume","silence","broadcast"],char:"๐Ÿ”ˆ",category:"symbols"},sound:{keywords:["volume","speaker","broadcast"],char:"๐Ÿ”‰",category:"symbols"},loud_sound:{keywords:["volume","noise","noisy","speaker","broadcast"],char:"๐Ÿ”Š",category:"symbols"},mute:{keywords:["sound","volume","silence","quiet"],char:"๐Ÿ”‡",category:"symbols"},mega:{keywords:["sound","speaker","volume"],char:"๐Ÿ“ฃ",category:"symbols"},loudspeaker:{keywords:["volume","sound"],char:"๐Ÿ“ข",category:"symbols"},bell:{keywords:["sound","notification","christmas","xmas","chime"],char:"๐Ÿ””",category:"symbols"},no_bell:{keywords:["sound","volume","mute","quiet","silent"],char:"๐Ÿ”•",category:"symbols"},black_joker:{keywords:["poker","cards","game","play","magic"],char:"๐Ÿƒ",category:"symbols"},mahjong:{keywords:["game","play","chinese","kanji"],char:"๐Ÿ€„",category:"symbols"},spades:{keywords:["poker","cards","suits","magic"],char:"โ™ ๏ธ",category:"symbols"},clubs:{keywords:["poker","cards","magic","suits"],char:"โ™ฃ๏ธ",category:"symbols"},hearts:{keywords:["poker","cards","magic","suits"],char:"โ™ฅ๏ธ",category:"symbols"},diamonds:{keywords:["poker","cards","magic","suits"],char:"โ™ฆ๏ธ",category:"symbols"},flower_playing_cards:{keywords:["game","sunset","red"],char:"๐ŸŽด",category:"symbols"},thought_balloon:{keywords:["bubble","cloud","speech","thinking"],char:"๐Ÿ’ญ",category:"symbols"},right_anger_bubble:{keywords:["caption","speech","thinking","mad"],char:"๐Ÿ—ฏ",category:"symbols"},speech_balloon:{keywords:["bubble","words","message","talk","chatting"],char:"๐Ÿ’ฌ",category:"symbols"},left_speech_bubble:{keywords:["words","message","talk","chatting"],char:"๐Ÿ—จ",category:"symbols"},clock1:{keywords:["time","late","early","schedule"],char:"๐Ÿ•",category:"symbols"},clock2:{keywords:["time","late","early","schedule"],char:"๐Ÿ•‘",category:"symbols"},clock3:{keywords:["time","late","early","schedule"],char:"๐Ÿ•’",category:"symbols"},clock4:{keywords:["time","late","early","schedule"],char:"๐Ÿ•“",category:"symbols"},clock5:{keywords:["time","late","early","schedule"],char:"๐Ÿ•”",category:"symbols"},clock6:{keywords:["time","late","early","schedule","dawn","dusk"],char:"๐Ÿ••",category:"symbols"},clock7:{keywords:["time","late","early","schedule"],char:"๐Ÿ•–",category:"symbols"},clock8:{keywords:["time","late","early","schedule"],char:"๐Ÿ•—",category:"symbols"},clock9:{keywords:["time","late","early","schedule"],char:"๐Ÿ•˜",category:"symbols"},clock10:{keywords:["time","late","early","schedule"],char:"๐Ÿ•™",category:"symbols"},clock11:{keywords:["time","late","early","schedule"],char:"๐Ÿ•š",category:"symbols"},clock12:{keywords:["time","noon","midnight","midday","late","early","schedule"],char:"๐Ÿ•›",category:"symbols"},clock130:{keywords:["time","late","early","schedule"],char:"๐Ÿ•œ",category:"symbols"},clock230:{keywords:["time","late","early","schedule"],char:"๐Ÿ•",category:"symbols"},clock330:{keywords:["time","late","early","schedule"],char:"๐Ÿ•ž",category:"symbols"},clock430:{keywords:["time","late","early","schedule"],char:"๐Ÿ•Ÿ",category:"symbols"},clock530:{keywords:["time","late","early","schedule"],char:"๐Ÿ• ",category:"symbols"},clock630:{keywords:["time","late","early","schedule"],char:"๐Ÿ•ก",category:"symbols"},clock730:{keywords:["time","late","early","schedule"],char:"๐Ÿ•ข",category:"symbols"},clock830:{keywords:["time","late","early","schedule"],char:"๐Ÿ•ฃ",category:"symbols"},clock930:{keywords:["time","late","early","schedule"],char:"๐Ÿ•ค",category:"symbols"},clock1030:{keywords:["time","late","early","schedule"],char:"๐Ÿ•ฅ",category:"symbols"},clock1130:{keywords:["time","late","early","schedule"],char:"๐Ÿ•ฆ",category:"symbols"},clock1230:{keywords:["time","late","early","schedule"],char:"๐Ÿ•ง",category:"symbols"},af:{keywords:["afghanistan","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ซ",category:"flags"},ax:{keywords:["ร…land","islands","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ฝ",category:"flags"},al:{keywords:["albania","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ฑ",category:"flags"},dz:{keywords:["algeria","flag","nation","country","banner"],char:"๐Ÿ‡ฉ๐Ÿ‡ฟ",category:"flags"},as:{keywords:["american","samoa","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ธ",category:"flags"},ad:{keywords:["andorra","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ฉ",category:"flags"},ao:{keywords:["angola","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ด",category:"flags"},ai:{keywords:["anguilla","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ฎ",category:"flags"},aq:{keywords:["antarctica","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ถ",category:"flags"},ag:{keywords:["antigua","barbuda","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ฌ",category:"flags"},ar:{keywords:["argentina","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ท",category:"flags"},am:{keywords:["armenia","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ฒ",category:"flags"},aw:{keywords:["aruba","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ผ",category:"flags"},au:{keywords:["australia","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡บ",category:"flags"},at:{keywords:["austria","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡น",category:"flags"},az:{keywords:["azerbaijan","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ฟ",category:"flags"},bs:{keywords:["bahamas","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ธ",category:"flags"},bh:{keywords:["bahrain","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ญ",category:"flags"},bd:{keywords:["bangladesh","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ฉ",category:"flags"},bb:{keywords:["barbados","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ง",category:"flags"},by:{keywords:["belarus","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡พ",category:"flags"},be:{keywords:["belgium","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ช",category:"flags"},bz:{keywords:["belize","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ฟ",category:"flags"},bj:{keywords:["benin","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ฏ",category:"flags"},bm:{keywords:["bermuda","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ฒ",category:"flags"},bt:{keywords:["bhutan","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡น",category:"flags"},bo:{keywords:["bolivia","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ด",category:"flags"},bq:{keywords:["bonaire","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ถ",category:"flags"},ba:{keywords:["bosnia","herzegovina","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ฆ",category:"flags"},bw:{keywords:["botswana","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ผ",category:"flags"},br:{keywords:["brazil","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ท",category:"flags"},io:{keywords:["british","indian","ocean","territory","flag","nation","country","banner"],char:"๐Ÿ‡ฎ๐Ÿ‡ด",category:"flags"},vg:{keywords:["british","virgin","islands","bvi","flag","nation","country","banner"],char:"๐Ÿ‡ป๐Ÿ‡ฌ",category:"flags"},bn:{keywords:["brunei","darussalam","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ณ",category:"flags"},bg:{keywords:["bulgaria","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ฌ",category:"flags"},bf:{keywords:["burkina","faso","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ซ",category:"flags"},bi:{keywords:["burundi","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ฎ",category:"flags"},cv:{keywords:["cabo","verde","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ป",category:"flags"},kh:{keywords:["cambodia","flag","nation","country","banner"],char:"๐Ÿ‡ฐ๐Ÿ‡ญ",category:"flags"},cm:{keywords:["cameroon","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ฒ",category:"flags"},ca:{keywords:["canada","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ฆ",category:"flags"},ic:{keywords:["canary","islands","flag","nation","country","banner"],char:"๐Ÿ‡ฎ๐Ÿ‡จ",category:"flags"},ky:{keywords:["cayman","islands","flag","nation","country","banner"],char:"๐Ÿ‡ฐ๐Ÿ‡พ",category:"flags"},cf:{keywords:["central","african","republic","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ซ",category:"flags"},td:{keywords:["chad","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ฉ",category:"flags"},chile:{keywords:["flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ฑ",category:"flags"},cn:{keywords:["china","chinese","prc","flag","country","nation","banner"],char:"๐Ÿ‡จ๐Ÿ‡ณ",category:"flags"},cx:{keywords:["christmas","island","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ฝ",category:"flags"},cc:{keywords:["cocos","keeling","islands","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡จ",category:"flags"},co:{keywords:["colombia","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ด",category:"flags"},km:{keywords:["comoros","flag","nation","country","banner"],char:"๐Ÿ‡ฐ๐Ÿ‡ฒ",category:"flags"},cg:{keywords:["congo","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ฌ",category:"flags"},drc:{keywords:["congo","democratic","republic","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ฉ",category:"flags"},ck:{keywords:["cook","islands","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ฐ",category:"flags"},cr:{keywords:["costa","rica","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ท",category:"flags"},hr:{keywords:["croatia","flag","nation","country","banner"],char:"๐Ÿ‡ญ๐Ÿ‡ท",category:"flags"},cu:{keywords:["cuba","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡บ",category:"flags"},cw:{keywords:["curaรงao","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ผ",category:"flags"},cy:{keywords:["cyprus","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡พ",category:"flags"},cz:{keywords:["czech_republic","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ฟ",category:"flags"},dk:{keywords:["denmark","flag","nation","country","banner"],char:"๐Ÿ‡ฉ๐Ÿ‡ฐ",category:"flags"},dj:{keywords:["djibouti","flag","nation","country","banner"],char:"๐Ÿ‡ฉ๐Ÿ‡ฏ",category:"flags"},dm:{keywords:["dominica","flag","nation","country","banner"],char:"๐Ÿ‡ฉ๐Ÿ‡ฒ",category:"flags"},do:{keywords:["dominican","republic","flag","nation","country","banner"],char:"๐Ÿ‡ฉ๐Ÿ‡ด",category:"flags"},ec:{keywords:["ecuador","flag","nation","country","banner"],char:"๐Ÿ‡ช๐Ÿ‡จ",category:"flags"},eg:{keywords:["egypt","flag","nation","country","banner"],char:"๐Ÿ‡ช๐Ÿ‡ฌ",category:"flags"},sv:{keywords:["el","salvador","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ป",category:"flags"},gq:{keywords:["equatorial","guinea","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ถ",category:"flags"},er:{keywords:["eritrea","flag","nation","country","banner"],char:"๐Ÿ‡ช๐Ÿ‡ท",category:"flags"},ee:{keywords:["estonia","flag","nation","country","banner"],char:"๐Ÿ‡ช๐Ÿ‡ช",category:"flags"},et:{keywords:["ethiopia","flag","nation","country","banner"],char:"๐Ÿ‡ช๐Ÿ‡น",category:"flags"},eu:{keywords:["european","union","flag","banner"],char:"๐Ÿ‡ช๐Ÿ‡บ",category:"flags"},fk:{keywords:["falkland","islands","malvinas","flag","nation","country","banner"],char:"๐Ÿ‡ซ๐Ÿ‡ฐ",category:"flags"},fo:{keywords:["faroe","islands","flag","nation","country","banner"],char:"๐Ÿ‡ซ๐Ÿ‡ด",category:"flags"},fj:{keywords:["fiji","flag","nation","country","banner"],char:"๐Ÿ‡ซ๐Ÿ‡ฏ",category:"flags"},fi:{keywords:["finland","flag","nation","country","banner"],char:"๐Ÿ‡ซ๐Ÿ‡ฎ",category:"flags"},fr:{keywords:["banner","flag","nation","france","french","country"],char:"๐Ÿ‡ซ๐Ÿ‡ท",category:"flags"},gf:{keywords:["french","guiana","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ซ",category:"flags"},pf:{keywords:["french","polynesia","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ซ",category:"flags"},tf:{keywords:["french","southern","territories","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ซ",category:"flags"},ga:{keywords:["gabon","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ฆ",category:"flags"},gm:{keywords:["gambia","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ฒ",category:"flags"},ge:{keywords:["georgia","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ช",category:"flags"},de:{keywords:["german","nation","flag","country","banner"],char:"๐Ÿ‡ฉ๐Ÿ‡ช",category:"flags"},gh:{keywords:["ghana","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ญ",category:"flags"},gi:{keywords:["gibraltar","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ฎ",category:"flags"},gr:{keywords:["greece","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ท",category:"flags"},gl:{keywords:["greenland","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ฑ",category:"flags"},gd:{keywords:["grenada","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ฉ",category:"flags"},gp:{keywords:["guadeloupe","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ต",category:"flags"},gu:{keywords:["guam","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡บ",category:"flags"},gt:{keywords:["guatemala","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡น",category:"flags"},gg:{keywords:["guernsey","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ฌ",category:"flags"},gn:{keywords:["guinea","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ณ",category:"flags"},gw:{keywords:["guinea","bissau","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ผ",category:"flags"},gy:{keywords:["guyana","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡พ",category:"flags"},ht:{keywords:["haiti","flag","nation","country","banner"],char:"๐Ÿ‡ญ๐Ÿ‡น",category:"flags"},hn:{keywords:["honduras","flag","nation","country","banner"],char:"๐Ÿ‡ญ๐Ÿ‡ณ",category:"flags"},hk:{keywords:["hong","kong","flag","nation","country","banner"],char:"๐Ÿ‡ญ๐Ÿ‡ฐ",category:"flags"},hu:{keywords:["hungary","flag","nation","country","banner"],char:"๐Ÿ‡ญ๐Ÿ‡บ",category:"flags"},is:{keywords:["iceland","flag","nation","country","banner"],char:"๐Ÿ‡ฎ๐Ÿ‡ธ",category:"flags"},in:{keywords:["india","flag","nation","country","banner"],char:"๐Ÿ‡ฎ๐Ÿ‡ณ",category:"flags"},indonesia:{keywords:["flag","nation","country","banner"],char:"๐Ÿ‡ฎ๐Ÿ‡ฉ",category:"flags"},ir:{keywords:["iran,","islamic","republic","flag","nation","country","banner"],char:"๐Ÿ‡ฎ๐Ÿ‡ท",category:"flags"},iq:{keywords:["iraq","flag","nation","country","banner"],char:"๐Ÿ‡ฎ๐Ÿ‡ถ",category:"flags"},ie:{keywords:["ireland","flag","nation","country","banner"],char:"๐Ÿ‡ฎ๐Ÿ‡ช",category:"flags"},im:{keywords:["isle","man","flag","nation","country","banner"],char:"๐Ÿ‡ฎ๐Ÿ‡ฒ",category:"flags"},il:{keywords:["israel","flag","nation","country","banner"],char:"๐Ÿ‡ฎ๐Ÿ‡ฑ",category:"flags"},it:{keywords:["italy","flag","nation","country","banner"],char:"๐Ÿ‡ฎ๐Ÿ‡น",category:"flags"},ci:{keywords:["ivory","coast","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ฎ",category:"flags"},jm:{keywords:["jamaica","flag","nation","country","banner"],char:"๐Ÿ‡ฏ๐Ÿ‡ฒ",category:"flags"},jp:{keywords:["japanese","nation","flag","country","banner"],char:"๐Ÿ‡ฏ๐Ÿ‡ต",category:"flags"},je:{keywords:["jersey","flag","nation","country","banner"],char:"๐Ÿ‡ฏ๐Ÿ‡ช",category:"flags"},jo:{keywords:["jordan","flag","nation","country","banner"],char:"๐Ÿ‡ฏ๐Ÿ‡ด",category:"flags"},kz:{keywords:["kazakhstan","flag","nation","country","banner"],char:"๐Ÿ‡ฐ๐Ÿ‡ฟ",category:"flags"},ke:{keywords:["kenya","flag","nation","country","banner"],char:"๐Ÿ‡ฐ๐Ÿ‡ช",category:"flags"},ki:{keywords:["kiribati","flag","nation","country","banner"],char:"๐Ÿ‡ฐ๐Ÿ‡ฎ",category:"flags"},xk:{keywords:["kosovo","flag","nation","country","banner"],char:"๐Ÿ‡ฝ๐Ÿ‡ฐ",category:"flags"},kw:{keywords:["kuwait","flag","nation","country","banner"],char:"๐Ÿ‡ฐ๐Ÿ‡ผ",category:"flags"},kg:{keywords:["kyrgyzstan","flag","nation","country","banner"],char:"๐Ÿ‡ฐ๐Ÿ‡ฌ",category:"flags"},la:{keywords:["lao","democratic","republic","flag","nation","country","banner"],char:"๐Ÿ‡ฑ๐Ÿ‡ฆ",category:"flags"},lv:{keywords:["latvia","flag","nation","country","banner"],char:"๐Ÿ‡ฑ๐Ÿ‡ป",category:"flags"},lb:{keywords:["lebanon","flag","nation","country","banner"],char:"๐Ÿ‡ฑ๐Ÿ‡ง",category:"flags"},ls:{keywords:["lesotho","flag","nation","country","banner"],char:"๐Ÿ‡ฑ๐Ÿ‡ธ",category:"flags"},lr:{keywords:["liberia","flag","nation","country","banner"],char:"๐Ÿ‡ฑ๐Ÿ‡ท",category:"flags"},ly:{keywords:["libya","flag","nation","country","banner"],char:"๐Ÿ‡ฑ๐Ÿ‡พ",category:"flags"},li:{keywords:["liechtenstein","flag","nation","country","banner"],char:"๐Ÿ‡ฑ๐Ÿ‡ฎ",category:"flags"},lt:{keywords:["lithuania","flag","nation","country","banner"],char:"๐Ÿ‡ฑ๐Ÿ‡น",category:"flags"},lu:{keywords:["luxembourg","flag","nation","country","banner"],char:"๐Ÿ‡ฑ๐Ÿ‡บ",category:"flags"},mo:{keywords:["macao","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ด",category:"flags"},mk:{keywords:["macedonia,","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ฐ",category:"flags"},mg:{keywords:["madagascar","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ฌ",category:"flags"},mw:{keywords:["malawi","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ผ",category:"flags"},my:{keywords:["malaysia","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡พ",category:"flags"},mv:{keywords:["maldives","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ป",category:"flags"},ml:{keywords:["mali","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ฑ",category:"flags"},mt:{keywords:["malta","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡น",category:"flags"},mh:{keywords:["marshall","islands","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ญ",category:"flags"},mq:{keywords:["martinique","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ถ",category:"flags"},mr:{keywords:["mauritania","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ท",category:"flags"},mu:{keywords:["mauritius","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡บ",category:"flags"},yt:{keywords:["mayotte","flag","nation","country","banner"],char:"๐Ÿ‡พ๐Ÿ‡น",category:"flags"},mx:{keywords:["mexico","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ฝ",category:"flags"},fm:{keywords:["micronesia,","federated","states","flag","nation","country","banner"],char:"๐Ÿ‡ซ๐Ÿ‡ฒ",category:"flags"},md:{keywords:["moldova,","republic","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ฉ",category:"flags"},mc:{keywords:["monaco","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡จ",category:"flags"},mn:{keywords:["mongolia","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ณ",category:"flags"},me:{keywords:["montenegro","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ช",category:"flags"},ms:{keywords:["montserrat","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ธ",category:"flags"},ma:{keywords:["morocco","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ฆ",category:"flags"},mz:{keywords:["mozambique","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ฟ",category:"flags"},mm:{keywords:["myanmar","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ฒ",category:"flags"},na:{keywords:["namibia","flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡ฆ",category:"flags"},nr:{keywords:["nauru","flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡ท",category:"flags"},np:{keywords:["nepal","flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡ต",category:"flags"},nl:{keywords:["netherlands","flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡ฑ",category:"flags"},nc:{keywords:["new","caledonia","flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡จ",category:"flags"},nz:{keywords:["new","zealand","flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡ฟ",category:"flags"},ni:{keywords:["nicaragua","flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡ฎ",category:"flags"},ne:{keywords:["niger","flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡ช",category:"flags"},nigeria:{keywords:["flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡ฌ",category:"flags"},nu:{keywords:["niue","flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡บ",category:"flags"},nf:{keywords:["norfolk","island","flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡ซ",category:"flags"},mp:{keywords:["northern","mariana","islands","flag","nation","country","banner"],char:"๐Ÿ‡ฒ๐Ÿ‡ต",category:"flags"},kp:{keywords:["north","korea","nation","flag","country","banner"],char:"๐Ÿ‡ฐ๐Ÿ‡ต",category:"flags"},no:{keywords:["norway","flag","nation","country","banner"],char:"๐Ÿ‡ณ๐Ÿ‡ด",category:"flags"},om:{keywords:["oman","flag","nation","country","banner"],char:"๐Ÿ‡ด๐Ÿ‡ฒ",category:"flags"},pk:{keywords:["pakistan","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ฐ",category:"flags"},pw:{keywords:["palau","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ผ",category:"flags"},ps:{keywords:["palestine","palestinian","territories","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ธ",category:"flags"},pa:{keywords:["panama","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ฆ",category:"flags"},pg:{keywords:["papua","new","guinea","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ฌ",category:"flags"},py:{keywords:["paraguay","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡พ",category:"flags"},pe:{keywords:["peru","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ช",category:"flags"},ph:{keywords:["philippines","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ญ",category:"flags"},pn:{keywords:["pitcairn","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ณ",category:"flags"},pl:{keywords:["poland","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ฑ",category:"flags"},pt:{keywords:["portugal","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡น",category:"flags"},pr:{keywords:["puerto","rico","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ท",category:"flags"},qa:{keywords:["qatar","flag","nation","country","banner"],char:"๐Ÿ‡ถ๐Ÿ‡ฆ",category:"flags"},re:{keywords:["rรฉunion","flag","nation","country","banner"],char:"๐Ÿ‡ท๐Ÿ‡ช",category:"flags"},ro:{keywords:["romania","flag","nation","country","banner"],char:"๐Ÿ‡ท๐Ÿ‡ด",category:"flags"},ru:{keywords:["russian","federation","flag","nation","country","banner"],char:"๐Ÿ‡ท๐Ÿ‡บ",category:"flags"},rw:{keywords:["rwanda","flag","nation","country","banner"],char:"๐Ÿ‡ท๐Ÿ‡ผ",category:"flags"},bl:{keywords:["saint","barthรฉlemy","flag","nation","country","banner"],char:"๐Ÿ‡ง๐Ÿ‡ฑ",category:"flags"},sh:{keywords:["saint","helena","ascension","tristan","cunha","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ญ",category:"flags"},kn:{keywords:["saint","kitts","nevis","flag","nation","country","banner"],char:"๐Ÿ‡ฐ๐Ÿ‡ณ",category:"flags"},lc:{keywords:["saint","lucia","flag","nation","country","banner"],char:"๐Ÿ‡ฑ๐Ÿ‡จ",category:"flags"},pm:{keywords:["saint","pierre","miquelon","flag","nation","country","banner"],char:"๐Ÿ‡ต๐Ÿ‡ฒ",category:"flags"},vc:{keywords:["saint","vincent","grenadines","flag","nation","country","banner"],char:"๐Ÿ‡ป๐Ÿ‡จ",category:"flags"},ws:{keywords:["samoa","flag","nation","country","banner"],char:"๐Ÿ‡ผ๐Ÿ‡ธ",category:"flags"},sm:{keywords:["san","marino","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ฒ",category:"flags"},st:{keywords:["sao","tome","principe","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡น",category:"flags"},saudi_arabia:{keywords:["flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ฆ",category:"flags"},sn:{keywords:["senegal","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ณ",category:"flags"},rs:{keywords:["serbia","flag","nation","country","banner"],char:"๐Ÿ‡ท๐Ÿ‡ธ",category:"flags"},sc:{keywords:["seychelles","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡จ",category:"flags"},sl:{keywords:["sierra","leone","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ฑ",category:"flags"},sg:{keywords:["singapore","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ฌ",category:"flags"},sx:{keywords:["sint","maarten","dutch","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ฝ",category:"flags"},sk:{keywords:["slovakia","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ฐ",category:"flags"},si:{keywords:["slovenia","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ฎ",category:"flags"},sb:{keywords:["solomon","islands","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ง",category:"flags"},so:{keywords:["somalia","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ด",category:"flags"},za:{keywords:["south","africa","flag","nation","country","banner"],char:"๐Ÿ‡ฟ๐Ÿ‡ฆ",category:"flags"},gs:{keywords:["south","georgia","sandwich","islands","flag","nation","country","banner"],char:"๐Ÿ‡ฌ๐Ÿ‡ธ",category:"flags"},kr:{keywords:["south","korea","nation","flag","country","banner"],char:"๐Ÿ‡ฐ๐Ÿ‡ท",category:"flags"},ss:{keywords:["south","sudan","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ธ",category:"flags"},es:{keywords:["spain","flag","nation","country","banner"],char:"๐Ÿ‡ช๐Ÿ‡ธ",category:"flags"},lk:{keywords:["sri","lanka","flag","nation","country","banner"],char:"๐Ÿ‡ฑ๐Ÿ‡ฐ",category:"flags"},sd:{keywords:["sudan","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ฉ",category:"flags"},sr:{keywords:["suriname","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ท",category:"flags"},sz:{keywords:["swaziland","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ฟ",category:"flags"},se:{keywords:["sweden","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡ช",category:"flags"},ch:{keywords:["switzerland","flag","nation","country","banner"],char:"๐Ÿ‡จ๐Ÿ‡ญ",category:"flags"},sy:{keywords:["syrian","arab","republic","flag","nation","country","banner"],char:"๐Ÿ‡ธ๐Ÿ‡พ",category:"flags"},tw:{keywords:["taiwan","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ผ",category:"flags"},tj:{keywords:["tajikistan","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ฏ",category:"flags"},tz:{keywords:["tanzania,","united","republic","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ฟ",category:"flags"},th:{keywords:["thailand","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ญ",category:"flags"},tl:{keywords:["timor","leste","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ฑ",category:"flags"},tg:{keywords:["togo","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ฌ",category:"flags"},tk:{keywords:["tokelau","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ฐ",category:"flags"},to:{keywords:["tonga","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ด",category:"flags"},tt:{keywords:["trinidad","tobago","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡น",category:"flags"},tn:{keywords:["tunisia","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ณ",category:"flags"},tr:{keywords:["turkey","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ท",category:"flags"},turkmenistan:{keywords:["flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ฒ",category:"flags"},tc:{keywords:["turks","caicos","islands","flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡จ",category:"flags"},tuvalu:{keywords:["flag","nation","country","banner"],char:"๐Ÿ‡น๐Ÿ‡ป",category:"flags"},ug:{keywords:["uganda","flag","nation","country","banner"],char:"๐Ÿ‡บ๐Ÿ‡ฌ",category:"flags"},ua:{keywords:["ukraine","flag","nation","country","banner"],char:"๐Ÿ‡บ๐Ÿ‡ฆ",category:"flags"},ae:{keywords:["united","arab","emirates","flag","nation","country","banner"],char:"๐Ÿ‡ฆ๐Ÿ‡ช",category:"flags"},gb:{keywords:["united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"],char:"๐Ÿ‡ฌ๐Ÿ‡ง",category:"flags"},us:{keywords:["united","states","america","flag","nation","country","banner"],char:"๐Ÿ‡บ๐Ÿ‡ธ",category:"flags"},vi:{keywords:["virgin","islands","us","flag","nation","country","banner"],char:"๐Ÿ‡ป๐Ÿ‡ฎ",category:"flags"},uy:{keywords:["uruguay","flag","nation","country","banner"],char:"๐Ÿ‡บ๐Ÿ‡พ",category:"flags"},uz:{keywords:["uzbekistan","flag","nation","country","banner"],char:"๐Ÿ‡บ๐Ÿ‡ฟ",category:"flags"},vu:{keywords:["vanuatu","flag","nation","country","banner"],char:"๐Ÿ‡ป๐Ÿ‡บ",category:"flags"},va:{keywords:["vatican","city","flag","nation","country","banner"],char:"๐Ÿ‡ป๐Ÿ‡ฆ",category:"flags"},ve:{keywords:["venezuela","bolivarian","republic","flag","nation","country","banner"],char:"๐Ÿ‡ป๐Ÿ‡ช",category:"flags"},vn:{keywords:["viet","nam","flag","nation","country","banner"],char:"๐Ÿ‡ป๐Ÿ‡ณ",category:"flags"},wf:{keywords:["wallis","futuna","flag","nation","country","banner"],char:"๐Ÿ‡ผ๐Ÿ‡ซ",category:"flags"},eh:{keywords:["western","sahara","flag","nation","country","banner"],char:"๐Ÿ‡ช๐Ÿ‡ญ",category:"flags"},ye:{keywords:["yemen","flag","nation","country","banner"],char:"๐Ÿ‡พ๐Ÿ‡ช",category:"flags"},zm:{keywords:["zambia","flag","nation","country","banner"],char:"๐Ÿ‡ฟ๐Ÿ‡ฒ",category:"flags"},zw:{keywords:["zimbabwe","flag","nation","country","banner"],char:"๐Ÿ‡ฟ๐Ÿ‡ผ",category:"flags"},octocat:{keywords:["animal","octopus","github","custom_"],char:null,category:"_custom"},shipit:{keywords:["squirrel","detective","animal","sherlock","inspector","custom_"],char:null,category:"_custom"},bowtie:{keywords:["face","formal","fashion","suit","classy","magic","circus"],char:null,category:"_custom"},neckbeard:{keywords:["nerdy","face","custom_"],char:null,category:"_custom"},metal:{keywords:["fingers","rocknroll","concert","band","custom_"],char:null,category:"_custom"},fu:{keywords:["fuck","finger","dislike","thumbsdown","disapprove","no","custom_"],char:null,category:"_custom"},trollface:{keywords:["internet","meme","custom_"],char:null,category:"_custom"},godmode:{keywords:["doom","oldschool"],char:null,category:"_custom"},goberserk:{keywords:["doom","rage","bloody","hurt"],char:null,category:"_custom"},finnadie:{keywords:["doom","oldschool"],char:null,category:"_custom"},feelsgood:{keywords:["doom","oldschool"],char:null,category:"_custom"},rage1:{keywords:["angry","mad","hate","despise"],char:null,category:"_custom"},rage2:{keywords:["angry","mad","hate","despise"],char:null,category:"_custom"},rage3:{keywords:["angry","mad","hate","despise"],char:null,category:"_custom"},rage4:{keywords:["angry","mad","hate","despise"],char:null,category:"_custom"},suspect:{keywords:["mad","custom_"],char:null,category:"_custom"},hurtrealbad:{keywords:["mad","injured","doom","oldschool","custom_"],char:null,category:"_custom"}},B=function(){function e(e){this.sanitizer=e,this.activeCategory="people",this.searchResults=[],this.searchVisible=!1,this.selected=new t.Subject}return Object.defineProperty(e.prototype,"searchQuery",{get:function(){return this._searchQuery},set:function(e){var t=this;this._searchQuery=e,setTimeout((function(){t.searchResults=Object.keys($).filter((function(t){return t.includes(e)})).map((function(e){return $[e]})),t.searchResults.splice(50,t.searchResults.length),console.log("looking for '"+e+"' => "+t.searchResults.length+" results")}))},enumerable:!1,configurable:!0}),e.prototype.humanize=function(e){return e.replace(/(^| )[a-z]/g,(function(e){return e.toUpperCase()})).replace(/_/g," ")},e.prototype.select=function(e){this.selected.next(e)},e.prototype.pairs=function(e){return Object.keys(e).map((function(t){return[t,e[t]]}))},e.prototype.hideSearch=function(){var e=this;setTimeout((function(){e.searchVisible=!1}))},e.prototype.showSearch=function(){var e=this;setTimeout((function(){e.searchVisible=!0}))},e.prototype.ngOnInit=function(){var e,t,r={},a={symbols:"warning",people:"people",animals_and_nature:"nature",travel_and_places:"location_on",activity:"local_activity",food_and_drink:"restaurant",objects:"computer",flags:"flag"};try{for(var n=U(this.pairs($)),o=n.next();!o.done;o=n.next()){var s=o.value,i=(s[0],s[1]);r[i.category]||(r[i.category]={name:i.category,icon:a[i.category]||"code",emojis:[]}),i.html=this.sanitizer.bypassSecurityTrustHtml(twemoji.parse(i.char||"")),r[i.category].emojis.push(i)}}catch(t){e={error:t}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(e)throw e.error}}this.categories=this.pairs(r).map((function(e){return e[1]}))},e}();B.decorators=[{type:a.Component,args:[{selector:"emoji-selector-panel",template:'<div class="search-box" *ngIf="searchVisible">\r\n\t<a mat-icon-button href="javascript:;" (click)="hideSearch()">\r\n\t\t<mat-icon>arrow_back</mat-icon>\r\n\t</a>\r\n\t<mat-form-field appearance="outline" floatLabel="always">\r\n\t\t<mat-label>Search for emoji</mat-label>\r\n\t\t<input name="search" type="text" matInput placeholder="Start typing" [(ngModel)]="searchQuery" />\r\n\t</mat-form-field>\r\n</div>\r\n\r\n<div class="selector">\r\n\t<ng-container *ngIf="searchVisible">\r\n\t\t<div class="emoji-list">\r\n\t\t\t<a href="javascript:;" (click)="select(emoji.char)" \r\n\t\t\t\t*ngFor="let emoji of searchResults" [innerHtml]="emoji.html || \'\'">\r\n\t\t\t</a>\r\n\t\t</div>\r\n\t</ng-container>\r\n\t<ng-container *ngIf="!searchVisible">\r\n\t\t<div class="categories">\r\n\t\t\t<ng-container *ngIf="!searchVisible">\r\n\t\t\t\t<a [title]="humanize(category.name)" [class.active]="activeCategory === category.name" mat-icon-button *ngFor="let category of categories" (click)="activeCategory = category.name">\r\n\t\t\t\t\t<mat-icon>{{category.icon}}</mat-icon>\r\n\t\t\t\t</a>\r\n\r\n\t\t\t\t<a title="Search" [class.active] mat-icon-button (click)="showSearch()">\r\n\t\t\t\t\t<mat-icon>search</mat-icon>\r\n\t\t\t\t</a>\r\n\t\t\t</ng-container>\r\n\t\t</div>\r\n\t\t<ng-container *ngFor="let category of categories">\r\n\t\t\t<div class="emoji-list" *ngIf="activeCategory && activeCategory == category.name">\r\n\t\t\t\t<a href="javascript:;" (click)="select(emoji.char)" \r\n\t\t\t\t\t*ngFor="let emoji of category.emojis" [innerHtml]="emoji.html || \'\'">\r\n\t\t\t\t</a>\r\n\t\t\t</div>\r\n\t\t</ng-container>\r\n\t</ng-container>\r\n</div>',styles:[":host{background:#111;color:#fff;border:1px solid #333;border-radius:5px;padding:.5em;width:calc(9*(32px + 1em));max-width:calc(100vw - 1.5em - 5px)}.selector{display:flex;flex-direction:column}.categories a{opacity:.25;transition:opacity .4s ease-in-out}.categories a:hover{opacity:.5}.categories a.active{opacity:1}.emoji-list{flex-grow:1;overflow-y:auto;height:20em}.emoji-list a{display:inline-block;padding:2px;margin:4px;background-color:#111}.emoji-list a ::ng-deep .emoji{width:32px;height:32px}.emoji-list a:hover{background-color:#333}.search-box{display:flex;align-items:baseline}.search-box mat-form-field{flex-grow:1}@media (max-width:500px){.selector{flex-direction:row;height:27em}.emoji-list{height:auto}}:host-context(.banta-mobile) .selector{flex-direction:row;height:27em}:host-context(.banta-mobile) .emoji-list{height:auto}"]}]}],B.ctorParameters=function(){return[{type:s.DomSanitizer}]},B.propDecorators={selected:[{type:a.Output}]};var N=function(){function e(e,r){this.elementRef=e,this.overlay=r,this._selected=new t.Subject,this.showEmojiPanel=!1,this.overlayX="end",this.overlayY="top"}return Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isOpen",{get:function(){return this.overlayRef},enumerable:!1,configurable:!0}),e.prototype.insert=function(e){this._selected.next(e)},e.prototype.close=function(){if(this.overlayRef)return this.overlayRef.dispose(),void(this.overlayRef=null)},e.prototype.show=function(){var e=this;this.isOpen&&this.close(),this.overlayRef=this.overlay.create({positionStrategy:this.overlay.position().flexibleConnectedTo(this.elementRef).withPositions([{originX:"end",originY:"bottom",overlayX:this.overlayX,overlayY:this.overlayY}]).withFlexibleDimensions(!0),hasBackdrop:!0,disposeOnNavigation:!0,scrollStrategy:this.overlay.scrollStrategies.reposition({autoClose:!0})}),this.overlayRef.backdropClick().subscribe((function(){e.close()})),this.overlayRef.keydownEvents().subscribe((function(t){"Escape"===t.key&&e.close()})),this.overlayRef.attach(this.selectorPanelTemplate)},e}();N.decorators=[{type:a.Component,args:[{selector:"emoji-selector-button",template:'\n <button #button type="button" mat-icon-button (click)="show()">\n <mat-icon>emoji_emotions</mat-icon>\n </button>\n <ng-template cdkPortal #selectorPanelTemplate="cdkPortal">\n <emoji-selector-panel \n #panel\n (selected)="insert($event)"\n ></emoji-selector-panel>\n </ng-template>\n ',styles:["\n :host {\n display: block;\n position: relative;\n }\n\n button {\n color: #666\n }\n "]}]}],N.ctorParameters=function(){return[{type:a.ElementRef},{type:u.Overlay}]},N.propDecorators={selectorPanelTemplate:[{type:a.ViewChild,args:["selectorPanelTemplate"]}],selected:[{type:a.Output}],overlayX:[{type:a.Input}],overlayY:[{type:a.Input}]};var H=[B,N],W=function(){};W.decorators=[{type:a.NgModule,args:[{declarations:H,imports:[i.CommonModule,y.FormsModule,c.MatIconModule,d.MatButtonModule,h.MatFormFieldModule,g.MatInputModule,u.OverlayModule,p.PortalModule],exports:H}]}];var Y=function(){function e(){this._userChanged=new t.BehaviorSubject(null),this._attachmentScrapers=[],this._attachmentResolvers=[]}return Object.defineProperty(e.prototype,"userChanged",{get:function(){return this._userChanged},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"user",{get:function(){return this._user},set:function(e){this._user=e,this._userChanged.next(e)},enumerable:!1,configurable:!0}),e.prototype.registerAttachmentScraper=function(e){this._attachmentScrapers.push(e)},e.prototype.registerAttachmentResolver=function(e){this._attachmentResolvers.push(e)},Object.defineProperty(e.prototype,"attachmentScrapers",{get:function(){return this._attachmentScrapers.slice()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"attachmentResolvers",{get:function(){return this._attachmentResolvers.slice()},enumerable:!1,configurable:!0}),e}(),K=function(){function e(e,r){this.backend=e,this.matDialog=r,this._subs=new t.Subscription,this.auxOpen=!1,this.auxTitle="Notifications",this.auxMode="notifications",this.mobileFocus=null,this.newNotifications=!1,this.chatLabel="Chat",this.commentsLabel="Comments",this._signInSelected=new t.Subject,this.pointOpen=null,this.pointSubChat=null,this.newPointSubMessage={},this.genericAvatarUrl="https://gravatar.com/avatar/915c804e0be607a4ad766ddadea5c48a?s=512&d=https://codepen.io/assets/avatars/user-avatar-512x512-6e240cf350d2f1cc07c2bed234c3a3bb5f1b237023c204c782622e80d6b212ba.png"}return e.prototype.ngOnInit=function(){var e=this;this._subs.add(this.backend.userChanged.subscribe((function(t){return e.currentUser=t}))),this._subs.add(this.backend.notificationsChanged.subscribe((function(t){return e.notifications=t}))),this._subs.add(this.backend.newNotification.subscribe((function(t){e.newNotifications=!0})))},e.prototype.sendPointSubMessage=function(){return D(this,void 0,void 0,(function(){var e,t,r;return R(this,(function(a){switch(a.label){case 0:if(e=(this.newPointSubMessage.message||"").trim(),this.newPointSubMessage.message="",""===e)return[2];t={user:null,sentAt:Date.now(),likes:0,message:e},a.label=1;case 1:return a.trys.push([1,3,,4]),[4,this.pointSubChat.send(t)];case 2:return a.sent(),[3,4];case 3:return r=a.sent(),console.error("Failed to send point sub-message:"),console.error(r),[3,4];case 4:return[2]}}))}))},e.prototype.goToMessage=function(e){return D(this,void 0,void 0,(function(){var t,r,a,n,o,s;return R(this,(function(i){switch(i.label){case 0:if(t=e,!e.parentMessageId)return[3,5];r=void 0,i.label=1;case 1:return i.trys.push([1,3,,4]),[4,this.backend.getMessage(e.topicId,e.parentMessageId)];case 2:return r=i.sent(),[3,4];case 3:return a=i.sent(),console.error("Received exception while fetching parent message:"),console.error(a),[3,4];case 4:if(!r)return console.error("Failed to look up parent message "+e.topicId+"/"+e.parentMessageId),console.error("Original message was:"),console.dir(t),[2];e=r,i.label=5;case 5:return"comment"!==(n=this.getViewType(e))?[3,8]:(this.pointSubChat&&(this.pointSubChat.close&&this.pointSubChat.close(),this.pointSubChat=null),this.mobileFocus="points",this.pointOpen=e,o=this,[4,this.backend.getSourceForThread(e.topicId,e.id)]);case 6:return o.pointSubChat=i.sent(),s=this,[4,this.backend.refreshMessage(e)];case 7:return s.pointOpen=i.sent(),this.newPointSubMessage={},[3,9];case 8:"chat"===n&&(this.mobileFocus="firehose",this.firehose.jumpToMessage(e)),i.label=9;case 9:return[2]}}))}))},e.prototype.pointUnfocus=function(){this.pointOpen=null,this.pointSubChat&&(this.pointSubChat.close&&this.pointSubChat.close(),this.pointSubChat=null)},e.prototype.ngOnDestroy=function(){this._subs.unsubscribe()},e.prototype.showAux=function(e,t){this.auxOpen=!0,this.auxTitle=e,this.auxMode=t,this.mobileFocus="aux"},e.prototype.showNotifications=function(){this.showAux("Notifications","notifications")},Object.defineProperty(e.prototype,"topicID",{get:function(){return this._topicID},set:function(e){this._topicID=e,this.close(),this.connectToTopic(this._topicID)},enumerable:!1,configurable:!0}),e.prototype.connectToTopic=function(e){return D(this,void 0,void 0,(function(){var t,r;return R(this,(function(a){switch(a.label){case 0:return t=this,[4,this.backend.getSourceForTopic(e+"_firehose")];case 1:return t.firehoseSource=a.sent(),r=this,[4,this.backend.getSourceForTopic(e+"_thepoint")];case 2:return r.pointSource=a.sent(),[2]}}))}))},Object.defineProperty(e.prototype,"signInSelected",{get:function(){return this._signInSelected},enumerable:!1,configurable:!0}),e.prototype.showSignIn=function(){this._signInSelected.next()},e.prototype.close=function(){this.firehoseSource&&(this.firehoseSource.close&&this.firehoseSource.close(),this.firehoseSource=null),this.pointSource&&(this.pointSource.close&&this.pointSource.close(),this.pointSource=null)},Object.defineProperty(e.prototype,"hasPoint",{get:function(){return null!=this.pointOpen},enumerable:!1,configurable:!0}),e.prototype.closeAux=function(){this.auxOpen=!1,this.mobileFocus="firehose"},e.prototype.getViewType=function(e){return e.topicId.endsWith("_firehose")?"chat":(e.topicId.endsWith("_thepoint"),"comment")},e.prototype.upvoteMessage=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(e){return[2]}))}))},e.prototype.showProfile=function(e){this.profileUser=e,this.showAux("@"+e.username+"'s Profile","profile")},e.prototype.sendReport=function(e){this.auxOpen=!1,alert("would send report")},e.prototype.reportMessage=function(e){this.reportedMessage=e,this.showAux("Report message from @"+e.user.username,"report")},e}();K.decorators=[{type:a.Component,args:[{selector:"banta",template:'\r\n<mat-menu #userMenu="matMenu">\r\n <ng-container *ngIf="currentUser">\r\n <button [disabled]="true" mat-menu-item>{{currentUser.displayName}} (@{{currentUser.username}})</button>\r\n <button mat-menu-item (click)="signOut()">Sign Out</button>\r\n </ng-container>\r\n <ng-container *ngIf="!currentUser">\r\n <button mat-menu-item>Sign In</button>\r\n </ng-container>\r\n <button mat-menu-item>Help</button>\r\n</mat-menu>\r\n\r\n<div class="tabs">\r\n <div>\r\n <a mat-button (click)="mobileFocus = \'chat\'">{{chatLabel}}</a>\r\n <a mat-button (click)="mobileFocus = \'comments\'">{{commentsLabel}}</a>\r\n </div>\r\n <div class="spacer"></div>\r\n <div>\r\n <ng-container *ngIf="currentUser">\r\n <button mat-button [matMenuTriggerFor]="userMenu">\r\n @{{currentUser.username}}\r\n </button>\r\n <button mat-icon-button (click)="showNotifications()">\r\n <mat-icon>notification_important</mat-icon>\r\n </button>\r\n </ng-container>\r\n \r\n <button mat-button *ngIf="!currentUser" (click)="showSignIn()">\r\n Sign In\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<div class="firehose" [class.focus]="mobileFocus === \'chat\'">\r\n <header>\r\n <div>\r\n <label (click)="mobileFocus = \'chat\'">{{chatLabel}}</label>\r\n <div class="spacer"></div>\r\n\r\n <ng-container *ngIf="currentUser">\r\n <button mat-button [matMenuTriggerFor]="userMenu">\r\n @{{currentUser.username}}\r\n </button>\r\n <button mat-icon-button (click)="showNotifications()">\r\n <mat-icon>notification_important</mat-icon>\r\n </button>\r\n </ng-container>\r\n \r\n <button mat-button *ngIf="!currentUser" (click)="showSignIn()">\r\n Sign In\r\n </button>\r\n </div>\r\n </header>\r\n <banta-chat \r\n #firehose\r\n [source]="firehoseSource"\r\n (signInSelected)="showSignIn()"\r\n (upvoted)="upvoteMessage($event)"\r\n (userSelected)="showProfile($event.user)"\r\n (reported)="reportMessage($event)"\r\n ></banta-chat>\r\n</div>\r\n\r\n<div class="aux" [class.focus]="mobileFocus === \'aux\'" [class.open]="auxOpen">\r\n <header>\r\n <div>\r\n <label>{{auxTitle}}</label>\r\n <div class="spacer"></div>\r\n <button mat-icon-button (click)="auxOpen = false">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </header>\r\n <div class="aux-contents">\r\n <ng-container *ngIf="auxMode === \'profile\'">\r\n <ng-container *ngIf="profileUser">\r\n\r\n <div>\r\n <strong style="font-size: 125%;">\r\n {{profileUser.displayName}}\r\n </strong>\r\n @{{profileUser.username}}\r\n </div>\r\n\r\n <br/>\r\n <strong>Top Messages</strong>\r\n\r\n <div>\r\n <em>Not yet available</em>\r\n </div>\r\n\r\n <br/>\r\n <strong>Recent Messages</strong>\r\n\r\n <div>\r\n <em>Not yet available</em>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf="auxMode === \'report\'">\r\n <p>Are you sure you want to report this message?</p>\r\n\r\n <banta-live-message [message]="reportedMessage"></banta-live-message>\r\n\r\n <div style="text-align: center;">\r\n <button mat-raised-button color="primary" (click)="sendReport(reportedMessage)">Yes, Report</button>\r\n &nbsp;\r\n <button mat-raised-button color="secondary" (click)="auxOpen = false">No, Cancel</button>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n <ng-container *ngIf="auxMode === \'notifications\'">\r\n\r\n <div *ngIf="!notifications || notifications.length === 0">\r\n <em>You do not have any notifications yet</em>\r\n </div>\r\n \r\n <div class="notifications">\r\n <div class="notification" *ngFor="let notif of notifications">\r\n <div>\r\n <ng-container *ngIf="notif.type === \'upvote\'">\r\n @{{notif.message?.user?.username}} upvoted your post\r\n \r\n <banta-live-message\r\n [message]="notif.message"\r\n (upvoted)="upvoteMessage(notif.message)"\r\n (reported)="reportMessage(notif.message)"\r\n (selected)="goToMessage(notif.message)">\r\n </banta-live-message>\r\n\r\n </ng-container>\r\n <ng-container *ngIf="notif.type === \'notice\'">\r\n <div>\r\n {{notif.message}}\r\n </div>\r\n <a mat-button target="_blank" href="{{notif.actionUrl}}">\r\n {{notif.actionLabel}}\r\n </a>\r\n </ng-container>\r\n <ng-container *ngIf="notif.type === \'mention\'">\r\n You were mentioned by @{{notif.message?.user?.username}}\r\n\r\n <banta-live-message\r\n [message]="notif.message"\r\n (upvoted)="upvoteMessage(notif.message)"\r\n (reported)="reportMessage(notif.message)"\r\n (selected)="goToMessage(notif.message)">\r\n </banta-live-message>\r\n\r\n </ng-container>\r\n <ng-container *ngIf="notif.type === \'reply\'">\r\n @{{notif.replyMessage?.user?.username}} replied to your post\r\n \r\n <banta-live-message\r\n [message]="notif.replyMessage"\r\n (upvoted)="upvoteMessage(notif.replyMessage)"\r\n (reported)="reportMessage(notif.replyMessage)"\r\n (selected)="goToMessage(notif.replyMessage)">\r\n </banta-live-message>\r\n </ng-container>\r\n </div>\r\n\r\n <banta-timestamp [value]="notif.sentAt"></banta-timestamp>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</div>\r\n<div class="points" [class.focus]="mobileFocus === \'points\'">\r\n <header>\r\n <div>\r\n <label>{{commentsLabel}}</label>\r\n </div>\r\n </header>\r\n <div class="point-focus">\r\n <div class="actions">\r\n <button mat-button (click)="pointUnfocus()">\r\n <mat-icon>arrow_back</mat-icon>\r\n Back\r\n </button>\r\n\r\n <div class="spacer"></div>\r\n \r\n <ng-container *ngIf="pointOpen">\r\n <div class="counted-action">\r\n <div class="count-indicator"> \r\n {{pointOpen.likes}}\r\n </div>\r\n <button mat-icon-button>\r\n <mat-icon>thumb_up</mat-icon>\r\n </button>\r\n </div>\r\n\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf="!pointSubChat">\r\n Error: No subchat\r\n </div>\r\n \r\n <banta-comment-view\r\n class="subcomments"\r\n *ngIf="pointSubChat"\r\n [newestLast]="true"\r\n [allowReplies]="false"\r\n [source]="pointSubChat"\r\n (upvoted)="upvoteMessage($event)"\r\n (reported)="reportMessage($event)"\r\n (userSelected)="showProfile($event.user)"\r\n >\r\n \r\n <banta-comment\r\n class="focused-comment"\r\n data-before\r\n *ngIf="pointOpen"\r\n (upvoted)="upvoteMessage(pointOpen)"\r\n (userSelected)="showProfile(pointOpen.user)"\r\n (reported)="reportMessage(pointOpen)"\r\n [showReplyAction]="false"\r\n [message]="pointOpen"\r\n ></banta-comment>\r\n \r\n <div class="message reply">\r\n Reply:\r\n <form class="new-message" (submit)="sendPointSubMessage()">\r\n <textarea \r\n name="message" \r\n (keydown)="newPointSubMessageKeyDown($event)"\r\n [(ngModel)]="newPointSubMessage.message"></textarea>\r\n \r\n <div class="actions">\r\n <button [disabled]="!newPointSubMessage.message" \r\n mat-raised-button color="primary">Send</button>\r\n </div>\r\n </form>\r\n </div>\r\n </banta-comment-view>\r\n </div>\r\n <div class="points-section">\r\n <banta-comments\r\n [source]="pointSource"\r\n (signInSelected)="showSignIn()"\r\n (upvoted)="upvoteMessage($event)"\r\n (reported)="reportMessage($event)"\r\n (selected)="goToMessage($event)"\r\n (userSelected)="showProfile($event.user)"\r\n ></banta-comments>\r\n </div>\r\n</div>',styles:[':host{display:flex;flex-direction:row;padding:.5em;height:40em;position:relative}.counted-action{display:flex;align-items:center}.count-indicator{font-size:9pt;padding:0 3px;border-radius:3px;border:1px solid #333}header{position:relative;margin-bottom:1em}header div{display:flex;align-items:center;height:30px}header button{color:#666}header label{text-transform:uppercase;z-index:1;font-size:12pt;letter-spacing:2px;font-weight:100;color:#333;margin:0 auto 0 0;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis}header:after,header label{display:block;position:relative}header:after{content:"";border:1px solid #ccc;height:0;width:100%;z-index:0}.points{max-width:50em;display:flex;flex-direction:column}:host.point-focus .points{width:66%;max-width:50em}:host.point-focus .points .points-section{opacity:0;pointer-events:none}:host.point-focus .points .point-focus{opacity:1;pointer-events:auto}:host.point-focus .points .point-focus .actions{display:flex}banta-comments{flex-grow:1}.points{width:33%;margin-left:.5em;font-size:12pt;flex-shrink:0;max-width:30em;transition:width .2s ease-in,max-width .2s ease-in;position:relative}.points .points-section{opacity:1;z-index:2}.points .point-focus,.points .points-section{flex-grow:1;display:flex;flex-direction:column;transition:opacity .2s ease-in}.points .point-focus{position:absolute;width:100%;bottom:0;top:1.75em;right:0;left:0;padding:.5em;opacity:0}.firehose{flex-grow:1;font-size:10pt;display:flex;flex-direction:column}form{display:flex;padding:.5em 0;align-items:center}form textarea{font-size:14pt;min-height:6em}form input[type=text],form textarea{background:#000;color:#fff;border:1px solid #333;width:100%}form input[type=text]{height:1em}form .actions{margin-left:1em}form button{display:block;margin:0 0 0 auto}.subcomments ::ng-deep banta-comment{font-size:10pt}.subcomments ::ng-deep banta-comment.focused-comment{background:#001321;color:#fff;font-size:12pt}.aux{width:0;min-width:0;overflow-x:hidden;transition:width .4s ease-out,min-width .4s ease-out;display:flex;flex-direction:column}.aux.open{width:30em;min-width:18em}.aux .aux-contents{width:30em;min-width:10em;max-width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;flex-grow:1}.notifications .notification{border-bottom:1px solid #333;padding:1em}.notifications .notification banta-timestamp{display:block;text-align:right;font-size:9pt;color:#999}.message.reply{padding:1em}.tabs{display:none}@media (max-width:1015px){:host{flex-direction:column}.tabs{display:flex;position:absolute;top:0;left:0;right:0;width:100%;z-index:10;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);background:rgba(0,0,0,.5)}.points{width:100%;max-width:100%;margin-left:0}header{display:none}.aux,:host.point-focus .points{width:100%;max-width:100%}.aux{min-width:0}.aux,.firehose,.points{position:absolute;top:2em;left:0;right:0;bottom:0;z-index:0;background:#000}.aux.focus,.firehose.focus,.points.focus{z-index:2}}:host-context(.mat-dark-theme) :host{background:#090909;color:#fff}:host-context(.mat-dark-theme) form textarea{background:#ccc;color:#333}:host-context(.mat-dark-theme) header:after{border-color:#222}:host-context(.mat-dark-theme) header label{color:#aaa}']}]}],K.ctorParameters=function(){return[{type:Y},{type:m.MatDialog}]},K.propDecorators={firehose:[{type:a.ViewChild,args:["firehose",{static:!0}]}],topicID:[{type:a.Input}],chatLabel:[{type:a.Input}],commentsLabel:[{type:a.Input}],signInSelected:[{type:a.Output}],hasPoint:[{type:a.HostBinding,args:["class.point-focus"]}]};var Q=function(){};Q.decorators=[{type:a.Component,args:[{selector:"banta-logo",template:"banta",styles:["\n :host {\n font-family: 'Odibee Sans', sans-serif;\n font-size: 40pt;\n }\n\n :host.small {\n font-size: 30pt;\n }\n "]}]}];var X=function(){function e(){this._selected=new t.Subject,this._reported=new t.Subject,this._upvoted=new t.Subject,this._userSelected=new t.Subject}return Object.defineProperty(e.prototype,"userSelected",{get:function(){return this._userSelected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"reported",{get:function(){return this._reported},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"upvoted",{get:function(){return this._upvoted},enumerable:!1,configurable:!0}),e.prototype.avatarForUser=function(e){return e&&e.avatarUrl?"url("+e.avatarUrl+")":null},e.prototype.upvote=function(){this._upvoted.next()},e.prototype.report=function(){this._reported.next()},e.prototype.select=function(){this._selected.next()},e.prototype.selectUser=function(){this._userSelected.next()},e}();X.decorators=[{type:a.Component,args:[{selector:"banta-chat-message",template:'<div class="message-content">\r\n <div class="user" (click)="selectUser()">\r\n <div class="avatar" [style.background-image]="avatarForUser(message.user)"></div>\r\n <label>{{message.user.username}}</label>\r\n </div>\r\n <div class="content">\r\n <div (click)="select()">\r\n {{message.message}}\r\n </div>\r\n <div class="status">\r\n <div class="count-indicator" *ngIf="message.likes > 0">\r\n {{message.likes}} <mat-icon [inline]="true">star</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<div class="actions">\r\n <button mat-icon-button matTooltip="Upvote" matTooltipPosition="below" (click)="upvote()">\r\n <mat-icon [inline]="true">thumb_up</mat-icon>\r\n </button>\r\n <button mat-icon-button matTooltip="Report" matTooltipPosition="below" (click)="report()">\r\n <mat-icon [inline]="true">report</mat-icon>\r\n </button>\r\n</div>',styles:[':host{display:flex;flex-direction:row;align-items:center;padding:0 1em;background-color:#fff;color:#000;transition:background-color .4s ease-out}:host .message-content .content{color:#111}:host:hover{background-color:#ddd}:host.highlight{background:#00121b}:host.highlight:hover{background:#01324d}:host:nth-child(2n){background-color:#eee}:host:nth-child(2n):hover{background:#ddd}:host:nth-child(2n) .message-content .content{color:#222}:host:nth-child(2n).highlight{background:#001a2a}:host:nth-child(2n).highlight:hover{background:#002b44}:host .message-content{display:flex;flex-direction:row;flex-grow:1;align-items:center}:host .message-content .content{display:flex;flex-direction:row;padding:5px 0}:host .message-content .content .status{display:flex;flex-direction:row;align-items:center;margin-left:1em}:host .message-content .content .status mat-icon{margin-left:.5em}:host .user{color:#999;font-weight:400;text-align:right;margin-right:.25em;flex-shrink:0;display:flex;align-items:center}:host .user .avatar{background-position:50%;background-size:cover;background-color:#333;border-radius:100%;flex-shrink:0;flex-grow:0;margin-right:1em;width:2em;height:2em}:host .user:after{content:":";margin-right:1em}:host .content{flex-grow:1}:host .actions{flex-shrink:0;white-space:nowrap;opacity:0;transition:opacity .4s ease-out}:host:hover .actions{opacity:1}.count-indicator{white-space:nowrap}:host-context(.mat-dark-theme){background-color:#000;color:#fff}:host-context(.mat-dark-theme) .message-content .content{color:#ddd}:host-context(.mat-dark-theme):hover{background-color:#111}:host-context(.mat-dark-theme):nth-child(2n).highlight{background:#001a2a}:host-context(.mat-dark-theme):nth-child(2n).highlight:hover{background:#002b44}:host-context(.mat-dark-theme):nth-child(2n):hover{background-color:#111}:host-context(.mat-dark-theme):nth-child(2n){background-color:#080808}:host-context(.mat-dark-theme):nth-child(2n) .message-content .content{color:#eee}label{margin:0}']}]}],X.propDecorators={message:[{type:a.Input}],userSelected:[{type:a.Output}],selected:[{type:a.Output}],reported:[{type:a.Output}],upvoted:[{type:a.Output}]};var J=function(){function e(e){this.backend=e,this._upvoted=new t.Subject,this._reported=new t.Subject,this._selected=new t.Subject}return Object.defineProperty(e.prototype,"upvoted",{get:function(){return this._upvoted},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"reported",{get:function(){return this._reported},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"message",{get:function(){return this._message},set:function(e){var t=this,r=null;this._message&&(r=this._message.id),this._message=e,e&&r===e.id||(this.unsubscribe&&this.unsubscribe(),e&&(this.unsubscribe=this.backend.watchMessage(e,(function(e){return t.message=e}))))},enumerable:!1,configurable:!0}),e.prototype.report=function(){this._reported.next()},e.prototype.upvote=function(){this._upvoted.next()},e.prototype.select=function(){this._selected.next()},e}();J.decorators=[{type:a.Component,args:[{selector:"banta-live-chat-message",template:'\n <banta-chat-message \n *ngIf="message"\n [message]="message"\n (upvoted)="upvote()"\n (reported)="report()"\n (selected)="select()"\n ></banta-chat-message>\n ',styles:[""]}]}],J.ctorParameters=function(){return[{type:Y}]},J.propDecorators={upvoted:[{type:a.Output}],reported:[{type:a.Output}],selected:[{type:a.Output}],message:[{type:a.Input}]};var G=function(){function e(e,r){this.backend=e,this.elementRef=r,this._sourceSubs=new t.Subscription,this._selected=new t.Subject,this._selected$=this._selected.asObservable(),this._reported=new t.Subject,this._reported$=this._reported.asObservable(),this._upvoted=new t.Subject,this._upvoted$=this._upvoted.asObservable(),this._userSelected=new t.Subject,this._userSelected$=this._userSelected.asObservable(),this._received=new t.Subject,this._received$=this._received.asObservable(),this.messages=[],this.maxMessages=200}return Object.defineProperty(e.prototype,"source",{get:function(){return this._source},set:function(e){var r=this;this._sourceSubs&&(this._sourceSubs.unsubscribe(),this._sourceSubs=null),this._source=e,this.messages=[],e&&(this._sourceSubs=new t.Subscription,this.messages=e.messages.slice(),console.log("Source set:"),console.dir(e),console.log("Messages loaded:"),console.dir(this.messages),this._sourceSubs.add(this._source.messageReceived.subscribe((function(e){return r.messageReceived(e)}))),this._sourceSubs.add(this._source.messageSent.subscribe((function(e){return r.messageSent(e)}))),this._sourceSubs.add(this.backend.userChanged.subscribe((function(e){return r.currentUser=e}))),this.getInitialMessages())},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected$},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"userSelected",{get:function(){return this._userSelected$},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"reported",{get:function(){return this._reported$},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"upvoted",{get:function(){return this._upvoted$},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"received",{get:function(){return this._received$},enumerable:!1,configurable:!0}),e.prototype.getInitialMessages=function(){return D(this,void 0,void 0,(function(){var e;return R(this,(function(t){switch(t.label){case 0:return[4,this._source.getExistingMessages()];case 1:return(e=t.sent()).forEach((function(e){var t;return null!==(t=e.transientState)&&void 0!==t?t:e.transientState={}})),this.messages=e.slice().reverse(),this.sortMessages(),[2]}}))}))},e.prototype.sortMessages=function(){var e;this.source&&(e=function(e,t){return e.sentAt-t.sentAt},this.messages.sort(e))},e.prototype.addMessage=function(e){if(this.messages.length>this.maxMessages+1)for(;this.messages.length>this.maxMessages;)this.messages.shift();this.messages.push(e),this.sortMessages()},e.prototype.messageReceived=function(e){var t=this;this.addMessage(e),this._received.next(e),this.isScrolledToLatest()&&setTimeout((function(){return t.scrollToLatest()}))},e.prototype.isScrolledToLatest=function(){if(!this.messageContainer)return!1;var e=this.messageContainer.nativeElement;return e.scrollTop>e.scrollHeight-e.offsetHeight-10},e.prototype.messageSent=function(e){var t=this;this.addMessage(e),this.messageContainer&&setTimeout((function(){return t.scrollToLatest()}))},e.prototype.scrollToLatest=function(){if(this.messageContainer){var e=this.messageContainer.nativeElement;e.scrollTop=e.scrollHeight}},e.prototype.jumpTo=function(e){var t=this.elementRef.nativeElement.querySelector('banta-chat-message[data-id="'+e.id+'"]');t?(t.scrollIntoView({behavior:"smooth"}),this.flashMessage(e)):alert("could not find message "+e.id)},e.prototype.flashMessage=function(e){e&&(this.flashedMessageId=e.id)},e.prototype.mentionsMe=function(e){return!!this.currentUser&&!!e.message.includes("@"+this.currentUser.username)},e.prototype.upvoteMessage=function(e){this._upvoted.next(e)},e.prototype.reportMessage=function(e){this._reported.next(e)},e.prototype.selectMessage=function(e){this._selected.next(e)},e.prototype.selectMessageUser=function(e){this._userSelected.next(e)},e.prototype.avatarForUser=function(e){return e&&e.avatarUrl?"url("+e.avatarUrl+")":null},e}();G.decorators=[{type:a.Component,args:[{selector:"banta-chat-view",template:'<div class="message-container" #messageContainer>\r\n <ng-content select="[data-before]"></ng-content>\r\n <ng-container *ngFor="let message of messages">\r\n <banta-chat-message\r\n *ngIf="!message.hidden"\r\n [message]="message"\r\n [class.highlight]="mentionsMe(message)" \r\n [class.flash]="message.id === flashedMessageId"\r\n (selected)="selectMessage(message)"\r\n (upvoted)="upvoteMessage(message)"\r\n (reported)="reportMessage(message)"\r\n (userSelected)="selectMessageUser(message)"\r\n [attr.data-id]="message.id"\r\n >\r\n </banta-chat-message>\r\n </ng-container>\r\n <ng-content select=":not([data-before])"></ng-content>\r\n</div>',styles:[":host{display:flex;flex-direction:column;flex-grow:1}.message-container{flex-grow:1;overflow-y:auto;overflow-x:hidden;height:10em;color:#000;background:#fff;padding:.5em 1em .5em .5em}.message-container.no-scroll{height:auto;overflow-y:visible}:host-context(.mat-dark-theme) .message-container{color:#fff;background:#000}banta-chat-message.flash{-webkit-animation:flash;animation:flash;-webkit-animation-duration:2.5s;animation-duration:2.5s;-webkit-animation-iteration-count:1;animation-iteration-count:1}@-webkit-keyframes flash{0%{transform:scale(1);background:#425700}25%{transform:scale(1.05)}50%{transform:scale(1)}75%{transform:scale(1.05)}to{transform:scale(1)}}@keyframes flash{0%{transform:scale(1);background:#425700}25%{transform:scale(1.05)}50%{transform:scale(1)}75%{transform:scale(1.05)}to{transform:scale(1)}}"]}]}],G.ctorParameters=function(){return[{type:Y},{type:a.ElementRef}]},G.propDecorators={source:[{type:a.Input}],selected:[{type:a.Output}],userSelected:[{type:a.Output}],reported:[{type:a.Output}],upvoted:[{type:a.Output}],received:[{type:a.Output}],messageContainer:[{type:a.ViewChild,args:["messageContainer"]}],maxMessages:[{type:a.Input}]};var Z=function(){function e(e){this.backend=e,this._subs=new t.Subscription,this.user=null,this.signInLabel="Sign In",this.sendLabel="Send",this.permissionDeniedLabel="Send",this._selected=new t.Subject,this._selected$=this._selected.asObservable(),this._reported=new t.Subject,this._reported$=this._reported.asObservable(),this._upvoted=new t.Subject,this._upvoted$=this._upvoted.asObservable(),this._userSelected=new t.Subject,this._userSelected$=this._userSelected.asObservable(),this._permissionDeniedError=new t.Subject,this._permissionDeniedError$=this._permissionDeniedError.asObservable(),this._signInSelected=new t.Subject,this._signInSelected$=this._signInSelected.asObservable(),this._received=new t.Subject,this._received$=this._received.asObservable(),this.showEmojiPanel=!1,this.newMessage={}}return e.prototype.ngOnInit=function(){var e=this;this._subs.add(this.backend.userChanged.subscribe((function(t){return e.user=t})))},e.prototype.ngOnDestroy=function(){this._subs.unsubscribe()},Object.defineProperty(e.prototype,"source",{get:function(){return this._source},set:function(e){this._source=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"topicID",{get:function(){return this._source.identifier},set:function(e){this.setSourceFromTopicID(e)},enumerable:!1,configurable:!0}),e.prototype.setSourceFromTopicID=function(e){return D(this,void 0,void 0,(function(){var t;return R(this,(function(r){switch(r.label){case 0:return this._source&&this._source.close&&this._source.close(),this._source=null,t=this,[4,this.backend.getSourceForTopic(e)];case 1:return t._source=r.sent(),[2]}}))}))},Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected$},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"reported",{get:function(){return this._reported$},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"upvoted",{get:function(){return this._upvoted$},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"userSelected",{get:function(){return this._userSelected$},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"permissionDeniedError",{get:function(){return this._permissionDeniedError$},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"signInSelected",{get:function(){return this._signInSelected$},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"received",{get:function(){return this._received$},enumerable:!1,configurable:!0}),e.prototype.onReceived=function(e){this._received.next(e)},e.prototype.showSignIn=function(){this._signInSelected.next()},e.prototype.sendPermissionError=function(e){this._permissionDeniedError.next(e)},e.prototype.insertEmoji=function(e){var t=this.newMessage.message||"";this.newMessage.message=t+e},e.prototype.onKeyDown=function(e){},e.prototype.jumpToMessage=function(e){this.chatView&&this.chatView.jumpTo(e)},e.prototype.select=function(e){this._selected.next(e)},e.prototype.selectUser=function(e){this._userSelected.next(e)},e.prototype.report=function(e){this._reported.next(e)},e.prototype.upvote=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){switch(t.label){case 0:return[4,this.source.likeMessage(e.id)];case 1:return t.sent(),this._upvoted.next(e),[2]}}))}))},Object.defineProperty(e.prototype,"canChat",{get:function(){return!!this.user},enumerable:!1,configurable:!0}),e.prototype.sendMessage=function(){var e;return D(this,void 0,void 0,(function(){var t,r,a;return R(this,(function(n){switch(n.label){case 0:if(!this.source)return[2];if(t=(this.newMessage.message||"").trim(),this.newMessage.message="",""===t)return[2];r={user:null,sentAt:Date.now(),likes:0,url:"undefined"!=typeof window?location.href:void 0,message:t},n.label=1;case 1:return n.trys.push([1,5,,6]),[4,null===(e=this.shouldInterceptMessageSend)||void 0===e?void 0:e.call(this,r,this.source)];case 2:return n.sent()?[3,4]:[4,this.source.send(r)];case 3:n.sent(),n.label=4;case 4:return[3,6];case 5:return a=n.sent(),console.error("Failed to send message: ",r),console.error(a),[3,6];case 6:return[2]}}))}))},e}();Z.decorators=[{type:a.Component,args:[{selector:"banta-chat",template:'<banta-chat-view \r\n #chatView\r\n [source]="source"\r\n (upvoted)="upvote($event)"\r\n (reported)="report($event)"\r\n (selected)="select($event)"\r\n (received)="onReceived($event)"\r\n (userSelected)="selectUser($event)"\r\n ></banta-chat-view>\r\n\r\n<form class="new-message" (submit)="sendMessage()">\r\n \r\n <div class="entry-container">\r\n <input\r\n type="text"\r\n name="message" \r\n autocomplete="off"\r\n (keydown)="onKeyDown($event)"\r\n [(ngModel)]="newMessage.message" />\r\n \r\n <emoji-selector-button\r\n (selected)="insertEmoji($event)"\r\n ></emoji-selector-button>\r\n </div>\r\n\r\n <div class="actions">\r\n\r\n <ng-container *ngIf="!user">\r\n <button type="button" (click)="showSignIn()" mat-raised-button color="primary">{{signInLabel}}</button>\r\n </ng-container>\r\n <ng-container *ngIf="user">\r\n <button *ngIf="canChat" [disabled]="!newMessage.message" mat-raised-button color="primary">{{sendLabel}}</button>\r\n <button *ngIf="!canChat" type="button" (click)="sendPermissionError()" mat-raised-button color="primary">{{permissionDeniedLabel}}</button>\r\n </ng-container>\r\n </div>\r\n</form>',styles:[":host{flex-direction:column;border-radius:5px;padding:10px;font-size:10pt;min-height:1px}.entry-container,:host{display:flex;flex-grow:1}.entry-container{flex-direction:row;position:relative}.entry-container emoji-selector-button{position:absolute;right:0;top:.15em}.entry-container input{height:2.6em;font-size:12pt;padding-left:1em}.entry-container input:-webkit-autofill,.entry-container input:-webkit-autofill:focus,.entry-container input:-webkit-autofill:hover{outline:1px solid #9da302;-webkit-text-fill-color:#9da302;-webkit-box-shadow:0 0 0 1000px #211e07 inset;-webkit-transition:background-color 5000s ease-in-out 0s;transition:background-color 5000s ease-in-out 0s;caret-color:#9da302}.entry-container emoji-selector-panel{pointer-events:none;opacity:0;position:absolute;bottom:3.5em;right:0}.entry-container emoji-selector-panel.visible{opacity:1;pointer-events:auto}form{display:flex;padding:.5em 0;align-items:center}form textarea{font-size:14pt;background:#000;color:#fff;border:1px solid #333;min-height:6em;width:100%}form input[type=text]{background:#fff;color:#000;border:1px solid #ccc;width:100%;height:2.5em}form .actions{margin-left:1em}form button{display:block;margin:0 0 0 auto}:host-context(.mat-dark-theme) form input[type=text]{background:#000;color:#fff;border:1px solid #333}"]}]}],Z.ctorParameters=function(){return[{type:Y}]},Z.propDecorators={shouldInterceptMessageSend:[{type:a.Input}],source:[{type:a.Input}],topicID:[{type:a.Input}],signInLabel:[{type:a.Input}],sendLabel:[{type:a.Input}],permissionDeniedLabel:[{type:a.Input}],selected:[{type:a.Output}],reported:[{type:a.Output}],upvoted:[{type:a.Output}],userSelected:[{type:a.Output}],permissionDeniedError:[{type:a.Output}],signInSelected:[{type:a.Output}],received:[{type:a.Output}],chatView:[{type:a.ViewChild,args:["chatView",{static:!0}]}]};var ee=[X,J,G,Z],te=function(){};te.decorators=[{type:a.NgModule,args:[{declarations:ee,imports:[i.CommonModule,y.FormsModule,c.MatIconModule,d.MatButtonModule,W],exports:ee}]}];var re=function(){function e(){this._upvoted=new t.Subject,this._reported=new t.Subject,this._selected=new t.Subject}return Object.defineProperty(e.prototype,"upvoted",{get:function(){return this._upvoted},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"reported",{get:function(){return this._reported},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"message",{get:function(){return this._message},set:function(e){this._message=e,this.viewType=this.getViewType(e)},enumerable:!1,configurable:!0}),e.prototype.getViewType=function(e){return e.topicId.endsWith("_firehose")?"chat":(e.topicId.endsWith("_thepoint"),"comment")},e.prototype.upvote=function(){this._upvoted.next()},e.prototype.report=function(){this._reported.next()},e.prototype.select=function(){this._selected.next()},e}();re.decorators=[{type:a.Component,args:[{selector:"banta-live-message",template:'\n <ng-container *ngIf="message">\n <banta-live-chat-message\n *ngIf="viewType === \'chat\'"\n [message]="message"\n (upvoted)="upvote(message)"\n (reported)="report(message)"\n (selected)="select(message)">\n </banta-live-chat-message>\n\n <banta-live-comment \n *ngIf="viewType === \'comment\'"\n [message]="message"\n (upvoted)="upvote(message)"\n (reported)="report(message)"\n (selected)="select(message)">\n </banta-live-comment>\n </ng-container>\n ',styles:[""]}]}],re.ctorParameters=function(){return[]},re.propDecorators={upvoted:[{type:a.Output}],reported:[{type:a.Output}],selected:[{type:a.Output}],message:[{type:a.Input}]};var ae=function(){function e(e){this.elementRef=e,this._reported=new t.Subject,this._selected=new t.Subject,this._liked=new t.Subject,this._unliked=new t.Subject,this._shared=new t.Subject,this._userSelected=new t.Subject,this._avatarSelected=new t.Subject,this._usernameSelected=new t.Subject,this.maxLength=1500,this.isNew=!1,this.visible=!1,this.showReplyAction=!0,this.loaded=new t.Subject,this.isLoaded=!1,this.mine=!1,this.editing=!1,this._editStarted=new t.Subject,this._deleted=new t.Subject,this._editEnded=new t.Subject,this._edited=new t.Subject}return Object.defineProperty(e.prototype,"element",{get:function(){return this.elementRef.nativeElement},enumerable:!1,configurable:!0}),e.prototype.ngOnInit=function(){var e=this,t=0+100*Math.random();setTimeout((function(){e.isNew=!0,e.visible=!0,setTimeout((function(){return e.isNew=!1}),1e3)}),t)},e.prototype.markAttachmentsLoaded=function(){this.isLoaded=!0,this.loaded.next()},Object.defineProperty(e.prototype,"isHighlighted",{get:function(){var e,t,r;return null!==(r=null===(t=null===(e=this.message)||void 0===e?void 0:e.transientState)||void 0===t?void 0:t.highlighted)&&void 0!==r&&r},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"message",{get:function(){return this._message},set:function(e){var t;this._message=e,(null===(t=this._message.attachments)||void 0===t?void 0:t.length)>0?this.isLoaded=!1:(this.isLoaded=!0,this.loaded.next())},enumerable:!1,configurable:!0}),e.prototype.waitForLoad=function(){return D(this,void 0,void 0,(function(){return R(this,(function(e){switch(e.label){case 0:return this.isLoaded?[2,!0]:[4,this.loaded.pipe(r.take(1)).toPromise()];case 1:return e.sent(),[2]}}))}))},Object.defineProperty(e.prototype,"userSelected",{get:function(){return this._userSelected.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"usernameSelected",{get:function(){return this._usernameSelected.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"avatarSelected",{get:function(){return this._avatarSelected.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"reported",{get:function(){return this._reported.asObservable()},enumerable:!1,configurable:!0}),e.prototype.saveEdit=function(){this._edited.next(this.editedMessage)},e.prototype.endEditing=function(){this._editEnded.next()},e.prototype.startEdit=function(){this._editStarted.next(),this.editedMessage=this.message.message},e.prototype.delete=function(){this._deleted.next()},Object.defineProperty(e.prototype,"liked",{get:function(){return this._liked.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"unliked",{get:function(){return this._unliked.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"edited",{get:function(){return this._edited.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"deleted",{get:function(){return this._deleted.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"editStarted",{get:function(){return this._editStarted.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"editEnded",{get:function(){return this._editEnded.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"shared",{get:function(){return this._shared.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"commentId",{get:function(){var e;return null===(e=this.message)||void 0===e?void 0:e.id},enumerable:!1,configurable:!0}),e.prototype.report=function(){this._reported.next()},e.prototype.like=function(){this._liked.next()},e.prototype.unlike=function(){this._unliked.next()},e.prototype.share=function(){this._shared.next(this.message)},e.prototype.select=function(){this._selected.next()},e.prototype.selectUser=function(){this._userSelected.next()},e.prototype.selectUsername=function(e){this._usernameSelected.next(e),this.selectUser()},e.prototype.selectAvatar=function(e){this._avatarSelected.next(e),this.selectUser()},e.prototype.avatarForUser=function(e){var t=this.genericAvatarUrl;return e&&e.avatarUrl&&(t=e.avatarUrl),"url("+t+")"},Object.defineProperty(e.prototype,"replyCount",{get:function(){var e;return(null===(e=this.message.submessages)||void 0===e?void 0:e.length)||this.message.submessageCount||0},enumerable:!1,configurable:!0}),e}();ae.decorators=[{type:a.Component,args:[{selector:"banta-comment",template:'\r\n<mat-menu #pointItemMenu="matMenu">\r\n <button mat-menu-item (click)="share()">\r\n <mat-icon>share</mat-icon>\r\n Share\r\n </button>\r\n <button *ngIf="!mine" mat-menu-item (click)="report()">\r\n <mat-icon>warning</mat-icon>\r\n Report\r\n </button>\r\n <button *ngIf="mine" [disabled]="!permissions?.canEdit" mat-menu-item (click)="startEdit()">\r\n <mat-icon>edit</mat-icon>\r\n Edit\r\n </button>\r\n <button *ngIf="mine" [disabled]="!permissions?.canDelete" mat-menu-item (click)="delete()">\r\n <mat-icon>delete</mat-icon>\r\n Delete\r\n </button>\r\n\r\n <button *ngFor="let menuItem of customMenuItems" mat-menu-item (click)="menuItem.action(message)">\r\n <mat-icon>{{menuItem.icon}}</mat-icon>\r\n {{menuItem.label}}\r\n </button>\r\n\r\n</mat-menu>\r\n\r\n<div class="message-content">\r\n <div class="user">\r\n <div class="user-1">\r\n <a\r\n href="javascript:;"\r\n class="avatar"\r\n (click)="selectAvatar(message.user)"\r\n [style.background-image]="avatarForUser(message.user)"></a>\r\n <div class="user-identity">\r\n <a href="javascript:;" class="display-name" (click)="selectUser()">{{message.user.displayName}}</a>\r\n <a href="javascript:;" class="username" (click)="selectUsername(message.user)">@{{message.user.username}}</a>\r\n </div>\r\n </div>\r\n <div class="user-2">\r\n <span class="user-tag" *ngIf="message.user.tag">{{message.user.tag}}</span>\r\n <banta-timestamp [value]="message.sentAt"></banta-timestamp>\r\n <span class="spacer"></span>\r\n </div>\r\n </div>\r\n <div class="content" *ngIf="!editing">\r\n <span class="banta-message-content" [innerHTML]="message.message | mentionLinker: message.mentionLinks | markdownToHtml"></span>\r\n <banta-attachments \r\n [attachments]="message.attachments"\r\n (loaded)="markAttachmentsLoaded()"\r\n ></banta-attachments>\r\n <ul class="message-facts">\r\n <li *ngIf="message.edits?.length > 0">(Edited)</li>\r\n </ul>\r\n </div>\r\n <div class="content" *ngIf="editing" style="padding-bottom: 2em;">\r\n <div>\r\n <mat-form-field floatLabel="always" appearance="outline" style="width: 100%;">\r\n <mat-label>Edit Message</mat-label>\r\n <textarea matInput [(ngModel)]="editedMessage" [maxlength]="maxLength"></textarea>\r\n </mat-form-field>\r\n </div>\r\n <button mat-raised-button (click)="saveEdit()">Save</button> &nbsp;\r\n <button mat-button (click)="endEditing()">Cancel</button>\r\n </div>\r\n\r\n\r\n <div class="actions">\r\n <div class="spacer"></div>\r\n <div class="counted-action" *ngIf="showReplyAction">\r\n <button mat-button [matTooltip]="replyCount > 0 ? \'Replies\' : \'Reply\'" matTooltipPosition="below" (click)="select()">\r\n <mat-icon [inline]="true">comment</mat-icon>\r\n <span class="count-indicator">\r\n {{replyCount > 0 ? \'Replies\' : \'Reply\'}}\r\n {{replyCount > 0 ? \'(\' + replyCount + \')\' : \'\'}}\r\n </span>\r\n </button>\r\n </div>\r\n <div class="counted-action" [class.active]="message.userState?.liked">\r\n <button \r\n *ngIf="message.transientState?.liking"\r\n mat-icon-button \r\n [disabled]="true" \r\n [matTooltip]="upvoting ? \'Please wait...\' : message.userState?.liked ? \'Unlike\' : \'Like\'" \r\n matTooltipPosition="below" \r\n >\r\n <mat-spinner [diameter]="15" style="margin-left: 1em;"></mat-spinner>\r\n </button>\r\n <button \r\n *ngIf="!message.transientState?.liking"\r\n mat-button \r\n [matTooltip]="permissions?.canLike ? upvoting ? \'Please wait...\' : \'Like\' : permissions?.canLikeErrorMessage" \r\n matTooltipPosition="below" \r\n (click)="message.userState?.liked ? unlike() : like()" \r\n >\r\n <mat-icon [inline]="true">thumb_up</mat-icon>\r\n <span class="count-indicator" *ngIf="message.likes > 0">\r\n {{message.likes}}\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <button mat-icon-button [matMenuTriggerFor]="pointItemMenu">\r\n <mat-icon [inline]="true">more_vert</mat-icon>\r\n </button>\r\n </div>\r\n</div>\r\n',styles:["@-webkit-keyframes comment-appear{0%{transform:translate(6em)}to{transform:translate(0)}}@keyframes comment-appear{0%{transform:translate(6em)}to{transform:translate(0)}}:host{display:flex;flex-direction:column;position:relative;padding:.5em;visibility:hidden}:host.new{visibility:visible;-webkit-animation-name:comment-appear;animation-name:comment-appear;-webkit-animation-duration:.25s;animation-duration:.25s;-webkit-animation-fill-mode:both;animation-fill-mode:both}:host.highlighted{background:#00223a;outline:2px solid #003277}:host.visible{visibility:visible}:host:hover{background:#eee}:host .message-content .content{margin-left:60px;margin-right:.5em}:host .message-content .attachments-row{margin-top:15px;display:flex;gap:10px}:host .message-content .attachments-row img{border-radius:10px;width:300px;max-width:100%;max-height:20em;-o-object-fit:cover;object-fit:cover}:host.abbreviated .message-content .content{text-overflow:ellipsis;overflow-y:hidden}:host .actions{display:flex;padding-right:10px;margin-left:60px;align-items:center}:host .actions button,banta-timestamp{color:#666;flex-shrink:0}banta-timestamp{font-size:10pt;margin-left:1em;text-align:right}.user{position:relative;margin:1em 0 0;display:flex;align-items:center;flex-wrap:wrap}.user .user-1,.user .user-2{display:flex;flex-wrap:nowrap;align-items:center;min-width:0}.user .user-2{margin:1em 0}.user .user-identity{display:flex;flex-direction:column;min-width:0}.user .display-name,.user .username{z-index:1;position:relative;padding:0 0 0 1em;font-size:10pt;color:#000;margin:0 auto 0 0;display:block;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;flex-shrink:1;flex-grow:0;min-width:0}.user .display-name.username.username.username,.user .username.username.username.username{color:#666}.avatar{height:48px;width:48px;background-position:50%;background-size:cover;background-color:#333;border-radius:100%;flex-shrink:0;flex-grow:0}.counted-action{display:flex;align-items:center}.counted-action.active .count-indicator,.counted-action.active button{color:#00a5ff}.counted-action button .count-indicator{margin-left:.5em}.count-indicator{font-size:9pt;padding:0 0 0 3px;color:#666}:host-context(.mat-dark-theme) .count-indicator{border-color:#333}:host-context(.mat-dark-theme):hover{background:#060606}.user-tag,:host-context(.mat-dark-theme) .user .display-name,:host-context(.mat-dark-theme) .user .username{color:#fff}.user-tag{text-transform:uppercase;font-size:12px;border:1px solid #b27373;background:#7a412b;padding:3px 5px;margin:0 .5em 0 1em;border-radius:3px}.spacer{flex-shrink:1;flex-grow:1}ul.message-facts{margin:0;padding:0;color:#666}ul.message-facts li{list-style-type:none;border-left:1px solid #666;font-size:10pt;padding-left:.5em;margin-left:.5em;margin-top:.5em}ul.message-facts li:first-child{border-left:1px solid transparent;margin-left:0;padding-left:0}@media (max-width:400px){.avatar{height:32px;width:32px}:host .actions{margin-left:0;margin-top:.5em}:host .message-content .content{margin-left:44px;margin-right:.5em}}:host-context(.banta-mobile) .avatar{height:32px;width:32px}:host-context(.banta-mobile) :host .actions{margin-left:0;margin-top:.5em}:host-context(.banta-mobile) :host .message-content .content{margin-left:44px;margin-right:.5em}.card-attachment a{display:flex;align-items:flex-start;gap:1em;width:100%;border:1px solid #666;border-radius:4px;padding:1em;box-sizing:border-box;background-color:#191919}.card-attachment a img{width:300px;aspect-ratio:16/9;-o-object-fit:cover;object-fit:cover;border-radius:10px}.card-attachment a h1{margin:0;font-size:30px}"]}]}],ae.ctorParameters=function(){return[{type:a.ElementRef}]},ae.propDecorators={maxLength:[{type:a.Input}],isNew:[{type:a.HostBinding,args:["class.new"]}],isHighlighted:[{type:a.HostBinding,args:["class.highlighted"]}],visible:[{type:a.HostBinding,args:["class.visible"]}],message:[{type:a.Input}],customMenuItems:[{type:a.Input}],showReplyAction:[{type:a.Input}],loaded:[{type:a.Output}],userSelected:[{type:a.Output}],usernameSelected:[{type:a.Output}],avatarSelected:[{type:a.Output}],reported:[{type:a.Output}],permissions:[{type:a.Input}],mine:[{type:a.Input}],editing:[{type:a.Input}],liked:[{type:a.Output}],unliked:[{type:a.Output}],selected:[{type:a.Output}],edited:[{type:a.Output}],deleted:[{type:a.Output}],editStarted:[{type:a.Output}],editEnded:[{type:a.Output}],shared:[{type:a.Output}],genericAvatarUrl:[{type:a.Input}],commentId:[{type:a.HostBinding,args:["attr.data-comment-id"]}]};var ne=function(){function e(e){var r=this;this.backend=e,this._sourceSubs=new t.Subscription,this._selected=new t.Subject,this._liked=new t.Subject,this._unliked=new t.Subject,this._reported=new t.Subject,this._userSelected=new t.Subject,this._usernameSelected=new t.Subject,this._avatarSelected=new t.Subject,this._shared=new t.Subject,this._deleted=new t.Subject,this._messageEdited=new t.Subject,this.showEmptyState=!0,this.allowReplies=!0,this.customMenuItems=[],this.menuMessage=null,this.messages=[],this.customSortEnabled=!1,this.sourceLoaded=new Promise((function(e){return r.markSourceLoaded=e})),this.maxMessages=2e3,this.maxVisibleMessages=200,this.newestLast=!1,this.isViewingMore=!1,this.isLoadingMore=!1,this.hasMore=!1,this.newMessages=[],this.olderMessages=[],this.sortOrderChanged=new t.Subject}return Object.defineProperty(e.prototype,"comments",{get:function(){return Array.from(this.commentsQuery)},enumerable:!1,configurable:!0}),e.prototype.isMessageLoadedInContext=function(e){return this.olderMessages.find((function(t){return t.id===e.id}))||this.messages.find((function(t){return t.id===e.id}))||this.newMessages.find((function(t){return t.id===e.id}))},e.prototype.loadMessageInContext=function(e){return D(this,void 0,void 0,(function(){var t,r,a,n;return R(this,(function(o){switch(o.label){case 0:return[4,this.sourceLoaded];case 1:o.sent(),console.log("Loading message "+e.id+" in context..."),o.label=2;case 2:return!this.hasMore||this.isMessageLoadedInContext(e)?[3,4]:(console.log("...Need to load more comments to find "+e.id),[4,this.showMore()]);case 3:return o.sent(),[3,2];case 4:return this.isMessageLoadedInContext(e)?(t=this.maxVisibleMessages,r=[].concat(this.olderMessages,this.messages,this.newMessages),(a=r.findIndex((function(t){return t.id===e.id})))<0?(console.error("Error while loading message in context: Message was not present in message list!"),[2,!1]):(n=Math.max(0,a-t/2),this.newMessages=r.splice(0,n),this.messages=r.splice(0,t),this.olderMessages=r,this.isViewingMore=!0,[2])):(console.error("Error while loading message in context: Failed to find message "+e.id+", maybe it was deleted!"),[2,!1])}}))}))},e.prototype.getCommentComponentForMessage=function(e){if(!e)throw new Error("You must pass a valid ChatMessage");return this.comments.find((function(t){var r;return(null===(r=t.message)||void 0===r?void 0:r.id)===e.id}))},Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"messageEdited",{get:function(){return this._messageEdited.asObservable()},enumerable:!1,configurable:!0}),e.prototype.saveEdit=function(e,t){this._messageEdited.next({message:e,newMessage:t})},Object.defineProperty(e.prototype,"userSelected",{get:function(){return this._userSelected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"reported",{get:function(){return this._reported},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"liked",{get:function(){return this._liked},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"unliked",{get:function(){return this._unliked},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"usernameSelected",{get:function(){return this._usernameSelected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"avatarSelected",{get:function(){return this._avatarSelected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"shared",{get:function(){return this._shared},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"deleted",{get:function(){return this._deleted},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"source",{get:function(){return this._source},set:function(e){var r=this;if(this.customSortEnabled=(null==e?void 0:e.sortOrder)!==f.CommentsOrder.NEWEST,this.newMessages=[],this.olderMessages=[],window.bantaSourceDebug=e,this._sourceSubs&&(this._sourceSubs.unsubscribe(),this._sourceSubs=null),this._source=e,e){var a=(e.messages||[]).slice();this.messages=a,this.olderMessages=a.splice(this.maxVisibleMessages,a.length),this.hasMore=!0,this._sourceSubs=new t.Subscription,this._sourceSubs.add(this._source.messageReceived.subscribe((function(e){return r.messageReceived(e)}))),this._sourceSubs.add(this._source.messageSent.subscribe((function(e){return r.messageSent(e)}))),this._sourceSubs.add(this.backend.userChanged.subscribe((function(e){return r.currentUser=e}))),this.getInitialMessages()}},enumerable:!1,configurable:!0}),e.prototype.likeMessage=function(e){this._liked.next(e)},e.prototype.unlikeMessage=function(e){this._unliked.next(e)},e.prototype.reportMessage=function(e){this._reported.next(e)},e.prototype.selectMessage=function(e){this._selected.next(e)},e.prototype.selectMessageUser=function(e){this._userSelected.next(e)},e.prototype.selectUsername=function(e){this._usernameSelected.next(e)},e.prototype.selectAvatar=function(e){this._avatarSelected.next(e)},e.prototype.sharedMessage=function(e){this._shared.next(e)},e.prototype.startEditing=function(e){this.messages.forEach((function(e){return e.transientState.editing=!1})),e.transientState.editing=!0},e.prototype.deleteMessage=function(e){this._deleted.next(e)},e.prototype.getInitialMessages=function(){return D(this,void 0,void 0,(function(){var e;return R(this,(function(t){switch(t.label){case 0:return[4,this._source.getExistingMessages()];case 1:return(e=t.sent()).forEach((function(e){var t;return null!==(t=e.transientState)&&void 0!==t?t:e.transientState={}})),this.messages=this.newestLast?e.slice().reverse():e,this.sortMessages(),this.markSourceLoaded&&this.markSourceLoaded(),[2]}}))}))},e.prototype.messageIdentity=function(e,t){return t.id},e.prototype.showNew=function(){return D(this,void 0,void 0,(function(){var e,t;return R(this,(function(r){return e=f.CommentsOrder.NEWEST,this.source&&this.source.sortOrder!==e?(this.sortOrderChanged.next(e),[2]):(this.isViewingMore=!1,this.newestLast?this.messages=this.messages.concat(this.newMessages.splice(0,this.newMessages.length)):this.messages=this.newMessages.splice(0,this.newMessages.length).concat(this.messages),t=this.messages.splice(this.maxVisibleMessages,this.messages.length),this.olderMessages=t.concat(this.olderMessages),this.olderMessages.splice(this.maxMessages-this.maxVisibleMessages,this.olderMessages.length),this.hasMore=this.olderMessages.length>0,[2])}))}))},e.prototype.showMore=function(){var e,t;return D(this,void 0,void 0,(function(){var r,a;return R(this,(function(n){switch(n.label){case 0:return this.isViewingMore=!0,this.olderMessages.length>0&&(this.isLoadingMore=!1,this.messages=this.messages.concat(this.olderMessages.splice(0,50))),this.isLoadingMore=!0,20,(r=this.newestLast?null!==(e=this.olderMessages[0])&&void 0!==e?e:this.messages[0]:null!==(t=this.olderMessages[this.olderMessages.length-1])&&void 0!==t?t:this.messages[this.messages.length-1])?[4,this.source.loadAfter(r,20)]:(this.isLoadingMore=!1,this.hasMore=!1,[2]);case 1:return a=n.sent(),this.newestLast&&(a=a.slice().reverse()),a.forEach((function(e){var t;return null!==(t=e.transientState)&&void 0!==t?t:e.transientState={}})),this.newestLast?this.messages=a.concat(this.messages):this.messages=this.messages.concat(a),this.isLoadingMore=!1,0===a.length&&(console.log("Reached the end of the list."),this.hasMore=!1),[2]}}))}))},e.prototype.addMessage=function(e){var t;e.transientState||null!==(t=e.transientState)&&void 0!==t||(e.transientState={});var r=this.messages,a=this.olderMessages,n=this.newestLast;if(this.isViewingMore&&(r=this.newMessages,a=null),n){r.push(e);var o=r.splice(this.maxVisibleMessages,r.length);null==a||a.push.apply(a,V(o))}else{r.unshift(e);o=r.splice(this.maxVisibleMessages,r.length);null==a||a.unshift.apply(a,V(o))}(null==a?void 0:a.length)>0&&(this.hasMore=!0),e.pagingCursor=String(this.incrementPagingCursors()),this.sortMessages()},e.prototype.incrementPagingCursors=function(){var e,t,r,a;if(this.source.sortOrder===f.CommentsOrder.NEWEST){var n=0;try{for(var o=U([this.messages,this.olderMessages,this.newMessages]),s=o.next();!s.done;s=o.next()){var i=s.value;try{for(var c=(r=void 0,U(i)),l=c.next();!l.done;l=c.next()){var d=l.value;if(d.pagingCursor){var u=Number(d.pagingCursor)+1;u>n&&(n=u),d.pagingCursor=String(u)}}}catch(e){r={error:e}}finally{try{l&&!l.done&&(a=c.return)&&a.call(c)}finally{if(r)throw r.error}}}}catch(t){e={error:t}}finally{try{s&&!s.done&&(t=o.return)&&t.call(o)}finally{if(e)throw e.error}}return n}},e.prototype.waitForAllCommentsToLoad=function(){return D(this,void 0,void 0,(function(){return R(this,(function(e){switch(e.label){case 0:return[4,new Promise((function(e){return setTimeout(e,100)}))];case 1:return e.sent(),[4,this.sourceLoaded];case 2:return e.sent(),[4,Promise.all(this.comments.map((function(e){return e.waitForLoad()})))];case 3:return e.sent(),[2]}}))}))},e.prototype.sortMessages=function(){var e,t=this;this.source&&(this.source.sortOrder===f.CommentsOrder.LIKES?e=function(e,t){return t.likes-e.likes}:this.source.sortOrder===f.CommentsOrder.NEWEST?e=function(e,r){return(r.sentAt-e.sentAt)*(t.newestLast?-1:1)}:this.source.sortOrder===f.CommentsOrder.OLDEST&&(e=function(e,r){return(e.sentAt-r.sentAt)*(t.newestLast?-1:1)}),this.messages.sort(e),this.olderMessages.sort(e),this.newMessages.sort(e))},e.prototype.messageReceived=function(e){var t=this;this.addMessage(e),this.isScrolledToLatest()&&setTimeout((function(){return t.scrollToLatest()}))},e.prototype.isScrolledToLatest=function(){if(!this.messageContainer)return!1;var e=this.messageContainer.nativeElement;return e.scrollTop>e.scrollHeight-e.offsetHeight-10},e.prototype.messageSent=function(e){this.addMessage(e),this.messageContainer&&this.scrollToLatest()},e.prototype.scrollToLatest=function(){if(this.messageContainer){var e=this.messageContainer.nativeElement;e.scrollTop=e.scrollHeight}},e.prototype.mentionsMe=function(e){return!!this.currentUser&&!!e.message.includes("@"+this.currentUser.username)},e}();ne.decorators=[{type:a.Component,args:[{selector:"banta-comment-view",template:'<div class="message-container">\r\n <ng-content select="[data-before]"></ng-content>\r\n\r\n <a mat-button class="nav" [class.visible]="!newestLast && (isViewingMore || customSortEnabled)" href="javascript:;" (click)="showNew()">\r\n <mat-icon>file_upload</mat-icon>\r\n New\r\n <ng-container *ngIf="newMessages.length >= 1">\r\n ({{newMessages.length}})\r\n </ng-container>\r\n </a>\r\n <a mat-button class="nav" [class.visible]="newestLast && hasMore && !isLoadingMore" href="javascript:;" (click)="showMore()">Show earlier</a>\r\n\r\n <ng-container *ngIf="messages.length === 0">\r\n <div class="empty-state" *ngIf="showEmptyState">\r\n Be the first to comment!\r\n </div>\r\n </ng-container>\r\n <ng-container *ngFor="let message of messages; trackBy: messageIdentity">\r\n <banta-comment\r\n *ngIf="!message.hidden"\r\n class="abbreviated"\r\n \r\n [customMenuItems]="customMenuItems"\r\n [message]="message"\r\n [mine]="currentUser?.id === message.user?.id"\r\n [permissions]="source?.permissions"\r\n [showReplyAction]="allowReplies"\r\n [editing]="message.transientState.editing"\r\n [genericAvatarUrl]="genericAvatarUrl"\r\n (click)="isViewingMore = true"\r\n (editStarted)="startEditing(message)"\r\n (deleted)="deleteMessage(message)"\r\n (editEnded)="message.transientState.editing = false"\r\n (edited)="saveEdit(message, $event)"\r\n (userSelected)="selectMessageUser(message)"\r\n (avatarSelected)="selectAvatar($event)"\r\n (usernameSelected)="selectUsername($event)"\r\n (liked)="likeMessage(message)"\r\n (unliked)="unlikeMessage(message)"\r\n (reported)="reportMessage(message)"\r\n (selected)="selectMessage(message)"\r\n (shared)="sharedMessage($event)"\r\n ></banta-comment>\r\n <div class="inline-replies-container" *ngIf="selectedMessage === message">\r\n <ng-content select=".inline-replies"></ng-content>\r\n </div>\r\n </ng-container>\r\n\r\n <a mat-button class="nav" [class.visible]="newestLast && (isViewingMore || customSortEnabled)" href="javascript:;" (click)="showNew()">\r\n <mat-icon>file_download</mat-icon>\r\n New\r\n <ng-container *ngIf="newMessages.length >= 1">\r\n ({{newMessages.length}})\r\n </ng-container>\r\n </a>\r\n <a mat-button class="nav" [class.visible]="!newestLast && hasMore && !isLoadingMore" href="javascript:;" (click)="showMore()">Show more</a>\r\n\r\n <div class="loading-more" *ngIf="isLoadingMore">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n\r\n \x3c!-- <div style="color: #666">\r\n n={{newMessages.length}}, m={{messages.length}}, o={{olderMessages.length}},\r\n v={{maxVisibleMessages}}, M={{maxMessages}}\r\n </div> --\x3e\r\n\r\n <ng-content select=":not([data-before]):not(.inline-replies)"></ng-content>\r\n</div>\r\n',styles:[":host{flex-grow:1;display:flex;flex-direction:column;opacity:1;transition:opacity .2s ease-in}.message-container{flex-grow:1;overflow-x:hidden;color:#111;background:#fff;padding:.5em 1em 3em .5em;opacity:1;transition:opacity .5s ease-in-out;position:relative}.message-container.no-scroll{height:auto;overflow-y:visible}.message-container.faded{opacity:.25}.message-container .overlay{position:absolute;top:0;left:0;right:0;bottom:0;z-index:10}:host.fixed-height .message-container{overflow-y:auto}:host-context(.mat-dark-theme) .message-container{color:#fff;background:#111}.empty-state{text-align:center;margin:3em;color:#666}:host-context(.mat-dark-theme) .empty-state{color:#666}a.nav{position:absolute;right:.5em;z-index:10;text-align:center;opacity:0;transition:opacity .4s ease-in-out;pointer-events:none;border-radius:2em;background:#222}a.nav.visible{opacity:1;pointer-events:auto}.loading-more{padding:2em;text-align:center;margin:0 auto;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}@media (max-width:400px){.message-container{padding:0 0 3em}}"]}]}],ne.ctorParameters=function(){return[{type:Y}]},ne.propDecorators={showEmptyState:[{type:a.Input}],allowReplies:[{type:a.Input}],customMenuItems:[{type:a.Input}],commentsQuery:[{type:a.ViewChildren,args:[ae]}],fixedHeight:[{type:a.Input},{type:a.HostBinding,args:["class.fixed-height"]}],selectedMessage:[{type:a.Input}],selected:[{type:a.Output}],messageEdited:[{type:a.Output}],userSelected:[{type:a.Output}],reported:[{type:a.Output}],liked:[{type:a.Output}],unliked:[{type:a.Output}],usernameSelected:[{type:a.Output}],avatarSelected:[{type:a.Output}],shared:[{type:a.Output}],deleted:[{type:a.Output}],source:[{type:a.Input}],genericAvatarUrl:[{type:a.Input}],messageContainer:[{type:a.ViewChild,args:["messageContainer"]}],maxMessages:[{type:a.Input}],maxVisibleMessages:[{type:a.Input}],newestLast:[{type:a.Input}],sortOrderChanged:[{type:a.Output}]};var oe=function(){};oe.decorators=[{type:a.Directive,args:[{selector:"[bantaReplySendOptions]"}]}];var se=function(){function e(e,r,a,n,o){var s=this;this.backend=e,this.elementRef=r,this.activatedRoute=a,this.matSnackBar=n,this.ngZone=o,this.isMobileSized=!1,this.viewReady=new Promise((function(e){return s.markViewReady=e})),this._loadingMessage="",this.loadingMessageVisible=!1,this.loading=!0,this.showLoadingScreen=!1,this.customMenuItems=[],this._loadingMessageIndex=0,this.maxCommentLength=1500,this.loadingMessages=["Just a second...","We're definitely working on it.","There's no need to refresh.","It's definitely worth the wait!","This has never happened before.","We'll keep trying, but it's not looking great. \n Commenting & chat services may be down. \n If you continue to experience issues, please contact support.\n "],this.useInlineReplies=!0,this.loaded=new Promise((function(e){return s.markLoaded=e})),this._signInSelected=new t.Subject,this._permissionDeniedError=new t.Subject,this._editAvatarSelected=new t.Subject,this._upvoted=new t.Subject,this._reported=new t.Subject,this._selected=new t.Subject,this._userSelected=new t.Subject,this._shared=new t.Subject,this._usernameSelected=new t.Subject,this._avatarSelected=new t.Subject,this._sourceIsOwned=!1,this._subs=new t.Subscription,this._sortOrder=f.CommentsOrder.NEWEST,this.selectedMessageVisible=!1,this.signInLabel="Sign In",this.sendLabel="Send",this.replyLabel="Reply",this.sendingLabel="Sending",this.permissionDeniedLabel="Send",this.postCommentLabel="Post a comment",this.postReplyLabel="Post a reply",this.allowAttachments=!0,this.maxVisibleMessages=20,this.genericAvatarUrl="https://gravatar.com/avatar/"+Date.now().toString(16)+"?s=512&d=robohash",this.participants=[],this.hashtags=[{hashtag:"error",description:"Cause an error"},{hashtag:"timeout",description:"Cause a slow timeout error"},{hashtag:"slow",description:"Be slow when this message is posted"}],this.loadingSharedComment=!1,this.sharedCommentMissing=!1,this.sendMessage=function(e){return D(s,void 0,void 0,(function(){var t,r;return R(this,(function(a){switch(a.label){case 0:return a.trys.push([0,4,,5]),[4,null===(t=this.shouldInterceptMessageSend)||void 0===t?void 0:t.call(this,e,this.source)];case 1:return a.sent()?[3,3]:[4,this.source.send(e)];case 2:a.sent(),a.label=3;case 3:return this.source.sortOrder!==f.CommentsOrder.NEWEST&&(this.sortOrder=f.CommentsOrder.NEWEST),[2,!0];case 4:return r=a.sent(),this.handleBackendException(r,"Could not send: "),[3,5];case 5:return[2]}}))}))},this.sendReply=function(e){return D(s,void 0,void 0,(function(){var t,r;return R(this,(function(a){switch(a.label){case 0:return a.trys.push([0,4,,5]),[4,null===(t=this.shouldInterceptMessageSend)||void 0===t?void 0:t.call(this,e,this.selectedMessageThread)];case 1:return a.sent()?[3,3]:[4,this.selectedMessageThread.send(e)];case 2:a.sent(),a.label=3;case 3:return[2,!0];case 4:return r=a.sent(),this.handleBackendException(r,"Could not send reply: "),[3,5];case 5:return[2]}}))}))}}return Object.defineProperty(e.prototype,"element",{get:function(){return this.elementRef.nativeElement},enumerable:!1,configurable:!0}),e.prototype.handleBackendExceptionAsAlert=function(e,t){void 0===t&&(t="");try{this.handleBackendException(e,t)}catch(e){alert(e.message)}},e.prototype.handleBackendException=function(e,t){void 0===t&&(t="");var r=e.message;if(!r.startsWith("permission-denied|")||!(r=r.replace(/^permission-denied\|/,"")).startsWith("app-handle|"))throw new Error(""+t+r);this.sendPermissionDenied(r.replace(/^app-handle\|/,""))},e.prototype.ngOnInit=function(){var e=this;if(this._subs.add(this.backend.userChanged.subscribe((function(t){return e.user=t}))),this.startLoading(),"undefined"!=typeof window){var t=window.location.search.substring(1).split("&").map((function(e){return e.split("=")})).reduce((function(e,t){var r=F(t,2),a=r[0],n=r[1];return e[decodeURIComponent(a)]=decodeURIComponent(n),e}),{}).comment;t&&(this.sharedCommentID=t)}},e.prototype.ngAfterViewInit=function(){var e=this;if("undefined"!=typeof window){var t=function(){var t=e.elementRef.nativeElement.getBoundingClientRect();e.ngZone.run((function(){setTimeout((function(){e.width=t.width,e.height=t.height,e.isMobileSized=e.width<500}))}))};"undefined"!=typeof ResizeObserver?(this.resizeObserver=new ResizeObserver(t),this.resizeObserver.observe(this.elementRef.nativeElement)):setTimeout((function(){e.width=e.elementRef.nativeElement.clientWidth,e.height=e.elementRef.nativeElement.clientHeight,e.isMobileSized=e.width<500}),1e3),t()}this.markViewReady()},e.prototype.ngOnDestroy=function(){this._subs.unsubscribe(),this.resizeObserver&&this.resizeObserver.disconnect()},e.prototype.setSourceFromTopicID=function(e){return D(this,void 0,void 0,(function(){var t=this;return R(this,(function(r){return"undefined"==typeof window||setTimeout((function(){return D(t,void 0,void 0,(function(){var t;return R(this,(function(r){switch(r.label){case 0:return console.log("[banta-comments] Subscribing to topic source '"+e+"'"),t=this,[4,this.backend.getSourceForTopic(e,{sortOrder:this.sortOrder})];case 1:return t.source=r.sent(),this._sourceIsOwned=!0,[2]}}))}))})),[2]}))}))},Object.defineProperty(e.prototype,"loadingMessage",{get:function(){return this._loadingMessage},set:function(e){var t=this;this.loadingMessageVisible=!1,setTimeout((function(){t._loadingMessage=e,t._loadingMessage=e,setTimeout((function(){t.loadingMessageVisible=!0}))}),500)},enumerable:!1,configurable:!0}),e.prototype.startLoading=function(){return D(this,void 0,void 0,(function(){var e=this;return R(this,(function(t){switch(t.label){case 0:return this.loadingStartedAt=this.messageChangedAt=Date.now(),this.updateLoading()?[2]:[4,new Promise((function(e){return setTimeout((function(){return e()}),100)}))];case 1:return t.sent(),this.updateLoading()?[2]:[4,new Promise((function(e){return setTimeout((function(){return e()}),250)}))];case 2:return t.sent(),this.updateLoading()?[2]:[4,new Promise((function(e){return setTimeout((function(){return e()}),500)}))];case 3:return t.sent(),this.updateLoading()?[2]:(console.log("[Banta] Loading is taking a long time! Showing loading screen."),this.showLoadingScreen=!0,"undefined"!=typeof window&&(this._loadingTimer=setInterval((function(){return e.updateLoading()}),1e3)),[2])}}))}))},e.prototype.getCommentComponentForMessage=function(e){var t;return e.parentMessageId?null===(t=this.threadView)||void 0===t?void 0:t.getCommentComponentForMessage(e):this.commentView.getCommentComponentForMessage(e)},Object.defineProperty(e.prototype,"threadView",{get:function(){var e=this;return Array.from(this.threadViewQuery).filter((function(t){return t!==e.commentView}))[0]},enumerable:!1,configurable:!0}),e.prototype.waitForThreadView=function(){return D(this,void 0,void 0,(function(){return R(this,(function(e){switch(e.label){case 0:return this.threadView?[2,this.threadView]:[4,this.threadViewQuery.changes.pipe(r.take(1)).toPromise()];case 1:return e.sent(),[2,this.threadView]}}))}))},e.prototype.updateLoading=function(){var e,t,r=this;if((null===(e=this.source)||void 0===e?void 0:e.state)&&"connecting"!==(null===(t=this.source)||void 0===t?void 0:t.state))return clearInterval(this._loadingTimer),this.loadingMessage="Here we go!",setTimeout((function(){r.loading=!1,r.markLoaded()}),750),!0;return this.messageChangedAt+5e3<Date.now()&&this.loadingMessages[this._loadingMessageIndex]&&(this.loadingMessage=this.loadingMessages[this._loadingMessageIndex++],this.messageChangedAt=Date.now()),!1},Object.defineProperty(e.prototype,"source",{get:function(){return this._source},set:function(e){var r,a=this;this._source&&this._sourceIsOwned&&(this._source.close(),null===(r=this._sourceSubscription)||void 0===r||r.unsubscribe(),this._source=null,this.participants=[]),this._source=e,this._sourceIsOwned=!1,this._sourceSubscription=new t.Subscription,e&&(this.sharedCommentID&&(this.navigateToSharedComment(this.sharedCommentID),this.lastSharedCommentID=this.sharedCommentID,this.sharedCommentID=null),this._source.messages.forEach((function(e){return a.addParticipant(e)})),this._sourceSubscription.add(this._source.messageReceived.subscribe((function(e){return a.addParticipant(e)}))),this._sourceSubscription.add(this._source.messageSent.subscribe((function(e){return a.addParticipant(e)}))),this._sourceSubscription.add(this._source.messageObserved.subscribe((function(e){return a.addParticipant(e)}))),this._sourceSubscription.add(this._source.messageUpdated.subscribe((function(e){var t;console.log("comments received message: ",e),e.id===(null===(t=a.selectedMessage)||void 0===t?void 0:t.id)&&e.hidden&&(a.unselectMessage(),a.matSnackBar.open("The thread you were viewing was removed.",void 0,{duration:2500}))}))))},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"topicID",{get:function(){return this._topicID},set:function(e){var t=this;this._topicID!==e&&(this._topicID=e,setTimeout((function(){return t.setSourceFromTopicID(e)})))},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"signInSelected",{get:function(){return this._signInSelected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"editAvatarSelected",{get:function(){return this._editAvatarSelected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"permissionDeniedError",{get:function(){return this._permissionDeniedError},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"upvoted",{get:function(){return this._upvoted.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"reported",{get:function(){return this._reported.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"userSelected",{get:function(){return this._userSelected.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"usernameSelected",{get:function(){return this._usernameSelected.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"avatarSelected",{get:function(){return this._avatarSelected.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"shared",{get:function(){return this._shared.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"sortOrder",{get:function(){return this._sortOrder},set:function(e){var t=this;this._sortOrder!==e&&(this._sortOrder=e,setTimeout((function(){t.setSourceFromTopicID(t.topicID)})))},enumerable:!1,configurable:!0}),e.prototype.scrollToComment=function(e){return D(this,void 0,void 0,(function(){var t;return R(this,(function(r){switch(r.label){case 0:return"undefined"==typeof window?[2]:[4,this.commentView.waitForAllCommentsToLoad()];case 1:return r.sent(),(t=document.querySelector('[data-comment-id="'+e+'"]'))&&t.scrollIntoView({inline:"center",block:"center"}),[2]}}))}))},e.prototype.navigateToSharedComment=function(e){var t,r,a,n;return D(this,void 0,void 0,(function(){var o,s,i,c,l=this;return R(this,(function(d){switch(d.label){case 0:return this.loadingSharedComment=!0,[4,new Promise((function(e){return setTimeout(e,10)}))];case 1:return d.sent(),this.sharedCommentMissing=!1,[4,this.source.ready];case 2:return d.sent(),[4,this.viewReady];case 3:return d.sent(),[4,this.loaded];case 4:d.sent(),console.log("Navigating to shared comment with ID '"+e+"'..."),d.label=5;case 5:return d.trys.push([5,7,,8]),[4,this.source.get(e)];case 6:return o=d.sent(),[3,8];case 7:return s=d.sent(),console.error("Failed to find comment from URL: "+s.message),this.sharedCommentMissing=!0,this.loadingSharedComment=!1,"undefined"!=typeof window&&setTimeout((function(){l.element.querySelector(".loading-comment").scrollIntoView({block:"center",inline:"center"})}),200),[2];case 8:return null!==(t=o.transientState)&&void 0!==t||(o.transientState={}),o.parentMessageId?[4,this.source.get(o.parentMessageId)]:[3,17];case 9:return i=d.sent(),null!==(r=i.transientState)&&void 0!==r||(i.transientState={}),[4,this.commentView.loadMessageInContext(i)];case 10:return d.sent(),[4,this.selectMessage(i)];case 11:return[4,(c=d.sent()).ready];case 12:return d.sent(),[4,this.waitForThreadView()];case 13:return d.sent(),[4,this.threadView.loadMessageInContext(o)];case 14:return d.sent(),[4,c.get(o.id)];case 15:return o=d.sent(),null!==(a=o.transientState)&&void 0!==a||(o.transientState={}),o.transientState.highlighted=!0,console.dir(o),[4,new Promise((function(e){return setTimeout((function(){return e()}),500)}))];case 16:return d.sent(),[3,19];case 17:return[4,this.commentView.loadMessageInContext(o)];case 18:d.sent(),null!==(n=o.transientState)&&void 0!==n||(o.transientState={}),o.transientState.highlighted=!0,d.label=19;case 19:return this.loadingSharedComment=!1,[4,this.scrollToComment(e)];case 20:return d.sent(),[2]}}))}))},e.prototype.handlePermissionDenied=function(e){e.startsWith("app-handle|")?this.sendPermissionDenied(e.replace(/^app-handle\|/,"")):alert(e)},e.prototype.sendPermissionDenied=function(e){this._permissionDeniedError.next(e)},e.prototype.scrollToMessage=function(e){var t=this.elementRef.nativeElement.querySelector('[data-comment-id="'+e.id+'"]');t&&t.scrollIntoView({block:"center",inline:"start"})},e.prototype.addParticipant=function(e){e&&e.user&&e.user.id&&(this.participants.find((function(t){return t.id===e.user.id}))||this.participants.push(e.user))},e.prototype.likeMessage=function(e,t){return D(this,void 0,void 0,(function(){var r;return R(this,(function(a){switch(a.label){case 0:return this.user?[3,2]:[4,this.showSignIn()];case 1:return a.sent(),[2];case 2:this._upvoted.next(t),t.transientState.liking=!0,a.label=3;case 3:return a.trys.push([3,5,6,8]),[4,e.likeMessage(t.id)];case 4:return a.sent(),[3,8];case 5:return r=a.sent(),this.handleBackendExceptionAsAlert(r,"Could not like this message: "),[3,8];case 6:return[4,new Promise((function(e){return setTimeout((function(){return e()}),250)}))];case 7:return a.sent(),t.transientState.liking=!1,[7];case 8:return[2]}}))}))},e.prototype.unlikeMessage=function(e,t){var r;return D(this,void 0,void 0,(function(){var a;return R(this,(function(n){switch(n.label){case 0:return this.user?[3,2]:[4,this.showSignIn()];case 1:return n.sent(),[2];case 2:this._upvoted.next(t),t.transientState.liking=!0,(null===(r=t.userState)||void 0===r?void 0:r.liked)&&(t.likes=(t.likes||0)-1),n.label=3;case 3:return n.trys.push([3,5,,6]),[4,e.unlikeMessage(t.id)];case 4:return n.sent(),[3,6];case 5:return a=n.sent(),this.handleBackendExceptionAsAlert(a,"Failed to unlike this message: "),[3,6];case 6:return[4,new Promise((function(e){return setTimeout((function(){return e()}),250)}))];case 7:return n.sent(),t.transientState.liking=!1,[2]}}))}))},e.prototype.reportMessage=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){return this._reported.next(e),[2]}))}))},e.prototype.unselectMessage=function(){return D(this,void 0,void 0,(function(){var e,t=this;return R(this,(function(r){return e=this.selectedMessage,this._selected.next(null),this.selectedMessage=null,this.selectedMessageThread&&(this.selectedMessageThread.close&&this.selectedMessageThread.close(),this.selectedMessageThread=null),e&&setTimeout((function(){return t.scrollToMessage(e)})),[2]}))}))},e.prototype.toggleSelectedMessage=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){switch(t.label){case 0:return this.selectedMessage!==e?[3,2]:[4,this.unselectMessage()];case 1:return t.sent(),[3,4];case 2:return[4,this.selectMessage(e)];case 3:t.sent(),t.label=4;case 4:return[2]}}))}))},e.prototype.selectMessage=function(e){return D(this,void 0,void 0,(function(){var t,r=this;return R(this,(function(a){switch(a.label){case 0:return this.selectedMessage===e?(console.log("[Banta] Thread "+this.topicID+"/"+e.id+" is already open."),[2,this.selectedMessageThread]):(this._selected.next(e),console.log("[Banta] Opening thread for "+this.topicID+"/"+e.id+"..."),[4,this.backend.getSourceForThread(this.topicID,e.id)]);case 1:return(t=a.sent())?(console.log("[Banta] Thread opened for "+this.topicID+"/"+e.id+"."),setTimeout((function(){return r.selectedMessageVisible=!0})),setTimeout((function(){return D(r,void 0,void 0,(function(){return R(this,(function(r){return this.selectedMessage=e,this.selectedMessageThread=t,[2]}))}))}),250),[2,t]):(console.warn("Failed to locate thread for message "+this.topicID+"/"+e.id+"!"),[2,null])}}))}))},e.prototype.showSignIn=function(){return D(this,void 0,void 0,(function(){return R(this,(function(e){return this._signInSelected.next(),[2]}))}))},e.prototype.showEditAvatar=function(){return D(this,void 0,void 0,(function(){return R(this,(function(e){return this._editAvatarSelected.next(),[2]}))}))},e.prototype.selectMessageUser=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){return this._userSelected.next(e),[2]}))}))},e.prototype.selectUsername=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){return this._usernameSelected.next(e),[2]}))}))},e.prototype.selectAvatar=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){return this._avatarSelected.next(e),[2]}))}))},e.prototype.shareMessage=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){return this._shared.next(e),[2]}))}))},e.prototype.deleteMessage=function(e){var t;return D(this,void 0,void 0,(function(){var r;return R(this,(function(a){switch(a.label){case 0:return this.user?[3,2]:[4,this.showSignIn()];case 1:return a.sent(),[2];case 2:if(!confirm("Are you sure you want to delete this comment? You cannot undo this action."))return[2];a.label=3;case 3:return a.trys.push([3,5,,6]),[4,this.source.deleteMessage(e.id)];case 4:return a.sent(),(null===(t=this.selectedMessage)||void 0===t?void 0:t.id)===e.id&&this.unselectMessage(),[3,6];case 5:return r=a.sent(),this.handleBackendExceptionAsAlert(r,"Could not delete message: "),[3,6];case 6:return[2]}}))}))},e.prototype.editMessage=function(e,t,r){return D(this,void 0,void 0,(function(){var a;return R(this,(function(n){switch(n.label){case 0:return this.user?[3,2]:[4,this.showSignIn()];case 1:return n.sent(),[2];case 2:return n.trys.push([2,4,,5]),[4,e.editMessage(t.id,r)];case 3:return n.sent(),[3,5];case 4:return a=n.sent(),this.handleBackendExceptionAsAlert(a,"Could not edit this message: "),[2];case 5:return t.message=r,t.transientState.editing=!1,[2]}}))}))},e.prototype.startEditing=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){return this.selectedMessage.transientState.editing=!1,e.transientState.editing=!0,[2]}))}))},e.prototype.saveEdit=function(e,t){return D(this,void 0,void 0,(function(){var r;return R(this,(function(a){switch(a.label){case 0:return this.user?[3,2]:[4,this.showSignIn()];case 1:return a.sent(),[2];case 2:return a.trys.push([2,4,,5]),[4,this.source.editMessage(e.id,t)];case 3:return a.sent(),e.transientState.editing=!1,[3,5];case 4:return r=a.sent(),this.handleBackendExceptionAsAlert(r,"Could not edit message: "),[3,5];case 5:return[2]}}))}))},e}();se.decorators=[{type:a.Component,args:[{selector:"banta-comments",template:'<ng-container *ngIf="loading">\r\n <div class="loading-screen" [class.visible]="showLoadingScreen">\r\n <h1>Loading...</h1>\r\n <div>\r\n <mat-spinner [diameter]="300" [strokeWidth]="2"></mat-spinner>\r\n </div>\r\n\r\n <p class="loading-message" [class.visible]="loadingMessageVisible">{{loadingMessage}}</p>\r\n </div>\r\n</ng-container>\r\n<ng-container *ngIf="!loading">\r\n <div class="focused" [class.visible]="selectedMessageVisible" *ngIf="selectedMessage && !useInlineReplies">\r\n\r\n <div>\r\n <a mat-button href="javascript:;" (click)="unselectMessage()">\r\n <mat-icon>arrow_back</mat-icon>\r\n Latest Comments\r\n </a>\r\n </div>\r\n\r\n <banta-comment\r\n [message]="selectedMessage"\r\n [liking]="selectedMessage.transientState.liking"\r\n [mine]="user?.id === selectedMessage.user?.id"\r\n [permissions]="source?.permissions"\r\n [showReplyAction]="false"\r\n [editing]="selectedMessage.transientState.editing"\r\n [maxLength]="maxCommentLength"\r\n [genericAvatarUrl]="genericAvatarUrl"\r\n (editStarted)="startEditing(selectedMessage)"\r\n (editEnded)="selectedMessage.transientState.editing = false"\r\n (edited)="saveEdit(selectedMessage, $event)"\r\n (userSelected)="selectMessageUser(selectedMessage)"\r\n (avatarSelected)="selectAvatar($event)"\r\n (usernameSelected)="selectUsername($event)"\r\n (liked)="likeMessage(source, selectedMessage)"\r\n (unliked)="unlikeMessage(source, selectedMessage)"\r\n (reported)="reportMessage(selectedMessage)"\r\n (selected)="toggleSelectedMessage(selectedMessage)"\r\n (shared)="shareMessage($event)"\r\n (deleted)="deleteMessage(selectedMessage)"\r\n ></banta-comment>\r\n\r\n <div class="replies">\r\n\r\n <ng-container *ngIf="!selectedMessageThread">\r\n <div class="loading">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf="selectedMessageThread">\r\n <banta-comment-view\r\n class="replies"\r\n #threadView\r\n [source]="selectedMessageThread"\r\n [allowReplies]="false"\r\n [fixedHeight]="false"\r\n [showEmptyState]="false"\r\n [newestLast]="true"\r\n [genericAvatarUrl]="genericAvatarUrl"\r\n (liked)="likeMessage(selectedMessageThread, $event)"\r\n (unliked)="unlikeMessage(selectedMessageThread, $event)"\r\n (messageEdited)="editMessage(selectedMessageThread, $event.message, $event.newMessage)"\r\n (reported)="reportMessage($event)"\r\n (usernameSelected)="selectUsername($event)"\r\n (avatarSelected)="selectAvatar($event)"\r\n (shared)="shareMessage($event)"\r\n (deleted)="deleteMessage($event)"\r\n [customMenuItems]="customMenuItems"\r\n ></banta-comment-view>\r\n\r\n <banta-comment-field\r\n [sendLabel]="replyLabel"\r\n [sendingLabel]="sendingLabel"\r\n [hashtags]="hashtags"\r\n [participants]="participants"\r\n (signInSelected)="showSignIn()"\r\n (editAvatarSelected)="showEditAvatar()"\r\n [source]="selectedMessageThread"\r\n [maxLength]="maxCommentLength"\r\n [canComment]="source?.permissions?.canPost"\r\n [signInLabel]="signInLabel"\r\n [permissionDeniedLabel]="source?.permissions?.canPostErrorMessage || permissionDeniedLabel"\r\n (permissionDeniedError)="handlePermissionDenied($event)"\r\n [shouldInterceptMessageSend]="shouldInterceptMessageSend"\r\n [user]="user"\r\n [label]="postReplyLabel"\r\n [submit]="sendReply"\r\n [allowAttachments]="allowAttachments"\r\n [genericAvatarUrl]="genericAvatarUrl"\r\n >\r\n <ng-container *ngTemplateOutlet="sendReplyOptionsTemplate"></ng-container>\r\n </banta-comment-field>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class="main" [class.hidden]="selectedMessage && !useInlineReplies">\r\n <banta-comment-field\r\n [source]="source"\r\n [user]="user"\r\n [sendLabel]="sendLabel"\r\n [sendingLabel]="sendingLabel"\r\n [signInLabel]="signInLabel"\r\n [canComment]="source?.permissions?.canPost"\r\n [hashtags]="hashtags"\r\n [participants]="participants"\r\n [label]="postCommentLabel"\r\n [maxLength]="maxCommentLength"\r\n (editAvatarSelected)="showEditAvatar()"\r\n (signInSelected)="showSignIn()"\r\n [permissionDeniedLabel]="source?.permissions?.canPostErrorMessage || permissionDeniedLabel"\r\n (permissionDeniedError)="handlePermissionDenied($event)"\r\n [shouldInterceptMessageSend]="shouldInterceptMessageSend"\r\n [submit]="sendMessage"\r\n [allowAttachments]="allowAttachments"\r\n [genericAvatarUrl]="genericAvatarUrl"\r\n >\r\n \r\n </banta-comment-field>\r\n\r\n <banta-comment-sort\r\n [(sort)]="sortOrder"></banta-comment-sort>\r\n\r\n <div class="loading-comment" *ngIf="loadingSharedComment">\r\n <h1>Loading the comment you linked to...</h1>\r\n <mat-spinner [diameter]="300" [strokeWidth]="2"></mat-spinner>\r\n <p>\r\n If there are a lot of comments, this might take awhile!\r\n </p>\r\n </div>\r\n <div class="loading-comment" *ngIf="!loadingSharedComment && lastSharedCommentID">\r\n <ng-container *ngIf="sharedCommentMissing">\r\n\r\n <a class="close" mat-icon-button matTooltip="Close this notice" href="javascript:;" (click)="lastSharedCommentID = null">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n\r\n <h1>\r\n <mat-icon>error</mat-icon>\r\n Uh oh!\r\n </h1>\r\n\r\n <p>The comment you linked to can\'t be found! It may have been removed.</p>\r\n </ng-container>\r\n <ng-container *ngIf="!sharedCommentMissing">\r\n <a class="close" mat-icon-button matTooltip="Close this notice" href="javascript:;" (click)="lastSharedCommentID = null">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n <button mat-button (click)="navigateToSharedComment(lastSharedCommentID)">\r\n <mat-icon>move_down</mat-icon> Jump to shared comment\r\n </button>\r\n </ng-container>\r\n </div>\r\n\r\n <banta-comment-view\r\n #commentView\r\n [class.faded]="selectedMessage && !useInlineReplies"\r\n [source]="source"\r\n [fixedHeight]="fixedHeight"\r\n [maxMessages]="maxMessages"\r\n [maxVisibleMessages]="maxVisibleMessages"\r\n [genericAvatarUrl]="genericAvatarUrl"\r\n [customMenuItems]="customMenuItems"\r\n (userSelected)="selectMessageUser($event)"\r\n (sortOrderChanged)="sortOrder = $event"\r\n (selected)="toggleSelectedMessage($event)"\r\n (liked)="likeMessage(source, $event)"\r\n (unliked)="unlikeMessage(source, $event)"\r\n (messageEdited)="editMessage(source, $event.message, $event.newMessage)"\r\n (reported)="reportMessage($event)"\r\n (usernameSelected)="selectUsername($event)"\r\n (avatarSelected)="selectAvatar($event)"\r\n (shared)="shareMessage($event)"\r\n [selectedMessage]="selectedMessage"\r\n (deleted)="deleteMessage($event)"\r\n >\r\n <div class="inline-replies">\r\n <div class="focused" [class.visible]="selectedMessageVisible" *ngIf="selectedMessage">\r\n <div class="replies">\r\n \r\n <ng-container *ngIf="!selectedMessageThread">\r\n <div class="loading">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n </ng-container>\r\n \r\n <ng-container *ngIf="selectedMessageThread">\r\n <banta-comment-view\r\n [source]="selectedMessageThread"\r\n [allowReplies]="false"\r\n [fixedHeight]="false"\r\n [showEmptyState]="false"\r\n [newestLast]="true"\r\n [genericAvatarUrl]="genericAvatarUrl"\r\n (liked)="likeMessage(selectedMessageThread, $event)"\r\n (unliked)="unlikeMessage(selectedMessageThread, $event)"\r\n (messageEdited)="editMessage(selectedMessageThread, $event.message, $event.newMessage)"\r\n (reported)="reportMessage($event)"\r\n (usernameSelected)="selectUsername($event)"\r\n (avatarSelected)="selectAvatar($event)"\r\n (shared)="shareMessage($event)"\r\n (deleted)="deleteMessage($event)"\r\n ></banta-comment-view>\r\n \r\n <banta-comment-field\r\n [sendLabel]="replyLabel"\r\n [sendingLabel]="sendingLabel"\r\n [hashtags]="hashtags"\r\n [participants]="participants"\r\n (signInSelected)="showSignIn()"\r\n [maxLength]="maxCommentLength"\r\n (editAvatarSelected)="showEditAvatar()"\r\n [source]="selectedMessageThread"\r\n [canComment]="source?.permissions?.canPost"\r\n [signInLabel]="signInLabel"\r\n [permissionDeniedLabel]="source?.permissions?.canPostErrorMessage || permissionDeniedLabel"\r\n (permissionDeniedError)="handlePermissionDenied($event)"\r\n [shouldInterceptMessageSend]="shouldInterceptMessageSend"\r\n [user]="user"\r\n [label]="postReplyLabel"\r\n [submit]="sendReply"\r\n [allowAttachments]="allowAttachments"\r\n [genericAvatarUrl]="genericAvatarUrl"\r\n >\r\n <ng-container *ngTemplateOutlet="sendReplyOptionsTemplate"></ng-container>\r\n </banta-comment-field>\r\n </ng-container>\r\n </div>\r\n </div> \r\n </div>\r\n </banta-comment-view>\r\n </div>\r\n</ng-container>\r\n',styles:[":host{display:flex;flex-direction:column}@-webkit-keyframes select-comment{0%{transform:scale(1.15)}to{transform:scale(1)}}@keyframes select-comment{0%{transform:scale(1.15)}to{transform:scale(1)}}.focused{-webkit-animation-name:select-comment;animation-name:select-comment;-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.focused .replies{margin-top:1em;margin-left:2em;border-left:2px solid #333;padding-left:2em}banta-comment-view{opacity:1;transition:opacity .4s ease-in-out}banta-comment-view.faded{opacity:.25}.loading{display:block;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;margin:0 auto;min-height:16em}.main.hidden{display:none}.loading-screen{text-align:center;opacity:0;transition:opacity .25s ease-in-out}.loading-screen.visible{opacity:1}.loading-screen h1{font-weight:100}.loading-screen mat-spinner{margin:5em auto}.loading-screen .loading-message{opacity:0;transition:opacity .25s ease-in-out;width:500px;max-width:100%;margin:0 auto}.loading-screen .loading-message.visible{opacity:1}banta-comment-sort{margin:0 0 0 auto;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;display:block}.inline-replies{margin-left:4em}@media (max-width:500px){.focused .replies{margin-left:0}.inline-replies{margin-left:1em}.focused .replies{padding-left:.5em}banta-comment-sort{margin:0;width:100%}}:host-context(.banta-mobile) .focused .replies{margin-left:0}:host-context(.banta-mobile) .inline-replies{margin-left:1em}:host-context(.banta-mobile) .focused .replies{padding-left:.5em}:host-context(.banta-mobile) banta-comment-sort{margin:0;width:100%}.loading-comment{z-index:100;border:1px solid #333;background:#000;color:#fff;padding:1em;border-radius:4px;text-align:center;position:relative}.loading-comment a.close{position:absolute;top:1em;right:1em}.loading-comment h1{font-weight:100;text-align:center}.loading-comment mat-spinner{margin:0 auto}"]}]}],se.ctorParameters=function(){return[{type:Y},{type:a.ElementRef},{type:b.ActivatedRoute},{type:w.MatSnackBar},{type:a.NgZone}]},se.propDecorators={isMobileSized:[{type:a.HostBinding,args:["class.banta-mobile"]}],sendReplyOptionsTemplate:[{type:a.ContentChild,args:[oe,{read:a.TemplateRef}]}],customMenuItems:[{type:a.Input}],maxCommentLength:[{type:a.Input}],loadingMessages:[{type:a.Input}],useInlineReplies:[{type:a.Input}],commentView:[{type:a.ViewChild,args:["commentView"]}],threadViewQuery:[{type:a.ViewChildren,args:[ne]}],signInLabel:[{type:a.Input}],sendLabel:[{type:a.Input}],replyLabel:[{type:a.Input}],sendingLabel:[{type:a.Input}],permissionDeniedLabel:[{type:a.Input}],postCommentLabel:[{type:a.Input}],postReplyLabel:[{type:a.Input}],allowAttachments:[{type:a.Input}],fixedHeight:[{type:a.Input}],maxMessages:[{type:a.Input}],maxVisibleMessages:[{type:a.Input}],genericAvatarUrl:[{type:a.Input}],shouldInterceptMessageSend:[{type:a.Input}],participants:[{type:a.Input}],source:[{type:a.Input}],hashtags:[{type:a.Input}],topicID:[{type:a.Input}],signInSelected:[{type:a.Output}],editAvatarSelected:[{type:a.Output}],permissionDeniedError:[{type:a.Output}],upvoted:[{type:a.Output}],reported:[{type:a.Output}],selected:[{type:a.Output}],userSelected:[{type:a.Output}],usernameSelected:[{type:a.Output}],avatarSelected:[{type:a.Output}],shared:[{type:a.Output}]};var ie=function(){function e(e){this.backend=e,this._upvoted=new t.Subject,this._reported=new t.Subject,this._selected=new t.Subject}return Object.defineProperty(e.prototype,"upvoted",{get:function(){return this._upvoted},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"reported",{get:function(){return this._reported},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"message",{get:function(){return this._message},set:function(e){var t=this,r=null;this._message&&(r=this._message.id),this._message=e,e&&r===e.id||(this.unsubscribe&&this.unsubscribe(),e&&(this.unsubscribe=this.backend.watchMessage(e,(function(e){return t.message=e}))))},enumerable:!1,configurable:!0}),e.prototype.report=function(){this._reported.next()},e.prototype.upvote=function(){this._upvoted.next()},e.prototype.select=function(){this._selected.next()},e}();ie.decorators=[{type:a.Component,args:[{selector:"banta-live-comment",template:'\n <banta-comment \n *ngIf="message"\n [message]="message"\n (upvoted)="upvote()"\n (reported)="report()"\n (selected)="select()"\n ></banta-comment>\n ',styles:[""]}]}],ie.ctorParameters=function(){return[{type:Y}]},ie.propDecorators={upvoted:[{type:a.Output}],reported:[{type:a.Output}],selected:[{type:a.Output}],message:[{type:a.Input}]};var ce=function(){function e(e){this.chatBackend=e,this._subs=new t.Subscription,this.canComment=!0,this.allowAttachments=!1,this.signInSelected=new t.Subject,this.editAvatarSelected=new t.Subject,this.sending=!1,this.expandError=!1,this._text="",this.sendLabel="Send",this.sendingLabel="Sending",this.label="Post a comment",this.permissionDeniedLabel="Unavailable",this.signInLabel="Sign In",this.maxLength=1500,this.placeholder="",this.textChanged=new t.Subject,this.participants=[],this._permissionDeniedError=new t.Subject,this.autocompleteVisible=!1,this.autocompleteOptions=[],this.autoCompleteSelected=0,this.chatMessageAttachments=[]}return Object.defineProperty(e.prototype,"source",{get:function(){return this._source},set:function(e){var r,a=this;this._source&&(null===(r=this._subs)||void 0===r||r.unsubscribe(),this._source=null),this._source=e,this._subs=new t.Subscription,this._source&&setTimeout((function(){a._source.connectionStateChanged&&a._subs.add(a._source.connectionStateChanged.subscribe((function(e){"lost"===e?a.transientMessage="Reconnecting...":"restored"===e?a.transientMessage=void 0:"connecting"===e&&(a.transientMessage="Connecting...")})))}))},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"text",{get:function(){return this._text},set:function(e){this._text=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"userAvatarUrl",{get:function(){var e;return(null===(e=this.user)||void 0===e?void 0:e.avatarUrl)||this.genericAvatarUrl},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"permissionDeniedError",{get:function(){return this._permissionDeniedError},enumerable:!1,configurable:!0}),e.prototype.ngAfterViewInit=function(){"undefined"!=typeof window&&(document.body.querySelector("[ng-version]")||document.body).appendChild(this.autocompleteEl.nativeElement)},e.prototype.sendPermissionDenied=function(e){this._permissionDeniedError.next(e)},e.prototype.showAutoComplete=function(e){if("undefined"!=typeof window){this.autoCompleteSelected=0,this.autocompleteOptions=e;var t=this.autocompleteContainerEl.nativeElement.getBoundingClientRect();this.autocompleteEl.nativeElement.getBoundingClientRect();this.autocompleteEl.nativeElement.style.left=window.scrollX+t.left+"px",this.autocompleteEl.nativeElement.style.top=window.scrollY+t.top+"px",this.autocompleteEl.nativeElement.style.width=t.width+"px",this.autocompleteVisible=!0}},e.prototype.activateAutoComplete=function(e){e.action(),this.dismissAutoComplete()},e.prototype.dismissAutoComplete=function(){this.autocompleteVisible=!1,this.completionFunc=null,this.completionPrefix=""},e.prototype.indicateError=function(e){var t=this;this.sendError=new Error(e),this.expandError=!1,clearTimeout(this.errorTimeout),this.errorTimeout=setTimeout((function(){t.expandError=!0,t.errorTimeout=setTimeout((function(){t.expandError=!1}),5e3)}),100),"undefined"!=typeof window&&window.innerWidth<430&&alert(e)},Object.defineProperty(e.prototype,"isValidMessage",{get:function(){return this.text||this.chatMessageAttachments.length>0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"hasPendingAttachments",{get:function(){return this.chatMessageAttachments.some((function(e){return e.transientState}))},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"sendButtonEnabled",{get:function(){return!this.canComment||this.isValidMessage&&!this.hasPendingAttachments&&!this.sending},enumerable:!1,configurable:!0}),e.prototype.autocomplete=function(e){return D(this,void 0,void 0,(function(){var t;return R(this,(function(r){return t=this.textareaEl.nativeElement,this.text=this.text.slice(0,t.selectionStart-this.completionPrefix.length)+e+this.text.slice(t.selectionStart),[2]}))}))},e.prototype.insert=function(e){return D(this,void 0,void 0,(function(){var t;return R(this,(function(r){return t=this.textareaEl.nativeElement,this.text=this.text.slice(0,t.selectionStart)+e+this.text.slice(t.selectionStart),[2]}))}))},e.prototype.onKeyDown=function(e){return D(this,void 0,void 0,(function(){var t=this;return R(this,(function(r){switch(r.label){case 0:if(this.autocompleteVisible){if("Escape"===e.key)return this.dismissAutoComplete(),[2];if("Shift"===e.key)return[2];if("Enter"===e.key&&this.autocompleteOptions[this.autoCompleteSelected])return this.activateAutoComplete(this.autocompleteOptions[this.autoCompleteSelected]),e.stopPropagation(),e.preventDefault(),[2];if("ArrowUp"===e.key)return 0===this.autoCompleteSelected?this.autoCompleteSelected=this.autocompleteOptions.length-1:this.autoCompleteSelected=this.autoCompleteSelected-1,e.stopPropagation(),e.preventDefault(),[2];if("ArrowDown"===e.key)return this.autoCompleteSelected=(this.autoCompleteSelected+1)%this.autocompleteOptions.length,e.stopPropagation(),e.preventDefault(),[2]}return"Enter"===e.key&&e.ctrlKey?[4,this.sendMessage()]:[3,2];case 1:return r.sent(),[2];case 2:if(this.completionFunc){if("Backspace"===e.key){if(this.completionPrefix=this.completionPrefix.slice(0,this.completionPrefix.length-1),""===this.completionPrefix)return this.dismissAutoComplete(),[2]}else{if(" "===e.key||e.key.length>1)return this.dismissAutoComplete(),[2];this.completionPrefix+=e.key}this.showAutoComplete(this.completionFunc(this.completionPrefix))}else":"===e.key?this.startAutoComplete(e,(function(e){return(e=e.slice(1)).startsWith("-")&&(e=e.slice(1)),Object.keys($).filter((function(t){return t.includes(e)||$[t].keywords.some((function(t){return t.includes(e)}))})).map((function(e){return{label:$[e].char+" "+e,action:function(){return t.autocomplete($[e].char)}}})).slice(0,5)})):"@"===e.key?this.startAutoComplete(e,(function(e){return e=e.slice(1),t.participants.filter((function(t){return t.username.includes(e)})).map((function(e){return{label:"@"+e.username+" -- "+e.displayName,action:function(){return t.autocomplete("@"+e.username)}}}))})):"#"===e.key&&this.startAutoComplete(e,(function(e){return e=e.slice(1),t.hashtags.filter((function(t){return t.hashtag.includes(e)})).map((function(e){return{label:"#"+e.hashtag+(e.description?" -- "+e.description:""),action:function(){return t.autocomplete("#"+e.hashtag)}}})).slice(0,5)}));return[2]}}))}))},e.prototype.startAutoComplete=function(e,t){this.completionPrefix=e.key,this.completionFunc=t,this.showAutoComplete(this.completionFunc(this.completionPrefix))},e.prototype.onBlur=function(){var e=this;setTimeout((function(){return e.dismissAutoComplete()}),250)},e.prototype.insertEmoji=function(e){this.text+=e},e.prototype.showSignIn=function(){this.signInSelected.next()},e.prototype.showEditAvatar=function(){this.editAvatarSelected.next()},e.prototype.sendMessage=function(){return D(this,void 0,void 0,(function(){var e,t,r,a=this;return R(this,(function(n){switch(n.label){case 0:if(!this.source)return[2];this.sending=!0,this.sendError=null,n.label=1;case 1:if(n.trys.push([1,,7,8]),e=(this.text||"").trim(),this.canComment&&!this.isValidMessage)return[2];t={user:this.user,sentAt:Date.now(),url:"undefined"!=typeof window?location.href:void 0,likes:0,message:e,attachments:this.chatMessageAttachments.filter((function(e){return e.url}))},n.label=2;case 2:return n.trys.push([2,4,,6]),[4,this.submit(t)];case 3:return n.sent(),this.text="",this.chatMessageAttachments=[],[3,6];case 4:return r=n.sent(),[4,new Promise((function(e){return setTimeout((function(){return e()}),1e3)}))];case 5:return n.sent(),this.indicateError(r.message),[3,6];case 6:return[3,8];case 7:return this.sending=!1,setTimeout((function(){a.textareaEl.nativeElement.focus()}),100),[7];case 8:return[2]}}))}))},e.prototype.addedAttachment=function(e){this.chatMessageAttachments.push(e)},e.prototype.attachmentError=function(e){var t=this;setTimeout((function(){t.chatMessageAttachments=t.chatMessageAttachments.filter((function(t){return t!==e}))}),3e3)},e.prototype.removeAttachment=function(e){var t=this.chatMessageAttachments.indexOf(e);t>=0&&this.chatMessageAttachments.splice(t,1)},e.prototype.alertError=function(){this.sendError&&alert(this.sendError.message)},e}();ce.decorators=[{type:a.Component,args:[{selector:"banta-comment-field",template:'<form class="new-message" (submit)="sendMessage()">\r\n <div class="avatar-container">\r\n <a href="javascript:;"\r\n class="avatar"\r\n (click)="showEditAvatar()"\r\n [style.background-image]="\'url(\' + userAvatarUrl + \')\'"\r\n ></a>\r\n </div>\r\n <div class="text-container">\r\n <div class="field-container">\r\n <div class="field-row">\r\n <mat-form-field class="message-field" appearance="outline" floatLabel="always">\r\n <mat-label>{{label}}</mat-label>\r\n <textarea\r\n #textarea\r\n name="message"\r\n attachmentScraper\r\n [(attachments)]="chatMessageAttachments"\r\n [placeholder]="placeholder"\r\n matInput\r\n cdkTextareaAutosize\r\n [maxlength]="maxLength"\r\n (keydown)="onKeyDown($event)"\r\n (blur)="onBlur()"\r\n [disabled]="sending"\r\n [(ngModel)]="text"\r\n autocomplete="off"\r\n ></textarea>\r\n </mat-form-field>\r\n <div class="options-line">\r\n <mat-spinner *ngIf="sending" class="icon loading" diameter="18" strokeWidth="2"></mat-spinner>\r\n <div *ngIf="sendError" class="error-message" [class.expanded]="expandError" [matTooltip]="sendError.message" (click)="alertError()">\r\n <mat-icon *ngIf="sendError">error</mat-icon>\r\n {{sendError.message}}\r\n </div>\r\n <div *ngIf="!sendError && transientMessage" class="transient-message" [class.expanded]="true" [matTooltip]="transientMessage" (click)="alertError()">\r\n <mat-spinner [inline]="true" [diameter]="15"></mat-spinner>\r\n {{transientMessage}}\r\n </div>\r\n <div class="spacer"></div>\r\n <div class="custom">\r\n <ng-content></ng-content>\r\n </div>\r\n <banta-attachment-button \r\n *ngIf="allowAttachments"\r\n (addedAttachment)="addedAttachment($event)"\r\n (attachmentError)="attachmentError($event)"\r\n ></banta-attachment-button>\r\n <emoji-selector-button (selected)="insertEmoji($event)"></emoji-selector-button>\r\n </div>\r\n \r\n </div>\r\n <div #autocompleteContainer class="autocomplete-container">\r\n <div #autocomplete class="autocomplete" [class.visible]="autocompleteVisible">\r\n\r\n <div>\r\n <strong>{{completionPrefix}}</strong>...\r\n </div>\r\n <a\r\n mat-button\r\n *ngFor="let option of autocompleteOptions; index as index"\r\n (click)="activateAutoComplete(option)"\r\n [class.active]="autoCompleteSelected === index"\r\n >\r\n {{option.label}}\r\n </a>\r\n </div>\r\n </div>\r\n\r\n <banta-attachments \r\n [attachments]="chatMessageAttachments"\r\n [editing]="true"\r\n (remove)="removeAttachment($event)"\r\n ></banta-attachments>\r\n </div>\r\n </div>\r\n <div class="actions">\r\n <ng-container *ngIf="!user">\r\n <button\r\n mat-raised-button\r\n color="primary"\r\n type="button"\r\n (click)="showSignIn()"\r\n >{{signInLabel}}</button>\r\n </ng-container>\r\n <ng-container *ngIf="user">\r\n <button\r\n mat-raised-button\r\n class="send"\r\n color="primary"\r\n [disabled]="!sendButtonEnabled"\r\n >\r\n <ng-container *ngIf="canComment">\r\n <mat-icon *ngIf="!sending">chevron_right</mat-icon>\r\n <mat-spinner *ngIf="sending" class="icon" diameter="18" strokeWidth="2"></mat-spinner>\r\n </ng-container>\r\n <span class="label">\r\n <ng-container *ngIf="!canComment">\r\n {{permissionDeniedLabel}}\r\n </ng-container>\r\n <ng-container *ngIf="canComment">\r\n <ng-container *ngIf="!sending">\r\n {{sendLabel}}\r\n </ng-container>\r\n <ng-container *ngIf="sending">\r\n {{sendingLabel}}\r\n </ng-container>\r\n </ng-container>\r\n </span>\r\n </button>\r\n </ng-container>\r\n </div>\r\n</form>',styles:["@-webkit-keyframes comment-field-appear{0%{transform:translateY(128px);opacity:0}to{transform:translate(0);opacity:1}}@keyframes comment-field-appear{0%{transform:translateY(128px);opacity:0}to{transform:translate(0);opacity:1}}:host{margin:0 2em 0 0;display:block;-webkit-animation-name:comment-field-appear;animation-name:comment-field-appear;-webkit-animation-duration:.8s;animation-duration:.8s;-webkit-animation-delay:.4s;animation-delay:.4s;-webkit-animation-fill-mode:both;animation-fill-mode:both;position:relative;z-index:20}.avatar-container{width:calc(48px + 1.75em);display:flex;justify-content:flex-end;flex-shrink:0}.avatar-container .avatar{width:48px;height:48px;background:#000;border-radius:100%;background-size:cover;background-repeat:no-repeat;background-position:50%;margin-top:.75em;margin-right:.75em}form{display:flex;padding:.5em;align-items:center}form .text-container{position:relative;display:flex;flex-grow:1;min-width:0}form .text-container textarea{font-size:14pt;width:100%}form .text-container textarea[disabled]{opacity:.5}form .text-container mat-spinner.loading{position:absolute;left:.5em;bottom:.5em}form .text-container .options-line{display:flex;align-items:center}form .text-container .options-line>*{flex-shrink:0}form .text-container .options-line .transient-message{display:flex;flex-direction:row;align-items:center;gap:.5em}form .text-container .options-line .error-message{left:.5em;bottom:.5em;color:#683333;overflow-x:hidden;max-width:1.5em;white-space:nowrap;transition:max-width 2s ease-in-out;text-overflow:ellipsis;overflow:hidden;flex-shrink:1}form .text-container .options-line .error-message.expanded,form .text-container .options-line .error-message:hover{max-width:100%}form .text-container .options-line .error-message mat-icon{vertical-align:middle}form input[type=text]{background:#000;color:#fff;border:1px solid #333;width:100%;height:1em}form .actions{margin-left:1em;flex-shrink:0}form button{display:block;margin:0 0 0 auto}form.new-message{display:flex;align-items:flex-start;min-width:0}form.new-message .field-container{flex-grow:1;display:flex;flex-direction:column;min-width:0}form.new-message mat-form-field{width:100%}form.new-message mat-form-field ::ng-deep .mat-form-field-wrapper{padding-bottom:0}form.new-message button{margin:1.25em 0 0}button.send{min-width:9em}textarea{max-height:7em}.autocomplete-container{width:calc(100% - 2em);position:relative;pointer-events:none;top:-2em}.autocomplete{visibility:hidden;pointer-events:none;position:absolute;background:#333;padding:.5em;display:flex;flex-direction:column;z-index:100}.autocomplete.visible{visibility:visible;pointer-events:auto}.autocomplete a{width:100%;text-align:left}.autocomplete a.active{background:#555}.image-attachments-container{display:flex;gap:20px}.image-attachments-container .image-attachment{width:300px;position:relative;text-align:center}.image-attachments-container .image-attachment.with-border{outline:1px solid #333;padding:1em 0}.image-attachments-container .image-attachment mat-spinner{display:block;margin:0 auto .5em;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.image-attachments-container .image-attachment mat-icon.error{display:block;font-size:48px;width:48px;height:48px;margin:0 auto .5em}.image-attachments-container .image-attachment .error{color:#b76363}.image-attachments-container .image-attachment img{width:300px;border-radius:10px}.image-attachments-container .image-attachment .remove-img{position:absolute;right:10px;top:10px;margin:0}.card-attachment,.field-row{position:relative}.card-attachment a{display:flex;align-items:flex-start;gap:1em;width:100%;border:1px solid #666;border-radius:4px;padding:2em;box-sizing:border-box;background-color:#191919}.card-attachment a img{width:300px;aspect-ratio:16/9;-o-object-fit:cover;object-fit:cover;border-radius:10px}.card-attachment a h1{margin:0;font-size:30px}.card-attachment .remove-img{position:absolute;right:10px;top:10px;margin:0}@media (max-width:500px){:host{margin:0}.avatar-container{width:auto;flex-shrink:0}.avatar-container .avatar{width:32px;height:32px;margin-top:1.5em}:host.can-comment button.send .label,:host:not(.can-comment) .text-container,:host:not(.can-comment) mat-form-field.message-field{display:none}button.send{min-width:auto;margin-top:1.5em}}:host-context(.banta-mobile) :host{margin:0}:host-context(.banta-mobile) .avatar-container{width:auto;flex-shrink:0}:host-context(.banta-mobile) .avatar-container .avatar{width:32px;height:32px;margin-top:1.5em}:host-context(.banta-mobile) :host.can-comment button.send .label,:host-context(.banta-mobile) :host:not(.can-comment) .text-container,:host-context(.banta-mobile) :host:not(.can-comment) mat-form-field.message-field{display:none}:host-context(.banta-mobile) button.send{min-width:auto;margin-top:1.5em}"]}]}],ce.ctorParameters=function(){return[{type:Y}]},ce.propDecorators={source:[{type:a.Input}],user:[{type:a.Input}],canComment:[{type:a.HostBinding,args:["class.can-comment"]},{type:a.Input}],allowAttachments:[{type:a.Input}],signInSelected:[{type:a.Output}],editAvatarSelected:[{type:a.Output}],transientMessage:[{type:a.Input}],sendLabel:[{type:a.Input}],sendingLabel:[{type:a.Input}],label:[{type:a.Input}],permissionDeniedLabel:[{type:a.Input}],signInLabel:[{type:a.Input}],maxLength:[{type:a.Input}],placeholder:[{type:a.Input}],textChanged:[{type:a.Output}],shouldInterceptMessageSend:[{type:a.Input}],autocompleteEl:[{type:a.ViewChild,args:["autocomplete"]}],autocompleteContainerEl:[{type:a.ViewChild,args:["autocompleteContainer"]}],textareaEl:[{type:a.ViewChild,args:["textarea"]}],hashtags:[{type:a.Input}],participants:[{type:a.Input}],genericAvatarUrl:[{type:a.Input}],permissionDeniedError:[{type:a.Output}],submit:[{type:a.Input}]};var le=function(){function e(){this.commentsOrder=f.CommentsOrder,this._sortChange=new t.Subject,this._sort=f.CommentsOrder.LIKES}return Object.defineProperty(e.prototype,"sort",{get:function(){return this._sort},set:function(e){var t=this;this._sort!==e&&(this._sort=e,setTimeout((function(){return t._sortChange.next(e)})))},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"sortChange",{get:function(){return this._sortChange.asObservable()},enumerable:!1,configurable:!0}),e}();le.decorators=[{type:a.Component,args:[{selector:"banta-comment-sort",template:'<mat-form-field appearance="outline" floatLabel="always">\r\n <mat-label>Sort by</mat-label>\r\n <mat-select [(value)]="sort" >\r\n <mat-option [value]="commentsOrder.NEWEST">Newest</mat-option>\r\n <mat-option [value]="commentsOrder.OLDEST">Oldest</mat-option>\r\n <mat-option [value]="commentsOrder.LIKES">Likes</mat-option>\r\n </mat-select>\r\n</mat-form-field>',styles:["mat-form-field{width:100%}"]}]}],le.propDecorators={sort:[{type:a.Input}],sortChange:[{type:a.Output}]};var de=function(){function e(e){this.cdnProvider=e,this._addedAttachment=new t.Subject,this._attachmentError=new t.Subject}return Object.defineProperty(e.prototype,"addedAttachment",{get:function(){return this._addedAttachment.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"attachmentError",{get:function(){return this._attachmentError.asObservable()},enumerable:!1,configurable:!0}),e.prototype.show=function(){this.fileInput.nativeElement.click()},e.prototype.fileChange=function(e){return D(this,void 0,void 0,(function(){var t,r,a,n,o;return R(this,(function(s){switch(s.label){case 0:if(!(t=e.currentTarget).files.length)return[3,5];console.log("[Banta] File Added to comment"),r=t.files[0],a=void 0,n={type:r.type,url:void 0,transientState:{uploading:!0,error:!1,errorMessage:void 0}},this._addedAttachment.next(n),s.label=1;case 1:return s.trys.push([1,3,,4]),[4,this.cdnProvider.uploadImage(r)];case 2:return a=s.sent(),[3,4];case 3:return o=s.sent(),n.transientState.error=!0,n.transientState.errorMessage="Failed to upload",console.error("[Banta] Caught an error while uploading image to CDN:"),console.error(o),alert("Failed to upload image. Please try again later."),this._attachmentError.next(n),[2];case 4:if(!a)return[2];n.url=a,n.transientState=void 0,s.label=5;case 5:return[2]}}))}))},e}();de.decorators=[{type:a.Component,args:[{selector:"banta-attachment-button",template:'<button matTooltip="Add an image or gif" #button type="button" mat-icon-button (click)="show()">\r\n\t<mat-icon>image</mat-icon>\r\n</button>\r\n<input style="display: none;" #fileUpload [multiple]="false" (change)="fileChange($event)" type="file" >',styles:["button{color:#666}"]}]}],de.ctorParameters=function(){return[{type:f.CDNProvider}]},de.propDecorators={fileInput:[{type:a.ViewChild,args:["fileUpload",{static:!1}]}],addedAttachment:[{type:a.Output}],attachmentError:[{type:a.Output}]};var ue=function(){function e(e,r){this.elementRef=e,this.chatBackend=r,this.attachments=[],this.attachmentsChange=new t.Subject,this.scrapeDebounce=1500,this.fragments=new Map}return e.prototype.ngOnInit=function(){var e=this;"undefined"!=typeof window&&this.element.addEventListener("keydown",(function(){clearTimeout(e.scrapeTimeout),e.scrapeTimeout=setTimeout((function(){return e.scrape()}),e.scrapeDebounce)}))},Object.defineProperty(e.prototype,"element",{get:function(){var e;return null===(e=this.elementRef)||void 0===e?void 0:e.nativeElement},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"text",{get:function(){return this.element.value},enumerable:!1,configurable:!0}),e.prototype.scrape=function(){var e,t,r,a,n,o,s,i,c,l,d=this,u={likes:0,message:this.text,sentAt:void 0,user:null,attachments:this.attachments},h=[];try{for(var g=U(this.chatBackend.attachmentScrapers),y=g.next();!y.done;y=g.next()){var p=y.value,m=p.findFragments(u);if(m)try{for(var f=(r=void 0,U(m)),b=f.next();!b.done;b=f.next()){var w=b.value;h.push(w.text),this.fragments.has(w.text)||(console.log("Scraped new fragment:"),console.dir(w),this.fragments.set(w.text,{fragment:w,resolution:void 0}))}}catch(e){r={error:e}}finally{try{b&&!b.done&&(a=f.return)&&a.call(f)}finally{if(r)throw r.error}}else console.error("Attachment fragment scraper "+p.constructor.name+" is implemented incorrectly: Returned null instead of array")}}catch(t){e={error:t}}finally{try{y&&!y.done&&(t=g.return)&&t.call(g)}finally{if(e)throw e.error}}var k=[];try{for(var v=U(this.fragments),_=v.next();!_.done;_=v.next()){var x=F(_.value,1)[0];h.includes(x)||k.push(x)}}catch(e){n={error:e}}finally{try{_&&!_.done&&(o=v.return)&&o.call(v)}finally{if(n)throw n.error}}try{for(var j=U(k),M=j.next();!M.done;M=j.next()){var S=M.value;console.log("Removed fragment: "+S),this.fragments.delete(S)}}catch(e){s={error:e}}finally{try{M&&!M.done&&(i=j.return)&&i.call(j)}finally{if(s)throw s.error}}var I=function(e,t){if(t.resolution)return"continue";t.resolution=new Promise((function(r,a){return D(d,void 0,void 0,(function(){var a,n,o,s,i,c,l,d;return R(this,(function(h){switch(h.label){case 0:console.log("Resolving fragment "+e),h.label=1;case 1:h.trys.push([1,8,9,10]),a=U(this.chatBackend.attachmentResolvers),n=a.next(),h.label=2;case 2:if(n.done)return[3,7];o=n.value,console.log("- Trying resolver "+o.constructor.name+"..."),h.label=3;case 3:return h.trys.push([3,5,,6]),[4,o.resolveFragment(u,t.fragment)];case 4:return(s=h.sent())?(console.log("Resolved fragment "+e+" into attachment:"),console.dir(s),this.attachments.push(s),this.attachmentsChange.next(this.attachments.slice()),r(s),[3,7]):[3,6];case 5:return i=h.sent(),console.error("Caught error during attachment resolver "+o.constructor.name+":"),console.error(i),[3,6];case 6:return n=a.next(),[3,2];case 7:return[3,10];case 8:return c=h.sent(),l={error:c},[3,10];case 9:try{n&&!n.done&&(d=a.return)&&d.call(a)}finally{if(l)throw l.error}return[7];case 10:return[2]}}))}))}))};try{for(var O=U(this.fragments),C=O.next();!C.done;C=O.next()){var P=F(C.value,2);I(x=P[0],P[1])}}catch(e){c={error:e}}finally{try{C&&!C.done&&(l=O.return)&&l.call(O)}finally{if(c)throw c.error}}},e}();ue.decorators=[{type:a.Directive,args:[{selector:"[attachmentScraper]"}]}],ue.ctorParameters=function(){return[{type:a.ElementRef},{type:Y}]},ue.propDecorators={attachments:[{type:a.Input}],attachmentsChange:[{type:a.Output}]};var he=[ae,ne,se,ie,ce,le,de,oe,ue],ge=function(){};ge.decorators=[{type:a.NgModule,args:[{declarations:he,imports:[i.CommonModule,v.TextFieldModule,y.FormsModule,c.MatIconModule,h.MatFormFieldModule,g.MatInputModule,d.MatButtonModule,k.MatMenuModule,l.MatProgressSpinnerModule,A,W,_.MatTooltipModule,x.MatSelectModule,u.OverlayModule,p.PortalModule],exports:he}]}];var ye=function(e){function r(r,a,n,o){var s=e.call(this)||this;return s.backend=r,s.identifier=a,s.parentIdentifier=n,s.sortOrder=o,s.subscription=new t.Subscription,s._state="connecting",s._connectionStateChanged=new t.Subject,s.messageMap=new Map,s._messageReceived=new t.Subject,s._messageUpdated=new t.Subject,s._messageSent=new t.Subject,s._messageObserved=new t.Subject,s.messages=[],s.ready=new Promise((function(e){return s.markReady=e})),s}return L(r,e),Object.defineProperty(r.prototype,"state",{get:function(){return this._state},set:function(e){var t=this;this._state=e,setTimeout((function(){return t._connectionStateChanged.next(t._state)}))},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"connectionStateChanged",{get:function(){return this._connectionStateChanged.asObservable()},enumerable:!1,configurable:!0}),r.prototype.bind=function(t){var r=Object.create(null,{bind:{get:function(){return e.prototype.bind}}});return D(this,void 0,void 0,(function(){var e=this;return R(this,(function(a){switch(a.label){case 0:return r.bind.call(this,t),this.state="connected",this.markReady(),[4,this.subscribeToTopic()];case 1:return a.sent(),this.subscription.add(this.backend.userChanged.subscribe((function(){return e.authenticate()}))),t.addEventListener("open",(function(){return D(e,void 0,void 0,(function(){return R(this,(function(e){return this.state="connected",[2]}))}))})),t.addEventListener("lost",(function(){return D(e,void 0,void 0,(function(){return R(this,(function(e){return this.state="lost",[2]}))}))})),t.addEventListener("restore",(function(){return D(e,void 0,void 0,(function(){return R(this,(function(e){switch(e.label){case 0:return this.state="restored",[4,this.authenticate()];case 1:return e.sent(),[4,this.subscribeToTopic()];case 2:return e.sent(),[2]}}))}))})),[2,this]}}))}))},r.prototype.mapOrUpdateMessages=function(e){var t=this;return e.map((function(e){return t.mapOrUpdateMessage(e)}))},r.prototype.mapOrUpdateMessage=function(e){var t=this.messageMap.get(e.id);return t?e=Object.assign(t,e):(this.messageMap.set(e.id,e),this._messageObserved.next(e)),e},r.prototype.getExistingMessages=function(){return D(this,void 0,void 0,(function(){var e;return R(this,(function(t){switch(t.label){case 0:return[4,this.peer.getExistingMessages()];case 1:return e=t.sent(),[2,e=this.mapOrUpdateMessages(e)]}}))}))},r.prototype.ensureConnection=function(e){return D(this,void 0,void 0,(function(){var t;return R(this,(function(r){if(t="Connection to chat services is not currently available.","connected"!==this.state&&"restored"!==this.state)throw e?new Error(e+": "+t):new Error(""+t);return[2]}))}))},r.prototype.editMessage=function(e,t){return D(this,void 0,void 0,(function(){return R(this,(function(r){switch(r.label){case 0:return[4,this.ensureConnection()];case 1:return r.sent(),[4,this.peer.editMessage(e,t)];case 2:return r.sent(),[2]}}))}))},r.prototype.subscribeToTopic=function(){return D(this,void 0,void 0,(function(){return R(this,(function(e){switch(e.label){case 0:return[4,this.peer.subscribe(this.identifier,this.parentIdentifier,this.sortOrder)];case 1:return e.sent(),[2]}}))}))},r.prototype.authenticate=function(){var e;return D(this,void 0,void 0,(function(){var t;return R(this,(function(r){switch(r.label){case 0:if(!this.backend.user)return[3,4];r.label=1;case 1:return r.trys.push([1,3,,4]),[4,this.peer.authenticate(null===(e=this.backend.user)||void 0===e?void 0:e.token)];case 2:return r.sent(),[3,4];case 3:return t=r.sent(),console.error("Could not authenticate with Banta server:"),console.error(t),[3,4];case 4:return[2]}}))}))},r.prototype.close=function(){e.prototype.close.call(this),this.subscription.unsubscribe()},r.prototype.onPermissions=function(e){window.bantaPermissionsDebug=e,this.permissions=e},r.prototype.onChatMessage=function(e){if(this.messageMap.has(e.id))return this.mapOrUpdateMessage(e);e.hidden||(this.messageMap.set(e.id,e),this._messageReceived.next(e))},Object.defineProperty(r.prototype,"messageReceived",{get:function(){return this._messageReceived.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"messageUpdated",{get:function(){return this._messageUpdated.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"messageSent",{get:function(){return this._messageSent.asObservable()},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"messageObserved",{get:function(){return this._messageObserved.asObservable()},enumerable:!1,configurable:!0}),r.prototype.send=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){switch(t.label){case 0:return[4,this.ensureConnection()];case 1:return t.sent(),[4,this.peer.sendMessage(e)];case 2:return[2,t.sent()]}}))}))},r.prototype.loadAfter=function(e,t){return D(this,void 0,void 0,(function(){var r;return R(this,(function(a){switch(a.label){case 0:return e?e.pagingCursor?(r=this.mapOrUpdateMessages,[4,this.peer.loadAfter(Number(e.pagingCursor),t)]):[2,[]]:[2];case 1:return[2,r.apply(this,[a.sent()])]}}))}))},r.prototype.get=function(e){return D(this,void 0,void 0,(function(){var t,r;return R(this,(function(a){switch(a.label){case 0:return this.messageMap.has(e)?[2,this.messageMap.get(e)]:[4,this.ensureConnection("Could not get message")];case 1:return a.sent(),[4,this.peer.getMessage(e)];case 2:return t=a.sent(),this.messageMap.has(e)?(r=this.messageMap.get(e),Object.assign(r,t),t=r):this.messageMap.set(e,t),[2,t]}}))}))},r.prototype.getCount=function(){return D(this,void 0,void 0,(function(){return R(this,(function(e){switch(e.label){case 0:return[4,this.peer.getCount()];case 1:return[2,e.sent()]}}))}))},r.prototype.likeMessage=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){switch(t.label){case 0:return[4,this.ensureConnection()];case 1:return t.sent(),[4,this.peer.likeMessage(e)];case 2:return[2,t.sent()]}}))}))},r.prototype.unlikeMessage=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){switch(t.label){case 0:return[4,this.ensureConnection()];case 1:return t.sent(),[4,this.peer.unlikeMessage(e)];case 2:return[2,t.sent()]}}))}))},r.prototype.deleteMessage=function(e){return D(this,void 0,void 0,(function(){return R(this,(function(t){switch(t.label){case 0:return[4,this.ensureConnection()];case 1:return t.sent(),[4,this.peer.deleteMessage(e)];case 2:return[2,t.sent()]}}))}))},r}(f.SocketRPC);q([f.RpcEvent(),z("design:type",Function),z("design:paramtypes",[Object]),z("design:returntype",void 0)],ye.prototype,"onPermissions",null),q([f.RpcEvent(),z("design:type",Function),z("design:paramtypes",[Object]),z("design:returntype",void 0)],ye.prototype,"onChatMessage",null);var pe="BANTA_SDK_OPTIONS",me=function(e){function t(t){var r=e.call(this)||this;return r.options=t,r}return L(t,e),Object.defineProperty(t.prototype,"serviceUrl",{get:function(){var e,t;return""+(null!==(t=null===(e=this.options)||void 0===e?void 0:e.serviceUrl)&&void 0!==t?t:"http://localhost:3422")},enumerable:!1,configurable:!0}),t.prototype.connectToService=function(){return D(this,void 0,void 0,(function(){var e;return R(this,(function(t){switch(t.label){case 0:return e=new f.DurableSocket(this.serviceUrl.replace(/^http/,"ws")+"/socket"),[4,new Promise((function(t,r){e.onopen=function(){t()},e.onclose=function(e){503===e.code&&(console.error("Failed to connect to chat service!"),r(e))}}))];case 1:return t.sent(),e.onerror=void 0,[2,e]}}))}))},t.prototype.getSourceForTopic=function(e,t){return D(this,void 0,void 0,(function(){var r,a;return R(this,(function(n){switch(n.label){case 0:return a=(r=new ye(this,e,void 0,(null==t?void 0:t.sortOrder)||f.CommentsOrder.NEWEST)).bind,[4,this.connectToService()];case 1:return[4,a.apply(r,[n.sent()])];case 2:return[2,n.sent()]}}))}))},t.prototype.getSourceForThread=function(e,t,r){return D(this,void 0,void 0,(function(){var a,n;return R(this,(function(o){switch(o.label){case 0:return n=(a=new ye(this,e,t,(null==r?void 0:r.sortOrder)||f.CommentsOrder.NEWEST)).bind,[4,this.connectToService()];case 1:return[4,n.apply(a,[o.sent()])];case 2:return[2,o.sent()]}}))}))},t.prototype.getSourceCountForTopic=function(e){return D(this,void 0,void 0,(function(){var t;return R(this,(function(r){switch(r.label){case 0:return[4,fetch(this.serviceUrl+"/topics/"+e)];case 1:return(t=r.sent()).status>=400?[2,0]:[4,t.json()];case 2:return[2,r.sent().messageCount||0]}}))}))},t.prototype.refreshMessage=function(e){throw new Error("Method not implemented.")},t.prototype.getMessage=function(e,t){throw new Error("Method not implemented.")},t.prototype.getSubMessage=function(e,t,r){throw new Error("Method not implemented.")},t.prototype.watchMessage=function(e,t){throw new Error("Method not implemented.")},t.prototype.getCardForUrl=function(e){return D(this,void 0,void 0,(function(){var t,r,a;return R(this,(function(n){switch(n.label){case 0:return[4,fetch(this.serviceUrl+"/urls",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:e})})];case 1:return 404==(t=n.sent()).status?[2,null]:t.status>=400?(r=Error.bind,a="Failed to retrieve URL card: "+t.status+". Body: '",[4,t.text()]):[3,3];case 2:throw new(r.apply(Error,[void 0,a+n.sent()+"'"]));case 3:return[4,t.json()];case 4:return[2,n.sent()]}}))}))},t}(Y);me.decorators=[{type:a.Injectable}],me.ctorParameters=function(){return[{type:void 0,decorators:[{type:a.Inject,args:[pe]}]}]};var fe=new RegExp("(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?","ig"),be=function(){function e(){}return e.prototype.findFragments=function(e){var t;return e.attachments&&e.attachments.filter((function(e){return"url"===e.type})).length>0?null:Array.from(null!==(t=e.message.match(fe))&&void 0!==t?t:[]).reduce((function(e,t){return e.includes(t)||e.push(t),e}),[]).map((function(t){return{text:t,offset:e.message.indexOf(t),type:"url"}}))},e}(),we=function(){function e(e){this.backend=e}return e.prototype.resolveFragment=function(e,t){return D(this,void 0,void 0,(function(){var e;return R(this,(function(r){switch(r.label){case 0:return"url"!==t.type?[2,null]:[4,this.backend.getCardForUrl(t.text)];case 1:return(e=r.sent())?[2,{type:"card",url:t.text,card:e,style:"block"}]:[2]}}))}))},e}();we.decorators=[{type:a.Injectable}],we.ctorParameters=function(){return[{type:Y}]};var ke=function(){function e(){}return e.prototype.resolveFragment=function(e,t){return D(this,void 0,void 0,(function(){var e,r;return R(this,(function(a){return"url"!==t.type?[2,null]:(t.text.match(/https?:\/\/(www\.|m\.)?youtube.com\/watch\?v=/)&&(r=/watch\?v=([^&]+)/.exec(t.text))&&(e=r[1]),e?[2,{type:"iframe",url:"https://www.youtube.com/embed/"+e,style:"block"}]:[2,null])}))}))},e}(),ve=function(){function e(){}return e.prototype.resolveFragment=function(e,t){var r;return D(this,void 0,void 0,(function(){var e;return R(this,(function(a){return"url"===t.type&&t.text.startsWith("https://giphy.com/gifs")&&(e=null===(r=/[^-\/]+$/.exec(t.text))||void 0===r?void 0:r.toString())?[2,{type:"iframe",url:"https://giphy.com/embed/"+e,style:"inline"}]:[2,null]}))}))},e}(),_e=function(){function e(){}return e.prototype.resolveFragment=function(e,t){return D(this,void 0,void 0,(function(){return R(this,(function(e){return"url"===t.type&&t.text.startsWith("https://twitter.com/")?[2,{type:"tweet",url:t.text,style:"block"}]:[2,null]}))}))},e}(),xe=function(){function e(e){if("undefined"!=typeof window&&!document.querySelector('script[src="https://platform.twitter.com/widgets.js"]')){var t=document.createElement("script");t.src="https://platform.twitter.com/widgets.js",t.async=!0,document.body.appendChild(t)}e.registerAttachmentScraper(new be),e.registerAttachmentResolver(new ve),e.registerAttachmentResolver(new ke),e.registerAttachmentResolver(new _e),e.registerAttachmentResolver(new we(e))}return e.configure=function(t){return{ngModule:e,providers:[{provide:pe,useValue:t||{}},{provide:Y,useClass:me}]}},e}();xe.decorators=[{type:a.NgModule,args:[{imports:[i.CommonModule,y.FormsModule,A,ge,te,W,c.MatIconModule,d.MatButtonModule,_.MatTooltipModule,k.MatMenuModule,m.MatDialogModule,h.MatFormFieldModule,g.MatInputModule,l.MatProgressSpinnerModule,w.MatSnackBarModule,u.OverlayModule,p.PortalModule],declarations:[K,Q,re],exports:[K,Q,re,A,te,ge,W]}]}],xe.ctorParameters=function(){return[{type:Y}]},e.AttachmentButtonComponent=de,e.AttachmentScraperDirective=ue,e.BANTA_SDK_OPTIONS=pe,e.BantaAttachmentComponent=C,e.BantaAttachmentsComponent=P,e.BantaChatComponent=Z,e.BantaCommentsComponent=se,e.BantaCommonModule=A,e.BantaComponent=K,e.BantaLogoComponent=Q,e.BantaMarkdownToHtmlPipe=S,e.BantaMentionLinkerPipe=O,e.BantaReplySendOptionsDirective=oe,e.BantaSdkModule=xe,e.BantaTrustResourceUrlPipe=I,e.ChatBackend=me,e.ChatBackendBase=Y,e.ChatMessageComponent=X,e.ChatModule=te,e.ChatSource=ye,e.ChatViewComponent=G,e.CommentComponent=ae,e.CommentFieldComponent=ce,e.CommentSortComponent=le,e.CommentViewComponent=ne,e.CommentsModule=ge,e.EMOJIS=$,e.EmojiModule=W,e.EmojiSelectorButtonComponent=N,e.EmojiSelectorPanelComponent=B,e.GiphyAttachmentResolver=ve,e.LightboxComponent=M,e.LiveChatMessageComponent=J,e.LiveCommentComponent=ie,e.LiveMessageComponent=re,e.TimestampComponent=j,e.TweetAttachmentResolver=_e,e.UrlAttachmentResolver=we,e.UrlAttachmentScraper=be,e.YouTubeAttachmentResolver=ke,e.lazyConnection=function(e){return new t.Observable((function(r){var a=new t.Subject,n=a.subscribe(r);return e.start(a),function(){n.unsubscribe(),e.stop()}})).pipe(r.publish()).refCount()},Object.defineProperty(e,"__esModule",{value:!0})}));
2
2
  //# sourceMappingURL=banta-sdk.umd.min.js.map